一、简介
一个系统中可能有多个网络接口,有时候是以太网,有时候是WIFI,也有可能是其他网络接口,在LwIP中每个网卡都由一个netif结构体表示,这些结构体描述了网卡的底层实现函数及状态。有多少个网卡,就有多少个netif结构体,这些结构体以链表的形式进行链接。
二、netif结构体
input:指向数据包输入函数,一般指向ethernet_input函数,也可以是ip4_input函数
output:指向数据包的待发送函数(即检测目标IP地址是否存在对应的MAC地址,如果没有,先把数据暂存起来,然后通过数据包的待发送函数向对方主机发送一个ARP请求包,对方主机接收到请求包后会相应的返回一个ARP应答包,应答包中包含了MAC地址)
linkoutput:将以太网数据发送到对方主机中
link_callback:检测是否存在网线连接
state:描述网卡状态
mtu:以太网最大传输单元1500字节
三、netif网络接口函数
1、netif_add()函数 :
/*第一次添加网卡*/netif->next = netif_list; //未添加网卡前netif_list无指向,即netif的next指向nullnetif_list = netif;
/*第二次添加网卡*/netif1->next = netif; netif_list = netif1;
2、 netif_remove()函数:
/*第一步:判断我们要移除的网卡是否为空,不为空跳出相应的if语句,继续执行*/if (netif == NULL)
{return;
}/*第二步:判断要移除的网卡是否处于开启状态,如果是,则将该网卡进行关闭*/if (netif_is_up(netif))
{ netif_set_down(netif);
}/*第三步:判断是否是默认的网卡*/if (netif_default == netif)
{netif_set_default(NULL);
}/*第四步:移除网卡*/if (netif_list == netif1) //移除netif1。如果netif_list指向netif1,就让netif_list指向netif(即netif1->next)
{netif_list = netif1->next;
}else //移除netif
{struct netif * tmpNetif;for (tmpNetif = netif_list; tmpNetif != NULL; tmpNetif = tmpNetif->next) {if (tmpNetif->next == netif) {tmpNetif->next = netif->next;break;
}
移除netif1图片:
移除netif图片:
3、netif_set_default()函数:
netif_set_default(struct netif *netif)
{if (netif == NULL) {/* remove default route */snmp_delete_iprteidx_tree(1, netif);} else {/* install default route */snmp_insert_iprteidx_tree(1, netif);}netif_default = netif;//如果要设置netif为默认网卡,则直接让netif_default指向netif就可以了LWIP_DEBUGF(NETIF_DEBUG, ("netif: setting default interface %c%c\n",netif ? netif->name[0] : '\'', netif ? netif->name[1] : '\''));
}