EN JA
MDCHAIN(9)
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_uiombuf チェーンを様々なデータタイプに分析する関数の集合

書式

options LIBMCHAIN kldload 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”ループを使用します。

targetNULL であるなら、実際のコピーは実行されません、そして、関数はただ与えられた数のバイトをスキップします。

戻り値

成功するなら、すべての 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);

関連項目

mbchain(9), mbuf(9)

作者

このマニュアルページは、 Boris Popov <bp@FreeBSD.org>によって書かれました。
February 28, 2001 FreeBSD