13#include <netlink-private/netlink.h>
14#include <netlink-private/tc.h>
15#include <netlink/netlink.h>
16#include <netlink/route/cls/ematch.h>
17#include <netlink/route/cls/ematch/cmp.h>
18#include <linux/tc_ematch/tc_em_cmp.h>
20void rtnl_ematch_cmp_set(
struct rtnl_ematch *e,
struct tcf_em_cmp *cfg)
22 memcpy(rtnl_ematch_data(e), cfg,
sizeof(*cfg));
25struct tcf_em_cmp *rtnl_ematch_cmp_get(
struct rtnl_ematch *e)
27 return rtnl_ematch_data(e);
30static int cmp_parse(
struct rtnl_ematch *e,
void *data,
size_t len)
32 memcpy(rtnl_ematch_data(e), data, len);
37static const char *align_txt[] = {
38 [TCF_EM_ALIGN_U8] =
"u8",
39 [TCF_EM_ALIGN_U16] =
"u16",
40 [TCF_EM_ALIGN_U32] =
"u32"
43static const char *layer_txt[] = {
44 [TCF_LAYER_LINK] =
"eth",
45 [TCF_LAYER_NETWORK] =
"ip",
46 [TCF_LAYER_TRANSPORT] =
"tcp"
49static const char *operand_txt[] = {
50 [TCF_EM_OPND_EQ] =
"=",
51 [TCF_EM_OPND_LT] =
"<",
52 [TCF_EM_OPND_GT] =
">",
55static void cmp_dump(
struct rtnl_ematch *e,
struct nl_dump_params *p)
57 struct tcf_em_cmp *cmp = rtnl_ematch_data(e);
59 if (cmp->flags & TCF_EM_CMP_TRANS)
60 nl_dump(p,
"ntoh%c(", (cmp->align == TCF_EM_ALIGN_U32) ?
'l' :
's');
63 align_txt[cmp->align], layer_txt[cmp->layer], cmp->off);
66 nl_dump(p,
" & 0x%x", cmp->mask);
68 if (cmp->flags & TCF_EM_CMP_TRANS)
71 nl_dump(p,
" %s %u", operand_txt[cmp->opnd], cmp->val);
75 .eo_kind = TCF_EM_CMP,
77 .eo_minlen =
sizeof(
struct tcf_em_cmp),
78 .eo_datalen =
sizeof(
struct tcf_em_cmp),
79 .eo_parse = cmp_parse,
83static void __init cmp_init(
void)
int rtnl_ematch_register(struct rtnl_ematch_ops *ops)
Register ematch module.
void nl_dump(struct nl_dump_params *params, const char *fmt,...)
Dump a formatted character string.
Extended Match Operations.