diff options
| -rw-r--r-- | net/sctp/sm_statefuns.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c index d4c3fbc4671..12f62174f4a 100644 --- a/net/sctp/sm_statefuns.c +++ b/net/sctp/sm_statefuns.c | |||
| @@ -2544,6 +2544,7 @@ sctp_disposition_t sctp_sf_do_9_2_shutdown(const struct sctp_endpoint *ep, | |||
| 2544 | sctp_shutdownhdr_t *sdh; | 2544 | sctp_shutdownhdr_t *sdh; |
| 2545 | sctp_disposition_t disposition; | 2545 | sctp_disposition_t disposition; |
| 2546 | struct sctp_ulpevent *ev; | 2546 | struct sctp_ulpevent *ev; |
| 2547 | __u32 ctsn; | ||
| 2547 | 2548 | ||
| 2548 | if (!sctp_vtag_verify(chunk, asoc)) | 2549 | if (!sctp_vtag_verify(chunk, asoc)) |
| 2549 | return sctp_sf_pdiscard(ep, asoc, type, arg, commands); | 2550 | return sctp_sf_pdiscard(ep, asoc, type, arg, commands); |
| @@ -2558,6 +2559,14 @@ sctp_disposition_t sctp_sf_do_9_2_shutdown(const struct sctp_endpoint *ep, | |||
| 2558 | sdh = (sctp_shutdownhdr_t *)chunk->skb->data; | 2559 | sdh = (sctp_shutdownhdr_t *)chunk->skb->data; |
| 2559 | skb_pull(chunk->skb, sizeof(sctp_shutdownhdr_t)); | 2560 | skb_pull(chunk->skb, sizeof(sctp_shutdownhdr_t)); |
| 2560 | chunk->subh.shutdown_hdr = sdh; | 2561 | chunk->subh.shutdown_hdr = sdh; |
| 2562 | ctsn = ntohl(sdh->cum_tsn_ack); | ||
| 2563 | |||
| 2564 | /* If Cumulative TSN Ack beyond the max tsn currently | ||
| 2565 | * send, terminating the association and respond to the | ||
| 2566 | * sender with an ABORT. | ||
| 2567 | */ | ||
| 2568 | if (!TSN_lt(ctsn, asoc->next_tsn)) | ||
| 2569 | return sctp_sf_violation_ctsn(ep, asoc, type, arg, commands); | ||
| 2561 | 2570 | ||
| 2562 | /* API 5.3.1.5 SCTP_SHUTDOWN_EVENT | 2571 | /* API 5.3.1.5 SCTP_SHUTDOWN_EVENT |
| 2563 | * When a peer sends a SHUTDOWN, SCTP delivers this notification to | 2572 | * When a peer sends a SHUTDOWN, SCTP delivers this notification to |
