Lwip 使用流程

Lwip首先進行內存分配:Mem_init()內存棧起止地址,空閒列表初始化;Memp_init()內存池初始化,二者的詳細比較會在http://my.oschina.net/u/274829/blog/272530,進行了詳細的說明網絡

內存分配完以後,進行網絡配置,設置IP,默認子網掩碼,網關等設置,函數

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

struct ip_addr ipaddr, netmask, gw;           (2) //IP地址、子網掩碼、網關地址.net

IP4_ADDR(&gw, 192,168,0,1);              (3)  設置IPorm

IP4_ADDR(&ipaddr, 192,168,0,60);           (4)  設置 網關blog

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 函數初始化缺省網絡接口,默認網絡接口ip

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 函數

相關文章
相關標籤/搜索