net: Add full IPv6 addresses to flow_keys
This patch adds full IPv6 addresses into flow_keys and uses them as input to the flow hash function. The implementation supports either IPv4 or IPv6 addresses in a union, and selector is used to determine how may words to input to jhash2. We also add flow_get_u32_dst and flow_get_u32_src functions which are used to get a u32 representation of the source and destination addresses. For IPv6, ipv6_addr_hash is called. These functions retain getting the legacy values of src and dst in flow_keys. With this patch, Ethertype and IP protocol are now included in the flow hash input. Signed-off-by: Tom Herbert <tom@herbertland.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committato da
David S. Miller

parent
42aecaa9bb
commit
c3f8324188
@@ -28,8 +28,9 @@ struct fl_flow_key {
|
||||
struct flow_dissector_key_control control;
|
||||
struct flow_dissector_key_basic basic;
|
||||
struct flow_dissector_key_eth_addrs eth;
|
||||
struct flow_dissector_key_addrs ipaddrs;
|
||||
union {
|
||||
struct flow_dissector_key_addrs ipv4;
|
||||
struct flow_dissector_key_ipv4_addrs ipv4;
|
||||
struct flow_dissector_key_ipv6_addrs ipv6;
|
||||
};
|
||||
struct flow_dissector_key_ports tp;
|
||||
@@ -260,14 +261,14 @@ static int fl_set_key(struct net *net, struct nlattr **tb,
|
||||
&mask->basic.ip_proto, TCA_FLOWER_UNSPEC,
|
||||
sizeof(key->basic.ip_proto));
|
||||
}
|
||||
if (key->basic.n_proto == htons(ETH_P_IP)) {
|
||||
if (key->control.addr_type == FLOW_DISSECTOR_KEY_IPV4_ADDRS) {
|
||||
fl_set_key_val(tb, &key->ipv4.src, TCA_FLOWER_KEY_IPV4_SRC,
|
||||
&mask->ipv4.src, TCA_FLOWER_KEY_IPV4_SRC_MASK,
|
||||
sizeof(key->ipv4.src));
|
||||
fl_set_key_val(tb, &key->ipv4.dst, TCA_FLOWER_KEY_IPV4_DST,
|
||||
&mask->ipv4.dst, TCA_FLOWER_KEY_IPV4_DST_MASK,
|
||||
sizeof(key->ipv4.dst));
|
||||
} else if (key->basic.n_proto == htons(ETH_P_IPV6)) {
|
||||
} else if (key->control.addr_type == FLOW_DISSECTOR_KEY_IPV6_ADDRS) {
|
||||
fl_set_key_val(tb, &key->ipv6.src, TCA_FLOWER_KEY_IPV6_SRC,
|
||||
&mask->ipv6.src, TCA_FLOWER_KEY_IPV6_SRC_MASK,
|
||||
sizeof(key->ipv6.src));
|
||||
@@ -610,7 +611,7 @@ static int fl_dump(struct net *net, struct tcf_proto *tp, unsigned long fh,
|
||||
sizeof(key->basic.ip_proto)))
|
||||
goto nla_put_failure;
|
||||
|
||||
if (key->basic.n_proto == htons(ETH_P_IP) &&
|
||||
if (key->control.addr_type == FLOW_DISSECTOR_KEY_IPV4_ADDRS &&
|
||||
(fl_dump_key_val(skb, &key->ipv4.src, TCA_FLOWER_KEY_IPV4_SRC,
|
||||
&mask->ipv4.src, TCA_FLOWER_KEY_IPV4_SRC_MASK,
|
||||
sizeof(key->ipv4.src)) ||
|
||||
@@ -618,7 +619,7 @@ static int fl_dump(struct net *net, struct tcf_proto *tp, unsigned long fh,
|
||||
&mask->ipv4.dst, TCA_FLOWER_KEY_IPV4_DST_MASK,
|
||||
sizeof(key->ipv4.dst))))
|
||||
goto nla_put_failure;
|
||||
else if (key->basic.n_proto == htons(ETH_P_IPV6) &&
|
||||
else if (key->control.addr_type == FLOW_DISSECTOR_KEY_IPV6_ADDRS &&
|
||||
(fl_dump_key_val(skb, &key->ipv6.src, TCA_FLOWER_KEY_IPV6_SRC,
|
||||
&mask->ipv6.src, TCA_FLOWER_KEY_IPV6_SRC_MASK,
|
||||
sizeof(key->ipv6.src)) ||
|
||||
|
Fai riferimento in un nuovo problema
Block a user