summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2017-02-21 15:54:01 +0100
committerBeniamino Galvani <bgalvani@redhat.com>2017-02-22 18:28:04 +0100
commit594190c345549b4c543b5eff34dee3fc8cbb43e6 (patch)
treebde09a517f4cafc065d4c55bd1041540f83456ca
parenta5912f0ee8da93c68c19e36afcf69d27808fd8df (diff)
downloadNetworkManager-594190c345549b4c543b5eff34dee3fc8cbb43e6.tar.gz
device: split out cloned MAC decision from nm_device_hw_addr_set_cloned()
In this way, we can query the final cloned address (after special values as 'random', 'stable', etc. have been evaluated) from subclasses.
-rw-r--r--src/devices/nm-device.c120
-rw-r--r--src/devices/nm-device.h6
2 files changed, 110 insertions, 16 deletions
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index 006e523641..7b23a1e41d 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -12772,16 +12772,43 @@ nm_device_hw_addr_set (NMDevice *self,
return _hw_addr_set (self, addr, "set", detail);
}
-gboolean
-nm_device_hw_addr_set_cloned (NMDevice *self, NMConnection *connection, gboolean is_wifi)
+/*
+ * _hw_addr_get_cloned:
+ * @self: a #NMDevice
+ * @connection: a #NMConnection
+ * @is_wifi: whether the device is Wi-Fi
+ * @preserve: (out): whether the address must be reset to initial one
+ * @hwaddr: (out): the cloned MAC address to set on interface
+ * @hwaddr_type: (out): the type of address to set
+ * @hwaddr_detail: (out): the detail (origin) of address to set
+ * @error: (out): on return, an error or %NULL
+ *
+ * Computes the MAC to be set on a interface. On success, one of the
+ * following exclusive conditions are verified:
+ *
+ * - @preserve is %TRUE: the address must be reset to the initial one
+ * - @hwaddr is not %NULL: the given address must be set on the device
+ * - @hwaddr is %NULL and @preserve is %FALSE: no action needed
+ *
+ * Returns: %FALSE in case of error in determining the cloned MAC address,
+ * %TRUE otherwise
+ */
+static gboolean
+_hw_addr_get_cloned (NMDevice *self, NMConnection *connection, gboolean is_wifi,
+ gboolean *preserve, char **hwaddr, HwAddrType *hwaddr_type,
+ char **hwaddr_detail, GError **error)
{
NMDevicePrivate *priv;
gs_free char *hw_addr_tmp = NULL;
gs_free char *hw_addr_generated = NULL;
gs_free char *generate_mac_address_mask_tmp = NULL;
const char *addr, *addr_setting;
+ char *addr_out = NULL;
+ HwAddrType type_out = HW_ADDR_TYPE_UNSET;
g_return_val_if_fail (NM_IS_DEVICE (self), FALSE);
+ g_return_val_if_fail (NM_IS_CONNECTION (connection), FALSE);
+ g_return_val_if_fail (!error || !*error, FALSE);
priv = NM_DEVICE_GET_PRIVATE (self);
@@ -12792,29 +12819,44 @@ nm_device_hw_addr_set_cloned (NMDevice *self, NMConnection *connection, gboolean
if (nm_streq (addr, NM_CLONED_MAC_PRESERVE)) {
/* "preserve" means to reset the initial MAC address. */
- return nm_device_hw_addr_reset (self, addr_setting);
+ NM_SET_OUT (preserve, TRUE);
+ NM_SET_OUT (hwaddr, addr_out);
+ NM_SET_OUT (hwaddr_type, type_out);
+ NM_SET_OUT (hwaddr_detail, g_strdup (addr_setting));
+ return TRUE;
}
if (nm_streq (addr, NM_CLONED_MAC_PERMANENT)) {
addr = nm_device_get_permanent_hw_address (self);
- if (!addr)
+ if (!addr) {
+ g_set_error_literal (error,
+ NM_DEVICE_ERROR,
+ NM_DEVICE_ERROR_FAILED,
+ "failed to retrieve permanent address");
return FALSE;
- priv->hw_addr_type = HW_ADDR_TYPE_PERMANENT;
+ }
+ addr_out = g_strdup (addr);
+ type_out = HW_ADDR_TYPE_PERMANENT;
} else if (NM_IN_STRSET (addr, NM_CLONED_MAC_RANDOM)) {
if (priv->hw_addr_type == HW_ADDR_TYPE_GENERATED) {
/* hm, we already use a generate MAC address. Most certainly, that is from the same
* activation request, so we should not create a new random address, instead keep
* the current. */
- return TRUE;
+ goto out;
}
hw_addr_generated = nm_utils_hw_addr_gen_random_eth (nm_device_get_initial_hw_address (self),
- _get_generate_mac_address_mask_setting (self, connection, is_wifi, &generate_mac_address_mask_tmp));
+ _get_generate_mac_address_mask_setting (self, connection,
+ is_wifi,
+ &generate_mac_address_mask_tmp));
if (!hw_addr_generated) {
- _LOGW (LOGD_DEVICE, "set-hw-addr: failed to generate %s MAC address", "random");
+ g_set_error (error,
+ NM_DEVICE_ERROR,
+ NM_DEVICE_ERROR_FAILED,
+ "failed to generate %s MAC address", "random");
return FALSE;
}
- priv->hw_addr_type = HW_ADDR_TYPE_GENERATED;
- addr = hw_addr_generated;
+ type_out = HW_ADDR_TYPE_GENERATED;
+ addr_out = g_steal_pointer (&hw_addr_generated);
} else if (NM_IN_STRSET (addr, NM_CLONED_MAC_STABLE)) {
NMUtilsStableType stable_type;
const char *stable_id;
@@ -12822,7 +12864,7 @@ nm_device_hw_addr_set_cloned (NMDevice *self, NMConnection *connection, gboolean
if (priv->hw_addr_type == HW_ADDR_TYPE_GENERATED) {
/* hm, we already use a generate MAC address. Most certainly, that is from the same
* activation request, so let's skip creating the stable address anew. */
- return TRUE;
+ goto out;
}
stable_id = _get_stable_id (self, connection, &stable_type);
@@ -12833,19 +12875,65 @@ nm_device_hw_addr_set_cloned (NMDevice *self, NMConnection *connection, gboolean
_get_generate_mac_address_mask_setting (self, connection, is_wifi, &generate_mac_address_mask_tmp));
}
if (!hw_addr_generated) {
- _LOGW (LOGD_DEVICE, "set-hw-addr: failed to generate %s MAC address", "stable");
+ g_set_error (error,
+ NM_DEVICE_ERROR,
+ NM_DEVICE_ERROR_FAILED,
+ "failed to generate %s MAC address", "stable");
return FALSE;
}
- priv->hw_addr_type = HW_ADDR_TYPE_GENERATED;
- addr = hw_addr_generated;
+
+ type_out = HW_ADDR_TYPE_GENERATED;
+ addr_out = g_steal_pointer (&hw_addr_generated);
} else {
/* this must be a valid address. Otherwise, we shouldn't come here. */
if (!nm_utils_hwaddr_valid (addr, -1))
g_return_val_if_reached (FALSE);
- priv->hw_addr_type = HW_ADDR_TYPE_EXPLICIT;
+
+ type_out = HW_ADDR_TYPE_EXPLICIT;
+ addr_out = g_strdup (addr);
}
- return _hw_addr_set (self, addr, "set-cloned", addr_setting);
+out:
+ NM_SET_OUT (preserve, FALSE);
+ NM_SET_OUT (hwaddr, addr_out);
+ NM_SET_OUT (hwaddr_type, type_out);
+ NM_SET_OUT (hwaddr_detail, g_strdup (addr_setting));
+
+ return TRUE;
+}
+
+gboolean
+nm_device_hw_addr_get_cloned (NMDevice *self, NMConnection *connection, gboolean is_wifi,
+ char **hwaddr, gboolean *preserve, GError **error)
+{
+ if (!_hw_addr_get_cloned (self, connection, is_wifi, preserve, hwaddr, NULL, NULL, error))
+ return FALSE;
+
+ return TRUE;
+}
+
+gboolean
+nm_device_hw_addr_set_cloned (NMDevice *self, NMConnection *connection, gboolean is_wifi)
+{
+ NMDevicePrivate *priv;
+ gboolean reset = FALSE;
+ gs_free char *hwaddr = NULL;
+ gs_free char *detail = NULL;
+ HwAddrType type = HW_ADDR_TYPE_UNSET;
+ gs_free_error GError *error = NULL;
+
+ g_return_val_if_fail (NM_IS_DEVICE (self), FALSE);
+ priv = NM_DEVICE_GET_PRIVATE (self);
+
+ if (!_hw_addr_get_cloned (self, connection, is_wifi, &reset, &hwaddr, &type, &detail, &error)) {
+ _LOGW (LOGD_DEVICE, "set-hw-addr: %s", error->message);
+ return FALSE;
+ }
+
+ if (reset)
+ return nm_device_hw_addr_reset (self, detail);
+
+ return _hw_addr_set (self, hwaddr, "set-cloned", detail);
}
gboolean
diff --git a/src/devices/nm-device.h b/src/devices/nm-device.h
index 4ddb817290..2567aa94ce 100644
--- a/src/devices/nm-device.h
+++ b/src/devices/nm-device.h
@@ -641,5 +641,11 @@ void nm_device_update_initial_hw_address (NMDevice *self);
void nm_device_update_permanent_hw_address (NMDevice *self, gboolean force_freeze);
void nm_device_update_dynamic_ip_setup (NMDevice *self);
guint nm_device_get_supplicant_timeout (NMDevice *self);
+gboolean nm_device_hw_addr_get_cloned (NMDevice *self,
+ NMConnection *connection,
+ gboolean is_wifi,
+ char **hwaddr,
+ gboolean *preserve,
+ GError **error);
#endif /* __NETWORKMANAGER_DEVICE_H__ */