3

我正在尝试过滤具有某些 ID 的 CAN 帧,如下所述:https ://landlock.io/linux-doc/landlock-v8/networking/can.html#raw-protocol-sockets-with-can-filters-sock -生的

我的部分代码:

struct can_filter rfilter[4];

if ((s = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0) {
    fprintf(stderr, "Error while opening socket.\n");
    exit(EXIT_FAILURE);
}
rfilter[0].can_id   = 0x0D6 | CAN_INV_FILTER;
rfilter[0].can_mask = CAN_SFF_MASK;
rfilter[1].can_id   = 0x0D8 | CAN_INV_FILTER;
rfilter[1].can_mask = CAN_SFF_MASK;
rfilter[2].can_id   = 0x0E4 | CAN_INV_FILTER;
rfilter[2].can_mask = CAN_SFF_MASK;
rfilter[3].can_id   = 0x77F | CAN_INV_FILTER;
rfilter[3].can_mask = CAN_SFF_MASK;
setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter, sizeof(rfilter));

如果我只使用我的四个过滤器中的一个并注释掉其他三个,它会按预期工作。如果我使用所有四个过滤器,它根本不起作用。在那种情况下,我仍然可以在 CANbus 接口上接收所有内容。

所以,我的猜测是我的过滤器以某种方式相互抵消?!我需要更改什么来过滤 CAN ID 0x0D6、0x0D8、0x0E4 和 0x77F?

4

2 回答 2

5

像您一样使用 CAN_INV_FILTER 时,您指定“除 ID_x 之外的所有内容都通过”。

使用 CAN_RAW_FILTER 时,会检查是否有规则让接收到的 ID 通过。在您的情况下,您的规则相互矛盾,这就是为什么没有过滤任何内容。

文档中:

4.1.6 RAW 套接字选项 CAN_RAW_JOIN_FILTERS

CAN_RAW 套接字可以设置多个 CAN 标识符特定的过滤器,从而导致 af_can.c 过滤器处理中的多个过滤器。这些过滤器彼此独立,在应用时会导致逻辑或过滤器(参见 4.1.1)。

此套接字选项以仅将 CAN 帧传递到与所有给定 CAN 过滤器匹配的用户空间的方式连接给定的 CAN 过滤器。因此,所应用过滤器的语义更改为逻辑 AND。

当过滤器集是过滤器的组合时,这很有用,其中设置了 CAN_INV_FILTER 标志以便从传入流量中切出单个 CAN ID 或 CAN ID 范围。

要获得预期的行为,您应该替换:

setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter, sizeof(rfilter));

经过:

setsockopt(s, SOL_CAN_RAW, CAN_RAW_JOIN_FILTERS, &rfilter, sizeof(rfilter));

注意:您的 Linux 内核可能不支持 CAN_RAW_JOIN_FILTERS 选项

于 2019-05-29T09:57:21.923 回答
1

您首先需要提供 CAN 过滤器:

setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter, sizeof(rfilter));

还有一个整数值,用于通过 setsockopt() 启用CAN_RAW_JOIN_FILTERS

int join_filter = 1;
setsockopt(s, SOL_CAN_RAW, CAN_RAW_JOIN_FILTERS, &join_filter, sizeof(join_filter));

顺便提一句。如果您向 setsockopt() 的 CAN_RAW_JOIN_FILTERS 提供 CAN 过滤器,这是一个意外的长度,应该产生 -EINVAL 作为返回码。

参见 candump 代码: https ://github.com/linux-can/can-utils/commit/1a2467ed29302149d4d1253888ac1f1dfcc11d3f

是的,Linux 4.4 支持 CAN_RAW_JOIN_FILTERS :-)

于 2019-08-27T18:38:10.117 回答