xref: /linux/net/tipc/netlink.c (revision ca55b2fef3a9373fcfc30f82fd26bc7fccbda732)
1 /*
2  * net/tipc/netlink.c: TIPC configuration handling
3  *
4  * Copyright (c) 2005-2006, 2014, Ericsson AB
5  * Copyright (c) 2005-2007, Wind River Systems
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions are met:
10  *
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. Neither the names of the copyright holders nor the names of its
17  *    contributors may be used to endorse or promote products derived from
18  *    this software without specific prior written permission.
19  *
20  * Alternatively, this software may be distributed under the terms of the
21  * GNU General Public License ("GPL") version 2 as published by the Free
22  * Software Foundation.
23  *
24  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
28  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
32  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34  * POSSIBILITY OF SUCH DAMAGE.
35  */
36 
37 #include "core.h"
38 #include "socket.h"
39 #include "name_table.h"
40 #include "bearer.h"
41 #include "link.h"
42 #include "node.h"
43 #include "net.h"
44 #include <net/genetlink.h>
45 
46 static const struct nla_policy tipc_nl_policy[TIPC_NLA_MAX + 1] = {
47 	[TIPC_NLA_UNSPEC]	= { .type = NLA_UNSPEC, },
48 	[TIPC_NLA_BEARER]	= { .type = NLA_NESTED, },
49 	[TIPC_NLA_SOCK]		= { .type = NLA_NESTED, },
50 	[TIPC_NLA_PUBL]		= { .type = NLA_NESTED, },
51 	[TIPC_NLA_LINK]		= { .type = NLA_NESTED, },
52 	[TIPC_NLA_MEDIA]	= { .type = NLA_NESTED, },
53 	[TIPC_NLA_NODE]		= { .type = NLA_NESTED, },
54 	[TIPC_NLA_NET]		= { .type = NLA_NESTED, },
55 	[TIPC_NLA_NAME_TABLE]	= { .type = NLA_NESTED, }
56 };
57 
58 /* Users of the legacy API (tipc-config) can't handle that we add operations,
59  * so we have a separate genl handling for the new API.
60  */
61 struct genl_family tipc_genl_family = {
62 	.id		= GENL_ID_GENERATE,
63 	.name		= TIPC_GENL_V2_NAME,
64 	.version	= TIPC_GENL_V2_VERSION,
65 	.hdrsize	= 0,
66 	.maxattr	= TIPC_NLA_MAX,
67 	.netnsok	= true,
68 };
69 
70 static const struct genl_ops tipc_genl_v2_ops[] = {
71 	{
72 		.cmd	= TIPC_NL_BEARER_DISABLE,
73 		.doit	= tipc_nl_bearer_disable,
74 		.policy = tipc_nl_policy,
75 	},
76 	{
77 		.cmd	= TIPC_NL_BEARER_ENABLE,
78 		.doit	= tipc_nl_bearer_enable,
79 		.policy = tipc_nl_policy,
80 	},
81 	{
82 		.cmd	= TIPC_NL_BEARER_GET,
83 		.doit	= tipc_nl_bearer_get,
84 		.dumpit	= tipc_nl_bearer_dump,
85 		.policy = tipc_nl_policy,
86 	},
87 	{
88 		.cmd	= TIPC_NL_BEARER_SET,
89 		.doit	= tipc_nl_bearer_set,
90 		.policy = tipc_nl_policy,
91 	},
92 	{
93 		.cmd	= TIPC_NL_SOCK_GET,
94 		.dumpit	= tipc_nl_sk_dump,
95 		.policy = tipc_nl_policy,
96 	},
97 	{
98 		.cmd	= TIPC_NL_PUBL_GET,
99 		.dumpit	= tipc_nl_publ_dump,
100 		.policy = tipc_nl_policy,
101 	},
102 	{
103 		.cmd	= TIPC_NL_LINK_GET,
104 		.doit   = tipc_nl_link_get,
105 		.dumpit	= tipc_nl_link_dump,
106 		.policy = tipc_nl_policy,
107 	},
108 	{
109 		.cmd	= TIPC_NL_LINK_SET,
110 		.doit	= tipc_nl_link_set,
111 		.policy = tipc_nl_policy,
112 	},
113 	{
114 		.cmd	= TIPC_NL_LINK_RESET_STATS,
115 		.doit   = tipc_nl_link_reset_stats,
116 		.policy = tipc_nl_policy,
117 	},
118 	{
119 		.cmd	= TIPC_NL_MEDIA_GET,
120 		.doit	= tipc_nl_media_get,
121 		.dumpit	= tipc_nl_media_dump,
122 		.policy = tipc_nl_policy,
123 	},
124 	{
125 		.cmd	= TIPC_NL_MEDIA_SET,
126 		.doit	= tipc_nl_media_set,
127 		.policy = tipc_nl_policy,
128 	},
129 	{
130 		.cmd	= TIPC_NL_NODE_GET,
131 		.dumpit	= tipc_nl_node_dump,
132 		.policy = tipc_nl_policy,
133 	},
134 	{
135 		.cmd	= TIPC_NL_NET_GET,
136 		.dumpit	= tipc_nl_net_dump,
137 		.policy = tipc_nl_policy,
138 	},
139 	{
140 		.cmd	= TIPC_NL_NET_SET,
141 		.doit	= tipc_nl_net_set,
142 		.policy = tipc_nl_policy,
143 	},
144 	{
145 		.cmd	= TIPC_NL_NAME_TABLE_GET,
146 		.dumpit	= tipc_nl_name_table_dump,
147 		.policy = tipc_nl_policy,
148 	}
149 };
150 
151 int tipc_nlmsg_parse(const struct nlmsghdr *nlh, struct nlattr ***attr)
152 {
153 	u32 maxattr = tipc_genl_family.maxattr;
154 
155 	*attr = tipc_genl_family.attrbuf;
156 	if (!*attr)
157 		return -EOPNOTSUPP;
158 
159 	return nlmsg_parse(nlh, GENL_HDRLEN, *attr, maxattr, tipc_nl_policy);
160 }
161 
162 int tipc_netlink_start(void)
163 {
164 	int res;
165 
166 	res = genl_register_family_with_ops(&tipc_genl_family,
167 					    tipc_genl_v2_ops);
168 	if (res) {
169 		pr_err("Failed to register netlink interface\n");
170 		return res;
171 	}
172 	return 0;
173 }
174 
175 void tipc_netlink_stop(void)
176 {
177 	genl_unregister_family(&tipc_genl_family);
178 }
179