aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/netdevice.h
diff options
context:
space:
mode:
authorEric Dumazet <edumazet@google.com>2014-11-16 09:23:05 -0500
committerDavid S. Miller <davem@davemloft.net>2014-11-16 15:59:11 -0500
commit960fb622f85180f36d3aff82af53e2be3db2f888 (patch)
treec567b80d26270e3d4a3437c9710be6ca0f1eddc3 /include/linux/netdevice.h
parentca245024349c0d44434a6381583b99f0eb559c7c (diff)
net: provide a per host RSS key generic infrastructure
RSS (Receive Side Scaling) typically uses Toeplitz hash and a 40 or 52 bytes RSS key. Some drivers use a constant (and well known key), some drivers use a random key per port, making bonding setups hard to tune. Well known keys increase attack surface, considering that number of queues is usually a power of two. This patch provides infrastructure to help drivers doing the right thing. netdev_rss_key_fill() should be used by drivers to initialize their RSS key, even if they provide ethtool -X support to let user redefine the key later. A new /proc/sys/net/core/netdev_rss_key file can be used to get the host RSS key even for drivers not providing ethtool -x support, in case some applications want to precisely setup flows to match some RX queues. Tested: myhost:~# cat /proc/sys/net/core/netdev_rss_key 11:63:99:bb:79:fb:a5:a7:07:45:b2:20:bf:02:42:2d:08:1a:dd:19:2b:6b:23:ac:56:28:9d:70:c3:ac:e8:16:4b:b7:c1:10:53:a4:78:41:36:40:74:b6:15:ca:27:44:aa:b3:4d:72 myhost:~# ethtool -x eth0 RX flow hash indirection table for eth0 with 8 RX ring(s): 0: 0 1 2 3 4 5 6 7 RSS hash key: 11:63:99:bb:79:fb:a5:a7:07:45:b2:20:bf:02:42:2d:08:1a:dd:19:2b:6b:23:ac:56:28:9d:70:c3:ac:e8:16:4b:b7:c1:10:53:a4:78:41 Signed-off-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/linux/netdevice.h')
-rw-r--r--include/linux/netdevice.h6
1 files changed, 6 insertions, 0 deletions
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 4a6f770377d3..db63cf459ba1 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -3422,6 +3422,12 @@ void netdev_upper_dev_unlink(struct net_device *dev,
3422void netdev_adjacent_rename_links(struct net_device *dev, char *oldname); 3422void netdev_adjacent_rename_links(struct net_device *dev, char *oldname);
3423void *netdev_lower_dev_get_private(struct net_device *dev, 3423void *netdev_lower_dev_get_private(struct net_device *dev,
3424 struct net_device *lower_dev); 3424 struct net_device *lower_dev);
3425
3426/* RSS keys are 40 or 52 bytes long */
3427#define NETDEV_RSS_KEY_LEN 52
3428extern u8 netdev_rss_key[NETDEV_RSS_KEY_LEN];
3429void netdev_rss_key_fill(void *buffer, size_t len);
3430
3425int dev_get_nest_level(struct net_device *dev, 3431int dev_get_nest_level(struct net_device *dev,
3426 bool (*type_check)(struct net_device *dev)); 3432 bool (*type_check)(struct net_device *dev));
3427int skb_checksum_help(struct sk_buff *skb); 3433int skb_checksum_help(struct sk_buff *skb);