我正试图确定我在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,所以它没有写到。我在这里做错什么了?
发布于 2020-10-26 13:32:54
我不知道有什么方法可以查询内核缓冲区的当前大小,只有它们的最大容量。但是,您可以在/sys/class/net/can0/queues/tx-0
和类似目录下找到传输队列的一些统计信息。
即使可以在内核缓冲区中获得当前帧数,回答问题也是很复杂的,因为涉及到多个缓冲区。除了网络接口的发送队列之外,还有套接字的发送缓冲区。这两者之间的交互可能会导致一些意想不到的行为(有关更多细节,请参见https://rtime.felk.cvut.cz/can/socketcan-qdisc-final.pdf中的3.4节)。除此之外,Linux还允许您添加具有不同队列规则的额外队列(PDF中也解释了这一点)。您必须将所有这些缓冲区的大小相加,才能得到缓冲帧的总数。但这些缓冲区的变化可能比查询它们的大小所需的时间还要快。
https://stackoverflow.com/questions/64450019
复制相似问题