Print this page
First attempt at further IPsec cluster cleanup

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/inet/ip/ipsecesp.c
          +++ new/usr/src/uts/common/inet/ip/ipsecesp.c
↓ open down ↓ 1367 lines elided ↑ open up ↑
1368 1368          int rc, diagnostic;
1369 1369          sadb_sa_t *assoc;
1370 1370          keysock_out_t *kso;
1371 1371          uint32_t newspi;
1372 1372  
1373 1373          /*
1374 1374           * Randomly generate a proposed SPI value
1375 1375           */
1376 1376          (void) random_get_pseudo_bytes((uint8_t *)&newspi, sizeof (uint32_t));
1377 1377          newbie = sadb_getspi(ksi, newspi, &diagnostic,
1378      -            espstack->ipsecesp_netstack, IPPROTO_ESP);
     1378 +            espstack->ipsecesp_netstack);
1379 1379  
1380 1380          if (newbie == NULL) {
1381 1381                  sadb_pfkey_error(espstack->esp_pfkey_q, mp, ENOMEM, diagnostic,
1382 1382                      ksi->ks_in_serial);
1383 1383                  return;
1384 1384          } else if (newbie == (ipsa_t *)-1) {
1385 1385                  sadb_pfkey_error(espstack->esp_pfkey_q, mp, EINVAL, diagnostic,
1386 1386                      ksi->ks_in_serial);
1387 1387                  return;
1388 1388          }
↓ open down ↓ 172 lines elided ↑ open up ↑
1561 1561  #define FIRST_16(x) ((x) & 0xFFFF)
1562 1562  #define NEXT_16(x) (((x) >> 16) & 0xFFFF)
1563 1563  #else
1564 1564  #define FIRST_16(x) (((x) >> 16) & 0xFFFF)
1565 1565  #define NEXT_16(x) ((x) & 0xFFFF)
1566 1566  #endif
1567 1567  static void
1568 1568  esp_port_freshness(uint32_t ports, ipsa_t *assoc)
1569 1569  {
1570 1570          uint16_t remote = FIRST_16(ports);
1571      -        uint16_t local = NEXT_16(ports);
1572 1571          ipsa_t *outbound_peer;
1573 1572          isaf_t *bucket;
1574 1573          ipsecesp_stack_t *espstack = assoc->ipsa_netstack->netstack_ipsecesp;
1575 1574  
1576 1575          /* We found a conn_t, therefore local != 0. */
1577      -        ASSERT(local != 0);
     1576 +        ASSERT(NEXT_16(ports) != 0);
1578 1577          /* Assume an IPv4 SA. */
1579 1578          ASSERT(assoc->ipsa_addrfam == AF_INET);
1580 1579  
1581 1580          /*
1582 1581           * On-the-wire rport == 0 means something's very wrong.
1583 1582           * An unpaired SA is also useless to us.
1584 1583           * If we are behind the NAT, don't bother.
1585 1584           * A zero local NAT port defaults to 4500, so check that too.
1586 1585           * And, of course, if the ports already match, we don't need to
1587 1586           * bother.
↓ open down ↓ 158 lines elided ↑ open up ↑
1746 1745                                      DROPPER(ipss, ipds_ah_nomem),
1747 1746                                      &espstack->esp_dropper);
1748 1747                                  BUMP_MIB(ira->ira_ill->ill_ip_mib,
1749 1748                                      ipIfStatsInDiscards);
1750 1749                                  return (NULL);
1751 1750                          }
1752 1751                  }
1753 1752                  if (is_natt)
1754 1753                          return (esp_fix_natt_checksums(data_mp, assoc));
1755 1754  
1756      -                if (assoc->ipsa_state == IPSA_STATE_IDLE) {
1757      -                        /*
1758      -                         * Cluster buffering case.  Tell caller that we're
1759      -                         * handling the packet.
1760      -                         */
1761      -                        sadb_buf_pkt(assoc, data_mp, ira);
1762      -                        return (NULL);
1763      -                }
1764      -
1765 1755                  return (data_mp);
1766 1756          }
1767 1757  
1768 1758          esp1dbg(espstack, ("esp_in_done: esp_strip_header() failed\n"));
1769 1759  drop_and_bail:
1770 1760          IP_ESP_BUMP_STAT(ipss, in_discards);
1771 1761          ip_drop_packet(data_mp, B_TRUE, ira->ira_ill, counter,
1772 1762              &espstack->esp_dropper);
1773 1763          BUMP_MIB(ira->ira_ill->ill_ip_mib, ipIfStatsInDiscards);
1774 1764          return (NULL);
↓ open down ↓ 1838 lines elided ↑ open up ↑
3613 3603          src = (struct sockaddr_in *)(srcext + 1);
3614 3604          dst = (struct sockaddr_in *)(dstext + 1);
3615 3605          natt_loc = (struct sockaddr_in *)(nttext_loc + 1);
3616 3606          natt_loc6 = (struct sockaddr_in6 *)(nttext_loc + 1);
3617 3607          natt_rem = (struct sockaddr_in *)(nttext_rem + 1);
3618 3608          natt_rem6 = (struct sockaddr_in6 *)(nttext_rem + 1);
3619 3609  
3620 3610          /* Sundry ADD-specific reality checks. */
3621 3611          /* XXX STATS :  Logging/stats here? */
3622 3612  
3623      -        if ((assoc->sadb_sa_state != SADB_SASTATE_MATURE) &&
3624      -            (assoc->sadb_sa_state != SADB_X_SASTATE_ACTIVE_ELSEWHERE)) {
     3613 +        if (assoc->sadb_sa_state != SADB_SASTATE_MATURE) {
3625 3614                  *diagnostic = SADB_X_DIAGNOSTIC_BAD_SASTATE;
3626 3615                  return (EINVAL);
3627 3616          }
3628 3617          if (assoc->sadb_sa_encrypt == SADB_EALG_NONE) {
3629 3618                  *diagnostic = SADB_X_DIAGNOSTIC_BAD_EALG;
3630 3619                  return (EINVAL);
3631 3620          }
3632 3621  
3633 3622  #ifndef IPSEC_LATENCY_TEST
3634 3623          if (assoc->sadb_sa_encrypt == SADB_EALG_NULL &&
↓ open down ↓ 148 lines elided ↑ open up ↑
3783 3772  
3784 3773  /*
3785 3774   * Update a security association.  Updates come in two varieties.  The first
3786 3775   * is an update of lifetimes on a non-larval SA.  The second is an update of
3787 3776   * a larval SA, which ends up looking a lot more like an add.
3788 3777   */
3789 3778  static int
3790 3779  esp_update_sa(mblk_t *mp, keysock_in_t *ksi, int *diagnostic,
3791 3780      ipsecesp_stack_t *espstack, uint8_t sadb_msg_type)
3792 3781  {
3793      -        sadb_sa_t *assoc = (sadb_sa_t *)ksi->ks_in_extv[SADB_EXT_SA];
3794      -        mblk_t    *buf_pkt;
3795      -        int rcode;
3796      -
3797 3782          sadb_address_t *dstext =
3798 3783              (sadb_address_t *)ksi->ks_in_extv[SADB_EXT_ADDRESS_DST];
3799 3784  
3800 3785          if (dstext == NULL) {
3801 3786                  *diagnostic = SADB_X_DIAGNOSTIC_MISSING_DST;
3802 3787                  return (EINVAL);
3803 3788          }
3804 3789  
3805      -        rcode = sadb_update_sa(mp, ksi, &buf_pkt, &espstack->esp_sadb,
3806      -            diagnostic, espstack->esp_pfkey_q, esp_add_sa,
3807      -            espstack->ipsecesp_netstack, sadb_msg_type);
3808      -
3809      -        if ((assoc->sadb_sa_state != SADB_X_SASTATE_ACTIVE) ||
3810      -            (rcode != 0)) {
3811      -                return (rcode);
3812      -        }
3813      -
3814      -        HANDLE_BUF_PKT(esp_taskq, espstack->ipsecesp_netstack->netstack_ipsec,
3815      -            espstack->esp_dropper, buf_pkt);
3816      -
3817      -        return (rcode);
     3790 +        return (sadb_update_sa(mp, ksi, &espstack->esp_sadb, diagnostic,
     3791 +            espstack->esp_pfkey_q, esp_add_sa, espstack->ipsecesp_netstack,
     3792 +            sadb_msg_type));
3818 3793  }
3819 3794  
3820 3795  /* XXX refactor me */
3821 3796  /*
3822 3797   * Delete a security association.  This is REALLY likely to be code common to
3823 3798   * both AH and ESP.  Find the association, then unlink it.
3824 3799   */
3825 3800  static int
3826 3801  esp_del_sa(mblk_t *mp, keysock_in_t *ksi, int *diagnostic,
3827 3802      ipsecesp_stack_t *espstack, uint8_t sadb_msg_type)
↓ open down ↓ 120 lines elided ↑ open up ↑
3948 3923                  error = esp_add_sa(mp, ksi, &diagnostic,
3949 3924                      espstack->ipsecesp_netstack);
3950 3925                  if (error != 0) {
3951 3926                          sadb_pfkey_error(espstack->esp_pfkey_q, mp, error,
3952 3927                              diagnostic, ksi->ks_in_serial);
3953 3928                  }
3954 3929                  /* else esp_add_sa() took care of things. */
3955 3930                  break;
3956 3931          case SADB_DELETE:
3957 3932          case SADB_X_DELPAIR:
3958      -        case SADB_X_DELPAIR_STATE:
3959 3933                  error = esp_del_sa(mp, ksi, &diagnostic, espstack,
3960 3934                      samsg->sadb_msg_type);
3961 3935                  if (error != 0) {
3962 3936                          sadb_pfkey_error(espstack->esp_pfkey_q, mp, error,
3963 3937                              diagnostic, ksi->ks_in_serial);
3964 3938                  }
3965 3939                  /* Else esp_del_sa() took care of things. */
3966 3940                  break;
3967 3941          case SADB_GET:
3968 3942                  error = sadb_delget_sa(mp, ksi, &espstack->esp_sadb,
↓ open down ↓ 224 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX