xref: /aosp_15_r20/external/libnl/lib/route/act/skbedit.c (revision 4dc78e53d49367fa8e61b07018507c90983a077d)
1*4dc78e53SAndroid Build Coastguard Worker /* SPDX-License-Identifier: LGPL-2.1-only */
2*4dc78e53SAndroid Build Coastguard Worker /*
3*4dc78e53SAndroid Build Coastguard Worker  * Copyright (c) 2015 Cong Wang <[email protected]>
4*4dc78e53SAndroid Build Coastguard Worker  */
5*4dc78e53SAndroid Build Coastguard Worker 
6*4dc78e53SAndroid Build Coastguard Worker /**
7*4dc78e53SAndroid Build Coastguard Worker  * @ingroup act
8*4dc78e53SAndroid Build Coastguard Worker  * @defgroup act_skbedit SKB Editing
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/act/skbedit.h>
19*4dc78e53SAndroid Build Coastguard Worker 
20*4dc78e53SAndroid Build Coastguard Worker #include "nl-route.h"
21*4dc78e53SAndroid Build Coastguard Worker #include "tc-api.h"
22*4dc78e53SAndroid Build Coastguard Worker 
23*4dc78e53SAndroid Build Coastguard Worker struct rtnl_skbedit {
24*4dc78e53SAndroid Build Coastguard Worker 	struct tc_skbedit s_parm;
25*4dc78e53SAndroid Build Coastguard Worker 	uint32_t s_flags;
26*4dc78e53SAndroid Build Coastguard Worker 	uint32_t s_mark;
27*4dc78e53SAndroid Build Coastguard Worker 	uint32_t s_prio;
28*4dc78e53SAndroid Build Coastguard Worker 	uint16_t s_queue_mapping;
29*4dc78e53SAndroid Build Coastguard Worker };
30*4dc78e53SAndroid Build Coastguard Worker 
31*4dc78e53SAndroid Build Coastguard Worker static struct nla_policy skbedit_policy[TCA_SKBEDIT_MAX + 1] = {
32*4dc78e53SAndroid Build Coastguard Worker 	[TCA_SKBEDIT_PARMS]             = { .minlen = sizeof(struct tc_skbedit) },
33*4dc78e53SAndroid Build Coastguard Worker 	[TCA_SKBEDIT_PRIORITY]          = { .type = NLA_U32 },
34*4dc78e53SAndroid Build Coastguard Worker 	[TCA_SKBEDIT_QUEUE_MAPPING]     = { .type = NLA_U16 },
35*4dc78e53SAndroid Build Coastguard Worker 	[TCA_SKBEDIT_MARK]              = { .type = NLA_U32 },
36*4dc78e53SAndroid Build Coastguard Worker };
37*4dc78e53SAndroid Build Coastguard Worker 
skbedit_msg_parser(struct rtnl_tc * tc,void * data)38*4dc78e53SAndroid Build Coastguard Worker static int skbedit_msg_parser(struct rtnl_tc *tc, void *data)
39*4dc78e53SAndroid Build Coastguard Worker {
40*4dc78e53SAndroid Build Coastguard Worker 	struct rtnl_skbedit *u = data;
41*4dc78e53SAndroid Build Coastguard Worker 	struct nlattr *tb[TCA_SKBEDIT_MAX + 1];
42*4dc78e53SAndroid Build Coastguard Worker 	int err;
43*4dc78e53SAndroid Build Coastguard Worker 
44*4dc78e53SAndroid Build Coastguard Worker 	err = tca_parse(tb, TCA_SKBEDIT_MAX, tc, skbedit_policy);
45*4dc78e53SAndroid Build Coastguard Worker 	if (err < 0)
46*4dc78e53SAndroid Build Coastguard Worker 		return err;
47*4dc78e53SAndroid Build Coastguard Worker 
48*4dc78e53SAndroid Build Coastguard Worker 	if (!tb[TCA_SKBEDIT_PARMS])
49*4dc78e53SAndroid Build Coastguard Worker 		return -NLE_MISSING_ATTR;
50*4dc78e53SAndroid Build Coastguard Worker 
51*4dc78e53SAndroid Build Coastguard Worker 	u->s_flags = 0;
52*4dc78e53SAndroid Build Coastguard Worker 	if (tb[TCA_SKBEDIT_PRIORITY] != NULL) {
53*4dc78e53SAndroid Build Coastguard Worker 		u->s_flags |= SKBEDIT_F_PRIORITY;
54*4dc78e53SAndroid Build Coastguard Worker 		u->s_prio = nla_get_u32(tb[TCA_SKBEDIT_PRIORITY]);
55*4dc78e53SAndroid Build Coastguard Worker 	}
56*4dc78e53SAndroid Build Coastguard Worker 
57*4dc78e53SAndroid Build Coastguard Worker 	if (tb[TCA_SKBEDIT_QUEUE_MAPPING] != NULL) {
58*4dc78e53SAndroid Build Coastguard Worker 		u->s_flags |= SKBEDIT_F_QUEUE_MAPPING;
59*4dc78e53SAndroid Build Coastguard Worker 		u->s_queue_mapping = nla_get_u16(tb[TCA_SKBEDIT_QUEUE_MAPPING]);
60*4dc78e53SAndroid Build Coastguard Worker 	}
61*4dc78e53SAndroid Build Coastguard Worker 
62*4dc78e53SAndroid Build Coastguard Worker 	if (tb[TCA_SKBEDIT_MARK] != NULL) {
63*4dc78e53SAndroid Build Coastguard Worker 		u->s_flags |= SKBEDIT_F_MARK;
64*4dc78e53SAndroid Build Coastguard Worker 		u->s_mark = nla_get_u32(tb[TCA_SKBEDIT_MARK]);
65*4dc78e53SAndroid Build Coastguard Worker 	}
66*4dc78e53SAndroid Build Coastguard Worker 
67*4dc78e53SAndroid Build Coastguard Worker 	return 0;
68*4dc78e53SAndroid Build Coastguard Worker }
69*4dc78e53SAndroid Build Coastguard Worker 
skbedit_free_data(struct rtnl_tc * tc,void * data)70*4dc78e53SAndroid Build Coastguard Worker static void skbedit_free_data(struct rtnl_tc *tc, void *data)
71*4dc78e53SAndroid Build Coastguard Worker {
72*4dc78e53SAndroid Build Coastguard Worker }
73*4dc78e53SAndroid Build Coastguard Worker 
skbedit_dump_line(struct rtnl_tc * tc,void * data,struct nl_dump_params * p)74*4dc78e53SAndroid Build Coastguard Worker static void skbedit_dump_line(struct rtnl_tc *tc, void *data,
75*4dc78e53SAndroid Build Coastguard Worker 			  struct nl_dump_params *p)
76*4dc78e53SAndroid Build Coastguard Worker {
77*4dc78e53SAndroid Build Coastguard Worker 	struct rtnl_skbedit *u = data;
78*4dc78e53SAndroid Build Coastguard Worker 
79*4dc78e53SAndroid Build Coastguard Worker 	if (!u)
80*4dc78e53SAndroid Build Coastguard Worker 		return;
81*4dc78e53SAndroid Build Coastguard Worker 
82*4dc78e53SAndroid Build Coastguard Worker 	if (u->s_flags & SKBEDIT_F_PRIORITY)
83*4dc78e53SAndroid Build Coastguard Worker 		nl_dump(p, " priority %u", u->s_prio);
84*4dc78e53SAndroid Build Coastguard Worker 
85*4dc78e53SAndroid Build Coastguard Worker 	if (u->s_flags & SKBEDIT_F_MARK)
86*4dc78e53SAndroid Build Coastguard Worker 		nl_dump(p, " mark %u", u->s_mark);
87*4dc78e53SAndroid Build Coastguard Worker 
88*4dc78e53SAndroid Build Coastguard Worker 	if (u->s_flags & SKBEDIT_F_QUEUE_MAPPING)
89*4dc78e53SAndroid Build Coastguard Worker 		nl_dump(p, " queue_mapping %u", u->s_queue_mapping);
90*4dc78e53SAndroid Build Coastguard Worker 
91*4dc78e53SAndroid Build Coastguard Worker 	switch(u->s_parm.action){
92*4dc78e53SAndroid Build Coastguard Worker 	case TC_ACT_UNSPEC:
93*4dc78e53SAndroid Build Coastguard Worker 		nl_dump(p, " unspecified");
94*4dc78e53SAndroid Build Coastguard Worker 		break;
95*4dc78e53SAndroid Build Coastguard Worker 	case TC_ACT_PIPE:
96*4dc78e53SAndroid Build Coastguard Worker 		nl_dump(p, " pipe");
97*4dc78e53SAndroid Build Coastguard Worker 		break;
98*4dc78e53SAndroid Build Coastguard Worker 	case TC_ACT_STOLEN:
99*4dc78e53SAndroid Build Coastguard Worker 		nl_dump(p, " stolen");
100*4dc78e53SAndroid Build Coastguard Worker 		break;
101*4dc78e53SAndroid Build Coastguard Worker 	case TC_ACT_SHOT:
102*4dc78e53SAndroid Build Coastguard Worker 		nl_dump(p, " shot");
103*4dc78e53SAndroid Build Coastguard Worker 		break;
104*4dc78e53SAndroid Build Coastguard Worker 	case TC_ACT_QUEUED:
105*4dc78e53SAndroid Build Coastguard Worker 		nl_dump(p, " queued");
106*4dc78e53SAndroid Build Coastguard Worker 		break;
107*4dc78e53SAndroid Build Coastguard Worker 	case TC_ACT_REPEAT:
108*4dc78e53SAndroid Build Coastguard Worker 		nl_dump(p, " repeat");
109*4dc78e53SAndroid Build Coastguard Worker 		break;
110*4dc78e53SAndroid Build Coastguard Worker 	}
111*4dc78e53SAndroid Build Coastguard Worker }
112*4dc78e53SAndroid Build Coastguard Worker 
skbedit_dump_details(struct rtnl_tc * tc,void * data,struct nl_dump_params * p)113*4dc78e53SAndroid Build Coastguard Worker static void skbedit_dump_details(struct rtnl_tc *tc, void *data,
114*4dc78e53SAndroid Build Coastguard Worker 			     struct nl_dump_params *p)
115*4dc78e53SAndroid Build Coastguard Worker {
116*4dc78e53SAndroid Build Coastguard Worker }
117*4dc78e53SAndroid Build Coastguard Worker 
skbedit_dump_stats(struct rtnl_tc * tc,void * data,struct nl_dump_params * p)118*4dc78e53SAndroid Build Coastguard Worker static void skbedit_dump_stats(struct rtnl_tc *tc, void *data,
119*4dc78e53SAndroid Build Coastguard Worker 			   struct nl_dump_params *p)
120*4dc78e53SAndroid Build Coastguard Worker {
121*4dc78e53SAndroid Build Coastguard Worker 	struct rtnl_skbedit *u = data;
122*4dc78e53SAndroid Build Coastguard Worker 
123*4dc78e53SAndroid Build Coastguard Worker 	if (!u)
124*4dc78e53SAndroid Build Coastguard Worker 		return;
125*4dc78e53SAndroid Build Coastguard Worker 	/* TODO */
126*4dc78e53SAndroid Build Coastguard Worker }
127*4dc78e53SAndroid Build Coastguard Worker 
128*4dc78e53SAndroid Build Coastguard Worker 
skbedit_msg_fill(struct rtnl_tc * tc,void * data,struct nl_msg * msg)129*4dc78e53SAndroid Build Coastguard Worker static int skbedit_msg_fill(struct rtnl_tc *tc, void *data, struct nl_msg *msg)
130*4dc78e53SAndroid Build Coastguard Worker {
131*4dc78e53SAndroid Build Coastguard Worker 	struct rtnl_skbedit *u = data;
132*4dc78e53SAndroid Build Coastguard Worker 
133*4dc78e53SAndroid Build Coastguard Worker 	if (!u)
134*4dc78e53SAndroid Build Coastguard Worker 		return 0;
135*4dc78e53SAndroid Build Coastguard Worker 
136*4dc78e53SAndroid Build Coastguard Worker 	NLA_PUT(msg, TCA_SKBEDIT_PARMS, sizeof(u->s_parm), &u->s_parm);
137*4dc78e53SAndroid Build Coastguard Worker 
138*4dc78e53SAndroid Build Coastguard Worker 	if (u->s_flags & SKBEDIT_F_MARK)
139*4dc78e53SAndroid Build Coastguard Worker 		NLA_PUT_U32(msg, TCA_SKBEDIT_MARK, u->s_mark);
140*4dc78e53SAndroid Build Coastguard Worker 
141*4dc78e53SAndroid Build Coastguard Worker 	if (u->s_flags & SKBEDIT_F_PRIORITY)
142*4dc78e53SAndroid Build Coastguard Worker 		NLA_PUT_U32(msg, TCA_SKBEDIT_PRIORITY, u->s_prio);
143*4dc78e53SAndroid Build Coastguard Worker 
144*4dc78e53SAndroid Build Coastguard Worker 	if (u->s_flags & SKBEDIT_F_QUEUE_MAPPING)
145*4dc78e53SAndroid Build Coastguard Worker 		NLA_PUT_U32(msg, TCA_SKBEDIT_QUEUE_MAPPING, u->s_queue_mapping);
146*4dc78e53SAndroid Build Coastguard Worker 
147*4dc78e53SAndroid Build Coastguard Worker 	return 0;
148*4dc78e53SAndroid Build Coastguard Worker 
149*4dc78e53SAndroid Build Coastguard Worker nla_put_failure:
150*4dc78e53SAndroid Build Coastguard Worker 	return -NLE_NOMEM;
151*4dc78e53SAndroid Build Coastguard Worker }
152*4dc78e53SAndroid Build Coastguard Worker 
153*4dc78e53SAndroid Build Coastguard Worker /**
154*4dc78e53SAndroid Build Coastguard Worker  * @name Attribute Modifications
155*4dc78e53SAndroid Build Coastguard Worker  * @{
156*4dc78e53SAndroid Build Coastguard Worker  */
157*4dc78e53SAndroid Build Coastguard Worker 
rtnl_skbedit_set_action(struct rtnl_act * act,int action)158*4dc78e53SAndroid Build Coastguard Worker int rtnl_skbedit_set_action(struct rtnl_act *act, int action)
159*4dc78e53SAndroid Build Coastguard Worker {
160*4dc78e53SAndroid Build Coastguard Worker 	struct rtnl_skbedit *u;
161*4dc78e53SAndroid Build Coastguard Worker 
162*4dc78e53SAndroid Build Coastguard Worker 	if (!(u = (struct rtnl_skbedit *) rtnl_tc_data(TC_CAST(act))))
163*4dc78e53SAndroid Build Coastguard Worker 		return -NLE_NOMEM;
164*4dc78e53SAndroid Build Coastguard Worker 
165*4dc78e53SAndroid Build Coastguard Worker 	u->s_parm.action = action;
166*4dc78e53SAndroid Build Coastguard Worker 
167*4dc78e53SAndroid Build Coastguard Worker 	return 0;
168*4dc78e53SAndroid Build Coastguard Worker }
169*4dc78e53SAndroid Build Coastguard Worker 
rtnl_skbedit_get_action(struct rtnl_act * act)170*4dc78e53SAndroid Build Coastguard Worker int rtnl_skbedit_get_action(struct rtnl_act *act)
171*4dc78e53SAndroid Build Coastguard Worker {
172*4dc78e53SAndroid Build Coastguard Worker 	struct rtnl_skbedit *u;
173*4dc78e53SAndroid Build Coastguard Worker 
174*4dc78e53SAndroid Build Coastguard Worker 	if (!(u = (struct rtnl_skbedit *) rtnl_tc_data(TC_CAST(act))))
175*4dc78e53SAndroid Build Coastguard Worker 		return -NLE_NOMEM;
176*4dc78e53SAndroid Build Coastguard Worker 	return u->s_parm.action;
177*4dc78e53SAndroid Build Coastguard Worker }
178*4dc78e53SAndroid Build Coastguard Worker 
rtnl_skbedit_set_queue_mapping(struct rtnl_act * act,uint16_t index)179*4dc78e53SAndroid Build Coastguard Worker int rtnl_skbedit_set_queue_mapping(struct rtnl_act *act, uint16_t index)
180*4dc78e53SAndroid Build Coastguard Worker {
181*4dc78e53SAndroid Build Coastguard Worker 	struct rtnl_skbedit *u;
182*4dc78e53SAndroid Build Coastguard Worker 
183*4dc78e53SAndroid Build Coastguard Worker 	if (!(u = (struct rtnl_skbedit *) rtnl_tc_data(TC_CAST(act))))
184*4dc78e53SAndroid Build Coastguard Worker 		return -NLE_NOMEM;
185*4dc78e53SAndroid Build Coastguard Worker 
186*4dc78e53SAndroid Build Coastguard Worker 	u->s_queue_mapping = index;
187*4dc78e53SAndroid Build Coastguard Worker 	u->s_flags |= SKBEDIT_F_QUEUE_MAPPING;
188*4dc78e53SAndroid Build Coastguard Worker 	return 0;
189*4dc78e53SAndroid Build Coastguard Worker }
190*4dc78e53SAndroid Build Coastguard Worker 
rtnl_skbedit_get_queue_mapping(struct rtnl_act * act,uint16_t * index)191*4dc78e53SAndroid Build Coastguard Worker int rtnl_skbedit_get_queue_mapping(struct rtnl_act *act, uint16_t *index)
192*4dc78e53SAndroid Build Coastguard Worker {
193*4dc78e53SAndroid Build Coastguard Worker 	struct rtnl_skbedit *u;
194*4dc78e53SAndroid Build Coastguard Worker 
195*4dc78e53SAndroid Build Coastguard Worker 	u = (struct rtnl_skbedit *) rtnl_tc_data(TC_CAST(act));
196*4dc78e53SAndroid Build Coastguard Worker 	if (!u)
197*4dc78e53SAndroid Build Coastguard Worker 		return -NLE_NOMEM;
198*4dc78e53SAndroid Build Coastguard Worker 	if (!(u->s_flags & SKBEDIT_F_QUEUE_MAPPING))
199*4dc78e53SAndroid Build Coastguard Worker 		return -NLE_NOATTR;
200*4dc78e53SAndroid Build Coastguard Worker 
201*4dc78e53SAndroid Build Coastguard Worker 	*index = u->s_queue_mapping;
202*4dc78e53SAndroid Build Coastguard Worker 	return 0;
203*4dc78e53SAndroid Build Coastguard Worker }
204*4dc78e53SAndroid Build Coastguard Worker 
rtnl_skbedit_set_mark(struct rtnl_act * act,uint32_t mark)205*4dc78e53SAndroid Build Coastguard Worker int rtnl_skbedit_set_mark(struct rtnl_act *act, uint32_t mark)
206*4dc78e53SAndroid Build Coastguard Worker {
207*4dc78e53SAndroid Build Coastguard Worker 	struct rtnl_skbedit *u;
208*4dc78e53SAndroid Build Coastguard Worker 
209*4dc78e53SAndroid Build Coastguard Worker 	if (!(u = (struct rtnl_skbedit *) rtnl_tc_data(TC_CAST(act))))
210*4dc78e53SAndroid Build Coastguard Worker 		return -NLE_NOMEM;
211*4dc78e53SAndroid Build Coastguard Worker 
212*4dc78e53SAndroid Build Coastguard Worker 	u->s_mark = mark;
213*4dc78e53SAndroid Build Coastguard Worker 	u->s_flags |= SKBEDIT_F_MARK;
214*4dc78e53SAndroid Build Coastguard Worker 	return 0;
215*4dc78e53SAndroid Build Coastguard Worker }
216*4dc78e53SAndroid Build Coastguard Worker 
rtnl_skbedit_get_mark(struct rtnl_act * act,uint32_t * mark)217*4dc78e53SAndroid Build Coastguard Worker int rtnl_skbedit_get_mark(struct rtnl_act *act, uint32_t *mark)
218*4dc78e53SAndroid Build Coastguard Worker {
219*4dc78e53SAndroid Build Coastguard Worker 	struct rtnl_skbedit *u;
220*4dc78e53SAndroid Build Coastguard Worker 
221*4dc78e53SAndroid Build Coastguard Worker 	u = (struct rtnl_skbedit *) rtnl_tc_data(TC_CAST(act));
222*4dc78e53SAndroid Build Coastguard Worker 	if (!u)
223*4dc78e53SAndroid Build Coastguard Worker 		return -NLE_NOMEM;
224*4dc78e53SAndroid Build Coastguard Worker 	if (!(u->s_flags & SKBEDIT_F_MARK))
225*4dc78e53SAndroid Build Coastguard Worker 		return -NLE_NOATTR;
226*4dc78e53SAndroid Build Coastguard Worker 
227*4dc78e53SAndroid Build Coastguard Worker 	*mark = u->s_mark;
228*4dc78e53SAndroid Build Coastguard Worker 	return 0;
229*4dc78e53SAndroid Build Coastguard Worker }
230*4dc78e53SAndroid Build Coastguard Worker 
rtnl_skbedit_set_priority(struct rtnl_act * act,uint32_t prio)231*4dc78e53SAndroid Build Coastguard Worker int rtnl_skbedit_set_priority(struct rtnl_act *act, uint32_t prio)
232*4dc78e53SAndroid Build Coastguard Worker {
233*4dc78e53SAndroid Build Coastguard Worker 	struct rtnl_skbedit *u;
234*4dc78e53SAndroid Build Coastguard Worker 
235*4dc78e53SAndroid Build Coastguard Worker 	if (!(u = (struct rtnl_skbedit *) rtnl_tc_data(TC_CAST(act))))
236*4dc78e53SAndroid Build Coastguard Worker 		return -NLE_NOMEM;
237*4dc78e53SAndroid Build Coastguard Worker 
238*4dc78e53SAndroid Build Coastguard Worker 	u->s_prio = prio;
239*4dc78e53SAndroid Build Coastguard Worker 	u->s_flags |= SKBEDIT_F_PRIORITY;
240*4dc78e53SAndroid Build Coastguard Worker 	return 0;
241*4dc78e53SAndroid Build Coastguard Worker }
242*4dc78e53SAndroid Build Coastguard Worker 
rtnl_skbedit_get_priority(struct rtnl_act * act,uint32_t * prio)243*4dc78e53SAndroid Build Coastguard Worker int rtnl_skbedit_get_priority(struct rtnl_act *act, uint32_t *prio)
244*4dc78e53SAndroid Build Coastguard Worker {
245*4dc78e53SAndroid Build Coastguard Worker 	struct rtnl_skbedit *u;
246*4dc78e53SAndroid Build Coastguard Worker 
247*4dc78e53SAndroid Build Coastguard Worker 	u = (struct rtnl_skbedit *) rtnl_tc_data(TC_CAST(act));
248*4dc78e53SAndroid Build Coastguard Worker 	if (!u)
249*4dc78e53SAndroid Build Coastguard Worker 		return -NLE_NOMEM;
250*4dc78e53SAndroid Build Coastguard Worker 	if (!(u->s_flags & SKBEDIT_F_PRIORITY))
251*4dc78e53SAndroid Build Coastguard Worker 		return -NLE_NOATTR;
252*4dc78e53SAndroid Build Coastguard Worker 
253*4dc78e53SAndroid Build Coastguard Worker 	*prio = u->s_prio;
254*4dc78e53SAndroid Build Coastguard Worker 	return 0;
255*4dc78e53SAndroid Build Coastguard Worker }
256*4dc78e53SAndroid Build Coastguard Worker 
257*4dc78e53SAndroid Build Coastguard Worker /** @} */
258*4dc78e53SAndroid Build Coastguard Worker 
259*4dc78e53SAndroid Build Coastguard Worker static struct rtnl_tc_ops skbedit_ops = {
260*4dc78e53SAndroid Build Coastguard Worker 	.to_kind		= "skbedit",
261*4dc78e53SAndroid Build Coastguard Worker 	.to_type		= RTNL_TC_TYPE_ACT,
262*4dc78e53SAndroid Build Coastguard Worker 	.to_size		= sizeof(struct rtnl_skbedit),
263*4dc78e53SAndroid Build Coastguard Worker 	.to_msg_parser		= skbedit_msg_parser,
264*4dc78e53SAndroid Build Coastguard Worker 	.to_free_data		= skbedit_free_data,
265*4dc78e53SAndroid Build Coastguard Worker 	.to_clone		= NULL,
266*4dc78e53SAndroid Build Coastguard Worker 	.to_msg_fill		= skbedit_msg_fill,
267*4dc78e53SAndroid Build Coastguard Worker 	.to_dump = {
268*4dc78e53SAndroid Build Coastguard Worker 	    [NL_DUMP_LINE]	= skbedit_dump_line,
269*4dc78e53SAndroid Build Coastguard Worker 	    [NL_DUMP_DETAILS]	= skbedit_dump_details,
270*4dc78e53SAndroid Build Coastguard Worker 	    [NL_DUMP_STATS]	= skbedit_dump_stats,
271*4dc78e53SAndroid Build Coastguard Worker 	},
272*4dc78e53SAndroid Build Coastguard Worker };
273*4dc78e53SAndroid Build Coastguard Worker 
skbedit_init(void)274*4dc78e53SAndroid Build Coastguard Worker static void _nl_init skbedit_init(void)
275*4dc78e53SAndroid Build Coastguard Worker {
276*4dc78e53SAndroid Build Coastguard Worker 	rtnl_tc_register(&skbedit_ops);
277*4dc78e53SAndroid Build Coastguard Worker }
278*4dc78e53SAndroid Build Coastguard Worker 
skbedit_exit(void)279*4dc78e53SAndroid Build Coastguard Worker static void _nl_exit skbedit_exit(void)
280*4dc78e53SAndroid Build Coastguard Worker {
281*4dc78e53SAndroid Build Coastguard Worker 	rtnl_tc_unregister(&skbedit_ops);
282*4dc78e53SAndroid Build Coastguard Worker }
283*4dc78e53SAndroid Build Coastguard Worker 
284*4dc78e53SAndroid Build Coastguard Worker /** @} */
285