Skip to content

Commit 8a8f6b1

Browse files
dmarionkmonendra
authored andcommitted
dev: add support for changing RSS key
Type: improvement Change-Id: I40350be4c362d20f60b94c82faf564f06d8e86f6 Signed-off-by: Damjan Marion <damarion@cisco.com> Reviewed-on: https://sj1git1.cavium.com/c/IP/SW/toolkits/vpp/+/162762 Tested-by: sa_ip-toolkits-Jenkins <sa_ip-toolkits-jenkins@marvell.com> Reviewed-by: Monendra Singh Kushwaha <kmonendra@marvell.com> (cherry picked from commit 988275c9700d7c397f9809ea3c8273e84c03aa23)
1 parent fb6e340 commit 8a8f6b1

10 files changed

Lines changed: 218 additions & 22 deletions

File tree

src/vnet/dev/api.c

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,3 +273,43 @@ vnet_dev_api_remove_port_if (vlib_main_t *vm,
273273

274274
return vnet_dev_process_call_port_op (vm, port, vnet_dev_port_if_remove);
275275
}
276+
277+
vnet_dev_rv_t
278+
vnet_dev_api_port_set_rss_key (vlib_main_t *vm,
279+
vnet_dev_api_port_set_rss_key_args_t *args)
280+
{
281+
vnet_dev_port_t *port = 0;
282+
vnet_dev_t *dev = vnet_dev_by_index (args->dev_index);
283+
vnet_dev_rv_t rv = VNET_DEV_OK;
284+
vnet_dev_port_cfg_change_req_t req = {
285+
.type = VNET_DEV_PORT_CFG_SET_RSS_KEY,
286+
.rss_key = args->rss_key,
287+
};
288+
289+
if (!dev)
290+
return VNET_DEV_ERR_UNKNOWN_DEVICE;
291+
292+
log_debug (dev, "port %u rss_key %U", args->port_id,
293+
format_hex_bytes_no_wrap, args->rss_key.key,
294+
args->rss_key.length);
295+
296+
port = vnet_dev_get_port_by_id (dev, args->port_id);
297+
if (!port)
298+
return VNET_DEV_ERR_UNKNOWN_DEVICE;
299+
300+
rv = vnet_dev_port_cfg_change_req_validate (vm, port, &req);
301+
if (rv != VNET_DEV_OK)
302+
{
303+
log_err (dev, "RSS key cannot be set");
304+
return rv;
305+
}
306+
307+
rv = vnet_dev_process_port_cfg_change_req (vm, port, &req);
308+
if (rv != VNET_DEV_OK)
309+
{
310+
log_err (dev, "device failed to set RSS key");
311+
return rv;
312+
}
313+
314+
return rv;
315+
}

src/vnet/dev/api.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,15 @@ vnet_dev_rv_t
6565
vnet_dev_api_remove_port_if (vlib_main_t *,
6666
vnet_dev_api_remove_port_if_args_t *);
6767

68+
typedef struct
69+
{
70+
u32 dev_index;
71+
vnet_dev_port_id_t port_id;
72+
vnet_dev_rss_key_t rss_key;
73+
} vnet_dev_api_port_set_rss_key_args_t;
74+
75+
vnet_dev_rv_t
76+
vnet_dev_api_port_set_rss_key (vlib_main_t *,
77+
vnet_dev_api_port_set_rss_key_args_t *);
78+
6879
#endif /* _VNET_DEV_API_H_ */

