13#include "nl-default.h"
15#include <netlink/netlink.h>
16#include <netlink/attr.h>
17#include <netlink/utils.h>
18#include <netlink/route/act/mirred.h>
23 struct tc_mirred m_parm;
26static struct nla_policy mirred_policy[TCA_MIRRED_MAX + 1] = {
27 [TCA_MIRRED_PARMS] = { .
minlen =
sizeof(
struct tc_mirred) },
30static int mirred_msg_parser(
struct rtnl_tc *tc,
void *data)
33 struct nlattr *tb[TCA_MIRRED_MAX + 1];
36 err = tca_parse(tb, TCA_MIRRED_MAX, tc, mirred_policy);
40 if (!tb[TCA_MIRRED_PARMS])
41 return -NLE_MISSING_ATTR;
43 nla_memcpy(&u->m_parm, tb[TCA_MIRRED_PARMS],
sizeof(u->m_parm));
47static void mirred_free_data(
struct rtnl_tc *tc,
void *data)
51static void mirred_dump_line(
struct rtnl_tc *tc,
void *data,
58 nl_dump(p,
" index %u", u->m_parm.ifindex);
60 if (u->m_parm.eaction == TCA_EGRESS_MIRROR)
62 else if (u->m_parm.eaction == TCA_EGRESS_REDIR)
65 switch(u->m_parm.action) {
87static void mirred_dump_details(
struct rtnl_tc *tc,
void *data,
92static void mirred_dump_stats(
struct rtnl_tc *tc,
void *data,
103static int mirred_msg_fill(
struct rtnl_tc *tc,
void *data,
struct nl_msg *msg)
110 NLA_PUT(msg, TCA_MIRRED_PARMS,
sizeof(u->m_parm), &u->m_parm);
122int rtnl_mirred_set_action(
struct rtnl_act *act,
int action)
129 if (action > TCA_INGRESS_MIRROR || action < TCA_EGRESS_REDIR)
133 case TCA_EGRESS_MIRROR:
134 case TCA_EGRESS_REDIR:
135 u->m_parm.eaction = action;
137 case TCA_INGRESS_REDIR:
138 case TCA_INGRESS_MIRROR:
140 return NLE_OPNOTSUPP;
145int rtnl_mirred_get_action(
struct rtnl_act *act)
151 return u->m_parm.eaction;
154int rtnl_mirred_set_ifindex(
struct rtnl_act *act, uint32_t ifindex)
161 u->m_parm.ifindex = ifindex;
165uint32_t rtnl_mirred_get_ifindex(
struct rtnl_act *act)
170 return u->m_parm.ifindex;
174int rtnl_mirred_set_policy(
struct rtnl_act *act,
int policy)
181 u->m_parm.action = policy;
186int rtnl_mirred_get_policy(
struct rtnl_act *act)
192 return u->m_parm.action;
197static struct rtnl_tc_ops mirred_ops = {
199 .to_type = RTNL_TC_TYPE_ACT,
201 .to_msg_parser = mirred_msg_parser,
202 .to_free_data = mirred_free_data,
204 .to_msg_fill = mirred_msg_fill,
212static void _nl_init mirred_init(
void)
217static void _nl_exit mirred_exit(
void)
#define NLA_PUT(msg, attrtype, attrlen, data)
Add unspecific attribute to netlink message.
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.
void * rtnl_tc_data(struct rtnl_tc *)
Return pointer to private data of traffic control object.
int rtnl_tc_register(struct rtnl_tc_ops *)
Register a traffic control module.
void rtnl_tc_unregister(struct rtnl_tc_ops *)
Unregister a traffic control module.
void nl_dump(struct nl_dump_params *params, const char *fmt,...)
Dump a formatted character string.
@ NL_DUMP_STATS
Dump all attributes including statistics.
@ NL_DUMP_LINE
Dump object briefly on one line.
@ NL_DUMP_DETAILS
Dump all attributes but no statistics.
Attribute validation policy.
uint16_t minlen
Minimal length of payload required.