14bff34e3Sthurlow /* 24bff34e3Sthurlow * Copyright (c) 2000, 2001 Boris Popov 34bff34e3Sthurlow * All rights reserved. 44bff34e3Sthurlow * 54bff34e3Sthurlow * Redistribution and use in source and binary forms, with or without 64bff34e3Sthurlow * modification, are permitted provided that the following conditions 74bff34e3Sthurlow * are met: 84bff34e3Sthurlow * 1. Redistributions of source code must retain the above copyright 94bff34e3Sthurlow * notice, this list of conditions and the following disclaimer. 104bff34e3Sthurlow * 2. Redistributions in binary form must reproduce the above copyright 114bff34e3Sthurlow * notice, this list of conditions and the following disclaimer in the 124bff34e3Sthurlow * documentation and/or other materials provided with the distribution. 134bff34e3Sthurlow * 3. All advertising materials mentioning features or use of this software 144bff34e3Sthurlow * must display the following acknowledgement: 154bff34e3Sthurlow * This product includes software developed by Boris Popov. 164bff34e3Sthurlow * 4. Neither the name of the author nor the names of any co-contributors 174bff34e3Sthurlow * may be used to endorse or promote products derived from this software 184bff34e3Sthurlow * without specific prior written permission. 194bff34e3Sthurlow * 204bff34e3Sthurlow * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 214bff34e3Sthurlow * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 224bff34e3Sthurlow * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 234bff34e3Sthurlow * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 244bff34e3Sthurlow * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 254bff34e3Sthurlow * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 264bff34e3Sthurlow * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 274bff34e3Sthurlow * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 284bff34e3Sthurlow * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 294bff34e3Sthurlow * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 304bff34e3Sthurlow * SUCH DAMAGE. 314bff34e3Sthurlow * 324bff34e3Sthurlow * $FreeBSD: src/sys/sys/mchain.h,v 1.1 2001/02/24 15:44:30 bp Exp $ 334bff34e3Sthurlow */ 34613a2f6bSGordon Ross 354bff34e3Sthurlow /* 36613a2f6bSGordon Ross * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 374bff34e3Sthurlow * Use is subject to license terms. 388329232eSGordon Ross * 39*adee6784SGordon Ross * Copyright 2018 Nexenta Systems, Inc. All rights reserved. 404bff34e3Sthurlow */ 414bff34e3Sthurlow 424bff34e3Sthurlow #ifndef _MCHAIN_H_ 434bff34e3Sthurlow #define _MCHAIN_H_ 444bff34e3Sthurlow 454bff34e3Sthurlow #include <sys/types.h> 464bff34e3Sthurlow #include <sys/isa_defs.h> 474bff34e3Sthurlow #include <sys/byteorder.h> 484bff34e3Sthurlow 494bff34e3Sthurlow #ifdef _LITTLE_ENDIAN 504bff34e3Sthurlow 514bff34e3Sthurlow /* little-endian values on little-endian */ 524bff34e3Sthurlow #define htoles(x) ((uint16_t)(x)) 534bff34e3Sthurlow #define letohs(x) ((uint16_t)(x)) 544bff34e3Sthurlow #define htolel(x) ((uint32_t)(x)) 554bff34e3Sthurlow #define letohl(x) ((uint32_t)(x)) 564bff34e3Sthurlow #define htoleq(x) ((uint64_t)(x)) 574bff34e3Sthurlow #define letohq(x) ((uint64_t)(x)) 584bff34e3Sthurlow 594bff34e3Sthurlow /* 604bff34e3Sthurlow * big-endian values on little-endian (swap) 614bff34e3Sthurlow * 624bff34e3Sthurlow * Use the BSWAP macros because they're fastest, and they're 634bff34e3Sthurlow * available in all environments where we use this header. 644bff34e3Sthurlow */ 654bff34e3Sthurlow #define htobes(x) BSWAP_16(x) 664bff34e3Sthurlow #define betohs(x) BSWAP_16(x) 674bff34e3Sthurlow #define htobel(x) BSWAP_32(x) 684bff34e3Sthurlow #define betohl(x) BSWAP_32(x) 694bff34e3Sthurlow #define htobeq(x) BSWAP_64(x) 704bff34e3Sthurlow #define betohq(x) BSWAP_64(x) 714bff34e3Sthurlow 724bff34e3Sthurlow #else /* (BYTE_ORDER == LITTLE_ENDIAN) */ 734bff34e3Sthurlow 744bff34e3Sthurlow /* little-endian values on big-endian (swap) */ 758329232eSGordon Ross #define letohs(x) BSWAP_16(x) 768329232eSGordon Ross #define htoles(x) BSWAP_16(x) 778329232eSGordon Ross #define letohl(x) BSWAP_32(x) 788329232eSGordon Ross #define htolel(x) BSWAP_32(x) 794bff34e3Sthurlow #define letohq(x) BSWAP_64(x) 804bff34e3Sthurlow #define htoleq(x) BSWAP_64(x) 814bff34e3Sthurlow 824bff34e3Sthurlow /* big-endian values on big-endian */ 834bff34e3Sthurlow #define htobes(x) ((uint16_t)(x)) 844bff34e3Sthurlow #define betohs(x) ((uint16_t)(x)) 854bff34e3Sthurlow #define htobel(x) ((uint32_t)(x)) 864bff34e3Sthurlow #define betohl(x) ((uint32_t)(x)) 874bff34e3Sthurlow #define htobeq(x) ((uint64_t)(x)) 884bff34e3Sthurlow #define betohq(x) ((uint64_t)(x)) 894bff34e3Sthurlow #endif /* (BYTE_ORDER == LITTLE_ENDIAN) */ 904bff34e3Sthurlow 914bff34e3Sthurlow 9202d09e03SGordon Ross /* 9302d09e03SGordon Ross * Additions for Solaris to replace things that came from 9402d09e03SGordon Ross * <sys/mbuf.h> in the Darwin code. These are mostly just 9502d09e03SGordon Ross * wrappers for streams functions. See: subr_mchain.c 9602d09e03SGordon Ross */ 9702d09e03SGordon Ross 988329232eSGordon Ross #if defined(_KERNEL) || defined(_FAKE_KERNEL) 994bff34e3Sthurlow 10002d09e03SGordon Ross /* 10102d09e03SGordon Ross * BSD-style mbuf "shim" for kernel code. Note, this 10202d09e03SGordon Ross * does NOT implement BSD mbufs in the kernel. Rather, 10302d09e03SGordon Ross * macros and wrapper functions are used so that code 10402d09e03SGordon Ross * fomerly using mbuf_t now use STREAMS mblk_t instead. 10502d09e03SGordon Ross */ 10602d09e03SGordon Ross 10702d09e03SGordon Ross #include <sys/stream.h> /* mblk_t */ 108*adee6784SGordon Ross #include <sys/strsun.h> /* MBLKL */ 10902d09e03SGordon Ross typedef mblk_t mbuf_t; 11002d09e03SGordon Ross 1114bff34e3Sthurlow /* BEGIN CSTYLED */ 1124bff34e3Sthurlow /* 1134bff34e3Sthurlow * BSD-style mbufs, vs SysV-style mblks: 1144bff34e3Sthurlow * One big difference: the mbuf payload is: 1154bff34e3Sthurlow * m_data ... (m_data + m_len) 1164bff34e3Sthurlow * In Unix STREAMS, the mblk payload is: 1174bff34e3Sthurlow * b_rptr ... b_wptr 1188329232eSGordon Ross * 1194bff34e3Sthurlow * Here are some handy conversion notes: 1208329232eSGordon Ross * 1214bff34e3Sthurlow * struct mbuf struct mblk 1224bff34e3Sthurlow * m->m_next m->b_cont 1234bff34e3Sthurlow * m->m_nextpkt m->b_next 1244bff34e3Sthurlow * m->m_data m->b_rptr 1254bff34e3Sthurlow * m->m_len MBLKL(m) 1264bff34e3Sthurlow * m->m_dat[] m->b_datap->db_base 1274bff34e3Sthurlow * &m->m_dat[MLEN] m->b_datap->db_lim 1284bff34e3Sthurlow * M_TRAILINGSPACE(m) MBLKTAIL(m) 1294bff34e3Sthurlow * m_freem(m) freemsg(m) 1308329232eSGordon Ross * 1314bff34e3Sthurlow * Note that mbufs chains also have a special "packet" header, 1324bff34e3Sthurlow * which has the length of the whole message. In STREAMS one 1334bff34e3Sthurlow * typically just calls msgdsize(m) to get that. 1344bff34e3Sthurlow */ 1354bff34e3Sthurlow /* END CSTYLED */ 1364bff34e3Sthurlow 13702d09e03SGordon Ross #define mtod(m, t) ((t)((m)->b_rptr)) 13802d09e03SGordon Ross 13902d09e03SGordon Ross /* length arg for m_copym to "copy all" */ 14002d09e03SGordon Ross #define M_COPYALL -1 14102d09e03SGordon Ross 14202d09e03SGordon Ross mblk_t *m_copym(mblk_t *, int, int, int); 14302d09e03SGordon Ross mblk_t *m_pullup(mblk_t *, int); 14402d09e03SGordon Ross mblk_t *m_split(mblk_t *, int, int); 14502d09e03SGordon Ross void m_cat(mblk_t *, mblk_t *); 14602d09e03SGordon Ross #define m_freem(x) freemsg(x) 14702d09e03SGordon Ross mblk_t *m_getblk(int, int); 14802d09e03SGordon Ross int m_fixhdr(mblk_t *m); 14902d09e03SGordon Ross 15002d09e03SGordon Ross #else /* _KERNEL */ 15102d09e03SGordon Ross 15202d09e03SGordon Ross /* 15302d09e03SGordon Ross * BSD-style mbuf work-alike, for user-level. 15402d09e03SGordon Ross * See libsmbfs mbuf.c 15502d09e03SGordon Ross */ 15602d09e03SGordon Ross typedef struct mbuf { 15702d09e03SGordon Ross int m_len; 15802d09e03SGordon Ross int m_maxlen; 15902d09e03SGordon Ross char *m_data; 16002d09e03SGordon Ross struct mbuf *m_next; 16102d09e03SGordon Ross } mbuf_t; 16202d09e03SGordon Ross 16302d09e03SGordon Ross #define mtod(m, t) ((t)(m)->m_data) 16402d09e03SGordon Ross 16502d09e03SGordon Ross int m_get(int, mbuf_t **); 16602d09e03SGordon Ross void m_freem(mbuf_t *); 16702d09e03SGordon Ross 16802d09e03SGordon Ross #endif /* _KERNEL */ 16902d09e03SGordon Ross 17002d09e03SGordon Ross /* 17102d09e03SGordon Ross * BSD-style mbchain/mdchain work-alike 17202d09e03SGordon Ross */ 1734bff34e3Sthurlow 1744bff34e3Sthurlow /* 1754bff34e3Sthurlow * Type of copy for mb_{put|get}_mem() 1764bff34e3Sthurlow */ 1774bff34e3Sthurlow #define MB_MSYSTEM 0 /* use bcopy() */ 1784bff34e3Sthurlow #define MB_MUSER 1 /* use copyin()/copyout() */ 1794bff34e3Sthurlow #define MB_MINLINE 2 /* use an inline copy loop */ 1804bff34e3Sthurlow #define MB_MZERO 3 /* bzero(), mb_put_mem only */ 1814bff34e3Sthurlow #define MB_MCUSTOM 4 /* use an user defined function */ 1824bff34e3Sthurlow 1838329232eSGordon Ross #if defined(_KERNEL) || defined(_FAKE_KERNEL) 18402d09e03SGordon Ross 1854bff34e3Sthurlow struct mbchain { 1864bff34e3Sthurlow mblk_t *mb_top; 1874bff34e3Sthurlow mblk_t *mb_cur; 1884bff34e3Sthurlow uint_t mb_count; 1894bff34e3Sthurlow }; 1904bff34e3Sthurlow typedef struct mbchain mbchain_t; 1914bff34e3Sthurlow 1924bff34e3Sthurlow struct mdchain { 1934bff34e3Sthurlow mblk_t *md_top; /* head of mblk chain */ 1944bff34e3Sthurlow mblk_t *md_cur; /* current mblk */ 19502d09e03SGordon Ross uchar_t *md_pos; /* position in md_cur */ 19602d09e03SGordon Ross /* NB: md_pos is same type as mblk_t b_rptr, b_wptr members. */ 1974bff34e3Sthurlow }; 1984bff34e3Sthurlow typedef struct mdchain mdchain_t; 1994bff34e3Sthurlow 20002d09e03SGordon Ross mblk_t *mb_detach(mbchain_t *mbp); 20102d09e03SGordon Ross int mb_fixhdr(mbchain_t *mbp); 20202d09e03SGordon Ross int mb_put_uio(mbchain_t *mbp, uio_t *uiop, size_t size); 2034bff34e3Sthurlow 20402d09e03SGordon Ross void md_append_record(mdchain_t *mdp, mblk_t *top); 20502d09e03SGordon Ross void md_next_record(mdchain_t *mdp); 20602d09e03SGordon Ross int md_get_uio(mdchain_t *mdp, uio_t *uiop, size_t size); 20702d09e03SGordon Ross 20802d09e03SGordon Ross #else /* _KERNEL */ 2094bff34e3Sthurlow 2104bff34e3Sthurlow /* 21102d09e03SGordon Ross * user-level code uses the same struct for both (MB, MD) 2124bff34e3Sthurlow */ 21302d09e03SGordon Ross typedef struct mbdata { 21402d09e03SGordon Ross mbuf_t *mb_top; /* head of mbuf chain */ 21502d09e03SGordon Ross mbuf_t *mb_cur; /* current mbuf */ 21602d09e03SGordon Ross char *mb_pos; /* position in mb_cur (get) */ 21702d09e03SGordon Ross /* NB: mb_pos is same type as mbuf_t m_data member. */ 21802d09e03SGordon Ross int mb_count; /* bytes marshalled (put) */ 21902d09e03SGordon Ross } mbdata_t; 22002d09e03SGordon Ross typedef struct mbdata mbchain_t; 22102d09e03SGordon Ross typedef struct mbdata mdchain_t; 22202d09e03SGordon Ross 22302d09e03SGordon Ross #endif /* _KERNEL */ 22402d09e03SGordon Ross 22502d09e03SGordon Ross int mb_init(mbchain_t *); 22602d09e03SGordon Ross void mb_initm(mbchain_t *, mbuf_t *); 22702d09e03SGordon Ross void mb_done(mbchain_t *); 22802d09e03SGordon Ross void *mb_reserve(mbchain_t *, int size); 22902d09e03SGordon Ross 230*adee6784SGordon Ross int mb_put_align8(mbchain_t *mbp); 23102d09e03SGordon Ross int mb_put_padbyte(mbchain_t *mbp); 23202d09e03SGordon Ross int mb_put_uint8(mbchain_t *, uint8_t); 23302d09e03SGordon Ross int mb_put_uint16be(mbchain_t *, uint16_t); 23402d09e03SGordon Ross int mb_put_uint16le(mbchain_t *, uint16_t); 23502d09e03SGordon Ross int mb_put_uint32be(mbchain_t *, uint32_t); 23602d09e03SGordon Ross int mb_put_uint32le(mbchain_t *, uint32_t); 23702d09e03SGordon Ross int mb_put_uint64be(mbchain_t *, uint64_t); 23802d09e03SGordon Ross int mb_put_uint64le(mbchain_t *, uint64_t); 23902d09e03SGordon Ross int mb_put_mem(mbchain_t *, const void *, int, int); 24002d09e03SGordon Ross int mb_put_mbuf(mbchain_t *, mbuf_t *); 241*adee6784SGordon Ross int mb_put_mbchain(mbchain_t *, mbchain_t *); 24202d09e03SGordon Ross 24302d09e03SGordon Ross int md_init(mdchain_t *mdp); 24402d09e03SGordon Ross void md_initm(mdchain_t *mbp, mbuf_t *m); 24502d09e03SGordon Ross void md_done(mdchain_t *mdp); 24602d09e03SGordon Ross 24702d09e03SGordon Ross int md_get_uint8(mdchain_t *, uint8_t *); 24802d09e03SGordon Ross int md_get_uint16be(mdchain_t *, uint16_t *); 24902d09e03SGordon Ross int md_get_uint16le(mdchain_t *, uint16_t *); 25002d09e03SGordon Ross int md_get_uint32be(mdchain_t *, uint32_t *); 25102d09e03SGordon Ross int md_get_uint32le(mdchain_t *, uint32_t *); 25202d09e03SGordon Ross int md_get_uint64be(mdchain_t *, uint64_t *); 25302d09e03SGordon Ross int md_get_uint64le(mdchain_t *, uint64_t *); 25402d09e03SGordon Ross int md_get_mem(mdchain_t *, void *, int, int); 25502d09e03SGordon Ross int md_get_mbuf(mdchain_t *, int, mbuf_t **); 256*adee6784SGordon Ross int md_seek(mdchain_t *, uint32_t); 257*adee6784SGordon Ross uint32_t md_tell(mdchain_t *); 2584bff34e3Sthurlow 2594bff34e3Sthurlow #endif /* !_MCHAIN_H_ */ 260