C语言代码分析:netif_set_up函数
本文将对以下代码进行详细的解析和解释:
/**
* @ingroup netif
* Bring an interface up, available for processing
* traffic.
*/
void
netif_set_up(struct netif *netif)
{
LWIP_ASSERT_CORE_LOCKED();
LWIP_ERROR("netif_set_up: invalid netif", netif != NULL, return);
if (!(netif->flags & NETIF_FLAG_UP)) {
netif_set_flags(netif, NETIF_FLAG_UP);
MIB2_COPY_SYSUPTIME_TO(&netif->ts);
NETIF_STATUS_CALLBACK(netif);
#if LWIP_NETIF_EXT_STATUS_CALLBACK
{
netif_ext_callback_args_t args;
args.status_changed.state = 1;
netif_invoke_ext_callback(netif, LWIP_NSC_STATUS_CHANGED, &args);
}
#endif
netif_issue_reports(netif, NETIF_REPORT_TYPE_IPV4 | NETIF_REPORT_TYPE_IPV6);
#if LWIP_IPV6
nd6_restart_netif(netif);
#endif /* LWIP_IPV6 */
}
}
1. 函数介绍
netif_set_up
函数是lwIP协议栈中的一个函数,这个函数的作用是启动一个网络接口,并使其可以处理网络数据包。
函数的原型为:
void netif_set_up(struct netif *netif);
2. 参数解析
netif_set_up
函数只有一个参数,即struct netif *netif
,表示需要启动的网络接口。
3. 代码详解
3.1 确认核心已锁定
LWIP_ASSERT_CORE_LOCKED();
这个宏用于确保在调用netif_set_up
函数的时候,lwIP的核心已经被锁定,防止并发问题。
3.2 检查网络接口是否有效
LWIP_ERROR("netif_set_up: invalid netif", netif != NULL, return);
这里检查传入的网络接口是否为NULL,如果为NULL,那么就打印错误信息并返回。
3.3 设置网络接口状态
if (!(netif->flags & NETIF_FLAG_UP)) {
netif_set_flags(netif, NETIF_FLAG_UP);
...
}
如果网络接口的当前状态不是UP,那么就将其状态设置为UP。
3.4 设置网络接口的时间戳
MIB2_COPY_SYSUPTIME_TO(&netif->ts);
这里将当前的系统运行时间复制到网络接口的时间戳中。
3.5 调用网络接口的状态回调函数
NETIF_STATUS_CALLBACK(netif);
这里调用了网络接口的状态回调函数,通知其他部分网络接口的状态已经改变。
3.6 触发扩展回调函数
#if LWIP_NETIF_EXT_STATUS_CALLBACK
{
netif_ext_callback_args_t args;
args.status_changed.state = 1;
netif_invoke_ext_callback(netif, LWIP_NSC_STATUS_CHANGED, &args);
}
#endif
如果定义了LWIP_NETIF_EXT_STATUS_CALLBACK
,那么就会触发网络接口的扩展回调函数。
3.7 发送网络接口报告
netif_issue_reports(netif, NETIF_REPORT_TYPE_IPV4 | NETIF_REPORT_TYPE_IPV6);
这里发送了一个网络接口报告,报告的类型是IPv4和IPv6。
3.8 重启网络接口
#if LWIP_IPV6
nd6_restart_netif(netif);
#endif /* LWIP_IPV6 */
如果定义了LWIP_IPV6
,那么就会重启网络接口,以便处理IPv6的数据包。
4. 总结
netif_set_up
函数是lwIP协议栈中非常重要的一个函数,它负责启动一个网络接口,并使其可以处理网络数据包。这个函数的实现涉及到了很多