Merge pull request #99 from olerem/canfdtest-2018.09.18
Extend canfdtest to test proper RX and TX-ECHO orderpull/106/head
commit
5b8145f63d
75
canfdtest.c
75
canfdtest.c
|
|
@ -47,6 +47,7 @@ static int running = 1;
|
||||||
static int verbose;
|
static int verbose;
|
||||||
static int sockfd;
|
static int sockfd;
|
||||||
static int test_loops;
|
static int test_loops;
|
||||||
|
static int exit_sig;
|
||||||
|
|
||||||
static void print_usage(char *prg)
|
static void print_usage(char *prg)
|
||||||
{
|
{
|
||||||
|
|
@ -71,47 +72,47 @@ static void print_usage(char *prg)
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void print_frame(struct can_frame *frame)
|
static void print_frame(struct can_frame *frame, int inc)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
printf("%04x: ", frame->can_id);
|
printf("%04x: ", frame->can_id + inc);
|
||||||
if (frame->can_id & CAN_RTR_FLAG) {
|
if (frame->can_id & CAN_RTR_FLAG) {
|
||||||
printf("remote request");
|
printf("remote request");
|
||||||
} else {
|
} else {
|
||||||
printf("[%d]", frame->can_dlc);
|
printf("[%d]", frame->can_dlc);
|
||||||
for (i = 0; i < frame->can_dlc; i++)
|
for (i = 0; i < frame->can_dlc; i++)
|
||||||
printf(" %02x", frame->data[i]);
|
printf(" %02x", frame->data[i] + inc);
|
||||||
}
|
}
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void print_compare(struct can_frame *exp, struct can_frame *rec)
|
static void print_compare(struct can_frame *exp, struct can_frame *rec, int inc)
|
||||||
{
|
{
|
||||||
printf("expected: ");
|
printf("expected: ");
|
||||||
print_frame(exp);
|
print_frame(exp, inc);
|
||||||
printf("received: ");
|
printf("received: ");
|
||||||
print_frame(rec);
|
print_frame(rec, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void compare_frame(struct can_frame *exp, struct can_frame *rec)
|
static void compare_frame(struct can_frame *exp, struct can_frame *rec, int inc)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (rec->can_id != exp->can_id) {
|
if (rec->can_id != exp->can_id + inc) {
|
||||||
printf("Message ID mismatch!\n");
|
printf("Message ID mismatch!\n");
|
||||||
print_compare(exp, rec);
|
print_compare(exp, rec, inc);
|
||||||
running = 0;
|
running = 0;
|
||||||
} else if (rec->can_dlc != exp->can_dlc) {
|
} else if (rec->can_dlc != exp->can_dlc) {
|
||||||
printf("Message length mismatch!\n");
|
printf("Message length mismatch!\n");
|
||||||
print_compare(exp, rec);
|
print_compare(exp, rec, inc);
|
||||||
running = 0;
|
running = 0;
|
||||||
} else {
|
} else {
|
||||||
for (i = 0; i < rec->can_dlc; i++) {
|
for (i = 0; i < rec->can_dlc; i++) {
|
||||||
if (rec->data[i] != exp->data[i]) {
|
if (rec->data[i] != ((exp->data[i] + inc) & 0xff)) {
|
||||||
printf("Databyte %x mismatch !\n", i);
|
printf("Databyte %x mismatch !\n", i);
|
||||||
print_compare(exp,
|
print_compare(exp,
|
||||||
rec);
|
rec, inc);
|
||||||
running = 0;
|
running = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -149,6 +150,7 @@ static void signal_handler(int signo)
|
||||||
{
|
{
|
||||||
close(sockfd);
|
close(sockfd);
|
||||||
running = 0;
|
running = 0;
|
||||||
|
exit_sig = signo;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int recv_frame(struct can_frame *frame)
|
static int recv_frame(struct can_frame *frame)
|
||||||
|
|
@ -235,9 +237,10 @@ static int can_echo_dut(void)
|
||||||
static int can_echo_gen(void)
|
static int can_echo_gen(void)
|
||||||
{
|
{
|
||||||
struct can_frame tx_frames[CAN_MSG_COUNT];
|
struct can_frame tx_frames[CAN_MSG_COUNT];
|
||||||
|
int recv_tx[CAN_MSG_COUNT];
|
||||||
struct can_frame rx_frame;
|
struct can_frame rx_frame;
|
||||||
unsigned char counter = 0;
|
unsigned char counter = 0;
|
||||||
int send_pos = 0, recv_pos = 0, unprocessed = 0, loops = 0;
|
int send_pos = 0, recv_rx_pos = 0, recv_tx_pos = 0, unprocessed = 0, loops = 0;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
while (running) {
|
while (running) {
|
||||||
|
|
@ -245,16 +248,13 @@ static int can_echo_gen(void)
|
||||||
/* still send messages */
|
/* still send messages */
|
||||||
tx_frames[send_pos].can_dlc = CAN_MSG_LEN;
|
tx_frames[send_pos].can_dlc = CAN_MSG_LEN;
|
||||||
tx_frames[send_pos].can_id = CAN_MSG_ID;
|
tx_frames[send_pos].can_id = CAN_MSG_ID;
|
||||||
|
recv_tx[send_pos] = 0;
|
||||||
|
|
||||||
for (i = 0; i < CAN_MSG_LEN; i++)
|
for (i = 0; i < CAN_MSG_LEN; i++)
|
||||||
tx_frames[send_pos].data[i] = counter + i;
|
tx_frames[send_pos].data[i] = counter + i;
|
||||||
if (send_frame(&tx_frames[send_pos]))
|
if (send_frame(&tx_frames[send_pos]))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
/* increment to be equal to expected */
|
|
||||||
tx_frames[send_pos].can_id++;
|
|
||||||
for (i = 0; i < CAN_MSG_LEN; i++)
|
|
||||||
tx_frames[send_pos].data[i]++;
|
|
||||||
|
|
||||||
send_pos++;
|
send_pos++;
|
||||||
if (send_pos == CAN_MSG_COUNT)
|
if (send_pos == CAN_MSG_COUNT)
|
||||||
send_pos = 0;
|
send_pos = 0;
|
||||||
|
|
@ -272,18 +272,32 @@ static int can_echo_gen(void)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (verbose > 1)
|
if (verbose > 1)
|
||||||
print_frame(&rx_frame);
|
print_frame(&rx_frame, 0);
|
||||||
|
|
||||||
|
/* own frame */
|
||||||
|
if (rx_frame.can_id == CAN_MSG_ID) {
|
||||||
|
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)
|
||||||
|
recv_tx_pos = 0;
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
if (!recv_tx[recv_rx_pos]) {
|
||||||
|
printf("RX before TX!\n");
|
||||||
|
running = 0;
|
||||||
|
}
|
||||||
/* compare with expected */
|
/* compare with expected */
|
||||||
compare_frame(&tx_frames[recv_pos], &rx_frame);
|
compare_frame(&tx_frames[recv_rx_pos], &rx_frame, 1);
|
||||||
|
recv_rx_pos++;
|
||||||
|
if (recv_rx_pos == CAN_MSG_COUNT)
|
||||||
|
recv_rx_pos = 0;
|
||||||
|
}
|
||||||
|
|
||||||
loops++;
|
loops++;
|
||||||
if (test_loops && loops >= test_loops)
|
if (test_loops && loops >= test_loops)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
recv_pos++;
|
|
||||||
if (recv_pos == CAN_MSG_COUNT)
|
|
||||||
recv_pos = 0;
|
|
||||||
unprocessed--;
|
unprocessed--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -300,6 +314,7 @@ int main(int argc, char *argv[])
|
||||||
int family = PF_CAN, type = SOCK_RAW, proto = CAN_RAW;
|
int family = PF_CAN, type = SOCK_RAW, proto = CAN_RAW;
|
||||||
int echo_gen = 0;
|
int echo_gen = 0;
|
||||||
int opt, err;
|
int opt, err;
|
||||||
|
int recv_own_msgs = 1;
|
||||||
|
|
||||||
signal(SIGTERM, signal_handler);
|
signal(SIGTERM, signal_handler);
|
||||||
signal(SIGHUP, signal_handler);
|
signal(SIGHUP, signal_handler);
|
||||||
|
|
@ -337,6 +352,14 @@ int main(int argc, char *argv[])
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (echo_gen) {
|
||||||
|
if (setsockopt(sockfd, SOL_CAN_RAW, CAN_RAW_RECV_OWN_MSGS,
|
||||||
|
&recv_own_msgs, sizeof(recv_own_msgs)) == -1) {
|
||||||
|
perror("setsockopt");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
addr.can_family = family;
|
addr.can_family = family;
|
||||||
addr.can_ifindex = if_nametoindex(intf_name);
|
addr.can_ifindex = if_nametoindex(intf_name);
|
||||||
|
|
||||||
|
|
@ -355,5 +378,11 @@ int main(int argc, char *argv[])
|
||||||
printf("Exiting...\n");
|
printf("Exiting...\n");
|
||||||
|
|
||||||
close(sockfd);
|
close(sockfd);
|
||||||
|
|
||||||
|
if (exit_sig) {
|
||||||
|
signal(exit_sig, SIG_DFL);
|
||||||
|
kill(getpid(), exit_sig);
|
||||||
|
}
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue