IPVS parses packets into struct ip_vs_iphdr before scheduling and state
handling.  For IPv6, iph.len contains the real transport-header offset
after ipv6_find_hdr() has skipped any extension headers.

TCP and SCTP state handlers still recompute their own transport offsets.
They use sizeof(struct ipv6hdr) for IPv6, so packets with extension
headers make the state machines read the wrong bytes.

Pass the parsed transport offset through the common IPVS state handling
callback, then use it in the TCP and SCTP state lookups.

Changes in v2:
- Pass the parsed transport offset through ip_vs_set_state() and the
  protocol callbacks.
- Fix TCP state handling as well as SCTP.
- Avoid reparsing the skb in SCTP state handling.
- Split the common plumbing, TCP fix and SCTP fix into a 3-patch series.

Yizhou Zhao (3):
  ipvs: pass parsed transport offset to state handlers
  ipvs: use parsed transport offset in TCP state lookup
  ipvs: use parsed transport offset in SCTP state lookup

 include/net/ip_vs.h                   |  3 ++-
 net/netfilter/ipvs/ip_vs_core.c       | 10 +++++-----
 net/netfilter/ipvs/ip_vs_proto_sctp.c | 18 +++++++-----------
 net/netfilter/ipvs/ip_vs_proto_tcp.c  | 11 +++--------
 net/netfilter/ipvs/ip_vs_proto_udp.c  |  3 ++-
 5 files changed, 19 insertions(+), 26 deletions(-)

-- 
2.34.1


Reply via email to