|
|
@@ -2133,9 +2133,9 @@ ctnetlink_alloc_expect(const struct nlattr *const cda[], struct nf_conn *ct,
|
|
|
struct nf_conntrack_tuple *tuple,
|
|
|
struct nf_conntrack_tuple *mask);
|
|
|
|
|
|
-#ifdef CONFIG_NETFILTER_NETLINK_QUEUE_CT
|
|
|
+#ifdef CONFIG_NETFILTER_NETLINK_GLUE_CT
|
|
|
static size_t
|
|
|
-ctnetlink_nfqueue_build_size(const struct nf_conn *ct)
|
|
|
+ctnetlink_glue_build_size(const struct nf_conn *ct)
|
|
|
{
|
|
|
return 3 * nla_total_size(0) /* CTA_TUPLE_ORIG|REPL|MASTER */
|
|
|
+ 3 * nla_total_size(0) /* CTA_TUPLE_IP */
|
|
|
@@ -2162,8 +2162,19 @@ ctnetlink_nfqueue_build_size(const struct nf_conn *ct)
|
|
|
;
|
|
|
}
|
|
|
|
|
|
-static int
|
|
|
-ctnetlink_nfqueue_build(struct sk_buff *skb, struct nf_conn *ct)
|
|
|
+static struct nf_conn *ctnetlink_glue_get_ct(const struct sk_buff *skb,
|
|
|
+ enum ip_conntrack_info *ctinfo)
|
|
|
+{
|
|
|
+ struct nf_conn *ct;
|
|
|
+
|
|
|
+ ct = nf_ct_get(skb, ctinfo);
|
|
|
+ if (ct && nf_ct_is_untracked(ct))
|
|
|
+ ct = NULL;
|
|
|
+
|
|
|
+ return ct;
|
|
|
+}
|
|
|
+
|
|
|
+static int __ctnetlink_glue_build(struct sk_buff *skb, struct nf_conn *ct)
|
|
|
{
|
|
|
const struct nf_conntrack_zone *zone;
|
|
|
struct nlattr *nest_parms;
|
|
|
@@ -2236,7 +2247,32 @@ nla_put_failure:
|
|
|
}
|
|
|
|
|
|
static int
|
|
|
-ctnetlink_nfqueue_parse_ct(const struct nlattr *cda[], struct nf_conn *ct)
|
|
|
+ctnetlink_glue_build(struct sk_buff *skb, struct nf_conn *ct,
|
|
|
+ enum ip_conntrack_info ctinfo,
|
|
|
+ u_int16_t ct_attr, u_int16_t ct_info_attr)
|
|
|
+{
|
|
|
+ struct nlattr *nest_parms;
|
|
|
+
|
|
|
+ nest_parms = nla_nest_start(skb, ct_attr | NLA_F_NESTED);
|
|
|
+ if (!nest_parms)
|
|
|
+ goto nla_put_failure;
|
|
|
+
|
|
|
+ if (__ctnetlink_glue_build(skb, ct) < 0)
|
|
|
+ goto nla_put_failure;
|
|
|
+
|
|
|
+ nla_nest_end(skb, nest_parms);
|
|
|
+
|
|
|
+ if (nla_put_be32(skb, ct_info_attr, htonl(ctinfo)))
|
|
|
+ goto nla_put_failure;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+
|
|
|
+nla_put_failure:
|
|
|
+ return -ENOSPC;
|
|
|
+}
|
|
|
+
|
|
|
+static int
|
|
|
+ctnetlink_glue_parse_ct(const struct nlattr *cda[], struct nf_conn *ct)
|
|
|
{
|
|
|
int err;
|
|
|
|
|
|
@@ -2276,7 +2312,7 @@ ctnetlink_nfqueue_parse_ct(const struct nlattr *cda[], struct nf_conn *ct)
|
|
|
}
|
|
|
|
|
|
static int
|
|
|
-ctnetlink_nfqueue_parse(const struct nlattr *attr, struct nf_conn *ct)
|
|
|
+ctnetlink_glue_parse(const struct nlattr *attr, struct nf_conn *ct)
|
|
|
{
|
|
|
struct nlattr *cda[CTA_MAX+1];
|
|
|
int ret;
|
|
|
@@ -2286,16 +2322,16 @@ ctnetlink_nfqueue_parse(const struct nlattr *attr, struct nf_conn *ct)
|
|
|
return ret;
|
|
|
|
|
|
spin_lock_bh(&nf_conntrack_expect_lock);
|
|
|
- ret = ctnetlink_nfqueue_parse_ct((const struct nlattr **)cda, ct);
|
|
|
+ ret = ctnetlink_glue_parse_ct((const struct nlattr **)cda, ct);
|
|
|
spin_unlock_bh(&nf_conntrack_expect_lock);
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-static int ctnetlink_nfqueue_exp_parse(const struct nlattr * const *cda,
|
|
|
- const struct nf_conn *ct,
|
|
|
- struct nf_conntrack_tuple *tuple,
|
|
|
- struct nf_conntrack_tuple *mask)
|
|
|
+static int ctnetlink_glue_exp_parse(const struct nlattr * const *cda,
|
|
|
+ const struct nf_conn *ct,
|
|
|
+ struct nf_conntrack_tuple *tuple,
|
|
|
+ struct nf_conntrack_tuple *mask)
|
|
|
{
|
|
|
int err;
|
|
|
|
|
|
@@ -2309,8 +2345,8 @@ static int ctnetlink_nfqueue_exp_parse(const struct nlattr * const *cda,
|
|
|
}
|
|
|
|
|
|
static int
|
|
|
-ctnetlink_nfqueue_attach_expect(const struct nlattr *attr, struct nf_conn *ct,
|
|
|
- u32 portid, u32 report)
|
|
|
+ctnetlink_glue_attach_expect(const struct nlattr *attr, struct nf_conn *ct,
|
|
|
+ u32 portid, u32 report)
|
|
|
{
|
|
|
struct nlattr *cda[CTA_EXPECT_MAX+1];
|
|
|
struct nf_conntrack_tuple tuple, mask;
|
|
|
@@ -2322,8 +2358,8 @@ ctnetlink_nfqueue_attach_expect(const struct nlattr *attr, struct nf_conn *ct,
|
|
|
if (err < 0)
|
|
|
return err;
|
|
|
|
|
|
- err = ctnetlink_nfqueue_exp_parse((const struct nlattr * const *)cda,
|
|
|
- ct, &tuple, &mask);
|
|
|
+ err = ctnetlink_glue_exp_parse((const struct nlattr * const *)cda,
|
|
|
+ ct, &tuple, &mask);
|
|
|
if (err < 0)
|
|
|
return err;
|
|
|
|
|
|
@@ -2350,14 +2386,24 @@ ctnetlink_nfqueue_attach_expect(const struct nlattr *attr, struct nf_conn *ct,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static struct nfq_ct_hook ctnetlink_nfqueue_hook = {
|
|
|
- .build_size = ctnetlink_nfqueue_build_size,
|
|
|
- .build = ctnetlink_nfqueue_build,
|
|
|
- .parse = ctnetlink_nfqueue_parse,
|
|
|
- .attach_expect = ctnetlink_nfqueue_attach_expect,
|
|
|
- .seq_adjust = nf_ct_tcp_seqadj_set,
|
|
|
+static void ctnetlink_glue_seqadj(struct sk_buff *skb, struct nf_conn *ct,
|
|
|
+ enum ip_conntrack_info ctinfo, int diff)
|
|
|
+{
|
|
|
+ if (!(ct->status & IPS_NAT_MASK))
|
|
|
+ return;
|
|
|
+
|
|
|
+ nf_ct_tcp_seqadj_set(skb, ct, ctinfo, diff);
|
|
|
+}
|
|
|
+
|
|
|
+static struct nfnl_ct_hook ctnetlink_glue_hook = {
|
|
|
+ .get_ct = ctnetlink_glue_get_ct,
|
|
|
+ .build_size = ctnetlink_glue_build_size,
|
|
|
+ .build = ctnetlink_glue_build,
|
|
|
+ .parse = ctnetlink_glue_parse,
|
|
|
+ .attach_expect = ctnetlink_glue_attach_expect,
|
|
|
+ .seq_adjust = ctnetlink_glue_seqadj,
|
|
|
};
|
|
|
-#endif /* CONFIG_NETFILTER_NETLINK_QUEUE_CT */
|
|
|
+#endif /* CONFIG_NETFILTER_NETLINK_GLUE_CT */
|
|
|
|
|
|
/***********************************************************************
|
|
|
* EXPECT
|
|
|
@@ -3341,9 +3387,9 @@ static int __init ctnetlink_init(void)
|
|
|
pr_err("ctnetlink_init: cannot register pernet operations\n");
|
|
|
goto err_unreg_exp_subsys;
|
|
|
}
|
|
|
-#ifdef CONFIG_NETFILTER_NETLINK_QUEUE_CT
|
|
|
+#ifdef CONFIG_NETFILTER_NETLINK_GLUE_CT
|
|
|
/* setup interaction between nf_queue and nf_conntrack_netlink. */
|
|
|
- RCU_INIT_POINTER(nfq_ct_hook, &ctnetlink_nfqueue_hook);
|
|
|
+ RCU_INIT_POINTER(nfnl_ct_hook, &ctnetlink_glue_hook);
|
|
|
#endif
|
|
|
return 0;
|
|
|
|
|
|
@@ -3362,8 +3408,8 @@ static void __exit ctnetlink_exit(void)
|
|
|
unregister_pernet_subsys(&ctnetlink_net_ops);
|
|
|
nfnetlink_subsys_unregister(&ctnl_exp_subsys);
|
|
|
nfnetlink_subsys_unregister(&ctnl_subsys);
|
|
|
-#ifdef CONFIG_NETFILTER_NETLINK_QUEUE_CT
|
|
|
- RCU_INIT_POINTER(nfq_ct_hook, NULL);
|
|
|
+#ifdef CONFIG_NETFILTER_NETLINK_GLUE_CT
|
|
|
+ RCU_INIT_POINTER(nfnl_ct_hook, NULL);
|
|
|
#endif
|
|
|
}
|
|
|
|