src/vnet/dev/args.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ vnet_dev_arg_parse (vlib_main_t *vm, vnet_dev_t *dev, vnet_dev_arg_t *args,
8282
else if (a->type == VNET_DEV_ARG_TYPE_UINT32)
8383
{
8484
u32 val, min = 0, max = CLIB_U32_MAX;
85-
if (!unformat (&in, "%u", &val))
85+
if (!unformat (&in, "0x%x", &val) && !unformat (&in, "%u", &val))
8686
{
8787
err = format (0,
8888
"unsigned integer in range %u - %u expected for "

src/vnet/dev/cli.c

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,3 +329,70 @@ VLIB_CLI_COMMAND (show_device_counters_cmd, static) = {
329329
.function = show_device_counters_cmd_fn,
330330
.is_mp_safe = 1,
331331
};
332+
333+
static clib_error_t *
334+
device_set_rss_key_cmd_fn (vlib_main_t *vm, unformat_input_t *input,
335+
vlib_cli_command_t *cmd)
336+
{
337+
vnet_dev_api_port_set_rss_key_args_t a = {};
338+
vnet_dev_rv_t rv;
339+
int device_id_set = 0;
340+
int sw_if_index_set = 0;
341+
vnet_dev_device_id_t device_id = {};
342+
uint32_t sw_if_index, n;
343+
344+
while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
345+
{
346+
if (unformat (input, "port %u", &n))
347+
a.port_id = n;
348+
else if (unformat (input, "dev %U", unformat_c_string_array, &device_id,
349+
sizeof (device_id)))
350+
device_id_set = 1;
351+
else if (unformat (input, "key %U", unformat_vnet_dev_rss_key,
352+
&a.rss_key))
353+
;
354+
else if (unformat (input, "%U", unformat_vnet_sw_interface,
355+
vnet_get_main (), &sw_if_index))
356+
sw_if_index_set = 1;
357+
else
358+
return clib_error_return (0, "unknown input `%U'",
359+
format_unformat_error, input);
360+
}
361+
362+
if (sw_if_index_set == device_id_set)
363+
return clib_error_return (
364+
0, "please specify either interface name or port id");
365+
366+
if (sw_if_index_set)
367+
{
368+
vnet_dev_port_t *port = vnet_dev_get_port_from_sw_if_index (sw_if_index);
369+
370+
if (port == 0)
371+
return clib_error_return (0, "unsupported interface");
372+
a.port_id = port->port_id;
373+
a.dev_index = port->dev->index;
374+
}
375+
else
376+
{
377+
vnet_dev_t *dev = vnet_dev_by_id (device_id);
378+
if (!dev)
379+
return clib_error_return (0, "please specify valid device id");
380+
a.dev_index = dev->index;
381+
}
382+
383+
rv = vnet_dev_api_port_set_rss_key (vm, &a);
384+
385+
if (rv != VNET_DEV_OK)
386+
return clib_error_return (0, "unable to set_rss_key: %U",
387+
format_vnet_dev_rv, rv);
388+
389+
return 0;
390+
}
391+
392+
VLIB_CLI_COMMAND (device_set_rss_key_cmd, static) = {
393+
.path = "device set-rss-key",
394+
.short_help = "device set-rss-key [<intf>] [port <port-id>] [dev "
395+
"<device-id>] [key <rss-key>]",
396+
.function = device_set_rss_key_cmd_fn,
397+
.is_mp_safe = 1,
398+
};

src/vnet/dev/config.c

Lines changed: 37 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -15,34 +15,44 @@ VLIB_REGISTER_LOG_CLASS (dev_log, static) = {
1515
.subclass_name = "config",
1616
};
1717

18+
typedef struct
19+
{
20+
vnet_dev_api_create_port_if_args_t intf;
21+
vnet_dev_api_port_set_rss_key_args_t rss_key_args;
22+
} port_config_t;
23+
1824
static clib_error_t *
1925
vnet_dev_config_one_interface (vlib_main_t *vm, unformat_input_t *input,
20-
vnet_dev_api_create_port_if_args_t *args)
26+
port_config_t *args)
2127
{
2228
clib_error_t *err = 0;
2329

24-
log_debug (0, "port %u %U", args->port_id, format_unformat_input, input);
30+
log_debug (0, "port %u %U", args->intf.port_id, format_unformat_input,
31+
input);
2532

2633
while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
2734
{
2835
u32 n;
2936

30-
if (unformat (input, "name %U", unformat_c_string_array, args->intf_name,
31-
sizeof (args->intf_name)))
37+
if (unformat (input, "name %U", unformat_c_string_array,
38+
args->intf.intf_name, sizeof (args->intf.intf_name)))
3239
;
3340
else if (unformat (input, "num-rx-queues %u", &n))
34-
args->num_rx_queues = n;
41+
args->intf.num_rx_queues = n;
3542
else if (unformat (input, "num-tx-queues %u", &n))
36-
args->num_tx_queues = n;
43+
args->intf.num_tx_queues = n;
3744
else if (unformat (input, "rx-queue-size %u", &n))
38-
args->rx_queue_size = n;
45+
args->intf.rx_queue_size = n;
3946
else if (unformat (input, "tx-queue-size %u", &n))
40-
args->tx_queue_size = n;
47+
args->intf.tx_queue_size = n;
48+
else if (unformat (input, "rss-key %U", unformat_vnet_dev_rss_key,
49+
&args->rss_key_args.rss_key))
50+
;
4151
else if (unformat (input, "flags %U", unformat_vnet_dev_port_flags,
42-
&args->flags))
52+
&args->intf.flags))
4353
;
4454
else if (unformat (input, "args %U", unformat_single_quoted_string,
45-
&args->args))
55+
&args->intf.args))
4656
;
4757
else
4858
{
@@ -112,15 +122,14 @@ vnet_dev_config_driver_args (vlib_main_t *vm, unformat_input_t *input,
112122

113123
return err;
114124
}
115-
116125
static clib_error_t *
117126
vnet_dev_config_one_device (vlib_main_t *vm, unformat_input_t *input,
118127
char *device_id)
119128
{
120129
log_debug (0, "device %s %U", device_id, format_unformat_input, input);
121130
clib_error_t *err = 0;
122131
vnet_dev_api_attach_args_t args = {};
123-
vnet_dev_api_create_port_if_args_t *if_args_vec = 0, *if_args;
132+
port_config_t *ports = 0, *p;
124133

125134
while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
126135
{
@@ -139,10 +148,9 @@ vnet_dev_config_one_device (vlib_main_t *vm, unformat_input_t *input,
139148
else if (unformat (input, "port %u %U", &n, unformat_vlib_cli_sub_input,
140149
&sub_input))
141150
{
142-
vnet_dev_api_create_port_if_args_t *if_args;
143-
vec_add2 (if_args_vec, if_args, 1);
144-
if_args->port_id = n;
145-
err = vnet_dev_config_one_interface (vm, &sub_input, if_args);
151+
vec_add2 (ports, p, 1);
152+
p->intf.port_id = n;
153+
err = vnet_dev_config_one_interface (vm, &sub_input, p);
146154
unformat_free (&sub_input);
147155
if (err)
148156
break;
@@ -165,12 +173,21 @@ vnet_dev_config_one_device (vlib_main_t *vm, unformat_input_t *input,
165173

166174
if (rv == VNET_DEV_OK)
167175
{
168-
vec_foreach (if_args, if_args_vec)
176+
vec_foreach (p, ports)
169177
{
170-
if_args->dev_index = args.dev_index;
171-
rv = vnet_dev_api_create_port_if (vm, if_args);
178+
p->intf.dev_index = args.dev_index;
179+
rv = vnet_dev_api_create_port_if (vm, &p->intf);
172180
if (rv != VNET_DEV_OK)
173181
break;
182+
if (p->rss_key_args.rss_key.length)
183+
{
184+
vnet_dev_api_port_set_rss_key_args_t *rka = &p->rss_key_args;
185+
rka->port_id = p->intf.port_id;
186+
rka->dev_index = p->intf.dev_index;
187+
rv = vnet_dev_api_port_set_rss_key (vm, rka);
188+
if (rv != VNET_DEV_OK)
189+
break;
190+
}
174191
}
175192
}
176193

@@ -179,7 +196,7 @@ vnet_dev_config_one_device (vlib_main_t *vm, unformat_input_t *input,
179196
format_vnet_dev_rv, rv, device_id);
180197
}
181198

182-
vec_free (if_args_vec);
199+
vec_free (ports);
183200
return err;
184201
}
185202

src/vnet/dev/dev.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,8 @@ typedef struct
152152
_ (ADD_RX_FLOW) \
153153
_ (DEL_RX_FLOW) \
154154
_ (GET_RX_FLOW_COUNTER) \
155-
_ (RESET_RX_FLOW_COUNTER)
155+
_ (RESET_RX_FLOW_COUNTER) \
156+
_ (SET_RSS_KEY)
156157

157158
typedef enum
158159
{
@@ -174,6 +175,7 @@ typedef struct vnet_dev_port_cfg_change_req
174175
vnet_dev_hw_addr_t addr;
175176
u32 max_rx_frame_size;
176177
vnet_dev_queue_id_t queue_id;
178+
vnet_dev_rss_key_t rss_key;
177179
struct
178180
{
179181
u32 flow_index;
@@ -363,6 +365,7 @@ typedef struct vnet_dev_port
363365
u16 txq_sz;
364366
u16 rxq_sz;
365367
} intf;
368+
vnet_dev_rss_key_t rss_key;
366369

367370
CLIB_CACHE_LINE_ALIGN_MARK (data0);
368371
u8 data[];
@@ -490,6 +493,7 @@ typedef struct
490493
vnet_dev_arg_t *args;
491494
u16 data_size;
492495
void *initial_data;
496+
vnet_dev_rss_key_t default_rss_key;
493497
} port;
494498

495499
vnet_dev_node_t *rx_node;
@@ -677,6 +681,7 @@ format_function_t format_vnet_dev_tx_queue_info;
677681
format_function_t format_vnet_dev_flow;
678682
unformat_function_t unformat_vnet_dev_flags;
679683
unformat_function_t unformat_vnet_dev_port_flags;
684+
unformat_function_t unformat_vnet_dev_rss_key;
680685

681686
typedef struct
682687
{

src/vnet/dev/dev_funcs.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,19 @@ vnet_dev_get_port_rx_node_idex (vnet_dev_port_t *port)
9292
return port->intf.rx_node_index;
9393
}
9494

95+
static_always_inline vnet_dev_port_t *
96+
vnet_dev_get_port_from_sw_if_index (u32 sw_if_index)
97+
{
98+
vnet_main_t *vnm = vnet_get_main ();
99+
vnet_sw_interface_t *si;
100+
101+
si = vnet_get_sw_interface_or_null (vnm, sw_if_index);
102+
if (!si)
103+
return 0;
104+
105+
return vnet_dev_get_port_from_hw_if_index (si->hw_if_index);
106+
}
107+
95108
static_always_inline vnet_dev_t *
96109
vnet_dev_by_index (u32 index)
97110
{

src/vnet/dev/format.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,10 @@ format_vnet_dev_port_info (u8 *s, va_list *args)
119119
s = format (s, " %U", format_vnet_dev_hw_addr, a);
120120
}
121121
}
122+
if (port->rss_key.length)
123+
s = format (s, "\n%URSS Key is %U", format_white_space, indent,
124+
format_hex_bytes_no_wrap, port->rss_key.key,
125+
port->rss_key.length);
122126
s = format (s, "\n%UMax RX frame size is %u (max supported %u)",
123127
format_white_space, indent, port->max_rx_frame_size,
124128
port->attr.max_supported_rx_frame_size);
@@ -505,3 +509,25 @@ format_vnet_dev_flow (u8 *s, va_list *args)
505509

506510
return s;
507511
}
512+
513+
uword
514+
unformat_vnet_dev_rss_key (unformat_input_t *input, va_list *args)
515+
{
516+
vnet_dev_rss_key_t *k = va_arg (*args, vnet_dev_rss_key_t *);
517+
u8 *v;
518+
u32 len;
519+
520+
if (!(unformat_user (input, unformat_hex_string, &v)))
521+
return 0;
522+
523+
len = vec_len (v);
524+
if (len > sizeof (k->key))
525+
{
526+
vec_free (v);
527+
return 0;
528+
}
529+
530+
clib_memcpy (k->key, v, len);
531+
k->length = len;
532+
return 1;
533+
}

src/vnet/dev/port.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,9 @@ vnet_dev_port_add (vlib_main_t *vm, vnet_dev_t *dev, vnet_dev_port_id_t id,
267267
port->rx_node = *args->rx_node;
268268
port->tx_node = *args->tx_node;
269269

270+
if (port->attr.caps.rss && args->port.default_rss_key.length)
271+
port->rss_key = args->port.default_rss_key;
272+
270273
if (args->port.args)
271274
for (vnet_dev_arg_t *a = args->port.args; a->type != VNET_DEV_ARG_END; a++)
272275
vec_add1 (port->args, *a);
@@ -337,6 +340,11 @@ vnet_dev_port_cfg_change_req_validate (vlib_main_t *vm, vnet_dev_port_t *port,
337340
return VNET_DEV_ERR_NO_SUCH_ENTRY;
338341
break;
339342

343+
case VNET_DEV_PORT_CFG_SET_RSS_KEY:
344+
if (!port->attr.caps.rss)
345+
return VNET_DEV_ERR_NOT_SUPPORTED;
346+
break;
347+
340348
default:
341349
break;
342350
}
@@ -453,6 +461,10 @@ vnet_dev_port_cfg_change (vlib_main_t *vm, vnet_dev_port_t *port,
453461
}
454462
break;
455463

464+
case VNET_DEV_PORT_CFG_SET_RSS_KEY:
465+
port->rss_key = req->rss_key;
466+
break;
467+
456468
default:
457469
break;
458470
}

0 commit comments

Comments
 (0)