{
__do_free char *valdup = NULL;
__do_free struct lxc_inet6dev *inet6dev = NULL;
- __do_free struct lxc_list *list = NULL;
int ret;
struct lxc_netdev *netdev = data;
char *slash, *netmask;
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);
if (!ret || ret < 0)
return log_error_errno(-EINVAL, EINVAL, "Invalid ipv6 address \"%s\"", valdup);
- list->elem = inet6dev;
- lxc_list_add_tail(&netdev->ipv6, list);
+ list_add_tail(&inet6dev->head, &netdev->ipv6_list);
move_ptr(inet6dev);
- move_ptr(list);
return 0;
}
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);
- lxc_list_for_each_safe(cur, &netdev->ipv6, next) {
- lxc_list_del(cur);
- free(cur->elem);
- free(cur);
+ list_for_each_entry_safe(inet6dev, ninet6dev, &netdev->ipv6_list, head) {
+ list_del(&inet6dev->head);
+ free(inet6dev);
}
return 0;
int len;
size_t listlen;
char buf[INET6_ADDRSTRLEN];
- struct lxc_list *it;
int fulllen = 0;
struct lxc_netdev *netdev = data;
+ struct lxc_inet6dev *inet6dev;
if (!netdev)
return ret_errno(EINVAL);
else
memset(retv, 0, inlen);
- listlen = lxc_list_len(&netdev->ipv6);
-
- lxc_list_for_each(it, &netdev->ipv6) {
- struct lxc_inet6dev *i = it->elem;
- if (!inet_ntop(AF_INET6, &i->addr, buf, sizeof(buf)))
+ listlen = list_len(&netdev->ipv6_list);
+ list_for_each_entry(inet6dev, &netdev->ipv6_list, 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" : "");
}
return ret_set_errno(NULL, ENOMEM);
INIT_LIST_HEAD(&netdev->ipv4_list);
- lxc_list_init(&netdev->ipv6);
+ INIT_LIST_HEAD(&netdev->ipv6_list);
/* give network a unique index */
netdev->idx = idx;
TRACE("ipv6 gateway: %s", bufinet6);
}
- lxc_list_for_each_safe(cur, &netdev->ipv6, next) {
- inet6dev = cur->elem;
+ list_for_each_entry(inet6dev, &netdev->ipv6_list, head) {
inet_ntop(AF_INET6, &inet6dev->addr, bufinet6,
sizeof(bufinet6));
TRACE("ipv6 addr: %s", bufinet6);
struct lxc_list *cur, *next;
struct list_head head;
struct lxc_inetdev *inetdev, *ninetdev;
+ struct lxc_inet6dev *inet6dev, *ninet6dev;
ssize_t idx;
if (!netdev)
}
free_disarm(netdev->ipv6_gateway);
- lxc_list_for_each_safe(cur, &netdev->ipv6, next) {
- lxc_list_del(cur);
- free(cur->elem);
- free(cur);
+ list_for_each_entry_safe(inet6dev, ninet6dev, &netdev->ipv6_list, head) {
+ list_del(&inet6dev->head);
+ free(inet6dev);
}
if (netdev->type == LXC_NET_VETH) {
memset(netdev, 0, sizeof(struct lxc_netdev));
netdev->head = head;
INIT_LIST_HEAD(&netdev->ipv4_list);
- lxc_list_init(&netdev->ipv6);
+ INIT_LIST_HEAD(&netdev->ipv6_list);
netdev->type = -1;
netdev->idx = idx;
}
return 0;
}
-static int setup_ipv6_addr_routes(struct lxc_list *ip, int ifindex)
+static int setup_ipv6_addr_routes(struct lxc_netdev *netdev)
{
- struct lxc_list *iterator;
int err;
+ struct lxc_inet6dev *inet6dev;
+ int ifindex;
- lxc_list_for_each(iterator, ip) {
- struct lxc_inet6dev *inet6dev = iterator->elem;
+ if (netdev->type != LXC_NET_VETH)
+ return ret_errno(EINVAL);
+
+ ifindex = netdev->priv.veth_attr.ifindex;
+ list_for_each_entry(inet6dev, &netdev->ipv6_list, head) {
err = lxc_ipv6_dest_add(ifindex, &inet6dev->addr, 128);
if (err)
}
/* setup ipv6 address routes on the host interface */
- err = setup_ipv6_addr_routes(&netdev->ipv6, netdev->priv.veth_attr.ifindex);
+ err = setup_ipv6_addr_routes(netdev);
if (err) {
SYSERROR("Failed to setup ip address routes for network device \"%s\"", veth1);
goto out_delete;
}
static int lxc_setup_l2proxy(struct lxc_netdev *netdev) {
- struct lxc_list *cur, *next;
struct lxc_inetdev *inet4dev;
struct lxc_inet6dev *inet6dev;
char bufinet4[INET_ADDRSTRLEN], bufinet6[INET6_ADDRSTRLEN];
}
/* If IPv6 addresses are specified, then check that sysctl is configured correctly. */
- if (!lxc_list_empty(&netdev->ipv6)) {
+ if (!list_empty(&netdev->ipv6_list)) {
/* Check for net.ipv6.conf.[link].proxy_ndp=1 */
if (lxc_is_ip_neigh_proxy_enabled(netdev->link, AF_INET6) < 0)
return log_error_errno(-1, EINVAL, "Requires sysctl net.ipv6.conf.%s.proxy_ndp=1", netdev->link);
}
}
- lxc_list_for_each_safe(cur, &netdev->ipv6, next) {
- inet6dev = cur->elem;
+ list_for_each_entry(inet6dev, &netdev->ipv6_list, head) {
if (!inet_ntop(AF_INET6, &inet6dev->addr, bufinet6, sizeof(bufinet6)))
return ret_set_errno(-1, -errno);
return 0;
}
-static int lxc_delete_l2proxy(struct lxc_netdev *netdev) {
+static int lxc_delete_l2proxy(struct lxc_netdev *netdev)
+{
unsigned int lo_ifindex = 0;
- unsigned int errCount = 0;
- struct lxc_list *cur, *next;
+ unsigned int err = 0;
struct lxc_inetdev *inet4dev;
struct lxc_inet6dev *inet6dev;
/* Retrieve local-loopback interface index for use with IPVLAN static routes. */
lo_ifindex = if_nametoindex(loop_device);
if (lo_ifindex == 0) {
- errCount++;
+ err++;
ERROR("Failed to retrieve ifindex for \"%s\" routing cleanup", loop_device);
}
}
list_for_each_entry(inet4dev, &netdev->ipv4_list, head) {
if (lxc_delete_ipv4_l2proxy(&inet4dev->addr, netdev->link, lo_ifindex) < 0)
- errCount++;
+ err++;
}
- lxc_list_for_each_safe(cur, &netdev->ipv6, next) {
- inet6dev = cur->elem;
+ list_for_each_entry(inet6dev, &netdev->ipv6_list, head) {
if (lxc_delete_ipv6_l2proxy(&inet6dev->addr, netdev->link, lo_ifindex) < 0)
- errCount++;
+ err++;
}
- if (errCount > 0)
- return ret_set_errno(-1, EINVAL);
+ if (err > 0)
+ return ret_errno(EINVAL);
return 0;
}
return 0;
}
-static int setup_ipv6_addr(struct lxc_list *ip, int ifindex)
+static int setup_ipv6_addr(struct lxc_netdev *netdev)
{
- struct lxc_list *iterator;
int err;
+ struct lxc_inet6dev *inet6dev;
+ int ifindex = netdev->ifindex;
- lxc_list_for_each(iterator, ip) {
- struct lxc_inet6dev *inet6dev = iterator->elem;
-
+ list_for_each_entry(inet6dev, &netdev->ipv6_list, head) {
err = lxc_ipv6_addr_add(ifindex, &inet6dev->addr,
&inet6dev->mcast, &inet6dev->acast,
inet6dev->prefix);
return log_error_errno(-1, errno, "Failed to setup ip addresses for network device \"%s\"", netdev->name);
/* setup ipv6 addresses on the interface */
- if (setup_ipv6_addr(&netdev->ipv6, netdev->ifindex))
+ if (setup_ipv6_addr(netdev))
return log_error_errno(-1, errno, "Failed to setup ipv6 addresses for network device \"%s\"", netdev->name);
/* set the network device up */
if (!(netdev->flags & IFF_UP))
return log_error(-1, "Cannot add ipv6 gateway for network device \"%s\" when not bringing up the interface", netdev->name);
- if (lxc_list_empty(&netdev->ipv6) && !IN6_IS_ADDR_LINKLOCAL(netdev->ipv6_gateway))
+ if (list_empty(&netdev->ipv6_list) && !IN6_IS_ADDR_LINKLOCAL(netdev->ipv6_gateway))
return log_error(-1, "Cannot add ipv6 gateway for network device \"%s\" when not assigning an address", netdev->name);
/* Setup device route if ipv6_gateway_dev is enabled */