LXC implement missing macaddr assignment feature

Currently MAC address configuration of container veth is just ignored.
This patch implements the missing feature.

* src/lxc/veth.c, src/lxc/veth.h: add setMacAddr
* src/lxc/lxc_driver.c: set macaddr of container veth if specified
This commit is contained in:
Ryota Ozaki 2009-10-21 12:04:02 +02:00 committed by Daniel Veillard
parent 89f0c6d089
commit e8fc4cbb64
3 changed files with 43 additions and 0 deletions

View File

@ -786,6 +786,17 @@ static int lxcSetupInterfaces(virConnectPtr conn,
goto error_exit; goto error_exit;
} }
if (def->nets[i]->mac) {
char macaddr[VIR_MAC_STRING_BUFLEN];
virFormatMacAddr(def->nets[i]->mac, macaddr);
if (0 != (rc = setMacAddr(containerVeth, macaddr))) {
virReportSystemError(conn, rc,
_("failed to set %s to %s"),
macaddr, containerVeth);
goto error_exit;
}
}
if (0 != (rc = brAddInterface(brctl, bridge, parentVeth))) { if (0 != (rc = brAddInterface(brctl, bridge, parentVeth))) {
virReportSystemError(conn, rc, virReportSystemError(conn, rc,
_("failed to add %s device to %s"), _("failed to add %s device to %s"),

View File

@ -216,3 +216,34 @@ error_out:
VIR_FREE(pid); VIR_FREE(pid);
return rc; return rc;
} }
/**
* setMacAddr
* @iface: name of device
* @macaddr: MAC address to be assigned
*
* Changes the MAC address of the given device with the
* given address using this command:
* ip link set @iface address @macaddr
*
* Returns 0 on success or -1 in case of error
*/
int setMacAddr(const char* iface, const char* macaddr)
{
int rc = -1;
const char *argv[] = {
"ip", "link", "set", iface, "address", macaddr, NULL
};
int cmdResult;
if (NULL == iface) {
goto error_out;
}
rc = virRun(NULL, argv, &cmdResult);
if (0 == rc)
rc = cmdResult;
error_out:
return rc;
}

View File

@ -20,5 +20,6 @@ int vethCreate(char* veth1, int veth1MaxLen, char* veth2,
int vethDelete(const char* veth); int vethDelete(const char* veth);
int vethInterfaceUpOrDown(const char* veth, int upOrDown); int vethInterfaceUpOrDown(const char* veth, int upOrDown);
int moveInterfaceToNetNs(const char *iface, int pidInNs); int moveInterfaceToNetNs(const char *iface, int pidInNs);
int setMacAddr(const char* iface, const char* macaddr);
#endif /* VETH_H */ #endif /* VETH_H */