Skip to content
This repository was archived by the owner on Dec 20, 2023. It is now read-only.

Commit e255787

Browse files
Venkata Duvvurudavem330
authored andcommitted
be2net: Support for configurable RSS hash key
This be2net patch implements the get/set_rxfh() ethtool hooks. RSS_CONFIG device command is invoked to set hashkey and indirection table. It also uses an initial random value for RSS hash key instead of a hard-coded value as hard-coded values for a hash-key are usually considered a security risk. Signed-off-by: Venkat Duvvuru <VenkatKumar.Duvvuru@Emulex.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 3de0b59 commit e255787

File tree

5 files changed

+113
-31
lines changed

5 files changed

+113
-31
lines changed

drivers/net/ethernet/emulex/benet/be.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,9 @@ static inline char *nic_name(struct pci_dev *pdev)
120120
#define MAX_VFS 30 /* Max VFs supported by BE3 FW */
121121
#define FW_VER_LEN 32
122122

123+
#define RSS_INDIR_TABLE_LEN 128
124+
#define RSS_HASH_KEY_LEN 40
125+
123126
struct be_dma_mem {
124127
void *va;
125128
dma_addr_t dma;
@@ -409,6 +412,13 @@ struct be_resources {
409412
u32 if_cap_flags;
410413
};
411414

415+
struct rss_info {
416+
u64 rss_flags;
417+
u8 rsstable[RSS_INDIR_TABLE_LEN];
418+
u8 rss_queue[RSS_INDIR_TABLE_LEN];
419+
u8 rss_hkey[RSS_HASH_KEY_LEN];
420+
};
421+
412422
struct be_adapter {
413423
struct pci_dev *pdev;
414424
struct net_device *netdev;
@@ -507,7 +517,7 @@ struct be_adapter {
507517
u32 msg_enable;
508518
int be_get_temp_freq;
509519
u8 pf_number;
510-
u64 rss_flags;
520+
struct rss_info rss_info;
511521
};
512522

513523
#define be_physfn(adapter) (!adapter->virtfn)

drivers/net/ethernet/emulex/benet/be_cmds.c

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2020,13 +2020,10 @@ int be_cmd_reset_function(struct be_adapter *adapter)
20202020
}
20212021

20222022
int be_cmd_rss_config(struct be_adapter *adapter, u8 *rsstable,
2023-
u32 rss_hash_opts, u16 table_size)
2023+
u32 rss_hash_opts, u16 table_size, u8 *rss_hkey)
20242024
{
20252025
struct be_mcc_wrb *wrb;
20262026
struct be_cmd_req_rss_config *req;
2027-
u32 myhash[10] = {0x15d43fa5, 0x2534685a, 0x5f87693a, 0x5668494e,
2028-
0x33cf6a53, 0x383334c6, 0x76ac4257, 0x59b242b2,
2029-
0x3ea83c02, 0x4a110304};
20302027
int status;
20312028

20322029
if (!(be_if_cap_flags(adapter) & BE_IF_FLAGS_RSS))
@@ -2049,7 +2046,7 @@ int be_cmd_rss_config(struct be_adapter *adapter, u8 *rsstable,
20492046
req->hdr.version = 1;
20502047

20512048
memcpy(req->cpu_table, rsstable, table_size);
2052-
memcpy(req->hash, myhash, sizeof(myhash));
2049+
memcpy(req->hash, rss_hkey, RSS_HASH_KEY_LEN);
20532050
be_dws_cpu_to_le(req->hash, sizeof(req->hash));
20542051

20552052
status = be_mbox_notify_wait(adapter);

drivers/net/ethernet/emulex/benet/be_cmds.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2068,7 +2068,7 @@ int be_cmd_query_fw_cfg(struct be_adapter *adapter, u32 *port_num,
20682068
u32 *function_mode, u32 *function_caps, u16 *asic_rev);
20692069
int be_cmd_reset_function(struct be_adapter *adapter);
20702070
int be_cmd_rss_config(struct be_adapter *adapter, u8 *rsstable,
2071-
u32 rss_hash_opts, u16 table_size);
2071+
u32 rss_hash_opts, u16 table_size, u8 *rss_hkey);
20722072
int be_process_mcc(struct be_adapter *adapter);
20732073
int be_cmd_set_beacon_state(struct be_adapter *adapter, u8 port_num, u8 beacon,
20742074
u8 status, u8 state);

drivers/net/ethernet/emulex/benet/be_ethtool.c

Lines changed: 80 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -933,27 +933,27 @@ static u64 be_get_rss_hash_opts(struct be_adapter *adapter, u64 flow_type)
933933

934934
switch (flow_type) {
935935
case TCP_V4_FLOW:
936-
if (adapter->rss_flags & RSS_ENABLE_IPV4)
936+
if (adapter->rss_info.rss_flags & RSS_ENABLE_IPV4)
937937
data |= RXH_IP_DST | RXH_IP_SRC;
938-
if (adapter->rss_flags & RSS_ENABLE_TCP_IPV4)
938+
if (adapter->rss_info.rss_flags & RSS_ENABLE_TCP_IPV4)
939939
data |= RXH_L4_B_0_1 | RXH_L4_B_2_3;
940940
break;
941941
case UDP_V4_FLOW:
942-
if (adapter->rss_flags & RSS_ENABLE_IPV4)
942+
if (adapter->rss_info.rss_flags & RSS_ENABLE_IPV4)
943943
data |= RXH_IP_DST | RXH_IP_SRC;
944-
if (adapter->rss_flags & RSS_ENABLE_UDP_IPV4)
944+
if (adapter->rss_info.rss_flags & RSS_ENABLE_UDP_IPV4)
945945
data |= RXH_L4_B_0_1 | RXH_L4_B_2_3;
946946
break;
947947
case TCP_V6_FLOW:
948-
if (adapter->rss_flags & RSS_ENABLE_IPV6)
948+
if (adapter->rss_info.rss_flags & RSS_ENABLE_IPV6)
949949
data |= RXH_IP_DST | RXH_IP_SRC;
950-
if (adapter->rss_flags & RSS_ENABLE_TCP_IPV6)
950+
if (adapter->rss_info.rss_flags & RSS_ENABLE_TCP_IPV6)
951951
data |= RXH_L4_B_0_1 | RXH_L4_B_2_3;
952952
break;
953953
case UDP_V6_FLOW:
954-
if (adapter->rss_flags & RSS_ENABLE_IPV6)
954+
if (adapter->rss_info.rss_flags & RSS_ENABLE_IPV6)
955955
data |= RXH_IP_DST | RXH_IP_SRC;
956-
if (adapter->rss_flags & RSS_ENABLE_UDP_IPV6)
956+
if (adapter->rss_info.rss_flags & RSS_ENABLE_UDP_IPV6)
957957
data |= RXH_L4_B_0_1 | RXH_L4_B_2_3;
958958
break;
959959
}
@@ -992,7 +992,7 @@ static int be_set_rss_hash_opts(struct be_adapter *adapter,
992992
struct be_rx_obj *rxo;
993993
int status = 0, i, j;
994994
u8 rsstable[128];
995-
u32 rss_flags = adapter->rss_flags;
995+
u32 rss_flags = adapter->rss_info.rss_flags;
996996

997997
if (cmd->data != L3_RSS_FLAGS &&
998998
cmd->data != (L3_RSS_FLAGS | L4_RSS_FLAGS))
@@ -1039,7 +1039,7 @@ static int be_set_rss_hash_opts(struct be_adapter *adapter,
10391039
return -EINVAL;
10401040
}
10411041

1042-
if (rss_flags == adapter->rss_flags)
1042+
if (rss_flags == adapter->rss_info.rss_flags)
10431043
return status;
10441044

10451045
if (be_multi_rxq(adapter)) {
@@ -1051,9 +1051,11 @@ static int be_set_rss_hash_opts(struct be_adapter *adapter,
10511051
}
10521052
}
10531053
}
1054-
status = be_cmd_rss_config(adapter, rsstable, rss_flags, 128);
1054+
1055+
status = be_cmd_rss_config(adapter, adapter->rss_info.rsstable,
1056+
rss_flags, 128, adapter->rss_info.rss_hkey);
10551057
if (!status)
1056-
adapter->rss_flags = rss_flags;
1058+
adapter->rss_info.rss_flags = rss_flags;
10571059

10581060
return status;
10591061
}
@@ -1103,6 +1105,68 @@ static int be_set_channels(struct net_device *netdev,
11031105
return be_update_queues(adapter);
11041106
}
11051107

