SocketCAN:如何查询缓冲区使用情况

问题描述

我正在尝试确定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,因此未写入。我在这里做什么错了?

解决方法

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

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