From: Vincent Mailhol <mailhol@kernel.org>
To: Oliver Hartkopp <socketcan@hartkopp.net>,
Marc Kleine-Budde <mkl@pengutronix.de>
Cc: linux-can@vger.kernel.org
Subject: Re: [PATCH 0/4] can: automate IFF_ECHO flag for generic echo skbs
Date: Fri, 7 Aug 2026 13:52:56 +0200 [thread overview]
Message-ID: <854c0428-b317-429a-9054-67d467a3d817@kernel.org> (raw)
In-Reply-To: <721fe2dd-9f42-41e2-a040-3575fb65613e@hartkopp.net>
On 07/08/2026 at 12:56, Oliver Hartkopp wrote:
> On 06.08.26 22:55, Vincent Mailhol wrote:
>> On 06/08/2026 at 14:01, Oliver Hartkopp wrote:> On 05.08.26 23:06,
>> Vincent Mailhol wrote:
>>>> On 05/08/2026 at 18:17, Oliver Hartkopp wrote:
>>>
>>>>> IMO it's the right approach that alloc_candev_mqs() sets the IFF_ECHO
>>>>> flag and the default queue len.
>>>>
>>>> For IFF_ECHO, this is exactly what this series does!
>>>
>>> I just wanted to second you. This does not mean that I fully support the
>>> way it is implemented.
>>>
>>>> For the default queue len, why not. I have not study this particular
>>>> topic. But I think the IFF_ECHO and the queue len should be in separate
>>>> series.
>>>
>>> My patch does not even compile. I just wanted to lead the dicsussion
>>> into a direction to find a more versatile solution that covers virtual
>>> CAN interfaces, non-echo CAN interfaces and full featured (echo'ing) CAn
>>> interfaces.
>>>
>>>>> What puzzles me is that the slcan driver is something in between which
>>>>> is neither a real CAN hardware nor a virtual CAN interface.
>>>>
>>>> My understanding it that devices which do not have a TX completion
>>>> handler (like slcan or can327) have no benefits to implement the
>>>> echo_skb framework and can instead simply rely on the PF_CAN core.
>>>
>>> Right.
>>>
>>>>> My idea would be to use alloc_candev() (-> alloc_candev_mqs()) only
>>>>> for
>>>>> real CAN hardware devices and open code slcan and the virtual CAN
>>>>> drivers ... which goes into the direction below.
>>>>>
>>>>> Any thoughts?
>>>>
>>>> The logic I tried to follow in this series is that
>>>> alloc_candev{,_mqs}()
>>>> has two arguments:
>>>>
>>>> 1. one for the priv structure
>>>>
>>>> 2. one for the number of echo_skb
>>>>
>>>> But then, when 2. is zero:
>>>>
>>>> alloc_candev{,_mqs}(..., 0)
>>>>
>>>> means to me: give me all the features expect from the echo_skb.
>>>>
>>>> With the above, there is no anomalies to see the slcan do:
>>>>
>>>> dev = alloc_candev(sizeof(*sl), 0);
>>>>
>>>> So I don't see the point to open code the allocations in slcan. After
>>>> patch #1 which corrects the echo skb count, the code describes
>>>> correctly
>>>> the behaviour.
>>>
>>> To me ", 0);" is a silent switch which does not make clear that slcan
>>> and can327 do something different here.
>>>
>>> We have 4 features:
>>>
>>> - support of IFF_ECHO mode using echo_skb's
>>> - support setting of bitrates via netlink
>>> - support setting of whatever via ethtool
>>> - use of TX queues (tx_queue_len != 0)
>>>
>>> And I would like these features to be separately selected to be
>>> transparent about what the CAN driver needs and supports.
>>>
>>> E.g. by defining a wrapper/define
>>>
>>> dev = alloc_non_echo_candev(sizeof(*sl));
>>>
>>> which calls
>>>
>>> dev = alloc_candev(sizeof(*sl), 0);
>>
>> Going this way, it should be the other way around. Have:
>>
>> alloc_candev(sizeof(*foo));
>>
>> which just does the basic things and then:
>>
>> alloc_candev_echo_skb(sizeof(*bar), 0);
>>
>> which allocate the echo skbs on top of the basic things.
>>
>> To me, the alloc_non_echo_candev() feels a bit like my previous
>>
>> dev->flags &= ~IFF_ECHO;
>>
>> in the sense that it is not additive but subtractive.
>>
>>> And the same applies to the other features.
>>
>> But then, you reach a problem. If you do the Cartesian product of all
>> the 4 features, you end up with 2^4 = 16 combinations.
>>
>> Of course, some of the combinations will not be used.
>
> You likely got me wrong.
>
> We still have only about 3 cases that use those 4+ features:
>
> - support of IFF_ECHO mode using echo_skb's
> - support setting of bitrates via netlink
> - support setting of whatever via ethtool
> - use of TX queues (tx_queue_len != 0)
>
> My idea would be to have different functions to make clear what each of
> these drivers use. And not hide flags based on the number of echo skbs
> or shrink the number of helper functions by adding parameters.
>
> E.g.
>
> vcan calls:
>
> /* sizeof(struct can_ml_priv) is defined in vcan_link_ops */
> can_set_ml_priv(dev, netdev_priv(dev));
> can_setup(dev, (echo)?IFF_ECHO:0);
> vcan_set_mtu_info(dev);
> vcan_set_cap_info(dev);
> dev->tx_queue_len = 0;
>
> slcan calls:
>
> dev = alloc_candev(sizeof(struct slcan_priv));
> can_setup(dev, 0);
> slcan_set_mtu_info(dev);
> slcan_set_cap_info(dev);
> dev->tx_queue_len = CAN_TX_QUEUE_LEN;
>
>
> m_can calls:
>
> dev = alloc_candev_echo_skb(sizeof(struct m_can_priv), 4);
> can_setup(dev, IFF_ECHO);
> m_can_set_mtu_info(dev);
> m_can_set_cap_info(dev);
> dev->tx_queue_len = CAN_TX_QUEUE_LEN;
>
>
> This is what I meant with transparency and code deduplication.
> E.g. where can_setup() has an extra_flags parameter which is simply
> or'ed to IFF_NOARP.
Now I understand. But I don't like the idea. If I understand correctly,
for the average driver, we will replace one call to:
alloc_candev_echo_skb()
into roughly four calls.
My goal in this series was to reduce boiler plate while making the
framework more robust. Your proposal increases the boilerplate and
reduces the robustest. Forgetting any one of these setup function is
also a potential security issue.
As a concrete example, this already occurred in the past with several
drivers which forget to populate their MTU, for example: commit
17c8d794527f ("can: mcba_usb: populate ndo_change_mtu() to prevent
buffer overflow").
I modified the framework so that the MTU is now correctly set by default
in commit 23049938605b ("can: populate the minimum and maximum MTU
values") so that today, it is now impossible for a driver to incorrectly
set its MTU.
Introducing a m_can_set_mtu_info() would be going backward to me. We
would open back the gate for a kind of bug which is today closed.
And yes, the v(x)can remains special case which need to open code the
MTU, which is fine as these are really special. But for the majority, it
is a winning choice to "hide" it in the framework rather than take the
risk to trust the drivers to do the right thing.
And so, my though for IFF_ECHO is exactly the same. If it is open coded,
this is a risk (ok, it is less critical than the MTU, but still can lead
to unexpected behaviour). And so, my wish is for IFF_ECHO to follow the
same path as what was done last year for the MTU: handle it in the
framework and forgot this class of bug for the vast majority of the drivers.
> That code needs to be invoked in all those cases anyway but I would like
> to make it visible and transparent which features and flags are enabled
> for which reason.
Yours sincerely,
Vincent Mailhol
next prev parent reply other threads:[~2026-08-07 11:53 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-04 19:55 [PATCH 0/4] can: automate IFF_ECHO flag for generic echo skbs Vincent Mailhol
2026-08-04 19:55 ` [PATCH 1/4] can: slcan: do not allocate unused echo skb Vincent Mailhol
2026-08-04 19:55 ` [PATCH 2/4] can: fix IFF_ECHO example in documentation Vincent Mailhol
2026-08-05 6:08 ` Oliver Hartkopp
2026-08-04 19:55 ` [PATCH 3/4] can: dev: set IFF_ECHO when allocating echo skbs Vincent Mailhol
2026-08-04 19:55 ` [PATCH 4/4] can: treewide: remove redundant IFF_ECHO assignments Vincent Mailhol
2026-08-05 6:29 ` [PATCH 0/4] can: automate IFF_ECHO flag for generic echo skbs Oliver Hartkopp
2026-08-05 7:25 ` Vincent Mailhol
2026-08-05 16:17 ` Oliver Hartkopp
2026-08-05 21:06 ` Vincent Mailhol
2026-08-06 12:01 ` Oliver Hartkopp
2026-08-06 20:55 ` Vincent Mailhol
2026-08-07 10:56 ` Oliver Hartkopp
2026-08-07 11:52 ` Vincent Mailhol [this message]
2026-08-10 18:07 ` 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=854c0428-b317-429a-9054-67d467a3d817@kernel.org \
--to=mailhol@kernel.org \
--cc=linux-can@vger.kernel.org \
--cc=mkl@pengutronix.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