canfdtest: use struct msghdr::msg_flags to detect own frames
...instead of relying on the can_id_ping.pull/488/head
parent
f110bf4cde
commit
c35ed80b3d
36
canfdtest.c
36
canfdtest.c
|
|
@ -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++;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue