mirror of
https://git.proxmox.com/git/frr
synced 2025-04-28 11:01:33 +00:00

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>
204 lines
6.5 KiB
Diff
204 lines
6.5 KiB
Diff
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);
|
|
|