⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 net_buf.c

📁 某个ARM9板子的实际bootloader 对裁剪
💻 C
字号:
/****************************************************************************
* Copyright  Storlink Corp 2005.  All rights reserved.                
*--------------------------------------------------------------------------
* Name			: net_buf.c
* Description	: 
*		Handle network buffer
*
* History
*
*	Date		Writer		Description
*	-----------	-----------	-------------------------------------------------
*	04/25/2005	Gary Chen	Create
*
****************************************************************************/
#include <define.h>
#include <net.h>

static unsigned char netbuf[NET_BUF_NUM][NETBUF_SIZE];
NETBUF_QUEUE_T net_free_q;
NETBUF_QUEUE_T net_rcv_q;

static void net_insert_queue_first(NETBUF_QUEUE_T *queue, NETBUF_HDR_T *buf);
static void net_insert_queue_tail(NETBUF_QUEUE_T *queue, NETBUF_HDR_T *buf);
void net_show_buf_info(void);

/*----------------------------------------------------------------------
* net_init_buf
*----------------------------------------------------------------------*/
void net_init_buf(void)
{
	int i;
	NETBUF_HDR_T *hdr;
	
	// initialize net buffer queues
	memset((char *)&net_free_q, 0, sizeof(NETBUF_QUEUE_T));
	memset((char *)&net_rcv_q, 0, sizeof(NETBUF_QUEUE_T));
	
	for (i=0; i<NET_BUF_NUM; i++)
	{
		hdr = (NETBUF_HDR_T *)&netbuf[i];
		hdr->tag = NET_BUF_TAG;
		hdr->datap = (char *)hdr + NETBUF_HDR_SIZE;
		net_insert_queue_tail((NETBUF_QUEUE_T *)&net_free_q, (NETBUF_HDR_T *)hdr);
	}
}

/*----------------------------------------------------------------------
* net_insert_queue_first
*----------------------------------------------------------------------*/
static void net_insert_queue_first(NETBUF_QUEUE_T *queue, NETBUF_HDR_T *buf)
{
	if (!queue->first)
		queue->tail = buf;
		
	buf->next_buf = queue->first;
	queue->first  = buf;
	
	queue->total++;
}

/*----------------------------------------------------------------------
* net_insert_queue_tail
*----------------------------------------------------------------------*/
static void net_insert_queue_tail(NETBUF_QUEUE_T *queue, NETBUF_HDR_T *buf)
{
	if (queue->tail)
		queue->tail->next_buf = buf;
	else
		queue->first = buf;
		
	buf->next_buf = NULL;
	queue->tail = buf;
	queue->total++;
}

/*----------------------------------------------------------------------
* net_remove_queue_first
*----------------------------------------------------------------------*/
static NETBUF_HDR_T *net_remove_queue_first(NETBUF_QUEUE_T *queue)
{
	NETBUF_HDR_T *buf;
	
	if (queue->first)
	{
		buf = queue->first;
		queue->first = buf->next_buf;
		if (!queue->first)
			queue->tail = NULL;
		queue->total--;
		return buf;
	}
	else
		return NULL;
}

/*----------------------------------------------------------------------
* net_alloc_buf
*----------------------------------------------------------------------*/
NETBUF_HDR_T *net_alloc_buf(void)
{
	NETBUF_HDR_T *bufp;
	
	bufp = (NETBUF_HDR_T *)net_remove_queue_first(&net_free_q);
	
	// net_show_buf_info();
	
	return (NETBUF_HDR_T *)bufp;
}

/*----------------------------------------------------------------------
* net_free_buf
*----------------------------------------------------------------------*/
void net_free_buf(NETBUF_HDR_T *hdr)
{
	if (hdr->tag != NET_BUF_TAG)
	{
		dbg_printf(("Illegal Net Buffer header!\n"));
		return;
	}

	// net_show_buf_info();
	
	net_insert_queue_tail((NETBUF_QUEUE_T *)&net_free_q, (NETBUF_HDR_T *)hdr);
}

/*----------------------------------------------------------------------
* net_put_rcvq
*----------------------------------------------------------------------*/
void net_put_rcvq(NETBUF_HDR_T *hdr)
{
	if (hdr->tag != NET_BUF_TAG)
	{
		dbg_printf(("Illegal Net Buffer header!\n"));
		return;
	}
	
	net_insert_queue_tail((NETBUF_QUEUE_T *)&net_rcv_q, (NETBUF_HDR_T *)hdr);
}

/*----------------------------------------------------------------------
* net_get_rcvq
*----------------------------------------------------------------------*/
NETBUF_HDR_T *net_get_rcvq(void)
{
	NETBUF_HDR_T *bufp;
	
	bufp = (NETBUF_HDR_T *)net_remove_queue_first(&net_rcv_q);
	
	return (NETBUF_HDR_T *)bufp;
}

/*----------------------------------------------------------------------
* net_peek_rcvq
*----------------------------------------------------------------------*/
int net_peek_rcvq(void)
{
	return net_rcv_q.total;
}

/*----------------------------------------------------------------------
* net_show_buf_info
*----------------------------------------------------------------------*/
void net_show_buf_info(void)
{
	NETBUF_HDR_T 	*hdr;
	int 			total;
	int 			i;
	
	printf("Free net buffer  : %d\n", net_free_q.total);
	printf("Net Receive queue: %d\n", net_rcv_q.total);
	
	total = 0;
	hdr = (NETBUF_HDR_T *)net_free_q.first;
	for (i=0; i<net_free_q.total; i++)
	{
		if (hdr->tag != NET_BUF_TAG)
		{
			dbg_printf(("Illegal Net Buffer header of net_free_q!\n"));
			return;
		}
		total++;
		hdr = hdr->next_buf;
	}
	if (total != net_free_q.total)
		dbg_printf(("corrupt for net_free_q\n"));
		
	total = 0;
	hdr = (NETBUF_HDR_T *)net_rcv_q.first;
	for (i=0; i<net_rcv_q.total; i++)
	{
		if (hdr->tag != NET_BUF_TAG)
		{
			dbg_printf(("Illegal Net Buffer header of net_rcv_q!\n"));
			return;
		}
		total++;
		hdr = hdr->next_buf;
	}
	if (total != net_rcv_q.total)
		dbg_printf(("corrupt for net_rcv_q\n"));
		
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -