Wireshark-bugs: [Wireshark-bugs] [Bug 12687] SocketCAN dissector does not support CAN FD
Date: Tue, 30 Aug 2016 22:30:53 +0000
Comment # 64
on bug 12687
from Guy Harris
(In reply to Oliver Hartkopp from comment #63) > (In reply to Guy Harris from comment #62) > > (In reply to Oliver Hartkopp from comment #60) > > > > > If we want to provide the correctly timestamped PACKET_BROADCAST packets > > > *together* with the information about the CAN frames origin we would need to > > > get back to PF_CAN RAW sockets - with some more functionality: > > > > > > http://lxr.linux.no/#linux+v4.7.2/Documentation/networking/can.txt#L631 > > > > OK, so: > > > > 1) How do you make that work on an unbound PF_PACKET socket (the "any" > > device)? > > Does that mean you open a PF_PACKET socket and just capture everything you > see from every network interface? The "any" device means libpcap opens a PF_PACKET/SOCK_DGRAM socket and doesn't bind it to an interface, so it receives packets from *all* interfaces, not just from one interface. > > Or can it simply not be made to work *at all* on a PF_PACKET socket, in > > which case either 1a) users will have to live with duplicate CAN packets if > > they capture with the "any" device on a system with CAN interfaces > > Which is what we see right now, right? Yes, that's what we get now with the "any" device. The question is whether there's any way to get something *better* than that. > > or 1b) we > > just discard *all* CAN packets on the "any" device, so that you don't see > > CAN interfaces with the "any" device? > > Then we would need to re-introduce PF_CAN sockets?? We can re-introduce PF_CAN sockets for individual interfaces. We can't use it for the "any" device, however. Even reading from an unbound PF_CAN socket would get CAN frames from all CAN interfaces but wouldn't get packets from other interfaces. > > 2) Is the "CAN or CAN FD frame" information available if we get the packets > > from a PF_CAN socket, so we don't have to guess whether it's a CAN or CAN FD > > frame? > > Yes. You can enable the reception of CAN FD what I have done in my original > attempt to extend libpcap: > > https://github.com/hartkopp/libpcap/commit/ > 5f970840aea932ba4c53b8b6687296d215f7f0fc#diff- > 91134676691503700c95a44e59d41cedR192 > > After > > setsockopt(handle->fd, SOL_CAN_RAW, CAN_RAW_FD_FRAMES, &enable_canfd, > sizeof(enable_canfd)); > > the read/recvmsg() delivers struct can_frames or struct canfd_frames which > can be distinguished by their length (return value from read syscall). So that's not just a heuristic, it's something *guaranteed* to indicate whether the frame is a CAN frame or a CAN FD frame? > > 3) Would this be done by putting the PF_CAN code into pcap-linux.c and, if > > we're capturing on a particular device (rather than the "any" device), and > > that device has ARPHRD_CAN as its ARP hardware type, we close the PF_PACKET > > socket, open a PF_CAN socket, and use *that* to capture, rather than trying > > to guess whether it's a CAN device based on the device's name (which didn't > > work completely in the old code - it expected devices to have names > > beginning with "can" or "can" and thus didn't find "slcan" devices)? > > Checking for ARPHRD_CAN is definitely the right way to go. The check with > "can" and "vcan" was broken from the beginning. > > We can also bind a PF_CAN socket to an 'any' device (ifindex = 0) where > 'any' means 'any CAN interface with ARPHDR_CAN'. In this case we need to use > recvmsg() or recvfrom() to get the interface index from the CAN interface. OK, so that would be an "anycan" device if we were to implement it.
You are receiving this mail because:
- You are watching all bug changes.
- Prev by Date: [Wireshark-bugs] [Bug 12687] SocketCAN dissector does not support CAN FD
- Next by Date: [Wireshark-bugs] [Bug 12796] New: Buildbot crash output: fuzz-2016-08-30-29171.pcap
- Previous by thread: [Wireshark-bugs] [Bug 12687] SocketCAN dissector does not support CAN FD
- Next by thread: [Wireshark-bugs] [Bug 12687] SocketCAN dissector does not support CAN FD
- Index(es):