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