MDCHAIN(9) | FreeBSD Kernel Developer's Manual | MDCHAIN(9) |
名称
mdchain, md_initm, md_done, md_append_record, md_next_record, md_get_uint8, md_get_uint16, md_get_uint16be, md_get_uint16le, md_get_uint32, md_get_uint32be, md_get_uint32le, md_get_int64, md_get_int64be, md_get_int64le, md_get_mem, md_get_mbuf, md_get_uio — mbuf チェーンを様々なデータタイプに分析する関数の集合書式
options LIBMCHAINkldload libmchain
#include < sys/param.h>
#include < sys/uio.h>
#include < sys/mchain.h>
void
md_initm( struct mdchain *mdp, struct mbuf *m);
void
md_done( struct mdchain *mdp);
void
md_append_record( struct mdchain *mdp, struct mbuf *top);
int
md_next_record( struct mdchain *mdp);
int
md_get_uint8( struct mdchain *mdp, uint8_t *x);
int
md_get_uint16( struct mdchain *mdp, uint16_t *x);
int
md_get_uint16be( struct mdchain *mdp, uint16_t *x);
int
md_get_uint16le( struct mdchain *mdp, uint16_t *x);
int
md_get_uint32( struct mdchain *mdp, uint32_t *x);
int
md_get_uint32be( struct mdchain *mdp, uint32_t *x);
int
md_get_uint32le( struct mdchain *mdp, uint32_t *x);
int
md_get_int64( struct mdchain *mdp, int64_t *x);
int
md_get_int64be( struct mdchain *mdp, int64_t *x);
int
md_get_int64le( struct mdchain *mdp, int64_t *x);
int
md_get_mem( struct mdchain *mdp, caddr_t target, int size, int type);
int
md_get_mbuf( struct mdchain *mdp, int size, struct mbuf **m);
int
md_get_uio( struct mdchain *mdp, struct uio *uiop, int size);
解説
これらの関数は、mbuf チェーンを様々なデータ型に分解するために使用されます。 mdchain 構造体は、作業用コンテキストとして使用されて、 mb_initm() 関数の呼び出しで初期化されるべきです。それには次のフィールドがあります:- md_top
- ( struct mbuf *) 解析された mbuf チェーンの先端へのポインタ
- md_cur
- ( struct mbuf *) 現在解析された mbuf へのポインタ
- md_pas
- ( int) 現在の mbuf のオフセット
md_done() 関数は、 mdp->md_top フィールドによって指された mbuf チェーンを処理して、フィールドを NULL に設定します。
md_append_record() は、mbuf チェーンの単一のリンクリストを形成するために m_nextpkt フィールドを使用して新しい mbuf チェーンを追加します。 mdp->md_top フィールドが NULL であるなら、この関数はまさに md_initm() 関数のように振る舞います。
md_next_record() 関数は、次の mbuf チェーンを抽出して、もしあるならば、現在のものを処理します。新しい mbuf チェーンに関しては、それは md_initm() 関数を呼び出します。データが残っていないなら、関数は ENOENT を返します。
すべての md_get_*() 関数は mbuf チェーンからデータの実際のコピーを実行します。 le または be 接尾辞がある関数はリトルエンディアン (little-endian) かビッグエンディアン (big-endian) のデータ形式への変換を実行します。
md_get_mem() 関数は、mbuf チェーンからの source 引数で指定された size バイトのデータをコピーします。 type 引数は、コピーを実行するために使用される方法を指定して、次の 1 つを指定できます:
- MB_MSYSTEM
- bcopy() 関数を使用します。
- MB_MUSER
- copyin(9) 関数を使用します。
- MB_MINLINE
- どんな関数も呼び出さない“inline”ループを使用します。
target が NULL であるなら、実際のコピーは実行されません、そして、関数はただ与えられた数のバイトをスキップします。
戻り値
成功するなら、すべての int 関数は 0 を返し、そうでなければ、エラーコードを返します。注: どんな関数の失敗の後も、mbuf チェーンは壊れた状態のまま残されます、そして、 md_done() 関数のみ、それを破壊するために安全に呼び出すことができます。
使用例
struct mdchain *mdp; struct mbuf *m; uint16_t length; uint8_t byte; receive(so, &m); md_initm(mdp, m); if (md_get_uint8(mdp, &byte) != 0 || md_get_uint16le(mdp, &length) != 0) error = EBADRPC; mb_done(mdp);
作者
このマニュアルページは、 <bp@FreeBSD.org>によって書かれました。February 28, 2001 | FreeBSD |