__be16 type;
 };
 
+/**
+ * struct flow_dissector_key_l2tpv3:
+ * @session_id: identifier for a l2tp session
+ */
+struct flow_dissector_key_l2tpv3 {
+       __be32 session_id;
+};
+
 enum flow_dissector_key_id {
        FLOW_DISSECTOR_KEY_CONTROL, /* struct flow_dissector_key_control */
        FLOW_DISSECTOR_KEY_BASIC, /* struct flow_dissector_key_basic */
        FLOW_DISSECTOR_KEY_HASH, /* struct flow_dissector_key_hash */
        FLOW_DISSECTOR_KEY_NUM_OF_VLANS, /* struct flow_dissector_key_num_of_vlans */
        FLOW_DISSECTOR_KEY_PPPOE, /* struct flow_dissector_key_pppoe */
+       FLOW_DISSECTOR_KEY_L2TPV3, /* struct flow_dissector_key_l2tpv3 */
 
        FLOW_DISSECTOR_KEY_MAX,
 };
 
        skb_flow_get_icmp_tci(skb, key_icmp, data, thoff, hlen);
 }
 
+static void __skb_flow_dissect_l2tpv3(const struct sk_buff *skb,
+                                     struct flow_dissector *flow_dissector,
+                                     void *target_container, const void *data,
+                                     int nhoff, int hlen)
+{
+       struct flow_dissector_key_l2tpv3 *key_l2tpv3;
+       struct {
+               __be32 session_id;
+       } *hdr, _hdr;
+
+       if (!dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_L2TPV3))
+               return;
+
+       hdr = __skb_header_pointer(skb, nhoff, sizeof(_hdr), data, hlen, &_hdr);
+       if (!hdr)
+               return;
+
+       key_l2tpv3 = skb_flow_dissector_target(flow_dissector,
+                                              FLOW_DISSECTOR_KEY_L2TPV3,
+                                              target_container);
+
+       key_l2tpv3->session_id = hdr->session_id;
+}
+
 void skb_flow_dissect_meta(const struct sk_buff *skb,
                           struct flow_dissector *flow_dissector,
                           void *target_container)
                __skb_flow_dissect_icmp(skb, flow_dissector, target_container,
                                        data, nhoff, hlen);
                break;
+       case IPPROTO_L2TP:
+               __skb_flow_dissect_l2tpv3(skb, flow_dissector, target_container,
+                                         data, nhoff, hlen);
+               break;
 
        default:
                break;