September 7, 2004 M_TAG 9

### NAME

m_tag, m_tag_get, m_tag_free, m_tag_prepend, m_tag_unlink, m_tag_delete, m_tag_delete_chain, m_tag_delete_nonpersistent, m_tag_find, m_tag_copy, m_tag_copy_chain, m_tag_init, m_tag_first, m_tag_next - mbuf tagging interfaces

### SYNOPSIS

```struct` `m_tag``*` m_tag_get(```int type``, int len``, int wait`)
```void` m_tag_free(```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`)
```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 *`)
```struct` `m_tag``*` m_tag_find(```struct mbuf *m``, int type``, struct m_tag *t`)
```struct` `m_tag``*` m_tag_copy(```struct m_tag *m`)
```int` m_tag_copy_chain(```struct mbuf *to``, struct mbuf *from`)
```void` m_tag_init(```struct mbuf *m`)
```struct` `m_tag``*` m_tag_first(```struct mbuf *m`)
```struct` `m_tag``*` m_tag_next(```struct mbuf *m``, struct m_tag *t`)

### DESCRIPTION

The m_tag interface is used to ``tag'' mbufs.

### FUNCTIONS

m_tag_get(```type``, len``, wait`)
  Allocate an mbuf tag. ```type` is one of the ```PACKET_TAG_` macros. ```len` is the size of the data associated with the tag, in bytes. ```wait` is either ```M_WAITOK` or ```M_NOWAIT`.

m_tag_free(```t`)
  Free the mbuf tag ```t`.

m_tag_prepend(```m``, t`)
  Prepend the mbuf tag ```t` to the mbuf ```m`. ```t` will become the first tag of the mbuf ```m`. When ```m` is freed, ```t` will also be freed.

m_tag_unlink(```m``, t`)
  Unlink the mbuf tag ```t` from the mbuf ```m`.

m_tag_delete(```m``, t`)
  The same as m_tag_unlink(``) followed by m_tag_free(``).

m_tag_delete_chain(```m``, t`)
  Unlink and free mbuf tags beginning with the mbuf tag ```t` from the mbuf ```m`. If ```t` is ```NULL`, m_tag_delete_chain(``) unlinks and frees all mbuf tags associated with the mbuf ```m`.

m_tag_delete_nonpersistent(```m`)
  Unlink and free all non persistent tags associated with the mbuf ```m`.

m_tag_find(```m``, type``, t`)
  Find an mbuf tag with type ```type` after the mbuf tag ```t` in the tag chain associated with the mbuf ```m`. If ```t` is ```NULL`, search from the first mbuf tag. If an mbuf tag is found, return a pointer to it. Otherwise return ```NULL`.

m_tag_copy(```t`)
  Copy an mbuf tag ```t`. Return a new mbuf tag on success. Otherwise return ```NULL`.

m_tag_copy_chain(```to``, from`)
  Copy all mbuf tags associated with the mbuf ```from` to the mbuf ```to`. If ```to` already has any mbuf tags, they will be unlinked and freed beforehand. Return 1 on success. Otherwise return 0.

m_tag_init(```m`)
  Initialize mbuf tag chain of the mbuf ```m`.

m_tag_first(```m`)
  Return the first mbuf tag associated with the mbuf ```m`. Return ```NULL` if no mbuf tags are found.

m_tag_next(```m``, t`)
  Return the next mbuf tag after ```t` associated with the mbuf ```m`. Return ```NULL` if ```t` is the last tag in the chain.

### CODE REFERENCES

This section describes places within the NetBSD source tree where actual code implementing the mbuf tagging interfaces can be found. All pathnames are relative to ```/usr/src`.

The mbuf tagging interfaces are implemented within the file ```sys/kern/uipc_mbuf2.c`.

The ```PACKET_TAG_` macros are defined in the file ```sys/sys/mbuf.h`.

### SEE ALSO

intro(9), malloc(9), mbuf(9)

### BUGS

The semantics of the term "persistent tag" are vague.