Commit a89568e9 authored by Vadim Fedorenko's avatar Vadim Fedorenko Committed by Jakub Kicinski
Browse files

selftests: txtimestamp: add SCM_TS_OPT_ID test



Extend txtimestamp test to run with fixed tskey using
SCM_TS_OPT_ID control message for all types of sockets.

Reviewed-by: default avatarJason Xing <kerneljasonxing@gmail.com>
Reviewed-by: default avatarWillem de Bruijn <willemb@google.com>
Signed-off-by: default avatarVadim Fedorenko <vadfed@meta.com>
Link: https://patch.msgid.link/20241001125716.2832769-4-vadfed@meta.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 822b5bc6
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -124,6 +124,8 @@
#define SO_PASSPIDFD		76
#define SO_PEERPIDFD		77

#define SCM_TS_OPT_ID		78

#if !defined(__KERNEL__)

#if __BITS_PER_LONG == 64 || (defined(__x86_64__) && defined(__ILP32__))
+34 −10
Original line number Diff line number Diff line
@@ -77,6 +77,8 @@ static bool cfg_epollet;
static bool cfg_do_listen;
static uint16_t dest_port = 9000;
static bool cfg_print_nsec;
static uint32_t ts_opt_id;
static bool cfg_use_cmsg_opt_id;

static struct sockaddr_in daddr;
static struct sockaddr_in6 daddr6;
@@ -136,12 +138,13 @@ static void validate_key(int tskey, int tstype)
	/* compare key for each subsequent request
	 * must only test for one type, the first one requested
	 */
	if (saved_tskey == -1)
	if (saved_tskey == -1 || cfg_use_cmsg_opt_id)
		saved_tskey_type = tstype;
	else if (saved_tskey_type != tstype)
		return;

	stepsize = cfg_proto == SOCK_STREAM ? cfg_payload_len : 1;
	stepsize = cfg_use_cmsg_opt_id ? 0 : stepsize;
	if (tskey != saved_tskey + stepsize) {
		fprintf(stderr, "ERROR: key %d, expected %d\n",
				tskey, saved_tskey + stepsize);
@@ -484,7 +487,7 @@ static void fill_header_udp(void *p, bool is_ipv4)

static void do_test(int family, unsigned int report_opt)
{
	char control[CMSG_SPACE(sizeof(uint32_t))];
	char control[2 * CMSG_SPACE(sizeof(uint32_t))];
	struct sockaddr_ll laddr;
	unsigned int sock_opt;
	struct cmsghdr *cmsg;
@@ -624,12 +627,15 @@ static void do_test(int family, unsigned int report_opt)
		msg.msg_iov = &iov;
		msg.msg_iovlen = 1;

		if (cfg_use_cmsg) {
		if (cfg_use_cmsg || cfg_use_cmsg_opt_id) {
			memset(control, 0, sizeof(control));

			msg.msg_control = control;
			msg.msg_controllen = sizeof(control);
			msg.msg_controllen = cfg_use_cmsg * CMSG_SPACE(sizeof(uint32_t));
			msg.msg_controllen += cfg_use_cmsg_opt_id * CMSG_SPACE(sizeof(uint32_t));

			cmsg = NULL;
			if (cfg_use_cmsg) {
				cmsg = CMSG_FIRSTHDR(&msg);
				cmsg->cmsg_level = SOL_SOCKET;
				cmsg->cmsg_type = SO_TIMESTAMPING;
@@ -637,6 +643,17 @@ static void do_test(int family, unsigned int report_opt)

				*((uint32_t *)CMSG_DATA(cmsg)) = report_opt;
			}
			if (cfg_use_cmsg_opt_id) {
				cmsg = cmsg ? CMSG_NXTHDR(&msg, cmsg) : CMSG_FIRSTHDR(&msg);
				cmsg->cmsg_level = SOL_SOCKET;
				cmsg->cmsg_type = SCM_TS_OPT_ID;
				cmsg->cmsg_len = CMSG_LEN(sizeof(uint32_t));

				*((uint32_t *)CMSG_DATA(cmsg)) = ts_opt_id;
				saved_tskey = ts_opt_id;
			}

		}

		val = sendmsg(fd, &msg, 0);
		if (val != total_len)
@@ -685,6 +702,7 @@ static void __attribute__((noreturn)) usage(const char *filepath)
			"  -L    listen on hostname and port\n"
			"  -n:   set no-payload option\n"
			"  -N:   print timestamps and durations in nsec (instead of usec)\n"
			"  -o N: use SCM_TS_OPT_ID control message to provide N as tskey\n"
			"  -p N: connect to port N\n"
			"  -P:   use PF_PACKET\n"
			"  -r:   use raw\n"
@@ -705,7 +723,7 @@ static void parse_opt(int argc, char **argv)
	int c;

	while ((c = getopt(argc, argv,
				"46bc:CeEFhIl:LnNp:PrRS:t:uv:V:x")) != -1) {
				"46bc:CeEFhIl:LnNo:p:PrRS:t:uv:V:x")) != -1) {
		switch (c) {
		case '4':
			do_ipv6 = 0;
@@ -746,6 +764,10 @@ static void parse_opt(int argc, char **argv)
		case 'N':
			cfg_print_nsec = true;
			break;
		case 'o':
			ts_opt_id = strtoul(optarg, NULL, 10);
			cfg_use_cmsg_opt_id = true;
			break;
		case 'p':
			dest_port = strtoul(optarg, NULL, 10);
			break;
@@ -803,6 +825,8 @@ static void parse_opt(int argc, char **argv)
		error(1, 0, "cannot ask for pktinfo over pf_packet");
	if (cfg_busy_poll && cfg_use_epoll)
		error(1, 0, "pass epoll or busy_poll, not both");
	if (cfg_proto == SOCK_STREAM && cfg_use_cmsg_opt_id)
		error(1, 0, "TCP sockets don't support SCM_TS_OPT_ID");

	if (optind != argc - 1)
		error(1, 0, "missing required hostname argument");
+7 −5
Original line number Diff line number Diff line
@@ -39,7 +39,9 @@ run_test_tcpudpraw() {

	run_test_v4v6 ${args}		  # tcp
	run_test_v4v6 ${args} -u	  # udp
	run_test_v4v6 ${args} -u -o 42	  # udp with fixed tskey
	run_test_v4v6 ${args} -r	  # raw
	run_test_v4v6 ${args} -r -o 42	  # raw
	run_test_v4v6 ${args} -R	  # raw (IPPROTO_RAW)
	run_test_v4v6 ${args} -P	  # pf_packet
}