From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <pve-devel-bounces@lists.proxmox.com>
Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68])
	by lore.proxmox.com (Postfix) with ESMTPS id 0A26E1FF195
	for <inbox@lore.proxmox.com>; Fri,  7 Mar 2025 13:30:30 +0100 (CET)
Received: from firstgate.proxmox.com (localhost [127.0.0.1])
	by firstgate.proxmox.com (Proxmox) with ESMTP id CE5181AA93;
	Fri,  7 Mar 2025 13:30:24 +0100 (CET)
From: Gabriel Goller <g.goller@proxmox.com>
To: pve-devel@lists.proxmox.com
Date: Fri,  7 Mar 2025 13:29:44 +0100
Message-Id: <20250307122945.307426-3-g.goller@proxmox.com>
X-Mailer: git-send-email 2.39.5
In-Reply-To: <20250307122945.307426-1-g.goller@proxmox.com>
References: <20250307122945.307426-1-g.goller@proxmox.com>
MIME-Version: 1.0
X-SPAM-LEVEL: Spam detection results:  0
 AWL -0.429 Adjusted score from AWL reputation of From: address
 BAYES_00                 -1.9 Bayes spam probability is 0 to 1%
 DMARC_MISSING             0.1 Missing DMARC policy
 KAM_ASCII_DIVIDERS 0.8 Email that uses ascii formatting dividers and possible
 spam tricks
 KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment
 SPF_HELO_NONE           0.001 SPF: HELO does not publish an SPF Record
 SPF_PASS               -0.001 SPF: sender matches SPF record
Subject: [pve-devel] [PATCH 3/4] frr: add the dummy_as_loopback patch series,
 enable it by default
X-BeenThere: pve-devel@lists.proxmox.com
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: Proxmox VE development discussion <pve-devel.lists.proxmox.com>
List-Unsubscribe: <https://lists.proxmox.com/cgi-bin/mailman/options/pve-devel>, 
 <mailto:pve-devel-request@lists.proxmox.com?subject=unsubscribe>
List-Archive: <http://lists.proxmox.com/pipermail/pve-devel/>
List-Post: <mailto:pve-devel@lists.proxmox.com>
List-Help: <mailto:pve-devel-request@lists.proxmox.com?subject=help>
List-Subscribe: <https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel>, 
 <mailto:pve-devel-request@lists.proxmox.com?subject=subscribe>
Reply-To: Proxmox VE development discussion <pve-devel@lists.proxmox.com>
Cc: Thomas Lamprecht <t.lamprecht@proxmox.com>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: pve-devel-bounces@lists.proxmox.com
Sender: "pve-devel" <pve-devel-bounces@lists.proxmox.com>

Add the patches for the dummy_as_loopback series, which area already
merged upstream, but not yet released. Also enable it by default.

Link: https://github.com/FRRouting/frr/pull/18242
Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
---
 ...A_IF_DUMMY-flag-for-dummy-interfaces.patch | 125 +++++++++++
 ...on-to-treat-dummy-interfaces-as-loop.patch | 203 ++++++++++++++++++
 ...dummy_as_loopback-option-per-default.patch |  26 +++
 debian/patches/series                         |   3 +
 4 files changed, 357 insertions(+)
 create mode 100644 debian/patches/pve/0004-zebra-add-ZEBRA_IF_DUMMY-flag-for-dummy-interfaces.patch
 create mode 100644 debian/patches/pve/0005-fabricd-add-option-to-treat-dummy-interfaces-as-loop.patch
 create mode 100644 debian/patches/pve/0006-fabricd-enable-dummy_as_loopback-option-per-default.patch

