mirror of
https://github.com/linux-can/can-utils.git
synced 2026-09-23 00:21:14 +02:00
canfd: upgrade tools to support CAN FD for Linux 3.6
This is a major upgrade of the basic tools to handle CAN FD frames.
The library to parse and print CAN frames and logfiles has been extended.
In detail:
asc2log.c | 5 +
candump.c | 24 ++++---
cangen.c | 172 +++++++++++++++++++++++++++++++++------------------
canlogserver.c | 28 +++++---
canplayer.c | 25 ++++---
cansend.c | 55 ++++++++++++----
lib.c | 189 ++++++++++++++++++++++++++++++++++++++-------------------
lib.h | 109 ++++++++++++++++++++++++--------
log2asc.c | 8 +-
log2long.c | 26 ++++++-
10 files changed, 440 insertions(+), 201 deletions(-)
asc2log.c / log2asc.c
- updates for new lib functions
- still can only handle CAN2.0 frames (no new info about ASC file layout)
log2long.c / canlogserver.c / canplayer.c
- updates for new lib functions to handle CAN FD
lib.h / lib.c
- reworked lib functions to handle CAN FD
- parse_canframe() now returns CAN_MTU and CANFD_MTU on success, 0 at failure
- added can_dlc2len() and can_len2dlc() helpers
- moved hexstring2candata to hexstring2data to support simple byte buffers
- in the long CAN frame representation use %03X/%08X instead of %3X/%8X
- introduced unified buffer size definitions for ASCII CAN frames
- updated documentation
cangen.c
- support CAN FD frames (added -f option to create CAN FD frames)
- added -m option ('mix') to create random extended / RTR / CAN FD frames
- fixed the 'fixed data' option which was zero'ing the payload by the time
- updated help text
candump.c
- support CAN FD frames (print, bridge, log)
- distinguish frame types by length info: [0] = CAN2.0 [00] = CAN FD frame
Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
This commit is contained in:
@@ -95,6 +95,7 @@ static __u32 last_dropcnt[MAXSOCK];
|
||||
static char devname[MAXIFNAMES][IFNAMSIZ+1];
|
||||
static int dindex[MAXIFNAMES];
|
||||
static int max_devname_len; /* to prevent frazzled device name output */
|
||||
const int canfd_on = 1;
|
||||
|
||||
#define MAXANI 4
|
||||
const char anichar[MAXANI] = {'|', '/', '-', '\\'};
|
||||
@@ -223,8 +224,8 @@ int main(int argc, char **argv)
|
||||
struct cmsghdr *cmsg;
|
||||
struct can_filter *rfilter;
|
||||
can_err_mask_t err_mask;
|
||||
struct can_frame frame;
|
||||
int nbytes, i;
|
||||
struct canfd_frame frame;
|
||||
int nbytes, i, maxdlen;
|
||||
struct ifreq ifr;
|
||||
struct timeval tv, last_tv;
|
||||
FILE *logfile = NULL;
|
||||
@@ -483,6 +484,9 @@ int main(int argc, char **argv)
|
||||
|
||||
} /* if (nptr) */
|
||||
|
||||
/* try to switch the socket into CAN FD mode */
|
||||
setsockopt(s[i], SOL_CAN_RAW, CAN_RAW_FD_FRAMES, &canfd_on, sizeof(canfd_on));
|
||||
|
||||
if (rcvbuf_size) {
|
||||
|
||||
int curr_rcvbuf_size;
|
||||
@@ -611,7 +615,11 @@ int main(int argc, char **argv)
|
||||
return 1;
|
||||
}
|
||||
|
||||
if ((size_t)nbytes < sizeof(struct can_frame)) {
|
||||
if ((size_t)nbytes == CAN_MTU)
|
||||
maxdlen = CAN_MAX_DLEN;
|
||||
else if ((size_t)nbytes == CANFD_MTU)
|
||||
maxdlen = CANFD_MAX_DLEN;
|
||||
else {
|
||||
fprintf(stderr, "read: incomplete CAN frame\n");
|
||||
return 1;
|
||||
}
|
||||
@@ -623,11 +631,11 @@ int main(int argc, char **argv)
|
||||
if (bridge_delay)
|
||||
usleep(bridge_delay);
|
||||
|
||||
nbytes = write(bridge, &frame, sizeof(struct can_frame));
|
||||
nbytes = write(bridge, &frame, nbytes);
|
||||
if (nbytes < 0) {
|
||||
perror("bridge write");
|
||||
return 1;
|
||||
} else if ((size_t)nbytes < sizeof(struct can_frame)) {
|
||||
} else if ((size_t)nbytes != CAN_MTU && (size_t)nbytes != CANFD_MTU) {
|
||||
fprintf(stderr,"bridge write: incomplete CAN frame\n");
|
||||
return 1;
|
||||
}
|
||||
@@ -670,14 +678,14 @@ int main(int argc, char **argv)
|
||||
fprintf(logfile, "(%ld.%06ld) ", tv.tv_sec, tv.tv_usec);
|
||||
fprintf(logfile, "%*s ", max_devname_len, devname[idx]);
|
||||
/* without seperator as logfile use-case is parsing */
|
||||
fprint_canframe(logfile, &frame, "\n", 0);
|
||||
fprint_canframe(logfile, &frame, "\n", 0, maxdlen);
|
||||
}
|
||||
|
||||
if (logfrmt) {
|
||||
/* print CAN frame in log file style to stdout */
|
||||
printf("(%ld.%06ld) ", tv.tv_sec, tv.tv_usec);
|
||||
printf("%*s ", max_devname_len, devname[idx]);
|
||||
fprint_canframe(stdout, &frame, "\n", 0);
|
||||
fprint_canframe(stdout, &frame, "\n", 0, maxdlen);
|
||||
goto out_fflush; /* no other output to stdout */
|
||||
}
|
||||
|
||||
@@ -736,7 +744,7 @@ int main(int argc, char **argv)
|
||||
printf("%*s", max_devname_len, devname[idx]);
|
||||
printf("%s ", (color==1)?col_off:"");
|
||||
|
||||
fprint_long_canframe(stdout, &frame, NULL, view);
|
||||
fprint_long_canframe(stdout, &frame, NULL, view, maxdlen);
|
||||
|
||||
printf("%s", (color>1)?col_off:"");
|
||||
printf("\n");
|
||||
|
||||
Reference in New Issue
Block a user