The mailinglist script droped the attachment from Matthew (esx-carp.diff):

Index: ip_carp.c
===================================================================
RCS file: /home/ncvs/src/sys/netinet/ip_carp.c,v
retrieving revision 1.52.2.3
diff -u -r1.52.2.3 ip_carp.c
--- ip_carp.c   9 May 2009 00:35:38 -0000       1.52.2.3
+++ ip_carp.c   26 Jul 2009 16:53:24 -0000
@@ -143,6 +143,8 @@
     &carp_opts[CARPCTL_LOG], 0, "log bad carp packets");
 SYSCTL_INT(_net_inet_carp, CARPCTL_ARPBALANCE, arpbalance, CTLFLAG_RW,
     &carp_opts[CARPCTL_ARPBALANCE], 0, "balance arp responses");
+SYSCTL_INT(_net_inet_carp, CARPCTL_DROPECHOED, drop_echoed, CTLFLAG_RW,
+    &carp_opts[CARPCTL_DROPECHOED], 0, "drop packets echoed to sender");
 SYSCTL_INT(_net_inet_carp, OID_AUTO, suppress_preempt, CTLFLAG_RD,
     &carp_suppress_preempt, 0, "Preemption is suppressed");

@@ -552,6 +554,28 @@
                return;
        }

+       /*
+        * verify that the source address is not valid
+        * for the interface it was received on. this
+        * tends to happen with VMWare ESX vSwitches.
+        */
+       if (carp_opts[CARPCTL_DROPECHOED]) {
+               struct ifnet *ifp = m->m_pkthdr.rcvif;
+               struct ifaddr *ifa;
+               IF_ADDR_LOCK(ifp);
+               TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {
+                       struct in_addr in4;
+                       in4 = ifatoia(ifa)->ia_addr.sin_addr;
+                       if (ifa->ifa_addr->sa_family == AF_INET &&
+                           in4.s_addr == ip->ip_src.s_addr) {
+                               m_freem(m);
+                               IF_ADDR_UNLOCK(ifp);
+                               return;
+                       }
+               }
+               IF_ADDR_UNLOCK(ifp);
+       }
+
        /* verify that the IP TTL is 255.  */
        if (ip->ip_ttl != CARP_DFLTTL) {
                carpstats.carps_badttl++;
@@ -644,6 +668,28 @@
                return (IPPROTO_DONE);
        }

+       /*
+        * verify that the source address is not valid
+        * for the interface it was received on. this
+        * tends to happen with VMWare ESX vSwitches.
+        */
+       if (carp_opts[CARPCTL_DROPECHOED]) {
+               struct ifnet *ifp = m->m_pkthdr.rcvif;
+               struct ifaddr *ifa;
+               IF_ADDR_LOCK(ifp);
+               TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {
+                       struct in6_addr in6;
+                       in6 = ifatoia6(ifa)->ia_addr.sin6_addr;
+                       if (ifa->ifa_addr->sa_family == AF_INET6 &&
+                           memcmp(&in6, &ip6->ip6_src, sizeof(in6)) == 0) {
+                               m_freem(m);
+                               IF_ADDR_UNLOCK(ifp);
+                               return (IPPROTO_DONE);
+                       }
+               }
+               IF_ADDR_UNLOCK(ifp);
+       }
+
        /* verify that the IP TTL is 255 */
        if (ip6->ip6_hlim != CARP_DFLTTL) {
                carpstats.carps_badttl++;
Index: ip_carp.h
===================================================================
RCS file: /home/ncvs/src/sys/netinet/ip_carp.h,v
retrieving revision 1.3
diff -u -r1.3 ip_carp.h
--- ip_carp.h   1 Dec 2006 18:37:41 -0000       1.3
+++ ip_carp.h   26 Jul 2009 16:53:24 -0000
@@ -1,4 +1,4 @@
-/*     $FreeBSD: src/sys/netinet/ip_carp.h,v 1.3 2006/12/01 18:37:41 imp Exp $
*/
+/*     $FreeBSD: src/sys/netinet/ip_carp.h,v 1.3.8.1 2009/04/15 03:14:26 
kensmith
Exp $   */
 /*     $OpenBSD: ip_carp.h,v 1.8 2004/07/29 22:12:15 mcbride Exp $     */

 /*
@@ -140,7 +140,8 @@
 #define        CARPCTL_LOG             3       /* log bad packets */
 #define        CARPCTL_STATS           4       /* statistics (read-only) */
 #define        CARPCTL_ARPBALANCE      5       /* balance arp responses */
-#define        CARPCTL_MAXID           6
+#define        CARPCTL_DROPECHOED      6       /* drop packets echoed to the 
sender */
+#define        CARPCTL_MAXID           7

 #define        CARPCTL_NAMES { \
        { 0, 0 }, \

Reply via email to