SCTP_CID_I_FWD_TSN              = 0xC2,
        SCTP_CID_ASCONF_ACK             = 0x80,
        SCTP_CID_RECONF                 = 0x82,
+       SCTP_CID_PAD                    = 0x84,
 }; /* enum */
 
 
 };
 
 
+/* PAD chunk could be bundled with heartbeat chunk to probe pmtu */
+struct sctp_pad_chunk {
+       struct sctp_chunkhdr uh;
+};
+
+
 /* For the abort and shutdown ACK we must carry the init tag in the
  * common header. Just the common header is all that is needed with a
  * chunk descriptor.
 
                                           const struct sctp_chunk *chunk,
                                           const void *payload,
                                           const size_t paylen);
+struct sctp_chunk *sctp_make_pad(const struct sctp_association *asoc, int len);
 struct sctp_chunk *sctp_make_op_error(const struct sctp_association *asoc,
                                      const struct sctp_chunk *chunk,
                                      __be16 cause_code, const void *payload,
 
        return retval;
 }
 
+/* RFC4820 3. Padding Chunk (PAD)
+ *  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 = 0x84   |   Flags=0     |             Length            |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |                                                               |
+ * \                         Padding Data                          /
+ * /                                                               \
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+struct sctp_chunk *sctp_make_pad(const struct sctp_association *asoc, int len)
+{
+       struct sctp_chunk *retval;
+
+       retval = sctp_make_control(asoc, SCTP_CID_PAD, 0, len, GFP_ATOMIC);
+       if (!retval)
+               return NULL;
+
+       skb_put_zero(retval->skb, len);
+       retval->chunk_hdr->length = htons(ntohs(retval->chunk_hdr->length) + len);
+       retval->chunk_end = skb_tail_pointer(retval->skb);
+
+       return retval;
+}
+
 /* Create an Operation Error chunk with the specified space reserved.
  * This routine can be used for containing multiple causes in the chunk.
  */
 
        TYPE_SCTP_AUTH,
 }; /*state_fn_t auth_chunk_event_table[][] */
 
+static const struct sctp_sm_table_entry
+pad_chunk_event_table[SCTP_STATE_NUM_STATES] = {
+       /* 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_discard_chunk),
+       /* SCTP_STATE_SHUTDOWN_PENDING */
+       TYPE_SCTP_FUNC(sctp_sf_discard_chunk),
+       /* 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),
+};     /* chunk pad */
+
 static const struct sctp_sm_table_entry
 chunk_event_table_unknown[SCTP_STATE_NUM_STATES] = {
        /* SCTP_STATE_CLOSED */
 
        case SCTP_CID_AUTH:
                return &auth_chunk_event_table[0][state];
+
+       case SCTP_CID_PAD:
+               return &pad_chunk_event_table[state];
        }
 
        return &chunk_event_table_unknown[state];