2

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

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

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

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

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

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

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

但是这两个变量的值仍然是 -1,所以它没有被写入。我在这里做错了什么?

4

1 回答 1

1

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

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

于 2020-10-26T13:32:54.373 回答