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

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

?? netbuff.cpp

?? 小型的操作系統開發的原代碼
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
//***********************************************************************/
//    Author                    : Garry
//    Original Date             : Aug,06 2005
//    Module Name               : NETBUFF.CPP
//    Module Funciton           : 
//                                This module countains net buffer's
//                                implementation code.
//    Last modified Author      :
//    Last modified Date        :
//    Last modified Content     :
//                                1.
//                                2.
//    Lines number              :
//***********************************************************************/

#ifndef __STDAFX_H__
#include "..\INCLUDE\StdAfx.h"
#endif

#ifndef __DEFINES_H__
#include "DEFINES.H"
#endif

#ifndef __NETBUFF_H__
#include "NETBUFF.H"
#endif

/*--------------- ** Some important hints about net buffer object ** -------------------
  The net buffer object is used by network entity,such as IP kernel thread,net interface
card,to store data or packets.When you use the net buffer object,the following rules must
be obeied:
  1. When you transfer a net buffer object as a parameter to another kernel thread,you 
     must first increment the reference counter by calling NetBufferGet routine;
  2. When you finished to use a net buffer object,you must call NetBufferFree routine to
     release the memory or decrement the reference counter,if the net buffer object is created
	 by yourself,if the object is not created by your self,but is transfered by another 
	 kernel thread,you must call NetBufferFree routine too;
  3. All net buffer operations are interrupt safe,so you can call the operations anywhere.
---------------------------------------------------------------------------------------*/

//
//The implementation of net buffer queue.
//This is a FIFO queue,can be used by any entity,such as IP kernel thread.
//

//
//The implementation of InsertIntoQueue.
//This routine adds the net buffer object to the end of the queue.
//If the current element number is not exceed the max number,then insert it,and
//returns TRUE,otherwise,returns FALSE.
//

static BOOL InsertIntoQueue(__NET_BUFFER_QUEUE* lpQueue,__NET_BUFFER* lpNetBuffer)
{
	DWORD                   dwFlags        = 0L;

	__ENTER_CRITICAL_SECTION(NULL,dwFlags);  //The following operation should not be
	                                         //interrupted.
	if(lpQueue->dwQueueNum == lpQueue->dwMaxNum)  //The queue is full.
	{
		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
		return FALSE;
	}
	//
	//The following code insert the net buffer object into queue's tail.
	//
	if(NULL == lpQueue->lpQueueTail)    //There is not any element in the queue.
	{
		lpQueue->lpQueueHdr  = lpNetBuffer;
		lpQueue->lpQueueTail = lpNetBuffer;
		lpNetBuffer->lpNext  = NULL;
		lpNetBuffer->lpPrev  = NULL;
		lpQueue->dwQueueNum ++;
		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
		return TRUE;
	}
	else    //The queu is not empty.
	{
		lpQueue->lpQueueTail->lpNext  = lpNetBuffer;
		lpNetBuffer->lpPrev           = lpQueue->lpQueueTail;
		lpNetBuffer->lpNext           = NULL;
		lpQueue->lpQueueTail          = lpNetBuffer;
		lpQueue->dwQueueNum ++;
		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
		return TRUE;
	}
	return TRUE;
}

//
//The implementation of DeleteFromQueue.
//This routine first check if the object is in the queue,if not,returns FALSE,
//else,deletes it and returns TRUE.
//

static BOOL DeleteFromQueue(__NET_BUFFER_QUEUE*,__NET_BUFFER*)
{
	BOOL                    bResult             = FALSE;
	return bResult;
}

//
//The implementation of GetFromQueue.This routine gets the first element of this queue.
//

