Commit e38d86b3 authored by Xin Long's avatar Xin Long Committed by Jakub Kicinski

sctp: add the error cause for new encapsulation port restart

This patch is to add the function to make the abort chunk with
the error cause for new encapsulation port restart, defined
on Section 4.4 in draft-tuexen-tsvwg-sctp-udp-encaps-cons-03.

v1->v2:
  - no change.
v2->v3:
  - no need to call htons() when setting nep.cur_port/new_port.
Signed-off-by: default avatarXin Long <lucien.xin@gmail.com>
Acked-by: default avatarMarcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 259db53b
...@@ -482,11 +482,13 @@ enum sctp_error { ...@@ -482,11 +482,13 @@ enum sctp_error {
* 11 Restart of an association with new addresses * 11 Restart of an association with new addresses
* 12 User Initiated Abort * 12 User Initiated Abort
* 13 Protocol Violation * 13 Protocol Violation
* 14 Restart of an Association with New Encapsulation Port
*/ */
SCTP_ERROR_RESTART = cpu_to_be16(0x0b), SCTP_ERROR_RESTART = cpu_to_be16(0x0b),
SCTP_ERROR_USER_ABORT = cpu_to_be16(0x0c), SCTP_ERROR_USER_ABORT = cpu_to_be16(0x0c),
SCTP_ERROR_PROTO_VIOLATION = cpu_to_be16(0x0d), SCTP_ERROR_PROTO_VIOLATION = cpu_to_be16(0x0d),
SCTP_ERROR_NEW_ENCAP_PORT = cpu_to_be16(0x0e),
/* ADDIP Section 3.3 New Error Causes /* ADDIP Section 3.3 New Error Causes
* *
...@@ -793,4 +795,22 @@ enum { ...@@ -793,4 +795,22 @@ enum {
SCTP_FLOWLABEL_VAL_MASK = 0xfffff SCTP_FLOWLABEL_VAL_MASK = 0xfffff
}; };
/* UDP Encapsulation
* draft-tuexen-tsvwg-sctp-udp-encaps-cons-03.html#section-4-4
*
* The error cause indicating an "Restart of an Association with
* New Encapsulation Port"
*
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Cause Code = 14 | Cause Length = 8 |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Current Encapsulation Port | New Encapsulation Port |
* +-------------------------------+-------------------------------+
*/
struct sctp_new_encap_port_hdr {
__be16 cur_port;
__be16 new_port;
};
#endif /* __LINUX_SCTP_H__ */ #endif /* __LINUX_SCTP_H__ */
...@@ -221,6 +221,9 @@ struct sctp_chunk *sctp_make_violation_paramlen( ...@@ -221,6 +221,9 @@ struct sctp_chunk *sctp_make_violation_paramlen(
struct sctp_chunk *sctp_make_violation_max_retrans( struct sctp_chunk *sctp_make_violation_max_retrans(
const struct sctp_association *asoc, const struct sctp_association *asoc,
const struct sctp_chunk *chunk); const struct sctp_chunk *chunk);
struct sctp_chunk *sctp_make_new_encap_port(
const struct sctp_association *asoc,
const struct sctp_chunk *chunk);
struct sctp_chunk *sctp_make_heartbeat(const struct sctp_association *asoc, struct sctp_chunk *sctp_make_heartbeat(const struct sctp_association *asoc,
const struct sctp_transport *transport); const struct sctp_transport *transport);
struct sctp_chunk *sctp_make_heartbeat_ack(const struct sctp_association *asoc, struct sctp_chunk *sctp_make_heartbeat_ack(const struct sctp_association *asoc,
......
...@@ -1142,6 +1142,26 @@ struct sctp_chunk *sctp_make_violation_max_retrans( ...@@ -1142,6 +1142,26 @@ struct sctp_chunk *sctp_make_violation_max_retrans(
return retval; return retval;
} }
struct sctp_chunk *sctp_make_new_encap_port(const struct sctp_association *asoc,
const struct sctp_chunk *chunk)
{
struct sctp_new_encap_port_hdr nep;
struct sctp_chunk *retval;
retval = sctp_make_abort(asoc, chunk,
sizeof(struct sctp_errhdr) + sizeof(nep));
if (!retval)
goto nodata;
sctp_init_cause(retval, SCTP_ERROR_NEW_ENCAP_PORT, sizeof(nep));
nep.cur_port = SCTP_INPUT_CB(chunk->skb)->encap_port;
nep.new_port = chunk->transport->encap_port;
sctp_addto_chunk(retval, sizeof(nep), &nep);
nodata:
return retval;
}
/* Make a HEARTBEAT chunk. */ /* Make a HEARTBEAT chunk. */
struct sctp_chunk *sctp_make_heartbeat(const struct sctp_association *asoc, struct sctp_chunk *sctp_make_heartbeat(const struct sctp_association *asoc,
const struct sctp_transport *transport) const struct sctp_transport *transport)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment