mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 05:02:12 +00:00
tipc: convert legacy nl link prop set to nl compat
Convert setting of link proprieties to compat doit calls. Commands converted in this patch: TIPC_CMD_SET_LINK_TOL TIPC_CMD_SET_LINK_PRI TIPC_CMD_SET_LINK_WINDOW Signed-off-by: Richard Alpe <richard.alpe@ericsson.com> Reviewed-by: Erik Hugne <erik.hugne@ericsson.com> Reviewed-by: Ying Xue <ying.xue@windriver.com> Reviewed-by: Jon Maloy <jon.maloy@ericsson.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
357ebdbfca
commit
37e2d4843f
@ -226,12 +226,6 @@ struct sk_buff *tipc_cfg_do_cmd(struct net *net, u32 orig_node, u16 cmd,
|
||||
case TIPC_CMD_SHOW_STATS:
|
||||
rep_tlv_buf = tipc_show_stats();
|
||||
break;
|
||||
case TIPC_CMD_SET_LINK_TOL:
|
||||
case TIPC_CMD_SET_LINK_PRI:
|
||||
case TIPC_CMD_SET_LINK_WINDOW:
|
||||
rep_tlv_buf = tipc_link_cmd_config(net, req_tlv_area,
|
||||
req_tlv_space, cmd);
|
||||
break;
|
||||
case TIPC_CMD_SET_NODE_ADDR:
|
||||
rep_tlv_buf = cfg_set_own_addr(net);
|
||||
break;
|
||||
|
146
net/tipc/link.c
146
net/tipc/link.c
@ -1958,150 +1958,6 @@ static struct tipc_node *tipc_link_find_owner(struct net *net,
|
||||
return found_node;
|
||||
}
|
||||
|
||||
/**
|
||||
* link_value_is_valid -- validate proposed link tolerance/priority/window
|
||||
*
|
||||
* @cmd: value type (TIPC_CMD_SET_LINK_*)
|
||||
* @new_value: the new value
|
||||
*
|
||||
* Returns 1 if value is within range, 0 if not.
|
||||
*/
|
||||
static int link_value_is_valid(u16 cmd, u32 new_value)
|
||||
{
|
||||
switch (cmd) {
|
||||
case TIPC_CMD_SET_LINK_TOL:
|
||||
return (new_value >= TIPC_MIN_LINK_TOL) &&
|
||||
(new_value <= TIPC_MAX_LINK_TOL);
|
||||
case TIPC_CMD_SET_LINK_PRI:
|
||||
return (new_value <= TIPC_MAX_LINK_PRI);
|
||||
case TIPC_CMD_SET_LINK_WINDOW:
|
||||
return (new_value >= TIPC_MIN_LINK_WIN) &&
|
||||
(new_value <= TIPC_MAX_LINK_WIN);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* link_cmd_set_value - change priority/tolerance/window for link/bearer/media
|
||||
* @net: the applicable net namespace
|
||||
* @name: ptr to link, bearer, or media name
|
||||
* @new_value: new value of link, bearer, or media setting
|
||||
* @cmd: which link, bearer, or media attribute to set (TIPC_CMD_SET_LINK_*)
|
||||
*
|
||||
* Caller must hold RTNL lock to ensure link/bearer/media is not deleted.
|
||||
*
|
||||
* Returns 0 if value updated and negative value on error.
|
||||
*/
|
||||
static int link_cmd_set_value(struct net *net, const char *name, u32 new_value,
|
||||
u16 cmd)
|
||||
{
|
||||
struct tipc_node *node;
|
||||
struct tipc_link *l_ptr;
|
||||
struct tipc_bearer *b_ptr;
|
||||
struct tipc_media *m_ptr;
|
||||
int bearer_id;
|
||||
int res = 0;
|
||||
|
||||
node = tipc_link_find_owner(net, name, &bearer_id);
|
||||
if (node) {
|
||||
tipc_node_lock(node);
|
||||
l_ptr = node->links[bearer_id];
|
||||
|
||||
if (l_ptr) {
|
||||
switch (cmd) {
|
||||
case TIPC_CMD_SET_LINK_TOL:
|
||||
link_set_supervision_props(l_ptr, new_value);
|
||||
tipc_link_proto_xmit(l_ptr, STATE_MSG, 0, 0,
|
||||
new_value, 0, 0);
|
||||
break;
|
||||
case TIPC_CMD_SET_LINK_PRI:
|
||||
l_ptr->priority = new_value;
|
||||
tipc_link_proto_xmit(l_ptr, STATE_MSG, 0, 0,
|
||||
0, new_value, 0);
|
||||
break;
|
||||
case TIPC_CMD_SET_LINK_WINDOW:
|
||||
tipc_link_set_queue_limits(l_ptr, new_value);
|
||||
break;
|
||||
default:
|
||||
res = -EINVAL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
tipc_node_unlock(node);
|
||||
return res;
|
||||
}
|
||||
|
||||
b_ptr = tipc_bearer_find(net, name);
|
||||
if (b_ptr) {
|
||||
switch (cmd) {
|
||||
case TIPC_CMD_SET_LINK_TOL:
|
||||
b_ptr->tolerance = new_value;
|
||||
break;
|
||||
case TIPC_CMD_SET_LINK_PRI:
|
||||
b_ptr->priority = new_value;
|
||||
break;
|
||||
case TIPC_CMD_SET_LINK_WINDOW:
|
||||
b_ptr->window = new_value;
|
||||
break;
|
||||
default:
|
||||
res = -EINVAL;
|
||||
break;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
m_ptr = tipc_media_find(name);
|
||||
if (!m_ptr)
|
||||
return -ENODEV;
|
||||
switch (cmd) {
|
||||
case TIPC_CMD_SET_LINK_TOL:
|
||||
m_ptr->tolerance = new_value;
|
||||
break;
|
||||
case TIPC_CMD_SET_LINK_PRI:
|
||||
m_ptr->priority = new_value;
|
||||
break;
|
||||
case TIPC_CMD_SET_LINK_WINDOW:
|
||||
m_ptr->window = new_value;
|
||||
break;
|
||||
default:
|
||||
res = -EINVAL;
|
||||
break;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
struct sk_buff *tipc_link_cmd_config(struct net *net, const void *req_tlv_area,
|
||||
int req_tlv_space, u16 cmd)
|
||||
{
|
||||
struct tipc_link_config *args;
|
||||
u32 new_value;
|
||||
int res;
|
||||
|
||||
if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_LINK_CONFIG))
|
||||
return tipc_cfg_reply_error_string(TIPC_CFG_TLV_ERROR);
|
||||
|
||||
args = (struct tipc_link_config *)TLV_DATA(req_tlv_area);
|
||||
new_value = ntohl(args->value);
|
||||
|
||||
if (!link_value_is_valid(cmd, new_value))
|
||||
return tipc_cfg_reply_error_string(
|
||||
"cannot change, value invalid");
|
||||
|
||||
if (!strcmp(args->name, tipc_bclink_name)) {
|
||||
if ((cmd == TIPC_CMD_SET_LINK_WINDOW) &&
|
||||
(tipc_bclink_set_queue_limits(net, new_value) == 0))
|
||||
return tipc_cfg_reply_none();
|
||||
return tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED
|
||||
" (cannot change setting on broadcast link)");
|
||||
}
|
||||
|
||||
res = link_cmd_set_value(net, args->name, new_value, cmd);
|
||||
if (res)
|
||||
return tipc_cfg_reply_error_string("cannot change link setting");
|
||||
|
||||
return tipc_cfg_reply_none();
|
||||
}
|
||||
|
||||
/**
|
||||
* link_reset_statistics - reset link statistics
|
||||
* @l_ptr: pointer to link
|
||||
@ -2216,7 +2072,7 @@ int tipc_nl_link_set(struct sk_buff *skb, struct genl_info *info)
|
||||
struct tipc_link *link;
|
||||
struct tipc_node *node;
|
||||
struct nlattr *attrs[TIPC_NLA_LINK_MAX + 1];
|
||||
struct net *net = genl_info_net(info);
|
||||
struct net *net = sock_net(skb->sk);
|
||||
|
||||
if (!info->attrs[TIPC_NLA_LINK])
|
||||
return -EINVAL;
|
||||
|
@ -215,8 +215,6 @@ void tipc_link_reset_fragments(struct tipc_link *l_ptr);
|
||||
int tipc_link_is_up(struct tipc_link *l_ptr);
|
||||
int tipc_link_is_active(struct tipc_link *l_ptr);
|
||||
void tipc_link_purge_queues(struct tipc_link *l_ptr);
|
||||
struct sk_buff *tipc_link_cmd_config(struct net *net, const void *req_tlv_area,
|
||||
int req_tlv_space, u16 cmd);
|
||||
struct sk_buff *tipc_link_cmd_reset_stats(struct net *net,
|
||||
const void *req_tlv_area,
|
||||
int req_tlv_space);
|
||||
|
@ -569,6 +569,43 @@ static int tipc_nl_compat_link_dump(struct tipc_nl_compat_msg *msg,
|
||||
&link_info, sizeof(link_info));
|
||||
}
|
||||
|
||||
static int tipc_nl_compat_link_set(struct sk_buff *skb,
|
||||
struct tipc_nl_compat_msg *msg)
|
||||
{
|
||||
struct nlattr *link;
|
||||
struct nlattr *prop;
|
||||
struct tipc_link_config *lc;
|
||||
|
||||
lc = (struct tipc_link_config *)TLV_DATA(msg->req);
|
||||
|
||||
link = nla_nest_start(skb, TIPC_NLA_LINK);
|
||||
if (!link)
|
||||
return -EMSGSIZE;
|
||||
|
||||
if (nla_put_string(skb, TIPC_NLA_LINK_NAME, lc->name))
|
||||
return -EMSGSIZE;
|
||||
|
||||
prop = nla_nest_start(skb, TIPC_NLA_LINK_PROP);
|
||||
if (!prop)
|
||||
return -EMSGSIZE;
|
||||
|
||||
if (msg->cmd == TIPC_CMD_SET_LINK_PRI) {
|
||||
if (nla_put_u32(skb, TIPC_NLA_PROP_PRIO, ntohl(lc->value)))
|
||||
return -EMSGSIZE;
|
||||
} else if (msg->cmd == TIPC_CMD_SET_LINK_TOL) {
|
||||
if (nla_put_u32(skb, TIPC_NLA_PROP_TOL, ntohl(lc->value)))
|
||||
return -EMSGSIZE;
|
||||
} else if (msg->cmd == TIPC_CMD_SET_LINK_WINDOW) {
|
||||
if (nla_put_u32(skb, TIPC_NLA_PROP_WIN, ntohl(lc->value)))
|
||||
return -EMSGSIZE;
|
||||
}
|
||||
|
||||
nla_nest_end(skb, prop);
|
||||
nla_nest_end(skb, link);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tipc_nl_compat_handle(struct tipc_nl_compat_msg *msg)
|
||||
{
|
||||
struct tipc_nl_compat_cmd_dump dump;
|
||||
@ -606,6 +643,13 @@ static int tipc_nl_compat_handle(struct tipc_nl_compat_msg *msg)
|
||||
dump.dumpit = tipc_nl_link_dump;
|
||||
dump.format = tipc_nl_compat_link_dump;
|
||||
return tipc_nl_compat_dumpit(&dump, msg);
|
||||
case TIPC_CMD_SET_LINK_TOL:
|
||||
case TIPC_CMD_SET_LINK_PRI:
|
||||
case TIPC_CMD_SET_LINK_WINDOW:
|
||||
msg->req_type = TIPC_TLV_LINK_CONFIG;
|
||||
doit.doit = tipc_nl_link_set;
|
||||
doit.transcode = tipc_nl_compat_link_set;
|
||||
return tipc_nl_compat_doit(&doit, msg);
|
||||
}
|
||||
|
||||
return -EOPNOTSUPP;
|
||||
@ -707,6 +751,9 @@ static int tipc_nl_compat_tmp_wrap(struct sk_buff *skb, struct genl_info *info)
|
||||
case TIPC_CMD_DISABLE_BEARER:
|
||||
case TIPC_CMD_SHOW_LINK_STATS:
|
||||
case TIPC_CMD_GET_LINKS:
|
||||
case TIPC_CMD_SET_LINK_TOL:
|
||||
case TIPC_CMD_SET_LINK_PRI:
|
||||
case TIPC_CMD_SET_LINK_WINDOW:
|
||||
return tipc_nl_compat_recv(skb, info);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user