Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / usrsctp / usrsctplib / netinet / sctp_pcb.c
index a7f8b85..ffe8f62 100755 (executable)
@@ -32,7 +32,7 @@
 
 #ifdef __FreeBSD__
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: head/sys/netinet/sctp_pcb.c 267674 2014-06-20 13:26:49Z tuexen $");
+__FBSDID("$FreeBSD: head/sys/netinet/sctp_pcb.c 271230 2014-09-07 18:05:37Z tuexen $");
 #endif
 
 #include <netinet/sctp_os.h>
@@ -52,7 +52,7 @@ __FBSDID("$FreeBSD: head/sys/netinet/sctp_pcb.c 267674 2014-06-20 13:26:49Z tuex
 #if defined(__FreeBSD__) && __FreeBSD_version >= 803000
 #include <netinet/sctp_dtrace_define.h>
 #endif
-#if defined INET || defined INET6
+#if defined(INET) || defined(INET6)
 #if !defined(__Userspace_os_Windows)
 #include <netinet/udp.h>
 #endif
@@ -224,8 +224,8 @@ sctp_allocate_vrf(int vrf_id)
        }
        SCTP_MALLOC(vrf, struct sctp_vrf *, sizeof(struct sctp_vrf),
                    SCTP_M_VRF);
-       if (vrf == NULL) {
-               /* No memory */
+       if (vrf == NULL) {
+               /* No memory */
 #ifdef INVARIANTS
                panic("No memory for VRF:%d", vrf_id);
 #endif
@@ -243,7 +243,7 @@ sctp_allocate_vrf(int vrf_id)
        vrf->vrf_addr_hash = SCTP_HASH_INIT(SCTP_VRF_ADDR_HASH_SIZE,
                                            &vrf->vrf_addr_hashmark);
        if (vrf->vrf_addr_hash == NULL) {
-               /* No memory */
+               /* No memory */
 #ifdef INVARIANTS
                panic("No memory for VRF:%d", vrf_id);
 #endif
@@ -656,7 +656,7 @@ sctp_add_addr_to_vrf(uint32_t vrf_id, void *ifn, uint32_t ifn_index,
                                sctp_remove_ifa_from_ifn(sctp_ifap);
                                /* move the address over to the new ifn */
                                sctp_add_ifa_to_ifn(sctp_ifnp, sctp_ifap);
-                               goto exit_stage_left;
+                               goto exit_stage_left;
                        } else {
                                /* repair ifnp which was NULL ? */
                                sctp_ifap->localifa_flags = SCTP_ADDR_VALID;
@@ -713,7 +713,7 @@ sctp_add_addr_to_vrf(uint32_t vrf_id, void *ifn, uint32_t ifn_index,
        {
                struct sockaddr_in *sin;
 
-               sin = (struct sockaddr_in *)&sctp_ifap->address.sin;
+               sin = &sctp_ifap->address.sin;
                if (SCTP_IFN_IS_IFT_LOOP(sctp_ifap->ifn_p) ||
                    (IN4_ISLOOPBACK_ADDRESS(&sin->sin_addr))) {
                        sctp_ifap->src_is_loop = 1;
@@ -733,7 +733,7 @@ sctp_add_addr_to_vrf(uint32_t vrf_id, void *ifn, uint32_t ifn_index,
                /* ok to use deprecated addresses? */
                struct sockaddr_in6 *sin6;
 
-               sin6 = (struct sockaddr_in6 *)&sctp_ifap->address.sin6;
+               sin6 = &sctp_ifap->address.sin6;
                if (SCTP_IFN_IS_IFT_LOOP(sctp_ifap->ifn_p) ||
                    (IN6_IS_ADDR_LOOPBACK(&sin6->sin6_addr))) {
                        sctp_ifap->src_is_loop = 1;
@@ -1097,7 +1097,7 @@ sctp_does_stcb_own_this_addr(struct sctp_tcb *stcb, struct sockaddr *to)
                        {
                                struct sockaddr_in *sin, *rsin;
 
-                               sin = (struct sockaddr_in *)&laddr->ifa->address.sin;
+                               sin = &laddr->ifa->address.sin;
                                rsin = (struct sockaddr_in *)to;
                                if (sin->sin_addr.s_addr == rsin->sin_addr.s_addr) {
                                        SCTP_IPI_ADDR_RUNLOCK();
@@ -1111,7 +1111,7 @@ sctp_does_stcb_own_this_addr(struct sctp_tcb *stcb, struct sockaddr *to)
                        {
                                struct sockaddr_in6 *sin6, *rsin6;
 
-                               sin6 = (struct sockaddr_in6 *)&laddr->ifa->address.sin6;
+                               sin6 = &laddr->ifa->address.sin6;
                                rsin6 = (struct sockaddr_in6 *)to;
                                if (SCTP6_ARE_ADDR_EQUAL(sin6, rsin6)) {
                                        SCTP_IPI_ADDR_RUNLOCK();
@@ -1126,7 +1126,7 @@ sctp_does_stcb_own_this_addr(struct sctp_tcb *stcb, struct sockaddr *to)
                        {
                                struct sockaddr_conn *sconn, *rsconn;
 
-                               sconn = (struct sockaddr_conn *)&laddr->ifa->address.sconn;
+                               sconn = &laddr->ifa->address.sconn;
                                rsconn = (struct sockaddr_conn *)to;
                                if (sconn->sconn_addr == rsconn->sconn_addr) {
                                        SCTP_IPI_ADDR_RUNLOCK();
@@ -2680,7 +2680,7 @@ sctp_findassociation_ep_asconf(struct mbuf *m, int offset,
                                struct sctp_inpcb **inp_p, struct sctp_nets **netp, uint32_t vrf_id)
 {
        struct sctp_tcb *stcb;
-       struct sockaddr_storage remote_store;
+       union sctp_sockstore remote_store;
        struct sctp_paramhdr parm_buf, *phdr;
        int ptype;
        int zero_address = 0;
@@ -2719,7 +2719,7 @@ sctp_findassociation_ep_asconf(struct mbuf *m, int offset,
                                __FUNCTION__);
                        return (NULL);
                }
-               sin6 = (struct sockaddr_in6 *)&remote_store;
+               sin6 = &remote_store.sin6;
                sin6->sin6_family = AF_INET6;
 #ifdef HAVE_SIN6_LEN
                sin6->sin6_len = sizeof(*sin6);
@@ -2748,7 +2748,7 @@ sctp_findassociation_ep_asconf(struct mbuf *m, int offset,
                                __FUNCTION__);
                        return (NULL);
                }
-               sin = (struct sockaddr_in *)&remote_store;
+               sin = &remote_store.sin;
                sin->sin_family = AF_INET;
 #ifdef HAVE_SIN_LEN
                sin->sin_len = sizeof(*sin);
@@ -2773,7 +2773,7 @@ sctp_findassociation_ep_asconf(struct mbuf *m, int offset,
                }
        } else {
                stcb = sctp_findassociation_ep_addr(inp_p,
-                   (struct sockaddr *)&remote_store, netp,
+                   &remote_store.sa, netp,
                    dst, NULL);
        }
        return (stcb);
@@ -2841,7 +2841,13 @@ sctp_inpcb_alloc(struct socket *so, uint32_t vrf_id)
        inp->partial_delivery_point = SCTP_SB_LIMIT_RCV(so) >> SCTP_PARTIAL_DELIVERY_SHIFT;
        inp->sctp_frag_point = SCTP_DEFAULT_MAXSEGMENT;
        inp->sctp_cmt_on_off = SCTP_BASE_SYSCTL(sctp_cmt_on_off);
-       inp->sctp_ecn_enable = SCTP_BASE_SYSCTL(sctp_ecn_enable);
+       inp->ecn_supported = (uint8_t)SCTP_BASE_SYSCTL(sctp_ecn_enable);
+       inp->prsctp_supported = (uint8_t)SCTP_BASE_SYSCTL(sctp_pr_enable);
+       inp->auth_supported = (uint8_t)SCTP_BASE_SYSCTL(sctp_auth_enable);
+       inp->asconf_supported = (uint8_t)SCTP_BASE_SYSCTL(sctp_asconf_enable);
+       inp->reconfig_supported = (uint8_t)SCTP_BASE_SYSCTL(sctp_reconfig_enable);
+       inp->nrsack_supported = (uint8_t)SCTP_BASE_SYSCTL(sctp_nrsack_enable);
+       inp->pktdrop_supported = (uint8_t)SCTP_BASE_SYSCTL(sctp_pktdrop_enable);
 #if defined(__Userspace__)
        inp->ulp_info = NULL;
        inp->recv_callback = NULL;
@@ -3090,12 +3096,15 @@ sctp_inpcb_alloc(struct socket *so, uint32_t vrf_id)
         */
        m->local_hmacs = sctp_default_supported_hmaclist();
        m->local_auth_chunks = sctp_alloc_chunklist();
+       if (inp->asconf_supported) {
+               sctp_auth_add_chunk(SCTP_ASCONF, m->local_auth_chunks);
+               sctp_auth_add_chunk(SCTP_ASCONF_ACK, m->local_auth_chunks);
+       }
        m->default_dscp = 0;
 #ifdef INET6
        m->default_flowlabel = 0;
 #endif
        m->port = 0; /* encapsulation disabled by default */
-       sctp_auth_set_default_chunks(m->local_auth_chunks);
        LIST_INIT(&m->shared_keys);
        /* add default NULL key as key id 0 */
        null_key = sctp_alloc_sharedkey();
@@ -3583,8 +3592,8 @@ sctp_inpcb_bind(struct socket *so, struct sockaddr *addr,
                        last = MODULE_GLOBAL(ipport_lowlastauto);
                } else {
 #endif
-                       first = MODULE_GLOBAL(ipport_firstauto);
-                       last = MODULE_GLOBAL(ipport_lastauto);
+                       first = MODULE_GLOBAL(ipport_firstauto);
+                       last = MODULE_GLOBAL(ipport_lastauto);
 #if defined(__FreeBSD__) || defined(__APPLE__)
                }
 #endif
@@ -3692,42 +3701,27 @@ sctp_inpcb_bind(struct socket *so, struct sockaddr *addr,
                 * too (before adding).
                 */
                struct sctp_ifa *ifa;
-               struct sockaddr_storage store_sa;
+               union sctp_sockstore store;
 
-               memset(&store_sa, 0, sizeof(store_sa));
+               memset(&store, 0, sizeof(store));
                switch (addr->sa_family) {
 #ifdef INET
                case AF_INET:
-               {
-                       struct sockaddr_in *sin;
-
-                       sin = (struct sockaddr_in *)&store_sa;
-                       memcpy(sin, addr, sizeof(struct sockaddr_in));
-                       sin->sin_port = 0;
+                       memcpy(&store.sin, addr, sizeof(struct sockaddr_in));
+                       store.sin.sin_port = 0;
                        break;
-               }
 #endif
 #ifdef INET6
                case AF_INET6:
-               {
-                       struct sockaddr_in6 *sin6;
-
-                       sin6 = (struct sockaddr_in6 *)&store_sa;
-                       memcpy(sin6, addr, sizeof(struct sockaddr_in6));
-                       sin6->sin6_port = 0;
+                       memcpy(&store.sin6, addr, sizeof(struct sockaddr_in6));
+                       store.sin6.sin6_port = 0;
                        break;
-               }
 #endif
 #if defined(__Userspace__)
                case AF_CONN:
-               {
-                       struct sockaddr_conn *sconn;
-
-                       sconn = (struct sockaddr_conn *)&store_sa;
-                       memcpy(sconn, addr, sizeof(struct sockaddr_conn));
-                       sconn->sconn_port = 0;
+                       memcpy(&store.sconn, addr, sizeof(struct sockaddr_conn));
+                       store.sconn.sconn_port = 0;
                        break;
-               }
 #endif
                default:
                        break;
@@ -3744,7 +3738,7 @@ sctp_inpcb_bind(struct socket *so, struct sockaddr *addr,
                         * O/S's will pass things in via the
                         * sctp_ifap argument (Panda).
                         */
-                       ifa = sctp_find_ifa_by_addr((struct sockaddr *)&store_sa,
+                       ifa = sctp_find_ifa_by_addr(&store.sa,
                                                    vrf_id, SCTP_ADDR_NOT_LOCKED);
                }
                if (ifa == NULL) {
@@ -4615,7 +4609,7 @@ sctp_add_remote_addr(struct sctp_tcb *stcb, struct sockaddr *newaddr,
         * this means its an initial value
         */
        net->rto_needed = 1;
-       net->RTO = 0;
+       net->RTO = 0;
        net->RTO_measured = 0;
        stcb->asoc.numnets++;
        net->ref_count = 1;
@@ -4668,7 +4662,9 @@ sctp_add_remote_addr(struct sctp_tcb *stcb, struct sockaddr *newaddr,
 #endif
        SCTP_RTALLOC((sctp_route_t *)&net->ro, stcb->asoc.vrf_id);
 
-#if !defined(__Userspace__)
+#if defined(__Userspace__)
+       net->src_addr_selected = 0;
+#else
        if (SCTP_ROUTE_HAS_VALID_IFN(&net->ro)) {
                /* Get source address */
                net->ro._s_addr = sctp_source_address_selection(stcb->sctp_ep,
@@ -4677,9 +4673,14 @@ sctp_add_remote_addr(struct sctp_tcb *stcb, struct sockaddr *newaddr,
                                                                net,
                                                                0,
                                                                stcb->asoc.vrf_id);
-               /* Now get the interface MTU */
-               if (net->ro._s_addr && net->ro._s_addr->ifn_p) {
-                       net->mtu = SCTP_GATHER_MTU_FROM_INTFC(net->ro._s_addr->ifn_p);
+               if (net->ro._s_addr != NULL) {
+                       net->src_addr_selected = 1;
+                       /* Now get the interface MTU */
+                       if (net->ro._s_addr->ifn_p != NULL) {
+                               net->mtu = SCTP_GATHER_MTU_FROM_INTFC(net->ro._s_addr->ifn_p);
+                       }
+               } else {
+                       net->src_addr_selected = 0;
                }
                if (net->mtu > 0) {
                        uint32_t rmtu;
@@ -4694,9 +4695,11 @@ sctp_add_remote_addr(struct sctp_tcb *stcb, struct sockaddr *newaddr,
                                 * the route may be leading out the loopback, or
                                 * a different interface.
                                 */
-                               net->mtu = rmtu;
+                               net->mtu = rmtu;
                        }
-               }
+               }
+       } else {
+               net->src_addr_selected = 0;
        }
 #endif
        if (net->mtu == 0) {
@@ -4720,7 +4723,7 @@ sctp_add_remote_addr(struct sctp_tcb *stcb, struct sockaddr *newaddr,
                        break;
                }
        }
-#if defined INET || defined INET6
+#if defined(INET) || defined(INET6)
        if (net->port) {
                net->mtu -= (uint32_t)sizeof(struct udphdr);
        }
@@ -4756,7 +4759,6 @@ sctp_add_remote_addr(struct sctp_tcb *stcb, struct sockaddr *newaddr,
         */
        net->find_pseudo_cumack = 1;
        net->find_rtx_pseudo_cumack = 1;
-       net->src_addr_selected = 0;
 #if defined(__FreeBSD__)
        /* Choose an initial flowid. */
        net->flowid = stcb->asoc.my_vtag ^
@@ -5191,9 +5193,9 @@ sctp_remove_net(struct sctp_tcb *stcb, struct sctp_nets *net)
                   (by micchie)
                 */
                if (sctp_is_mobility_feature_on(stcb->sctp_ep,
-                                               SCTP_MOBILITY_BASE) ||
+                                               SCTP_MOBILITY_BASE) ||
                    sctp_is_mobility_feature_on(stcb->sctp_ep,
-                                               SCTP_MOBILITY_FASTHANDOFF)) {
+                                               SCTP_MOBILITY_FASTHANDOFF)) {
                        SCTPDBG(SCTP_DEBUG_ASCONF1, "remove_net: primary dst is deleting\n");
                        if (asoc->deleted_primary != NULL) {
                                SCTPDBG(SCTP_DEBUG_ASCONF1, "remove_net: deleted primary may be already stored\n");
@@ -6947,13 +6949,16 @@ sctp_pcb_finish(void)
 #endif
 #if !defined(__FreeBSD__)
        SCTP_IPI_ITERATOR_WQ_DESTROY();
-       SCTP_ITERATOR_LOCK_DESTROY();
+       SCTP_ITERATOR_LOCK_DESTROY();
 #endif
        SCTP_OS_TIMER_STOP(&SCTP_BASE_INFO(addr_wq_timer.timer));
        SCTP_WQ_ADDR_LOCK();
        LIST_FOREACH_SAFE(wi, &SCTP_BASE_INFO(addr_wq), sctp_nxt_addr, nwi) {
                LIST_REMOVE(wi, sctp_nxt_addr);
                SCTP_DECR_LADDR_COUNT();
+               if (wi->action == SCTP_DEL_IP_ADDRESS) {
+                       SCTP_FREE(wi->ifa, SCTP_M_IFA);
+               }
                SCTP_ZONE_FREE(SCTP_BASE_INFO(ipi_zone_laddr), wi);
        }
        SCTP_WQ_ADDR_UNLOCK();
@@ -7098,7 +7103,14 @@ sctp_load_addresses_from_init(struct sctp_tcb *stcb, struct mbuf *m,
        sctp_key_t *new_key;
        uint32_t keylen;
        int got_random = 0, got_hmacs = 0, got_chklist = 0;
-       uint8_t ecn_allowed;
+       uint8_t peer_supports_ecn;
+       uint8_t peer_supports_prsctp;
+       uint8_t peer_supports_auth;
+       uint8_t peer_supports_asconf;
+       uint8_t peer_supports_asconf_ack;
+       uint8_t peer_supports_reconfig;
+       uint8_t peer_supports_nrsack;
+       uint8_t peer_supports_pktdrop;
 #ifdef INET
        struct sockaddr_in sin;
 #endif
@@ -7128,8 +7140,13 @@ sctp_load_addresses_from_init(struct sctp_tcb *stcb, struct mbuf *m,
        } else {
                sa = src;
        }
-       /* Turn off ECN until we get through all params */
-       ecn_allowed = 0;
+       peer_supports_ecn = 0;
+       peer_supports_prsctp = 0;
+       peer_supports_auth = 0;
+       peer_supports_asconf = 0;
+       peer_supports_reconfig = 0;
+       peer_supports_nrsack = 0;
+       peer_supports_pktdrop = 0;
        TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) {
                /* mark all addresses that we have currently on the list */
                net->dest_state |= SCTP_ADDR_NOT_IN_ASSOC;
@@ -7188,12 +7205,6 @@ sctp_load_addresses_from_init(struct sctp_tcb *stcb, struct mbuf *m,
                /* the assoc was freed? */
                return (-4);
        }
-       /*
-        * peer must explicitly turn this on. This may have been initialized
-        * to be "on" in order to allow local addr changes while INIT's are
-        * in flight.
-        */
-       stcb->asoc.peer_supports_asconf = 0;
        /* now we must go through each of the params. */
        phdr = sctp_get_next_param(m, offset, &parm_buf, sizeof(parm_buf));
        while (phdr) {
@@ -7379,7 +7390,7 @@ sctp_load_addresses_from_init(struct sctp_tcb *stcb, struct mbuf *m,
                } else
 #endif
                if (ptype == SCTP_ECN_CAPABLE) {
-                       ecn_allowed = 1;
+                       peer_supports_ecn = 1;
                } else if (ptype == SCTP_ULP_ADAPTATION) {
                        if (stcb->asoc.state != SCTP_STATE_OPEN) {
                                struct sctp_adaptation_layer_indication ai, *aip;
@@ -7400,7 +7411,9 @@ sctp_load_addresses_from_init(struct sctp_tcb *stcb, struct mbuf *m,
                        struct sctp_asconf_addrv4_param *fii;
 #endif
 
-                       stcb->asoc.peer_supports_asconf = 1;
+                       if (stcb->asoc.asconf_supported == 0) {
+                               return (-100);
+                       }
                        if (plen > sizeof(lstore)) {
                                return (-23);
                        }
@@ -7452,7 +7465,7 @@ sctp_load_addresses_from_init(struct sctp_tcb *stcb, struct mbuf *m,
                        stcb->asoc.peer_supports_nat = 1;
                } else if (ptype == SCTP_PRSCTP_SUPPORTED) {
                        /* Peer supports pr-sctp */
-                       stcb->asoc.peer_supports_prsctp = 1;
+                       peer_supports_prsctp = 1;
                } else if (ptype == SCTP_SUPPORTED_CHUNK_EXT) {
                        /* A supported extension chunk */
                        struct sctp_supported_chunk_types_param *pr_supported;
@@ -7464,34 +7477,29 @@ sctp_load_addresses_from_init(struct sctp_tcb *stcb, struct mbuf *m,
                        if (phdr == NULL) {
                                return (-25);
                        }
-                       stcb->asoc.peer_supports_asconf = 0;
-                       stcb->asoc.peer_supports_prsctp = 0;
-                       stcb->asoc.peer_supports_pktdrop = 0;
-                       stcb->asoc.peer_supports_strreset = 0;
-                       stcb->asoc.peer_supports_nr_sack = 0;
-                       stcb->asoc.peer_supports_auth = 0;
                        pr_supported = (struct sctp_supported_chunk_types_param *)phdr;
                        num_ent = plen - sizeof(struct sctp_paramhdr);
                        for (i = 0; i < num_ent; i++) {
                                switch (pr_supported->chunk_types[i]) {
                                case SCTP_ASCONF:
+                                       peer_supports_asconf = 1;
                                case SCTP_ASCONF_ACK:
-                                       stcb->asoc.peer_supports_asconf = 1;
+                                       peer_supports_asconf_ack = 1;
                                        break;
                                case SCTP_FORWARD_CUM_TSN:
-                                       stcb->asoc.peer_supports_prsctp = 1;
+                                       peer_supports_prsctp = 1;
                                        break;
                                case SCTP_PACKET_DROPPED:
-                                       stcb->asoc.peer_supports_pktdrop = 1;
+                                       peer_supports_pktdrop = 1;
                                        break;
                                case SCTP_NR_SELECTIVE_ACK:
-                                       stcb->asoc.peer_supports_nr_sack = 1;
+                                       peer_supports_nrsack = 1;
                                        break;
                                case SCTP_STREAM_RESET:
-                                       stcb->asoc.peer_supports_strreset = 1;
+                                       peer_supports_reconfig = 1;
                                        break;
                                case SCTP_AUTHENTICATION:
-                                       stcb->asoc.peer_supports_auth = 1;
+                                       peer_supports_auth = 1;
                                        break;
                                default:
                                        /* one I have not learned yet */
@@ -7628,24 +7636,47 @@ sctp_load_addresses_from_init(struct sctp_tcb *stcb, struct mbuf *m,
                        }
                }
        }
-       if (ecn_allowed == 0) {
-               stcb->asoc.ecn_allowed = 0;
+       if ((stcb->asoc.ecn_supported == 1) &&
+           (peer_supports_ecn == 0)) {
+               stcb->asoc.ecn_supported = 0;
        }
-       /* validate authentication required parameters */
-       if (got_random && got_hmacs) {
-               stcb->asoc.peer_supports_auth = 1;
-       } else {
-               stcb->asoc.peer_supports_auth = 0;
+       if ((stcb->asoc.prsctp_supported == 1) &&
+           (peer_supports_prsctp == 0)) {
+               stcb->asoc.prsctp_supported = 0;
+       }
+       if ((stcb->asoc.auth_supported == 1) &&
+           ((peer_supports_auth == 0) ||
+            (got_random == 0) || (got_hmacs == 0))) {
+               stcb->asoc.auth_supported = 0;
+       }
+       if ((stcb->asoc.asconf_supported == 1) &&
+           ((peer_supports_asconf == 0) || (peer_supports_asconf_ack == 0) ||
+            (stcb->asoc.auth_supported == 0) ||
+            (saw_asconf == 0) || (saw_asconf_ack == 0))) {
+               stcb->asoc.asconf_supported = 0;
        }
-       if (!stcb->asoc.peer_supports_auth && got_chklist) {
+       if ((stcb->asoc.reconfig_supported == 1) &&
+           (peer_supports_reconfig == 0)) {
+               stcb->asoc.reconfig_supported = 0;
+       }
+       if ((stcb->asoc.nrsack_supported == 1) &&
+           (peer_supports_nrsack == 0)) {
+               stcb->asoc.nrsack_supported = 0;
+       }
+       if ((stcb->asoc.pktdrop_supported == 1) &&
+           (peer_supports_pktdrop == 0)){
+               stcb->asoc.pktdrop_supported = 0;
+       }
+       /* validate authentication required parameters */
+       if ((peer_supports_auth == 0) && (got_chklist == 1)) {
                /* peer does not support auth but sent a chunks list? */
                return (-31);
        }
-       if (!SCTP_BASE_SYSCTL(sctp_asconf_auth_nochk) && stcb->asoc.peer_supports_asconf &&
-           !stcb->asoc.peer_supports_auth) {
+       if ((peer_supports_asconf == 1) && (peer_supports_auth == 0)) {
                /* peer supports asconf but not auth? */
                return (-32);
-       } else if ((stcb->asoc.peer_supports_asconf) && (stcb->asoc.peer_supports_auth) &&
+       } else if ((peer_supports_asconf == 1) &&
+                  (peer_supports_auth == 1) &&
                   ((saw_asconf == 0) || (saw_asconf_ack == 0))) {
                return (-33);
        }