ba_wang_mao 发表于 2008-12-17 11:33:44

嵌入式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); 

} 

armok 发表于 2010-2-14 21:22:08

页: [1]
查看完整版本: 嵌入式TCP/IP学习笔记-NETIF协议【恢复】