Commit 87ee9e52 authored by Tom Herbert's avatar Tom Herbert Committed by David S. Miller

net: Add IPv6 flow label to flow_keys

In flow_dissector set the flow label in flow_keys for IPv6. This also
removes the shortcircuiting of flow dissection when a non-zero label
is present, the flow label can be considered to provide additional
entropy for a hash.
Signed-off-by: default avatarTom Herbert <tom@herbertland.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d34af823
...@@ -28,7 +28,8 @@ struct flow_dissector_key_basic { ...@@ -28,7 +28,8 @@ struct flow_dissector_key_basic {
}; };
struct flow_dissector_key_tags { struct flow_dissector_key_tags {
u32 vlan_id:12; u32 vlan_id:12,
flow_label:20;
}; };
/** /**
...@@ -111,6 +112,7 @@ enum flow_dissector_key_id { ...@@ -111,6 +112,7 @@ enum flow_dissector_key_id {
FLOW_DISSECTOR_KEY_ETH_ADDRS, /* struct flow_dissector_key_eth_addrs */ FLOW_DISSECTOR_KEY_ETH_ADDRS, /* struct flow_dissector_key_eth_addrs */
FLOW_DISSECTOR_KEY_TIPC_ADDRS, /* struct flow_dissector_key_tipc_addrs */ FLOW_DISSECTOR_KEY_TIPC_ADDRS, /* struct flow_dissector_key_tipc_addrs */
FLOW_DISSECTOR_KEY_VLANID, /* struct flow_dissector_key_flow_tags */ FLOW_DISSECTOR_KEY_VLANID, /* struct flow_dissector_key_flow_tags */
FLOW_DISSECTOR_KEY_FLOW_LABEL, /* struct flow_dissector_key_flow_tags */
FLOW_DISSECTOR_KEY_MAX, FLOW_DISSECTOR_KEY_MAX,
}; };
......
...@@ -210,30 +210,17 @@ bool __skb_flow_dissect(const struct sk_buff *skb, ...@@ -210,30 +210,17 @@ bool __skb_flow_dissect(const struct sk_buff *skb,
memcpy(key_ipv6_addrs, &iph->saddr, sizeof(*key_ipv6_addrs)); memcpy(key_ipv6_addrs, &iph->saddr, sizeof(*key_ipv6_addrs));
key_control->addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS; key_control->addr_type = FLOW_DISSECTOR_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
* use that to represent the ports without any
* further dissection.
*/
key_basic->n_proto = proto;
key_basic->ip_proto = ip_proto;
key_control->thoff = (u16)nhoff;
if (skb_flow_dissector_uses_key(flow_dissector, if (skb_flow_dissector_uses_key(flow_dissector,
FLOW_DISSECTOR_KEY_PORTS)) { FLOW_DISSECTOR_KEY_FLOW_LABEL)) {
key_ports = skb_flow_dissector_target(flow_dissector, key_tags = skb_flow_dissector_target(flow_dissector,
FLOW_DISSECTOR_KEY_PORTS, FLOW_DISSECTOR_KEY_FLOW_LABEL,
target_container); target_container);
key_ports->ports = flow_label; key_tags->flow_label = ntohl(flow_label);
} }
return true;
} }
break; break;
...@@ -659,6 +646,10 @@ static const struct flow_dissector_key flow_keys_dissector_keys[] = { ...@@ -659,6 +646,10 @@ static const struct flow_dissector_key flow_keys_dissector_keys[] = {
.key_id = FLOW_DISSECTOR_KEY_VLANID, .key_id = FLOW_DISSECTOR_KEY_VLANID,
.offset = offsetof(struct flow_keys, tags), .offset = offsetof(struct flow_keys, tags),
}, },
{
.key_id = FLOW_DISSECTOR_KEY_FLOW_LABEL,
.offset = offsetof(struct flow_keys, tags),
},
}; };
static const struct flow_dissector_key flow_keys_buf_dissector_keys[] = { static const struct flow_dissector_key flow_keys_buf_dissector_keys[] = {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment