[PATCH] Don't imply TCP and UDP socket options are bitmasks

Lawrence Stewart lstewart at freebsd.org
Tue Jan 15 08:49:35 UTC 2013


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


More information about the freebsd-net mailing list