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.145 retrieving revision 1.146 diff -u -p -r1.145 -r1.146 --- src/sys/netinet/udp_usrreq.c 2005/12/11 12:24:58 1.145 +++ src/sys/netinet/udp_usrreq.c 2006/01/21 00:15:36 1.146 @@ -1,4 +1,4 @@ -/* $NetBSD: udp_usrreq.c,v 1.145 2005/12/11 12:24:58 christos Exp $ */ +/* $NetBSD: udp_usrreq.c,v 1.146 2006/01/21 00:15:36 rpaulo Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -61,7 +61,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: udp_usrreq.c,v 1.145 2005/12/11 12:24:58 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: udp_usrreq.c,v 1.146 2006/01/21 00:15:36 rpaulo Exp $"); #include "opt_inet.h" #include "opt_ipsec.h" @@ -106,6 +106,7 @@ __KERNEL_RCSID(0, "$NetBSD: udp_usrreq.c #include #include #include +#include #endif #ifndef INET6 @@ -575,19 +576,16 @@ udp6_input(struct mbuf **mp, int *offp, /* * Construct source and dst sockaddrs. - * Note that ifindex (s6_addr16[1]) is already filled. */ bzero(&src, sizeof(src)); src.sin6_family = AF_INET6; src.sin6_len = sizeof(struct sockaddr_in6); - /* KAME hack: recover scopeid */ - (void)in6_recoverscope(&src, &ip6->ip6_src, m->m_pkthdr.rcvif); + src.sin6_addr = ip6->ip6_src; src.sin6_port = uh->uh_sport; bzero(&dst, sizeof(dst)); dst.sin6_family = AF_INET6; dst.sin6_len = sizeof(struct sockaddr_in6); - /* KAME hack: recover scopeid */ - (void)in6_recoverscope(&dst, &ip6->ip6_dst, m->m_pkthdr.rcvif); + dst.sin6_addr = ip6->ip6_dst; dst.sin6_port = uh->uh_dport; if (udp6_realinput(AF_INET6, &src, &dst, m, off) == 0) { @@ -845,7 +843,7 @@ udp6_realinput(int af, struct sockaddr_i { u_int16_t sport, dport; int rcvcnt; - struct in6_addr src6, dst6; + struct in6_addr src6, *dst6; const struct in_addr *dst4; struct inpcb_hdr *inph; struct in6pcb *in6p; @@ -858,13 +856,18 @@ udp6_realinput(int af, struct sockaddr_i if (src->sin6_family != AF_INET6 || dst->sin6_family != AF_INET6) goto bad; - in6_embedscope(&src6, src, NULL, NULL); + src6 = src->sin6_addr; + if (sa6_recoverscope(src) != 0) { + /* XXX: should be impossible. */ + goto bad; + } sport = src->sin6_port; - in6_embedscope(&dst6, dst, NULL, NULL); + dport = dst->sin6_port; dst4 = (struct in_addr *)&dst->sin6_addr.s6_addr[12]; + dst6 = &dst->sin6_addr; - if (IN6_IS_ADDR_MULTICAST(&dst6) || + if (IN6_IS_ADDR_MULTICAST(dst6) || (af == AF_INET && IN_MULTICAST(dst4->s_addr))) { /* * Deliver a multicast or broadcast datagram to *all* sockets @@ -897,10 +900,11 @@ udp6_realinput(int af, struct sockaddr_i if (in6p->in6p_lport != dport) continue; if (!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_laddr)) { - if (!IN6_ARE_ADDR_EQUAL(&in6p->in6p_laddr, &dst6)) + if (!IN6_ARE_ADDR_EQUAL(&in6p->in6p_laddr, + dst6)) continue; } else { - if (IN6_IS_ADDR_V4MAPPED(&dst6) && + if (IN6_IS_ADDR_V4MAPPED(dst6) && (in6p->in6p_flags & IN6P_IPV6_V6ONLY)) continue; } @@ -934,11 +938,11 @@ udp6_realinput(int af, struct sockaddr_i /* * Locate pcb for datagram. */ - in6p = in6_pcblookup_connect(&udbtable, &src6, sport, - &dst6, dport, 0); + in6p = in6_pcblookup_connect(&udbtable, &src6, sport, dst6, + dport, 0); if (in6p == 0) { ++udpstat.udps_pcbhashmiss; - in6p = in6_pcblookup_bind(&udbtable, &dst6, dport, 0); + in6p = in6_pcblookup_bind(&udbtable, dst6, dport, 0); if (in6p == 0) return rcvcnt; }