Author: tuexen
Date: Sat Jul  6 09:23:04 2013
New Revision: 252883
URL: http://svnweb.freebsd.org/changeset/base/252883

Log:
  MFC r237569:
  Unify sctp_input() and sctp6_input().

Modified:
  stable/9/sys/netinet/sctp_input.c
  stable/9/sys/netinet6/sctp6_usrreq.c
Directory Properties:
  stable/9/sys/   (props changed)

Modified: stable/9/sys/netinet/sctp_input.c
==============================================================================
--- stable/9/sys/netinet/sctp_input.c   Sat Jul  6 09:17:54 2013        
(r252882)
+++ stable/9/sys/netinet/sctp_input.c   Sat Jul  6 09:23:04 2013        
(r252883)
@@ -5883,12 +5883,12 @@ sctp_input_with_port(struct mbuf *i_pak,
        uint8_t ecn_bits;
        struct ip *ip;
        struct sctphdr *sh;
+       struct sctp_chunkhdr *ch;
        struct sctp_inpcb *inp = NULL;
-       struct sctp_nets *net;
        struct sctp_tcb *stcb = NULL;
-       struct sctp_chunkhdr *ch;
+       struct sctp_nets *net = NULL;
        int refcount_up = 0;
-       int length, mlen, offset;
+       int length, offset;
        uint32_t mflowid;
        uint8_t use_mflowid;
 
@@ -5897,19 +5897,12 @@ sctp_input_with_port(struct mbuf *i_pak,
 
 #endif
 
+       iphlen = off;
        if (SCTP_GET_PKT_VRFID(i_pak, vrf_id)) {
                SCTP_RELEASE_PKT(i_pak);
                return;
        }
-       mlen = SCTP_HEADER_LEN(i_pak);
-       iphlen = off;
        m = SCTP_HEADER_TO_CHAIN(i_pak);
-
-       net = NULL;
-       SCTP_STAT_INCR(sctps_recvpackets);
-       SCTP_STAT_INCR_COUNTER64(sctps_inpackets);
-
-
 #ifdef SCTP_MBUF_LOGGING
        /* Log in any input mbufs */
        if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_MBUF_LOGGING_ENABLE) {
@@ -5923,8 +5916,9 @@ sctp_input_with_port(struct mbuf *i_pak,
        }
 #endif
 #ifdef SCTP_PACKET_LOGGING
-       if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LAST_PACKET_TRACING)
+       if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LAST_PACKET_TRACING) {
                sctp_packet_log(m);
+       }
 #endif
        if (m->m_flags & M_FLOWID) {
                mflowid = m->m_pkthdr.flowid;
@@ -5933,17 +5927,11 @@ sctp_input_with_port(struct mbuf *i_pak,
                mflowid = 0;
                use_mflowid = 0;
        }
-       /*
-        * Must take out the iphlen, since mlen expects this (only effect lb
-        * case)
-        */
-       mlen -= iphlen;
-
-       /*
-        * Get IP, SCTP, and first chunk header together in first mbuf.
-        */
+       SCTP_STAT_INCR(sctps_recvpackets);
+       SCTP_STAT_INCR_COUNTER64(sctps_inpackets);
+       /* Get IP, SCTP, and first chunk header together in the first mbuf. */
        ip = mtod(m, struct ip *);
-       offset = iphlen + sizeof(*sh) + sizeof(*ch);
+       offset = iphlen + sizeof(struct sctphdr) + sizeof(struct sctp_chunkhdr);
        if (SCTP_BUF_LEN(m) < offset) {
                if ((m = m_pullup(m, offset)) == 0) {
                        SCTP_STAT_INCR(sctps_hdrops);
@@ -5951,28 +5939,26 @@ sctp_input_with_port(struct mbuf *i_pak,
                }
                ip = mtod(m, struct ip *);
        }
-       /* validate mbuf chain length with IP payload length */
-       if (mlen < (SCTP_GET_IPV4_LENGTH(ip) - iphlen)) {
+       sh = (struct sctphdr *)((caddr_t)ip + iphlen);
+       ch = (struct sctp_chunkhdr *)((caddr_t)sh + sizeof(struct sctphdr));
+       offset -= sizeof(struct sctp_chunkhdr);
+       length = ip->ip_len + iphlen;
+       /* Validate mbuf chain length with IP payload length. */
+       if (SCTP_HEADER_LEN(i_pak) != length) {
+               SCTPDBG(SCTP_DEBUG_INPUT1,
+                   "sctp_input() length:%d reported length:%d\n", length, 
SCTP_HEADER_LEN(i_pak));
                SCTP_STAT_INCR(sctps_hdrops);
                goto bad;
        }
-       sh = (struct sctphdr *)((caddr_t)ip + iphlen);
-       ch = (struct sctp_chunkhdr *)((caddr_t)sh + sizeof(*sh));
-       SCTPDBG(SCTP_DEBUG_INPUT1,
-           "sctp_input() length:%d iphlen:%d\n", mlen, iphlen);
-
        /* SCTP does not allow broadcasts or multicasts */
        if (IN_MULTICAST(ntohl(ip->ip_dst.s_addr))) {
                goto bad;
        }
        if (SCTP_IS_IT_BROADCAST(ip->ip_dst, m)) {
-               /*
-                * We only look at broadcast if its a front state, All
-                * others we will not have a tcb for anyway.
-                */
                goto bad;
        }
-       /* validate SCTP checksum */
+       SCTPDBG(SCTP_DEBUG_INPUT1,
+           "sctp_input() length:%d iphlen:%d\n", length, iphlen);
        SCTPDBG(SCTP_DEBUG_CRCOFFLOAD,
            "sctp_input(): Packet of length %d received on %s with csum_flags 
0x%x.\n",
            m->m_pkthdr.len,
@@ -5983,21 +5969,18 @@ sctp_input_with_port(struct mbuf *i_pak,
 #else
        if (m->m_pkthdr.csum_flags & CSUM_SCTP_VALID) {
                SCTP_STAT_INCR(sctps_recvhwcrc);
-               goto sctp_skip_csum_4;
+               goto sctp_skip_csum;
        }
-       check = sh->checksum;   /* save incoming checksum */
-       sh->checksum = 0;       /* prepare for calc */
+       check = sh->checksum;
+       sh->checksum = 0;
        calc_check = sctp_calculate_cksum(m, iphlen);
        sh->checksum = check;
        SCTP_STAT_INCR(sctps_recvswcrc);
        if (calc_check != check) {
                SCTPDBG(SCTP_DEBUG_INPUT1, "Bad CSUM on SCTP packet 
calc_check:%x check:%x  m:%p mlen:%d iphlen:%d\n",
-                   calc_check, check, m, mlen, iphlen);
-
-               stcb = sctp_findassociation_addr(m,
-                   offset - sizeof(*ch),
-                   sh, ch, &inp, &net,
-                   vrf_id);
+                   calc_check, check, m, length, iphlen);
+               stcb = sctp_findassociation_addr(m, offset,
+                   sh, ch, &inp, &net, vrf_id);
                if ((net) && (port)) {
                        if (net->port == 0) {
                                sctp_pathmtu_adjustment(stcb, net->mtu - 
sizeof(struct udphdr));
@@ -6011,7 +5994,7 @@ sctp_input_with_port(struct mbuf *i_pak,
 #endif
                }
                if ((inp) && (stcb)) {
-                       sctp_send_packet_dropped(stcb, net, m, mlen + iphlen, 
iphlen, 1);
+                       sctp_send_packet_dropped(stcb, net, m, length, iphlen, 
1);
                        sctp_chunk_output(inp, stcb, 
SCTP_OUTPUT_FROM_INPUT_ERROR, SCTP_SO_NOT_LOCKED);
                } else if ((inp != NULL) && (stcb == NULL)) {
                        refcount_up = 1;
@@ -6020,18 +6003,14 @@ sctp_input_with_port(struct mbuf *i_pak,
                SCTP_STAT_INCR_COUNTER32(sctps_checksumerrors);
                goto bad;
        }
-sctp_skip_csum_4:
+sctp_skip_csum:
 #endif
        /* destination port of 0 is illegal, based on RFC2960. */
        if (sh->dest_port == 0) {
                SCTP_STAT_INCR(sctps_hdrops);
                goto bad;
        }
-       /*
-        * Locate pcb and tcb for datagram sctp_findassociation_addr() wants
-        * IP/SCTP/first chunk header...
-        */
-       stcb = sctp_findassociation_addr(m, offset - sizeof(*ch),
+       stcb = sctp_findassociation_addr(m, offset,
            sh, ch, &inp, &net, vrf_id);
        if ((net) && (port)) {
                if (net->port == 0) {
@@ -6045,27 +6024,10 @@ sctp_skip_csum_4:
                net->flowidset = 1;
 #endif
        }
-       /* inp's ref-count increased && stcb locked */
        if (inp == NULL) {
-               struct sctp_init_chunk *init_chk, chunk_buf;
-
                SCTP_STAT_INCR(sctps_noport);
                if (badport_bandlim(BANDLIM_SCTP_OOTB) < 0)
                        goto bad;
-               SCTPDBG(SCTP_DEBUG_INPUT1,
-                   "Sending a ABORT from packet entry!\n");
-               if (ch->chunk_type == SCTP_INITIATION) {
-                       /*
-                        * we do a trick here to get the INIT tag, dig in
-                        * and get the tag from the INIT and put it in the
-                        * common header.
-                        */
-                       init_chk = (struct sctp_init_chunk *)sctp_m_getptr(m,
-                           iphlen + sizeof(*sh), sizeof(*init_chk),
-                           (uint8_t *) & chunk_buf);
-                       if (init_chk != NULL)
-                               sh->v_tag = init_chk->init.initiate_tag;
-               }
                if (ch->chunk_type == SCTP_SHUTDOWN_ACK) {
                        sctp_send_shutdown_complete2(m, sh,
                            use_mflowid, mflowid,
@@ -6089,7 +6051,7 @@ sctp_skip_csum_4:
                refcount_up = 1;
        }
 #ifdef IPSEC
-       /*
+       /*-
         * I very much doubt any of the IPSEC stuff will work but I have no
         * idea, so I will leave it in place.
         */
@@ -6098,28 +6060,22 @@ sctp_skip_csum_4:
                SCTP_STAT_INCR(sctps_hdrops);
                goto bad;
        }
-#endif                         /* IPSEC */
-
-       /*
-        * common chunk processing
-        */
-       length = ip->ip_len + iphlen;
-       offset -= sizeof(struct sctp_chunkhdr);
+#endif
 
        ecn_bits = ip->ip_tos;
-
        /* sa_ignore NO_NULL_CHK */
        sctp_common_input_processing(&m, iphlen, offset, length, sh, ch,
            inp, stcb, net, ecn_bits,
            use_mflowid, mflowid,
            vrf_id, port);
-       /* inp's ref-count reduced && stcb unlocked */
        if (m) {
                sctp_m_freem(m);
        }
        if ((inp) && (refcount_up)) {
                /* reduce ref-count */
+               SCTP_INP_WLOCK(inp);
                SCTP_INP_DECR_REF(inp);
+               SCTP_INP_WUNLOCK(inp);
        }
        return;
 bad:
@@ -6128,7 +6084,9 @@ bad:
        }
        if ((inp) && (refcount_up)) {
                /* reduce ref-count */
+               SCTP_INP_WLOCK(inp);
                SCTP_INP_DECR_REF(inp);
+               SCTP_INP_WUNLOCK(inp);
        }
        if (m) {
                sctp_m_freem(m);

Modified: stable/9/sys/netinet6/sctp6_usrreq.c
==============================================================================
--- stable/9/sys/netinet6/sctp6_usrreq.c        Sat Jul  6 09:17:54 2013        
(r252882)
+++ stable/9/sys/netinet6/sctp6_usrreq.c        Sat Jul  6 09:23:04 2013        
(r252883)
@@ -69,22 +69,17 @@ int
 sctp6_input(struct mbuf **i_pak, int *offp, int proto)
 {
        struct mbuf *m;
+       int iphlen;
+       uint32_t vrf_id = 0;
+       uint8_t ecn_bits;
        struct ip6_hdr *ip6;
        struct sctphdr *sh;
-       struct sctp_inpcb *in6p = NULL;
-       struct sctp_nets *net;
-       int refcount_up = 0;
-       uint32_t vrf_id = 0;
-
-#ifdef IPSEC
-       struct inpcb *in6p_ip;
-
-#endif
        struct sctp_chunkhdr *ch;
-       int length, offset, iphlen;
-       uint8_t ecn_bits;
+       struct sctp_inpcb *inp = NULL;
        struct sctp_tcb *stcb = NULL;
-       int pkt_len = 0;
+       struct sctp_nets *net = NULL;
+       int refcount_up = 0;
+       int length, offset;
        uint32_t mflowid;
        uint8_t use_mflowid;
 
@@ -92,17 +87,26 @@ sctp6_input(struct mbuf **i_pak, int *of
        uint32_t check, calc_check;
 
 #endif
-       int off = *offp;
        uint16_t port = 0;
 
-       /* get the VRF and table id's */
+       iphlen = *offp;
        if (SCTP_GET_PKT_VRFID(*i_pak, vrf_id)) {
                SCTP_RELEASE_PKT(*i_pak);
-               return (-1);
+               return (IPPROTO_DONE);
        }
        m = SCTP_HEADER_TO_CHAIN(*i_pak);
-       pkt_len = SCTP_HEADER_LEN(*i_pak);
-
+#ifdef SCTP_MBUF_LOGGING
+       /* Log in any input mbufs */
+       if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_MBUF_LOGGING_ENABLE) {
+               struct mbuf *mat;
+
+               for (mat = m; mat; mat = SCTP_BUF_NEXT(mat)) {
+                       if (SCTP_BUF_IS_EXTENDED(mat)) {
+                               sctp_log_mb(mat, SCTP_MBUF_INPUT);
+                       }
+               }
+       }
+#endif
 #ifdef SCTP_PACKET_LOGGING
        if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LAST_PACKET_TRACING) {
                sctp_packet_log(m);
@@ -115,42 +119,38 @@ sctp6_input(struct mbuf **i_pak, int *of
                mflowid = 0;
                use_mflowid = 0;
        }
+       SCTP_STAT_INCR(sctps_recvpackets);
+       SCTP_STAT_INCR_COUNTER64(sctps_inpackets);
+       /* Get IP, SCTP, and first chunk header together in the first mbuf. */
        ip6 = mtod(m, struct ip6_hdr *);
-       /* Ensure that (sctphdr + sctp_chunkhdr) in a row. */
-       IP6_EXTHDR_GET(sh, struct sctphdr *, m, off,
-           (int)(sizeof(*sh) + sizeof(*ch)));
+       offset = iphlen + sizeof(struct sctphdr) + sizeof(struct sctp_chunkhdr);
+       IP6_EXTHDR_GET(sh, struct sctphdr *, m, iphlen,
+           (int)(sizeof(struct sctphdr) + sizeof(struct sctp_chunkhdr)));
        if (sh == NULL) {
                SCTP_STAT_INCR(sctps_hdrops);
                return (IPPROTO_DONE);
        }
        ch = (struct sctp_chunkhdr *)((caddr_t)sh + sizeof(struct sctphdr));
-       iphlen = off;
-       offset = iphlen + sizeof(*sh) + sizeof(*ch);
-       SCTPDBG(SCTP_DEBUG_INPUT1,
-           "sctp6_input() length:%d iphlen:%d\n", pkt_len, iphlen);
-
-
-#if defined(NFAITH) && NFAITH > 0
-
+       offset -= sizeof(struct sctp_chunkhdr);
        if (faithprefix_p != NULL && (*faithprefix_p) (&ip6->ip6_dst)) {
                /* XXX send icmp6 host/port unreach? */
                goto bad;
        }
-#endif                         /* NFAITH defined and > 0 */
-       SCTP_STAT_INCR(sctps_recvpackets);
-       SCTP_STAT_INCR_COUNTER64(sctps_inpackets);
-       SCTPDBG(SCTP_DEBUG_INPUT1, "V6 input gets a packet iphlen:%d 
pktlen:%d\n",
-           iphlen, pkt_len);
-       if (IN6_IS_ADDR_MULTICAST(&ip6->ip6_dst)) {
-               /* No multi-cast support in SCTP */
+       length = ntohs(ip6->ip6_plen) + iphlen;
+       /* Validate mbuf chain length with IP payload length. */
+       if (SCTP_HEADER_LEN(*i_pak) != length) {
+               SCTPDBG(SCTP_DEBUG_INPUT1,
+                   "sctp6_input() length:%d reported length:%d\n", length, 
SCTP_HEADER_LEN(*i_pak));
+               SCTP_STAT_INCR(sctps_hdrops);
                goto bad;
        }
-       /* destination port of 0 is illegal, based on RFC2960. */
-       if (sh->dest_port == 0)
+       if (IN6_IS_ADDR_MULTICAST(&ip6->ip6_dst)) {
                goto bad;
-
+       }
+       SCTPDBG(SCTP_DEBUG_INPUT1,
+           "sctp6_input() length:%d iphlen:%d\n", length, iphlen);
        SCTPDBG(SCTP_DEBUG_CRCOFFLOAD,
-           "sctp_input(): Packet of length %d received on %s with csum_flags 
0x%x.\n",
+           "sctp6_input(): Packet of length %d received on %s with csum_flags 
0x%x.\n",
            m->m_pkthdr.len,
            if_name(m->m_pkthdr.rcvif),
            m->m_pkthdr.csum_flags);
@@ -161,15 +161,16 @@ sctp6_input(struct mbuf **i_pak, int *of
                SCTP_STAT_INCR(sctps_recvhwcrc);
                goto sctp_skip_csum;
        }
-       check = sh->checksum;   /* save incoming checksum */
-       sh->checksum = 0;       /* prepare for calc */
+       check = sh->checksum;
+       sh->checksum = 0;
        calc_check = sctp_calculate_cksum(m, iphlen);
+       sh->checksum = check;
        SCTP_STAT_INCR(sctps_recvswcrc);
        if (calc_check != check) {
-               SCTPDBG(SCTP_DEBUG_INPUT1, "Bad CSUM on SCTP packet 
calc_check:%x check:%x  m:%p phlen:%d\n",
-                   calc_check, check, m, iphlen);
-               stcb = sctp_findassociation_addr(m, offset - sizeof(*ch),
-                   sh, ch, &in6p, &net, vrf_id);
+               SCTPDBG(SCTP_DEBUG_INPUT1, "Bad CSUM on SCTP packet 
calc_check:%x check:%x  m:%p mlen:%d iphlen:%d\n",
+                   calc_check, check, m, length, iphlen);
+               stcb = sctp_findassociation_addr(m, offset,
+                   sh, ch, &inp, &net, vrf_id);
                if ((net) && (port)) {
                        if (net->port == 0) {
                                sctp_pathmtu_adjustment(stcb, net->mtu - 
sizeof(struct udphdr));
@@ -182,28 +183,25 @@ sctp6_input(struct mbuf **i_pak, int *of
                        net->flowidset = 1;
 #endif
                }
-               /* in6p's ref-count increased && stcb locked */
-               if ((in6p) && (stcb)) {
-                       sctp_send_packet_dropped(stcb, net, m, pkt_len, iphlen, 
1);
-                       sctp_chunk_output((struct sctp_inpcb *)in6p, stcb, 
SCTP_OUTPUT_FROM_INPUT_ERROR, SCTP_SO_NOT_LOCKED);
-               } else if ((in6p != NULL) && (stcb == NULL)) {
+               if ((inp) && (stcb)) {
+                       sctp_send_packet_dropped(stcb, net, m, length, iphlen, 
1);
+                       sctp_chunk_output(inp, stcb, 
SCTP_OUTPUT_FROM_INPUT_ERROR, SCTP_SO_NOT_LOCKED);
+               } else if ((inp != NULL) && (stcb == NULL)) {
                        refcount_up = 1;
                }
                SCTP_STAT_INCR(sctps_badsum);
                SCTP_STAT_INCR_COUNTER32(sctps_checksumerrors);
                goto bad;
        }
-       sh->checksum = calc_check;
-
 sctp_skip_csum:
 #endif
-       net = NULL;
-       /*
-        * Locate pcb and tcb for datagram sctp_findassociation_addr() wants
-        * IP/SCTP/first chunk header...
-        */
-       stcb = sctp_findassociation_addr(m, offset - sizeof(*ch),
-           sh, ch, &in6p, &net, vrf_id);
+       /* destination port of 0 is illegal, based on RFC2960. */
+       if (sh->dest_port == 0) {
+               SCTP_STAT_INCR(sctps_hdrops);
+               goto bad;
+       }
+       stcb = sctp_findassociation_addr(m, offset,
+           sh, ch, &inp, &net, vrf_id);
        if ((net) && (port)) {
                if (net->port == 0) {
                        sctp_pathmtu_adjustment(stcb, net->mtu - sizeof(struct 
udphdr));
@@ -216,25 +214,10 @@ sctp_skip_csum:
                net->flowidset = 1;
 #endif
        }
-       /* in6p's ref-count increased */
-       if (in6p == NULL) {
-               struct sctp_init_chunk *init_chk, chunk_buf;
-
+       if (inp == NULL) {
                SCTP_STAT_INCR(sctps_noport);
-               if (ch->chunk_type == SCTP_INITIATION) {
-                       /*
-                        * we do a trick here to get the INIT tag, dig in
-                        * and get the tag from the INIT and put it in the
-                        * common header.
-                        */
-                       init_chk = (struct sctp_init_chunk *)sctp_m_getptr(m,
-                           iphlen + sizeof(*sh), sizeof(*init_chk),
-                           (uint8_t *) & chunk_buf);
-                       if (init_chk)
-                               sh->v_tag = init_chk->init.initiate_tag;
-                       else
-                               sh->v_tag = 0;
-               }
+               if (badport_bandlim(BANDLIM_SCTP_OOTB) < 0)
+                       goto bad;
                if (ch->chunk_type == SCTP_SHUTDOWN_ACK) {
                        sctp_send_shutdown_complete2(m, sh,
                            use_mflowid, mflowid,
@@ -258,55 +241,46 @@ sctp_skip_csum:
                refcount_up = 1;
        }
 #ifdef IPSEC
-       /*
-        * Check AH/ESP integrity.
+       /*-
+        * I very much doubt any of the IPSEC stuff will work but I have no
+        * idea, so I will leave it in place.
         */
-       in6p_ip = (struct inpcb *)in6p;
-       if (in6p_ip && (ipsec6_in_reject(m, in6p_ip))) {
-/* XXX */
+       if (inp && ipsec6_in_reject(m, &inp->ip_inp.inp)) {
                MODULE_GLOBAL(ipsec6stat).in_polvio++;
+               SCTP_STAT_INCR(sctps_hdrops);
                goto bad;
        }
-#endif                         /* IPSEC */
+#endif
 
-       /*
-        * CONTROL chunk processing
-        */
-       offset -= sizeof(*ch);
        ecn_bits = ((ntohl(ip6->ip6_flow) >> 20) & 0x000000ff);
-
-       /* Length now holds the total packet length payload + iphlen */
-       length = ntohs(ip6->ip6_plen) + iphlen;
-
        /* sa_ignore NO_NULL_CHK */
        sctp_common_input_processing(&m, iphlen, offset, length, sh, ch,
-           in6p, stcb, net, ecn_bits,
+           inp, stcb, net, ecn_bits,
            use_mflowid, mflowid,
            vrf_id, port);
-       /* inp's ref-count reduced && stcb unlocked */
-       /* XXX this stuff below gets moved to appropriate parts later... */
-       if (m)
+       if (m) {
                sctp_m_freem(m);
-       if ((in6p) && refcount_up) {
+       }
+       if ((inp) && (refcount_up)) {
                /* reduce ref-count */
-               SCTP_INP_WLOCK(in6p);
-               SCTP_INP_DECR_REF(in6p);
-               SCTP_INP_WUNLOCK(in6p);
+               SCTP_INP_WLOCK(inp);
+               SCTP_INP_DECR_REF(inp);
+               SCTP_INP_WUNLOCK(inp);
        }
        return (IPPROTO_DONE);
-
 bad:
        if (stcb) {
                SCTP_TCB_UNLOCK(stcb);
        }
-       if ((in6p) && refcount_up) {
+       if ((inp) && (refcount_up)) {
                /* reduce ref-count */
-               SCTP_INP_WLOCK(in6p);
-               SCTP_INP_DECR_REF(in6p);
-               SCTP_INP_WUNLOCK(in6p);
+               SCTP_INP_WLOCK(inp);
+               SCTP_INP_DECR_REF(inp);
+               SCTP_INP_WUNLOCK(inp);
        }
-       if (m)
+       if (m) {
                sctp_m_freem(m);
+       }
        return (IPPROTO_DONE);
 }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to