Author: qingli
Date: Sat Aug 15 00:04:12 2009
New Revision: 196235
URL: http://svn.freebsd.org/changeset/base/196235

Log:
  MFC   196234
  
  In function ip_output(), the cached route is flushed when there is a
  mismatch between the cached entry and the intended destination. The
  cached rtentry{} is flushed but the associated llentry{} is not. This
  causes the wrong destination MAC address being used in the output
  packets. The fix is to flush the llentry{} when rtentry{} is cleared.
  
  Reviewed by:  kmacy, rwatson
  Approved by:  re

Modified:
  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/ata/   (props changed)
  stable/8/sys/dev/cxgb/   (props changed)
  stable/8/sys/dev/xen/netfront/   (props changed)
  stable/8/sys/dev/xen/xenpci/   (props changed)
  stable/8/sys/modules/dtrace/dtnfsclient/   (props changed)
  stable/8/sys/modules/ip6_mroute_mod/   (props changed)
  stable/8/sys/modules/ipmi/ipmi_linux/   (props changed)
  stable/8/sys/netinet/ip_output.c
  stable/8/sys/netinet/ipfw/ip_dummynet.c   (props changed)
  stable/8/sys/netinet/ipfw/ip_fw2.c   (props changed)
  stable/8/sys/netinet/ipfw/ip_fw_nat.c   (props changed)
  stable/8/sys/netinet/ipfw/ip_fw_pfil.c   (props changed)
  stable/8/sys/netipx/spx_reass.c   (props changed)
  stable/8/sys/xen/evtchn.h   (props changed)
  stable/8/sys/xen/hypervisor.h   (props changed)
  stable/8/sys/xen/xen_intr.h   (props changed)

Modified: stable/8/sys/netinet/ip_output.c
==============================================================================
--- stable/8/sys/netinet/ip_output.c    Fri Aug 14 23:44:59 2009        
(r196234)
+++ stable/8/sys/netinet/ip_output.c    Sat Aug 15 00:04:12 2009        
(r196235)
@@ -53,6 +53,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/ucred.h>
 
 #include <net/if.h>
+#include <net/if_llatbl.h>
 #include <net/netisr.h>
 #include <net/pfil.h>
 #include <net/route.h>
@@ -201,9 +202,12 @@ again:
        if (ro->ro_rt && ((ro->ro_rt->rt_flags & RTF_UP) == 0 ||
                          dst->sin_family != AF_INET ||
                          dst->sin_addr.s_addr != ip->ip_dst.s_addr)) {
-               if (!nortfree)
+               if (!nortfree) {
                        RTFREE(ro->ro_rt);
+                       LLE_FREE(ro->ro_lle);
+               }
                ro->ro_rt = (struct rtentry *)NULL;
+               ro->ro_lle = (struct llentry *)NULL;
        }
 #ifdef IPFIREWALL_FORWARD
        if (ro->ro_rt == NULL && fwd_tag == NULL) {
_______________________________________________
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