Date: Wed, 16 Oct 2002 00:17:13 +0200 From: Poul-Henning Kamp <phk@freebsd.org> To: net@freebsd.org, arch@freebsd.org Subject: RFC: eliminating the _IP_VHL hack. Message-ID: <60637.1034720233@critter.freebsd.dk>
next in thread | raw e-mail | index | archive | help
almost 7 years ago, this commit introduced the _IP_VHL hack in our IP-stack: ] revision 1.7 ] date: 1995/12/21 21:20:27; author: wollman; state: Exp; lines: +5 -1 ] If _IP_VHL is defined, declare a single ip_vhl member in struct ip rather ] than separate ip_v and ip_hl members. Should have no effect on current code, ] but I'd eventually like to get rid of those obnoxious bitfields completely. We can argue a lot about how long time we should wait for "eventually", but I would say that 7 years is far too long, considering the status: In the meantime absolutely no code has picked up on this idea, and source files using the _IP_VHL hack in in the minority in our tree. The side effect of having some source-files using the _IP_VHL hack and some not is that sizeof(struct ip) varies from file to file, which at best is confusing an at worst the source of some really evil bugs. I would therefore propose to eliminate the _IP_VHL hack from the kernel to end this state of (potential) confusion, and invite comments to the following patch: Index: ip.h =================================================================== RCS file: /home/ncvs/src/sys/netinet/ip.h,v retrieving revision 1.19 diff -u -r1.19 ip.h --- ip.h 14 Dec 2001 19:37:32 -0000 1.19 +++ ip.h 15 Oct 2002 22:02:26 -0000 @@ -47,9 +47,6 @@ * Structure of an internet header, naked of options. */ struct ip { -#ifdef _IP_VHL - u_char ip_vhl; /* version << 4 | header length >> 2 */ -#else #if BYTE_ORDER == LITTLE_ENDIAN u_int ip_hl:4, /* header length */ ip_v:4; /* version */ @@ -58,7 +55,6 @@ u_int ip_v:4, /* version */ ip_hl:4; /* header length */ #endif -#endif /* not _IP_VHL */ u_char ip_tos; /* type of service */ u_short ip_len; /* total length */ u_short ip_id; /* identification */ @@ -72,13 +68,6 @@ u_short ip_sum; /* checksum */ struct in_addr ip_src,ip_dst; /* source and dest address */ }; - -#ifdef _IP_VHL -#define IP_MAKE_VHL(v, hl) ((v) << 4 | (hl)) -#define IP_VHL_HL(vhl) ((vhl) & 0x0f) -#define IP_VHL_V(vhl) ((vhl) >> 4) -#define IP_VHL_BORING 0x45 -#endif #define IP_MAXPACKET 65535 /* maximum packet size */ Index: ip_icmp.c =================================================================== RCS file: /home/ncvs/src/sys/netinet/ip_icmp.c,v retrieving revision 1.70 diff -u -r1.70 ip_icmp.c --- ip_icmp.c 1 Aug 2002 03:53:04 -0000 1.70 +++ ip_icmp.c 15 Oct 2002 22:05:23 -0000 @@ -51,7 +51,6 @@ #include <net/if_types.h> #include <net/route.h> -#define _IP_VHL #include <netinet/in.h> #include <netinet/in_systm.h> #include <netinet/in_var.h> @@ -128,7 +127,7 @@ struct ifnet *destifp; { register struct ip *oip = mtod(n, struct ip *), *nip; - register unsigned oiplen = IP_VHL_HL(oip->ip_vhl) << 2; + register unsigned oiplen = oip->ip_hl << 2; register struct icmp *icp; register struct mbuf *m; unsigned icmplen; @@ -214,7 +213,8 @@ nip = mtod(m, struct ip *); bcopy((caddr_t)oip, (caddr_t)nip, sizeof(struct ip)); nip->ip_len = m->m_len; - nip->ip_vhl = IP_VHL_BORING; + nip->ip_v = IPVERSION; + nip->ip_hl = 5; nip->ip_p = IPPROTO_ICMP; nip->ip_tos = 0; icmp_reflect(m); @@ -364,7 +364,7 @@ * Problem with datagram; advise higher level routines. */ if (icmplen < ICMP_ADVLENMIN || icmplen < ICMP_ADVLEN(icp) || - IP_VHL_HL(icp->icmp_ip.ip_vhl) < (sizeof(struct ip) >> 2)) { + icp->icmp_ip.ip_hl < (sizeof(struct ip) >> 2)) { icmpstat.icps_badlen++; goto freeit; } @@ -526,7 +526,7 @@ if (code > 3) goto badcode; if (icmplen < ICMP_ADVLENMIN || icmplen < ICMP_ADVLEN(icp) || - IP_VHL_HL(icp->icmp_ip.ip_vhl) < (sizeof(struct ip) >> 2)) { + icp->icmp_ip.ip_hl < (sizeof(struct ip) >> 2)) { icmpstat.icps_badlen++; break; } @@ -593,7 +593,7 @@ struct in_ifaddr *ia; struct in_addr t; struct mbuf *opts = 0; - int optlen = (IP_VHL_HL(ip->ip_vhl) << 2) - sizeof(struct ip); + int optlen = (ip->ip_hl << 2) - sizeof(struct ip); struct route *ro = NULL, rt; if (!in_canforward(ip->ip_src) && @@ -703,7 +703,8 @@ * mbuf's data back, and adjust the IP length. */ ip->ip_len -= optlen; - ip->ip_vhl = IP_VHL_BORING; + ip->ip_v = IPVERSION; + ip->ip_hl = 5; m->m_len -= optlen; if (m->m_flags & M_PKTHDR) m->m_pkthdr.len -= optlen; @@ -734,7 +735,7 @@ register int hlen; register struct icmp *icp; - hlen = IP_VHL_HL(ip->ip_vhl) << 2; + hlen = ip->ip_hl << 2; m->m_data += hlen; m->m_len -= hlen; icp = mtod(m, struct icmp *); Index: ip_icmp.h =================================================================== RCS file: /home/ncvs/src/sys/netinet/ip_icmp.h,v retrieving revision 1.18 diff -u -r1.18 ip_icmp.h --- ip_icmp.h 19 Mar 2002 21:25:46 -0000 1.18 +++ ip_icmp.h 15 Oct 2002 22:02:52 -0000 @@ -123,13 +123,8 @@ #define ICMP_TSLEN (8 + 3 * sizeof (n_time)) /* timestamp */ #define ICMP_MASKLEN 12 /* address mask */ #define ICMP_ADVLENMIN (8 + sizeof (struct ip) + 8) /* min */ -#ifndef _IP_VHL #define ICMP_ADVLEN(p) (8 + ((p)->icmp_ip.ip_hl << 2) + 8) /* N.B.: must separately check that ip_hl >= 5 */ -#else -#define ICMP_ADVLEN(p) (8 + (IP_VHL_HL((p)->icmp_ip.ip_vhl) << 2) + 8) - /* N.B.: must separately check that header length >= 5 */ -#endif /* * Definition of type and code field values. Index: ip_input.c =================================================================== RCS file: /home/ncvs/src/sys/netinet/ip_input.c,v retrieving revision 1.211 diff -u -r1.211 ip_input.c --- ip_input.c 10 Oct 2002 12:03:36 -0000 1.211 +++ ip_input.c 15 Oct 2002 22:02:57 -0000 @@ -34,8 +34,6 @@ * $FreeBSD: src/sys/netinet/ip_input.c,v 1.211 2002/10/10 12:03:36 maxim Exp $ */ -#define _IP_VHL - #include "opt_bootp.h" #include "opt_ipfw.h" #include "opt_ipdn.h" @@ -324,7 +322,7 @@ if (args.rule) { /* dummynet already filtered us */ ip = mtod(m, struct ip *); - hlen = IP_VHL_HL(ip->ip_vhl) << 2; + hlen = ip->ip_hl << 2; goto iphack ; } @@ -340,12 +338,12 @@ } ip = mtod(m, struct ip *); - if (IP_VHL_V(ip->ip_vhl) != IPVERSION) { + if (ip->ip_v != IPVERSION) { ipstat.ips_badvers++; goto bad; } - hlen = IP_VHL_HL(ip->ip_vhl) << 2; + hlen = ip->ip_hl << 2; if (hlen < sizeof(struct ip)) { /* minimum header length */ ipstat.ips_badhlen++; goto bad; @@ -755,7 +753,7 @@ ipstat.ips_reassembled++; ip = mtod(m, struct ip *); /* Get the header length of the reassembled packet */ - hlen = IP_VHL_HL(ip->ip_vhl) << 2; + hlen = ip->ip_hl << 2; #ifdef IPDIVERT /* Restore original checksum before diverting packet */ if (divert_info != 0) { @@ -882,7 +880,7 @@ struct ip *ip = mtod(m, struct ip *); register struct mbuf *p, *q, *nq; struct mbuf *t; - int hlen = IP_VHL_HL(ip->ip_vhl) << 2; + int hlen = ip->ip_hl << 2; int i, next; /* @@ -1020,7 +1018,7 @@ */ q = fp->ipq_frags; ip = GETIP(q); - if (next + (IP_VHL_HL(ip->ip_vhl) << 2) > IP_MAXPACKET) { + if (next + (ip->ip_hl << 2) > IP_MAXPACKET) { ipstat.ips_toolong++; ip_freef(head, fp); return (0); @@ -1068,8 +1066,8 @@ nipq--; (void) m_free(dtom(fp)); ip_nfragpackets--; - m->m_len += (IP_VHL_HL(ip->ip_vhl) << 2); - m->m_data -= (IP_VHL_HL(ip->ip_vhl) << 2); + m->m_len += (ip->ip_hl << 2); + m->m_data -= (ip->ip_hl << 2); /* some debugging cruft by sklower, below, will go away soon */ if (m->m_flags & M_PKTHDR) /* XXX this should be done elsewhere */ m_fixhdr(m); @@ -1193,7 +1191,7 @@ dst = ip->ip_dst; cp = (u_char *)(ip + 1); - cnt = (IP_VHL_HL(ip->ip_vhl) << 2) - sizeof (struct ip); + cnt = (ip->ip_hl << 2) - sizeof (struct ip); for (; cnt > 0; cnt -= optlen, cp += optlen) { opt = cp[IPOPT_OPTVAL]; if (opt == IPOPT_EOL) @@ -1582,14 +1580,15 @@ register caddr_t opts; int olen; - olen = (IP_VHL_HL(ip->ip_vhl) << 2) - sizeof (struct ip); + olen = (ip->ip_hl << 2) - sizeof (struct ip); opts = (caddr_t)(ip + 1); i = m->m_len - (sizeof (struct ip) + olen); bcopy(opts + olen, opts, (unsigned)i); m->m_len -= olen; if (m->m_flags & M_PKTHDR) m->m_pkthdr.len -= olen; - ip->ip_vhl = IP_MAKE_VHL(IPVERSION, sizeof(struct ip) >> 2); + ip->ip_v = IPVERSION; + ip->ip_hl = sizeof(struct ip) >> 2; } u_char inetctlerrmap[PRC_NCMDS] = { @@ -1686,7 +1685,7 @@ MGET(mcopy, M_DONTWAIT, m->m_type); if (mcopy != NULL) { M_COPY_PKTHDR(mcopy, m); - mcopy->m_len = imin((IP_VHL_HL(ip->ip_vhl) << 2) + 8, + mcopy->m_len = imin((ip->ip_hl << 2) + 8, (int)ip->ip_len); m_copydata(m, 0, mcopy->m_len, mtod(mcopy, caddr_t)); #ifdef MAC Index: ip_output.c =================================================================== RCS file: /home/ncvs/src/sys/netinet/ip_output.c,v retrieving revision 1.165 diff -u -r1.165 ip_output.c --- ip_output.c 23 Sep 2002 08:56:24 -0000 1.165 +++ ip_output.c 15 Oct 2002 22:03:41 -0000 @@ -34,8 +34,6 @@ * $FreeBSD: src/sys/netinet/ip_output.c,v 1.165 2002/09/23 08:56:24 maxim Exp $ */ -#define _IP_VHL - #include "opt_ipfw.h" #include "opt_ipdn.h" #include "opt_ipdivert.h" @@ -191,7 +189,7 @@ #endif if (args.rule != NULL) { /* dummynet already saw us */ ip = mtod(m, struct ip *); - hlen = IP_VHL_HL(ip->ip_vhl) << 2 ; + hlen = ip->ip_hl << 2 ; if (ro->ro_rt) ia = ifatoia(ro->ro_rt->rt_ifa); goto sendit; @@ -210,7 +208,8 @@ * Fill in IP header. */ if ((flags & (IP_FORWARDING|IP_RAWOUTPUT)) == 0) { - ip->ip_vhl = IP_MAKE_VHL(IPVERSION, hlen >> 2); + ip->ip_v = IPVERSION; + ip->ip_hl = hlen >> 2; ip->ip_off &= IP_DF; #ifdef RANDOM_IP_ID ip->ip_id = ip_randomid(); @@ -219,7 +218,7 @@ #endif ipstat.ips_localout++; } else { - hlen = IP_VHL_HL(ip->ip_vhl) << 2; + hlen = ip->ip_hl << 2; } dst = (struct sockaddr_in *)&ro->ro_dst; @@ -553,11 +552,7 @@ /* be sure to update variables that are affected by ipsec4_output() */ ip = mtod(m, struct ip *); -#ifdef _IP_VHL - hlen = IP_VHL_HL(ip->ip_vhl) << 2; -#else hlen = ip->ip_hl << 2; -#endif if (ro->ro_rt == NULL) { if ((flags & IP_ROUTETOIF) == 0) { printf("ip_output: " @@ -862,13 +857,8 @@ ip->ip_len = htons(ip->ip_len); ip->ip_off = htons(ip->ip_off); ip->ip_sum = 0; - if (sw_csum & CSUM_DELAY_IP) { - if (ip->ip_vhl == IP_VHL_BORING) { - ip->ip_sum = in_cksum_hdr(ip); - } else { - ip->ip_sum = in_cksum(m, hlen); - } - } + if (sw_csum & CSUM_DELAY_IP) + ip->ip_sum = in_cksum(m, hlen); /* Record statistics for this interface address. */ if (!(flags & IP_FORWARDING) && ia) { @@ -988,7 +978,8 @@ *mhip = *ip; if (hlen > sizeof (struct ip)) { mhlen = ip_optcopy(ip, mhip) + sizeof (struct ip); - mhip->ip_vhl = IP_MAKE_VHL(IPVERSION, mhlen >> 2); + mhip->ip_v = IPVERSION; + mhip->ip_hl = mhlen >> 2; } m->m_len = mhlen; mhip->ip_off = ((off - hlen) >> 3) + ip->ip_off; @@ -1012,13 +1003,8 @@ m->m_pkthdr.csum_flags = m0->m_pkthdr.csum_flags; mhip->ip_off = htons(mhip->ip_off); mhip->ip_sum = 0; - if (sw_csum & CSUM_DELAY_IP) { - if (mhip->ip_vhl == IP_VHL_BORING) { - mhip->ip_sum = in_cksum_hdr(mhip); - } else { - mhip->ip_sum = in_cksum(m, mhlen); - } - } + if (sw_csum & CSUM_DELAY_IP) + mhip->ip_sum = in_cksum(m, mhlen); *mnext = m; mnext = &m->m_nextpkt; nfrags++; @@ -1041,13 +1027,8 @@ ip->ip_off |= IP_MF; ip->ip_off = htons(ip->ip_off); ip->ip_sum = 0; - if (sw_csum & CSUM_DELAY_IP) { - if (ip->ip_vhl == IP_VHL_BORING) { - ip->ip_sum = in_cksum_hdr(ip); - } else { - ip->ip_sum = in_cksum(m, hlen); - } - } + if (sw_csum & CSUM_DELAY_IP) + ip->ip_sum = in_cksum(m, hlen); sendorfree: for (m = m0; m; m = m0) { m0 = m->m_nextpkt; @@ -1097,7 +1078,7 @@ u_short csum, offset; ip = mtod(m, struct ip *); - offset = IP_VHL_HL(ip->ip_vhl) << 2 ; + offset = ip->ip_hl << 2 ; csum = in_cksum_skip(m, ip->ip_len, offset); if (m->m_pkthdr.csum_flags & CSUM_UDP && csum == 0) csum = 0xffff; @@ -1169,7 +1150,8 @@ ip = mtod(m, struct ip *); bcopy(p->ipopt_list, ip + 1, optlen); *phlen = sizeof(struct ip) + optlen; - ip->ip_vhl = IP_MAKE_VHL(IPVERSION, *phlen >> 2); + ip->ip_v = IPVERSION; + ip->ip_hl = *phlen >> 2; ip->ip_len += optlen; return (m); } @@ -1187,7 +1169,7 @@ cp = (u_char *)(ip + 1); dp = (u_char *)(jp + 1); - cnt = (IP_VHL_HL(ip->ip_vhl) << 2) - sizeof (struct ip); + cnt = (ip->ip_hl << 2) - sizeof (struct ip); for (; cnt > 0; cnt -= optlen, cp += optlen) { opt = cp[0]; if (opt == IPOPT_EOL) @@ -2025,11 +2007,7 @@ ip->ip_len = htons(ip->ip_len); ip->ip_off = htons(ip->ip_off); ip->ip_sum = 0; - if (ip->ip_vhl == IP_VHL_BORING) { - ip->ip_sum = in_cksum_hdr(ip); - } else { - ip->ip_sum = in_cksum(copym, hlen); - } + ip->ip_sum = in_cksum(copym, hlen); /* * NB: * It's not clear whether there are any lingering Index: raw_ip.c =================================================================== RCS file: /home/ncvs/src/sys/netinet/raw_ip.c,v retrieving revision 1.100 diff -u -r1.100 raw_ip.c --- raw_ip.c 15 Aug 2002 18:51:26 -0000 1.100 +++ raw_ip.c 15 Oct 2002 22:06:09 -0000 @@ -59,7 +59,6 @@ #include <net/if.h> #include <net/route.h> -#define _IP_VHL #include <netinet/in.h> #include <netinet/in_systm.h> #include <netinet/in_pcb.h> @@ -263,10 +262,10 @@ ip = mtod(m, struct ip *); /* don't allow both user specified and setsockopt options, and don't allow packet length sizes that will crash */ - if (((IP_VHL_HL(ip->ip_vhl) != (sizeof (*ip) >> 2)) + if (((ip->ip_hl != (sizeof (*ip) >> 2)) && inp->inp_options) || (ip->ip_len > m->m_pkthdr.len) - || (ip->ip_len < (IP_VHL_HL(ip->ip_vhl) << 2))) { + || (ip->ip_len < (ip->ip_hl << 2))) { m_freem(m); return EINVAL; } Index: tcp_subr.c =================================================================== RCS file: /home/ncvs/src/sys/netinet/tcp_subr.c,v retrieving revision 1.143 diff -u -r1.143 tcp_subr.c --- tcp_subr.c 10 Oct 2002 21:41:30 -0000 1.143 +++ tcp_subr.c 15 Oct 2002 22:06:27 -0000 @@ -62,7 +62,6 @@ #include <net/route.h> #include <net/if.h> -#define _IP_VHL #include <netinet/in.h> #include <netinet/in_systm.h> #include <netinet/ip.h> @@ -284,7 +283,8 @@ { struct ip *ip = (struct ip *) ip_ptr; - ip->ip_vhl = IP_VHL_BORING; + ip->ip_v = IPVERSION; + ip->ip_hl = 5; ip->ip_tos = 0; ip->ip_len = 0; ip->ip_id = 0; @@ -371,7 +371,7 @@ KASSERT(tp != NULL || m != NULL, ("tcp_respond: tp and m both NULL")); #ifdef INET6 - isipv6 = IP_VHL_V(((struct ip *)ipgen)->ip_vhl) == 6; + isipv6 = ((struct ip *)ipgen)->ip_v == 6; ip6 = ipgen; #endif /* INET6 */ ip = ipgen; @@ -1102,7 +1102,7 @@ if (ip) { s = splnet(); th = (struct tcphdr *)((caddr_t)ip - + (IP_VHL_HL(ip->ip_vhl) << 2)); + + (ip->ip_hl << 2)); INP_INFO_WLOCK(&tcbinfo); inp = in_pcblookup_hash(&tcbinfo, faddr, th->th_dport, ip->ip_src, th->th_sport, 0, NULL); -- Poul-Henning Kamp | UNIX since Zilog Zeus 3.20 phk@FreeBSD.ORG | TCP/IP since RFC 956 FreeBSD committer | BSD since 4.3-tahoe Never attribute to malice what can adequately be explained by incompetence. To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-arch" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?60637.1034720233>