xref: /netbsd-src/sys/netcan/can.h (revision 76000be898dfc6317dea51f93ba92f7659310a0f)
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