嵌入式TCP/IP学习笔记-NETIF协议【恢复】
NetIf.C //==============================================================
// 嵌入式 TCP/IP 协议栈 MSC51 专用版
// NETIF.C
// 作 者:南开大学-李章林
// 日 期:2008 年4 月
// 注 释:李清林
// 声 明:英文注释由作者李章林添加,中文注释由■李清林添加。
// 转载时请保留上述信息。
// 成都理工学院/应用数字系/应用数字专业
//==============================================================
#include "..\GloblDef\GloblDef.h"
#include "..\TCPIP\TCPIPmem.h"
#include "..\TCPIP\IP.h"
#include "..\TCPIP\Netif.h"
/* You can get a new netif from NetIfPool */
// 网络接口设备链表缓冲池
static struct SNetIf DT_XDATA NetIfPool;
/* list hearder of free Netifs buffer */
// 网络接口设备空闲链表头指针
static struct SNetIf DT_XDATA * DT_XDATA NetIfFreeList;
/* list header of Netifs */
// 网络接口设备使用链表头指针
static struct SNetIf DT_XDATA * DT_XDATA NetIfList;
//===========================================================================
// 作 者:南开大学-李章林
// 注 释:李清林
// 日 期:2008 年3 月
// 声 明:英文注释由作者李章林添加,中文注释由■李清林添加。
// 转载时请保留上述信息。
// 成都理工学院/应用数字系/应用数字专业
//---------------------------------------------------------------------------
// 程序名称:NetIfInit=网络接口初始化子程序
// 功 能:初始化网络接口设备已使用链表头指针
// 初始化网络接口设备空闲链表头指针
// 无论是著名的 uCOS/II、Small RTOS、操作系统都采用这种方式。
// 入口参数:
// 无
// 出口参数:
// 无
//===========================================================================
void NetIfInit() REENTRANT_MUL
{
WORD i; // 局部变量(记录缓冲池个数) NetIf.C
/* inti NetIfList */
// 初始化网络接口设备已使用链表头指针=NULL
NetIfList = NULL;
/* inti FreeList, chain up NetIfPool */
// NetIfFreeList = NULL 网络接口设备缓冲池空闲指针初始化=NULL
// 空闲网络接口设备串接起来
for (i = 0, NetIfFreeList = NULL; i < NET_IF_MAX_NUM; i++)
{
NetIfPool.pNext = NetIfFreeList;
NetIfFreeList = &NetIfPool;
}
}
//===========================================================================
/* add a netif to list, return NULL if insufficient mem */
// 作 者:南开大学-李章林
// 注 释:李清林
// 日 期:2008 年3 月
// 声 明:英文注释由作者李章林添加,中文注释由■李清林添加。
// 转载时请保留上述信息。
// 成都理工学院/应用数字系/应用数字专业
//---------------------------------------------------------------------------
// 程序名称:NetIfAAdd=网络接口添加子程序
// 入口参数:
// IPAddr=网络接口设备 IP 地址
// NetMask=网络接口设备子网掩码
// GateWay=网络接口设备网关
// void (DT_CODE * input)=网络接口设备接收指针函数
// BOOL (DT_CODE * output)=网络接口设备发送指针函数
// * Info=网络接口设备信息
// 出口参数:
// struct SNetIf DT_XDATA *=网络接口设备指针
// 如果网络接口设备已使用完,则返回 NULL
// 调用位置:
// 主程序 main()
//===========================================================================
struct SNetIf DT_XDATA * NetIfAdd(DWORD IPAddr, DWORD NetMask,DWORD GateWay,
void (DT_CODE * input)(struct SNetIf DT_XDATA * NetIf) REENTRANT_SIG,
BOOL (DT_CODE * output)(struct SMemHead DT_XDATA *MemHead,
struct SNetIf DT_XDATA* NetIf,DWORD DestIP) REENTRANT_SIG,
void DT_XDATA * Info) REENTRANT_MUL
{
struct SNetIf DT_XDATA * NetIf; // 临时网络接口设备指针
NetIf.C
/* get netif from free list */
// NetIf=网络接口设备空闲链表头指针
NetIf = NetIfFreeList;
// 空闲头指针指向网络接口设备队列下一个
NetIfFreeList = NetIfFreeList->pNext;
/* if add more than NET_IF_MAX_NUM return NULL */
if (NetIf != NULL)
{
// 填写网络接口设备的 IP 地址
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;
}
return NULL; // 返回 NULL
}
//===========================================================================
// 作 者:南开大学-李章林
// 注 释:李清林
// 日 期:2008 年3 月
// 声 明:英文注释由作者李章林添加,中文注释由■李清林添加。
// 转载时请保留上述信息。
// 成都理工学院/应用数字系/应用数字专业
//---------------------------------------------------------------------------
// 程序名称:NetIfFindRout=已使用网络接口设备中查找 IP 地址
// 入口参数:
// IPAddr=IP 地址
// 出口参数:
// 网络接口设备指针
// ??????????????????????????????????????
//=========================================================================== NetIf.C
struct SNetIf DT_XDATA * NetIfFindRout(IP_ADDR IPAddr) REENTRANT_SIG
{
struct SNetIf DT_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; // 如果未找到,返回已使用有头指针
}
//===========================================================================
// 作 者:南开大学-李章林
// 注 释:李清林
// 日 期:2008 年3 月
// 声 明:英文注释由作者李章林添加,中文注释由■李清林添加。
// 转载时请保留上述信息。
// 成都理工学院/应用数字系/应用数字专业
//---------------------------------------------------------------------------
// 程序名称:NetIfFindIP=已使用网络接口设备中查找 IP 地址子程序
// 入口参数:
// IPAddr=IP 地址
// 出口参数:
// 网络接口设备指针
//===========================================================================
struct SNetIf DT_XDATA * NetIfFindIP(IP_ADDR IPAddr) REENTRANT_MUL
{
struct SNetIf DT_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 */
// 作 者:南开大学-李章林 NetIf.C
// 注 释:李清林
// 日 期:2008 年3 月
// 声 明:英文注释由作者李章林添加,中文注释由■李清林添加。
// 转载时请保留上述信息。
// 成都理工学院/应用数字系/应用数字专业
//---------------------------------------------------------------------------
// 程序名称:NetIfTimer=网络接口定时器子程序
// 功 能:每隔一定的时间执行网络接口设备指向的上层接收程序
// 入口参数:
// 无
// 出口参数:
// 无
//===========================================================================
void NetIfTimer() REENTRANT_MUL
{
struct SNetIf DT_XDATA * NetIf; // 临时网络接口设备指针
/* if netif has data to come in */
// 循环遍历已使用网络接口设备链表,检查是否有数据报文
for (NetIf = NetIfList ; NetIf != NULL ; NetIf = NetIf->pNext)
NetIf->input(NetIf);
}
页:
[1]