1*1b481fc3SMaciej Żenczykowski /* SPDX-License-Identifier: ((GPL-2.0-only WITH Linux-syscall-note) OR BSD-3-Clause) */ 2*1b481fc3SMaciej Żenczykowski /* 3*1b481fc3SMaciej Żenczykowski * linux/can.h 4*1b481fc3SMaciej Żenczykowski * 5*1b481fc3SMaciej Żenczykowski * Definitions for CAN network layer (socket addr / CAN frame / CAN filter) 6*1b481fc3SMaciej Żenczykowski * 7*1b481fc3SMaciej Żenczykowski * Authors: Oliver Hartkopp <[email protected]> 8*1b481fc3SMaciej Żenczykowski * Urs Thuermann <[email protected]> 9*1b481fc3SMaciej Żenczykowski * Copyright (c) 2002-2007 Volkswagen Group Electronic Research 10*1b481fc3SMaciej Żenczykowski * All rights reserved. 11*1b481fc3SMaciej Żenczykowski * 12*1b481fc3SMaciej Żenczykowski * Redistribution and use in source and binary forms, with or without 13*1b481fc3SMaciej Żenczykowski * modification, are permitted provided that the following conditions 14*1b481fc3SMaciej Żenczykowski * are met: 15*1b481fc3SMaciej Żenczykowski * 1. Redistributions of source code must retain the above copyright 16*1b481fc3SMaciej Żenczykowski * notice, this list of conditions and the following disclaimer. 17*1b481fc3SMaciej Żenczykowski * 2. Redistributions in binary form must reproduce the above copyright 18*1b481fc3SMaciej Żenczykowski * notice, this list of conditions and the following disclaimer in the 19*1b481fc3SMaciej Żenczykowski * documentation and/or other materials provided with the distribution. 20*1b481fc3SMaciej Żenczykowski * 3. Neither the name of Volkswagen nor the names of its contributors 21*1b481fc3SMaciej Żenczykowski * may be used to endorse or promote products derived from this software 22*1b481fc3SMaciej Żenczykowski * without specific prior written permission. 23*1b481fc3SMaciej Żenczykowski * 24*1b481fc3SMaciej Żenczykowski * Alternatively, provided that this notice is retained in full, this 25*1b481fc3SMaciej Żenczykowski * software may be distributed under the terms of the GNU General 26*1b481fc3SMaciej Żenczykowski * Public License ("GPL") version 2, in which case the provisions of the 27*1b481fc3SMaciej Żenczykowski * GPL apply INSTEAD OF those given above. 28*1b481fc3SMaciej Żenczykowski * 29*1b481fc3SMaciej Żenczykowski * The provided data structures and external interfaces from this code 30*1b481fc3SMaciej Żenczykowski * are not restricted to be used by modules with a GPL compatible license. 31*1b481fc3SMaciej Żenczykowski * 32*1b481fc3SMaciej Żenczykowski * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 33*1b481fc3SMaciej Żenczykowski * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 34*1b481fc3SMaciej Żenczykowski * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 35*1b481fc3SMaciej Żenczykowski * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 36*1b481fc3SMaciej Żenczykowski * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 37*1b481fc3SMaciej Żenczykowski * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 38*1b481fc3SMaciej Żenczykowski * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 39*1b481fc3SMaciej Żenczykowski * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 40*1b481fc3SMaciej Żenczykowski * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 41*1b481fc3SMaciej Żenczykowski * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 42*1b481fc3SMaciej Żenczykowski * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH 43*1b481fc3SMaciej Żenczykowski * DAMAGE. 44*1b481fc3SMaciej Żenczykowski */ 45*1b481fc3SMaciej Żenczykowski 46*1b481fc3SMaciej Żenczykowski #ifndef _UAPI_CAN_H 47*1b481fc3SMaciej Żenczykowski #define _UAPI_CAN_H 48*1b481fc3SMaciej Żenczykowski 49*1b481fc3SMaciej Żenczykowski #include <linux/types.h> 50*1b481fc3SMaciej Żenczykowski #include <linux/socket.h> 51*1b481fc3SMaciej Żenczykowski #include <linux/stddef.h> /* for offsetof */ 52*1b481fc3SMaciej Żenczykowski 53*1b481fc3SMaciej Żenczykowski /* controller area network (CAN) kernel definitions */ 54*1b481fc3SMaciej Żenczykowski 55*1b481fc3SMaciej Żenczykowski /* special address description flags for the CAN_ID */ 56*1b481fc3SMaciej Żenczykowski #define CAN_EFF_FLAG 0x80000000U /* EFF/SFF is set in the MSB */ 57*1b481fc3SMaciej Żenczykowski #define CAN_RTR_FLAG 0x40000000U /* remote transmission request */ 58*1b481fc3SMaciej Żenczykowski #define CAN_ERR_FLAG 0x20000000U /* error message frame */ 59*1b481fc3SMaciej Żenczykowski 60*1b481fc3SMaciej Żenczykowski /* valid bits in CAN ID for frame formats */ 61*1b481fc3SMaciej Żenczykowski #define CAN_SFF_MASK 0x000007FFU /* standard frame format (SFF) */ 62*1b481fc3SMaciej Żenczykowski #define CAN_EFF_MASK 0x1FFFFFFFU /* extended frame format (EFF) */ 63*1b481fc3SMaciej Żenczykowski #define CAN_ERR_MASK 0x1FFFFFFFU /* omit EFF, RTR, ERR flags */ 64*1b481fc3SMaciej Żenczykowski #define CANXL_PRIO_MASK CAN_SFF_MASK /* 11 bit priority mask */ 65*1b481fc3SMaciej Żenczykowski 66*1b481fc3SMaciej Żenczykowski /* 67*1b481fc3SMaciej Żenczykowski * Controller Area Network Identifier structure 68*1b481fc3SMaciej Żenczykowski * 69*1b481fc3SMaciej Żenczykowski * bit 0-28 : CAN identifier (11/29 bit) 70*1b481fc3SMaciej Żenczykowski * bit 29 : error message frame flag (0 = data frame, 1 = error message) 71*1b481fc3SMaciej Żenczykowski * bit 30 : remote transmission request flag (1 = rtr frame) 72*1b481fc3SMaciej Żenczykowski * bit 31 : frame format flag (0 = standard 11 bit, 1 = extended 29 bit) 73*1b481fc3SMaciej Żenczykowski */ 74*1b481fc3SMaciej Żenczykowski typedef __u32 canid_t; 75*1b481fc3SMaciej Żenczykowski 76*1b481fc3SMaciej Żenczykowski #define CAN_SFF_ID_BITS 11 77*1b481fc3SMaciej Żenczykowski #define CAN_EFF_ID_BITS 29 78*1b481fc3SMaciej Żenczykowski #define CANXL_PRIO_BITS CAN_SFF_ID_BITS 79*1b481fc3SMaciej Żenczykowski 80*1b481fc3SMaciej Żenczykowski /* 81*1b481fc3SMaciej Żenczykowski * Controller Area Network Error Message Frame Mask structure 82*1b481fc3SMaciej Żenczykowski * 83*1b481fc3SMaciej Żenczykowski * bit 0-28 : error class mask (see include/uapi/linux/can/error.h) 84*1b481fc3SMaciej Żenczykowski * bit 29-31 : set to zero 85*1b481fc3SMaciej Żenczykowski */ 86*1b481fc3SMaciej Żenczykowski typedef __u32 can_err_mask_t; 87*1b481fc3SMaciej Żenczykowski 88*1b481fc3SMaciej Żenczykowski /* CAN payload length and DLC definitions according to ISO 11898-1 */ 89*1b481fc3SMaciej Żenczykowski #define CAN_MAX_DLC 8 90*1b481fc3SMaciej Żenczykowski #define CAN_MAX_RAW_DLC 15 91*1b481fc3SMaciej Żenczykowski #define CAN_MAX_DLEN 8 92*1b481fc3SMaciej Żenczykowski 93*1b481fc3SMaciej Żenczykowski /* CAN FD payload length and DLC definitions according to ISO 11898-7 */ 94*1b481fc3SMaciej Żenczykowski #define CANFD_MAX_DLC 15 95*1b481fc3SMaciej Żenczykowski #define CANFD_MAX_DLEN 64 96*1b481fc3SMaciej Żenczykowski 97*1b481fc3SMaciej Żenczykowski /* 98*1b481fc3SMaciej Żenczykowski * CAN XL payload length and DLC definitions according to ISO 11898-1 99*1b481fc3SMaciej Żenczykowski * CAN XL DLC ranges from 0 .. 2047 => data length from 1 .. 2048 byte 100*1b481fc3SMaciej Żenczykowski */ 101*1b481fc3SMaciej Żenczykowski #define CANXL_MIN_DLC 0 102*1b481fc3SMaciej Żenczykowski #define CANXL_MAX_DLC 2047 103*1b481fc3SMaciej Żenczykowski #define CANXL_MAX_DLC_MASK 0x07FF 104*1b481fc3SMaciej Żenczykowski #define CANXL_MIN_DLEN 1 105*1b481fc3SMaciej Żenczykowski #define CANXL_MAX_DLEN 2048 106*1b481fc3SMaciej Żenczykowski 107*1b481fc3SMaciej Żenczykowski /** 108*1b481fc3SMaciej Żenczykowski * struct can_frame - Classical CAN frame structure (aka CAN 2.0B) 109*1b481fc3SMaciej Żenczykowski * @can_id: CAN ID of the frame and CAN_*_FLAG flags, see canid_t definition 110*1b481fc3SMaciej Żenczykowski * @len: CAN frame payload length in byte (0 .. 8) 111*1b481fc3SMaciej Żenczykowski * @can_dlc: deprecated name for CAN frame payload length in byte (0 .. 8) 112*1b481fc3SMaciej Żenczykowski * @__pad: padding 113*1b481fc3SMaciej Żenczykowski * @__res0: reserved / padding 114*1b481fc3SMaciej Żenczykowski * @len8_dlc: optional DLC value (9 .. 15) at 8 byte payload length 115*1b481fc3SMaciej Żenczykowski * len8_dlc contains values from 9 .. 15 when the payload length is 116*1b481fc3SMaciej Żenczykowski * 8 bytes but the DLC value (see ISO 11898-1) is greater then 8. 117*1b481fc3SMaciej Żenczykowski * CAN_CTRLMODE_CC_LEN8_DLC flag has to be enabled in CAN driver. 118*1b481fc3SMaciej Żenczykowski * @data: CAN frame payload (up to 8 byte) 119*1b481fc3SMaciej Żenczykowski */ 120*1b481fc3SMaciej Żenczykowski struct can_frame { 121*1b481fc3SMaciej Żenczykowski canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */ 122*1b481fc3SMaciej Żenczykowski union { 123*1b481fc3SMaciej Żenczykowski /* CAN frame payload length in byte (0 .. CAN_MAX_DLEN) 124*1b481fc3SMaciej Żenczykowski * was previously named can_dlc so we need to carry that 125*1b481fc3SMaciej Żenczykowski * name for legacy support 126*1b481fc3SMaciej Żenczykowski */ 127*1b481fc3SMaciej Żenczykowski __u8 len; 128*1b481fc3SMaciej Żenczykowski __u8 can_dlc; /* deprecated */ 129*1b481fc3SMaciej Żenczykowski } __attribute__((packed)); /* disable padding added in some ABIs */ 130*1b481fc3SMaciej Żenczykowski __u8 __pad; /* padding */ 131*1b481fc3SMaciej Żenczykowski __u8 __res0; /* reserved / padding */ 132*1b481fc3SMaciej Żenczykowski __u8 len8_dlc; /* optional DLC for 8 byte payload length (9 .. 15) */ 133*1b481fc3SMaciej Żenczykowski __u8 data[CAN_MAX_DLEN] __attribute__((aligned(8))); 134*1b481fc3SMaciej Żenczykowski }; 135*1b481fc3SMaciej Żenczykowski 136*1b481fc3SMaciej Żenczykowski /* 137*1b481fc3SMaciej Żenczykowski * defined bits for canfd_frame.flags 138*1b481fc3SMaciej Żenczykowski * 139*1b481fc3SMaciej Żenczykowski * The use of struct canfd_frame implies the FD Frame (FDF) bit to 140*1b481fc3SMaciej Żenczykowski * be set in the CAN frame bitstream on the wire. The FDF bit switch turns 141*1b481fc3SMaciej Żenczykowski * the CAN controllers bitstream processor into the CAN FD mode which creates 142*1b481fc3SMaciej Żenczykowski * two new options within the CAN FD frame specification: 143*1b481fc3SMaciej Żenczykowski * 144*1b481fc3SMaciej Żenczykowski * Bit Rate Switch - to indicate a second bitrate is/was used for the payload 145*1b481fc3SMaciej Żenczykowski * Error State Indicator - represents the error state of the transmitting node 146*1b481fc3SMaciej Żenczykowski * 147*1b481fc3SMaciej Żenczykowski * As the CANFD_ESI bit is internally generated by the transmitting CAN 148*1b481fc3SMaciej Żenczykowski * controller only the CANFD_BRS bit is relevant for real CAN controllers when 149*1b481fc3SMaciej Żenczykowski * building a CAN FD frame for transmission. Setting the CANFD_ESI bit can make 150*1b481fc3SMaciej Żenczykowski * sense for virtual CAN interfaces to test applications with echoed frames. 151*1b481fc3SMaciej Żenczykowski * 152*1b481fc3SMaciej Żenczykowski * The struct can_frame and struct canfd_frame intentionally share the same 153*1b481fc3SMaciej Żenczykowski * layout to be able to write CAN frame content into a CAN FD frame structure. 154*1b481fc3SMaciej Żenczykowski * When this is done the former differentiation via CAN_MTU / CANFD_MTU gets 155*1b481fc3SMaciej Żenczykowski * lost. CANFD_FDF allows programmers to mark CAN FD frames in the case of 156*1b481fc3SMaciej Żenczykowski * using struct canfd_frame for mixed CAN / CAN FD content (dual use). 157*1b481fc3SMaciej Żenczykowski * Since the introduction of CAN XL the CANFD_FDF flag is set in all CAN FD 158*1b481fc3SMaciej Żenczykowski * frame structures provided by the CAN subsystem of the Linux kernel. 159*1b481fc3SMaciej Żenczykowski */ 160*1b481fc3SMaciej Żenczykowski #define CANFD_BRS 0x01 /* bit rate switch (second bitrate for payload data) */ 161*1b481fc3SMaciej Żenczykowski #define CANFD_ESI 0x02 /* error state indicator of the transmitting node */ 162*1b481fc3SMaciej Żenczykowski #define CANFD_FDF 0x04 /* mark CAN FD for dual use of struct canfd_frame */ 163*1b481fc3SMaciej Żenczykowski 164*1b481fc3SMaciej Żenczykowski /** 165*1b481fc3SMaciej Żenczykowski * struct canfd_frame - CAN flexible data rate frame structure 166*1b481fc3SMaciej Żenczykowski * @can_id: CAN ID of the frame and CAN_*_FLAG flags, see canid_t definition 167*1b481fc3SMaciej Żenczykowski * @len: frame payload length in byte (0 .. CANFD_MAX_DLEN) 168*1b481fc3SMaciej Żenczykowski * @flags: additional flags for CAN FD 169*1b481fc3SMaciej Żenczykowski * @__res0: reserved / padding 170*1b481fc3SMaciej Żenczykowski * @__res1: reserved / padding 171*1b481fc3SMaciej Żenczykowski * @data: CAN FD frame payload (up to CANFD_MAX_DLEN byte) 172*1b481fc3SMaciej Żenczykowski */ 173*1b481fc3SMaciej Żenczykowski struct canfd_frame { 174*1b481fc3SMaciej Żenczykowski canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */ 175*1b481fc3SMaciej Żenczykowski __u8 len; /* frame payload length in byte */ 176*1b481fc3SMaciej Żenczykowski __u8 flags; /* additional flags for CAN FD */ 177*1b481fc3SMaciej Żenczykowski __u8 __res0; /* reserved / padding */ 178*1b481fc3SMaciej Żenczykowski __u8 __res1; /* reserved / padding */ 179*1b481fc3SMaciej Żenczykowski __u8 data[CANFD_MAX_DLEN] __attribute__((aligned(8))); 180*1b481fc3SMaciej Żenczykowski }; 181*1b481fc3SMaciej Żenczykowski 182*1b481fc3SMaciej Żenczykowski /* 183*1b481fc3SMaciej Żenczykowski * defined bits for canxl_frame.flags 184*1b481fc3SMaciej Żenczykowski * 185*1b481fc3SMaciej Żenczykowski * The canxl_frame.flags element contains two bits CANXL_XLF and CANXL_SEC 186*1b481fc3SMaciej Żenczykowski * and shares the relative position of the struct can[fd]_frame.len element. 187*1b481fc3SMaciej Żenczykowski * The CANXL_XLF bit ALWAYS needs to be set to indicate a valid CAN XL frame. 188*1b481fc3SMaciej Żenczykowski * As a side effect setting this bit intentionally breaks the length checks 189*1b481fc3SMaciej Żenczykowski * for Classical CAN and CAN FD frames. 190*1b481fc3SMaciej Żenczykowski * 191*1b481fc3SMaciej Żenczykowski * Undefined bits in canxl_frame.flags are reserved and shall be set to zero. 192*1b481fc3SMaciej Żenczykowski */ 193*1b481fc3SMaciej Żenczykowski #define CANXL_XLF 0x80 /* mandatory CAN XL frame flag (must always be set!) */ 194*1b481fc3SMaciej Żenczykowski #define CANXL_SEC 0x01 /* Simple Extended Content (security/segmentation) */ 195*1b481fc3SMaciej Żenczykowski 196*1b481fc3SMaciej Żenczykowski /** 197*1b481fc3SMaciej Żenczykowski * struct canxl_frame - CAN with e'X'tended frame 'L'ength frame structure 198*1b481fc3SMaciej Żenczykowski * @prio: 11 bit arbitration priority with zero'ed CAN_*_FLAG flags 199*1b481fc3SMaciej Żenczykowski * @flags: additional flags for CAN XL 200*1b481fc3SMaciej Żenczykowski * @sdt: SDU (service data unit) type 201*1b481fc3SMaciej Żenczykowski * @len: frame payload length in byte (CANXL_MIN_DLEN .. CANXL_MAX_DLEN) 202*1b481fc3SMaciej Żenczykowski * @af: acceptance field 203*1b481fc3SMaciej Żenczykowski * @data: CAN XL frame payload (CANXL_MIN_DLEN .. CANXL_MAX_DLEN byte) 204*1b481fc3SMaciej Żenczykowski * 205*1b481fc3SMaciej Żenczykowski * @prio shares the same position as @can_id from struct can[fd]_frame. 206*1b481fc3SMaciej Żenczykowski */ 207*1b481fc3SMaciej Żenczykowski struct canxl_frame { 208*1b481fc3SMaciej Żenczykowski canid_t prio; /* 11 bit priority for arbitration (canid_t) */ 209*1b481fc3SMaciej Żenczykowski __u8 flags; /* additional flags for CAN XL */ 210*1b481fc3SMaciej Żenczykowski __u8 sdt; /* SDU (service data unit) type */ 211*1b481fc3SMaciej Żenczykowski __u16 len; /* frame payload length in byte */ 212*1b481fc3SMaciej Żenczykowski __u32 af; /* acceptance field */ 213*1b481fc3SMaciej Żenczykowski __u8 data[CANXL_MAX_DLEN]; 214*1b481fc3SMaciej Żenczykowski }; 215*1b481fc3SMaciej Żenczykowski 216*1b481fc3SMaciej Żenczykowski #define CAN_MTU (sizeof(struct can_frame)) 217*1b481fc3SMaciej Żenczykowski #define CANFD_MTU (sizeof(struct canfd_frame)) 218*1b481fc3SMaciej Żenczykowski #define CANXL_MTU (sizeof(struct canxl_frame)) 219*1b481fc3SMaciej Żenczykowski #define CANXL_HDR_SIZE (offsetof(struct canxl_frame, data)) 220*1b481fc3SMaciej Żenczykowski #define CANXL_MIN_MTU (CANXL_HDR_SIZE + 64) 221*1b481fc3SMaciej Żenczykowski #define CANXL_MAX_MTU CANXL_MTU 222*1b481fc3SMaciej Żenczykowski 223*1b481fc3SMaciej Żenczykowski /* particular protocols of the protocol family PF_CAN */ 224*1b481fc3SMaciej Żenczykowski #define CAN_RAW 1 /* RAW sockets */ 225*1b481fc3SMaciej Żenczykowski #define CAN_BCM 2 /* Broadcast Manager */ 226*1b481fc3SMaciej Żenczykowski #define CAN_TP16 3 /* VAG Transport Protocol v1.6 */ 227*1b481fc3SMaciej Żenczykowski #define CAN_TP20 4 /* VAG Transport Protocol v2.0 */ 228*1b481fc3SMaciej Żenczykowski #define CAN_MCNET 5 /* Bosch MCNet */ 229*1b481fc3SMaciej Żenczykowski #define CAN_ISOTP 6 /* ISO 15765-2 Transport Protocol */ 230*1b481fc3SMaciej Żenczykowski #define CAN_J1939 7 /* SAE J1939 */ 231*1b481fc3SMaciej Żenczykowski #define CAN_NPROTO 8 232*1b481fc3SMaciej Żenczykowski 233*1b481fc3SMaciej Żenczykowski #define SOL_CAN_BASE 100 234*1b481fc3SMaciej Żenczykowski 235*1b481fc3SMaciej Żenczykowski /* 236*1b481fc3SMaciej Żenczykowski * This typedef was introduced in Linux v3.1-rc2 237*1b481fc3SMaciej Żenczykowski * (commit 6602a4b net: Make userland include of netlink.h more sane) 238*1b481fc3SMaciej Żenczykowski * in <linux/socket.h>. It must be duplicated here to make the CAN 239*1b481fc3SMaciej Żenczykowski * headers self-contained. 240*1b481fc3SMaciej Żenczykowski */ 241*1b481fc3SMaciej Żenczykowski typedef unsigned short __kernel_sa_family_t; 242*1b481fc3SMaciej Żenczykowski 243*1b481fc3SMaciej Żenczykowski /** 244*1b481fc3SMaciej Żenczykowski * struct sockaddr_can - the sockaddr structure for CAN sockets 245*1b481fc3SMaciej Żenczykowski * @can_family: address family number AF_CAN. 246*1b481fc3SMaciej Żenczykowski * @can_ifindex: CAN network interface index. 247*1b481fc3SMaciej Żenczykowski * @can_addr: protocol specific address information 248*1b481fc3SMaciej Żenczykowski */ 249*1b481fc3SMaciej Żenczykowski struct sockaddr_can { 250*1b481fc3SMaciej Żenczykowski __kernel_sa_family_t can_family; 251*1b481fc3SMaciej Żenczykowski int can_ifindex; 252*1b481fc3SMaciej Żenczykowski union { 253*1b481fc3SMaciej Żenczykowski /* transport protocol class address information (e.g. ISOTP) */ 254*1b481fc3SMaciej Żenczykowski struct { canid_t rx_id, tx_id; } tp; 255*1b481fc3SMaciej Żenczykowski 256*1b481fc3SMaciej Żenczykowski /* J1939 address information */ 257*1b481fc3SMaciej Żenczykowski struct { 258*1b481fc3SMaciej Żenczykowski /* 8 byte name when using dynamic addressing */ 259*1b481fc3SMaciej Żenczykowski __u64 name; 260*1b481fc3SMaciej Żenczykowski 261*1b481fc3SMaciej Żenczykowski /* pgn: 262*1b481fc3SMaciej Żenczykowski * 8 bit: PS in PDU2 case, else 0 263*1b481fc3SMaciej Żenczykowski * 8 bit: PF 264*1b481fc3SMaciej Żenczykowski * 1 bit: DP 265*1b481fc3SMaciej Żenczykowski * 1 bit: reserved 266*1b481fc3SMaciej Żenczykowski */ 267*1b481fc3SMaciej Żenczykowski __u32 pgn; 268*1b481fc3SMaciej Żenczykowski 269*1b481fc3SMaciej Żenczykowski /* 1 byte address */ 270*1b481fc3SMaciej Żenczykowski __u8 addr; 271*1b481fc3SMaciej Żenczykowski } j1939; 272*1b481fc3SMaciej Żenczykowski 273*1b481fc3SMaciej Żenczykowski /* reserved for future CAN protocols address information */ 274*1b481fc3SMaciej Żenczykowski } can_addr; 275*1b481fc3SMaciej Żenczykowski }; 276*1b481fc3SMaciej Żenczykowski 277*1b481fc3SMaciej Żenczykowski /** 278*1b481fc3SMaciej Żenczykowski * struct can_filter - CAN ID based filter in can_register(). 279*1b481fc3SMaciej Żenczykowski * @can_id: relevant bits of CAN ID which are not masked out. 280*1b481fc3SMaciej Żenczykowski * @can_mask: CAN mask (see description) 281*1b481fc3SMaciej Żenczykowski * 282*1b481fc3SMaciej Żenczykowski * Description: 283*1b481fc3SMaciej Żenczykowski * A filter matches, when 284*1b481fc3SMaciej Żenczykowski * 285*1b481fc3SMaciej Żenczykowski * <received_can_id> & mask == can_id & mask 286*1b481fc3SMaciej Żenczykowski * 287*1b481fc3SMaciej Żenczykowski * The filter can be inverted (CAN_INV_FILTER bit set in can_id) or it can 288*1b481fc3SMaciej Żenczykowski * filter for error message frames (CAN_ERR_FLAG bit set in mask). 289*1b481fc3SMaciej Żenczykowski */ 290*1b481fc3SMaciej Żenczykowski struct can_filter { 291*1b481fc3SMaciej Żenczykowski canid_t can_id; 292*1b481fc3SMaciej Żenczykowski canid_t can_mask; 293*1b481fc3SMaciej Żenczykowski }; 294*1b481fc3SMaciej Żenczykowski 295*1b481fc3SMaciej Żenczykowski #define CAN_INV_FILTER 0x20000000U /* to be set in can_filter.can_id */ 296*1b481fc3SMaciej Żenczykowski #define CAN_RAW_FILTER_MAX 512 /* maximum number of can_filter set via setsockopt() */ 297*1b481fc3SMaciej Żenczykowski 298*1b481fc3SMaciej Żenczykowski #endif /* !_UAPI_CAN_H */ 299