From 7729c046c59f1efdc04d755f519d4d26c73e069f Mon Sep 17 00:00:00 2001 From: Oliver Hartkopp Date: Sun, 10 May 2020 12:03:35 +0200 Subject: [PATCH] cangen: support ESI bit for CAN FD frame generation The CAN FD frames support BTR and ESI as special flags. While BTR could be generated by cangen the ESI bit could not be generated so far. Signed-off-by: Oliver Hartkopp --- cangen.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/cangen.c b/cangen.c index 26d28c6..e26c08b 100644 --- a/cangen.c +++ b/cangen.c @@ -89,8 +89,10 @@ void print_usage(char *prg) fprintf(stderr, " -f (generate CAN FD CAN frames)\n"); fprintf(stderr, " -b (generate CAN FD CAN frames" " with bitrate switch (BRS))\n"); + fprintf(stderr, " -E (generate CAN FD CAN frames" + " with error state (ESI))\n"); fprintf(stderr, " -R (send RTR frame)\n"); - fprintf(stderr, " -m (mix -e -f -b -R frames)\n"); + fprintf(stderr, " -m (mix -e -f -b -E -R frames)\n"); fprintf(stderr, " -I (CAN ID" " generation mode - see below)\n"); fprintf(stderr, " -L (CAN data length code (dlc)" @@ -145,6 +147,7 @@ int main(int argc, char **argv) unsigned char extended = 0; unsigned char canfd = 0; unsigned char brs = 0; + unsigned char esi = 0; unsigned char mix = 0; unsigned char id_mode = MODE_RANDOM; unsigned char data_mode = MODE_RANDOM; @@ -181,7 +184,7 @@ int main(int argc, char **argv) signal(SIGHUP, sigterm); signal(SIGINT, sigterm); - while ((opt = getopt(argc, argv, "ig:ebfmI:L:D:xp:n:c:vRh?")) != -1) { + while ((opt = getopt(argc, argv, "ig:ebEfmI:L:D:xp:n:c:vRh?")) != -1) { switch (opt) { case 'i': @@ -205,6 +208,11 @@ int main(int argc, char **argv) canfd = 1; break; + case 'E': + esi = 1; /* error state indicator implies CAN FD */ + canfd = 1; + break; + case 'm': mix = 1; canfd = 1; /* to switch the socket into CAN FD mode */ @@ -379,6 +387,8 @@ int main(int argc, char **argv) maxdlen = CANFD_MAX_DLEN; if (brs) frame.flags |= CANFD_BRS; + if (esi) + frame.flags |= CANFD_ESI; } else { mtu = CAN_MTU; maxdlen = CAN_MAX_DLEN; @@ -504,8 +514,10 @@ resend: i = random(); extended = i&1; canfd = i&2; - if (canfd) + if (canfd) { brs = i&4; + esi = i&8; + } rtr_frame = ((i&24) == 24); /* reduce RTR frames to 1/4 */ } }