Commit 39f04b14 authored by Jakub Kicinski's avatar Jakub Kicinski

tools: ynl: fix duplicate op name in devlink

We don't support CRUD-inspired message types in YNL too well.
One aspect that currently trips us up is the fact that single
message ID can be used in multiple commands (as the response).
This leads to duplicate entries in the id-to-string tables:

devlink-user.c:19:34: warning: initialized field overwritten [-Woverride-init]
   19 |         [DEVLINK_CMD_PORT_NEW] = "port-new",
      |                                  ^~~~~~~~~~
devlink-user.c:19:34: note: (near initialization for ‘devlink_op_strmap[7]’)

Fixes tag points at where the code was generated, the "real" problem
is that the code generator does not support CRUD.

Fixes: f2f9dd16 ("netlink: specs: devlink: add the remaining command to generate complete split_ops")
Link: https://lore.kernel.org/r/20231123030558.1611831-1-kuba@kernel.orgSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 2be35a61
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
/* Enums */ /* Enums */
static const char * const devlink_op_strmap[] = { static const char * const devlink_op_strmap[] = {
[3] = "get", [3] = "get",
[7] = "port-get", // skip "port-get", duplicate reply value
[DEVLINK_CMD_PORT_NEW] = "port-new", [DEVLINK_CMD_PORT_NEW] = "port-new",
[13] = "sb-get", [13] = "sb-get",
[17] = "sb-pool-get", [17] = "sb-pool-get",
......
...@@ -1505,6 +1505,12 @@ def put_op_name(family, cw): ...@@ -1505,6 +1505,12 @@ def put_op_name(family, cw):
cw.block_start(line=f"static const char * const {map_name}[] =") cw.block_start(line=f"static const char * const {map_name}[] =")
for op_name, op in family.msgs.items(): for op_name, op in family.msgs.items():
if op.rsp_value: if op.rsp_value:
# Make sure we don't add duplicated entries, if multiple commands
# produce the same response in legacy families.
if family.rsp_by_value[op.rsp_value] != op:
cw.p(f'// skip "{op_name}", duplicate reply value')
continue
if op.req_value == op.rsp_value: if op.req_value == op.rsp_value:
cw.p(f'[{op.enum_name}] = "{op_name}",') cw.p(f'[{op.enum_name}] = "{op_name}",')
else: else:
......
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