mirror of
https://git.proxmox.com/git/mirror_lxc
synced 2025-08-08 08:16:20 +00:00
Merge pull request #1343 from lifupan/master
confile: support the network link string pattern matching
This commit is contained in:
commit
8b7ffa302d
@ -50,6 +50,12 @@
|
|||||||
#include "network.h"
|
#include "network.h"
|
||||||
#include "lxcseccomp.h"
|
#include "lxcseccomp.h"
|
||||||
|
|
||||||
|
#if HAVE_IFADDRS_H
|
||||||
|
#include <ifaddrs.h>
|
||||||
|
#else
|
||||||
|
#include <../include/ifaddrs.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#if HAVE_SYS_PERSONALITY_H
|
#if HAVE_SYS_PERSONALITY_H
|
||||||
#include <sys/personality.h>
|
#include <sys/personality.h>
|
||||||
#endif
|
#endif
|
||||||
@ -672,16 +678,85 @@ static int config_network_flags(const char *key, const char *value,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int set_network_link(const char *key, const char *value, struct lxc_conf *lxc_conf)
|
||||||
|
{
|
||||||
|
struct lxc_netdev *netdev;
|
||||||
|
|
||||||
|
netdev = network_netdev(key, value, &lxc_conf->network);
|
||||||
|
if (!netdev)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return network_ifname(&netdev->link, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int create_matched_ifnames(const char *value, struct lxc_conf *lxc_conf)
|
||||||
|
{
|
||||||
|
struct ifaddrs *ifaddr, *ifa;
|
||||||
|
const char *type_key = "lxc.network.type";
|
||||||
|
const char *link_key = "lxc.network.link";
|
||||||
|
const char *tmpvalue = "phys";
|
||||||
|
int n, ret = 0;
|
||||||
|
|
||||||
|
if (getifaddrs(&ifaddr) == -1) {
|
||||||
|
SYSERROR("Get network interfaces failed");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (ifa = ifaddr, n = 0; ifa != NULL; ifa = ifa->ifa_next, n++) {
|
||||||
|
if (!ifa->ifa_addr)
|
||||||
|
continue;
|
||||||
|
if (ifa->ifa_addr->sa_family != AF_PACKET)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!strncmp(value, ifa->ifa_name, strlen(value)-1)) {
|
||||||
|
ret = config_network_type(type_key, tmpvalue, lxc_conf);
|
||||||
|
if (!ret) {
|
||||||
|
ret = set_network_link(link_key, ifa->ifa_name, lxc_conf);
|
||||||
|
if (ret) {
|
||||||
|
ERROR("failed to create matched ifnames");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ERROR("failed to create matched ifnames");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
freeifaddrs(ifaddr); /* free the dynamic memory */
|
||||||
|
ifaddr = NULL; /* prevent use after free */
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static int config_network_link(const char *key, const char *value,
|
static int config_network_link(const char *key, const char *value,
|
||||||
struct lxc_conf *lxc_conf)
|
struct lxc_conf *lxc_conf)
|
||||||
{
|
{
|
||||||
struct lxc_netdev *netdev;
|
struct lxc_netdev *netdev;
|
||||||
|
struct lxc_list * it;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
netdev = network_netdev(key, value, &lxc_conf->network);
|
netdev = network_netdev(key, value, &lxc_conf->network);
|
||||||
if (!netdev)
|
if (!netdev)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return network_ifname(&netdev->link, value);
|
if (value[strlen(value) - 1] == '+' && netdev->type == LXC_NET_PHYS) {
|
||||||
|
//get the last network list and remove it.
|
||||||
|
it = lxc_conf->network.prev;
|
||||||
|
if (((struct lxc_netdev *)(it->elem))->type != LXC_NET_PHYS) {
|
||||||
|
ERROR("lxc config cannot support string pattern matching for this link type");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
lxc_list_del(it);
|
||||||
|
free(it);
|
||||||
|
ret = create_matched_ifnames(value, lxc_conf);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
ret = network_ifname(&netdev->link, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int config_network_name(const char *key, const char *value,
|
static int config_network_name(const char *key, const char *value,
|
||||||
|
Loading…
Reference in New Issue
Block a user