Home | History | Annotate | Download | only in can
      1 /*
      2  * linux/can/gw.h
      3  *
      4  * Definitions for CAN frame Gateway/Router/Bridge
      5  *
      6  * Author: Oliver Hartkopp <oliver.hartkopp (at) volkswagen.de>
      7  * Copyright (c) 2011 Volkswagen Group Electronic Research
      8  * All rights reserved.
      9  *
     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
    163