Date: Wed, 21 Nov 2012 19:57:57 +0000 (UTC) From: Andre Oppermann <andre@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r243377 - in user/andre/tcp_workqueue/sys: kern sys Message-ID: <201211211957.qALJvw10020593@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: andre Date: Wed Nov 21 19:57:57 2012 New Revision: 243377 URL: http://svnweb.freebsd.org/changeset/base/243377 Log: Extend m_print() to inform about all aspects of an mbuf, its header, external storage, packet header, m_tags and offloading features. A function callback is provided for protocols to also print parsed mbuf data contents. Add bit definition for various mbuf related flags for %b printing. Modified: user/andre/tcp_workqueue/sys/kern/uipc_mbuf.c user/andre/tcp_workqueue/sys/sys/mbuf.h Modified: user/andre/tcp_workqueue/sys/kern/uipc_mbuf.c ============================================================================== --- user/andre/tcp_workqueue/sys/kern/uipc_mbuf.c Wed Nov 21 18:38:56 2012 (r243376) +++ user/andre/tcp_workqueue/sys/kern/uipc_mbuf.c Wed Nov 21 19:57:57 2012 (r243377) @@ -1623,15 +1623,19 @@ m_getptr(struct mbuf *m, int loc, int *o return (NULL); } +/* + * Print all information on an mbuf. + */ void -m_print(const struct mbuf *m, int maxlen) +m_print(const struct mbuf *m, int maxlen, void (*func)(const struct mbuf *)) { int len; int pdata; const struct mbuf *m2; + struct m_tag *mt; if (m == NULL) { - printf("mbuf: %p\n", m); + printf("mbuf = %p\n", m); return; } @@ -1639,23 +1643,86 @@ m_print(const struct mbuf *m, int maxlen len = m->m_pkthdr.len; else len = -1; - m2 = m; - while (m2 != NULL && (len == -1 || len)) { + + for (m2 = m; m2 != NULL && (len == -1 || len); m2 = m2->m_next) { 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"); + + printf("mbuf = 0x%p\n" + "\t m_next = 0x%p\n" + "\t m_data = 0x%p\n" + "\t m_len = %u\n" + "\tm_flags = 0x%8X\n" + "\tm_flags = %b\n" + "\t m_type = %u\n", + m2, m2->m_next, m2->m_data, m2->m_len, m2->m_flags, + (m2->m_flags & 0xFFFFFF), M_FLAG_BITS, m2->m_type); + + if (m2->m_flags & M_EXT) { + printf(" m_ext:\n" + "\t ext_buf = 0x%p\n" + "\text_free = 0x%p\n" + "\text_arg1 = 0x%p\n" + "\text_arg2 = 0x%p\n" + "\text_size = %u\n" + "\t ref_cnt = %u (0x%p)\n" + "\text_type = %X %b\n", + m2->m_ext.ext_buf, m2->m_ext.ext_free, + m2->m_ext.ext_arg1, m2->m_ext.ext_arg2, + m2->m_ext.ext_size, (*m2->m_ext.ref_cnt), + m2->m_ext.ref_cnt, (m2->m_type & 0xFF), + (m2->m_type & 0xF00), M_EXT_TYPE_BITS); + } + + if (m2->m_flags & M_PKTHDR) { + printf(" m_pkthdr:\n" + "\t rcvif = 0x%p" + "\t header = 0x%p\n" + "\t len = %u\n" + "\t flowid = 0x%X\n" + "\t csum_flags = 0x%8X\n" + "\t csum_flags = %b\n" + "\tcsum_l2hlen = %u\n" + "\tcsum_l3hlen = %u\n" + "\tcsum_l4hlen = %u\n" + "\t tso_segsz = %u\n" + "\t ether_vtag = 0x%X\n" + "\t hash_type = 0x%X\n", + m2->m_pkthdr.rcvif, m2->m_pkthdr.header, + m2->m_pkthdr.len, m2->m_pkthdr.flowid, + m2->m_pkthdr.csum_flags, + m2->m_pkthdr.csum_flags, M_CSUM_FLAG_BITS, + m2->m_pkthdr.csum_l2hlen, m2->m_pkthdr.csum_l3hlen, + m2->m_pkthdr.csum_l4hlen, m2->m_pkthdr.tso_segsz, + m2->m_pkthdr.ether_vtag, M_HASHTYPE_GET(m2)); + + for (mt = SLIST_FIRST(&m2->m_pkthdr.tags); mt != NULL; + mt = SLIST_NEXT(mt, m_tag_link)) { + printf(" m_tag:\n" + "\t m_tag_id = %u %b\n" + "\t m_tag_len = %u\n" + "\tm_tag_cookie = 0x%X\n" + "\t m_tag_free = 0x%p\n", + (mt->m_tag_id & 0xFF), + (mt->m_tag_id & 0xF00), MTAG_FLAG_BITS, + mt->m_tag_len, mt->m_tag_cookie, + mt->m_tag_free); + printf("\tm_tag data:\n"); + printf("\t %*D\n", + mt->m_tag_len, (u_char *)(mt + 1), " "); + } + } + if (pdata) - printf(", %*D\n", pdata, (u_char *)m2->m_data, "-"); + printf(", %*D\n", pdata, (u_char *)m2->m_data, " "); if (len != -1) len -= m2->m_len; - m2 = m2->m_next; } if (len > 0) printf("%d bytes unaccounted for.\n", len); + if (func != NULL) + (*func)(m); return; } Modified: user/andre/tcp_workqueue/sys/sys/mbuf.h ============================================================================== --- user/andre/tcp_workqueue/sys/sys/mbuf.h Wed Nov 21 18:38:56 2012 (r243376) +++ user/andre/tcp_workqueue/sys/sys/mbuf.h Wed Nov 21 19:57:57 2012 (r243377) @@ -216,6 +216,12 @@ struct mbuf { #define M_FLOWID 0x00400000 /* deprecated: flowid is valid */ #define M_HASHTYPEBITS 0x0F000000 /* mask of bits holding flowid hash type */ +#define M_FLAG_BITS \ + "\20\27FLOWID\26PROTO8\25PROTO7\24PROTO6\23NOFREE\22PROMISC" \ + "\21VLANTAG\20FREELIST\17SKIP_FIREWALL\16LASTFRAG\15FIRSTFRAG" \ + "\14FRAG\13MCAST\12BCAST\11PROTO5\10PROTO4\7PROTO3\6PROTO2" \ + "\5PROTO1\4RDONLY\3EOR\2PKTHDR\1EXT" /* for use with m_print */ + /* * For RELENG_{6,7} steal these flags for limited multiple routing table * support. In RELENG_8 and beyond, use just one flag and a tag. @@ -284,6 +290,9 @@ struct mbuf { #define EXT_DISPOSABLE 300 /* can throw this buffer away w/page flipping */ #define EXT_EXTREF 400 /* has externally maintained ref_cnt ptr */ +#define M_EXT_TYPE_BITS \ + "\20\16ext_EXTREF\15ext_DISPOSABLE\14ext_MOD_TYPE\13ext_NET_DRV" + /* * Flags indicating hw checksum support and sw checksum requirements. This * field can be directly tested against if_data.ifi_hwassist. @@ -376,6 +385,13 @@ struct mbuf { #define CSUM_IP6_TSO 0x00440000 /* IPv6/TSO */ #define CSUM_IP6_SCO 0x00880000 /* SCTP chunk offload */ +#define M_CSUM_FLAG_BITS \ + "\20\40csum_L4_VALID\37csum_L4_CALC\36csum_L3_VALID\35csum_L3_CALC" \ + "\30csum_IP6_SCO\27csum_IP6_TSO\26csum_IP6_UFO\25csum_IP6_FRAG0" \ + "\24csum_IP6_SCTP\23csum_IP6_TCP\22csum_IP6_UDP\21csum_IP6" \ + "\14csum_IP_SCO\13csum_IP_TSO\12csum_IP_UFO\11csum_IP_FRAG0" \ + "\10csum_IP_SCTP\7csum_IP_TCP\6csum_IP_UDP\5csum_IP" + /* Definition compatiblity with < 20121118, goes away after tree pruning */ #define CSUM_UDP CSUM_IP_UDP #define CSUM_TCP CSUM_IP_TCP @@ -1006,7 +1022,8 @@ u_int m_length(struct mbuf *, struct m int m_mbuftouio(struct uio *, struct mbuf *, int); 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_print(const struct mbuf *, int, + void (*)(const struct mbuf *)); struct mbuf *m_pulldown(struct mbuf *, int, int, int *); struct mbuf *m_pullup(struct mbuf *, int); int m_sanity(struct mbuf *, int); @@ -1065,6 +1082,9 @@ struct mbuf *m_unshare(struct mbuf *, in */ #define MTAG_PERSISTENT 0x800 +#define MTAG_FLAG_BITS \ + "\20\14mtag_PERSISTENT" + #define PACKET_TAG_NONE 0 /* Nadda */ /* Packet tags for use with PACKET_ABI_COMPAT. */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201211211957.qALJvw10020593>