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.gol...@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.gol...@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.gol...@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.gol...@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.gol...@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.gol...@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.gol...@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