|
@@ -39,6 +39,7 @@ tcp_conn_schedule(int af, struct sk_buff *skb, struct ip_vs_proto_data *pd,
|
|
|
struct net *net;
|
|
|
struct ip_vs_service *svc;
|
|
|
struct tcphdr _tcph, *th;
|
|
|
+ struct netns_ipvs *ipvs;
|
|
|
|
|
|
th = skb_header_pointer(skb, iph->len, sizeof(_tcph), &_tcph);
|
|
|
if (th == NULL) {
|
|
@@ -46,14 +47,15 @@ tcp_conn_schedule(int af, struct sk_buff *skb, struct ip_vs_proto_data *pd,
|
|
|
return 0;
|
|
|
}
|
|
|
net = skb_net(skb);
|
|
|
+ ipvs = net_ipvs(net);
|
|
|
/* No !th->ack check to allow scheduling on SYN+ACK for Active FTP */
|
|
|
rcu_read_lock();
|
|
|
- if (th->syn &&
|
|
|
+ if ((th->syn || sysctl_sloppy_tcp(ipvs)) && !th->rst &&
|
|
|
(svc = ip_vs_service_find(net, af, skb->mark, iph->protocol,
|
|
|
&iph->daddr, th->dest))) {
|
|
|
int ignored;
|
|
|
|
|
|
- if (ip_vs_todrop(net_ipvs(net))) {
|
|
|
+ if (ip_vs_todrop(ipvs)) {
|
|
|
/*
|
|
|
* It seems that we are very loaded.
|
|
|
* We have to drop this packet :(
|
|
@@ -401,7 +403,7 @@ static struct tcp_states_t tcp_states [] = {
|
|
|
/* sNO, sES, sSS, sSR, sFW, sTW, sCL, sCW, sLA, sLI, sSA */
|
|
|
/*syn*/ {{sSR, sES, sES, sSR, sSR, sSR, sSR, sSR, sSR, sSR, sSR }},
|
|
|
/*fin*/ {{sCL, sCW, sSS, sTW, sTW, sTW, sCL, sCW, sLA, sLI, sTW }},
|
|
|
-/*ack*/ {{sCL, sES, sSS, sES, sFW, sTW, sCL, sCW, sCL, sLI, sES }},
|
|
|
+/*ack*/ {{sES, sES, sSS, sES, sFW, sTW, sCL, sCW, sCL, sLI, sES }},
|
|
|
/*rst*/ {{sCL, sCL, sCL, sSR, sCL, sCL, sCL, sCL, sLA, sLI, sSR }},
|
|
|
|
|
|
/* OUTPUT */
|
|
@@ -415,7 +417,7 @@ static struct tcp_states_t tcp_states [] = {
|
|
|
/* sNO, sES, sSS, sSR, sFW, sTW, sCL, sCW, sLA, sLI, sSA */
|
|
|
/*syn*/ {{sSR, sES, sES, sSR, sSR, sSR, sSR, sSR, sSR, sSR, sSR }},
|
|
|
/*fin*/ {{sCL, sFW, sSS, sTW, sFW, sTW, sCL, sCW, sLA, sLI, sTW }},
|
|
|
-/*ack*/ {{sCL, sES, sSS, sES, sFW, sTW, sCL, sCW, sCL, sLI, sES }},
|
|
|
+/*ack*/ {{sES, sES, sSS, sES, sFW, sTW, sCL, sCW, sCL, sLI, sES }},
|
|
|
/*rst*/ {{sCL, sCL, sCL, sSR, sCL, sCL, sCL, sCL, sLA, sLI, sCL }},
|
|
|
};
|
|
|
|
|
@@ -424,7 +426,7 @@ static struct tcp_states_t tcp_states_dos [] = {
|
|
|
/* sNO, sES, sSS, sSR, sFW, sTW, sCL, sCW, sLA, sLI, sSA */
|
|
|
/*syn*/ {{sSR, sES, sES, sSR, sSR, sSR, sSR, sSR, sSR, sSR, sSA }},
|
|
|
/*fin*/ {{sCL, sCW, sSS, sTW, sTW, sTW, sCL, sCW, sLA, sLI, sSA }},
|
|
|
-/*ack*/ {{sCL, sES, sSS, sSR, sFW, sTW, sCL, sCW, sCL, sLI, sSA }},
|
|
|
+/*ack*/ {{sES, sES, sSS, sSR, sFW, sTW, sCL, sCW, sCL, sLI, sSA }},
|
|
|
/*rst*/ {{sCL, sCL, sCL, sSR, sCL, sCL, sCL, sCL, sLA, sLI, sCL }},
|
|
|
|
|
|
/* OUTPUT */
|
|
@@ -438,7 +440,7 @@ static struct tcp_states_t tcp_states_dos [] = {
|
|
|
/* sNO, sES, sSS, sSR, sFW, sTW, sCL, sCW, sLA, sLI, sSA */
|
|
|
/*syn*/ {{sSA, sES, sES, sSR, sSA, sSA, sSA, sSA, sSA, sSA, sSA }},
|
|
|
/*fin*/ {{sCL, sFW, sSS, sTW, sFW, sTW, sCL, sCW, sLA, sLI, sTW }},
|
|
|
-/*ack*/ {{sCL, sES, sSS, sES, sFW, sTW, sCL, sCW, sCL, sLI, sES }},
|
|
|
+/*ack*/ {{sES, sES, sSS, sES, sFW, sTW, sCL, sCW, sCL, sLI, sES }},
|
|
|
/*rst*/ {{sCL, sCL, sCL, sSR, sCL, sCL, sCL, sCL, sLA, sLI, sCL }},
|
|
|
};
|
|
|
|