SCTP: Fix protocol violation When receiving an error lenght INIT-ACK
Subsystems (3)
PATCH 1/1 SCTP: Fix protocol violation When receiving an error lenght INIT-ACK
When receiving an error length INIT-ACK during COOKIE-WAIT, a 0-vtag ABORT will be responsed. This action violates the protocol apparently. This patch achieves the following things. 1 If the INIT-ACK contains all the fixed parameters, use init-tag
recorded from INIT-ACK as vtag.
2 If the INIT-ACK doesn't contain all the fixed parameters,
just reflect its vtag.
--- include/net/sctp/command.h | 1 + net/sctp/outqueue.c | 3 +++ net/sctp/sm_sideeffect.c | 5 ++++- net/sctp/sm_statefuns.c | 18 ++++++++++++++++++ 4 files changed, 26 insertions(+), 1 deletions(-)
include/net/sctp/command.h +1 -0
@@ -104,6 +104,7 @@ typedef enum {SCTP_CMD_ADAPTATION_IND ,/* generate and send adaptation event */ SCTP_CMD_ASSOC_SHKEY ,/* generate the association shared keys */ SCTP_CMD_T1_RETRAN ,/* Mark for retransmission after T1 timeout */ +SCTP_CMD_UPDATE_INITTAG ,/* Update peer inittag */ SCTP_CMD_LAST } sctp_verb_t;
net/sctp/outqueue.c +3 -0
@@ -793,6 +793,9 @@ int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout)break ;case SCTP_CID_ABORT : +if (sctp_test_T_bit (chunk)) { + packet->vtag = asoc->c.my_vtag; + }case SCTP_CID_SACK :case SCTP_CID_HEARTBEAT :case SCTP_CID_HEARTBEAT_ACK :
net/sctp/sm_sideeffect.c +4 -1
@@ -1536,7 +1536,10 @@ static int sctp_cmd_interpreter(sctp_event_t event_type, error =sctp_auth_asoc_init_active_key (asoc,GFP_ATOMIC );break ; - +case SCTP_CMD_UPDATE_INITTAG : + asoc->peer.i.init_tag = cmd->obj.u32; +break ; +default :printk (KERN_WARNING "Impossible command: %u, %p\n" , cmd->verb, cmd->obj.ptr);
net/sctp/sm_statefuns.c +18 -0
@@ -4144,6 +4144,24 @@ static sctp_disposition_t sctp_sf_abort_violation( goto nomem;if (asoc) { +/* Treat INIT-ACK as a special case during COOKIE-WAIT. */ +if (chunk->chunk_hdr->type ==SCTP_CID_INIT_ACK && + !asoc->peer.i.init_tag) { +sctp_initack_chunk_t *initack; + + initack = (sctp_initack_chunk_t *)chunk->chunk_hdr; +if (!sctp_chunk_length_valid (chunk, +sizeof (sctp_initack_chunk_t))) + abort->chunk_hdr->flags |=SCTP_CHUNK_FLAG_T ; +else { +unsigned int inittag; + + inittag =ntohl (initack->init_hdr.init_tag); +sctp_add_cmd_sf (commands,SCTP_CMD_UPDATE_INITTAG , +SCTP_U32 (inittag)); + } + } +sctp_add_cmd_sf (commands,SCTP_CMD_REPLY ,SCTP_CHUNK (abort));SCTP_INC_STATS (SCTP_MIB_OUTCTRLCHUNKS );
Signature · 7 lines
1.5.3 -- Regards Gui Jianfeng
Quoted 10 lines · Gui Jianfeng
When receiving an error length INIT-ACK during COOKIE-WAIT, a 0-vtag ABORT will be responsed. This action violates the protocol apparently. This patch achieves the following things. 1 If the INIT-ACK contains all the fixed parameters, use init-tag
recorded from INIT-ACK as vtag.
2 If the INIT-ACK doesn't contain all the fixed parameters,
just reflect its vtag.Signed-off-by Gui Jianfeng <[email protected]>---
I applied this although there we witespace errors (which I fixed up). I'll push this to David shortly.
-vlad