Skip to content

Commit

Permalink
devlink: Prepare code to fill multiple port function attributes
Browse files Browse the repository at this point in the history
Prepare code to fill zero or more port function optional attributes.
Subsequent patch makes use of this to fill more port function
attributes.

Signed-off-by: Parav Pandit <parav@nvidia.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
Reviewed-by: Vu Pham <vuhuong@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
  • Loading branch information
Parav Pandit authored and Saeed Mahameed committed Jan 22, 2021
1 parent 7b8fc01 commit 1230d94
Showing 1 changed file with 33 additions and 31 deletions.
64 changes: 33 additions & 31 deletions net/core/devlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -712,43 +712,49 @@ static int devlink_nl_port_attrs_put(struct sk_buff *msg,
return 0;
}

static int
devlink_port_fn_hw_addr_fill(struct devlink *devlink, const struct devlink_ops *ops,
struct devlink_port *port, struct sk_buff *msg,
struct netlink_ext_ack *extack, bool *msg_updated)
{
u8 hw_addr[MAX_ADDR_LEN];
int hw_addr_len;
int err;

if (!ops->port_function_hw_addr_get)
return 0;

err = ops->port_function_hw_addr_get(devlink, port, hw_addr, &hw_addr_len, extack);
if (err) {
if (err == -EOPNOTSUPP)
return 0;
return err;
}
err = nla_put(msg, DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR, hw_addr_len, hw_addr);
if (err)
return err;
*msg_updated = true;
return 0;
}

static int
devlink_nl_port_function_attrs_put(struct sk_buff *msg, struct devlink_port *port,
struct netlink_ext_ack *extack)
{
struct devlink *devlink = port->devlink;
const struct devlink_ops *ops;
struct nlattr *function_attr;
bool empty_nest = true;
int err = 0;
bool msg_updated = false;
int err;

function_attr = nla_nest_start_noflag(msg, DEVLINK_ATTR_PORT_FUNCTION);
if (!function_attr)
return -EMSGSIZE;

ops = devlink->ops;
if (ops->port_function_hw_addr_get) {
int hw_addr_len;
u8 hw_addr[MAX_ADDR_LEN];

err = ops->port_function_hw_addr_get(devlink, port, hw_addr, &hw_addr_len, extack);
if (err == -EOPNOTSUPP) {
/* Port function attributes are optional for a port. If port doesn't
* support function attribute, returning -EOPNOTSUPP is not an error.
*/
err = 0;
goto out;
} else if (err) {
goto out;
}
err = nla_put(msg, DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR, hw_addr_len, hw_addr);
if (err)
goto out;
empty_nest = false;
}

out:
if (err || empty_nest)
err = devlink_port_fn_hw_addr_fill(devlink, ops, port, msg,
extack, &msg_updated);
if (err || !msg_updated)
nla_nest_cancel(msg, function_attr);
else
nla_nest_end(msg, function_attr);
Expand Down Expand Up @@ -986,7 +992,6 @@ devlink_port_function_hw_addr_set(struct devlink *devlink, struct devlink_port *
const struct devlink_ops *ops;
const u8 *hw_addr;
int hw_addr_len;
int err;

hw_addr = nla_data(attr);
hw_addr_len = nla_len(attr);
Expand All @@ -1011,12 +1016,7 @@ devlink_port_function_hw_addr_set(struct devlink *devlink, struct devlink_port *
return -EOPNOTSUPP;
}

err = ops->port_function_hw_addr_set(devlink, port, hw_addr, hw_addr_len, extack);
if (err)
return err;

devlink_port_notify(port, DEVLINK_CMD_PORT_NEW);
return 0;
return ops->port_function_hw_addr_set(devlink, port, hw_addr, hw_addr_len, extack);
}

static int
Expand All @@ -1037,6 +1037,8 @@ devlink_port_function_set(struct devlink *devlink, struct devlink_port *port,
if (attr)
err = devlink_port_function_hw_addr_set(devlink, port, attr, extack);

if (!err)
devlink_port_notify(port, DEVLINK_CMD_PORT_NEW);
return err;
}

Expand Down

0 comments on commit 1230d94

Please sign in to comment.