safe/jmp/linux-2.6
17 years ago[SK_BUFF]: Introduce skb_reset_network_header(skb)
Arnaldo Carvalho de Melo [Wed, 11 Apr 2007 03:45:18 +0000 (20:45 -0700)]
[SK_BUFF]: Introduce skb_reset_network_header(skb)

For the common, open coded 'skb->nh.raw = skb->data' operation, so that we can
later turn skb->nh.raw into a offset, reducing the size of struct sk_buff in
64bit land while possibly keeping it as a pointer on 32bit.

This one touches just the most simple case, next will handle the slightly more
"complex" cases.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[IPV6]: Use skb->nh.ipv6h instead of casting skb->nh.raw
Arnaldo Carvalho de Melo [Sat, 10 Mar 2007 19:21:45 +0000 (16:21 -0300)]
[IPV6]: Use skb->nh.ipv6h instead of casting skb->nh.raw

nh.ipv6h is there exactly for this reason! Use it while it exists ;-)

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[BONDING]: Introduce arp_pkt()
Arnaldo Carvalho de Melo [Sat, 10 Mar 2007 19:07:19 +0000 (16:07 -0300)]
[BONDING]: Introduce arp_pkt()

For consistency with all the other skb->nh.raw accessors.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[PPPOE]: Introduce pppoe_hdr()
Arnaldo Carvalho de Melo [Sat, 10 Mar 2007 18:56:08 +0000 (15:56 -0300)]
[PPPOE]: Introduce pppoe_hdr()

For consistency with all the other skb->nh.raw accessors.

Also do some really obvious simplifications in pppoe_recvmsg, well the
kfree_skb one is not so obvious, but free() and kfree() have the same behaviour
(hint :-) ).

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[LLC]: Kill llc_set_pdu_hdr
Arnaldo Carvalho de Melo [Sat, 10 Mar 2007 18:34:36 +0000 (15:34 -0300)]
[LLC]: Kill llc_set_pdu_hdr

We'll have skb_reset_network_header soon.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[SK_BUFF]: Introduce skb_mac_header()
Arnaldo Carvalho de Melo [Mon, 19 Mar 2007 22:33:04 +0000 (15:33 -0700)]
[SK_BUFF]: Introduce skb_mac_header()

For the places where we need a pointer to the mac header, it is still legal to
touch skb->mac.raw directly if just adding to, subtracting from or setting it
to another layer header.

This one also converts some more cases to skb_reset_mac_header() that my
regex missed as it had no spaces before nor after '=', ugh.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[TCP]: Use skb_set_mac_header in tcp_collapse
Arnaldo Carvalho de Melo [Sat, 10 Mar 2007 15:48:37 +0000 (12:48 -0300)]
[TCP]: Use skb_set_mac_header in tcp_collapse

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[TCP]: Do the layer header setting in tcp_collapse relative to skb->data
Arnaldo Carvalho de Melo [Sat, 10 Mar 2007 15:47:22 +0000 (12:47 -0300)]
[TCP]: Do the layer header setting in tcp_collapse relative to skb->data

That is equal to skb->head before skb_reserve, to help in the layer header
changes.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[SK_BUFF] xfrm: Use skb_set_mac_header in the memmove cases
Arnaldo Carvalho de Melo [Sat, 10 Mar 2007 15:40:27 +0000 (12:40 -0300)]
[SK_BUFF] xfrm: Use skb_set_mac_header in the memmove cases

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[SK_BUFF]: Introduce skb_set_mac_header()
Arnaldo Carvalho de Melo [Sat, 10 Mar 2007 15:30:58 +0000 (12:30 -0300)]
[SK_BUFF]: Introduce skb_set_mac_header()

For the cases where we want to set skb->mac.raw to an offset from skb->data.

Simple cases first, the memmove ones and specially pktgen will be left for later.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[LLC]: Use skb_reset_mac_header in llc_mac_hdr_init
Arnaldo Carvalho de Melo [Sat, 10 Mar 2007 15:17:29 +0000 (12:17 -0300)]
[LLC]: Use skb_reset_mac_header in llc_mac_hdr_init

skb_push updates and returns skb->data, so we can just call
skb_reset_mac_header after the call to skb_push.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[LLC]: Use skb_reset_mac_header in llc_alloc_frame
Arnaldo Carvalho de Melo [Sat, 10 Mar 2007 15:14:56 +0000 (12:14 -0300)]
[LLC]: Use skb_reset_mac_header in llc_alloc_frame

skb->head is equal to skb->data after alloc_skb, so reset the mac header while
this is true, i.e. before skb_reserve.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[SK_BUFF]: Introduce skb_reset_mac_header(skb)
Arnaldo Carvalho de Melo [Mon, 19 Mar 2007 22:30:44 +0000 (15:30 -0700)]
[SK_BUFF]: Introduce skb_reset_mac_header(skb)

For the common, open coded 'skb->mac.raw = skb->data' operation, so that we can
later turn skb->mac.raw into a offset, reducing the size of struct sk_buff in
64bit land while possibly keeping it as a pointer on 32bit.

This one touches just the most simple case, next will handle the slightly more
"complex" cases.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[ETH]: Make eth_type_trans set skb->dev like the other *_type_trans
Arnaldo Carvalho de Melo [Thu, 26 Apr 2007 00:40:23 +0000 (17:40 -0700)]
[ETH]: Make eth_type_trans set skb->dev like the other *_type_trans

One less thing for drivers writers to worry about.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[AOE]: Introduce aoe_hdr()
Arnaldo Carvalho de Melo [Sat, 10 Mar 2007 14:20:07 +0000 (11:20 -0300)]
[AOE]: Introduce aoe_hdr()

