Skip site navigation (1)Skip section navigation (2)
Date:      02 Jun 2003 13:26:22 +0400
From:      "Artem 'Zazoobr' Ignatjev" <timon@memphis.mephi.ru>
To:        freebsd-bugs@freebsd.org
Subject:   Re: kern/52764: Impossible to build kernel with COPTFLAGS=-O0 and without INET6
Message-ID:  <1054545981.1401.7.camel@timon.nist>
In-Reply-To: <200305281708.h4SH8DFj006111@stylish.chem.msu.su>
References:  <200305281708.h4SH8DFj006111@stylish.chem.msu.su>

next in thread | previous in thread | raw e-mail | index | archive | help
 Yar Tikhiy wrote:
> >How-To-Repeat:
> 	Add "makeoptions COPTFLAGS=-O0" to a kernel configuration file
> 	and make sure there is no "options INET6" in it.  Try to build
> 	such a kernel.  Observe the following linker diagnostics:
> 
> linking kernel.debug
> tcp_input.o: In function `tcp_input':
> ../../../netinet/tcp_input.c:400: undefined reference to `in6_cksum'
> ../../../netinet/tcp_input.c:480: undefined reference to `ip6stat'
> ../../../netinet/tcp_input.c:480: undefined reference to `ip6stat'
> ../../../netinet/tcp_input.c:480: undefined reference to `ip6stat'
> ../../../netinet/tcp_input.c:480: undefined reference to `ip6stat'
> ../../../netinet/tcp_input.c:480: undefined reference to `ip6stat'
...
Hello.
I came across this problem yesterday.. 
As a workaround you can use following patch:

--- sys/netinet/tcp_input.c.orig	Sun Jun  1 22:23:58 2003
+++ sys/netinet/tcp_input.c	Sun Jun  1 23:03:27 2003
@@ -396,6 +396,7 @@
 	if (isipv6) {
 		/* IP6_EXTHDR_CHECK() is already done at tcp6_input() */
 		ip6 = mtod(m, struct ip6_hdr *);
+#ifdef INET6
 		tlen = sizeof(*ip6) + ntohs(ip6->ip6_plen) - off0;
 		if (in6_cksum(m, IPPROTO_TCP, off0, tlen)) {
 			tcpstat.tcps_rcvbadsum++;
@@ -415,6 +416,12 @@
 			/* XXX stat */
 			goto drop;
 		}
+#else
+		/* 
+		 * XXX otherwise compiler complains about th being used uninitialized
+		 */
+		th = (struct tcphdr *)((caddr_t)ip6 + off0);
+#endif
 	} else {
 		/*
 		 * Get IP and TCP header together in first mbuf.
@@ -476,10 +483,13 @@
 	}
 	tlen -= off;	/* tlen is used instead of ti->ti_len */
 	if (off > sizeof (struct tcphdr)) {
+
 		if (isipv6) {
+#ifdef INET6
 			IP6_EXTHDR_CHECK(m, off0, off, );
 			ip6 = mtod(m, struct ip6_hdr *);
 			th = (struct tcphdr *)((caddr_t)ip6 + off0);
+#endif
 		} else {
 			if (m->m_len < sizeof(struct ip) + off) {
 				if ((m = m_pullup(m, sizeof (struct ip) + off))
@@ -555,12 +565,14 @@
 						1, m->m_pkthdr.rcvif);
 		}
 	} else {
+#ifdef INET6
 		if (isipv6)
 			inp = in6_pcblookup_hash(&tcbinfo,
 						 &ip6->ip6_src, th->th_sport,
 						 &ip6->ip6_dst, th->th_dport,
 						 1, m->m_pkthdr.rcvif);
 		else
+#endif
 			inp = in_pcblookup_hash(&tcbinfo,
 						ip->ip_src, th->th_sport,
 						ip->ip_dst, th->th_dport,
@@ -582,9 +594,11 @@
 #endif
 #ifdef FAST_IPSEC
 	if (isipv6) {
+#ifdef INET6
 		if (inp != NULL && ipsec6_in_reject(m, inp)) {
 			goto drop;
 		}
+#endif
 	} else
 	if (inp != NULL && ipsec4_in_reject(m, inp)) {
 		goto drop;
@@ -606,12 +620,14 @@
 #endif
 
 			if (isipv6) {
+#ifdef INET6
 				strcpy(dbuf, "[");
 				strcpy(sbuf, "[");
 				strcat(dbuf, ip6_sprintf(&ip6->ip6_dst));
 				strcat(sbuf, ip6_sprintf(&ip6->ip6_src));
 				strcat(dbuf, "]");
 				strcat(sbuf, "]");
+#endif
 			} else {
 				strcpy(dbuf, inet_ntoa(ip->ip_dst));
 				strcpy(sbuf, inet_ntoa(ip->ip_src));
@@ -2611,17 +2627,23 @@
 			    sizeof (struct ip6_hdr) + sizeof (struct tcphdr) :
 			    sizeof (struct tcpiphdr);
 #else
-	const int isipv6 = 0;
+//	const int isipv6 = 0;
 	const size_t min_protoh = sizeof (struct tcpiphdr);
 #endif
 
+#ifdef INET6
 	if (isipv6)
 		rt = tcp_rtlookup6(&inp->inp_inc);
 	else
+#endif
 		rt = tcp_rtlookup(&inp->inp_inc);
 	if (rt == NULL) {
-		tp->t_maxopd = tp->t_maxseg =
+	tp->t_maxopd = tp->t_maxseg =
+#ifdef INET6
 				isipv6 ? tcp_v6mssdflt : tcp_mssdflt;
+#else
+				tcp_mssdflt;
+#endif
 		return;
 	}
 	ifp = rt->rt_ifp;
@@ -2639,7 +2661,11 @@
 	 * in this case we use tcp_mssdflt.
 	 */
 	if (offer == 0)
+#ifdef INET6
 		offer = isipv6 ? tcp_v6mssdflt : tcp_mssdflt;
+#else
+		offer = tcp_mssdflt;
+#endif
 	else
 		/*
 		 * Sanity check: make sure that maxopd will be large
@@ -2685,16 +2711,20 @@
 	if (rt->rt_rmx.rmx_mtu)
 		mss = rt->rt_rmx.rmx_mtu - min_protoh;
 	else {
+#ifdef INET6
 		if (isipv6) {
 			mss = nd_ifinfo[rt->rt_ifp->if_index].linkmtu -
 				min_protoh;
 			if (!in6_localaddr(&inp->in6p_faddr))
 				mss = min(mss, tcp_v6mssdflt);
 		} else {
+#endif
 			mss = ifp->if_mtu - min_protoh;
 			if (!in_localaddr(inp->inp_faddr))
 				mss = min(mss, tcp_mssdflt);
+#ifdef INET6
 		}
+#endif
 	}
 	mss = min(mss, offer);
 	/*
@@ -2766,9 +2796,11 @@
 	 */
 	if (tcp_do_rfc3390)
 		tp->snd_cwnd = min(4 * mss, max(2 * mss, 4380));
+#ifdef INET6
 	else if ((isipv6 && in6_localaddr(&inp->in6p_faddr)) ||
 	    (!isipv6 && in_localaddr(inp->inp_faddr)))
 		tp->snd_cwnd = mss * ss_fltsz_local;
+#endif
 	else
 		tp->snd_cwnd = mss * ss_fltsz;
 
@@ -2798,16 +2830,21 @@
 			    sizeof (struct ip6_hdr) + sizeof (struct tcphdr) :
 			    sizeof (struct tcpiphdr);
 #else
-	const int isipv6 = 0;
 	const size_t min_protoh = sizeof (struct tcpiphdr);
 #endif
 
+#ifdef INET6
 	if (isipv6)
 		rt = tcp_rtlookup6(&tp->t_inpcb->inp_inc);
 	else
+#endif
 		rt = tcp_rtlookup(&tp->t_inpcb->inp_inc);
 	if (rt == NULL)
+#ifdef INET6
 		return (isipv6 ? tcp_v6mssdflt : tcp_mssdflt);
+#else
+	return tcp_mssdflt;
+#endif
 
 	return (rt->rt_ifp->if_mtu - min_protoh);
 }





Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1054545981.1401.7.camel>