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/udp_usrreq.c,v rcsdiff: /ftp/cvs/cvsroot/src/sys/netinet/udp_usrreq.c,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.66.4.6 retrieving revision 1.67 diff -u -p -r1.66.4.6 -r1.67 --- src/sys/netinet/udp_usrreq.c 2004/04/12 04:58:25 1.66.4.6 +++ src/sys/netinet/udp_usrreq.c 2000/06/28 03:01:17 1.67 @@ -1,4 +1,4 @@ -/* $NetBSD: udp_usrreq.c,v 1.66.4.6 2004/04/12 04:58:25 jmc Exp $ */ +/* $NetBSD: udp_usrreq.c,v 1.67 2000/06/28 03:01:17 mrg Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -79,7 +79,7 @@ #include #include -#include +#include #include #include @@ -110,11 +110,6 @@ #endif #endif -#include "faith.h" -#if defined(NFAITH) && NFAITH > 0 -#include -#endif - #include #ifdef IPSEC @@ -237,7 +232,7 @@ udp_input(m, va_alist) */ len = ntohs((u_int16_t)uh->uh_ulen); if (ip->ip_len != iphlen + len) { - if (ip->ip_len < iphlen + len || len < sizeof(struct udphdr)) { + if (ip->ip_len < iphlen + len) { udpstat.udps_badlen++; goto bad; } @@ -330,21 +325,23 @@ udp6_input(mp, offp, proto) struct udphdr *uh; u_int32_t plen, ulen; -#ifndef PULLDOWN_TEST - IP6_EXTHDR_CHECK(m, off, sizeof(struct udphdr), IPPROTO_DONE); -#endif - ip6 = mtod(m, struct ip6_hdr *); - #if defined(NFAITH) && 0 < NFAITH - if (faithprefix(&ip6->ip6_dst)) { - /* send icmp6 host unreach? */ - m_freem(m); - return IPPROTO_DONE; + if (m->m_pkthdr.rcvif) { + if (m->m_pkthdr.rcvif->if_type == IFT_FAITH) { + /* send icmp6 host unreach? */ + m_freem(m); + return IPPROTO_DONE; + } } #endif udp6stat.udp6s_ipackets++; +#ifndef PULLDOWN_TEST + IP6_EXTHDR_CHECK(m, off, sizeof(struct udphdr), IPPROTO_DONE); +#endif + + ip6 = mtod(m, struct ip6_hdr *); /* check for jumbogram is done in ip6_input. we can trust pkthdr.len */ plen = m->m_pkthdr.len - off; #ifndef PULLDOWN_TEST @@ -379,11 +376,9 @@ udp6_input(mp, offp, proto) /* * Checksum extended UDP header and data. */ - if (uh->uh_sum == 0) { + if (uh->uh_sum == 0) udp6stat.udp6s_nosum++; - goto bad; - } - if (in6_cksum(m, IPPROTO_UDP, off, ulen) != 0) { + else if (in6_cksum(m, IPPROTO_UDP, off, ulen) != 0) { udp6stat.udp6s_badsum++; goto bad; } @@ -559,7 +554,7 @@ udp4_realinput(src, dst, m, off) dst4 = &dst->sin_addr; dport = &dst->sin_port; - if (IN_MULTICAST(dst4->s_addr) || + if (IN_MULTICAST(src4->s_addr) || in_broadcast(*dst4, m->m_pkthdr.rcvif)) { struct inpcb *last; /* @@ -708,7 +703,7 @@ udp6_realinput(af, src, dst, m, off) u_int16_t *sport, *dport; int rcvcnt; struct in6_addr *src6, *dst6; - struct in_addr *dst4; + struct in_addr *src4; struct in6pcb *in6p; rcvcnt = 0; @@ -723,10 +718,10 @@ udp6_realinput(af, src, dst, m, off) sport = &src->sin6_port; dst6 = &dst->sin6_addr; dport = &dst->sin6_port; - dst4 = (struct in_addr *)&dst->sin6_addr.s6_addr32[12]; + src4 = (struct in_addr *)&src->sin6_addr.s6_addr32[12]; if (IN6_IS_ADDR_MULTICAST(dst6) - || (af == AF_INET && IN_MULTICAST(dst4->s_addr))) { + || (af == AF_INET && IN_MULTICAST(src4->s_addr))) { struct in6pcb *last; /* * Deliver a multicast or broadcast datagram to *all* sockets @@ -930,7 +925,7 @@ udp_input(m, va_alist) */ len = ntohs((u_int16_t)uh->uh_ulen); if (ip->ip_len != iphlen + len) { - if (ip->ip_len < iphlen + len || len < sizeof(struct udphdr)) { + if (ip->ip_len < iphlen + len) { udpstat.udps_badlen++; goto bad; } @@ -1259,10 +1254,7 @@ udp_output(m, va_alist) udpstat.udps_opackets++; #ifdef IPSEC - if (ipsec_setsocket(m, inp->inp_socket) != 0) { - error = ENOBUFS; - goto release; - } + ipsec_setsocket(m, inp->inp_socket); #endif /*IPSEC*/ return (ip_output(m, inp->inp_options, &inp->inp_route,