diff options
Diffstat (limited to 'net/sctp/sm_statefuns.c')
-rw-r--r-- | net/sctp/sm_statefuns.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c index f2ed6473feef..3ef97499df0d 100644 --- a/net/sctp/sm_statefuns.c +++ b/net/sctp/sm_statefuns.c | |||
@@ -4144,6 +4144,24 @@ static sctp_disposition_t sctp_sf_abort_violation( | |||
4144 | goto nomem; | 4144 | goto nomem; |
4145 | 4145 | ||
4146 | if (asoc) { | 4146 | if (asoc) { |
4147 | /* Treat INIT-ACK as a special case during COOKIE-WAIT. */ | ||
4148 | if (chunk->chunk_hdr->type == SCTP_CID_INIT_ACK && | ||
4149 | !asoc->peer.i.init_tag) { | ||
4150 | sctp_initack_chunk_t *initack; | ||
4151 | |||
4152 | initack = (sctp_initack_chunk_t *)chunk->chunk_hdr; | ||
4153 | if (!sctp_chunk_length_valid(chunk, | ||
4154 | sizeof(sctp_initack_chunk_t))) | ||
4155 | abort->chunk_hdr->flags |= SCTP_CHUNK_FLAG_T; | ||
4156 | else { | ||
4157 | unsigned int inittag; | ||
4158 | |||
4159 | inittag = ntohl(initack->init_hdr.init_tag); | ||
4160 | sctp_add_cmd_sf(commands, SCTP_CMD_UPDATE_INITTAG, | ||
4161 | SCTP_U32(inittag)); | ||
4162 | } | ||
4163 | } | ||
4164 | |||
4147 | sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(abort)); | 4165 | sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(abort)); |
4148 | SCTP_INC_STATS(SCTP_MIB_OUTCTRLCHUNKS); | 4166 | SCTP_INC_STATS(SCTP_MIB_OUTCTRLCHUNKS); |
4149 | 4167 | ||