c++clinuxcan-bussocketcan

How to create a stop-filter (instead of a pass-filter) when reading CAN messages? [C++, Linux]


I am using a SocketCAN to access the CAN bus. I have successfully created pass-filters like this:

struct can_filter m_Filter;
// ... setting up m_Filters
setsockopt(m_CanSockId, SOL_CAN_RAW, CAN_RAW_FILTER, m_Filter,
           sizeof(struct can_filter));

This instructs to let CAN messages pass when meeting the filter settings.

Now I want to create a stop-filter but I do not know how to do it. For example: I wish to let all CAN messages pass except the ones with ID 0x18DAF101.

Does anybody know how to do it?


Solution

  • You have to set the bit CAN_INV_FILTER in your filter to invert the filter logic.

    From the documentation behind the link you have provided:

    The filter can be inverted in this semantic, when the CAN_INV_FILTER bit is set in can_id element of the can_filter structure.