From 45b9a4812a2e56cb7dae82839c4368e348040ff5 Mon Sep 17 00:00:00 2001 From: Oliver Hartkopp Date: Sat, 31 Oct 2020 19:49:31 +0100 Subject: [PATCH] cangen: add option to generate DLCs greater than 8 for Classical CAN frames Generating Classical CAN frames with raw DLC values greater than 8 is an expert feature that should only be enabled on demand. Signed-off-by: Oliver Hartkopp --- cangen.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/cangen.c b/cangen.c index f565be5..ab8122c 100644 --- a/cangen.c +++ b/cangen.c @@ -92,7 +92,8 @@ void print_usage(char *prg) " 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, " -R (generate RTR frames)\n"); + fprintf(stderr, " -8 (allow DLC values greater then 8 for Classic CAN frames)\n"); fprintf(stderr, " -m (mix -e -f -b -E -R frames)\n"); fprintf(stderr, " -I (CAN ID" " generation mode - see below)\n"); @@ -156,6 +157,7 @@ int main(int argc, char **argv) unsigned char loopback_disable = 0; unsigned char verbose = 0; unsigned char rtr_frame = 0; + unsigned char len8_dlc = 0; int count = 0; unsigned long burst_sent_count = 0; int mtu, maxdlen; @@ -185,7 +187,7 @@ int main(int argc, char **argv) signal(SIGHUP, sigterm); signal(SIGINT, sigterm); - while ((opt = getopt(argc, argv, "ig:ebEfmI:L:D:xp:n:c:vRh?")) != -1) { + while ((opt = getopt(argc, argv, "ig:ebEfmI:L:D:xp:n:c:vR8h?")) != -1) { switch (opt) { case 'i': @@ -271,6 +273,10 @@ int main(int argc, char **argv) rtr_frame = 1; break; + case '8': + len8_dlc = 1; + break; + case 'p': polltimeout = strtoul(optarg, NULL, 10); break; @@ -414,11 +420,13 @@ int main(int argc, char **argv) else { frame.len = random() & 0xF; - /* generate Classic CAN len8 DLCs */ if (frame.len > CAN_MAX_DLEN) { - struct can_frame *ccf = (struct can_frame *)&frame; + if (len8_dlc) { + struct can_frame *ccf = (struct can_frame *)&frame; - ccf->len8_dlc = frame.len; + /* generate Classic CAN len8 DLCs */ + ccf->len8_dlc = frame.len; + } frame.len = 8; /* for about 50% of the frames */ } }