HOME

TheInfoList



OR:

SocketCAN is a set of
open source Open source is source code that is made freely available for possible modification and redistribution. Products include permission to use the source code, design documents, or content of the product. The open-source model is a decentralized sof ...
CAN drivers and a networking stack contributed by Volkswagen Research to the
Linux kernel The Linux kernel is a free and open-source, monolithic, modular, multitasking, Unix-like operating system kernel. It was originally authored in 1991 by Linus Torvalds for his i386-based PC, and it was soon adopted as the kernel for the GNU ope ...
. SocketCAN was formerly known as ''Low Level CAN Framework'' (LLCF). Traditional CAN drivers for Linux are based on the model of character devices. Typically they only allow sending to and receiving from the CAN controller. Conventional implementations of this class of device driver only allow a single process to access the device, which means that all other processes are blocked in the meantime. In addition, these drivers typically all differ slightly in the interface presented to the application, stifling portability. The SocketCAN concept on the other hand uses the model of network devices, which allows multiple applications to access one CAN device simultaneously. Also, a single application is able to access multiple CAN networks in parallel. The SocketCAN concept extends the
Berkeley sockets Berkeley sockets is an application programming interface (API) for Internet sockets and Unix domain sockets, used for inter-process communication (IPC). It is commonly implemented as a library of linkable modules. It originated with the 4.2BSD Un ...
API in Linux by introducing a new protocol family, PF_CAN, that coexists with other protocol families, such as PF_INET for the
Internet Protocol The Internet Protocol (IP) is the network layer communications protocol in the Internet protocol suite for relaying datagrams across network boundaries. Its routing function enables internetworking, and essentially establishes the Internet. IP h ...
. The communication with the CAN bus is therefore done analogously to the use of the Internet Protocol via sockets. Fundamental components of SocketCAN are the network device drivers for different CAN controllers and the implementation of the CAN protocol family. The protocol family, PF_CAN, provides the structures to enable different protocols on the bus: Raw sockets for direct CAN communication and transport protocols for point-to-point connections. Moreover the broadcast manager which is part of the CAN protocol family provides functions e.g. for sending CAN messages periodically or realize complex message filters. Since
Linux kernel The Linux kernel is a free and open-source, monolithic, modular, multitasking, Unix-like operating system kernel. It was originally authored in 1991 by Linus Torvalds for his i386-based PC, and it was soon adopted as the kernel for the GNU ope ...
Version 5.10 the protocol family also includes an
ISO-TP ISO 15765-2, or ''ISO-TP (Transport Layer)'', is an international standard for sending data packets over a CAN-Bus. The protocol allows for the transport of messages that exceed the eight byte maximum payload of CAN frames. ISO-TP segments longer ...
implementation, CAN_ISOTP. Patches for CAN were added in the 2.6.25
Linux kernel The Linux kernel is a free and open-source, monolithic, modular, multitasking, Unix-like operating system kernel. It was originally authored in 1991 by Linus Torvalds for his i386-based PC, and it was soon adopted as the kernel for the GNU ope ...
. Meanwhile some controller drivers were added and work is going on to add drivers for a variety of controllers.


Usage

The application first sets up its access to the CAN interface by initialising a socket (much like in TCP/IP communications), then binding that socket to an interface (or all interfaces, if the application so desires). Once bound, the socket can then be used like a UDP socket via read, write, etc...
Python Python may refer to: Snakes * Pythonidae, a family of nonvenomous snakes found in Africa, Asia, and Australia ** ''Python'' (genus), a genus of Pythonidae found in Africa and Asia * Python (mythology), a mythical serpent Computing * Python (pro ...
added support for SocketCAN in version 3.3. An open source librar
python-can
provides SocketCAN support for Python 2 and Python 3. Installing a CAN device requires loading the can_dev module and configuring the IP link to specify the CAN bus bitrate, for example: $ modprobe can_dev $ modprobe can $ modprobe can_raw $ sudo ip link set can0 type can bitrate 500000 $ sudo ip link set up can0 There is also a virtual CAN driver for testing purposes which can be loaded and created in Linux with the commands below. $ modprobe can $ modprobe can_raw $ modprobe vcan $ sudo ip link add dev vcan0 type vcan $ sudo ip link set up vcan0 $ ip link show vcan0 3: vcan0: mtu 16 qdisc noqueue state UNKNOWN link/can The following code snippet is a working example of the SocketCAN API, that sends a packet using the raw interface. It is based on the notes documented in the
Linux Kernel The Linux kernel is a free and open-source, monolithic, modular, multitasking, Unix-like operating system kernel. It was originally authored in 1991 by Linus Torvalds for his i386-based PC, and it was soon adopted as the kernel for the GNU ope ...
. #include #include #include #include #include #include #include #include #include #include int main(void) { int s; int nbytes; struct sockaddr_can addr; struct can_frame frame; struct ifreq ifr; const char *ifname = "vcan0"; if ((s = socket(PF_CAN, SOCK_RAW, CAN_RAW))

-1) { perror("Error while opening socket"); return -1; } strcpy(ifr.ifr_name, ifname); ioctl(s, SIOCGIFINDEX, &ifr); addr.can_family = AF_CAN; addr.can_ifindex = ifr.ifr_ifindex; printf("%s at index %d\n", ifname, ifr.ifr_ifindex); if (bind(s, (struct sockaddr *)&addr, sizeof(addr))

-1) { perror("Error in socket bind"); return -2; } frame.can_id = 0x123; frame.can_dlc = 2; frame.data = 0x11; frame.data = 0x22; nbytes = write(s, &frame, sizeof(struct can_frame)); printf("Wrote %d bytes\n", nbytes); return 0; }
The packet can be analyzed on the vcan0 interface using the candump utility which is part of the SocketCAN can-utilscan-utils https://github.com/linux-can/can-utils/ package. user@server:~/can-utils $ ./candump vcan0 vcan0 123 11 22


References


External links


SocketCAN / Linux CAN project site

Userspace Tools for SocketCAN

Userspace Library for SocketCAN

Linux CAN documentation



Linux CAN mail archive (gmane)Linux CAN mail archive (marc)
Linux drivers CAN bus