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