|
@@ -189,7 +189,7 @@ sctp_disposition_t sctp_sf_do_4_C(const struct sctp_endpoint *ep,
|
|
0, 0, 0, GFP_ATOMIC);
|
|
0, 0, 0, GFP_ATOMIC);
|
|
if (ev)
|
|
if (ev)
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP,
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP,
|
|
- SCTP_ULPEVENT(ev));
|
|
|
|
|
|
+ SCTP_ULPEVENT(ev));
|
|
|
|
|
|
/* Upon reception of the SHUTDOWN COMPLETE chunk the endpoint
|
|
/* Upon reception of the SHUTDOWN COMPLETE chunk the endpoint
|
|
* will verify that it is in SHUTDOWN-ACK-SENT state, if it is
|
|
* will verify that it is in SHUTDOWN-ACK-SENT state, if it is
|
|
@@ -228,7 +228,7 @@ sctp_disposition_t sctp_sf_do_4_C(const struct sctp_endpoint *ep,
|
|
* Verification Tag field to Tag_A, and also provide its own
|
|
* Verification Tag field to Tag_A, and also provide its own
|
|
* Verification Tag (Tag_Z) in the Initiate Tag field.
|
|
* Verification Tag (Tag_Z) in the Initiate Tag field.
|
|
*
|
|
*
|
|
- * Verification Tag: Must be 0.
|
|
|
|
|
|
+ * Verification Tag: Must be 0.
|
|
*
|
|
*
|
|
* Inputs
|
|
* Inputs
|
|
* (endpoint, asoc, chunk)
|
|
* (endpoint, asoc, chunk)
|
|
@@ -256,7 +256,7 @@ sctp_disposition_t sctp_sf_do_5_1B_init(const struct sctp_endpoint *ep,
|
|
/* 6.10 Bundling
|
|
/* 6.10 Bundling
|
|
* An endpoint MUST NOT bundle INIT, INIT ACK or
|
|
* An endpoint MUST NOT bundle INIT, INIT ACK or
|
|
* SHUTDOWN COMPLETE with any other chunks.
|
|
* SHUTDOWN COMPLETE with any other chunks.
|
|
- *
|
|
|
|
|
|
+ *
|
|
* IG Section 2.11.2
|
|
* IG Section 2.11.2
|
|
* Furthermore, we require that the receiver of an INIT chunk MUST
|
|
* Furthermore, we require that the receiver of an INIT chunk MUST
|
|
* enforce these rules by silently discarding an arriving packet
|
|
* enforce these rules by silently discarding an arriving packet
|
|
@@ -282,7 +282,7 @@ sctp_disposition_t sctp_sf_do_5_1B_init(const struct sctp_endpoint *ep,
|
|
return sctp_sf_tabort_8_4_8(ep, asoc, type, arg, commands);
|
|
return sctp_sf_tabort_8_4_8(ep, asoc, type, arg, commands);
|
|
|
|
|
|
/* 3.1 A packet containing an INIT chunk MUST have a zero Verification
|
|
/* 3.1 A packet containing an INIT chunk MUST have a zero Verification
|
|
- * Tag.
|
|
|
|
|
|
+ * Tag.
|
|
*/
|
|
*/
|
|
if (chunk->sctp_hdr->vtag != 0)
|
|
if (chunk->sctp_hdr->vtag != 0)
|
|
return sctp_sf_tabort_8_4_8(ep, asoc, type, arg, commands);
|
|
return sctp_sf_tabort_8_4_8(ep, asoc, type, arg, commands);
|
|
@@ -326,7 +326,7 @@ sctp_disposition_t sctp_sf_do_5_1B_init(const struct sctp_endpoint *ep,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- /* Grab the INIT header. */
|
|
|
|
|
|
+ /* Grab the INIT header. */
|
|
chunk->subh.init_hdr = (sctp_inithdr_t *)chunk->skb->data;
|
|
chunk->subh.init_hdr = (sctp_inithdr_t *)chunk->skb->data;
|
|
|
|
|
|
/* Tag the variable length parameters. */
|
|
/* Tag the variable length parameters. */
|
|
@@ -594,7 +594,7 @@ sctp_disposition_t sctp_sf_do_5_1D_ce(const struct sctp_endpoint *ep,
|
|
/* "Decode" the chunk. We have no optional parameters so we
|
|
/* "Decode" the chunk. We have no optional parameters so we
|
|
* are in good shape.
|
|
* are in good shape.
|
|
*/
|
|
*/
|
|
- chunk->subh.cookie_hdr =
|
|
|
|
|
|
+ chunk->subh.cookie_hdr =
|
|
(struct sctp_signed_cookie *)chunk->skb->data;
|
|
(struct sctp_signed_cookie *)chunk->skb->data;
|
|
if (!pskb_pull(chunk->skb, ntohs(chunk->chunk_hdr->length) -
|
|
if (!pskb_pull(chunk->skb, ntohs(chunk->chunk_hdr->length) -
|
|
sizeof(sctp_chunkhdr_t)))
|
|
sizeof(sctp_chunkhdr_t)))
|
|
@@ -665,7 +665,7 @@ sctp_disposition_t sctp_sf_do_5_1D_ce(const struct sctp_endpoint *ep,
|
|
if (!ev)
|
|
if (!ev)
|
|
goto nomem_ev;
|
|
goto nomem_ev;
|
|
|
|
|
|
- /* Sockets API Draft Section 5.3.1.6
|
|
|
|
|
|
+ /* Sockets API Draft Section 5.3.1.6
|
|
* When a peer sends a Adaptation Layer Indication parameter , SCTP
|
|
* When a peer sends a Adaptation Layer Indication parameter , SCTP
|
|
* delivers this notification to inform the application that of the
|
|
* delivers this notification to inform the application that of the
|
|
* peers requested adaptation layer.
|
|
* peers requested adaptation layer.
|
|
@@ -891,7 +891,7 @@ sctp_disposition_t sctp_sf_sendbeat_8_3(const struct sctp_endpoint *ep,
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_HB_TIMER_UPDATE,
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_HB_TIMER_UPDATE,
|
|
SCTP_TRANSPORT(transport));
|
|
SCTP_TRANSPORT(transport));
|
|
|
|
|
|
- return SCTP_DISPOSITION_CONSUME;
|
|
|
|
|
|
+ return SCTP_DISPOSITION_CONSUME;
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -1280,7 +1280,7 @@ static sctp_disposition_t sctp_sf_do_unexpected_init(
|
|
return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
|
|
return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
|
|
|
|
|
|
/* 3.1 A packet containing an INIT chunk MUST have a zero Verification
|
|
/* 3.1 A packet containing an INIT chunk MUST have a zero Verification
|
|
- * Tag.
|
|
|
|
|
|
+ * Tag.
|
|
*/
|
|
*/
|
|
if (chunk->sctp_hdr->vtag != 0)
|
|
if (chunk->sctp_hdr->vtag != 0)
|
|
return sctp_sf_tabort_8_4_8(ep, asoc, type, arg, commands);
|
|
return sctp_sf_tabort_8_4_8(ep, asoc, type, arg, commands);
|
|
@@ -1548,7 +1548,7 @@ sctp_disposition_t sctp_sf_do_5_2_3_initack(const struct sctp_endpoint *ep,
|
|
/* Per the above section, we'll discard the chunk if we have an
|
|
/* Per the above section, we'll discard the chunk if we have an
|
|
* endpoint. If this is an OOTB INIT-ACK, treat it as such.
|
|
* endpoint. If this is an OOTB INIT-ACK, treat it as such.
|
|
*/
|
|
*/
|
|
- if (ep == sctp_sk((sctp_get_ctl_sock()))->ep)
|
|
|
|
|
|
+ if (ep == sctp_sk((sctp_get_ctl_sock()))->ep)
|
|
return sctp_sf_ootb(ep, asoc, type, arg, commands);
|
|
return sctp_sf_ootb(ep, asoc, type, arg, commands);
|
|
else
|
|
else
|
|
return sctp_sf_discard_chunk(ep, asoc, type, arg, commands);
|
|
return sctp_sf_discard_chunk(ep, asoc, type, arg, commands);
|
|
@@ -1760,9 +1760,9 @@ static sctp_disposition_t sctp_sf_do_dupcook_d(const struct sctp_endpoint *ep,
|
|
|
|
|
|
/* Clarification from Implementor's Guide:
|
|
/* Clarification from Implementor's Guide:
|
|
* D) When both local and remote tags match the endpoint should
|
|
* D) When both local and remote tags match the endpoint should
|
|
- * enter the ESTABLISHED state, if it is in the COOKIE-ECHOED state.
|
|
|
|
- * It should stop any cookie timer that may be running and send
|
|
|
|
- * a COOKIE ACK.
|
|
|
|
|
|
+ * enter the ESTABLISHED state, if it is in the COOKIE-ECHOED state.
|
|
|
|
+ * It should stop any cookie timer that may be running and send
|
|
|
|
+ * a COOKIE ACK.
|
|
*/
|
|
*/
|
|
|
|
|
|
/* Don't accidentally move back into established state. */
|
|
/* Don't accidentally move back into established state. */
|
|
@@ -1786,7 +1786,7 @@ static sctp_disposition_t sctp_sf_do_dupcook_d(const struct sctp_endpoint *ep,
|
|
SCTP_COMM_UP, 0,
|
|
SCTP_COMM_UP, 0,
|
|
asoc->c.sinit_num_ostreams,
|
|
asoc->c.sinit_num_ostreams,
|
|
asoc->c.sinit_max_instreams,
|
|
asoc->c.sinit_max_instreams,
|
|
- GFP_ATOMIC);
|
|
|
|
|
|
+ GFP_ATOMIC);
|
|
if (!ev)
|
|
if (!ev)
|
|
goto nomem;
|
|
goto nomem;
|
|
|
|
|
|
@@ -1870,7 +1870,7 @@ sctp_disposition_t sctp_sf_do_5_2_4_dupcook(const struct sctp_endpoint *ep,
|
|
/* "Decode" the chunk. We have no optional parameters so we
|
|
/* "Decode" the chunk. We have no optional parameters so we
|
|
* are in good shape.
|
|
* are in good shape.
|
|
*/
|
|
*/
|
|
- chunk->subh.cookie_hdr = (struct sctp_signed_cookie *)chunk->skb->data;
|
|
|
|
|
|
+ chunk->subh.cookie_hdr = (struct sctp_signed_cookie *)chunk->skb->data;
|
|
if (!pskb_pull(chunk->skb, ntohs(chunk->chunk_hdr->length) -
|
|
if (!pskb_pull(chunk->skb, ntohs(chunk->chunk_hdr->length) -
|
|
sizeof(sctp_chunkhdr_t)))
|
|
sizeof(sctp_chunkhdr_t)))
|
|
goto nomem;
|
|
goto nomem;
|
|
@@ -1936,7 +1936,7 @@ sctp_disposition_t sctp_sf_do_5_2_4_dupcook(const struct sctp_endpoint *ep,
|
|
default: /* Discard packet for all others. */
|
|
default: /* Discard packet for all others. */
|
|
retval = sctp_sf_pdiscard(ep, asoc, type, arg, commands);
|
|
retval = sctp_sf_pdiscard(ep, asoc, type, arg, commands);
|
|
break;
|
|
break;
|
|
- };
|
|
|
|
|
|
+ };
|
|
|
|
|
|
/* Delete the tempory new association. */
|
|
/* Delete the tempory new association. */
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_NEW_ASOC, SCTP_ASOC(new_asoc));
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_NEW_ASOC, SCTP_ASOC(new_asoc));
|
|
@@ -2083,7 +2083,7 @@ sctp_disposition_t sctp_sf_cookie_echoed_err(const struct sctp_endpoint *ep,
|
|
*/
|
|
*/
|
|
sctp_walk_errors(err, chunk->chunk_hdr) {
|
|
sctp_walk_errors(err, chunk->chunk_hdr) {
|
|
if (SCTP_ERROR_STALE_COOKIE == err->cause)
|
|
if (SCTP_ERROR_STALE_COOKIE == err->cause)
|
|
- return sctp_sf_do_5_2_6_stale(ep, asoc, type,
|
|
|
|
|
|
+ return sctp_sf_do_5_2_6_stale(ep, asoc, type,
|
|
arg, commands);
|
|
arg, commands);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -2185,10 +2185,10 @@ static sctp_disposition_t sctp_sf_do_5_2_6_stale(const struct sctp_endpoint *ep,
|
|
*/
|
|
*/
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_DEL_NON_PRIMARY, SCTP_NULL());
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_DEL_NON_PRIMARY, SCTP_NULL());
|
|
|
|
|
|
- /* If we've sent any data bundled with COOKIE-ECHO we will need to
|
|
|
|
- * resend
|
|
|
|
|
|
+ /* If we've sent any data bundled with COOKIE-ECHO we will need to
|
|
|
|
+ * resend
|
|
*/
|
|
*/
|
|
- sctp_add_cmd_sf(commands, SCTP_CMD_RETRAN,
|
|
|
|
|
|
+ sctp_add_cmd_sf(commands, SCTP_CMD_RETRAN,
|
|
SCTP_TRANSPORT(asoc->peer.primary_path));
|
|
SCTP_TRANSPORT(asoc->peer.primary_path));
|
|
|
|
|
|
/* Cast away the const modifier, as we want to just
|
|
/* Cast away the const modifier, as we want to just
|
|
@@ -2274,7 +2274,7 @@ sctp_disposition_t sctp_sf_do_9_1_abort(const struct sctp_endpoint *ep,
|
|
error = ((sctp_errhdr_t *)chunk->skb->data)->cause;
|
|
error = ((sctp_errhdr_t *)chunk->skb->data)->cause;
|
|
|
|
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR, SCTP_ERROR(ECONNRESET));
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR, SCTP_ERROR(ECONNRESET));
|
|
- /* ASSOC_FAILED will DELETE_TCB. */
|
|
|
|
|
|
+ /* ASSOC_FAILED will DELETE_TCB. */
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED, SCTP_PERR(error));
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED, SCTP_PERR(error));
|
|
SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
|
|
SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
|
|
SCTP_DEC_STATS(SCTP_MIB_CURRESTAB);
|
|
SCTP_DEC_STATS(SCTP_MIB_CURRESTAB);
|
|
@@ -2439,7 +2439,7 @@ sctp_disposition_t sctp_sf_do_9_2_shutdown(const struct sctp_endpoint *ep,
|
|
ev = sctp_ulpevent_make_shutdown_event(asoc, 0, GFP_ATOMIC);
|
|
ev = sctp_ulpevent_make_shutdown_event(asoc, 0, GFP_ATOMIC);
|
|
if (!ev) {
|
|
if (!ev) {
|
|
disposition = SCTP_DISPOSITION_NOMEM;
|
|
disposition = SCTP_DISPOSITION_NOMEM;
|
|
- goto out;
|
|
|
|
|
|
+ goto out;
|
|
}
|
|
}
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP, SCTP_ULPEVENT(ev));
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP, SCTP_ULPEVENT(ev));
|
|
|
|
|
|
@@ -2553,7 +2553,7 @@ sctp_disposition_t sctp_sf_do_ecn_cwr(const struct sctp_endpoint *ep,
|
|
if (!sctp_chunk_length_valid(chunk, sizeof(sctp_ecne_chunk_t)))
|
|
if (!sctp_chunk_length_valid(chunk, sizeof(sctp_ecne_chunk_t)))
|
|
return sctp_sf_violation_chunklen(ep, asoc, type, arg,
|
|
return sctp_sf_violation_chunklen(ep, asoc, type, arg,
|
|
commands);
|
|
commands);
|
|
-
|
|
|
|
|
|
+
|
|
cwr = (sctp_cwrhdr_t *) chunk->skb->data;
|
|
cwr = (sctp_cwrhdr_t *) chunk->skb->data;
|
|
skb_pull(chunk->skb, sizeof(sctp_cwrhdr_t));
|
|
skb_pull(chunk->skb, sizeof(sctp_cwrhdr_t));
|
|
|
|
|
|
@@ -2661,7 +2661,7 @@ sctp_disposition_t sctp_sf_eat_data_6_2(const struct sctp_endpoint *ep,
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_BAD_TAG,
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_BAD_TAG,
|
|
SCTP_NULL());
|
|
SCTP_NULL());
|
|
return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
|
|
return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
|
|
- }
|
|
|
|
|
|
+ }
|
|
|
|
|
|
if (!sctp_chunk_length_valid(chunk, sizeof(sctp_data_chunk_t)))
|
|
if (!sctp_chunk_length_valid(chunk, sizeof(sctp_data_chunk_t)))
|
|
return sctp_sf_violation_chunklen(ep, asoc, type, arg,
|
|
return sctp_sf_violation_chunklen(ep, asoc, type, arg,
|
|
@@ -2743,7 +2743,7 @@ discard_noforce:
|
|
return SCTP_DISPOSITION_DISCARD;
|
|
return SCTP_DISPOSITION_DISCARD;
|
|
consume:
|
|
consume:
|
|
return SCTP_DISPOSITION_CONSUME;
|
|
return SCTP_DISPOSITION_CONSUME;
|
|
-
|
|
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -2930,7 +2930,7 @@ sctp_disposition_t sctp_sf_tabort_8_4_8(const struct sctp_endpoint *ep,
|
|
/* Make an ABORT. The T bit will be set if the asoc
|
|
/* Make an ABORT. The T bit will be set if the asoc
|
|
* is NULL.
|
|
* is NULL.
|
|
*/
|
|
*/
|
|
- abort = sctp_make_abort(asoc, chunk, 0);
|
|
|
|
|
|
+ abort = sctp_make_abort(asoc, chunk, 0);
|
|
if (!abort) {
|
|
if (!abort) {
|
|
sctp_ootb_pkt_free(packet);
|
|
sctp_ootb_pkt_free(packet);
|
|
return SCTP_DISPOSITION_NOMEM;
|
|
return SCTP_DISPOSITION_NOMEM;
|
|
@@ -2994,7 +2994,7 @@ sctp_disposition_t sctp_sf_operr_notify(const struct sctp_endpoint *ep,
|
|
}
|
|
}
|
|
|
|
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_PROCESS_OPERR,
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_PROCESS_OPERR,
|
|
- SCTP_CHUNK(chunk));
|
|
|
|
|
|
+ SCTP_CHUNK(chunk));
|
|
}
|
|
}
|
|
return SCTP_DISPOSITION_CONSUME;
|
|
return SCTP_DISPOSITION_CONSUME;
|
|
|
|
|
|
@@ -3128,7 +3128,7 @@ sctp_disposition_t sctp_sf_ootb(const struct sctp_endpoint *ep,
|
|
*/
|
|
*/
|
|
if (SCTP_CID_ABORT == ch->type)
|
|
if (SCTP_CID_ABORT == ch->type)
|
|
return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
|
|
return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
|
|
-
|
|
|
|
|
|
+
|
|
ch = (sctp_chunkhdr_t *) ch_end;
|
|
ch = (sctp_chunkhdr_t *) ch_end;
|
|
} while (ch_end < skb->tail);
|
|
} while (ch_end < skb->tail);
|
|
|
|
|
|
@@ -3175,8 +3175,8 @@ static sctp_disposition_t sctp_sf_shut_8_4_5(const struct sctp_endpoint *ep,
|
|
|
|
|
|
if (packet) {
|
|
if (packet) {
|
|
/* Make an SHUTDOWN_COMPLETE.
|
|
/* Make an SHUTDOWN_COMPLETE.
|
|
- * The T bit will be set if the asoc is NULL.
|
|
|
|
- */
|
|
|
|
|
|
+ * The T bit will be set if the asoc is NULL.
|
|
|
|
+ */
|
|
shut = sctp_make_shutdown_complete(asoc, chunk);
|
|
shut = sctp_make_shutdown_complete(asoc, chunk);
|
|
if (!shut) {
|
|
if (!shut) {
|
|
sctp_ootb_pkt_free(packet);
|
|
sctp_ootb_pkt_free(packet);
|
|
@@ -3261,10 +3261,10 @@ sctp_disposition_t sctp_sf_do_asconf(const struct sctp_endpoint *ep,
|
|
|
|
|
|
/* ADDIP 4.2 C1) Compare the value of the serial number to the value
|
|
/* ADDIP 4.2 C1) Compare the value of the serial number to the value
|
|
* the endpoint stored in a new association variable
|
|
* the endpoint stored in a new association variable
|
|
- * 'Peer-Serial-Number'.
|
|
|
|
|
|
+ * 'Peer-Serial-Number'.
|
|
*/
|
|
*/
|
|
if (serial == asoc->peer.addip_serial + 1) {
|
|
if (serial == asoc->peer.addip_serial + 1) {
|
|
- /* ADDIP 4.2 C2) If the value found in the serial number is
|
|
|
|
|
|
+ /* ADDIP 4.2 C2) If the value found in the serial number is
|
|
* equal to the ('Peer-Serial-Number' + 1), the endpoint MUST
|
|
* equal to the ('Peer-Serial-Number' + 1), the endpoint MUST
|
|
* do V1-V5.
|
|
* do V1-V5.
|
|
*/
|
|
*/
|
|
@@ -3285,9 +3285,9 @@ sctp_disposition_t sctp_sf_do_asconf(const struct sctp_endpoint *ep,
|
|
else
|
|
else
|
|
return SCTP_DISPOSITION_DISCARD;
|
|
return SCTP_DISPOSITION_DISCARD;
|
|
} else {
|
|
} else {
|
|
- /* ADDIP 4.2 C4) Otherwise, the ASCONF Chunk is discarded since
|
|
|
|
|
|
+ /* ADDIP 4.2 C4) Otherwise, the ASCONF Chunk is discarded since
|
|
* it must be either a stale packet or from an attacker.
|
|
* it must be either a stale packet or from an attacker.
|
|
- */
|
|
|
|
|
|
+ */
|
|
return SCTP_DISPOSITION_DISCARD;
|
|
return SCTP_DISPOSITION_DISCARD;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -3296,7 +3296,7 @@ sctp_disposition_t sctp_sf_do_asconf(const struct sctp_endpoint *ep,
|
|
* being responded to.
|
|
* being responded to.
|
|
*/
|
|
*/
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(asconf_ack));
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(asconf_ack));
|
|
-
|
|
|
|
|
|
+
|
|
return SCTP_DISPOSITION_CONSUME;
|
|
return SCTP_DISPOSITION_CONSUME;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -3307,7 +3307,7 @@ sctp_disposition_t sctp_sf_do_asconf(const struct sctp_endpoint *ep,
|
|
*/
|
|
*/
|
|
sctp_disposition_t sctp_sf_do_asconf_ack(const struct sctp_endpoint *ep,
|
|
sctp_disposition_t sctp_sf_do_asconf_ack(const struct sctp_endpoint *ep,
|
|
const struct sctp_association *asoc,
|
|
const struct sctp_association *asoc,
|
|
- const sctp_subtype_t type, void *arg,
|
|
|
|
|
|
+ const sctp_subtype_t type, void *arg,
|
|
sctp_cmd_seq_t *commands)
|
|
sctp_cmd_seq_t *commands)
|
|
{
|
|
{
|
|
struct sctp_chunk *asconf_ack = arg;
|
|
struct sctp_chunk *asconf_ack = arg;
|
|
@@ -3359,7 +3359,7 @@ sctp_disposition_t sctp_sf_do_asconf_ack(const struct sctp_endpoint *ep,
|
|
SCTP_TO(SCTP_EVENT_TIMEOUT_T4_RTO));
|
|
SCTP_TO(SCTP_EVENT_TIMEOUT_T4_RTO));
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_DISCARD_PACKET,SCTP_NULL());
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_DISCARD_PACKET,SCTP_NULL());
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR,
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR,
|
|
- SCTP_ERROR(ECONNABORTED));
|
|
|
|
|
|
+ SCTP_ERROR(ECONNABORTED));
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
|
|
SCTP_PERR(SCTP_ERROR_ASCONF_ACK));
|
|
SCTP_PERR(SCTP_ERROR_ASCONF_ACK));
|
|
SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
|
|
SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
|
|
@@ -3387,7 +3387,7 @@ sctp_disposition_t sctp_sf_do_asconf_ack(const struct sctp_endpoint *ep,
|
|
*/
|
|
*/
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_DISCARD_PACKET,SCTP_NULL());
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_DISCARD_PACKET,SCTP_NULL());
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR,
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR,
|
|
- SCTP_ERROR(ECONNABORTED));
|
|
|
|
|
|
+ SCTP_ERROR(ECONNABORTED));
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
|
|
SCTP_PERR(SCTP_ERROR_ASCONF_ACK));
|
|
SCTP_PERR(SCTP_ERROR_ASCONF_ACK));
|
|
SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
|
|
SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
|
|
@@ -3451,17 +3451,17 @@ sctp_disposition_t sctp_sf_eat_fwd_tsn(const struct sctp_endpoint *ep,
|
|
|
|
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_FWDTSN, SCTP_U32(tsn));
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_FWDTSN, SCTP_U32(tsn));
|
|
if (len > sizeof(struct sctp_fwdtsn_hdr))
|
|
if (len > sizeof(struct sctp_fwdtsn_hdr))
|
|
- sctp_add_cmd_sf(commands, SCTP_CMD_PROCESS_FWDTSN,
|
|
|
|
|
|
+ sctp_add_cmd_sf(commands, SCTP_CMD_PROCESS_FWDTSN,
|
|
SCTP_CHUNK(chunk));
|
|
SCTP_CHUNK(chunk));
|
|
-
|
|
|
|
|
|
+
|
|
/* Count this as receiving DATA. */
|
|
/* Count this as receiving DATA. */
|
|
if (asoc->autoclose) {
|
|
if (asoc->autoclose) {
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_RESTART,
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_RESTART,
|
|
SCTP_TO(SCTP_EVENT_TIMEOUT_AUTOCLOSE));
|
|
SCTP_TO(SCTP_EVENT_TIMEOUT_AUTOCLOSE));
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
/* FIXME: For now send a SACK, but DATA processing may
|
|
/* FIXME: For now send a SACK, but DATA processing may
|
|
- * send another.
|
|
|
|
|
|
+ * send another.
|
|
*/
|
|
*/
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_GEN_SACK, SCTP_NOFORCE());
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_GEN_SACK, SCTP_NOFORCE());
|
|
|
|
|
|
@@ -3511,9 +3511,9 @@ sctp_disposition_t sctp_sf_eat_fwd_tsn_fast(
|
|
|
|
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_FWDTSN, SCTP_U32(tsn));
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_FWDTSN, SCTP_U32(tsn));
|
|
if (len > sizeof(struct sctp_fwdtsn_hdr))
|
|
if (len > sizeof(struct sctp_fwdtsn_hdr))
|
|
- sctp_add_cmd_sf(commands, SCTP_CMD_PROCESS_FWDTSN,
|
|
|
|
|
|
+ sctp_add_cmd_sf(commands, SCTP_CMD_PROCESS_FWDTSN,
|
|
SCTP_CHUNK(chunk));
|
|
SCTP_CHUNK(chunk));
|
|
-
|
|
|
|
|
|
+
|
|
/* Go a head and force a SACK, since we are shutting down. */
|
|
/* Go a head and force a SACK, since we are shutting down. */
|
|
gen_shutdown:
|
|
gen_shutdown:
|
|
/* Implementor's Guide.
|
|
/* Implementor's Guide.
|
|
@@ -3527,7 +3527,7 @@ gen_shutdown:
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_RESTART,
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_RESTART,
|
|
SCTP_TO(SCTP_EVENT_TIMEOUT_T2_SHUTDOWN));
|
|
SCTP_TO(SCTP_EVENT_TIMEOUT_T2_SHUTDOWN));
|
|
|
|
|
|
- return SCTP_DISPOSITION_CONSUME;
|
|
|
|
|
|
+ return SCTP_DISPOSITION_CONSUME;
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -3706,7 +3706,7 @@ sctp_disposition_t sctp_sf_violation(const struct sctp_endpoint *ep,
|
|
* if it's length is set to be smaller then the size of sctp_sack_chunk_t.
|
|
* if it's length is set to be smaller then the size of sctp_sack_chunk_t.
|
|
*
|
|
*
|
|
* We inform the other end by sending an ABORT with a Protocol Violation
|
|
* We inform the other end by sending an ABORT with a Protocol Violation
|
|
- * error code.
|
|
|
|
|
|
+ * error code.
|
|
*
|
|
*
|
|
* Section: Not specified
|
|
* Section: Not specified
|
|
* Verification Tag: Nothing to do
|
|
* Verification Tag: Nothing to do
|
|
@@ -3747,7 +3747,7 @@ static sctp_disposition_t sctp_sf_violation_chunklen(
|
|
SCTP_PERR(SCTP_ERROR_PROTO_VIOLATION));
|
|
SCTP_PERR(SCTP_ERROR_PROTO_VIOLATION));
|
|
} else {
|
|
} else {
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR,
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR,
|
|
- SCTP_ERROR(ECONNABORTED));
|
|
|
|
|
|
+ SCTP_ERROR(ECONNABORTED));
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
|
|
SCTP_PERR(SCTP_ERROR_PROTO_VIOLATION));
|
|
SCTP_PERR(SCTP_ERROR_PROTO_VIOLATION));
|
|
SCTP_DEC_STATS(SCTP_MIB_CURRESTAB);
|
|
SCTP_DEC_STATS(SCTP_MIB_CURRESTAB);
|
|
@@ -3756,7 +3756,7 @@ static sctp_disposition_t sctp_sf_violation_chunklen(
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_DISCARD_PACKET, SCTP_NULL());
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_DISCARD_PACKET, SCTP_NULL());
|
|
|
|
|
|
SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
|
|
SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
|
|
-
|
|
|
|
|
|
+
|
|
return SCTP_DISPOSITION_ABORT;
|
|
return SCTP_DISPOSITION_ABORT;
|
|
|
|
|
|
nomem:
|
|
nomem:
|
|
@@ -4437,7 +4437,7 @@ sctp_disposition_t sctp_sf_do_9_2_start_shutdown(
|
|
/* sctp-implguide 2.10 Issues with Heartbeating and failover
|
|
/* sctp-implguide 2.10 Issues with Heartbeating and failover
|
|
*
|
|
*
|
|
* HEARTBEAT ... is discontinued after sending either SHUTDOWN
|
|
* HEARTBEAT ... is discontinued after sending either SHUTDOWN
|
|
- * or SHUTDOWN-ACK.
|
|
|
|
|
|
+ * or SHUTDOWN-ACK.
|
|
*/
|
|
*/
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_HB_TIMERS_STOP, SCTP_NULL());
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_HB_TIMERS_STOP, SCTP_NULL());
|
|
|
|
|
|
@@ -4515,7 +4515,7 @@ sctp_disposition_t sctp_sf_do_9_2_shutdown_ack(
|
|
/* sctp-implguide 2.10 Issues with Heartbeating and failover
|
|
/* sctp-implguide 2.10 Issues with Heartbeating and failover
|
|
*
|
|
*
|
|
* HEARTBEAT ... is discontinued after sending either SHUTDOWN
|
|
* HEARTBEAT ... is discontinued after sending either SHUTDOWN
|
|
- * or SHUTDOWN-ACK.
|
|
|
|
|
|
+ * or SHUTDOWN-ACK.
|
|
*/
|
|
*/
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_HB_TIMERS_STOP, SCTP_NULL());
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_HB_TIMERS_STOP, SCTP_NULL());
|
|
|
|
|
|
@@ -4874,7 +4874,7 @@ sctp_disposition_t sctp_sf_t4_timer_expire(
|
|
/* ADDIP 4.1 B4) Re-transmit the ASCONF Chunk last sent and if possible
|
|
/* ADDIP 4.1 B4) Re-transmit the ASCONF Chunk last sent and if possible
|
|
* choose an alternate destination address (please refer to RFC2960
|
|
* choose an alternate destination address (please refer to RFC2960
|
|
* [5] section 6.4.1). An endpoint MUST NOT add new parameters to this
|
|
* [5] section 6.4.1). An endpoint MUST NOT add new parameters to this
|
|
- * chunk, it MUST be the same (including its serial number) as the last
|
|
|
|
|
|
+ * chunk, it MUST be the same (including its serial number) as the last
|
|
* ASCONF sent.
|
|
* ASCONF sent.
|
|
*/
|
|
*/
|
|
sctp_chunk_hold(asoc->addip_last_asconf);
|
|
sctp_chunk_hold(asoc->addip_last_asconf);
|
|
@@ -4953,7 +4953,7 @@ sctp_disposition_t sctp_sf_autoclose_timer_expire(
|
|
/* sctpimpguide-05 Section 2.12.2
|
|
/* sctpimpguide-05 Section 2.12.2
|
|
* The sender of the SHUTDOWN MAY also start an overall guard timer
|
|
* The sender of the SHUTDOWN MAY also start an overall guard timer
|
|
* 'T5-shutdown-guard' to bound the overall time for shutdown sequence.
|
|
* 'T5-shutdown-guard' to bound the overall time for shutdown sequence.
|
|
- */
|
|
|
|
|
|
+ */
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_START,
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_START,
|
|
SCTP_TO(SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD));
|
|
SCTP_TO(SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD));
|
|
disposition = SCTP_DISPOSITION_CONSUME;
|
|
disposition = SCTP_DISPOSITION_CONSUME;
|
|
@@ -5127,7 +5127,7 @@ static struct sctp_packet *sctp_ootb_pkt_new(const struct sctp_association *asoc
|
|
vtag = ntohl(init->init_hdr.init_tag);
|
|
vtag = ntohl(init->init_hdr.init_tag);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
- default:
|
|
|
|
|
|
+ default:
|
|
vtag = ntohl(chunk->sctp_hdr->vtag);
|
|
vtag = ntohl(chunk->sctp_hdr->vtag);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
@@ -5176,7 +5176,7 @@ static void sctp_send_stale_cookie_err(const struct sctp_endpoint *ep,
|
|
/* Override the OOTB vtag from the cookie. */
|
|
/* Override the OOTB vtag from the cookie. */
|
|
cookie = chunk->subh.cookie_hdr;
|
|
cookie = chunk->subh.cookie_hdr;
|
|
packet->vtag = cookie->c.peer_vtag;
|
|
packet->vtag = cookie->c.peer_vtag;
|
|
-
|
|
|
|
|
|
+
|
|
/* Set the skb to the belonging sock for accounting. */
|
|
/* Set the skb to the belonging sock for accounting. */
|
|
err_chunk->skb->sk = ep->base.sk;
|
|
err_chunk->skb->sk = ep->base.sk;
|
|
sctp_packet_append_chunk(packet, err_chunk);
|
|
sctp_packet_append_chunk(packet, err_chunk);
|
|
@@ -5310,7 +5310,7 @@ static int sctp_eat_data(const struct sctp_association *asoc,
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_PART_DELIVER, SCTP_NULL());
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_PART_DELIVER, SCTP_NULL());
|
|
}
|
|
}
|
|
|
|
|
|
- /* Spill over rwnd a little bit. Note: While allowed, this spill over
|
|
|
|
|
|
+ /* Spill over rwnd a little bit. Note: While allowed, this spill over
|
|
* seems a bit troublesome in that frag_point varies based on
|
|
* seems a bit troublesome in that frag_point varies based on
|
|
* PMTU. In cases, such as loopback, this might be a rather
|
|
* PMTU. In cases, such as loopback, this might be a rather
|
|
* large spill over.
|
|
* large spill over.
|