On 28/05/17(Sun) 16:02, Florian Riehm wrote: > [...] > Ok, new diff below.
I overlooked something! See below: > Index: sys/netinet/ip_carp.c > =================================================================== > RCS file: /cvs/src/sys/netinet/ip_carp.c,v > retrieving revision 1.310 > diff -u -p -r1.310 ip_carp.c > --- sys/netinet/ip_carp.c 27 May 2017 21:55:52 -0000 1.310 > +++ sys/netinet/ip_carp.c 28 May 2017 13:50:25 -0000 > @@ -1422,8 +1422,23 @@ carp_input(struct ifnet *ifp0, struct mb > (IFF_UP|IFF_RUNNING)) > continue; > > - if (carp_vhe_match(sc, eh->ether_dhost)) > + if (carp_vhe_match(sc, eh->ether_dhost)) { > + /* > + * These packets look like layer 2 multicast but they > + * are unicast at layer 3. With help of the tag the > + * mbuf's M_MCAST flag can be removed by carp_lsdrop() > + * after we have passed layer 2. > + */ > + if (sc->sc_balancing == CARP_BAL_IP) { > + struct m_tag *mtag; > + mtag = m_tag_get(PACKET_TAG_CARP_BAL_IP, 0, > + M_NOWAIT); > + if (mtag == NULL) > + return (0); If the CPU failed to allocate memory, then we cannot return 0. This means this packet is not for carp(4). Instead you should free the packet and return 1. > + m_tag_prepend(m, mtag); > + } > break; > + } > } > > if (sc == NULL) { > @@ -1456,13 +1471,6 @@ carp_input(struct ifnet *ifp0, struct mb > return (0); > } > > - /* > - * Clear mcast if received on a carp IP balanced address. > - */ > - if (sc->sc_balancing == CARP_BAL_IP && > - ETHER_IS_MULTICAST(eh->ether_dhost)) > - *(eh->ether_dhost) &= ~0x01; > - > ml_enqueue(&ml, m); > if_input(&sc->sc_if, &ml); > SRPL_LEAVE(&sr);