mirror of
https://git.proxmox.com/git/frr
synced 2025-04-28 15:58:16 +00:00
frr: add the dummy_as_loopback patch series, enable it by default
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>
This commit is contained in:
parent
13542661ab
commit
ecf591e581
125
debian/patches/pve/0004-zebra-add-ZEBRA_IF_DUMMY-flag-for-dummy-interfaces.patch
vendored
Normal file
125
debian/patches/pve/0004-zebra-add-ZEBRA_IF_DUMMY-flag-for-dummy-interfaces.patch
vendored
Normal file
@ -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)
|
||||
|
203
debian/patches/pve/0005-fabricd-add-option-to-treat-dummy-interfaces-as-loop.patch
vendored
Normal file
203
debian/patches/pve/0005-fabricd-add-option-to-treat-dummy-interfaces-as-loop.patch
vendored
Normal file
@ -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);
|
||||
|
26
debian/patches/pve/0006-fabricd-enable-dummy_as_loopback-option-per-default.patch
vendored
Normal file
26
debian/patches/pve/0006-fabricd-enable-dummy_as_loopback-option-per-default.patch
vendored
Normal file
@ -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"
|
||||
|
3
debian/patches/series
vendored
3
debian/patches/series
vendored
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user