19 #include <netlink-private/netlink.h> 20 #include <netlink-private/tc.h> 21 #include <netlink/netlink.h> 22 #include <netlink/attr.h> 23 #include <netlink/utils.h> 24 #include <netlink-private/route/tc-api.h> 25 #include <netlink/route/act/gact.h> 27 static struct nla_policy gact_policy[TCA_GACT_MAX + 1] = {
28 [TCA_GACT_PARMS] = { .
minlen =
sizeof(
struct tc_gact) },
31 static int gact_msg_parser(
struct rtnl_tc *tc,
void *data)
33 struct rtnl_gact *u = data;
34 struct nlattr *tb[TCA_GACT_MAX + 1];
37 err = tca_parse(tb, TCA_GACT_MAX, tc, gact_policy);
41 if (!tb[TCA_GACT_PARMS])
42 return -NLE_MISSING_ATTR;
44 nla_memcpy(&u->g_parm, tb[TCA_GACT_PARMS],
sizeof(u->g_parm));
49 static void gact_free_data(
struct rtnl_tc *tc,
void *data)
53 static int gact_clone(
void *_dst,
void *_src)
55 struct rtnl_gact *dst = _dst, *src = _src;
57 memcpy(&dst->g_parm, &src->g_parm,
sizeof(src->g_parm));
61 static void gact_dump_line(
struct rtnl_tc *tc,
void *data,
64 struct rtnl_gact *u = data;
69 switch(u->g_parm.action){
76 case TC_ACT_RECLASSIFY:
86 static void gact_dump_details(
struct rtnl_tc *tc,
void *data,
91 static void gact_dump_stats(
struct rtnl_tc *tc,
void *data,
94 struct rtnl_gact *u = data;
102 static int gact_msg_fill(
struct rtnl_tc *tc,
void *data,
struct nl_msg *msg)
104 struct rtnl_gact *u = data;
109 NLA_PUT(msg, TCA_GACT_PARMS,
sizeof(u->g_parm), &u->g_parm);
122 int rtnl_gact_set_action(
struct rtnl_act *act,
int action)
129 if (action > TC_ACT_SHOT || action < TC_ACT_UNSPEC)
135 u->g_parm.action = action;
138 case TC_ACT_RECLASSIFY:
140 return NLE_OPNOTSUPP;
146 int rtnl_gact_get_action(
struct rtnl_act *act)
152 return u->g_parm.action;
158 static struct rtnl_tc_ops gact_ops = {
160 .to_type = RTNL_TC_TYPE_ACT,
161 .to_size =
sizeof(
struct rtnl_gact),
162 .to_msg_parser = gact_msg_parser,
163 .to_free_data = gact_free_data,
164 .to_clone = gact_clone,
165 .to_msg_fill = gact_msg_fill,
173 static void __init gact_init(
void)
178 static void __exit gact_exit(
void)
Dump object briefly on one line.
int rtnl_tc_register(struct rtnl_tc_ops *ops)
Register a traffic control module.
Attribute validation policy.
Dump all attributes but no statistics.
void rtnl_tc_unregister(struct rtnl_tc_ops *ops)
Unregister a traffic control module.
int nla_memcpy(void *dest, const struct nlattr *src, int count)
Copy attribute payload to another memory area.
#define TC_CAST(ptr)
Macro to cast qdisc/class/classifier to tc object.
#define NLA_PUT(msg, attrtype, attrlen, data)
Add unspecific attribute to netlink message.
uint16_t minlen
Minimal length of payload required.
void * rtnl_tc_data(struct rtnl_tc *tc)
Return pointer to private data of traffic control object.
void nl_dump(struct nl_dump_params *params, const char *fmt,...)
Dump a formatted character string.
Dump all attributes including statistics.