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

Lawrence Stewart lstewart at freebsd.org
Thu Jan 24 13:02:42 UTC 2013


On 01/23/13 07:28, John Baldwin wrote:
> On Tuesday, January 22, 2013 3:57:23 am Lawrence Stewart wrote:
>> On 01/16/13 06:16, John Baldwin wrote:
>>> On Tuesday, January 15, 2013 3:49:33 am Lawrence Stewart wrote:
>>>> 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"?
>>>
>>> Oh, we could if you wanted.  I'm using 0x1000 locally for both TCP and UDP,
>>> but those are completely arbitrary values.  Saner ones might be 0x8000000 if
>>> we want to do that explicitly.  We could perhaps just say that is true for all
>>> socket option levels (that is, just define one SO_VENDOR constant or some such
>>> but say it applies to all levels)?
>>
>> A single SO_VENDOR applied to all levels sounds good to me.
> 
> Ok, how about this for wording:
> 
> Index: sys/socket.h
> ===================================================================
> --- socket.h	(revision 245742)
> +++ socket.h	(working copy)
> @@ -143,6 +143,15 @@ typedef	__uid_t		uid_t;
>  #endif
>  
>  /*
> + * Space reserved for new socket options added by third-party vendors.
> + * This range applies to all socket option levels.  New socket options
> + * in FreeBSD should always use an option value less than SO_VENDOR.
> + */
> +#if __BSD_VISIBLE
> +#define	SO_VENDOR	0x80000000
> +#endif
> +
> +/*
>   * Structure used for manipulating linger option.
>   */
>  struct linger {

Two thumbs up from me.

We might also want to

#define	TCP_VENDOR SO_VENDOR /* FreeBSD TCP socket options must be
numerically less than this. */

and so on in each file that defines option levels to provide some hint
to people that SO_VENDOR exists? Maybe we don't need the define and just
need to put the one line comment at the end of each set of options in
each file where a particular level's options are specified.

Cheers,
Lawrence


More information about the freebsd-net mailing list