@ -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 } } ,
} ;