Skip to content

Commit

Permalink
flow_dissector: introduce support for ipv6 addressses
Browse files Browse the repository at this point in the history
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 <jiri@resnulli.us>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Jiri Pirko authored and David S. Miller committed May 13, 2015
1 parent c3f8eae commit b924933
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 8 deletions.
13 changes: 13 additions & 0 deletions include/net/flow_dissector.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

#include <linux/types.h>
#include <linux/skbuff.h>
#include <linux/in6.h>

/**
* struct flow_dissector_key_basic:
Expand Down Expand Up @@ -42,11 +43,23 @@ struct flow_dissector_key_ports {
};
};

/**
* struct flow_dissector_key_ipv6_addrs:
* @src: source ip address
* @dst: destination ip address
*/
struct flow_dissector_key_ipv6_addrs {
/* (src,dst) must be grouped, in the same way than in IP header */
struct in6_addr src;
struct in6_addr dst;
};

enum flow_dissector_key_id {
FLOW_DISSECTOR_KEY_BASIC, /* struct flow_dissector_key_basic */
FLOW_DISSECTOR_KEY_IPV4_ADDRS, /* struct flow_dissector_key_addrs */
FLOW_DISSECTOR_KEY_IPV6_HASH_ADDRS, /* struct flow_dissector_key_addrs */
FLOW_DISSECTOR_KEY_PORTS, /* struct flow_dissector_key_ports */
FLOW_DISSECTOR_KEY_IPV6_ADDRS, /* struct flow_dissector_key_ipv6_addrs */

FLOW_DISSECTOR_KEY_MAX,
};
Expand Down
29 changes: 21 additions & 8 deletions net/core/flow_dissector.c
Original file line number Diff line number Diff line change
Expand Up @@ -175,16 +175,29 @@ bool __skb_flow_dissect(const struct sk_buff *skb,
ip_proto = iph->nexthdr;
nhoff += sizeof(struct ipv6hdr);

if (!skb_flow_dissector_uses_key(flow_dissector,
FLOW_DISSECTOR_KEY_IPV6_HASH_ADDRS))
break;
key_addrs = skb_flow_dissector_target(flow_dissector,
FLOW_DISSECTOR_KEY_IPV6_HASH_ADDRS,
target_container);
if (skb_flow_dissector_uses_key(flow_dissector,
FLOW_DISSECTOR_KEY_IPV6_HASH_ADDRS)) {
key_addrs = skb_flow_dissector_target(flow_dissector,
FLOW_DISSECTOR_KEY_IPV6_HASH_ADDRS,
target_container);

key_addrs->src = (__force __be32)ipv6_addr_hash(&iph->saddr);
key_addrs->dst = (__force __be32)ipv6_addr_hash(&iph->daddr);
key_addrs->src = (__force __be32)ipv6_addr_hash(&iph->saddr);
key_addrs->dst = (__force __be32)ipv6_addr_hash(&iph->daddr);
goto flow_label;
}
if (skb_flow_dissector_uses_key(flow_dissector,
FLOW_DISSECTOR_KEY_IPV6_ADDRS)) {
struct flow_dissector_key_ipv6_addrs *key_ipv6_addrs;

key_ipv6_addrs = skb_flow_dissector_target(flow_dissector,
FLOW_DISSECTOR_KEY_IPV6_ADDRS,
target_container);

memcpy(key_ipv6_addrs, &iph->saddr, sizeof(*key_ipv6_addrs));
goto flow_label;
}
break;
flow_label:
flow_label = ip6_flowlabel(iph);
if (flow_label) {
/* Awesome, IPv6 packet has a flow label so we can
Expand Down

0 comments on commit b924933

Please sign in to comment.