add TCP User Timeout Option (RFC 5482)

To quote the abstract:

	The TCP user timeout controls how long transmitted data may remain
	unacknowledged before a connection is forcefully closed. It is a
	local, per-connection parameter. This document specifies a new TCP
	option -- the TCP User Timeout Option -- that allows one end of a TCP
	connection to advertise its current user timeout value. This
	information provides advice to the other end of the TCP connection to
	adapt its user timeout accordingly. Increasing the user timeouts on
	both ends of a TCP connection allows it to survive extended periods
	without end-to-end connectivity. Decreasing the user timeouts allows
	busy servers to explicitly notify their clients that they will
	maintain the connection state only for a short time without
	connectivity.

Usage:

	Host A:

		echo 1 > /proc/sys/net/ipv4/tcp_uto_enabled
		./network-app-a

	Host B:
		echo 1 > /proc/sys/net/ipv4/tcp_uto_enabled
		# announce UTO of 23 seconds to peer (also possible via setsockopt)
		echo 23 > /proc/sys/net/ipv4/tcp_uto_adv
		./netword-app-b

Description of additional sysctl:

	sysctl_tcp_uto_enabled:

		0: disabled, no TCP UTO options are generated; received TCP UTO options
		are silently ignored.

		1: globally enabled, received TCP UTO options are enabled and affect
		the socket specific user timeout. The user can modify the socket
		specific UTO value transmitted to the peer via setsockopt(TCP_OPT).
		If the user set this value all received UTO options are ignored. If
		the user does not setsockopt(TCP_UTO) no UTO option is sent.

		If sysctl_tcp_uto_enabled is true and sysctl_tcp_uto_adv is larger
		then 0 then all outgoing TCP connection will set transmit TCP UTO
		options.

		The host will generate TCP UTO options only if the system wide
		sysctl_tcp_uto_adv is larger 0 or setsockopt(TCP_OPT) is called on a
		local socket basis.

	sysctl_tcp_uto_adv:

		The advertised system wide UTO option for the peer in seconds. Can
		be overwritten on a socket basis via setsockopt(TCP_OPT). If this
		value is greater then 0 and sysctl_tcp_uto_enabled is 1 then each
		TCP connection will generate a TCP UTO option.

		setsockopt(TCP_UTO) have a higher priority. Any value set by
		sysctl_tcp_uto_adv will be overwriten by setsockopt().

		Limits enforced via sysctl_tcp_uto_{min,max} are ignored by
		sysctl_tcp_uto_adv (uid 0 is uid 0).

		The value specify the UTO value in seconds.

	sysctl_tcp_uto_min:

		The minimum UTO value that can be set by setsockopt(TCP_UTO) and
		contemporaneous determine the minimum value that is accepted by a
		received UTO options. Received UTO options which are smaller are
		adjusted to this value. The unit is seconds.

		0 disables the check and allow transmission of all values as well as
		acception all values. Default is 1 second.

	sysctl_tcp_uto_max:

		the maximum UTO value that can be set by setsockopt(TCP_UTO) and
		contemporaneous determine the maximum value that is accepted by a
		received UTO options. Received UTO options which are larger are
		adjusted to this value. The unit is seconds.

		0 disables the check and allow transmission of all values as well as
		acception all values. Default is 1800 seconds.

Setsockopt:

	Set TCP_UTO to something like > 0 means the TCP UTO is enabled. The
	TCP instance will generate TCP UTO options with this value to the
	peer. Received UTO options are ignored if this option is set. If this
	socket option is set after the socket received a UTO option from the
	peer the received timeout is overwriten by this value. The problem is
	that if both TCP instances want to dictate a different user timeout
	the problem lies in a *upper layer*. TCP UTO cannot be used for
	negotiating. It is always wise to negotiate the user timeout at a
	higher level. If both instances have negotiated the mechanism works
	because the received as well as the transmitted timeout is equal.  If
	both parties try to propagate different UTO values then something is
	basically wrong.

Signed-off-by: Hagen Paul Pfeifer <hagen@jauu.net>