Hi Carlos,

I think your concern is valid and that the current implementation of 
SIOCSCANBITRATE is a bugged.

I think the solution would be to only allow SIOCSCANBITRATE when the interface 
is down.

My proposal would be that SIOCSCANBITRATE checks if the interface is already up 
and if that's the case it should return -EBUSY.
Then the automatic ifup action that after SIOCSCANBITRATE that currently 
happens should be removed.

The correct procedure to change bitrate would be then
1. ifdown the interface is it's up
2. Call SIOCSCANBITRATE
3. ifup the interface.

Yours sincerely,

Peter van der Perk

-----Original Message-----
From: Carlos Sanchez <carlossanc...@geotab.com.INVALID> 
Sent: Friday, April 11, 2025 12:16 PM
To: dev@nuttx.apache.org
Subject: socketcan ioctl(...SIOCSCANBITRATE...) brings the interface up


Hi devs,

Short history: in all the existing socketcan drivers in Nuttx (imxrt, s32k3xx, 
s32k1xx, stm32h7 and kinetis), the driver-specific implementation of 
ioctl(...SIOCSCANBITRATE...) calls ifup at the end.
Is there a rationale / spec for this?

Long history:

In Linux, CAN bitrate is set with netlink, not ioctl, and you need to set a 
bitrate before bringing the interface up (make sense). In Nuttx, you can begin 
the interface up (it uses a default bitrate) and then you can change it. My 
guess is calling ifup at the end is precisely to avoid requiring another 
ifdown/ifup cycle from app code.

SocketCAN is a Linux thing, so we should try to mimic the behaviour.
Implementing netlink would be overkill (and moreover, it is common in Linux to 
use libsocketcan to abstract the netlink internals anyways) but at least we 
should have similar semantics. In our use case, we have a portable Linux/Nuttx 
app which uses socketcan, we have a thin compatibility layer for Linux/Nuttx 
differences (so bitrate setting uses icotl on Nuttx and libsocketcan in Linux) 
but it is difficult to make such a thin layer accommodate this difference (it 
would need to store the setting, and only call the ioctl just before bringing 
the interface up... essentially duplicating the driver functionality).

Couldn't we (Nuttx):
1) Make  SIOCSCANBITRATE just set the baudrate (and avoid changing interface 
state)? It could even fail if the interface is already up (AFAIK this is what 
netlink would do).
2) Provide a slightly more detailed documentation of Nuttx-specific SocketCAN 
ioctls (like, specifying whether the interface state is changed under the hood)

I volunteer to make the change, but this might affect application space so I'd 
like to know what others' thoughts are.

BR

Carlos

Reply via email to