diff --git a/canfdtest.c b/canfdtest.c index 8de160a..ba4bfe6 100644 --- a/canfdtest.c +++ b/canfdtest.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -48,6 +49,7 @@ static int verbose; static int sockfd; static int test_loops; static int exit_sig; +static int inflight_count = CAN_MSG_COUNT; static void print_usage(char *prg) { @@ -60,6 +62,7 @@ static void print_usage(char *prg) " -vv (high verbosity)\n" " -g (generate messages)\n" " -l COUNT (test loop count)\n" + " -f COUNT (number of frames in flight, default: %d)\n" "\n" "With the option '-g' CAN messages are generated and checked\n" "on , otherwise all messages received on the\n" @@ -71,12 +74,12 @@ static void print_usage(char *prg) "%s -v can0\n" "\ton Host:\n" "%s -g -v can2\n", - prg, prg, prg, prg); + prg, prg, CAN_MSG_COUNT, prg, prg); exit(1); } -static void print_frame(struct can_frame *frame, int inc) +static void print_frame(const struct can_frame *frame, int inc) { int i; @@ -86,12 +89,12 @@ static void print_frame(struct can_frame *frame, int inc) } else { printf("[%d]", frame->can_dlc); for (i = 0; i < frame->can_dlc; i++) - printf(" %02x", frame->data[i] + inc); + printf(" %02x", (uint8_t)(frame->data[i] + inc)); } printf("\n"); } -static void print_compare(struct can_frame *exp, struct can_frame *rec, int inc) +static void print_compare(const struct can_frame *exp, const struct can_frame *rec, int inc) { printf("expected: "); print_frame(exp, inc); @@ -113,8 +116,8 @@ static void compare_frame(struct can_frame *exp, struct can_frame *rec, int inc) running = 0; } else { for (i = 0; i < rec->can_dlc; i++) { - if (rec->data[i] != ((exp->data[i] + inc) & 0xff)) { - printf("Databyte %x mismatch !\n", i); + if (rec->data[i] != (uint8_t)(exp->data[i] + inc)) { + printf("Databyte %x mismatch!\n", i); print_compare(exp, rec, inc); running = 0; @@ -196,11 +199,47 @@ static int send_frame(struct can_frame *frame) return 0; } +static int check_frame(const struct can_frame *frame) +{ + int err = 0; + int i; + + if (frame->can_id != CAN_MSG_ID) { + printf("unexpected Message ID 0x%04x!\n", frame->can_id); + err = -1; + } + + if (frame->can_dlc != CAN_MSG_LEN) { + printf("unexpected Message length %d!\n", frame->can_dlc); + err = -1; + } + + for (i = 1; i < frame->can_dlc; i++) { + if (frame->data[i] != frame->data[i-1]) { + printf("Frame inconsistent!\n"); + print_frame(frame, 0); + err = -1; + goto out; + } + } + + out: + return err; +} + +static void inc_frame(struct can_frame *frame) +{ + int i; + + frame->can_id++; + for (i = 0; i < frame->can_dlc; i++) + frame->data[i]++; +} + static int can_echo_dut(void) { unsigned int frame_count = 0; struct can_frame frame; - int i; while (running) { if (recv_frame(&frame)) @@ -209,19 +248,11 @@ static int can_echo_dut(void) if (verbose == 1) { echo_progress(frame.data[0]); } else if (verbose > 1) { - printf("%04x: ", frame.can_id); - if (frame.can_id & CAN_RTR_FLAG) { - printf("remote request"); - } else { - printf("[%d]", frame.can_dlc); - for (i = 0; i < frame.can_dlc; i++) - printf(" %02x", frame.data[i]); - } - printf("\n"); + print_frame(&frame, 0); } - frame.can_id++; - for (i = 0; i < frame.can_dlc; i++) - frame.data[i]++; + + check_frame(&frame); + inc_frame(&frame); if (send_frame(&frame)) return -1; @@ -240,15 +271,26 @@ static int can_echo_dut(void) static int can_echo_gen(void) { - struct can_frame tx_frames[CAN_MSG_COUNT] = { }; - int recv_tx[CAN_MSG_COUNT]; + struct can_frame *tx_frames; + int *recv_tx; struct can_frame rx_frame; unsigned char counter = 0; int send_pos = 0, recv_rx_pos = 0, recv_tx_pos = 0, unprocessed = 0, loops = 0; + int err = 0; int i; + tx_frames = calloc(inflight_count, sizeof(* tx_frames)); + if (!tx_frames) + return -1; + + recv_tx = calloc(inflight_count, sizeof(* recv_tx)); + if (!recv_tx) { + err = -1; + goto out_free_tx_frames; + } + while (running) { - if (unprocessed < CAN_MSG_COUNT) { + if (unprocessed < inflight_count) { /* still send messages */ tx_frames[send_pos].can_dlc = CAN_MSG_LEN; tx_frames[send_pos].can_id = CAN_MSG_ID; @@ -256,11 +298,13 @@ static int can_echo_gen(void) for (i = 0; i < CAN_MSG_LEN; i++) tx_frames[send_pos].data[i] = counter + i; - if (send_frame(&tx_frames[send_pos])) - return -1; + if (send_frame(&tx_frames[send_pos])) { + err = -1; + goto out_free; + } send_pos++; - if (send_pos == CAN_MSG_COUNT) + if (send_pos == inflight_count) send_pos = 0; unprocessed++; if (verbose == 1) @@ -272,8 +316,10 @@ static int can_echo_gen(void) else millisleep(1); } else { - if (recv_frame(&rx_frame)) - return -1; + if (recv_frame(&rx_frame)) { + err = -1; + goto out_free; + } if (verbose > 1) print_frame(&rx_frame, 0); @@ -283,7 +329,7 @@ static int can_echo_gen(void) compare_frame(&tx_frames[recv_tx_pos], &rx_frame, 0); recv_tx[recv_tx_pos] = 1; recv_tx_pos++; - if (recv_tx_pos == CAN_MSG_COUNT) + if (recv_tx_pos == inflight_count) recv_tx_pos = 0; continue; } else { @@ -294,7 +340,7 @@ static int can_echo_gen(void) /* compare with expected */ compare_frame(&tx_frames[recv_rx_pos], &rx_frame, 1); recv_rx_pos++; - if (recv_rx_pos == CAN_MSG_COUNT) + if (recv_rx_pos == inflight_count) recv_rx_pos = 0; } @@ -308,7 +354,12 @@ static int can_echo_gen(void) printf("\nTest messages sent and received: %d\n", loops); - return 0; + out_free: + free(recv_tx); + out_free_tx_frames: + free(tx_frames); + + return err; } int main(int argc, char *argv[]) @@ -324,14 +375,17 @@ int main(int argc, char *argv[]) signal(SIGHUP, signal_handler); signal(SIGINT, signal_handler); - while ((opt = getopt(argc, argv, "gl:v?")) != -1) { + while ((opt = getopt(argc, argv, "f:gl:v?")) != -1) { switch (opt) { case 'v': verbose++; break; + case 'f': + inflight_count = atoi(optarg); + break; case 'l': - test_loops = atoi(optarg);; + test_loops = atoi(optarg); break; case 'g':