summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabriel Goller <g.goller@proxmox.com>2025-02-25 10:13:34 +0100
committerGabriel Goller <g.goller@proxmox.com>2025-02-25 10:13:34 +0100
commit80e96712e47b024ed5973c738acfb056bcd08b61 (patch)
treee61b8a1796c928041be2b079dfc1d82e94ed3087
parent3f290c97e8325bd9db9363b60e4a42ba8bdca90b (diff)
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 Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
-rw-r--r--lib/if.h1
-rw-r--r--zebra/if_netlink.c3
-rw-r--r--zebra/interface.c7
-rw-r--r--zebra/interface.h6
-rw-r--r--zebra/zebra_nb_state.c3
5 files changed, 19 insertions, 1 deletions
diff --git a/lib/if.h b/lib/if.h
index 1e52020b64..897f2be239 100644
--- 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;
diff --git a/zebra/if_netlink.c b/zebra/if_netlink.c
index 7ef3fa2e61..1cfcc84bd9 100644
--- a/zebra/if_netlink.c
+++ b/zebra/if_netlink.c
@@ -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;
}
}
diff --git a/zebra/interface.c b/zebra/interface.c
index e49e8eac5e..b7a790382d 100644
--- a/zebra/interface.c
+++ b/zebra/interface.c
@@ -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";
}
diff --git a/zebra/interface.h b/zebra/interface.h
index 2c7a079bf4..34e57088a7 100644
--- a/zebra/interface.h
+++ b/zebra/interface.h
@@ -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)
diff --git a/zebra/zebra_nb_state.c b/zebra/zebra_nb_state.c
index 6ed11f75f1..197a3c9d2d 100644
--- a/zebra/zebra_nb_state.c
+++ b/zebra/zebra_nb_state.c
@@ -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)