#define SCTP_PROTOSW_FLAG INET_PROTOSW_PERMANENT
 #endif
 
+/* Round an int up to the next multiple of 4.  */
+#define WORD_ROUND(s) (((s)+3)&~3)
+/* Truncate to the previous multiple of 4.  */
+#define WORD_TRUNC(s) ((s)&~3)
+
 /*
  * Function declarations.
  */
      (void *)pos <= (void *)chunk->subh.fwdtsn_hdr->skip + end - sizeof(struct sctp_fwdtsn_skip);\
      pos++)
 
-/* Round an int up to the next multiple of 4.  */
-#define WORD_ROUND(s) (((s)+3)&~3)
-
 /* External references. */
 
 extern struct proto sctp_prot;
 
        list_for_each_entry(t, &asoc->peer.transport_addr_list,
                                transports) {
                if (t->pmtu_pending && t->dst) {
-                       sctp_transport_update_pmtu(sk, t, dst_mtu(t->dst));
+                       sctp_transport_update_pmtu(sk, t,
+                                                  WORD_TRUNC(dst_mtu(t->dst)));
                        t->pmtu_pending = 0;
                }
                if (!pmtu || (t->pathmtu < pmtu))
 
 
                /* PMTU discovery (RFC1191) */
                if (ICMP_FRAG_NEEDED == code) {
-                       sctp_icmp_frag_needed(sk, asoc, transport, info);
+                       sctp_icmp_frag_needed(sk, asoc, transport,
+                                             WORD_TRUNC(info));
                        goto out_unlock;
                } else {
                        if (ICMP_PROT_UNREACH == code) {
 
        }
 
        if (transport->dst) {
-               transport->pathmtu = dst_mtu(transport->dst);
+               transport->pathmtu = WORD_TRUNC(dst_mtu(transport->dst));
        } else
                transport->pathmtu = SCTP_DEFAULT_MAXSEGMENT;
 }
                return;
        }
        if (transport->dst) {
-               transport->pathmtu = dst_mtu(transport->dst);
+               transport->pathmtu = WORD_TRUNC(dst_mtu(transport->dst));
 
                /* Initialize sk->sk_rcv_saddr, if the transport is the
                 * association's active path for getsockname().