1108+
static u32 be_get_rxfh_indir_size(struct net_device *netdev)
1109+
{
1110+
return RSS_INDIR_TABLE_LEN;
1111+
}
1112+
1113+
static u32 be_get_rxfh_key_size(struct net_device *netdev)
1114+
{
1115+
return RSS_HASH_KEY_LEN;
1116+
}
1117+
1118+
static int be_get_rxfh(struct net_device *netdev, u32 *indir, u8 *hkey)
1119+
{
1120+
struct be_adapter *adapter = netdev_priv(netdev);
1121+
int i;
1122+
struct rss_info *rss = &adapter->rss_info;
1123+
1124+
if (indir) {
1125+
for (i = 0; i < RSS_INDIR_TABLE_LEN; i++)
1126+
indir[i] = rss->rss_queue[i];
1127+
}
1128+
1129+
if (hkey)
1130+
memcpy(hkey, rss->rss_hkey, RSS_HASH_KEY_LEN);
1131+
1132+
return 0;
1133+
}
1134+
1135+
static int be_set_rxfh(struct net_device *netdev, u32 *indir, u8 *hkey)
1136+
{
1137+
int rc = 0, i, j;
1138+
struct be_adapter *adapter = netdev_priv(netdev);
1139+
u8 rsstable[RSS_INDIR_TABLE_LEN];
1140+
1141+
if (indir) {
1142+
struct be_rx_obj *rxo;
1143+
for (i = 0; i < RSS_INDIR_TABLE_LEN; i++) {
1144+
j = indir[i];
1145+
rxo = &adapter->rx_obj[j];
1146+
rsstable[i] = rxo->rss_id;
1147+
adapter->rss_info.rss_queue[i] = j;
1148+
}
1149+
} else {
1150+
memcpy(rsstable, adapter->rss_info.rsstable,
1151+
RSS_INDIR_TABLE_LEN);
1152+
}
1153+
1154+
if (!hkey)
1155+
hkey = adapter->rss_info.rss_hkey;
1156+
1157+
rc = be_cmd_rss_config(adapter, rsstable,
1158+
adapter->rss_info.rss_flags,
1159+
RSS_INDIR_TABLE_LEN, hkey);
1160+
if (rc) {
1161+
adapter->rss_info.rss_flags = RSS_ENABLE_NONE;
1162+
return -EIO;
1163+
}
1164+
memcpy(adapter->rss_info.rss_hkey, hkey, RSS_HASH_KEY_LEN);
1165+
memcpy(adapter->rss_info.rsstable, rsstable,
1166+
RSS_INDIR_TABLE_LEN);
1167+
return 0;
1168+
}
1169+
11061170
const struct ethtool_ops be_ethtool_ops = {
11071171
.get_settings = be_get_settings,
11081172
.get_drvinfo = be_get_drvinfo,
@@ -1129,6 +1193,10 @@ const struct ethtool_ops be_ethtool_ops = {
11291193
.self_test = be_self_test,
11301194
.get_rxnfc = be_get_rxnfc,
11311195
.set_rxnfc = be_set_rxnfc,
1196+
.get_rxfh_indir_size = be_get_rxfh_indir_size,
1197+
.get_rxfh_key_size = be_get_rxfh_key_size,
1198+
.get_rxfh = be_get_rxfh,
1199+
.set_rxfh = be_set_rxfh,
11321200
.get_channels = be_get_channels,
11331201
.set_channels = be_set_channels
11341202
};

drivers/net/ethernet/emulex/benet/be_main.c

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2774,7 +2774,8 @@ static int be_rx_qs_create(struct be_adapter *adapter)
27742774
{
27752775
struct be_rx_obj *rxo;
27762776
int rc, i, j;
2777-
u8 rsstable[128];
2777+
u8 rss_hkey[RSS_HASH_KEY_LEN];
2778+
struct rss_info *rss = &adapter->rss_info;
27782779

27792780
for_all_rx_queues(adapter, rxo, i) {
27802781
rc = be_queue_alloc(adapter, &rxo->q, RX_Q_LEN,
@@ -2799,31 +2800,37 @@ static int be_rx_qs_create(struct be_adapter *adapter)
27992800
}
28002801

28012802
if (be_multi_rxq(adapter)) {
2802-
for (j = 0; j < 128; j += adapter->num_rx_qs - 1) {
2803+
for (j = 0; j < RSS_INDIR_TABLE_LEN;
2804+
j += adapter->num_rx_qs - 1) {
28032805
for_all_rss_queues(adapter, rxo, i) {
2804-
if ((j + i) >= 128)
2806+
if ((j + i) >= RSS_INDIR_TABLE_LEN)
28052807
break;
2806-
rsstable[j + i] = rxo->rss_id;
2808+
rss->rsstable[j + i] = rxo->rss_id;
2809+
rss->rss_queue[j + i] = i;
28072810
}
28082811
}
2809-
adapter->rss_flags = RSS_ENABLE_TCP_IPV4 | RSS_ENABLE_IPV4 |
2810-
RSS_ENABLE_TCP_IPV6 | RSS_ENABLE_IPV6;
2812+
rss->rss_flags = RSS_ENABLE_TCP_IPV4 | RSS_ENABLE_IPV4 |
2813+
RSS_ENABLE_TCP_IPV6 | RSS_ENABLE_IPV6;
28112814

28122815
if (!BEx_chip(adapter))
2813-
adapter->rss_flags |= RSS_ENABLE_UDP_IPV4 |
2814-
RSS_ENABLE_UDP_IPV6;
2816+
rss->rss_flags |= RSS_ENABLE_UDP_IPV4 |
2817+
RSS_ENABLE_UDP_IPV6;
28152818
} else {
28162819
/* Disable RSS, if only default RX Q is created */
2817-
adapter->rss_flags = RSS_ENABLE_NONE;
2820+
rss->rss_flags = RSS_ENABLE_NONE;
28182821
}
28192822

2820-
rc = be_cmd_rss_config(adapter, rsstable, adapter->rss_flags,
2821-
128);
2823+
get_random_bytes(rss_hkey, RSS_HASH_KEY_LEN);
2824+
rc = be_cmd_rss_config(adapter, rss->rsstable,
2825+
rss->rss_flags,
2826+
128, rss_hkey);
28222827
if (rc) {
2823-
adapter->rss_flags = RSS_ENABLE_NONE;
2828+
rss->rss_flags = RSS_ENABLE_NONE;
28242829
return rc;
28252830
}
28262831

2832+
memcpy(rss->rss_hkey, rss_hkey, RSS_HASH_KEY_LEN);
2833+
28272834
/* First time posting */
28282835
for_all_rx_queues(adapter, rxo, i)
28292836
be_post_rx_frags(rxo, GFP_KERNEL);

0 commit comments

Comments
 (0)