Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 20 Oct 2013 11:55:39 +0000 (UTC)
From:      Andre Oppermann <andre@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r256783 - in user/andre/mbuf_staging: kern sys
Message-ID:  <201310201155.r9KBtdSY075847@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: andre
Date: Sun Oct 20 11:55:39 2013
New Revision: 256783
URL: http://svnweb.freebsd.org/changeset/base/256783

Log:
  Pimp m_print() to tell us everything about an mbuf, its headers and
  contents.
  
  Change m_print() to only print information about the one specified
  mbuf.
  
  Add m_printm() to print information on every mbuf in a chain.

Modified:
  user/andre/mbuf_staging/kern/uipc_mbuf.c
  user/andre/mbuf_staging/sys/mbuf.h

Modified: user/andre/mbuf_staging/kern/uipc_mbuf.c
==============================================================================
--- user/andre/mbuf_staging/kern/uipc_mbuf.c	Sun Oct 20 11:19:37 2013	(r256782)
+++ user/andre/mbuf_staging/kern/uipc_mbuf.c	Sun Oct 20 11:55:39 2013	(r256783)
@@ -1216,40 +1216,74 @@ m_getptr(struct mbuf *m, int loc, int *o
 	return (NULL);
 }
 
+/*
+ * Print the mbuf header fields and contents.
+ * XXXAO: Add printing of interface name.
+ */
 void
 m_print(const struct mbuf *m, int maxlen)
 {
-	int len;
-	int pdata;
-	const struct mbuf *m2;
+	struct m_tag *mt;
+#define	P	printf
 
-	if (m == NULL) {
-		printf("mbuf: %p\n", m);
-		return;
-	}
+	P("mbuf: %p\n", m);
+	P("  m_next: %p, m_nextpkt: %p\n", m->m_next, m->m_nextpkt);
+	P("  m_data: %p, m_len: %i, m_type: %#2x\n", m->m_data, m->m_len,
+	    m->m_type);
+	P("  m_flags: %b\n", m->m_flags, M_FLAG_PRINTF);
+
+	if (m->m_flags & M_PKTHDR) {
+	P("  m_pkthdr:\n");
+	P("    rcvif: %p, len: %i, fibnum: %#4hx\n", m->m_pkthdr.rcvif,
+	    m->m_pkthdr.len, m->m_pkthdr.fibnum);
+	P("    flowid: %#x, rsstype: %#2hhx, cosqos: %#2hhx\n",
+	    m->m_pkthdr.flowid, m->m_pkthdr.rsstype, m->m_pkthdr.cosqos);
+	P("    csum_flags: %b\n", (int)m->m_pkthdr.csum_flags, CSUM_BITS);
+	P("    l2hlen: %hhu, l3hlen: %hhu, l4hlen: %hhu, l5hlen: %hhu\n",
+	    m->m_pkthdr.l2hlen, m->m_pkthdr.l3hlen, m->m_pkthdr.l4hlen,
+	    m->m_pkthdr.l5hlen);
+	P("    PH_per: %p, PH_loc: %p\n", m->m_pkthdr.PH_per.ptr,
+	    m->m_pkthdr.PH_loc.ptr);
+	P("    ether_vtag: %#4hx, tso_segsz: %i, csum_phsum: %#4hx\n",
+	    m->m_pkthdr.ether_vtag, m->m_pkthdr.tso_segsz,
+	    m->m_pkthdr.csum_phsum);
+	SLIST_FOREACH(mt, &m->m_pkthdr.tags, m_tag_link) {
+	P("  m_tag: %p\n", mt);
+	P("   m_tag_id: %#4hx, m_tag_len: %hu, m_tag_cookie: %#8x, m_tag_free: %p\n",
+	    mt->m_tag_id, mt->m_tag_len, mt->m_tag_cookie, mt->m_tag_free);
+	} /* SLIST_FOREACH */
+	} /* M_PKTHDR */
 
-	if (m->m_flags & M_PKTHDR)
-		len = m->m_pkthdr.len;
-	else
-		len = -1;
-	m2 = m;
-	while (m2 != NULL && (len == -1 || len)) {
-		pdata = m2->m_len;
-		if (maxlen != -1 && pdata > maxlen)
-			pdata = maxlen;
-		printf("mbuf: %p len: %d, next: %p, %b%s", m2, m2->m_len,
-		    m2->m_next, m2->m_flags, "\20\20freelist\17skipfw"
-		    "\11proto5\10proto4\7proto3\6proto2\5proto1\4rdonly"
-		    "\3eor\2pkthdr\1ext", pdata ? "" : "\n");
-		if (pdata)
-			printf(", %*D\n", pdata, (u_char *)m2->m_data, "-");
-		if (len != -1)
-			len -= m2->m_len;
-		m2 = m2->m_next;
+	if (m->m_flags & M_EXT) {
+	P("  m_ext:\n");
+	P("    ext_buf: %p, ext_size: %i, ext_type: %#2x\n", m->m_ext.ext_buf,
+	    m->m_ext.ext_size, m->m_ext.ext_type);
+	P("    ext_flags: %b\n", m->m_ext.ext_flags, EXT_FLAG_BITS);
+	P("    ref_cnt: %p, *ref_cnt: %u\n", m->m_ext.ref_cnt,
+	    (m->m_ext.ref_cnt ? *(m->m_ext.ref_cnt) : 0));
+	P("    ext_free: %p, ext_arg1: %p, ext_arg2: %p\n", m->m_ext.ext_free,
+	    m->m_ext.ext_arg1, m->m_ext.ext_arg2);
+	} /* M_EXT */
+
+	maxlen = imin(maxlen, m->m_len);
+	if (maxlen > 0) {
+	P("\n  m_data:\n");
+	P("%*D\n", maxlen, (u_char *)m->m_data, "-");
 	}
-	if (len > 0)
-		printf("%d bytes unaccounted for.\n", len);
-	return;
+
+	P("\n");
+#undef P
+}
+
+/*
+ * Print the mbuf header fields and contents for entire chain of mbufs.
+ */
+void
+m_printm(const struct mbuf *m, int maxlen)
+{
+
+	for (; m != NULL; maxlen -= m->m_len, m = m->m_next)
+		m_print(m, maxlen);
 }
 
 u_int

Modified: user/andre/mbuf_staging/sys/mbuf.h
==============================================================================
--- user/andre/mbuf_staging/sys/mbuf.h	Sun Oct 20 11:19:37 2013	(r256782)
+++ user/andre/mbuf_staging/sys/mbuf.h	Sun Oct 20 11:55:39 2013	(r256783)
@@ -656,6 +656,7 @@ int		 m_mbuftouio(struct uio *, struct m
 void		 m_move_pkthdr(struct mbuf *, struct mbuf *);
 struct mbuf	*m_prepend(struct mbuf *, int, int);
 void		 m_print(const struct mbuf *, int);
+void		 m_printm(const struct mbuf *, int);
 struct mbuf	*m_pulldown(struct mbuf *, int, int, int *);
 struct mbuf	*m_pullup(struct mbuf *, int);
 int		 m_sanity(struct mbuf *, int);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201310201155.r9KBtdSY075847>