Blame view

net/tipc/netlink.c 8.54 KB
b97bf3fd8   Per Liden   [TIPC] Initial merge
1
2
  /*
   * net/tipc/netlink.c: TIPC configuration handling
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
3
   *
0655f6a86   Richard Alpe   tipc: add bearer ...
4
   * Copyright (c) 2005-2006, 2014, Ericsson AB
59f0c4523   Allan Stephens   tipc: Fix skb_und...
5
   * Copyright (c) 2005-2007, Wind River Systems
b97bf3fd8   Per Liden   [TIPC] Initial merge
6
7
   * All rights reserved.
   *
9ea1fd3c1   Per Liden   [TIPC] License he...
8
   * Redistribution and use in source and binary forms, with or without
b97bf3fd8   Per Liden   [TIPC] Initial merge
9
10
   * modification, are permitted provided that the following conditions are met:
   *
9ea1fd3c1   Per Liden   [TIPC] License he...
11
12
13
14
15
16
17
18
   * 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.
b97bf3fd8   Per Liden   [TIPC] Initial merge
19
   *
9ea1fd3c1   Per Liden   [TIPC] License he...
20
21
22
23
24
25
26
27
28
29
30
31
32
33
   * 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
b97bf3fd8   Per Liden   [TIPC] Initial merge
34
35
36
37
   * POSSIBILITY OF SUCH DAMAGE.
   */
  
  #include "core.h"
34b78a127   Richard Alpe   tipc: add sock du...
38
  #include "socket.h"
1593123a6   Richard Alpe   tipc: add name ta...
39
  #include "name_table.h"
0655f6a86   Richard Alpe   tipc: add bearer ...
40
  #include "bearer.h"
7be57fc69   Richard Alpe   tipc: add link ge...
41
  #include "link.h"
3e4b6ab58   Richard Alpe   tipc: add node ge...
42
  #include "node.h"
fd3cf2ad5   Richard Alpe   tipc: add net dum...
43
  #include "net.h"
832629ca5   Richard Alpe   tipc: add UDP rem...
44
  #include "udp_media.h"
b97bf3fd8   Per Liden   [TIPC] Initial merge
45
  #include <net/genetlink.h>
0655f6a86   Richard Alpe   tipc: add bearer ...
46
47
48
  static const struct nla_policy tipc_nl_policy[TIPC_NLA_MAX + 1] = {
  	[TIPC_NLA_UNSPEC]	= { .type = NLA_UNSPEC, },
  	[TIPC_NLA_BEARER]	= { .type = NLA_NESTED, },
34b78a127   Richard Alpe   tipc: add sock du...
49
  	[TIPC_NLA_SOCK]		= { .type = NLA_NESTED, },
7be57fc69   Richard Alpe   tipc: add link ge...
50
51
  	[TIPC_NLA_PUBL]		= { .type = NLA_NESTED, },
  	[TIPC_NLA_LINK]		= { .type = NLA_NESTED, },
46f15c679   Richard Alpe   tipc: add media g...
52
  	[TIPC_NLA_MEDIA]	= { .type = NLA_NESTED, },
fd3cf2ad5   Richard Alpe   tipc: add net dum...
53
  	[TIPC_NLA_NODE]		= { .type = NLA_NESTED, },
1593123a6   Richard Alpe   tipc: add name ta...
54
  	[TIPC_NLA_NET]		= { .type = NLA_NESTED, },
7b3f52296   Parthasarathy Bhuvaragan   tipc: make cluste...
55
56
  	[TIPC_NLA_NAME_TABLE]	= { .type = NLA_NESTED, },
  	[TIPC_NLA_MON]		= { .type = NLA_NESTED, },
0655f6a86   Richard Alpe   tipc: add bearer ...
57
  };
49cc66eae   Richard Alpe   tipc: move netlin...
58
59
60
61
62
  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 }
  };
7b3f52296   Parthasarathy Bhuvaragan   tipc: make cluste...
63
64
  const struct nla_policy tipc_nl_monitor_policy[TIPC_NLA_MON_MAX + 1] = {
  	[TIPC_NLA_MON_UNSPEC]			= { .type = NLA_UNSPEC },
cf6f7e1d5   Parthasarathy Bhuvaragan   tipc: dump monito...
65
  	[TIPC_NLA_MON_REF]			= { .type = NLA_U32 },
7b3f52296   Parthasarathy Bhuvaragan   tipc: make cluste...
66
67
  	[TIPC_NLA_MON_ACTIVATION_THRESHOLD]	= { .type = NLA_U32 },
  };
49cc66eae   Richard Alpe   tipc: move netlin...
68
69
70
71
72
73
74
75
76
77
  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 },
ed2ba25f6   Eric Dumazet   tipc: add policy ...
78
79
  	[TIPC_NLA_NET_ID]		= { .type = NLA_U32 },
  	[TIPC_NLA_NET_ADDR]		= { .type = NLA_U32 },
