diff options
author | Govindarajulu Varadarajan <_govind@gmx.com> | 2014-06-23 06:37:58 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-06-23 17:32:19 -0400 |
commit | e0f31d8498676fda36289603a054d0d490aa2679 (patch) | |
tree | 372fb95e9ec90a83794bf5bb3747f80664bb8e55 | |
parent | eef929622b0ce86fcdaf6bd9ab6d7502470728d5 (diff) |
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>
-rw-r--r-- | include/net/flow_keys.h | 14 | ||||
-rw-r--r-- | include/net/sch_generic.h | 2 | ||||
-rw-r--r-- | net/core/flow_dissector.c | 1 |
3 files changed, 16 insertions, 1 deletions
diff --git a/include/net/flow_keys.h b/include/net/flow_keys.h index 7e64bd8bbda9..fbefdca5e283 100644 --- a/include/net/flow_keys.h +++ b/include/net/flow_keys.h | |||
@@ -1,6 +1,19 @@ | |||
1 | #ifndef _NET_FLOW_KEYS_H | 1 | #ifndef _NET_FLOW_KEYS_H |
2 | #define _NET_FLOW_KEYS_H | 2 | #define _NET_FLOW_KEYS_H |
3 | 3 | ||
4 | /* struct flow_keys: | ||
5 | * @src: source ip address in case of IPv4 | ||
6 | * For IPv6 it contains 32bit hash of src address | ||
7 | * @dst: destination ip address in case of IPv4 | ||
8 | * For IPv6 it contains 32bit hash of dst address | ||
9 | * @ports: port numbers of Transport header | ||
10 | * port16[0]: src port number | ||
11 | * port16[1]: dst port number | ||
12 | * @thoff: Transport header offset | ||
13 | * @n_proto: Network header protocol (eg. IPv4/IPv6) | ||
14 | * @ip_proto: Transport header protocol (eg. TCP/UDP) | ||
15 | * All the members, except thoff, are in network byte order. | ||
16 | */ | ||
4 | struct flow_keys { | 17 | struct flow_keys { |
5 | /* (src,dst) must be grouped, in the same way than in IP header */ | 18 | /* (src,dst) must be grouped, in the same way than in IP header */ |
6 | __be32 src; | 19 | __be32 src; |
@@ -10,6 +23,7 @@ struct flow_keys { | |||
10 | __be16 port16[2]; | 23 | __be16 port16[2]; |
11 | }; | 24 | }; |
12 | u16 thoff; | 25 | u16 thoff; |
26 | u16 n_proto; | ||
13 | u8 ip_proto; | 27 | u8 ip_proto; |
14 | }; | 28 | }; |
15 | 29 | ||
diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h index 624f9857c83e..a3cfb8ebeb53 100644 --- a/include/net/sch_generic.h +++ b/include/net/sch_generic.h | |||
@@ -231,7 +231,7 @@ struct qdisc_skb_cb { | |||
231 | unsigned int pkt_len; | 231 | unsigned int pkt_len; |
232 | u16 slave_dev_queue_mapping; | 232 | u16 slave_dev_queue_mapping; |
233 | u16 _pad; | 233 | u16 _pad; |
234 | unsigned char data[20]; | 234 | unsigned char data[24]; |
235 | }; | 235 | }; |
236 | 236 | ||
237 | static inline void qdisc_cb_private_validate(const struct sk_buff *skb, int sz) | 237 | static inline void qdisc_cb_private_validate(const struct sk_buff *skb, int sz) |
diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c index 107ed12a5323..c2b53c1b21d2 100644 --- a/net/core/flow_dissector.c +++ b/net/core/flow_dissector.c | |||
@@ -175,6 +175,7 @@ ipv6: | |||
175 | break; | 175 | break; |
176 | } | 176 | } |
177 | 177 | ||
178 | flow->n_proto = proto; | ||
178 | flow->ip_proto = ip_proto; | 179 | flow->ip_proto = ip_proto; |
179 | flow->ports = skb_flow_get_ports(skb, nhoff, ip_proto); | 180 | flow->ports = skb_flow_get_ports(skb, nhoff, ip_proto); |
180 | flow->thoff = (u16) nhoff; | 181 | flow->thoff = (u16) nhoff; |