Module Name: src Committed By: bouyer Date: Fri Apr 4 12:53:04 UTC 2014
Modified Files: src/sys/netinet: ip_carp.c Log Message: Proper MBUFTRACE handling. Without it, ec_tx_mowner, ec_rx_mowner and ifp->if_mowner would be used uninitialised. To generate a diff of this commit: cvs rdiff -u -r1.52 -r1.53 src/sys/netinet/ip_carp.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/netinet/ip_carp.c diff -u src/sys/netinet/ip_carp.c:1.52 src/sys/netinet/ip_carp.c:1.53 --- src/sys/netinet/ip_carp.c:1.52 Tue Feb 25 18:30:12 2014 +++ src/sys/netinet/ip_carp.c Fri Apr 4 12:53:04 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: ip_carp.c,v 1.52 2014/02/25 18:30:12 pooka Exp $ */ +/* $NetBSD: ip_carp.c,v 1.53 2014/04/04 12:53:04 bouyer Exp $ */ /* $OpenBSD: ip_carp.c,v 1.113 2005/11/04 08:11:54 mcbride Exp $ */ /* @@ -28,9 +28,10 @@ */ #include "opt_inet.h" +#include "opt_mbuftrace.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ip_carp.c,v 1.52 2014/02/25 18:30:12 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ip_carp.c,v 1.53 2014/04/04 12:53:04 bouyer Exp $"); /* * TODO: @@ -159,6 +160,13 @@ static percpu_t *carpstat_percpu; #define CARP_STATINC(x) _NET_STATINC(carpstat_percpu, x) +#ifdef MBUFTRACE +static struct mowner carp_proto_mowner_rx = MOWNER_INIT("carp", "rx"); +static struct mowner carp_proto_mowner_tx = MOWNER_INIT("carp", "tx"); +static struct mowner carp_proto6_mowner_rx = MOWNER_INIT("carp6", "rx"); +static struct mowner carp_proto6_mowner_tx = MOWNER_INIT("carp6", "tx"); +#endif + struct carp_if { TAILQ_HEAD(, carp_softc) vhif_vrs; int vhif_nvrs; @@ -464,6 +472,7 @@ carp_proto_input(struct mbuf *m, ...) va_end(ap); CARP_STATINC(CARP_STAT_IPACKETS); + MCLAIM(m, &carp_proto_mowner_rx); if (!carp_opts[CARPCTL_ALLOW]) { m_freem(m); @@ -533,6 +542,7 @@ carp6_proto_input(struct mbuf **mp, int u_int len; CARP_STATINC(CARP_STAT_IPACKETS6); + MCLAIM(m, &carp_proto6_mowner_rx); if (!carp_opts[CARPCTL_ALLOW]) { m_freem(m); @@ -801,6 +811,19 @@ carp_clone_create(struct if_clone *ifc, carp_set_enaddr(sc); LIST_INIT(&sc->sc_ac.ec_multiaddrs); bpf_attach(ifp, DLT_EN10MB, ETHER_HDR_LEN); +#ifdef MBUFTRACE + strlcpy(sc->sc_ac.ec_tx_mowner.mo_name, ifp->if_xname, + sizeof(sc->sc_ac.ec_tx_mowner.mo_name)); + strlcpy(sc->sc_ac.ec_tx_mowner.mo_descr, "tx", + sizeof(sc->sc_ac.ec_tx_mowner.mo_descr)); + strlcpy(sc->sc_ac.ec_rx_mowner.mo_name, ifp->if_xname, + sizeof(sc->sc_ac.ec_rx_mowner.mo_name)); + strlcpy(sc->sc_ac.ec_rx_mowner.mo_descr, "rx", + sizeof(sc->sc_ac.ec_rx_mowner.mo_descr)); + MOWNER_ATTACH(&sc->sc_ac.ec_tx_mowner); + MOWNER_ATTACH(&sc->sc_ac.ec_rx_mowner); + ifp->if_mowner = &sc->sc_ac.ec_tx_mowner; +#endif return (0); } @@ -966,6 +989,7 @@ carp_send_ad(void *v) /* XXX maybe less ? */ goto retry_later; } + MCLAIM(m, &carp_proto_mowner_tx); len = sizeof(*ip) + sizeof(ch); m->m_pkthdr.len = len; m->m_pkthdr.rcvif = NULL; @@ -1046,6 +1070,7 @@ carp_send_ad(void *v) /* XXX maybe less ? */ goto retry_later; } + MCLAIM(m, &carp_proto6_mowner_tx); len = sizeof(*ip6) + sizeof(ch); m->m_pkthdr.len = len; m->m_pkthdr.rcvif = NULL; @@ -2250,6 +2275,12 @@ carp_init(void) { sysctl_net_inet_carp_setup(NULL); +#ifdef MBUFTRACE + MOWNER_ATTACH(&carp_proto_mowner_rx); + MOWNER_ATTACH(&carp_proto_mowner_tx); + MOWNER_ATTACH(&carp_proto6_mowner_rx); + MOWNER_ATTACH(&carp_proto6_mowner_tx); +#endif } static void