28 Sep, 2012

2 commits

  • Reduce the number of times we scan/skip the IPv6 exthdrs.

    This patch contains a lot of API changes. This is done, to avoid
    repeating the scan of finding the IPv6 headers, via ipv6_find_hdr(),
    which is called by ip_vs_fill_iph_skb().

    Finding the IPv6 headers is done as early as possible, and passed on
    as a pointer "struct ip_vs_iphdr *" to the affected functions.

    This patch reduce/removes 19 calls to ip_vs_fill_iph_skb().

    Notice, I have choosen, not to change the API of function
    pointer "(*schedule)" (in struct ip_vs_scheduler) as it can be
    used by external schedulers, via {un,}register_ip_vs_scheduler.
    Only 4 out of 10 schedulers use info from ip_vs_iphdr*, and when
    they do, they are only interested in iph->{s,d}addr.

    Signed-off-by: Jesper Dangaard Brouer
    Acked-by: Julian Anastasov
    Signed-off-by: Simon Horman

    Jesper Dangaard Brouer
     
  • IPv6 packets can contain extension headers, thus its wrong to assume
    that the transport/upper-layer header, starts right after (struct
    ipv6hdr) the IPv6 header. IPVS uses this false assumption, and will
    write SNAT & DNAT modifications at a fixed pos which will corrupt the
    message.

    To fix this, proper header position must be found before modifying
    packets. Introducing ip_vs_fill_iph_skb(), which uses ipv6_find_hdr()
    to skip the exthdrs. It finds (1) the transport header offset, (2) the
    protocol, and (3) detects if the packet is a fragment.

    Note, that fragments in IPv6 is represented via an exthdr. Thus, this
    is detected while skipping through the exthdrs.

    This patch depends on commit 84018f55a:
    "netfilter: ip6_tables: add flags parameter to ipv6_find_hdr()"
    This also adds a dependency to ip6_tables.

    Originally based on patch from: Hans Schillstrom

    kABI notes:
    Changing struct ip_vs_iphdr is a potential minor kABI breaker,
    because external modules can be compiled with another version of
    this struct. This should not matter, as they would most-likely
    be using a compiled-in version of ip_vs_fill_iphdr(). When
    recompiled, they will notice ip_vs_fill_iphdr() no longer exists,
    and they have to used ip_vs_fill_iph_skb() instead.

    Signed-off-by: Jesper Dangaard Brouer
    Acked-by: Julian Anastasov
    Signed-off-by: Simon Horman

    Jesper Dangaard Brouer
     

13 Jan, 2011

1 commit

  • ip_vs_protocol *pp is replaced by ip_vs_proto_data *pd in
    function call in ip_vs_protocol struct i.e. :,
    - timeout_change()
    - state_transition()

    ip_vs_protocol_timeout_change() got ipvs as param, due to above
    and a upcoming patch - defence work

    Most of this changes are triggered by Julians comment:
    "tcp_timeout_change should work with the new struct ip_vs_proto_data
    so that tcp_state_table will go to pd->state_table
    and set_tcp_state will get pd instead of pp"

    *v3
    Mostly comments from Julian
    The pp -> pd conversion should start from functions like
    ip_vs_out() that use pp = ip_vs_proto_get(iph.protocol),
    now they should use ip_vs_proto_data_get(net, iph.protocol).
    conn_in_get() and conn_out_get() unused param *pp, removed.

    *v4
    ip_vs_protocol_timeout_change() walk the proto_data path.

    Signed-off-by: Hans Schillstrom
    Acked-by: Julian Anastasov
    Signed-off-by: Simon Horman

    Hans Schillstrom
     

05 Oct, 2010

1 commit


23 Jul, 2010

1 commit