Many network related crashes need some deeper inspection at an mbuf. I got sick and tired of x /x-ing an mbuf and disect the headers. I wrote a simple function that prints all important fields in human readable form. Just "call m_print(0xdeadbeef)" to print the mbuf at 0xdeadbeef.
Example output: ddb> call m_print(0x4000a0a6a00) mbuf 0x4000a0a6a00 m_type: 1 m_flags: b<M_EXT,M_PKTHDR,M_CLUSTER> m_next: 0x0 m_nextpkt: 0x0 m_data: 0x40009bed802 m_len: 3736059631 m_dat: 0x4000a0a6a20 m_pktdat: 0x4000a0a6a58 m_pkthdr.len: 0 m_ptkhdr.rdomain: 0 m_ptkhdr.rcvif: 0x4000109e048 m_ptkhdr.tags: 0x0 m_pkthdr.tagsset: 0 m_pkthdr.csum_flags: 0 m_pkthdr.ether_vtag: 0 m_pkthdr.pf.flags: 0 m_pkthdr.pf.hdr: 0x0 m_pkthdr.pf.statekey: 0x0 m_pkthdr.pf.qid: 0 m_pkthdr.pf.tag: 0 m_pkthdr.pf.routed: 0 m_ext.ext_buf: 0x40009bed800 m_ext.ext_size: 2048 m_ext.ext_type: -558907665 m_ext.ext_backend: 0 m_ext.ext_ifp: 0x4000109e048 m_ext.ext_free: 0x0 m_ext.ext_arg: 0x0 m_ext.ext_nextref: 0x4000a0a6a00 m_ext.ext_prevref: 0x4000a0a6a00 -- :wq Claudio Index: uipc_mbuf.c =================================================================== RCS file: /cvs/src/sys/kern/uipc_mbuf.c,v retrieving revision 1.145 diff -u -p -r1.145 uipc_mbuf.c --- uipc_mbuf.c 5 Oct 2010 13:29:40 -0000 1.145 +++ uipc_mbuf.c 28 Oct 2010 11:58:11 -0000 @@ -1370,3 +1370,49 @@ m_dup_pkthdr(struct mbuf *to, struct mbu return (0); } + +#ifdef DDB +void m_print(struct mbuf *); + +void +m_print(struct mbuf *m) +{ + printf("mbuf %p\n", m); + printf("m_type: %hi\tm_flags: %b\n", m->m_type, m->m_flags, + "\20\1M_EXT\2M_PKTHDR\3M_EOR\4M_CLUSTER\5M_PROTO1\6M_VLANTAG" + "\7M_LOOP\10M_FILDROP\11M_BCAST\12M_MCAST\13M_CONF\14M_AUTH" + "\15M_TUNNEL\16M_AUTH_AH\17M_LINK0"); + printf("m_next: %p\tm_nextpkt: %p\n", m->m_next, m->m_nextpkt); + printf("m_data: %p\tm_len: %u\n", m->m_data, m->m_len); + printf("m_dat: %p m_pktdat: %p\n", m->m_dat, m->m_pktdat); + if (m->m_flags & M_PKTHDR) { + printf("m_pkthdr.len: %i\tm_ptkhdr.rcvif: %p\t" + "m_ptkhdr.rdomain: %u\n", m->m_pkthdr.len, + m->m_pkthdr.rcvif, m->m_pkthdr.rdomain); + printf("m_ptkhdr.tags: %p\tm_pkthdr.tagsset: %hx\n", + SLIST_FIRST(&m->m_pkthdr.tags), m->m_pkthdr.tagsset); + printf("m_pkthdr.csum_flags: %hx\tm_pkthdr.ether_vtag: %hu\n", + m->m_pkthdr.csum_flags, m->m_pkthdr.ether_vtag); + printf("m_pkthdr.pf.flags: %b\n", + m->m_pkthdr.pf.flags, "\20\1GENERATED\2FRAGCACHE" + "\3TRANSLATE_LOCALHOST\4DIVERTED\5DIVERTED_PACKET" + "\6PF_TAG_REROUTE"); + printf("m_pkthdr.pf.hdr: %p\tm_pkthdr.pf.statekey: %p\n", + m->m_pkthdr.pf.hdr, m->m_pkthdr.pf.statekey); + printf("m_pkthdr.pf.qid:\t%u m_pkthdr.pf.tag: %hu\n", + m->m_pkthdr.pf.qid, m->m_pkthdr.pf.tag); + printf("m_pkthdr.pf.routed: %hhx\n", m->m_pkthdr.pf.routed); + } + if (m->m_flags & M_EXT) { + printf("m_ext.ext_buf: %p\tm_ext.ext_size: %u\n", + m->m_ext.ext_buf, m->m_ext.ext_size); + printf("m_ext.ext_type: %x\tm_ext.ext_backend: %i\n", + m->m_ext.ext_type, m->m_ext.ext_backend); + printf("m_ext.ext_ifp: %p\n", m->m_ext.ext_ifp); + printf("m_ext.ext_free: %p\tm_ext.ext_arg: %p\n", + m->m_ext.ext_free, m->m_ext.ext_arg); + printf("m_ext.ext_nextref: %p\tm_ext.ext_prevref: %p\n", + m->m_ext.ext_nextref, m->m_ext.ext_prevref); + } +} +#endif