xref: /aosp_15_r20/external/libnl/lib/route/act/gact.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) 2016 Sushma Sitaram <[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_gact GACT 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/gact.h>
19*4dc78e53SAndroid Build Coastguard Worker 
20*4dc78e53SAndroid Build Coastguard Worker #include "tc-api.h"
21*4dc78e53SAndroid Build Coastguard Worker 
22*4dc78e53SAndroid Build Coastguard Worker struct rtnl_gact {
23*4dc78e53SAndroid Build Coastguard Worker 	struct tc_gact g_parm;
24*4dc78e53SAndroid Build Coastguard Worker };
25*4dc78e53SAndroid Build Coastguard Worker 
26*4dc78e53SAndroid Build Coastguard Worker static struct nla_policy gact_policy[TCA_GACT_MAX + 1] = {
27*4dc78e53SAndroid Build Coastguard Worker 	[TCA_GACT_PARMS]             = { .minlen = sizeof(struct tc_gact) },
28*4dc78e53SAndroid Build Coastguard Worker };
29*4dc78e53SAndroid Build Coastguard Worker 
gact_msg_parser(struct rtnl_tc * tc,void * data)30*4dc78e53SAndroid Build Coastguard Worker static int gact_msg_parser(struct rtnl_tc *tc, void *data)
31*4dc78e53SAndroid Build Coastguard Worker {
32*4dc78e53SAndroid Build Coastguard Worker 	struct rtnl_gact *u = data;
33*4dc78e53SAndroid Build Coastguard Worker 	struct nlattr *tb[TCA_GACT_MAX + 1];
34*4dc78e53SAndroid Build Coastguard Worker 	int err;
35*4dc78e53SAndroid Build Coastguard Worker 
36*4dc78e53SAndroid Build Coastguard Worker 	err = tca_parse(tb, TCA_GACT_MAX, tc, gact_policy);
37*4dc78e53SAndroid Build Coastguard Worker 	if (err < 0)
38*4dc78e53SAndroid Build Coastguard Worker 		return err;
39*4dc78e53SAndroid Build Coastguard Worker 
40*4dc78e53SAndroid Build Coastguard Worker 	if (!tb[TCA_GACT_PARMS])
41*4dc78e53SAndroid Build Coastguard Worker 		return -NLE_MISSING_ATTR;
42*4dc78e53SAndroid Build Coastguard Worker 
43*4dc78e53SAndroid Build Coastguard Worker 	nla_memcpy(&u->g_parm, tb[TCA_GACT_PARMS], sizeof(u->g_parm));
44*4dc78e53SAndroid Build Coastguard Worker 
45*4dc78e53SAndroid Build Coastguard Worker 	return 0;
46*4dc78e53SAndroid Build Coastguard Worker }
47*4dc78e53SAndroid Build Coastguard Worker 
gact_free_data(struct rtnl_tc * tc,void * data)48*4dc78e53SAndroid Build Coastguard Worker static void gact_free_data(struct rtnl_tc *tc, void *data)
49*4dc78e53SAndroid Build Coastguard Worker {
50*4dc78e53SAndroid Build Coastguard Worker }
51*4dc78e53SAndroid Build Coastguard Worker 
gact_dump_line(struct rtnl_tc * tc,void * data,struct nl_dump_params * p)52*4dc78e53SAndroid Build Coastguard Worker static void gact_dump_line(struct rtnl_tc *tc, void *data,
53*4dc78e53SAndroid Build Coastguard Worker 			  struct nl_dump_params *p)
54*4dc78e53SAndroid Build Coastguard Worker {
55*4dc78e53SAndroid Build Coastguard Worker 	struct rtnl_gact *u = data;
56*4dc78e53SAndroid Build Coastguard Worker 
57*4dc78e53SAndroid Build Coastguard Worker 	if (!u)
58*4dc78e53SAndroid Build Coastguard Worker 		return;
59*4dc78e53SAndroid Build Coastguard Worker 
60*4dc78e53SAndroid Build Coastguard Worker 	switch(u->g_parm.action){
61*4dc78e53SAndroid Build Coastguard Worker 	case TC_ACT_UNSPEC:
62*4dc78e53SAndroid Build Coastguard Worker 		nl_dump(p, " continue");
63*4dc78e53SAndroid Build Coastguard Worker 		break;
64*4dc78e53SAndroid Build Coastguard Worker 	case TC_ACT_SHOT:
65*4dc78e53SAndroid Build Coastguard Worker 		nl_dump(p, " drop");
66*4dc78e53SAndroid Build Coastguard Worker 		break;
67*4dc78e53SAndroid Build Coastguard Worker 	case TC_ACT_RECLASSIFY:
68*4dc78e53SAndroid Build Coastguard Worker 		nl_dump(p, " reclassify");
69*4dc78e53SAndroid Build Coastguard Worker 		break;
70*4dc78e53SAndroid Build Coastguard Worker 	case TC_ACT_OK:
71*4dc78e53SAndroid Build Coastguard Worker 		nl_dump(p, " pass");
72*4dc78e53SAndroid Build Coastguard Worker 		break;
73*4dc78e53SAndroid Build Coastguard Worker 	}
74*4dc78e53SAndroid Build Coastguard Worker 
75*4dc78e53SAndroid Build Coastguard Worker }
76*4dc78e53SAndroid Build Coastguard Worker 
gact_dump_details(struct rtnl_tc * tc,void * data,struct nl_dump_params * p)77*4dc78e53SAndroid Build Coastguard Worker static void gact_dump_details(struct rtnl_tc *tc, void *data,
78*4dc78e53SAndroid Build Coastguard Worker 			     struct nl_dump_params *p)
79*4dc78e53SAndroid Build Coastguard Worker {
80*4dc78e53SAndroid Build Coastguard Worker }
81*4dc78e53SAndroid Build Coastguard Worker 
gact_dump_stats(struct rtnl_tc * tc,void * data,struct nl_dump_params * p)82*4dc78e53SAndroid Build Coastguard Worker static void gact_dump_stats(struct rtnl_tc *tc, void *data,
83*4dc78e53SAndroid Build Coastguard Worker 			   struct nl_dump_params *p)
84*4dc78e53SAndroid Build Coastguard Worker {
85*4dc78e53SAndroid Build Coastguard Worker 	struct rtnl_gact *u = data;
86*4dc78e53SAndroid Build Coastguard Worker 
87*4dc78e53SAndroid Build Coastguard Worker 	if (!u)
88*4dc78e53SAndroid Build Coastguard Worker 		return;
89*4dc78e53SAndroid Build Coastguard Worker 	/* TODO */
90*4dc78e53SAndroid Build Coastguard Worker }
91*4dc78e53SAndroid Build Coastguard Worker 
92*4dc78e53SAndroid Build Coastguard Worker 
gact_msg_fill(struct rtnl_tc * tc,void * data,struct nl_msg * msg)93*4dc78e53SAndroid Build Coastguard Worker static int gact_msg_fill(struct rtnl_tc *tc, void *data, struct nl_msg *msg)
94*4dc78e53SAndroid Build Coastguard Worker {
95*4dc78e53SAndroid Build Coastguard Worker 	struct rtnl_gact *u = data;
96*4dc78e53SAndroid Build Coastguard Worker 
97*4dc78e53SAndroid Build Coastguard Worker 	if (!u)
98*4dc78e53SAndroid Build Coastguard Worker 		return 0;
99*4dc78e53SAndroid Build Coastguard Worker 
100*4dc78e53SAndroid Build Coastguard Worker 	NLA_PUT(msg, TCA_GACT_PARMS, sizeof(u->g_parm), &u->g_parm);
101*4dc78e53SAndroid Build Coastguard Worker 
102*4dc78e53SAndroid Build Coastguard Worker 	return 0;
103*4dc78e53SAndroid Build Coastguard Worker 
104*4dc78e53SAndroid Build Coastguard Worker nla_put_failure:
105*4dc78e53SAndroid Build Coastguard Worker 	return -NLE_NOMEM;
106*4dc78e53SAndroid Build Coastguard Worker }
107*4dc78e53SAndroid Build Coastguard Worker 
108*4dc78e53SAndroid Build Coastguard Worker /**
109*4dc78e53SAndroid Build Coastguard Worker  * @name Attribute Modifications
110*4dc78e53SAndroid Build Coastguard Worker  * @{
111*4dc78e53SAndroid Build Coastguard Worker  */
112*4dc78e53SAndroid Build Coastguard Worker 
rtnl_gact_set_action(struct rtnl_act * act,int action)113*4dc78e53SAndroid Build Coastguard Worker int rtnl_gact_set_action(struct rtnl_act *act, int action)
114*4dc78e53SAndroid Build Coastguard Worker {
115*4dc78e53SAndroid Build Coastguard Worker 	struct rtnl_gact *u;
116*4dc78e53SAndroid Build Coastguard Worker 
117*4dc78e53SAndroid Build Coastguard Worker 	if (!(u = (struct rtnl_gact *) rtnl_tc_data(TC_CAST(act))))
118*4dc78e53SAndroid Build Coastguard Worker 		return -NLE_NOMEM;
119*4dc78e53SAndroid Build Coastguard Worker 
120*4dc78e53SAndroid Build Coastguard Worker 	u->g_parm.action = action;
121*4dc78e53SAndroid Build Coastguard Worker 
122*4dc78e53SAndroid Build Coastguard Worker 	return 0;
123*4dc78e53SAndroid Build Coastguard Worker }
124*4dc78e53SAndroid Build Coastguard Worker 
rtnl_gact_get_action(struct rtnl_act * act)125*4dc78e53SAndroid Build Coastguard Worker int rtnl_gact_get_action(struct rtnl_act *act)
126*4dc78e53SAndroid Build Coastguard Worker {
127*4dc78e53SAndroid Build Coastguard Worker 	struct rtnl_gact *u;
128*4dc78e53SAndroid Build Coastguard Worker 
129*4dc78e53SAndroid Build Coastguard Worker 	if (!(u = (struct rtnl_gact *) rtnl_tc_data(TC_CAST(act))))
130*4dc78e53SAndroid Build Coastguard Worker 		return -NLE_NOMEM;
131*4dc78e53SAndroid Build Coastguard Worker 	return u->g_parm.action;
132*4dc78e53SAndroid Build Coastguard Worker }
133*4dc78e53SAndroid Build Coastguard Worker 
134*4dc78e53SAndroid Build Coastguard Worker 
135*4dc78e53SAndroid Build Coastguard Worker /** @} */
136*4dc78e53SAndroid Build Coastguard Worker 
137*4dc78e53SAndroid Build Coastguard Worker static struct rtnl_tc_ops gact_ops = {
138*4dc78e53SAndroid Build Coastguard Worker 	.to_kind		= "gact",
139*4dc78e53SAndroid Build Coastguard Worker 	.to_type		= RTNL_TC_TYPE_ACT,
140*4dc78e53SAndroid Build Coastguard Worker 	.to_size		= sizeof(struct rtnl_gact),
141*4dc78e53SAndroid Build Coastguard Worker 	.to_msg_parser		= gact_msg_parser,
142*4dc78e53SAndroid Build Coastguard Worker 	.to_free_data		= gact_free_data,
143*4dc78e53SAndroid Build Coastguard Worker 	.to_clone		= NULL,
144*4dc78e53SAndroid Build Coastguard Worker 	.to_msg_fill		= gact_msg_fill,
145*4dc78e53SAndroid Build Coastguard Worker 	.to_dump = {
146*4dc78e53SAndroid Build Coastguard Worker 	    [NL_DUMP_LINE]	= gact_dump_line,
147*4dc78e53SAndroid Build Coastguard Worker 	    [NL_DUMP_DETAILS]	= gact_dump_details,
148*4dc78e53SAndroid Build Coastguard Worker 	    [NL_DUMP_STATS]	= gact_dump_stats,
149*4dc78e53SAndroid Build Coastguard Worker 	},
150*4dc78e53SAndroid Build Coastguard Worker };
151*4dc78e53SAndroid Build Coastguard Worker 
gact_init(void)152*4dc78e53SAndroid Build Coastguard Worker static void _nl_init gact_init(void)
153*4dc78e53SAndroid Build Coastguard Worker {
154*4dc78e53SAndroid Build Coastguard Worker 	rtnl_tc_register(&gact_ops);
155*4dc78e53SAndroid Build Coastguard Worker }
156*4dc78e53SAndroid Build Coastguard Worker 
gact_exit(void)157*4dc78e53SAndroid Build Coastguard Worker static void _nl_exit gact_exit(void)
158*4dc78e53SAndroid Build Coastguard Worker {
159*4dc78e53SAndroid Build Coastguard Worker 	rtnl_tc_unregister(&gact_ops);
160*4dc78e53SAndroid Build Coastguard Worker }
161*4dc78e53SAndroid Build Coastguard Worker 
162*4dc78e53SAndroid Build Coastguard Worker /** @} */
163