flow_keys: Record IP layer protocol in skb_flow_dissect()
skb_flow_dissect() dissects only transport header type in ip_proto. It dose not give any information about IPv4 or IPv6. This patch adds new member, n_proto, to struct flow_keys. Which records the IP layer type. i.e IPv4 or IPv6. This can be used in netdev->ndo_rx_flow_steer driver function to dissect flow. Adding new member to flow_keys increases the struct size by around 4 bytes. This causes BUILD_BUG_ON(sizeof(qcb->data) < sz); to fail in qdisc_cb_private_validate() So increase data size by 4 Signed-off-by: Govindarajulu Varadarajan <_govind@gmx.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
					parent
					
						
							
								eef929622b
							
						
					
				
			
			
				commit
				
					
						e0f31d8498
					
				
			
		
					 3 changed files with 16 additions and 1 deletions
				
			
		|  | @ -1,6 +1,19 @@ | |||
| #ifndef _NET_FLOW_KEYS_H | ||||
| #define _NET_FLOW_KEYS_H | ||||
| 
 | ||||
| /* struct flow_keys:
 | ||||
|  *	@src: source ip address in case of IPv4 | ||||
|  *	      For IPv6 it contains 32bit hash of src address | ||||
|  *	@dst: destination ip address in case of IPv4 | ||||
|  *	      For IPv6 it contains 32bit hash of dst address | ||||
|  *	@ports: port numbers of Transport header | ||||
|  *		port16[0]: src port number | ||||
|  *		port16[1]: dst port number | ||||
|  *	@thoff: Transport header offset | ||||
|  *	@n_proto: Network header protocol (eg. IPv4/IPv6) | ||||
|  *	@ip_proto: Transport header protocol (eg. TCP/UDP) | ||||
|  * All the members, except thoff, are in network byte order. | ||||
|  */ | ||||
| struct flow_keys { | ||||
| 	/* (src,dst) must be grouped, in the same way than in IP header */ | ||||
| 	__be32 src; | ||||
|  | @ -10,6 +23,7 @@ struct flow_keys { | |||
| 		__be16 port16[2]; | ||||
| 	}; | ||||
| 	u16 thoff; | ||||
| 	u16 n_proto; | ||||
| 	u8 ip_proto; | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -231,7 +231,7 @@ struct qdisc_skb_cb { | |||
| 	unsigned int		pkt_len; | ||||
| 	u16			slave_dev_queue_mapping; | ||||
| 	u16			_pad; | ||||
| 	unsigned char		data[20]; | ||||
| 	unsigned char		data[24]; | ||||
| }; | ||||
| 
 | ||||
| static inline void qdisc_cb_private_validate(const struct sk_buff *skb, int sz) | ||||
|  |  | |||
|  | @ -175,6 +175,7 @@ ipv6: | |||
| 		break; | ||||
| 	} | ||||
| 
 | ||||
| 	flow->n_proto = proto; | ||||
| 	flow->ip_proto = ip_proto; | ||||
| 	flow->ports = skb_flow_get_ports(skb, nhoff, ip_proto); | ||||
| 	flow->thoff = (u16) nhoff; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Govindarajulu Varadarajan
				Govindarajulu Varadarajan