static __NET_BUFFER* GetFromQueue(__NET_BUFFER_QUEUE* lpQueue)
{
	__NET_BUFFER*                 lpNetBuffer         = NULL;
	DWORD                         dwFlags             = 0L;

	if(NULL == lpQueue)    //Parameter check.
		return NULL;
	__ENTER_CRITICAL_SECTION(NULL,dwFlags);
	if(NULL == lpQueue->lpQueueHdr)    //The current queue is empty.
	{
		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
		return NULL;
	}
	if(lpQueue->lpQueueHdr == lpQueue->lpQueueTail)  //There is only one element in the queue.
	{
		lpNetBuffer = lpQueue->lpQueueHdr;
		lpQueue->lpQueueHdr  = NULL;
		lpQueue->lpQueueTail = NULL;
		lpNetBuffer->lpPrev  = NULL;
		lpNetBuffer->lpNext  = NULL;
		lpQueue->dwQueueNum--;
		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
		return lpNetBuffer;
	}
	else    //There are at least two elements in the current queue.
	{
		lpNetBuffer = lpQueue->lpQueueHdr;
		lpQueue->lpQueueHdr = lpNetBuffer->lpNext;
		lpQueue->lpQueueHdr->lpPrev = NULL;
		lpQueue->dwQueueNum --;
		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
		return lpNetBuffer;
	}
	return NULL;    //This instruction should never be executed.
}

//
//The implementation of GetQueueLength.
//

static DWORD GetQueueLen(__NET_BUFFER_QUEUE* lpQueue)
{
	if(NULL == lpQueue)
		return 0L;
	return lpQueue->dwQueueNum;
}

//
//The implementation of SetMaxLen.
//

static VOID SetMaxLen(__NET_BUFFER_QUEUE* lpQueue,DWORD dwMaxLen)
{
	DWORD             dwFlags             = 0L;

	if(NULL == lpQueue)    //Parameter check.
		return;
	__ENTER_CRITICAL_SECTION(NULL,dwFlags);
	lpQueue->dwMaxNum = dwMaxLen;
	__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
	return;
}

//
//The implementation of Initialize.
//

static VOID QueueInitialize(__NET_BUFFER_QUEUE* lpQueue)
{
	if(NULL == lpQueue)
		return;

	lpQueue->lpQueueHdr        = NULL;
	lpQueue->lpQueueTail       = NULL;
	lpQueue->dwQueueNum        = 0L;
	lpQueue->dwMaxNum          = 0L;

	lpQueue->Initialize        = QueueInitialize;
	lpQueue->SetMaxLen         = SetMaxLen;
	lpQueue->GetQueueLen       = GetQueueLen;
	lpQueue->GetFromQueue      = GetFromQueue;
	lpQueue->DeleteFromQueue   = DeleteFromQueue;
	lpQueue->InsertIntoQueue   = InsertIntoQueue;

	return;
}

BOOL NetBufferQueueInit(__NET_BUFFER_QUEUE* lpQueue)    //Global routine.
{
	if(NULL == lpQueue)
		return FALSE;
	QueueInitialize(lpQueue);
	return TRUE;
}

//--------------------------------------------------------------------------------------

//
//The implementation of net buffer manager.
//

//
//Pre-declaration of routines.
//
static VOID NetBufferFreeData(__NET_BUFFER_MANAGER*,__NET_BUFFER*);

//
//A helper routine,used to get a free net buffer from free list.
//
static __NET_BUFFER* __GetFreeNetBuffer(__NET_BUFFER_MANAGER* lpMgr)
{
	__NET_BUFFER*                     lpNetBuffer           = NULL;
	
	lpNetBuffer = ALLOC_BUFF_MEMORY(sizeof(__NET_BUFFER));
	if(NULL == lpNetBuffer)
		return NULL;

#define SET(member,value) lpNetBuffer->member = value    //This macro initializes a member.

	SET(lpPrev,          NULL);
	SET(lpNext,          NULL);
	SET(lpSocket,        NULL);
	SET(Time,            NULL);
	SET(lpNetDevice,     NULL);
	SET(TransLayerHdr.lpTransLayerData, NULL);
	SET(NetLayerHdr.lpNetLayerData,     NULL);
	SET(LinkLayerHdr.lpLinkLayerData,   NULL);
	SET(dwDataLen,       0L);
	SET(dwTotalLen,      0L);
	SET(dwCheckSum,      0L);
	SET(dwPktType,       PACKET_TYPE_UNKNOWN);
	SET(bCloned,         FALSE);
	SET(ucProtocol,      PACKET_PROTOCOL_UNKNOWN);
	SET(ucReserved1,     0);
	SET(ucReserved2,     0);
	SET(ucReserved3,     0);
	SET(lpBufferHdr,     NULL);
	SET(lpBufferEnd,     NULL);
	SET(lpDataHdr,       NULL);
	SET(lpDataEnd,       NULL);

#undef SET    //Finish to initialize the net buffer allocated just now.
	__INIT_ATOMIC(lpNetBuffer->Users);
	AtomicSet(&lpNetBuffer->Users,1);
	return lpNetBuffer;
}

