亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? uipc_mbuf.c

?? vxworks下的實現網絡TCPIP協議的原代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* uipc_mbuf.c - mbuf routines *//* Copyright 1984-1996 Wind River Systems, Inc. */#include "copyright_wrs.h"/* * Copyright (c) 1982, 1986, 1988, 1991, 1993, 1995 *	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. * *	@(#)uipc_mbuf.c	8.4 (Berkeley) 2/14/95 *//*modification history--------------------01n,25aug98,n_s  made _bufCollect only call pr_drain 1 time. spr #2210401m,11dec97,vin  made m_free and m_freem as macros calling netMblkClFree		 and netMblkClChainFree functions.01l,08dec97,vin  removed m_copym merged with netMblkChainDup SPR 9966.		 moved old m_copym code to #if 0 section.01k,01dec97,vin  added system pool configuration logic.		 Ifdefed m_copyback and m_copydata in uipc_mbuf.c these                 need some rework so that they can be tied up efficiently                 with the new buffering scheme.01j,08oct97,vin  fixed clBlkFree.01i,05oct97,vin  bug fix in m_copym01h,19sep97,vin  added clBlk specific code, changed pointers to refcounts		 of clusters to refcounts since refcount has been moved to                 clBlk01g,11aug97,vin  interfaced with netBufLib.c, moved all windRiver specific		 buffering code to netBufLib.c01f,02jul97,vin  SPR 8878.01e,15may97,vin  reworked m_devget(), added support for width of copying.01d,31jan97,vin  removed local variable clLog2Def, cleanup01c,03dec96,vin  changed interface to m_getclr() added additional parameters.01b,13nov96,vin  removed BSD4.4 mbufs, modified m_devget, deleted m_get,		 m_gethdr, m_split, wrote new cluster and mBlk functions.		 moved m_copyback from rtsock.c.01a,03mar96,vin  created from BSD4.4 stuff,integrated with 02v of uipc_mbuf.c*/#include "vxWorks.h"#include "intLib.h"#include "net/mbuf.h"#include "net/systm.h"#include "net/domain.h"#include "net/protosw.h"/* externs */IMPORT struct domain *domains;IMPORT VOIDFUNCPTR _pNetBufCollect;IMPORT VOIDFUNCPTR _pWakeupRtn;/* globals *//* locals */LOCAL int 	MPFail;	 	/* XXX temp variable pullup fails */LOCAL NET_POOL	_netDpool; 	/* system network data pool */LOCAL NET_POOL	_netSysPool;	/* system network structure pool */NET_POOL_ID	_pNetDpool   = &_netDpool; NET_POOL_ID	_pNetSysPool = &_netSysPool; /* forward declarations */LOCAL void	_bufCollect (FAST SEM_ID pSem, VOID ** pPtrHead,                             FAST int *	pNumTasks, M_STAT * pPoolStat);LOCAL STATUS 	_netStackPoolInit (NET_POOL_ID pNetPool,                                   M_CL_CONFIG * pMclConfig,                                   CL_DESC * pClDescTbl,                                   int clTblNumEnt);/********************************************************************************* _netStackPoolInit - initialize the net pool** This routines initializes the netpool.** NOMANUAL** RETURNS: OK/ERROR*/LOCAL STATUS _netStackPoolInit    (    NET_POOL_ID		pNetPool,	/* pointer to a net pool */    M_CL_CONFIG * 	pMclConfig,	/* ptr to mblk/clBlk config tbl */    CL_DESC * 		pClDescTbl,	/* ptr to first entry in clDesc tbl */    int 		clTblNumEnt	/* number of entries */    )    {    int 		ix;		/* index variable */    CL_DESC * 		pClDesc;	/* pointer to the cluster descriptor */    if (pMclConfig->memArea == NULL)	/* do a default allocation */        {        /* memory size adjusted to hold the netPool pointer at the head */        pMclConfig->memSize = (pMclConfig->mBlkNum *                                (MSIZE + sizeof (long))) +            		       (pMclConfig->clBlkNum * CL_BLK_SZ);         if ((pMclConfig->memArea = (char *) malloc (pMclConfig->memSize))            == NULL)            {            panic ("no memory: mBlks/clBlks");            return (ERROR);             }        }    for (pClDesc = pClDescTbl, ix = 0; ix < clTblNumEnt; ix++, pClDesc++)        {        /* memory size adjusted for refcount, pool ptr and 4 byte alignmnt */                if (pClDesc->memArea == NULL) /* do a default allocation */            {            pClDesc->memSize = (pClDesc->clNum *                                (pClDesc->clSize + sizeof (long)));            if ((pClDesc->memArea = (char *)malloc (pClDesc->memSize)) == NULL)                {                panic ("no memory: clusters");                return (ERROR);                }            }        }    return (netPoolInit (pNetPool, pMclConfig, pClDescTbl, clTblNumEnt, NULL));    }/********************************************************************************* mbinit - initialize mbuf package** Initialize a number of mbufs and clusters to start the ball rolling.* This is accomplished by calling routines _mBlkAlloc() and _clAlloc()** NOMANUAL*/void mbinit (void)    {    netBufLibInit ();			/* initialize the buffering library */    _pNetBufCollect = _bufCollect; 	/* intialize buffer collect routine */    _pWakeupRtn	    = wakeup;		/* defined in unixLib.c */    if (_netStackPoolInit (_pNetDpool, &mClBlkConfig, &clDescTbl [0],                           clDescTblNumEnt) != OK)        goto mbInitError;    if (_netStackPoolInit (_pNetSysPool, &sysMclBlkConfig, &sysClDescTbl [0],                           sysClDescTblNumEnt) != OK)        goto mbInitError;    return;        mbInitError:    	{        panic ("mbinit");        return;        }    }/********************************************************************************* _bufCollect - drain protocols and collect required buffers** Must be called at splimp.* * NOMANUAL**/LOCAL void _bufCollect    (    FAST SEM_ID	pSem,			/* pointer to semaphore to block on */    VOID **	pPtrHead,		/* pointer to the head of free list */    FAST int *	pNumTasks,		/* pointer to the no. task blocked */    M_STAT *	pPoolStat		/* pointer to the pools stats struct */    )    {    FAST struct domain	*dp;    FAST struct protosw	*pr;    int	 		level; 		/* level of interrupt */    /* ask protocols to free space */    for (dp = domains; dp; dp = dp->dom_next)	for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)	    if (pr->pr_drain)		(*pr->pr_drain)();    level = intLock ();     pPoolStat->mDrain++;		/* no. of times protocols drained */    intUnlock (level);     }/********************************************************************************* mBufClGet - get a new mBlk with a cluster ** This routine allocates an mBlk and points it to a cluster allocated* Different clusters are allocated depending upon the cluster size requested.* * INTERNAL* * NOMANUAL* * RETURNS: NULL/mBlk*/struct mbuf * mBufClGet    (    int			canWait,	/* M_DONTWAIT/M_WAIT */    UCHAR		type,		/* type of data */    int			bufSize,	/* size of the buffer to get */    BOOL		bestFit		/* TRUE/FALSE */    )    {    FAST struct mbuf *	pMblk; 		/* pointer to mbuf */    pMblk = mBlkGet (_pNetDpool, canWait, type); 	/* get an mBlk */    /* allocate a cluster and point the mbuf to it */    if (pMblk && (mClGet (_pNetDpool, pMblk, bufSize, canWait, bestFit) != OK))	{	(void)m_free (pMblk); 	pMblk = NULL; 	}    return (pMblk);    }/********************************************************************************* mHdrClGet - get a new mBlkHdr with a cluster ** This routine allocates an mBlkHdr and points it to a cluster allocated* Different clusters are allocated depending upon the cluster size requested.** INTERNAL*  * NOMANUAL* * RETURNS: NULL/mBlkHdr*/struct mbuf * mHdrClGet    (    int			canWait,		/* M_DONTWAIT/M_WAIT */    UCHAR		type,			/* type of data */    int			bufSize,		/* size of the buffer to get */    BOOL		bestFit			/* TRUE/FALSE */    )    {    FAST struct mbuf *	pMblk = NULL; 			/* pointer to mbuf */    /* get an mBlk/cluster pair */        pMblk = mBlkGet (_pNetDpool, canWait, type); 	/* get an mBlk */    if (pMblk == NULL)        return (NULL);        pMblk->m_flags |= M_PKTHDR;     /* allocate a cluster and point the mbuf to it */    if (mClGet (_pNetDpool, pMblk, bufSize, canWait, bestFit) != OK)	{	(void)m_free (pMblk); 	pMblk = NULL; 	}    return (pMblk);    }/********************************************************************************* m_getclr - get a clean mBlk, cluster pair** This routine allocates an mBlk, points it to a cluster,* and zero's the cluster allocated.** INTERNAL*  * NOMANUAL* * RETURNS: NULL/mBlk*/struct mbuf * m_getclr    (    int 		canwait,		/* M_WAIT/M_DONTWAIT */    UCHAR		type,			/* type of mbuf to allocate */    int			bufSize,		/* size of the buffer to get */    BOOL		bestFit			/* TRUE/FALSE */    )    {    FAST struct mbuf *	pMblk = NULL; 		/* pointer to mbuf */    /* allocate mBlk/cluster pair */        if ((pMblk = mBufClGet (canwait, type, bufSize, bestFit)) != NULL)	bzero(mtod(pMblk, caddr_t), pMblk->m_extSize);     return (pMblk);    }#if 0 /* XXX */#endif /* XXX *//* * Mbuffer utility routines. *//********************************************************************************* m_prepend - prepend an mbuf to a chain.** Lesser-used path for M_PREPEND:* allocate new mbuf to prepend to chain,* copy junk along.*/struct mbuf * m_prepend(m, len, how)    register struct mbuf *m;    int len;    int how;    {    struct mbuf *mn;    if ((mn = mBufClGet (how, m->m_type, len, TRUE)) == NULL)	{	m_freem(m);	return ((struct mbuf *)NULL);	}    if (m->m_flags & M_PKTHDR)	{	mn->m_pkthdr = m->m_pkthdr;	mn->m_flags = m->m_flags;	m->m_flags &= ~M_PKTHDR;	}    mn->m_next = m;    m = mn;    if (len < m->m_extSize)	MH_ALIGN(m, len);    m->m_len = len;    return (m);    }/********************************************************************************* m_cat - concatenate mbuf chain n to m.** Concatenate mbuf chain n to m.* Both chains must be of the same type (e.g. MT_DATA).* Any m_pkthdr is not updated.*/void m_cat(m, n)    register struct mbuf * m;    register struct mbuf * n;    {    while (m->m_next)	m = m->m_next;    if (n != NULL)		/* clusters are used by default */	m->m_next = n;     }/********************************************************************************* m_adj - adjust the data in the mbuf**/void m_adj(mp, req_len)    struct mbuf * mp;    int req_len;    {    register int len = req_len;    register struct mbuf *m;    register count;    if ((m = mp) == NULL)	return;    if (len >= 0)	{	/*	 * Trim from head.	 */	while (m != NULL && len > 0)	    {	    if (m->m_len <= len)		{		len -= m->m_len;		m->m_len = 0;		m = m->m_next;		}	    else		{		m->m_len -= len;		m->m_data += len;		len = 0;		}	    }	m = mp;	if (mp->m_flags & M_PKTHDR)	    m->m_pkthdr.len -= (req_len - len);	}     else	{	/*	 * Trim from tail.  Scan the mbuf chain,	 * calculating its length and finding the last mbuf.	 * If the adjustment only affects this mbuf, then just	 * adjust and return.  Otherwise, rescan and truncate	 * after the remaining size.	 */	len = -len;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品一区一区| 亚洲国产日韩精品| 国产91丝袜在线观看| www久久精品| 国产91色综合久久免费分享| 国产农村妇女毛片精品久久麻豆| 国产成人精品aa毛片| 国产精品美女视频| 在线观看网站黄不卡| 亚洲成人av电影在线| 日韩三级电影网址| 国产精品亚洲午夜一区二区三区| 国产精品色噜噜| 在线观看欧美黄色| 久久精品国内一区二区三区| 国产网站一区二区三区| 91浏览器在线视频| 日韩av电影天堂| 国产三级一区二区| 欧洲一区二区av| 久久精品二区亚洲w码| 亚洲国产精华液网站w| 欧美性高清videossexo| 久久av老司机精品网站导航| 国产精品色婷婷久久58| 5858s免费视频成人| 国产黄人亚洲片| 一区二区三区四区不卡视频 | 欧美日韩国产经典色站一区二区三区| 日日摸夜夜添夜夜添亚洲女人| 久久久亚洲高清| 欧洲生活片亚洲生活在线观看| 精品一区二区在线看| 亚洲日本电影在线| 欧美大片一区二区三区| 色综合久久六月婷婷中文字幕| 日本va欧美va精品发布| 国产精品夫妻自拍| 精品久久久久久无| 欧美性一区二区| 成人小视频免费观看| 日本亚洲最大的色成网站www| 国产精品视频免费看| 日韩欧美国产一二三区| 在线这里只有精品| 成人黄色电影在线| 国产一本一道久久香蕉| 五月激情综合色| 亚洲欧美日韩一区二区 | 99视频精品全部免费在线| 免费看欧美女人艹b| 一区二区三区在线影院| 中文字幕欧美日韩一区| 日韩三级av在线播放| 欧美撒尿777hd撒尿| 99久久国产综合精品色伊 | 青青国产91久久久久久| 亚洲男同性恋视频| 国产精品视频你懂的| 337p日本欧洲亚洲大胆精品| 欧美日韩免费观看一区二区三区| 99re这里只有精品视频首页| 成人自拍视频在线观看| 国产在线不卡视频| 激情都市一区二区| 久草在线在线精品观看| 日本中文字幕一区二区视频| 亚洲成av人影院| 偷拍一区二区三区四区| 亚洲一线二线三线视频| 一区二区在线观看不卡| 亚洲精品一二三四区| 一区二区高清视频在线观看| 亚洲男同性恋视频| 一级做a爱片久久| 一区二区三区精品视频在线| 亚洲精品乱码久久久久久久久 | 欧美一级二级三级乱码| 欧美顶级少妇做爰| 欧美日韩国产在线观看| 成人av影院在线| 麻豆精品一区二区综合av| 亚洲欧美日韩综合aⅴ视频| 中文字幕一区二区三区av| 国产精品你懂的在线欣赏| 国产欧美日韩卡一| 国产精品三级视频| 日韩伦理电影网| 一区二区三区四区不卡视频| 午夜久久久久久| 日韩黄色小视频| 蜜臀av性久久久久蜜臀av麻豆| 另类中文字幕网| 国产乱一区二区| av综合在线播放| 欧美亚洲禁片免费| 91精品国产综合久久蜜臀| 欧美电影免费观看高清完整版| 国产日韩欧美精品电影三级在线| 亚洲国产精品二十页| 亚洲一区二区视频在线观看| 日日夜夜免费精品| 国产成人亚洲精品狼色在线| 99久久精品国产精品久久| 欧美亚洲综合在线| 欧美va亚洲va在线观看蝴蝶网| 欧美韩国日本一区| 亚洲午夜久久久久久久久电影院 | 91色porny在线视频| 欧美日韩高清一区二区三区| 欧美www视频| 亚洲另类在线制服丝袜| 麻豆精品在线看| 色综合视频一区二区三区高清| 3d成人h动漫网站入口| 国产亚洲污的网站| 亚洲成人av在线电影| 国产黄色精品视频| 欧美日韩高清影院| 欧美国产视频在线| 视频一区中文字幕| www.在线成人| 国产精品99久久久久久似苏梦涵| 久久欧美中文字幕| 久久精品亚洲国产奇米99| 亚洲另类色综合网站| 美女网站一区二区| 97se亚洲国产综合自在线不卡| 7777精品伊人久久久大香线蕉 | 91免费观看在线| 欧美一级高清大全免费观看| 亚洲视频香蕉人妖| 国产在线一区二区| 欧美久久久久久蜜桃| 中文字幕一区二区在线观看| 91婷婷韩国欧美一区二区| 日韩一区二区三区三四区视频在线观看| 国产欧美精品一区二区色综合朱莉| 亚洲桃色在线一区| 久久久久久99精品| 亚洲图片自拍偷拍| 成人妖精视频yjsp地址| 日韩欧美美女一区二区三区| 亚洲精品老司机| 成人福利视频在线看| 欧美一区二区三区啪啪| 一区二区三区加勒比av| 成人免费观看视频| 久久综合色天天久久综合图片| 午夜精品福利一区二区蜜股av| 一本久久精品一区二区| 日本一区二区三区在线观看| 捆绑变态av一区二区三区| 69堂亚洲精品首页| 亚洲高清在线精品| 日本久久一区二区三区| 国产精品乱码人人做人人爱| 国产精品一区二区免费不卡| 欧美成人高清电影在线| 美女国产一区二区| 日韩一区二区三区在线| 日本va欧美va精品发布| 欧美一二三区在线| 蜜桃一区二区三区四区| 欧美一级搡bbbb搡bbbb| 日韩高清不卡在线| 91精品免费在线观看| 欧美三级日韩在线| 午夜欧美一区二区三区在线播放| 国产成人av一区| 国产欧美一区二区三区网站| 九一九一国产精品| 精品精品国产高清一毛片一天堂| 日韩不卡一二三区| 日韩一区二区免费在线电影 | 91超碰这里只有精品国产| 波多野结衣视频一区| 久久久国产精华| 成人毛片视频在线观看| 国产精品美女久久久久久久久 | 日韩欧美一区二区三区在线| 免费高清不卡av| 26uuu另类欧美| 国产一区二区美女诱惑| 亚洲国产精华液网站w| 99精品久久免费看蜜臀剧情介绍| 亚洲另类在线制服丝袜| 91精品欧美久久久久久动漫| 精品一区二区日韩| 国产精品嫩草久久久久| 国产精品蜜臀av| 激情都市一区二区| 久久精品一区八戒影视| 国产成人午夜99999| 欧美激情在线看| 一本到不卡免费一区二区| 丝袜美腿成人在线| 精品久久久久久久久久久久包黑料| 精品亚洲成a人| 亚洲天堂免费看|