mbuf_tags(9)
NAME
mbuf_tags - a framework for generic packet attributes
SYNOPSIS
#include <sys/mbuf.h> struct m_tag * m_tag_alloc(u_int32_t cookie, int type, int len, int wait); struct m_tag * m_tag_copy(struct m_tag *t, int how); int m_tag_copy_chain(struct mbuf *to, struct mbuf *from, int how); void m_tag_delete(struct mbuf *m, struct m_tag *t); void m_tag_delete_chain(struct mbuf *m, struct m_tag *t); void m_tag_delete_nonpersistent(struct mbuf *m); struct m_tag * m_tag_find(struct mbuf *m, int type, struct m_tag *start); struct m_tag * m_tag_first(struct mbuf *m); void m_tag_free(struct m_tag *t); struct m_tag * m_tag_get(int type, int len, int wait); void m_tag_init(struct mbuf *m); struct m_tag * m_tag_locate(struct mbuf *m, u_int32_t cookie, int type, struct m_tag *t); struct m_tag * m_tag_next(struct mbuf *m, struct m_tag *t); void m_tag_prepend(struct mbuf *m, struct m_tag *t); void m_tag_unlink(struct mbuf *m, struct m_tag *t);
DESCRIPTION
- Mbuf tags allow additional meta-data to be associated with
- in-flight packets by providing a mechanism for the tagging of addi
- tional kernel memory onto packet header mbufs. Tags are maintained in
- chains off of the mbuf(9) header, and maintained using a series of API
- calls to allocate, search, and delete tags. Tags are identified using an
- ID and cookie that uniquely identify a class of data tagged onto
- the packet, and may contain an arbitrary amount of additional storage. Typ
- ical uses of mbuf tags include the storage of VLAN tags as described in
- vlan(4), Mandatory Access Control (MAC) labels as described in
- mac(9), IPsec policy information as described in ipsec(4), and packet filter
- tags used by pf(4).
- Tags will be maintained across a variety of operations, in
- cluding the copying of packet headers using facilities such as
M_COPY_PKTHDR
- M_MOVE_PKTHDR(). Any tags associated with an mbuf header
- will be automatically freed when the mbuf is freed, although some sub
- systems will wish to delete the tags prior to that time.
- Packet tags are used by different kernel APIs to keep track
- of operations done or scheduled to happen to packets. Each packet tag can
- be distinguished by its type and cookie. The cookie is used to iden
- tify a specific module or API. The packet tags are attached to mbuf
- packet headers.
- The first sizeof(struct m_tag) bytes of a tag contain a
- struct m_tag:
- struct m_tag {
- SLIST_ENTRY(m_tag) m_tag_link; /* List of
- packet tags */ u_int16_t m_tag_id; /* Tag ID */ u_int16_t m_tag_len; /* Length of
- data */ u_int32_t m_tag_cookie; /* ABI/Mod
- ule ID */ void (*m_tag_free)(struct m_tag
- *);
- };
- The m_tag_link field is used to link tags together (see
- queue(3) for more details). The m_tag_id, m_tag_len and m_tag_cookie fields
- are set to type, length, and cookie, respectively. m_tag_free points
- to m_tag_free_default(). Following this structure are
- m_tag_len bytes of space that can be used to store tag-specific information.
- Addressing this data region may be tricky. A safe way is embedding
- struct m_tag into a private data structure, as follows:
- struct foo {
struct m_tag tag; ...
- }; struct foo *p = (struct foo *)m_tag_alloc(...); struct m_tag *mtag = &p->tag;
- Note that OpenBSD does not support cookies, it needs
- m_tag_id to be globally unique. To keep compatibility with OpenBSD, a cookie MTAG_ABI_COMPAT is provided along with some compatibility
- functions. When writing an OpenBSD compatible code, one should be care
- ful not to take already used tag type. Tag types are defined in
- Packet Tag Manipulation Functions
- m_tag_alloc(cookie, type, len, wait) Allocate a new tag of type type and cookie cookie with
- len bytes of space following the tag header itself. The wait argu
- ment is passed directly to malloc(9). If successful, m_tag_alloc()
- returns a memory buffer of (len + sizeof(struct m_tag)) bytes.
- Otherwise, NULL is returned. A compatibility function m_tag_get() is
- also provided.
- m_tag_copy(tag, how) Allocate a copy of tag. The how argument is passed
- directly to m_tag_alloc(). The return values are the same as in
- m_tag_alloc().
- m_tag_copy_chain(tombuf, frommbuf, how) Allocate and copy all tags from mbuf frommbuf to mbuf
- tombuf. Returns 1 on success, and 0 on failure. In the latter
- case, mbuf tombuf loses all its tags, even previously present.
- m_tag_delete(mbuf, tag) Remove tag from mbuf's list and free it.
- m_tag_delete_chain(mbuf, tag) Remove and free a packet tag chain, starting from tag.
- If tag is NULL, all tags are deleted.
- m_tag_delete_nonpersistent(mbuf) Traverse mbuf's tags and delete those which do not
- have the MTAG_PERSISTENT flag set.
- m_tag_first(mbuf) Return the first tag associated with mbuf.
- m_tag_free(tag) Free tag using its m_tag_free method. The
- m_tag_free_default() function is used by default.
- m_tag_init(mbuf) Initialize the tag storage for packet mbuf.
- m_tag_locate(mbuf, cookie, type, tag) Search for a tag defined by type and cookie in mbuf,
- starting from position specified by tag. If the latter is NULL,
- then search through the whole list. Upon success, a pointer to
- the first found tag is returned. In either case, NULL is returned. A
- compatibility function m_tag_find() is also provided.
- m_tag_next(mbuf, tag) Return tag next to tag in mbuf. If absent, NULL is
- returned.
- m_tag_prepend(mbuf, tag) Add the new tag tag at the head of the tag list for
- packet mbuf.
- m_tag_unlink(mbuf, tag) Remove tag tag from the list of tags of packet mbuf.
CODE REFERENCES
- The tag-manipulating code is contained in the file
- sys/kern/uipc_mbuf2.c. Inlined functions are defined in
SEE ALSO
HISTORY
- The packet tags first appeared in OpenBSD 2.9 and were writ
- ten by Angelos D. Keromytis <angelos@openbsd.org>.
- BSD November 18, 2004