]> Git Repo - linux.git/blame - net/tipc/netlink.c
tipc: add link get/dump to new netlink api
[linux.git] / net / tipc / netlink.c
CommitLineData
b97bf3fd
PL
1/*
2 * net/tipc/netlink.c: TIPC configuration handling
c4307285 3 *
0655f6a8 4 * Copyright (c) 2005-2006, 2014, Ericsson AB
59f0c452 5 * Copyright (c) 2005-2007, Wind River Systems
b97bf3fd
PL
6 * All rights reserved.
7 *
9ea1fd3c 8 * Redistribution and use in source and binary forms, with or without
b97bf3fd
PL
9 * modification, are permitted provided that the following conditions are met:
10 *
9ea1fd3c
PL
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.
b97bf3fd 19 *
9ea1fd3c
PL
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
b97bf3fd
PL
34 * POSSIBILITY OF SUCH DAMAGE.
35 */
36
37#include "core.h"
38#include "config.h"
34b78a12 39#include "socket.h"
0655f6a8 40#include "bearer.h"
7be57fc6 41#include "link.h"
b97bf3fd
PL
42#include <net/genetlink.h>
43
44static int handle_cmd(struct sk_buff *skb, struct genl_info *info)
45{
46 struct sk_buff *rep_buf;
47 struct nlmsghdr *rep_nlh;
48 struct nlmsghdr *req_nlh = info->nlhdr;
49 struct tipc_genlmsghdr *req_userhdr = info->userhdr;
573ce260 50 int hdr_space = nlmsg_total_size(GENL_HDRLEN + TIPC_GENL_HDRLEN);
59f0c452 51 u16 cmd;
b97bf3fd 52
90f62cf3 53 if ((req_userhdr->cmd & 0xC000) && (!netlink_capable(skb, CAP_NET_ADMIN)))
59f0c452 54 cmd = TIPC_CMD_NOT_NET_ADMIN;
b97bf3fd 55 else
59f0c452
AS
56 cmd = req_userhdr->cmd;
57
58 rep_buf = tipc_cfg_do_cmd(req_userhdr->dest, cmd,
573ce260
H
59 nlmsg_data(req_nlh) + GENL_HDRLEN + TIPC_GENL_HDRLEN,
60 nlmsg_attrlen(req_nlh, GENL_HDRLEN + TIPC_GENL_HDRLEN),
59f0c452 61 hdr_space);
b97bf3fd
PL
62
63 if (rep_buf) {
64 skb_push(rep_buf, hdr_space);
b529ccf2 65 rep_nlh = nlmsg_hdr(rep_buf);
b97bf3fd
PL
66 memcpy(rep_nlh, req_nlh, hdr_space);
67 rep_nlh->nlmsg_len = rep_buf->len;
15e47304 68 genlmsg_unicast(&init_net, rep_buf, NETLINK_CB(skb).portid);
b97bf3fd
PL
69 }
70
c4307285 71 return 0;
b97bf3fd
PL
72}
73
0655f6a8
RA
74static const struct nla_policy tipc_nl_policy[TIPC_NLA_MAX + 1] = {
75 [TIPC_NLA_UNSPEC] = { .type = NLA_UNSPEC, },
76 [TIPC_NLA_BEARER] = { .type = NLA_NESTED, },
34b78a12 77 [TIPC_NLA_SOCK] = { .type = NLA_NESTED, },
7be57fc6
RA
78 [TIPC_NLA_PUBL] = { .type = NLA_NESTED, },
79 [TIPC_NLA_LINK] = { .type = NLA_NESTED, },
0655f6a8
RA
80};
81
82/* Legacy ASCII API */
acb0a200 83static struct genl_family tipc_genl_family = {
c4307285
YH
84 .id = GENL_ID_GENERATE,
85 .name = TIPC_GENL_NAME,
86 .version = TIPC_GENL_VERSION,
87 .hdrsize = TIPC_GENL_HDRLEN,
88 .maxattr = 0,
b97bf3fd
PL
89};
90
0655f6a8 91/* Legacy ASCII API */
c53ed742
JB
92static struct genl_ops tipc_genl_ops[] = {
93 {
94 .cmd = TIPC_GENL_CMD,
95 .doit = handle_cmd,
96 },
b97bf3fd
PL
97};
98
0655f6a8
RA
99/* Users of the legacy API (tipc-config) can't handle that we add operations,
100 * so we have a separate genl handling for the new API.
101 */
102struct genl_family tipc_genl_v2_family = {
103 .id = GENL_ID_GENERATE,
104 .name = TIPC_GENL_V2_NAME,
105 .version = TIPC_GENL_V2_VERSION,
106 .hdrsize = 0,
107 .maxattr = TIPC_NLA_MAX,
108};
109
110static const struct genl_ops tipc_genl_v2_ops[] = {
111 {
112 .cmd = TIPC_NL_BEARER_DISABLE,
113 .doit = tipc_nl_bearer_disable,
114 .policy = tipc_nl_policy,
115 },
116 {
117 .cmd = TIPC_NL_BEARER_ENABLE,
118 .doit = tipc_nl_bearer_enable,
119 .policy = tipc_nl_policy,
35b9dd76
RA
120 },
121 {
122 .cmd = TIPC_NL_BEARER_GET,
123 .doit = tipc_nl_bearer_get,
124 .dumpit = tipc_nl_bearer_dump,
125 .policy = tipc_nl_policy,
315c00bc
RA
126 },
127 {
128 .cmd = TIPC_NL_BEARER_SET,
129 .doit = tipc_nl_bearer_set,
130 .policy = tipc_nl_policy,
34b78a12
RA
131 },
132 {
133 .cmd = TIPC_NL_SOCK_GET,
134 .dumpit = tipc_nl_sk_dump,
135 .policy = tipc_nl_policy,
1a1a143d
RA
136 },
137 {
138 .cmd = TIPC_NL_PUBL_GET,
139 .dumpit = tipc_nl_publ_dump,
140 .policy = tipc_nl_policy,
7be57fc6
RA
141 },
142 {
143 .cmd = TIPC_NL_LINK_GET,
144 .doit = tipc_nl_link_get,
145 .dumpit = tipc_nl_link_dump,
146 .policy = tipc_nl_policy,
0655f6a8
RA
147 }
148};
149
1a1a143d
RA
150int tipc_nlmsg_parse(const struct nlmsghdr *nlh, struct nlattr ***attr)
151{
152 u32 maxattr = tipc_genl_v2_family.maxattr;
153
154 *attr = tipc_genl_v2_family.attrbuf;
155 if (!*attr)
156 return -EOPNOTSUPP;
157
158 return nlmsg_parse(nlh, GENL_HDRLEN, *attr, maxattr, tipc_nl_policy);
159}
160
4323add6 161int tipc_netlink_start(void)
b97bf3fd 162{
acb0a200 163 int res;
b70e4f45 164
c53ed742 165 res = genl_register_family_with_ops(&tipc_genl_family, tipc_genl_ops);
0655f6a8
RA
166 if (res) {
167 pr_err("Failed to register legacy interface\n");
168 return res;
169 }
170
171 res = genl_register_family_with_ops(&tipc_genl_v2_family,
172 tipc_genl_v2_ops);
acb0a200 173 if (res) {
2cf8aa19 174 pr_err("Failed to register netlink interface\n");
acb0a200
MM
175 return res;
176 }
c4307285 177 return 0;
b97bf3fd
PL
178}
179
4323add6 180void tipc_netlink_stop(void)
b97bf3fd 181{
acb0a200 182 genl_unregister_family(&tipc_genl_family);
0655f6a8 183 genl_unregister_family(&tipc_genl_v2_family);
b97bf3fd 184}
This page took 0.639983 seconds and 4 git commands to generate.