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