-/*
- * $Id$
- */
-
/*
* cangen.c - CAN frames generator for testing purposes
*
fprintf(stderr, " -e (generate extended frame mode "
"(EFF) CAN frames)\n");
fprintf(stderr, " -f (generate CAN FD CAN frames)\n");
+ fprintf(stderr, " -b (generate CAN FD CAN frames"
+ " with bitrate switch (BRS))\n");
fprintf(stderr, " -R (send RTR frame)\n");
- fprintf(stderr, " -m (mix -e -f -R frames)\n");
+ fprintf(stderr, " -m (mix -e -f -b -R frames)\n");
fprintf(stderr, " -I <mode> (CAN ID"
" generation mode - see below)\n");
fprintf(stderr, " -L <mode> (CAN data length code (dlc)"
unsigned char ignore_enobufs = 0;
unsigned char extended = 0;
unsigned char canfd = 0;
+ unsigned char brs = 0;
unsigned char mix = 0;
unsigned char id_mode = MODE_RANDOM;
unsigned char data_mode = MODE_RANDOM;
signal(SIGHUP, sigterm);
signal(SIGINT, sigterm);
- while ((opt = getopt(argc, argv, "ig:efmI:L:D:xp:n:vRh?")) != -1) {
+ while ((opt = getopt(argc, argv, "ig:ebfmI:L:D:xp:n:vRh?")) != -1) {
switch (opt) {
case 'i':
canfd = 1;
break;
+ case 'b':
+ brs = 1; /* bitrate switch implies CAN FD */
+ canfd = 1;
+ break;
+
case 'm':
mix = 1;
canfd = 1; /* to switch the socket into CAN FD mode */
}
ts.tv_sec = gap / 1000;
- ts.tv_nsec = ((int)(gap * 1000000)) % 1000000000;
+ ts.tv_nsec = (long)(((long long)(gap * 1000000)) % 1000000000ll);
/* recognize obviously missing commandline option */
if (id_mode == MODE_FIX && frame.can_id > 0x7FF && !extended) {
if (canfd){
mtu = CANFD_MTU;
maxdlen = CANFD_MAX_DLEN;
+ if (brs)
+ frame.flags |= CANFD_BRS;
} else {
mtu = CAN_MTU;
maxdlen = CAN_MAX_DLEN;
if (gap) /* gap == 0 => performance test :-] */
if (nanosleep(&ts, NULL))
return 1;
-
+
if (id_mode == MODE_INCREMENT)
frame.can_id++;
i = random();
extended = i&1;
canfd = i&2;
- rtr_frame = ((i&12) == 12); /* reduce RTR frames to 1/4 */
+ if (canfd)
+ brs = i&4;
+ rtr_frame = ((i&24) == 24); /* reduce RTR frames to 1/4 */
}
}