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
—
set of functions to dissect an mbuf chain to various data
types
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);
These functions are used to decompose mbuf chains to various data types. The
mdchain structure is used as a working context and
should be initialized through a call of the mb_initm
()
function. It has the following fields:
- md_top
- (struct mbuf *) A pointer to the top of the parsed
mbuf chain.
- md_cur
- (struct mbuf *) A pointer to the currently parsed
mbuf.
- md_pas
- (int) Offset in the current mbuf.
The md_done
() function disposes of an mbuf
chain pointed to by the mdp->md_top field and sets
the field to NULL
.
The md_append_record
() appends a new mbuf
chain using m_nextpkt field to form a single linked
list of mbuf chains. If the mdp->md_top field is
NULL
, then this function behaves exactly as the
md_initm
() function.
The md_next_record
() function extracts the
next mbuf chain and disposes the current one, if any. For a new mbuf chain
it calls the md_initm
() function. If there is no
data left the function returns ENOENT
.
All md_get_*
() functions perform an actual
copy of the data from an mbuf chain. Functions which have
le
or be
suffixes will
perform conversion to the little- or big-endian data formats.
md_get_mem
() function copies
size bytes of data specified by the
source argument from an mbuf chain. The
type argument specifies the method used to perform a
copy, and can be one of the following:
MB_MSYSTEM
- Use the
bcopy
() function.
MB_MUSER
- Use the
copyin(9)
function.
MB_MINLINE
- Use an “inline” loop which does not call any function.
If target is NULL
,
an actual copy is not performed and the function just skips the given number
of bytes.
All int functions return zero if successful, otherwise an
error code is returned.
Note: after failure of any function, an mbuf
chain is left in the broken state and only the
md_done
() function can safely be called to destroy
it.
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);