Packets that have been processed by LVS are being sent out immediately
meaning that there's no chance for looping in ip_vs_out so I removed
the ipvs_property sets/checks from those paths. Packets that have been
sent out first go through POSTROUTING (again) and aren't changed in the
case of LVS-DR and LVS-TUN so I've used the flag to prevent an infinite
loop in ip_vs_in.
--
Jason Stubbs <j.stubbs@xxxxxxxxxxxxxxx>
LINKTHINK INC.
東京都渋谷区桜ヶ丘町22-14 N.E.S S棟 3F
TEL 03-5728-4772 FAX 03-5728-4773
diff -urp linux.3.routing/net/ipv4/ipvs/ip_vs_core.c
linux.4.recursion/net/ipv4/ipvs/ip_vs_core.c
--- linux.3.routing/net/ipv4/ipvs/ip_vs_core.c 2008-04-15 13:06:50.942660390
+0900
+++ linux.4.recursion/net/ipv4/ipvs/ip_vs_core.c 2008-04-15
13:07:04.424842262 +0900
@@ -640,7 +640,6 @@ static int ip_vs_out_icmp(struct sk_buff
/* do the statistics and put it back */
ip_vs_out_stats(cp, skb);
- skb->ipvs_property = 1;
verdict = NF_ACCEPT;
out:
@@ -676,9 +675,6 @@ ip_vs_out(unsigned int hooknum, struct s
EnterFunction(11);
- if (skb->ipvs_property)
- return NF_ACCEPT;
-
iph = ip_hdr(skb);
if (unlikely(iph->protocol == IPPROTO_ICMP)) {
int related, verdict = ip_vs_out_icmp(skb, &related);
@@ -754,8 +750,6 @@ ip_vs_out(unsigned int hooknum, struct s
ip_vs_set_state(cp, IP_VS_DIR_OUTPUT, skb, pp);
ip_vs_conn_put(cp);
- skb->ipvs_property = 1;
-
LeaveFunction(11);
return NF_ACCEPT;
@@ -877,6 +871,9 @@ ip_vs_in(unsigned int hooknum, struct sk
int ret, restart;
int ihl;
+ if (skb->ipvs_property)
+ return NF_ACCEPT;
+
iph = ip_hdr(skb);
if (unlikely(iph->protocol == IPPROTO_ICMP)) {
int related, verdict = ip_vs_in_icmp(skb, &related, hooknum);
|