13#include "nl-default.h"
15#include <linux/tc_ematch/tc_em_cmp.h>
17#include <netlink/netlink.h>
18#include <netlink/route/cls/ematch.h>
19#include <netlink/route/cls/ematch/cmp.h>
21void rtnl_ematch_cmp_set(
struct rtnl_ematch *e,
struct tcf_em_cmp *cfg)
23 memcpy(rtnl_ematch_data(e), cfg,
sizeof(*cfg));
26struct tcf_em_cmp *rtnl_ematch_cmp_get(
struct rtnl_ematch *e)
28 return rtnl_ematch_data(e);
31static int cmp_parse(
struct rtnl_ematch *e,
void *data,
size_t len)
33 memcpy(rtnl_ematch_data(e), data, len);
38static const char *align_txt[] = {
39 [TCF_EM_ALIGN_U8] =
"u8",
40 [TCF_EM_ALIGN_U16] =
"u16",
41 [TCF_EM_ALIGN_U32] =
"u32"
44static const char *layer_txt[] = {
45 [TCF_LAYER_LINK] =
"eth",
46 [TCF_LAYER_NETWORK] =
"ip",
47 [TCF_LAYER_TRANSPORT] =
"tcp"
50static const char *operand_txt[] = {
51 [TCF_EM_OPND_EQ] =
"=",
52 [TCF_EM_OPND_LT] =
"<",
53 [TCF_EM_OPND_GT] =
">",
56static void cmp_dump(
struct rtnl_ematch *e,
struct nl_dump_params *p)
58 struct tcf_em_cmp *cmp = rtnl_ematch_data(e);
60 if (cmp->flags & TCF_EM_CMP_TRANS)
61 nl_dump(p,
"ntoh%c(", (cmp->align == TCF_EM_ALIGN_U32) ?
'l' :
's');
64 align_txt[cmp->align], layer_txt[cmp->layer], cmp->off);
67 nl_dump(p,
" & 0x%x", cmp->mask);
69 if (cmp->flags & TCF_EM_CMP_TRANS)
72 nl_dump(p,
" %s %u", operand_txt[cmp->opnd], cmp->val);
76 .eo_kind = TCF_EM_CMP,
78 .eo_minlen =
sizeof(
struct tcf_em_cmp),
79 .eo_datalen =
sizeof(
struct tcf_em_cmp),
80 .eo_parse = cmp_parse,
84static void _nl_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.