Skip to content

Commit

Permalink
network: clear ifindeces
Browse files Browse the repository at this point in the history
We need to clear any ifindeces we recorded so liblxc won't have cached stale
data which would cause it to fail on reboot we're we don't re-read the on-disk
config file.

Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
  • Loading branch information
Christian Brauner authored and stgraber committed Oct 4, 2017
1 parent 39a0126 commit 3400d77
Showing 1 changed file with 38 additions and 13 deletions.
51 changes: 38 additions & 13 deletions src/lxc/network.c
Expand Up @@ -2334,36 +2334,49 @@ bool lxc_delete_network_unpriv(struct lxc_handler *handler)
TRACE("Renamed interface with index %d to its "
"initial name \"%s\"",
netdev->ifindex, netdev->link);
continue;
goto clear_ifindices;
}

ret = netdev_deconf[netdev->type](handler, netdev);
if (ret < 0)
WARN("Failed to deconfigure network device");

if (netdev->type != LXC_NET_VETH)
continue;
goto clear_ifindices;

if (netdev->link[0] == '\0' || !is_ovs_bridge(netdev->link))
continue;
goto clear_ifindices;

if (netdev->priv.veth_attr.pair[0] != '\0')
hostveth = netdev->priv.veth_attr.pair;
else
hostveth = netdev->priv.veth_attr.veth1;
if (hostveth[0] == '\0')
continue;
goto clear_ifindices;

ret = lxc_delete_network_unpriv_exec(handler->lxcpath,
handler->name, netdev,
netns_path);
if (ret < 0) {
WARN("Failed to remove port \"%s\" from openvswitch "
"bridge \"%s\"", hostveth, netdev->link);
continue;
goto clear_ifindices;
}
INFO("Removed interface \"%s\" from \"%s\"", hostveth,
netdev->link);

clear_ifindices:
/* We need to clear any ifindeces we recorded so liblxc won't
* have cached stale data which would cause it to fail on reboot
* we're we don't re-read the on-disk config file.
*/
netdev->ifindex = 0;
if (netdev->type == LXC_NET_PHYS) {
netdev->priv.phys_attr.ifindex = 0;
} else if (netdev->type == LXC_NET_VETH) {
netdev->priv.veth_attr.veth1[0] = '\0';
netdev->priv.veth_attr.ifindex = 0;
}
}

return true;
Expand Down Expand Up @@ -2496,7 +2509,7 @@ bool lxc_delete_network_priv(struct lxc_handler *handler)
"\"%s\" to its initial name \"%s\"",
netdev->ifindex, netdev->name,
netdev->link);
continue;
goto clear_ifindices;
}

ret = netdev_deconf[netdev->type](handler, netdev);
Expand All @@ -2516,18 +2529,17 @@ bool lxc_delete_network_priv(struct lxc_handler *handler)
netdev->ifindex);
} else if (ret < 0) {
WARN("Failed to remove interface \"%s\" with "
continue;
"index %d: %s",
netdev->name[0] != '\0' ? netdev->name : "(null)",
netdev->ifindex, strerror(-ret));
continue;
goto clear_ifindices;
}
INFO("Removed interface \"%s\" with index %d",
netdev->name[0] != '\0' ? netdev->name : "(null)",
netdev->ifindex);

if (netdev->type != LXC_NET_VETH)
continue;
goto clear_ifindices;

/* Explicitly delete host veth device to prevent lingering
* devices. We had issues in LXD around this.
Expand All @@ -2537,19 +2549,21 @@ bool lxc_delete_network_priv(struct lxc_handler *handler)
else
hostveth = netdev->priv.veth_attr.veth1;
if (hostveth[0] == '\0')
continue;
goto clear_ifindices;

ret = lxc_netdev_delete_by_name(hostveth);
if (ret < 0) {
WARN("Failed to remove interface \"%s\" from \"%s\": %s",
hostveth, netdev->link, strerror(-ret));
continue;
goto clear_ifindices;
}
INFO("Removed interface \"%s\" from \"%s\"", hostveth, netdev->link);

if (netdev->link[0] == '\0' || !is_ovs_bridge(netdev->link)) {
netdev->priv.veth_attr.veth1[0] = '\0';
continue;
netdev->ifindex = 0;
netdev->priv.veth_attr.ifindex = 0;
goto clear_ifindices;
}

/* Delete the openvswitch port. */
Expand All @@ -2561,7 +2575,18 @@ bool lxc_delete_network_priv(struct lxc_handler *handler)
INFO("Removed port \"%s\" from openvswitch bridge \"%s\"",
hostveth, netdev->link);

netdev->priv.veth_attr.veth1[0] = '\0';
clear_ifindices:
/* We need to clear any ifindeces we recorded so liblxc won't
* have cached stale data which would cause it to fail on reboot
* we're we don't re-read the on-disk config file.
*/
netdev->ifindex = 0;
if (netdev->type == LXC_NET_PHYS) {
netdev->priv.phys_attr.ifindex = 0;
} else if (netdev->type == LXC_NET_VETH) {
netdev->priv.veth_attr.veth1[0] = '\0';
netdev->priv.veth_attr.ifindex = 0;
}
}

return true;
Expand Down

0 comments on commit 3400d77

Please sign in to comment.