diff --git a/lib/if.h b/lib/if.h index 1e52020b640b..897f2be2398b 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 7ef3fa2e61f7..1cfcc84bd990 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 e49e8eac5ecd..b7a790382d30 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 2c7a079bf474..34e57088a791 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 6ed11f75f173..197a3c9d2dba 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)