49cc66eae   Richard Alpe   tipc: move netlin...
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
  };
  
  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_NLA_PROP_WIN]		= { .type = NLA_U32 }
  };
  
  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)},
  };
0655f6a86   Richard Alpe   tipc: add bearer ...
131
132
133
  /* 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.
   */
0655f6a86   Richard Alpe   tipc: add bearer ...
134
135
136
137
138
139
140
141
142
143
  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,
35b9dd760   Richard Alpe   tipc: add bearer ...
144
145
146
147
148
149
  	},
  	{
  		.cmd	= TIPC_NL_BEARER_GET,
  		.doit	= tipc_nl_bearer_get,
  		.dumpit	= tipc_nl_bearer_dump,
  		.policy = tipc_nl_policy,
315c00bc9   Richard Alpe   tipc: add bearer ...
150
151
  	},
  	{
ef20cd4dd   Richard Alpe   tipc: introduce U...
152
153
154
155
156
  		.cmd	= TIPC_NL_BEARER_ADD,
  		.doit	= tipc_nl_bearer_add,
  		.policy = tipc_nl_policy,
  	},
  	{
315c00bc9   Richard Alpe   tipc: add bearer ...
157
158
159
  		.cmd	= TIPC_NL_BEARER_SET,
  		.doit	= tipc_nl_bearer_set,
  		.policy = tipc_nl_policy,
34b78a127   Richard Alpe   tipc: add sock du...
160
161
162
163
164
  	},
  	{
  		.cmd	= TIPC_NL_SOCK_GET,
  		.dumpit	= tipc_nl_sk_dump,
  		.policy = tipc_nl_policy,
1a1a143da   Richard Alpe   tipc: add publica...
165
166
167
168
169
  	},
  	{
  		.cmd	= TIPC_NL_PUBL_GET,
  		.dumpit	= tipc_nl_publ_dump,
  		.policy = tipc_nl_policy,
7be57fc69   Richard Alpe   tipc: add link ge...
170
171
172
  	},
  	{
  		.cmd	= TIPC_NL_LINK_GET,
5be9c0867   Jon Paul Maloy   tipc: narrow down...
173
  		.doit   = tipc_nl_node_get_link,
38206d593   Jon Paul Maloy   tipc: narrow down...
174
  		.dumpit	= tipc_nl_node_dump_link,
7be57fc69   Richard Alpe   tipc: add link ge...
175
  		.policy = tipc_nl_policy,
f96ce7a20   Richard Alpe   tipc: add link se...
176
177
178
  	},
  	{
  		.cmd	= TIPC_NL_LINK_SET,
5be9c0867   Jon Paul Maloy   tipc: narrow down...
179
  		.doit	= tipc_nl_node_set_link,
f96ce7a20   Richard Alpe   tipc: add link se...
180
  		.policy = tipc_nl_policy,
ae36342b5   Richard Alpe   tipc: add link st...
181
182
183
  	},
  	{
  		.cmd	= TIPC_NL_LINK_RESET_STATS,
5be9c0867   Jon Paul Maloy   tipc: narrow down...
184
  		.doit   = tipc_nl_node_reset_link_stats,
ae36342b5   Richard Alpe   tipc: add link st...
185
  		.policy = tipc_nl_policy,
46f15c679   Richard Alpe   tipc: add media g...
186
187
188
189
190
191
  	},
  	{
  		.cmd	= TIPC_NL_MEDIA_GET,
  		.doit	= tipc_nl_media_get,
  		.dumpit	= tipc_nl_media_dump,
  		.policy = tipc_nl_policy,
1e55417d8   Richard Alpe   tipc: add media s...
192
193
194
195
196
  	},
  	{
  		.cmd	= TIPC_NL_MEDIA_SET,
  		.doit	= tipc_nl_media_set,
  		.policy = tipc_nl_policy,
3e4b6ab58   Richard Alpe   tipc: add node ge...
197
198
199
200
201
  	},
  	{
  		.cmd	= TIPC_NL_NODE_GET,
  		.dumpit	= tipc_nl_node_dump,
  		.policy = tipc_nl_policy,
fd3cf2ad5   Richard Alpe   tipc: add net dum...
202
203
204
205
206
  	},
  	{
  		.cmd	= TIPC_NL_NET_GET,
  		.dumpit	= tipc_nl_net_dump,
  		.policy = tipc_nl_policy,
27c214167   Richard Alpe   tipc: add net set...
207
208
209
210
211
  	},
  	{
  		.cmd	= TIPC_NL_NET_SET,
  		.doit	= tipc_nl_net_set,
  		.policy = tipc_nl_policy,
1593123a6   Richard Alpe   tipc: add name ta...
212
213
214
215
216
  	},
  	{
  		.cmd	= TIPC_NL_NAME_TABLE_GET,
  		.dumpit	= tipc_nl_name_table_dump,
  		.policy = tipc_nl_policy,
7b3f52296   Parthasarathy Bhuvaragan   tipc: make cluste...
217
218
219
220
221
222
  	},
  	{
  		.cmd	= TIPC_NL_MON_SET,
  		.doit	= tipc_nl_node_set_monitor,
  		.policy = tipc_nl_policy,
  	},
