【问题标题】:SocketCAN: How to query buffer usageSocketCAN:如何查询缓冲区使用情况
【发布时间】:2020-10-20 17:04:43
【问题描述】:

我正在尝试确定我在 linux 上的 CAN 接口的缓冲区使用情况。

在界面层面,我知道两种获取统计信息的方法:

  • 来自/proc/net/can/stats
  • ip -details -statistics link show can0

第一个给我发送/接收帧的数量。第二个给出了发送/接收的字节和数据包的数量,以及丢弃的数据包和溢出的数量。 不幸的是,这些都没有显示缓冲区中的当前帧/字节数。

注意:我知道我们可以设置 txqueuelen (ifconfig can0 txqueuelen <len>),设置太低会在填满时触发 write: No buffer space available。但是我仍然无法随时获取队列中的帧数。

在套接字级别(套接字像这样打开:socket(PF_CAN, SOCK_RAW, CAN_RAW)),我尝试查询输入/输出队列大小(可以在 Internet 套接字上完成):

int queued_in = -1;
ioctl(sockfd, SIOCINQ, &queued_in);
int queued_out = -1;
ioctl(sockfd, SIOCOUTQ, &queued_out);

但两个变量的值都保持为 -1,因此没有写入。我在这里做错了什么?

【问题讨论】:

    标签: linux sockets networking can-bus socketcan


    【解决方案1】:

    我不知道有什么方法可以查询内核缓冲区的当前大小,只知道它们的最大容量。但是,您可以在/sys/class/net/can0/queues/tx-0 和类似目录下找到传输队列的一些统计信息。

    即使您可以获取内核缓冲区中的当前帧数,回答您的问题也很复杂,因为涉及到多个缓冲区。除了网络接口的传输队列外,还有套接字的发送缓冲区。这两者之间的交互可能会导致一些意外行为(有关更多详细信息,请参阅https://rtime.felk.cvut.cz/can/socketcan-qdisc-final.pdf 中的第 3.4 节)。最重要的是,Linux 允许您添加具有不同排队规则的额外队列(也在该 PDF 中进行了解释)。您必须将所有这些缓冲区的大小加在一起才能获得缓冲帧的总数。但这些缓冲区的变化可能比查询其大小所需的时间更快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-05
      • 1970-01-01
      • 2015-03-31
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多