can: j1939: use backquotes for code samples
This patch adds backquotes for code samples. Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com> Link: https://lore.kernel.org/r/20201026094442.16587-1-yegorslists@googlemail.com Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
This commit is contained in:
Родитель
ea780d39b1
Коммит
a39372c2c5
|
@ -131,31 +131,31 @@ API Calls
|
||||||
---------
|
---------
|
||||||
|
|
||||||
On CAN, you first need to open a socket for communicating over a CAN network.
|
On CAN, you first need to open a socket for communicating over a CAN network.
|
||||||
To use J1939, #include <linux/can/j1939.h>. From there, <linux/can.h> will be
|
To use J1939, ``#include <linux/can/j1939.h>``. From there, ``<linux/can.h>`` will be
|
||||||
included too. To open a socket, use:
|
included too. To open a socket, use:
|
||||||
|
|
||||||
.. code-block:: C
|
.. code-block:: C
|
||||||
|
|
||||||
s = socket(PF_CAN, SOCK_DGRAM, CAN_J1939);
|
s = socket(PF_CAN, SOCK_DGRAM, CAN_J1939);
|
||||||
|
|
||||||
J1939 does use SOCK_DGRAM sockets. In the J1939 specification, connections are
|
J1939 does use ``SOCK_DGRAM`` sockets. In the J1939 specification, connections are
|
||||||
mentioned in the context of transport protocol sessions. These still deliver
|
mentioned in the context of transport protocol sessions. These still deliver
|
||||||
packets to the other end (using several CAN packets). SOCK_STREAM is not
|
packets to the other end (using several CAN packets). ``SOCK_STREAM`` is not
|
||||||
supported.
|
supported.
|
||||||
|
|
||||||
After the successful creation of the socket, you would normally use the bind(2)
|
After the successful creation of the socket, you would normally use the ``bind(2)``
|
||||||
and/or connect(2) system call to bind the socket to a CAN interface. After
|
and/or ``connect(2)`` system call to bind the socket to a CAN interface. After
|
||||||
binding and/or connecting the socket, you can read(2) and write(2) from/to the
|
binding and/or connecting the socket, you can ``read(2)`` and ``write(2)`` from/to the
|
||||||
socket or use send(2), sendto(2), sendmsg(2) and the recv*() counterpart
|
socket or use ``send(2)``, ``sendto(2)``, ``sendmsg(2)`` and the ``recv*()`` counterpart
|
||||||
operations on the socket as usual. There are also J1939 specific socket options
|
operations on the socket as usual. There are also J1939 specific socket options
|
||||||
described below.
|
described below.
|
||||||
|
|
||||||
In order to send data, a bind(2) must have been successful. bind(2) assigns a
|
In order to send data, a ``bind(2)`` must have been successful. ``bind(2)`` assigns a
|
||||||
local address to a socket.
|
local address to a socket.
|
||||||
|
|
||||||
Different from CAN is that the payload data is just the data that get sends,
|
Different from CAN is that the payload data is just the data that get sends,
|
||||||
without its header info. The header info is derived from the sockaddr supplied
|
without its header info. The header info is derived from the sockaddr supplied
|
||||||
to bind(2), connect(2), sendto(2) and recvfrom(2). A write(2) with size 4 will
|
to ``bind(2)``, ``connect(2)``, ``sendto(2)`` and ``recvfrom(2)``. A ``write(2)`` with size 4 will
|
||||||
result in a packet with 4 bytes.
|
result in a packet with 4 bytes.
|
||||||
|
|
||||||
The sockaddr structure has extensions for use with J1939 as specified below:
|
The sockaddr structure has extensions for use with J1939 as specified below:
|
||||||
|
@ -180,47 +180,47 @@ The sockaddr structure has extensions for use with J1939 as specified below:
|
||||||
} can_addr;
|
} can_addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
can_family & can_ifindex serve the same purpose as for other SocketCAN sockets.
|
``can_family`` & ``can_ifindex`` serve the same purpose as for other SocketCAN sockets.
|
||||||
|
|
||||||
can_addr.j1939.pgn specifies the PGN (max 0x3ffff). Individual bits are
|
``can_addr.j1939.pgn`` specifies the PGN (max 0x3ffff). Individual bits are
|
||||||
specified above.
|
specified above.
|
||||||
|
|
||||||
can_addr.j1939.name contains the 64-bit J1939 NAME.
|
``can_addr.j1939.name`` contains the 64-bit J1939 NAME.
|
||||||
|
|
||||||
can_addr.j1939.addr contains the address.
|
``can_addr.j1939.addr`` contains the address.
|
||||||
|
|
||||||
The bind(2) system call assigns the local address, i.e. the source address when
|
The ``bind(2)`` system call assigns the local address, i.e. the source address when
|
||||||
sending packages. If a PGN during bind(2) is set, it's used as a RX filter.
|
sending packages. If a PGN during ``bind(2)`` is set, it's used as a RX filter.
|
||||||
I.e. only packets with a matching PGN are received. If an ADDR or NAME is set
|
I.e. only packets with a matching PGN are received. If an ADDR or NAME is set
|
||||||
it is used as a receive filter, too. It will match the destination NAME or ADDR
|
it is used as a receive filter, too. It will match the destination NAME or ADDR
|
||||||
of the incoming packet. The NAME filter will work only if appropriate Address
|
of the incoming packet. The NAME filter will work only if appropriate Address
|
||||||
Claiming for this name was done on the CAN bus and registered/cached by the
|
Claiming for this name was done on the CAN bus and registered/cached by the
|
||||||
kernel.
|
kernel.
|
||||||
|
|
||||||
On the other hand connect(2) assigns the remote address, i.e. the destination
|
On the other hand ``connect(2)`` assigns the remote address, i.e. the destination
|
||||||
address. The PGN from connect(2) is used as the default PGN when sending
|
address. The PGN from ``connect(2)`` is used as the default PGN when sending
|
||||||
packets. If ADDR or NAME is set it will be used as the default destination ADDR
|
packets. If ADDR or NAME is set it will be used as the default destination ADDR
|
||||||
or NAME. Further a set ADDR or NAME during connect(2) is used as a receive
|
or NAME. Further a set ADDR or NAME during ``connect(2)`` is used as a receive
|
||||||
filter. It will match the source NAME or ADDR of the incoming packet.
|
filter. It will match the source NAME or ADDR of the incoming packet.
|
||||||
|
|
||||||
Both write(2) and send(2) will send a packet with local address from bind(2) and
|
Both ``write(2)`` and ``send(2)`` will send a packet with local address from ``bind(2)`` and the
|
||||||
the remote address from connect(2). Use sendto(2) to overwrite the destination
|
remote address from ``connect(2)``. Use ``sendto(2)`` to overwrite the destination
|
||||||
address.
|
address.
|
||||||
|
|
||||||
If can_addr.j1939.name is set (!= 0) the NAME is looked up by the kernel and
|
If ``can_addr.j1939.name`` is set (!= 0) the NAME is looked up by the kernel and
|
||||||
the corresponding ADDR is used. If can_addr.j1939.name is not set (== 0),
|
the corresponding ADDR is used. If ``can_addr.j1939.name`` is not set (== 0),
|
||||||
can_addr.j1939.addr is used.
|
``can_addr.j1939.addr`` is used.
|
||||||
|
|
||||||
When creating a socket, reasonable defaults are set. Some options can be
|
When creating a socket, reasonable defaults are set. Some options can be
|
||||||
modified with setsockopt(2) & getsockopt(2).
|
modified with ``setsockopt(2)`` & ``getsockopt(2)``.
|
||||||
|
|
||||||
RX path related options:
|
RX path related options:
|
||||||
|
|
||||||
- SO_J1939_FILTER - configure array of filters
|
- ``SO_J1939_FILTER`` - configure array of filters
|
||||||
- SO_J1939_PROMISC - disable filters set by bind(2) and connect(2)
|
- ``SO_J1939_PROMISC`` - disable filters set by ``bind(2)`` and ``connect(2)``
|
||||||
|
|
||||||
By default no broadcast packets can be send or received. To enable sending or
|
By default no broadcast packets can be send or received. To enable sending or
|
||||||
receiving broadcast packets use the socket option SO_BROADCAST:
|
receiving broadcast packets use the socket option ``SO_BROADCAST``:
|
||||||
|
|
||||||
.. code-block:: C
|
.. code-block:: C
|
||||||
|
|
||||||
|
@ -261,26 +261,26 @@ The following diagram illustrates the RX path:
|
||||||
+---------------------------+
|
+---------------------------+
|
||||||
|
|
||||||
TX path related options:
|
TX path related options:
|
||||||
SO_J1939_SEND_PRIO - change default send priority for the socket
|
``SO_J1939_SEND_PRIO`` - change default send priority for the socket
|
||||||
|
|
||||||
Message Flags during send() and Related System Calls
|
Message Flags during send() and Related System Calls
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
send(2), sendto(2) and sendmsg(2) take a 'flags' argument. Currently
|
``send(2)``, ``sendto(2)`` and ``sendmsg(2)`` take a 'flags' argument. Currently
|
||||||
supported flags are:
|
supported flags are:
|
||||||
|
|
||||||
* MSG_DONTWAIT, i.e. non-blocking operation.
|
* ``MSG_DONTWAIT``, i.e. non-blocking operation.
|
||||||
|
|
||||||
recvmsg(2)
|
recvmsg(2)
|
||||||
^^^^^^^^^^
|
^^^^^^^^^^
|
||||||
|
|
||||||
In most cases recvmsg(2) is needed if you want to extract more information than
|
In most cases ``recvmsg(2)`` is needed if you want to extract more information than
|
||||||
recvfrom(2) can provide. For example package priority and timestamp. The
|
``recvfrom(2)`` can provide. For example package priority and timestamp. The
|
||||||
Destination Address, name and packet priority (if applicable) are attached to
|
Destination Address, name and packet priority (if applicable) are attached to
|
||||||
the msghdr in the recvmsg(2) call. They can be extracted using cmsg(3) macros,
|
the msghdr in the ``recvmsg(2)`` call. They can be extracted using ``cmsg(3)`` macros,
|
||||||
with cmsg_level == SOL_J1939 && cmsg_type == SCM_J1939_DEST_ADDR,
|
with ``cmsg_level == SOL_J1939 && cmsg_type == SCM_J1939_DEST_ADDR``,
|
||||||
SCM_J1939_DEST_NAME or SCM_J1939_PRIO. The returned data is a uint8_t for
|
``SCM_J1939_DEST_NAME`` or ``SCM_J1939_PRIO``. The returned data is a ``uint8_t`` for
|
||||||
priority and dst_addr, and uint64_t for dst_name.
|
``priority`` and ``dst_addr``, and ``uint64_t`` for ``dst_name``.
|
||||||
|
|
||||||
.. code-block:: C
|
.. code-block:: C
|
||||||
|
|
||||||
|
@ -305,12 +305,12 @@ Dynamic Addressing
|
||||||
|
|
||||||
Distinction has to be made between using the claimed address and doing an
|
Distinction has to be made between using the claimed address and doing an
|
||||||
address claim. To use an already claimed address, one has to fill in the
|
address claim. To use an already claimed address, one has to fill in the
|
||||||
j1939.name member and provide it to bind(2). If the name had claimed an address
|
``j1939.name`` member and provide it to ``bind(2)``. If the name had claimed an address
|
||||||
earlier, all further messages being sent will use that address. And the
|
earlier, all further messages being sent will use that address. And the
|
||||||
j1939.addr member will be ignored.
|
``j1939.addr`` member will be ignored.
|
||||||
|
|
||||||
An exception on this is PGN 0x0ee00. This is the "Address Claim/Cannot Claim
|
An exception on this is PGN 0x0ee00. This is the "Address Claim/Cannot Claim
|
||||||
Address" message and the kernel will use the j1939.addr member for that PGN if
|
Address" message and the kernel will use the ``j1939.addr`` member for that PGN if
|
||||||
necessary.
|
necessary.
|
||||||
|
|
||||||
To claim an address following code example can be used:
|
To claim an address following code example can be used:
|
||||||
|
@ -371,12 +371,12 @@ NAME can send packets.
|
||||||
|
|
||||||
If another ECU claims the address, the kernel will mark the NAME-SA expired.
|
If another ECU claims the address, the kernel will mark the NAME-SA expired.
|
||||||
No socket bound to the NAME can send packets (other than address claims). To
|
No socket bound to the NAME can send packets (other than address claims). To
|
||||||
claim another address, some socket bound to NAME, must bind(2) again, but with
|
claim another address, some socket bound to NAME, must ``bind(2)`` again, but with
|
||||||
only j1939.addr changed to the new SA, and must then send a valid address claim
|
only ``j1939.addr`` changed to the new SA, and must then send a valid address claim
|
||||||
packet. This restarts the state machine in the kernel (and any other
|
packet. This restarts the state machine in the kernel (and any other
|
||||||
participant on the bus) for this NAME.
|
participant on the bus) for this NAME.
|
||||||
|
|
||||||
can-utils also include the j1939acd tool, so it can be used as code example or as
|
``can-utils`` also include the ``j1939acd`` tool, so it can be used as code example or as
|
||||||
default Address Claiming daemon.
|
default Address Claiming daemon.
|
||||||
|
|
||||||
Send Examples
|
Send Examples
|
||||||
|
@ -403,8 +403,8 @@ Bind:
|
||||||
|
|
||||||
bind(sock, (struct sockaddr *)&baddr, sizeof(baddr));
|
bind(sock, (struct sockaddr *)&baddr, sizeof(baddr));
|
||||||
|
|
||||||
Now, the socket 'sock' is bound to the SA 0x20. Since no connect(2) was called,
|
Now, the socket 'sock' is bound to the SA 0x20. Since no ``connect(2)`` was called,
|
||||||
at this point we can use only sendto(2) or sendmsg(2).
|
at this point we can use only ``sendto(2)`` or ``sendmsg(2)``.
|
||||||
|
|
||||||
Send:
|
Send:
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче