* More flags for logging
@ 2021-05-03 10:02 Marc Kleine-Budde
2021-05-03 10:08 ` Marc Kleine-Budde
0 siblings, 1 reply; 20+ messages in thread
From: Marc Kleine-Budde @ 2021-05-03 10:02 UTC (permalink / raw)
To: linux-can; +Cc: kayoub5
[-- Attachment #1: Type: text/plain, Size: 1962 bytes --]
Hi,
on github Ayoub Kaanich writes:
https://github.com/linux-can/can-utils/issues/291
-------->8-------->8-------->8-------->8-------->8-------->8--------
The SocketCAN API is a great initiative for standardizing the CAN
interface API. This request tries to extend this initiative for more use
cases.
Context:
The SocketCAN was adopted by libpcap and tcpdump as the standard format
for logging CAN Frames in PCAP and PCAP-NG. See:
https://www.tcpdump.org/linktypes/LINKTYPE_CAN_SOCKETCAN.html
https://github.com/wireshark/wireshark/blob/master/epan/dissectors/packet-socketcan.c
https://www.wireshark.org/docs/dfref/c/can.html
Problem:
Applications that perform logging, usually need more details that normal
applications, for the sake of debugging later on. Flags needs to be
reserved/allocated in the SocketCAN API, so that logging applications
can make use of them in the PCAP format. The flags does not need
necessary need to be implemented by SocketCAN, they just need to be
marked as reserved for such use case.
Needed Flags:
FDF Flag
- Since CAN Frames and CAN-FD frames can co-exist in the same bus,
logging application needs to know if a normal CAN Frame was
transmitted on a CAN-FD bus, namely was the FDF bit set or not.
ACK bit in data frame
- Some logging hardware can act as a "spy", meaning that it records CAN
Frames, but does not set the ACK bit
- A way to know for a given frame (FD or not), was the ACK bit set or
not.
- Current API allow detecting missing ACK, but it does not report what
Frame had a missing ACK.
-------->8-------->8-------->8-------->8-------->8-------->8--------
regards,
Marc
--
Pengutronix e.K. | Marc Kleine-Budde |
Embedded Linux | https://www.pengutronix.de |
Vertretung West/Dortmund | Phone: +49-231-2826-924 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: More flags for logging
2021-05-03 10:02 More flags for logging Marc Kleine-Budde
@ 2021-05-03 10:08 ` Marc Kleine-Budde
2021-05-03 15:02 ` Vincent MAILHOL
2021-05-04 8:49 ` Oliver Hartkopp
0 siblings, 2 replies; 20+ messages in thread
From: Marc Kleine-Budde @ 2021-05-03 10:08 UTC (permalink / raw)
To: linux-can; +Cc: kayoub5
[-- Attachment #1: Type: text/plain, Size: 2567 bytes --]
On 03.05.2021 12:02:46, Marc Kleine-Budde wrote:
> The SocketCAN API is a great initiative for standardizing the CAN
> interface API. This request tries to extend this initiative for more use
> cases.
>
> Context:
>
> The SocketCAN was adopted by libpcap and tcpdump as the standard format
> for logging CAN Frames in PCAP and PCAP-NG. See:
>
> https://www.tcpdump.org/linktypes/LINKTYPE_CAN_SOCKETCAN.html
> https://github.com/wireshark/wireshark/blob/master/epan/dissectors/packet-socketcan.c
> https://www.wireshark.org/docs/dfref/c/can.html
>
> Problem:
> Applications that perform logging, usually need more details that normal
> applications, for the sake of debugging later on. Flags needs to be
> reserved/allocated in the SocketCAN API, so that logging applications
> can make use of them in the PCAP format. The flags does not need
> necessary need to be implemented by SocketCAN, they just need to be
> marked as reserved for such use case.
>
> Needed Flags:
> FDF Flag
> - Since CAN Frames and CAN-FD frames can co-exist in the same bus,
> logging application needs to know if a normal CAN Frame was
> transmitted on a CAN-FD bus, namely was the FDF bit set or not.
I think someone asked for that some time ago. But that was never
mainlined. I'll look for that old mail.
> ACK bit in data frame
> - Some logging hardware can act as a "spy", meaning that it records CAN
> Frames, but does not set the ACK bit
> - A way to know for a given frame (FD or not), was the ACK bit set or
> not.
> - Current API allow detecting missing ACK, but it does not report what
> Frame had a missing ACK.
This means the driver has to set a flag if it's configured in
listen-only mode. That should be possible.
I think we can make use of flags in the struct canfd_frame for this:
| struct canfd_frame {
| canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
| __u8 len; /* frame payload length in byte */
| __u8 flags; /* additional flags for CAN FD */
| __u8 __res0; /* reserved / padding */
| __u8 __res1; /* reserved / padding */
| __u8 data[CANFD_MAX_DLEN] __attribute__((aligned(8)));
| };
The struct can_frame doesn't have the flags member yet, but we can add
it there.
regards,
Marc
--
Pengutronix e.K. | Marc Kleine-Budde |
Embedded Linux | https://www.pengutronix.de |
Vertretung West/Dortmund | Phone: +49-231-2826-924 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: More flags for logging
2021-05-03 10:08 ` Marc Kleine-Budde
@ 2021-05-03 15:02 ` Vincent MAILHOL
2021-05-03 15:43 ` Marc Kleine-Budde
` (2 more replies)
2021-05-04 8:49 ` Oliver Hartkopp
1 sibling, 3 replies; 20+ messages in thread
From: Vincent MAILHOL @ 2021-05-03 15:02 UTC (permalink / raw)
To: Marc Kleine-Budde; +Cc: linux-can, kayoub5
On Mon. 3 Mai 2021 at 19:08, Marc Kleine-Budde <mkl@pengutronix.de> wrote:
> On 03.05.2021 12:02:46, Marc Kleine-Budde wrote:
> > The SocketCAN API is a great initiative for standardizing the CAN
> > interface API. This request tries to extend this initiative for more use
> > cases.
> >
> > Context:
> >
> > The SocketCAN was adopted by libpcap and tcpdump as the standard format
> > for logging CAN Frames in PCAP and PCAP-NG. See:
> >
> > https://www.tcpdump.org/linktypes/LINKTYPE_CAN_SOCKETCAN.html
> > https://github.com/wireshark/wireshark/blob/master/epan/dissectors/packet-socketcan.c
> > https://www.wireshark.org/docs/dfref/c/can.html
> >
> > Problem:
> > Applications that perform logging, usually need more details that normal
> > applications, for the sake of debugging later on. Flags needs to be
> > reserved/allocated in the SocketCAN API, so that logging applications
> > can make use of them in the PCAP format. The flags does not need
> > necessary need to be implemented by SocketCAN, they just need to be
> > marked as reserved for such use case.
> >
> > Needed Flags:
> > FDF Flag
> > - Since CAN Frames and CAN-FD frames can co-exist in the same bus,
> > logging application needs to know if a normal CAN Frame was
> > transmitted on a CAN-FD bus, namely was the FDF bit set or not.
>
> I think someone asked for that some time ago. But that was never
> mainlined. I'll look for that old mail.
The current API compares the size of the received structure with
the MTU to determine whether the message is classical CAN or CAN
FD. If the struct can_frame and canfd_frame are stored as
is (including the padding at the end of the data array), then the
information is maintained.
Personally, I would have liked to also have a FDF flag in Socket
CAN userland API because I think it would be more intuitive than
the MTU solution. So I am open to this option and would also be
happy to see the flag implemented in Socket CAN (not only
reserved).
But, I also understand that it will create redundancy.
> > ACK bit in data frame
> > - Some logging hardware can act as a "spy", meaning that it records CAN
> > Frames, but does not set the ACK bit
> > - A way to know for a given frame (FD or not), was the ACK bit set or
> > not.
> > - Current API allow detecting missing ACK, but it does not report what
> > Frame had a missing ACK.
>
> This means the driver has to set a flag if it's configured in
> listen-only mode. That should be possible.
For my understanding, when a controller does not see the ACK bit,
it stops the transmission and sends an error flag. For this
reason, the frame is not received and thus simply does not appear
in the log.
So this issue is not only about adding an ACK flag but is about
implementing a solution to report on which frame a given error
flag occured (not specific to ACK errors).
And to clarify the "spy mode", if all the receivers on the bus
are spies, then the ACK bit is never set and thus the
transmission should always result in an ACK error flag. If at
least one receiver is normal (not spy) it should send a dominant
ACK bit and thus all nodes (including the spies) see the flag as
dominant. In other terms, a received CAN frame has the ACK flag
set.
> I think we can make use of flags in the struct canfd_frame for this:
>
> | struct canfd_frame {
> | canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
> | __u8 len; /* frame payload length in byte */
> | __u8 flags; /* additional flags for CAN FD */
> | __u8 __res0; /* reserved / padding */
> | __u8 __res1; /* reserved / padding */
> | __u8 data[CANFD_MAX_DLEN] __attribute__((aligned(8)));
> | };
>
> The struct can_frame doesn't have the flags member yet, but we can add
> it there.
>
> regards,
> Marc
>
> --
> Pengutronix e.K. | Marc Kleine-Budde |
> Embedded Linux | https://www.pengutronix.de |
> Vertretung West/Dortmund | Phone: +49-231-2826-924 |
> Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: More flags for logging
2021-05-03 15:02 ` Vincent MAILHOL
@ 2021-05-03 15:43 ` Marc Kleine-Budde
[not found] ` <DBBPR03MB70828377F51A1747B4E9E6529D5B9@DBBPR03MB7082.eurprd03.prod.outlook.com>
2021-05-04 10:07 ` Kurt Van Dijck
2 siblings, 0 replies; 20+ messages in thread
From: Marc Kleine-Budde @ 2021-05-03 15:43 UTC (permalink / raw)
To: Vincent MAILHOL, Thomas Kopp; +Cc: linux-can, kayoub5
[-- Attachment #1: Type: text/plain, Size: 5868 bytes --]
On 04.05.2021 00:02:49, Vincent MAILHOL wrote:
> > > ACK bit in data frame
> > > - Some logging hardware can act as a "spy", meaning that it records CAN
> > > Frames, but does not set the ACK bit
> > > - A way to know for a given frame (FD or not), was the ACK bit set or
> > > not.
> > > - Current API allow detecting missing ACK, but it does not report what
> > > Frame had a missing ACK.
> >
> > This means the driver has to set a flag if it's configured in
> > listen-only mode. That should be possible.
>
> For my understanding, when a controller does not see the ACK bit,
> it stops the transmission and sends an error flag. For this
> reason, the frame is not received and thus simply does not appear
> in the log.
Hmmm. That's not correct for the mcp251xfd in RX-listen only mode:
| (2021-05-03 17:11:28.493992) mcp251xfd0 RX - - 222 [8] 05 00 00 00 00 00 00 00
| (2021-05-03 17:11:28.994109) mcp251xfd0 RX - - 222 [8] 06 00 00 00 00 00 00 00
| (2021-05-03 17:11:29.494298) mcp251xfd0 RX - - 222 [8] 07 00 00 00 00 00 00 00
| (2021-05-03 17:11:29.994510) mcp251xfd0 RX - - 222 [8] 08 00 00 00 00 00 00 00
| (2021-05-03 17:11:30.494635) mcp251xfd0 RX - - 222 [8] 09 00 00 00 00 00 00 00
unplugged 3rd device here (that's used to send the ACK)
| (2021-05-03 17:11:30.998388) mcp251xfd0 RX - - 222 [8] 0A 00 00 00 00 00 00 00
| (2021-05-03 17:11:30.998662) mcp251xfd0 RX - - 222 [8] 0A 00 00 00 00 00 00 00
| (2021-05-03 17:11:30.998936) mcp251xfd0 RX - - 222 [8] 0A 00 00 00 00 00 00 00
| (2021-05-03 17:11:30.999210) mcp251xfd0 RX - - 222 [8] 0A 00 00 00 00 00 00 00
| (2021-05-03 17:11:30.999484) mcp251xfd0 RX - - 222 [8] 0A 00 00 00 00 00 00 00
| (2021-05-03 17:11:30.999758) mcp251xfd0 RX - - 222 [8] 0A 00 00 00 00 00 00 00
| (2021-05-03 17:11:31.000032) mcp251xfd0 RX - - 222 [8] 0A 00 00 00 00 00 00 00
| (2021-05-03 17:11:31.000306) mcp251xfd0 RX - - 222 [8] 0A 00 00 00 00 00 00 00
| (2021-05-03 17:11:31.000580) mcp251xfd0 RX - - 222 [8] 0A 00 00 00 00 00 00 00
| (2021-05-03 17:11:31.000854) mcp251xfd0 RX - - 222 [8] 0A 00 00 00 00 00 00 00
| (2021-05-03 17:11:31.001128) mcp251xfd0 RX - - 222 [8] 0A 00 00 00 00 00 00 00
| (2021-05-03 17:11:31.001402) mcp251xfd0 RX - - 222 [8] 0A 00 00 00 00 00 00 00
| (2021-05-03 17:11:31.001676) mcp251xfd0 RX - - 222 [8] 0A 00 00 00 00 00 00 00
| (2021-05-03 17:11:31.001950) mcp251xfd0 RX - - 222 [8] 0A 00 00 00 00 00 00 00
| (2021-05-03 17:11:31.002224) mcp251xfd0 RX - - 222 [8] 0A 00 00 00 00 00 00 00
| (2021-05-03 17:11:31.002498) mcp251xfd0 RX - - 222 [8] 0A 00 00 00 00 00 00 00
| (2021-05-03 17:11:31.002772) mcp251xfd0 RX - - 222 [8] 0A 00 00 00 00 00 00 00
| (2021-05-03 17:11:31.003046) mcp251xfd0 RX - - 222 [8] 0A 00 00 00 00 00 00 00
| (2021-05-03 17:11:31.003320) mcp251xfd0 RX - - 222 [8] 0A 00 00 00 00 00 00 00
| (2021-05-03 17:11:31.003594) mcp251xfd0 RX - - 222 [8] 0A 00 00 00 00 00 00 00
---
The flexcan (can0) does behave differently:
| (2021-05-03 17:16:43.004939) can0 RX - - 222 [8] 08 00 00 00 00 00 00 00
| (2021-05-03 17:16:43.005846) mcp251xfd0 RX - - 222 [8] 08 00 00 00 00 00 00 00
| (2021-05-03 17:16:43.505052) can0 RX - - 222 [8] 09 00 00 00 00 00 00 00
| (2021-05-03 17:16:43.505729) mcp251xfd0 RX - - 222 [8] 09 00 00 00 00 00 00 00
| (2021-05-03 17:16:44.005193) can0 RX - - 222 [8] 0A 00 00 00 00 00 00 00
| (2021-05-03 17:16:44.005856) mcp251xfd0 RX - - 222 [8] 0A 00 00 00 00 00 00 00
unplugged 3rd device here (that's used to send the ACK)
| (2021-05-03 17:16:44.507358) mcp251xfd0 RX - - 222 [8] 0B 00 00 00 00 00 00 00
| (2021-05-03 17:16:44.507399) mcp251xfd0 RX - - 222 [8] 0B 00 00 00 00 00 00 00
| (2021-05-03 17:16:44.508142) mcp251xfd0 RX - - 222 [8] 0B 00 00 00 00 00 00 00
Thomas, is that worth investigating in your side?
regards,
Marc
--
Pengutronix e.K. | Marc Kleine-Budde |
Embedded Linux | https://www.pengutronix.de |
Vertretung West/Dortmund | Phone: +49-231-2826-924 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: More flags for logging
[not found] ` <DBBPR03MB70828377F51A1747B4E9E6529D5B9@DBBPR03MB7082.eurprd03.prod.outlook.com>
@ 2021-05-03 15:47 ` Marc Kleine-Budde
[not found] ` <DBBPR03MB7082F029173018680E5D869C9D5B9@DBBPR03MB7082.eurprd03.prod.outlook.com>
2021-05-04 10:10 ` More flags for logging Kurt Van Dijck
0 siblings, 2 replies; 20+ messages in thread
From: Marc Kleine-Budde @ 2021-05-03 15:47 UTC (permalink / raw)
To: Ayoub Kaanich; +Cc: Vincent MAILHOL, linux-can
[-- Attachment #1: Type: text/plain, Size: 1326 bytes --]
On 03.05.2021 15:31:34, Ayoub Kaanich wrote:
> For the ack bit, I think we could go with the bit being a “NO_ACK”
> bit, so a spy listener will set it to 1, if it receives a CAN frame,
> but it does not see any node in the bus acknowledging it. This way we
> preserve backward compatibility.
As Vincent pointed out, the device should not receive the CAN frame that
has not been acked as I do on the flexcan.
And even on the mcp251xfd, where I receive the CAN frame, there's no way
to tell if this frame has been acked or not.
> For the FDF flag, check the MTU is not an option here, since this flag
> is needed to detect normal CAN frames being transmitted on a CAN-FD
> bus (The bus could be configured as CAN-FD, but the received frame
> could be a normal CAN frame)
>
> If we are adding flags to can_frame, could we make sure it’s on the
> same byte offset as the flags of can_fd_frame, since PCAP format have
> no concept of MTU or struct size.
Sure - Do struct can_fd_frames have a different ARP header type?
Marc
--
Pengutronix e.K. | Marc Kleine-Budde |
Embedded Linux | https://www.pengutronix.de |
Vertretung West/Dortmund | Phone: +49-231-2826-924 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: More flags for logging
[not found] ` <DBBPR03MB7082F029173018680E5D869C9D5B9@DBBPR03MB7082.eurprd03.prod.outlook.com>
@ 2021-05-03 21:46 ` Vincent MAILHOL
2021-05-04 5:40 ` Patrick Menschel
2021-05-04 7:48 ` mcp251xfd receiving non ACKed frames (was: Re: More flags for logging) Marc Kleine-Budde
0 siblings, 2 replies; 20+ messages in thread
From: Vincent MAILHOL @ 2021-05-03 21:46 UTC (permalink / raw)
To: Ayoub Kaanich; +Cc: Marc Kleine-Budde, linux-can
On Tue. 4 Mai 2021 at 01:26, Ayoub Kaanich <kayoub5@live.com> wrote:
>
> Hi,
>
> > As Vincent pointed out, the device should not receive the CAN frame that
> > has not been acked.
>
> We are not talking about traditional off-the-shelf devices.
> The use case here is for specialized hardware in CAN logging, that dumps whatever happens in the network to a log file.
> Example: https://technica-engineering.de/en/produkt/capture-module-can-combo/
I am not used to those devices. By "whatever happens in the
network" do you mean that any cancelled transmission due to an
error flag (including but not limited to ACK error flags) is
logged? How do you plan to use the struct can{,fd}_frame to
record those incomplete transmissions? For example, how do you
plan to use Socket CAN API to log a frame cancelled due to a bit
error in the middle of the data segment (i.e. sent a recessive
bit but monitored dominant one)?
> > Sure - Do struct can_fd_frames have a different ARP header type?
>
> I assume you mean “Pcap Linklayer” or “DLT”, and the answer is no.
> can_fd_frames and can_frames share the same type, and they only keep enough bytes stored in the file to cover used data.
> Unused data bytes are not store in the file to save disk space.
> So there is no way in PCAP format, to tell them apart.
This is my point. Here you took the *decision* to save disk space
instead of blindly following the Socket CAN "philosophy" of using
the MTU to differentiate between classical and FD frames. But you
are treating the struct can{,fd}_frame as if it had a flexible
array for the dada field which is not the case. So you are having
this issue because you are using a modified version of the Socket
CAN API to begin with.
I am not saying this is a bad choice. I do like this approach :)
Back to the Socket CAN API itself, one reason I would also like
the kernel to use such an FDF flag is as follows: on other
ethernet protocols, the developper does not need to allocate a
message buffer of the size of the MTU. It is fine to only
allocate a buffer able to contain the size of frames expected by
the application. In Socket CAN, even if I have an application
which only sends and receives FD frames with a data length of 8,
I am still forced to use an additional 56 bytes because of this
MTU design. This is the same as your PCAP issue: the current
Socket CAN API does not allow you to save the bytes.
I do not think this has currently a big overhead. But I am still
curious to see the figures: does anyone know how much ressources
are lost by memcpying those padding bytes? However, with the
upcoming CAN XL (which will have an MTU of 2KiB), I think we will
eventually need to use an approach in which the MTU and the type
of the frames get decorelated (i.e. make the data array a
flexible size array).
> And even on the mcp251xfd, where I receive the CAN frame, there's no way
> to tell if this frame has been acked or not.
The mcp251xfd behavior is interesting. Do you also receive the
ACK error flag? Does the controller retry to send the frame until
it gets acknowledged? Are you still able to send frames and
receive the echo if there is a single node on the network?
Yours sincerely,
Vincent
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: More flags for logging
2021-05-03 21:46 ` Vincent MAILHOL
@ 2021-05-04 5:40 ` Patrick Menschel
2021-05-04 7:48 ` mcp251xfd receiving non ACKed frames (was: Re: More flags for logging) Marc Kleine-Budde
1 sibling, 0 replies; 20+ messages in thread
From: Patrick Menschel @ 2021-05-04 5:40 UTC (permalink / raw)
To: Vincent MAILHOL, Ayoub Kaanich; +Cc: Marc Kleine-Budde, linux-can
Hi,
I think this is an interesting topic and would like to point out that
only half of this discussion is reaching linux-can mailing list.
The parts that originate from Ayoub Kaanich <kayoub5@live.com> are
missing as far as I can tell. Maybe he did not register for linux-can
and his emails are dropped by vger.kernel.org.
If there are good ideas for a new can logging file format, I'd be
interested myself.
Thank you and Best Regards,
Patrick Menschel
^ permalink raw reply [flat|nested] 20+ messages in thread
* mcp251xfd receiving non ACKed frames (was: Re: More flags for logging)
2021-05-03 21:46 ` Vincent MAILHOL
2021-05-04 5:40 ` Patrick Menschel
@ 2021-05-04 7:48 ` Marc Kleine-Budde
2021-05-04 12:22 ` Vincent MAILHOL
1 sibling, 1 reply; 20+ messages in thread
From: Marc Kleine-Budde @ 2021-05-04 7:48 UTC (permalink / raw)
To: Vincent MAILHOL; +Cc: Ayoub Kaanich, linux-can, Thomas Kopp
[-- Attachment #1: Type: text/plain, Size: 7238 bytes --]
On 04.05.2021 06:46:17, Vincent MAILHOL wrote:
> > And even on the mcp251xfd, where I receive the CAN frame, there's no way
> > to tell if this frame has been acked or not.
The test setup is:
flexcan (listen only)
|
|
PEAK PCAN-USB FD ---------+--------- mcp2518fd (listen only)
(sender) |
|
candlelight (going to be unplugged)
pcan-usb: sending CAN frames
flexcan: receiving CAN frames - but controller in listen only mode
mcp2518fd: receiving CAN frames - but controller in listen only mode
candlelight: receiving CAN frames - first attached, then detached
> The mcp251xfd behavior is interesting. Do you also receive the ACK
> error flag?
In my tests from yesterday neither the flexcan nor the mcp2518fd had bus
error reporting enabled. So I haven't noticed any ACK errors on the
mcp2518fd nor the flexcan.
I just repeated the test with bus error reporting enabled:
On the flexcan I receive _only_ these errors (repeating) with
candlelight detached:
| (2021-05-04 09:00:30.407709) can0 RX - - 20000088 [8] 00 00 08 00 00 00 00 00 ERRORFRAME
| protocol-violation{{tx-dominant-bit-error}{}}
| bus-error
On the mcp2518fd I see these errors:
| (2021-05-04 09:05:00.594321) mcp251xfd0 RX - - 222 [8] 4A 00 00 00 00 00 00 00
| (2021-05-04 09:05:01.094418) mcp251xfd0 RX - - 222 [8] 4B 00 00 00 00 00 00 00
| (2021-05-04 09:05:01.594577) mcp251xfd0 RX - - 222 [8] 4C 00 00 00 00 00 00 00
...unplug candlelight here...
| (2021-05-04 09:05:02.094878) mcp251xfd0 RX - - 20000088 [8] 00 00 02 00 00 00 00 00 ERRORFRAME
| protocol-violation{{frame-format-error}{}}
| bus-error
| (2021-05-04 09:05:02.095589) mcp251xfd0 RX - - 20000088 [8] 00 00 02 00 00 00 00 00 ERRORFRAME
| protocol-violation{{frame-format-error}{}}
| bus-error
| (2021-05-04 09:05:02.096263) mcp251xfd0 RX - - 20000088 [8] 00 00 02 00 00 00 00 00 ERRORFRAME
| protocol-violation{{frame-format-error}{}}
| bus-error
| (2021-05-04 09:05:02.096934) mcp251xfd0 RX - - 20000088 [8] 00 00 02 00 00 00 00 00 ERRORFRAME
| protocol-violation{{frame-format-error}{}}
| bus-error
| (2021-05-04 09:05:02.097596) mcp251xfd0 RX - - 20000088 [8] 00 00 02 00 00 00 00 00 ERRORFRAME
| protocol-violation{{frame-format-error}{}}
| bus-error
| (2021-05-04 09:05:02.098261) mcp251xfd0 RX - - 20000088 [8] 00 00 02 00 00 00 00 00 ERRORFRAME
| protocol-violation{{frame-format-error}{}}
| bus-error
| (2021-05-04 09:05:02.099035) mcp251xfd0 RX - - 222 [8] 4D 00 00 00 00 00 00 00
| (2021-05-04 09:05:02.099054) mcp251xfd0 RX - - 222 [8] 4D 00 00 00 00 00 00 00
| (2021-05-04 09:05:02.099603) mcp251xfd0 RX - - 20000088 [8] 00 00 00 00 00 00 00 00 ERRORFRAME
| protocol-violation{{}{}}
| bus-error
from here now only RX frames, no error frames
| (2021-05-04 09:05:02.100540) mcp251xfd0 RX - - 222 [8] 4D 00 00 00 00 00 00 00
| (2021-05-04 09:05:02.100570) mcp251xfd0 RX - - 222 [8] 4D 00 00 00 00 00 00 00
| (2021-05-04 09:05:02.100583) mcp251xfd0 RX - - 222 [8] 4D 00 00 00 00 00 00 00
| (2021-05-04 09:05:02.100593) mcp251xfd0 RX - - 222 [8] 4D 00 00 00 00 00 00 00
| (2021-05-04 09:05:02.101326) mcp251xfd0 RX - - 222 [8] 4D 00 00 00 00 00 00 00
... and repeating.
Here a short dump of the mcp2518fd registers:
| INT: intf(0x01c)=0xbf1a0806
| IE IF IE & IF
| IVMI x Invalid Message Interrupt
| WAKI Bus Wake Up Interrupt
| CERRI x CAN Bus Error Interrupt
| SERRI x System Error Interrupt
| RXOVI x x x Receive FIFO Overflow Interrupt
| TXATI x Transmit Attempt Interrupt
| SPICRCI x SPI CRC Error Interrupt
| ECCI x ECC Error Interrupt
| TEFI x Transmit Event FIFO Interrupt
| MODI x Mode Change Interrupt
| TBCI x Time Base Counter Interrupt
| RXI x x x Receive FIFO Interrupt
| TXI Transmit FIFO Interrupt
Note: there is no invalid message interrupt pending
| TREC: trec(0x034)=0x00000000
| TXBO Transmitter in Bus Off State
| TXBP Transmitter in Error Passive State
| RXBP Receiver in Error Passive State
| TXWARN Transmitter in Error Warning State
| RXWARN Receiver in Error Warning State
| EWARN Transmitter or Receiver is in Error Warning State
| TEC = 0 Transmit Error Counter
| REC = 0 Receive Error Counter
|
| BDIAG0: bdiag0(0x038)=0x00000010
| DTERRCNT = 0 Data Bit Rate Transmit Error Counter
| DRERRCNT = 0 Data Bit Rate Receive Error Counter
| NTERRCNT = 0 Nominal Bit Rate Transmit Error Counter
| NRERRCNT = 16 Nominal Bit Rate Receive Error Counter
|
| BDIAG1: bdiag1(0x03c)=0x0000dd4b
| DLCMM DLC Mismatch
| ESI ESI flag of a received CAN FD message was set
| DCRCERR Data CRC Error
| DSTUFERR Data Bit Stuffing Error
| DFORMERR Data Format Error
| DBIT1ERR Data BIT1 Error
| DBIT0ERR Data BIT0 Error
| TXBOERR Device went to bus-off (and auto-recovered)
| NCRCERR CRC Error
| NSTUFERR Bit Stuffing Error
| NFORMERR Format Error
| NACKERR Transmitted message was not acknowledged
| NBIT1ERR Bit1 Error
| NBIT0ERR Bit0 Error
| EFMSGCNT = 56651 Error Free Message Counter
> Does the controller retry to send the frame until it gets
> acknowledged?
Yes - as it should.
> Are you still able to send frames and receive the echo if there is a
> single node on the network?
No - But the peak driver/hw has some limitations:
The peak driver doesn't have TX complete signaling, it send the echo
after sending the TX CAN frame via USB. And the peak controller seems to
buffer quite a lot TX CAN frames, so it looks for the first ~72 frames
like the bus is still working.
Marc
--
Pengutronix e.K. | Marc Kleine-Budde |
Embedded Linux | https://www.pengutronix.de |
Vertretung West/Dortmund | Phone: +49-231-2826-924 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: More flags for logging
2021-05-03 10:08 ` Marc Kleine-Budde
2021-05-03 15:02 ` Vincent MAILHOL
@ 2021-05-04 8:49 ` Oliver Hartkopp
[not found] ` <DBBPR03MB7082C7E8FD22D0CA8C2DA99D9D5A9@DBBPR03MB7082.eurprd03.prod.outlook.com>
[not found] ` <DBBPR03MB70824BB82F7BB335928BE36A9D2F9@DBBPR03MB7082.eurprd03.prod.outlook.com>
1 sibling, 2 replies; 20+ messages in thread
From: Oliver Hartkopp @ 2021-05-04 8:49 UTC (permalink / raw)
To: Marc Kleine-Budde, linux-can; +Cc: kayoub5
On 03.05.21 12:08, Marc Kleine-Budde wrote:
> On 03.05.2021 12:02:46, Marc Kleine-Budde wrote:
>> The SocketCAN API is a great initiative for standardizing the CAN
>> interface API. This request tries to extend this initiative for more use
>> cases.
>>
>> Context:
>>
>> The SocketCAN was adopted by libpcap and tcpdump as the standard format
>> for logging CAN Frames in PCAP and PCAP-NG. See:
>>
>> https://www.tcpdump.org/linktypes/LINKTYPE_CAN_SOCKETCAN.html
>> https://github.com/wireshark/wireshark/blob/master/epan/dissectors/packet-socketcan.c
>> https://www.wireshark.org/docs/dfref/c/can.html
>>
>> Problem:
>> Applications that perform logging, usually need more details that normal
>> applications, for the sake of debugging later on. Flags needs to be
>> reserved/allocated in the SocketCAN API, so that logging applications
>> can make use of them in the PCAP format. The flags does not need
>> necessary need to be implemented by SocketCAN, they just need to be
>> marked as reserved for such use case.
>>
>> Needed Flags:
>> FDF Flag
>> - Since CAN Frames and CAN-FD frames can co-exist in the same bus,
>> logging application needs to know if a normal CAN Frame was
>> transmitted on a CAN-FD bus, namely was the FDF bit set or not.
>
> I think someone asked for that some time ago. But that was never
> mainlined. I'll look for that old mail.
>
When you display CAN and CAN FD frames in Wireshark they are displayed
as different "protocols" - as they also have different ethtypes.
So the difference is provided by the 'protocol' field. Or did I miss
something?
Regards,
Oliver
>> ACK bit in data frame
>> - Some logging hardware can act as a "spy", meaning that it records CAN
>> Frames, but does not set the ACK bit
>> - A way to know for a given frame (FD or not), was the ACK bit set or
>> not.
>> - Current API allow detecting missing ACK, but it does not report what
>> Frame had a missing ACK.
>
> This means the driver has to set a flag if it's configured in
> listen-only mode. That should be possible.
>
> I think we can make use of flags in the struct canfd_frame for this:
>
> | struct canfd_frame {
> | canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
> | __u8 len; /* frame payload length in byte */
> | __u8 flags; /* additional flags for CAN FD */
> | __u8 __res0; /* reserved / padding */
> | __u8 __res1; /* reserved / padding */
> | __u8 data[CANFD_MAX_DLEN] __attribute__((aligned(8)));
> | };
>
> The struct can_frame doesn't have the flags member yet, but we can add
> it there.
>
> regards,
> Marc
>
^ permalink raw reply [flat|nested] 20+ messages in thread
* RE: More flags for logging
[not found] ` <AM8PR08MB5698886555F8531B6CF65982B75A9@AM8PR08MB5698.eurprd08.prod.outlook.com>
@ 2021-05-04 9:49 ` Ayoub Kaanich
2021-05-04 10:13 ` Oliver Hartkopp
0 siblings, 1 reply; 20+ messages in thread
From: Ayoub Kaanich @ 2021-05-04 9:49 UTC (permalink / raw)
To: socketcan, mkl, linux-can
Hi,
(I changed the email I use, since the old one did not support sending plain text emails.)
There seems to be a mis-conception about how WireShark/Libpcap handle SocketCAN:
There is no ethertype involved, the data of the frame will directly start with the CAN ID.
The socket CAN in PCAP format pre-date CAN-FD (Developed in 2011), so at the time, there was only "CAN" (Introduced in Oct, 2009).
See https://github.com/the-tcpdump-group/libpcap/commit/86ed15cc8b4bd7dc1458559108e66a07ec6721ec
The introduction of CAN-FD later on did not change that.
Libpcap library maps both LINUX_SLL_P_CAN and LINUX_SLL_P_CANFD (they are treated identically the same way) to DLT_CAN_SOCKETCAN and copy bytes as is (the only change is changing the endianness if ID if needed).
The MTU solution still not does provide a fix for the case of a normal CAN message being transported over a CAN-FD bus.
In this case, application cannot tell if frame was physically transported as CAN or CAN-FD.
See https://noelscher.com/blog/posts/compatibility-of-can-and-can-fd/
Best Regards.
Ayoub Kaanich.
-----Original Message-----
From: mailto:socketcan@hartkopp.net
Sent: Tuesday, May 4, 2021 10:49 AM
To: mailto:mkl@pengutronix.de; mailto:linux-can@vger.kernel.org
Cc: mailto:kayoub5@live.com
Subject: Re: More flags for logging
On 03.05.21 12:08, Marc Kleine-Budde wrote:
> On 03.05.2021 12:02:46, Marc Kleine-Budde wrote:
>> The SocketCAN API is a great initiative for standardizing the CAN
>> interface API. This request tries to extend this initiative for more
>> use cases.
>>
>> Context:
>>
>> The SocketCAN was adopted by libpcap and tcpdump as the standard
>> format for logging CAN Frames in PCAP and PCAP-NG. See:
>>
>> https://www.tcpdump.org/linktypes/LINKTYPE_CAN_SOCKETCAN.html
>> https://github.com/wireshark/wireshark/blob/master/epan/dissectors/pa
>> cket-socketcan.c https://www.wireshark.org/docs/dfref/c/can.html
>>
>> Problem:
>> Applications that perform logging, usually need more details that
>> normal applications, for the sake of debugging later on. Flags needs
>> to be reserved/allocated in the SocketCAN API, so that logging
>> applications can make use of them in the PCAP format. The flags does
>> not need necessary need to be implemented by SocketCAN, they just
>> need to be marked as reserved for such use case.
>>
>> Needed Flags:
>> FDF Flag
>> - Since CAN Frames and CAN-FD frames can co-exist in the same bus,
>> logging application needs to know if a normal CAN Frame was
>> transmitted on a CAN-FD bus, namely was the FDF bit set or not.
>
> I think someone asked for that some time ago. But that was never
> mainlined. I'll look for that old mail.
>
When you display CAN and CAN FD frames in Wireshark they are displayed as different "protocols" - as they also have different ethtypes.
So the difference is provided by the 'protocol' field. Or did I miss something?
Regards,
Oliver
>> ACK bit in data frame
>> - Some logging hardware can act as a "spy", meaning that it records
>>CAN
>> Frames, but does not set the ACK bit
>> - A way to know for a given frame (FD or not), was the ACK bit set or
>> not.
>> - Current API allow detecting missing ACK, but it does not report
>>what
>> Frame had a missing ACK.
>
> This means the driver has to set a flag if it's configured in
> listen-only mode. That should be possible.
>
> I think we can make use of flags in the struct canfd_frame for this:
>
> | struct canfd_frame {
> | canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
> | __u8 len; /* frame payload length in byte */
> | __u8 flags; /* additional flags for CAN FD */
> | __u8 __res0; /* reserved / padding */
> | __u8 __res1; /* reserved / padding */
> | __u8 data[CANFD_MAX_DLEN] __attribute__((aligned(8))); };
>
> The struct can_frame doesn't have the flags member yet, but we can add
> it there.
>
> regards,
> Marc
>
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: More flags for logging
2021-05-03 15:02 ` Vincent MAILHOL
2021-05-03 15:43 ` Marc Kleine-Budde
[not found] ` <DBBPR03MB70828377F51A1747B4E9E6529D5B9@DBBPR03MB7082.eurprd03.prod.outlook.com>
@ 2021-05-04 10:07 ` Kurt Van Dijck
2 siblings, 0 replies; 20+ messages in thread
From: Kurt Van Dijck @ 2021-05-04 10:07 UTC (permalink / raw)
To: Vincent MAILHOL; +Cc: Marc Kleine-Budde, linux-can, kayoub5
On Tue, 04 May 2021 00:02:49 +0900, Vincent MAILHOL wrote:
> On Mon. 3 Mai 2021 at 19:08, Marc Kleine-Budde <mkl@pengutronix.de> wrote:
> > On 03.05.2021 12:02:46, Marc Kleine-Budde wrote:
> > > ACK bit in data frame
> > > - Some logging hardware can act as a "spy", meaning that it records CAN
> > > Frames, but does not set the ACK bit
> > > - A way to know for a given frame (FD or not), was the ACK bit set or
> > > not.
> > > - Current API allow detecting missing ACK, but it does not report what
> > > Frame had a missing ACK.
> >
> > This means the driver has to set a flag if it's configured in
> > listen-only mode. That should be possible.
>
> For my understanding, when a controller does not see the ACK bit,
> it stops the transmission and sends an error flag. For this
> reason, the frame is not received and thus simply does not appear
> in the log.
I should correct you here.
When the controller does not see the ACK bit, the (transmitting)
controller will just repeat the frame until ...
Kind regards,
Kurt
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: More flags for logging
2021-05-03 15:47 ` Marc Kleine-Budde
[not found] ` <DBBPR03MB7082F029173018680E5D869C9D5B9@DBBPR03MB7082.eurprd03.prod.outlook.com>
@ 2021-05-04 10:10 ` Kurt Van Dijck
1 sibling, 0 replies; 20+ messages in thread
From: Kurt Van Dijck @ 2021-05-04 10:10 UTC (permalink / raw)
To: Marc Kleine-Budde; +Cc: Ayoub Kaanich, Vincent MAILHOL, linux-can
On Mon, 03 May 2021 17:47:49 +0200, Marc Kleine-Budde wrote:
> On 03.05.2021 15:31:34, Ayoub Kaanich wrote:
> > For the ack bit, I think we could go with the bit being a “NO_ACK”
> > bit, so a spy listener will set it to 1, if it receives a CAN frame,
> > but it does not see any node in the bus acknowledging it. This way we
> > preserve backward compatibility.
>
> As Vincent pointed out, the device should not receive the CAN frame that
> has not been acked as I do on the flexcan.
>
> And even on the mcp251xfd, where I receive the CAN frame, there's no way
> to tell if this frame has been acked or not.
in listen-only mode, it's debatable if you should see an ack.
If there's only 1 active node on the bus, you would not be able to probe
the bitrate using listen-only mode, unless you accept CAN frames that
are only miss the ACK bit.
Kurt
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: More flags for logging
2021-05-04 9:49 ` Ayoub Kaanich
@ 2021-05-04 10:13 ` Oliver Hartkopp
2021-05-04 13:58 ` Ayoub Kaanich
0 siblings, 1 reply; 20+ messages in thread
From: Oliver Hartkopp @ 2021-05-04 10:13 UTC (permalink / raw)
To: Ayoub Kaanich, mkl, linux-can
Hi Ayoub,
On 04.05.21 11:49, Ayoub Kaanich wrote:
> There seems to be a mis-conception about how WireShark/Libpcap handle SocketCAN:
>
> There is no ethertype involved, the data of the frame will directly start with the CAN ID.
>
> The socket CAN in PCAP format pre-date CAN-FD (Developed in 2011), so at the time, there was only "CAN" (Introduced in Oct, 2009).
> See https://github.com/the-tcpdump-group/libpcap/commit/86ed15cc8b4bd7dc1458559108e66a07ec6721ec
> The introduction of CAN-FD later on did not change that.
Ah, now I got the problem.
I was heavily involved in introducing CAN FD into Wireshark here:
https://github.com/wireshark/wireshark/commit/7fad354a3e379382368cd1ef67b841315c29e050#diff-f0fd5f515da65110cd5c1231b43180693e1d46779765d65c997e32da11ae70d1
But this obviously had NO impact on libpcap :-/
> Libpcap library maps both LINUX_SLL_P_CAN and LINUX_SLL_P_CANFD (they are treated identically the same way) to DLT_CAN_SOCKETCAN and copy bytes as is (the only change is changing the endianness if ID if needed).
So this would mean, we need a separate handler for LINUX_SLL_P_CANFD ??
Best regards,
Oliver
>
> The MTU solution still not does provide a fix for the case of a normal CAN message being transported over a CAN-FD bus.
> In this case, application cannot tell if frame was physically transported as CAN or CAN-FD.
> See https://noelscher.com/blog/posts/compatibility-of-can-and-can-fd/
>
> Best Regards.
>
> Ayoub Kaanich.
>
> -----Original Message-----
>
> From: mailto:socketcan@hartkopp.net
> Sent: Tuesday, May 4, 2021 10:49 AM
> To: mailto:mkl@pengutronix.de; mailto:linux-can@vger.kernel.org
> Cc: mailto:kayoub5@live.com
> Subject: Re: More flags for logging
>
>
>
> On 03.05.21 12:08, Marc Kleine-Budde wrote:
>> On 03.05.2021 12:02:46, Marc Kleine-Budde wrote:
>>> The SocketCAN API is a great initiative for standardizing the CAN
>>> interface API. This request tries to extend this initiative for more
>>> use cases.
>>>
>>> Context:
>>>
>>> The SocketCAN was adopted by libpcap and tcpdump as the standard
>>> format for logging CAN Frames in PCAP and PCAP-NG. See:
>>>
>>> https://www.tcpdump.org/linktypes/LINKTYPE_CAN_SOCKETCAN.html
>>> https://github.com/wireshark/wireshark/blob/master/epan/dissectors/pa
>>> cket-socketcan.c https://www.wireshark.org/docs/dfref/c/can.html
>>>
>>> Problem:
>>> Applications that perform logging, usually need more details that
>>> normal applications, for the sake of debugging later on. Flags needs
>>> to be reserved/allocated in the SocketCAN API, so that logging
>>> applications can make use of them in the PCAP format. The flags does
>>> not need necessary need to be implemented by SocketCAN, they just
>>> need to be marked as reserved for such use case.
>>>
>>> Needed Flags:
>>> FDF Flag
>>> - Since CAN Frames and CAN-FD frames can co-exist in the same bus,
>>> logging application needs to know if a normal CAN Frame was
>>> transmitted on a CAN-FD bus, namely was the FDF bit set or not.
>>
>> I think someone asked for that some time ago. But that was never
>> mainlined. I'll look for that old mail.
>>
>
> When you display CAN and CAN FD frames in Wireshark they are displayed as different "protocols" - as they also have different ethtypes.
>
> So the difference is provided by the 'protocol' field. Or did I miss something?
>
> Regards,
> Oliver
>
>>> ACK bit in data frame
>>> - Some logging hardware can act as a "spy", meaning that it records
>>> CAN
>>> Frames, but does not set the ACK bit
>>> - A way to know for a given frame (FD or not), was the ACK bit set or
>>> not.
>>> - Current API allow detecting missing ACK, but it does not report
>>> what
>>> Frame had a missing ACK.
>>
>> This means the driver has to set a flag if it's configured in
>> listen-only mode. That should be possible.
>>
>> I think we can make use of flags in the struct canfd_frame for this:
>>
>> | struct canfd_frame {
>> | canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
>> | __u8 len; /* frame payload length in byte */
>> | __u8 flags; /* additional flags for CAN FD */
>> | __u8 __res0; /* reserved / padding */
>> | __u8 __res1; /* reserved / padding */
>> | __u8 data[CANFD_MAX_DLEN] __attribute__((aligned(8))); };
>>
>> The struct can_frame doesn't have the flags member yet, but we can add
>> it there.
>>
>> regards,
>> Marc
>>
>
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: mcp251xfd receiving non ACKed frames (was: Re: More flags for logging)
2021-05-04 7:48 ` mcp251xfd receiving non ACKed frames (was: Re: More flags for logging) Marc Kleine-Budde
@ 2021-05-04 12:22 ` Vincent MAILHOL
2021-05-04 12:53 ` Thomas.Kopp
2021-05-04 17:44 ` Vincent MAILHOL
0 siblings, 2 replies; 20+ messages in thread
From: Vincent MAILHOL @ 2021-05-04 12:22 UTC (permalink / raw)
To: Marc Kleine-Budde; +Cc: Ayoub Kaanich, linux-can, Thomas Kopp
Hi Marc,
Thanks for the detailed answer!
On Mar. 4 Mai 2021 at 16:48, Marc Kleine-Budde <mkl@pengutronix.de> wrote:
> On 04.05.2021 06:46:17, Vincent MAILHOL wrote:
> > > And even on the mcp251xfd, where I receive the CAN frame, there's no way
> > > to tell if this frame has been acked or not.
>
> The test setup is:
>
> flexcan (listen only)
> |
> |
> PEAK PCAN-USB FD ---------+--------- mcp2518fd (listen only)
> (sender) |
> |
> candlelight (going to be unplugged)
>
> pcan-usb: sending CAN frames
> flexcan: receiving CAN frames - but controller in listen only mode
> mcp2518fd: receiving CAN frames - but controller in listen only mode
> candlelight: receiving CAN frames - first attached, then detached
>
> > The mcp251xfd behavior is interesting. Do you also receive the ACK
> > error flag?
>
> In my tests from yesterday neither the flexcan nor the mcp2518fd had bus
> error reporting enabled. So I haven't noticed any ACK errors on the
> mcp2518fd nor the flexcan.
>
> I just repeated the test with bus error reporting enabled:
>
> On the flexcan I receive _only_ these errors (repeating) with
> candlelight detached:
>
> | (2021-05-04 09:00:30.407709) can0 RX - - 20000088 [8] 00 00 08 00 00 00 00 00 ERRORFRAME
> | protocol-violation{{tx-dominant-bit-error}{}}
> | bus-error
>
>
> On the mcp2518fd I see these errors:
>
> | (2021-05-04 09:05:00.594321) mcp251xfd0 RX - - 222 [8] 4A 00 00 00 00 00 00 00
> | (2021-05-04 09:05:01.094418) mcp251xfd0 RX - - 222 [8] 4B 00 00 00 00 00 00 00
> | (2021-05-04 09:05:01.594577) mcp251xfd0 RX - - 222 [8] 4C 00 00 00 00 00 00 00
> ...unplug candlelight here...
> | (2021-05-04 09:05:02.094878) mcp251xfd0 RX - - 20000088 [8] 00 00 02 00 00 00 00 00 ERRORFRAME
> | protocol-violation{{frame-format-error}{}}
> | bus-error
> | (2021-05-04 09:05:02.095589) mcp251xfd0 RX - - 20000088 [8] 00 00 02 00 00 00 00 00 ERRORFRAME
> | protocol-violation{{frame-format-error}{}}
> | bus-error
> | (2021-05-04 09:05:02.096263) mcp251xfd0 RX - - 20000088 [8] 00 00 02 00 00 00 00 00 ERRORFRAME
> | protocol-violation{{frame-format-error}{}}
> | bus-error
> | (2021-05-04 09:05:02.096934) mcp251xfd0 RX - - 20000088 [8] 00 00 02 00 00 00 00 00 ERRORFRAME
> | protocol-violation{{frame-format-error}{}}
> | bus-error
> | (2021-05-04 09:05:02.097596) mcp251xfd0 RX - - 20000088 [8] 00 00 02 00 00 00 00 00 ERRORFRAME
> | protocol-violation{{frame-format-error}{}}
> | bus-error
> | (2021-05-04 09:05:02.098261) mcp251xfd0 RX - - 20000088 [8] 00 00 02 00 00 00 00 00 ERRORFRAME
> | protocol-violation{{frame-format-error}{}}
> | bus-error
> | (2021-05-04 09:05:02.099035) mcp251xfd0 RX - - 222 [8] 4D 00 00 00 00 00 00 00
> | (2021-05-04 09:05:02.099054) mcp251xfd0 RX - - 222 [8] 4D 00 00 00 00 00 00 00
> | (2021-05-04 09:05:02.099603) mcp251xfd0 RX - - 20000088 [8] 00 00 00 00 00 00 00 00 ERRORFRAME
> | protocol-violation{{}{}}
> | bus-error
>
> from here now only RX frames, no error frames
I guess that above error flags are the consequence of the
interferences on the bus while unplugging the candlelight. Those
are probably not relevant to our specific topic.
> | (2021-05-04 09:05:02.100540) mcp251xfd0 RX - - 222 [8] 4D 00 00 00 00 00 00 00
> | (2021-05-04 09:05:02.100570) mcp251xfd0 RX - - 222 [8] 4D 00 00 00 00 00 00 00
> | (2021-05-04 09:05:02.100583) mcp251xfd0 RX - - 222 [8] 4D 00 00 00 00 00 00 00
> | (2021-05-04 09:05:02.100593) mcp251xfd0 RX - - 222 [8] 4D 00 00 00 00 00 00 00
> | (2021-05-04 09:05:02.101326) mcp251xfd0 RX - - 222 [8] 4D 00 00 00 00 00 00 00
>
> ... and repeating.
>
>
> Here a short dump of the mcp2518fd registers:
>
> | INT: intf(0x01c)=0xbf1a0806
> | IE IF IE & IF
> | IVMI x Invalid Message Interrupt
> | WAKI Bus Wake Up Interrupt
> | CERRI x CAN Bus Error Interrupt
> | SERRI x System Error Interrupt
> | RXOVI x x x Receive FIFO Overflow Interrupt
> | TXATI x Transmit Attempt Interrupt
> | SPICRCI x SPI CRC Error Interrupt
> | ECCI x ECC Error Interrupt
> | TEFI x Transmit Event FIFO Interrupt
> | MODI x Mode Change Interrupt
> | TBCI x Time Base Counter Interrupt
> | RXI x x x Receive FIFO Interrupt
> | TXI Transmit FIFO Interrupt
>
> Note: there is no invalid message interrupt pending
>
> | TREC: trec(0x034)=0x00000000
> | TXBO Transmitter in Bus Off State
> | TXBP Transmitter in Error Passive State
> | RXBP Receiver in Error Passive State
> | TXWARN Transmitter in Error Warning State
> | RXWARN Receiver in Error Warning State
> | EWARN Transmitter or Receiver is in Error Warning State
> | TEC = 0 Transmit Error Counter
> | REC = 0 Receive Error Counter
> |
> | BDIAG0: bdiag0(0x038)=0x00000010
> | DTERRCNT = 0 Data Bit Rate Transmit Error Counter
> | DRERRCNT = 0 Data Bit Rate Receive Error Counter
> | NTERRCNT = 0 Nominal Bit Rate Transmit Error Counter
> | NRERRCNT = 16 Nominal Bit Rate Receive Error Counter
> |
> | BDIAG1: bdiag1(0x03c)=0x0000dd4b
> | DLCMM DLC Mismatch
> | ESI ESI flag of a received CAN FD message was set
> | DCRCERR Data CRC Error
> | DSTUFERR Data Bit Stuffing Error
> | DFORMERR Data Format Error
> | DBIT1ERR Data BIT1 Error
> | DBIT0ERR Data BIT0 Error
> | TXBOERR Device went to bus-off (and auto-recovered)
> | NCRCERR CRC Error
> | NSTUFERR Bit Stuffing Error
> | NFORMERR Format Error
> | NACKERR Transmitted message was not acknowledged
> | NBIT1ERR Bit1 Error
> | NBIT0ERR Bit0 Error
> | EFMSGCNT = 56651 Error Free Message Counter
>
> > Does the controller retry to send the frame until it gets
> > acknowledged?
>
> Yes - as it should.
I should have been more careful when reading your previous
message. I could have seen that you sent the message with an
increasing payload and that as soon as the acknowledging node was
removed, the same payload kept repeating again and again.
In light of above information I have two remarks:
First, the Peak does not generate the ACK error flag as it is
expected to do. I do not know if this is a side effect of setting
it to listen only. I would expect the listen only mode to only
impact the reception, but maybe it has the side effect of also
allowing to not generate an error if not receiving the ACK bit?
Does the Peak correctly send the ACK error flag when sending in
normal mode (not listen only)?
Second, the receiver behaviour when receiving an non-ACKed frame
is actually unspecified. As mentioned before, non-ACKed frames
should be immediately followed by an ACK error flag. Here, the
receiving nodes are facing a situation which should never
occur. The mcp2518fd decides to register the frame as received
and the flexcan decides to not register the frame. I think that
both behaviors are actually fine: with the lack of specification,
the implementation is free to decide how to handle this side
case.
In short, the real question is the first point: why didn't the
Peak send the ACK error flag?
> > Are you still able to send frames and receive the echo if there is a
> > single node on the network?
>
> No - But the peak driver/hw has some limitations:
>
> The peak driver doesn't have TX complete signaling, it send the echo
> after sending the TX CAN frame via USB. And the peak controller seems to
> buffer quite a lot TX CAN frames, so it looks for the first ~72 frames
> like the bus is still working.
Yes, I also noticed that when I had peak devices in my test
lab. The peak driver call can_put_echo_skb() inside
peak_usb_ndo_start_xmit() and thus, the echo frames do not
reflect whether the actual completion occured or not. I guess
fixing that should not be too hard but I do not have access to
that hardware anymore to do it myself.
I am just surprised by the value of 72 frames. My understanding
is that peak_usb_ndo_start_xmit() should stop the network queue
whenever the number of active tx urbs reaches 10.
Ref:
https://elixir.bootlin.com/linux/latest/source/drivers/net/can/usb/peak_usb/pcan_usb_core.c#L399
https://elixir.bootlin.com/linux/latest/source/drivers/net/can/usb/peak_usb/pcan_usb_core.h#L29
Yours sincerely,
Vincent
^ permalink raw reply [flat|nested] 20+ messages in thread
* RE: mcp251xfd receiving non ACKed frames (was: Re: More flags for logging)
2021-05-04 12:22 ` Vincent MAILHOL
@ 2021-05-04 12:53 ` Thomas.Kopp
2021-05-04 14:26 ` Vincent MAILHOL
2021-05-04 17:44 ` Vincent MAILHOL
1 sibling, 1 reply; 20+ messages in thread
From: Thomas.Kopp @ 2021-05-04 12:53 UTC (permalink / raw)
To: mailhol.vincent, mkl; +Cc: kayoub5, linux-can
Hi All,
> I guess that above error flags are the consequence of the
> interferences on the bus while unplugging the candlelight. Those
> are probably not relevant to our specific topic.
>
> > | (2021-05-04 09:05:02.100540) mcp251xfd0 RX - - 222 [8] 4D 00 00 00 00
> 00 00 00
> > | (2021-05-04 09:05:02.100570) mcp251xfd0 RX - - 222 [8] 4D 00 00 00 00
> 00 00 00
> > | (2021-05-04 09:05:02.100583) mcp251xfd0 RX - - 222 [8] 4D 00 00 00 00
> 00 00 00
> > | (2021-05-04 09:05:02.100593) mcp251xfd0 RX - - 222 [8] 4D 00 00 00 00
> 00 00 00
> > | (2021-05-04 09:05:02.101326) mcp251xfd0 RX - - 222 [8] 4D 00 00 00 00
> 00 00 00
> >
Could be, would be worth to check that one a scope. From what I've seen so far the Bus looks clean without disconnecting nodes.
> Second, the receiver behaviour when receiving an non-ACKed frame
> is actually unspecified. As mentioned before, non-ACKed frames
> should be immediately followed by an ACK error flag. Here, the
> receiving nodes are facing a situation which should never
> occur. The mcp2518fd decides to register the frame as received
> and the flexcan decides to not register the frame. I think that
> both behaviors are actually fine: with the lack of specification,
> the implementation is free to decide how to handle this side
> case.
I'd say it is actually defined. ISO 11989-1:2015 states the following in chapter 10.4 Bus monitoring
"Optionally, CAN implementations may provide the bus monitoring mode, where they shall be able to
receive valid DFs and valid RFs, but it sends only recessive bits on the CAN network and does not start
a transmission. If the MAC sub-layer is required to send a dominant bit (ACK bit, overload flag, active
error flag), the bit shall be rerouted internally so that the MAC sub-layer monitors this dominant bit,
although the CAN network may remain in recessive state."
Looking at the MCAN manual here: https://github.com/linux-can/can-doc/blob/master/m_can/mcan_users_manual_v330.pdf
There's a similar description including a picture showing the TX signal being "connected" internally to the RX path to generate the Ack internally.
Thomas
^ permalink raw reply [flat|nested] 20+ messages in thread
* RE: More flags for logging
2021-05-04 10:13 ` Oliver Hartkopp
@ 2021-05-04 13:58 ` Ayoub Kaanich
2021-05-04 14:38 ` Oliver Hartkopp
0 siblings, 1 reply; 20+ messages in thread
From: Ayoub Kaanich @ 2021-05-04 13:58 UTC (permalink / raw)
To: Oliver Hartkopp, mkl, linux-can
Hi,
One solution is to mark a flag bit as 1/0 depending whether the frame was received using LINUX_SLL_P_CAN or LINUX_SLL_P_CANFD.
This may solve 90% of the cases, but I don't think it's the solution we want to go with, since it does not cover classical CAN over CAN-FD transmission.
See
https://www.can-cia.org/fileadmin/resources/documents/proceedings/2015_esparza.pdf
https://can-newsletter.org/uploads/media/raw/35a48f1d88ddf2a198638c0a5be51761.pdf
I believe it would be better to have an FDF bit in the SocketCAN flags, that maps to (for example) MCP251XFD_OBJ_FLAGS_FDF
Best Regards.
-----Original Message-----
From: Oliver Hartkopp <socketcan@hartkopp.net>
Sent: Tuesday, May 4, 2021 12:14 PM
To: Ayoub Kaanich <ayoub.kaanich@technica-engineering.de>; mkl@pengutronix.de; linux-can@vger.kernel.org
Subject: Re: More flags for logging
CAUTION: This email originated from outside of the organization. Do not click links or open attachments unless you recognize the sender and know the content is safe.
Hi Ayoub,
On 04.05.21 11:49, Ayoub Kaanich wrote:
> There seems to be a mis-conception about how WireShark/Libpcap handle SocketCAN:
>
> There is no ethertype involved, the data of the frame will directly start with the CAN ID.
>
> The socket CAN in PCAP format pre-date CAN-FD (Developed in 2011), so at the time, there was only "CAN" (Introduced in Oct, 2009).
> See
> https://github.com/the-tcpdump-group/libpcap/commit/86ed15cc8b4bd7dc14
> 58559108e66a07ec6721ec The introduction of CAN-FD later on did not
> change that.
Ah, now I got the problem.
I was heavily involved in introducing CAN FD into Wireshark here:
https://github.com/wireshark/wireshark/commit/7fad354a3e379382368cd1ef67b841315c29e050#diff-f0fd5f515da65110cd5c1231b43180693e1d46779765d65c997e32da11ae70d1
But this obviously had NO impact on libpcap :-/
> Libpcap library maps both LINUX_SLL_P_CAN and LINUX_SLL_P_CANFD (they are treated identically the same way) to DLT_CAN_SOCKETCAN and copy bytes as is (the only change is changing the endianness if ID if needed).
So this would mean, we need a separate handler for LINUX_SLL_P_CANFD ??
Best regards,
Oliver
>
> The MTU solution still not does provide a fix for the case of a normal CAN message being transported over a CAN-FD bus.
> In this case, application cannot tell if frame was physically transported as CAN or CAN-FD.
> See https://noelscher.com/blog/posts/compatibility-of-can-and-can-fd/
>
> Best Regards.
>
> Ayoub Kaanich.
>
> -----Original Message-----
>
> From: mailto:socketcan@hartkopp.net
> Sent: Tuesday, May 4, 2021 10:49 AM
> To: mailto:mkl@pengutronix.de; mailto:linux-can@vger.kernel.org
> Cc: mailto:kayoub5@live.com
> Subject: Re: More flags for logging
>
>
>
> On 03.05.21 12:08, Marc Kleine-Budde wrote:
>> On 03.05.2021 12:02:46, Marc Kleine-Budde wrote:
>>> The SocketCAN API is a great initiative for standardizing the CAN
>>> interface API. This request tries to extend this initiative for more
>>> use cases.
>>>
>>> Context:
>>>
>>> The SocketCAN was adopted by libpcap and tcpdump as the standard
>>> format for logging CAN Frames in PCAP and PCAP-NG. See:
>>>
>>> https://www.tcpdump.org/linktypes/LINKTYPE_CAN_SOCKETCAN.html
>>> https://github.com/wireshark/wireshark/blob/master/epan/dissectors/p
>>> a cket-socketcan.c https://www.wireshark.org/docs/dfref/c/can.html
>>>
>>> Problem:
>>> Applications that perform logging, usually need more details that
>>> normal applications, for the sake of debugging later on. Flags needs
>>> to be reserved/allocated in the SocketCAN API, so that logging
>>> applications can make use of them in the PCAP format. The flags does
>>> not need necessary need to be implemented by SocketCAN, they just
>>> need to be marked as reserved for such use case.
>>>
>>> Needed Flags:
>>> FDF Flag
>>> - Since CAN Frames and CAN-FD frames can co-exist in the same bus,
>>> logging application needs to know if a normal CAN Frame was
>>> transmitted on a CAN-FD bus, namely was the FDF bit set or not.
>>
>> I think someone asked for that some time ago. But that was never
>> mainlined. I'll look for that old mail.
>>
>
> When you display CAN and CAN FD frames in Wireshark they are displayed as different "protocols" - as they also have different ethtypes.
>
> So the difference is provided by the 'protocol' field. Or did I miss something?
>
> Regards,
> Oliver
>
>>> ACK bit in data frame
>>> - Some logging hardware can act as a "spy", meaning that it records
>>> CAN
>>> Frames, but does not set the ACK bit
>>> - A way to know for a given frame (FD or not), was the ACK bit set or
>>> not.
>>> - Current API allow detecting missing ACK, but it does not report
>>> what
>>> Frame had a missing ACK.
>>
>> This means the driver has to set a flag if it's configured in
>> listen-only mode. That should be possible.
>>
>> I think we can make use of flags in the struct canfd_frame for this:
>>
>> | struct canfd_frame {
>> | canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
>> | __u8 len; /* frame payload length in byte */
>> | __u8 flags; /* additional flags for CAN FD */
>> | __u8 __res0; /* reserved / padding */
>> | __u8 __res1; /* reserved / padding */
>> | __u8 data[CANFD_MAX_DLEN] __attribute__((aligned(8))); };
>>
>> The struct can_frame doesn't have the flags member yet, but we can
>> add it there.
>>
>> regards,
>> Marc
>>
>
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: mcp251xfd receiving non ACKed frames (was: Re: More flags for logging)
2021-05-04 12:53 ` Thomas.Kopp
@ 2021-05-04 14:26 ` Vincent MAILHOL
0 siblings, 0 replies; 20+ messages in thread
From: Vincent MAILHOL @ 2021-05-04 14:26 UTC (permalink / raw)
To: Thomas.Kopp; +Cc: Marc Kleine-Budde, Ayoub Kaanich, linux-can
On Tue. 4 Mai 2021 à 21:53, <Thomas.Kopp@microchip.com> wrote:
> Hi All,
>
> > I guess that above error flags are the consequence of the
> > interferences on the bus while unplugging the candlelight. Those
> > are probably not relevant to our specific topic.
> >
> > > | (2021-05-04 09:05:02.100540) mcp251xfd0 RX - - 222 [8] 4D 00 00 00 00
> > 00 00 00
> > > | (2021-05-04 09:05:02.100570) mcp251xfd0 RX - - 222 [8] 4D 00 00 00 00
> > 00 00 00
> > > | (2021-05-04 09:05:02.100583) mcp251xfd0 RX - - 222 [8] 4D 00 00 00 00
> > 00 00 00
> > > | (2021-05-04 09:05:02.100593) mcp251xfd0 RX - - 222 [8] 4D 00 00 00 00
> > 00 00 00
> > > | (2021-05-04 09:05:02.101326) mcp251xfd0 RX - - 222 [8] 4D 00 00 00 00
> > 00 00 00
> > >
> Could be, would be worth to check that one a scope. From what I've seen so far the Bus looks clean without disconnecting nodes.
>
>
> > Second, the receiver behaviour when receiving an non-ACKed frame
> > is actually unspecified. As mentioned before, non-ACKed frames
> > should be immediately followed by an ACK error flag. Here, the
> > receiving nodes are facing a situation which should never
> > occur. The mcp2518fd decides to register the frame as received
> > and the flexcan decides to not register the frame. I think that
> > both behaviors are actually fine: with the lack of specification,
> > the implementation is free to decide how to handle this side
> > case.
>
> I'd say it is actually defined. ISO 11989-1:2015 states the following in chapter 10.4 Bus monitoring
> "Optionally, CAN implementations may provide the bus monitoring mode, where they shall be able to
> receive valid DFs and valid RFs, but it sends only recessive bits on the CAN network and does not start
> a transmission. If the MAC sub-layer is required to send a dominant bit (ACK bit, overload flag, active
> error flag), the bit shall be rerouted internally so that the MAC sub-layer monitors this dominant bit,
> although the CAN network may remain in recessive state."
>
> Looking at the MCAN manual here: https://github.com/linux-can/can-doc/blob/master/m_can/mcan_users_manual_v330.pdf
>
> There's a similar description including a picture showing the TX signal being "connected" internally to the RX path to generate the Ack internally.
Thanks for pointing this out. You are right and I completely
missed that paragraph of the ISO.
So this perfectly explains the behaviour of the mcp251xfd0. It
also means that the ACK flag is set by the transmitter so there
is indeed no way to differentiate if the frame was indeed ACKed
or not by the other nodes.
Concerning the flexcan it is not following the standard. Even if
the monitor mode is optional, once it is implemented, it should
behave as stated in chapter 10.4.
However, this still does not explain why the Peak does not
generate the ACK error flag. Also, the ISO says that in
monitoring mode, the controller "does not start a
transmission". So it also seems like a violation of the standard
that Peak devices are able to transmit frames while being in
monitor mode.
Yours sincerely,
Vincent
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: More flags for logging
2021-05-04 13:58 ` Ayoub Kaanich
@ 2021-05-04 14:38 ` Oliver Hartkopp
0 siblings, 0 replies; 20+ messages in thread
From: Oliver Hartkopp @ 2021-05-04 14:38 UTC (permalink / raw)
To: Ayoub Kaanich, mkl, linux-can
On 04.05.21 15:58, Ayoub Kaanich wrote:
> One solution is to mark a flag bit as 1/0 depending whether the frame was received using LINUX_SLL_P_CAN or LINUX_SLL_P_CANFD.
>
> This may solve 90% of the cases, but I don't think it's the solution we want to go with, since it does not cover classical CAN over CAN-FD transmission.
> See
> https://www.can-cia.org/fileadmin/resources/documents/proceedings/2015_esparza.pdf
> https://can-newsletter.org/uploads/media/raw/35a48f1d88ddf2a198638c0a5be51761.pdf
A CAN segment can transfer CAN and CAN FD frames when all the nodes are
capable to cope with CAN FD frames (having the former reserved FDF bit a
recessive '1' value).
I don't see any problem here ... CAN frames and CAN FD can co-exist an
use LINUX_SLL_P_CAN or LINUX_SLL_P_CANFD.
> I believe it would be better to have an FDF bit in the SocketCAN flags, that maps to (for example) MCP251XFD_OBJ_FLAGS_FDF
In fact I already posted a patch for that priblem in 2017:
https://lore.kernel.org/linux-can/20170411134343.3089-1-socketcan@hartkopp.net/
I had a similar idea behind it ;-)
Best regards,
Oliver
>
> -----Original Message-----
> From: Oliver Hartkopp <socketcan@hartkopp.net>
> Sent: Tuesday, May 4, 2021 12:14 PM
> To: Ayoub Kaanich <ayoub.kaanich@technica-engineering.de>; mkl@pengutronix.de; linux-can@vger.kernel.org
> Subject: Re: More flags for logging
>
> CAUTION: This email originated from outside of the organization. Do not click links or open attachments unless you recognize the sender and know the content is safe.
>
> Hi Ayoub,
>
> On 04.05.21 11:49, Ayoub Kaanich wrote:
>
>> There seems to be a mis-conception about how WireShark/Libpcap handle SocketCAN:
>>
>> There is no ethertype involved, the data of the frame will directly start with the CAN ID.
>>
>> The socket CAN in PCAP format pre-date CAN-FD (Developed in 2011), so at the time, there was only "CAN" (Introduced in Oct, 2009).
>> See
>> https://github.com/the-tcpdump-group/libpcap/commit/86ed15cc8b4bd7dc14
>> 58559108e66a07ec6721ec The introduction of CAN-FD later on did not
>> change that.
>
> Ah, now I got the problem.
>
> I was heavily involved in introducing CAN FD into Wireshark here:
>
> https://github.com/wireshark/wireshark/commit/7fad354a3e379382368cd1ef67b841315c29e050#diff-f0fd5f515da65110cd5c1231b43180693e1d46779765d65c997e32da11ae70d1
>
> But this obviously had NO impact on libpcap :-/
>
>> Libpcap library maps both LINUX_SLL_P_CAN and LINUX_SLL_P_CANFD (they are treated identically the same way) to DLT_CAN_SOCKETCAN and copy bytes as is (the only change is changing the endianness if ID if needed).
>
> So this would mean, we need a separate handler for LINUX_SLL_P_CANFD ??
>
> Best regards,
> Oliver
>
>>
>> The MTU solution still not does provide a fix for the case of a normal CAN message being transported over a CAN-FD bus.
>> In this case, application cannot tell if frame was physically transported as CAN or CAN-FD.
>> See https://noelscher.com/blog/posts/compatibility-of-can-and-can-fd/
>>
>> Best Regards.
>>
>> Ayoub Kaanich.
>>
>> -----Original Message-----
>>
>> From: mailto:socketcan@hartkopp.net
>> Sent: Tuesday, May 4, 2021 10:49 AM
>> To: mailto:mkl@pengutronix.de; mailto:linux-can@vger.kernel.org
>> Cc: mailto:kayoub5@live.com
>> Subject: Re: More flags for logging
>>
>>
>>
>> On 03.05.21 12:08, Marc Kleine-Budde wrote:
>>> On 03.05.2021 12:02:46, Marc Kleine-Budde wrote:
>>>> The SocketCAN API is a great initiative for standardizing the CAN
>>>> interface API. This request tries to extend this initiative for more
>>>> use cases.
>>>>
>>>> Context:
>>>>
>>>> The SocketCAN was adopted by libpcap and tcpdump as the standard
>>>> format for logging CAN Frames in PCAP and PCAP-NG. See:
>>>>
>>>> https://www.tcpdump.org/linktypes/LINKTYPE_CAN_SOCKETCAN.html
>>>> https://github.com/wireshark/wireshark/blob/master/epan/dissectors/p
>>>> a cket-socketcan.c https://www.wireshark.org/docs/dfref/c/can.html
>>>>
>>>> Problem:
>>>> Applications that perform logging, usually need more details that
>>>> normal applications, for the sake of debugging later on. Flags needs
>>>> to be reserved/allocated in the SocketCAN API, so that logging
>>>> applications can make use of them in the PCAP format. The flags does
>>>> not need necessary need to be implemented by SocketCAN, they just
>>>> need to be marked as reserved for such use case.
>>>>
>>>> Needed Flags:
>>>> FDF Flag
>>>> - Since CAN Frames and CAN-FD frames can co-exist in the same bus,
>>>> logging application needs to know if a normal CAN Frame was
>>>> transmitted on a CAN-FD bus, namely was the FDF bit set or not.
>>>
>>> I think someone asked for that some time ago. But that was never
>>> mainlined. I'll look for that old mail.
>>>
>>
>> When you display CAN and CAN FD frames in Wireshark they are displayed as different "protocols" - as they also have different ethtypes.
>>
>> So the difference is provided by the 'protocol' field. Or did I miss something?
>>
>> Regards,
>> Oliver
>>
>>>> ACK bit in data frame
>>>> - Some logging hardware can act as a "spy", meaning that it records
>>>> CAN
>>>> Frames, but does not set the ACK bit
>>>> - A way to know for a given frame (FD or not), was the ACK bit set or
>>>> not.
>>>> - Current API allow detecting missing ACK, but it does not report
>>>> what
>>>> Frame had a missing ACK.
>>>
>>> This means the driver has to set a flag if it's configured in
>>> listen-only mode. That should be possible.
>>>
>>> I think we can make use of flags in the struct canfd_frame for this:
>>>
>>> | struct canfd_frame {
>>> | canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
>>> | __u8 len; /* frame payload length in byte */
>>> | __u8 flags; /* additional flags for CAN FD */
>>> | __u8 __res0; /* reserved / padding */
>>> | __u8 __res1; /* reserved / padding */
>>> | __u8 data[CANFD_MAX_DLEN] __attribute__((aligned(8))); };
>>>
>>> The struct can_frame doesn't have the flags member yet, but we can
>>> add it there.
>>>
>>> regards,
>>> Marc
>>>
>>
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: mcp251xfd receiving non ACKed frames (was: Re: More flags for logging)
2021-05-04 12:22 ` Vincent MAILHOL
2021-05-04 12:53 ` Thomas.Kopp
@ 2021-05-04 17:44 ` Vincent MAILHOL
1 sibling, 0 replies; 20+ messages in thread
From: Vincent MAILHOL @ 2021-05-04 17:44 UTC (permalink / raw)
To: Marc Kleine-Budde; +Cc: Ayoub Kaanich, linux-can, Thomas Kopp
On Tue. 4 Mai 2021 at 21:22, Vincent MAILHOL <mailhol.vincent@wanadoo.fr> wrote:
> On Mar. 4 Mai 2021 at 16:48, Marc Kleine-Budde <mkl@pengutronix.de> wrote:
> > On 04.05.2021 06:46:17, Vincent MAILHOL wrote:
[...]
> > > Are you still able to send frames and receive the echo if there is a
> > > single node on the network?
> >
> > No - But the peak driver/hw has some limitations:
> >
> > The peak driver doesn't have TX complete signaling, it send the echo
> > after sending the TX CAN frame via USB. And the peak controller seems to
> > buffer quite a lot TX CAN frames, so it looks for the first ~72 frames
> > like the bus is still working.
>
> Yes, I also noticed that when I had peak devices in my test
> lab. The peak driver call can_put_echo_skb() inside
> peak_usb_ndo_start_xmit() and thus, the echo frames do not
> reflect whether the actual completion occured or not. I guess
> fixing that should not be too hard but I do not have access to
> that hardware anymore to do it myself.
>
> I am just surprised by the value of 72 frames. My understanding
> is that peak_usb_ndo_start_xmit() should stop the network queue
> whenever the number of active tx urbs reaches 10.
> Ref:
> https://elixir.bootlin.com/linux/latest/source/drivers/net/can/usb/peak_usb/pcan_usb_core.c#L399
> https://elixir.bootlin.com/linux/latest/source/drivers/net/can/usb/peak_usb/pcan_usb_core.h#L29
Hi Marc, please ignore above paragraphs. I mixed up the tx buffer
with the TX frame buffer. Also, implementing a full TX completion
might actually not be possible due to the Peak device
limitations.
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: More flags for logging
[not found] ` <DBBPR03MB70824BB82F7BB335928BE36A9D2F9@DBBPR03MB7082.eurprd03.prod.outlook.com>
@ 2021-05-17 7:29 ` Oliver Hartkopp
0 siblings, 0 replies; 20+ messages in thread
From: Oliver Hartkopp @ 2021-05-17 7:29 UTC (permalink / raw)
To: Ayoub Kaanich, Marc Kleine-Budde, linux-can
On 16.05.21 01:46, Ayoub Kaanich wrote:
> Hi,
>
> Sorry for taking so long to reply, I wanted to check the FDF topic
> thoroughly first.
>
No problem ;-)
>
> The documentation of the canfd_frame states that "The use of struct
> canfd_frame implies the Extended Data Length (EDL) bit to be set in the
> CAN frame bitstream on the wire."
Thanks for the hint. This comment in include/uapi/linux/can.h has been
created before the renaming that bit to FDF and needs an update.
> There have been editorial changes when the FD Frame Format was
> introduced into ISO 11898-1,the bit EDL is now named FDF (FD Format).
>
> See
> https://www.can-cia.org/fileadmin/resources/documents/proceedings/2013_hartwich_v2.pdf
>
> I believe that the fact that "EDL" and "FDF" are the same thing should
> be clarified to avoid future confusion.
I was personally involved in CAN FD standardization and suggested the
renaming, as "extended data length" (EDL) did not completely catch the
CAN FD features. This renaming EDL -> FDF is a replacement for
clarification. No confusion here :-)
> According to
> https://www.kernel.org/doc/html/latest/networking/can.html#raw-socket-option-can-raw-fd-frames
>
> When performing a read operation on a socket that had CAN_RAW_FD_FRAMES
> enabled, both CAN_MTU and CANFD_MTU are allowed.
>
> I originally though that only one of them is allowed at a time, that was
> a mistake from my side.
You might want to take a look into this slide deck (slide 48ff):
https://wiki.automotivelinux.org/_media/agl-distro/agl2017-socketcan-print.pdf
> So using MTU will work for FD, but will definitely be a problem in the
> future with CAN XL due to its large size (more than 2KB)
Yes. But we should then thing about CAN_RAW_XL_FRAMES in the same manner.
> The last question would be, would libpcap keep the extra padding bytes
> in, or remove them.
>
> Since the document in
> https://www.tcpdump.org/linktypes/LINKTYPE_CAN_SOCKETCAN.html is not
> conclusive about the topic (the diagram makes it look like it's truncated)
>
> I will have to check on an actual system during the work days, and push
> a PR to tcpdump if it turns out it's just the diagram that was misleading.
In fact this documentation is outdated as we updated the struct
can_frame for the 'Classical CAN' (not CAN FD) to contain a raw data
length code (DLC) value in the formerly reserved space:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit?id=ea7800565a128c1adafa1791ce80afd6016fe21c
Btw. I would still be interested to get the CANFD_FDF reservation for
user space application programmers into Mainline:
https://lore.kernel.org/linux-can/20170411134343.3089-1-socketcan@hartkopp.net/
So let's see whether Marc can be excited on this patch ;-)
Best regards,
Oliver
>
>
> Best Regards.
>
>
> On 2021-05-04 10:49 AM, Oliver Hartkopp wrote:
>>
>>
>> On 03.05.21 12:08, Marc Kleine-Budde wrote:
>>> On 03.05.2021 12:02:46, Marc Kleine-Budde wrote:
>>>> The SocketCAN API is a great initiative for standardizing the CAN
>>>> interface API. This request tries to extend this initiative for more
>>>> use
>>>> cases.
>>>>
>>>> Context:
>>>>
>>>> The SocketCAN was adopted by libpcap and tcpdump as the standard format
>>>> for logging CAN Frames in PCAP and PCAP-NG. See:
>>>>
>>>> https://www.tcpdump.org/linktypes/LINKTYPE_CAN_SOCKETCAN.html
>>>> https://github.com/wireshark/wireshark/blob/master/epan/dissectors/packet-socketcan.c
>>>>
>>>> https://www.wireshark.org/docs/dfref/c/can.html
>>>>
>>>> Problem:
>>>> Applications that perform logging, usually need more details that
>>>> normal
>>>> applications, for the sake of debugging later on. Flags needs to be
>>>> reserved/allocated in the SocketCAN API, so that logging applications
>>>> can make use of them in the PCAP format. The flags does not need
>>>> necessary need to be implemented by SocketCAN, they just need to be
>>>> marked as reserved for such use case.
>>>>
>>>> Needed Flags:
>>>> FDF Flag
>>>> - Since CAN Frames and CAN-FD frames can co-exist in the same bus,
>>>> logging application needs to know if a normal CAN Frame was
>>>> transmitted on a CAN-FD bus, namely was the FDF bit set or not.
>>>
>>> I think someone asked for that some time ago. But that was never
>>> mainlined. I'll look for that old mail.
>>>
>>
>> When you display CAN and CAN FD frames in Wireshark they are displayed
>> as different "protocols" - as they also have different ethtypes.
>>
>> So the difference is provided by the 'protocol' field. Or did I miss
>> something?
>>
>> Regards,
>> Oliver
>>
>>>> ACK bit in data frame
>>>> - Some logging hardware can act as a "spy", meaning that it records CAN
>>>> Frames, but does not set the ACK bit
>>>> - A way to know for a given frame (FD or not), was the ACK bit set or
>>>> not.
>>>> - Current API allow detecting missing ACK, but it does not report what
>>>> Frame had a missing ACK.
>>>
>>> This means the driver has to set a flag if it's configured in
>>> listen-only mode. That should be possible.
>>>
>>> I think we can make use of flags in the struct canfd_frame for this:
>>>
>>> | struct canfd_frame {
>>> | canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
>>> | __u8 len; /* frame payload length in byte */
>>> | __u8 flags; /* additional flags for CAN FD */
>>> | __u8 __res0; /* reserved / padding */
>>> | __u8 __res1; /* reserved / padding */
>>> | __u8 data[CANFD_MAX_DLEN] __attribute__((aligned(8)));
>>> | };
>>>
>>> The struct can_frame doesn't have the flags member yet, but we can add
>>> it there.
>>>
>>> regards,
>>> Marc
>>>
^ permalink raw reply [flat|nested] 20+ messages in thread
end of thread, other threads:[~2021-05-17 7:29 UTC | newest]
Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-03 10:02 More flags for logging Marc Kleine-Budde
2021-05-03 10:08 ` Marc Kleine-Budde
2021-05-03 15:02 ` Vincent MAILHOL
2021-05-03 15:43 ` Marc Kleine-Budde
[not found] ` <DBBPR03MB70828377F51A1747B4E9E6529D5B9@DBBPR03MB7082.eurprd03.prod.outlook.com>
2021-05-03 15:47 ` Marc Kleine-Budde
[not found] ` <DBBPR03MB7082F029173018680E5D869C9D5B9@DBBPR03MB7082.eurprd03.prod.outlook.com>
2021-05-03 21:46 ` Vincent MAILHOL
2021-05-04 5:40 ` Patrick Menschel
2021-05-04 7:48 ` mcp251xfd receiving non ACKed frames (was: Re: More flags for logging) Marc Kleine-Budde
2021-05-04 12:22 ` Vincent MAILHOL
2021-05-04 12:53 ` Thomas.Kopp
2021-05-04 14:26 ` Vincent MAILHOL
2021-05-04 17:44 ` Vincent MAILHOL
2021-05-04 10:10 ` More flags for logging Kurt Van Dijck
2021-05-04 10:07 ` Kurt Van Dijck
2021-05-04 8:49 ` Oliver Hartkopp
[not found] ` <DBBPR03MB7082C7E8FD22D0CA8C2DA99D9D5A9@DBBPR03MB7082.eurprd03.prod.outlook.com>
[not found] ` <AM8PR08MB5698886555F8531B6CF65982B75A9@AM8PR08MB5698.eurprd08.prod.outlook.com>
2021-05-04 9:49 ` Ayoub Kaanich
2021-05-04 10:13 ` Oliver Hartkopp
2021-05-04 13:58 ` Ayoub Kaanich
2021-05-04 14:38 ` Oliver Hartkopp
[not found] ` <DBBPR03MB70824BB82F7BB335928BE36A9D2F9@DBBPR03MB7082.eurprd03.prod.outlook.com>
2021-05-17 7:29 ` Oliver Hartkopp
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.