diff options
author | Julian Anastasov <ja@ssi.bg> | 2010-10-17 16:17:20 +0300 |
---|---|---|
committer | Simon Horman <horms@verge.net.au> | 2010-10-21 10:50:02 +0200 |
commit | 8b27b10f5863a5b63e46304a71aa01463d1efac4 (patch) | |
tree | 89f5db8881b0297cda00cad3c2cdedf685e2757f /net/netfilter/ipvs/ip_vs_ftp.c | |
parent | 5bc9068e9d962ca6b8bec3f0eb6f60ab4dee1d04 (diff) | |
download | linux-8b27b10f5863a5b63e46304a71aa01463d1efac4.tar.gz linux-8b27b10f5863a5b63e46304a71aa01463d1efac4.tar.bz2 linux-8b27b10f5863a5b63e46304a71aa01463d1efac4.zip |
ipvs: optimize checksums for apps
Avoid full checksum calculation for apps that can provide
info whether csum was broken after payload mangling. For now only
ip_vs_ftp mangles payload and it updates the csum, so the full
recalculation is avoided for all packets.
Add CHECKSUM_UNNECESSARY for snat_handler (TCP and UDP).
It is needed to support SNAT from local address for the case
when csum is fully recalculated.
Signed-off-by: Julian Anastasov <ja@ssi.bg>
Signed-off-by: Simon Horman <horms@verge.net.au>
Diffstat (limited to 'net/netfilter/ipvs/ip_vs_ftp.c')
-rw-r--r-- | net/netfilter/ipvs/ip_vs_ftp.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/net/netfilter/ipvs/ip_vs_ftp.c b/net/netfilter/ipvs/ip_vs_ftp.c index 090889a3b3af..75455000ad1c 100644 --- a/net/netfilter/ipvs/ip_vs_ftp.c +++ b/net/netfilter/ipvs/ip_vs_ftp.c @@ -242,9 +242,14 @@ static int ip_vs_ftp_out(struct ip_vs_app *app, struct ip_vs_conn *cp, ret = nf_nat_mangle_tcp_packet(skb, ct, ctinfo, start-data, end-start, buf, buf_len); - if (ret) + if (ret) { ip_vs_nfct_expect_related(skb, ct, n_cp, IPPROTO_TCP, 0, 0); + if (skb->ip_summed == CHECKSUM_COMPLETE) + skb->ip_summed = CHECKSUM_UNNECESSARY; + /* csum is updated */ + ret = 1; + } } /* |