|
@@ -127,6 +127,20 @@ ctnetlink_dump_tuples(struct sk_buff *skb,
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static inline int
|
|
|
|
+ctnetlink_dump_zone_id(struct sk_buff *skb, int attrtype,
|
|
|
|
+ const struct nf_conntrack_zone *zone, int dir)
|
|
|
|
+{
|
|
|
|
+ if (zone->id == NF_CT_DEFAULT_ZONE_ID || zone->dir != dir)
|
|
|
|
+ return 0;
|
|
|
|
+ if (nla_put_be16(skb, attrtype, htons(zone->id)))
|
|
|
|
+ goto nla_put_failure;
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+nla_put_failure:
|
|
|
|
+ return -1;
|
|
|
|
+}
|
|
|
|
+
|
|
static inline int
|
|
static inline int
|
|
ctnetlink_dump_status(struct sk_buff *skb, const struct nf_conn *ct)
|
|
ctnetlink_dump_status(struct sk_buff *skb, const struct nf_conn *ct)
|
|
{
|
|
{
|
|
@@ -474,11 +488,16 @@ ctnetlink_fill_info(struct sk_buff *skb, u32 portid, u32 seq, u32 type,
|
|
nfmsg->version = NFNETLINK_V0;
|
|
nfmsg->version = NFNETLINK_V0;
|
|
nfmsg->res_id = 0;
|
|
nfmsg->res_id = 0;
|
|
|
|
|
|
|
|
+ zone = nf_ct_zone(ct);
|
|
|
|
+
|
|
nest_parms = nla_nest_start(skb, CTA_TUPLE_ORIG | NLA_F_NESTED);
|
|
nest_parms = nla_nest_start(skb, CTA_TUPLE_ORIG | NLA_F_NESTED);
|
|
if (!nest_parms)
|
|
if (!nest_parms)
|
|
goto nla_put_failure;
|
|
goto nla_put_failure;
|
|
if (ctnetlink_dump_tuples(skb, nf_ct_tuple(ct, IP_CT_DIR_ORIGINAL)) < 0)
|
|
if (ctnetlink_dump_tuples(skb, nf_ct_tuple(ct, IP_CT_DIR_ORIGINAL)) < 0)
|
|
goto nla_put_failure;
|
|
goto nla_put_failure;
|
|
|
|
+ if (ctnetlink_dump_zone_id(skb, CTA_TUPLE_ZONE, zone,
|
|
|
|
+ NF_CT_ZONE_DIR_ORIG) < 0)
|
|
|
|
+ goto nla_put_failure;
|
|
nla_nest_end(skb, nest_parms);
|
|
nla_nest_end(skb, nest_parms);
|
|
|
|
|
|
nest_parms = nla_nest_start(skb, CTA_TUPLE_REPLY | NLA_F_NESTED);
|
|
nest_parms = nla_nest_start(skb, CTA_TUPLE_REPLY | NLA_F_NESTED);
|
|
@@ -486,11 +505,13 @@ ctnetlink_fill_info(struct sk_buff *skb, u32 portid, u32 seq, u32 type,
|
|
goto nla_put_failure;
|
|
goto nla_put_failure;
|
|
if (ctnetlink_dump_tuples(skb, nf_ct_tuple(ct, IP_CT_DIR_REPLY)) < 0)
|
|
if (ctnetlink_dump_tuples(skb, nf_ct_tuple(ct, IP_CT_DIR_REPLY)) < 0)
|
|
goto nla_put_failure;
|
|
goto nla_put_failure;
|
|
|
|
+ if (ctnetlink_dump_zone_id(skb, CTA_TUPLE_ZONE, zone,
|
|
|
|
+ NF_CT_ZONE_DIR_REPL) < 0)
|
|
|
|
+ goto nla_put_failure;
|
|
nla_nest_end(skb, nest_parms);
|
|
nla_nest_end(skb, nest_parms);
|
|
|
|
|
|
- zone = nf_ct_zone(ct);
|
|
|
|
- if (zone->id != NF_CT_DEFAULT_ZONE_ID &&
|
|
|
|
- nla_put_be16(skb, CTA_ZONE, htons(zone->id)))
|
|
|
|
|
|
+ if (ctnetlink_dump_zone_id(skb, CTA_ZONE, zone,
|
|
|
|
+ NF_CT_DEFAULT_ZONE_DIR) < 0)
|
|
goto nla_put_failure;
|
|
goto nla_put_failure;
|
|
|
|
|
|
if (ctnetlink_dump_status(skb, ct) < 0 ||
|
|
if (ctnetlink_dump_status(skb, ct) < 0 ||
|
|
@@ -600,7 +621,7 @@ ctnetlink_nlmsg_size(const struct nf_conn *ct)
|
|
+ nla_total_size(sizeof(u_int32_t)) /* CTA_MARK */
|
|
+ nla_total_size(sizeof(u_int32_t)) /* CTA_MARK */
|
|
#endif
|
|
#endif
|
|
#ifdef CONFIG_NF_CONNTRACK_ZONES
|
|
#ifdef CONFIG_NF_CONNTRACK_ZONES
|
|
- + nla_total_size(sizeof(u_int16_t)) /* CTA_ZONE */
|
|
|
|
|
|
+ + nla_total_size(sizeof(u_int16_t)) /* CTA_ZONE|CTA_TUPLE_ZONE */
|
|
#endif
|
|
#endif
|
|
+ ctnetlink_proto_size(ct)
|
|
+ ctnetlink_proto_size(ct)
|
|
+ ctnetlink_label_size(ct)
|
|
+ ctnetlink_label_size(ct)
|
|
@@ -658,11 +679,16 @@ ctnetlink_conntrack_event(unsigned int events, struct nf_ct_event *item)
|
|
nfmsg->res_id = 0;
|
|
nfmsg->res_id = 0;
|
|
|
|
|
|
rcu_read_lock();
|
|
rcu_read_lock();
|
|
|
|
+ zone = nf_ct_zone(ct);
|
|
|
|
+
|
|
nest_parms = nla_nest_start(skb, CTA_TUPLE_ORIG | NLA_F_NESTED);
|
|
nest_parms = nla_nest_start(skb, CTA_TUPLE_ORIG | NLA_F_NESTED);
|
|
if (!nest_parms)
|
|
if (!nest_parms)
|
|
goto nla_put_failure;
|
|
goto nla_put_failure;
|
|
if (ctnetlink_dump_tuples(skb, nf_ct_tuple(ct, IP_CT_DIR_ORIGINAL)) < 0)
|
|
if (ctnetlink_dump_tuples(skb, nf_ct_tuple(ct, IP_CT_DIR_ORIGINAL)) < 0)
|
|
goto nla_put_failure;
|
|
goto nla_put_failure;
|
|
|
|
+ if (ctnetlink_dump_zone_id(skb, CTA_TUPLE_ZONE, zone,
|
|
|
|
+ NF_CT_ZONE_DIR_ORIG) < 0)
|
|
|
|
+ goto nla_put_failure;
|
|
nla_nest_end(skb, nest_parms);
|
|
nla_nest_end(skb, nest_parms);
|
|
|
|
|
|
nest_parms = nla_nest_start(skb, CTA_TUPLE_REPLY | NLA_F_NESTED);
|
|
nest_parms = nla_nest_start(skb, CTA_TUPLE_REPLY | NLA_F_NESTED);
|
|
@@ -670,11 +696,13 @@ ctnetlink_conntrack_event(unsigned int events, struct nf_ct_event *item)
|
|
goto nla_put_failure;
|
|
goto nla_put_failure;
|
|
if (ctnetlink_dump_tuples(skb, nf_ct_tuple(ct, IP_CT_DIR_REPLY)) < 0)
|
|
if (ctnetlink_dump_tuples(skb, nf_ct_tuple(ct, IP_CT_DIR_REPLY)) < 0)
|
|
goto nla_put_failure;
|
|
goto nla_put_failure;
|
|
|
|
+ if (ctnetlink_dump_zone_id(skb, CTA_TUPLE_ZONE, zone,
|
|
|
|
+ NF_CT_ZONE_DIR_REPL) < 0)
|
|
|
|
+ goto nla_put_failure;
|
|
nla_nest_end(skb, nest_parms);
|
|
nla_nest_end(skb, nest_parms);
|
|
|
|
|
|
- zone = nf_ct_zone(ct);
|
|
|
|
- if (zone->id != NF_CT_DEFAULT_ZONE_ID &&
|
|
|
|
- nla_put_be16(skb, CTA_ZONE, htons(zone->id)))
|
|
|
|
|
|
+ if (ctnetlink_dump_zone_id(skb, CTA_ZONE, zone,
|
|
|
|
+ NF_CT_DEFAULT_ZONE_DIR) < 0)
|
|
goto nla_put_failure;
|
|
goto nla_put_failure;
|
|
|
|
|
|
if (ctnetlink_dump_id(skb, ct) < 0)
|
|
if (ctnetlink_dump_id(skb, ct) < 0)
|
|
@@ -924,15 +952,55 @@ ctnetlink_parse_tuple_proto(struct nlattr *attr,
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int
|
|
|
|
+ctnetlink_parse_zone(const struct nlattr *attr,
|
|
|
|
+ struct nf_conntrack_zone *zone)
|
|
|
|
+{
|
|
|
|
+ zone->id = NF_CT_DEFAULT_ZONE_ID;
|
|
|
|
+ zone->dir = NF_CT_DEFAULT_ZONE_DIR;
|
|
|
|
+
|
|
|
|
+#ifdef CONFIG_NF_CONNTRACK_ZONES
|
|
|
|
+ if (attr)
|
|
|
|
+ zone->id = ntohs(nla_get_be16(attr));
|
|
|
|
+#else
|
|
|
|
+ if (attr)
|
|
|
|
+ return -EOPNOTSUPP;
|
|
|
|
+#endif
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int
|
|
|
|
+ctnetlink_parse_tuple_zone(struct nlattr *attr, enum ctattr_type type,
|
|
|
|
+ struct nf_conntrack_zone *zone)
|
|
|
|
+{
|
|
|
|
+ int ret;
|
|
|
|
+
|
|
|
|
+ if (zone->id != NF_CT_DEFAULT_ZONE_ID)
|
|
|
|
+ return -EINVAL;
|
|
|
|
+
|
|
|
|
+ ret = ctnetlink_parse_zone(attr, zone);
|
|
|
|
+ if (ret < 0)
|
|
|
|
+ return ret;
|
|
|
|
+
|
|
|
|
+ if (type == CTA_TUPLE_REPLY)
|
|
|
|
+ zone->dir = NF_CT_ZONE_DIR_REPL;
|
|
|
|
+ else
|
|
|
|
+ zone->dir = NF_CT_ZONE_DIR_ORIG;
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
static const struct nla_policy tuple_nla_policy[CTA_TUPLE_MAX+1] = {
|
|
static const struct nla_policy tuple_nla_policy[CTA_TUPLE_MAX+1] = {
|
|
[CTA_TUPLE_IP] = { .type = NLA_NESTED },
|
|
[CTA_TUPLE_IP] = { .type = NLA_NESTED },
|
|
[CTA_TUPLE_PROTO] = { .type = NLA_NESTED },
|
|
[CTA_TUPLE_PROTO] = { .type = NLA_NESTED },
|
|
|
|
+ [CTA_TUPLE_ZONE] = { .type = NLA_U16 },
|
|
};
|
|
};
|
|
|
|
|
|
static int
|
|
static int
|
|
ctnetlink_parse_tuple(const struct nlattr * const cda[],
|
|
ctnetlink_parse_tuple(const struct nlattr * const cda[],
|
|
struct nf_conntrack_tuple *tuple,
|
|
struct nf_conntrack_tuple *tuple,
|
|
- enum ctattr_type type, u_int8_t l3num)
|
|
|
|
|
|
+ enum ctattr_type type, u_int8_t l3num,
|
|
|
|
+ struct nf_conntrack_zone *zone)
|
|
{
|
|
{
|
|
struct nlattr *tb[CTA_TUPLE_MAX+1];
|
|
struct nlattr *tb[CTA_TUPLE_MAX+1];
|
|
int err;
|
|
int err;
|
|
@@ -959,6 +1027,16 @@ ctnetlink_parse_tuple(const struct nlattr * const cda[],
|
|
if (err < 0)
|
|
if (err < 0)
|
|
return err;
|
|
return err;
|
|
|
|
|
|
|
|
+ if (tb[CTA_TUPLE_ZONE]) {
|
|
|
|
+ if (!zone)
|
|
|
|
+ return -EINVAL;
|
|
|
|
+
|
|
|
|
+ err = ctnetlink_parse_tuple_zone(tb[CTA_TUPLE_ZONE],
|
|
|
|
+ type, zone);
|
|
|
|
+ if (err < 0)
|
|
|
|
+ return err;
|
|
|
|
+ }
|
|
|
|
+
|
|
/* orig and expect tuples get DIR_ORIGINAL */
|
|
/* orig and expect tuples get DIR_ORIGINAL */
|
|
if (type == CTA_TUPLE_REPLY)
|
|
if (type == CTA_TUPLE_REPLY)
|
|
tuple->dst.dir = IP_CT_DIR_REPLY;
|
|
tuple->dst.dir = IP_CT_DIR_REPLY;
|
|
@@ -968,22 +1046,6 @@ ctnetlink_parse_tuple(const struct nlattr * const cda[],
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
-static int
|
|
|
|
-ctnetlink_parse_zone(const struct nlattr *attr,
|
|
|
|
- struct nf_conntrack_zone *zone)
|
|
|
|
-{
|
|
|
|
- zone->id = NF_CT_DEFAULT_ZONE_ID;
|
|
|
|
-
|
|
|
|
-#ifdef CONFIG_NF_CONNTRACK_ZONES
|
|
|
|
- if (attr)
|
|
|
|
- zone->id = ntohs(nla_get_be16(attr));
|
|
|
|
-#else
|
|
|
|
- if (attr)
|
|
|
|
- return -EOPNOTSUPP;
|
|
|
|
-#endif
|
|
|
|
- return 0;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
static const struct nla_policy help_nla_policy[CTA_HELP_MAX+1] = {
|
|
static const struct nla_policy help_nla_policy[CTA_HELP_MAX+1] = {
|
|
[CTA_HELP_NAME] = { .type = NLA_NUL_STRING,
|
|
[CTA_HELP_NAME] = { .type = NLA_NUL_STRING,
|
|
.len = NF_CT_HELPER_NAME_LEN - 1 },
|
|
.len = NF_CT_HELPER_NAME_LEN - 1 },
|
|
@@ -1071,9 +1133,11 @@ ctnetlink_del_conntrack(struct sock *ctnl, struct sk_buff *skb,
|
|
return err;
|
|
return err;
|
|
|
|
|
|
if (cda[CTA_TUPLE_ORIG])
|
|
if (cda[CTA_TUPLE_ORIG])
|
|
- err = ctnetlink_parse_tuple(cda, &tuple, CTA_TUPLE_ORIG, u3);
|
|
|
|
|
|
+ err = ctnetlink_parse_tuple(cda, &tuple, CTA_TUPLE_ORIG,
|
|
|
|
+ u3, &zone);
|
|
else if (cda[CTA_TUPLE_REPLY])
|
|
else if (cda[CTA_TUPLE_REPLY])
|
|
- err = ctnetlink_parse_tuple(cda, &tuple, CTA_TUPLE_REPLY, u3);
|
|
|
|
|
|
+ err = ctnetlink_parse_tuple(cda, &tuple, CTA_TUPLE_REPLY,
|
|
|
|
+ u3, &zone);
|
|
else {
|
|
else {
|
|
return ctnetlink_flush_conntrack(net, cda,
|
|
return ctnetlink_flush_conntrack(net, cda,
|
|
NETLINK_CB(skb).portid,
|
|
NETLINK_CB(skb).portid,
|
|
@@ -1143,9 +1207,11 @@ ctnetlink_get_conntrack(struct sock *ctnl, struct sk_buff *skb,
|
|
return err;
|
|
return err;
|
|
|
|
|
|
if (cda[CTA_TUPLE_ORIG])
|
|
if (cda[CTA_TUPLE_ORIG])
|
|
- err = ctnetlink_parse_tuple(cda, &tuple, CTA_TUPLE_ORIG, u3);
|
|
|
|
|
|
+ err = ctnetlink_parse_tuple(cda, &tuple, CTA_TUPLE_ORIG,
|
|
|
|
+ u3, &zone);
|
|
else if (cda[CTA_TUPLE_REPLY])
|
|
else if (cda[CTA_TUPLE_REPLY])
|
|
- err = ctnetlink_parse_tuple(cda, &tuple, CTA_TUPLE_REPLY, u3);
|
|
|
|
|
|
+ err = ctnetlink_parse_tuple(cda, &tuple, CTA_TUPLE_REPLY,
|
|
|
|
+ u3, &zone);
|
|
else
|
|
else
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
|
|
|
|
@@ -1767,7 +1833,8 @@ ctnetlink_create_conntrack(struct net *net,
|
|
struct nf_conntrack_tuple_hash *master_h;
|
|
struct nf_conntrack_tuple_hash *master_h;
|
|
struct nf_conn *master_ct;
|
|
struct nf_conn *master_ct;
|
|
|
|
|
|
- err = ctnetlink_parse_tuple(cda, &master, CTA_TUPLE_MASTER, u3);
|
|
|
|
|
|
+ err = ctnetlink_parse_tuple(cda, &master, CTA_TUPLE_MASTER,
|
|
|
|
+ u3, NULL);
|
|
if (err < 0)
|
|
if (err < 0)
|
|
goto err2;
|
|
goto err2;
|
|
|
|
|
|
@@ -1818,13 +1885,15 @@ ctnetlink_new_conntrack(struct sock *ctnl, struct sk_buff *skb,
|
|
return err;
|
|
return err;
|
|
|
|
|
|
if (cda[CTA_TUPLE_ORIG]) {
|
|
if (cda[CTA_TUPLE_ORIG]) {
|
|
- err = ctnetlink_parse_tuple(cda, &otuple, CTA_TUPLE_ORIG, u3);
|
|
|
|
|
|
+ err = ctnetlink_parse_tuple(cda, &otuple, CTA_TUPLE_ORIG,
|
|
|
|
+ u3, &zone);
|
|
if (err < 0)
|
|
if (err < 0)
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
|
|
|
|
if (cda[CTA_TUPLE_REPLY]) {
|
|
if (cda[CTA_TUPLE_REPLY]) {
|
|
- err = ctnetlink_parse_tuple(cda, &rtuple, CTA_TUPLE_REPLY, u3);
|
|
|
|
|
|
+ err = ctnetlink_parse_tuple(cda, &rtuple, CTA_TUPLE_REPLY,
|
|
|
|
+ u3, &zone);
|
|
if (err < 0)
|
|
if (err < 0)
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
@@ -2088,7 +2157,7 @@ ctnetlink_nfqueue_build_size(const struct nf_conn *ct)
|
|
+ nla_total_size(sizeof(u_int32_t)) /* CTA_MARK */
|
|
+ nla_total_size(sizeof(u_int32_t)) /* CTA_MARK */
|
|
#endif
|
|
#endif
|
|
#ifdef CONFIG_NF_CONNTRACK_ZONES
|
|
#ifdef CONFIG_NF_CONNTRACK_ZONES
|
|
- + nla_total_size(sizeof(u_int16_t)) /* CTA_ZONE */
|
|
|
|
|
|
+ + nla_total_size(sizeof(u_int16_t)) /* CTA_ZONE|CTA_TUPLE_ZONE */
|
|
#endif
|
|
#endif
|
|
+ ctnetlink_proto_size(ct)
|
|
+ ctnetlink_proto_size(ct)
|
|
;
|
|
;
|
|
@@ -2101,11 +2170,16 @@ ctnetlink_nfqueue_build(struct sk_buff *skb, struct nf_conn *ct)
|
|
struct nlattr *nest_parms;
|
|
struct nlattr *nest_parms;
|
|
|
|
|
|
rcu_read_lock();
|
|
rcu_read_lock();
|
|
|
|
+ zone = nf_ct_zone(ct);
|
|
|
|
+
|
|
nest_parms = nla_nest_start(skb, CTA_TUPLE_ORIG | NLA_F_NESTED);
|
|
nest_parms = nla_nest_start(skb, CTA_TUPLE_ORIG | NLA_F_NESTED);
|
|
if (!nest_parms)
|
|
if (!nest_parms)
|
|
goto nla_put_failure;
|
|
goto nla_put_failure;
|
|
if (ctnetlink_dump_tuples(skb, nf_ct_tuple(ct, IP_CT_DIR_ORIGINAL)) < 0)
|
|
if (ctnetlink_dump_tuples(skb, nf_ct_tuple(ct, IP_CT_DIR_ORIGINAL)) < 0)
|
|
goto nla_put_failure;
|
|
goto nla_put_failure;
|
|
|
|
+ if (ctnetlink_dump_zone_id(skb, CTA_TUPLE_ZONE, zone,
|
|
|
|
+ NF_CT_ZONE_DIR_ORIG) < 0)
|
|
|
|
+ goto nla_put_failure;
|
|
nla_nest_end(skb, nest_parms);
|
|
nla_nest_end(skb, nest_parms);
|
|
|
|
|
|
nest_parms = nla_nest_start(skb, CTA_TUPLE_REPLY | NLA_F_NESTED);
|
|
nest_parms = nla_nest_start(skb, CTA_TUPLE_REPLY | NLA_F_NESTED);
|
|
@@ -2113,11 +2187,13 @@ ctnetlink_nfqueue_build(struct sk_buff *skb, struct nf_conn *ct)
|
|
goto nla_put_failure;
|
|
goto nla_put_failure;
|
|
if (ctnetlink_dump_tuples(skb, nf_ct_tuple(ct, IP_CT_DIR_REPLY)) < 0)
|
|
if (ctnetlink_dump_tuples(skb, nf_ct_tuple(ct, IP_CT_DIR_REPLY)) < 0)
|
|
goto nla_put_failure;
|
|
goto nla_put_failure;
|
|
|
|
+ if (ctnetlink_dump_zone_id(skb, CTA_TUPLE_ZONE, zone,
|
|
|
|
+ NF_CT_ZONE_DIR_REPL) < 0)
|
|
|
|
+ goto nla_put_failure;
|
|
nla_nest_end(skb, nest_parms);
|
|
nla_nest_end(skb, nest_parms);
|
|
|
|
|
|
- zone = nf_ct_zone(ct);
|
|
|
|
- if (zone->id != NF_CT_DEFAULT_ZONE_ID &&
|
|
|
|
- nla_put_be16(skb, CTA_ZONE, htons(zone->id)))
|
|
|
|
|
|
+ if (ctnetlink_dump_zone_id(skb, CTA_ZONE, zone,
|
|
|
|
+ NF_CT_DEFAULT_ZONE_DIR) < 0)
|
|
goto nla_put_failure;
|
|
goto nla_put_failure;
|
|
|
|
|
|
if (ctnetlink_dump_id(skb, ct) < 0)
|
|
if (ctnetlink_dump_id(skb, ct) < 0)
|
|
@@ -2225,12 +2301,12 @@ static int ctnetlink_nfqueue_exp_parse(const struct nlattr * const *cda,
|
|
int err;
|
|
int err;
|
|
|
|
|
|
err = ctnetlink_parse_tuple(cda, tuple, CTA_EXPECT_TUPLE,
|
|
err = ctnetlink_parse_tuple(cda, tuple, CTA_EXPECT_TUPLE,
|
|
- nf_ct_l3num(ct));
|
|
|
|
|
|
+ nf_ct_l3num(ct), NULL);
|
|
if (err < 0)
|
|
if (err < 0)
|
|
return err;
|
|
return err;
|
|
|
|
|
|
return ctnetlink_parse_tuple(cda, mask, CTA_EXPECT_MASK,
|
|
return ctnetlink_parse_tuple(cda, mask, CTA_EXPECT_MASK,
|
|
- nf_ct_l3num(ct));
|
|
|
|
|
|
+ nf_ct_l3num(ct), NULL);
|
|
}
|
|
}
|
|
|
|
|
|
static int
|
|
static int
|
|
@@ -2625,7 +2701,8 @@ static int ctnetlink_dump_exp_ct(struct sock *ctnl, struct sk_buff *skb,
|
|
.done = ctnetlink_exp_done,
|
|
.done = ctnetlink_exp_done,
|
|
};
|
|
};
|
|
|
|
|
|
- err = ctnetlink_parse_tuple(cda, &tuple, CTA_EXPECT_MASTER, u3);
|
|
|
|
|
|
+ err = ctnetlink_parse_tuple(cda, &tuple, CTA_EXPECT_MASTER,
|
|
|
|
+ u3, NULL);
|
|
if (err < 0)
|
|
if (err < 0)
|
|
return err;
|
|
return err;
|
|
|
|
|
|
@@ -2677,9 +2754,11 @@ ctnetlink_get_expect(struct sock *ctnl, struct sk_buff *skb,
|
|
return err;
|
|
return err;
|
|
|
|
|
|
if (cda[CTA_EXPECT_TUPLE])
|
|
if (cda[CTA_EXPECT_TUPLE])
|
|
- err = ctnetlink_parse_tuple(cda, &tuple, CTA_EXPECT_TUPLE, u3);
|
|
|
|
|
|
+ err = ctnetlink_parse_tuple(cda, &tuple, CTA_EXPECT_TUPLE,
|
|
|
|
+ u3, NULL);
|
|
else if (cda[CTA_EXPECT_MASTER])
|
|
else if (cda[CTA_EXPECT_MASTER])
|
|
- err = ctnetlink_parse_tuple(cda, &tuple, CTA_EXPECT_MASTER, u3);
|
|
|
|
|
|
+ err = ctnetlink_parse_tuple(cda, &tuple, CTA_EXPECT_MASTER,
|
|
|
|
+ u3, NULL);
|
|
else
|
|
else
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
|
|
|
|
@@ -2747,7 +2826,8 @@ ctnetlink_del_expect(struct sock *ctnl, struct sk_buff *skb,
|
|
if (err < 0)
|
|
if (err < 0)
|
|
return err;
|
|
return err;
|
|
|
|
|
|
- err = ctnetlink_parse_tuple(cda, &tuple, CTA_EXPECT_TUPLE, u3);
|
|
|
|
|
|
+ err = ctnetlink_parse_tuple(cda, &tuple, CTA_EXPECT_TUPLE,
|
|
|
|
+ u3, NULL);
|
|
if (err < 0)
|
|
if (err < 0)
|
|
return err;
|
|
return err;
|
|
|
|
|
|
@@ -2854,7 +2934,8 @@ ctnetlink_parse_expect_nat(const struct nlattr *attr,
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
|
|
|
|
err = ctnetlink_parse_tuple((const struct nlattr * const *)tb,
|
|
err = ctnetlink_parse_tuple((const struct nlattr * const *)tb,
|
|
- &nat_tuple, CTA_EXPECT_NAT_TUPLE, u3);
|
|
|
|
|
|
+ &nat_tuple, CTA_EXPECT_NAT_TUPLE,
|
|
|
|
+ u3, NULL);
|
|
if (err < 0)
|
|
if (err < 0)
|
|
return err;
|
|
return err;
|
|
|
|
|
|
@@ -2955,13 +3036,16 @@ ctnetlink_create_expect(struct net *net,
|
|
int err;
|
|
int err;
|
|
|
|
|
|
/* caller guarantees that those three CTA_EXPECT_* exist */
|
|
/* caller guarantees that those three CTA_EXPECT_* exist */
|
|
- err = ctnetlink_parse_tuple(cda, &tuple, CTA_EXPECT_TUPLE, u3);
|
|
|
|
|
|
+ err = ctnetlink_parse_tuple(cda, &tuple, CTA_EXPECT_TUPLE,
|
|
|
|
+ u3, NULL);
|
|
if (err < 0)
|
|
if (err < 0)
|
|
return err;
|
|
return err;
|
|
- err = ctnetlink_parse_tuple(cda, &mask, CTA_EXPECT_MASK, u3);
|
|
|
|
|
|
+ err = ctnetlink_parse_tuple(cda, &mask, CTA_EXPECT_MASK,
|
|
|
|
+ u3, NULL);
|
|
if (err < 0)
|
|
if (err < 0)
|
|
return err;
|
|
return err;
|
|
- err = ctnetlink_parse_tuple(cda, &master_tuple, CTA_EXPECT_MASTER, u3);
|
|
|
|
|
|
+ err = ctnetlink_parse_tuple(cda, &master_tuple, CTA_EXPECT_MASTER,
|
|
|
|
+ u3, NULL);
|
|
if (err < 0)
|
|
if (err < 0)
|
|
return err;
|
|
return err;
|
|
|
|
|
|
@@ -3029,7 +3113,8 @@ ctnetlink_new_expect(struct sock *ctnl, struct sk_buff *skb,
|
|
if (err < 0)
|
|
if (err < 0)
|
|
return err;
|
|
return err;
|
|
|
|
|
|
- err = ctnetlink_parse_tuple(cda, &tuple, CTA_EXPECT_TUPLE, u3);
|
|
|
|
|
|
+ err = ctnetlink_parse_tuple(cda, &tuple, CTA_EXPECT_TUPLE,
|
|
|
|
+ u3, NULL);
|
|
if (err < 0)
|
|
if (err < 0)
|
|
return err;
|
|
return err;
|
|
|
|
|