mbuf.h
来自「基于组件方式开发操作系统的OSKIT源代码」· C头文件 代码 · 共 512 行 · 第 1/2 页
H
512 行
/* * Copyright (c) 1997-1998 University of Utah and the Flux Group. * All rights reserved. * * This file is part of the Flux OSKit. The OSKit is free software, also known * as "open source;" you can redistribute it and/or modify it under the terms * of the GNU General Public License (GPL), version 2, as published by the Free * Software Foundation (FSF). To explore alternate licensing terms, contact * the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271. * * The OSKit is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GPL for more details. You should have * received a copy of the GPL along with the OSKit; see the file COPYING. If * not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA. *//* * Copyright (c) 1982, 1986, 1988, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)mbuf.h 8.3 (Berkeley) 1/21/94 * $\Id: mbuf.h,v 1.9 1994/11/14 13:54:20 bde Exp $ */#ifndef _SYS_MBUF_H_#define _SYS_MBUF_H_#ifndef M_WAITOK#include <sys/malloc.h>#endif/* * Mbufs are of a single size, MSIZE (machine/machparam.h), which * includes overhead. An mbuf may add a single "mbuf cluster" of size * MCLBYTES (also in machine/machparam.h), which has no additional overhead * and is used instead of the internal data area; this is done when * at least MINCLSIZE of data must be stored. */#define MLEN (MSIZE - sizeof(struct m_hdr)) /* normal data len */#define MHLEN (MLEN - sizeof(struct pkthdr)) /* data len w/pkthdr */#define MINCLSIZE (MHLEN + MLEN) /* smallest amount to put in cluster */#define M_MAXCOMPRESS (MHLEN / 2) /* max amount to copy for compression *//* * Macros for type conversion * mtod(m,t) - convert mbuf pointer to data pointer of correct type * dtom(x) - convert data pointer within mbuf to mbuf pointer (XXX) * mtocl(x) - convert pointer within cluster to cluster index # * cltom(x) - convert cluster # to ptr to beginning of cluster */#define mtod(m,t) ((t)((m)->m_data))#define dtom(x) ((struct mbuf *)((int)(x) & ~(MSIZE-1)))#ifndef OSKIT#define mtocl(x) (((u_int)(x) - (u_int)mbutl) >> MCLSHIFT)#define cltom(x) ((caddr_t)((u_int)mbutl + ((u_int)(x) << MCLSHIFT)))#endif /* OSKIT *//* header at beginning of each mbuf: */struct m_hdr { struct mbuf *mh_next; /* next buffer in chain */ struct mbuf *mh_nextpkt; /* next chain in queue/record */ int mh_len; /* amount of data in this mbuf */ caddr_t mh_data; /* location of data */ short mh_type; /* type of data in this mbuf */ short mh_flags; /* flags; see below */};/* record/packet header in first mbuf of chain; valid if M_PKTHDR set */struct pkthdr { int len; /* total packet length */ struct ifnet *rcvif; /* rcv interface */};/* description of external storage mapped into mbuf, valid if M_EXT set */struct m_ext { caddr_t ext_buf; /* start of buffer */#ifdef OSKIT struct oskit_bufio *ext_bufio; /* OS Kit bufio pointer */#else void (*ext_free) /* free routine if not the usual */ __P((caddr_t, u_int));#endif u_int ext_size; /* size of buffer, for ext_free */};struct mbuf { struct m_hdr m_hdr; union { struct { struct pkthdr MH_pkthdr; /* M_PKTHDR set */ union { struct m_ext MH_ext; /* M_EXT set */ char MH_databuf[MHLEN]; } MH_dat; } MH; char M_databuf[MLEN]; /* !M_PKTHDR, !M_EXT */ } M_dat;};#define m_next m_hdr.mh_next#define m_len m_hdr.mh_len#define m_data m_hdr.mh_data#define m_type m_hdr.mh_type#define m_flags m_hdr.mh_flags#define m_nextpkt m_hdr.mh_nextpkt#define m_act m_nextpkt#define m_pkthdr M_dat.MH.MH_pkthdr#define m_ext M_dat.MH.MH_dat.MH_ext#define m_pktdat M_dat.MH.MH_dat.MH_databuf#define m_dat M_dat.M_databuf/* mbuf flags */#ifdef OSKIT#include <oskit/io/bufio.h>/* * A small step for mankind, but a huge leap for BSD: * We consistently use oskit_bufios for external mbufs */#endif#define M_EXT 0x0001 /* has associated external storage */#define M_PKTHDR 0x0002 /* start of record */#define M_EOR 0x0004 /* end of record *//* mbuf pkthdr flags, also in m_flags */#define M_BCAST 0x0100 /* send/received as link-level broadcast */#define M_MCAST 0x0200 /* send/received as link-level multicast *//* flags copied when copying m_pkthdr */#define M_COPYFLAGS (M_PKTHDR|M_EOR|M_BCAST|M_MCAST)/* mbuf types */#define MT_FREE 0 /* should be on free list */#define MT_DATA 1 /* dynamic (data) allocation */#define MT_HEADER 2 /* packet header */#define MT_SOCKET 3 /* socket structure */#define MT_PCB 4 /* protocol control block */#define MT_RTABLE 5 /* routing tables */#define MT_HTABLE 6 /* IMP host tables */#define MT_ATABLE 7 /* address resolution tables */#define MT_SONAME 8 /* socket name */#define MT_SOOPTS 10 /* socket options */#define MT_FTABLE 11 /* fragment reassembly header */#define MT_RIGHTS 12 /* access rights */#define MT_IFADDR 13 /* interface address */#define MT_CONTROL 14 /* extra-data protocol message */#define MT_OOBDATA 15 /* expedited data *//* flags to m_get/MGET */#define M_DONTWAIT M_NOWAIT#define M_WAIT M_WAITOK/* * mbuf utility macros: * * MBUFLOCK(code) * prevents a section of code from from being interrupted by network * drivers. */#define MBUFLOCK(code) \ { int ms = splimp(); \ { code } \ splx(ms); \ }/* * mbuf allocation/deallocation macros: * * MGET(struct mbuf *m, int how, int type) * allocates an mbuf and initializes it to contain internal data. * * MGETHDR(struct mbuf *m, int how, int type) * allocates an mbuf and initializes it to contain a packet header * and internal data. */#define MGET(m, how, type) { \ MALLOC((m), struct mbuf *, MSIZE, mbtypes[type], (how)); \ if (m) { \ (m)->m_type = (type); \ MBUFLOCK(mbstat.m_mtypes[type]++;) \ (m)->m_next = (struct mbuf *)NULL; \ (m)->m_nextpkt = (struct mbuf *)NULL; \ (m)->m_data = (m)->m_dat; \ (m)->m_flags = 0; \ } else \ (m) = m_retry((how), (type)); \}#define MGETHDR(m, how, type) { \ MALLOC((m), struct mbuf *, MSIZE, mbtypes[type], (how)); \ if (m) { \ (m)->m_type = (type); \ MBUFLOCK(mbstat.m_mtypes[type]++;) \ (m)->m_next = (struct mbuf *)NULL; \ (m)->m_nextpkt = (struct mbuf *)NULL; \ (m)->m_data = (m)->m_pktdat; \ (m)->m_flags = M_PKTHDR; \ } else \ (m) = m_retryhdr((how), (type)); \}#ifdef OSKIT#define MGET_DONT_RECURSE(m, how, type) { \ MALLOC((m), struct mbuf *, MSIZE, mbtypes[type], (how)); \ if (m) { \ (m)->m_type = (type); \ MBUFLOCK(mbstat.m_mtypes[type]++;) \ (m)->m_next = (struct mbuf *)NULL; \ (m)->m_nextpkt = (struct mbuf *)NULL; \ (m)->m_data = (m)->m_dat; \ (m)->m_flags = 0; \ } else \ (m) = (struct mbuf *)0; \}#define MGETHDR_DONT_RECURSE(m, how, type) { \ MALLOC((m), struct mbuf *, MSIZE, mbtypes[type], (how)); \ if (m) { \ (m)->m_type = (type); \ MBUFLOCK(mbstat.m_mtypes[type]++;) \ (m)->m_next = (struct mbuf *)NULL; \ (m)->m_nextpkt = (struct mbuf *)NULL; \ (m)->m_data = (m)->m_pktdat; \ (m)->m_flags = M_PKTHDR; \ } else \ (m) = (struct mbuf *)0; \}#endif /* OSKIT */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?