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.248 retrieving revision 1.250.4.3 diff -u -p -r1.248 -r1.250.4.3 --- src/sys/netinet/ip_input.c 2007/03/25 20:12:20 1.248 +++ src/sys/netinet/ip_input.c 2007/10/02 18:29:19 1.250.4.3 @@ -1,4 +1,4 @@ -/* $NetBSD: ip_input.c,v 1.248 2007/03/25 20:12:20 liamjfoy Exp $ */ +/* $NetBSD: ip_input.c,v 1.250.4.3 2007/10/02 18:29:19 joerg Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -98,7 +98,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: ip_input.c,v 1.248 2007/03/25 20:12:20 liamjfoy Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ip_input.c,v 1.250.4.3 2007/10/02 18:29:19 joerg Exp $"); #include "opt_inet.h" #include "opt_gateway.h" @@ -904,9 +904,7 @@ ours: */ IPQ_LOCK(); hash = IPREASS_HASH(ip->ip_src.s_addr, ip->ip_id); - /* XXX LIST_FOREACH(fp, &ipq[hash], ipq_q) */ - for (fp = LIST_FIRST(&ipq[hash]); fp != NULL; - fp = LIST_NEXT(fp, ipq_q)) { + LIST_FOREACH(fp, &ipq[hash], ipq_q) { if (ip->ip_id == fp->ipq_id && in_hosteq(ip->ip_src, fp->ipq_src) && in_hosteq(ip->ip_dst, fp->ipq_dst) && @@ -1015,7 +1013,6 @@ found: /* XXX error stat??? */ error = EINVAL; DPRINTF(("ip_input: no SP, packet discarded\n"));/*XXX*/ - goto bad; } splx(s); if (error) @@ -1674,23 +1671,18 @@ bad: struct in_ifaddr * ip_rtaddr(struct in_addr dst) { - if (!in_hosteq(dst, satocsin(rtcache_getdst(&ipforward_rt))->sin_addr)) - rtcache_free(&ipforward_rt); - else - rtcache_check(&ipforward_rt); - - if (ipforward_rt.ro_rt == NULL) { - struct sockaddr_in *sin = satosin(&ipforward_rt.ro_dst); - - sin->sin_family = AF_INET; - sin->sin_len = sizeof(*sin); - sin->sin_addr = dst; - - rtcache_init(&ipforward_rt); - if (ipforward_rt.ro_rt == NULL) - return NULL; - } - return ifatoia(ipforward_rt.ro_rt->rt_ifa); + struct rtentry *rt; + union { + struct sockaddr dst; + struct sockaddr_in dst4; + } u; + + sockaddr_in_init(&u.dst4, &dst, 0); + + if ((rt = rtcache_lookup(&ipforward_rt, &u.dst)) == NULL) + return NULL; + + return ifatoia(rt->rt_ifa); } /* @@ -1841,6 +1833,10 @@ ip_forward(struct mbuf *m, int srcrt) int error, type = 0, code = 0, destmtu = 0; struct mbuf *mcopy; n_long dest; + union { + struct sockaddr dst; + struct sockaddr_in dst4; + } u; /* * We are now in the output path. @@ -1869,25 +1865,11 @@ ip_forward(struct mbuf *m, int srcrt) return; } - if (!in_hosteq(ip->ip_dst, - satocsin(rtcache_getdst(&ipforward_rt))->sin_addr)) - rtcache_free(&ipforward_rt); - else - rtcache_check(&ipforward_rt); - if (ipforward_rt.ro_rt == NULL) { - struct sockaddr_in *sin = satosin(&ipforward_rt.ro_dst); - - sin->sin_family = AF_INET; - sin->sin_len = sizeof(*sin); - sin->sin_addr = ip->ip_dst; - - rtcache_init(&ipforward_rt); - if (ipforward_rt.ro_rt == NULL) { - icmp_error(m, ICMP_UNREACH, ICMP_UNREACH_NET, dest, 0); - return; - } + sockaddr_in_init(&u.dst4, &ip->ip_dst, 0); + if ((rt = rtcache_lookup(&ipforward_rt, &u.dst)) == NULL) { + icmp_error(m, ICMP_UNREACH, ICMP_UNREACH_NET, dest, 0); + return; } - rt = ipforward_rt.ro_rt; /* * Save at most 68 bytes of the packet in case @@ -1910,7 +1892,7 @@ ip_forward(struct mbuf *m, int srcrt) */ if (rt->rt_ifp == m->m_pkthdr.rcvif && (rt->rt_flags & (RTF_DYNAMIC|RTF_MODIFIED)) == 0 && - !in_nullhost(satosin(rt_key(rt))->sin_addr) && + !in_nullhost(satocsin(rt_getkey(rt))->sin_addr) && ipsendredirects && !srcrt) { if (rt->rt_ifa && (ip->ip_src.s_addr & ifatoia(rt->rt_ifa)->ia_subnetmask) == @@ -2096,13 +2078,12 @@ ip_savecontrol(struct inpcb *inp, struct if (inp->inp_flags & INP_RECVIF) { struct sockaddr_dl sdl; - sdl.sdl_len = offsetof(struct sockaddr_dl, sdl_data[0]); - sdl.sdl_family = AF_LINK; - sdl.sdl_index = m->m_pkthdr.rcvif ? - m->m_pkthdr.rcvif->if_index : 0; - sdl.sdl_nlen = sdl.sdl_alen = sdl.sdl_slen = 0; - *mp = sbcreatecontrol((void *) &sdl, sdl.sdl_len, - IP_RECVIF, IPPROTO_IP); + sockaddr_dl_init(&sdl, sizeof(sdl), + (m->m_pkthdr.rcvif != NULL) + ? m->m_pkthdr.rcvif->if_index + : 0, + 0, NULL, 0, NULL, 0); + *mp = sbcreatecontrol(&sdl, sdl.sdl_len, IP_RECVIF, IPPROTO_IP); if (*mp) mp = &(*mp)->m_next; }