diff --git a/debian/patches/pve/0004-zebra-add-ZEBRA_IF_DUMMY-flag-for-dummy-interfaces.patch b/debian/patches/pve/0004-zebra-add-ZEBRA_IF_DUMMY-flag-for-dummy-interfaces.patch
new file mode 100644
index 000000000000..e2acfcc82e5a
--- /dev/null
+++ b/debian/patches/pve/0004-zebra-add-ZEBRA_IF_DUMMY-flag-for-dummy-interfaces.patch
@@ -0,0 +1,125 @@
+From 7cf60fd0bdaa45311eea886cee6d1f290a4ac2d2 Mon Sep 17 00:00:00 2001
+From: Gabriel Goller <g.goller@proxmox.com>
+Date: Tue, 25 Feb 2025 10:13:34 +0100
+Subject: [PATCH 4/6] zebra: add ZEBRA_IF_DUMMY flag for dummy interfaces
+
+Introduce ZEBRA_IF_DUMMY interface flag to identify Linux dummy interfaces [0].
+These interfaces behave similarly to loopback interfaces and can be
+specially handled by daemons.
+
+[0]: https://github.com/torvalds/linux/blob/master/drivers/net/dummy.c
+
+Link: https://github.com/FRRouting/frr/pull/18242
+Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
+---
+ lib/if.h               | 1 +
+ zebra/if_netlink.c     | 3 +++
+ zebra/interface.c      | 7 +++++++
+ zebra/interface.h      | 6 +++++-
+ zebra/zebra_nb_state.c | 3 +++
+ 5 files changed, 19 insertions(+), 1 deletion(-)
+
+Index: b/lib/if.h
+===================================================================
+--- a/lib/if.h	2025-03-07 11:09:47.571424092 +0100
++++ b/lib/if.h	2025-03-07 11:09:47.568424088 +0100
+@@ -242,6 +242,7 @@
+ #define ZEBRA_INTERFACE_SUB        (1 << 1)
+ #define ZEBRA_INTERFACE_LINKDETECTION (1 << 2)
+ #define ZEBRA_INTERFACE_VRF_LOOPBACK (1 << 3)
++#define ZEBRA_INTERFACE_DUMMY (1 << 4)
+ 
+ 	/* Interface flags. */
+ 	uint64_t flags;
+Index: b/zebra/if_netlink.c
+===================================================================
+--- a/zebra/if_netlink.c	2025-03-07 11:09:47.571424092 +0100
++++ b/zebra/if_netlink.c	2025-03-07 11:09:47.568424088 +0100
+@@ -221,6 +221,8 @@
+ 		*zif_type = ZEBRA_IF_BOND;
+ 	else if (strcmp(kind, "gre") == 0)
+ 		*zif_type = ZEBRA_IF_GRE;
++	else if (strcmp(kind, "dummy") == 0)
++		*zif_type = ZEBRA_IF_DUMMY;
+ }
+ 
+ static void netlink_vrf_change(struct nlmsghdr *h, struct rtattr *tb,
+@@ -576,6 +578,7 @@
+ 	case ZEBRA_IF_MACVLAN:
+ 	case ZEBRA_IF_VETH:
+ 	case ZEBRA_IF_BOND:
++	case ZEBRA_IF_DUMMY:
+ 		break;
+ 	}
+ }
+Index: b/zebra/interface.c
+===================================================================
+--- a/zebra/interface.c	2025-03-07 11:09:47.571424092 +0100
++++ b/zebra/interface.c	2025-03-07 11:09:47.568424088 +0100
+@@ -584,6 +584,9 @@
+ 
+ 	zebra_interface_add_update(ifp);
+ 
++	if (IS_ZEBRA_IF_DUMMY(ifp))
++		SET_FLAG(ifp->status, ZEBRA_INTERFACE_DUMMY);
++
+ 	if (!CHECK_FLAG(ifp->status, ZEBRA_INTERFACE_ACTIVE)) {
+ 		SET_FLAG(ifp->status, ZEBRA_INTERFACE_ACTIVE);
+ 
+@@ -1646,6 +1649,7 @@
+ 	case ZEBRA_IF_MACVLAN:
+ 	case ZEBRA_IF_VETH:
+ 	case ZEBRA_IF_BOND:
++	case ZEBRA_IF_DUMMY:
+ 		break;
+ 	}
+ }
+@@ -2398,6 +2402,9 @@
+ 	case ZEBRA_IF_GRE:
+ 		return "GRE";
+ 
++	case ZEBRA_IF_DUMMY:
++		return "dummy";
++
+ 	default:
+ 		return "Unknown";
+ 	}
+Index: b/zebra/interface.h
+===================================================================
+--- a/zebra/interface.h	2025-03-07 11:09:47.571424092 +0100
++++ b/zebra/interface.h	2025-03-07 11:09:47.569424090 +0100
+@@ -39,7 +39,8 @@
+ 	ZEBRA_IF_MACVLAN,   /* MAC VLAN interface*/
+ 	ZEBRA_IF_VETH,      /* VETH interface*/
+ 	ZEBRA_IF_BOND,	    /* Bond */
+-	ZEBRA_IF_GRE,      /* GRE interface */
++	ZEBRA_IF_GRE,       /* GRE interface */
++	ZEBRA_IF_DUMMY,     /* Dummy interface */
+ };
+ 
+ /* Zebra "slave" interface type */
+@@ -246,6 +247,9 @@
+ #define IS_ZEBRA_IF_GRE(ifp)                                               \
+ 	(((struct zebra_if *)(ifp->info))->zif_type == ZEBRA_IF_GRE)
+ 
++#define IS_ZEBRA_IF_DUMMY(ifp)                                               \
++	(((struct zebra_if *)(ifp->info))->zif_type == ZEBRA_IF_DUMMY)
++
+ #define IS_ZEBRA_IF_BRIDGE_SLAVE(ifp)					\
+ 	(((struct zebra_if *)(ifp->info))->zif_slave_type                      \
+ 	 == ZEBRA_IF_SLAVE_BRIDGE)
+Index: b/zebra/zebra_nb_state.c
+===================================================================
+--- a/zebra/zebra_nb_state.c	2025-03-07 11:09:47.571424092 +0100
++++ b/zebra/zebra_nb_state.c	2025-03-07 11:09:47.569424090 +0100
+@@ -87,6 +87,9 @@
+ 	case ZEBRA_IF_GRE:
+ 		type = "frr-zebra:zif-gre";
+ 		break;
++	case ZEBRA_IF_DUMMY:
++		type = "frr-zebra:zif-dummy";
++		break;
+ 	}
+ 
+ 	if (!type)
+
diff --git a/debian/patches/pve/0005-fabricd-add-option-to-treat-dummy-interfaces-as-loop.patch b/debian/patches/pve/0005-fabricd-add-option-to-treat-dummy-interfaces-as-loop.patch
new file mode 100644
index 000000000000..331beed378ec
--- /dev/null
+++ b/debian/patches/pve/0005-fabricd-add-option-to-treat-dummy-interfaces-as-loop.patch
@@ -0,0 +1,203 @@
+From 99aab947f7b89b31f08ba9ccf755ff60af9005a8 Mon Sep 17 00:00:00 2001
+From: Gabriel Goller <g.goller@proxmox.com>
+Date: Tue, 25 Feb 2025 10:24:58 +0100
+Subject: [PATCH 5/6] fabricd: add option to treat dummy interfaces as loopback
+ interfaces
+
+Enable dummy-interfaces to be used as router-id interfaces in openfabric
+networks. This allows multiple openfabric routers with different
+router-ids on a single node when using IP unnumbered setup (interfaces
+without IPs configured). Previously we were limited by having a single
+loopback interface, allowing only one openfabric router per node.
+
+Link: https://github.com/FRRouting/frr/pull/18242
+Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
+---
+ doc/manpages/frr-fabricd.rst |  4 ++++
+ doc/user/fabricd.rst         | 17 ++++++++++++-----
+ isisd/isis_circuit.c         |  9 +++++----
+ isisd/isis_main.c            | 16 +++++++++++++---
+ isisd/isisd.c                | 19 +++++++++++++++++++
+ isisd/isisd.h                |  4 ++++
+ 6 files changed, 57 insertions(+), 12 deletions(-)
+
+Index: b/doc/manpages/frr-fabricd.rst
+===================================================================
+--- a/doc/manpages/frr-fabricd.rst	2025-03-07 11:09:47.700424235 +0100
++++ b/doc/manpages/frr-fabricd.rst	2025-03-07 11:09:47.698424233 +0100
+@@ -21,6 +21,10 @@
+ 
+ .. include:: common-options.rst
+ 
++.. option:: --dummy_as_loopback
++
++   Treat dummy interfaces as loopback interfaces.
++
+ FILES
+ =====
+ 
+Index: b/doc/user/fabricd.rst
+===================================================================
+--- a/doc/user/fabricd.rst	2025-03-07 11:09:47.700424235 +0100
++++ b/doc/user/fabricd.rst	2025-03-07 11:09:47.698424233 +0100
+@@ -15,11 +15,18 @@
+ Configuring fabricd
+ ===================
+ 
+-There are no *fabricd* specific options. Common options can be specified
+-(:ref:`common-invocation-options`) to *fabricd*. *fabricd* needs to acquire
+-interface information from *zebra* in order to function. Therefore *zebra* must
+-be running before invoking *fabricd*. Also, if *zebra* is restarted then *fabricd*
+-must be too.
++*fabricd* accepts all common invocations (:ref:`common-invocation-options`) and
++the following specific options.
++
++.. program:: fabricd
++
++.. option:: --dummy_as_loopback
++
++   Treat dummy interfaces as loopback interfaces.
++
++*fabricd* needs to acquire interface information from *zebra* in order to
++function. Therefore *zebra* must be running before invoking *fabricd*. Also, if
++*zebra* is restarted then *fabricd* must be too.
+ 
+ Like other daemons, *fabricd* configuration is done in an OpenFabric specific
+ configuration file :file:`fabricd.conf`.
+Index: b/isisd/isis_circuit.c
+===================================================================
+--- a/isisd/isis_circuit.c	2025-03-07 11:09:47.700424235 +0100
++++ b/isisd/isis_circuit.c	2025-03-07 11:09:47.698424233 +0100
+@@ -491,16 +491,17 @@
+ {
+ 	struct connected *conn;
+ 
+-	if (if_is_broadcast(ifp)) {
++	if (if_is_loopback(ifp) || (isis_option_check(ISIS_OPT_DUMMY_AS_LOOPBACK) &&
++				    CHECK_FLAG(ifp->status, ZEBRA_INTERFACE_DUMMY))) {
++		circuit->circ_type = CIRCUIT_T_LOOPBACK;
++		circuit->is_passive = 1;
++	} else if (if_is_broadcast(ifp)) {
+ 		if (fabricd || circuit->circ_type_config == CIRCUIT_T_P2P)
+ 			circuit->circ_type = CIRCUIT_T_P2P;
+ 		else
+ 			circuit->circ_type = CIRCUIT_T_BROADCAST;
+ 	} else if (if_is_pointopoint(ifp)) {
+ 		circuit->circ_type = CIRCUIT_T_P2P;
+-	} else if (if_is_loopback(ifp)) {
+-		circuit->circ_type = CIRCUIT_T_LOOPBACK;
+-		circuit->is_passive = 1;
+ 	} else {
+ 		/* It's normal in case of loopback etc. */
+ 		if (IS_DEBUG_EVENTS)
+Index: b/isisd/isis_main.c
+===================================================================
+--- a/isisd/isis_main.c	2025-03-07 11:09:47.700424235 +0100
++++ b/isisd/isis_main.c	2025-03-07 11:09:47.698424233 +0100
+@@ -80,9 +80,12 @@
+ 	.cap_num_p = array_size(_caps_p),
+ 	.cap_num_i = 0};
+ 
++#define OPTION_DUMMY_AS_LOOPBACK 2000
++
+ /* isisd options */
+ static const struct option longopts[] = {
+ 	{"int_num", required_argument, NULL, 'I'},
++	{"dummy_as_loopback", no_argument, NULL, OPTION_DUMMY_AS_LOOPBACK},
+ 	{0}};
+ 
+ /* Master of threads. */
+@@ -269,15 +272,16 @@
+ {
+ 	int opt;
+ 	int instance = 1;
++	bool dummy_as_loopback = false;
+ 
+ #ifdef FABRICD
+ 	frr_preinit(&fabricd_di, argc, argv);
+ #else
+ 	frr_preinit(&isisd_di, argc, argv);
+ #endif
+-	frr_opt_add(
+-		"I:", longopts,
+-		"  -I, --int_num      Set instance number (label-manager)\n");
++	frr_opt_add("I:", longopts,
++		"  -I, --int_num		Set instance number (label-manager).\n"
++		"      --dummy_as_loopback      Treat dummy interfaces like loopback interfaces.\n");
+ 
+ 	/* Command line argument treatment. */
+ 	while (1) {
+@@ -295,6 +299,9 @@
+ 				zlog_err("Instance %i out of range (1..%u)",
+ 					 instance, (unsigned short)-1);
+ 			break;
++		case OPTION_DUMMY_AS_LOOPBACK:
++			dummy_as_loopback = true;
++			break;
+ 		default:
+ 			frr_help_exit(1);
+ 		}
+@@ -311,6 +318,9 @@
+ 	/* thread master */
+ 	isis_master_init(frr_init());
+ 	master = im->master;
++	if (dummy_as_loopback)
++		isis_option_set(ISIS_OPT_DUMMY_AS_LOOPBACK);
++
+ 	/*
+ 	 *  initializations
+ 	 */
+Index: b/isisd/isisd.c
+===================================================================
+--- a/isisd/isisd.c	2025-03-07 11:09:47.700424235 +0100
++++ b/isisd/isisd.c	2025-03-07 11:09:47.698424233 +0100
+@@ -116,6 +116,25 @@
+ int clear_isis_neighbor_common(struct vty *, const char *id,
+ 			       const char *vrf_name, bool all_vrf);
+ 
++
++/* ISIS global flag manipulation.  */
++int isis_option_set(int flag)
++{
++	switch (flag) {
++	case ISIS_OPT_DUMMY_AS_LOOPBACK:
++		SET_FLAG(im->options, flag);
++		break;
++	default:
++		return -1;
++	}
++	return 0;
++}
++
++int isis_option_check(int flag)
++{
++	return CHECK_FLAG(im->options, flag);
++}
++
+ /* Link ISIS instance to VRF. */
+ void isis_vrf_link(struct isis *isis, struct vrf *vrf)
+ {
+Index: b/isisd/isisd.h
+===================================================================
+--- a/isisd/isisd.h	2025-03-07 11:09:47.700424235 +0100
++++ b/isisd/isisd.h	2025-03-07 11:09:47.698424233 +0100
+@@ -74,7 +74,9 @@
+ 	struct list *isis;
+ 	/* ISIS thread master. */
+ 	struct event_loop *master;
++	/* Various global options */
+ 	uint8_t options;
++#define ISIS_OPT_DUMMY_AS_LOOPBACK (1 << 0)
+ };
+ #define F_ISIS_UNIT_TEST 0x01
+ 
+@@ -269,6 +271,8 @@
+ void isis_terminate(void);
+ void isis_master_init(struct event_loop *master);
+ void isis_master_terminate(void);
++int isis_option_set(int flag);
++int isis_option_check(int flag);
+ void isis_vrf_link(struct isis *isis, struct vrf *vrf);
+ void isis_vrf_unlink(struct isis *isis, struct vrf *vrf);
+ struct isis *isis_lookup_by_vrfid(vrf_id_t vrf_id);
+
diff --git a/debian/patches/pve/0006-fabricd-enable-dummy_as_loopback-option-per-default.patch b/debian/patches/pve/0006-fabricd-enable-dummy_as_loopback-option-per-default.patch
new file mode 100644
index 000000000000..f7d8ee07225e
--- /dev/null
+++ b/debian/patches/pve/0006-fabricd-enable-dummy_as_loopback-option-per-default.patch
@@ -0,0 +1,26 @@
+From d1fecf9795c0b9df3889760e1f08bf93c5c8a933 Mon Sep 17 00:00:00 2001
+From: Gabriel Goller <g.goller@proxmox.com>
+Date: Thu, 6 Mar 2025 13:27:55 +0100
+Subject: [PATCH 6/6] fabricd: enable dummy_as_loopback option per default
+
+This allows dummy interfaces to be treated as loopback interfaces in
+openfabric fabrics.
+
+Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
+---
+ tools/etc/frr/daemons | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+Index: b/tools/etc/frr/daemons
+===================================================================
+--- a/tools/etc/frr/daemons	2025-03-07 11:09:47.835424384 +0100
++++ b/tools/etc/frr/daemons	2025-03-07 11:09:47.833424382 +0100
+@@ -57,7 +57,7 @@
+ pbrd_options="   -A 127.0.0.1"
+ staticd_options="-A 127.0.0.1"
+ bfdd_options="   -A 127.0.0.1"
+-fabricd_options="-A 127.0.0.1"
++fabricd_options="-A 127.0.0.1 --dummy_as_loopback"
+ vrrpd_options="  -A 127.0.0.1"
+ pathd_options="  -A 127.0.0.1"
+ 
diff --git a/debian/patches/series b/debian/patches/series
index f3edeff1f445..c59ef31dfe6c 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,3 +1,6 @@
 pve/0001-enable-bgp-bfd-daemons.patch
 pve/0002-bgpd-add-an-option-for-RT-auto-derivation-to-force-A.patch
 pve/0003-tests-add-bgp-evpn-autort-test.patch
+pve/0004-zebra-add-ZEBRA_IF_DUMMY-flag-for-dummy-interfaces.patch
+pve/0005-fabricd-add-option-to-treat-dummy-interfaces-as-loop.patch
+pve/0006-fabricd-enable-dummy_as_loopback-option-per-default.patch
-- 
2.39.5



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel