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 Volodymyr Bendiuga <[email protected]>
4*4dc78e53SAndroid Build Coastguard Worker */
5*4dc78e53SAndroid Build Coastguard Worker
6*4dc78e53SAndroid Build Coastguard Worker /**
7*4dc78e53SAndroid Build Coastguard Worker * @ingroup cls
8*4dc78e53SAndroid Build Coastguard Worker * @defgroup cls_mall Match-all Classifier
9*4dc78e53SAndroid Build Coastguard Worker *
10*4dc78e53SAndroid Build Coastguard Worker * @{
11*4dc78e53SAndroid Build Coastguard Worker */
12*4dc78e53SAndroid Build Coastguard Worker
13*4dc78e53SAndroid Build Coastguard Worker #include "nl-default.h"
14*4dc78e53SAndroid Build Coastguard Worker
15*4dc78e53SAndroid Build Coastguard Worker #include <netlink/netlink.h>
16*4dc78e53SAndroid Build Coastguard Worker #include <netlink/attr.h>
17*4dc78e53SAndroid Build Coastguard Worker #include <netlink/utils.h>
18*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/classifier.h>
19*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/cls/matchall.h>
20*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/action.h>
21*4dc78e53SAndroid Build Coastguard Worker
22*4dc78e53SAndroid Build Coastguard Worker #include "tc-api.h"
23*4dc78e53SAndroid Build Coastguard Worker #include "nl-aux-route/nl-route.h"
24*4dc78e53SAndroid Build Coastguard Worker
25*4dc78e53SAndroid Build Coastguard Worker struct rtnl_mall {
26*4dc78e53SAndroid Build Coastguard Worker uint32_t m_classid;
27*4dc78e53SAndroid Build Coastguard Worker uint32_t m_flags;
28*4dc78e53SAndroid Build Coastguard Worker struct rtnl_act *m_act;
29*4dc78e53SAndroid Build Coastguard Worker int m_mask;
30*4dc78e53SAndroid Build Coastguard Worker };
31*4dc78e53SAndroid Build Coastguard Worker
32*4dc78e53SAndroid Build Coastguard Worker #define MALL_ATTR_CLASSID 0x01
33*4dc78e53SAndroid Build Coastguard Worker #define MALL_ATTR_FLAGS 0x02
34*4dc78e53SAndroid Build Coastguard Worker #define MALL_ATTR_ACTION 0x03
35*4dc78e53SAndroid Build Coastguard Worker
36*4dc78e53SAndroid Build Coastguard Worker
37*4dc78e53SAndroid Build Coastguard Worker static struct nla_policy mall_policy[TCA_MATCHALL_MAX + 1] = {
38*4dc78e53SAndroid Build Coastguard Worker [TCA_MATCHALL_CLASSID] = { .type = NLA_U32 },
39*4dc78e53SAndroid Build Coastguard Worker [TCA_MATCHALL_FLAGS] = { .type = NLA_U32 },
40*4dc78e53SAndroid Build Coastguard Worker };
41*4dc78e53SAndroid Build Coastguard Worker
42*4dc78e53SAndroid Build Coastguard Worker /**
43*4dc78e53SAndroid Build Coastguard Worker * @name Attribute Modifications
44*4dc78e53SAndroid Build Coastguard Worker * @{
45*4dc78e53SAndroid Build Coastguard Worker */
46*4dc78e53SAndroid Build Coastguard Worker
rtnl_mall_set_classid(struct rtnl_cls * cls,uint32_t classid)47*4dc78e53SAndroid Build Coastguard Worker int rtnl_mall_set_classid(struct rtnl_cls *cls, uint32_t classid)
48*4dc78e53SAndroid Build Coastguard Worker {
49*4dc78e53SAndroid Build Coastguard Worker struct rtnl_mall *mall;
50*4dc78e53SAndroid Build Coastguard Worker if (!(mall = rtnl_tc_data(TC_CAST(cls))))
51*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
52*4dc78e53SAndroid Build Coastguard Worker
53*4dc78e53SAndroid Build Coastguard Worker mall->m_classid = classid;
54*4dc78e53SAndroid Build Coastguard Worker mall->m_mask |= MALL_ATTR_CLASSID;
55*4dc78e53SAndroid Build Coastguard Worker
56*4dc78e53SAndroid Build Coastguard Worker return 0;
57*4dc78e53SAndroid Build Coastguard Worker }
58*4dc78e53SAndroid Build Coastguard Worker
rtnl_mall_get_classid(struct rtnl_cls * cls,uint32_t * classid)59*4dc78e53SAndroid Build Coastguard Worker int rtnl_mall_get_classid(struct rtnl_cls *cls, uint32_t *classid)
60*4dc78e53SAndroid Build Coastguard Worker {
61*4dc78e53SAndroid Build Coastguard Worker struct rtnl_mall *mall;
62*4dc78e53SAndroid Build Coastguard Worker
63*4dc78e53SAndroid Build Coastguard Worker if (!(mall = rtnl_tc_data_peek(TC_CAST(cls))))
64*4dc78e53SAndroid Build Coastguard Worker return -NLE_INVAL;
65*4dc78e53SAndroid Build Coastguard Worker
66*4dc78e53SAndroid Build Coastguard Worker if (!(mall->m_mask & MALL_ATTR_CLASSID))
67*4dc78e53SAndroid Build Coastguard Worker return -NLE_INVAL;
68*4dc78e53SAndroid Build Coastguard Worker
69*4dc78e53SAndroid Build Coastguard Worker *classid = mall->m_classid;
70*4dc78e53SAndroid Build Coastguard Worker return 0;
71*4dc78e53SAndroid Build Coastguard Worker }
72*4dc78e53SAndroid Build Coastguard Worker
rtnl_mall_set_flags(struct rtnl_cls * cls,uint32_t flags)73*4dc78e53SAndroid Build Coastguard Worker int rtnl_mall_set_flags(struct rtnl_cls *cls, uint32_t flags)
74*4dc78e53SAndroid Build Coastguard Worker {
75*4dc78e53SAndroid Build Coastguard Worker struct rtnl_mall *mall;
76*4dc78e53SAndroid Build Coastguard Worker
77*4dc78e53SAndroid Build Coastguard Worker if (!(mall = rtnl_tc_data(TC_CAST(cls))))
78*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
79*4dc78e53SAndroid Build Coastguard Worker
80*4dc78e53SAndroid Build Coastguard Worker mall->m_flags = flags;
81*4dc78e53SAndroid Build Coastguard Worker mall->m_mask |= MALL_ATTR_FLAGS;
82*4dc78e53SAndroid Build Coastguard Worker
83*4dc78e53SAndroid Build Coastguard Worker return 0;
84*4dc78e53SAndroid Build Coastguard Worker }
85*4dc78e53SAndroid Build Coastguard Worker
rtnl_mall_get_flags(struct rtnl_cls * cls,uint32_t * flags)86*4dc78e53SAndroid Build Coastguard Worker int rtnl_mall_get_flags(struct rtnl_cls *cls, uint32_t *flags)
87*4dc78e53SAndroid Build Coastguard Worker {
88*4dc78e53SAndroid Build Coastguard Worker struct rtnl_mall *mall;
89*4dc78e53SAndroid Build Coastguard Worker
90*4dc78e53SAndroid Build Coastguard Worker if (!(mall = rtnl_tc_data_peek(TC_CAST(cls))))
91*4dc78e53SAndroid Build Coastguard Worker return -NLE_INVAL;
92*4dc78e53SAndroid Build Coastguard Worker
93*4dc78e53SAndroid Build Coastguard Worker if (!(mall->m_mask & MALL_ATTR_FLAGS))
94*4dc78e53SAndroid Build Coastguard Worker return -NLE_INVAL;
95*4dc78e53SAndroid Build Coastguard Worker
96*4dc78e53SAndroid Build Coastguard Worker *flags = mall->m_flags;
97*4dc78e53SAndroid Build Coastguard Worker return 0;
98*4dc78e53SAndroid Build Coastguard Worker }
99*4dc78e53SAndroid Build Coastguard Worker
rtnl_mall_append_action(struct rtnl_cls * cls,struct rtnl_act * act)100*4dc78e53SAndroid Build Coastguard Worker int rtnl_mall_append_action(struct rtnl_cls *cls, struct rtnl_act *act)
101*4dc78e53SAndroid Build Coastguard Worker {
102*4dc78e53SAndroid Build Coastguard Worker struct rtnl_mall *mall;
103*4dc78e53SAndroid Build Coastguard Worker int err;
104*4dc78e53SAndroid Build Coastguard Worker
105*4dc78e53SAndroid Build Coastguard Worker if (!act)
106*4dc78e53SAndroid Build Coastguard Worker return 0;
107*4dc78e53SAndroid Build Coastguard Worker
108*4dc78e53SAndroid Build Coastguard Worker if (!(mall = rtnl_tc_data(TC_CAST(cls))))
109*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
110*4dc78e53SAndroid Build Coastguard Worker
111*4dc78e53SAndroid Build Coastguard Worker if ((err = _rtnl_act_append_get(&mall->m_act, act)) < 0)
112*4dc78e53SAndroid Build Coastguard Worker return err;
113*4dc78e53SAndroid Build Coastguard Worker
114*4dc78e53SAndroid Build Coastguard Worker mall->m_mask |= MALL_ATTR_ACTION;
115*4dc78e53SAndroid Build Coastguard Worker return 0;
116*4dc78e53SAndroid Build Coastguard Worker }
117*4dc78e53SAndroid Build Coastguard Worker
rtnl_mall_get_first_action(struct rtnl_cls * cls)118*4dc78e53SAndroid Build Coastguard Worker struct rtnl_act *rtnl_mall_get_first_action(struct rtnl_cls *cls)
119*4dc78e53SAndroid Build Coastguard Worker {
120*4dc78e53SAndroid Build Coastguard Worker struct rtnl_mall *mall;
121*4dc78e53SAndroid Build Coastguard Worker struct rtnl_act *act;
122*4dc78e53SAndroid Build Coastguard Worker
123*4dc78e53SAndroid Build Coastguard Worker if (!(mall = rtnl_tc_data(TC_CAST(cls))))
124*4dc78e53SAndroid Build Coastguard Worker return NULL;
125*4dc78e53SAndroid Build Coastguard Worker
126*4dc78e53SAndroid Build Coastguard Worker if (!(mall->m_mask & MALL_ATTR_ACTION))
127*4dc78e53SAndroid Build Coastguard Worker return NULL;
128*4dc78e53SAndroid Build Coastguard Worker
129*4dc78e53SAndroid Build Coastguard Worker act = mall->m_act;
130*4dc78e53SAndroid Build Coastguard Worker rtnl_act_get(act);
131*4dc78e53SAndroid Build Coastguard Worker
132*4dc78e53SAndroid Build Coastguard Worker return act;
133*4dc78e53SAndroid Build Coastguard Worker }
134*4dc78e53SAndroid Build Coastguard Worker
rtnl_mall_del_action(struct rtnl_cls * cls,struct rtnl_act * act)135*4dc78e53SAndroid Build Coastguard Worker int rtnl_mall_del_action(struct rtnl_cls *cls, struct rtnl_act *act)
136*4dc78e53SAndroid Build Coastguard Worker {
137*4dc78e53SAndroid Build Coastguard Worker struct rtnl_mall *mall;
138*4dc78e53SAndroid Build Coastguard Worker int ret;
139*4dc78e53SAndroid Build Coastguard Worker
140*4dc78e53SAndroid Build Coastguard Worker if (!act)
141*4dc78e53SAndroid Build Coastguard Worker return 0;
142*4dc78e53SAndroid Build Coastguard Worker
143*4dc78e53SAndroid Build Coastguard Worker if (!(mall = rtnl_tc_data(TC_CAST(cls))))
144*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
145*4dc78e53SAndroid Build Coastguard Worker
146*4dc78e53SAndroid Build Coastguard Worker if (!(mall->m_mask & MALL_ATTR_ACTION))
147*4dc78e53SAndroid Build Coastguard Worker return -NLE_INVAL;
148*4dc78e53SAndroid Build Coastguard Worker
149*4dc78e53SAndroid Build Coastguard Worker ret = rtnl_act_remove(&mall->m_act, act);
150*4dc78e53SAndroid Build Coastguard Worker if (ret < 0)
151*4dc78e53SAndroid Build Coastguard Worker return ret;
152*4dc78e53SAndroid Build Coastguard Worker
153*4dc78e53SAndroid Build Coastguard Worker rtnl_act_put(act);
154*4dc78e53SAndroid Build Coastguard Worker
155*4dc78e53SAndroid Build Coastguard Worker return 0;
156*4dc78e53SAndroid Build Coastguard Worker }
157*4dc78e53SAndroid Build Coastguard Worker
158*4dc78e53SAndroid Build Coastguard Worker /** @} */
159*4dc78e53SAndroid Build Coastguard Worker
mall_free_data(struct rtnl_tc * tc,void * data)160*4dc78e53SAndroid Build Coastguard Worker static void mall_free_data(struct rtnl_tc *tc, void *data)
161*4dc78e53SAndroid Build Coastguard Worker {
162*4dc78e53SAndroid Build Coastguard Worker struct rtnl_mall *mall = data;
163*4dc78e53SAndroid Build Coastguard Worker
164*4dc78e53SAndroid Build Coastguard Worker if (mall->m_act)
165*4dc78e53SAndroid Build Coastguard Worker rtnl_act_put_all(&mall->m_act);
166*4dc78e53SAndroid Build Coastguard Worker }
167*4dc78e53SAndroid Build Coastguard Worker
mall_msg_parser(struct rtnl_tc * tc,void * data)168*4dc78e53SAndroid Build Coastguard Worker static int mall_msg_parser(struct rtnl_tc *tc, void *data)
169*4dc78e53SAndroid Build Coastguard Worker {
170*4dc78e53SAndroid Build Coastguard Worker struct rtnl_mall *mall = data;
171*4dc78e53SAndroid Build Coastguard Worker struct nlattr *tb[TCA_MATCHALL_MAX + 1];
172*4dc78e53SAndroid Build Coastguard Worker int err;
173*4dc78e53SAndroid Build Coastguard Worker
174*4dc78e53SAndroid Build Coastguard Worker err = tca_parse(tb, TCA_MATCHALL_MAX, tc, mall_policy);
175*4dc78e53SAndroid Build Coastguard Worker if (err < 0)
176*4dc78e53SAndroid Build Coastguard Worker return err;
177*4dc78e53SAndroid Build Coastguard Worker
178*4dc78e53SAndroid Build Coastguard Worker if (tb[TCA_MATCHALL_CLASSID]) {
179*4dc78e53SAndroid Build Coastguard Worker mall->m_classid = nla_get_u32(tb[TCA_MATCHALL_CLASSID]);
180*4dc78e53SAndroid Build Coastguard Worker mall->m_mask |= MALL_ATTR_CLASSID;
181*4dc78e53SAndroid Build Coastguard Worker }
182*4dc78e53SAndroid Build Coastguard Worker
183*4dc78e53SAndroid Build Coastguard Worker if (tb[TCA_MATCHALL_FLAGS]) {
184*4dc78e53SAndroid Build Coastguard Worker mall->m_flags = nla_get_u32(tb[TCA_MATCHALL_FLAGS]);
185*4dc78e53SAndroid Build Coastguard Worker mall->m_mask |= MALL_ATTR_FLAGS;
186*4dc78e53SAndroid Build Coastguard Worker }
187*4dc78e53SAndroid Build Coastguard Worker
188*4dc78e53SAndroid Build Coastguard Worker if (tb[TCA_MATCHALL_ACT]) {
189*4dc78e53SAndroid Build Coastguard Worker mall->m_mask |= MALL_ATTR_ACTION;
190*4dc78e53SAndroid Build Coastguard Worker err = rtnl_act_parse(&mall->m_act, tb[TCA_MATCHALL_ACT]);
191*4dc78e53SAndroid Build Coastguard Worker if (err < 0)
192*4dc78e53SAndroid Build Coastguard Worker return err;
193*4dc78e53SAndroid Build Coastguard Worker }
194*4dc78e53SAndroid Build Coastguard Worker
195*4dc78e53SAndroid Build Coastguard Worker return 0;
196*4dc78e53SAndroid Build Coastguard Worker }
197*4dc78e53SAndroid Build Coastguard Worker
mall_msg_fill(struct rtnl_tc * tc,void * data,struct nl_msg * msg)198*4dc78e53SAndroid Build Coastguard Worker static int mall_msg_fill(struct rtnl_tc *tc, void *data, struct nl_msg *msg)
199*4dc78e53SAndroid Build Coastguard Worker {
200*4dc78e53SAndroid Build Coastguard Worker struct rtnl_mall *mall = data;
201*4dc78e53SAndroid Build Coastguard Worker
202*4dc78e53SAndroid Build Coastguard Worker if (!mall)
203*4dc78e53SAndroid Build Coastguard Worker return 0;
204*4dc78e53SAndroid Build Coastguard Worker
205*4dc78e53SAndroid Build Coastguard Worker if (mall->m_mask & MALL_ATTR_CLASSID)
206*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U32(msg, TCA_MATCHALL_CLASSID, mall->m_classid);
207*4dc78e53SAndroid Build Coastguard Worker
208*4dc78e53SAndroid Build Coastguard Worker if (mall->m_mask & MALL_ATTR_FLAGS)
209*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U32(msg, TCA_MATCHALL_FLAGS, mall->m_flags);
210*4dc78e53SAndroid Build Coastguard Worker
211*4dc78e53SAndroid Build Coastguard Worker if (mall->m_mask & MALL_ATTR_ACTION) {
212*4dc78e53SAndroid Build Coastguard Worker int err;
213*4dc78e53SAndroid Build Coastguard Worker
214*4dc78e53SAndroid Build Coastguard Worker err = rtnl_act_fill(msg, TCA_MATCHALL_ACT, mall->m_act);
215*4dc78e53SAndroid Build Coastguard Worker if (err < 0)
216*4dc78e53SAndroid Build Coastguard Worker return err;
217*4dc78e53SAndroid Build Coastguard Worker }
218*4dc78e53SAndroid Build Coastguard Worker
219*4dc78e53SAndroid Build Coastguard Worker return 0;
220*4dc78e53SAndroid Build Coastguard Worker
221*4dc78e53SAndroid Build Coastguard Worker nla_put_failure:
222*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
223*4dc78e53SAndroid Build Coastguard Worker }
224*4dc78e53SAndroid Build Coastguard Worker
mall_clone(void * _dst,void * _src)225*4dc78e53SAndroid Build Coastguard Worker static int mall_clone(void *_dst, void *_src)
226*4dc78e53SAndroid Build Coastguard Worker {
227*4dc78e53SAndroid Build Coastguard Worker struct rtnl_mall *dst = _dst, *src = _src;
228*4dc78e53SAndroid Build Coastguard Worker struct rtnl_act *next, *new;
229*4dc78e53SAndroid Build Coastguard Worker int err;
230*4dc78e53SAndroid Build Coastguard Worker
231*4dc78e53SAndroid Build Coastguard Worker dst->m_act = NULL;
232*4dc78e53SAndroid Build Coastguard Worker
233*4dc78e53SAndroid Build Coastguard Worker if (src->m_act) {
234*4dc78e53SAndroid Build Coastguard Worker if (!(dst->m_act = rtnl_act_alloc()))
235*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
236*4dc78e53SAndroid Build Coastguard Worker
237*4dc78e53SAndroid Build Coastguard Worker /* action nl list next and prev pointers must be updated */
238*4dc78e53SAndroid Build Coastguard Worker nl_init_list_head(&dst->m_act->ce_list);
239*4dc78e53SAndroid Build Coastguard Worker
240*4dc78e53SAndroid Build Coastguard Worker memcpy(dst->m_act, src->m_act, sizeof(struct rtnl_act));
241*4dc78e53SAndroid Build Coastguard Worker next = rtnl_act_next(src->m_act);
242*4dc78e53SAndroid Build Coastguard Worker while (next) {
243*4dc78e53SAndroid Build Coastguard Worker new = (struct rtnl_act *) nl_object_clone((struct nl_object *) next);
244*4dc78e53SAndroid Build Coastguard Worker if (!new)
245*4dc78e53SAndroid Build Coastguard Worker return -NLE_NOMEM;
246*4dc78e53SAndroid Build Coastguard Worker
247*4dc78e53SAndroid Build Coastguard Worker err = _rtnl_act_append_take(&dst->m_act, new);
248*4dc78e53SAndroid Build Coastguard Worker if (err < 0)
249*4dc78e53SAndroid Build Coastguard Worker return err;
250*4dc78e53SAndroid Build Coastguard Worker
251*4dc78e53SAndroid Build Coastguard Worker next = rtnl_act_next(next);
252*4dc78e53SAndroid Build Coastguard Worker }
253*4dc78e53SAndroid Build Coastguard Worker }
254*4dc78e53SAndroid Build Coastguard Worker
255*4dc78e53SAndroid Build Coastguard Worker return 0;
256*4dc78e53SAndroid Build Coastguard Worker }
257*4dc78e53SAndroid Build Coastguard Worker
mall_dump_line(struct rtnl_tc * tc,void * data,struct nl_dump_params * p)258*4dc78e53SAndroid Build Coastguard Worker static void mall_dump_line(struct rtnl_tc *tc, void *data,
259*4dc78e53SAndroid Build Coastguard Worker struct nl_dump_params *p)
260*4dc78e53SAndroid Build Coastguard Worker {
261*4dc78e53SAndroid Build Coastguard Worker struct rtnl_mall *mall = data;
262*4dc78e53SAndroid Build Coastguard Worker char buf[32];
263*4dc78e53SAndroid Build Coastguard Worker
264*4dc78e53SAndroid Build Coastguard Worker if (!mall)
265*4dc78e53SAndroid Build Coastguard Worker return;
266*4dc78e53SAndroid Build Coastguard Worker
267*4dc78e53SAndroid Build Coastguard Worker if (mall->m_mask & MALL_ATTR_CLASSID)
268*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, " target %s",
269*4dc78e53SAndroid Build Coastguard Worker rtnl_tc_handle2str(mall->m_classid, buf, sizeof(buf)));
270*4dc78e53SAndroid Build Coastguard Worker }
271*4dc78e53SAndroid Build Coastguard Worker
mall_dump_details(struct rtnl_tc * tc,void * data,struct nl_dump_params * p)272*4dc78e53SAndroid Build Coastguard Worker static void mall_dump_details(struct rtnl_tc *tc, void *data,
273*4dc78e53SAndroid Build Coastguard Worker struct nl_dump_params *p)
274*4dc78e53SAndroid Build Coastguard Worker {
275*4dc78e53SAndroid Build Coastguard Worker struct rtnl_mall *mall = data;
276*4dc78e53SAndroid Build Coastguard Worker
277*4dc78e53SAndroid Build Coastguard Worker if (!mall)
278*4dc78e53SAndroid Build Coastguard Worker return;
279*4dc78e53SAndroid Build Coastguard Worker
280*4dc78e53SAndroid Build Coastguard Worker nl_dump(p, "no details for match-all");
281*4dc78e53SAndroid Build Coastguard Worker }
282*4dc78e53SAndroid Build Coastguard Worker
283*4dc78e53SAndroid Build Coastguard Worker static struct rtnl_tc_ops mall_ops = {
284*4dc78e53SAndroid Build Coastguard Worker .to_kind = "matchall",
285*4dc78e53SAndroid Build Coastguard Worker .to_type = RTNL_TC_TYPE_CLS,
286*4dc78e53SAndroid Build Coastguard Worker .to_size = sizeof(struct rtnl_mall),
287*4dc78e53SAndroid Build Coastguard Worker .to_msg_parser = mall_msg_parser,
288*4dc78e53SAndroid Build Coastguard Worker .to_free_data = mall_free_data,
289*4dc78e53SAndroid Build Coastguard Worker .to_clone = mall_clone,
290*4dc78e53SAndroid Build Coastguard Worker .to_msg_fill = mall_msg_fill,
291*4dc78e53SAndroid Build Coastguard Worker .to_dump = {
292*4dc78e53SAndroid Build Coastguard Worker [NL_DUMP_LINE] = mall_dump_line,
293*4dc78e53SAndroid Build Coastguard Worker [NL_DUMP_DETAILS] = mall_dump_details,
294*4dc78e53SAndroid Build Coastguard Worker },
295*4dc78e53SAndroid Build Coastguard Worker };
296*4dc78e53SAndroid Build Coastguard Worker
mall_init(void)297*4dc78e53SAndroid Build Coastguard Worker static void _nl_init mall_init(void)
298*4dc78e53SAndroid Build Coastguard Worker {
299*4dc78e53SAndroid Build Coastguard Worker rtnl_tc_register(&mall_ops);
300*4dc78e53SAndroid Build Coastguard Worker }
301*4dc78e53SAndroid Build Coastguard Worker
mall_exit(void)302*4dc78e53SAndroid Build Coastguard Worker static void _nl_exit mall_exit(void)
303*4dc78e53SAndroid Build Coastguard Worker {
304*4dc78e53SAndroid Build Coastguard Worker rtnl_tc_unregister(&mall_ops);
305*4dc78e53SAndroid Build Coastguard Worker }
306*4dc78e53SAndroid Build Coastguard Worker
307*4dc78e53SAndroid Build Coastguard Worker /** @} */
308