Commit ca882609 authored by Willem de Bruijn's avatar Willem de Bruijn Committed by David S. Miller

selftests/net: report etf errors correctly

The ETF qdisc can queue skbs that it could not pace on the errqueue.

Address a few issues in the selftest

- recv buffer size was too small, and incorrectly calculated
- compared errno to ee_code instead of ee_errno
- missed invalid request error type

v2:
  - fix a few checkpatch --strict indentation warnings

Fixes: ea6a5476 ("selftests/net: make so_txtime more robust to timer variance")
Signed-off-by: default avatarWillem de Bruijn <willemb@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 5948378b
...@@ -15,8 +15,9 @@ ...@@ -15,8 +15,9 @@
#include <inttypes.h> #include <inttypes.h>
#include <linux/net_tstamp.h> #include <linux/net_tstamp.h>
#include <linux/errqueue.h> #include <linux/errqueue.h>
#include <linux/if_ether.h>
#include <linux/ipv6.h> #include <linux/ipv6.h>
#include <linux/tcp.h> #include <linux/udp.h>
#include <stdbool.h> #include <stdbool.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
...@@ -140,8 +141,8 @@ static void do_recv_errqueue_timeout(int fdt) ...@@ -140,8 +141,8 @@ static void do_recv_errqueue_timeout(int fdt)
{ {
char control[CMSG_SPACE(sizeof(struct sock_extended_err)) + char control[CMSG_SPACE(sizeof(struct sock_extended_err)) +
CMSG_SPACE(sizeof(struct sockaddr_in6))] = {0}; CMSG_SPACE(sizeof(struct sockaddr_in6))] = {0};
char data[sizeof(struct ipv6hdr) + char data[sizeof(struct ethhdr) + sizeof(struct ipv6hdr) +
sizeof(struct tcphdr) + 1]; sizeof(struct udphdr) + 1];
struct sock_extended_err *err; struct sock_extended_err *err;
struct msghdr msg = {0}; struct msghdr msg = {0};
struct iovec iov = {0}; struct iovec iov = {0};
...@@ -159,6 +160,8 @@ static void do_recv_errqueue_timeout(int fdt) ...@@ -159,6 +160,8 @@ static void do_recv_errqueue_timeout(int fdt)
msg.msg_controllen = sizeof(control); msg.msg_controllen = sizeof(control);
while (1) { while (1) {
const char *reason;
ret = recvmsg(fdt, &msg, MSG_ERRQUEUE); ret = recvmsg(fdt, &msg, MSG_ERRQUEUE);
if (ret == -1 && errno == EAGAIN) if (ret == -1 && errno == EAGAIN)
break; break;
...@@ -176,14 +179,30 @@ static void do_recv_errqueue_timeout(int fdt) ...@@ -176,14 +179,30 @@ static void do_recv_errqueue_timeout(int fdt)
err = (struct sock_extended_err *)CMSG_DATA(cm); err = (struct sock_extended_err *)CMSG_DATA(cm);
if (err->ee_origin != SO_EE_ORIGIN_TXTIME) if (err->ee_origin != SO_EE_ORIGIN_TXTIME)
error(1, 0, "errqueue: origin 0x%x\n", err->ee_origin); error(1, 0, "errqueue: origin 0x%x\n", err->ee_origin);
if (err->ee_code != ECANCELED)
error(1, 0, "errqueue: code 0x%x\n", err->ee_code); 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) err->ee_data) << 32 | err->ee_info;
tstamp -= (int64_t) glob_tstart; tstamp -= (int64_t) glob_tstart;
tstamp /= 1000 * 1000; tstamp /= 1000 * 1000;
fprintf(stderr, "send: pkt %c at %" PRId64 "ms dropped\n", fprintf(stderr, "send: pkt %c at %" PRId64 "ms dropped: %s\n",
data[ret - 1], tstamp); data[ret - 1], tstamp, reason);
msg.msg_flags = 0; msg.msg_flags = 0;
msg.msg_controllen = sizeof(control); msg.msg_controllen = sizeof(control);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment