network: implement network clearing

Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
This commit is contained in:
Christian Brauner 2017-06-15 19:14:00 +02:00
parent 40db5d2f96
commit ff6da29581
No known key found for this signature in database
GPG Key ID: 7B3C391EFEA93624

View File

@ -183,39 +183,75 @@ static int clr_config_hooks(const char *, struct lxc_conf *, void *);
static int set_config_network_type(const char *, const char *,
struct lxc_conf *, void *);
static int clr_config_network_type(const char *, struct lxc_conf *, void *);
static int set_config_network_flags(const char *, const char *,
struct lxc_conf *, void *);
static int clr_config_network_flags(const char *, struct lxc_conf *, void *);
static int set_config_network_link(const char *, const char *,
struct lxc_conf *, void *);
static int clr_config_network_link(const char *, struct lxc_conf *, void *);
static int set_config_network_name(const char *, const char *,
struct lxc_conf *, void *);
static int clr_config_network_name(const char *, struct lxc_conf *, void *);
static int set_config_network_veth_pair(const char *, const char *,
struct lxc_conf *, void *);
static int clr_config_network_veth_pair(const char *, struct lxc_conf *,
void *);
static int set_config_network_macvlan_mode(const char *, const char *,
struct lxc_conf *, void *);
static int clr_config_network_macvlan_mode(const char *, struct lxc_conf *,
void *);
static int set_config_network_hwaddr(const char *, const char *,
struct lxc_conf *, void *);
static int clr_config_network_hwaddr(const char *, struct lxc_conf *, void *);
static int set_config_network_vlan_id(const char *, const char *,
struct lxc_conf *, void *);
static int clr_config_network_vlan_id(const char *, struct lxc_conf *, void *);
static int set_config_network_mtu(const char *, const char *, struct lxc_conf *,
void *);
static int clr_config_network_mtu(const char *, struct lxc_conf *, void *);
static int set_config_network_ipv4(const char *, const char *,
struct lxc_conf *, void *);
static int clr_config_network_ipv4(const char *, struct lxc_conf *, void *);
static int set_config_network_ipv4_gateway(const char *, const char *,
struct lxc_conf *, void *);
static int clr_config_network_ipv4_gateway(const char *, struct lxc_conf *,
void *);
static int set_config_network_script_up(const char *, const char *,
struct lxc_conf *, void *);
static int clr_config_network_script_up(const char *, struct lxc_conf *,
void *);
static int set_config_network_script_down(const char *, const char *,
struct lxc_conf *, void *);
static int clr_config_network_script_down(const char *, struct lxc_conf *,
void *);
static int set_config_network_ipv6(const char *, const char *,
struct lxc_conf *, void *);
static int clr_config_network_ipv6(const char *, struct lxc_conf *, void *);
static int set_config_network_ipv6_gateway(const char *, const char *,
struct lxc_conf *, void *);
static int clr_config_network_ipv6_gateway(const char *, struct lxc_conf *,
void *);
static int set_config_network_nic(const char *, const char *, struct lxc_conf *,
void *);
static int get_config_network_item(const char *, char *, int,
struct lxc_conf *);
static int clr_config_network_item(const char *, struct lxc_conf *, void *);
static int clr_config_network_nic(const char *, struct lxc_conf *, void *);
static int set_config_network(const char *, const char *, struct lxc_conf *,
void *);
@ -363,22 +399,22 @@ static struct lxc_config_t config[] = {
{ "lxc.hook.clone", set_config_hooks, get_config_hooks, clr_config_hooks, },
{ "lxc.hook.destroy", set_config_hooks, get_config_hooks, clr_config_hooks, },
{ "lxc.hook", set_config_hooks, get_config_hooks, clr_config_hooks, },
{ "lxc.network.type", set_config_network_type, get_config_network_item, clr_config_network_item, },
{ "lxc.network.flags", set_config_network_flags, get_config_network_item, clr_config_network_item, },
{ "lxc.network.link", set_config_network_link, get_config_network_item, clr_config_network_item, },
{ "lxc.network.name", set_config_network_name, get_config_network_item, clr_config_network_item, },
{ "lxc.network.macvlan.mode", set_config_network_macvlan_mode, get_config_network_item, clr_config_network_item, },
{ "lxc.network.veth.pair", set_config_network_veth_pair, get_config_network_item, clr_config_network_item, },
{ "lxc.network.script.up", set_config_network_script_up, get_config_network_item, clr_config_network_item, },
{ "lxc.network.script.down", set_config_network_script_down, get_config_network_item, clr_config_network_item, },
{ "lxc.network.hwaddr", set_config_network_hwaddr, get_config_network_item, clr_config_network_item, },
{ "lxc.network.mtu", set_config_network_mtu, get_config_network_item, clr_config_network_item, },
{ "lxc.network.vlan.id", set_config_network_vlan_id, get_config_network_item, clr_config_network_item, },
{ "lxc.network.ipv4.gateway", set_config_network_ipv4_gateway, get_config_network_item, clr_config_network_item, },
{ "lxc.network.ipv4", set_config_network_ipv4, get_config_network_item, clr_config_network_item, },
{ "lxc.network.ipv6.gateway", set_config_network_ipv6_gateway, get_config_network_item, clr_config_network_item, },
{ "lxc.network.ipv6", set_config_network_ipv6, get_config_network_item, clr_config_network_item, },
{ "lxc.network.", set_config_network_nic, get_config_network_item, clr_config_network_item, },
{ "lxc.network.type", set_config_network_type, get_config_network_item, clr_config_network_type, },
{ "lxc.network.flags", set_config_network_flags, get_config_network_item, clr_config_network_flags, },
{ "lxc.network.link", set_config_network_link, get_config_network_item, clr_config_network_link, },
{ "lxc.network.name", set_config_network_name, get_config_network_item, clr_config_network_name, },
{ "lxc.network.macvlan.mode", set_config_network_macvlan_mode, get_config_network_item, clr_config_network_macvlan_mode, },
{ "lxc.network.veth.pair", set_config_network_veth_pair, get_config_network_item, clr_config_network_veth_pair, },
{ "lxc.network.script.up", set_config_network_script_up, get_config_network_item, clr_config_network_script_up, },
{ "lxc.network.script.down", set_config_network_script_down, get_config_network_item, clr_config_network_script_down, },
{ "lxc.network.hwaddr", set_config_network_hwaddr, get_config_network_item, clr_config_network_hwaddr, },
{ "lxc.network.mtu", set_config_network_mtu, get_config_network_item, clr_config_network_mtu, },
{ "lxc.network.vlan.id", set_config_network_vlan_id, get_config_network_item, clr_config_network_vlan_id, },
{ "lxc.network.ipv4.gateway", set_config_network_ipv4_gateway, get_config_network_item, clr_config_network_ipv4_gateway, },
{ "lxc.network.ipv4", set_config_network_ipv4, get_config_network_item, clr_config_network_ipv4, },
{ "lxc.network.ipv6.gateway", set_config_network_ipv6_gateway, get_config_network_item, clr_config_network_ipv6_gateway, },
{ "lxc.network.ipv6", set_config_network_ipv6, get_config_network_item, clr_config_network_ipv6, },
{ "lxc.network.", set_config_network_nic, get_config_network_item, clr_config_network_nic, },
{ "lxc.network", set_config_network, get_config_network, clr_config_network, },
{ "lxc.cap.drop", set_config_cap_drop, get_config_cap_drop, clr_config_cap_drop, },
{ "lxc.cap.keep", set_config_cap_keep, get_config_cap_keep, clr_config_cap_keep, },
@ -1049,7 +1085,7 @@ static int set_config_network_ipv4(const char *key, const char *value,
char *addr = NULL, *bcast = NULL, *prefix = NULL;
if (lxc_config_value_empty(value))
return clr_config_network_item(key, lxc_conf, NULL);
return clr_config_network_ipv4(key, lxc_conf, NULL);
/* lxc.network.* without an index */
if (!data)
@ -4056,12 +4092,6 @@ static inline int clr_config_hooks(const char *key, struct lxc_conf *c,
return lxc_clear_hooks(c, key);
}
static inline int clr_config_network_item(const char *key, struct lxc_conf *c,
void *data)
{
return lxc_clear_nic(c, key + 12);
}
static inline int clr_config_network(const char *key, struct lxc_conf *c,
void *data)
{
@ -4316,3 +4346,315 @@ static int set_config_network_nic(const char *key, const char *value,
return config->set(key, value, lxc_conf, netdev);
}
/*
* Config entry is something like "lxc.network.0.ipv4" the key 'lxc.network.'
* was found. So we make sure next comes an integer, find the right callback
* (by rewriting the key), and call it.
*/
static int clr_config_network_nic(const char *key, struct lxc_conf *lxc_conf,
void *data)
{
struct lxc_config_t *config;
struct lxc_netdev *netdev;
ssize_t idx = -1;
config = get_network_config_ops(key, lxc_conf, &idx);
if (!config || idx < 0)
return -1;
netdev = lxc_get_netdev_by_idx(lxc_conf, (unsigned int)idx);
if (!netdev)
return -1;
return config->clr(key, lxc_conf, netdev);
}
static int clr_config_network_type(const char *key, struct lxc_conf *lxc_conf,
void *data)
{
struct lxc_netdev *netdev;
/* lxc.network.* without an index */
if (!data)
netdev = lxc_get_netdev_by_idx(lxc_conf, 0);
else
netdev = data;
if (!netdev)
return -1;
netdev->type = -1;
return 0;
}
static int clr_config_network_name(const char *key, struct lxc_conf *lxc_conf,
void *data)
{
struct lxc_netdev *netdev;
/* lxc.network.* without an index */
if (!data)
netdev = lxc_get_netdev_by_idx(lxc_conf, 0);
else
netdev = data;
if (!netdev)
return -1;
free(netdev->name);
netdev->name = NULL;
return 0;
}
static int clr_config_network_flags(const char *key, struct lxc_conf *lxc_conf,
void *data)
{
struct lxc_netdev *netdev;
/* lxc.network.* without an index */
if (!data)
netdev = lxc_get_netdev_by_idx(lxc_conf, 0);
else
netdev = data;
if (!netdev)
return -1;
netdev->flags = 0;
return 0;
}
static int clr_config_network_link(const char *key, struct lxc_conf *lxc_conf,
void *data)
{
struct lxc_netdev *netdev;
/* lxc.network.* without an index */
if (!data)
netdev = lxc_get_netdev_by_idx(lxc_conf, 0);
else
netdev = data;
if (!netdev)
return -1;
free(netdev->link);
netdev->link = NULL;
return 0;
}
static int clr_config_network_macvlan_mode(const char *key,
struct lxc_conf *lxc_conf,
void *data)
{
struct lxc_netdev *netdev;
/* lxc.network.* without an index */
if (!data)
netdev = lxc_get_netdev_by_idx(lxc_conf, 0);
else
netdev = data;
if (!netdev)
return -1;
netdev->priv.macvlan_attr.mode = -1;
return 0;
}
static int clr_config_network_veth_pair(const char *key,
struct lxc_conf *lxc_conf, void *data)
{
struct lxc_netdev *netdev;
/* lxc.network.* without an index */
if (!data)
netdev = lxc_get_netdev_by_idx(lxc_conf, 0);
else
netdev = data;
if (!netdev)
return -1;
free(netdev->priv.veth_attr.pair);
netdev->priv.veth_attr.pair = NULL;
return 0;
}
static int clr_config_network_script_up(const char *key,
struct lxc_conf *lxc_conf, void *data)
{
struct lxc_netdev *netdev;
/* lxc.network.* without an index */
if (!data)
netdev = lxc_get_netdev_by_idx(lxc_conf, 0);
else
netdev = data;
if (!netdev)
return -1;
free(netdev->upscript);
netdev->upscript = NULL;
return 0;
}
static int clr_config_network_script_down(const char *key,
struct lxc_conf *lxc_conf, void *data)
{
struct lxc_netdev *netdev;
/* lxc.network.* without an index */
if (!data)
netdev = lxc_get_netdev_by_idx(lxc_conf, 0);
else
netdev = data;
if (!netdev)
return -1;
free(netdev->downscript);
netdev->downscript = NULL;
return 0;
}
static int clr_config_network_hwaddr(const char *key, struct lxc_conf *lxc_conf,
void *data)
{
struct lxc_netdev *netdev;
/* lxc.network.* without an index */
if (!data)
netdev = lxc_get_netdev_by_idx(lxc_conf, 0);
else
netdev = data;
if (!netdev)
return -1;
free(netdev->hwaddr);
netdev->hwaddr = NULL;
return 0;
}
static int clr_config_network_mtu(const char *key, struct lxc_conf *lxc_conf,
void *data)
{
struct lxc_netdev *netdev;
/* lxc.network.* without an index */
if (!data)
netdev = lxc_get_netdev_by_idx(lxc_conf, 0);
else
netdev = data;
if (!netdev)
return -1;
free(netdev->mtu);
netdev->mtu = NULL;
return 0;
}
static int clr_config_network_vlan_id(const char *key,
struct lxc_conf *lxc_conf, void *data)
{
struct lxc_netdev *netdev;
/* lxc.network.* without an index */
if (!data)
netdev = lxc_get_netdev_by_idx(lxc_conf, 0);
else
netdev = data;
if (!netdev)
return -1;
netdev->priv.vlan_attr.vid = 0;
return 0;
}
static int clr_config_network_ipv4_gateway(const char *key,
struct lxc_conf *lxc_conf,
void *data)
{
struct lxc_netdev *netdev;
/* lxc.network.* without an index */
if (!data)
netdev = lxc_get_netdev_by_idx(lxc_conf, 0);
else
netdev = data;
if (!netdev)
return -1;
free(netdev->ipv4_gateway);
netdev->ipv4_gateway = NULL;
return 0;
}
static int clr_config_network_ipv4(const char *key, struct lxc_conf *lxc_conf,
void *data)
{
struct lxc_netdev *netdev;
struct lxc_list *cur, *next;
/* lxc.network.* without an index */
if (!data)
netdev = lxc_get_netdev_by_idx(lxc_conf, 0);
else
netdev = data;
lxc_list_for_each_safe(cur, &netdev->ipv4, next) {
lxc_list_del(cur);
free(cur->elem);
free(cur);
}
return 0;
}
static int clr_config_network_ipv6_gateway(const char *key,
struct lxc_conf *lxc_conf,
void *data)
{
struct lxc_netdev *netdev;
/* lxc.network.* without an index */
if (!data)
netdev = lxc_get_netdev_by_idx(lxc_conf, 0);
else
netdev = data;
if (!netdev)
return -1;
free(netdev->ipv6_gateway);
netdev->ipv6_gateway = NULL;
return 0;
}
static int clr_config_network_ipv6(const char *key, struct lxc_conf *lxc_conf,
void *data)
{
struct lxc_netdev *netdev;
struct lxc_list *cur, *next;
/* lxc.network.* without an index */
if (!data)
netdev = lxc_get_netdev_by_idx(lxc_conf, 0);
else
netdev = data;
lxc_list_for_each_safe(cur, &netdev->ipv6, next) {
lxc_list_del(cur);
free(cur->elem);
free(cur);
}
return 0;
}