Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 15 Jan 2013 19:49:33 +1100
From:      Lawrence Stewart <lstewart@freebsd.org>
To:        John Baldwin <jhb@freebsd.org>
Cc:        net@freebsd.org
Subject:   Re: [PATCH] Don't imply TCP and UDP socket options are bitmasks
Message-ID:  <50F5181D.6020508@freebsd.org>
In-Reply-To: <201301141550.13577.jhb@freebsd.org>
References:  <201301141550.13577.jhb@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On 01/15/13 07:50, John Baldwin wrote:
> The constants used for TCP and UDP socket options (TCP_NODELAY, etc.) are 
> currently defined as hex values that are individual bits.  However, socket 
> options are never masked together, they are used as a simple enumeration of 
> discrete values.  Using a bitmask forces us to run out of bits and makes it 
> harder for vendors to try to use a high range of values for local custom 
> options (hoping that they never conflict with a new option value added in 
> stock FreeBSD).

Yup. Should we be explicitly #defining the boundary between "bits
reserved for FreeBSD" and "bits for private vendor use"?

> The socket options in <sys/socket.h> do use bitmasks for the low bits because 
> they map directly to bits so_options, but then they start a simple enumeration 
> at 0x1000.  TCP and UDP socket options do not directly map to bits in a flags 
> field in the PCB (e.g. TF_NODELAY != TCP_NODELAY).  I would like to change the 
> representation of the constants to be decimal instead of hex and encourage new 
> options to fill in the gaps between the existing values.  This would preserve 
> the existing ABI but keep things more sane in the future (I believe).  The 
> diff is this:
> 
> Index: netinet/tcp.h
> ===================================================================
> --- netinet/tcp.h	(revision 245225)
> +++ netinet/tcp.h	(working copy)
> @@ -151,18 +151,18 @@
>  /*
>   * User-settable options (used with setsockopt).
>   */
> -#define	TCP_NODELAY	0x01	/* don't delay send to coalesce packets */
> +#define	TCP_NODELAY	1	/* don't delay send to coalesce packets */
>  #if __BSD_VISIBLE
> -#define	TCP_MAXSEG	0x02	/* set maximum segment size */
> -#define TCP_NOPUSH	0x04	/* don't push last block of write */
> -#define TCP_NOOPT	0x08	/* don't use TCP options */
> -#define TCP_MD5SIG	0x10	/* use MD5 digests (RFC2385) */
> -#define	TCP_INFO	0x20	/* retrieve tcp_info structure */
> -#define	TCP_CONGESTION	0x40	/* get/set congestion control algorithm */
> -#define	TCP_KEEPINIT	0x80	/* N, time to establish connection */
> -#define	TCP_KEEPIDLE	0x100	/* L,N,X start keeplives after this period */
> -#define	TCP_KEEPINTVL	0x200	/* L,N interval between keepalives */
> -#define	TCP_KEEPCNT	0x400	/* L,N number of keepalives before close */
> +#define	TCP_MAXSEG	2	/* set maximum segment size */
> +#define TCP_NOPUSH	4	/* don't push last block of write */
> +#define TCP_NOOPT	8	/* don't use TCP options */
> +#define TCP_MD5SIG	16	/* use MD5 digests (RFC2385) */
> +#define	TCP_INFO	32	/* retrieve tcp_info structure */
> +#define	TCP_CONGESTION	64	/* get/set congestion control algorithm */
> +#define	TCP_KEEPINIT	128	/* N, time to establish connection */
> +#define	TCP_KEEPIDLE	256	/* L,N,X start keeplives after this period */
> +#define	TCP_KEEPINTVL	512	/* L,N interval between keepalives */
> +#define	TCP_KEEPCNT	1024	/* L,N number of keepalives before close */
>  
>  #define	TCP_CA_NAME_MAX	16	/* max congestion control name length */
>  
> Index: netinet/udp.h
> ===================================================================
> --- netinet/udp.h	(revision 245225)
> +++ netinet/udp.h	(working copy)
> @@ -48,7 +48,7 @@
>  /* 
>   * User-settable options (used with setsockopt).
>   */
> -#define	UDP_ENCAP			0x01
> +#define	UDP_ENCAP			1
>  
>  
>  /*
> 

Thumbs up from me, modulo a potential tweak to define the boundary for
FreeBSD/private use.

Cheers,
Lawrence



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?50F5181D.6020508>