Commit 14f066ba authored by Jiri Pirko's avatar Jiri Pirko Committed by David S. Miller

team: add bool option type

Add another (hopefully last) option type. Use NLA_FLAG to implement
that.
Signed-off-by: default avatarJiri Pirko <jpirko@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 80f7c668
...@@ -1463,6 +1463,16 @@ static int team_nl_fill_options_get(struct sk_buff *skb, ...@@ -1463,6 +1463,16 @@ static int team_nl_fill_options_get(struct sk_buff *skb,
ctx.data.bin_val.len, ctx.data.bin_val.ptr)) ctx.data.bin_val.len, ctx.data.bin_val.ptr))
goto nla_put_failure; goto nla_put_failure;
break; break;
case TEAM_OPTION_TYPE_BOOL:
if (nla_put_u8(skb, TEAM_ATTR_OPTION_TYPE, NLA_FLAG))
goto nla_put_failure;
err = team_option_get(team, opt_inst, &ctx);
if (err)
goto errout;
if (ctx.data.bool_val &&
nla_put_flag(skb, TEAM_ATTR_OPTION_DATA))
goto nla_put_failure;
break;
default: default:
BUG(); BUG();
} }
...@@ -1524,6 +1534,7 @@ static int team_nl_cmd_options_set(struct sk_buff *skb, struct genl_info *info) ...@@ -1524,6 +1534,7 @@ static int team_nl_cmd_options_set(struct sk_buff *skb, struct genl_info *info)
nla_for_each_nested(nl_option, info->attrs[TEAM_ATTR_LIST_OPTION], i) { nla_for_each_nested(nl_option, info->attrs[TEAM_ATTR_LIST_OPTION], i) {
struct nlattr *opt_attrs[TEAM_ATTR_OPTION_MAX + 1]; struct nlattr *opt_attrs[TEAM_ATTR_OPTION_MAX + 1];
struct nlattr *attr_port_ifindex; struct nlattr *attr_port_ifindex;
struct nlattr *attr_data;
enum team_option_type opt_type; enum team_option_type opt_type;
int opt_port_ifindex = 0; /* != 0 for per-port options */ int opt_port_ifindex = 0; /* != 0 for per-port options */
struct team_option_inst *opt_inst; struct team_option_inst *opt_inst;
...@@ -1539,8 +1550,7 @@ static int team_nl_cmd_options_set(struct sk_buff *skb, struct genl_info *info) ...@@ -1539,8 +1550,7 @@ static int team_nl_cmd_options_set(struct sk_buff *skb, struct genl_info *info)
if (err) if (err)
goto team_put; goto team_put;
if (!opt_attrs[TEAM_ATTR_OPTION_NAME] || if (!opt_attrs[TEAM_ATTR_OPTION_NAME] ||
!opt_attrs[TEAM_ATTR_OPTION_TYPE] || !opt_attrs[TEAM_ATTR_OPTION_TYPE]) {
!opt_attrs[TEAM_ATTR_OPTION_DATA]) {
err = -EINVAL; err = -EINVAL;
goto team_put; goto team_put;
} }
...@@ -1554,10 +1564,19 @@ static int team_nl_cmd_options_set(struct sk_buff *skb, struct genl_info *info) ...@@ -1554,10 +1564,19 @@ static int team_nl_cmd_options_set(struct sk_buff *skb, struct genl_info *info)
case NLA_BINARY: case NLA_BINARY:
opt_type = TEAM_OPTION_TYPE_BINARY; opt_type = TEAM_OPTION_TYPE_BINARY;
break; break;
case NLA_FLAG:
opt_type = TEAM_OPTION_TYPE_BOOL;
break;
default: default:
goto team_put; goto team_put;
} }
attr_data = opt_attrs[TEAM_ATTR_OPTION_DATA];
if (opt_type != TEAM_OPTION_TYPE_BOOL && !attr_data) {
err = -EINVAL;
goto team_put;
}
opt_name = nla_data(opt_attrs[TEAM_ATTR_OPTION_NAME]); opt_name = nla_data(opt_attrs[TEAM_ATTR_OPTION_NAME]);
attr_port_ifindex = opt_attrs[TEAM_ATTR_OPTION_PORT_IFINDEX]; attr_port_ifindex = opt_attrs[TEAM_ATTR_OPTION_PORT_IFINDEX];
if (attr_port_ifindex) if (attr_port_ifindex)
...@@ -1565,9 +1584,7 @@ static int team_nl_cmd_options_set(struct sk_buff *skb, struct genl_info *info) ...@@ -1565,9 +1584,7 @@ static int team_nl_cmd_options_set(struct sk_buff *skb, struct genl_info *info)
list_for_each_entry(opt_inst, &team->option_inst_list, list) { list_for_each_entry(opt_inst, &team->option_inst_list, list) {
struct team_option *option = opt_inst->option; struct team_option *option = opt_inst->option;
struct nlattr *opt_data_attr;
struct team_gsetter_ctx ctx; struct team_gsetter_ctx ctx;
int data_len;
int tmp_ifindex; int tmp_ifindex;
tmp_ifindex = opt_inst->port ? tmp_ifindex = opt_inst->port ?
...@@ -1577,23 +1594,24 @@ static int team_nl_cmd_options_set(struct sk_buff *skb, struct genl_info *info) ...@@ -1577,23 +1594,24 @@ static int team_nl_cmd_options_set(struct sk_buff *skb, struct genl_info *info)
tmp_ifindex != opt_port_ifindex) tmp_ifindex != opt_port_ifindex)
continue; continue;
opt_found = true; opt_found = true;
opt_data_attr = opt_attrs[TEAM_ATTR_OPTION_DATA];
data_len = nla_len(opt_data_attr);
ctx.port = opt_inst->port; ctx.port = opt_inst->port;
switch (opt_type) { switch (opt_type) {
case TEAM_OPTION_TYPE_U32: case TEAM_OPTION_TYPE_U32:
ctx.data.u32_val = nla_get_u32(opt_data_attr); ctx.data.u32_val = nla_get_u32(attr_data);
break; break;
case TEAM_OPTION_TYPE_STRING: case TEAM_OPTION_TYPE_STRING:
if (data_len > TEAM_STRING_MAX_LEN) { if (nla_len(attr_data) > TEAM_STRING_MAX_LEN) {
err = -EINVAL; err = -EINVAL;
goto team_put; goto team_put;
} }
ctx.data.str_val = nla_data(opt_data_attr); ctx.data.str_val = nla_data(attr_data);
break; break;
case TEAM_OPTION_TYPE_BINARY: case TEAM_OPTION_TYPE_BINARY:
ctx.data.bin_val.len = data_len; ctx.data.bin_val.len = nla_len(attr_data);
ctx.data.bin_val.ptr = nla_data(opt_data_attr); ctx.data.bin_val.ptr = nla_data(attr_data);
break;
case TEAM_OPTION_TYPE_BOOL:
ctx.data.bool_val = attr_data ? true : false;
break; break;
default: default:
BUG(); BUG();
......
...@@ -69,6 +69,7 @@ enum team_option_type { ...@@ -69,6 +69,7 @@ enum team_option_type {
TEAM_OPTION_TYPE_U32, TEAM_OPTION_TYPE_U32,
TEAM_OPTION_TYPE_STRING, TEAM_OPTION_TYPE_STRING,
TEAM_OPTION_TYPE_BINARY, TEAM_OPTION_TYPE_BINARY,
TEAM_OPTION_TYPE_BOOL,
}; };
struct team_gsetter_ctx { struct team_gsetter_ctx {
...@@ -79,6 +80,7 @@ struct team_gsetter_ctx { ...@@ -79,6 +80,7 @@ struct team_gsetter_ctx {
const void *ptr; const void *ptr;
u32 len; u32 len;
} bin_val; } bin_val;
bool bool_val;
} data; } data;
struct team_port *port; struct team_port *port;
}; };
......
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