1*da6c28aaSamw /* 2*da6c28aaSamw * CDDL HEADER START 3*da6c28aaSamw * 4*da6c28aaSamw * The contents of this file are subject to the terms of the 5*da6c28aaSamw * Common Development and Distribution License (the "License"). 6*da6c28aaSamw * You may not use this file except in compliance with the License. 7*da6c28aaSamw * 8*da6c28aaSamw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*da6c28aaSamw * or http://www.opensolaris.org/os/licensing. 10*da6c28aaSamw * See the License for the specific language governing permissions 11*da6c28aaSamw * and limitations under the License. 12*da6c28aaSamw * 13*da6c28aaSamw * When distributing Covered Code, include this CDDL HEADER in each 14*da6c28aaSamw * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*da6c28aaSamw * If applicable, add the following below this CDDL HEADER, with the 16*da6c28aaSamw * fields enclosed by brackets "[]" replaced with your own identifying 17*da6c28aaSamw * information: Portions Copyright [yyyy] [name of copyright owner] 18*da6c28aaSamw * 19*da6c28aaSamw * CDDL HEADER END 20*da6c28aaSamw */ 21*da6c28aaSamw /* 22*da6c28aaSamw * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 23*da6c28aaSamw * Use is subject to license terms. 24*da6c28aaSamw */ 25*da6c28aaSamw /* 26*da6c28aaSamw * Copyright (c) 1982, 1986, 1988 Regents of the University of California. 27*da6c28aaSamw * All rights reserved. 28*da6c28aaSamw * 29*da6c28aaSamw * Redistribution and use in source and binary forms, with or without 30*da6c28aaSamw * modification, are permitted provided that the following conditions 31*da6c28aaSamw * are met: 32*da6c28aaSamw * 1. Redistributions of source code must retain the above copyright 33*da6c28aaSamw * notice, this list of conditions and the following disclaimer. 34*da6c28aaSamw * 2. Redistributions in binary form must reproduce the above copyright 35*da6c28aaSamw * notice, this list of conditions and the following disclaimer in the 36*da6c28aaSamw * documentation and/or other materials provided with the distribution. 37*da6c28aaSamw * 3. All advertising materials mentioning features or use of this software 38*da6c28aaSamw * must display the following acknowledgement: 39*da6c28aaSamw * This product includes software developed by the University of 40*da6c28aaSamw * California, Berkeley and its contributors. 41*da6c28aaSamw * 4. Neither the name of the University nor the names of its contributors 42*da6c28aaSamw * may be used to endorse or promote products derived from this software 43*da6c28aaSamw * without specific prior written permission. 44*da6c28aaSamw * 45*da6c28aaSamw * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 46*da6c28aaSamw * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 47*da6c28aaSamw * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 48*da6c28aaSamw * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 49*da6c28aaSamw * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 50*da6c28aaSamw * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 51*da6c28aaSamw * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 52*da6c28aaSamw * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 53*da6c28aaSamw * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 54*da6c28aaSamw * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 55*da6c28aaSamw * SUCH DAMAGE. 56*da6c28aaSamw * 57*da6c28aaSamw */ 58*da6c28aaSamw 59*da6c28aaSamw #ifndef _SMBSRV_MBUF_H 60*da6c28aaSamw #define _SMBSRV_MBUF_H 61*da6c28aaSamw 62*da6c28aaSamw #pragma ident "%Z%%M% %I% %E% SMI" 63*da6c28aaSamw 64*da6c28aaSamw /* 65*da6c28aaSamw * PBSHORTCUT This file should be removed from the PB port but is required 66*da6c28aaSamw * for now to get it to compile. This file has also been modified. 67*da6c28aaSamw */ 68*da6c28aaSamw 69*da6c28aaSamw #include <sys/types.h> 70*da6c28aaSamw #include <sys/param.h> 71*da6c28aaSamw #include <smbsrv/smb_i18n.h> 72*da6c28aaSamw #include <smbsrv/alloc.h> 73*da6c28aaSamw 74*da6c28aaSamw #ifdef __cplusplus 75*da6c28aaSamw extern "C" { 76*da6c28aaSamw #endif 77*da6c28aaSamw 78*da6c28aaSamw #define MSIZE 256 79*da6c28aaSamw #define MCLBYTES 2048 80*da6c28aaSamw #define MCLSHIFT 11 81*da6c28aaSamw #define MCLOFSET (MCLBYTES - 1) 82*da6c28aaSamw 83*da6c28aaSamw #define NBPG 4096 84*da6c28aaSamw #define CLBYTES NBPG 85*da6c28aaSamw #define PB_PAGESIZE 4096 86*da6c28aaSamw 87*da6c28aaSamw /* 88*da6c28aaSamw * Mbufs are of a single size, MSIZE (machine/machparam.h), which 89*da6c28aaSamw * includes overhead. An mbuf may add a single "mbuf cluster" of size 90*da6c28aaSamw * MCLBYTES (also in machine/machparam.h), which has no additional overhead 91*da6c28aaSamw * and is used instead of the internal data area; this is done when 92*da6c28aaSamw * at least MINCLSIZE of data must be stored. 93*da6c28aaSamw */ 94*da6c28aaSamw 95*da6c28aaSamw #define MLEN (MSIZE - sizeof (struct m_hdr)) /* normal data len */ 96*da6c28aaSamw #define MHLEN (MLEN - sizeof (struct pkthdr)) /* data len w/pkthdr */ 97*da6c28aaSamw 98*da6c28aaSamw #define MINCLSIZE (MHLEN + MLEN) /* smallest amount to put in cluster */ 99*da6c28aaSamw 100*da6c28aaSamw /* 101*da6c28aaSamw * Macros for type conversion 102*da6c28aaSamw * mtod(m,t) - convert mbuf pointer to data pointer of correct type 103*da6c28aaSamw */ 104*da6c28aaSamw #define mtod(m, t) ((t)((m)->m_data)) 105*da6c28aaSamw 106*da6c28aaSamw 107*da6c28aaSamw /* header at beginning of each mbuf: */ 108*da6c28aaSamw struct m_hdr { 109*da6c28aaSamw struct mbuf *mh_next; /* next buffer in chain */ 110*da6c28aaSamw struct mbuf *mh_nextpkt; /* next chain in queue/record */ 111*da6c28aaSamw int mh_len; /* amount of data in this mbuf */ 112*da6c28aaSamw caddr_t mh_data; /* location of data */ 113*da6c28aaSamw short mh_type; /* type of data in this mbuf */ 114*da6c28aaSamw short mh_flags; /* flags; see below */ 115*da6c28aaSamw }; 116*da6c28aaSamw 117*da6c28aaSamw /* record/packet header in first mbuf of chain; valid if M_PKTHDR set */ 118*da6c28aaSamw struct pkthdr { 119*da6c28aaSamw int len; /* total packet length */ 120*da6c28aaSamw }; 121*da6c28aaSamw 122*da6c28aaSamw 123*da6c28aaSamw /* XXX probably do not need m_ext */ 124*da6c28aaSamw 125*da6c28aaSamw /* description of external storage mapped into mbuf, valid if M_EXT set */ 126*da6c28aaSamw struct m_ext { 127*da6c28aaSamw caddr_t ext_buf; /* start of buffer */ 128*da6c28aaSamw int (*ext_ref)(); /* refcount adjust function */ 129*da6c28aaSamw uint_t ext_size; /* size of buffer, for ext_free */ 130*da6c28aaSamw }; 131*da6c28aaSamw 132*da6c28aaSamw struct mbuf { 133*da6c28aaSamw struct m_hdr m_hdr; 134*da6c28aaSamw union { 135*da6c28aaSamw struct { 136*da6c28aaSamw struct pkthdr MH_pkthdr; /* M_PKTHDR set */ 137*da6c28aaSamw union { 138*da6c28aaSamw struct m_ext MH_ext; /* M_EXT set */ 139*da6c28aaSamw char MH_databuf[MHLEN]; 140*da6c28aaSamw } MH_dat; 141*da6c28aaSamw } MH; 142*da6c28aaSamw char M_databuf[MLEN]; /* !M_PKTHDR, !M_EXT */ 143*da6c28aaSamw } M_dat; 144*da6c28aaSamw }; 145*da6c28aaSamw #define m_next m_hdr.mh_next 146*da6c28aaSamw #define m_len m_hdr.mh_len 147*da6c28aaSamw #define m_data m_hdr.mh_data 148*da6c28aaSamw #define m_type m_hdr.mh_type 149*da6c28aaSamw #define m_flags m_hdr.mh_flags 150*da6c28aaSamw #define m_nextpkt m_hdr.mh_nextpkt 151*da6c28aaSamw #define m_act m_nextpkt 152*da6c28aaSamw #define m_pkthdr M_dat.MH.MH_pkthdr 153*da6c28aaSamw #define m_ext M_dat.MH.MH_dat.MH_ext 154*da6c28aaSamw #define m_pktdat M_dat.MH.MH_dat.MH_databuf 155*da6c28aaSamw #define m_dat M_dat.M_databuf 156*da6c28aaSamw 157*da6c28aaSamw /* mbuf flags */ 158*da6c28aaSamw #define M_EXT 0x0001 /* has associated external storage */ 159*da6c28aaSamw #define M_PKTHDR 0x0002 /* start of record */ 160*da6c28aaSamw #define M_EOR 0x0004 /* end of record */ 161*da6c28aaSamw 162*da6c28aaSamw /* mbuf pkthdr flags, also in m_flags */ 163*da6c28aaSamw #define M_BCAST 0x0100 /* send/received as link-level broadcast */ 164*da6c28aaSamw #define M_MCAST 0x0200 /* send/received as link-level multicast */ 165*da6c28aaSamw 166*da6c28aaSamw /* flags copied when copying m_pkthdr */ 167*da6c28aaSamw #define M_COPYFLAGS (M_PKTHDR|M_EOR|M_BCAST|M_MCAST) 168*da6c28aaSamw 169*da6c28aaSamw /* XXX probably only need MT_DATA */ 170*da6c28aaSamw 171*da6c28aaSamw /* mbuf types */ 172*da6c28aaSamw #define MT_FREE 0 /* should be on free list */ 173*da6c28aaSamw #define MT_DATA 1 /* dynamic (data) allocation */ 174*da6c28aaSamw #define MT_HEADER 2 /* packet header */ 175*da6c28aaSamw #define MT_SOCKET 3 /* socket structure */ 176*da6c28aaSamw #define MT_PCB 4 /* protocol control block */ 177*da6c28aaSamw #define MT_RTABLE 5 /* routing tables */ 178*da6c28aaSamw #define MT_HTABLE 6 /* IMP host tables */ 179*da6c28aaSamw #define MT_ATABLE 7 /* address resolution tables */ 180*da6c28aaSamw #define MT_SONAME 8 /* socket name */ 181*da6c28aaSamw #define MT_SOOPTS 10 /* socket options */ 182*da6c28aaSamw #define MT_FTABLE 11 /* fragment reassembly header */ 183*da6c28aaSamw #define MT_RIGHTS 12 /* access rights */ 184*da6c28aaSamw #define MT_IFADDR 13 /* interface address */ 185*da6c28aaSamw #define MT_CONTROL 14 /* extra-data protocol message */ 186*da6c28aaSamw #define MT_OOBDATA 15 /* expedited data */ 187*da6c28aaSamw 188*da6c28aaSamw /* 189*da6c28aaSamw * flags to malloc: PBSHORTCUT 190*da6c28aaSamw */ 191*da6c28aaSamw #define M_WAITOK 0x0000 192*da6c28aaSamw #define M_NOWAIT 0x0001 193*da6c28aaSamw 194*da6c28aaSamw /* flags to m_get/MGET */ 195*da6c28aaSamw #define M_DONTWAIT M_NOWAIT 196*da6c28aaSamw #define M_WAIT M_WAITOK 197*da6c28aaSamw 198*da6c28aaSamw 199*da6c28aaSamw /* 200*da6c28aaSamw * mbuf allocation/deallocation macros: 201*da6c28aaSamw * 202*da6c28aaSamw * MGET(struct mbuf *m, int how, int type) 203*da6c28aaSamw * allocates an mbuf and initializes it to contain internal data. 204*da6c28aaSamw * 205*da6c28aaSamw * MGETHDR(struct mbuf *m, int how, int type) 206*da6c28aaSamw * allocates an mbuf and initializes it to contain a packet header 207*da6c28aaSamw * and internal data. 208*da6c28aaSamw */ 209*da6c28aaSamw 210*da6c28aaSamw #define MGET(m, how, type) { \ 211*da6c28aaSamw m = MEM_ZALLOC("mbuf", sizeof (struct mbuf)); \ 212*da6c28aaSamw (m)->m_next = (struct mbuf *)NULL; \ 213*da6c28aaSamw (m)->m_nextpkt = (struct mbuf *)NULL; \ 214*da6c28aaSamw (m)->m_data = (m)->m_dat; \ 215*da6c28aaSamw (m)->m_flags = 0; \ 216*da6c28aaSamw (m)->m_type = (short)(type); \ 217*da6c28aaSamw } 218*da6c28aaSamw 219*da6c28aaSamw #define MGETHDR(m, how, type) { \ 220*da6c28aaSamw m = MEM_ZALLOC("mbuf", sizeof (struct mbuf)); \ 221*da6c28aaSamw (m)->m_type = (MT_HEADER); \ 222*da6c28aaSamw (m)->m_next = (struct mbuf *)NULL; \ 223*da6c28aaSamw (m)->m_nextpkt = (struct mbuf *)NULL; \ 224*da6c28aaSamw (m)->m_data = (m)->m_pktdat; \ 225*da6c28aaSamw (m)->m_flags = M_PKTHDR; \ 226*da6c28aaSamw } 227*da6c28aaSamw 228*da6c28aaSamw extern int mclref(); 229*da6c28aaSamw extern int mclrefnoop(); 230*da6c28aaSamw #define MCLGET(m, how) \ 231*da6c28aaSamw { \ 232*da6c28aaSamw (m)->m_ext.ext_buf = MEM_ZALLOC("mbuf", MCLBYTES); \ 233*da6c28aaSamw (m)->m_data = (m)->m_ext.ext_buf; \ 234*da6c28aaSamw (m)->m_flags |= M_EXT; \ 235*da6c28aaSamw (m)->m_ext.ext_size = MCLBYTES; \ 236*da6c28aaSamw (m)->m_ext.ext_ref = mclref; \ 237*da6c28aaSamw } 238*da6c28aaSamw 239*da6c28aaSamw /* 240*da6c28aaSamw * MFREE(struct mbuf *m, struct mbuf *nn) 241*da6c28aaSamw * Free a single mbuf and associated external storage. 242*da6c28aaSamw * Place the successor, if any, in nn. 243*da6c28aaSamw */ 244*da6c28aaSamw #define MFREE(m, nn) \ 245*da6c28aaSamw { \ 246*da6c28aaSamw if ((m)->m_flags & M_EXT) { \ 247*da6c28aaSamw (*((m)->m_ext.ext_ref))((m)->m_ext.ext_buf, \ 248*da6c28aaSamw (m)->m_ext.ext_size, -1); \ 249*da6c28aaSamw (m)->m_ext.ext_buf = 0; \ 250*da6c28aaSamw } \ 251*da6c28aaSamw (nn) = (m)->m_next; \ 252*da6c28aaSamw (m)->m_next = 0; \ 253*da6c28aaSamw MEM_FREE("mbuf", m); \ 254*da6c28aaSamw } 255*da6c28aaSamw 256*da6c28aaSamw 257*da6c28aaSamw 258*da6c28aaSamw /* 259*da6c28aaSamw * As above, for mbufs allocated with m_gethdr/MGETHDR 260*da6c28aaSamw * or initialized by M_COPY_PKTHDR. 261*da6c28aaSamw */ 262*da6c28aaSamw #define MH_ALIGN(m, len) \ 263*da6c28aaSamw { (m)->m_data += (MHLEN - (len)) &~ (sizeof (int32_t) - 1); } 264*da6c28aaSamw 265*da6c28aaSamw #ifdef __cplusplus 266*da6c28aaSamw } 267*da6c28aaSamw #endif 268*da6c28aaSamw 269*da6c28aaSamw #endif /* _SMBSRV_MBUF_H */ 270