diff options
| -rw-r--r-- | net/core/flow_dissector.c | 31 | 
1 files changed, 19 insertions, 12 deletions
diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c index 5db41bf2ed93..c33af3ef0b79 100644 --- a/net/core/flow_dissector.c +++ b/net/core/flow_dissector.c @@ -853,23 +853,30 @@ __skb_flow_dissect_ports(const struct sk_buff *skb,  			 void *target_container, const void *data,  			 int nhoff, u8 ip_proto, int hlen)  { -	enum flow_dissector_key_id dissector_ports = FLOW_DISSECTOR_KEY_MAX; -	struct flow_dissector_key_ports *key_ports; +	struct flow_dissector_key_ports_range *key_ports_range = NULL; +	struct flow_dissector_key_ports *key_ports = NULL; +	__be32 ports;  	if (dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_PORTS)) -		dissector_ports = FLOW_DISSECTOR_KEY_PORTS; -	else if (dissector_uses_key(flow_dissector, -				    FLOW_DISSECTOR_KEY_PORTS_RANGE)) -		dissector_ports = FLOW_DISSECTOR_KEY_PORTS_RANGE; +		key_ports = skb_flow_dissector_target(flow_dissector, +						      FLOW_DISSECTOR_KEY_PORTS, +						      target_container); -	if (dissector_ports == FLOW_DISSECTOR_KEY_MAX) +	if (dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_PORTS_RANGE)) +		key_ports_range = skb_flow_dissector_target(flow_dissector, +							    FLOW_DISSECTOR_KEY_PORTS_RANGE, +							    target_container); + +	if (!key_ports && !key_ports_range)  		return; -	key_ports = skb_flow_dissector_target(flow_dissector, -					      dissector_ports, -					      target_container); -	key_ports->ports = __skb_flow_get_ports(skb, nhoff, ip_proto, -						data, hlen); +	ports = __skb_flow_get_ports(skb, nhoff, ip_proto, data, hlen); + +	if (key_ports) +		key_ports->ports = ports; + +	if (key_ports_range) +		key_ports_range->tp.ports = ports;  }  static void  | 
