struct flow_dissector_key_hash hash;
        struct flow_dissector_key_num_of_vlans num_of_vlans;
        struct flow_dissector_key_pppoe pppoe;
+       struct flow_dissector_key_l2tpv3 l2tpv3;
 } __aligned(BITS_PER_LONG / 8); /* Ensure that we can do comparisons as longs. */
 
 struct fl_flow_mask_range {
        [TCA_FLOWER_KEY_NUM_OF_VLANS]   = { .type = NLA_U8 },
        [TCA_FLOWER_KEY_PPPOE_SID]      = { .type = NLA_U16 },
        [TCA_FLOWER_KEY_PPP_PROTO]      = { .type = NLA_U16 },
+       [TCA_FLOWER_KEY_L2TPV3_SID]     = { .type = NLA_U32 },
 
 };
 
                fl_set_key_val(tb, key->arp.tha, TCA_FLOWER_KEY_ARP_THA,
                               mask->arp.tha, TCA_FLOWER_KEY_ARP_THA_MASK,
                               sizeof(key->arp.tha));
+       } else if (key->basic.ip_proto == IPPROTO_L2TP) {
+               fl_set_key_val(tb, &key->l2tpv3.session_id,
+                              TCA_FLOWER_KEY_L2TPV3_SID,
+                              &mask->l2tpv3.session_id, TCA_FLOWER_UNSPEC,
+                              sizeof(key->l2tpv3.session_id));
        }
 
        if (key->basic.ip_proto == IPPROTO_TCP ||
                             FLOW_DISSECTOR_KEY_NUM_OF_VLANS, num_of_vlans);
        FL_KEY_SET_IF_MASKED(mask, keys, cnt,
                             FLOW_DISSECTOR_KEY_PPPOE, pppoe);
+       FL_KEY_SET_IF_MASKED(mask, keys, cnt,
+                            FLOW_DISSECTOR_KEY_L2TPV3, l2tpv3);
 
        skb_flow_dissector_init(dissector, keys, cnt);
 }
                                  mask->arp.tha, TCA_FLOWER_KEY_ARP_THA_MASK,
                                  sizeof(key->arp.tha))))
                goto nla_put_failure;
+       else if (key->basic.ip_proto == IPPROTO_L2TP &&
+                fl_dump_key_val(skb, &key->l2tpv3.session_id,
+                                TCA_FLOWER_KEY_L2TPV3_SID,
+                                &mask->l2tpv3.session_id,
+                                TCA_FLOWER_UNSPEC,
+                                sizeof(key->l2tpv3.session_id)))
+               goto nla_put_failure;
 
        if ((key->basic.ip_proto == IPPROTO_TCP ||
             key->basic.ip_proto == IPPROTO_UDP ||