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.30.4.2 retrieving revision 1.42 diff -u -p -r1.30.4.2 -r1.42 --- src/sys/netinet/ip_input.c 1996/12/11 01:56:56 1.30.4.2 +++ src/sys/netinet/ip_input.c 1996/12/20 08:39:27 1.42 @@ -1,4 +1,4 @@ -/* $NetBSD: ip_input.c,v 1.30.4.2 1996/12/11 01:56:56 mycroft Exp $ */ +/* $NetBSD: ip_input.c,v 1.42 1996/12/20 08:39:27 mrg Exp $ */ /* * Copyright (c) 1982, 1986, 1988, 1993 @@ -61,6 +61,10 @@ #include #include +#ifdef PFIL_HOOKS +#include +#endif /* PFIL_HOOKS */ + #ifndef IPFORWARDING #ifdef GATEWAY #define IPFORWARDING 1 /* forward IP packets not for us */ @@ -117,6 +121,7 @@ static struct ip_srcrt { } ip_srcrt; static void save_rte __P((u_char *, struct in_addr)); + /* * IP initialization: fill in IP protocol switch table. * All protocols not implemented in kernel go to raw IP protocol handler. @@ -153,12 +158,16 @@ struct route ipforward_rt; void ipintr() { - register struct ip *ip; + register struct ip *ip = NULL; register struct mbuf *m; register struct ipq *fp; register struct in_ifaddr *ia; struct ipqent *ipqe; - int hlen, mff, s; + int hlen = 0, mff, len, s; +#ifdef PFIL_HOOKS + struct packet_filter_hook *pfh; + struct mbuf *m0; +#endif /* PFIL_HOOKS */ next: /* @@ -212,12 +221,9 @@ next: * Convert fields to host representation. */ NTOHS(ip->ip_len); - if (ip->ip_len < hlen) { - ipstat.ips_badlen++; - goto bad; - } NTOHS(ip->ip_id); NTOHS(ip->ip_off); + len = ip->ip_len; /* * Check that the amount of data in the buffers @@ -225,18 +231,32 @@ next: * Trim mbufs if longer than we expect. * Drop packet if shorter than we expect. */ - if (m->m_pkthdr.len < ip->ip_len) { + if (m->m_pkthdr.len < len) { ipstat.ips_tooshort++; goto bad; } - if (m->m_pkthdr.len > ip->ip_len) { + if (m->m_pkthdr.len > len) { if (m->m_len == m->m_pkthdr.len) { - m->m_len = ip->ip_len; - m->m_pkthdr.len = ip->ip_len; + m->m_len = len; + m->m_pkthdr.len = len; } else - m_adj(m, ip->ip_len - m->m_pkthdr.len); + m_adj(m, len - m->m_pkthdr.len); } +#ifdef PFIL_HOOKS + /* + * Run through list of hooks for input packets. + */ + m0 = m; + for (pfh = pfil_hook_get(PFIL_IN); pfh; pfh = pfh->pfil_link.le_next) + if (pfh->pfil_func) { + if (pfh->pfil_func(ip, hlen, m->m_pkthdr.rcvif, 0, &m0)) + goto next; + else + ip = mtod(m = m0, struct ip *); + } +#endif /* PFIL_HOOKS */ + /* * Process options and, if not destined for us, * ship it on. ip_dooptions returns 1 when an @@ -251,13 +271,13 @@ next: * Check our list of addresses, to see if the packet is for us. */ for (ia = in_ifaddr.tqh_first; ia; ia = ia->ia_list.tqe_next) { - if (ip->ip_dst.s_addr == ia->ia_addr.sin_addr.s_addr) + if (in_hosteq(ip->ip_dst, ia->ia_addr.sin_addr)) goto ours; if (((ip_directedbcast == 0) || (ip_directedbcast && ia->ia_ifp == m->m_pkthdr.rcvif)) && (ia->ia_ifp->if_flags & IFF_BROADCAST)) { - if (ip->ip_dst.s_addr == ia->ia_broadaddr.sin_addr.s_addr || - ip->ip_dst.s_addr == ia->ia_netbroadcast.s_addr || + if (in_hosteq(ip->ip_dst, ia->ia_broadaddr.sin_addr) || + in_hosteq(ip->ip_dst, ia->ia_netbroadcast) || /* * Look for all-0's host part (old broadcast addr), * either for subnet or net. @@ -324,7 +344,7 @@ next: goto ours; } if (ip->ip_dst.s_addr == INADDR_BROADCAST || - ip->ip_dst.s_addr == INADDR_ANY) + in_nullhost(ip->ip_dst)) goto ours; /* @@ -359,8 +379,8 @@ ours: */ for (fp = ipq.lh_first; fp != NULL; fp = fp->ipq_q.le_next) if (ip->ip_id == fp->ipq_id && - ip->ip_src.s_addr == fp->ipq_src.s_addr && - ip->ip_dst.s_addr == fp->ipq_dst.s_addr && + in_hosteq(ip->ip_src, fp->ipq_src) && + in_hosteq(ip->ip_dst, fp->ipq_dst) && ip->ip_p == fp->ipq_p) goto found; fp = 0; @@ -847,7 +867,7 @@ ip_rtaddr(dst) sin = satosin(&ipforward_rt.ro_dst); - if (ipforward_rt.ro_rt == 0 || dst.s_addr != sin->sin_addr.s_addr) { + if (ipforward_rt.ro_rt == 0 || !in_hosteq(dst, sin->sin_addr)) { if (ipforward_rt.ro_rt) { RTFREE(ipforward_rt.ro_rt); ipforward_rt.ro_rt = 0; @@ -1022,7 +1042,7 @@ ip_forward(m, srcrt) #ifdef DIAGNOSTIC if (ipprintfs) printf("forward: src %x dst %x ttl %x\n", - ip->ip_src.s_addr, ip->ip_dst.s_addr, ip->ip_ttl); + ip->ip_src.s_addr, ip->ip_dst.s_addr, ip->ip_ttl); #endif if (m->m_flags & M_BCAST || in_canforward(ip->ip_dst) == 0) { ipstat.ips_cantforward++; @@ -1038,13 +1058,13 @@ ip_forward(m, srcrt) sin = satosin(&ipforward_rt.ro_dst); if ((rt = ipforward_rt.ro_rt) == 0 || - ip->ip_dst.s_addr != sin->sin_addr.s_addr) { + !in_hosteq(ip->ip_dst, sin->sin_addr)) { if (ipforward_rt.ro_rt) { RTFREE(ipforward_rt.ro_rt); ipforward_rt.ro_rt = 0; } sin->sin_family = AF_INET; - sin->sin_len = sizeof(*sin); + sin->sin_len = sizeof(struct sockaddr_in); sin->sin_addr = ip->ip_dst; rtalloc(&ipforward_rt); @@ -1056,10 +1076,10 @@ ip_forward(m, srcrt) } /* - * Save at most 64 bytes of the packet in case + * Save at most 68 bytes of the packet in case * we need to generate an ICMP message to the src. */ - mcopy = m_copy(m, 0, imin((int)ip->ip_len, 64)); + mcopy = m_copy(m, 0, imin((int)ip->ip_len, 68)); /* * If forwarding packet using same interface that it came in on, @@ -1071,7 +1091,7 @@ ip_forward(m, srcrt) */ if (rt->rt_ifp == m->m_pkthdr.rcvif && (rt->rt_flags & (RTF_DYNAMIC|RTF_MODIFIED)) == 0 && - satosin(rt_key(rt))->sin_addr.s_addr != 0 && + !in_nullhost(satosin(rt_key(rt))->sin_addr) && ipsendredirects && !srcrt) { if (rt->rt_ifa && (ip->ip_src.s_addr & ifatoia(rt->rt_ifa)->ia_subnetmask) == @@ -1085,7 +1105,7 @@ ip_forward(m, srcrt) code = ICMP_REDIRECT_HOST; #ifdef DIAGNOSTIC if (ipprintfs) - printf("redirect (%d) to %x\n", code, (u_int32_t)dest); + printf("redirect (%d) to %x\n", code, (u_int32_t)dest); #endif } }