|
@@ -2570,6 +2570,12 @@ sctp_disposition_t sctp_sf_do_9_2_shutdown(const struct sctp_endpoint *ep,
|
|
chunk->subh.shutdown_hdr = sdh;
|
|
chunk->subh.shutdown_hdr = sdh;
|
|
ctsn = ntohl(sdh->cum_tsn_ack);
|
|
ctsn = ntohl(sdh->cum_tsn_ack);
|
|
|
|
|
|
|
|
+ if (TSN_lt(ctsn, asoc->ctsn_ack_point)) {
|
|
|
|
+ SCTP_DEBUG_PRINTK("ctsn %x\n", ctsn);
|
|
|
|
+ SCTP_DEBUG_PRINTK("ctsn_ack_point %x\n", asoc->ctsn_ack_point);
|
|
|
|
+ return SCTP_DISPOSITION_DISCARD;
|
|
|
|
+ }
|
|
|
|
+
|
|
/* If Cumulative TSN Ack beyond the max tsn currently
|
|
/* If Cumulative TSN Ack beyond the max tsn currently
|
|
* send, terminating the association and respond to the
|
|
* send, terminating the association and respond to the
|
|
* sender with an ABORT.
|
|
* sender with an ABORT.
|
|
@@ -2633,6 +2639,7 @@ sctp_disposition_t sctp_sf_do_9_2_shut_ctsn(const struct sctp_endpoint *ep,
|
|
{
|
|
{
|
|
struct sctp_chunk *chunk = arg;
|
|
struct sctp_chunk *chunk = arg;
|
|
sctp_shutdownhdr_t *sdh;
|
|
sctp_shutdownhdr_t *sdh;
|
|
|
|
+ __u32 ctsn;
|
|
|
|
|
|
if (!sctp_vtag_verify(chunk, asoc))
|
|
if (!sctp_vtag_verify(chunk, asoc))
|
|
return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
|
|
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,
|
|
commands);
|
|
commands);
|
|
|
|
|
|
sdh = (sctp_shutdownhdr_t *)chunk->skb->data;
|
|
sdh = (sctp_shutdownhdr_t *)chunk->skb->data;
|
|
|
|
+ ctsn = ntohl(sdh->cum_tsn_ack);
|
|
|
|
+
|
|
|
|
+ if (TSN_lt(ctsn, asoc->ctsn_ack_point)) {
|
|
|
|
+ SCTP_DEBUG_PRINTK("ctsn %x\n", ctsn);
|
|
|
|
+ SCTP_DEBUG_PRINTK("ctsn_ack_point %x\n", asoc->ctsn_ack_point);
|
|
|
|
+ return SCTP_DISPOSITION_DISCARD;
|
|
|
|
+ }
|
|
|
|
|
|
/* If Cumulative TSN Ack beyond the max tsn currently
|
|
/* If Cumulative TSN Ack beyond the max tsn currently
|
|
* send, terminating the association and respond to the
|
|
* send, terminating the association and respond to the
|
|
* sender with an ABORT.
|
|
* sender with an ABORT.
|
|
*/
|
|
*/
|
|
- if (!TSN_lt(ntohl(sdh->cum_tsn_ack), asoc->next_tsn))
|
|
|
|
|
|
+ if (!TSN_lt(ctsn, asoc->next_tsn))
|
|
return sctp_sf_violation_ctsn(ep, asoc, type, arg, commands);
|
|
return sctp_sf_violation_ctsn(ep, asoc, type, arg, commands);
|
|
|
|
|
|
/* verify, by checking the Cumulative TSN Ack field of the
|
|
/* verify, by checking the Cumulative TSN Ack field of the
|