sctp: add reconf chunk event
authorXin Long <lucien.xin@gmail.com>
Fri, 17 Feb 2017 04:45:43 +0000 (12:45 +0800)
committerDavid S. Miller <davem@davemloft.net>
Sun, 19 Feb 2017 23:17:59 +0000 (18:17 -0500)
This patch is to add reconf chunk event based on the sctp event
frame in rx path, it will call sctp_sf_do_reconf to process the
reconf chunk.

Signed-off-by: Xin Long <lucien.xin@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/sctp/constants.h
net/sctp/sm_statetable.c

index 3567c971cf3bbb379a65ff26925e7c3ff3352d65..b07a745ab69ff5f0a365937c8c5b1342165b6a44 100644 (file)
@@ -60,11 +60,14 @@ enum { SCTP_DEFAULT_INSTREAMS = SCTP_MAX_STREAM };
 
 #define SCTP_NUM_PRSCTP_CHUNK_TYPES    1
 
+#define SCTP_NUM_RECONF_CHUNK_TYPES    1
+
 #define SCTP_NUM_AUTH_CHUNK_TYPES      1
 
 #define SCTP_NUM_CHUNK_TYPES           (SCTP_NUM_BASE_CHUNK_TYPES + \
                                         SCTP_NUM_ADDIP_CHUNK_TYPES +\
                                         SCTP_NUM_PRSCTP_CHUNK_TYPES +\
+                                        SCTP_NUM_RECONF_CHUNK_TYPES +\
                                         SCTP_NUM_AUTH_CHUNK_TYPES)
 
 /* These are the different flavours of event.  */
index b5438b4f6c1ee349161fdc12e4230db954b45b7d..419b18ebb056512f060d762e2b479ef417009b2d 100644 (file)
@@ -482,6 +482,32 @@ static const sctp_sm_table_entry_t prsctp_chunk_event_table[SCTP_NUM_PRSCTP_CHUN
        TYPE_SCTP_FWD_TSN,
 }; /*state_fn_t prsctp_chunk_event_table[][] */
 
+#define TYPE_SCTP_RECONF { \
+       /* SCTP_STATE_CLOSED */ \
+       TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
+       /* SCTP_STATE_COOKIE_WAIT */ \
+       TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
+       /* SCTP_STATE_COOKIE_ECHOED */ \
+       TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
+       /* SCTP_STATE_ESTABLISHED */ \
+       TYPE_SCTP_FUNC(sctp_sf_do_reconf), \
+       /* SCTP_STATE_SHUTDOWN_PENDING */ \
+       TYPE_SCTP_FUNC(sctp_sf_do_reconf), \
+       /* SCTP_STATE_SHUTDOWN_SENT */ \
+       TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
+       /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
+       TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
+       /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
+       TYPE_SCTP_FUNC(sctp_sf_discard_chunk), \
+} /* TYPE_SCTP_RECONF */
+
+/* The primary index for this table is the chunk type.
+ * The secondary index for this table is the state.
+ */
+static const sctp_sm_table_entry_t reconf_chunk_event_table[SCTP_NUM_RECONF_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = {
+       TYPE_SCTP_RECONF,
+}; /*state_fn_t reconf_chunk_event_table[][] */
+
 #define TYPE_SCTP_AUTH { \
        /* SCTP_STATE_CLOSED */ \
        TYPE_SCTP_FUNC(sctp_sf_ootb), \
@@ -964,6 +990,10 @@ static const sctp_sm_table_entry_t *sctp_chunk_event_lookup(struct net *net,
                        return &addip_chunk_event_table[1][state];
        }
 
+       if (net->sctp.reconf_enable)
+               if (cid == SCTP_CID_RECONF)
+                       return &reconf_chunk_event_table[0][state];
+
        if (net->sctp.auth_enable) {
                if (cid == SCTP_CID_AUTH)
                        return &auth_chunk_event_table[0][state];