/* 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 */
 
 
        SCTP_PARAM_SUCCESS_REPORT       = cpu_to_be16(0xc005),
        SCTP_PARAM_ADAPTATION_LAYER_IND = cpu_to_be16(0xc006),
 
+       /* RE-CONFIG. Section 4 */
+       SCTP_PARAM_RESET_OUT_REQUEST            = cpu_to_be16(0x000d),
+       SCTP_PARAM_RESET_IN_REQUEST             = cpu_to_be16(0x000e),
+       SCTP_PARAM_RESET_TSN_REQUEST            = cpu_to_be16(0x000f),
+       SCTP_PARAM_RESET_RESPONSE               = cpu_to_be16(0x0010),
+       SCTP_PARAM_RESET_ADD_OUT_STREAMS        = cpu_to_be16(0x0011),
+       SCTP_PARAM_RESET_ADD_IN_STREAMS         = cpu_to_be16(0x0012),
 } sctp_param_t; /* enum */
 
 
        struct sctp_association *asoc;
 };
 
+struct sctp_reconf_chunk {
+       sctp_chunkhdr_t chunk_hdr;
+       __u8 params[0];
+} __packed;
+
+struct sctp_strreset_outreq {
+       sctp_paramhdr_t param_hdr;
+       __u32 request_seq;
+       __u32 response_seq;
+       __u32 send_reset_at_tsn;
+       __u16 list_of_streams[0];
+} __packed;
+
+struct sctp_strreset_inreq {
+       sctp_paramhdr_t param_hdr;
+       __u32 request_seq;
+       __u16 list_of_streams[0];
+} __packed;
+
 #endif /* __LINUX_SCTP_H__ */
 
        retval->next_tsn = retval->c.initial_tsn;
        retval->ctsn_ack_point = retval->next_tsn - 1;
        retval->addip_serial = retval->c.initial_tsn;
+       retval->strreset_outseq = retval->c.initial_tsn;
        retval->adv_peer_ack_point = retval->ctsn_ack_point;
        retval->peer.prsctp_capable = retval->c.prsctp_capable;
        retval->peer.adaptation_ind = retval->c.adaptation_ind;
        asoc->peer.i.initial_tsn =
                ntohl(peer_init->init_hdr.initial_tsn);
 
+       asoc->strreset_inseq = asoc->peer.i.initial_tsn;
+
        /* Apply the upper bounds for output streams based on peer's
         * number of inbound streams.
         */
 
        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;
+}
+
+/* RE-CONFIG 4.1 (STREAM OUT RESET)
+ *   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
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |     Parameter Type = 13       | Parameter Length = 16 + 2 * N |
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |           Re-configuration Request Sequence Number            |
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |           Re-configuration Response Sequence Number           |
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |                Sender's Last Assigned TSN                     |
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |  Stream Number 1 (optional)   |    Stream Number 2 (optional) |
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  /                            ......                             /
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |  Stream Number N-1 (optional) |    Stream Number N (optional) |
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *
+ * RE-CONFIG 4.2 (STREAM IN RESET)
+ *   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
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |     Parameter Type = 14       |  Parameter Length = 8 + 2 * N |
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |          Re-configuration Request Sequence Number             |
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |  Stream Number 1 (optional)   |    Stream Number 2 (optional) |
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  /                            ......                             /
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |  Stream Number N-1 (optional) |    Stream Number N (optional) |
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+struct sctp_chunk *sctp_make_strreset_req(
+                               const struct sctp_association *asoc,
+                               __u16 stream_num, __u16 *stream_list,
+                               bool out, bool in)
+{
+       struct sctp_strreset_outreq outreq;
+       __u16 stream_len = stream_num * 2;
+       struct sctp_strreset_inreq inreq;
+       struct sctp_chunk *retval;
+       __u16 outlen, inlen, i;
+
+       outlen = (sizeof(outreq) + stream_len) * out;
+       inlen = (sizeof(inreq) + stream_len) * in;
+
+       retval = sctp_make_reconf(asoc, outlen + inlen);
+       if (!retval)
+               return NULL;
+
+       for (i = 0; i < stream_num; i++)
+               stream_list[i] = htons(stream_list[i]);
+
+       if (outlen) {
+               outreq.param_hdr.type = SCTP_PARAM_RESET_OUT_REQUEST;
+               outreq.param_hdr.length = htons(outlen);
+               outreq.request_seq = htonl(asoc->strreset_outseq);
+               outreq.response_seq = htonl(asoc->strreset_inseq - 1);
+               outreq.send_reset_at_tsn = htonl(asoc->next_tsn - 1);
+
+               sctp_addto_chunk(retval, sizeof(outreq), &outreq);
+
+               if (stream_len)
+                       sctp_addto_chunk(retval, stream_len, stream_list);
+       }
+
+       if (inlen) {
+               inreq.param_hdr.type = SCTP_PARAM_RESET_IN_REQUEST;
+               inreq.param_hdr.length = htons(inlen);
+               inreq.request_seq = htonl(asoc->strreset_outseq + out);
+
+               sctp_addto_chunk(retval, sizeof(inreq), &inreq);
+
+               if (stream_len)
+                       sctp_addto_chunk(retval, stream_len, stream_list);
+       }
+
+       for (i = 0; i < stream_num; i++)
+               stream_list[i] = ntohs(stream_list[i]);
+
+       return retval;
+}