//
//A helper routine,used to free a net buffer object.
//

static VOID __FreeNetBuffer(__NET_BUFFER_MANAGER* lpMgr,__NET_BUFFER* lpNetBuffer)
{
	if(NULL == lpNetBuffer)  //Parameter check.
		return;
	FREE_BUFF_MEMORY(lpNetBuffer);    //Release the net buffer memory.
	return;
}

//
//The implementation of NetBufferAlloc.
//

static __NET_BUFFER* NetBufferAlloc(__NET_BUFFER_MANAGER* lpManager,DWORD dwBuffLen)
{
	__NET_BUFFER*                   lpNetBuffer                     = NULL;
	DWORD                           dwFlags                         = 0L;
	UCHAR*                          lpDataBuff                      = NULL;
	__FRAG_DATA*                    lpFragData                      = NULL;

	if((NULL == lpManager) || (0 == dwBuffLen)) //Parameter check.
		return NULL;
	lpNetBuffer = __GetFreeNetBuffer(lpManager);
	if(NULL == lpNetBuffer)    //Can not get a net buffer object,no memory may be the 
		                       //most reasonable reason.
		return NULL;

	lpDataBuff = ALLOC_DATA_MEMORY(dwBuffLen);
	if(NULL == lpDataBuff)     //Can not allocate memory to hold data.
	{
		__FreeNetBuffer(lpManager,lpNetBuffer);
		return NULL;
	}
	//
	//We have get a net buffer object and allocate a data buffer successfully,then,
	//we should initialize the net buffer object according to data buffer.
	//
	lpNetBuffer->lpBufferHdr    = lpDataBuff;
	lpNetBuffer->lpBufferEnd    = lpDataBuff + dwBuffLen;
	lpNetBuffer->lpDataHdr      = lpDataBuff;
	lpNetBuffer->lpDataEnd      = lpDataBuff;

	lpFragData = NET_BUFFER_FRAG_DATA(lpNetBuffer);  //Get the fragment data.
	NetBufferQueueInit(&lpFragData->FragQueue);      //Initialize the frag data queue.
	__INIT_ATOMIC(lpFragData->SharedCounter);        //Initialize the shared counter.
	AtomicSet(&lpFragData->SharedCounter,1);         //Set the shared counter to 1.

	return lpNetBuffer;
}

//
//The implementation of NetBufferFree.
//This routine decrement the reference counter of net buffer object,if the reference
//counter hits zero,then release the net buffer object and it's data buffer,else,
//only return.
//

static VOID NetBufferFree(__NET_BUFFER_MANAGER* lpManager,__NET_BUFFER* lpNetBuffer)
{
	if((NULL == lpManager) || (NULL == lpNetBuffer)) //parameter check.
		return;
	if(AtomicDec(&lpNetBuffer->Users))  //The reference counter hit zero.
	{
		NetBufferFreeData(lpManager,lpNetBuffer);  //Release the data buffer.
		__FreeNetBuffer(lpManager,lpNetBuffer);    //Release the net buffer object.
	}
	else    //The reference counter does not hit zero,it means,that there also some other
		    //entities are using the net buffer object.
		return;
}

//
//The implementation of NetBufferFreeData.
//