bf1035b2f   Parthasarathy Bhuvaragan   tipc: get monitor...
223
224
225
  	{
  		.cmd	= TIPC_NL_MON_GET,
  		.doit	= tipc_nl_node_get_monitor,
cf6f7e1d5   Parthasarathy Bhuvaragan   tipc: dump monito...
226
227
228
229
230
231
  		.dumpit	= tipc_nl_node_dump_monitor,
  		.policy = tipc_nl_policy,
  	},
  	{
  		.cmd	= TIPC_NL_MON_PEER_GET,
  		.dumpit	= tipc_nl_node_dump_monitor_peer,
bf1035b2f   Parthasarathy Bhuvaragan   tipc: get monitor...
232
233
  		.policy = tipc_nl_policy,
  	},
b34040227   Richard Alpe   tipc: add peer re...
234
235
236
237
  	{
  		.cmd	= TIPC_NL_PEER_REMOVE,
  		.doit	= tipc_nl_peer_rm,
  		.policy = tipc_nl_policy,
832629ca5   Richard Alpe   tipc: add UDP rem...
238
239
240
241
242
243
244
245
  	},
  #ifdef CONFIG_TIPC_MEDIA_UDP
  	{
  		.cmd	= TIPC_NL_UDP_GET_REMOTEIP,
  		.dumpit	= tipc_udp_nl_dump_remoteip,
  		.policy = tipc_nl_policy,
  	},
  #endif
0655f6a86   Richard Alpe   tipc: add bearer ...
246
  };
56989f6d8   Johannes Berg   genetlink: mark f...
247
  struct genl_family tipc_genl_family __ro_after_init = {
489111e5c   Johannes Berg   genetlink: static...
248
249
250
251
252
253
254
255
256
  	.name		= TIPC_GENL_V2_NAME,
  	.version	= TIPC_GENL_V2_VERSION,
  	.hdrsize	= 0,
  	.maxattr	= TIPC_NLA_MAX,
  	.netnsok	= true,
  	.module		= THIS_MODULE,
  	.ops		= tipc_genl_v2_ops,
  	.n_ops		= ARRAY_SIZE(tipc_genl_v2_ops),
  };
1a1a143da   Richard Alpe   tipc: add publica...
257
258
  int tipc_nlmsg_parse(const struct nlmsghdr *nlh, struct nlattr ***attr)
  {
bfb3e5dd8   Richard Alpe   tipc: move and re...
259
  	u32 maxattr = tipc_genl_family.maxattr;
1a1a143da   Richard Alpe   tipc: add publica...
260

c90c39dab   Johannes Berg   genetlink: introd...
261
  	*attr = genl_family_attrbuf(&tipc_genl_family);
1a1a143da   Richard Alpe   tipc: add publica...
262
263
  	if (!*attr)
  		return -EOPNOTSUPP;
fceb6435e   Johannes Berg   netlink: pass ext...
264
265
  	return nlmsg_parse(nlh, GENL_HDRLEN, *attr, maxattr, tipc_nl_policy,
  			   NULL);
1a1a143da   Richard Alpe   tipc: add publica...
266
  }
56989f6d8   Johannes Berg   genetlink: mark f...
267
  int __init tipc_netlink_start(void)
b97bf3fd8   Per Liden   [TIPC] Initial merge
268
  {
acb0a200a   Michał Mirosław   tipc: Use genl_re...
269
  	int res;
b70e4f45a   Jon Maloy   [TIPC} Fixed bug ...
270

489111e5c   Johannes Berg   genetlink: static...
271
  	res = genl_register_family(&tipc_genl_family);
0655f6a86   Richard Alpe   tipc: add bearer ...
272
  	if (res) {
2cf8aa19f   Erik Hugne   tipc: use standar...
273
274
  		pr_err("Failed to register netlink interface
  ");
acb0a200a   Michał Mirosław   tipc: Use genl_re...
275
276
  		return res;
  	}
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
277
  	return 0;
b97bf3fd8   Per Liden   [TIPC] Initial merge
278
  }
4323add67   Per Liden   [TIPC] Avoid poll...
279
  void tipc_netlink_stop(void)
b97bf3fd8   Per Liden   [TIPC] Initial merge
280
  {
acb0a200a   Michał Mirosław   tipc: Use genl_re...
281
  	genl_unregister_family(&tipc_genl_family);
b97bf3fd8   Per Liden   [TIPC] Initial merge
282
  }