Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/sys/netinet/ip_input.c,v rcsdiff: /ftp/cvs/cvsroot/src/sys/netinet/ip_input.c,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.93.2.1 retrieving revision 1.106 diff -u -p -r1.93.2.1 -r1.106 --- src/sys/netinet/ip_input.c 2000/11/20 18:10:29 1.93.2.1 +++ src/sys/netinet/ip_input.c 2000/03/07 05:39:57 1.106 @@ -1,4 +1,4 @@ -/* $NetBSD: ip_input.c,v 1.93.2.1 2000/11/20 18:10:29 bouyer Exp $ */ +/* $NetBSD: ip_input.c,v 1.106 2000/03/07 05:39:57 thorpej Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -120,8 +120,7 @@ #include #include -#include - +#include #include #include @@ -140,13 +139,10 @@ #include #include "gif.h" -#ifdef MROUTING -#include -#endif - #ifdef IPSEC #include #include +#include #endif #ifndef IPFORWARDING @@ -204,6 +200,7 @@ struct in_ifaddrhashhead *in_ifaddrhasht struct ifqueue ipintrq; struct ipstat ipstat; u_int16_t ip_id; +int ip_defttl; struct ipqhead ipq; int ipq_locked; @@ -284,8 +281,8 @@ static void save_rte __P((u_char *, stru void ip_init() { - struct protosw *pr; - int i; + register struct protosw *pr; + register int i; pool_init(&ipqent_pool, sizeof(struct ipqent), 0, 0, 0, "ipqepl", 0, NULL, NULL, M_IPQ); @@ -343,10 +340,10 @@ ipintr() void ip_input(struct mbuf *m) { - struct ip *ip = NULL; - struct ipq *fp; - struct in_ifaddr *ia; - struct ifaddr *ifa; + register struct ip *ip = NULL; + register struct ipq *fp; + register struct in_ifaddr *ia; + register struct ifaddr *ifa; struct ipqent *ipqe; int hlen = 0, mff, len; int downmatch; @@ -712,11 +709,11 @@ bad: */ struct mbuf * ip_reass(ipqe, fp) - struct ipqent *ipqe; - struct ipq *fp; + register struct ipqent *ipqe; + register struct ipq *fp; { - struct mbuf *m = ipqe->ipqe_m; - struct ipqent *nq, *p, *q; + register struct mbuf *m = ipqe->ipqe_m; + register struct ipqent *nq, *p, *q; struct ip *ip; struct mbuf *t; int hlen = ipqe->ipqe_ip->ip_hl << 2; @@ -854,7 +851,7 @@ insert: 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 */ - int plen = 0; + register int plen = 0; for (t = m; t; t = t->m_next) plen += t->m_len; m->m_pkthdr.len = plen; @@ -876,7 +873,7 @@ void ip_freef(fp) struct ipq *fp; { - struct ipqent *q, *p; + register struct ipqent *q, *p; IPQ_LOCK_CHECK(); @@ -898,7 +895,7 @@ ip_freef(fp) void ip_slowtimo() { - struct ipq *fp, *nfp; + register struct ipq *fp, *nfp; int s = splsoftnet(); IPQ_LOCK(); @@ -949,10 +946,10 @@ int ip_dooptions(m) struct mbuf *m; { - struct ip *ip = mtod(m, struct ip *); - u_char *cp, *cp0; - struct ip_timestamp *ipt; - struct in_ifaddr *ia; + register struct ip *ip = mtod(m, struct ip *); + register u_char *cp, *cp0; + register struct ip_timestamp *ipt; + register struct in_ifaddr *ia; int opt, optlen, cnt, off, code, type = ICMP_PARAMPROB, forward = 0; struct in_addr dst; n_time ntime; @@ -967,12 +964,8 @@ ip_dooptions(m) if (opt == IPOPT_NOP) optlen = 1; else { - if (cnt < IPOPT_OLEN + sizeof(*cp)) { - code = &cp[IPOPT_OLEN] - (u_char *)ip; - goto bad; - } optlen = cp[IPOPT_OLEN]; - if (optlen < IPOPT_OLEN + sizeof(*cp) || optlen > cnt) { + if (optlen <= 0 || optlen > cnt) { code = &cp[IPOPT_OLEN] - (u_char *)ip; goto bad; } @@ -998,10 +991,6 @@ ip_dooptions(m) code = ICMP_UNREACH_NET_PROHIB; goto bad; } - if (optlen < IPOPT_OFFSET + sizeof(*cp)) { - code = &cp[IPOPT_OLEN] - (u_char *)ip; - goto bad; - } if ((off = cp[IPOPT_OFFSET]) < IPOPT_MINOFF) { code = &cp[IPOPT_OFFSET] - (u_char *)ip; goto bad; @@ -1021,7 +1010,7 @@ ip_dooptions(m) break; } off--; /* 0 origin */ - if ((off + sizeof(struct in_addr)) > optlen) { + if (off > optlen - sizeof(struct in_addr)) { /* * End of source route. Should be for us. */ @@ -1053,10 +1042,6 @@ ip_dooptions(m) break; case IPOPT_RR: - if (optlen < IPOPT_OFFSET + sizeof(*cp)) { - code = &cp[IPOPT_OLEN] - (u_char *)ip; - goto bad; - } if ((off = cp[IPOPT_OFFSET]) < IPOPT_MINOFF) { code = &cp[IPOPT_OFFSET] - (u_char *)ip; goto bad; @@ -1065,7 +1050,7 @@ ip_dooptions(m) * If no space remains, ignore. */ off--; /* 0 origin */ - if ((off + sizeof(struct in_addr)) > optlen) + if (off > optlen - sizeof(struct in_addr)) break; bcopy((caddr_t)(&ip->ip_dst), (caddr_t)&ipaddr.sin_addr, sizeof(ipaddr.sin_addr)); @@ -1088,20 +1073,11 @@ ip_dooptions(m) case IPOPT_TS: code = cp - (u_char *)ip; ipt = (struct ip_timestamp *)cp; - if (ipt->ipt_len < 4 || ipt->ipt_len > 40) { - code = (u_char *)&ipt->ipt_len - (u_char *)ip; + if (ipt->ipt_len < 5) goto bad; - } - if (ipt->ipt_ptr < 5) { - code = (u_char *)&ipt->ipt_ptr - (u_char *)ip; - goto bad; - } if (ipt->ipt_ptr > ipt->ipt_len - sizeof (int32_t)) { - if (++ipt->ipt_oflw == 0) { - code = (u_char *)&ipt->ipt_ptr - - (u_char *)ip; + if (++ipt->ipt_oflw == 0) goto bad; - } break; } cp0 = (cp + ipt->ipt_ptr - 1); @@ -1112,11 +1088,8 @@ ip_dooptions(m) case IPOPT_TS_TSANDADDR: if (ipt->ipt_ptr - 1 + sizeof(n_time) + - sizeof(struct in_addr) > ipt->ipt_len) { - code = (u_char *)&ipt->ipt_ptr - - (u_char *)ip; + sizeof(struct in_addr) > ipt->ipt_len) goto bad; - } ipaddr.sin_addr = dst; ia = ifatoia(ifaof_ifpforaddr(sintosa(&ipaddr), m->m_pkthdr.rcvif)); @@ -1129,11 +1102,8 @@ ip_dooptions(m) case IPOPT_TS_PRESPEC: if (ipt->ipt_ptr - 1 + sizeof(n_time) + - sizeof(struct in_addr) > ipt->ipt_len) { - code = (u_char *)&ipt->ipt_ptr - - (u_char *)ip; + sizeof(struct in_addr) > ipt->ipt_len) goto bad; - } bcopy(cp0, &ipaddr.sin_addr, sizeof(struct in_addr)); if (ifatoia(ifa_ifwithaddr(sintosa(&ipaddr))) @@ -1143,14 +1113,10 @@ ip_dooptions(m) break; default: - /* XXX can't take &ipt->ipt_flg */ - code = (u_char *)&ipt->ipt_ptr - - (u_char *)ip + 1; goto bad; } ntime = iptime(); - cp0 = (u_char *) &ntime; /* XXX grumble, GCC... */ - bcopy(cp0, (caddr_t)cp + ipt->ipt_ptr - 1, + bcopy(&ntime, (caddr_t)cp + ipt->ipt_ptr - 1, sizeof(n_time)); ipt->ipt_ptr += sizeof(n_time); } @@ -1179,7 +1145,7 @@ struct in_ifaddr * ip_rtaddr(dst) struct in_addr dst; { - struct sockaddr_in *sin; + register struct sockaddr_in *sin; sin = satosin(&ipforward_rt.ro_dst); @@ -1230,8 +1196,8 @@ save_rte(option, dst) struct mbuf * ip_srcroute() { - struct in_addr *p, *q; - struct mbuf *m; + register struct in_addr *p, *q; + register struct mbuf *m; if (ip_nhops == 0) return ((struct mbuf *)0); @@ -1300,12 +1266,12 @@ ip_srcroute() */ void ip_stripoptions(m, mopt) - struct mbuf *m; + register struct mbuf *m; struct mbuf *mopt; { - int i; + register int i; struct ip *ip = mtod(m, struct ip *); - caddr_t opts; + register caddr_t opts; int olen; olen = (ip->ip_hl << 2) - sizeof (struct ip); @@ -1347,9 +1313,9 @@ ip_forward(m, srcrt) struct mbuf *m; int srcrt; { - struct ip *ip = mtod(m, struct ip *); - struct sockaddr_in *sin; - struct rtentry *rt; + register struct ip *ip = mtod(m, struct ip *); + register struct sockaddr_in *sin; + register struct rtentry *rt; int error, type = 0, code = 0; struct mbuf *mcopy; n_long dest; @@ -1398,11 +1364,8 @@ ip_forward(m, srcrt) /* * Save at most 68 bytes of the packet in case * we need to generate an ICMP message to the src. - * Pullup to avoid sharing mbuf cluster between m and mcopy. */ - mcopy = m_copym(m, 0, imin((int)ip->ip_len, 68), M_DONTWAIT); - if (mcopy) - mcopy = m_pullup(mcopy, ip->ip_hl << 2); + mcopy = m_copy(m, 0, imin((int)ip->ip_len, 68)); /* * If forwarding packet using same interface that it came in on, @@ -1550,10 +1513,10 @@ ip_forward(m, srcrt) void ip_savecontrol(inp, mp, ip, m) - struct inpcb *inp; - struct mbuf **mp; - struct ip *ip; - struct mbuf *m; + register struct inpcb *inp; + register struct mbuf **mp; + register struct ip *ip; + register struct mbuf *m; { if (inp->inp_socket->so_options & SO_TIMESTAMP) { @@ -1668,8 +1631,7 @@ ip_sysctl(name, namelen, oldp, oldlenp, case IPCTL_ANONPORTMIN: old = anonportmin; error = sysctl_int(oldp, oldlenp, newp, newlen, &anonportmin); - if (anonportmin >= anonportmax || anonportmin < 0 - || anonportmin > 65535 + if (anonportmin >= anonportmax || anonportmin > 65535 #ifndef IPNOPRIVPORTS || anonportmin < IPPORT_RESERVED #endif @@ -1681,8 +1643,7 @@ ip_sysctl(name, namelen, oldp, oldlenp, case IPCTL_ANONPORTMAX: old = anonportmax; error = sysctl_int(oldp, oldlenp, newp, newlen, &anonportmax); - if (anonportmin >= anonportmax || anonportmax < 0 - || anonportmax > 65535 + if (anonportmin >= anonportmax || anonportmax > 65535 #ifndef IPNOPRIVPORTS || anonportmax < IPPORT_RESERVED #endif @@ -1720,31 +1681,6 @@ ip_sysctl(name, namelen, oldp, oldlenp, &ip_gif_ttl)); #endif -#ifndef IPNOPRIVPORTS - case IPCTL_LOWPORTMIN: - old = lowportmin; - error = sysctl_int(oldp, oldlenp, newp, newlen, &lowportmin); - if (lowportmin >= lowportmax - || lowportmin > IPPORT_RESERVEDMAX - || lowportmin < IPPORT_RESERVEDMIN - ) { - lowportmin = old; - return (EINVAL); - } - return (error); - case IPCTL_LOWPORTMAX: - old = lowportmax; - error = sysctl_int(oldp, oldlenp, newp, newlen, &lowportmax); - if (lowportmin >= lowportmax - || lowportmax > IPPORT_RESERVEDMAX - || lowportmax < IPPORT_RESERVEDMIN - ) { - lowportmax = old; - return (EINVAL); - } - return (error); -#endif - default: return (EOPNOTSUPP); }