diff options
| -rw-r--r-- | include/net/flow_dissector.h | 9 | ||||
| -rw-r--r-- | net/core/flow_dissector.c | 28 | 
2 files changed, 37 insertions, 0 deletions
| diff --git a/include/net/flow_dissector.h b/include/net/flow_dissector.h index 6c74812d64b2..5ccf52ef8809 100644 --- a/include/net/flow_dissector.h +++ b/include/net/flow_dissector.h @@ -289,6 +289,14 @@ struct flow_dissector_key_pppoe {  	__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 */ @@ -320,6 +328,7 @@ enum flow_dissector_key_id {  	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,  }; diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c index 990429c69ccd..2a1f513a2dc8 100644 --- a/net/core/flow_dissector.c +++ b/net/core/flow_dissector.c @@ -204,6 +204,30 @@ static void __skb_flow_dissect_icmp(const struct sk_buff *skb,  	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) @@ -1501,6 +1525,10 @@ ip_proto_again:  		__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; |