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

📄 netif.c.svn-base

📁 数字广播系统的开发源码
💻 SVN-BASE
字号:
/*
 */

#include "GloblDef.h"
#include "TCPIPmem.h"
#include "IP.h"
#include "Netif.h"

/* You can get a new netif from NetIfPool */
static struct SNetIf xdata NetIfPool[NET_IF_MAX_NUM];

/* list hearder of free Netifs buffer */
static struct SNetIf xdata * xdata NetIfFreeList;

/* list header of Netifs */
static struct SNetIf xdata * xdata NetIfList;

void NetIfInit() reentrant
{
	unsigned int count;

	/* inti NetIfList */
	NetIfList = NULL;

	/* inti FreeList, chain up NetIfPool */
	for(count = 0, NetIfFreeList = NULL; count < NET_IF_MAX_NUM; count++)
	{
		NetIfPool[count].pNext = NetIfFreeList;
		NetIfFreeList = &NetIfPool[count];
	}
}

/* add a netif to list, return NULL if insufficient mem */
struct SNetIf xdata * NetIfAdd(unsigned short IPAddr, unsigned short NetMask,unsigned short GateWay,
						 void (code * input)(struct SNetIf xdata * NetIf) reentrant,
						 BOOL (code * output)(struct SMemHead xdata *MemHead,struct SNetIf xdata* NetIf,unsigned short DestIP) reentrant,
						 void xdata * Info) reentrant
{
	struct SNetIf xdata * NetIf;

	/* get netif from free list */
	NetIf = NetIfFreeList;
	NetIfFreeList = NetIfFreeList->pNext;

	/* if add more than NET_IF_MAX_NUM return NULL */
	if(NetIf == NULL)
		return NULL;
	else
	{
		NetIf->IPAddr	= htonl(IPAddr);
		NetIf->NetMask	= htonl(NetMask);
		NetIf->GateWay	= htonl(GateWay);
		NetIf->input	= input;
		NetIf->output	= output;
		NetIf->Info		= Info;

		/* add to the head of the list */
		NetIf->pNext = NetIfList;
		NetIfList = NetIf;

		return NetIf;
	}
}

/* find a netif which NetIf->NetMask & NetIf->NetAddr ==
NetIf->NetMask & IPAddr */
struct SNetIf xdata * NetIfFindRout(IP_ADDR IPAddr) reentrant
{
	struct SNetIf xdata *NetIf;
	for(NetIf = NetIfList; NetIf != NULL; NetIf = NetIf->pNext)
	{
		if((NetIf->NetMask & NetIf->IPAddr) == (NetIf->NetMask & IPAddr))
			return NetIf;
	}

	/* if can't find any suitable Netif, return NetIfList. That is the
	first netif is the default Netif*/
	return NetIfList;
}

struct SNetIf xdata * NetIfFindIP(IP_ADDR IPAddr) reentrant
{
	struct SNetIf xdata *pNetIf;
	for(pNetIf = NetIfList; pNetIf != NULL; pNetIf = pNetIf->pNext)
	{
		if(pNetIf->IPAddr == IPAddr)
			break;
	}
	return pNetIf;
}

/* net inteftimer. use to packup packet from every net interface */
void NetIfTimer() reentrant
{
	struct SNetIf xdata * NetIf;

	/* if netif has data to come in */
	for(NetIf = NetIfList; NetIf != NULL; NetIf = NetIf->pNext)
		NetIf->input(NetIf);
}

⌨️ 快捷键说明

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