1*4dc78e53SAndroid Build Coastguard Worker /* SPDX-License-Identifier: LGPL-2.1-only */
2*4dc78e53SAndroid Build Coastguard Worker /*
3*4dc78e53SAndroid Build Coastguard Worker * Copyright (c) 2017 David Ahern <[email protected]>
4*4dc78e53SAndroid Build Coastguard Worker */
5*4dc78e53SAndroid Build Coastguard Worker
6*4dc78e53SAndroid Build Coastguard Worker /**
7*4dc78e53SAndroid Build Coastguard Worker * @ingroup rtnl
8*4dc78e53SAndroid Build Coastguard Worker * @defgroup netconf Netconf
9*4dc78e53SAndroid Build Coastguard Worker * @brief
10*4dc78e53SAndroid Build Coastguard Worker *
11*4dc78e53SAndroid Build Coastguard Worker * @{
12*4dc78e53SAndroid Build Coastguard Worker */
13*4dc78e53SAndroid Build Coastguard Worker
14*4dc78e53SAndroid Build Coastguard Worker #include "nl-default.h"
15*4dc78e53SAndroid Build Coastguard Worker
16*4dc78e53SAndroid Build Coastguard Worker #include <linux/netconf.h>
17*4dc78e53SAndroid Build Coastguard Worker #include <linux/socket.h>
18*4dc78e53SAndroid Build Coastguard Worker
19*4dc78e53SAndroid Build Coastguard Worker #include <netlink/netlink.h>
20*4dc78e53SAndroid Build Coastguard Worker #include <netlink/utils.h>
21*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/netconf.h>
22*4dc78e53SAndroid Build Coastguard Worker #include <netlink/hashtable.h>
23*4dc78e53SAndroid Build Coastguard Worker
24*4dc78e53SAndroid Build Coastguard Worker #include "nl-route.h"
25*4dc78e53SAndroid Build Coastguard Worker #include "nl-priv-dynamic-core/nl-core.h"
26*4dc78e53SAndroid Build Coastguard Worker #include "nl-priv-dynamic-core/cache-api.h"
27*4dc78e53SAndroid Build Coastguard Worker #include "nl-priv-dynamic-core/object-api.h"
28*4dc78e53SAndroid Build Coastguard Worker
29*4dc78e53SAndroid Build Coastguard Worker /** @cond SKIP */
30*4dc78e53SAndroid Build Coastguard Worker #define NETCONF_ATTR_FAMILY 0x0001
31*4dc78e53SAndroid Build Coastguard Worker #define NETCONF_ATTR_IFINDEX 0x0002
32*4dc78e53SAndroid Build Coastguard Worker #define NETCONF_ATTR_RP_FILTER 0x0004
33*4dc78e53SAndroid Build Coastguard Worker #define NETCONF_ATTR_FWDING 0x0008
34*4dc78e53SAndroid Build Coastguard Worker #define NETCONF_ATTR_MC_FWDING 0x0010
35*4dc78e53SAndroid Build Coastguard Worker #define NETCONF_ATTR_PROXY_NEIGH 0x0020
36*4dc78e53SAndroid Build Coastguard Worker #define NETCONF_ATTR_IGNORE_RT_LINKDWN 0x0040
37*4dc78e53SAndroid Build Coastguard Worker #define NETCONF_ATTR_INPUT 0x0080
38*4dc78e53SAndroid Build Coastguard Worker
39*4dc78e53SAndroid Build Coastguard Worker struct rtnl_netconf
40*4dc78e53SAndroid Build Coastguard Worker {
41*4dc78e53SAndroid Build Coastguard Worker NLHDR_COMMON
42*4dc78e53SAndroid Build Coastguard Worker
43*4dc78e53SAndroid Build Coastguard Worker int family;
44*4dc78e53SAndroid Build Coastguard Worker int ifindex;
45*4dc78e53SAndroid Build Coastguard Worker int rp_filter;
46*4dc78e53SAndroid Build Coastguard Worker int forwarding;
47*4dc78e53SAndroid Build Coastguard Worker int mc_forwarding;
48*4dc78e53SAndroid Build Coastguard Worker int proxy_neigh;
49*4dc78e53SAndroid Build Coastguard Worker int ignore_routes_linkdown;
50*4dc78e53SAndroid Build Coastguard Worker int input;
51*4dc78e53SAndroid Build Coastguard Worker };
52*4dc78e53SAndroid Build Coastguard Worker
53*4dc78e53SAndroid Build Coastguard Worker static struct nl_cache_ops rtnl_netconf_ops;
54*4dc78e53SAndroid Build Coastguard Worker static struct nl_object_ops netconf_obj_ops;
55*4dc78e53SAndroid Build Coastguard Worker /** @endcond */
56*4dc78e53SAndroid Build Coastguard Worker
57*4dc78e53SAndroid Build Coastguard Worker static struct nla_policy devconf_ipv4_policy[NETCONFA_MAX+1] = {
58*4dc78e53SAndroid Build Coastguard Worker [NETCONFA_IFINDEX] = { .type = NLA_S32 },
59*4dc78e53SAndroid Build Coastguard Worker [NETCONFA_FORWARDING] = { .type = NLA_S32 },
60*4dc78e53SAndroid Build Coastguard Worker [NETCONFA_MC_FORWARDING] = { .type = NLA_S32 },
61*4dc78e53SAndroid Build Coastguard Worker [NETCONFA_RP_FILTER] = { .type = NLA_S32 },
62*4dc78e53SAndroid Build Coastguard Worker [NETCONFA_PROXY_NEIGH] = { .type = NLA_S32 },
63*4dc78e53SAndroid Build Coastguard Worker [NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN] = { .type = NLA_S32 },
64*4dc78e53SAndroid Build Coastguard Worker };
65*4dc78e53SAndroid Build Coastguard Worker
66*4dc78e53SAndroid Build Coastguard Worker static struct nla_policy devconf_ipv6_policy[NETCONFA_MAX+1] = {
67*4dc78e53SAndroid Build Coastguard Worker [NETCONFA_IFINDEX] = { .type = NLA_S32 },
68*4dc78e53SAndroid Build Coastguard Worker [NETCONFA_FORWARDING] = { .type = NLA_S32 },
69*4dc78e53SAndroid Build Coastguard Worker [NETCONFA_MC_FORWARDING] = { .type = NLA_S32 },
70*4dc78e53SAndroid Build Coastguard Worker [NETCONFA_PROXY_NEIGH] = { .type = NLA_S32 },
71*4dc78e53SAndroid Build Coastguard Worker [NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN] = { .type = NLA_S32 },
72*4dc78e53SAndroid Build Coastguard Worker };
73*4dc78e53SAndroid Build Coastguard Worker
74*4dc78e53SAndroid Build Coastguard Worker static struct nla_policy devconf_mpls_policy[NETCONFA_MAX+1] = {
75*4dc78e53SAndroid Build Coastguard Worker [NETCONFA_IFINDEX] = { .type = NLA_S32 },
76*4dc78e53SAndroid Build Coastguard Worker [NETCONFA_INPUT] = { .type = NLA_S32 },
77*4dc78e53SAndroid Build Coastguard Worker };
78*4dc78e53SAndroid Build Coastguard Worker
rtnl_netconf_alloc(void)79*4dc78e53SAndroid Build Coastguard Worker static struct rtnl_netconf *rtnl_netconf_alloc(void)
80*4dc78e53SAndroid Build Coastguard Worker {
81*4dc78e53SAndroid Build Coastguard Worker return (struct rtnl_netconf *) nl_object_alloc(&netconf_obj_ops);
82*4dc78e53SAndroid Build Coastguard Worker }
83*4dc78e53SAndroid Build Coastguard Worker
netconf_msg_parser(struct nl_cache_ops * ops,struct sockaddr_nl * who,struct nlmsghdr * nlh,struct nl_parser_param * pp)84*4dc78e53SAndroid Build Coastguard Worker static int netconf_msg_parser(struct nl_cache_ops *ops, struct sockaddr_nl *who,
85*4dc78e53SAndroid Build Coastguard Worker struct nlmsghdr *nlh, struct nl_parser_param *pp)
86*4dc78e53SAndroid Build Coastguard Worker {
87*4dc78e53SAndroid Build Coastguard Worker struct nlattr *tb[NETCONFA_MAX+1], *attr;
88*4dc78e53SAndroid Build Coastguard Worker struct rtnl_netconf *nc;
89*4dc78e53SAndroid Build Coastguard Worker struct netconfmsg *ncm;
90*4dc78e53SAndroid Build Coastguard Worker int err;
91*4dc78e53SAndroid Build Coastguard Worker
92*4dc78e53SAndroid Build Coastguard Worker ncm = nlmsg_data(nlh);
93*4dc78e53SAndroid Build Coastguard Worker switch (ncm->ncm_family) {
94*4dc78e53SAndroid Build Coastguard Worker case AF_INET:
95*4dc78e53SAndroid Build Coastguard Worker err = nlmsg_parse(nlh, sizeof(*ncm), tb, NETCONFA_MAX,
96*4dc78e53SAndroid Build Coastguard Worker devconf_ipv4_policy);
97*4dc78e53SAndroid Build Coastguard Worker if (err < 0)
98*4dc78e53SAndroid Build Coastguard Worker return err;
99*4dc78e53SAndroid Build Coastguard Worker break;
100*4dc78e53SAndroid Build Coastguard Worker case AF_INET6:
101*4dc78e53SAndroid Build Coastguard Worker err = nlmsg_parse(nlh, sizeof(*ncm), tb, NETCONFA_MAX,
102*4dc78e53SAndroid Build Coastguard Worker devconf_ipv6_policy);
103*4dc78e53SAndroid Build Coastguard Worker if (err < 0)
104*4dc78e53SAndroid Build Coastguard Worker return err;
105*4dc78e53SAndroid Build Coastguard Worker break;
106*4dc78e53SAndroid Build Coastguard Worker case AF_MPLS:
107*4dc78e53SAndroid Build Coastguard Worker err = nlmsg_parse(nlh, sizeof(*ncm), tb, NETCONFA_MAX,
108*4dc78e53SAndroid Build Coastguard Worker devconf_mpls_policy);
109*4dc78e53SAndroid Build Coastguard Worker if (err < 0)
110*4dc78e53SAndroid Build Coastguard Worker return err;
111*4dc78e53SAndroid Build Coastguard Worker break;
112*4dc78e53SAndroid Build Coastguard Worker default:
113*4dc78e53SAndroid Build Coastguard Worker printf("unexpected netconf family: %d\n", ncm->ncm_family);
114*4dc78e53SAndroid Build Coastguard Worker return -1;
115*4dc78e53SAndroid Build Coastguard Worker }
116*4dc78e53SAndroid Build Coastguard Worker
117*4dc78e53SAndroid Build Coastguard Worker if (!tb[NETCONFA_IFINDEX])
118*4dc78e53SAndroid Build Coastguard Worker return -1;
119*4dc78e53SAndroid Build Coastguard Worker
120*4dc78e53SAndroid Build Coastguard Worker nc = rtnl_netconf_alloc();
121*4dc78e53SAndroid Build Coastguard Worker if (!nc)
122*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
123*4dc78e53SAndroid Build Coastguard Worker
124*4dc78e53SAndroid Build Coastguard Worker nc->ce_msgtype = nlh->nlmsg_type;
125*4dc78e53SAndroid Build Coastguard Worker nc->family = ncm->ncm_family;
126*4dc78e53SAndroid Build Coastguard Worker nc->ifindex = nla_get_s32(tb[NETCONFA_IFINDEX]);
127*4dc78e53SAndroid Build Coastguard Worker
128*4dc78e53SAndroid Build Coastguard Worker nc->ce_mask = NETCONF_ATTR_FAMILY | NETCONF_ATTR_IFINDEX;
129*4dc78e53SAndroid Build Coastguard Worker
130*4dc78e53SAndroid Build Coastguard Worker
131*4dc78e53SAndroid Build Coastguard Worker if (tb[NETCONFA_RP_FILTER]) {
132*4dc78e53SAndroid Build Coastguard Worker attr = tb[NETCONFA_RP_FILTER];
133*4dc78e53SAndroid Build Coastguard Worker nc->rp_filter = nla_get_s32(attr);
134*4dc78e53SAndroid Build Coastguard Worker nc->ce_mask |= NETCONF_ATTR_RP_FILTER;
135*4dc78e53SAndroid Build Coastguard Worker }
136*4dc78e53SAndroid Build Coastguard Worker
137*4dc78e53SAndroid Build Coastguard Worker if (tb[NETCONFA_FORWARDING]) {
138*4dc78e53SAndroid Build Coastguard Worker attr = tb[NETCONFA_FORWARDING];
139*4dc78e53SAndroid Build Coastguard Worker nc->forwarding = nla_get_s32(attr);
140*4dc78e53SAndroid Build Coastguard Worker nc->ce_mask |= NETCONF_ATTR_FWDING;
141*4dc78e53SAndroid Build Coastguard Worker }
142*4dc78e53SAndroid Build Coastguard Worker
143*4dc78e53SAndroid Build Coastguard Worker if (tb[NETCONFA_MC_FORWARDING]) {
144*4dc78e53SAndroid Build Coastguard Worker attr = tb[NETCONFA_MC_FORWARDING];
145*4dc78e53SAndroid Build Coastguard Worker nc->mc_forwarding = nla_get_s32(attr);
146*4dc78e53SAndroid Build Coastguard Worker nc->ce_mask |= NETCONF_ATTR_MC_FWDING;
147*4dc78e53SAndroid Build Coastguard Worker }
148*4dc78e53SAndroid Build Coastguard Worker
149*4dc78e53SAndroid Build Coastguard Worker if (tb[NETCONFA_PROXY_NEIGH]) {
150*4dc78e53SAndroid Build Coastguard Worker attr = tb[NETCONFA_PROXY_NEIGH];
151*4dc78e53SAndroid Build Coastguard Worker nc->proxy_neigh = nla_get_s32(attr);
152*4dc78e53SAndroid Build Coastguard Worker nc->ce_mask |= NETCONF_ATTR_PROXY_NEIGH;
153*4dc78e53SAndroid Build Coastguard Worker }
154*4dc78e53SAndroid Build Coastguard Worker
155*4dc78e53SAndroid Build Coastguard Worker if (tb[NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN]) {
156*4dc78e53SAndroid Build Coastguard Worker attr = tb[NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN];
157*4dc78e53SAndroid Build Coastguard Worker nc->ignore_routes_linkdown = nla_get_s32(attr);
158*4dc78e53SAndroid Build Coastguard Worker nc->ce_mask |= NETCONF_ATTR_IGNORE_RT_LINKDWN;
159*4dc78e53SAndroid Build Coastguard Worker }
160*4dc78e53SAndroid Build Coastguard Worker
161*4dc78e53SAndroid Build Coastguard Worker if (tb[NETCONFA_INPUT]) {
162*4dc78e53SAndroid Build Coastguard Worker attr = tb[NETCONFA_INPUT];
163*4dc78e53SAndroid Build Coastguard Worker nc->input = nla_get_s32(attr);
164*4dc78e53SAndroid Build Coastguard Worker nc->ce_mask |= NETCONF_ATTR_INPUT;
165*4dc78e53SAndroid Build Coastguard Worker }
166*4dc78e53SAndroid Build Coastguard Worker
167*4dc78e53SAndroid Build Coastguard Worker err = pp->pp_cb((struct nl_object *) nc, pp);
168*4dc78e53SAndroid Build Coastguard Worker
169*4dc78e53SAndroid Build Coastguard Worker rtnl_netconf_put(nc);
170*4dc78e53SAndroid Build Coastguard Worker return err;
171*4dc78e53SAndroid Build Coastguard Worker }
172*4dc78e53SAndroid Build Coastguard Worker
netconf_request_update(struct nl_cache * cache,struct nl_sock * sk)173*4dc78e53SAndroid Build Coastguard Worker static int netconf_request_update(struct nl_cache *cache, struct nl_sock *sk)
174*4dc78e53SAndroid Build Coastguard Worker {
175*4dc78e53SAndroid Build Coastguard Worker struct netconfmsg nc = {
176*4dc78e53SAndroid Build Coastguard Worker .ncm_family = cache->c_iarg1,
177*4dc78e53SAndroid Build Coastguard Worker };
178*4dc78e53SAndroid Build Coastguard Worker
179*4dc78e53SAndroid Build Coastguard Worker return nl_send_simple(sk, RTM_GETNETCONF, NLM_F_DUMP, &nc, sizeof(nc));
180*4dc78e53SAndroid Build Coastguard Worker }
181*4dc78e53SAndroid Build Coastguard Worker
netconf_dump_line(struct nl_object * obj,struct nl_dump_params * p)182*4dc78e53SAndroid Build Coastguard Worker static void netconf_dump_line(struct nl_object *obj, struct nl_dump_params *p)
183*4dc78e53SAndroid Build Coastguard Worker {
184*4dc78e53SAndroid Build Coastguard Worker struct rtnl_netconf *nc = (struct rtnl_netconf *) obj;
185*4dc78e53SAndroid Build Coastguard Worker struct nl_cache *link_cache;
186*4dc78e53SAndroid Build Coastguard Worker char buf[64];
187*4dc78e53SAndroid Build Coastguard Worker
188*4dc78e53SAndroid Build Coastguard Worker switch(nc->family) {
189*4dc78e53SAndroid Build Coastguard Worker case AF_INET:
190*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "ipv4 ");
191*4dc78e53SAndroid Build Coastguard Worker break;
192*4dc78e53SAndroid Build Coastguard Worker case AF_INET6:
193*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "ipv6 ");
194*4dc78e53SAndroid Build Coastguard Worker break;
195*4dc78e53SAndroid Build Coastguard Worker case AF_MPLS:
196*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "mpls ");
197*4dc78e53SAndroid Build Coastguard Worker break;
198*4dc78e53SAndroid Build Coastguard Worker default:
199*4dc78e53SAndroid Build Coastguard Worker return;
200*4dc78e53SAndroid Build Coastguard Worker }
201*4dc78e53SAndroid Build Coastguard Worker
202*4dc78e53SAndroid Build Coastguard Worker switch(nc->ifindex) {
203*4dc78e53SAndroid Build Coastguard Worker case NETCONFA_IFINDEX_ALL:
204*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "all ");
205*4dc78e53SAndroid Build Coastguard Worker break;
206*4dc78e53SAndroid Build Coastguard Worker case NETCONFA_IFINDEX_DEFAULT:
207*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "default ");
208*4dc78e53SAndroid Build Coastguard Worker break;
209*4dc78e53SAndroid Build Coastguard Worker default:
210*4dc78e53SAndroid Build Coastguard Worker link_cache = nl_cache_mngt_require_safe("route/link");
211*4dc78e53SAndroid Build Coastguard Worker if (link_cache) {
212*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "dev %s ",
213*4dc78e53SAndroid Build Coastguard Worker rtnl_link_i2name(link_cache, nc->ifindex,
214*4dc78e53SAndroid Build Coastguard Worker buf, sizeof(buf)));
215*4dc78e53SAndroid Build Coastguard Worker nl_cache_put(link_cache);
216*4dc78e53SAndroid Build Coastguard Worker } else
217*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "dev %d ", nc->ifindex);
218*4dc78e53SAndroid Build Coastguard Worker }
219*4dc78e53SAndroid Build Coastguard Worker
220*4dc78e53SAndroid Build Coastguard Worker if (nc->ce_mask & NETCONF_ATTR_FWDING) {
221*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "forwarding %s ",
222*4dc78e53SAndroid Build Coastguard Worker nc->forwarding ? "on" : "off");
223*4dc78e53SAndroid Build Coastguard Worker }
224*4dc78e53SAndroid Build Coastguard Worker
225*4dc78e53SAndroid Build Coastguard Worker if (nc->ce_mask & NETCONF_ATTR_RP_FILTER) {
226*4dc78e53SAndroid Build Coastguard Worker if (nc->rp_filter == 0)
227*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "rp_filter off ");
228*4dc78e53SAndroid Build Coastguard Worker else if (nc->rp_filter == 1)
229*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "rp_filter strict ");
230*4dc78e53SAndroid Build Coastguard Worker else if (nc->rp_filter == 2)
231*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "rp_filter loose ");
232*4dc78e53SAndroid Build Coastguard Worker else
233*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "rp_filter unknown-mode ");
234*4dc78e53SAndroid Build Coastguard Worker }
235*4dc78e53SAndroid Build Coastguard Worker
236*4dc78e53SAndroid Build Coastguard Worker if (nc->ce_mask & NETCONF_ATTR_MC_FWDING) {
237*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "mc_forwarding %s ",
238*4dc78e53SAndroid Build Coastguard Worker nc->mc_forwarding ? "on" : "off");
239*4dc78e53SAndroid Build Coastguard Worker }
240*4dc78e53SAndroid Build Coastguard Worker
241*4dc78e53SAndroid Build Coastguard Worker if (nc->ce_mask & NETCONF_ATTR_PROXY_NEIGH)
242*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "proxy_neigh %d ", nc->proxy_neigh);
243*4dc78e53SAndroid Build Coastguard Worker
244*4dc78e53SAndroid Build Coastguard Worker if (nc->ce_mask & NETCONF_ATTR_IGNORE_RT_LINKDWN) {
245*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "ignore_routes_with_linkdown %s ",
246*4dc78e53SAndroid Build Coastguard Worker nc->ignore_routes_linkdown ? "on" : "off");
247*4dc78e53SAndroid Build Coastguard Worker }
248*4dc78e53SAndroid Build Coastguard Worker
249*4dc78e53SAndroid Build Coastguard Worker if (nc->ce_mask & NETCONF_ATTR_INPUT)
250*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "input %s ", nc->input ? "on" : "off");
251*4dc78e53SAndroid Build Coastguard Worker
252*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "\n");
253*4dc78e53SAndroid Build Coastguard Worker }
254*4dc78e53SAndroid Build Coastguard Worker
255*4dc78e53SAndroid Build Coastguard Worker static const struct trans_tbl netconf_attrs[] = {
256*4dc78e53SAndroid Build Coastguard Worker __ADD(NETCONF_ATTR_FAMILY, family),
257*4dc78e53SAndroid Build Coastguard Worker __ADD(NETCONF_ATTR_IFINDEX, ifindex),
258*4dc78e53SAndroid Build Coastguard Worker __ADD(NETCONF_ATTR_RP_FILTER, rp_filter),
259*4dc78e53SAndroid Build Coastguard Worker __ADD(NETCONF_ATTR_FWDING, forwarding),
260*4dc78e53SAndroid Build Coastguard Worker __ADD(NETCONF_ATTR_MC_FWDING, mc_forwarding),
261*4dc78e53SAndroid Build Coastguard Worker __ADD(NETCONF_ATTR_PROXY_NEIGH, proxy_neigh),
262*4dc78e53SAndroid Build Coastguard Worker __ADD(NETCONF_ATTR_IGNORE_RT_LINKDWN, ignore_routes_with_linkdown),
263*4dc78e53SAndroid Build Coastguard Worker __ADD(NETCONF_ATTR_INPUT, input),
264*4dc78e53SAndroid Build Coastguard Worker };
265*4dc78e53SAndroid Build Coastguard Worker
netconf_attrs2str(int attrs,char * buf,size_t len)266*4dc78e53SAndroid Build Coastguard Worker static char *netconf_attrs2str(int attrs, char *buf, size_t len)
267*4dc78e53SAndroid Build Coastguard Worker {
268*4dc78e53SAndroid Build Coastguard Worker return __flags2str(attrs, buf, len, netconf_attrs,
269*4dc78e53SAndroid Build Coastguard Worker ARRAY_SIZE(netconf_attrs));
270*4dc78e53SAndroid Build Coastguard Worker }
271*4dc78e53SAndroid Build Coastguard Worker
netconf_keygen(struct nl_object * obj,uint32_t * hashkey,uint32_t table_sz)272*4dc78e53SAndroid Build Coastguard Worker static void netconf_keygen(struct nl_object *obj, uint32_t *hashkey,
273*4dc78e53SAndroid Build Coastguard Worker uint32_t table_sz)
274*4dc78e53SAndroid Build Coastguard Worker {
275*4dc78e53SAndroid Build Coastguard Worker struct rtnl_netconf *nc = (struct rtnl_netconf *) obj;
276*4dc78e53SAndroid Build Coastguard Worker unsigned int nckey_sz;
277*4dc78e53SAndroid Build Coastguard Worker struct nc_hash_key {
278*4dc78e53SAndroid Build Coastguard Worker int nc_family;
279*4dc78e53SAndroid Build Coastguard Worker int nc_index;
280*4dc78e53SAndroid Build Coastguard Worker } _nl_packed nckey;
281*4dc78e53SAndroid Build Coastguard Worker
282*4dc78e53SAndroid Build Coastguard Worker nckey_sz = sizeof(nckey);
283*4dc78e53SAndroid Build Coastguard Worker nckey.nc_family = nc->family;
284*4dc78e53SAndroid Build Coastguard Worker nckey.nc_index = nc->ifindex;
285*4dc78e53SAndroid Build Coastguard Worker
286*4dc78e53SAndroid Build Coastguard Worker *hashkey = nl_hash(&nckey, nckey_sz, 0) % table_sz;
287*4dc78e53SAndroid Build Coastguard Worker
288*4dc78e53SAndroid Build Coastguard Worker NL_DBG(5, "netconf %p key (dev %d fam %d) keysz %d, hash 0x%x\n",
289*4dc78e53SAndroid Build Coastguard Worker nc, nckey.nc_index, nckey.nc_family, nckey_sz, *hashkey);
290*4dc78e53SAndroid Build Coastguard Worker }
291*4dc78e53SAndroid Build Coastguard Worker
netconf_compare(struct nl_object * _a,struct nl_object * _b,uint64_t attrs,int flags)292*4dc78e53SAndroid Build Coastguard Worker static uint64_t netconf_compare(struct nl_object *_a, struct nl_object *_b,
293*4dc78e53SAndroid Build Coastguard Worker uint64_t attrs, int flags)
294*4dc78e53SAndroid Build Coastguard Worker {
295*4dc78e53SAndroid Build Coastguard Worker struct rtnl_netconf *a = (struct rtnl_netconf *) _a;
296*4dc78e53SAndroid Build Coastguard Worker struct rtnl_netconf *b = (struct rtnl_netconf *) _b;
297*4dc78e53SAndroid Build Coastguard Worker uint64_t diff = 0;
298*4dc78e53SAndroid Build Coastguard Worker
299*4dc78e53SAndroid Build Coastguard Worker #define _DIFF(ATTR, EXPR) ATTR_DIFF(attrs, ATTR, a, b, EXPR)
300*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(NETCONF_ATTR_FAMILY, a->family != b->family);
301*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(NETCONF_ATTR_IFINDEX, a->ifindex != b->ifindex);
302*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(NETCONF_ATTR_RP_FILTER, a->rp_filter != b->rp_filter);
303*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(NETCONF_ATTR_FWDING, a->forwarding != b->forwarding);
304*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(NETCONF_ATTR_MC_FWDING,
305*4dc78e53SAndroid Build Coastguard Worker a->mc_forwarding != b->mc_forwarding);
306*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(NETCONF_ATTR_PROXY_NEIGH,
307*4dc78e53SAndroid Build Coastguard Worker a->proxy_neigh != b->proxy_neigh);
308*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(NETCONF_ATTR_IGNORE_RT_LINKDWN,
309*4dc78e53SAndroid Build Coastguard Worker a->ignore_routes_linkdown != b->ignore_routes_linkdown);
310*4dc78e53SAndroid Build Coastguard Worker diff |= _DIFF(NETCONF_ATTR_INPUT, a->input != b->input);
311*4dc78e53SAndroid Build Coastguard Worker #undef _DIFF
312*4dc78e53SAndroid Build Coastguard Worker
313*4dc78e53SAndroid Build Coastguard Worker return diff;
314*4dc78e53SAndroid Build Coastguard Worker }
315*4dc78e53SAndroid Build Coastguard Worker
netconf_update(struct nl_object * old_obj,struct nl_object * new_obj)316*4dc78e53SAndroid Build Coastguard Worker static int netconf_update(struct nl_object *old_obj, struct nl_object *new_obj)
317*4dc78e53SAndroid Build Coastguard Worker {
318*4dc78e53SAndroid Build Coastguard Worker struct rtnl_netconf *new_nc = (struct rtnl_netconf *) new_obj;
319*4dc78e53SAndroid Build Coastguard Worker struct rtnl_netconf *old_nc = (struct rtnl_netconf *) old_obj;
320*4dc78e53SAndroid Build Coastguard Worker int action = new_obj->ce_msgtype;
321*4dc78e53SAndroid Build Coastguard Worker
322*4dc78e53SAndroid Build Coastguard Worker switch(action) {
323*4dc78e53SAndroid Build Coastguard Worker case RTM_NEWNETCONF:
324*4dc78e53SAndroid Build Coastguard Worker if (new_nc->family != old_nc->family ||
325*4dc78e53SAndroid Build Coastguard Worker new_nc->ifindex != old_nc->ifindex)
326*4dc78e53SAndroid Build Coastguard Worker return -NLE_OPNOTSUPP;
327*4dc78e53SAndroid Build Coastguard Worker
328*4dc78e53SAndroid Build Coastguard Worker if (new_nc->ce_mask & NETCONF_ATTR_RP_FILTER)
329*4dc78e53SAndroid Build Coastguard Worker old_nc->rp_filter = new_nc->rp_filter;
330*4dc78e53SAndroid Build Coastguard Worker if (new_nc->ce_mask & NETCONF_ATTR_FWDING)
331*4dc78e53SAndroid Build Coastguard Worker old_nc->forwarding = new_nc->forwarding;
332*4dc78e53SAndroid Build Coastguard Worker if (new_nc->ce_mask & NETCONF_ATTR_MC_FWDING)
333*4dc78e53SAndroid Build Coastguard Worker old_nc->mc_forwarding = new_nc->mc_forwarding;
334*4dc78e53SAndroid Build Coastguard Worker if (new_nc->ce_mask & NETCONF_ATTR_PROXY_NEIGH)
335*4dc78e53SAndroid Build Coastguard Worker old_nc->proxy_neigh = new_nc->proxy_neigh;
336*4dc78e53SAndroid Build Coastguard Worker if (new_nc->ce_mask & NETCONF_ATTR_IGNORE_RT_LINKDWN)
337*4dc78e53SAndroid Build Coastguard Worker old_nc->ignore_routes_linkdown = new_nc->ignore_routes_linkdown;
338*4dc78e53SAndroid Build Coastguard Worker
339*4dc78e53SAndroid Build Coastguard Worker break;
340*4dc78e53SAndroid Build Coastguard Worker default:
341*4dc78e53SAndroid Build Coastguard Worker return -NLE_OPNOTSUPP;
342*4dc78e53SAndroid Build Coastguard Worker }
343*4dc78e53SAndroid Build Coastguard Worker
344*4dc78e53SAndroid Build Coastguard Worker return NLE_SUCCESS;
345*4dc78e53SAndroid Build Coastguard Worker }
346*4dc78e53SAndroid Build Coastguard Worker
347*4dc78e53SAndroid Build Coastguard Worker /**
348*4dc78e53SAndroid Build Coastguard Worker * @name Cache Management
349*4dc78e53SAndroid Build Coastguard Worker * @{
350*4dc78e53SAndroid Build Coastguard Worker */
351*4dc78e53SAndroid Build Coastguard Worker
rtnl_netconf_alloc_cache(struct nl_sock * sk,struct nl_cache ** result)352*4dc78e53SAndroid Build Coastguard Worker int rtnl_netconf_alloc_cache(struct nl_sock *sk, struct nl_cache **result)
353*4dc78e53SAndroid Build Coastguard Worker {
354*4dc78e53SAndroid Build Coastguard Worker return nl_cache_alloc_and_fill(&rtnl_netconf_ops, sk, result);
355*4dc78e53SAndroid Build Coastguard Worker }
356*4dc78e53SAndroid Build Coastguard Worker
357*4dc78e53SAndroid Build Coastguard Worker /**
358*4dc78e53SAndroid Build Coastguard Worker * Search netconf in cache
359*4dc78e53SAndroid Build Coastguard Worker * @arg cache netconf cache
360*4dc78e53SAndroid Build Coastguard Worker * @arg family Address family of interest
361*4dc78e53SAndroid Build Coastguard Worker * @arg ifindex Interface index of interest
362*4dc78e53SAndroid Build Coastguard Worker *
363*4dc78e53SAndroid Build Coastguard Worker * Searches netconf cache previously allocated with rtnl_netconf_alloc_cache()
364*4dc78e53SAndroid Build Coastguard Worker * for given index and family
365*4dc78e53SAndroid Build Coastguard Worker *
366*4dc78e53SAndroid Build Coastguard Worker * The reference counter is incremented before returning the netconf entry,
367*4dc78e53SAndroid Build Coastguard Worker * therefore the reference must be given back with rtnl_netconf_put() after
368*4dc78e53SAndroid Build Coastguard Worker * usage.
369*4dc78e53SAndroid Build Coastguard Worker *
370*4dc78e53SAndroid Build Coastguard Worker * @return netconf object or NULL if no match was found.
371*4dc78e53SAndroid Build Coastguard Worker */
rtnl_netconf_get_by_idx(struct nl_cache * cache,int family,int ifindex)372*4dc78e53SAndroid Build Coastguard Worker struct rtnl_netconf *rtnl_netconf_get_by_idx(struct nl_cache *cache, int family,
373*4dc78e53SAndroid Build Coastguard Worker int ifindex)
374*4dc78e53SAndroid Build Coastguard Worker {
375*4dc78e53SAndroid Build Coastguard Worker struct rtnl_netconf *nc;
376*4dc78e53SAndroid Build Coastguard Worker
377*4dc78e53SAndroid Build Coastguard Worker if (!ifindex || !family || cache->c_ops != &rtnl_netconf_ops)
378*4dc78e53SAndroid Build Coastguard Worker return NULL;
379*4dc78e53SAndroid Build Coastguard Worker
380*4dc78e53SAndroid Build Coastguard Worker nl_list_for_each_entry(nc, &cache->c_items, ce_list) {
381*4dc78e53SAndroid Build Coastguard Worker if (nc->ifindex == ifindex &&
382*4dc78e53SAndroid Build Coastguard Worker nc->family == family) {
383*4dc78e53SAndroid Build Coastguard Worker nl_object_get((struct nl_object *) nc);
384*4dc78e53SAndroid Build Coastguard Worker return nc;
385*4dc78e53SAndroid Build Coastguard Worker }
386*4dc78e53SAndroid Build Coastguard Worker }
387*4dc78e53SAndroid Build Coastguard Worker
388*4dc78e53SAndroid Build Coastguard Worker return NULL;
389*4dc78e53SAndroid Build Coastguard Worker }
390*4dc78e53SAndroid Build Coastguard Worker
rtnl_netconf_put(struct rtnl_netconf * nc)391*4dc78e53SAndroid Build Coastguard Worker void rtnl_netconf_put(struct rtnl_netconf *nc)
392*4dc78e53SAndroid Build Coastguard Worker {
393*4dc78e53SAndroid Build Coastguard Worker nl_object_put((struct nl_object *) nc);
394*4dc78e53SAndroid Build Coastguard Worker }
395*4dc78e53SAndroid Build Coastguard Worker
396*4dc78e53SAndroid Build Coastguard Worker /**
397*4dc78e53SAndroid Build Coastguard Worker * Search netconf in cache
398*4dc78e53SAndroid Build Coastguard Worker * @arg cache netconf cache
399*4dc78e53SAndroid Build Coastguard Worker * @arg family Address family of interest
400*4dc78e53SAndroid Build Coastguard Worker *
401*4dc78e53SAndroid Build Coastguard Worker * Searches netconf cache previously allocated with rtnl_netconf_alloc_cache()
402*4dc78e53SAndroid Build Coastguard Worker * for "all" netconf settings for given family
403*4dc78e53SAndroid Build Coastguard Worker *
404*4dc78e53SAndroid Build Coastguard Worker * The reference counter is incremented before returning the netconf entry,
405*4dc78e53SAndroid Build Coastguard Worker * therefore the reference must be given back with rtnl_netconf_put() after
406*4dc78e53SAndroid Build Coastguard Worker * usage.
407*4dc78e53SAndroid Build Coastguard Worker *
408*4dc78e53SAndroid Build Coastguard Worker * @return netconf object or NULL if no match was found.
409*4dc78e53SAndroid Build Coastguard Worker */
rtnl_netconf_get_all(struct nl_cache * cache,int family)410*4dc78e53SAndroid Build Coastguard Worker struct rtnl_netconf *rtnl_netconf_get_all(struct nl_cache *cache, int family)
411*4dc78e53SAndroid Build Coastguard Worker {
412*4dc78e53SAndroid Build Coastguard Worker return rtnl_netconf_get_by_idx(cache, family, NETCONFA_IFINDEX_ALL);
413*4dc78e53SAndroid Build Coastguard Worker }
414*4dc78e53SAndroid Build Coastguard Worker
415*4dc78e53SAndroid Build Coastguard Worker /**
416*4dc78e53SAndroid Build Coastguard Worker * Search netconf in cache
417*4dc78e53SAndroid Build Coastguard Worker * @arg cache netconf cache
418*4dc78e53SAndroid Build Coastguard Worker * @arg family Address family of interest
419*4dc78e53SAndroid Build Coastguard Worker *
420*4dc78e53SAndroid Build Coastguard Worker * Searches netconf cache previously allocated with rtnl_netconf_alloc_cache()
421*4dc78e53SAndroid Build Coastguard Worker * for "default" netconf settings for given family
422*4dc78e53SAndroid Build Coastguard Worker *
423*4dc78e53SAndroid Build Coastguard Worker * The reference counter is incremented before returning the netconf entry,
424*4dc78e53SAndroid Build Coastguard Worker * therefore the reference must be given back with rtnl_netconf_put() after
425*4dc78e53SAndroid Build Coastguard Worker * usage.
426*4dc78e53SAndroid Build Coastguard Worker *
427*4dc78e53SAndroid Build Coastguard Worker * @return netconf object or NULL if no match was found.
428*4dc78e53SAndroid Build Coastguard Worker */
rtnl_netconf_get_default(struct nl_cache * cache,int family)429*4dc78e53SAndroid Build Coastguard Worker struct rtnl_netconf *rtnl_netconf_get_default(struct nl_cache *cache, int family)
430*4dc78e53SAndroid Build Coastguard Worker {
431*4dc78e53SAndroid Build Coastguard Worker return rtnl_netconf_get_by_idx(cache, family, NETCONFA_IFINDEX_DEFAULT);
432*4dc78e53SAndroid Build Coastguard Worker }
433*4dc78e53SAndroid Build Coastguard Worker
434*4dc78e53SAndroid Build Coastguard Worker /** @} */
435*4dc78e53SAndroid Build Coastguard Worker
436*4dc78e53SAndroid Build Coastguard Worker /**
437*4dc78e53SAndroid Build Coastguard Worker * @name Attributes
438*4dc78e53SAndroid Build Coastguard Worker * @{
439*4dc78e53SAndroid Build Coastguard Worker */
440*4dc78e53SAndroid Build Coastguard Worker
rtnl_netconf_get_family(struct rtnl_netconf * nc,int * val)441*4dc78e53SAndroid Build Coastguard Worker int rtnl_netconf_get_family(struct rtnl_netconf *nc, int *val)
442*4dc78e53SAndroid Build Coastguard Worker {
443*4dc78e53SAndroid Build Coastguard Worker if (!nc)
444*4dc78e53SAndroid Build Coastguard Worker return -NLE_INVAL;
445*4dc78e53SAndroid Build Coastguard Worker if (!(nc->ce_mask & NETCONF_ATTR_FAMILY))
446*4dc78e53SAndroid Build Coastguard Worker return -NLE_MISSING_ATTR;
447*4dc78e53SAndroid Build Coastguard Worker if (val)
448*4dc78e53SAndroid Build Coastguard Worker *val = nc->family;
449*4dc78e53SAndroid Build Coastguard Worker return 0;
450*4dc78e53SAndroid Build Coastguard Worker }
rtnl_netconf_get_ifindex(struct rtnl_netconf * nc,int * val)451*4dc78e53SAndroid Build Coastguard Worker int rtnl_netconf_get_ifindex(struct rtnl_netconf *nc, int *val)
452*4dc78e53SAndroid Build Coastguard Worker {
453*4dc78e53SAndroid Build Coastguard Worker if (!nc)
454*4dc78e53SAndroid Build Coastguard Worker return -NLE_INVAL;
455*4dc78e53SAndroid Build Coastguard Worker if (!(nc->ce_mask & NETCONF_ATTR_IFINDEX))
456*4dc78e53SAndroid Build Coastguard Worker return -NLE_MISSING_ATTR;
457*4dc78e53SAndroid Build Coastguard Worker if (val)
458*4dc78e53SAndroid Build Coastguard Worker *val = nc->ifindex;
459*4dc78e53SAndroid Build Coastguard Worker return 0;
460*4dc78e53SAndroid Build Coastguard Worker }
rtnl_netconf_get_forwarding(struct rtnl_netconf * nc,int * val)461*4dc78e53SAndroid Build Coastguard Worker int rtnl_netconf_get_forwarding(struct rtnl_netconf *nc, int *val)
462*4dc78e53SAndroid Build Coastguard Worker {
463*4dc78e53SAndroid Build Coastguard Worker if (!nc)
464*4dc78e53SAndroid Build Coastguard Worker return -NLE_INVAL;
465*4dc78e53SAndroid Build Coastguard Worker if (!(nc->ce_mask & NETCONF_ATTR_FWDING))
466*4dc78e53SAndroid Build Coastguard Worker return -NLE_MISSING_ATTR;
467*4dc78e53SAndroid Build Coastguard Worker if (val)
468*4dc78e53SAndroid Build Coastguard Worker *val = nc->forwarding;
469*4dc78e53SAndroid Build Coastguard Worker return 0;
470*4dc78e53SAndroid Build Coastguard Worker }
rtnl_netconf_get_mc_forwarding(struct rtnl_netconf * nc,int * val)471*4dc78e53SAndroid Build Coastguard Worker int rtnl_netconf_get_mc_forwarding(struct rtnl_netconf *nc, int *val)
472*4dc78e53SAndroid Build Coastguard Worker {
473*4dc78e53SAndroid Build Coastguard Worker if (!nc)
474*4dc78e53SAndroid Build Coastguard Worker return -NLE_INVAL;
475*4dc78e53SAndroid Build Coastguard Worker if (!(nc->ce_mask & NETCONF_ATTR_MC_FWDING))
476*4dc78e53SAndroid Build Coastguard Worker return -NLE_MISSING_ATTR;
477*4dc78e53SAndroid Build Coastguard Worker if (val)
478*4dc78e53SAndroid Build Coastguard Worker *val = nc->mc_forwarding;
479*4dc78e53SAndroid Build Coastguard Worker return 0;
480*4dc78e53SAndroid Build Coastguard Worker }
rtnl_netconf_get_rp_filter(struct rtnl_netconf * nc,int * val)481*4dc78e53SAndroid Build Coastguard Worker int rtnl_netconf_get_rp_filter(struct rtnl_netconf *nc, int *val)
482*4dc78e53SAndroid Build Coastguard Worker {
483*4dc78e53SAndroid Build Coastguard Worker if (!nc)
484*4dc78e53SAndroid Build Coastguard Worker return -NLE_INVAL;
485*4dc78e53SAndroid Build Coastguard Worker if (!(nc->ce_mask & NETCONF_ATTR_RP_FILTER))
486*4dc78e53SAndroid Build Coastguard Worker return -NLE_MISSING_ATTR;
487*4dc78e53SAndroid Build Coastguard Worker if (val)
488*4dc78e53SAndroid Build Coastguard Worker *val = nc->rp_filter;
489*4dc78e53SAndroid Build Coastguard Worker return 0;
490*4dc78e53SAndroid Build Coastguard Worker }
rtnl_netconf_get_proxy_neigh(struct rtnl_netconf * nc,int * val)491*4dc78e53SAndroid Build Coastguard Worker int rtnl_netconf_get_proxy_neigh(struct rtnl_netconf *nc, int *val)
492*4dc78e53SAndroid Build Coastguard Worker {
493*4dc78e53SAndroid Build Coastguard Worker if (!nc)
494*4dc78e53SAndroid Build Coastguard Worker return -NLE_INVAL;
495*4dc78e53SAndroid Build Coastguard Worker if (!(nc->ce_mask & NETCONF_ATTR_PROXY_NEIGH))
496*4dc78e53SAndroid Build Coastguard Worker return -NLE_MISSING_ATTR;
497*4dc78e53SAndroid Build Coastguard Worker if (val)
498*4dc78e53SAndroid Build Coastguard Worker *val = nc->proxy_neigh;
499*4dc78e53SAndroid Build Coastguard Worker return 0;
500*4dc78e53SAndroid Build Coastguard Worker }
rtnl_netconf_get_ignore_routes_linkdown(struct rtnl_netconf * nc,int * val)501*4dc78e53SAndroid Build Coastguard Worker int rtnl_netconf_get_ignore_routes_linkdown(struct rtnl_netconf *nc, int *val)
502*4dc78e53SAndroid Build Coastguard Worker {
503*4dc78e53SAndroid Build Coastguard Worker if (!nc)
504*4dc78e53SAndroid Build Coastguard Worker return -NLE_INVAL;
505*4dc78e53SAndroid Build Coastguard Worker if (!(nc->ce_mask & NETCONF_ATTR_IGNORE_RT_LINKDWN))
506*4dc78e53SAndroid Build Coastguard Worker return -NLE_MISSING_ATTR;
507*4dc78e53SAndroid Build Coastguard Worker if (val)
508*4dc78e53SAndroid Build Coastguard Worker *val = nc->ignore_routes_linkdown;
509*4dc78e53SAndroid Build Coastguard Worker return 0;
510*4dc78e53SAndroid Build Coastguard Worker }
rtnl_netconf_get_input(struct rtnl_netconf * nc,int * val)511*4dc78e53SAndroid Build Coastguard Worker int rtnl_netconf_get_input(struct rtnl_netconf *nc, int *val)
512*4dc78e53SAndroid Build Coastguard Worker {
513*4dc78e53SAndroid Build Coastguard Worker if (!nc)
514*4dc78e53SAndroid Build Coastguard Worker return -NLE_INVAL;
515*4dc78e53SAndroid Build Coastguard Worker if (!(nc->ce_mask & NETCONF_ATTR_INPUT))
516*4dc78e53SAndroid Build Coastguard Worker return -NLE_MISSING_ATTR;
517*4dc78e53SAndroid Build Coastguard Worker if (val)
518*4dc78e53SAndroid Build Coastguard Worker *val = nc->input;
519*4dc78e53SAndroid Build Coastguard Worker return 0;
520*4dc78e53SAndroid Build Coastguard Worker }
521*4dc78e53SAndroid Build Coastguard Worker
522*4dc78e53SAndroid Build Coastguard Worker
523*4dc78e53SAndroid Build Coastguard Worker /** @} */
524*4dc78e53SAndroid Build Coastguard Worker
525*4dc78e53SAndroid Build Coastguard Worker static struct nl_object_ops netconf_obj_ops = {
526*4dc78e53SAndroid Build Coastguard Worker .oo_name = "route/netconf",
527*4dc78e53SAndroid Build Coastguard Worker .oo_size = sizeof(struct rtnl_netconf),
528*4dc78e53SAndroid Build Coastguard Worker .oo_dump = {
529*4dc78e53SAndroid Build Coastguard Worker [NL_DUMP_LINE] = netconf_dump_line,
530*4dc78e53SAndroid Build Coastguard Worker [NL_DUMP_DETAILS] = netconf_dump_line,
531*4dc78e53SAndroid Build Coastguard Worker },
532*4dc78e53SAndroid Build Coastguard Worker .oo_compare = netconf_compare,
533*4dc78e53SAndroid Build Coastguard Worker .oo_keygen = netconf_keygen,
534*4dc78e53SAndroid Build Coastguard Worker .oo_update = netconf_update,
535*4dc78e53SAndroid Build Coastguard Worker .oo_attrs2str = netconf_attrs2str,
536*4dc78e53SAndroid Build Coastguard Worker .oo_id_attrs = (NETCONF_ATTR_FAMILY |
537*4dc78e53SAndroid Build Coastguard Worker NETCONF_ATTR_IFINDEX)
538*4dc78e53SAndroid Build Coastguard Worker };
539*4dc78e53SAndroid Build Coastguard Worker
540*4dc78e53SAndroid Build Coastguard Worker static struct nl_af_group netconf_groups[] = {
541*4dc78e53SAndroid Build Coastguard Worker { AF_INET, RTNLGRP_IPV4_NETCONF },
542*4dc78e53SAndroid Build Coastguard Worker { AF_INET6, RTNLGRP_IPV6_NETCONF },
543*4dc78e53SAndroid Build Coastguard Worker { AF_MPLS, RTNLGRP_MPLS_NETCONF },
544*4dc78e53SAndroid Build Coastguard Worker { END_OF_GROUP_LIST },
545*4dc78e53SAndroid Build Coastguard Worker };
546*4dc78e53SAndroid Build Coastguard Worker
547*4dc78e53SAndroid Build Coastguard Worker static struct nl_cache_ops rtnl_netconf_ops = {
548*4dc78e53SAndroid Build Coastguard Worker .co_name = "route/netconf",
549*4dc78e53SAndroid Build Coastguard Worker .co_hdrsize = sizeof(struct netconfmsg),
550*4dc78e53SAndroid Build Coastguard Worker .co_msgtypes = {
551*4dc78e53SAndroid Build Coastguard Worker { RTM_NEWNETCONF, NL_ACT_NEW, "new" },
552*4dc78e53SAndroid Build Coastguard Worker { RTM_DELNETCONF, NL_ACT_DEL, "del" },
553*4dc78e53SAndroid Build Coastguard Worker { RTM_GETNETCONF, NL_ACT_GET, "get" },
554*4dc78e53SAndroid Build Coastguard Worker END_OF_MSGTYPES_LIST,
555*4dc78e53SAndroid Build Coastguard Worker },
556*4dc78e53SAndroid Build Coastguard Worker .co_protocol = NETLINK_ROUTE,
557*4dc78e53SAndroid Build Coastguard Worker .co_groups = netconf_groups,
558*4dc78e53SAndroid Build Coastguard Worker .co_request_update = netconf_request_update,
559*4dc78e53SAndroid Build Coastguard Worker .co_msg_parser = netconf_msg_parser,
560*4dc78e53SAndroid Build Coastguard Worker .co_obj_ops = &netconf_obj_ops,
561*4dc78e53SAndroid Build Coastguard Worker };
562*4dc78e53SAndroid Build Coastguard Worker
netconf_init(void)563*4dc78e53SAndroid Build Coastguard Worker static void _nl_init netconf_init(void)
564*4dc78e53SAndroid Build Coastguard Worker {
565*4dc78e53SAndroid Build Coastguard Worker nl_cache_mngt_register(&rtnl_netconf_ops);
566*4dc78e53SAndroid Build Coastguard Worker }
567*4dc78e53SAndroid Build Coastguard Worker
netconf_exit(void)568*4dc78e53SAndroid Build Coastguard Worker static void _nl_exit netconf_exit(void)
569*4dc78e53SAndroid Build Coastguard Worker {
570*4dc78e53SAndroid Build Coastguard Worker nl_cache_mngt_unregister(&rtnl_netconf_ops);
571*4dc78e53SAndroid Build Coastguard Worker }
572*4dc78e53SAndroid Build Coastguard Worker
573*4dc78e53SAndroid Build Coastguard Worker /** @} */
574