LCOV - code coverage report
Current view: top level - zephyr/net - socketcan.h Coverage Total Hit
Test: new.info Lines: 100.0 % 20 20
Test Date: 2025-09-05 22:20:39

            Line data    Source code
       1            1 : /** @file
       2              :  * @brief SocketCAN definitions.
       3              :  *
       4              :  * Definitions for SocketCAN support.
       5              :  */
       6              : 
       7              : /*
       8              :  * Copyright (c) 2019 Intel Corporation
       9              :  *
      10              :  * SPDX-License-Identifier: Apache-2.0
      11              :  */
      12              : 
      13              : #ifndef ZEPHYR_INCLUDE_NET_SOCKETCAN_H_
      14              : #define ZEPHYR_INCLUDE_NET_SOCKETCAN_H_
      15              : 
      16              : #include <zephyr/types.h>
      17              : #include <zephyr/net/net_ip.h>
      18              : #include <zephyr/net/net_if.h>
      19              : 
      20              : #ifdef __cplusplus
      21              : extern "C" {
      22              : #endif
      23              : 
      24              : /**
      25              :  * @brief SocketCAN library
      26              :  * @defgroup socket_can SocketCAN library
      27              :  * @since 1.14
      28              :  * @version 0.8.0
      29              :  * @ingroup networking
      30              :  * @{
      31              :  */
      32              : 
      33              : /** Protocols of the protocol family PF_CAN */
      34            1 : #define CAN_RAW 1
      35              : 
      36              : /** @cond INTERNAL_HIDDEN */
      37              : 
      38              : /* SocketCAN options */
      39              : #define SOL_CAN_BASE 100
      40              : #define SOL_CAN_RAW (SOL_CAN_BASE + CAN_RAW)
      41              : 
      42              : enum {
      43              :         CAN_RAW_FILTER = 1,
      44              : };
      45              : 
      46              : /** @endcond */
      47              : 
      48              : /* SocketCAN MTU size compatible with Linux */
      49              : #ifdef CONFIG_CAN_FD_MODE
      50              : /** SocketCAN max data length */
      51              : #define SOCKETCAN_MAX_DLEN 64U
      52              : /** CAN FD frame MTU */
      53              : #define CANFD_MTU (sizeof(struct socketcan_frame))
      54              : /** CAN frame MTU */
      55              : #define CAN_MTU (CANFD_MTU - 56U)
      56              : #else /* CONFIG_CAN_FD_MODE */
      57              : /** SocketCAN max data length */
      58            1 : #define SOCKETCAN_MAX_DLEN 8U
      59              : /** CAN frame MTU */
      60            1 : #define CAN_MTU (sizeof(struct socketcan_frame))
      61              : #endif /* !CONFIG_CAN_FD_MODE */
      62              : 
      63              : /* CAN FD specific flags from Linux Kernel (include/uapi/linux/can.h) */
      64            1 : #define CANFD_BRS 0x01 /**< Bit rate switch (second bitrate for payload data) */
      65            1 : #define CANFD_ESI 0x02 /**< Error state indicator of the transmitting node */
      66            1 : #define CANFD_FDF 0x04 /**< Mark CAN FD for dual use of struct canfd_frame */
      67              : 
      68              : /**
      69              :  * struct sockaddr_can - The sockaddr structure for CAN sockets
      70              :  *
      71              :  */
      72            1 : struct sockaddr_can {
      73            1 :         sa_family_t can_family;   /**< Address family */
      74            1 :         int         can_ifindex;  /**< SocketCAN network interface index */
      75              : };
      76              : 
      77              : /**
      78              :  * @name Linux SocketCAN compatibility
      79              :  *
      80              :  * The following structures and functions provide compatibility with the CAN
      81              :  * frame and CAN filter formats used by Linux SocketCAN.
      82              :  *
      83              :  * @{
      84              :  */
      85              : 
      86              : /**
      87              :  * CAN Identifier structure for Linux SocketCAN compatibility.
      88              :  *
      89              :  * The fields in this type are:
      90              :  *
      91              :  * @code{.text}
      92              :  *
      93              :  * +------+--------------------------------------------------------------+
      94              :  * | Bits | Description                                                  |
      95              :  * +======+==============================================================+
      96              :  * | 0-28 | CAN identifier (11/29 bit)                                   |
      97              :  * +------+--------------------------------------------------------------+
      98              :  * |  29  | Error message frame flag (0 = data frame, 1 = error message) |
      99              :  * +------+--------------------------------------------------------------+
     100              :  * |  30  | Remote transmission request flag (1 = RTR frame)             |
     101              :  * +------+--------------------------------------------------------------+
     102              :  * |  31  | Frame format flag (0 = standard 11 bit, 1 = extended 29 bit) |
     103              :  * +------+--------------------------------------------------------------+
     104              :  *
     105              :  * @endcode
     106              :  */
     107            1 : typedef uint32_t socketcan_id_t;
     108              : 
     109              : /**
     110              :  * @brief CAN frame for Linux SocketCAN compatibility.
     111              :  */
     112            1 : struct socketcan_frame {
     113              :         /** 32-bit CAN ID + EFF/RTR/ERR flags. */
     114            1 :         socketcan_id_t can_id;
     115              :         /** Frame payload length in bytes. */
     116            1 :         uint8_t len;
     117              :         /** Additional flags for CAN FD. */
     118            1 :         uint8_t flags;
     119              :         /** @cond INTERNAL_HIDDEN */
     120              :         uint8_t res0;  /* reserved/padding. */
     121              :         uint8_t res1;  /* reserved/padding. */
     122              :         /** @endcond */
     123              : 
     124              :         /** The payload data. */
     125            1 :         uint8_t data[SOCKETCAN_MAX_DLEN];
     126              : };
     127              : 
     128              : /**
     129              :  * @brief CAN filter for Linux SocketCAN compatibility.
     130              :  *
     131              :  * A filter is considered a match when `received_can_id & mask == can_id & can_mask`.
     132              :  */
     133            1 : struct socketcan_filter {
     134              :         /** The CAN identifier to match. */
     135            1 :         socketcan_id_t can_id;
     136              :         /** The mask applied to @a can_id for matching. */
     137            1 :         socketcan_id_t can_mask;
     138              :         /** Additional flags for FD frame filter. */
     139            1 :         uint8_t flags;
     140              : };
     141              : 
     142              : /** @} */
     143              : 
     144              : /**
     145              :  * @}
     146              :  */
     147              : 
     148              : #ifdef __cplusplus
     149              : }
     150              : #endif
     151              : 
     152              : #endif /* ZEPHYR_INCLUDE_NET_SOCKETCAN_H_ */
        

Generated by: LCOV version 2.0-1