This patch is to define the reconf chunk as the section 3.1 descibes.

Signed-off-by: Xin Long <lucien....@gmail.com>
---
 include/linux/sctp.h     |  6 ++++++
 net/sctp/sm_make_chunk.c | 33 +++++++++++++++++++++++++++++++++
 2 files changed, 39 insertions(+)

diff --git a/include/linux/sctp.h b/include/linux/sctp.h
index fcb4c36..cdc3b05 100644
--- a/include/linux/sctp.h
+++ b/include/linux/sctp.h
@@ -108,6 +108,7 @@ typedef enum {
        /* Use hex, as defined in ADDIP sec. 3.1 */
        SCTP_CID_ASCONF                 = 0xC1,
        SCTP_CID_ASCONF_ACK             = 0x80,
+       SCTP_CID_RECONF                 = 0x82,
 } sctp_cid_t; /* enum */
 
 
@@ -710,4 +711,9 @@ struct sctp_infox {
        struct sctp_association *asoc;
 };
 
+struct sctp_reconf_chunk {
+       sctp_chunkhdr_t chunk_hdr;
+       __u8 params[0];
+} __packed;
+
 #endif /* __LINUX_SCTP_H__ */
diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c
index 78cbd1b..258d55a 100644
--- a/net/sctp/sm_make_chunk.c
+++ b/net/sctp/sm_make_chunk.c
@@ -3534,3 +3534,36 @@ struct sctp_chunk *sctp_make_fwdtsn(const struct 
sctp_association *asoc,
 
        return retval;
 }
+
+/* RE-CONFIG 3.1 (RE-CONFIG chunk)
+ *   0                   1                   2                   3
+ *   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
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  | Type = 130    |  Chunk Flags  |      Chunk Length             |
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  \                                                               \
+ *  /                  Re-configuration Parameter                   /
+ *  \                                                               \
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  \                                                               \
+ *  /             Re-configuration Parameter (optional)             /
+ *  \                                                               \
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+static struct sctp_chunk *sctp_make_reconf(
+                               const struct sctp_association *asoc,
+                               int length)
+{
+       struct sctp_reconf_chunk *reconf;
+       struct sctp_chunk *retval;
+
+       retval = sctp_make_control(asoc, SCTP_CID_RECONF, 0, length,
+                                  GFP_ATOMIC);
+       if (!retval)
+               return NULL;
+
+       reconf = (struct sctp_reconf_chunk *)retval->chunk_hdr;
+       retval->param_hdr.v = reconf->params;
+
+       return retval;
+}
-- 
2.1.0

Reply via email to