static VOID NetBufferFreeData(__NET_BUFFER_MANAGER* lpMgr,__NET_BUFFER* lpNetBuffer)
{
	__FRAG_DATA*              lpFragData                  = NULL;
	__NET_BUFFER*             lpNetBuff                   = NULL;

	if((NULL == lpMgr) || (NULL == lpNetBuffer)) //Parameter check.
		return;
	lpFragData = NET_BUFFER_FRAG_DATA(lpNetBuffer);
	if(AtomicDec(&lpFragData->SharedCounter))    //Share counter hits zero,should release
		                                         //all data.
	{
		lpNetBuff = lpFragData->FragQueue.GetFromQueue(&lpFragData->FragQueue);
		while(lpNetBuff)    //There is fragment data.
		{
			NetBufferFree(lpMgr,lpNetBuff);  //Release the fragment data.
			lpNetBuff = lpFragData->FragQueue.GetFromQueue(&lpFragData->FragQueue);
		}
		//__FreeNetBuffer(lpMgr,lpNetBuff);    //Release the memory the data buffer occupied.
		FREE_DATA_MEMORY(lpNetBuffer->lpBufferHdr);  //Release the data buffer.
	}
	else  //The shared counter is not zero,it means there is other entity is using the data
		  //buffer.
	{
		DWORD dwLoop = lpFragData->FragQueue.GetQueueLen(&lpFragData->FragQueue);
		for(DWORD i = 0;i < dwLoop;i ++)  //Decrement the reference counter of all fragment.
			                              //The reference counter of all fragments should
										  //never less than the reference counter of data
										  //buffer.
										  //This can be ensure by NetBufferClone routine,
										  //this routine will increment the reference counter
										  //of data buffer and all fragments.
										  //So,NetBufferFree routine only decrement the
										  //reference counter of all fragments.
		{
			lpNetBuff = lpFragData->FragQueue.GetFromQueue(&lpFragData->FragQueue);
			NetBufferFree(lpMgr,lpNetBuff);
			lpFragData->FragQueue.InsertIntoQueue(&lpFragData->FragQueue,lpNetBuff);
		}
	}
	return;
}

