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:
parent
7b9438de0c
commit
7a090b0452
|
@ -114,9 +114,10 @@ typedef enum {
|
||||||
SCTP_PRIMITIVE_SEND,
|
SCTP_PRIMITIVE_SEND,
|
||||||
SCTP_PRIMITIVE_REQUESTHEARTBEAT,
|
SCTP_PRIMITIVE_REQUESTHEARTBEAT,
|
||||||
SCTP_PRIMITIVE_ASCONF,
|
SCTP_PRIMITIVE_ASCONF,
|
||||||
|
SCTP_PRIMITIVE_RECONF,
|
||||||
} sctp_event_primitive_t;
|
} 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)
|
#define SCTP_NUM_PRIMITIVE_TYPES (SCTP_EVENT_PRIMITIVE_MAX + 1)
|
||||||
|
|
||||||
/* We define here a utility type for manipulating subtypes.
|
/* 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_SEND(struct net *, struct sctp_association *, void *arg);
|
||||||
int sctp_primitive_REQUESTHEARTBEAT(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_ASCONF(struct net *, struct sctp_association *, void *arg);
|
||||||
|
int sctp_primitive_RECONF(struct net *net, struct sctp_association *asoc,
|
||||||
|
void *arg);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* sctp/input.c
|
* 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_ignore_primitive;
|
||||||
sctp_state_fn_t sctp_sf_do_prm_requestheartbeat;
|
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_asconf;
|
||||||
|
sctp_state_fn_t sctp_sf_do_prm_reconf;
|
||||||
|
|
||||||
/* Prototypes for other event state functions. */
|
/* Prototypes for other event state functions. */
|
||||||
sctp_state_fn_t sctp_sf_do_no_pending_tsn;
|
sctp_state_fn_t sctp_sf_do_no_pending_tsn;
|
||||||
|
|
|
@ -211,3 +211,6 @@ DECLARE_PRIMITIVE(REQUESTHEARTBEAT);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
DECLARE_PRIMITIVE(ASCONF);
|
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;
|
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
|
* 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_FUNC(sctp_sf_error_shutdown), \
|
||||||
} /* TYPE_SCTP_PRIMITIVE_ASCONF */
|
} /* 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 primary index for this table is the primitive type.
|
||||||
* The secondary index for this table is the state.
|
* 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_SEND,
|
||||||
TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT,
|
TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT,
|
||||||
TYPE_SCTP_PRIMITIVE_ASCONF,
|
TYPE_SCTP_PRIMITIVE_ASCONF,
|
||||||
|
TYPE_SCTP_PRIMITIVE_RECONF,
|
||||||
};
|
};
|
||||||
|
|
||||||
#define TYPE_SCTP_OTHER_NO_PENDING_TSN { \
|
#define TYPE_SCTP_OTHER_NO_PENDING_TSN { \
|
||||||
|
|
Loading…
Reference in New Issue