lxcCreateNetDef(const char *type,
const char *link,
const char *mac,
- const char *flag)
+ const char *flag,
+ const char *macvlanmode)
{
virDomainNetDefPtr net = NULL;
+ virMacAddr macAddr;
if (VIR_ALLOC(net) < 0)
goto error;
net->linkstate = VIR_DOMAIN_NET_INTERFACE_LINK_STATE_DOWN;
}
- if (STREQ(type, "veth")) {
- virMacAddr macAddr;
+ if (mac && virMacAddrParse(mac, &macAddr) == 0)
+ net->mac = macAddr;
+
+ if (STREQ(type, "veth")) {
if (!link)
goto error;
if (VIR_STRDUP(net->data.bridge.brname, link) < 0)
goto error;
- if (mac && virMacAddrParse(mac, &macAddr) == 0)
- net->mac = macAddr;
+ } else if (STREQ(type, "macvlan")) {
+ net->type = VIR_DOMAIN_NET_TYPE_DIRECT;
+ if (!link || VIR_STRDUP(net->data.direct.linkdev, link) < 0)
+ goto error;
+
+ if (!macvlanmode || STREQ(macvlanmode, "private"))
+ net->data.direct.mode = VIR_NETDEV_MACVLAN_MODE_PRIVATE;
+ else if (STREQ(macvlanmode, "vepa"))
+ net->data.direct.mode = VIR_NETDEV_MACVLAN_MODE_VEPA;
+ else if (STREQ(macvlanmode, "bridge"))
+ net->data.direct.mode = VIR_NETDEV_MACVLAN_MODE_BRIDGE;
+ else
+ VIR_WARN("Unknown macvlan type: %s", macvlanmode);
}
return net;
const char *type,
const char *link,
const char *mac,
- const char *flag)
+ const char *flag,
+ const char *macvlanmode)
{
virDomainNetDefPtr net = NULL;
virDomainHostdevDefPtr hostdev = NULL;
goto error;
def->hostdevs[def->nhostdevs - 1] = hostdev;
} else {
- if (!(net = lxcCreateNetDef(type, link, mac, flag)))
+ if (!(net = lxcCreateNetDef(type, link, mac, flag, macvlanmode)))
goto error;
if (VIR_EXPAND_N(def->nets, def->nnets, 1) < 0)
char *link;
char *mac;
char *flag;
+ char *macvlanmode;
bool privnet;
size_t networks;
} lxcNetworkParseData;
/* Store the previous NIC */
status = lxcAddNetworkDefinition(parseData->def, parseData->type,
parseData->link, parseData->mac,
- parseData->flag);
+ parseData->flag,
+ parseData->macvlanmode);
+
if (status < 0)
return -1;
else if (status > 0)
parseData->link = NULL;
parseData->mac = NULL;
parseData->flag = NULL;
+ parseData->macvlanmode = NULL;
/* Keep the new value */
parseData->type = value->str;
parseData->mac = value->str;
else if (STREQ(name, "lxc.network.flags"))
parseData->flag = value->str;
+ else if (STREQ(name, "lxc.network.macvlan.mode"))
+ parseData->macvlanmode = value->str;
+ else if (STRPREFIX(name, "lxc.network"))
+ VIR_WARN("Unhandled network property: %s = %s",
+ name,
+ value->str);
return 0;
}
lxcConvertNetworkSettings(virDomainDefPtr def, virConfPtr properties)
{
int status;
- lxcNetworkParseData data = {def, NULL, NULL, NULL, NULL, true, 0};
+ lxcNetworkParseData data = {def, NULL, NULL, NULL, NULL, NULL, true, 0};
virConfWalk(properties, lxcNetworkWalkCallback, &data);
/* Add the last network definition found */
status = lxcAddNetworkDefinition(def, data.type, data.link,
- data.mac, data.flag);
+ data.mac, data.flag,
+ data.macvlanmode);
if (status < 0)
return -1;
else if (status > 0)
--- /dev/null
+<domain type='lxc'>
+ <name>migrate_test</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>65536</memory>
+ <currentMemory unit='KiB'>0</currentMemory>
+ <vcpu placement='static' current='0'>1</vcpu>
+ <os>
+ <type>exe</type>
+ <init>/sbin/init</init>
+ </os>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <filesystem type='mount' accessmode='passthrough'>
+ <source dir='/var/lib/lxc/migrate_test/rootfs'/>
+ <target dir='/'/>
+ </filesystem>
+ <interface type='direct'>
+ <mac address='02:00:15:8f:05:c1'/>
+ <source dev='eth0' mode='vepa'/>
+ <link state='up'/>
+ </interface>
+ </devices>
+</domain>