1*76000be8Sbouyer /* $NetBSD: can.h,v 1.3 2017/05/30 13:30:51 bouyer Exp $ */ 26e4cb2b9Sbouyer 36e4cb2b9Sbouyer /*- 46e4cb2b9Sbouyer * Copyright (c) 2003, 2017 The NetBSD Foundation, Inc. 56e4cb2b9Sbouyer * All rights reserved. 66e4cb2b9Sbouyer * 76e4cb2b9Sbouyer * This code is derived from software contributed to The NetBSD Foundation 86e4cb2b9Sbouyer * by Robert Swindells and Manuel Bouyer 96e4cb2b9Sbouyer * 106e4cb2b9Sbouyer * Redistribution and use in source and binary forms, with or without 116e4cb2b9Sbouyer * modification, are permitted provided that the following conditions 126e4cb2b9Sbouyer * are met: 136e4cb2b9Sbouyer * 1. Redistributions of source code must retain the above copyright 146e4cb2b9Sbouyer * notice, this list of conditions and the following disclaimer. 156e4cb2b9Sbouyer * 2. Redistributions in binary form must reproduce the above copyright 166e4cb2b9Sbouyer * notice, this list of conditions and the following disclaimer in the 176e4cb2b9Sbouyer * documentation and/or other materials provided with the distribution. 186e4cb2b9Sbouyer * 196e4cb2b9Sbouyer * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 206e4cb2b9Sbouyer * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 216e4cb2b9Sbouyer * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 226e4cb2b9Sbouyer * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 236e4cb2b9Sbouyer * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 246e4cb2b9Sbouyer * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 256e4cb2b9Sbouyer * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 266e4cb2b9Sbouyer * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 276e4cb2b9Sbouyer * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 286e4cb2b9Sbouyer * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 296e4cb2b9Sbouyer * POSSIBILITY OF SUCH DAMAGE. 306e4cb2b9Sbouyer */ 316e4cb2b9Sbouyer 326e4cb2b9Sbouyer #ifndef _NETCAN_CAN_H 336e4cb2b9Sbouyer #define _NETCAN_CAN_H 346e4cb2b9Sbouyer 356e4cb2b9Sbouyer #include <sys/featuretest.h> 36*76000be8Sbouyer #include <sys/types.h> 376e4cb2b9Sbouyer 386e4cb2b9Sbouyer 396e4cb2b9Sbouyer /* Definitions compatible (as much as possible) with socketCAN */ 406e4cb2b9Sbouyer 416e4cb2b9Sbouyer /* 426e4cb2b9Sbouyer * CAN id structure 436e4cb2b9Sbouyer * bits 0-28 : CAN identifier (11/29 bits, see bit 31) 446e4cb2b9Sbouyer * bit2 29-31 : see below 456e4cb2b9Sbouyer */ 466e4cb2b9Sbouyer 476e4cb2b9Sbouyer typedef uint32_t canid_t; 486e4cb2b9Sbouyer typedef uint32_t can_err_mask_t; 496e4cb2b9Sbouyer 506e4cb2b9Sbouyer /* canid_t bits 29-31 descriptions */ 516e4cb2b9Sbouyer #define CAN_EFF_FLAG 0x80000000U /* extended frame format */ 526e4cb2b9Sbouyer #define CAN_RTR_FLAG 0x40000000U /* remote transmission request */ 536e4cb2b9Sbouyer #define CAN_ERR_FLAG 0x20000000U /* error message frame */ 546e4cb2b9Sbouyer 556e4cb2b9Sbouyer /* valid bits in CAN ID for frame formats */ 566e4cb2b9Sbouyer #define CAN_SFF_MASK 0x000007FFU /* standard frame format (SFF) */ 576e4cb2b9Sbouyer #define CAN_EFF_MASK 0x1FFFFFFFU /* extended frame format (EFF) */ 586e4cb2b9Sbouyer #define CAN_ERR_MASK 0x1FFFFFFFU /* error frame format */ 596e4cb2b9Sbouyer 606e4cb2b9Sbouyer /* CAN payload length and DLC definitions according to ISO 11898-1 */ 616e4cb2b9Sbouyer #define CAN_MAX_DLC 8 626e4cb2b9Sbouyer #define CAN_MAX_DLEN 8 636e4cb2b9Sbouyer 646e4cb2b9Sbouyer /* CAN frame */ 656e4cb2b9Sbouyer struct can_frame { 666e4cb2b9Sbouyer canid_t can_id; /* ID + EFF/RTR/ERR flags */ 676e4cb2b9Sbouyer uint8_t can_dlc; /* frame payload length in byte (0 .. CAN_MAX_DLEN) */ 686e4cb2b9Sbouyer uint8_t __pad; 696e4cb2b9Sbouyer uint8_t __res0; 706e4cb2b9Sbouyer uint8_t __res1; 716e4cb2b9Sbouyer uint8_t data[CAN_MAX_DLEN] __aligned(8); 726e4cb2b9Sbouyer }; 736e4cb2b9Sbouyer 746e4cb2b9Sbouyer #define CAN_MTU (sizeof(struct can_frame)) 756e4cb2b9Sbouyer 766e4cb2b9Sbouyer /* protocols */ 776e4cb2b9Sbouyer #define CAN_RAW 1 /* RAW sockets */ 786e4cb2b9Sbouyer #define CAN_NPROTO 2 796e4cb2b9Sbouyer 806e4cb2b9Sbouyer /* 816e4cb2b9Sbouyer * Socket address, CAN style 826e4cb2b9Sbouyer */ 836e4cb2b9Sbouyer struct sockaddr_can { 846e4cb2b9Sbouyer u_int8_t can_len; 856e4cb2b9Sbouyer sa_family_t can_family; 866e4cb2b9Sbouyer int can_ifindex; 876e4cb2b9Sbouyer union { 886e4cb2b9Sbouyer /* transport protocol class address information (e.g. ISOTP) */ 896e4cb2b9Sbouyer struct { canid_t rx_id, tx_id; } tp; 906e4cb2b9Sbouyer /* reserved for future CAN protocols address information */ 916e4cb2b9Sbouyer } can_addr; 926e4cb2b9Sbouyer }; 936e4cb2b9Sbouyer 946e4cb2b9Sbouyer /* 956e4cb2b9Sbouyer * Options for use with [gs]etsockopt for raw sockets 966e4cb2b9Sbouyer * First word of comment is data type; bool is stored in int. 976e4cb2b9Sbouyer */ 986e4cb2b9Sbouyer #define SOL_CAN_RAW CAN_RAW 996e4cb2b9Sbouyer 1006e4cb2b9Sbouyer #define CAN_RAW_FILTER 1 /* struct can_filter: set filter */ 1016e4cb2b9Sbouyer #define CAN_RAW_LOOPBACK 4 /* bool: loopback to local sockets (default:on) */ 1026e4cb2b9Sbouyer #define CAN_RAW_RECV_OWN_MSGS 5 /* bool: receive my own msgs (default:off) */ 1036e4cb2b9Sbouyer 1046e4cb2b9Sbouyer /* 1056e4cb2b9Sbouyer * CAN ID based filter 1066e4cb2b9Sbouyer * checks received can_id & can_filter.can_mask against 1076e4cb2b9Sbouyer * can_filter.can_id & can_filter.can_mask 1086e4cb2b9Sbouyer * valid flags for can_id: 1096e4cb2b9Sbouyer * CAN_INV_FILTER: invert filter 1106e4cb2b9Sbouyer * valid flags for can_mask: 1116e4cb2b9Sbouyer * CAN_ERR_FLAG: filter for error message frames 1126e4cb2b9Sbouyer */ 1136e4cb2b9Sbouyer struct can_filter { 1146e4cb2b9Sbouyer canid_t can_id; 1156e4cb2b9Sbouyer canid_t can_mask; 1166e4cb2b9Sbouyer }; 1176e4cb2b9Sbouyer 1186e4cb2b9Sbouyer #define CAN_INV_FILTER 0x20000000U 1196e4cb2b9Sbouyer 1206e4cb2b9Sbouyer #ifdef _NETBSD_SOURCE 1216e4cb2b9Sbouyer #ifdef _KERNEL 1226e4cb2b9Sbouyer 1236e4cb2b9Sbouyer #define satoscan(sa) ((struct sockaddr_can *)(sa)) 1246e4cb2b9Sbouyer #define scantosa(scan) ((struct sockaddr *)(scan)) 1256e4cb2b9Sbouyer 1266e4cb2b9Sbouyer #endif /* _KERNEL */ 1276e4cb2b9Sbouyer #endif /* _NETBSD_SOURCE */ 1286e4cb2b9Sbouyer #endif /* _NETCAN_CAN_H */ 129