mbuf header /* header at beginning of each mbuf: */ struct m_hdr { struct mbuf *mh_next; /* next mbuf in chain */ struct mbuf *mh_nextpkt; /* next chain in queue/record */ caddr_t mh_data; /* location of data */ u_int mh_len; /* amount of data in this mbuf */ short mh_type; /* type of data in this mbuf */ u_short mh_flags; /* flags; see below */ }; mbufs can get chained so data is split over them 3 different kinds of mbufs holding data itself external data storage (M_EXT set in flags) packet header (M_PKTHDR set in flags)