19 #include <netlink-private/netlink.h>
20 #include <netlink-private/tc.h>
21 #include <netlink/netlink.h>
22 #include <netlink/route/cls/ematch.h>
23 #include <linux/tc_ematch/tc_em_cmp.h>
25 void rtnl_ematch_cmp_set(
struct rtnl_ematch *e,
struct tcf_em_cmp *cfg)
27 memcpy(rtnl_ematch_data(e), cfg,
sizeof(*cfg));
30 struct tcf_em_cmp *rtnl_ematch_cmp_get(
struct rtnl_ematch *e)
32 return rtnl_ematch_data(e);
35 static int cmp_parse(
struct rtnl_ematch *e,
void *data,
size_t len)
37 memcpy(rtnl_ematch_data(e), data, len);
42 static const char *align_txt[] = {
43 [TCF_EM_ALIGN_U8] =
"u8",
44 [TCF_EM_ALIGN_U16] =
"u16",
45 [TCF_EM_ALIGN_U32] =
"u32"
48 static const char *layer_txt[] = {
49 [TCF_LAYER_LINK] =
"eth",
50 [TCF_LAYER_NETWORK] =
"ip",
51 [TCF_LAYER_TRANSPORT] =
"tcp"
54 static const char *operand_txt[] = {
55 [TCF_EM_OPND_EQ] =
"=",
56 [TCF_EM_OPND_LT] =
"<",
57 [TCF_EM_OPND_GT] =
">",
60 static void cmp_dump(
struct rtnl_ematch *e,
struct nl_dump_params *p)
62 struct tcf_em_cmp *cmp = rtnl_ematch_data(e);
64 if (cmp->flags & TCF_EM_CMP_TRANS)
65 nl_dump(p,
"ntoh%c(", (cmp->align == TCF_EM_ALIGN_U32) ?
'l' :
's');
68 align_txt[cmp->align], layer_txt[cmp->layer], cmp->off);
71 nl_dump(p,
" & 0x%x", cmp->mask);
73 if (cmp->flags & TCF_EM_CMP_TRANS)
76 nl_dump(p,
" %s %u", operand_txt[cmp->opnd], cmp->val);
80 .eo_kind = TCF_EM_CMP,
82 .eo_minlen =
sizeof(
struct tcf_em_cmp),
83 .eo_datalen =
sizeof(
struct tcf_em_cmp),
84 .eo_parse = cmp_parse,
88 static void __init cmp_init(
void)