For consistency with other skb->mac.raw users.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[QETH]: Use eth_hdr()
Arnaldo Carvalho de Melo [Sat, 10 Mar 2007 14:13:59 +0000 (11:13 -0300)]
[QETH]: Use eth_hdr()

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[HIPPI/FDDI]: Make {hippi,fddi}_type_trans set skb->dev
Arnaldo Carvalho de Melo [Sat, 10 Mar 2007 13:57:13 +0000 (10:57 -0300)]
[HIPPI/FDDI]: Make {hippi,fddi}_type_trans set skb->dev

Now all the _type_trans routines are consistent in this regard.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[TR]: Make tr_type_trans set skb->dev
Arnaldo Carvalho de Melo [Mon, 19 Mar 2007 22:29:16 +0000 (15:29 -0700)]
[TR]: Make tr_type_trans set skb->dev

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[TR]: Use tr_hdr() were appropriate
Arnaldo Carvalho de Melo [Mon, 19 Mar 2007 22:27:07 +0000 (15:27 -0700)]
[TR]: Use tr_hdr() were appropriate

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[SOCKET]: Export __sock_recv_timestamp
Arnaldo Carvalho de Melo [Sat, 10 Mar 2007 03:39:35 +0000 (00:39 -0300)]
[SOCKET]: Export __sock_recv_timestamp

