devlink: Move devlink dev eswitch code to dev
Move devlink dev eswitch callbacks and related code from leftover.c to file dev.c. No functional change in this patch. Signed-off-by: Moshe Shemesh <moshe@nvidia.com> Reviewed-by: Jiri Pirko <jiri@nvidia.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Родитель
c6ed7d6ef9
Коммит
af2f8c1f82
|
@ -514,3 +514,123 @@ bool devlink_reload_actions_valid(const struct devlink_ops *ops)
|
|||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static int devlink_nl_eswitch_fill(struct sk_buff *msg, struct devlink *devlink,
|
||||
enum devlink_command cmd, u32 portid,
|
||||
u32 seq, int flags)
|
||||
{
|
||||
const struct devlink_ops *ops = devlink->ops;
|
||||
enum devlink_eswitch_encap_mode encap_mode;
|
||||
u8 inline_mode;
|
||||
void *hdr;
|
||||
int err = 0;
|
||||
u16 mode;
|
||||
|
||||
hdr = genlmsg_put(msg, portid, seq, &devlink_nl_family, flags, cmd);
|
||||
if (!hdr)
|
||||
return -EMSGSIZE;
|
||||
|
||||
err = devlink_nl_put_handle(msg, devlink);
|
||||
if (err)
|
||||
goto nla_put_failure;
|
||||
|
||||
if (ops->eswitch_mode_get) {
|
||||
err = ops->eswitch_mode_get(devlink, &mode);
|
||||
if (err)
|
||||
goto nla_put_failure;
|
||||
err = nla_put_u16(msg, DEVLINK_ATTR_ESWITCH_MODE, mode);
|
||||
if (err)
|
||||
goto nla_put_failure;
|
||||
}
|
||||
|
||||
if (ops->eswitch_inline_mode_get) {
|
||||
err = ops->eswitch_inline_mode_get(devlink, &inline_mode);
|
||||
if (err)
|
||||
goto nla_put_failure;
|
||||
err = nla_put_u8(msg, DEVLINK_ATTR_ESWITCH_INLINE_MODE,
|
||||
inline_mode);
|
||||
if (err)
|
||||
goto nla_put_failure;
|
||||
}
|
||||
|
||||
if (ops->eswitch_encap_mode_get) {
|
||||
err = ops->eswitch_encap_mode_get(devlink, &encap_mode);
|
||||
if (err)
|
||||
goto nla_put_failure;
|
||||
err = nla_put_u8(msg, DEVLINK_ATTR_ESWITCH_ENCAP_MODE, encap_mode);
|
||||
if (err)
|
||||
goto nla_put_failure;
|
||||
}
|
||||
|
||||
genlmsg_end(msg, hdr);
|
||||
return 0;
|
||||
|
||||
nla_put_failure:
|
||||
genlmsg_cancel(msg, hdr);
|
||||
return err;
|
||||
}
|
||||
|
||||
int devlink_nl_cmd_eswitch_get_doit(struct sk_buff *skb, struct genl_info *info)
|
||||
{
|
||||
struct devlink *devlink = info->user_ptr[0];
|
||||
struct sk_buff *msg;
|
||||
int err;
|
||||
|
||||
msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
|
||||
if (!msg)
|
||||
return -ENOMEM;
|
||||
|
||||
err = devlink_nl_eswitch_fill(msg, devlink, DEVLINK_CMD_ESWITCH_GET,
|
||||
info->snd_portid, info->snd_seq, 0);
|
||||
|
||||
if (err) {
|
||||
nlmsg_free(msg);
|
||||
return err;
|
||||
}
|
||||
|
||||
return genlmsg_reply(msg, info);
|
||||
}
|
||||
|
||||
int devlink_nl_cmd_eswitch_set_doit(struct sk_buff *skb, struct genl_info *info)
|
||||
{
|
||||
struct devlink *devlink = info->user_ptr[0];
|
||||
const struct devlink_ops *ops = devlink->ops;
|
||||
enum devlink_eswitch_encap_mode encap_mode;
|
||||
u8 inline_mode;
|
||||
int err = 0;
|
||||
u16 mode;
|
||||
|
||||
if (info->attrs[DEVLINK_ATTR_ESWITCH_MODE]) {
|
||||
if (!ops->eswitch_mode_set)
|
||||
return -EOPNOTSUPP;
|
||||
mode = nla_get_u16(info->attrs[DEVLINK_ATTR_ESWITCH_MODE]);
|
||||
err = devlink_rate_nodes_check(devlink, mode, info->extack);
|
||||
if (err)
|
||||
return err;
|
||||
err = ops->eswitch_mode_set(devlink, mode, info->extack);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
if (info->attrs[DEVLINK_ATTR_ESWITCH_INLINE_MODE]) {
|
||||
if (!ops->eswitch_inline_mode_set)
|
||||
return -EOPNOTSUPP;
|
||||
inline_mode = nla_get_u8(info->attrs[DEVLINK_ATTR_ESWITCH_INLINE_MODE]);
|
||||
err = ops->eswitch_inline_mode_set(devlink, inline_mode,
|
||||
info->extack);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
if (info->attrs[DEVLINK_ATTR_ESWITCH_ENCAP_MODE]) {
|
||||
if (!ops->eswitch_encap_mode_set)
|
||||
return -EOPNOTSUPP;
|
||||
encap_mode = nla_get_u8(info->attrs[DEVLINK_ATTR_ESWITCH_ENCAP_MODE]);
|
||||
err = ops->eswitch_encap_mode_set(devlink, encap_mode,
|
||||
info->extack);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -202,6 +202,8 @@ struct devlink_linecard *
|
|||
devlink_linecard_get_from_info(struct devlink *devlink, struct genl_info *info);
|
||||
|
||||
/* Rates */
|
||||
int devlink_rate_nodes_check(struct devlink *devlink, u16 mode,
|
||||
struct netlink_ext_ack *extack);
|
||||
struct devlink_rate *
|
||||
devlink_rate_get_from_info(struct devlink *devlink, struct genl_info *info);
|
||||
struct devlink_rate *
|
||||
|
@ -210,3 +212,5 @@ devlink_rate_node_get_from_info(struct devlink *devlink,
|
|||
/* Devlink nl cmds */
|
||||
int devlink_nl_cmd_get_doit(struct sk_buff *skb, struct genl_info *info);
|
||||
int devlink_nl_cmd_reload(struct sk_buff *skb, struct genl_info *info);
|
||||
int devlink_nl_cmd_eswitch_get_doit(struct sk_buff *skb, struct genl_info *info);
|
||||
int devlink_nl_cmd_eswitch_set_doit(struct sk_buff *skb, struct genl_info *info);
|
||||
|
|
|
@ -2843,85 +2843,8 @@ static int devlink_nl_cmd_sb_occ_max_clear_doit(struct sk_buff *skb,
|
|||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static int devlink_nl_eswitch_fill(struct sk_buff *msg, struct devlink *devlink,
|
||||
enum devlink_command cmd, u32 portid,
|
||||
u32 seq, int flags)
|
||||
{
|
||||
const struct devlink_ops *ops = devlink->ops;
|
||||
enum devlink_eswitch_encap_mode encap_mode;
|
||||
u8 inline_mode;
|
||||
void *hdr;
|
||||
int err = 0;
|
||||
u16 mode;
|
||||
|
||||
hdr = genlmsg_put(msg, portid, seq, &devlink_nl_family, flags, cmd);
|
||||
if (!hdr)
|
||||
return -EMSGSIZE;
|
||||
|
||||
err = devlink_nl_put_handle(msg, devlink);
|
||||
if (err)
|
||||
goto nla_put_failure;
|
||||
|
||||
if (ops->eswitch_mode_get) {
|
||||
err = ops->eswitch_mode_get(devlink, &mode);
|
||||
if (err)
|
||||
goto nla_put_failure;
|
||||
err = nla_put_u16(msg, DEVLINK_ATTR_ESWITCH_MODE, mode);
|
||||
if (err)
|
||||
goto nla_put_failure;
|
||||
}
|
||||
|
||||
if (ops->eswitch_inline_mode_get) {
|
||||
err = ops->eswitch_inline_mode_get(devlink, &inline_mode);
|
||||
if (err)
|
||||
goto nla_put_failure;
|
||||
err = nla_put_u8(msg, DEVLINK_ATTR_ESWITCH_INLINE_MODE,
|
||||
inline_mode);
|
||||
if (err)
|
||||
goto nla_put_failure;
|
||||
}
|
||||
|
||||
if (ops->eswitch_encap_mode_get) {
|
||||
err = ops->eswitch_encap_mode_get(devlink, &encap_mode);
|
||||
if (err)
|
||||
goto nla_put_failure;
|
||||
err = nla_put_u8(msg, DEVLINK_ATTR_ESWITCH_ENCAP_MODE, encap_mode);
|
||||
if (err)
|
||||
goto nla_put_failure;
|
||||
}
|
||||
|
||||
genlmsg_end(msg, hdr);
|
||||
return 0;
|
||||
|
||||
nla_put_failure:
|
||||
genlmsg_cancel(msg, hdr);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int devlink_nl_cmd_eswitch_get_doit(struct sk_buff *skb,
|
||||
struct genl_info *info)
|
||||
{
|
||||
struct devlink *devlink = info->user_ptr[0];
|
||||
struct sk_buff *msg;
|
||||
int err;
|
||||
|
||||
msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
|
||||
if (!msg)
|
||||
return -ENOMEM;
|
||||
|
||||
err = devlink_nl_eswitch_fill(msg, devlink, DEVLINK_CMD_ESWITCH_GET,
|
||||
info->snd_portid, info->snd_seq, 0);
|
||||
|
||||
if (err) {
|
||||
nlmsg_free(msg);
|
||||
return err;
|
||||
}
|
||||
|
||||
return genlmsg_reply(msg, info);
|
||||
}
|
||||
|
||||
static int devlink_rate_nodes_check(struct devlink *devlink, u16 mode,
|
||||
struct netlink_ext_ack *extack)
|
||||
int devlink_rate_nodes_check(struct devlink *devlink, u16 mode,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct devlink_rate *devlink_rate;
|
||||
|
||||
|
@ -2933,52 +2856,6 @@ static int devlink_rate_nodes_check(struct devlink *devlink, u16 mode,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int devlink_nl_cmd_eswitch_set_doit(struct sk_buff *skb,
|
||||
struct genl_info *info)
|
||||
{
|
||||
struct devlink *devlink = info->user_ptr[0];
|
||||
const struct devlink_ops *ops = devlink->ops;
|
||||
enum devlink_eswitch_encap_mode encap_mode;
|
||||
u8 inline_mode;
|
||||
int err = 0;
|
||||
u16 mode;
|
||||
|
||||
if (info->attrs[DEVLINK_ATTR_ESWITCH_MODE]) {
|
||||
if (!ops->eswitch_mode_set)
|
||||
return -EOPNOTSUPP;
|
||||
mode = nla_get_u16(info->attrs[DEVLINK_ATTR_ESWITCH_MODE]);
|
||||
err = devlink_rate_nodes_check(devlink, mode, info->extack);
|
||||
if (err)
|
||||
return err;
|
||||
err = ops->eswitch_mode_set(devlink, mode, info->extack);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
if (info->attrs[DEVLINK_ATTR_ESWITCH_INLINE_MODE]) {
|
||||
if (!ops->eswitch_inline_mode_set)
|
||||
return -EOPNOTSUPP;
|
||||
inline_mode = nla_get_u8(
|
||||
info->attrs[DEVLINK_ATTR_ESWITCH_INLINE_MODE]);
|
||||
err = ops->eswitch_inline_mode_set(devlink, inline_mode,
|
||||
info->extack);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
if (info->attrs[DEVLINK_ATTR_ESWITCH_ENCAP_MODE]) {
|
||||
if (!ops->eswitch_encap_mode_set)
|
||||
return -EOPNOTSUPP;
|
||||
encap_mode = nla_get_u8(info->attrs[DEVLINK_ATTR_ESWITCH_ENCAP_MODE]);
|
||||
err = ops->eswitch_encap_mode_set(devlink, encap_mode,
|
||||
info->extack);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int devlink_dpipe_match_put(struct sk_buff *skb,
|
||||
struct devlink_dpipe_match *match)
|
||||
{
|
||||
|
|
Загрузка…
Ссылка в новой задаче