]> xenbits.xensource.com Git - people/royger/freebsd.git/commitdiff
Don't bundle a SACK chunk with a SHUTDOWN chunk if it is not required.
authortuexen <tuexen@FreeBSD.org>
Fri, 9 Dec 2016 17:58:07 +0000 (17:58 +0000)
committertuexen <tuexen@FreeBSD.org>
Fri, 9 Dec 2016 17:58:07 +0000 (17:58 +0000)
MFC after: 1 week

sys/netinet/sctp_indata.c

index e36e7ad0fe0842d96b02a555bd50202d377b8d47..f3776a05e181e517fe3f997932f69c9cb7446078 100644 (file)
@@ -2437,13 +2437,17 @@ sctp_sack_check(struct sctp_tcb *stcb, int was_a_gap)
 {
        struct sctp_association *asoc;
        uint32_t highest_tsn;
+       int is_a_gap;
 
+       sctp_slide_mapping_arrays(stcb);
        asoc = &stcb->asoc;
        if (SCTP_TSN_GT(asoc->highest_tsn_inside_nr_map, asoc->highest_tsn_inside_map)) {
                highest_tsn = asoc->highest_tsn_inside_nr_map;
        } else {
                highest_tsn = asoc->highest_tsn_inside_map;
        }
+       /* Is there a gap now? */
+       is_a_gap = SCTP_TSN_GT(highest_tsn, stcb->asoc.cumulative_tsn);
 
        /*
         * Now we need to see if we need to queue a sack or just start the
@@ -2462,13 +2466,10 @@ sctp_sack_check(struct sctp_tcb *stcb, int was_a_gap)
                }
                sctp_send_shutdown(stcb,
                    ((stcb->asoc.alternate) ? stcb->asoc.alternate : stcb->asoc.primary_destination));
-               sctp_send_sack(stcb, SCTP_SO_NOT_LOCKED);
+               if (is_a_gap) {
+                       sctp_send_sack(stcb, SCTP_SO_NOT_LOCKED);
+               }
        } else {
-               int is_a_gap;
-
-               /* is there a gap now ? */
-               is_a_gap = SCTP_TSN_GT(highest_tsn, stcb->asoc.cumulative_tsn);
-
                /*
                 * CMT DAC algorithm: increase number of packets received
                 * since last ack