01網絡接口簡介
TCP/IP參考模型中網絡分為4層:應用層、傳輸層、網絡層和網絡接口層。網絡接口層就對應著我們實際的網卡,LWIP支持多網口設計,LWIP中使用netif來描述每種網絡接口的特性,如接口的IP地址、接口狀態等等。那么如果有多個網卡的話LWIP是如何來組織這些網卡呢?在LWIP中用鏈表netif_list來管理眾多的網卡,當上層有數據要發送的時候LWIP會從netif_list鏈表中選擇一個合適的網卡來將數據發送出去。
02netif結構
netif結構體在文件netif.h中有定義,netif結構體中每個成員變量的含義如下:
next:該字段指向下一個neitif類型的結構體,因為LWIP可以支持多個網絡接口,當設備有多個網絡接口的話LWIP就會把所有的netif結構體組成鏈表來管理這些網絡接口。
ipaddr,netmask和gw:分別為網絡接口的IP地址、子網掩碼和默認網關。
input:此字段為一個函數,這個函數將網卡接收到的數據交給IP層。
output:此字段為一個函數,當IP層向接口發送一個數據包時調用此函數。這個函數通常首先解析硬件地址,然后發送數據包。此字段我們一般使用etharp.c中的etharp_output()函數。
linkoutput:此字段為一個函數,該函數被ARP模塊調用,完成網絡數據的發送。上面說的etharp_output函數將IP數據包封裝成以太網數據幀以后就會調用linkoutput函數將數據發送出去。
state:用來定義一些關于接口的信息,用戶可以自行設置。
mtu:網絡接口所能傳輸的最大數據長度,一般設置為1500。
hwaddr_len:網卡MAC地址長度,6個字節。
hwaddr:MAC地址。
flags:網絡的接口狀態,屬性信息字段。
name:網卡的名字。
num:此字段為協議棧為每個網絡接口設置的一個編號,編號從0開始。
flags的取值:
其中
在網絡初始化中,在ethernetif.c中
他們對應的都是一個函數
etharp_output:ip層發送數據包函數
low_level_output :ARP模塊發送函數,更底層的函數,其實etharp_output還是調用此函數
03相關函數
3.1、netif_add
- netif_add(struct netif *netif, ip_addr_t *ipaddr, ip_addr_t *netmask, ip_addr_t
- *gw, void *state, netif_init_fn init, netif_input_fn input)
就是把netif網絡接口添加到網絡list隊列中,向網卡列表中添加一個網卡
3.2、netif_set_default
- netif_set_default(struct netif *netif)
將這個網卡設置為默認網卡
3.3、netif_set_up
- netif_set_up(struct netif *netif)
打開網卡
原文地址:https://mp.weixin.qq.com/s/lO5dJtg_DolHH2_uUZMOVQ