From nobody Mon Sep 29 15:07:42 2025 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4cb4LR1bBxz68MnQ; Mon, 29 Sep 2025 15:07:43 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R12" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4cb4LR0vRcz44fS; Mon, 29 Sep 2025 15:07:43 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1759158463; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=2CVe4bd9BhGJLEtAZHUWjjTiJSD9wKsKErVpyD/HPB8=; b=sKxT7+zk2P5bm12PJ7NTyWHt5JJmskA+g50YJ/qDy9KdZ8peeeyc/OTE5rPZPKI3lMLeVL 0njzLpdE6kW2p+iwZg0af1DxOG/ExeLfnvIxCyabcISG3ae988qWE5r1Riaghqd03/xpSI EAQF5aikHUCf4tTFYwhlnuuvgkFhHTMmH49+ErT9J+CtuVdLCDRVAZQO6RaKhWwslNhXvI Ggoj1SoU+2Yj7vu8Feb0l520zB3iGzqXFRQTbgAbzD0tEPpYNhF1jUDf/Jsc8wZWIsXvRk Jd7mU1NxKKAdsasVOfW4mnxNT4W7E2zi7bOnN7Phl9dVxnJGFiVUh8Fdh2kZbw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1759158463; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=2CVe4bd9BhGJLEtAZHUWjjTiJSD9wKsKErVpyD/HPB8=; b=FMNYhF67uLCLzU0Si08HRxCbEif54nHKP1nSDXDXktguayrMZ7M9DtyKGOb0N/fkAG6BHI x+QjEsGAufHRcH1Q8Z6/NOm0ojlOCbf9sUhkTkPD/Omg963qaAPGXFPoUFU184IdM2/WOo dtiXuF9kOKvo4G/jPZNbbXMeVBve3WUUrKy7sA85Ps2wx8qGjIg0Vq+ykLrbo01XanAhzB YcIfpP40tO4S539m+So1t6HgCcF/QRH47zDDfW/A32XubePKtm3T2Jxo4p+A53OT4WYRVm fGOeAEeiuo2h9ZJqfUuL1kNDOCtZ0ZJmA7eILPX6mGyte/3YsZ9y3FtkV0auGw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1759158463; a=rsa-sha256; cv=none; b=XTXWg1oR2dDJMGczZs6chgZ2F0w3HeT0pOiFHxYLW69da/bbeNV+RnWrbmU+Oxl5gOczfS VXkMrb2Wl5OLmlt87fMxnWJkC2ZpB+7LxYjmKGS/bRdR+cu7ri+wxY+ed+1vAuPRirzx+b 0WxXHyRkgVLEDC6tGNv6sumOnci9S9NG+56ca7UGZY3z4zblP0DlxnNGgZ9dOZR/19JWAc h/CShK5q1JYDLNaVqoC4OgA/SeY2uoXvTadU3esZdJnoR9TvArZwb+rlBHLIElzBFfk9ZM FlKLfLgipgwjGHTWhzBRaeGlp+N66jnwkIe/uDGeWwHwYxD6jgSHAIk3HfLOzA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4cb4LR0CjMz190Z; Mon, 29 Sep 2025 15:07:43 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 58TF7g80075925; Mon, 29 Sep 2025 15:07:42 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 58TF7gMH075922; Mon, 29 Sep 2025 15:07:42 GMT (envelope-from git) Date: Mon, 29 Sep 2025 15:07:42 GMT Message-Id: <202509291507.58TF7gMH075922@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: "Jonathan T. Looney" Subject: git: 5b59ff1e1607 - stable/15 - ip6: add SO_BINTIME support List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: jtl X-Git-Repository: src X-Git-Refname: refs/heads/stable/15 X-Git-Reftype: branch X-Git-Commit: 5b59ff1e160727c80686bbfc728dae075fcd0d4f Auto-Submitted: auto-generated The branch stable/15 has been updated by jtl: URL: https://cgit.FreeBSD.org/src/commit/?id=5b59ff1e160727c80686bbfc728dae075fcd0d4f commit 5b59ff1e160727c80686bbfc728dae075fcd0d4f Author: Jonathan T. Looney AuthorDate: 2025-09-12 17:49:17 +0000 Commit: Jonathan T. Looney CommitDate: 2025-09-29 15:03:02 +0000 ip6: add SO_BINTIME support This adds support for obtaining timestamps from IPv6 packets using the SO_BINTIME socket option, bringing it in parity with IPv4 behavior. Enable testing the SO_BINTIME option in the relevant (manual) regression test. PR: 289423 Reviewed by: markj MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D52504 (cherry picked from commit cd02a8a9f8be2085d5242606a79668dc3720e7b0) --- sys/netinet6/ip6_input.c | 53 +++++++++++++++------- .../regression/sockets/udp_pingpong/udp_pingpong.c | 8 ++-- 2 files changed, 39 insertions(+), 22 deletions(-) diff --git a/sys/netinet6/ip6_input.c b/sys/netinet6/ip6_input.c index 45fd23ea6c21..b22491a6007f 100644 --- a/sys/netinet6/ip6_input.c +++ b/sys/netinet6/ip6_input.c @@ -1197,8 +1197,8 @@ ip6_savecontrol_v4(struct inpcb *inp, struct mbuf *m, struct mbuf **mp, { struct ip6_hdr *ip6 = mtod(m, struct ip6_hdr *); -#ifdef SO_TIMESTAMP - if ((inp->inp_socket->so_options & SO_TIMESTAMP) != 0) { +#if defined(SO_TIMESTAMP) && defined(SO_BINTIME) + if ((inp->inp_socket->so_options & (SO_TIMESTAMP | SO_BINTIME)) != 0) { union { struct timeval tv; struct bintime bt; @@ -1206,47 +1206,66 @@ ip6_savecontrol_v4(struct inpcb *inp, struct mbuf *m, struct mbuf **mp, } t; struct bintime boottimebin, bt1; struct timespec ts1; + int ts_clock; bool stamped; + ts_clock = inp->inp_socket->so_ts_clock; stamped = false; - switch (inp->inp_socket->so_ts_clock) { - case SO_TS_REALTIME_MICRO: + + /* + * Handle BINTIME first. We create the same output options + * for both SO_BINTIME and the case where SO_TIMESTAMP is + * set with the timestamp clock set to SO_TS_BINTIME. + */ + if ((inp->inp_socket->so_options & SO_BINTIME) != 0 || + ts_clock == SO_TS_BINTIME) { if ((m->m_flags & (M_PKTHDR | M_TSTMP)) == (M_PKTHDR | M_TSTMP)) { mbuf_tstmp2timespec(m, &ts1); - timespec2bintime(&ts1, &bt1); + timespec2bintime(&ts1, &t.bt); getboottimebin(&boottimebin); - bintime_add(&bt1, &boottimebin); - bintime2timeval(&bt1, &t.tv); + bintime_add(&t.bt, &boottimebin); } else { - microtime(&t.tv); + bintime(&t.bt); } - *mp = sbcreatecontrol(&t.tv, sizeof(t.tv), - SCM_TIMESTAMP, SOL_SOCKET, M_NOWAIT); + *mp = sbcreatecontrol(&t.bt, sizeof(t.bt), SCM_BINTIME, + SOL_SOCKET, M_NOWAIT); if (*mp != NULL) { mp = &(*mp)->m_next; stamped = true; } - break; - case SO_TS_BINTIME: + /* + * Suppress other timestamps if SO_TIMESTAMP is not + * set. + */ + if ((inp->inp_socket->so_options & SO_TIMESTAMP) == 0) + ts_clock = SO_TS_BINTIME; + } + + switch (ts_clock) { + case SO_TS_REALTIME_MICRO: if ((m->m_flags & (M_PKTHDR | M_TSTMP)) == (M_PKTHDR | M_TSTMP)) { mbuf_tstmp2timespec(m, &ts1); - timespec2bintime(&ts1, &t.bt); + timespec2bintime(&ts1, &bt1); getboottimebin(&boottimebin); - bintime_add(&t.bt, &boottimebin); + bintime_add(&bt1, &boottimebin); + bintime2timeval(&bt1, &t.tv); } else { - bintime(&t.bt); + microtime(&t.tv); } - *mp = sbcreatecontrol(&t.bt, sizeof(t.bt), SCM_BINTIME, - SOL_SOCKET, M_NOWAIT); + *mp = sbcreatecontrol(&t.tv, sizeof(t.tv), + SCM_TIMESTAMP, SOL_SOCKET, M_NOWAIT); if (*mp != NULL) { mp = &(*mp)->m_next; stamped = true; } break; + case SO_TS_BINTIME: + break; + case SO_TS_REALTIME: if ((m->m_flags & (M_PKTHDR | M_TSTMP)) == (M_PKTHDR | M_TSTMP)) { diff --git a/tools/regression/sockets/udp_pingpong/udp_pingpong.c b/tools/regression/sockets/udp_pingpong/udp_pingpong.c index 2fe342debdc6..e852f7a7af87 100644 --- a/tools/regression/sockets/udp_pingpong/udp_pingpong.c +++ b/tools/regression/sockets/udp_pingpong/udp_pingpong.c @@ -601,11 +601,9 @@ main(void) test_run(TT_TIMESTAMP, i, 1, "send()/recvmsg(), setsockopt(SO_TIMESTAMP, 1)"); printf("OK\n"); - if (i == 0) { - test_run(TT_BINTIME, i, 1, - "send()/recvmsg(), setsockopt(SO_BINTIME, 1)"); - printf("OK\n"); - } + test_run(TT_BINTIME, i, 1, + "send()/recvmsg(), setsockopt(SO_BINTIME, 1)"); + printf("OK\n"); test_run(TT_REALTIME_MICRO, i, 1, "send()/recvmsg(), setsockopt(SO_TS_CLOCK, SO_TS_REALTIME_MICRO)"); printf("OK\n");