struct tcpcb padding is insane

Ryan Stone rysto32 at
Mon Feb 6 18:54:27 UTC 2017

I was just looking to try and add a field in struct tcpcb, and I was quite
unhappy that it has recently turned into a mess of ifdefs:

#if defined(_KERNEL) && defined(TCP_RFC7413)
	uint32_t t_ispare[6];		/* 5 UTO, 1 TBD */
	uint64_t t_tfo_cookie;		/* TCP Fast Open cookie */
	uint32_t t_ispare[8];		/* 5 UTO, 3 TBD */
	struct tcp_function_block *t_fb;/* TCP function call block */
	void	*t_fb_ptr;		/* Pointer to t_fb specific data */
#if defined(_KERNEL) && defined(TCP_RFC7413)
	unsigned int *t_tfo_pending;	/* TCP Fast Open pending counter */
	void	*t_pspare2[1];		/* 1 TCP_SIGNATURE */
	void	*t_pspare2[2];		/* 1 TCP_SIGNATURE, 1 TBD */
#if defined(_KERNEL) && defined(TCPPCAP)
	struct mbufq t_inpkts;		/* List of saved input packets. */
	struct mbufq t_outpkts;		/* List of saved output packets. */
#ifdef _LP64
	uint64_t _pad[0];		/* all used! */
	uint64_t _pad[2];		/* 2 are available */
#endif /* _LP64 */
	uint64_t _pad[6];
#endif /* defined(_KERNEL) && defined(TCPPCAP) */

This is unmaintainable,, unreadable unextendable and completely
unnecessary.  I don't see value in leaving spare fields spare if the
corresponding kernel feature is unused;
it isn't as though we can reuse the field for anything else.  If
nobody has any objections, I'll prepare a patch to eliminate the ifdef
soup (with the lamentable exception
of the _LP64 ifdef, which is necessary)

More information about the freebsd-transport mailing list