master
  1/*-
  2 * SPDX-License-Identifier: BSD-2-Clause
  3 *
  4 * Copyright (c) 2000, 2001 Boris Popov
  5 * All rights reserved.
  6 *
  7 * Redistribution and use in source and binary forms, with or without
  8 * modification, are permitted provided that the following conditions
  9 * are met:
 10 * 1. Redistributions of source code must retain the above copyright
 11 *    notice, this list of conditions and the following disclaimer.
 12 * 2. Redistributions in binary form must reproduce the above copyright
 13 *    notice, this list of conditions and the following disclaimer in the
 14 *    documentation and/or other materials provided with the distribution.
 15 *
 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 19 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 26 * SUCH DAMAGE.
 27 */
 28#ifndef _SYS_MCHAIN_H_
 29#define _SYS_MCHAIN_H_
 30
 31#ifdef _KERNEL
 32
 33/*
 34 * Type of copy for mb_{put|get}_mem()
 35 */
 36#define	MB_MSYSTEM	0		/* use bcopy() */
 37#define	MB_MUSER	1		/* use copyin()/copyout() */
 38#define	MB_MINLINE	2		/* use an inline copy loop */
 39#define	MB_MZERO	3		/* bzero(), mb_put_mem only */
 40#define	MB_MCUSTOM	4		/* use an user defined function */
 41
 42struct mbuf;
 43struct mbchain;
 44
 45typedef int mb_copy_t(struct mbchain *mbp, c_caddr_t src, caddr_t dst,
 46    size_t *srclen, size_t *dstlen);
 47
 48struct mbchain {
 49	struct mbuf *	mb_top;		/* head of mbufs chain */
 50	struct mbuf * 	mb_cur;		/* current mbuf */
 51	int		mb_mleft;	/* free space in the current mbuf */
 52	int		mb_count;	/* total number of bytes */
 53	mb_copy_t *	mb_copy;	/* user defined copy function */
 54	void *		mb_udata;	/* user data */
 55};
 56
 57struct mdchain {
 58	struct mbuf *	md_top;		/* head of mbufs chain */
 59	struct mbuf * 	md_cur;		/* current mbuf */
 60	u_char *	md_pos;		/* offset in the current mbuf */
 61};
 62
 63int  mb_init(struct mbchain *mbp);
 64void mb_initm(struct mbchain *mbp, struct mbuf *m);
 65void mb_done(struct mbchain *mbp);
 66struct mbuf *mb_detach(struct mbchain *mbp);
 67int  mb_fixhdr(struct mbchain *mbp);
 68caddr_t mb_reserve(struct mbchain *mbp, int size);
 69
 70int  mb_put_padbyte(struct mbchain *mbp);
 71int  mb_put_uint8(struct mbchain *mbp, u_int8_t x);
 72int  mb_put_uint16be(struct mbchain *mbp, u_int16_t x);
 73int  mb_put_uint16le(struct mbchain *mbp, u_int16_t x);
 74int  mb_put_uint32be(struct mbchain *mbp, u_int32_t x);
 75int  mb_put_uint32le(struct mbchain *mbp, u_int32_t x);
 76int  mb_put_int64be(struct mbchain *mbp, int64_t x);
 77int  mb_put_int64le(struct mbchain *mbp, int64_t x);
 78int  mb_put_mem(struct mbchain *mbp, c_caddr_t source, int size, int type);
 79int  mb_put_mbuf(struct mbchain *mbp, struct mbuf *m);
 80int  mb_put_uio(struct mbchain *mbp, struct uio *uiop, int size);
 81
 82int  md_init(struct mdchain *mdp);
 83void md_initm(struct mdchain *mbp, struct mbuf *m);
 84void md_done(struct mdchain *mdp);
 85void md_append_record(struct mdchain *mdp, struct mbuf *top);
 86int  md_next_record(struct mdchain *mdp);
 87int  md_get_uint8(struct mdchain *mdp, u_int8_t *x);
 88int  md_get_uint16(struct mdchain *mdp, u_int16_t *x);
 89int  md_get_uint16le(struct mdchain *mdp, u_int16_t *x);
 90int  md_get_uint16be(struct mdchain *mdp, u_int16_t *x);
 91int  md_get_uint32(struct mdchain *mdp, u_int32_t *x);
 92int  md_get_uint32be(struct mdchain *mdp, u_int32_t *x);
 93int  md_get_uint32le(struct mdchain *mdp, u_int32_t *x);
 94int  md_get_int64(struct mdchain *mdp, int64_t *x);
 95int  md_get_int64be(struct mdchain *mdp, int64_t *x);
 96int  md_get_int64le(struct mdchain *mdp, int64_t *x);
 97int  md_get_mem(struct mdchain *mdp, caddr_t target, int size, int type);
 98int  md_get_mbuf(struct mdchain *mdp, int size, struct mbuf **m);
 99int  md_get_uio(struct mdchain *mdp, struct uio *uiop, int size);
100
101#endif	/* ifdef _KERNEL */
102
103#endif	/* !_SYS_MCHAIN_H_ */