Kernel: arch/x86_64/boot/bzImage is ready  (#2)
  MODPOST 1816 modules
WARNING: "__sock_recv_timestamp" [net/sctp/sctp.ko] undefined!
WARNING: "__sock_recv_timestamp" [net/packet/af_packet.ko] undefined!
WARNING: "__sock_recv_timestamp" [net/key/af_key.ko] undefined!
WARNING: "__sock_recv_timestamp" [net/ipv6/ipv6.ko] undefined!
WARNING: "__sock_recv_timestamp" [net/atm/atm.ko] undefined!
make[2]: *** [__modpost] Error 1
make[1]: *** [modules] Error 2
make: *** [_all] Error 2

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[NET]: Adding SO_TIMESTAMPNS / SCM_TIMESTAMPNS support
Eric Dumazet [Mon, 26 Mar 2007 05:14:49 +0000 (22:14 -0700)]
[NET]: Adding SO_TIMESTAMPNS / SCM_TIMESTAMPNS support

Now that network timestamps use ktime_t infrastructure, we can add a new
SOL_SOCKET sockopt  SO_TIMESTAMPNS.

This command is similar to SO_TIMESTAMP, but permits transmission of
a 'timespec struct' instead of a 'timeval struct' control message.
(nanosecond resolution instead of microsecond)

Control message is labelled SCM_TIMESTAMPNS instead of SCM_TIMESTAMP

A socket cannot mix SO_TIMESTAMP and SO_TIMESTAMPNS : the two modes are
mutually exclusive.

sock_recv_timestamp() became too big to be fully inlined so I added a
__sock_recv_timestamp() helper function.

Signed-off-by: Eric Dumazet <dada1@cosmosbay.com>
CC: linux-arch@vger.kernel.org
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[UDP]: Use __skb_pull since we have checked it won't fail with pskb_may_pull
Arnaldo Carvalho de Melo [Fri, 9 Mar 2007 21:51:54 +0000 (13:51 -0800)]
[UDP]: Use __skb_pull since we have checked it won't fail with pskb_may_pull

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[NET]: New sysctls should use __read_mostly tags
Eric Dumazet [Fri, 9 Mar 2007 06:36:37 +0000 (22:36 -0800)]
[NET]: New sysctls should use __read_mostly tags

net_msg_warn should be placed in the read_mostly section, to avoid
performance problems on SMP

Signed-off-by: Eric Dumazet <dada1@cosmosbay.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[IPV6]: Ensure to truncate result and return full length for sticky options.
YOSHIFUJI Hideaki [Fri, 9 Mar 2007 04:48:23 +0000 (20:48 -0800)]
[IPV6]: Ensure to truncate result and return full length for sticky options.

Bug noticed by Chris Wright <chrisw@sous-sol.org>.

Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[IPV6]: Return correct result for sticky options.
YOSHIFUJI Hideaki [Mon, 19 Mar 2007 00:35:57 +0000 (17:35 -0700)]
[IPV6]: Return correct result for sticky options.

We returned incorrect result with IPV6_RTHDRDSTOPTS, IPV6_RTHDR and
IPV6_DSTOPTS.

Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[UDP]: deinline
Stephen Hemminger [Fri, 9 Mar 2007 04:46:41 +0000 (20:46 -0800)]
[UDP]: deinline

A couple of functions are exported or used indirectly
so it is pointless to mark them as inline.

Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[NET]: deinline some functions
Stephen Hemminger [Fri, 9 Mar 2007 04:46:03 +0000 (20:46 -0800)]
[NET]: deinline some functions

Several functions are marked inline or forced inline, but it
would be better to let the compiler decide.

Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[TCP]: whitespace cleanup
Stephen Hemminger [Fri, 9 Mar 2007 04:45:19 +0000 (20:45 -0800)]
[TCP]: whitespace cleanup

Add whitespace around keywords.

Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[IPV4]: cleanup
Stephen Hemminger [Fri, 9 Mar 2007 04:44:43 +0000 (20:44 -0800)]
[IPV4]: cleanup

Add whitespace around keywords.

Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[WIRELESS]: use ARRAY_SIZE()
Stephen Hemminger [Fri, 9 Mar 2007 04:43:49 +0000 (20:43 -0800)]
[WIRELESS]: use ARRAY_SIZE()

Use ARRAY_SIZE() macro now.

Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[NET] core: whitespace cleanup
Stephen Hemminger [Wed, 11 Apr 2007 03:10:33 +0000 (20:10 -0700)]
[NET] core: whitespace cleanup

Fix whitespace around keywords. Fix indentation especially of switch
statements.

Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[UDP]: ipv6 style cleanup
Stephen Hemminger [Fri, 9 Mar 2007 04:42:35 +0000 (20:42 -0800)]
[UDP]: ipv6 style cleanup

Fix whitespace around keywords. Eliminate unnecessary ()'s on return
statements.

Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[UDP]: ipv4 whitespace cleanup
Stephen Hemminger [Fri, 9 Mar 2007 04:41:55 +0000 (20:41 -0800)]
[UDP]: ipv4 whitespace cleanup

Fix whitespace around keywords.

Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[NET]: Replace CONFIG_NET_DEBUG with sysctl.
Stephen Hemminger [Fri, 9 Mar 2007 04:41:08 +0000 (20:41 -0800)]
[NET]: Replace CONFIG_NET_DEBUG with sysctl.

Covert network warning messages from a compile time to runtime choice.
Removes kernel config option and replaces it with new /proc/sys/net/core/warnings.

Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[NET]: Introduce SIOCGSTAMPNS ioctl to get timestamps with nanosec resolution
Eric Dumazet [Mon, 19 Mar 2007 00:33:16 +0000 (17:33 -0700)]
[NET]: Introduce SIOCGSTAMPNS ioctl to get timestamps with nanosec resolution

Now network timestamps use ktime_t infrastructure, we can add a new
ioctl() SIOCGSTAMPNS command to get timestamps in 'struct timespec'.
User programs can thus access to nanosecond resolution.

Signed-off-by: Eric Dumazet <dada1@cosmosbay.com>
CC: Stephen Hemminger <shemminger@linux-foundation.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[TCP/DCCP/RANDOM]: Remove unused exports.
Adrian Bunk [Thu, 8 Mar 2007 03:33:52 +0000 (19:33 -0800)]
[TCP/DCCP/RANDOM]: Remove unused exports.

This patch removes the following not or no longer used exports:
- drivers/char/random.c: secure_tcp_sequence_number
- net/dccp/options.c: sysctl_dccp_feat_sequence_window
- net/netlink/af_netlink.c: netlink_set_err

Signed-off-by: Adrian Bunk <bunk@stusta.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[TCP]: Abstract out all write queue operations.
David S. Miller [Wed, 7 Mar 2007 20:12:44 +0000 (12:12 -0800)]
[TCP]: Abstract out all write queue operations.

This allows the write queue implementation to be changed,
for example, to one which allows fast interval searching.

Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[NET] TIPC: Use htons() where appropriate.
YOSHIFUJI Hideaki [Wed, 7 Mar 2007 05:21:31 +0000 (14:21 +0900)]
[NET] TIPC: Use htons() where appropriate.

Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[NET] SCHED: Use htons() where appropriate.
YOSHIFUJI Hideaki [Wed, 7 Mar 2007 05:21:20 +0000 (14:21 +0900)]
[NET] SCHED: Use htons() where appropriate.

Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[NET] NETFILTER: Use htonl() where appropriate.
YOSHIFUJI Hideaki [Wed, 7 Mar 2007 05:21:00 +0000 (14:21 +0900)]
[NET] NETFILTER: Use htonl() where appropriate.

Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[NET] IPV4: Use hton{s,l}() where appropriate.
YOSHIFUJI Hideaki [Wed, 7 Mar 2007 05:19:10 +0000 (14:19 +0900)]
[NET] IPV4: Use hton{s,l}() where appropriate.

Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[NET] IEEE80211: Use htons() where appropriate.
YOSHIFUJI Hideaki [Wed, 7 Mar 2007 05:19:05 +0000 (14:19 +0900)]
[NET] IEEE80211: Use htons() where appropriate.

Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[NET] ETHERNET: Use htons() where appropriate.
YOSHIFUJI Hideaki [Wed, 7 Mar 2007 05:19:03 +0000 (14:19 +0900)]
[NET] ETHERNET: Use htons() where appropriate.

Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[NET] CORE: Use htons() where appropriate.
YOSHIFUJI Hideaki [Mon, 26 Mar 2007 03:13:04 +0000 (20:13 -0700)]
[NET] CORE: Use htons() where appropriate.

Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[NET] BLUETOOTH: Use cpu_to_le{16,32}() where appropriate.
YOSHIFUJI Hideaki [Mon, 26 Mar 2007 03:12:50 +0000 (20:12 -0700)]
[NET] BLUETOOTH: Use cpu_to_le{16,32}() where appropriate.

Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[NET] ATM: Use htons() where appropriate.
YOSHIFUJI Hideaki [Mon, 26 Mar 2007 03:12:32 +0000 (20:12 -0700)]
[NET] ATM: Use htons() where appropriate.

Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[NET] 8021Q: Use htons() where appropriate.
YOSHIFUJI Hideaki [Mon, 26 Mar 2007 03:12:18 +0000 (20:12 -0700)]
[NET] 8021Q: Use htons() where appropriate.

Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[NET] 802: Use hton{s,l}() where appropriate.
YOSHIFUJI Hideaki [Mon, 26 Mar 2007 03:11:55 +0000 (20:11 -0700)]
[NET] 802: Use hton{s,l}() where appropriate.

Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[UDP]: Clean up UDP-Lite receive checksum
Herbert Xu [Mon, 26 Mar 2007 03:10:56 +0000 (20:10 -0700)]
[UDP]: Clean up UDP-Lite receive checksum

This patch eliminates some duplicate code for the verification of
receive checksums between UDP-Lite and UDP.  It does this by
introducing __skb_checksum_complete_head which is identical to
__skb_checksum_complete_head apart from the fact that it takes
a length parameter rather than computing the first skb->len bytes.

As a result UDP-Lite will be able to use hardware checksum offload
for packets which do not use partial coverage checksums.  It also
means that UDP-Lite loopback no longer does unnecessary checksum
verification.

If any NICs start support UDP-Lite this would also start working
automatically.

This patch removes the assumption that msg_flags has MSG_TRUNC clear
upon entry in recvmsg.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[UDP6]: Restore sk_filter optimisation
Herbert Xu [Wed, 7 Mar 2007 04:29:58 +0000 (20:29 -0800)]
[UDP6]: Restore sk_filter optimisation

This reverts the changeset

    [IPV6]: UDPv6 checksum.

    We always need to check UDPv6 checksum because it is mandatory.

The sk_filter optimisation has nothing to do whether we verify the
checksum.  It simply postpones it to the point when the user calls
recv or poll.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[IPV4]: Optimize inet_getpeer()
Eric Dumazet [Wed, 7 Mar 2007 04:23:10 +0000 (20:23 -0800)]
[IPV4]: Optimize inet_getpeer()

1) Some sysctl vars are declared __read_mostly

