diff --git a/cansniffer.c b/cansniffer.c index 1109eaa..0895114 100644 --- a/cansniffer.c +++ b/cansniffer.c @@ -69,9 +69,16 @@ #include "terminal.h" #define SETFNAME "sniffset." +#define SETFDFNAME "sniffset_fd." +#define FNAME_MAX_LEN 40 + #define ANYDEV "any" #define MAX_SLOTS 2048 +#define CANFD_OFF 0 /* set to OFF */ +#define CANFD_ON 1 /* set to ON */ +#define CANFD_AUTO 2 /* unspecified => check for first received frame */ + /* flags */ #define ENABLE 1 /* by filter or user */ @@ -98,16 +105,19 @@ #define LDL " | " /* long delimiter */ #define SDL "|" /* short delimiter for binary on 80 chars terminal */ +#define CC_SEP '#' /* interface name separator for Classical CAN */ +#define FD_SEP '*' /* interface name separator for CAN FD */ + static struct snif { int flags; long hold; long timeout; struct timeval laststamp; struct timeval currstamp; - struct can_frame last; - struct can_frame current; - struct can_frame marker; - struct can_frame notch; + struct canfd_frame last; + struct canfd_frame current; + struct canfd_frame marker; + struct canfd_frame notch; } sniftab[MAX_SLOTS]; extern int optind, opterr, optopt; @@ -116,14 +126,18 @@ static int idx; static int running = 1; static int clearscreen = 1; static int print_eff; +static int print_ascii = 1; static int notch; +static int max_dlen = CAN_MAX_DLEN; static long timeout = TIMEOUT; static long hold = HOLD; static long loop = LOOP; +static long canfd_mode = CANFD_AUTO; static unsigned char binary; static unsigned char binary8; static unsigned char binary_gap; static unsigned char color; +static unsigned char name_sep = CC_SEP; static char *interface; static char *vdl = LDL; /* variable delimiter */ static char *ldl = LDL; /* long delimiter */ @@ -132,7 +146,7 @@ void print_snifline(int slot); int handle_keyb(void); int handle_frame(int fd, long currcms); int handle_timeo(long currcms); -void writesettings(char* name); +int writesettings(char* name); int readsettings(char* name); int sniftab_index(canid_t id); @@ -166,6 +180,7 @@ void print_usage(char *prg) " 8 - toggle binary / HEX-ASCII output (small for EFF on 80 chars)\n" " B - toggle binary with gap / HEX-ASCII output (exceeds 80 chars!)\n" " c - toggle color mode\n" + " @ - toggle ASCII output (disabled for CAN FD by default)\n" " - force a clear screen\n" " # - notch currently marked/changed bits (can be used repeatedly)\n" " * - clear notched marked\n" @@ -215,6 +230,7 @@ void print_usage(char *prg) fprintf(stderr, " -8 (start with binary mode - for EFF on 80 chars)\n"); fprintf(stderr, " -B (start with binary mode with gap - exceeds 80 chars!)\n"); fprintf(stderr, " -c (color changes)\n"); + fprintf(stderr, " -f (CAN FD mode: 0 = OFF, 1 = ON, 2 = auto detect, default: %d)\n", CANFD_AUTO); fprintf(stderr, " -t