From: Marc Kleine-Budde <mkl@pengutronix.de>
To: Oliver Hartkopp <socketcan@hartkopp.net>,
Sebastian Haas <dev@sebastianhaas.info>,
Kurt Van Dijck <kurt.van.dijck@eia.be>,
Sandro Anders | CarMediaLab <sandro.anders@carmedialab.de>
Cc: linux-can Mailing List <linux-can@vger.kernel.org>
Subject: Re: RFC: (optional) software filtering in candump
Date: Tue, 17 Mar 2015 11:44:58 +0100 [thread overview]
Message-ID: <550805AA.4010306@pengutronix.de> (raw)
In-Reply-To: <51AA01F0.8020308@hartkopp.net>
[-- Attachment #1: Type: text/plain, Size: 5233 bytes --]
On 06/01/2013 04:15 PM, Oliver Hartkopp wrote:
> Hi all,
>
> On 30.05.2013 17:37, Sebastian Haas wrote:
>> Am 30.05.2013 14:35, schrieb Kurt Van Dijck:
>>> On Thu, May 30, 2013 at 02:07:03PM +0200, Oliver Hartkopp wrote:
>>>> Am 30.05.2013 12:17, schrieb Kurt Van Dijck:
>>>>> On Thu, May 30, 2013 at 11:06:30AM +0200, Sebastian Haas wrote:
>>>>>> Am 30.05.2013 10:49, schrieb Oliver Hartkopp:
>>>>>>>>> On 29.05.2013 22:55, Sebastian Haas wrote:
>>>>>>>>>> If I start candump this way:
>>>>>>>>>> sh@helios:~/workspace/node-can$ candump vcan0,100~7ff,101~7ff
>>>>>>>>>> I want to receive any messages except 100h and 101h.
>>>>>>>>>>
>>>>>>>>>> When I send a message which matches the filter, it is received twice:
>>>>>>>>>> sh@helios:~/workspace/node-can$ cansend vcan0 1ff#22
>>>>>>>>>> vcan0 1FF [1] 22
>>>>>>>>>> vcan0 1FF [1] 22
>>>>>>>>>>
>>>>>>>>>> When I send a message which should not received at all, it is received:
>>>>>>>>>> sh@helios:~/workspace/node-can$ cansend vcan0 100#22
>>>>>>>>>> vcan0 100 [1] 22
>>>>>>>>>>
>>>>>>>>>> Did I misunderstood the filter here?
>>>>>>>>>
>>>>>>>>> The filters are independent and therefore "logical OR".
>>>>>>>> Ok. That explain why received 100h even though I tried to filter it
>>>>>>>> out. But
>>>>>>>> why receive a message twice while it was only sent once?
>>>>>>>
>>>>>>> You have defined two(!) filters that let pass the CAN-ID 0x1FF.
>>>>>>>
>>>>>>> So what else would you expect?
>>>>>> This is actually the way it meant to be? Why? Honestly this is a bug
>>>>>> for me! The filter should stop when it matched and not going further
>>>>>> generating ghost messages which were never sent?
>>>>>
>>>>> I had initially the same feeling. The problem here IMHO is
>>>>> what the user expects is different from what the kernel does.
>>>>>
>>>>> What the user expects is a 'socket' based filter.
>>>>> The kernel implements an optimised, socket-agnostic filter.
>>>>> This is even more generic, but the kernel expects a CAN_RAW program
>>>>> to set 'rough' filters and have the fine control in the program.
>>>>>
>>>>> This actually works very good, and is a clever thing to do.
>>>>>
>>>>> However, candump does expose this kernel behaviour to the user. The user,
>>>>> as said, expects something different that what he gets.
>>>>> So the user thinks it is a bug.
>>>>>
>>>>> How to solve this: I think the correct way is to let candump
>>>>> expose the filtering that a user expects, whether in userspace
>>>>> or in kernelspace.
>>>>> Is such approach efficient? no. Does that matter? probably not.
>>>>> candump is, IMO, not an automation tool. It's an administrator/diagnostic
>>>>> tool.
>>>>>
>>>>> Although I have no real code in mind yet, I think the expected
>>>>> filtering is much easier to implement within a single program,
>>>>> than it would be in kernelspace.
>>>>>
>>>>> On the other hand, I have found candump's exposure of kernel work
>>>>> a true friend during development.
>>>>> So I'd vote to have an extra control on candump which filtering to use.
>>>>>
>>>>> Any thoughts?
>
> I used the last days to check different concepts and implementation ideas how
> to integrate another filter policy into the 'socket-agnostic' filters in
> af_can.c Kurt wrote this nice pleading about :-)
>
> It turned out that linked filters would become a mess in implementation and
> configuration (e.g. extensive locking / performance reduction). Additionally
> it would only make sense for a concatenation of inverted filters, like:
>
> 100~7FF,101~7FF,103~7FF
>
> Finally i dropped the idea to fiddle with the really efficient filters in
> af_can.c that follow the original idea of the CAN controller HW filters.
>
> The main drawback of the independent filters is that the user does not expect
> to get the same message several times due to the match of overlapping filters.
>
> Below you will find an approach that does not push this problem into
> userspace but only omits identical frames that had multiple matches.
>
> The idea is to introduce a new socket option CAN_RAW_FILTER_UNIQUE for the
> RAW socket, that catches and omits duplicate frames when it's enabled.
> This is a per-socket option and is active for all configured filters applied
> to this socket.
>
> It's a relatively small and clear change and it fixes your "bug".
>
> Here's the output of candump with and without the 'unique' option when
> invoking "cansend vcan0 1FF#" in another terminal:
>
> $ ./candump vcan0,100~7FF,101~7FF
> vcan0 1FF [0]
> vcan0 1FF [0]
>
> $ ./candump vcan0,100~7FF,101~7FF,U
> vcan0 1FF [0]
>
> I hope this fit your needs ?! :-)
Sorry for resurrecting this old thread, but a $CUSTOMER stumbled over
the same "issue". So there seems to be realworld need for a solution :)
Are there any new thoughts on the problem?
Marc
--
Pengutronix e.K. | Marc Kleine-Budde |
Industrial Linux Solutions | Phone: +49-231-2826-924 |
Vertretung West/Dortmund | Fax: +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686 | http://www.pengutronix.de |
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]
next prev parent reply other threads:[~2015-03-17 10:45 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-05-29 20:55 RxFilter issues vcan Sebastian Haas
2013-05-30 4:58 ` Oliver Hartkopp
2013-05-30 8:34 ` Sebastian Haas
2013-05-30 8:49 ` Oliver Hartkopp
2013-05-30 9:06 ` Sebastian Haas
2013-05-30 10:17 ` RFC: (optional) software filtering in candump Kurt Van Dijck
2013-05-30 12:07 ` Oliver Hartkopp
2013-05-30 12:35 ` Kurt Van Dijck
2013-05-30 15:37 ` Sebastian Haas
2013-05-30 15:55 ` Oliver Hartkopp
2013-05-31 20:40 ` Sebastian Haas
2013-06-01 14:15 ` Oliver Hartkopp
2013-06-01 18:35 ` Sebastian Haas
2013-06-02 9:59 ` RFC SFF bitfield filter - was " Oliver Hartkopp
2013-06-02 11:17 ` Kurt Van Dijck
2013-06-02 12:23 ` Sebastian Haas
2013-06-02 11:23 ` Kurt Van Dijck
2013-06-04 8:22 ` AW: " Sandro Anders | CarMedialab
2015-03-17 10:44 ` Marc Kleine-Budde [this message]
2015-03-17 11:34 ` Marc Kleine-Budde
2015-03-17 12:04 ` Oliver Hartkopp
2015-03-17 13:02 ` Oliver Hartkopp
2015-03-17 13:33 ` Marc Kleine-Budde
-- strict thread matches above, loose matches on Subject: below --
2013-06-14 8:42 Janusz Uzycki
[not found] <190D92B052C049F4B059DCFE8F841940@laptop2>
2013-06-14 18:05 ` Oliver Hartkopp
2013-06-17 11:27 ` Janusz Uzycki
2013-06-19 16:59 ` Oliver Hartkopp
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=550805AA.4010306@pengutronix.de \
--to=mkl@pengutronix.de \
--cc=dev@sebastianhaas.info \
--cc=kurt.van.dijck@eia.be \
--cc=linux-can@vger.kernel.org \
--cc=sandro.anders@carmedialab.de \
--cc=socketcan@hartkopp.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).