mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2025-12-31 09:00:13 +01:00
core: use IP interface hardware address for IP-level operations
The IP interface may have its own hardware address (like the net port for WWAN devices) and that's the hardware address that must be used for DHCP and IPv6 SLAAC, not the hardware address (if any) of the NMDevice itself. This patch does change the NMDevice hardware address property to always be the Device's hardware address, instead of the IP interface hardware address. This means that ADSL and WWAN will no longer change their hardware address to the hardware address of their IP interface. But in all these cases, the hardware address is non-existent (PPP) or transient and meaningless (WWAN/ADSL).
This commit is contained in:
parent
15734a4ba5
commit
7f771d0a05
3 changed files with 23 additions and 21 deletions
|
|
@ -142,9 +142,6 @@ set_nas_iface (NMDeviceAdsl *self, int idx, const char *name)
|
|||
|
||||
g_warn_if_fail (priv->nas_ifname == NULL);
|
||||
priv->nas_ifname = g_strdup (name);
|
||||
|
||||
/* Update NAS interface's MAC address */
|
||||
nm_device_update_hw_address (NM_DEVICE (self));
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
|
@ -482,9 +479,6 @@ deactivate (NMDevice *device)
|
|||
priv->nas_ifindex = -1;
|
||||
g_free (priv->nas_ifname);
|
||||
priv->nas_ifname = NULL;
|
||||
|
||||
/* Poke NMDevice to notice that our hw_address is no longer valid */
|
||||
nm_device_update_hw_address (NM_DEVICE (self));
|
||||
}
|
||||
|
||||
/**************************************************************/
|
||||
|
|
@ -492,9 +486,7 @@ deactivate (NMDevice *device)
|
|||
static guint
|
||||
get_hw_address_length (NMDevice *device, gboolean *out_permanent)
|
||||
{
|
||||
NMDeviceAdslPrivate *priv = NM_DEVICE_ADSL_GET_PRIVATE (device);
|
||||
|
||||
return priv->nas_ifname ? ETH_ALEN : 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
|
|
|||
|
|
@ -52,7 +52,6 @@ gboolean nm_device_bring_up (NMDevice *self, gboolean wait, gboolean *no_firmwar
|
|||
|
||||
void nm_device_take_down (NMDevice *self, gboolean block);
|
||||
|
||||
gboolean nm_device_update_hw_address (NMDevice *self);
|
||||
gboolean nm_device_set_hw_addr (NMDevice *device, const guint8 *addr,
|
||||
const char *detail, guint64 hw_log_domain);
|
||||
|
||||
|
|
|
|||
|
|
@ -324,6 +324,8 @@ static void _set_state_full (NMDevice *device,
|
|||
NMDeviceStateReason reason,
|
||||
gboolean quitting);
|
||||
|
||||
static gboolean nm_device_update_hw_address (NMDevice *dev);
|
||||
|
||||
/***********************************************************/
|
||||
|
||||
static GQuark
|
||||
|
|
@ -2751,6 +2753,8 @@ dhcp4_start (NMDevice *self,
|
|||
{
|
||||
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
|
||||
NMSettingIP4Config *s_ip4;
|
||||
const guint8 *hw_addr;
|
||||
size_t hw_addr_len = 0;
|
||||
GByteArray *tmp = NULL;
|
||||
|
||||
s_ip4 = nm_connection_get_setting_ip4_config (connection);
|
||||
|
|
@ -2760,9 +2764,10 @@ dhcp4_start (NMDevice *self,
|
|||
g_object_unref (priv->dhcp4_config);
|
||||
priv->dhcp4_config = nm_dhcp4_config_new ();
|
||||
|
||||
if (priv->hw_addr_len) {
|
||||
tmp = g_byte_array_sized_new (priv->hw_addr_len);
|
||||
g_byte_array_append (tmp, priv->hw_addr, priv->hw_addr_len);
|
||||
hw_addr = nm_platform_link_get_address (nm_device_get_ip_ifindex (self), &hw_addr_len);
|
||||
if (hw_addr_len) {
|
||||
tmp = g_byte_array_sized_new (hw_addr_len);
|
||||
g_byte_array_append (tmp, hw_addr, hw_addr_len);
|
||||
}
|
||||
|
||||
/* Begin DHCP on the interface */
|
||||
|
|
@ -3205,6 +3210,8 @@ dhcp6_start (NMDevice *self,
|
|||
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
|
||||
NMActStageReturn ret = NM_ACT_STAGE_RETURN_FAILURE;
|
||||
GByteArray *tmp = NULL;
|
||||
const guint8 *hw_addr;
|
||||
size_t hw_addr_len = 0;
|
||||
|
||||
if (!connection) {
|
||||
connection = nm_device_get_connection (self);
|
||||
|
|
@ -3225,9 +3232,10 @@ dhcp6_start (NMDevice *self,
|
|||
priv->dhcp6_ip6_config = NULL;
|
||||
}
|
||||
|
||||
if (priv->hw_addr_len) {
|
||||
tmp = g_byte_array_sized_new (priv->hw_addr_len);
|
||||
g_byte_array_append (tmp, priv->hw_addr, priv->hw_addr_len);
|
||||
hw_addr = nm_platform_link_get_address (nm_device_get_ip_ifindex (self), &hw_addr_len);
|
||||
if (hw_addr_len) {
|
||||
tmp = g_byte_array_sized_new (hw_addr_len);
|
||||
g_byte_array_append (tmp, hw_addr, hw_addr_len);
|
||||
}
|
||||
|
||||
priv->dhcp6_client = nm_dhcp_manager_start_ip6 (nm_dhcp_manager_get (),
|
||||
|
|
@ -3639,12 +3647,15 @@ static void
|
|||
addrconf6_start_with_link_ready (NMDevice *self)
|
||||
{
|
||||
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
|
||||
const guint8 *hw_addr;
|
||||
size_t hw_addr_len = 0;
|
||||
|
||||
g_assert (priv->rdisc);
|
||||
|
||||
/* FIXME: what if interface has no lladdr, like PPP? */
|
||||
if (priv->hw_addr_len)
|
||||
nm_rdisc_set_lladdr (priv->rdisc, (const char *) priv->hw_addr, priv->hw_addr_len);
|
||||
hw_addr = nm_platform_link_get_address (nm_device_get_ip_ifindex (self), &hw_addr_len);
|
||||
if (hw_addr_len)
|
||||
nm_rdisc_set_lladdr (priv->rdisc, (const char *) hw_addr, hw_addr_len);
|
||||
|
||||
nm_device_ipv6_sysctl_set (self, "accept_ra", "1");
|
||||
nm_device_ipv6_sysctl_set (self, "accept_ra_defrtr", "0");
|
||||
|
|
@ -6946,7 +6957,7 @@ nm_device_get_hw_address (NMDevice *dev, guint *out_len)
|
|||
return priv->hw_addr;
|
||||
}
|
||||
|
||||
gboolean
|
||||
static gboolean
|
||||
nm_device_update_hw_address (NMDevice *dev)
|
||||
{
|
||||
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (dev);
|
||||
|
|
@ -6959,7 +6970,7 @@ nm_device_update_hw_address (NMDevice *dev)
|
|||
return FALSE;
|
||||
|
||||
if (priv->hw_addr_len) {
|
||||
int ifindex = nm_device_get_ip_ifindex (dev);
|
||||
int ifindex = nm_device_get_ifindex (dev);
|
||||
gsize addrlen;
|
||||
const guint8 *binaddr;
|
||||
|
||||
|
|
@ -7112,7 +7123,7 @@ get_hw_address_length (NMDevice *dev, gboolean *out_permanent)
|
|||
{
|
||||
size_t len;
|
||||
|
||||
if (nm_platform_link_get_address (nm_device_get_ip_ifindex (dev), &len))
|
||||
if (nm_platform_link_get_address (nm_device_get_ifindex (dev), &len))
|
||||
return len;
|
||||
else
|
||||
return 0;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue