Commit 2d3b8dfd authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

selftests: net: fix timestamp not arriving in cmsg_time.sh



On slow machines the SND timestamp sometimes doesn't arrive before
we quit. The test only waits as long as the packet delay, so it's
easy for a race condition to happen.

Double the wait but do a bit of polling, once the SND timestamp
arrives there's no point to wait any longer.

This fixes the "TXTIME abs" failures on debug kernels, like:

   Case ICMPv4  - TXTIME abs returned '', expected 'OK'

Reviewed-by: default avatarWillem de Bruijn <willemb@google.com>
Link: https://lore.kernel.org/r/20240510005705.43069-1-kuba@kernel.org


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent b49bd37f
Loading
Loading
Loading
Loading
+15 −5
Original line number Diff line number Diff line
@@ -333,16 +333,17 @@ static const char *cs_ts_info2str(unsigned int info)
	return "unknown";
}

static void
static unsigned long
cs_read_cmsg(int fd, struct msghdr *msg, char *cbuf, size_t cbuf_sz)
{
	struct sock_extended_err *see;
	struct scm_timestamping *ts;
	unsigned long ts_seen = 0;
	struct cmsghdr *cmsg;
	int i, err;

	if (!opt.ts.ena)
		return;
		return 0;
	msg->msg_control = cbuf;
	msg->msg_controllen = cbuf_sz;

@@ -396,8 +397,11 @@ cs_read_cmsg(int fd, struct msghdr *msg, char *cbuf, size_t cbuf_sz)
			printf(" %5s ts%d %lluus\n",
			       cs_ts_info2str(see->ee_info),
			       i, rel_time);
			ts_seen |= 1 << see->ee_info;
		}
	}

	return ts_seen;
}

static void ca_set_sockopts(int fd)
@@ -509,10 +513,16 @@ int main(int argc, char *argv[])
	err = ERN_SUCCESS;

	if (opt.ts.ena) {
		/* Make sure all timestamps have time to loop back */
		usleep(opt.txtime.delay);
		unsigned long seen;
		int i;

		cs_read_cmsg(fd, &msg, cbuf, sizeof(cbuf));
		/* Make sure all timestamps have time to loop back */
		for (i = 0; i < 40; i++) {
			seen = cs_read_cmsg(fd, &msg, cbuf, sizeof(cbuf));
			if (seen & (1 << SCM_TSTAMP_SND))
				break;
			usleep(opt.txtime.delay / 20);
		}
	}

err_out: