1.lwIP网络接口简介
lwIP协议栈支持多种不同的网络接口(网卡),由于网卡是直接和硬件平台打交道,硬件不同则处理也是不同的,所以由用户提供最底层的接口函数,lwIP提供统一的接口,但是底层的实现需要用户自己去完成(ethernetif.c)。
一个系统中可能有多个网络接口,有可能是以太网,有可能是WIFI,也有可能是其他的网络接口,在lwIP中每一个网卡都由一个netif结构体来表示,这些结构体描述了各个网卡的底层实现函数及状态,并以链表形式链接起来。
netif屏蔽了硬件接口的差异,完成了对不同网络接口的抽象!
2.lwIP的netif结构
input根据需求,可以选择为ethernet_input,也可以选择为ip4_input;output就是low_level_output;linkoutput是回调函数,就是检查一下网线有没有插好这一类的;mtu,最大就是1500,网络层的数据包超过了就要切片。
这些成员变量都是根据相关网卡的特性,来填写的;网卡不同就会不同。
3.lwIP的netif相关函数
可以在netif.c/.h文件中进行查看。
lwIP网络接口的全局变量
全局变量struct netif* netif_list就会指向链表的表头;
全局变量struct netif *netif_default指向的netif结构所表示的网卡为缺省网卡;在发送消息的时候,会首先会通过这个网卡,若是没有回应,再使用其他网卡。
netif_add()
该函数首先会添加网卡的IP地址、子网掩码以及网关地址,并声明网卡状态,初始化以及输入;如果Ip地址、子网掩码、网关是空,那就是用默认的参数,并将这些参数清零;然后将output设置为netif_null_output_ip4,这个函数由用户定义,其实output是在ethernetif.c中定义,会把etharp_output赋值非netif->output,在经过网络层的时候会对数据包分析,判断是否包含MAC地址,如果没有就会暂存然后广播ARP;
然后设置mtu和flags等于0;然后设置input函数为ethernet_input(FreeRTOS版本就是tcpip_input);然后设置IP地址、子网掩码和网关;
定义一个netif2,然后就是单链表的添加操作,注意添加第一个链表以及最后一个链表的操作和判断(最多255个)。
netif_remove()
这个函数就是一个单链表的移除操作,操作一下next指针就可以了。
netif_set_default()
就是把netif_default的指针指向要设置的netif就可以了。
总结
这一小节挺轻松的,搞清楚硬件对应的IP地址、子网掩码、网关,然后设置一下各种结构体的状态就可以了。