LCOV - code coverage report
Current view: top level - zephyr/net - socketcan.h Hit Total Coverage
Test: new.info Lines: 20 20 100.0 %
Date: 2024-12-22 00:14:23

          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 1.14