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 <socketcan@hartkopp.net>
pull/260/head
Oliver Hartkopp 2020-10-31 19:49:31 +01:00
parent e1761f8583
commit 45b9a4812a
1 changed files with 13 additions and 5 deletions

View File

@ -92,7 +92,8 @@ void print_usage(char *prg)
" with bitrate switch (BRS))\n"); " with bitrate switch (BRS))\n");
fprintf(stderr, " -E (generate CAN FD CAN frames" fprintf(stderr, " -E (generate CAN FD CAN frames"
" with error state (ESI))\n"); " 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, " -m (mix -e -f -b -E -R frames)\n");
fprintf(stderr, " -I <mode> (CAN ID" fprintf(stderr, " -I <mode> (CAN ID"
" generation mode - see below)\n"); " generation mode - see below)\n");
@ -156,6 +157,7 @@ int main(int argc, char **argv)
unsigned char loopback_disable = 0; unsigned char loopback_disable = 0;
unsigned char verbose = 0; unsigned char verbose = 0;
unsigned char rtr_frame = 0; unsigned char rtr_frame = 0;
unsigned char len8_dlc = 0;
int count = 0; int count = 0;
unsigned long burst_sent_count = 0; unsigned long burst_sent_count = 0;
int mtu, maxdlen; int mtu, maxdlen;
@ -185,7 +187,7 @@ int main(int argc, char **argv)
signal(SIGHUP, sigterm); signal(SIGHUP, sigterm);
signal(SIGINT, 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) { switch (opt) {
case 'i': case 'i':
@ -271,6 +273,10 @@ int main(int argc, char **argv)
rtr_frame = 1; rtr_frame = 1;
break; break;
case '8':
len8_dlc = 1;
break;
case 'p': case 'p':
polltimeout = strtoul(optarg, NULL, 10); polltimeout = strtoul(optarg, NULL, 10);
break; break;
@ -414,11 +420,13 @@ int main(int argc, char **argv)
else { else {
frame.len = random() & 0xF; frame.len = random() & 0xF;
/* generate Classic CAN len8 DLCs */
if (frame.len > CAN_MAX_DLEN) { 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 */ frame.len = 8; /* for about 50% of the frames */
} }
} }