都是针对网卡netif的操作。
这两组函数,对应的是两个标志位:NETIF_FLAG_UP和NETIF_FLAG_LINK_UP。
那么,这两个标志位的作用到底有什么不同呢?
NETIF_FLAG_UP
对应的函数是
void netif_set_up(struct netif *netif) 和void netif_set_down(struct netif *netif)
看注释:
/**
* @ingroup netif
* Bring an interface up, available for processing
* traffic.
*/
void
netif_set_up(struct netif *netif)
/**
* @ingroup netif
* Bring an interface down, disabling any traffic processing.
*/
void
netif_set_down(struct netif *netif)
意思是,设置网卡netif是Enable还是Disable。
对比windows下面,相当于是在资源管理器中“禁用设备”/“启用设备”
禁用设备后,会使其停止运行。对应netif_set_down()的“disabling any traffic processing.”
禁用后的状态是这个样子的:
因此,netif_set_up()函数一般是在初始化时调用,在netif_add()之后,使能网卡。
与之相对应的还有个回调接口:
/**
* @ingroup netif
* Set callback to be called when interface is brought up/down or address is changed while up
*/
void
netif_set_status_callback(struct netif *netif, netif_status_callback_fn status_callback)
{
LWIP_ASSERT_CORE_LOCKED();
if (netif) {
netif->status_callback = status_callback;
}
}
当netif_set_up()或者netif_set_down()函数被调用时,就会调用回调函数:status_callback
NETIF_STATUS_CALLBACK(netif);
#if LWIP_NETIF_STATUS_CALLBACK
#define NETIF_STATUS_CALLBACK(n) do{ if (n->status_callback) { (n->status_callback)(n); }}while(0)
#else
#define NETIF_STATUS_CALLBACK(n)
#endif /* LWIP_NETIF_STATUS_CALLBACK */
这里的ststus指的就是网络是否工作(是否使能)的状态。
NETIF_FLAG_LINK_UP
字面上的意思是,链路状态。
比如,网线没插好,那么这个Link Status就是down。
对比windows下面,就是这个状态:
与禁用后的状态对比一下,可以看到明显的区别。
LWIP中,与之相对应的也有两个函数:
/**
* @ingroup netif
* Called by a driver when its link goes up
*/
void
netif_set_link_up(struct netif *netif)
/**
* @ingroup netif
* Called by a driver when its link goes down
*/
void
netif_set_link_down(struct netif *netif)
看注释,很明显是需要驱动层去调用的,设置为link-up或者link-down的状态。
为什么呢?因为lwip本身是不管理网卡驱动的,它不知道网卡当前是什么状态,只有网卡驱动才知道网线插好了没有。因此,驱动层应该获取PHY芯片的的状态,然后告知lwip。
与之对应的,也有一个回调函数:
/**
* @ingroup netif
* Set callback to be called when link is brought up/down
*/
void
netif_set_link_callback(struct netif *netif, netif_status_callback_fn link_callback)
{
LWIP_ASSERT_CORE_LOCKED();
if (netif) {
netif->link_callback = link_callback;
}
}
这个是给应用层用的。应用层可以通过它,配置一个回调函数,当驱动层调用了netif_set_link_up()或者netif_set_link_down()的时候,如果link_status状态发生变化,就会进一步通知应用层。