blob: c5c8512fd7b6aeed6e754d611825bab2f02d646b [file] [log] [blame]
/*
* Copyright (c) 2000, 2001 Boris Popov
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by Boris Popov.
* 4. Neither the name of the author nor the names of any co-contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $FreeBSD: src/sys/sys/mchain.h,v 1.1 2001/02/24 15:44:30 bp Exp $
*/
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _MCHAIN_H_
#define _MCHAIN_H_
#include <sys/types.h>
#include <sys/isa_defs.h>
#include <sys/byteorder.h>
#ifdef _LITTLE_ENDIAN
/* little-endian values on little-endian */
#define htoles(x) ((uint16_t)(x))
#define letohs(x) ((uint16_t)(x))
#define htolel(x) ((uint32_t)(x))
#define letohl(x) ((uint32_t)(x))
#define htoleq(x) ((uint64_t)(x))
#define letohq(x) ((uint64_t)(x))
/*
* big-endian values on little-endian (swap)
*
* Use the BSWAP macros because they're fastest, and they're
* available in all environments where we use this header.
*/
#define htobes(x) BSWAP_16(x)
#define betohs(x) BSWAP_16(x)
#define htobel(x) BSWAP_32(x)
#define betohl(x) BSWAP_32(x)
#define htobeq(x) BSWAP_64(x)
#define betohq(x) BSWAP_64(x)
#else /* (BYTE_ORDER == LITTLE_ENDIAN) */
/* little-endian values on big-endian (swap) */
#define letohs(x) BSWAP_16(x)
#define htoles(x) BSWAP_16(x)
#define letohl(x) BSWAP_32(x)
#define htolel(x) BSWAP_32(x)
#define letohq(x) BSWAP_64(x)
#define htoleq(x) BSWAP_64(x)
/* big-endian values on big-endian */
#define htobes(x) ((uint16_t)(x))
#define betohs(x) ((uint16_t)(x))
#define htobel(x) ((uint32_t)(x))
#define betohl(x) ((uint32_t)(x))
#define htobeq(x) ((uint64_t)(x))
#define betohq(x) ((uint64_t)(x))
#endif /* (BYTE_ORDER == LITTLE_ENDIAN) */
/*
* Additions for Solaris to replace things that came from
* <sys/mbuf.h> in the Darwin code. These are mostly just
* wrappers for streams functions. See: subr_mchain.c
*/
#ifdef _KERNEL
/*
* BSD-style mbuf "shim" for kernel code. Note, this
* does NOT implement BSD mbufs in the kernel. Rather,
* macros and wrapper functions are used so that code
* fomerly using mbuf_t now use STREAMS mblk_t instead.
*/
#include <sys/stream.h> /* mblk_t */
typedef mblk_t mbuf_t;
/* BEGIN CSTYLED */
/*
* BSD-style mbufs, vs SysV-style mblks:
* One big difference: the mbuf payload is:
* m_data ... (m_data + m_len)
* In Unix STREAMS, the mblk payload is:
* b_rptr ... b_wptr
*
* Here are some handy conversion notes:
*
* struct mbuf struct mblk
* m->m_next m->b_cont
* m->m_nextpkt m->b_next
* m->m_data m->b_rptr
* m->m_len MBLKL(m)
* m->m_dat[] m->b_datap->db_base
* &m->m_dat[MLEN] m->b_datap->db_lim
* M_TRAILINGSPACE(m) MBLKTAIL(m)
* m_freem(m) freemsg(m)
*
* Note that mbufs chains also have a special "packet" header,
* which has the length of the whole message. In STREAMS one
* typically just calls msgdsize(m) to get that.
*/
/* END CSTYLED */
#define mtod(m, t) ((t)((m)->b_rptr))
/* length arg for m_copym to "copy all" */
#define M_COPYALL -1
mblk_t *m_copym(mblk_t *, int, int, int);
mblk_t *m_pullup(mblk_t *, int);
mblk_t *m_split(mblk_t *, int, int);
void m_cat(mblk_t *, mblk_t *);
#define m_freem(x) freemsg(x)
mblk_t *m_getblk(int, int);
int m_fixhdr(mblk_t *m);
#else /* _KERNEL */
/*
* BSD-style mbuf work-alike, for user-level.
* See libsmbfs mbuf.c
*/
typedef struct mbuf {
int m_len;
int m_maxlen;
char *m_data;
struct mbuf *m_next;
} mbuf_t;
#define mtod(m, t) ((t)(m)->m_data)
int m_get(int, mbuf_t **);
void m_freem(mbuf_t *);
#endif /* _KERNEL */
/*
* BSD-style mbchain/mdchain work-alike
*/
/*
* Type of copy for mb_{put|get}_mem()
*/
#define MB_MSYSTEM 0 /* use bcopy() */
#define MB_MUSER 1 /* use copyin()/copyout() */
#define MB_MINLINE 2 /* use an inline copy loop */
#define MB_MZERO 3 /* bzero(), mb_put_mem only */
#define MB_MCUSTOM 4 /* use an user defined function */
#ifdef _KERNEL
struct mbchain {
mblk_t *mb_top;
mblk_t *mb_cur;
uint_t mb_count;
};
typedef struct mbchain mbchain_t;
struct mdchain {
mblk_t *md_top; /* head of mblk chain */
mblk_t *md_cur; /* current mblk */
uchar_t *md_pos; /* position in md_cur */
/* NB: md_pos is same type as mblk_t b_rptr, b_wptr members. */
};
typedef struct mdchain mdchain_t;
mblk_t *mb_detach(mbchain_t *mbp);
int mb_fixhdr(mbchain_t *mbp);
int mb_put_uio(mbchain_t *mbp, uio_t *uiop, size_t size);
void md_append_record(mdchain_t *mdp, mblk_t *top);
void md_next_record(mdchain_t *mdp);
int md_get_uio(mdchain_t *mdp, uio_t *uiop, size_t size);
#else /* _KERNEL */
/*
* user-level code uses the same struct for both (MB, MD)
*/
typedef struct mbdata {
mbuf_t *mb_top; /* head of mbuf chain */
mbuf_t *mb_cur; /* current mbuf */
char *mb_pos; /* position in mb_cur (get) */
/* NB: mb_pos is same type as mbuf_t m_data member. */
int mb_count; /* bytes marshalled (put) */
} mbdata_t;
typedef struct mbdata mbchain_t;
typedef struct mbdata mdchain_t;
#endif /* _KERNEL */
int mb_init(mbchain_t *);
void mb_initm(mbchain_t *, mbuf_t *);
void mb_done(mbchain_t *);
void *mb_reserve(mbchain_t *, int size);
int mb_put_padbyte(mbchain_t *mbp);
int mb_put_uint8(mbchain_t *, uint8_t);
int mb_put_uint16be(mbchain_t *, uint16_t);
int mb_put_uint16le(mbchain_t *, uint16_t);
int mb_put_uint32be(mbchain_t *, uint32_t);
int mb_put_uint32le(mbchain_t *, uint32_t);
int mb_put_uint64be(mbchain_t *, uint64_t);
int mb_put_uint64le(mbchain_t *, uint64_t);
int mb_put_mem(mbchain_t *, const void *, int, int);
int mb_put_mbuf(mbchain_t *, mbuf_t *);
int md_init(mdchain_t *mdp);
void md_initm(mdchain_t *mbp, mbuf_t *m);
void md_done(mdchain_t *mdp);
int md_get_uint8(mdchain_t *, uint8_t *);
int md_get_uint16be(mdchain_t *, uint16_t *);
int md_get_uint16le(mdchain_t *, uint16_t *);
int md_get_uint32be(mdchain_t *, uint32_t *);
int md_get_uint32le(mdchain_t *, uint32_t *);
int md_get_uint64be(mdchain_t *, uint64_t *);
int md_get_uint64le(mdchain_t *, uint64_t *);
int md_get_mem(mdchain_t *, void *, int, int);
int md_get_mbuf(mdchain_t *, int, mbuf_t **);
#endif /* !_MCHAIN_H_ */