]> git.puffer.fish Git - matthieu/frr.git/commitdiff
zebra: add ZEBRA_IF_DUMMY flag for dummy interfaces
authorGabriel Goller <g.goller@proxmox.com>
Tue, 25 Feb 2025 09:13:34 +0000 (10:13 +0100)
committerGabriel Goller <g.goller@proxmox.com>
Tue, 25 Feb 2025 09:13:34 +0000 (10:13 +0100)
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

Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
lib/if.h
zebra/if_netlink.c
zebra/interface.c
zebra/interface.h
zebra/zebra_nb_state.c

index 1e52020b640b6374dbd508455123005b0ee7619d..897f2be2398bf2d35b3b41710d276941212a98e5 100644 (file)
--- a/lib/if.h
+++ b/lib/if.h
@@ -242,6 +242,7 @@ struct interface {
 #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 7ef3fa2e61f7495f6808fc6b053768fbe7866f2a..1cfcc84bd990cc76293d96c5786d395c3f9226b6 100644 (file)
@@ -221,6 +221,8 @@ static void netlink_determine_zebra_iftype(const char *kind,
                *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 @@ static void netlink_interface_update_l2info(struct zebra_dplane_ctx *ctx,
        case ZEBRA_IF_MACVLAN:
        case ZEBRA_IF_VETH:
        case ZEBRA_IF_BOND:
+       case ZEBRA_IF_DUMMY:
                break;
        }
 }
index e49e8eac5ecd981a3db9a8c2c75312a13b902d7f..b7a790382d30cc028d890ff3b2cfc0eaba9119c7 100644 (file)
@@ -548,6 +548,9 @@ void if_add_update(struct interface *ifp)
 
        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);
 
@@ -1616,6 +1619,7 @@ static void interface_update_l2info(struct zebra_dplane_ctx *ctx,
        case ZEBRA_IF_MACVLAN:
        case ZEBRA_IF_VETH:
        case ZEBRA_IF_BOND:
+       case ZEBRA_IF_DUMMY:
                break;
        }
 }
@@ -2369,6 +2373,9 @@ static const char *zebra_ziftype_2str(enum zebra_iftype zif_type)
        case ZEBRA_IF_GRE:
                return "GRE";
 
+       case ZEBRA_IF_DUMMY:
+               return "dummy";
+
        default:
                return "Unknown";
        }
index 2c7a079bf474cf05060be84ed87a8526d6eccd25..34e57088a79146b4363d66d94362c2d9501887da 100644 (file)
@@ -39,7 +39,8 @@ enum zebra_iftype {
        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 @@ DECLARE_HOOK(zebra_if_extra_info, (struct vty * vty, struct interface *ifp),
 #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 6ed11f75f17308a3ada2f1d2c3f73c9fe4735e2c..197a3c9d2dba8ad7fa867c1fcaef7742a6e91155 100644 (file)
@@ -87,6 +87,9 @@ lib_interface_zebra_state_zif_type_get_elem(struct nb_cb_get_elem_args *args)
        case ZEBRA_IF_GRE:
                type = "frr-zebra:zif-gre";
                break;
+       case ZEBRA_IF_DUMMY:
+               type = "frr-zebra:zif-dummy";
+               break;
        }
 
        if (!type)