xref: /illumos-gate/usr/src/uts/common/netsmb/mchain.h (revision adee6784)
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