netif.c

来自「实现在ARM上的ICP/IP功能的源代码。」· C语言 代码 · 共 105 行

C
105
字号
#include "debug.h"
#include "true_false.h"
#include "stdlib.h"
#include "typedef.h"
#include "mem_man.h"
#include "rtl8019.h"
#include "etherif.h"
#include "ip.h"
#include "netif.h"
#include "arp.h"
#include "utilities.h"

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

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

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

void NetIfInit()  
{
	WORD 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   * NetIfAdd(DWORD IPAddr, DWORD NetMask,DWORD GateWay,
						 void (  * input)(struct SNetIf   * NetIf)  ,
						 BOOL (  * output)(struct SMemHead   *MemHead,struct SNetIf  * NetIf,DWORD DestIP)  ,
						 void   * Info)  
{
	struct SNetIf   * 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   * NetIfFindRout(IP_ADDR IPAddr)  
{
	struct SNetIf   *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   * NetIfFindIP(IP_ADDR IPAddr)  
{
	struct SNetIf   *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()  
{
	struct SNetIf   * 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 + =
减小字号Ctrl + -
显示快捷键?