misc/162952: Problems including netinet/tcp_var.h

Bruce Evans brde at optusnet.com.au
Wed Nov 30 05:41:38 UTC 2011


On Tue, 29 Nov 2011, Emil wrote:

> FreeBSD $HOSTNAME.local 8.2-RELEASE FreeBSD 8.2-RELEASE #3: Sat Apr 16 09:20:53 CEST 2011     emil@$HOSTNAME.local:/usr/obj/usr/src/sys/IPSEC  i386
>
>> Description:
> When attempting to include netinet/tcp_var.h in a c++ file, the compiler throws a number of errors.
>
> "In file included from INPUT.cpp:1:
> /usr/include/netinet/tcp_var.h:51: error: expected ';' before 'tqe_q'
> /usr/include/netinet/tcp_var.h:56: error: expected constructor, destructor, or type conversion before '(' token
> /usr/include/netinet/tcp_var.h:67: error: expected ';' before 'scblink'
> /usr/include/netinet/tcp_var.h:102: error: field 't_segq' has incomplete type
> /usr/include/netinet/tcp_var.h:184: error: 'sackhole_head' has not been declared
> /usr/include/netinet/tcp_var.h:184: error: expected ';' before 'snd_holes'
> /usr/include/netinet/tcp_var.h:318: error: expected ';' before 'tw_2msl'"
>
> I am assuming that I am missing an include, as such I have filed this as a documentation bug.
>> How-To-Repeat:
> execute "c++ INPUT"
>
> INPUT.cpp
>
> 1 #include <netinet/tcp_var.h>

Most networking headers have _many_ undocumented prerequisites.
tcp_var.h itself is is not really documented, so you just have to know
what its prerequisites are and shouldn't expect it to work for C++.
You have to be a networking person or use trial and error to know the
prerequisites.  (In 2004, tcp_var.h was not mentioned in any man page.
Now it is mentioned in siftr.4 and hhook.9, and these references are
only usable for human readers of tcp_var.h.  hhook.9 has a synopsis
that can't possibly work due to missing prerequisites for the 1 header
that it satisifies, despite massive pollution internal to this header.)

When I stopped policing prerequisites in 1999, minimal prerequisites
for <netinet/tcp_var.h> were

 	#include <sys/types.h>
 	#include <netinet/in.h>
 	#include <netinet/in_systm.h>
 	#include <netinet/ip_var.h>
 	#include <netinet/tcp.h>

in that order.  These were found by trial and error (many trials and
many errors for each file tested.  The trials included complete tests
of subsets to find a minimum that worked for a range of compilers and
compiler options, and incomplete tests of ordering).  These still work,
at least with gcc and normal compiler options.  They happen to work
for C++ too.

Bruce


More information about the freebsd-bugs mailing list