以太网LWip_初始化过程

     首先应该看下源码包中的doc/rawapi.txt,这篇文档中介绍了初始化流程。

     初始化过程的前半部分主要针对lwip的内存管理和各个协议层,在src/core/init.c中有一个lwip_init()函数已经为我们做好了,直接调用即可;

     初始化过程的后半部分初始化网络接口,依次调用以下函数:

netif_add(如果有多个接口则需多次调用)

netif_set_default

netif_set_up

dhcp_start

调用netif_add函数时我们需要提供一个init函数指针,这个指针指向我们自己的硬件接口初始化函数,一般来说就是ethernetif.c中的ethernetif_init()。

static struct netif enc28j60;                  (1)  //网卡芯片

struct ip_addr ipaddr, netmask, gw;           (2) //IP地址、子网掩码、网关地址

IP4_ADDR(&gw, 192,168,0,1);              (3)  设置IP

IP4_ADDR(&ipaddr, 192,168,0,60);           (4)  设置 网关

IP4_ADDR(&netmask, 255,255,255,0);        (5)  设置子网掩码

netif_add(&enc28j60, &ipaddr, &netmask, &gw, NULL, ethernetif_init, ethernet_input);   (6) 添加配置

netif_set_default(&enc28j60);          (7)  调用 netif_set_default 函数初始化缺省网络接口,默认网络接口

netif_set_up(&enc28j60);              (8)使能网络接口 

 

(6)ethernetif_init 网络配置,

err_t   ethernetif_init(struct netif *netif) 

     netif->name[0] = IFNAME0;     //初始化变量 enc28j60 的 name 字段

     netif->name[1] = IFNAME1;                                         

     netif->output = etharp_output;   //IP 层发送数据包函数

     netif->linkoutput = low_level_output;    //ARP 模块发送数据包函数

     low_level_init(netif);           //底层硬件初始化函数

    return ERR_OK; 

}

//接收底层数据的函数,进行分析判断是IP数据包或者ARP数据包进行上传,传到上层进行处理

 

void   ethernetif_input(void *arg)    //创建该进程时,要将某个网络接口结构的 netif 结构指

{                              //针作为参数传入

     struct eth_hdr *ethhdr; 

     struct pbuf *p; 

     struct netif *netif = (struct netif *)arg;  

     while (1) 

     { 

           p = low_level_input (netif);   // 接收一个数据包

           if (p == NULL)       //  如果数据包为空,

            continue;     //  则循环结束,启动下次接收过程

            ethhdr = p->payload;    //  取得数据包内数据

      switch (htons(ethhdr->type))   //  判断数据包类型 注意大小端

      {                       //  只对 IP 数据包和 ARP 数据包进行处理

          case ETHTYPE_IP:        //   IP 数据包

          case ETHTYPE_ARP:      //   ARP 数据包

           if (netif->input(p, netif)!=ERR_OK)   //  将数据包发送到上层应用函数

          {   

             pbuf_free(p); 

             p = NULL; 

          } 

            break; 

            default: 

            pbuf_free(p); 

            p = NULL; 

            break; 

        }    //switch 

    }    //while 

}    //ethernetif_input 函数

     首先应该看下源码包中的doc/rawapi.txt,这篇文档中介绍了初始化流程。

     初始化过程的前半部分主要针对lwip的内存管理和各个协议层,在src/core/init.c中有一个lwip_init()函数已经为我们做好了,直接调用即可;

     初始化过程的后半部分初始化网络接口,依次调用以下函数:

netif_add(如果有多个接口则需多次调用)

netif_set_default

netif_set_up

dhcp_start

调用netif_add函数时我们需要提供一个init函数指针,这个指针指向我们自己的硬件接口初始化函数,一般来说就是ethernetif.c中的ethernetif_init()。

static struct netif enc28j60;                  (1)  //网卡芯片

struct ip_addr ipaddr, netmask, gw;           (2) //IP地址、子网掩码、网关地址

IP4_ADDR(&gw, 192,168,0,1);              (3)  设置IP

IP4_ADDR(&ipaddr, 192,168,0,60);           (4)  设置 网关

IP4_ADDR(&netmask, 255,255,255,0);        (5)  设置子网掩码

netif_add(&enc28j60, &ipaddr, &netmask, &gw, NULL, ethernetif_init, ethernet_input);   (6) 添加配置

netif_set_default(&enc28j60);          (7)  调用 netif_set_default 函数初始化缺省网络接口,默认网络接口

netif_set_up(&enc28j60);              (8)使能网络接口 

 

(6)ethernetif_init 网络配置,

err_t   ethernetif_init(struct netif *netif) 

     netif->name[0] = IFNAME0;     //初始化变量 enc28j60 的 name 字段

     netif->name[1] = IFNAME1;                                         

     netif->output = etharp_output;   //IP 层发送数据包函数

     netif->linkoutput = low_level_output;    //ARP 模块发送数据包函数

     low_level_init(netif);           //底层硬件初始化函数

    return ERR_OK; 

}

//接收底层数据的函数,进行分析判断是IP数据包或者ARP数据包进行上传,传到上层进行处理

 

void   ethernetif_input(void *arg)    //创建该进程时,要将某个网络接口结构的 netif 结构指

{                              //针作为参数传入

     struct eth_hdr *ethhdr; 

     struct pbuf *p; 

     struct netif *netif = (struct netif *)arg;  

     while (1) 

     { 

           p = low_level_input (netif);   // 接收一个数据包

           if (p == NULL)       //  如果数据包为空,

            continue;     //  则循环结束,启动下次接收过程

            ethhdr = p->payload;    //  取得数据包内数据

      switch (htons(ethhdr->type))   //  判断数据包类型 注意大小端

      {                       //  只对 IP 数据包和 ARP 数据包进行处理

          case ETHTYPE_IP:        //   IP 数据包

          case ETHTYPE_ARP:      //   ARP 数据包

           if (netif->input(p, netif)!=ERR_OK)   //  将数据包发送到上层应用函数

          {   

             pbuf_free(p); 

             p = NULL; 

          } 

            break; 

            default: 

            pbuf_free(p); 

            p = NULL; 

            break; 

        }    //switch 

    }    //while 

}    //ethernetif_input 函数

猜你喜欢

转载自blog.csdn.net/zhipao6108/article/details/81232902
今日推荐