Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 23685923 authored by Willem de Bruijn's avatar Willem de Bruijn Committed by David S. Miller
Browse files

net-timestamp: no-payload option in txtimestamp test



Demonstrate how SOF_TIMESTAMPING_OPT_TSONLY can be used and
test the implementation.

Signed-off-by: default avatarWillem de Bruijn <willemb@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b245be1f
Loading
Loading
Loading
Loading
+24 −4
Original line number Diff line number Diff line
@@ -70,6 +70,7 @@ static int do_ipv6 = 1;
static int cfg_payload_len = 10;
static bool cfg_show_payload;
static bool cfg_do_pktinfo;
static bool cfg_loop_nodata;
static uint16_t dest_port = 9000;

static struct sockaddr_in daddr;
@@ -141,6 +142,9 @@ static void print_payload(char *data, int len)
{
	int i;

	if (!len)
		return;

	if (len > 70)
		len = 70;

@@ -177,6 +181,7 @@ static void __recv_errmsg_cmsg(struct msghdr *msg, int payload_len)
	struct sock_extended_err *serr = NULL;
	struct scm_timestamping *tss = NULL;
	struct cmsghdr *cm;
	int batch = 0;

	for (cm = CMSG_FIRSTHDR(msg);
	     cm && cm->cmsg_len;
@@ -209,10 +214,18 @@ static void __recv_errmsg_cmsg(struct msghdr *msg, int payload_len)
		} else
			fprintf(stderr, "unknown cmsg %d,%d\n",
					cm->cmsg_level, cm->cmsg_type);

		if (serr && tss) {
			print_timestamp(tss, serr->ee_info, serr->ee_data,
					payload_len);
			serr = NULL;
			tss = NULL;
			batch++;
		}
	}

	if (serr && tss)
		print_timestamp(tss, serr->ee_info, serr->ee_data, payload_len);
	if (batch > 1)
		fprintf(stderr, "batched %d timestamps\n", batch);
}

static int recv_errmsg(int fd)
@@ -244,7 +257,7 @@ static int recv_errmsg(int fd)
	if (ret == -1 && errno != EAGAIN)
		error(1, errno, "recvmsg");

	if (ret > 0) {
	if (ret >= 0) {
		__recv_errmsg_cmsg(&msg, ret);
		if (cfg_show_payload)
			print_payload(data, cfg_payload_len);
@@ -309,6 +322,9 @@ static void do_test(int family, unsigned int opt)
	opt |= SOF_TIMESTAMPING_SOFTWARE |
	       SOF_TIMESTAMPING_OPT_CMSG |
	       SOF_TIMESTAMPING_OPT_ID;
	if (cfg_loop_nodata)
		opt |= SOF_TIMESTAMPING_OPT_TSONLY;

	if (setsockopt(fd, SOL_SOCKET, SO_TIMESTAMPING,
		       (char *) &opt, sizeof(opt)))
		error(1, 0, "setsockopt timestamping");
@@ -378,6 +394,7 @@ static void __attribute__((noreturn)) usage(const char *filepath)
			"  -h:   show this message\n"
			"  -I:   request PKTINFO\n"
			"  -l N: send N bytes at a time\n"
			"  -n:   set no-payload option\n"
			"  -r:   use raw\n"
			"  -R:   use raw (IP_HDRINCL)\n"
			"  -p N: connect to port N\n"
@@ -392,7 +409,7 @@ static void parse_opt(int argc, char **argv)
	int proto_count = 0;
	char c;

	while ((c = getopt(argc, argv, "46hIl:p:rRux")) != -1) {
	while ((c = getopt(argc, argv, "46hIl:np:rRux")) != -1) {
		switch (c) {
		case '4':
			do_ipv6 = 0;
@@ -403,6 +420,9 @@ static void parse_opt(int argc, char **argv)
		case 'I':
			cfg_do_pktinfo = true;
			break;
		case 'n':
			cfg_loop_nodata = true;
			break;
		case 'r':
			proto_count++;
			cfg_proto = SOCK_RAW;