lwip中netif_set_up和netif_set_link_up的区别

都是针对网卡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状态发生变化,就会进一步通知应用层。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值