12 #include "internal/internal.h"
14 #include <libmnl/libmnl.h>
16 static int nlmsg_parse_expection_attr_cb(
const struct nlattr *attr,
void *data)
18 const struct nlattr **tb = data;
19 int type = mnl_attr_get_type(attr);
22 if (mnl_attr_type_valid(attr, CTA_EXPECT_MAX) < 0)
26 case CTA_EXPECT_MASTER:
27 case CTA_EXPECT_TUPLE:
29 if (mnl_attr_validate(attr, MNL_TYPE_NESTED) < 0)
32 case CTA_EXPECT_TIMEOUT:
33 case CTA_EXPECT_FLAGS:
35 if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
38 case CTA_EXPECT_HELP_NAME:
39 if (mnl_attr_validate(attr, MNL_TYPE_STRING) < 0)
43 if (mnl_attr_validate(attr, MNL_TYPE_U16) < 0)
51 static int nfexp_nlmsg_parse_nat_attr_cb(
const struct nlattr *attr,
void *data)
53 int type = mnl_attr_get_type(attr);
54 const struct nlattr **tb = data;
56 if (mnl_attr_type_valid(attr, CTA_MAX) < 0)
60 case CTA_EXPECT_NAT_TUPLE:
61 if (mnl_attr_validate(attr, MNL_TYPE_NESTED) < 0)
64 case CTA_EXPECT_NAT_DIR:
65 if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
74 static void nfexp_nlmsg_parse_nat(
struct nfgenmsg *nfg,
75 const struct nlattr *attr,
76 struct nf_expect *exp)
78 struct nlattr *tb[CTA_EXPECT_NAT_MAX + 1] = {};
80 if (mnl_attr_parse_nested(attr, nfexp_nlmsg_parse_nat_attr_cb, tb) < 0)
83 exp->nat.orig.l3protonum = nfg->nfgen_family;
84 set_bit(ATTR_ORIG_L3PROTO, exp->nat.set);
86 if (tb[CTA_EXPECT_NAT_TUPLE]) {
87 nfct_parse_tuple(tb[CTA_EXPECT_NAT_TUPLE], &exp->nat.orig,
88 __DIR_ORIG, exp->nat.set);
89 set_bit(ATTR_EXP_NAT_TUPLE, exp->set);
91 if (tb[CTA_EXPECT_NAT_DIR]) {
93 ntohl(mnl_attr_get_u32(tb[CTA_EXPECT_NAT_DIR]));
94 set_bit(ATTR_EXP_NAT_DIR, exp->set);
98 int nfexp_nlmsg_parse(
const struct nlmsghdr *nlh,
struct nf_expect *exp)
100 struct nlattr *tb[CTA_EXPECT_MAX+1] = {};
101 struct nfgenmsg *nfg = mnl_nlmsg_get_payload(nlh);
103 mnl_attr_parse(nlh,
sizeof(
struct nfgenmsg),
104 nlmsg_parse_expection_attr_cb, tb);
106 if (tb[CTA_EXPECT_MASTER]) {
107 exp->expected.orig.l3protonum = nfg->nfgen_family;
108 set_bit(ATTR_ORIG_L3PROTO, exp->expected.set);
110 nfct_parse_tuple(tb[CTA_EXPECT_MASTER], &exp->master.orig,
111 __DIR_ORIG, exp->master.set);
112 set_bit(ATTR_EXP_MASTER, exp->set);
114 if (tb[CTA_EXPECT_TUPLE]) {
115 exp->mask.orig.l3protonum = nfg->nfgen_family;
116 set_bit(ATTR_ORIG_L3PROTO, exp->mask.set);
118 nfct_parse_tuple(tb[CTA_EXPECT_TUPLE], &exp->expected.orig,
119 __DIR_ORIG, exp->expected.set);
120 set_bit(ATTR_EXP_EXPECTED, exp->set);
122 if (tb[CTA_EXPECT_MASK]) {
123 exp->master.orig.l3protonum = nfg->nfgen_family;
124 set_bit(ATTR_ORIG_L3PROTO, exp->master.set);
126 nfct_parse_tuple(tb[CTA_EXPECT_MASK], &exp->mask.orig,
127 __DIR_ORIG, exp->mask.set);
128 set_bit(ATTR_EXP_MASK, exp->set);
130 if (tb[CTA_EXPECT_TIMEOUT]) {
131 exp->timeout = ntohl(mnl_attr_get_u32(tb[CTA_EXPECT_TIMEOUT]));
132 set_bit(ATTR_EXP_TIMEOUT, exp->set);
134 if (tb[CTA_EXPECT_ZONE]) {
135 exp->zone = ntohs(mnl_attr_get_u16(tb[CTA_EXPECT_ZONE]));
136 set_bit(ATTR_EXP_ZONE, exp->set);
138 if (tb[CTA_EXPECT_FLAGS]) {
139 exp->flags = ntohl(mnl_attr_get_u32(tb[CTA_EXPECT_FLAGS]));
140 set_bit(ATTR_EXP_FLAGS, exp->set);
142 if (tb[CTA_EXPECT_HELP_NAME]) {
143 snprintf(exp->helper_name, NFCT_HELPER_NAME_MAX,
"%s",
144 mnl_attr_get_str(tb[CTA_EXPECT_HELP_NAME]));
145 set_bit(ATTR_EXP_HELPER_NAME, exp->set);
147 if (tb[CTA_EXPECT_CLASS]) {
148 exp->class = ntohl(mnl_attr_get_u32(tb[CTA_EXPECT_CLASS]));
149 set_bit(ATTR_EXP_CLASS, exp->set);
151 if (tb[CTA_EXPECT_NAT])
152 nfexp_nlmsg_parse_nat(nfg, tb[CTA_EXPECT_NAT], exp);
154 if (tb[CTA_EXPECT_FN]) {
155 int len = mnl_attr_get_payload_len(tb[CTA_EXPECT_FN]);
157 assert(len <= __NFCT_EXPECTFN_MAX);
158 snprintf(exp->expectfn, __NFCT_EXPECTFN_MAX,
"%s",
159 (
char *)mnl_attr_get_payload(tb[CTA_EXPECT_FN]));
160 set_bit(ATTR_EXP_FN, exp->set);