sctp: add stream reconf primitive
This patch is to add a primitive based on sctp primitive frame for sending stream reconf request. It works as the other primitives, and create a SCTP_CMD_REPLY command to send the request chunk out. sctp_primitive_RECONF would be the api to send a reconf request chunk. Signed-off-by: Xin Long <lucien.xin@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
7b9438de0c
Коммит
7a090b0452
|
@ -114,9 +114,10 @@ typedef enum {
|
|||
SCTP_PRIMITIVE_SEND,
|
||||
SCTP_PRIMITIVE_REQUESTHEARTBEAT,
|
||||
SCTP_PRIMITIVE_ASCONF,
|
||||
SCTP_PRIMITIVE_RECONF,
|
||||
} sctp_event_primitive_t;
|
||||
|
||||
#define SCTP_EVENT_PRIMITIVE_MAX SCTP_PRIMITIVE_ASCONF
|
||||
#define SCTP_EVENT_PRIMITIVE_MAX SCTP_PRIMITIVE_RECONF
|
||||
#define SCTP_NUM_PRIMITIVE_TYPES (SCTP_EVENT_PRIMITIVE_MAX + 1)
|
||||
|
||||
/* We define here a utility type for manipulating subtypes.
|
||||
|
|
|
@ -141,6 +141,8 @@ int sctp_primitive_ABORT(struct net *, struct sctp_association *, void *arg);
|
|||
int sctp_primitive_SEND(struct net *, struct sctp_association *, void *arg);
|
||||
int sctp_primitive_REQUESTHEARTBEAT(struct net *, struct sctp_association *, void *arg);
|
||||
int sctp_primitive_ASCONF(struct net *, struct sctp_association *, void *arg);
|
||||
int sctp_primitive_RECONF(struct net *net, struct sctp_association *asoc,
|
||||
void *arg);
|
||||
|
||||
/*
|
||||
* sctp/input.c
|
||||
|
|
|
@ -157,6 +157,7 @@ sctp_state_fn_t sctp_sf_error_shutdown;
|
|||
sctp_state_fn_t sctp_sf_ignore_primitive;
|
||||
sctp_state_fn_t sctp_sf_do_prm_requestheartbeat;
|
||||
sctp_state_fn_t sctp_sf_do_prm_asconf;
|
||||
sctp_state_fn_t sctp_sf_do_prm_reconf;
|
||||
|
||||
/* Prototypes for other event state functions. */
|
||||
sctp_state_fn_t sctp_sf_do_no_pending_tsn;
|
||||
|
|
|
@ -211,3 +211,6 @@ DECLARE_PRIMITIVE(REQUESTHEARTBEAT);
|
|||
*/
|
||||
|
||||
DECLARE_PRIMITIVE(ASCONF);
|
||||
|
||||
/* RE-CONFIG 5.1 */
|
||||
DECLARE_PRIMITIVE(RECONF);
|
||||
|
|
|
@ -5185,6 +5185,19 @@ sctp_disposition_t sctp_sf_do_prm_asconf(struct net *net,
|
|||
return SCTP_DISPOSITION_CONSUME;
|
||||
}
|
||||
|
||||
/* RE-CONFIG Section 5.1 RECONF Chunk Procedures */
|
||||
sctp_disposition_t sctp_sf_do_prm_reconf(struct net *net,
|
||||
const struct sctp_endpoint *ep,
|
||||
const struct sctp_association *asoc,
|
||||
const sctp_subtype_t type,
|
||||
void *arg, sctp_cmd_seq_t *commands)
|
||||
{
|
||||
struct sctp_chunk *chunk = arg;
|
||||
|
||||
sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(chunk));
|
||||
return SCTP_DISPOSITION_CONSUME;
|
||||
}
|
||||
|
||||
/*
|
||||
* Ignore the primitive event
|
||||
*
|
||||
|
|
|
@ -643,6 +643,25 @@ chunk_event_table_unknown[SCTP_STATE_NUM_STATES] = {
|
|||
TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
|
||||
} /* TYPE_SCTP_PRIMITIVE_ASCONF */
|
||||
|
||||
#define TYPE_SCTP_PRIMITIVE_RECONF { \
|
||||
/* SCTP_STATE_CLOSED */ \
|
||||
TYPE_SCTP_FUNC(sctp_sf_error_closed), \
|
||||
/* SCTP_STATE_COOKIE_WAIT */ \
|
||||
TYPE_SCTP_FUNC(sctp_sf_error_closed), \
|
||||
/* SCTP_STATE_COOKIE_ECHOED */ \
|
||||
TYPE_SCTP_FUNC(sctp_sf_error_closed), \
|
||||
/* SCTP_STATE_ESTABLISHED */ \
|
||||
TYPE_SCTP_FUNC(sctp_sf_do_prm_reconf), \
|
||||
/* SCTP_STATE_SHUTDOWN_PENDING */ \
|
||||
TYPE_SCTP_FUNC(sctp_sf_do_prm_reconf), \
|
||||
/* SCTP_STATE_SHUTDOWN_SENT */ \
|
||||
TYPE_SCTP_FUNC(sctp_sf_do_prm_reconf), \
|
||||
/* SCTP_STATE_SHUTDOWN_RECEIVED */ \
|
||||
TYPE_SCTP_FUNC(sctp_sf_do_prm_reconf), \
|
||||
/* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
|
||||
TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
|
||||
} /* TYPE_SCTP_PRIMITIVE_RECONF */
|
||||
|
||||
/* The primary index for this table is the primitive type.
|
||||
* The secondary index for this table is the state.
|
||||
*/
|
||||
|
@ -653,6 +672,7 @@ static const sctp_sm_table_entry_t primitive_event_table[SCTP_NUM_PRIMITIVE_TYPE
|
|||
TYPE_SCTP_PRIMITIVE_SEND,
|
||||
TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT,
|
||||
TYPE_SCTP_PRIMITIVE_ASCONF,
|
||||
TYPE_SCTP_PRIMITIVE_RECONF,
|
||||
};
|
||||
|
||||
#define TYPE_SCTP_OTHER_NO_PENDING_TSN { \
|
||||
|
|
Загрузка…
Ссылка в новой задаче