canfdtest: use struct msghdr::msg_flags to detect own frames

...instead of relying on the can_id_ping.
pull/488/head
Marc Kleine-Budde 2023-12-19 14:49:57 +01:00
parent f110bf4cde
commit c35ed80b3d
1 changed files with 22 additions and 14 deletions

View File

@ -186,23 +186,30 @@ static void signal_handler(int signo)
exit_sig = signo; exit_sig = signo;
} }
static int recv_frame(struct canfd_frame *frame) static int recv_frame(struct canfd_frame *frame, int *flags)
{ {
ssize_t ret, len; struct iovec iov = {
.iov_base = frame,
.iov_len = is_can_fd ? sizeof(struct canfd_frame) : sizeof(struct can_frame),
};
struct msghdr msg = {
.msg_iov = &iov,
.msg_iovlen = 1,
};
ssize_t ret;
if (is_can_fd) ret = recvmsg(sockfd, &msg, 0);
len = sizeof(struct canfd_frame); if (ret != iov.iov_len) {
else
len = sizeof(struct can_frame);
ret = recv(sockfd, frame, len, 0);
if (ret != len) {
if (ret < 0) if (ret < 0)
perror("recv failed"); perror("recvmsg() failed");
else else
fprintf(stderr, "recv returned %zd", ret); fprintf(stderr, "recvmsg() returned %zd", ret);
return -1; return -1;
} }
if (flags)
*flags = msg.msg_flags;
return 0; return 0;
} }
@ -283,7 +290,7 @@ static int can_echo_dut(void)
int err = 0; int err = 0;
while (running) { while (running) {
if (recv_frame(&frame)) if (recv_frame(&frame, NULL))
return -1; return -1;
frame_count++; frame_count++;
if (verbose == 1) { if (verbose == 1) {
@ -359,8 +366,9 @@ static int can_echo_gen(void)
millisleep(1); millisleep(1);
} else { } else {
struct canfd_frame rx_frame; struct canfd_frame rx_frame;
int flags;
if (recv_frame(&rx_frame)) { if (recv_frame(&rx_frame, &flags)) {
err = -1; err = -1;
goto out_free; goto out_free;
} }
@ -369,7 +377,7 @@ static int can_echo_gen(void)
print_frame(rx_frame.can_id, rx_frame.data, rx_frame.len, 0); print_frame(rx_frame.can_id, rx_frame.data, rx_frame.len, 0);
/* own frame */ /* own frame */
if (rx_frame.can_id == can_id_ping) { if (flags & MSG_DONTROUTE) {
err = compare_frame(&tx_frames[recv_tx_pos], &rx_frame, 0); err = compare_frame(&tx_frames[recv_tx_pos], &rx_frame, 0);
recv_tx[recv_tx_pos] = true; recv_tx[recv_tx_pos] = true;
recv_tx_pos++; recv_tx_pos++;