From 2994b68e89abb9c37e83e0ac814437bef7e06fcc Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Tue, 20 Jun 2023 15:18:12 +0200 Subject: [PATCH] confd: follow-up to bridge support, support removing bridge ports Signed-off-by: Joachim Wiberg --- src/confd/src/confd/dagger.c | 2 +- src/confd/src/confd/ietf-interfaces.c | 72 ++++++++++++++++++--------- 2 files changed, 49 insertions(+), 25 deletions(-) diff --git a/src/confd/src/confd/dagger.c b/src/confd/src/confd/dagger.c index b47f0b68..0ab04bff 100644 --- a/src/confd/src/confd/dagger.c +++ b/src/confd/src/confd/dagger.c @@ -22,7 +22,7 @@ static FILE *dagger_fopen(struct dagger *d, int gen, const char *action, if (err) return NULL; - fp = fopenf("w", "%s/%d/action/%s/%s/%02u-%s", + fp = fopenf("a", "%s/%d/action/%s/%s/%02u-%s", d->path, gen, action, node, prio, script); if (!fp) return NULL; diff --git a/src/confd/src/confd/ietf-interfaces.c b/src/confd/src/confd/ietf-interfaces.c index 94c451c8..308ab7c9 100644 --- a/src/confd/src/confd/ietf-interfaces.c +++ b/src/confd/src/confd/ietf-interfaces.c @@ -576,6 +576,51 @@ static int netdag_gen_sysctl(struct dagger *net, return err; } +static int bridge_gen_ports(struct dagger *net, struct lyd_node *dif, struct lyd_node *cif, FILE *ip) +{ + struct lyd_node *node, *bridge; + struct lydx_diff brdiff; + const char *ifname; + int err = 0; + + node = lydx_get_descendant(lyd_child(dif), "bridge-port", NULL); + bridge = lydx_get_child(node, "bridge"); + if (!node || !bridge) + return 0; /* not a bridge port, skip */ + + ifname = lydx_get_cattr(cif, "name"); + + if (lydx_get_diff(bridge, &brdiff) && brdiff.old) { + FILE *prev; + + prev = dagger_fopen_current(net, "exit", brdiff.old, 60, "exit.ip"); + if (!prev) { + err = -EIO; + goto fail; + } + fprintf(prev, "link set %s nomaster\n", ifname); + fclose(prev); + } + + if (brdiff.new) { + FILE *next; + + next = dagger_fopen_next(net, "init", brdiff.new, 60, "init.ip"); + if (!next) { + err = -EIO; + goto fail; + } + fprintf(next, "link set %s master %s\n", ifname, brdiff.new); + fclose(next); + + err = dagger_add_dep(net, brdiff.new, ifname); + if (err) + return ERR_IFACE(cif, err, "Unable to add dep \"%s\" to %s", ifname, brdiff.new); + } +fail: + return err; +} + static int bridge_fwd_mask(struct lyd_node *cif) { struct lyd_node *node, *proto; @@ -740,27 +785,6 @@ static int netdag_gen_afspec_set(struct dagger *net, struct lyd_node *dif, return -ENOSYS; } -static int netdag_bridge_links(struct dagger *net, struct lyd_node *dif, - struct lyd_node *cif, FILE *ip) -{ - const char *ifname = lydx_get_cattr(cif, "name"); - struct lyd_node *node; - int err = 0; - - node = lydx_get_descendant(lyd_child(cif), "bridge-port", NULL); - if (node) { - const char *brname = lydx_get_cattr(node, "bridge"); - - fprintf(ip, " master %s", brname); - - err = dagger_add_dep(net, ifname, brname); - if (err) - return ERR_IFACE(cif, err, "Unable to add dep \"%s\" to %s", brname, ifname); - } - - return err; -} - static bool netdag_must_del(struct lyd_node *dif, struct lyd_node *cif) { const char *iftype = lydx_get_cattr(cif, "type"); @@ -866,12 +890,12 @@ static sr_error_t netdag_gen_iface(struct dagger *net, if (err) goto err_close_ip; - err = netdag_bridge_links(net, dif, cif, ip); + fputc('\n', ip); + + err = bridge_gen_ports(net, dif, cif, ip); if (err) goto err_close_ip; - fputc('\n', ip); - /* Set type specific attributes */ if (!fixed && op != LYDX_OP_CREATE) { err = netdag_gen_afspec_set(net, dif, cif, ip);