2) We can avoid updating stack[] when doing an AVL lookup only.

    lookup() macro is extended to receive a second parameter, that may be NULL
in case of a pure lookup (no need to save the AVL path). This removes
unnecessary instructions, because compiler knows if this _stack parameter is
NULL or not.

    text size of net/ipv4/inetpeer.o is 2063 bytes instead of 2107 on x86_64

Signed-off-by: Eric Dumazet <dada1@cosmosbay.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[TCP] TCP Yeah: cleanup
Stephen Hemminger [Wed, 7 Mar 2007 04:21:20 +0000 (20:21 -0800)]
[TCP] TCP Yeah: cleanup

Eliminate need for full 6/4/64 divide to compute queue.
Variable maxqueue was really a constant.
Fix indentation.

Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[TCP] tcp_cubic: faster cube root
Stephen Hemminger [Mon, 26 Mar 2007 03:21:15 +0000 (20:21 -0700)]
[TCP] tcp_cubic: faster cube root

The Newton-Raphson method is quadratically convergent so
only a small fixed number of steps are necessary.
Therefore it is faster to unroll the loop. Since div64_64 is no longer
inline it won't cause code explosion.

Also fixes a bug that can occur if x^2 was bigger than 32 bits.

Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[ATM] ENI: Convert to struct timeval to ktime_t.
YOSHIFUJI Hideaki [Wed, 7 Mar 2007 04:19:26 +0000 (20:19 -0800)]
[ATM] ENI: Convert to struct timeval to ktime_t.

Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[NETLINK]: Limit NLMSG_GOODSIZE to 8K.
David S. Miller [Mon, 26 Mar 2007 03:27:59 +0000 (20:27 -0700)]
[NETLINK]: Limit NLMSG_GOODSIZE to 8K.

Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[IPV6] ADDRCONF: Fix possible inet6_ifaddr leakage with CONFIG_OPTIMISTIC_DAD.
YOSHIFUJI Hideaki [Wed, 28 Feb 2007 14:13:20 +0000 (23:13 +0900)]
[IPV6] ADDRCONF: Fix possible inet6_ifaddr leakage with CONFIG_OPTIMISTIC_DAD.

The inet6_ifaddr for source address of RS is leaked if the address
is not an optimistic address.

Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[IPV6] ADDRCONF: Optimistic Duplicate Address Detection (RFC 4429) Support.
Neil Horman [Thu, 26 Apr 2007 00:08:10 +0000 (17:08 -0700)]
[IPV6] ADDRCONF: Optimistic Duplicate Address Detection (RFC 4429) Support.

Nominally an autoconfigured IPv6 address is added to an interface in the
Tentative state (as per RFC 2462).  Addresses in this state remain in this
state while the Duplicate Address Detection process operates on them to
determine their uniqueness on the network.  During this period, these
tentative addresses may not be used for communication, increasing the time
before a node may be able to communicate on a network.  Using Optimistic
Duplicate Address Detection, autoconfigured addresses may be used
immediately for communication on the network, as long as certain rules are
followed to avoid conflicts with other nodes during the Duplicate Address
Detection process.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[IPV6] IP6TUNNEL: Enable to control the handled inner protocol.
Yasuyuki Kozakai [Thu, 30 Nov 2006 05:43:28 +0000 (14:43 +0900)]
[IPV6] IP6TUNNEL: Enable to control the handled inner protocol.

ip6_tunnel before supporting IPv4/IPv6 tunnel allows only IPPROTO_IPV6
in configurations from userland. This allows userland to set IPPROTO_IPIP
and 0(wildcard). ip6_tunnel only handles allowed inner protocols.

Signed-off-by: Yasuyuki Kozakai <yasuyuki.kozakai@toshiba.co.jp>
Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[IPV6] IP6TUNNEL: Rename functions ip6ip6_* to ip6_tnl_*.
Yasuyuki Kozakai [Fri, 9 Feb 2007 15:30:33 +0000 (00:30 +0900)]
[IPV6] IP6TUNNEL: Rename functions ip6ip6_* to ip6_tnl_*.

Signed-off-by: Yasuyuki Kozakai <yasuyuki.kozakai@toshiba.co.jp>
Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[IPV6] IP6TUNNEL: Add support to IPv4 over IPv6 tunnel.
Yasuyuki Kozakai [Wed, 14 Feb 2007 15:43:16 +0000 (00:43 +0900)]
[IPV6] IP6TUNNEL: Add support to IPv4 over IPv6 tunnel.

Some notes
- Protocol number IPPROTO_IPIP is used for IPv4 over IPv6 packets.
- If IP6_TNL_F_USE_ORIG_TCLASS is set, TOS in IPv4 header is copied to
  Traffic Class in outer IPv6 header on xmit.
- IP6_TNL_F_USE_ORIG_FLOWLABEL is ignored on xmit of IPv4 packets, because
  IPv4 header does not have flow label.
- Kernel sends ICMP error if IPv4 packet is too big on xmit, even if
  DF flag is not set.

Signed-off-by: Yasuyuki Kozakai <yasuyuki.kozakai@toshiba.co.jp>
Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[IPV6] IP6TUNNEL: Split out generic routine in ip6ip6_xmit().
Yasuyuki Kozakai [Sun, 5 Nov 2006 13:56:45 +0000 (22:56 +0900)]
[IPV6] IP6TUNNEL: Split out generic routine in ip6ip6_xmit().

This enables to add IPv4/IPv6 specific handling later,

