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 <jiri@resnulli.us> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
c3f8eaeb6e
commit
b924933cbb
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/skbuff.h>
|
#include <linux/skbuff.h>
|
||||||
|
#include <linux/in6.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct flow_dissector_key_basic:
|
* struct flow_dissector_key_basic:
|
||||||
@ -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 {
|
enum flow_dissector_key_id {
|
||||||
FLOW_DISSECTOR_KEY_BASIC, /* struct flow_dissector_key_basic */
|
FLOW_DISSECTOR_KEY_BASIC, /* struct flow_dissector_key_basic */
|
||||||
FLOW_DISSECTOR_KEY_IPV4_ADDRS, /* struct flow_dissector_key_addrs */
|
FLOW_DISSECTOR_KEY_IPV4_ADDRS, /* struct flow_dissector_key_addrs */
|
||||||
FLOW_DISSECTOR_KEY_IPV6_HASH_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_PORTS, /* struct flow_dissector_key_ports */
|
||||||
|
FLOW_DISSECTOR_KEY_IPV6_ADDRS, /* struct flow_dissector_key_ipv6_addrs */
|
||||||
|
|
||||||
FLOW_DISSECTOR_KEY_MAX,
|
FLOW_DISSECTOR_KEY_MAX,
|
||||||
};
|
};
|
||||||
|
@ -175,16 +175,29 @@ ipv6:
|
|||||||
ip_proto = iph->nexthdr;
|
ip_proto = iph->nexthdr;
|
||||||
nhoff += sizeof(struct ipv6hdr);
|
nhoff += sizeof(struct ipv6hdr);
|
||||||
|
|
||||||
if (!skb_flow_dissector_uses_key(flow_dissector,
|
if (skb_flow_dissector_uses_key(flow_dissector,
|
||||||
FLOW_DISSECTOR_KEY_IPV6_HASH_ADDRS))
|
FLOW_DISSECTOR_KEY_IPV6_HASH_ADDRS)) {
|
||||||
break;
|
key_addrs = skb_flow_dissector_target(flow_dissector,
|
||||||
key_addrs = skb_flow_dissector_target(flow_dissector,
|
FLOW_DISSECTOR_KEY_IPV6_HASH_ADDRS,
|
||||||
FLOW_DISSECTOR_KEY_IPV6_HASH_ADDRS,
|
target_container);
|
||||||
target_container);
|
|
||||||
|
|
||||||
key_addrs->src = (__force __be32)ipv6_addr_hash(&iph->saddr);
|
key_addrs->src = (__force __be32)ipv6_addr_hash(&iph->saddr);
|
||||||
key_addrs->dst = (__force __be32)ipv6_addr_hash(&iph->daddr);
|
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);
|
flow_label = ip6_flowlabel(iph);
|
||||||
if (flow_label) {
|
if (flow_label) {
|
||||||
/* Awesome, IPv6 packet has a flow label so we can
|
/* Awesome, IPv6 packet has a flow label so we can
|
||||||
|
Loading…
Reference in New Issue
Block a user