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 <net/if.h>
 #include <net/if_dl.h>
 #include <net/if_llatbl.h>
+#include <net/if_types.h>
 #include <net/netisr.h>
 #include <net/raw_cb.h>
 #include <net/route.h>
@@ -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;
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to