//
//The implementation of NetBufferGet.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
av影院午夜一区| 九一九一国产精品| 欧洲国产伦久久久久久久| 国产精品第五页| 99麻豆久久久国产精品免费| 综合久久给合久久狠狠狠97色| 成人午夜伦理影院| 一区二区成人在线| 日韩一区二区影院| 丰满亚洲少妇av| 亚洲精品免费在线| 在线不卡中文字幕播放| 久久国内精品视频| 中文字幕制服丝袜成人av| 欧美亚洲一区二区三区四区| 日韩电影一区二区三区| 26uuu国产日韩综合| av亚洲精华国产精华精| 午夜a成v人精品| 久久久欧美精品sm网站| 色播五月激情综合网| 麻豆一区二区三| 国产精品久久久久久久岛一牛影视 | 国产欧美一区二区精品性色 | 日本一不卡视频| 国产午夜亚洲精品不卡| 色婷婷综合中文久久一本| 视频一区视频二区中文字幕| 国产欧美一区视频| 欧美自拍偷拍一区| 国产综合久久久久久久久久久久| 国产精品国产三级国产普通话三级| 欧美日韩一级二级| 国产aⅴ精品一区二区三区色成熟| 亚洲靠逼com| 久久这里只有精品视频网| 成人激情免费视频| 国产大片一区二区| 亚洲已满18点击进入久久| 欧美大黄免费观看| 99视频超级精品| 久久国产成人午夜av影院| 亚洲男同1069视频| 久久久久久麻豆| 777奇米四色成人影色区| 成人av免费在线观看| 日本伊人精品一区二区三区观看方式| 亚洲国产岛国毛片在线| 日韩亚洲欧美高清| 欧美视频日韩视频在线观看| 国产成人精品影视| 日本欧美一区二区三区| 亚洲高清在线精品| 91精品久久久久久久久99蜜臂 | 亚洲天天做日日做天天谢日日欢| 欧美一卡二卡在线观看| 欧美在线小视频| 99久久免费视频.com| 韩国三级在线一区| 免费成人av在线| 午夜欧美一区二区三区在线播放| 中文字幕日韩一区| 中文在线免费一区三区高中清不卡| 日韩三级视频中文字幕| 欧美电影一区二区三区| 欧美日本在线视频| 欧美无乱码久久久免费午夜一区| 91麻豆自制传媒国产之光| 成人深夜在线观看| 成人午夜电影小说| 成人短视频下载 | 成人av在线网站| 成人丝袜视频网| 成人动漫一区二区在线| 成人免费va视频| 岛国精品在线播放| www.亚洲色图| 色诱亚洲精品久久久久久| 99精品视频一区| 在线精品视频免费观看| 日本电影亚洲天堂一区| 欧美在线不卡一区| 欧美自拍偷拍一区| 欧美性一级生活| 91麻豆精品国产自产在线| 欧美一区二区视频观看视频| 精品区一区二区| 国产欧美日韩综合| 亚洲色图欧美在线| 亚洲午夜在线视频| 精油按摩中文字幕久久| 国产一区999| 91在线精品一区二区| 在线亚洲免费视频| 欧美一区午夜精品| 日本一区二区三区电影| 亚洲永久精品国产| 久久国产精品一区二区| 国产不卡视频一区| 99精品久久只有精品| 欧美丰满少妇xxxxx高潮对白 | 在线欧美日韩国产| 911精品产国品一二三产区| 欧美mv日韩mv| 亚洲欧美综合另类在线卡通| 亚洲国产成人高清精品| 久草热8精品视频在线观看| 丁香激情综合国产| 色欧美日韩亚洲| 日韩手机在线导航| 亚洲视频一二区| 老司机免费视频一区二区三区| 成人午夜免费视频| 欧美日韩精品二区第二页| 2020国产精品久久精品美国| 国产精品国产精品国产专区不蜜| 午夜久久久久久久久久一区二区| 国产精品夜夜爽| 欧美日韩国产首页| 国产日产精品一区| 视频一区二区三区入口| 成人一区在线看| 欧美电影影音先锋| 1024成人网| 国产毛片精品视频| 欧美色窝79yyyycom| 国产精品国产成人国产三级| 秋霞影院一区二区| 色综合中文字幕| 26uuu国产一区二区三区| 亚洲成av人片| 99vv1com这只有精品| 26uuu成人网一区二区三区| 午夜精品久久久久久久99水蜜桃 | av不卡在线播放| 精品国产免费视频| 无码av中文一区二区三区桃花岛| 高清国产一区二区| 精品国产麻豆免费人成网站| 性欧美疯狂xxxxbbbb| 91色视频在线| 国产精品久久久久久久久图文区 | 国产精品综合二区| 欧美一区二区精品久久911| 亚洲综合视频网| av亚洲精华国产精华精| 国产天堂亚洲国产碰碰| 另类的小说在线视频另类成人小视频在线 | 色老汉av一区二区三区| 中文字幕久久午夜不卡| 美腿丝袜一区二区三区| 欧美酷刑日本凌虐凌虐| 亚洲精品成人在线| av动漫一区二区| 国产精品美女久久久久久久久 | 精品国产sm最大网站| 日韩精品一区第一页| 欧美性色综合网| 亚洲国产中文字幕在线视频综合| 日本国产一区二区| 一区二区在线电影| 欧洲一区在线观看| 亚洲最新在线观看| 欧美中文字幕不卡| 亚洲一区二区三区四区的| 91黄色免费观看| 亚洲成在线观看| 7777精品伊人久久久大香线蕉超级流畅| 一区二区三区 在线观看视频| 91久久香蕉国产日韩欧美9色| 亚洲乱码国产乱码精品精的特点| 色综合久久88色综合天天| 一区二区三区蜜桃网| 欧美日韩欧美一区二区| 日韩成人午夜精品| 日韩一区二区三区四区| 国模冰冰炮一区二区| 欧美国产欧美综合| 91在线国产观看| 亚洲国产精品久久一线不卡| 欧美精品vⅰdeose4hd| 久久99精品国产91久久来源| 久久精品无码一区二区三区| 成人国产在线观看| 夜夜嗨av一区二区三区网页| 7777精品伊人久久久大香线蕉经典版下载| 免费在线看成人av| 久久人人超碰精品| 成人黄色小视频在线观看| 亚洲精品中文字幕在线观看| 欧美三级午夜理伦三级中视频| 日韩成人午夜电影| 国产精品欧美一级免费| 在线观看视频一区二区欧美日韩| 偷拍与自拍一区| 欧美激情综合五月色丁香小说| 欧美在线观看视频一区二区 | 久久狠狠亚洲综合| 国产精品水嫩水嫩| 欧美情侣在线播放|