all lists on lists.proxmox.com
 help / color / mirror / Atom feed
From: Gabriel Goller <g.goller@proxmox.com>
To: pve-devel@lists.proxmox.com
Cc: Thomas Lamprecht <t.lamprecht@proxmox.com>
Subject: [pve-devel] [PATCH 3/4] frr: add the dummy_as_loopback patch series, enable it by default
Date: Fri,  7 Mar 2025 13:29:44 +0100	[thread overview]
Message-ID: <20250307122945.307426-3-g.goller@proxmox.com> (raw)
In-Reply-To: <20250307122945.307426-1-g.goller@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


  parent reply	other threads:[~2025-03-07 12:30 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-03-07 12:29 [pve-devel] [PATCH 1/4] frr: bump from 8.5.2 to 10.2.1 Gabriel Goller
2025-03-07 12:29 ` [pve-devel] [PATCH 2/4] frr: port patches to latest stable version, add topotests Gabriel Goller
2025-03-07 12:29 ` Gabriel Goller [this message]
2025-03-07 12:29 ` [pve-devel] [PATCH 4/4] debian: update changelog Gabriel Goller
2025-03-07 12:31 ` [pve-devel] [PATCH 1/4] frr: bump from 8.5.2 to 10.2.1 Gabriel Goller
2025-03-11 10:56   ` DERUMIER, Alexandre via pve-devel
2025-03-11 13:27     ` Gabriel Goller
     [not found]   ` <b071a6e9d7e234a14eddabf4f7bd3ce1dbd6167c.camel@groupe-cyllene.com>
2025-03-11 14:11     ` Thomas Lamprecht
2025-03-11 16:16       ` DERUMIER, Alexandre via pve-devel
2025-03-07 14:06 ` [pve-devel] applied-series: " Thomas Lamprecht

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250307122945.307426-3-g.goller@proxmox.com \
    --to=g.goller@proxmox.com \
    --cc=pve-devel@lists.proxmox.com \
    --cc=t.lamprecht@proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal