struct flow_dissector_key_ipv4_addrs enc_ipv4;
                struct flow_dissector_key_ipv6_addrs enc_ipv6;
        };
+       struct flow_dissector_key_ports enc_tp;
 } __aligned(BITS_PER_LONG / 8); /* Ensure that we can do comparisons as longs. */
 
 struct fl_flow_mask_range {
                }
 
                skb_key.enc_key_id.keyid = tunnel_id_to_key32(key->tun_id);
+               skb_key.enc_tp.src = key->tp_src;
+               skb_key.enc_tp.dst = key->tp_dst;
        }
 
        skb_key.indev_ifindex = skb->skb_iif;
        [TCA_FLOWER_KEY_SCTP_DST_MASK]  = { .type = NLA_U16 },
        [TCA_FLOWER_KEY_SCTP_SRC]       = { .type = NLA_U16 },
        [TCA_FLOWER_KEY_SCTP_DST]       = { .type = NLA_U16 },
+       [TCA_FLOWER_KEY_ENC_UDP_SRC_PORT]       = { .type = NLA_U16 },
+       [TCA_FLOWER_KEY_ENC_UDP_SRC_PORT_MASK]  = { .type = NLA_U16 },
+       [TCA_FLOWER_KEY_ENC_UDP_DST_PORT]       = { .type = NLA_U16 },
+       [TCA_FLOWER_KEY_ENC_UDP_DST_PORT_MASK]  = { .type = NLA_U16 },
 };
 
 static void fl_set_key_val(struct nlattr **tb,
                       &mask->enc_key_id.keyid, TCA_FLOWER_UNSPEC,
                       sizeof(key->enc_key_id.keyid));
 
+       fl_set_key_val(tb, &key->enc_tp.src, TCA_FLOWER_KEY_ENC_UDP_SRC_PORT,
+                      &mask->enc_tp.src, TCA_FLOWER_KEY_ENC_UDP_SRC_PORT_MASK,
+                      sizeof(key->enc_tp.src));
+
+       fl_set_key_val(tb, &key->enc_tp.dst, TCA_FLOWER_KEY_ENC_UDP_DST_PORT,
+                      &mask->enc_tp.dst, TCA_FLOWER_KEY_ENC_UDP_DST_PORT_MASK,
+                      sizeof(key->enc_tp.dst));
+
        return 0;
 }
 
            FL_KEY_IS_MASKED(&mask->key, enc_ipv6))
                FL_KEY_SET(keys, cnt, FLOW_DISSECTOR_KEY_ENC_CONTROL,
                           enc_control);
+       FL_KEY_SET_IF_MASKED(&mask->key, keys, cnt,
+                            FLOW_DISSECTOR_KEY_ENC_PORTS, enc_tp);
 
        skb_flow_dissector_init(&head->dissector, keys, cnt);
 }
 
        if (fl_dump_key_val(skb, &key->enc_key_id, TCA_FLOWER_KEY_ENC_KEY_ID,
                            &mask->enc_key_id, TCA_FLOWER_UNSPEC,
-                           sizeof(key->enc_key_id)))
+                           sizeof(key->enc_key_id)) ||
+           fl_dump_key_val(skb, &key->enc_tp.src,
+                           TCA_FLOWER_KEY_ENC_UDP_SRC_PORT,
+                           &mask->enc_tp.src,
+                           TCA_FLOWER_KEY_ENC_UDP_SRC_PORT_MASK,
+                           sizeof(key->enc_tp.src)) ||
+           fl_dump_key_val(skb, &key->enc_tp.dst,
+                           TCA_FLOWER_KEY_ENC_UDP_DST_PORT,
+                           &mask->enc_tp.dst,
+                           TCA_FLOWER_KEY_ENC_UDP_DST_PORT_MASK,
+                           sizeof(key->enc_tp.dst)))
                goto nla_put_failure;
 
        nla_put_u32(skb, TCA_FLOWER_FLAGS, f->flags);