50 #define KMSG_COMPONENT "IPVS"
51 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
53 #include <linux/module.h>
54 #include <linux/types.h>
55 #include <linux/kernel.h>
56 #include <linux/errno.h>
57 #include <linux/compiler.h>
61 #include <linux/netfilter.h>
62 #include <linux/netfilter_ipv4.h>
70 #define FMT_TUPLE "%pI4:%u->%pI4:%u/%u"
71 #define ARG_TUPLE(T) &(T)->src.u3.ip, ntohs((T)->src.u.all), \
72 &(T)->dst.u3.ip, ntohs((T)->dst.u.all), \
75 #define FMT_CONN "%pI4:%u->%pI4:%u->%pI4:%u/%u:%u"
76 #define ARG_CONN(C) &((C)->caddr.ip), ntohs((C)->cport), \
77 &((C)->vaddr.ip), ntohs((C)->vport), \
78 &((C)->daddr.ip), ntohs((C)->dport), \
79 (C)->protocol, (C)->state
85 struct nf_conn *
ct = ct = nf_ct_get(skb, &ctinfo);
88 if (ct ==
NULL || nf_ct_is_confirmed(ct) || nf_ct_is_untracked(ct) ||
114 new_tuple.
src.u.tcp.port = cp->
dport;
119 new_tuple.
dst.u.tcp.port = cp->
vport;
121 IP_VS_DBG(7,
"%s: Updating conntrack ct=%p, status=0x%lX, "
124 __func__, ct, ct->
status, ctinfo,
132 return nf_conntrack_confirm(skb);
138 static void ip_vs_nfct_expect_callback(
struct nf_conn *
ct,
144 struct net *
net = nf_ct_net(ct);
159 ip_vs_conn_fill_param(net, exp->
tuple.src.l3num, orig->
dst.protonum,
160 &orig->
src.u3, orig->
src.u.tcp.port,
161 &orig->
dst.u3, orig->
dst.u.tcp.port, &
p);
172 new_reply.
dst.u.tcp.port = cp->
vport;
174 ", inout cp=" FMT_CONN
"\n",
187 FMT_TUPLE ", found outin cp=" FMT_CONN
"\n",
192 new_reply.
src.u.tcp.port = cp->
dport;
202 " - unknown expect\n",
226 if (ct ==
NULL || nf_ct_is_untracked(ct))
236 proto, port ? &port :
NULL,
239 exp->
expectfn = ip_vs_nfct_expect_callback;
243 nf_ct_expect_related(exp);
264 tuple.
src.l3num = cp->
af;
269 " for conn " FMT_CONN
"\n",
275 ct = nf_ct_tuplehash_to_ctrack(h);
278 IP_VS_DBG(7,
"%s: ct=%p, deleted conntrack timer for tuple="
284 IP_VS_DBG(7,
"%s: ct=%p, no conntrack timer for tuple="