cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

j1939.rst (17032B)


      1.. SPDX-License-Identifier: (GPL-2.0 OR MIT)
      2
      3===================
      4J1939 Documentation
      5===================
      6
      7Overview / What Is J1939
      8========================
      9
     10SAE J1939 defines a higher layer protocol on CAN. It implements a more
     11sophisticated addressing scheme and extends the maximum packet size above 8
     12bytes. Several derived specifications exist, which differ from the original
     13J1939 on the application level, like MilCAN A, NMEA2000, and especially
     14ISO-11783 (ISOBUS). This last one specifies the so-called ETP (Extended
     15Transport Protocol), which has been included in this implementation. This
     16results in a maximum packet size of ((2 ^ 24) - 1) * 7 bytes == 111 MiB.
     17
     18Specifications used
     19-------------------
     20
     21* SAE J1939-21 : data link layer
     22* SAE J1939-81 : network management
     23* ISO 11783-6  : Virtual Terminal (Extended Transport Protocol)
     24
     25.. _j1939-motivation:
     26
     27Motivation
     28==========
     29
     30Given the fact there's something like SocketCAN with an API similar to BSD
     31sockets, we found some reasons to justify a kernel implementation for the
     32addressing and transport methods used by J1939.
     33
     34* **Addressing:** when a process on an ECU communicates via J1939, it should
     35  not necessarily know its source address. Although, at least one process per
     36  ECU should know the source address. Other processes should be able to reuse
     37  that address. This way, address parameters for different processes
     38  cooperating for the same ECU, are not duplicated. This way of working is
     39  closely related to the UNIX concept, where programs do just one thing and do
     40  it well.
     41
     42* **Dynamic addressing:** Address Claiming in J1939 is time critical.
     43  Furthermore, data transport should be handled properly during the address
     44  negotiation. Putting this functionality in the kernel eliminates it as a
     45  requirement for _every_ user space process that communicates via J1939. This
     46  results in a consistent J1939 bus with proper addressing.
     47
     48* **Transport:** both TP & ETP reuse some PGNs to relay big packets over them.
     49  Different processes may thus use the same TP & ETP PGNs without actually
     50  knowing it. The individual TP & ETP sessions _must_ be serialized
     51  (synchronized) between different processes. The kernel solves this problem
     52  properly and eliminates the serialization (synchronization) as a requirement
     53  for _every_ user space process that communicates via J1939.
     54
     55J1939 defines some other features (relaying, gateway, fast packet transport,
     56...). In-kernel code for these would not contribute to protocol stability.
     57Therefore, these parts are left to user space.
     58
     59The J1939 sockets operate on CAN network devices (see SocketCAN). Any J1939
     60user space library operating on CAN raw sockets will still operate properly.
     61Since such a library does not communicate with the in-kernel implementation, care
     62must be taken that these two do not interfere. In practice, this means they
     63cannot share ECU addresses. A single ECU (or virtual ECU) address is used by
     64the library exclusively, or by the in-kernel system exclusively.
     65
     66J1939 concepts
     67==============
     68
     69PGN
     70---
     71
     72The J1939 protocol uses the 29-bit CAN identifier with the following structure:
     73
     74  ============  ==============  ====================
     75  29 bit CAN-ID
     76  --------------------------------------------------
     77  Bit positions within the CAN-ID
     78  --------------------------------------------------
     79  28 ... 26     25 ... 8        7 ... 0
     80  ============  ==============  ====================
     81  Priority      PGN             SA (Source Address)
     82  ============  ==============  ====================
     83
     84The PGN (Parameter Group Number) is a number to identify a packet. The PGN
     85is composed as follows:
     86
     87  ============  ==============  =================  =================
     88  PGN
     89  ------------------------------------------------------------------
     90  Bit positions within the CAN-ID
     91  ------------------------------------------------------------------
     92  25            24              23 ... 16          15 ... 8
     93  ============  ==============  =================  =================
     94  R (Reserved)  DP (Data Page)  PF (PDU Format)    PS (PDU Specific)
     95  ============  ==============  =================  =================
     96
     97In J1939-21 distinction is made between PDU1 format (where PF < 240) and PDU2
     98format (where PF >= 240). Furthermore, when using the PDU2 format, the PS-field
     99contains a so-called Group Extension, which is part of the PGN. When using PDU2
    100format, the Group Extension is set in the PS-field.
    101
    102  ==============  ========================
    103  PDU1 Format (specific) (peer to peer)
    104  ----------------------------------------
    105  Bit positions within the CAN-ID
    106  ----------------------------------------
    107  23 ... 16       15 ... 8
    108  ==============  ========================
    109  00h ... EFh     DA (Destination address)
    110  ==============  ========================
    111
    112  ==============  ========================
    113  PDU2 Format (global) (broadcast)
    114  ----------------------------------------
    115  Bit positions within the CAN-ID
    116  ----------------------------------------
    117  23 ... 16       15 ... 8
    118  ==============  ========================
    119  F0h ... FFh     GE (Group Extenstion)
    120  ==============  ========================
    121
    122On the other hand, when using PDU1 format, the PS-field contains a so-called
    123Destination Address, which is _not_ part of the PGN. When communicating a PGN
    124from user space to kernel (or vice versa) and PDU2 format is used, the PS-field
    125of the PGN shall be set to zero. The Destination Address shall be set
    126elsewhere.
    127
    128Regarding PGN mapping to 29-bit CAN identifier, the Destination Address shall
    129be get/set from/to the appropriate bits of the identifier by the kernel.
    130
    131
    132Addressing
    133----------
    134
    135Both static and dynamic addressing methods can be used.
    136
    137For static addresses, no extra checks are made by the kernel and provided
    138addresses are considered right. This responsibility is for the OEM or system
    139integrator.
    140
    141For dynamic addressing, so-called Address Claiming, extra support is foreseen
    142in the kernel. In J1939 any ECU is known by its 64-bit NAME. At the moment of
    143a successful address claim, the kernel keeps track of both NAME and source
    144address being claimed. This serves as a base for filter schemes. By default,
    145packets with a destination that is not locally will be rejected.
    146
    147Mixed mode packets (from a static to a dynamic address or vice versa) are
    148allowed. The BSD sockets define separate API calls for getting/setting the
    149local & remote address and are applicable for J1939 sockets.
    150
    151Filtering
    152---------
    153
    154J1939 defines white list filters per socket that a user can set in order to
    155receive a subset of the J1939 traffic. Filtering can be based on:
    156
    157* SA
    158* SOURCE_NAME
    159* PGN
    160
    161When multiple filters are in place for a single socket, and a packet comes in
    162that matches several of those filters, the packet is only received once for
    163that socket.
    164
    165How to Use J1939
    166================
    167
    168API Calls
    169---------
    170
    171On CAN, you first need to open a socket for communicating over a CAN network.
    172To use J1939, ``#include <linux/can/j1939.h>``. From there, ``<linux/can.h>`` will be
    173included too. To open a socket, use:
    174
    175.. code-block:: C
    176
    177    s = socket(PF_CAN, SOCK_DGRAM, CAN_J1939);
    178
    179J1939 does use ``SOCK_DGRAM`` sockets. In the J1939 specification, connections are
    180mentioned in the context of transport protocol sessions. These still deliver
    181packets to the other end (using several CAN packets). ``SOCK_STREAM`` is not
    182supported.
    183
    184After the successful creation of the socket, you would normally use the ``bind(2)``
    185and/or ``connect(2)`` system call to bind the socket to a CAN interface. After
    186binding and/or connecting the socket, you can ``read(2)`` and ``write(2)`` from/to the
    187socket or use ``send(2)``, ``sendto(2)``, ``sendmsg(2)`` and the ``recv*()`` counterpart
    188operations on the socket as usual. There are also J1939 specific socket options
    189described below.
    190
    191In order to send data, a ``bind(2)`` must have been successful. ``bind(2)`` assigns a
    192local address to a socket.
    193
    194Different from CAN is that the payload data is just the data that get sends,
    195without its header info. The header info is derived from the sockaddr supplied
    196to ``bind(2)``, ``connect(2)``, ``sendto(2)`` and ``recvfrom(2)``. A ``write(2)`` with size 4 will
    197result in a packet with 4 bytes.
    198
    199The sockaddr structure has extensions for use with J1939 as specified below:
    200
    201.. code-block:: C
    202
    203      struct sockaddr_can {
    204         sa_family_t can_family;
    205         int         can_ifindex;
    206         union {
    207            struct {
    208               __u64 name;
    209                        /* pgn:
    210                         * 8 bit: PS in PDU2 case, else 0
    211                         * 8 bit: PF
    212                         * 1 bit: DP
    213                         * 1 bit: reserved
    214                         */
    215               __u32 pgn;
    216               __u8  addr;
    217            } j1939;
    218         } can_addr;
    219      }
    220
    221``can_family`` & ``can_ifindex`` serve the same purpose as for other SocketCAN sockets.
    222
    223``can_addr.j1939.pgn`` specifies the PGN (max 0x3ffff). Individual bits are
    224specified above.
    225
    226``can_addr.j1939.name`` contains the 64-bit J1939 NAME.
    227
    228``can_addr.j1939.addr`` contains the address.
    229
    230The ``bind(2)`` system call assigns the local address, i.e. the source address when
    231sending packages. If a PGN during ``bind(2)`` is set, it's used as a RX filter.
    232I.e. only packets with a matching PGN are received. If an ADDR or NAME is set
    233it is used as a receive filter, too. It will match the destination NAME or ADDR
    234of the incoming packet. The NAME filter will work only if appropriate Address
    235Claiming for this name was done on the CAN bus and registered/cached by the
    236kernel.
    237
    238On the other hand ``connect(2)`` assigns the remote address, i.e. the destination
    239address. The PGN from ``connect(2)`` is used as the default PGN when sending
    240packets. If ADDR or NAME is set it will be used as the default destination ADDR
    241or NAME. Further a set ADDR or NAME during ``connect(2)`` is used as a receive
    242filter. It will match the source NAME or ADDR of the incoming packet.
    243
    244Both ``write(2)`` and ``send(2)`` will send a packet with local address from ``bind(2)`` and the
    245remote address from ``connect(2)``. Use ``sendto(2)`` to overwrite the destination
    246address.
    247
    248If ``can_addr.j1939.name`` is set (!= 0) the NAME is looked up by the kernel and
    249the corresponding ADDR is used. If ``can_addr.j1939.name`` is not set (== 0),
    250``can_addr.j1939.addr`` is used.
    251
    252When creating a socket, reasonable defaults are set. Some options can be
    253modified with ``setsockopt(2)`` & ``getsockopt(2)``.
    254
    255RX path related options:
    256
    257- ``SO_J1939_FILTER`` - configure array of filters
    258- ``SO_J1939_PROMISC`` - disable filters set by ``bind(2)`` and ``connect(2)``
    259
    260By default no broadcast packets can be send or received. To enable sending or
    261receiving broadcast packets use the socket option ``SO_BROADCAST``:
    262
    263.. code-block:: C
    264
    265     int value = 1;
    266     setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &value, sizeof(value));
    267
    268The following diagram illustrates the RX path:
    269
    270.. code::
    271
    272                    +--------------------+
    273                    |  incoming packet   |
    274                    +--------------------+
    275                              |
    276                              V
    277                    +--------------------+
    278                    | SO_J1939_PROMISC?  |
    279                    +--------------------+
    280                             |  |
    281                         no  |  | yes
    282                             |  |
    283                   .---------'  `---------.
    284                   |                      |
    285     +---------------------------+        |
    286     | bind() + connect() +      |        |
    287     | SOCK_BROADCAST filter     |        |
    288     +---------------------------+        |
    289                   |                      |
    290                   |<---------------------'
    291                   V
    292     +---------------------------+
    293     |      SO_J1939_FILTER      |
    294     +---------------------------+
    295                   |
    296                   V
    297     +---------------------------+
    298     |        socket recv()      |
    299     +---------------------------+
    300
    301TX path related options:
    302``SO_J1939_SEND_PRIO`` - change default send priority for the socket
    303
    304Message Flags during send() and Related System Calls
    305^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    306
    307``send(2)``, ``sendto(2)`` and ``sendmsg(2)`` take a 'flags' argument. Currently
    308supported flags are:
    309
    310* ``MSG_DONTWAIT``, i.e. non-blocking operation.
    311
    312recvmsg(2)
    313^^^^^^^^^^
    314
    315In most cases ``recvmsg(2)`` is needed if you want to extract more information than
    316``recvfrom(2)`` can provide. For example package priority and timestamp. The
    317Destination Address, name and packet priority (if applicable) are attached to
    318the msghdr in the ``recvmsg(2)`` call. They can be extracted using ``cmsg(3)`` macros,
    319with ``cmsg_level == SOL_J1939 && cmsg_type == SCM_J1939_DEST_ADDR``,
    320``SCM_J1939_DEST_NAME`` or ``SCM_J1939_PRIO``. The returned data is a ``uint8_t`` for
    321``priority`` and ``dst_addr``, and ``uint64_t`` for ``dst_name``.
    322
    323.. code-block:: C
    324
    325	uint8_t priority, dst_addr;
    326	uint64_t dst_name;
    327
    328	for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) {
    329		switch (cmsg->cmsg_level) {
    330		case SOL_CAN_J1939:
    331			if (cmsg->cmsg_type == SCM_J1939_DEST_ADDR)
    332				dst_addr = *CMSG_DATA(cmsg);
    333			else if (cmsg->cmsg_type == SCM_J1939_DEST_NAME)
    334				memcpy(&dst_name, CMSG_DATA(cmsg), cmsg->cmsg_len - CMSG_LEN(0));
    335			else if (cmsg->cmsg_type == SCM_J1939_PRIO)
    336				priority = *CMSG_DATA(cmsg);
    337			break;
    338		}
    339	}
    340
    341Dynamic Addressing
    342------------------
    343
    344Distinction has to be made between using the claimed address and doing an
    345address claim. To use an already claimed address, one has to fill in the
    346``j1939.name`` member and provide it to ``bind(2)``. If the name had claimed an address
    347earlier, all further messages being sent will use that address. And the
    348``j1939.addr`` member will be ignored.
    349
    350An exception on this is PGN 0x0ee00. This is the "Address Claim/Cannot Claim
    351Address" message and the kernel will use the ``j1939.addr`` member for that PGN if
    352necessary.
    353
    354To claim an address following code example can be used:
    355
    356.. code-block:: C
    357
    358	struct sockaddr_can baddr = {
    359		.can_family = AF_CAN,
    360		.can_addr.j1939 = {
    361			.name = name,
    362			.addr = J1939_IDLE_ADDR,
    363			.pgn = J1939_NO_PGN,	/* to disable bind() rx filter for PGN */
    364		},
    365		.can_ifindex = if_nametoindex("can0"),
    366	};
    367
    368	bind(sock, (struct sockaddr *)&baddr, sizeof(baddr));
    369
    370	/* for Address Claiming broadcast must be allowed */
    371	int value = 1;
    372	setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &value, sizeof(value));
    373
    374	/* configured advanced RX filter with PGN needed for Address Claiming */
    375	const struct j1939_filter filt[] = {
    376		{
    377			.pgn = J1939_PGN_ADDRESS_CLAIMED,
    378			.pgn_mask = J1939_PGN_PDU1_MAX,
    379		}, {
    380			.pgn = J1939_PGN_REQUEST,
    381			.pgn_mask = J1939_PGN_PDU1_MAX,
    382		}, {
    383			.pgn = J1939_PGN_ADDRESS_COMMANDED,
    384			.pgn_mask = J1939_PGN_MAX,
    385		},
    386	};
    387
    388	setsockopt(sock, SOL_CAN_J1939, SO_J1939_FILTER, &filt, sizeof(filt));
    389
    390	uint64_t dat = htole64(name);
    391	const struct sockaddr_can saddr = {
    392		.can_family = AF_CAN,
    393		.can_addr.j1939 = {
    394			.pgn = J1939_PGN_ADDRESS_CLAIMED,
    395			.addr = J1939_NO_ADDR,
    396		},
    397	};
    398
    399	/* Afterwards do a sendto(2) with data set to the NAME (Little Endian). If the
    400	 * NAME provided, does not match the j1939.name provided to bind(2), EPROTO
    401	 * will be returned.
    402	 */
    403	sendto(sock, dat, sizeof(dat), 0, (const struct sockaddr *)&saddr, sizeof(saddr));
    404
    405If no-one else contests the address claim within 250ms after transmission, the
    406kernel marks the NAME-SA assignment as valid. The valid assignment will be kept
    407among other valid NAME-SA assignments. From that point, any socket bound to the
    408NAME can send packets.
    409
    410If another ECU claims the address, the kernel will mark the NAME-SA expired.
    411No socket bound to the NAME can send packets (other than address claims). To
    412claim another address, some socket bound to NAME, must ``bind(2)`` again, but with
    413only ``j1939.addr`` changed to the new SA, and must then send a valid address claim
    414packet. This restarts the state machine in the kernel (and any other
    415participant on the bus) for this NAME.
    416
    417``can-utils`` also include the ``j1939acd`` tool, so it can be used as code example or as
    418default Address Claiming daemon.
    419
    420Send Examples
    421-------------
    422
    423Static Addressing
    424^^^^^^^^^^^^^^^^^
    425
    426This example will send a PGN (0x12300) from SA 0x20 to DA 0x30.
    427
    428Bind:
    429
    430.. code-block:: C
    431
    432	struct sockaddr_can baddr = {
    433		.can_family = AF_CAN,
    434		.can_addr.j1939 = {
    435			.name = J1939_NO_NAME,
    436			.addr = 0x20,
    437			.pgn = J1939_NO_PGN,
    438		},
    439		.can_ifindex = if_nametoindex("can0"),
    440	};
    441
    442	bind(sock, (struct sockaddr *)&baddr, sizeof(baddr));
    443
    444Now, the socket 'sock' is bound to the SA 0x20. Since no ``connect(2)`` was called,
    445at this point we can use only ``sendto(2)`` or ``sendmsg(2)``.
    446
    447Send:
    448
    449.. code-block:: C
    450
    451	const struct sockaddr_can saddr = {
    452		.can_family = AF_CAN,
    453		.can_addr.j1939 = {
    454			.name = J1939_NO_NAME;
    455			.addr = 0x30,
    456			.pgn = 0x12300,
    457		},
    458	};
    459
    460	sendto(sock, dat, sizeof(dat), 0, (const struct sockaddr *)&saddr, sizeof(saddr));