gpt4 book ai didi

c - recvmsg 的 Linux SocketCAN 行为

转载 作者:行者123 更新时间:2023-12-03 09:57:47 26 4
gpt4 key购买 nike

我正在编写一个 CAN 记录器程序。我记录数据的方式类似于 candump -tool 在调用 candump 时执行此操作喜欢 candump any :
https://github.com/linux-can/can-utils/blob/master/candump.ccandump any使candump绑定(bind)到任何设备,即 addr.can_ifindex = 0;然后它使用 recvmsg获取 CAN 帧,然后获取 struct msghdr msg;附加时间戳将其写入日志文件或屏幕上。
我的问题是,内核是否确保以下 assert总是有效的?

struct msghdr msg;
// init stuff
// ...
s[0] = _skt_1; // can0
s[1] = _skt_2; // can1
// configure and bind sockets
// ...
select(s[1]+1, &rdfs, NULL, NULL, NULL));
recvmsg(s[0], &msg, 0); // https://linux.die.net/man/2/recvmsg
timestamp_1 = getTimestamp(msg);
recvmsg(s[1], &msg, 0); // https://linux.die.net/man/2/recvmsg
timestamp_2 = getTimestamp(msg);
// Always valid?
assert(timestamp_1 < timestamp_2);
对 SocketCAN 驱动程序中的源代码位置的提示也会有所帮助。

最佳答案

简短的回答是肯定的,除非你的司机做了一些很奇怪的事情。 CAN 使用与其他网络设备相同的 netif 子系统。 SKB 有几种方法可以获取时间戳。
硬件时间戳:
如果您的驱动程序使用硬件时间戳,则时间戳基于硬件提供的任何内容。
软件时间戳:
如果 netdev_tstamp_prequeue启用,则在您的驱动程序将 skb 提交到 netif_receive_skb 后不久就会有一个时间戳
https://elixir.bootlin.com/linux/v4.14.202/source/net/core/dev.c#L4554
如果 netdev_tstamp_prequeue未启用,则在更多处理后应用时间戳,但仍在同一个 NAPI 接收线程中。
https://elixir.bootlin.com/linux/v4.14.202/source/net/core/dev.c#L4352
这是模糊部分:
有一些特殊模式 (RSP/RFP) 允许内核使用 SMP 对 skb 处理进行负载平衡。内核不是在 napi 接收线程中处理 skb,而是将 skb 放入每个 cpu 队列中。现在如果 netdev_tstamp_prequeue未启用时,时间戳会在一段时间后从每个 CPU 队列中退出时添加。但是,文档说接收顺序没有修改,因此时间戳也应该保持顺序。

关于c - recvmsg 的 Linux SocketCAN 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63266390/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com