113、Zephyr RTOS网络协议栈基础:IPv4与IPv6
Zephyr RTOS网络协议栈基础:IPv4与IPv6
从一次现场调试说起
去年冬天在东北某工厂调试一套基于Zephyr的工业网关,设备上电后能ping通内网服务器,但就是无法通过IPv6访问云端管理平台。抓包一看,路由器RA(Router Advertisement)报文设备收到了,但Zephyr的IPv6栈就是没自动配置出全球单播地址。当时现场零下十几度,蹲在机柜旁用串口敲命令,心里那个急——后来发现是Kconfig里漏开了CONFIG_NET_IPV6_ND,默认的邻居发现协议没使能。这个坑让我意识到,Zephyr的网络协议栈虽然封装得漂亮,但底层细节不懂,现场就是抓瞎。
今天这篇笔记,咱们就掰开揉碎聊聊Zephyr的IPv4和IPv6实现。不扯虚的,全是调试时淌过的浑水。
协议栈的骨架:L2与L3的分工
Zephyr的网络协议栈设计得很“嵌入式”——它没有Linux那种庞大的网络子系统,而是把L2(链路层)和L3(网络层)拆成可裁剪的模块。你打开subsys/net/ip/目录,能看到net_if.c、net_pkt.c这些核心文件,但千万别以为直接读源码就能懂。我建议先理解它的数据流:
应用层发数据 -> socket层 -> IP路由选择 -> L2输出(比如以太网或6LoWPAN)
接收方向反过来:L2输入 -> IP层解包 -> 传输层分发 -> socke
