2006-01-03 02:04:38 +08:00
|
|
|
/*
|
|
|
|
* net/tipc/netlink.c: TIPC configuration handling
|
2007-02-09 22:25:21 +08:00
|
|
|
*
|
2014-11-20 17:29:07 +08:00
|
|
|
* Copyright (c) 2005-2006, 2014, Ericsson AB
|
2008-05-22 05:52:30 +08:00
|
|
|
* Copyright (c) 2005-2007, Wind River Systems
|
2006-01-03 02:04:38 +08:00
|
|
|
* All rights reserved.
|
|
|
|
*
|
2006-01-11 20:30:43 +08:00
|
|
|
* Redistribution and use in source and binary forms, with or without
|
2006-01-03 02:04:38 +08:00
|
|
|
* modification, are permitted provided that the following conditions are met:
|
|
|
|
*
|
2006-01-11 20:30:43 +08:00
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
* 3. Neither the names of the copyright holders nor the names of its
|
|
|
|
* contributors may be used to endorse or promote products derived from
|
|
|
|
* this software without specific prior written permission.
|
2006-01-03 02:04:38 +08:00
|
|
|
*
|
2006-01-11 20:30:43 +08:00
|
|
|
* Alternatively, this software may be distributed under the terms of the
|
|
|
|
* GNU General Public License ("GPL") version 2 as published by the Free
|
|
|
|
* Software Foundation.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
|
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
|
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
|
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
|
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
|
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
2006-01-03 02:04:38 +08:00
|
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "core.h"
|
2014-11-20 17:29:10 +08:00
|
|
|
#include "socket.h"
|
2014-11-20 17:29:20 +08:00
|
|
|
#include "name_table.h"
|
2014-11-20 17:29:07 +08:00
|
|
|
#include "bearer.h"
|
2014-11-20 17:29:12 +08:00
|
|
|
#include "link.h"
|
2014-11-20 17:29:17 +08:00
|
|
|
#include "node.h"
|
2014-11-20 17:29:18 +08:00
|
|
|
#include "net.h"
|
2016-08-26 16:52:56 +08:00
|
|
|
#include "udp_media.h"
|
2006-01-03 02:04:38 +08:00
|
|
|
#include <net/genetlink.h>
|
|
|
|
|
2014-11-20 17:29:07 +08:00
|
|
|
static const struct nla_policy tipc_nl_policy[TIPC_NLA_MAX + 1] = {
|
|
|
|
[TIPC_NLA_UNSPEC] = { .type = NLA_UNSPEC, },
|
|
|
|
[TIPC_NLA_BEARER] = { .type = NLA_NESTED, },
|
2014-11-20 17:29:10 +08:00
|
|
|
[TIPC_NLA_SOCK] = { .type = NLA_NESTED, },
|
2014-11-20 17:29:12 +08:00
|
|
|
[TIPC_NLA_PUBL] = { .type = NLA_NESTED, },
|
|
|
|
[TIPC_NLA_LINK] = { .type = NLA_NESTED, },
|
2014-11-20 17:29:15 +08:00
|
|
|
[TIPC_NLA_MEDIA] = { .type = NLA_NESTED, },
|
2014-11-20 17:29:18 +08:00
|
|
|
[TIPC_NLA_NODE] = { .type = NLA_NESTED, },
|
2014-11-20 17:29:20 +08:00
|
|
|
[TIPC_NLA_NET] = { .type = NLA_NESTED, },
|
2016-07-26 14:47:19 +08:00
|
|
|
[TIPC_NLA_NAME_TABLE] = { .type = NLA_NESTED, },
|
|
|
|
[TIPC_NLA_MON] = { .type = NLA_NESTED, },
|
2014-11-20 17:29:07 +08:00
|
|
|
};
|
|
|
|
|
2016-03-05 00:04:42 +08:00
|
|
|
const struct nla_policy
|
|
|
|
tipc_nl_name_table_policy[TIPC_NLA_NAME_TABLE_MAX + 1] = {
|
|
|
|
[TIPC_NLA_NAME_TABLE_UNSPEC] = { .type = NLA_UNSPEC },
|
|
|
|
[TIPC_NLA_NAME_TABLE_PUBL] = { .type = NLA_NESTED }
|
|
|
|
};
|
|
|
|
|
2016-07-26 14:47:19 +08:00
|
|
|
const struct nla_policy tipc_nl_monitor_policy[TIPC_NLA_MON_MAX + 1] = {
|
|
|
|
[TIPC_NLA_MON_UNSPEC] = { .type = NLA_UNSPEC },
|
2016-07-26 14:47:22 +08:00
|
|
|
[TIPC_NLA_MON_REF] = { .type = NLA_U32 },
|
2016-07-26 14:47:19 +08:00
|
|
|
[TIPC_NLA_MON_ACTIVATION_THRESHOLD] = { .type = NLA_U32 },
|
|
|
|
};
|
|
|
|
|
2016-03-05 00:04:42 +08:00
|
|
|
const struct nla_policy tipc_nl_sock_policy[TIPC_NLA_SOCK_MAX + 1] = {
|
|
|
|
[TIPC_NLA_SOCK_UNSPEC] = { .type = NLA_UNSPEC },
|
|
|
|
[TIPC_NLA_SOCK_ADDR] = { .type = NLA_U32 },
|
|
|
|
[TIPC_NLA_SOCK_REF] = { .type = NLA_U32 },
|
|
|
|
[TIPC_NLA_SOCK_CON] = { .type = NLA_NESTED },
|
|
|
|
[TIPC_NLA_SOCK_HAS_PUBL] = { .type = NLA_FLAG }
|
|
|
|
};
|
|
|
|
|
|
|
|
const struct nla_policy tipc_nl_net_policy[TIPC_NLA_NET_MAX + 1] = {
|
|
|
|
[TIPC_NLA_NET_UNSPEC] = { .type = NLA_UNSPEC },
|
2018-04-16 23:29:42 +08:00
|
|
|
[TIPC_NLA_NET_ID] = { .type = NLA_U32 },
|
|
|
|
[TIPC_NLA_NET_ADDR] = { .type = NLA_U32 },
|
2018-04-16 23:29:43 +08:00
|
|
|
[TIPC_NLA_NET_NODEID] = { .type = NLA_U64 },
|
|
|
|
[TIPC_NLA_NET_NODEID_W1] = { .type = NLA_U64 },
|
2016-03-05 00:04:42 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
const struct nla_policy tipc_nl_link_policy[TIPC_NLA_LINK_MAX + 1] = {
|
|
|
|
[TIPC_NLA_LINK_UNSPEC] = { .type = NLA_UNSPEC },
|
|
|
|
[TIPC_NLA_LINK_NAME] = { .type = NLA_STRING,
|
|
|
|
.len = TIPC_MAX_LINK_NAME },
|
|
|
|
[TIPC_NLA_LINK_MTU] = { .type = NLA_U32 },
|
|
|
|
[TIPC_NLA_LINK_BROADCAST] = { .type = NLA_FLAG },
|
|
|
|
[TIPC_NLA_LINK_UP] = { .type = NLA_FLAG },
|
|
|
|
[TIPC_NLA_LINK_ACTIVE] = { .type = NLA_FLAG },
|
|
|
|
[TIPC_NLA_LINK_PROP] = { .type = NLA_NESTED },
|
|
|
|
[TIPC_NLA_LINK_STATS] = { .type = NLA_NESTED },
|
|
|
|
[TIPC_NLA_LINK_RX] = { .type = NLA_U32 },
|
|
|
|
[TIPC_NLA_LINK_TX] = { .type = NLA_U32 }
|
|
|
|
};
|
|
|
|
|
|
|
|
const struct nla_policy tipc_nl_node_policy[TIPC_NLA_NODE_MAX + 1] = {
|
|
|
|
[TIPC_NLA_NODE_UNSPEC] = { .type = NLA_UNSPEC },
|
|
|
|
[TIPC_NLA_NODE_ADDR] = { .type = NLA_U32 },
|
|
|
|
[TIPC_NLA_NODE_UP] = { .type = NLA_FLAG }
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Properties valid for media, bearer and link */
|
|
|
|
const struct nla_policy tipc_nl_prop_policy[TIPC_NLA_PROP_MAX + 1] = {
|
|
|
|
[TIPC_NLA_PROP_UNSPEC] = { .type = NLA_UNSPEC },
|
|
|
|
[TIPC_NLA_PROP_PRIO] = { .type = NLA_U32 },
|
|
|
|
[TIPC_NLA_PROP_TOL] = { .type = NLA_U32 },
|
tipc: support broadcast/replicast configurable for bc-link
Currently, a multicast stream uses either broadcast or replicast as
transmission method, based on the ratio between number of actual
destinations nodes and cluster size.
However, when an L2 interface (e.g., VXLAN) provides pseudo
broadcast support, this becomes very inefficient, as it blindly
replicates multicast packets to all cluster/subnet nodes,
irrespective of whether they host actual target sockets or not.
The TIPC multicast algorithm is able to distinguish real destination
nodes from other nodes, and hence provides a smarter and more
efficient method for transferring multicast messages than
pseudo broadcast can do.
Because of this, we now make it possible for users to force
the broadcast link to permanently switch to using replicast,
irrespective of which capabilities the bearer provides,
or pretend to provide.
Conversely, we also make it possible to force the broadcast link
to always use true broadcast. While maybe less useful in
deployed systems, this may at least be useful for testing the
broadcast algorithm in small clusters.
We retain the current AUTOSELECT ability, i.e., to let the broadcast link
automatically select which algorithm to use, and to switch back and forth
between broadcast and replicast as the ratio between destination
node number and cluster size changes. This remains the default method.
Furthermore, we make it possible to configure the threshold ratio for
such switches. The default ratio is now set to 10%, down from 25% in the
earlier implementation.
Acked-by: Jon Maloy <jon.maloy@ericsson.com>
Signed-off-by: Hoang Le <hoang.h.le@dektech.com.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
2019-03-19 19:49:48 +08:00
|
|
|
[TIPC_NLA_PROP_WIN] = { .type = NLA_U32 },
|
|
|
|
[TIPC_NLA_PROP_BROADCAST] = { .type = NLA_U32 },
|
|
|
|
[TIPC_NLA_PROP_BROADCAST_RATIO] = { .type = NLA_U32 }
|
2016-03-05 00:04:42 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
const struct nla_policy tipc_nl_bearer_policy[TIPC_NLA_BEARER_MAX + 1] = {
|
|
|
|
[TIPC_NLA_BEARER_UNSPEC] = { .type = NLA_UNSPEC },
|
|
|
|
[TIPC_NLA_BEARER_NAME] = { .type = NLA_STRING,
|
|
|
|
.len = TIPC_MAX_BEARER_NAME },
|
|
|
|
[TIPC_NLA_BEARER_PROP] = { .type = NLA_NESTED },
|
|
|
|
[TIPC_NLA_BEARER_DOMAIN] = { .type = NLA_U32 }
|
|
|
|
};
|
|
|
|
|
|
|
|
const struct nla_policy tipc_nl_media_policy[TIPC_NLA_MEDIA_MAX + 1] = {
|
|
|
|
[TIPC_NLA_MEDIA_UNSPEC] = { .type = NLA_UNSPEC },
|
|
|
|
[TIPC_NLA_MEDIA_NAME] = { .type = NLA_STRING },
|
|
|
|
[TIPC_NLA_MEDIA_PROP] = { .type = NLA_NESTED }
|
|
|
|
};
|
|
|
|
|
|
|
|
const struct nla_policy tipc_nl_udp_policy[TIPC_NLA_UDP_MAX + 1] = {
|
|
|
|
[TIPC_NLA_UDP_UNSPEC] = {.type = NLA_UNSPEC},
|
|
|
|
[TIPC_NLA_UDP_LOCAL] = {.type = NLA_BINARY,
|
|
|
|
.len = sizeof(struct sockaddr_storage)},
|
|
|
|
[TIPC_NLA_UDP_REMOTE] = {.type = NLA_BINARY,
|
|
|
|
.len = sizeof(struct sockaddr_storage)},
|
|
|
|
};
|
|
|
|
|
2014-11-20 17:29:07 +08:00
|
|
|
/* 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.
|
|
|
|
*/
|
|
|
|
static const struct genl_ops tipc_genl_v2_ops[] = {
|
|
|
|
{
|
|
|
|
.cmd = TIPC_NL_BEARER_DISABLE,
|
2019-04-26 20:07:31 +08:00
|
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
2014-11-20 17:29:07 +08:00
|
|
|
.doit = tipc_nl_bearer_disable,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.cmd = TIPC_NL_BEARER_ENABLE,
|
2019-04-26 20:07:31 +08:00
|
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
2014-11-20 17:29:07 +08:00
|
|
|
.doit = tipc_nl_bearer_enable,
|
2014-11-20 17:29:08 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
.cmd = TIPC_NL_BEARER_GET,
|
2019-04-26 20:07:31 +08:00
|
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
2014-11-20 17:29:08 +08:00
|
|
|
.doit = tipc_nl_bearer_get,
|
|
|
|
.dumpit = tipc_nl_bearer_dump,
|
2014-11-20 17:29:09 +08:00
|
|
|
},
|
2016-08-26 16:52:53 +08:00
|
|
|
{
|
|
|
|
.cmd = TIPC_NL_BEARER_ADD,
|
2019-04-26 20:07:31 +08:00
|
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
2016-08-26 16:52:53 +08:00
|
|
|
.doit = tipc_nl_bearer_add,
|
|
|
|
},
|
2014-11-20 17:29:09 +08:00
|
|
|
{
|
|
|
|
.cmd = TIPC_NL_BEARER_SET,
|
2019-04-26 20:07:31 +08:00
|
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
2014-11-20 17:29:09 +08:00
|
|
|
.doit = tipc_nl_bearer_set,
|
2014-11-20 17:29:10 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
.cmd = TIPC_NL_SOCK_GET,
|
2019-04-26 20:07:31 +08:00
|
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
2018-08-25 03:28:06 +08:00
|
|
|
.start = tipc_dump_start,
|
2014-11-20 17:29:10 +08:00
|
|
|
.dumpit = tipc_nl_sk_dump,
|
2018-08-25 03:28:06 +08:00
|
|
|
.done = tipc_dump_done,
|
2014-11-20 17:29:11 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
.cmd = TIPC_NL_PUBL_GET,
|
2019-04-26 20:07:31 +08:00
|
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
2014-11-20 17:29:11 +08:00
|
|
|
.dumpit = tipc_nl_publ_dump,
|
2014-11-20 17:29:12 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
.cmd = TIPC_NL_LINK_GET,
|
2019-04-26 20:07:31 +08:00
|
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
2015-11-20 03:30:45 +08:00
|
|
|
.doit = tipc_nl_node_get_link,
|
2015-11-20 03:30:46 +08:00
|
|
|
.dumpit = tipc_nl_node_dump_link,
|
2014-11-20 17:29:13 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
.cmd = TIPC_NL_LINK_SET,
|
2019-04-26 20:07:31 +08:00
|
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
2015-11-20 03:30:45 +08:00
|
|
|
.doit = tipc_nl_node_set_link,
|
2014-11-20 17:29:14 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
.cmd = TIPC_NL_LINK_RESET_STATS,
|
2019-04-26 20:07:31 +08:00
|
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
2015-11-20 03:30:45 +08:00
|
|
|
.doit = tipc_nl_node_reset_link_stats,
|
2014-11-20 17:29:15 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
.cmd = TIPC_NL_MEDIA_GET,
|
2019-04-26 20:07:31 +08:00
|
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
2014-11-20 17:29:15 +08:00
|
|
|
.doit = tipc_nl_media_get,
|
|
|
|
.dumpit = tipc_nl_media_dump,
|
2014-11-20 17:29:16 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
.cmd = TIPC_NL_MEDIA_SET,
|
2019-04-26 20:07:31 +08:00
|
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
2014-11-20 17:29:16 +08:00
|
|
|
.doit = tipc_nl_media_set,
|
2014-11-20 17:29:17 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
.cmd = TIPC_NL_NODE_GET,
|
2019-04-26 20:07:31 +08:00
|
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
2014-11-20 17:29:17 +08:00
|
|
|
.dumpit = tipc_nl_node_dump,
|
2014-11-20 17:29:18 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
.cmd = TIPC_NL_NET_GET,
|
2019-04-26 20:07:31 +08:00
|
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
2014-11-20 17:29:18 +08:00
|
|
|
.dumpit = tipc_nl_net_dump,
|
2014-11-20 17:29:19 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
.cmd = TIPC_NL_NET_SET,
|
2019-04-26 20:07:31 +08:00
|
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
2014-11-20 17:29:19 +08:00
|
|
|
.doit = tipc_nl_net_set,
|
2014-11-20 17:29:20 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
.cmd = TIPC_NL_NAME_TABLE_GET,
|
2019-04-26 20:07:31 +08:00
|
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
2014-11-20 17:29:20 +08:00
|
|
|
.dumpit = tipc_nl_name_table_dump,
|
2016-07-26 14:47:19 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
.cmd = TIPC_NL_MON_SET,
|
2019-04-26 20:07:31 +08:00
|
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
2016-07-26 14:47:19 +08:00
|
|
|
.doit = tipc_nl_node_set_monitor,
|
|
|
|
},
|
2016-07-26 14:47:20 +08:00
|
|
|
{
|
|
|
|
.cmd = TIPC_NL_MON_GET,
|
2019-04-26 20:07:31 +08:00
|
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
2016-07-26 14:47:20 +08:00
|
|
|
.doit = tipc_nl_node_get_monitor,
|
2016-07-26 14:47:22 +08:00
|
|
|
.dumpit = tipc_nl_node_dump_monitor,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.cmd = TIPC_NL_MON_PEER_GET,
|
2019-04-26 20:07:31 +08:00
|
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
2016-07-26 14:47:22 +08:00
|
|
|
.dumpit = tipc_nl_node_dump_monitor_peer,
|
2016-07-26 14:47:20 +08:00
|
|
|
},
|
2016-08-18 16:33:52 +08:00
|
|
|
{
|
|
|
|
.cmd = TIPC_NL_PEER_REMOVE,
|
2019-04-26 20:07:31 +08:00
|
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
2016-08-18 16:33:52 +08:00
|
|
|
.doit = tipc_nl_peer_rm,
|
2016-08-26 16:52:56 +08:00
|
|
|
},
|
|
|
|
#ifdef CONFIG_TIPC_MEDIA_UDP
|
|
|
|
{
|
|
|
|
.cmd = TIPC_NL_UDP_GET_REMOTEIP,
|
2019-04-26 20:07:31 +08:00
|
|
|
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
2016-08-26 16:52:56 +08:00
|
|
|
.dumpit = tipc_udp_nl_dump_remoteip,
|
|
|
|
},
|
|
|
|
#endif
|
2014-11-20 17:29:07 +08:00
|
|
|
};
|
|
|
|
|
2016-10-24 20:40:05 +08:00
|
|
|
struct genl_family tipc_genl_family __ro_after_init = {
|
2016-10-24 20:40:03 +08:00
|
|
|
.name = TIPC_GENL_V2_NAME,
|
|
|
|
.version = TIPC_GENL_V2_VERSION,
|
|
|
|
.hdrsize = 0,
|
|
|
|
.maxattr = TIPC_NLA_MAX,
|
genetlink: make policy common to family
Since maxattr is common, the policy can't really differ sanely,
so make it common as well.
The only user that did in fact manage to make a non-common policy
is taskstats, which has to be really careful about it (since it's
still using a common maxattr!). This is no longer supported, but
we can fake it using pre_doit.
This reduces the size of e.g. nl80211.o (which has lots of commands):
text data bss dec hex filename
398745 14323 2240 415308 6564c net/wireless/nl80211.o (before)
397913 14331 2240 414484 65314 net/wireless/nl80211.o (after)
--------------------------------
-832 +8 0 -824
Which is obviously just 8 bytes for each command, and an added 8
bytes for the new policy pointer. I'm not sure why the ops list is
counted as .text though.
Most of the code transformations were done using the following spatch:
@ops@
identifier OPS;
expression POLICY;
@@
struct genl_ops OPS[] = {
...,
{
- .policy = POLICY,
},
...
};
@@
identifier ops.OPS;
expression ops.POLICY;
identifier fam;
expression M;
@@
struct genl_family fam = {
.ops = OPS,
.maxattr = M,
+ .policy = POLICY,
...
};
This also gets rid of devlink_nl_cmd_region_read_dumpit() accessing
the cb->data as ops, which we want to change in a later genl patch.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2019-03-22 05:51:02 +08:00
|
|
|
.policy = tipc_nl_policy,
|
2016-10-24 20:40:03 +08:00
|
|
|
.netnsok = true,
|
|
|
|
.module = THIS_MODULE,
|
|
|
|
.ops = tipc_genl_v2_ops,
|
|
|
|
.n_ops = ARRAY_SIZE(tipc_genl_v2_ops),
|
|
|
|
};
|
|
|
|
|
2014-11-20 17:29:11 +08:00
|
|
|
int tipc_nlmsg_parse(const struct nlmsghdr *nlh, struct nlattr ***attr)
|
|
|
|
{
|
2015-02-09 16:50:03 +08:00
|
|
|
u32 maxattr = tipc_genl_family.maxattr;
|
2014-11-20 17:29:11 +08:00
|
|
|
|
2016-10-24 20:40:01 +08:00
|
|
|
*attr = genl_family_attrbuf(&tipc_genl_family);
|
2014-11-20 17:29:11 +08:00
|
|
|
if (!*attr)
|
|
|
|
return -EOPNOTSUPP;
|
|
|
|
|
netlink: make validation more configurable for future strictness
We currently have two levels of strict validation:
1) liberal (default)
- undefined (type >= max) & NLA_UNSPEC attributes accepted
- attribute length >= expected accepted
- garbage at end of message accepted
2) strict (opt-in)
- NLA_UNSPEC attributes accepted
- attribute length >= expected accepted
Split out parsing strictness into four different options:
* TRAILING - check that there's no trailing data after parsing
attributes (in message or nested)
* MAXTYPE - reject attrs > max known type
* UNSPEC - reject attributes with NLA_UNSPEC policy entries
* STRICT_ATTRS - strictly validate attribute size
The default for future things should be *everything*.
The current *_strict() is a combination of TRAILING and MAXTYPE,
and is renamed to _deprecated_strict().
The current regular parsing has none of this, and is renamed to
*_parse_deprecated().
Additionally it allows us to selectively set one of the new flags
even on old policies. Notably, the UNSPEC flag could be useful in
this case, since it can be arranged (by filling in the policy) to
not be an incompatible userspace ABI change, but would then going
forward prevent forgetting attribute entries. Similar can apply
to the POLICY flag.
We end up with the following renames:
* nla_parse -> nla_parse_deprecated
* nla_parse_strict -> nla_parse_deprecated_strict
* nlmsg_parse -> nlmsg_parse_deprecated
* nlmsg_parse_strict -> nlmsg_parse_deprecated_strict
* nla_parse_nested -> nla_parse_nested_deprecated
* nla_validate_nested -> nla_validate_nested_deprecated
Using spatch, of course:
@@
expression TB, MAX, HEAD, LEN, POL, EXT;
@@
-nla_parse(TB, MAX, HEAD, LEN, POL, EXT)
+nla_parse_deprecated(TB, MAX, HEAD, LEN, POL, EXT)
@@
expression NLH, HDRLEN, TB, MAX, POL, EXT;
@@
-nlmsg_parse(NLH, HDRLEN, TB, MAX, POL, EXT)
+nlmsg_parse_deprecated(NLH, HDRLEN, TB, MAX, POL, EXT)
@@
expression NLH, HDRLEN, TB, MAX, POL, EXT;
@@
-nlmsg_parse_strict(NLH, HDRLEN, TB, MAX, POL, EXT)
+nlmsg_parse_deprecated_strict(NLH, HDRLEN, TB, MAX, POL, EXT)
@@
expression TB, MAX, NLA, POL, EXT;
@@
-nla_parse_nested(TB, MAX, NLA, POL, EXT)
+nla_parse_nested_deprecated(TB, MAX, NLA, POL, EXT)
@@
expression START, MAX, POL, EXT;
@@
-nla_validate_nested(START, MAX, POL, EXT)
+nla_validate_nested_deprecated(START, MAX, POL, EXT)
@@
expression NLH, HDRLEN, MAX, POL, EXT;
@@
-nlmsg_validate(NLH, HDRLEN, MAX, POL, EXT)
+nlmsg_validate_deprecated(NLH, HDRLEN, MAX, POL, EXT)
For this patch, don't actually add the strict, non-renamed versions
yet so that it breaks compile if I get it wrong.
Also, while at it, make nla_validate and nla_parse go down to a
common __nla_validate_parse() function to avoid code duplication.
Ultimately, this allows us to have very strict validation for every
new caller of nla_parse()/nlmsg_parse() etc as re-introduced in the
next patch, while existing things will continue to work as is.
In effect then, this adds fully strict validation for any new command.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2019-04-26 20:07:28 +08:00
|
|
|
return nlmsg_parse_deprecated(nlh, GENL_HDRLEN, *attr, maxattr,
|
|
|
|
tipc_nl_policy, NULL);
|
2014-11-20 17:29:11 +08:00
|
|
|
}
|
|
|
|
|
2016-10-24 20:40:05 +08:00
|
|
|
int __init tipc_netlink_start(void)
|
2006-01-03 02:04:38 +08:00
|
|
|
{
|
2009-05-21 18:34:05 +08:00
|
|
|
int res;
|
2006-01-11 02:54:24 +08:00
|
|
|
|
2016-10-24 20:40:03 +08:00
|
|
|
res = genl_register_family(&tipc_genl_family);
|
2009-05-21 18:34:05 +08:00
|
|
|
if (res) {
|
2012-06-29 12:16:37 +08:00
|
|
|
pr_err("Failed to register netlink interface\n");
|
2009-05-21 18:34:05 +08:00
|
|
|
return res;
|
|
|
|
}
|
2007-02-09 22:25:21 +08:00
|
|
|
return 0;
|
2006-01-03 02:04:38 +08:00
|
|
|
}
|
|
|
|
|
2006-01-18 07:38:21 +08:00
|
|
|
void tipc_netlink_stop(void)
|
2006-01-03 02:04:38 +08:00
|
|
|
{
|
2009-05-21 18:34:05 +08:00
|
|
|
genl_unregister_family(&tipc_genl_family);
|
2006-01-03 02:04:38 +08:00
|
|
|
}
|