if (ntohl(chunk->sctp_hdr->vtag) == asoc->c.my_vtag)
                 return 1;
 
+       chunk->transport->encap_port = SCTP_INPUT_CB(chunk->skb)->encap_port;
        return 0;
 }
 
 
  * sctp_input_cb is currently used on rx and sock rx queue
  */
 struct sctp_input_cb {
-       union {
-               struct inet_skb_parm    h4;
-#if IS_ENABLED(CONFIG_IPV6)
-               struct inet6_skb_parm   h6;
-#endif
-       } header;
        struct sctp_chunk *chunk;
        struct sctp_af *af;
+       __be16 encap_port;
 };
 #define SCTP_INPUT_CB(__skb)   ((struct sctp_input_cb *)&((__skb)->cb[0]))
 
 
 
 static int sctp6_rcv(struct sk_buff *skb)
 {
+       memset(skb->cb, 0, sizeof(skb->cb));
        return sctp_rcv(skb) ? -1 : 0;
 }
 
 
 
 static int sctp_udp_rcv(struct sock *sk, struct sk_buff *skb)
 {
+       memset(skb->cb, 0, sizeof(skb->cb));
+       SCTP_INPUT_CB(skb)->encap_port = udp_hdr(skb)->source;
+
        skb_set_transport_header(skb, sizeof(struct udphdr));
        sctp_rcv(skb);
        return 0;
        .flags      = SCTP_PROTOSW_FLAG
 };
 
+static int sctp4_rcv(struct sk_buff *skb)
+{
+       memset(skb->cb, 0, sizeof(skb->cb));
+       return sctp_rcv(skb);
+}
+
 /* Register with IP layer.  */
 static const struct net_protocol sctp_protocol = {
-       .handler     = sctp_rcv,
+       .handler     = sctp4_rcv,
        .err_handler = sctp_v4_err,
        .no_policy   = 1,
        .netns_ok    = 1,
 
         * added as the primary transport.  The source address seems to
         * be a better choice than any of the embedded addresses.
         */
+       asoc->encap_port = SCTP_INPUT_CB(chunk->skb)->encap_port;
        if (!sctp_assoc_add_peer(asoc, peer_addr, gfp, SCTP_ACTIVE))
                goto nomem;
 
 
        if (!transport)
                goto nomem;
 
+       transport->encap_port = SCTP_INPUT_CB(chunk->skb)->encap_port;
+
        /* Cache a route for the transport with the chunk's destination as
         * the source address.
         */