diff options
Diffstat (limited to 'net/sctp/sm_statefuns.c')
-rw-r--r-- | net/sctp/sm_statefuns.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c index 910926906a3a..73bdeb2b6c62 100644 --- a/net/sctp/sm_statefuns.c +++ b/net/sctp/sm_statefuns.c | |||
@@ -2570,6 +2570,12 @@ sctp_disposition_t sctp_sf_do_9_2_shutdown(const struct sctp_endpoint *ep, | |||
2570 | chunk->subh.shutdown_hdr = sdh; | 2570 | chunk->subh.shutdown_hdr = sdh; |
2571 | ctsn = ntohl(sdh->cum_tsn_ack); | 2571 | ctsn = ntohl(sdh->cum_tsn_ack); |
2572 | 2572 | ||
2573 | if (TSN_lt(ctsn, asoc->ctsn_ack_point)) { | ||
2574 | SCTP_DEBUG_PRINTK("ctsn %x\n", ctsn); | ||
2575 | SCTP_DEBUG_PRINTK("ctsn_ack_point %x\n", asoc->ctsn_ack_point); | ||
2576 | return SCTP_DISPOSITION_DISCARD; | ||
2577 | } | ||
2578 | |||
2573 | /* If Cumulative TSN Ack beyond the max tsn currently | 2579 | /* If Cumulative TSN Ack beyond the max tsn currently |
2574 | * send, terminating the association and respond to the | 2580 | * send, terminating the association and respond to the |
2575 | * sender with an ABORT. | 2581 | * sender with an ABORT. |
@@ -2633,6 +2639,7 @@ sctp_disposition_t sctp_sf_do_9_2_shut_ctsn(const struct sctp_endpoint *ep, | |||
2633 | { | 2639 | { |
2634 | struct sctp_chunk *chunk = arg; | 2640 | struct sctp_chunk *chunk = arg; |
2635 | sctp_shutdownhdr_t *sdh; | 2641 | sctp_shutdownhdr_t *sdh; |
2642 | __u32 ctsn; | ||
2636 | 2643 | ||
2637 | if (!sctp_vtag_verify(chunk, asoc)) | 2644 | if (!sctp_vtag_verify(chunk, asoc)) |
2638 | return sctp_sf_pdiscard(ep, asoc, type, arg, commands); | 2645 | return sctp_sf_pdiscard(ep, asoc, type, arg, commands); |
@@ -2644,12 +2651,19 @@ sctp_disposition_t sctp_sf_do_9_2_shut_ctsn(const struct sctp_endpoint *ep, | |||
2644 | commands); | 2651 | commands); |
2645 | 2652 | ||
2646 | sdh = (sctp_shutdownhdr_t *)chunk->skb->data; | 2653 | sdh = (sctp_shutdownhdr_t *)chunk->skb->data; |
2654 | ctsn = ntohl(sdh->cum_tsn_ack); | ||
2655 | |||
2656 | if (TSN_lt(ctsn, asoc->ctsn_ack_point)) { | ||
2657 | SCTP_DEBUG_PRINTK("ctsn %x\n", ctsn); | ||
2658 | SCTP_DEBUG_PRINTK("ctsn_ack_point %x\n", asoc->ctsn_ack_point); | ||
2659 | return SCTP_DISPOSITION_DISCARD; | ||
2660 | } | ||
2647 | 2661 | ||
2648 | /* If Cumulative TSN Ack beyond the max tsn currently | 2662 | /* If Cumulative TSN Ack beyond the max tsn currently |
2649 | * send, terminating the association and respond to the | 2663 | * send, terminating the association and respond to the |
2650 | * sender with an ABORT. | 2664 | * sender with an ABORT. |
2651 | */ | 2665 | */ |
2652 | if (!TSN_lt(ntohl(sdh->cum_tsn_ack), asoc->next_tsn)) | 2666 | if (!TSN_lt(ctsn, asoc->next_tsn)) |
2653 | return sctp_sf_violation_ctsn(ep, asoc, type, arg, commands); | 2667 | return sctp_sf_violation_ctsn(ep, asoc, type, arg, commands); |
2654 | 2668 | ||
2655 | /* verify, by checking the Cumulative TSN Ack field of the | 2669 | /* verify, by checking the Cumulative TSN Ack field of the |