微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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中进行了说明)。您必须将所有这些缓冲区的大小加在一起才能获得缓冲帧的总数。但是这些缓冲区的变化可能比查询其大小所需的时间更快。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。