| Oliver Hartkopp | c1aabdf | 2011-09-01 04:23:23 +0000 | [diff] [blame] | 1 | /* | 
 | 2 |  * linux/can/gw.h | 
 | 3 |  * | 
 | 4 |  * Definitions for CAN frame Gateway/Router/Bridge | 
 | 5 |  * | 
 | 6 |  * Author: Oliver Hartkopp <oliver.hartkopp@volkswagen.de> | 
 | 7 |  * Copyright (c) 2011 Volkswagen Group Electronic Research | 
 | 8 |  * All rights reserved. | 
 | 9 |  * | 
| Oliver Hartkopp | c1aabdf | 2011-09-01 04:23:23 +0000 | [diff] [blame] | 10 |  */ | 
 | 11 |  | 
 | 12 | #ifndef CAN_GW_H | 
 | 13 | #define CAN_GW_H | 
 | 14 |  | 
 | 15 | #include <linux/types.h> | 
 | 16 | #include <linux/can.h> | 
 | 17 |  | 
 | 18 | struct rtcanmsg { | 
 | 19 | 	__u8  can_family; | 
 | 20 | 	__u8  gwtype; | 
 | 21 | 	__u16 flags; | 
 | 22 | }; | 
 | 23 |  | 
 | 24 | /* CAN gateway types */ | 
 | 25 | enum { | 
 | 26 | 	CGW_TYPE_UNSPEC, | 
 | 27 | 	CGW_TYPE_CAN_CAN,	/* CAN->CAN routing */ | 
 | 28 | 	__CGW_TYPE_MAX | 
 | 29 | }; | 
 | 30 |  | 
 | 31 | #define CGW_TYPE_MAX (__CGW_TYPE_MAX - 1) | 
 | 32 |  | 
 | 33 | /* CAN rtnetlink attribute definitions */ | 
 | 34 | enum { | 
 | 35 | 	CGW_UNSPEC, | 
 | 36 | 	CGW_MOD_AND,	/* CAN frame modification binary AND */ | 
 | 37 | 	CGW_MOD_OR,	/* CAN frame modification binary OR */ | 
 | 38 | 	CGW_MOD_XOR,	/* CAN frame modification binary XOR */ | 
 | 39 | 	CGW_MOD_SET,	/* CAN frame modification set alternate values */ | 
 | 40 | 	CGW_CS_XOR,	/* set data[] XOR checksum into data[index] */ | 
 | 41 | 	CGW_CS_CRC8,	/* set data[] CRC8 checksum into data[index] */ | 
 | 42 | 	CGW_HANDLED,	/* number of handled CAN frames */ | 
 | 43 | 	CGW_DROPPED,	/* number of dropped CAN frames */ | 
 | 44 | 	CGW_SRC_IF,	/* ifindex of source network interface */ | 
 | 45 | 	CGW_DST_IF,	/* ifindex of destination network interface */ | 
 | 46 | 	CGW_FILTER,	/* specify struct can_filter on source CAN device */ | 
 | 47 | 	__CGW_MAX | 
 | 48 | }; | 
 | 49 |  | 
 | 50 | #define CGW_MAX (__CGW_MAX - 1) | 
 | 51 |  | 
 | 52 | #define CGW_FLAGS_CAN_ECHO 0x01 | 
 | 53 | #define CGW_FLAGS_CAN_SRC_TSTAMP 0x02 | 
 | 54 |  | 
 | 55 | #define CGW_MOD_FUNCS 4 /* AND OR XOR SET */ | 
 | 56 |  | 
 | 57 | /* CAN frame elements that are affected by curr. 3 CAN frame modifications */ | 
 | 58 | #define CGW_MOD_ID	0x01 | 
 | 59 | #define CGW_MOD_DLC	0x02 | 
 | 60 | #define CGW_MOD_DATA	0x04 | 
 | 61 |  | 
 | 62 | #define CGW_FRAME_MODS 3 /* ID DLC DATA */ | 
 | 63 |  | 
 | 64 | #define MAX_MODFUNCTIONS (CGW_MOD_FUNCS * CGW_FRAME_MODS) | 
 | 65 |  | 
 | 66 | struct cgw_frame_mod { | 
 | 67 | 	struct can_frame cf; | 
 | 68 | 	__u8 modtype; | 
 | 69 | } __attribute__((packed)); | 
 | 70 |  | 
 | 71 | #define CGW_MODATTR_LEN sizeof(struct cgw_frame_mod) | 
 | 72 |  | 
 | 73 | struct cgw_csum_xor { | 
 | 74 | 	__s8 from_idx; | 
 | 75 | 	__s8 to_idx; | 
 | 76 | 	__s8 result_idx; | 
 | 77 | 	__u8 init_xor_val; | 
 | 78 | } __attribute__((packed)); | 
 | 79 |  | 
 | 80 | struct cgw_csum_crc8 { | 
 | 81 | 	__s8 from_idx; | 
 | 82 | 	__s8 to_idx; | 
 | 83 | 	__s8 result_idx; | 
 | 84 | 	__u8 init_crc_val; | 
 | 85 | 	__u8 final_xor_val; | 
 | 86 | 	__u8 crctab[256]; | 
 | 87 | 	__u8 profile; | 
 | 88 | 	__u8 profile_data[20]; | 
 | 89 | } __attribute__((packed)); | 
 | 90 |  | 
 | 91 | /* length of checksum operation parameters. idx = index in CAN frame data[] */ | 
 | 92 | #define CGW_CS_XOR_LEN  sizeof(struct cgw_csum_xor) | 
 | 93 | #define CGW_CS_CRC8_LEN  sizeof(struct cgw_csum_crc8) | 
 | 94 |  | 
 | 95 | /* CRC8 profiles (compute CRC for additional data elements - see below) */ | 
 | 96 | enum { | 
 | 97 | 	CGW_CRC8PRF_UNSPEC, | 
 | 98 | 	CGW_CRC8PRF_1U8,	/* compute one additional u8 value */ | 
 | 99 | 	CGW_CRC8PRF_16U8,	/* u8 value table indexed by data[1] & 0xF */ | 
 | 100 | 	CGW_CRC8PRF_SFFID_XOR,	/* (can_id & 0xFF) ^ (can_id >> 8 & 0xFF) */ | 
 | 101 | 	__CGW_CRC8PRF_MAX | 
 | 102 | }; | 
 | 103 |  | 
 | 104 | #define CGW_CRC8PRF_MAX (__CGW_CRC8PRF_MAX - 1) | 
 | 105 |  | 
 | 106 | /* | 
 | 107 |  * CAN rtnetlink attribute contents in detail | 
 | 108 |  * | 
 | 109 |  * CGW_XXX_IF (length 4 bytes): | 
 | 110 |  * Sets an interface index for source/destination network interfaces. | 
 | 111 |  * For the CAN->CAN gwtype the indices of _two_ CAN interfaces are mandatory. | 
 | 112 |  * | 
 | 113 |  * CGW_FILTER (length 8 bytes): | 
 | 114 |  * Sets a CAN receive filter for the gateway job specified by the | 
 | 115 |  * struct can_filter described in include/linux/can.h | 
 | 116 |  * | 
 | 117 |  * CGW_MOD_XXX (length 17 bytes): | 
 | 118 |  * Specifies a modification that's done to a received CAN frame before it is | 
 | 119 |  * send out to the destination interface. | 
 | 120 |  * | 
 | 121 |  * <struct can_frame> data used as operator | 
 | 122 |  * <u8> affected CAN frame elements | 
 | 123 |  * | 
 | 124 |  * CGW_CS_XOR (length 4 bytes): | 
 | 125 |  * Set a simple XOR checksum starting with an initial value into | 
 | 126 |  * data[result-idx] using data[start-idx] .. data[end-idx] | 
 | 127 |  * | 
 | 128 |  * The XOR checksum is calculated like this: | 
 | 129 |  * | 
 | 130 |  * xor = init_xor_val | 
 | 131 |  * | 
 | 132 |  * for (i = from_idx .. to_idx) | 
 | 133 |  *      xor ^= can_frame.data[i] | 
 | 134 |  * | 
 | 135 |  * can_frame.data[ result_idx ] = xor | 
 | 136 |  * | 
 | 137 |  * CGW_CS_CRC8 (length 282 bytes): | 
 | 138 |  * Set a CRC8 value into data[result-idx] using a given 256 byte CRC8 table, | 
 | 139 |  * a given initial value and a defined input data[start-idx] .. data[end-idx]. | 
 | 140 |  * Finally the result value is XOR'ed with the final_xor_val. | 
 | 141 |  * | 
 | 142 |  * The CRC8 checksum is calculated like this: | 
 | 143 |  * | 
 | 144 |  * crc = init_crc_val | 
 | 145 |  * | 
 | 146 |  * for (i = from_idx .. to_idx) | 
 | 147 |  *      crc = crctab[ crc ^ can_frame.data[i] ] | 
 | 148 |  * | 
 | 149 |  * can_frame.data[ result_idx ] = crc ^ final_xor_val | 
 | 150 |  * | 
 | 151 |  * The calculated CRC may contain additional source data elements that can be | 
 | 152 |  * defined in the handling of 'checksum profiles' e.g. shown in AUTOSAR specs | 
 | 153 |  * like http://www.autosar.org/download/R4.0/AUTOSAR_SWS_E2ELibrary.pdf | 
 | 154 |  * E.g. the profile_data[] may contain additional u8 values (called DATA_IDs) | 
 | 155 |  * that are used depending on counter values inside the CAN frame data[]. | 
 | 156 |  * So far only three profiles have been implemented for illustration. | 
 | 157 |  * | 
 | 158 |  * Remark: In general the attribute data is a linear buffer. | 
 | 159 |  *         Beware of sending unpacked or aligned structs! | 
 | 160 |  */ | 
 | 161 |  | 
 | 162 | #endif |