netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] tun: support not enabling carrier in TUNSETIFF
@ 2022-09-16 23:45 Patrick Rohr
  2022-09-16 23:54 ` Maciej Żenczykowski
                   ` (4 more replies)
  0 siblings, 5 replies; 15+ messages in thread
From: Patrick Rohr @ 2022-09-16 23:45 UTC (permalink / raw)
  To: David S . Miller
  Cc: Linux Network Development Mailing List, Patrick Rohr,
	Maciej Żenczykowski, Lorenzo Colitti, Jason Wang

This change adds support for not enabling carrier during TUNSETIFF
interface creation by specifying the IFF_NO_CARRIER flag.

Our tests make heavy use of tun interfaces. In some scenarios, the test
process creates the interface but another process brings it up after the
interface is discovered via netlink notification. In that case, it is
not possible to create a tun/tap interface with carrier off without it
racing against the bring up. Immediately setting carrier off via
TUNSETCARRIER is still too late.

Since ifr_flags is only a short, the value for IFF_DETACH_QUEUE is
reused for IFF_NO_CARRIER. IFF_DETACH_QUEUE has currently no meaning in
TUNSETIFF.

Signed-off-by: Patrick Rohr <prohr@google.com>
Cc: Maciej Żenczykowski <maze@google.com>
Cc: Lorenzo Colitti <lorenzo@google.com>
Cc: Jason Wang <jasowang@redhat.com>
---
 drivers/net/tun.c           | 15 ++++++++++++---
 include/uapi/linux/if_tun.h |  2 ++
 2 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/drivers/net/tun.c b/drivers/net/tun.c
index 259b2b84b2b3..502f56095650 100644
--- a/drivers/net/tun.c
+++ b/drivers/net/tun.c
@@ -2709,6 +2709,12 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)
 	struct net_device *dev;
 	int err;
 
+	/* Do not save the IFF_NO_CARRIER flag as it uses the same value as
+	 * IFF_DETACH_QUEUE.
+	 */
+	bool no_carrier = ifr->ifr_flags & IFF_NO_CARRIER;
+	ifr->ifr_flags &= ~IFF_NO_CARRIER;
+
 	if (tfile->detached)
 		return -EINVAL;
 
@@ -2828,7 +2834,10 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)
 		rcu_assign_pointer(tfile->tun, tun);
 	}
 
-	netif_carrier_on(tun->dev);
+	if (no_carrier)
+		netif_carrier_off(tun->dev);
+	else
+		netif_carrier_on(tun->dev);
 
 	/* Make sure persistent devices do not get stuck in
 	 * xoff state.
@@ -3056,8 +3065,8 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd,
 		 * This is needed because we never checked for invalid flags on
 		 * TUNSETIFF.
 		 */
-		return put_user(IFF_TUN | IFF_TAP | TUN_FEATURES,
-				(unsigned int __user*)argp);
+		return put_user(IFF_TUN | IFF_TAP | IFF_NO_CARRIER |
+				TUN_FEATURES, (unsigned int __user*)argp);
 	} else if (cmd == TUNSETQUEUE) {
 		return tun_set_queue(file, &ifr);
 	} else if (cmd == SIOCGSKNS) {
diff --git a/include/uapi/linux/if_tun.h b/include/uapi/linux/if_tun.h
index 2ec07de1d73b..12dde91957a5 100644
--- a/include/uapi/linux/if_tun.h
+++ b/include/uapi/linux/if_tun.h
@@ -75,6 +75,8 @@
 #define IFF_MULTI_QUEUE 0x0100
 #define IFF_ATTACH_QUEUE 0x0200
 #define IFF_DETACH_QUEUE 0x0400
+/* Used in TUNSETIFF to bring up tun/tap without carrier */
+#define IFF_NO_CARRIER IFF_DETACH_QUEUE
 /* read-only flag */
 #define IFF_PERSIST	0x0800
 #define IFF_NOFILTER	0x1000
-- 
2.37.3.968.ga6b4b080e4-goog


^ permalink raw reply related	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2022-09-23 11:10 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-09-16 23:45 [PATCH] tun: support not enabling carrier in TUNSETIFF Patrick Rohr
2022-09-16 23:54 ` Maciej Żenczykowski
2022-09-19  6:52 ` Jason Wang
2022-09-19 17:18 ` Stephen Hemminger
2022-09-20  0:01   ` Maciej Żenczykowski
2022-09-20  1:44     ` Jason Wang
2022-09-20 15:36       ` Stephen Hemminger
2022-09-20 19:48         ` [PATCH v2] " Patrick Rohr
2022-09-20 21:47           ` Maciej Żenczykowski
2022-09-21  2:53           ` Jason Wang
2022-09-21  6:35           ` Nicolas Dichtel
2022-09-23 11:10           ` patchwork-bot+netdevbpf
2022-09-20  7:35 ` [PATCH] " Nicolas Dichtel
2022-09-21  7:08 ` [tun] a4d8f18ebc: ltp.ioctl03.fail kernel test robot
2022-09-21  7:48   ` [LTP] " Cyril Hrubis

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).