MBUF_TAGS(9) | FreeBSD Kernel Developer's Manual | MBUF_TAGS(9) |
名称
mbuf_tags — 一般的なパケット属性のためのフレームワーク書式
#include < sys/mbuf.h> struct m_tag *
m_tag_alloc( uint32_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, uint32_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);
解説
mbuf タグは、パケットヘッダ mbuf への追加カーネルメモリのタグ付けのためのメカニズムを提供することによって送信中のパケットに関連しているメタデータの追加を可能とします。タグは、 mbuf(9) ヘッダとリンクが切れた状態で維持され、タグを割り付け、検索、削除するための一連の API 要求を使用して維持されます。タグは、パケットにタグ付けをされたデータのクラスをユニークに特定する ID とクッキーを使用して識別され、そして、任意の量の追加記憶域を含みます。 mbuf タグの典型的な用途は、 mac(9) で説明される Mandatory Access Control (MAC) ラベル、 ipsec(4) で説明される IPsec ポリシ情報、と pf(4) によって使用されたパケットフィルタタグを含みます。タグは、 M_COPY_PKTHDR() または M_MOVE_PKTHDR() のような機能を使用してパケットヘッダのコピーを含んで、さまざまな操作にわたって保守されます。 mbuf ヘッダに関連しているどんなタグも、mbuf が解放されるとき、自動的に解放されますが、いくつかのサブシステムはその時以前のタグを削除したいでしょう。
パケットタグは、パケットに発生する終了したかスケジュールされる操作の経過を追うために、異なったカーネル API によって使用されます。それぞれのパケットタグは、そのタイプとクッキーによって識別することができます。クッキーは、特有のモジュールか API を識別するために使用されます。パケットタグは mbuf パケットヘッダにアタッチされます。
タグの最初の sizeof( struct m_tag) バイトは struct m_tag を含んでいます:
struct m_tag { SLIST_ENTRY(m_tag) m_tag_link; /* パケットタグのリスト */ uint16_t m_tag_id; /* タグ ID */ uint16_t m_tag_len; /* データの長さ */ uint32_t m_tag_cookie; /* ABI/モジュール ID */ void (*m_tag_free)(struct m_tag *); };
m_tag_link フィールドは、タグを一緒にリンクするために使用されます (詳細については queue(3) を参照)。 m_tag_id, m_tag_len と m_tag_cookie フィールドはそれぞれタイプ、長さとクッキーに設定されます。 m_tag_free は m_tag_free_default() を指します。続くこの構造体は、タグ特有の情報を格納するために使用することができる m_tag_len バイトの空間です。このデータ領域のアドレスを指定することはトリッキです。安全な方法は、次のように struct m_tag をプライベートデータ構造体に組み込むことです:
struct foo { struct m_tag tag; ... }; struct foo *p = (struct foo *)m_tag_alloc(...); struct m_tag *mtag = &p->tag;
OpenBSD はクッキーをサポートしません、 m_tag_id はグローバルでユニークであることが必要なことに注意してください。 OpenBSD で互換性を保つために、クッキー MTAG_ABI_COMPAT はいくつかの互換性のある関数と共に提供されます。 OpenBSD 互換コードを書くとき、既に使用されたタグタイプを取らないように慎重であるべきです。タグタイプは < sys/mbuf.h> で定義されます。
パケットタグ操作関数
- m_tag_alloc( cookie, type, len, wait)
- タイプ type の新しいタグとタグヘッダ自体に続いて len バイトの空白がある cookie を割り付けます。 wait 引数は直接 malloc(9) に渡されます。成功すれば、 m_tag_alloc() は ( len + sizeof( struct m_tag)) バイトのメモリバッファを返します。そうでなければ、 NULL が返されます。互換性のある関数 m_tag_get() も提供されます。
- m_tag_copy( tag, how)
- tag のコピーを割り付けます。 how 引数は直接 m_tag_alloc() に渡されます。返り値は m_tag_alloc() と同じです。
- m_tag_copy_chain( tombuf, frommbuf, how)
- mbuf frommbuf から mbuf tombuf まですべてのタグを割り付けて、コピーします。成功すれば 1 を返し、失敗すれば 0 を返します。後者の場合には、mbuf tombuf は以前に存在してすべてのタグさえ失います。
- m_tag_delete( mbuf, tag)
- mbuf のリストから tag を取り除いて、それを解放します。
- m_tag_delete_chain( mbuf, tag)
- tag から始めて、パケットタグチェーンを取り除き、解放します。 tag が NULL であるなら、すべてのタグは削除されます。
- m_tag_delete_nonpersistent( mbuf)
- mbuf のタグを横断して、そして、 MTAG_PERSISTENT フラグが設定されていないものを削除します。
- m_tag_first( mbuf)
- mbuf に関連している最初のタグを返します。
- m_tag_free( tag)
- m_tag_free 方法を使用して、 tag を解放します。 m_tag_free_default() 関数はデフォルトで使用されます。
- m_tag_init( mbuf)
- パケット mbuf のためにタグ記憶域を初期化します。
- m_tag_locate( mbuf, cookie, type, tag)
- tag によって指定された位置から始めて、 mbuf の type と cookie によって定義されたタグを検索します。後者が NULL であるなら、全体のリストをくまなく検索します。成功すれば、最初に見たかったタグへのポインタが返されます。どちらの場合でも、 NULL が返されます。互換性のある関数 m_tag_find() も提供されます。
- m_tag_next( mbuf, tag)
- mbuf の tag の次のタグを返します。それがないなら、 NULL が返されます。
- m_tag_prepend( mbuf, tag)
- パケット mbuf のためのタグリストの先頭に新しいタグ tag を追加します。
- m_tag_unlink( mbuf, tag)
- パケット mbuf のタグのリストからタグ tag を取り除きます。
コード参照
タグを操作するコードはファイル sys/kern/uipc_mbuf2.c に含まれています。インライン関数は < sys/mbuf.h> で定義されています。歴史
パケットタグは、 OpenBSD 2.9 ではじめて登場し、 <angelos@openbsd.org>によって書かれました。January 12, 2008 | FreeBSD |