cangen: add support for Classic CAN raw DLC values
A new option '-8' has been added to generate Classical CAN frames with DLC codes from 0 .. 15. Fixed and random mode implemented by Oliver Hartkopp. Incremental DLC mode 'cangen -8 -Li can0' implemented by Vincent Mailhol. Signed-off-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr> Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>pull/269/head
parent
b70d8c050f
commit
1ba0c576ae
51
cangen.c
51
cangen.c
|
|
@ -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");
|
||||||
|
|
@ -115,7 +116,7 @@ void print_usage(char *prg)
|
||||||
fprintf(stderr, "Generation modes:\n");
|
fprintf(stderr, "Generation modes:\n");
|
||||||
fprintf(stderr, " 'r' => random values (default)\n");
|
fprintf(stderr, " 'r' => random values (default)\n");
|
||||||
fprintf(stderr, " 'i' => increment values\n");
|
fprintf(stderr, " 'i' => increment values\n");
|
||||||
fprintf(stderr, " <hexvalue> => fix value using <hexvalue>\n\n");
|
fprintf(stderr, " <value> => fixed value (in hexadecimal for -I and -D)\n\n");
|
||||||
fprintf(stderr, "When incrementing the CAN data the data length code "
|
fprintf(stderr, "When incrementing the CAN data the data length code "
|
||||||
"minimum is set to 1.\n");
|
"minimum is set to 1.\n");
|
||||||
fprintf(stderr, "CAN IDs and data content are given and expected in hexadecimal values.\n\n");
|
fprintf(stderr, "CAN IDs and data content are given and expected in hexadecimal values.\n\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;
|
||||||
|
|
@ -170,6 +172,7 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
struct sockaddr_can addr;
|
struct sockaddr_can addr;
|
||||||
static struct canfd_frame frame;
|
static struct canfd_frame frame;
|
||||||
|
struct can_frame *ccf = (struct can_frame *)&frame;
|
||||||
int nbytes;
|
int nbytes;
|
||||||
int i;
|
int i;
|
||||||
struct ifreq ifr;
|
struct ifreq ifr;
|
||||||
|
|
@ -185,7 +188,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 +274,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;
|
||||||
|
|
@ -362,9 +369,17 @@ int main(int argc, char **argv)
|
||||||
/* ensure discrete CAN FD length values 0..8, 12, 16, 20, 24, 32, 64 */
|
/* ensure discrete CAN FD length values 0..8, 12, 16, 20, 24, 32, 64 */
|
||||||
frame.len = can_dlc2len(can_len2dlc(frame.len));
|
frame.len = can_dlc2len(can_len2dlc(frame.len));
|
||||||
} else {
|
} else {
|
||||||
/* sanitize CAN 2.0 frame length */
|
/* sanitize Classical CAN 2.0 frame length */
|
||||||
if (frame.len > 8)
|
if (len8_dlc) {
|
||||||
frame.len = 8;
|
if (frame.len > CAN_MAX_RAW_DLC)
|
||||||
|
frame.len = CAN_MAX_RAW_DLC;
|
||||||
|
|
||||||
|
if (frame.len > CAN_MAX_DLEN)
|
||||||
|
ccf->len8_dlc = frame.len;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (frame.len > CAN_MAX_DLEN)
|
||||||
|
frame.len = CAN_MAX_DLEN;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
|
if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
|
||||||
|
|
@ -413,8 +428,16 @@ int main(int argc, char **argv)
|
||||||
frame.len = can_dlc2len(random() & 0xF);
|
frame.len = can_dlc2len(random() & 0xF);
|
||||||
else {
|
else {
|
||||||
frame.len = random() & 0xF;
|
frame.len = random() & 0xF;
|
||||||
if (frame.len & 8)
|
|
||||||
|
if (frame.len > CAN_MAX_DLEN) {
|
||||||
|
/* generate Classic CAN len8 DLCs? */
|
||||||
|
if (len8_dlc)
|
||||||
|
ccf->len8_dlc = frame.len;
|
||||||
|
|
||||||
frame.len = 8; /* for about 50% of the frames */
|
frame.len = 8; /* for about 50% of the frames */
|
||||||
|
} else {
|
||||||
|
ccf->len8_dlc = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -493,12 +516,20 @@ resend:
|
||||||
if (dlc_mode == MODE_INCREMENT) {
|
if (dlc_mode == MODE_INCREMENT) {
|
||||||
|
|
||||||
incdlc++;
|
incdlc++;
|
||||||
|
incdlc %= CAN_MAX_RAW_DLC + 1;
|
||||||
|
|
||||||
if (canfd && !mix) {
|
if (canfd && !mix)
|
||||||
incdlc &= 0xF;
|
|
||||||
frame.len = can_dlc2len(incdlc);
|
frame.len = can_dlc2len(incdlc);
|
||||||
|
else if (len8_dlc) {
|
||||||
|
if (incdlc > CAN_MAX_DLEN) {
|
||||||
|
frame.len = CAN_MAX_DLEN;
|
||||||
|
ccf->len8_dlc = incdlc;
|
||||||
} else {
|
} else {
|
||||||
incdlc %= 9;
|
frame.len = incdlc;
|
||||||
|
ccf->len8_dlc = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
incdlc %= CAN_MAX_DLEN + 1;
|
||||||
frame.len = incdlc;
|
frame.len = incdlc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue