The check in if_ether.c for carp here does not make any sense. There are two possible cases. - parent interface without IP address - parent interface with IP address
In the first case the carp mac-address will always be used. So no need to do the check. In the 2nd case the parent interface mac-address will be used and that is also always correct since we clone from there. There is no way that the ifp and the rt->rt_ifp are not the same in this case. So just remove this code and get rid of one rt_ifp. -- :wq Claudio Index: if_ether.c =================================================================== RCS file: /cvs/src/sys/netinet/if_ether.c,v retrieving revision 1.193 diff -u -p -r1.193 if_ether.c --- if_ether.c 2 Dec 2015 13:29:26 -0000 1.193 +++ if_ether.c 2 Dec 2015 17:29:45 -0000 @@ -401,11 +401,6 @@ arpresolve(struct ifnet *ifp, struct rte arprequest(ifp, &satosin(rt->rt_ifa->ifa_addr)->sin_addr.s_addr, &satosin(dst)->sin_addr.s_addr, -#if NCARP > 0 - (rt->rt_ifp->if_type == IFT_CARP) ? - ((struct arpcom *) rt->rt_ifp->if_softc - )->ac_enaddr : -#endif ac->ac_enaddr); else { rt->rt_flags |= RTF_REJECT;