From 5b8589dfb0a436586fefc29f2788679262c00512 Mon Sep 17 00:00:00 2001 From: Robert Love Date: Tue, 10 Jan 2006 21:15:54 +0000 Subject: [PATCH] 2006-01-10 Robert Love * src/nm-device-802-11-wireless.c, src/nm-device-802-11-wireless.h, src/nm-device-802-3-ethernet.c, src/nm-device-802-3-ethernet.h, src/nm-device.c: Fix a FIXME! Reimplement the function nm_device_update_hw_address() in device subclass variants, nm_device_802_3_ethernet_set_address() and nm_device_802_11_wireless_set_address(), hook them up, and use them. This fixes the existing bug where MAC addresses are all zeros. git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@1309 4912f4e0-d625-0410-9fb7-b9a5a253dbdc --- ChangeLog | 10 ++++++++++ src/nm-device-802-11-wireless.c | 31 ++++++++++++++++++++++++++++++- src/nm-device-802-11-wireless.h | 2 ++ src/nm-device-802-3-ethernet.c | 32 +++++++++++++++++++++++++++++++- src/nm-device-802-3-ethernet.h | 2 ++ src/nm-device.c | 22 ++++++++++++---------- 6 files changed, 87 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index 80cefdcf2a..8b031158c9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2006-01-10 Robert Love + + * src/nm-device-802-11-wireless.c, src/nm-device-802-11-wireless.h, + src/nm-device-802-3-ethernet.c, src/nm-device-802-3-ethernet.h, + src/nm-device.c: Fix a FIXME! Reimplement the function + nm_device_update_hw_address() in device subclass variants, + nm_device_802_3_ethernet_set_address() and + nm_device_802_11_wireless_set_address(), hook them up, and use them. + This fixes the existing bug where MAC addresses are all zeros. + 2006-01-10 Robert Love * gnome/applet/applet-dbus-devices.c, gnome/applet/applet-dbus.h, diff --git a/src/nm-device-802-11-wireless.c b/src/nm-device-802-11-wireless.c index ce0a60365b..c39f9e55f9 100644 --- a/src/nm-device-802-11-wireless.c +++ b/src/nm-device-802-11-wireless.c @@ -409,7 +409,6 @@ nm_device_802_11_wireless_copy_allowed_to_dev_list (NMDevice80211Wireless *self, } - /* * nm_device_802_11_wireless_get_address * @@ -427,6 +426,36 @@ nm_device_802_11_wireless_get_address (NMDevice80211Wireless *self, } +/* + * nm_device_802_11_wireless_set_address + * + * Set a device's hardware address + * + */ +void +nm_device_802_11_wireless_set_address (NMDevice80211Wireless *self) +{ + NMDevice *dev = NM_DEVICE (self); + struct ifreq req; + NMSock *sk; + int ret; + + g_return_if_fail (self != NULL); + + sk = nm_dev_sock_open (dev, DEV_GENERAL, __FUNCTION__, NULL); + if (!sk) + return; + memset (&req, 0, sizeof (struct ifreq)); + strncpy (req.ifr_name, nm_device_get_iface (dev), sizeof (req.ifr_name) - 1); + + ret = ioctl (nm_dev_sock_get_fd (sk), SIOCGIFHWADDR, &req); + if (ret) + return; + + memcpy (&(self->priv->hw_addr), &(req.ifr_hwaddr.sa_data), sizeof (struct ether_addr)); +} + + static gboolean link_to_specific_ap (NMDevice80211Wireless *self, NMAccessPoint *ap, diff --git a/src/nm-device-802-11-wireless.h b/src/nm-device-802-11-wireless.h index 97f4d0df4f..5575db0e9d 100644 --- a/src/nm-device-802-11-wireless.h +++ b/src/nm-device-802-11-wireless.h @@ -82,6 +82,8 @@ void nm_device_802_11_wireless_set_essid (NMDevice80211Wireless *self, void nm_device_802_11_wireless_get_address (NMDevice80211Wireless *dev, struct ether_addr *addr); +void nm_device_802_11_wireless_set_address (NMDevice80211Wireless *dev); + void nm_device_802_11_wireless_get_bssid (NMDevice80211Wireless *dev, struct ether_addr *bssid); diff --git a/src/nm-device-802-3-ethernet.c b/src/nm-device-802-3-ethernet.c index ae4757df67..e37cda543a 100644 --- a/src/nm-device-802-3-ethernet.c +++ b/src/nm-device-802-3-ethernet.c @@ -134,7 +134,7 @@ real_start (NMDevice *dev) /* - * nm_device_get_hw_address + * nm_device_802_3_ethernet_get_address * * Get a device's hardware address * @@ -149,6 +149,36 @@ nm_device_802_3_ethernet_get_address (NMDevice8023Ethernet *self, struct ether_a } +/* + * nm_device_802_3_ethernet_set_address + * + * Set a device's hardware address + * + */ +void +nm_device_802_3_ethernet_set_address (NMDevice8023Ethernet *self) +{ + NMDevice *dev = NM_DEVICE (self); + struct ifreq req; + NMSock *sk; + int ret; + + g_return_if_fail (self != NULL); + + sk = nm_dev_sock_open (dev, DEV_GENERAL, __FUNCTION__, NULL); + if (!sk) + return; + memset (&req, 0, sizeof (struct ifreq)); + strncpy (req.ifr_name, nm_device_get_iface (dev), sizeof (req.ifr_name) - 1); + + ret = ioctl (nm_dev_sock_get_fd (sk), SIOCGIFHWADDR, &req); + if (ret) + return; + + memcpy (&(self->priv->hw_addr), &(req.ifr_hwaddr.sa_data), sizeof (struct ether_addr)); +} + + static guint32 real_get_generic_capabilities (NMDevice *dev) { diff --git a/src/nm-device-802-3-ethernet.h b/src/nm-device-802-3-ethernet.h index f911c126a1..308a38eb56 100644 --- a/src/nm-device-802-3-ethernet.h +++ b/src/nm-device-802-3-ethernet.h @@ -83,6 +83,8 @@ static inline gboolean nm_device_is_802_3_ethernet (NMDevice *dev) void nm_device_802_3_ethernet_get_address (NMDevice8023Ethernet *dev, struct ether_addr *addr); +void nm_device_802_3_ethernet_set_address (NMDevice8023Ethernet *dev); + G_END_DECLS #endif /* NM_DEVICE_802_3_ETHERNET_H */ diff --git a/src/nm-device.c b/src/nm-device.c index 638b0a7c5e..4133505197 100644 --- a/src/nm-device.c +++ b/src/nm-device.c @@ -191,10 +191,12 @@ nm_device_new (const char *iface, nm_device_bring_up_wait (dev, FALSE); nm_device_update_ip4_address (dev); -/* FIXME */ -#if 0 - nm_device_update_hw_address (dev); -#endif + + /* Update the device's hardware address */ + if (nm_device_is_802_3_ethernet (dev)) + nm_device_802_3_ethernet_set_address (NM_DEVICE_802_3_ETHERNET (dev)); + else if (nm_device_is_802_11_wireless (dev)) + nm_device_802_11_wireless_set_address (NM_DEVICE_802_11_WIRELESS (dev)); /* Grab IP config data for this device from the system configuration files */ dev->priv->system_config_data = nm_system_device_get_system_config (dev); @@ -1715,14 +1717,14 @@ nm_device_set_up_down (NMDevice *self, nm_system_device_set_up_down (self, up); - /* Make sure we have a valid MAC address, some cards reload firmware when they + /* + * Make sure that we have a valid MAC address, some cards reload firmware when they * are brought up. */ -/* FIXME */ -#if 0 - if (up && !nm_ethernet_address_is_valid (&(self->priv->hw_addr))) - nm_device_update_hw_address (self); -#endif + if (nm_device_is_802_3_ethernet (self)) + nm_device_802_3_ethernet_set_address (NM_DEVICE_802_3_ETHERNET (self)); + else if (nm_device_is_802_11_wireless (self)) + nm_device_802_11_wireless_set_address (NM_DEVICE_802_11_WIRELESS (self)); }