EN JA
MBCHAIN(9)
MBCHAIN(9) FreeBSD Kernel Developer's Manual MBCHAIN(9)

名称

mbchain, mb_init, mb_initm, mb_done, mb_detach, mb_fixhdr, mb_reserve, mb_put_uint8, mb_put_uint16be, mb_put_uint16le, mb_put_uint32be, mb_put_uint32le, mb_put_int64be, mb_put_int64le, mb_put_mem, mb_put_mbuf, mb_put_uio様々なデータタイプから mbuf チェーンを構築する関数の集合

書式

options LIBMCHAIN kldload libmchain


#include < sys/param.h>
#include < sys/uio.h>
#include < sys/mchain.h>

int
mb_init( struct mbchain *mbp);

void
mb_initm( struct mbchain *mbp, struct mbuf *m);

void
mb_done( struct mbchain *mbp);

struct mbuf *
mb_detach( struct mbchain *mbp);

int
mb_fixhdr( struct mbchain *mbp);

caddr_t
mb_reserve( struct mbchain *mbp, int size);

int
mb_put_uint8( struct mbchain *mbp, uint8_t x);

int
mb_put_uint16be( struct mbchain *mbp, uint16_t x);

int
mb_put_uint16le( struct mbchain *mbp, uint16_t x);

int
mb_put_uint32be( struct mbchain *mbp, uint32_t x);

int
mb_put_uint32le( struct mbchain *mbp, uint32_t x);

int
mb_put_int64be( struct mbchain *mbp, int64_t x);

int
mb_put_int64le( struct mbchain *mbp, int64_t x);

int
mb_put_mem( struct mbchain *mbp, c_caddr_t source, int size, int type);

int
mb_put_mbuf( struct mbchain *mbp, struct mbuf *m);

int
mb_put_uio( struct mbchain *mbp, struct uio *uiop, int size);

解説

これらの関数は、様々なデータタイプから mbuf チェーンを構成するために使用されます。 mbchain 構造体は、作業用コンテキストとして使用されて、 mb_init() または mb_initm() のいずれかへの呼び出しで初期化されるべきです。それには、次のフィールドがあります:
mb_top
( struct mbuf *) 構築された mbuf チェーンの先端へのポインタ
mb_cur
( struct mbuf *) 現在満たされた mbuf へのポインタ
mb_mleft
( int) 現在の mbuf に残っているバイト数
mb_count
( int) mbuf チェーンに位置付けられたバイト数の合計
mb_copy
( mb_copy_t *) mbuf にコピーを実行するユーザ定義関数;なにか通常でないデータ変換が必要であるなら、役に立ちます
mb_udata
( void *) mb_copy 関数で使用することができるユーザによって提供されたデータ

mb_done() 関数は、 mbp->mb_top フィールドによって指された mbuf チェーンを処理して、そのフィールドを NULL に設定します。

mb_detach() 関数は、 mbp->mb_top フィールドの値を返して、その値を NULL に設定します。

mb_fixhdr() は mbuf チェーンの長さを計算し直して、チェーンでの最初の mbuf の m_pkthdr.len フィールドを更新します。それは計算された長さを返します。

mb_reserve() は size 引数によって指定された長さのオブジェクトが現在の mbuf (必要なら、mbuf の割り付けを実行して) に適合できるようにして、まるで本当のデータが置かれるかのようにすべてのポインタを進めます。返された値は予約された空間の始まりを指します。オブジェクトのサイズが MLEN バイトを超えてはいけないことに注意してください。

すべての mb_put_*() 関数は mbuf チェーンにデータの実際のコピーを実行します。 le または be 接尾辞がある関数はリトルエンディアン (little-endian) かビッグエンディアン (big-endian) のデータ形式への変換を実行します。

mb_put_mem() 関数は、mbuf チェーンへの source 引数によって指定された size バイトのデータをコピーします。 type 引数は、コピーを実行するために使用される方法を指定して、次の 1 つを指定できます:

MB_MSYSTEM
bcopy() 関数を使用します。
MB_MUSER
copyin(9) 関数を使用します。
MB_MINLINE
どんな関数も呼び出さない“inline”ループを使用します。
MB_MZERO
0 バイトで宛先をただ満たすことを除いて、なにもデータをコピーしません。
MB_MCUSTOM
mbp->mb_copy フィールドによって指定された関数を呼び出します。

戻り値

mb_fixhdr() を除いて、成功するなら、すべての int 関数は 0 を返し、そうでなければ、エラーコードを返します。

: どんな関数の失敗の後も、mbuf チェーンは壊れた状態のまま残されます、そして、 mb_done() 関数のみ、それを破壊するために安全に呼び出すことができます。

使用例

struct mbchain *mbp; 
struct mbuf *m; 
 
mb_init(mbp); 
mb_put_uint8(mbp, 33); 
mb_put_uint16le(mbp, length); 
m = m_copym(mbp->mb_top, 0, M_COPYALL, M_WAIT); 
send(m); 
mb_done(mbp);

関連項目

mbuf(9), mdchain(9)

作者

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