Signed-off-by: Yasuyuki Kozakai <yasuyuki.kozakai@toshiba.co.jp>
Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[IPV6] IP6TUNNEL: Split out generic routine in ip6ip6_rcv().
Yasuyuki Kozakai [Fri, 3 Nov 2006 00:39:14 +0000 (09:39 +0900)]
[IPV6] IP6TUNNEL: Split out generic routine in ip6ip6_rcv().

This enables to add IPv4/IPv6 specific handling later,

Signed-off-by: Yasuyuki Kozakai <yasuyuki.kozakai@toshiba.co.jp>
Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[IPV6] IP6TUNNEL: Split out generic routine in ip6ip6_err().
Yasuyuki Kozakai [Tue, 31 Oct 2006 14:11:25 +0000 (23:11 +0900)]
[IPV6] IP6TUNNEL: Split out generic routine in ip6ip6_err().

This enables to add IPv4/IPv6 specific error handling later,

Signed-off-by: Yasuyuki Kozakai <yasuyuki.kozakai@toshiba.co.jp>
Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[IPV6]: Decentralize EXPORT_SYMBOLs.
YOSHIFUJI Hideaki [Thu, 22 Feb 2007 13:05:40 +0000 (22:05 +0900)]
[IPV6]: Decentralize EXPORT_SYMBOLs.

Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
17 years ago[NETLINK]: Mirror UDP MSG_TRUNC semantics.
David S. Miller [Wed, 7 Mar 2007 01:02:35 +0000 (17:02 -0800)]
[NETLINK]: Mirror UDP MSG_TRUNC semantics.

If the user passes MSG_TRUNC in via msg_flags, return
the full packet size not the truncated size.

Idea from Herbert Xu and Thomas Graf.

Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[NET]: convert network timestamps to ktime_t
Eric Dumazet [Thu, 19 Apr 2007 23:16:32 +0000 (16:16 -0700)]
[NET]: convert network timestamps to ktime_t

We currently use a special structure (struct skb_timeval) and plain
'struct timeval' to store packet timestamps in sk_buffs and struct
sock.

This has some drawbacks :
- Fixed resolution of micro second.
- Waste of space on 64bit platforms where sizeof(struct timeval)=16

I suggest using ktime_t that is a nice abstraction of high resolution
time services, currently capable of nanosecond resolution.

As sizeof(ktime_t) is 8 bytes, using ktime_t in 'struct sock' permits
a 8 byte shrink of this structure on 64bit architectures. Some other
structures also benefit from this size reduction (struct ipq in
ipv4/ip_fragment.c, struct frag_queue in ipv6/reassembly.c, ...)

Once this ktime infrastructure adopted, we can more easily provide
nanosecond resolution on top of it. (ioctl SIOCGSTAMPNS and/or
SO_TIMESTAMPNS/SCM_TIMESTAMPNS)

Note : this patch includes a bug correction in
compat_sock_get_timestamp() where a "err = 0;" was missing (so this
syscall returned -ENOENT instead of 0)

Signed-off-by: Eric Dumazet <dada1@cosmosbay.com>
CC: Stephen Hemminger <shemminger@linux-foundation.org>
CC: John find <linux.kernel@free.fr>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[NET]: div64_64 consolidate (rev3)
Stephen Hemminger [Mon, 26 Mar 2007 02:54:23 +0000 (19:54 -0700)]
[NET]: div64_64 consolidate (rev3)

Here is the current version of the 64 bit divide common code.

Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[NET]: Convert xtime.tv_sec to get_seconds()
James Morris [Mon, 5 Mar 2007 00:12:44 +0000 (16:12 -0800)]
[NET]: Convert xtime.tv_sec to get_seconds()

Where appropriate, convert references to xtime.tv_sec to the
get_seconds() helper function.

Signed-off-by: James Morris <jmorris@namei.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[PKTGEN]: fix device name handling
Stephen Hemminger [Mon, 5 Mar 2007 00:11:51 +0000 (16:11 -0800)]
[PKTGEN]: fix device name handling

Since devices can change name and other wierdness, don't hold onto
a copy of device name, instead use pointer to output device.

Fix a couple of leaks in error handling path as well.

Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>
Signed-off-by: Robert Olsson <robert.olsson@its.uu.se>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[PKTGEN]: don't use __constant_htonl()
Stephen Hemminger [Mon, 5 Mar 2007 00:08:08 +0000 (16:08 -0800)]
[PKTGEN]: don't use __constant_htonl()

The existing htonl() macro is smart enough to do the same code as
using __constant_htonl() and it looks cleaner.

Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>
Signed-off-by: Robert Olsson <robert.olsson@its.uu.se>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[PKTGEN]: use random32
Stephen Hemminger [Mon, 5 Mar 2007 00:07:28 +0000 (16:07 -0800)]
[PKTGEN]: use random32

Can use random32() now.

Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>
Signed-off-by: Robert Olsson <robert.olsson@its.uu.se>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[PKTGEN]: use pr_debug
Stephen Hemminger [Mon, 5 Mar 2007 00:06:47 +0000 (16:06 -0800)]
[PKTGEN]: use pr_debug

Remove private debug macro and replace with standard version

Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>
Signed-off-by: Robert Olsson <robert.olsson@its.uu.se>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[NET]: Keep sk_backlog near sk_lock
Eric Dumazet [Mon, 5 Mar 2007 00:05:44 +0000 (16:05 -0800)]
[NET]: Keep sk_backlog near sk_lock

sk_backlog is a critical field of struct sock. (known famous words)

It is (ab)used in hot paths, in particular in release_sock(), tcp_recvmsg(),
tcp_v4_rcv(), sk_receive_skb().

It really makes sense to place it next to sk_lock, because sk_backlog is only
used after sk_lock locked (and thus memory cache line in L1 cache). This
should reduce cache misses and sk_lock acquisition time.

(In theory, we could only move the head pointer near sk_lock, and leaving tail
far away, because 'tail' is normally not so hot, but keep it simple :) )

