18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/*
28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Copyright (c) 1982, 1986, 1988, 1993
38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *	The Regents of the University of California.  All rights reserved.
48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Redistribution and use in source and binary forms, with or without
68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * modification, are permitted provided that the following conditions
78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * are met:
88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *    documentation and/or other materials provided with the distribution.
135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * 3. Neither the name of the University nor the names of its contributors
148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *    may be used to endorse or promote products derived from this software
158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *    without specific prior written permission.
168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * SUCH DAMAGE.
288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *	@(#)mbuf.h	8.3 (Berkeley) 1/21/94
308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * mbuf.h,v 1.9 1994/11/14 13:54:20 bde Exp
318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef _MBUF_H_
348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define _MBUF_H_
358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define m_freem m_free
378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define MINCSIZE 4096	/* Amount to increase mbuf if too small */
405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/*
425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * Macros for type conversion
435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * mtod(m,t) -	convert mbuf pointer to data pointer of correct type
445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * dtom(x) -	convert data pointer within mbuf to mbuf pointer (XXX)
455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner */
465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define mtod(m,t)	((t)(m)->m_data)
475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* #define	dtom(x)		((struct mbuf *)((int)(x) & ~(M_SIZE-1))) */
488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* XXX About mbufs for slirp:
508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Only one mbuf is ever used in a chain, for each "cell" of data.
518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * m_nextpkt points to the next packet, if fragmented.
528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * If the data is too large, the M_EXT is used, and a larger block
535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * is alloced.  Therefore, m_free[m] must check for M_EXT and if set
548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * free the m_ext.  This is inefficient memory-wise, but who cares.
558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* XXX should union some of these! */
588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* header at beginning of each mbuf: */
595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct m_hdr {
605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner	struct	mbuf *mh_next;		/* Linked list of mbufs */
615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner	struct	mbuf *mh_prev;
625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner	struct	mbuf *mh_nextpkt;	/* Next packet in queue/record */
635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner	struct	mbuf *mh_prevpkt; /* Flags aren't used in the output queue */
645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner	int	mh_flags;	  /* Misc flags */
658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner	int	mh_size;		/* Size of data */
675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner	struct	socket *mh_so;
688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner	caddr_t	mh_data;		/* Location of data */
705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner	int	mh_len;			/* Amount of data in this mbuf */
718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/*
745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * How much room is in the mbuf, from m_data to the end of the mbuf
755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner */
765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define M_ROOM(m) ((m->m_flags & M_EXT)? \
775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner			(((m)->m_ext + (m)->m_size) - (m)->m_data) \
785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner		   : \
795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner			(((m)->m_dat + (m)->m_size) - (m)->m_data))
805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/*
825d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * How much free room there is
835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner */
845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define M_FREEROOM(m) (M_ROOM(m) - (m)->m_len)
855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define M_TRAILINGSPACE M_FREEROOM
865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct mbuf {
885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner	struct	m_hdr m_hdr;
898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project	union M_dat {
905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner		char	m_dat_[1]; /* ANSI don't like 0 sized arrays */
915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner		char	*m_ext_;
928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project	} M_dat;
935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner};
948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define m_next		m_hdr.mh_next
965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define m_prev		m_hdr.mh_prev
975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define m_nextpkt	m_hdr.mh_nextpkt
985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define m_prevpkt	m_hdr.mh_prevpkt
995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define m_flags		m_hdr.mh_flags
1005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define	m_len		m_hdr.mh_len
1015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define	m_data		m_hdr.mh_data
1025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define m_size		m_hdr.mh_size
1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define m_dat		M_dat.m_dat_
1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define m_ext		M_dat.m_ext_
1055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define m_so		m_hdr.mh_so
1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ifq_prev m_prev
1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ifq_next m_next
1095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define ifs_prev m_prevpkt
1105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define ifs_next m_nextpkt
1115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define ifq_so m_so
1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define M_EXT			0x01	/* m_ext points to more (malloced) data */
1145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define M_FREELIST		0x02	/* mbuf is on free list */
1155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define M_USEDLIST		0x04	/* XXX mbuf is on used list (for dtom()) */
1165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define M_DOFREE		0x08	/* when m_free is called on the mbuf, free()
1175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner					 * it rather than putting it on the free list */
1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/*
1205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * Mbuf statistics. XXX
1215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner */
1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct mbstat {
1245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner	int mbs_alloced;		/* Number of mbufs allocated */
1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner};
1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerextern struct	mbstat mbstat;
1295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerextern int mbuf_alloced;
1305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerextern struct mbuf m_freelist, m_usedlist;
1315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerextern int mbuf_max;
1325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid m_init _P((void));
1345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct mbuf * m_get _P((void));
1355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid m_free _P((struct mbuf *));
1365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid m_cat _P((register struct mbuf *, register struct mbuf *));
1375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid m_inc _P((struct mbuf *, int));
1385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid m_adj _P((struct mbuf *, int));
1395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint m_copy _P((struct mbuf *, struct mbuf *, int, int));
1405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct mbuf * dtom _P((void *));
1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
143