MINOR: quic: Add "no-quic" global option

Add "no-quic" to "global" section to disable the use of QUIC transport protocol
by all configured QUIC listeners. This is listeners with QUIC addresses on their
"bind" lines. Internally, the socket addresses binding is skipped by
protocol_bind_all() for receivers with <proto_quic4> or <proto_quic6> as
protocol (see protocol struct).
Add information about "no-quic" global option to the documentation.

Must be backported to 2.7.
diff --git a/doc/configuration.txt b/doc/configuration.txt
index 7ee08ac..9bd2627 100644
--- a/doc/configuration.txt
+++ b/doc/configuration.txt
@@ -1982,6 +1982,14 @@
   Otherwise, this value defaults to 1. The default value is reported in the
   output of "haproxy -vv".
 
+no-quic
+  Warning: QUIC support in HAProxy is currently experimental. Configuration may
+  change without deprecation in the future.
+
+  Disable QUIC transport protocol. All the QUIC listeners will still be created.
+  But they will not bind their addresses. Hence, no QUIC traffic will be
+  processed by haproxy. See also "quic_enabled" sample fetch.
+
 numa-cpu-mapping
   If running on a NUMA-aware platform, HAProxy inspects on startup the CPU
   topology of the machine. If a multi-socket machine is detected, the affinity
diff --git a/include/haproxy/global-t.h b/include/haproxy/global-t.h
index dec16a2..9b56797 100644
--- a/include/haproxy/global-t.h
+++ b/include/haproxy/global-t.h
@@ -79,6 +79,7 @@
 #define GTUNE_DISABLE_ACTIVE_CLOSE (1<<22)
 #define GTUNE_QUICK_EXIT         (1<<23)
 #define GTUNE_QUIC_SOCK_PER_CONN (1<<24)
+#define GTUNE_NO_QUIC            (1<<25)
 
 /* SSL server verify mode */
 enum {
diff --git a/src/cfgparse-global.c b/src/cfgparse-global.c
index 6cc4afe..3f4c877 100644
--- a/src/cfgparse-global.c
+++ b/src/cfgparse-global.c
@@ -45,7 +45,7 @@
 	"log-tag", "spread-checks", "max-spread-checks", "cpu-map", "setenv",
 	"presetenv", "unsetenv", "resetenv", "strict-limits", "localpeer",
 	"numa-cpu-mapping", "defaults", "listen", "frontend", "backend",
-	"peers", "resolvers", "cluster-secret",
+	"peers", "resolvers", "cluster-secret", "no-quic",
 	NULL /* must be last */
 };
 
@@ -111,6 +111,12 @@
 			goto out;
 		global.tune.options &= ~GTUNE_USE_POLL;
 	}
+	else if (strcmp(args[0], "no-quic") == 0) {
+		if (alertif_too_many_args(0, file, linenum, args, &err_code))
+			goto out;
+
+		global.tune.options |= GTUNE_NO_QUIC;
+	}
 	else if (strcmp(args[0], "busy-polling") == 0) { /* "no busy-polling" or "busy-polling" */
 		if (alertif_too_many_args(0, file, linenum, args, &err_code))
 			goto out;
diff --git a/src/protocol.c b/src/protocol.c
index 03f7085..cafaa72 100644
--- a/src/protocol.c
+++ b/src/protocol.c
@@ -15,8 +15,10 @@
 
 #include <haproxy/api.h>
 #include <haproxy/errors.h>
+#include <haproxy/global.h>
 #include <haproxy/list.h>
 #include <haproxy/listener.h>
+#include <haproxy/proto_quic.h>
 #include <haproxy/protocol.h>
 #include <haproxy/proxy.h>
 #include <haproxy/tools.h>
@@ -75,6 +77,11 @@
 	HA_SPIN_LOCK(PROTO_LOCK, &proto_lock);
 	list_for_each_entry(proto, &protocols, list) {
 		list_for_each_entry(receiver, &proto->receivers, proto_list) {
+#ifdef USE_QUIC
+			if ((global.tune.options & GTUNE_NO_QUIC) &&
+			    (proto == &proto_quic4 || proto == &proto_quic6))
+				continue;
+#endif
 			listener = LIST_ELEM(receiver, struct listener *, rx);
 
 			lerr = proto->fam->bind(receiver, &errmsg);