From: Christian Brauner Date: Fri, 27 Aug 2021 08:36:48 +0000 (+0200) Subject: network: port ipv6 routes to new list type X-Git-Tag: lxc-5.0.0~99^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6bf0c06bddb75f394c932beefd0c8d59275d5634;p=thirdparty%2Flxc.git network: port ipv6 routes to new list type Signed-off-by: Christian Brauner --- diff --git a/src/lxc/confile.c b/src/lxc/confile.c index 4ea679114..8aad86d16 100644 --- a/src/lxc/confile.c +++ b/src/lxc/confile.c @@ -413,7 +413,7 @@ static int set_config_net_type(const char *key, const char *value, if (strequal(value, "veth")) { netdev->type = LXC_NET_VETH; INIT_LIST_HEAD(&netdev->priv.veth_attr.ipv4_routes); - lxc_list_init(&netdev->priv.veth_attr.ipv6_routes); + INIT_LIST_HEAD(&netdev->priv.veth_attr.ipv6_routes); lxc_list_init(&netdev->priv.veth_attr.vlan_tagged_ids); if (!lxc_veth_flag_to_mode(netdev->priv.veth_attr.mode)) lxc_veth_mode_to_flag(&netdev->priv.veth_attr.mode, "bridge"); @@ -1034,7 +1034,6 @@ static int set_config_net_veth_ipv6_route(const char *key, const char *value, { __do_free char *valdup = NULL; __do_free struct lxc_inet6dev *inet6dev = NULL; - __do_free struct lxc_list *list = NULL; int ret; char *netmask, *slash; struct lxc_netdev *netdev = data; @@ -1052,10 +1051,6 @@ static int set_config_net_veth_ipv6_route(const char *key, const char *value, if (!inet6dev) return ret_errno(ENOMEM); - list = lxc_list_new(); - if (!list) - return ret_errno(ENOMEM); - valdup = strdup(value); if (!valdup) return ret_errno(ENOMEM); @@ -1079,10 +1074,8 @@ static int set_config_net_veth_ipv6_route(const char *key, const char *value, if (!ret || ret < 0) return ret_errno(EINVAL); - list->elem = inet6dev; - lxc_list_add_tail(&netdev->priv.veth_attr.ipv6_routes, list); + list_add_tail(&inet6dev->head, &netdev->priv.veth_attr.ipv6_routes); move_ptr(inet6dev); - move_ptr(list); return 0; } @@ -5775,7 +5768,7 @@ static int clr_config_net_veth_ipv6_route(const char *key, struct lxc_conf *lxc_conf, void *data) { struct lxc_netdev *netdev = data; - struct lxc_list *cur, *next; + struct lxc_inet6dev *inet6dev, *ninet6dev; if (!netdev) return ret_errno(EINVAL); @@ -5783,10 +5776,9 @@ static int clr_config_net_veth_ipv6_route(const char *key, if (netdev->type != LXC_NET_VETH) return 0; - lxc_list_for_each_safe(cur, &netdev->priv.veth_attr.ipv6_routes, next) { - lxc_list_del(cur); - free(cur->elem); - free(cur); + list_for_each_entry_safe(inet6dev, ninet6dev, &netdev->priv.veth_attr.ipv6_routes, head) { + list_del(&inet6dev->head); + free(inet6dev); } return 0; @@ -6402,7 +6394,7 @@ static int get_config_net_veth_ipv6_route(const char *key, char *retv, int inlen int len; size_t listlen; char buf[INET6_ADDRSTRLEN]; - struct lxc_list *it; + struct lxc_inet6dev *inet6dev; int fulllen = 0; struct lxc_netdev *netdev = data; @@ -6417,13 +6409,11 @@ static int get_config_net_veth_ipv6_route(const char *key, char *retv, int inlen else memset(retv, 0, inlen); - listlen = lxc_list_len(&netdev->priv.veth_attr.ipv6_routes); - - lxc_list_for_each(it, &netdev->priv.veth_attr.ipv6_routes) { - struct lxc_inet6dev *i = it->elem; - if (!inet_ntop(AF_INET6, &i->addr, buf, sizeof(buf))) + listlen = list_len(&netdev->priv.veth_attr.ipv6_routes); + list_for_each_entry(inet6dev, &netdev->priv.veth_attr.ipv6_routes, head) { + if (!inet_ntop(AF_INET6, &inet6dev->addr, buf, sizeof(buf))) return -errno; - strprint(retv, inlen, "%s/%u%s", buf, i->prefix, + strprint(retv, inlen, "%s/%u%s", buf, inet6dev->prefix, (listlen-- > 1) ? "\n" : ""); } diff --git a/src/lxc/confile_utils.c b/src/lxc/confile_utils.c index ac05a8e16..fff20375c 100644 --- a/src/lxc/confile_utils.c +++ b/src/lxc/confile_utils.c @@ -377,8 +377,7 @@ void lxc_log_configured_netdevs(const struct lxc_conf *conf) TRACE("ipv4 veth route: %s/%u", bufinet4, inet4dev->prefix); } - lxc_list_for_each_safe(cur, &netdev->priv.veth_attr.ipv6_routes, next) { - inet6dev = cur->elem; + list_for_each_entry(inet6dev, &netdev->priv.veth_attr.ipv6_routes, head) { if (!inet_ntop(AF_INET6, &inet6dev->addr, bufinet6, sizeof(bufinet6))) { ERROR("Invalid ipv6 veth route"); return; @@ -427,10 +426,9 @@ void lxc_clear_netdev(struct lxc_netdev *netdev) free(inetdev); } - lxc_list_for_each_safe(cur, &netdev->priv.veth_attr.ipv6_routes, next) { - lxc_list_del(cur); - free(cur->elem); - free(cur); + list_for_each_entry_safe(inet6dev, ninet6dev, &netdev->priv.veth_attr.ipv6_routes, head) { + list_del(&inet6dev->head); + free(inet6dev); } lxc_list_for_each_safe(cur, &netdev->priv.veth_attr.vlan_tagged_ids, next) { diff --git a/src/lxc/network.c b/src/lxc/network.c index 71f5cdcbd..15ed81bd5 100644 --- a/src/lxc/network.c +++ b/src/lxc/network.c @@ -199,14 +199,13 @@ static int setup_ipv4_routes(struct lxc_netdev *netdev) return 0; } -static int lxc_setup_ipv6_routes(struct lxc_list *ip, int ifindex) +static int setup_ipv6_routes(struct lxc_netdev *netdev) { - struct lxc_list *iterator; int err; + struct lxc_inet6dev *inet6dev; + int ifindex = netdev->priv.veth_attr.ifindex; - lxc_list_for_each(iterator, ip) { - struct lxc_inet6dev *inet6dev = iterator->elem; - + list_for_each_entry(inet6dev, &netdev->priv.veth_attr.ipv6_routes, head) { err = lxc_ipv6_dest_add(ifindex, &inet6dev->addr, inet6dev->prefix); if (err) return log_error_errno(-1, -err, "Failed to setup ipv6 route for network device with ifindex %d", ifindex); @@ -752,7 +751,7 @@ static int netdev_configure_server_veth(struct lxc_handler *handler, struct lxc_ } /* setup ipv6 routes on the host interface */ - if (lxc_setup_ipv6_routes(&netdev->priv.veth_attr.ipv6_routes, netdev->priv.veth_attr.ifindex)) { + if (setup_ipv6_routes(netdev)) { ERROR("Failed to setup ipv6 routes for network device \"%s\"", veth1); goto out_delete; } diff --git a/src/lxc/network.h b/src/lxc/network.h index f8cec79fc..2b5c0901c 100644 --- a/src/lxc/network.h +++ b/src/lxc/network.h @@ -57,10 +57,6 @@ struct lxc_inet6dev { struct list_head head; }; -struct lxc_route6 { - struct in6_addr addr; -}; - /* Contains information about the host side veth device. * @pair : Name of the host side veth device. * If the user requested that the host veth device be created with a @@ -77,7 +73,7 @@ struct ifla_veth { char veth1[IFNAMSIZ]; int ifindex; struct list_head ipv4_routes; - struct lxc_list ipv6_routes; + struct list_head ipv6_routes; int mode; /* bridge, router */ short vlan_id; bool vlan_id_set;