Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -28,7 +28,8 @@ struct flow_dissector_key_basic {
};

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 {
	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_VLANID, /* struct flow_dissector_key_flow_tags */
	FLOW_DISSECTOR_KEY_FLOW_LABEL, /* struct flow_dissector_key_flow_tags */

	FLOW_DISSECTOR_KEY_MAX,
};
+10 −19
Original line number Diff line number Diff line
@@ -210,30 +210,17 @@ bool __skb_flow_dissect(const struct sk_buff *skb,

			memcpy(key_ipv6_addrs, &iph->saddr, sizeof(*key_ipv6_addrs));
			key_control->addr_type = FLOW_DISSECTOR_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
			 * 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,
							FLOW_DISSECTOR_KEY_PORTS)) {
				key_ports = skb_flow_dissector_target(flow_dissector,
								      FLOW_DISSECTOR_KEY_PORTS,
				FLOW_DISSECTOR_KEY_FLOW_LABEL)) {
				key_tags = skb_flow_dissector_target(flow_dissector,
								     FLOW_DISSECTOR_KEY_FLOW_LABEL,
								     target_container);
				key_ports->ports = flow_label;
				key_tags->flow_label = ntohl(flow_label);
			}

			return true;
		}

		break;
@@ -659,6 +646,10 @@ static const struct flow_dissector_key flow_keys_dissector_keys[] = {
		.key_id = FLOW_DISSECTOR_KEY_VLANID,
		.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[] = {