From owner-svn-src-stable-8@FreeBSD.ORG Fri Jun 18 03:31:34 2010 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id DD5E31065675; Fri, 18 Jun 2010 03:31:33 +0000 (UTC) (envelope-from qingli@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id CB6748FC19; Fri, 18 Jun 2010 03:31:33 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o5I3VXVS035153; Fri, 18 Jun 2010 03:31:33 GMT (envelope-from qingli@svn.freebsd.org) Received: (from qingli@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o5I3VXtr035144; Fri, 18 Jun 2010 03:31:33 GMT (envelope-from qingli@svn.freebsd.org) Message-Id: <201006180331.o5I3VXtr035144@svn.freebsd.org> From: Qing Li Date: Fri, 18 Jun 2010 03:31:33 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r209277 - in stable/8/sys: net netinet X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 18 Jun 2010 03:31:34 -0000 Author: qingli Date: Fri Jun 18 03:31:33 2010 New Revision: 209277 URL: http://svn.freebsd.org/changeset/base/209277 Log: MFC r208553 This patch fixes the problem where proxy ARP entries cannot be added over the if_ng interface. Modified: stable/8/sys/net/if.c stable/8/sys/net/if_var.h stable/8/sys/net/route.c stable/8/sys/net/rtsock.c stable/8/sys/netinet/in.c stable/8/sys/netinet/in_pcb.c stable/8/sys/netinet/ip_options.c stable/8/sys/netinet/ip_output.c Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) stable/8/sys/dev/xen/xenpci/ (props changed) stable/8/sys/geom/sched/ (props changed) Modified: stable/8/sys/net/if.c ============================================================================== --- stable/8/sys/net/if.c Fri Jun 18 01:17:16 2010 (r209276) +++ stable/8/sys/net/if.c Fri Jun 18 03:31:33 2010 (r209277) @@ -1636,7 +1636,7 @@ done: * is most specific found. */ struct ifaddr * -ifa_ifwithnet(struct sockaddr *addr) +ifa_ifwithnet(struct sockaddr *addr, int ignore_ptp) { struct ifnet *ifp; struct ifaddr *ifa; @@ -1668,7 +1668,8 @@ ifa_ifwithnet(struct sockaddr *addr) if (ifa->ifa_addr->sa_family != af) next: continue; - if (af == AF_INET && ifp->if_flags & IFF_POINTOPOINT) { + if (af == AF_INET && + ifp->if_flags & IFF_POINTOPOINT && !ignore_ptp) { /* * This is a bit broken as it doesn't * take into account that the remote end may Modified: stable/8/sys/net/if_var.h ============================================================================== --- stable/8/sys/net/if_var.h Fri Jun 18 01:17:16 2010 (r209276) +++ stable/8/sys/net/if_var.h Fri Jun 18 03:31:33 2010 (r209277) @@ -875,7 +875,7 @@ struct ifaddr *ifa_ifwithaddr(struct soc int ifa_ifwithaddr_check(struct sockaddr *); struct ifaddr *ifa_ifwithbroadaddr(struct sockaddr *); struct ifaddr *ifa_ifwithdstaddr(struct sockaddr *); -struct ifaddr *ifa_ifwithnet(struct sockaddr *); +struct ifaddr *ifa_ifwithnet(struct sockaddr *, int); struct ifaddr *ifa_ifwithroute(int, struct sockaddr *, struct sockaddr *); struct ifaddr *ifa_ifwithroute_fib(int, struct sockaddr *, struct sockaddr *, u_int); Modified: stable/8/sys/net/route.c ============================================================================== --- stable/8/sys/net/route.c Fri Jun 18 01:17:16 2010 (r209276) +++ stable/8/sys/net/route.c Fri Jun 18 03:31:33 2010 (r209277) @@ -519,7 +519,7 @@ rtredirect_fib(struct sockaddr *dst, } /* verify the gateway is directly reachable */ - if ((ifa = ifa_ifwithnet(gateway)) == NULL) { + if ((ifa = ifa_ifwithnet(gateway, 0)) == NULL) { error = ENETUNREACH; goto out; } @@ -686,7 +686,7 @@ ifa_ifwithroute_fib(int flags, struct so ifa = ifa_ifwithdstaddr(gateway); } if (ifa == NULL) - ifa = ifa_ifwithnet(gateway); + ifa = ifa_ifwithnet(gateway, 0); if (ifa == NULL) { struct rtentry *rt = rtalloc1_fib(gateway, 0, RTF_RNH_LOCKED, fibnum); if (rt == NULL) @@ -797,7 +797,7 @@ rt_getifa_fib(struct rt_addrinfo *info, */ if (info->rti_ifp == NULL && ifpaddr != NULL && ifpaddr->sa_family == AF_LINK && - (ifa = ifa_ifwithnet(ifpaddr)) != NULL) { + (ifa = ifa_ifwithnet(ifpaddr, 0)) != NULL) { info->rti_ifp = ifa->ifa_ifp; ifa_free(ifa); } Modified: stable/8/sys/net/rtsock.c ============================================================================== --- stable/8/sys/net/rtsock.c Fri Jun 18 01:17:16 2010 (r209276) +++ stable/8/sys/net/rtsock.c Fri Jun 18 03:31:33 2010 (r209277) @@ -55,6 +55,7 @@ #include #include #include +#include #include #include #include @@ -673,12 +674,22 @@ route_output(struct mbuf *m, struct sock * another search to retrieve the prefix route of * the local end point of the PPP link. */ - if ((rtm->rtm_flags & RTF_ANNOUNCE) && - (rt->rt_ifp->if_flags & IFF_POINTOPOINT)) { + if (rtm->rtm_flags & RTF_ANNOUNCE) { struct sockaddr laddr; - rt_maskedcopy(rt->rt_ifa->ifa_addr, - &laddr, - rt->rt_ifa->ifa_netmask); + + if (rt->rt_ifp != NULL && + rt->rt_ifp->if_type == IFT_PROPVIRTUAL) { + struct ifaddr *ifa; + + ifa = ifa_ifwithnet(info.rti_info[RTAX_DST], 1); + if (ifa != NULL) + rt_maskedcopy(ifa->ifa_addr, + &laddr, + ifa->ifa_netmask); + } else + rt_maskedcopy(rt->rt_ifa->ifa_addr, + &laddr, + rt->rt_ifa->ifa_netmask); /* * refactor rt and no lock operation necessary */ Modified: stable/8/sys/netinet/in.c ============================================================================== --- stable/8/sys/netinet/in.c Fri Jun 18 01:17:16 2010 (r209276) +++ stable/8/sys/netinet/in.c Fri Jun 18 03:31:33 2010 (r209277) @@ -1379,8 +1379,9 @@ in_lltable_rtcheck(struct ifnet *ifp, u_ /* XXX rtalloc1 should take a const param */ rt = rtalloc1(__DECONST(struct sockaddr *, l3addr), 0, 0); - if (rt == NULL || (rt->rt_flags & RTF_GATEWAY) || - ((rt->rt_ifp != ifp) && !(flags & LLE_PUB))) { + if (rt == NULL || (!(flags & LLE_PUB) && + ((rt->rt_flags & RTF_GATEWAY) || + (rt->rt_ifp != ifp)))) { #ifdef DIAGNOSTIC log(LOG_INFO, "IPv4 address: \"%s\" is not on the network\n", inet_ntoa(((const struct sockaddr_in *)l3addr)->sin_addr)); Modified: stable/8/sys/netinet/in_pcb.c ============================================================================== --- stable/8/sys/netinet/in_pcb.c Fri Jun 18 01:17:16 2010 (r209276) +++ stable/8/sys/netinet/in_pcb.c Fri Jun 18 03:31:33 2010 (r209277) @@ -590,7 +590,7 @@ in_pcbladdr(struct inpcb *inp, struct in ia = ifatoia(ifa_ifwithdstaddr((struct sockaddr *)sin)); if (ia == NULL) - ia = ifatoia(ifa_ifwithnet((struct sockaddr *)sin)); + ia = ifatoia(ifa_ifwithnet((struct sockaddr *)sin, 0)); if (ia == NULL) { error = ENETUNREACH; goto done; @@ -707,7 +707,7 @@ in_pcbladdr(struct inpcb *inp, struct in ia = ifatoia(ifa_ifwithdstaddr(sintosa(&sain))); if (ia == NULL) - ia = ifatoia(ifa_ifwithnet(sintosa(&sain))); + ia = ifatoia(ifa_ifwithnet(sintosa(&sain), 0)); if (ia == NULL) ia = ifatoia(ifa_ifwithaddr(sintosa(&sain))); Modified: stable/8/sys/netinet/ip_options.c ============================================================================== --- stable/8/sys/netinet/ip_options.c Fri Jun 18 01:17:16 2010 (r209276) +++ stable/8/sys/netinet/ip_options.c Fri Jun 18 03:31:33 2010 (r209277) @@ -230,7 +230,7 @@ dropit: #define INA struct in_ifaddr * #define SA struct sockaddr * if ((ia = (INA)ifa_ifwithdstaddr((SA)&ipaddr)) == NULL) - ia = (INA)ifa_ifwithnet((SA)&ipaddr); + ia = (INA)ifa_ifwithnet((SA)&ipaddr, 0); } else /* XXX MRT 0 for routing */ ia = ip_rtaddr(ipaddr.sin_addr, M_GETFIB(m)); Modified: stable/8/sys/netinet/ip_output.c ============================================================================== --- stable/8/sys/netinet/ip_output.c Fri Jun 18 01:17:16 2010 (r209276) +++ stable/8/sys/netinet/ip_output.c Fri Jun 18 03:31:33 2010 (r209277) @@ -247,7 +247,7 @@ again: isbroadcast = 1; } else if (flags & IP_ROUTETOIF) { if ((ia = ifatoia(ifa_ifwithdstaddr(sintosa(dst)))) == NULL && - (ia = ifatoia(ifa_ifwithnet(sintosa(dst)))) == NULL) { + (ia = ifatoia(ifa_ifwithnet(sintosa(dst), 0))) == NULL) { IPSTAT_INC(ips_noroute); error = ENETUNREACH; goto bad;