Signed-off-by: Eric Dumazet <dada1@cosmosbay.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[TCP]: FRTO undo response falls back to ratehalving one if ECEd
Ilpo Järvinen [Fri, 2 Mar 2007 21:34:19 +0000 (13:34 -0800)]
[TCP]: FRTO undo response falls back to ratehalving one if ECEd

Undoing ssthresh is disabled in fastretrans_alert whenever
FLAG_ECE is set by clearing prior_ssthresh. The clearing does
not protect FRTO because FRTO operates before fastretrans_alert.
Moving the clearing of prior_ssthresh earlier seems to be a
suboptimal solution to the FRTO case because then FLAG_ECE will
cause a second ssthresh reduction in try_to_open (the first
occurred when FRTO was entered). So instead, FRTO falls back
immediately to the rate halving response, which switches TCP to
CA_CWR state preventing the latter reduction of ssthresh.

If the first ECE arrived before the ACK after which FRTO is able
to decide RTO as spurious, prior_ssthresh is already cleared.
Thus no undoing for ssthresh occurs. Besides, FLAG_ECE should be
set also in the following ACKs resulting in rate halving response
that sees TCP is already in CA_CWR, which again prevents an extra
ssthresh reduction on that round-trip.

If the first ECE arrived before RTO, ssthresh has already been
adapted and prior_ssthresh remains cleared on entry because TCP
is in CA_CWR (the same applies also to a case where FRTO is
entered more than once and ECE comes in the middle).

High_seq must not be touched after tcp_enter_cwr because CWR
round-trip calculation depends on it.

I believe that after this patch, FRTO should be ECN-safe and
even able to take advantage of synergy benefits.

Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[TCP]: Complete icsk-to-local-variable change (in tcp_enter_cwr)
Ilpo Järvinen [Fri, 2 Mar 2007 21:27:25 +0000 (13:27 -0800)]
[TCP]: Complete icsk-to-local-variable change (in tcp_enter_cwr)

A local variable for icsk was created but this change was
missing. Spotted by Jarek Poplawski.

Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[TCP] Sysctl documentation: tcp_frto_response
Ilpo Järvinen [Tue, 27 Feb 2007 18:10:55 +0000 (10:10 -0800)]
[TCP] Sysctl documentation: tcp_frto_response

In addition, fixed minor things in tcp_frto sysctl.

Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[TCP]: Add two new spurious RTO responses to FRTO
Ilpo Järvinen [Tue, 27 Feb 2007 18:09:49 +0000 (10:09 -0800)]
[TCP]: Add two new spurious RTO responses to FRTO

New sysctl tcp_frto_response is added to select amongst these
responses:
- Rate halving based; reuses CA_CWR state (default)
- Very conservative; used to be the only one available (=1)
- Undo cwr; undoes ssthresh and cwnd reductions (=2)

The response with rate halving requires a new parameter to
tcp_enter_cwr because FRTO has already reduced ssthresh and
doing a second reduction there has to be prevented. In addition,
to keep things nice on 80 cols screen, a local variable was
added.

Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[TCP]: Correct reordering detection change (no FRTO case)
Ilpo Järvinen [Sat, 24 Feb 2007 00:22:06 +0000 (16:22 -0800)]
[TCP]: Correct reordering detection change (no FRTO case)

The reordering detection must work also when FRTO has not been
used at all which was the original intention of mine, just the
expression of the idea was flawed.

Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[TCP]: Make snd_cwnd_clamp a u32.
David S. Miller [Fri, 23 Feb 2007 06:52:59 +0000 (22:52 -0800)]
[TCP]: Make snd_cwnd_clamp a u32.

Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[TCP]: Keep copied_seq, rcv_wup and rcv_next together.
Eric Dumazet [Thu, 22 Feb 2007 11:20:44 +0000 (03:20 -0800)]
[TCP]: Keep copied_seq, rcv_wup and rcv_next together.

I noticed in oprofile study a cache miss in tcp_rcv_established() to read
copied_seq.

ffffffff80400a80 <tcp_rcv_established>: /* tcp_rcv_established total: 4034293  
2.0400 */

 55493  0.0281 :ffffffff80400bc9:   mov    0x4c8(%r12),%eax copied_seq
543103  0.2746 :ffffffff80400bd1:   cmp    0x3e0(%r12),%eax   rcv_nxt    

