我们正在尝试实现GOOSE消息(多播消息,通用面向对象变电站事件,IEC61850协议标准的一部分)订阅模块。几乎在所有情况下,我们都能够毫无延迟地读取 GOOSE 消息。但间歇性地,GOOSE 消息会在延迟 3 秒后到达应用程序。分析在错误情况下捕获的 PCAP 文件时,我们注意到 GOOSE 消息毫无延迟地到达设备网络层。
我们使用recvfrom
call 从子层获取消息。
Linux版本:linux-3.8.13
接听电话如下:
unsigned char etherFrameRx[1518];
recvLen = recvfrom (hPktSock, etherFrameRx, sizeof(etherFrameRx),
MSG_TRUNC, NULL, NULL);
套接字初始化如下:
hPktSock = socket (PF_PACKET, SOCK_RAW, htons(ETH_P_ALL);
arg |= O_NONBLOCK;
ret = fcntl (hPktSock, F_SETFL, arg);
虽然注意到延迟(设备 MAC 层的消息接收与应用程序的消息接收之间的时间),但应用程序连续接收目标 MAC 为“全零”(0:0:0:0:0:0) 的帧。而在Wireshark日志(eth0接口)中,我们无法注意到此类消息。这些来自内核的连续异常消息延迟了 GOOSE 的接收。
设备时间同步后,出现该问题的概率较高。 SNTP 是用于时间同步的机制。
在错误情况下使用 Wireshark(安装在订阅 GOOSE 的设备上)捕获的 .pcap 文件在以下路径共享:
[无法使用]
日志中,GOOSE消息是在12:36:11.636989收到的。但应用程序上的更新时间为 12:36:14.8012
为什么 Linux 内核返回目标 MAC 全部为零的帧?