Skip to content

Commit b924933

Browse files
jpirkodavem330
authored andcommitted
flow_dissector: introduce support for ipv6 addressses
So far, only hashes made out of ipv6 addresses could be dissected. This patch introduces support for dissection of full ipv6 addresses. Signed-off-by: Jiri Pirko <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent c3f8eae commit b924933

File tree

2 files changed

+34
-8
lines changed

2 files changed

+34
-8
lines changed

include/net/flow_dissector.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#include <linux/types.h>
55
#include <linux/skbuff.h>
6+
#include <linux/in6.h>
67

78
/**
89
* struct flow_dissector_key_basic:
@@ -42,11 +43,23 @@ struct flow_dissector_key_ports {
4243
};
4344
};
4445

46+
/**
47+
* struct flow_dissector_key_ipv6_addrs:
48+
* @src: source ip address
49+
* @dst: destination ip address
50+
*/
51+
struct flow_dissector_key_ipv6_addrs {
52+
/* (src,dst) must be grouped, in the same way than in IP header */
53+
struct in6_addr src;
54+
struct in6_addr dst;
55+
};
56+
4557
enum flow_dissector_key_id {
4658
FLOW_DISSECTOR_KEY_BASIC, /* struct flow_dissector_key_basic */
4759
FLOW_DISSECTOR_KEY_IPV4_ADDRS, /* struct flow_dissector_key_addrs */
4860
FLOW_DISSECTOR_KEY_IPV6_HASH_ADDRS, /* struct flow_dissector_key_addrs */
4961
FLOW_DISSECTOR_KEY_PORTS, /* struct flow_dissector_key_ports */
62+
FLOW_DISSECTOR_KEY_IPV6_ADDRS, /* struct flow_dissector_key_ipv6_addrs */
5063

5164
FLOW_DISSECTOR_KEY_MAX,
5265
};

net/core/flow_dissector.c

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -175,16 +175,29 @@ bool __skb_flow_dissect(const struct sk_buff *skb,
175175
ip_proto = iph->nexthdr;
176176
nhoff += sizeof(struct ipv6hdr);
177177

178-
if (!skb_flow_dissector_uses_key(flow_dissector,
179-
FLOW_DISSECTOR_KEY_IPV6_HASH_ADDRS))
180-
break;
181-
key_addrs = skb_flow_dissector_target(flow_dissector,
182-
FLOW_DISSECTOR_KEY_IPV6_HASH_ADDRS,
183-
target_container);
178+
if (skb_flow_dissector_uses_key(flow_dissector,
179+
FLOW_DISSECTOR_KEY_IPV6_HASH_ADDRS)) {
180+
key_addrs = skb_flow_dissector_target(flow_dissector,
181+
FLOW_DISSECTOR_KEY_IPV6_HASH_ADDRS,
182+
target_container);
184183

185-
key_addrs->src = (__force __be32)ipv6_addr_hash(&iph->saddr);
186-
key_addrs->dst = (__force __be32)ipv6_addr_hash(&iph->daddr);
184+
key_addrs->src = (__force __be32)ipv6_addr_hash(&iph->saddr);
185+
key_addrs->dst = (__force __be32)ipv6_addr_hash(&iph->daddr);
186+
goto flow_label;
187+
}
188+
if (skb_flow_dissector_uses_key(flow_dissector,
189+
FLOW_DISSECTOR_KEY_IPV6_ADDRS)) {
190+
struct flow_dissector_key_ipv6_addrs *key_ipv6_addrs;
187191

192+
key_ipv6_addrs = skb_flow_dissector_target(flow_dissector,
193+
FLOW_DISSECTOR_KEY_IPV6_ADDRS,
194+
target_container);
195+
196+
memcpy(key_ipv6_addrs, &iph->saddr, sizeof(*key_ipv6_addrs));
197+
goto flow_label;
198+
}
199+
break;
200+
flow_label:
188201
flow_label = ip6_flowlabel(iph);
189202
if (flow_label) {
190203
/* Awesome, IPv6 packet has a flow label so we can

0 commit comments

Comments
 (0)