diff options
Diffstat (limited to 'net/sctp/sm_statefuns.c')
| -rw-r--r-- | net/sctp/sm_statefuns.c | 77 | 
1 files changed, 48 insertions, 29 deletions
| diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c index 278c56a2d076..8e01b8f09ac2 100644 --- a/net/sctp/sm_statefuns.c +++ b/net/sctp/sm_statefuns.c @@ -126,15 +126,18 @@ sctp_chunk_length_valid(struct sctp_chunk *chunk,   * should stop the T2-shutdown timer and remove all knowledge of the   * association (and thus the association enters the CLOSED state).   * - * Verification Tag: 8.5.1(C) + * Verification Tag: 8.5.1(C), sctpimpguide 2.41.   * C) Rules for packet carrying SHUTDOWN COMPLETE:   * ... - * - The receiver of a SHUTDOWN COMPLETE shall accept the packet if the - *   Verification Tag field of the packet matches its own tag OR it is - *   set to its peer's tag and the T bit is set in the Chunk Flags. - *   Otherwise, the receiver MUST silently discard the packet and take - *   no further action. An endpoint MUST ignore the SHUTDOWN COMPLETE if - *   it is not in the SHUTDOWN-ACK-SENT state. + * - The receiver of a SHUTDOWN COMPLETE shall accept the packet + *   if the Verification Tag field of the packet matches its own tag and + *   the T bit is not set + *   OR + *   it is set to its peer's tag and the T bit is set in the Chunk + *   Flags. + *   Otherwise, the receiver MUST silently discard the packet + *   and take no further action.  An endpoint MUST ignore the + *   SHUTDOWN COMPLETE if it is not in the SHUTDOWN-ACK-SENT state.   *   * Inputs   * (endpoint, asoc, chunk) @@ -2858,16 +2861,16 @@ sctp_disposition_t sctp_sf_eat_sack_6_2(const struct sctp_endpoint *ep,  /*   * Generate an ABORT in response to a packet.   * - * Section: 8.4 Handle "Out of the blue" Packets + * Section: 8.4 Handle "Out of the blue" Packets, sctpimpguide 2.41   * - * 8) The receiver should respond to the sender of the OOTB packet - *    with an ABORT.  When sending the ABORT, the receiver of the - *    OOTB packet MUST fill in the Verification Tag field of the - *    outbound packet with the value found in the Verification Tag - *    field of the OOTB packet and set the T-bit in the Chunk Flags - *    to indicate that no TCB was found.  After sending this ABORT, - *    the receiver of the OOTB packet shall discard the OOTB packet - *    and take no further action. + * 8) The receiver should respond to the sender of the OOTB packet with + *    an ABORT.  When sending the ABORT, the receiver of the OOTB packet + *    MUST fill in the Verification Tag field of the outbound packet + *    with the value found in the Verification Tag field of the OOTB + *    packet and set the T-bit in the Chunk Flags to indicate that the + *    Verification Tag is reflected.  After sending this ABORT, the + *    receiver of the OOTB packet shall discard the OOTB packet and take + *    no further action.   *   * Verification Tag:   * @@ -2895,6 +2898,10 @@ sctp_disposition_t sctp_sf_tabort_8_4_8(const struct sctp_endpoint *ep,  			return SCTP_DISPOSITION_NOMEM;  		} +		/* Reflect vtag if T-Bit is set */ +		if (sctp_test_T_bit(abort)) +			packet->vtag = ntohl(chunk->sctp_hdr->vtag); +  		/* Set the skb to the belonging sock for accounting.  */  		abort->skb->sk = ep->base.sk; @@ -3026,22 +3033,24 @@ nomem:  }  /* - * RFC 2960, 8.4 - Handle "Out of the blue" Packets + * RFC 2960, 8.4 - Handle "Out of the blue" Packets, sctpimpguide 2.41. + *   * 5) If the packet contains a SHUTDOWN ACK chunk, the receiver should   *    respond to the sender of the OOTB packet with a SHUTDOWN COMPLETE.   *    When sending the SHUTDOWN COMPLETE, the receiver of the OOTB   *    packet must fill in the Verification Tag field of the outbound   *    packet with the Verification Tag received in the SHUTDOWN ACK and - *    set the T-bit in the Chunk Flags to indicate that no TCB was - *    found. Otherwise, + *    set the T-bit in the Chunk Flags to indicate that the Verification + *    Tag is reflected.   *   * 8) The receiver should respond to the sender of the OOTB packet with   *    an ABORT.  When sending the ABORT, the receiver of the OOTB packet   *    MUST fill in the Verification Tag field of the outbound packet   *    with the value found in the Verification Tag field of the OOTB - *    packet and set the T-bit in the Chunk Flags to indicate that no - *    TCB was found.  After sending this ABORT, the receiver of the OOTB - *    packet shall discard the OOTB packet and take no further action. + *    packet and set the T-bit in the Chunk Flags to indicate that the + *    Verification Tag is reflected.  After sending this ABORT, the + *    receiver of the OOTB packet shall discard the OOTB packet and take + *    no further action.   */  sctp_disposition_t sctp_sf_ootb(const struct sctp_endpoint *ep,  				const struct sctp_association *asoc, @@ -3090,13 +3099,15 @@ sctp_disposition_t sctp_sf_ootb(const struct sctp_endpoint *ep,  /*   * Handle an "Out of the blue" SHUTDOWN ACK.   * - * Section: 8.4 5) + * Section: 8.4 5, sctpimpguide 2.41. + *   * 5) If the packet contains a SHUTDOWN ACK chunk, the receiver should - *   respond to the sender of the OOTB packet with a SHUTDOWN COMPLETE. - *   When sending the SHUTDOWN COMPLETE, the receiver of the OOTB packet - *   must fill in the Verification Tag field of the outbound packet with - *   the Verification Tag received in the SHUTDOWN ACK and set the - *   T-bit in the Chunk Flags to indicate that no TCB was found. + *    respond to the sender of the OOTB packet with a SHUTDOWN COMPLETE. + *    When sending the SHUTDOWN COMPLETE, the receiver of the OOTB + *    packet must fill in the Verification Tag field of the outbound + *    packet with the Verification Tag received in the SHUTDOWN ACK and + *    set the T-bit in the Chunk Flags to indicate that the Verification + *    Tag is reflected.   *   * Inputs   * (endpoint, asoc, type, arg, commands) @@ -3128,6 +3139,10 @@ static sctp_disposition_t sctp_sf_shut_8_4_5(const struct sctp_endpoint *ep,  			return SCTP_DISPOSITION_NOMEM;  		} +		/* Reflect vtag if T-Bit is set */ +		if (sctp_test_T_bit(shut)) +			packet->vtag = ntohl(chunk->sctp_hdr->vtag); +  		/* Set the skb to the belonging sock for accounting.  */  		shut->skb->sk = ep->base.sk; @@ -3591,7 +3606,6 @@ sctp_disposition_t sctp_sf_discard_chunk(const struct sctp_endpoint *ep,   *   * 2) If the OOTB packet contains an ABORT chunk, the receiver MUST   *    silently discard the OOTB packet and take no further action. - *    Otherwise,   *   * Verification Tag: No verification necessary   * @@ -4961,6 +4975,11 @@ static struct sctp_packet *sctp_abort_pkt_new(const struct sctp_endpoint *ep,  			sctp_ootb_pkt_free(packet);  			return NULL;  		} + +		/* Reflect vtag if T-Bit is set */ +		if (sctp_test_T_bit(abort)) +			packet->vtag = ntohl(chunk->sctp_hdr->vtag); +  		/* Add specified error causes, i.e., payload, to the  		 * end of the chunk.  		 */ | 
