char **veths)
{
int ret = -1;
- size_t i, j;
+ size_t i;
const char *newname;
virDomainNetDefPtr netDef;
bool privNet = vmDef->features[VIR_DOMAIN_FEATURE_PRIVNET] ==
VIR_DEBUG("Renaming %s to %s", veths[i], newname);
if (virNetDevSetName(veths[i], newname) < 0)
- goto cleanup;
-
- for (j = 0; j < netDef->guestIP.nips; j++) {
- virNetDevIPAddrPtr ip = netDef->guestIP.ips[j];
- int prefix;
- char *ipStr = virSocketAddrFormat(&ip->address);
-
- if ((prefix = virSocketAddrGetIPPrefix(&ip->address,
- NULL, ip->prefix)) < 0) {
- ipStr = virSocketAddrFormat(&ip->address);
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("Failed to determine prefix for IP address '%s'"),
- ipStr);
- VIR_FREE(ipStr);
- goto cleanup;
- }
- VIR_FREE(ipStr);
-
- if (virNetDevIPAddrAdd(newname, &ip->address, NULL, prefix) < 0)
- goto cleanup;
- }
+ goto cleanup;
+ /* Only enable this device if there is a reason to do so (either
+ * at least one IP was specified, or link state was set to up in
+ * the config)
+ */
if (netDef->guestIP.nips ||
netDef->linkstate == VIR_DOMAIN_NET_INTERFACE_LINK_STATE_UP) {
VIR_DEBUG("Enabling %s", newname);
if (virNetDevSetOnline(newname, true) < 0)
goto cleanup;
-
- /* Set the routes */
- for (j = 0; j < netDef->guestIP.nroutes; j++) {
- virNetDevIPRoutePtr route = netDef->guestIP.routes[j];
-
- if (virNetDevIPRouteAdd(newname,
- virNetDevIPRouteGetAddress(route),
- virNetDevIPRouteGetPrefix(route),
- virNetDevIPRouteGetGateway(route),
- virNetDevIPRouteGetMetric(route)) < 0) {
- goto cleanup;
- }
- }
}
+
+ /* set IP addresses and routes */
+ if (virNetDevIPInfoAddToDev(newname, &netDef->guestIP) < 0)
+ goto cleanup;
}
/* enable lo device only if there were other net devices */
if ((veths || privNet) &&
virNetDevSetOnline("lo", true) < 0)
- goto cleanup;
+ goto cleanup;
ret = 0;
cleanup:
virNetDevIPRouteFree(ip->routes[i]);
VIR_FREE(ip->routes);
}
+
+
+/**
+ * virNetDevIPInfoAddToDev:
+ * @ifname: name of device to operate on
+ * @ipInfo: list of routes and IP addresses to add to this device
+ *
+ * All IP routes and IP addresses in ipInfo are added to the named device.
+ *
+ * Returns: 0 on success, -1 (and error reported) on failure.
+ */
+int
+virNetDevIPInfoAddToDev(const char *ifname,
+ virNetDevIPInfo const *ipInfo)
+{
+ int ret = -1;
+ size_t i;
+ int prefix;
+
+ /* add all IP addresses */
+ for (i = 0; i < ipInfo->nips; i++) {
+ virNetDevIPAddrPtr ip = ipInfo->ips[i];
+
+ if ((prefix = virSocketAddrGetIPPrefix(&ip->address,
+ NULL, ip->prefix)) < 0) {
+ char *ipStr = virSocketAddrFormat(&ip->address);
+
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Failed to determine prefix for IP address '%s'"),
+ NULLSTR(ipStr));
+ VIR_FREE(ipStr);
+ goto cleanup;
+ }
+ if (virNetDevIPAddrAdd(ifname, &ip->address, NULL, prefix) < 0)
+ goto cleanup;
+ }
+
+ /* add all routes */
+ for (i = 0; i < ipInfo->nroutes; i++) {
+ virNetDevIPRoutePtr route = ipInfo->routes[i];
+
+ if ((prefix = virNetDevIPRouteGetPrefix(route)) < 0) {
+ char *ipStr = virSocketAddrFormat(&route->address);
+
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Failed to determine prefix for route with destination '%s'"),
+ NULLSTR(ipStr));
+ VIR_FREE(ipStr);
+ goto cleanup;
+ }
+ if (virNetDevIPRouteAdd(ifname, &route->address, prefix,
+ &route->gateway,
+ virNetDevIPRouteGetMetric(route)) < 0)
+ goto cleanup;
+ }
+
+ ret = 0;
+ cleanup:
+ return ret;
+}