From: Willem de Bruijn Prepare error queue handling for upcoming SO_EE_ORIGIN_TIMESTAMPING messages in the next patch in this series. Convert do_recv_errqueue_timeout into dispatcher do_recv_errqueue and move SO_EE_ORIGIN_TXTIME specific code into a separate helper. This will make the next patch a lot more readable. No functional changes. Signed-off-by: Willem de Bruijn Reviewed-by: Mohsin Bashir --- .../testing/selftests/drivers/net/so_txtime.c | 66 ++++++++++--------- 1 file changed, 36 insertions(+), 30 deletions(-) diff --git a/tools/testing/selftests/drivers/net/so_txtime.c b/tools/testing/selftests/drivers/net/so_txtime.c index 55a386f3d1b9..7364ce2bec0b 100644 --- a/tools/testing/selftests/drivers/net/so_txtime.c +++ b/tools/testing/selftests/drivers/net/so_txtime.c @@ -158,7 +158,40 @@ static void do_recv_verify_empty(int fdr) error(1, 0, "recv: not empty as expected (%d, %d)", ret, errno); } -static int do_recv_errqueue_timeout(int fdt) +static int do_recv_errqueue_timeout(struct sock_extended_err *err, + const char payload_char) +{ + const char *reason = NULL; + int64_t tstamp = 0; + + switch (err->ee_errno) { + case ECANCELED: + if (err->ee_code != SO_EE_CODE_TXTIME_MISSED) + error(1, 0, "errqueue: unknown ECANCELED %u\n", + err->ee_code); + reason = "missed txtime"; + break; + case EINVAL: + if (err->ee_code != SO_EE_CODE_TXTIME_INVALID_PARAM) + error(1, 0, "errqueue: unknown EINVAL %u\n", + err->ee_code); + reason = "invalid txtime"; + break; + default: + error(1, 0, "errqueue: errno %u code %u\n", + err->ee_errno, err->ee_code); + } + + tstamp = ((int64_t)err->ee_data) << 32 | err->ee_info; + tstamp -= (int64_t)glob_tstart; + tstamp /= 1000 * 1000; + fprintf(stderr, "send: pkt %c at %" PRId64 "ms dropped: %s\n", + payload_char, tstamp, reason); + + return 1; +} + +static int do_recv_errqueue(int fdt) { char control[CMSG_SPACE(sizeof(struct sock_extended_err)) + CMSG_SPACE(sizeof(struct sockaddr_in6))] = {0}; @@ -169,7 +202,6 @@ static int do_recv_errqueue_timeout(int fdt) struct msghdr msg = {0}; struct iovec iov = {0}; struct cmsghdr *cm; - int64_t tstamp = 0; iov.iov_base = data; iov.iov_len = sizeof(data); @@ -181,8 +213,6 @@ static int do_recv_errqueue_timeout(int fdt) msg.msg_controllen = sizeof(control); while (1) { - const char *reason = NULL; - ret = recvmsg(fdt, &msg, MSG_ERRQUEUE); if (ret == -1 && errno == EAGAIN) break; @@ -201,33 +231,9 @@ static int do_recv_errqueue_timeout(int fdt) if (err->ee_origin != SO_EE_ORIGIN_TXTIME) error(1, 0, "errqueue: origin 0x%x\n", err->ee_origin); - switch (err->ee_errno) { - case ECANCELED: - if (err->ee_code != SO_EE_CODE_TXTIME_MISSED) - error(1, 0, "errqueue: unknown ECANCELED %u\n", - err->ee_code); - reason = "missed txtime"; - break; - case EINVAL: - if (err->ee_code != SO_EE_CODE_TXTIME_INVALID_PARAM) - error(1, 0, "errqueue: unknown EINVAL %u\n", - err->ee_code); - reason = "invalid txtime"; - break; - default: - error(1, 0, "errqueue: errno %u code %u\n", - err->ee_errno, err->ee_code); - } - - tstamp = ((int64_t) err->ee_data) << 32 | err->ee_info; - tstamp -= (int64_t) glob_tstart; - tstamp /= 1000 * 1000; - fprintf(stderr, "send: pkt %c at %" PRId64 "ms dropped: %s\n", - data[ret - 1], tstamp, reason); - + num_tstamp += do_recv_errqueue_timeout(err, data[ret - 1]); msg.msg_flags = 0; msg.msg_controllen = sizeof(control); - num_tstamp++; } return num_tstamp; @@ -245,7 +251,7 @@ static void recv_errqueue_msgs(int fdt) error(1, errno, "poll"); if (ret && (pfd.revents & POLLERR)) - num_tstamp += do_recv_errqueue_timeout(fdt); + num_tstamp += do_recv_errqueue(fdt); if (num_tstamp == cfg_num_pkt) break; -- 2.55.0.229.g6434b31f56-goog