if (tp->copied_seq == tp->rcv_nxt &&
        len - tcp_header_len <= tp->ucopy.len) {

In this function, the cache line 0x4c0 -> 0x500 is used only for this
reading 'copied_seq' field.

rcv_wup and copied_seq should be next to rcv_nxt field, to lower number of
active cache lines in hot paths. (tcp_rcv_established(), tcp_poll(), ...)

As you suggested, I changed tcp_create_openreq_child() so that these fields
are changed together, to avoid adding a new store buffer stall.

Patch is 64bit friendly (no new hole because of alignment constraints)

Signed-off-by: Eric Dumazet <dada1@cosmosbay.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[TCP]: struct *sock argument renamed: sp -> sk
Ilpo Järvinen [Thu, 22 Feb 2007 09:13:58 +0000 (01:13 -0800)]
[TCP]: struct *sock argument renamed: sp -> sk

In general, TCP code uses "sk" for struct sock pointer.

Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[TCP]: Add RFC3742 Limited Slow-Start, controlled by variable sysctl_tcp_max_ssthresh.
John Heffner [Mon, 26 Mar 2007 02:21:45 +0000 (19:21 -0700)]
[TCP]: Add RFC3742 Limited Slow-Start, controlled by variable sysctl_tcp_max_ssthresh.

Signed-off-by: John Heffner <jheffner@psc.edu>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[TCP] YeAH-TCP: algorithm implementation
Angelo P. Castellani [Thu, 22 Feb 2007 08:23:05 +0000 (00:23 -0800)]
[TCP] YeAH-TCP: algorithm implementation

YeAH-TCP is a sender-side high-speed enabled TCP congestion control
algorithm, which uses a mixed loss/delay approach to compute the
congestion window. It's design goals target high efficiency, internal,
RTT and Reno fairness, resilience to link loss while keeping network
elements load as low as possible.

For further details look here:
    http://wil.cs.caltech.edu/pfldnet2007/paper/YeAH_TCP.pdf

Signed-off-by: Angelo P. Castellani <angelo.castellani@gmail.con>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[TCP] FRTO: Sysctl documentation for SACK enhanced version
Ilpo Järvinen [Thu, 22 Feb 2007 07:16:38 +0000 (23:16 -0800)]
[TCP] FRTO: Sysctl documentation for SACK enhanced version

The description is overly verbose to avoid ambiguity between
"SACK enabled" and "SACK enhanced FRTO"

Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[TCP]: SACK enhanced FRTO
Ilpo Järvinen [Thu, 22 Feb 2007 07:16:11 +0000 (23:16 -0800)]
[TCP]: SACK enhanced FRTO

Implements the SACK-enhanced FRTO given in RFC4138 using the
variant given in Appendix B.

RFC4138, Appendix B:
  "This means that in order to declare timeout spurious, the TCP
   sender must receive an acknowledgment for non-retransmitted
   segment between SND.UNA and RecoveryPoint in algorithm step 3.
   RecoveryPoint is defined in conservative SACK-recovery
   algorithm [RFC3517]"

The basic version of the FRTO algorithm can still be used also
when SACK is enabled. To enabled SACK-enhanced version, tcp_frto
sysctl is set to 2.

Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[TCP]: Prevent reordering adjustments during FRTO
Ilpo Järvinen [Thu, 22 Feb 2007 07:14:42 +0000 (23:14 -0800)]
[TCP]: Prevent reordering adjustments during FRTO

To be honest, I'm not too sure how the reord stuff works in the
first place but this seems necessary.

When FRTO has been active, the one and only retransmission could
be unnecessary but the state and sending order might not be what
the sacktag code expects it to be (to work correctly).

Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[TCP] FRTO: Fake cwnd for ssthresh callback
Ilpo Järvinen [Thu, 22 Feb 2007 07:13:47 +0000 (23:13 -0800)]
[TCP] FRTO: Fake cwnd for ssthresh callback

TCP without FRTO would be in Loss state with small cwnd. FRTO,
however, leaves cwnd (typically) to a larger value which causes
ssthresh to become too large in case RTO is triggered again
compared to what conventional recovery would do. Because
consecutive RTOs result in only a single ssthresh reduction,
RTO+cumulative ACK+RTO pattern is required to trigger this
event.

A large comment is included for congestion control module writers
trying to figure out what CA_EVENT_FRTO handler should do because
there exists a remote possibility of incompatibility between
FRTO and module defined ssthresh functions.

Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[TCP] FRTO: Reverse RETRANS bit clearing logic
Ilpo Järvinen [Thu, 22 Feb 2007 07:11:57 +0000 (23:11 -0800)]
[TCP] FRTO: Reverse RETRANS bit clearing logic

Previously RETRANS bits were cleared on the entry to FRTO. We
postpone that into tcp_enter_frto_loss, which is really the
place were the clearing should be done anyway. This allows
simplification of the logic from a clearing loop to the head skb
clearing only.

Besides, the other changes made in the previous patches to
tcp_use_frto made it impossible for the non-SACKed FRTO to be
entered if other than the head has been rexmitted.

With SACK-enhanced FRTO (and Appendix B), however, there can be
a number retransmissions in flight when RTO expires (same thing
could happen before this patchset also with non-SACK FRTO). To
not introduce any jumpiness into the packet counting during FRTO,
instead of clearing RETRANS bits from skbs during entry, do it
later on.

Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[TCP] FRTO: Entry is allowed only during (New)Reno like recovery
Ilpo Järvinen [Thu, 22 Feb 2007 07:10:39 +0000 (23:10 -0800)]
[TCP] FRTO: Entry is allowed only during (New)Reno like recovery

This interpretation comes from RFC4138:
    "If the sender implements some loss recovery algorithm other
     than Reno or NewReno [FHG04], the F-RTO algorithm SHOULD
     NOT be entered when earlier fast recovery is underway."

I think the RFC means to say (especially in the light of
Appendix B) that ...recovery is underway (not just fast recovery)
or was underway when it was interrupted by an earlier (F-)RTO
that hasn't yet been resolved (snd_una has not advanced enough).
Thus, my interpretation is that whenever TCP has ever
retransmitted other than head, basic version cannot be used
because then the order assumptions which are used as FRTO basis
do not hold.

NewReno has only the head segment retransmitted at a time.
Therefore, walk up to the segment that has not been SACKed, if
that segment is not retransmitted nor anything before it, we know
for sure, that nothing after the non-SACKed segment should be
either. This assumption is valid because TCPCB_EVER_RETRANS does
not leave holes but each non-SACKed segment is rexmitted
in-order.

Check for retrans_out > 1 avoids more expensive walk through the
skb list, as we can know the result beforehand: F-RTO will not be
allowed.

SACKed skb can turn into non-SACked only in the extremely rare
case of SACK reneging, in this case we might fail to detect
retransmissions if there were them for any other than head. To
get rid of that feature, whole rexmit queue would have to be
walked (always) or FRTO should be prevented when SACK reneging
happens. Of course RTO should still trigger after reneging which
makes this issue even less likely to show up. And as long as the
response is as conservative as it's now, nothing bad happens even
then.

Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[TCP]: Prevent unrelated cwnd adjustment while using FRTO
Ilpo Järvinen [Thu, 22 Feb 2007 07:08:34 +0000 (23:08 -0800)]
[TCP]: Prevent unrelated cwnd adjustment while using FRTO

FRTO controls cwnd when it still processes the ACK input or it
has just reverted back to conventional RTO recovery; the normal
rules apply when FRTO has reverted to standard congestion
control.

Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[TCP] FRTO: frto_counter modulo-op converted to two assignments
Ilpo Järvinen [Thu, 22 Feb 2007 07:07:27 +0000 (23:07 -0800)]
[TCP] FRTO: frto_counter modulo-op converted to two assignments

Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[TCP]: Don't enter to fast recovery while using FRTO
Ilpo Järvinen [Thu, 22 Feb 2007 07:06:52 +0000 (23:06 -0800)]
[TCP]: Don't enter to fast recovery while using FRTO

Because TCP is not in Loss state during FRTO recovery, fast
recovery could be triggered by accident. Non-SACK FRTO is more
robust than not yet included SACK-enhanced version (that can
receiver high number of duplicate ACKs with SACK blocks during
FRTO), at least with unidirectional transfers, but under
extraordinary patterns fast recovery can be incorrectly
triggered, e.g., Data loss+ACK losses => cumulative ACK with
enough SACK blocks to meet sacked_out >= dupthresh condition).

Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[TCP] FRTO: Response should reset also snd_cwnd_cnt
Ilpo Järvinen [Thu, 22 Feb 2007 07:06:03 +0000 (23:06 -0800)]
[TCP] FRTO: Response should reset also snd_cwnd_cnt

Since purpose is to reduce CWND, we prevent immediate growth. This
is not a major issue nor is "the correct way" specified anywhere.

Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[TCP] FRTO: fixes fallback to conventional recovery
Ilpo Järvinen [Thu, 22 Feb 2007 07:05:18 +0000 (23:05 -0800)]
[TCP] FRTO: fixes fallback to conventional recovery

The FRTO detection did not care how ACK pattern affects to cwnd
calculation of the conventional recovery. This caused incorrect
setting of cwnd when the fallback becames necessary. The
knowledge tcp_process_frto() has about the incoming ACK is now
passed on to tcp_enter_frto_loss() in allowed_segments parameter
that gives the number of segments that must be added to
packets-in-flight while calculating the new cwnd.

Instead of snd_una we use FLAG_DATA_ACKED in duplicate ACK
detection because RFC4138 states (in Section 2.2):
  If the first acknowledgment after the RTO retransmission
  does not acknowledge all of the data that was retransmitted
  in step 1, the TCP sender reverts to the conventional RTO
  recovery.  Otherwise, a malicious receiver acknowledging
  partial segments could cause the sender to declare the
  timeout spurious in a case where data was lost.

If the next ACK after RTO is duplicate, we do not retransmit
anything, which is equal to what conservative conventional
recovery does in such case.

Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[TCP] FRTO: Ignore some uninteresting ACKs
Ilpo Järvinen [Thu, 22 Feb 2007 07:04:11 +0000 (23:04 -0800)]
[TCP] FRTO: Ignore some uninteresting ACKs

Handles RFC4138 shortcoming (in step 2); it should also have case
c) which ignores ACKs that are not duplicates nor advance window
(opposite dir data, winupdate).

Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[TCP] FRTO: Use Disorder state during operation instead of Open
Ilpo Järvinen [Thu, 22 Feb 2007 07:03:35 +0000 (23:03 -0800)]
[TCP] FRTO: Use Disorder state during operation instead of Open

Retransmission counter assumptions are to be changed. Forcing
reason to do this exist: Using sysctl in check would be racy
as soon as FRTO starts to ignore some ACKs (doing that in the
following patches). Userspace may disable it at any moment
giving nice oops if timing is right. frto_counter would be
inaccessible from userspace, but with SACK enhanced FRTO
retrans_out can include other than head, and possibly leaving
it non-zero after spurious RTO, boom again.

Luckily, solution seems rather simple: never go directly to Open
state but use Disorder instead. This does not really change much,
since TCP could anyway change its state to Disorder during FRTO
using path tcp_fastretrans_alert -> tcp_try_to_open (e.g., when
a SACK block makes ACK dubious). Besides, Disorder seems to be
the state where TCP should be if not recovering (in Recovery or
Loss state) while having some retransmissions in-flight (see
tcp_try_to_open), which is exactly what happens with FRTO.

Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[TCP] FRTO: Consecutive RTOs keep prior_ssthresh and ssthresh
Ilpo Järvinen [Thu, 22 Feb 2007 07:02:30 +0000 (23:02 -0800)]
[TCP] FRTO: Consecutive RTOs keep prior_ssthresh and ssthresh

In case a latency spike causes more than one RTO, the later should not
cause the already reduced ssthresh to propagate into the prior_ssthresh
since FRTO declares all such RTOs spurious at once or none of them. In
treating of ssthresh, we mimic what tcp_enter_loss() does.

The previous state (in frto_counter) must be available until we have
checked it in tcp_enter_frto(), and also ACK information flag in
process_frto().

Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[TCP] FRTO: Comment cleanup & improvement
Ilpo Järvinen [Thu, 22 Feb 2007 07:01:36 +0000 (23:01 -0800)]
[TCP] FRTO: Comment cleanup & improvement

Moved comments out from the body of process_frto() to the head
(preferred way; see Documentation/CodingStyle). Bonus: it's much
easier to read in this compacted form.

FRTO algorithm and implementation is described in greater detail.
For interested reader, more information is available in RFC4138.

Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[TCP] FRTO: Moved tcp_use_frto from tcp.h to tcp_input.c
Ilpo Järvinen [Thu, 22 Feb 2007 06:59:58 +0000 (22:59 -0800)]
[TCP] FRTO: Moved tcp_use_frto from tcp.h to tcp_input.c

In addition, removed inline.

Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
17 years ago[TCP] FRTO: Separated response from FRTO detection algorithm
Ilpo Järvinen [Thu, 22 Feb 2007 06:56:19 +0000 (22:56 -0800)]
[TCP] FRTO: Separated response from FRTO detection algorithm

FRTO spurious RTO detection algorithm (RFC4138) does not include response
to a detected spurious RTO but can use different response algorithms.

Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>