[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