diff options
Diffstat (limited to 'src/nm-device-olpc-mesh.c')
| -rw-r--r-- | src/nm-device-olpc-mesh.c | 96 |
1 files changed, 24 insertions, 72 deletions
diff --git a/src/nm-device-olpc-mesh.c b/src/nm-device-olpc-mesh.c index 289e5be3..1417736f 100644 --- a/src/nm-device-olpc-mesh.c +++ b/src/nm-device-olpc-mesh.c @@ -94,7 +94,7 @@ struct _NMDeviceOlpcMeshPrivate { gboolean dispose_has_run; - struct ether_addr hw_addr; + guint8 hw_addr[ETH_ALEN]; GByteArray * ssid; @@ -139,7 +139,7 @@ nm_device_olpc_mesh_init (NMDeviceOlpcMesh * self) priv->companion = NULL; priv->stage1_waiting = FALSE; - memset (&(priv->hw_addr), 0, sizeof (struct ether_addr)); + memset (&priv->hw_addr, 0, sizeof (priv->hw_addr)); } static GObject* @@ -187,24 +187,6 @@ constructor (GType type, } static gboolean -hw_is_up (NMDevice *device) -{ - return nm_system_iface_is_up (nm_device_get_ip_ifindex (device)); -} - -static gboolean -hw_bring_up (NMDevice *dev, gboolean *no_firmware) -{ - return nm_system_iface_set_up (nm_device_get_ip_ifindex (dev), TRUE, no_firmware); -} - -static void -hw_take_down (NMDevice *dev) -{ - nm_system_iface_set_up (nm_device_get_ip_ifindex (dev), FALSE, NULL); -} - -static gboolean is_up (NMDevice *device) { NMDeviceOlpcMesh *self = NM_DEVICE_OLPC_MESH (device); @@ -315,23 +297,6 @@ complete_connection (NMDevice *device, return TRUE; } -/* - * nm_device_olpc_mesh_get_address - * - * Get a device's hardware address - * - */ -static void -nm_device_olpc_mesh_get_address (NMDeviceOlpcMesh *self, - struct ether_addr *addr) -{ - NMDeviceOlpcMeshPrivate *priv = NM_DEVICE_OLPC_MESH_GET_PRIVATE (self); - g_return_if_fail (self != NULL); - g_return_if_fail (addr != NULL); - - memcpy (addr, &(priv->hw_addr), sizeof (struct ether_addr)); -} - /****************************************************************************/ static void @@ -339,34 +304,26 @@ update_hw_address (NMDevice *dev) { NMDeviceOlpcMesh *self = NM_DEVICE_OLPC_MESH (dev); NMDeviceOlpcMeshPrivate *priv = NM_DEVICE_OLPC_MESH_GET_PRIVATE (self); - struct ifreq req; - int ret, fd; - - fd = socket (PF_INET, SOCK_DGRAM, 0); - if (fd < 0) { - nm_log_warn (LOGD_OLPC_MESH, "could not open control socket."); - return; - } - - memset (&req, 0, sizeof (struct ifreq)); - strncpy (req.ifr_name, nm_device_get_iface (dev), IFNAMSIZ); - ret = ioctl (fd, SIOCGIFHWADDR, &req); - if (ret) { - nm_log_warn (LOGD_OLPC_MESH, "(%s): error getting hardware address: %d", - nm_device_get_iface (dev), errno); - goto out; + gsize addrlen; + gboolean changed = FALSE; + + addrlen = nm_device_read_hwaddr (dev, priv->hw_addr, sizeof (priv->hw_addr), &changed); + if (addrlen) { + g_return_if_fail (addrlen == ETH_ALEN); + if (changed) + g_object_notify (G_OBJECT (dev), NM_DEVICE_OLPC_MESH_HW_ADDRESS); } +} - if (memcmp (&priv->hw_addr, &req.ifr_hwaddr.sa_data, sizeof (struct ether_addr))) { - memcpy (&priv->hw_addr, &req.ifr_hwaddr.sa_data, sizeof (struct ether_addr)); - g_object_notify (G_OBJECT (dev), NM_DEVICE_OLPC_MESH_HW_ADDRESS); - } +static const guint8 * +get_hw_address (NMDevice *device, guint *out_len) +{ + NMDeviceOlpcMeshPrivate *priv = NM_DEVICE_OLPC_MESH_GET_PRIVATE (device); -out: - close (fd); + *out_len = sizeof (priv->hw_addr); + return priv->hw_addr; } - static NMActStageReturn act_stage1_prepare (NMDevice *dev, NMDeviceStateReason *reason) { @@ -506,12 +463,10 @@ get_property (GObject *object, guint prop_id, { NMDeviceOlpcMesh *device = NM_DEVICE_OLPC_MESH (object); NMDeviceOlpcMeshPrivate *priv = NM_DEVICE_OLPC_MESH_GET_PRIVATE (device); - struct ether_addr hw_addr; switch (prop_id) { case PROP_HW_ADDRESS: - nm_device_olpc_mesh_get_address (device, &hw_addr); - g_value_take_string (value, nm_utils_hwaddr_ntoa (&hw_addr, ARPHRD_ETHER)); + g_value_take_string (value, nm_utils_hwaddr_ntoa (priv->hw_addr, ARPHRD_ETHER)); break; case PROP_COMPANION: if (priv->companion) @@ -554,13 +509,11 @@ nm_device_olpc_mesh_class_init (NMDeviceOlpcMeshClass *klass) parent_class->get_type_capabilities = NULL; parent_class->get_generic_capabilities = get_generic_capabilities; - parent_class->hw_is_up = hw_is_up; - parent_class->hw_bring_up = hw_bring_up; - parent_class->hw_take_down = hw_take_down; parent_class->is_up = is_up; parent_class->bring_up = bring_up; parent_class->take_down = take_down; parent_class->update_hw_address = update_hw_address; + parent_class->get_hw_address = get_hw_address; parent_class->check_connection_compatible = check_connection_compatible; parent_class->complete_connection = complete_connection; @@ -672,18 +625,17 @@ static gboolean is_companion (NMDeviceOlpcMesh *self, NMDevice *other) { NMDeviceOlpcMeshPrivate *priv = NM_DEVICE_OLPC_MESH_GET_PRIVATE (self); - struct ether_addr their_addr; + const guint8 *their_addr; + guint their_addr_len = 0; NMManager *manager; if (!NM_IS_DEVICE_WIFI (other)) return FALSE; - nm_device_wifi_get_address (NM_DEVICE_WIFI (other), &their_addr); - - if (memcmp (priv->hw_addr.ether_addr_octet, - their_addr.ether_addr_octet, ETH_ALEN) != 0) { + their_addr = nm_device_get_hw_address (other, &their_addr_len); + if ( (their_addr_len != ETH_ALEN) + || (memcmp (priv->hw_addr, their_addr, ETH_ALEN) != 0)) return FALSE; - } priv->companion = other; |