fix netdev structure vs network structure

The netdev vs network structure is not well defined. Fix that.

Signed-off-by: Daniel Lezcano <dlezcano@fr.ibm.com>
This commit is contained in:
Daniel Lezcano 2009-10-09 11:38:39 +02:00
parent 4bf1968d3c
commit 5f4535a3d9
4 changed files with 55 additions and 118 deletions

View File

@ -897,17 +897,14 @@ static int setup_netdev(struct lxc_netdev *netdev)
return 0;
}
static int setup_network(struct lxc_list *networks)
static int setup_network(struct lxc_list *network)
{
struct lxc_list *iterator;
struct lxc_network *network;
struct lxc_netdev *netdev;
lxc_list_for_each(iterator, networks) {
lxc_list_for_each(iterator, network) {
network = iterator->elem;
netdev = lxc_list_first_elem(&network->netdev);
netdev = iterator->elem;
if (setup_netdev(netdev)) {
ERROR("failed to setup netdev");
@ -915,6 +912,7 @@ static int setup_network(struct lxc_list *networks)
}
}
if (!lxc_list_empty(network))
INFO("network has been setup");
return 0;
@ -953,7 +951,7 @@ int lxc_conf_init(struct lxc_conf *conf)
conf->pts = 0;
conf->console[0] = '\0';
lxc_list_init(&conf->cgroup);
lxc_list_init(&conf->networks);
lxc_list_init(&conf->network);
return 0;
}
@ -1109,25 +1107,22 @@ static int instanciate_empty(struct lxc_netdev *netdev)
return 0;
}
int lxc_create_network(struct lxc_list *networks)
int lxc_create_network(struct lxc_list *network)
{
struct lxc_list *iterator;
struct lxc_network *network;
struct lxc_netdev *netdev;
lxc_list_for_each(iterator, networks) {
lxc_list_for_each(iterator, network) {
network = iterator->elem;
netdev = iterator->elem;
if (network->type < 0 || network->type > MAXCONFTYPE) {
if (netdev->type < 0 || netdev->type > MAXCONFTYPE) {
ERROR("invalid network configuration type '%d'",
network->type);
netdev->type);
return -1;
}
netdev = lxc_list_first_elem(&network->netdev);
if (netdev_conf[network->type](netdev)) {
if (netdev_conf[netdev->type](netdev)) {
ERROR("failed to create netdev");
return -1;
}
@ -1136,17 +1131,14 @@ int lxc_create_network(struct lxc_list *networks)
return 0;
}
int lxc_assign_network(struct lxc_list *networks, pid_t pid)
int lxc_assign_network(struct lxc_list *network, pid_t pid)
{
struct lxc_list *iterator;
struct lxc_network *network;
struct lxc_netdev *netdev;
lxc_list_for_each(iterator, networks) {
lxc_list_for_each(iterator, network) {
network = iterator->elem;
netdev = lxc_list_first_elem(&network->netdev);
netdev = iterator->elem;
if (lxc_device_move(netdev->ifindex, pid)) {
ERROR("failed to move '%s' to the container",
@ -1238,7 +1230,7 @@ int lxc_setup(const char *name, struct lxc_conf *lxc_conf)
return -1;
}
if (setup_network(&lxc_conf->networks)) {
if (setup_network(&lxc_conf->network)) {
ERROR("failed to setup the network for '%s'", name);
return -1;
}

View File

@ -75,6 +75,7 @@ struct lxc_route6 {
* @ipv6 : a list of ipv6 addresses to be set on the network device
*/
struct lxc_netdev {
int type;
int flags;
int ifindex;
char *ifname;
@ -83,20 +84,6 @@ struct lxc_netdev {
char *mtu;
struct lxc_list ipv4;
struct lxc_list ipv6;
struct lxc_list route4;
struct lxc_list route6;
};
/*
* Defines the kind of the network to use
* @type : the type of the network virtualization
* @phys : phys configuration type
* @veth : veth configuration type
* @macvlan : macvlan configuration type
*/
struct lxc_network {
int type;
struct lxc_list netdev;
};
/*
@ -149,7 +136,7 @@ struct lxc_conf {
int pts;
struct utsname *utsname;
struct lxc_list cgroup;
struct lxc_list networks;
struct lxc_list network;
struct lxc_tty_info tty_info;
char console[MAXPATHLEN];
};

View File

@ -94,19 +94,9 @@ static struct config *getconfig(const char *key)
static int config_network_type(const char *key, char *value, struct lxc_conf *lxc_conf)
{
struct lxc_list *networks = &lxc_conf->networks;
struct lxc_network *network;
struct lxc_list *network = &lxc_conf->network;
struct lxc_netdev *netdev;
struct lxc_list *list;
struct lxc_list *ndlist;
network = malloc(sizeof(*network));
if (!network) {
SYSERROR("failed to allocate memory");
return -1;
}
lxc_list_init(&network->netdev);
netdev = malloc(sizeof(*netdev));
if (!netdev) {
@ -117,18 +107,6 @@ static int config_network_type(const char *key, char *value, struct lxc_conf *lx
memset(netdev, 0, sizeof(*netdev));
lxc_list_init(&netdev->ipv4);
lxc_list_init(&netdev->ipv6);
lxc_list_init(&netdev->route4);
lxc_list_init(&netdev->route6);
ndlist = malloc(sizeof(*ndlist));
if (!ndlist) {
SYSERROR("failed to allocate memory");
return -1;
}
ndlist->elem = netdev;
lxc_list_add(&network->netdev, ndlist);
list = malloc(sizeof(*list));
if (!list) {
@ -137,18 +115,18 @@ static int config_network_type(const char *key, char *value, struct lxc_conf *lx
}
lxc_list_init(list);
list->elem = network;
list->elem = netdev;
lxc_list_add(networks, list);
lxc_list_add(network, list);
if (!strcmp(value, "veth"))
network->type = VETH;
netdev->type = VETH;
else if (!strcmp(value, "macvlan"))
network->type = MACVLAN;
netdev->type = MACVLAN;
else if (!strcmp(value, "phys"))
network->type = PHYS;
netdev->type = PHYS;
else if (!strcmp(value, "empty"))
network->type = EMPTY;
netdev->type = EMPTY;
else {
ERROR("invalid network type %s", value);
return -1;
@ -158,39 +136,36 @@ static int config_network_type(const char *key, char *value, struct lxc_conf *lx
static int config_network_flags(const char *key, char *value, struct lxc_conf *lxc_conf)
{
struct lxc_list *networks = &lxc_conf->networks;
struct lxc_network *network;
struct lxc_list *network = &lxc_conf->network;
struct lxc_netdev *netdev;
if (lxc_list_empty(networks)) {
if (lxc_list_empty(network)) {
ERROR("network is not created for '%s' option", value);
return -1;
}
network = lxc_list_first_elem(networks);
if (!network) {
netdev = lxc_list_first_elem(network);
if (!netdev) {
ERROR("no network defined for '%s' option", value);
return -1;
}
netdev = lxc_list_first_elem(&network->netdev);
netdev->flags |= IFF_UP;
return 0;
}
static int config_network_link(const char *key, char *value, struct lxc_conf *lxc_conf)
{
struct lxc_list *networks = &lxc_conf->networks;
struct lxc_network *network;
struct lxc_list *network = &lxc_conf->network;
struct lxc_netdev *netdev;
if (lxc_list_empty(networks)) {
if (lxc_list_empty(network)) {
ERROR("network is not created for %s", value);
return -1;
}
network = lxc_list_first_elem(networks);
if (!network) {
netdev = lxc_list_first_elem(network);
if (!netdev) {
ERROR("no network defined for %s", value);
return -1;
}
@ -200,24 +175,22 @@ static int config_network_link(const char *key, char *value, struct lxc_conf *lx
return -1;
}
netdev = lxc_list_first_elem(&network->netdev);
netdev->ifname = strdup(value);
return 0;
}
static int config_network_name(const char *key, char *value, struct lxc_conf *lxc_conf)
{
struct lxc_list *networks = &lxc_conf->networks;
struct lxc_network *network;
struct lxc_list *network = &lxc_conf->network;
struct lxc_netdev *netdev;
if (lxc_list_empty(networks)) {
if (lxc_list_empty(network)) {
ERROR("network is not created for %s", value);
return -1;
}
network = lxc_list_first_elem(networks);
if (!network) {
netdev = lxc_list_first_elem(network);
if (!netdev) {
ERROR("no network defined for %s", value);
return -1;
}
@ -227,76 +200,64 @@ static int config_network_name(const char *key, char *value, struct lxc_conf *lx
return -1;
}
netdev = lxc_list_first_elem(&network->netdev);
netdev->newname = strdup(value);
return 0;
}
static int config_network_hwaddr(const char *key, char *value, struct lxc_conf *lxc_conf)
{
struct lxc_list *networks = &lxc_conf->networks;
struct lxc_network *network;
struct lxc_list *network = &lxc_conf->network;
struct lxc_netdev *netdev;
if (lxc_list_empty(networks)) {
if (lxc_list_empty(network)) {
ERROR("network is not created for %s", value);
return -1;
}
network = lxc_list_first_elem(networks);
if (!network) {
netdev = lxc_list_first_elem(network);
if (!netdev) {
ERROR("no network defined for %s", value);
return -1;
}
netdev = lxc_list_first_elem(&network->netdev);
netdev->hwaddr = strdup(value);
return 0;
}
static int config_network_mtu(const char *key, char *value, struct lxc_conf *lxc_conf)
{
struct lxc_list *networks = &lxc_conf->networks;
struct lxc_network *network;
struct lxc_list *network = &lxc_conf->network;
struct lxc_netdev *netdev;
if (lxc_list_empty(networks)) {
if (lxc_list_empty(network)) {
ERROR("network is not created for %s", value);
return -1;
}
network = lxc_list_first_elem(networks);
if (!network) {
netdev = lxc_list_first_elem(network);
if (!netdev) {
ERROR("no network defined for %s", value);
return -1;
}
netdev = lxc_list_first_elem(&network->netdev);
netdev->mtu = strdup(value);
return 0;
}
static int config_network_ipv4(const char *key, char *value, struct lxc_conf *lxc_conf)
{
struct lxc_list *networks = &lxc_conf->networks;
struct lxc_network *network;
struct lxc_list *network = &lxc_conf->network;
struct lxc_inetdev *inetdev;
struct lxc_netdev *netdev;
struct lxc_list *list;
char *cursor, *slash, *addr = NULL, *bcast = NULL, *prefix = NULL;
if (lxc_list_empty(networks)) {
if (lxc_list_empty(network)) {
ERROR("network is not created for '%s'", value);
return -1;
}
network = lxc_list_first_elem(networks);
if (!network) {
ERROR("no network defined for '%s'", value);
return -1;
}
netdev = lxc_list_first_elem(&network->netdev);
netdev = lxc_list_first_elem(network);
if (!netdev) {
ERROR("no netdev defined for '%s'", value);
}
@ -357,21 +318,20 @@ static int config_network_ipv4(const char *key, char *value, struct lxc_conf *lx
static int config_network_ipv6(const char *key, char *value, struct lxc_conf *lxc_conf)
{
struct lxc_list *networks = &lxc_conf->networks;
struct lxc_network *network;
struct lxc_list *network = &lxc_conf->network;
struct lxc_netdev *netdev;
struct lxc_inet6dev *inet6dev;
struct lxc_list *list;
char *slash;
char *netmask;
if (lxc_list_empty(networks)) {
if (lxc_list_empty(network)) {
ERROR("network is not created for %s", value);
return -1;
}
network = lxc_list_first_elem(networks);
if (!network) {
netdev = lxc_list_first_elem(network);
if (!netdev) {
ERROR("no network defined for %s", value);
return -1;
}
@ -404,8 +364,6 @@ static int config_network_ipv6(const char *key, char *value, struct lxc_conf *lx
return -1;
}
netdev = lxc_list_first_elem(&network->netdev);
lxc_list_add(&netdev->ipv6, list);
return 0;

View File

@ -425,14 +425,14 @@ int lxc_spawn(const char *name, struct lxc_handler *handler, char *const argv[])
}
clone_flags = CLONE_NEWUTS|CLONE_NEWPID|CLONE_NEWIPC|CLONE_NEWNS;
if (!lxc_list_empty(&handler->conf.networks)) {
if (!lxc_list_empty(&handler->conf.network)) {
clone_flags |= CLONE_NEWNET;
/* that should be done before the clone because we will
* fill the netdev index and use them in the child
*/
if (lxc_create_network(&handler->conf.networks)) {
if (lxc_create_network(&handler->conf.network)) {
ERROR("failed to create the network");
goto out_close;
}
@ -458,7 +458,7 @@ int lxc_spawn(const char *name, struct lxc_handler *handler, char *const argv[])
/* Create the network configuration */
if (clone_flags & CLONE_NEWNET) {
if (lxc_assign_network(&handler->conf.networks, handler->pid)) {
if (lxc_assign_network(&handler->conf.network, handler->pid)) {
ERROR("failed to create the configured network");
goto out_abort;
}