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 | ||
