tipc: add bearer disable/enable to new netlink api
A new netlink API for tipc that can disable or enable a tipc bearer. The new API is separated from the old API because of a bug in the user space client (tipc-config). The problem is that older versions of tipc-config has a very low receive limit and adding commands to the legacy genl_opts struct causes the ctrl_getfamily() response message to grow, subsequently breaking the tool. The new API utilizes netlink policies for input validation. Where the top-level netlink attributes are tipc-logical entities, like bearer. The top level entities then contain nested attributes. In this case a name, nested link properties and a domain. Netlink commands implemented in this patch: TIPC_NL_BEARER_ENABLE TIPC_NL_BEARER_DISABLE Netlink logical layout of bearer enable message: -> bearer -> name [ -> domain ] [ -> properties -> priority ] Netlink logical layout of bearer disable message: -> bearer -> name Signed-off-by: Richard Alpe <richard.alpe@ericsson.com> Reviewed-by: Erik Hugne <erik.hugne@ericsson.com> Reviewed-by: Jon Maloy <jon.maloy@ericsson.com> Acked-by: Ying Xue <ying.xue@windriver.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
7cc76f5150
commit
0655f6a863
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* net/tipc/netlink.c: TIPC configuration handling
|
||||
*
|
||||
* Copyright (c) 2005-2006, Ericsson AB
|
||||
* Copyright (c) 2005-2006, 2014, Ericsson AB
|
||||
* Copyright (c) 2005-2007, Wind River Systems
|
||||
* All rights reserved.
|
||||
*
|
||||
@@ -36,6 +36,7 @@
|
||||
|
||||
#include "core.h"
|
||||
#include "config.h"
|
||||
#include "bearer.h"
|
||||
#include <net/genetlink.h>
|
||||
|
||||
static int handle_cmd(struct sk_buff *skb, struct genl_info *info)
|
||||
@@ -68,6 +69,12 @@ static int handle_cmd(struct sk_buff *skb, struct genl_info *info)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct nla_policy tipc_nl_policy[TIPC_NLA_MAX + 1] = {
|
||||
[TIPC_NLA_UNSPEC] = { .type = NLA_UNSPEC, },
|
||||
[TIPC_NLA_BEARER] = { .type = NLA_NESTED, },
|
||||
};
|
||||
|
||||
/* Legacy ASCII API */
|
||||
static struct genl_family tipc_genl_family = {
|
||||
.id = GENL_ID_GENERATE,
|
||||
.name = TIPC_GENL_NAME,
|
||||
@@ -76,6 +83,7 @@ static struct genl_family tipc_genl_family = {
|
||||
.maxattr = 0,
|
||||
};
|
||||
|
||||
/* Legacy ASCII API */
|
||||
static struct genl_ops tipc_genl_ops[] = {
|
||||
{
|
||||
.cmd = TIPC_GENL_CMD,
|
||||
@@ -83,11 +91,42 @@ static struct genl_ops tipc_genl_ops[] = {
|
||||
},
|
||||
};
|
||||
|
||||
/* Users of the legacy API (tipc-config) can't handle that we add operations,
|
||||
* so we have a separate genl handling for the new API.
|
||||
*/
|
||||
struct genl_family tipc_genl_v2_family = {
|
||||
.id = GENL_ID_GENERATE,
|
||||
.name = TIPC_GENL_V2_NAME,
|
||||
.version = TIPC_GENL_V2_VERSION,
|
||||
.hdrsize = 0,
|
||||
.maxattr = TIPC_NLA_MAX,
|
||||
};
|
||||
|
||||
static const struct genl_ops tipc_genl_v2_ops[] = {
|
||||
{
|
||||
.cmd = TIPC_NL_BEARER_DISABLE,
|
||||
.doit = tipc_nl_bearer_disable,
|
||||
.policy = tipc_nl_policy,
|
||||
},
|
||||
{
|
||||
.cmd = TIPC_NL_BEARER_ENABLE,
|
||||
.doit = tipc_nl_bearer_enable,
|
||||
.policy = tipc_nl_policy,
|
||||
}
|
||||
};
|
||||
|
||||
int tipc_netlink_start(void)
|
||||
{
|
||||
int res;
|
||||
|
||||
res = genl_register_family_with_ops(&tipc_genl_family, tipc_genl_ops);
|
||||
if (res) {
|
||||
pr_err("Failed to register legacy interface\n");
|
||||
return res;
|
||||
}
|
||||
|
||||
res = genl_register_family_with_ops(&tipc_genl_v2_family,
|
||||
tipc_genl_v2_ops);
|
||||
if (res) {
|
||||
pr_err("Failed to register netlink interface\n");
|
||||
return res;
|
||||
@@ -98,4 +137,5 @@ int tipc_netlink_start(void)
|
||||
void tipc_netlink_stop(void)
|
||||
{
|
||||
genl_unregister_family(&tipc_genl_family);
|
||||
genl_unregister_family(&tipc_genl_v2_family);
|
||||
}
|
||||
|
Reference in New Issue
Block a user