diff --git a/src/confd/src/dagger.c b/src/confd/src/dagger.c index a1ee3f1b..36213b8a 100644 --- a/src/confd/src/dagger.c +++ b/src/confd/src/dagger.c @@ -136,6 +136,11 @@ void dagger_skip_iface(struct dagger *d, const char *ifname) touchf("%s/%d/skip/%s", d->path, d->next, ifname); } +void dagger_skip_current_iface(struct dagger *d, const char *ifname) +{ + touchf("%s/%d/skip/%s", d->path, d->current, ifname); +} + int dagger_should_skip(struct dagger *d, const char *ifname) { return fexistf("%s/%d/skip/%s", d->path, d->next, ifname); diff --git a/src/confd/src/dagger.h b/src/confd/src/dagger.h index 35d39079..a646de63 100644 --- a/src/confd/src/dagger.h +++ b/src/confd/src/dagger.h @@ -28,6 +28,7 @@ int dagger_evolve(struct dagger *d); int dagger_evolve_or_abandon(struct dagger *d); void dagger_skip_iface(struct dagger *d, const char *ifname); +void dagger_skip_current_iface(struct dagger *d, const char *ifname); int dagger_should_skip(struct dagger *d, const char *ifname); int dagger_should_skip_current(struct dagger *d, const char *ifname); int dagger_is_bootstrap(struct dagger *d); diff --git a/src/confd/src/ietf-interfaces.c b/src/confd/src/ietf-interfaces.c index 56392f56..750267bd 100644 --- a/src/confd/src/ietf-interfaces.c +++ b/src/confd/src/ietf-interfaces.c @@ -1648,6 +1648,7 @@ static int netdag_gen_iface_del(struct dagger *net, struct lyd_node *dif, struct lyd_node *cif, bool fixed) { const char *ifname = lydx_get_cattr(dif, "name"); + const char *iftype = lydx_get_cattr(dif, "type"); FILE *ip; DEBUG_IFACE(dif, ""); @@ -1656,6 +1657,21 @@ static int netdag_gen_iface_del(struct dagger *net, struct lyd_node *dif, if (dagger_should_skip_current(net, ifname)) return 0; + if (!strcmp(iftype, "infix-if-type:veth")) { + struct lyd_node *node; + const char *peer; + + node = lydx_get_descendant(lyd_child(dif), "veth", NULL); + if (!node) + return -EINVAL; + + peer = lydx_get_cattr(node, "peer"); + if (!peer) + return -EINVAL; + + dagger_skip_current_iface(net, peer); + } + ip = dagger_fopen_current(net, "exit", ifname, 50, "exit.ip"); if (!ip) return -EIO;