diff options
author | Dan Winship <danw@gnome.org> | 2014-02-04 14:27:03 +0100 |
---|---|---|
committer | Dan Winship <danw@gnome.org> | 2014-04-17 12:45:32 -0400 |
commit | df435f40152255aa95f82df00d4a776ea9605d58 (patch) | |
tree | 316a335a5dbf50ba4811d005dbecbef89f5519fd | |
parent | 090a52217cee39f5dfc127ff679f6adf973f6ee3 (diff) |
wifi: move wifi-utils into platform
Move wifi-utils into NMPlatform, and update callers to use the new
NMPlatform wrappers
20 files changed, 534 insertions, 77 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index f3fcfba98e..ca2a372585 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -130,6 +130,11 @@ nm_sources = \ platform/nm-linux-platform.h \ platform/nm-platform.c \ platform/nm-platform.h \ + platform/wifi/wifi-utils-nl80211.c \ + platform/wifi/wifi-utils-nl80211.h \ + platform/wifi/wifi-utils-private.h \ + platform/wifi/wifi-utils.c \ + platform/wifi/wifi-utils.h \ \ rdisc/nm-fake-rdisc.c \ rdisc/nm-fake-rdisc.h \ @@ -194,12 +199,6 @@ nm_sources = \ vpn-manager/nm-vpn-service.c \ vpn-manager/nm-vpn-service.h \ \ - wifi/wifi-utils-nl80211.c \ - wifi/wifi-utils-nl80211.h \ - wifi/wifi-utils-private.h \ - wifi/wifi-utils.c \ - wifi/wifi-utils.h \ - \ nm-activation-request.c \ nm-activation-request.h \ nm-active-connection.c \ @@ -270,7 +269,9 @@ nm_sources += nm-sleep-monitor-upower.c endif if WITH_WEXT -nm_sources += wifi/wifi-utils-wext.c wifi/wifi-utils-wext.h +nm_sources += \ + platform/wifi/wifi-utils-wext.c \ + platform/wifi/wifi-utils-wext.h endif diff --git a/src/devices/nm-device-olpc-mesh.c b/src/devices/nm-device-olpc-mesh.c index b85956ef63..c80d9b345e 100644 --- a/src/devices/nm-device-olpc-mesh.c +++ b/src/devices/nm-device-olpc-mesh.c @@ -53,10 +53,6 @@ #include "nm-manager.h" #include "nm-enum-types.h" #include "nm-dbus-manager.h" -#include "wifi-utils.h" -#if HAVE_WEXT -#include "wifi-utils-wext.h" -#endif /* This is a bug; but we can't really change API now... */ #include "NetworkManagerVPN.h" @@ -83,8 +79,6 @@ enum { struct _NMDeviceOlpcMeshPrivate { gboolean dispose_has_run; - WifiData * wifi_data; - NMDevice * companion; gboolean stage1_waiting; guint device_added_id; @@ -126,6 +120,7 @@ constructor (GType type, GObjectClass *klass; NMDeviceOlpcMesh *self; NMDeviceOlpcMeshPrivate *priv; + NMDeviceWifiCapabilities caps; klass = G_OBJECT_CLASS (nm_device_olpc_mesh_parent_class); object = klass->constructor (type, n_construct_params, construct_params); @@ -139,17 +134,7 @@ constructor (GType type, nm_device_get_iface (NM_DEVICE (self)), nm_device_get_ifindex (NM_DEVICE (self))); - /* - * The kernel driver now uses nl80211, but we force use of WEXT because - * the cfg80211 interactions are not quite ready to support access to - * mesh control through nl80211 just yet. - */ -#if HAVE_WEXT - priv->wifi_data = wifi_wext_init (nm_device_get_iface (NM_DEVICE (self)), - nm_device_get_ifindex (NM_DEVICE (self)), - FALSE); -#endif - if (priv->wifi_data == NULL) { + if (!nm_platform_wifi_get_capabilities (nm_device_get_ifindex (NM_DEVICE (self)), &caps)) { nm_log_warn (LOGD_HW | LOGD_OLPC_MESH, "(%s): failed to initialize WiFi driver", nm_device_get_iface (NM_DEVICE (self))); g_object_unref (object); @@ -287,10 +272,10 @@ act_stage1_prepare (NMDevice *dev, NMDeviceStateReason *reason) static void _mesh_set_channel (NMDeviceOlpcMesh *self, guint32 channel) { - NMDeviceOlpcMeshPrivate *priv = NM_DEVICE_OLPC_MESH_GET_PRIVATE (self); + int ifindex = nm_device_get_ifindex (NM_DEVICE (self)); - if (wifi_utils_get_mesh_channel (priv->wifi_data) != channel) { - if (wifi_utils_set_mesh_channel (priv->wifi_data, channel)) + if (nm_platform_mesh_get_channel (ifindex) != channel) { + if (nm_platform_mesh_set_channel (ifindex, channel)) g_object_notify (G_OBJECT (self), NM_DEVICE_OLPC_MESH_ACTIVE_CHANNEL); } } @@ -299,7 +284,6 @@ static NMActStageReturn act_stage2_config (NMDevice *dev, NMDeviceStateReason *reason) { NMDeviceOlpcMesh *self = NM_DEVICE_OLPC_MESH (dev); - NMDeviceOlpcMeshPrivate *priv = NM_DEVICE_OLPC_MESH_GET_PRIVATE (self); NMConnection *connection; NMSettingOlpcMesh *s_mesh; guint32 channel; @@ -315,7 +299,8 @@ act_stage2_config (NMDevice *dev, NMDeviceStateReason *reason) channel = nm_setting_olpc_mesh_get_channel (s_mesh); if (channel != 0) _mesh_set_channel (self, channel); - wifi_utils_set_mesh_ssid (priv->wifi_data, nm_setting_olpc_mesh_get_ssid (s_mesh)); + nm_platform_mesh_set_ssid (nm_device_get_ifindex (dev), + nm_setting_olpc_mesh_get_ssid (s_mesh)); anycast_addr_array = nm_setting_olpc_mesh_get_dhcp_anycast_address (s_mesh); if (anycast_addr_array) @@ -369,9 +354,6 @@ dispose (GObject *object) } priv->dispose_has_run = TRUE; - if (priv->wifi_data) - wifi_utils_deinit (priv->wifi_data); - companion_cleanup (self); if (priv->device_added_id) @@ -397,7 +379,7 @@ get_property (GObject *object, guint prop_id, g_value_set_boxed (value, "/"); break; case PROP_ACTIVE_CHANNEL: - g_value_set_uint (value, wifi_utils_get_mesh_channel (priv->wifi_data)); + g_value_set_uint (value, nm_platform_mesh_get_channel (nm_device_get_ifindex (NM_DEVICE (device)))); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); diff --git a/src/devices/nm-device-wifi.c b/src/devices/nm-device-wifi.c index 7d992c7b6c..d6b71396b1 100644 --- a/src/devices/nm-device-wifi.c +++ b/src/devices/nm-device-wifi.c @@ -57,7 +57,6 @@ #include "nm-manager-auth.h" #include "nm-settings-connection.h" #include "nm-enum-types.h" -#include "wifi-utils.h" #include "nm-dbus-glib-types.h" @@ -149,7 +148,6 @@ struct _NMDeviceWifiPrivate { gboolean requested_scan; Supplicant supplicant; - WifiData * wifi_data; gboolean ssid_found; NM80211Mode mode; @@ -304,16 +302,13 @@ constructor (GType type, nm_device_get_iface (NM_DEVICE (self)), nm_device_get_ifindex (NM_DEVICE (self))); - priv->wifi_data = wifi_utils_init (nm_device_get_iface (NM_DEVICE (self)), - nm_device_get_ifindex (NM_DEVICE (self)), - TRUE); - if (priv->wifi_data == NULL) { + if (!nm_platform_wifi_get_capabilities (nm_device_get_ifindex (NM_DEVICE (self)), + &priv->capabilities)) { nm_log_warn (LOGD_HW | LOGD_WIFI, "(%s): failed to initialize WiFi driver", nm_device_get_iface (NM_DEVICE (self))); g_object_unref (object); return NULL; } - priv->capabilities = wifi_utils_get_caps (priv->wifi_data); if (priv->capabilities & NM_WIFI_DEVICE_CAP_AP) { nm_log_info (LOGD_HW | LOGD_WIFI, "(%s): driver supports Access Point (AP) mode", @@ -487,6 +482,7 @@ find_active_ap (NMDeviceWifi *self, { NMDeviceWifiPrivate *priv = NM_DEVICE_WIFI_GET_PRIVATE (self); const char *iface = nm_device_get_iface (NM_DEVICE (self)); + int ifindex = nm_device_get_ifindex (NM_DEVICE (self)); struct ether_addr bssid; GByteArray *ssid; GSList *iter; @@ -497,7 +493,7 @@ find_active_ap (NMDeviceWifi *self, NM80211Mode devmode; guint32 devfreq; - wifi_utils_get_bssid (priv->wifi_data, &bssid); + nm_platform_wifi_get_bssid (ifindex, &bssid); nm_log_dbg (LOGD_WIFI, "(%s): active BSSID: %02x:%02x:%02x:%02x:%02x:%02x", iface, bssid.ether_addr_octet[0], bssid.ether_addr_octet[1], @@ -507,15 +503,15 @@ find_active_ap (NMDeviceWifi *self, if (!nm_ethernet_address_is_valid (&bssid)) return NULL; - ssid = wifi_utils_get_ssid (priv->wifi_data); + ssid = nm_platform_wifi_get_ssid (ifindex); nm_log_dbg (LOGD_WIFI, "(%s): active SSID: %s%s%s", iface, ssid ? "'" : "", ssid ? nm_utils_escape_ssid (ssid->data, ssid->len) : "(none)", ssid ? "'" : ""); - devmode = wifi_utils_get_mode (priv->wifi_data); - devfreq = wifi_utils_get_freq (priv->wifi_data); + devmode = nm_platform_wifi_get_mode (ifindex); + devfreq = nm_platform_wifi_get_frequency (ifindex); /* When matching hidden APs, do a second pass that ignores the SSID check, * because NM might not yet know the SSID of the hidden AP in the scan list @@ -692,6 +688,7 @@ static void periodic_update (NMDeviceWifi *self, NMAccessPoint *ignore_ap) { NMDeviceWifiPrivate *priv = NM_DEVICE_WIFI_GET_PRIVATE (self); + int ifindex = nm_device_get_ifindex (NM_DEVICE (self)); NMAccessPoint *new_ap; guint32 new_rate; int percent; @@ -730,7 +727,7 @@ periodic_update (NMDeviceWifi *self, NMAccessPoint *ignore_ap) if (priv->current_ap && (nm_ap_get_mode (priv->current_ap) == NM_802_11_MODE_ADHOC)) { struct ether_addr bssid = { {0x0, 0x0, 0x0, 0x0, 0x0, 0x0} }; - wifi_utils_get_bssid (priv->wifi_data, &bssid); + nm_platform_wifi_get_bssid (ifindex, &bssid); /* 0x02 means "locally administered" and should be OR-ed into * the first byte of IBSS BSSIDs. */ @@ -744,7 +741,7 @@ periodic_update (NMDeviceWifi *self, NMAccessPoint *ignore_ap) /* Try to smooth out the strength. Atmel cards, for example, will give no strength * one second and normal strength the next. */ - percent = wifi_utils_get_qual (priv->wifi_data); + percent = nm_platform_wifi_get_quality (ifindex); if (percent >= 0 || ++priv->invalid_strength_counter > 3) { nm_ap_set_strength (new_ap, (gint8) percent); priv->invalid_strength_counter = 0; @@ -782,7 +779,7 @@ periodic_update (NMDeviceWifi *self, NMAccessPoint *ignore_ap) set_current_ap (self, new_ap, TRUE, FALSE); } - new_rate = wifi_utils_get_rate (priv->wifi_data); + new_rate = nm_platform_wifi_get_rate (ifindex); if (new_rate != priv->rate) { priv->rate = new_rate; g_object_notify (G_OBJECT (self), NM_DEVICE_WIFI_BITRATE); @@ -854,6 +851,7 @@ deactivate (NMDevice *dev) { NMDeviceWifi *self = NM_DEVICE_WIFI (dev); NMDeviceWifiPrivate *priv = NM_DEVICE_WIFI_GET_PRIVATE (self); + int ifindex = nm_device_get_ifindex (dev); NMActRequest *req; NMConnection *connection; NM80211Mode old_mode = priv->mode; @@ -882,7 +880,7 @@ deactivate (NMDevice *dev) set_current_ap (self, NULL, TRUE, FALSE); /* Clear any critical protocol notification in the Wi-Fi stack */ - wifi_utils_indicate_addressing_running (priv->wifi_data, FALSE); + nm_platform_wifi_indicate_addressing_running (ifindex, FALSE); /* Reset MAC address back to initial address */ nm_device_set_hw_addr (dev, priv->initial_hw_addr, "reset", LOGD_WIFI); @@ -890,9 +888,9 @@ deactivate (NMDevice *dev) /* Ensure we're in infrastructure mode after deactivation; some devices * (usually older ones) don't scan well in adhoc mode. */ - if (wifi_utils_get_mode (priv->wifi_data) != NM_802_11_MODE_INFRA) { + if (nm_platform_wifi_get_mode (ifindex) != NM_802_11_MODE_INFRA) { nm_device_take_down (NM_DEVICE (self), TRUE); - wifi_utils_set_mode (priv->wifi_data, NM_802_11_MODE_INFRA); + nm_platform_wifi_set_mode (ifindex, NM_802_11_MODE_INFRA); nm_device_bring_up (NM_DEVICE (self), TRUE, NULL); } @@ -2953,7 +2951,6 @@ ensure_hotspot_frequency (NMDeviceWifi *self, NMSettingWireless *s_wifi, NMAccessPoint *ap) { - NMDeviceWifiPrivate *priv = NM_DEVICE_WIFI_GET_PRIVATE (self); const char *band = nm_setting_wireless_get_band (s_wifi); const guint32 a_freqs[] = { 5180, 5200, 5220, 5745, 5765, 5785, 5805, 0 }; const guint32 bg_freqs[] = { 2412, 2437, 2462, 2472, 0 }; @@ -2965,9 +2962,9 @@ ensure_hotspot_frequency (NMDeviceWifi *self, return; if (g_strcmp0 (band, "a") == 0) - freq = wifi_utils_find_freq (priv->wifi_data, a_freqs); + freq = nm_platform_wifi_find_frequency (nm_device_get_ifindex (NM_DEVICE (self)), a_freqs); else - freq = wifi_utils_find_freq (priv->wifi_data, bg_freqs); + freq = nm_platform_wifi_find_frequency (nm_device_get_ifindex (NM_DEVICE (self)), bg_freqs); if (!freq) freq = (g_strcmp0 (band, "a") == 0) ? 5180 : 2462; @@ -3099,7 +3096,6 @@ act_stage3_ip4_config_start (NMDevice *device, NMIP4Config **out_config, NMDeviceStateReason *reason) { - NMDeviceWifiPrivate *priv = NM_DEVICE_WIFI_GET_PRIVATE (device); NMConnection *connection; NMSettingIP4Config *s_ip4; const char *method = NM_SETTING_IP4_CONFIG_METHOD_AUTO; @@ -3112,7 +3108,7 @@ act_stage3_ip4_config_start (NMDevice *device, /* Indicate that a critical protocol is about to start */ if (strcmp (method, NM_SETTING_IP4_CONFIG_METHOD_AUTO) == 0) - wifi_utils_indicate_addressing_running (priv->wifi_data, TRUE); + nm_platform_wifi_indicate_addressing_running (nm_device_get_ifindex (device), TRUE); return NM_DEVICE_CLASS (nm_device_wifi_parent_class)->act_stage3_ip4_config_start (device, out_config, reason); } @@ -3122,7 +3118,6 @@ act_stage3_ip6_config_start (NMDevice *device, NMIP6Config **out_config, NMDeviceStateReason *reason) { - NMDeviceWifiPrivate *priv = NM_DEVICE_WIFI_GET_PRIVATE (device); NMConnection *connection; NMSettingIP6Config *s_ip6; const char *method = NM_SETTING_IP6_CONFIG_METHOD_AUTO; @@ -3136,7 +3131,7 @@ act_stage3_ip6_config_start (NMDevice *device, /* Indicate that a critical protocol is about to start */ if (strcmp (method, NM_SETTING_IP6_CONFIG_METHOD_AUTO) == 0 || strcmp (method, NM_SETTING_IP6_CONFIG_METHOD_DHCP) == 0) - wifi_utils_indicate_addressing_running (priv->wifi_data, TRUE); + nm_platform_wifi_indicate_addressing_running (nm_device_get_ifindex (device), TRUE); return NM_DEVICE_CLASS (nm_device_wifi_parent_class)->act_stage3_ip6_config_start (device, out_config, reason); } @@ -3277,6 +3272,7 @@ activation_success_handler (NMDevice *dev) { NMDeviceWifi *self = NM_DEVICE_WIFI (dev); NMDeviceWifiPrivate *priv = NM_DEVICE_WIFI_GET_PRIVATE (self); + int ifindex = nm_device_get_ifindex (dev); NMAccessPoint *ap; struct ether_addr bssid = { {0x0, 0x0, 0x0, 0x0, 0x0, 0x0} }; NMAccessPoint *tmp_ap = NULL; @@ -3290,7 +3286,7 @@ activation_success_handler (NMDevice *dev) g_assert (connection); /* Clear any critical protocol notification in the wifi stack */ - wifi_utils_indicate_addressing_running (priv->wifi_data, FALSE); + nm_platform_wifi_indicate_addressing_running (ifindex, FALSE); /* Clear wireless secrets tries on success */ g_object_set_data (G_OBJECT (connection), WIRELESS_SECRETS_TRIES, NULL); @@ -3309,13 +3305,13 @@ activation_success_handler (NMDevice *dev) * But if activation was successful, the card will know the BSSID. Grab * the BSSID off the card and fill in the BSSID of the activation AP. */ - wifi_utils_get_bssid (priv->wifi_data, &bssid); + nm_platform_wifi_get_bssid (ifindex, &bssid); if (!nm_ethernet_address_is_valid (nm_ap_get_address (ap))) nm_ap_set_address (ap, &bssid); if (!nm_ap_get_freq (ap)) - nm_ap_set_freq (ap, wifi_utils_get_freq (priv->wifi_data)); + nm_ap_set_freq (ap, nm_platform_wifi_get_frequency (ifindex)); if (!nm_ap_get_max_bitrate (ap)) - nm_ap_set_max_bitrate (ap, wifi_utils_get_rate (priv->wifi_data)); + nm_ap_set_max_bitrate (ap, nm_platform_wifi_get_rate (ifindex)); tmp_ap = find_active_ap (self, ap, TRUE); if (tmp_ap) { @@ -3363,7 +3359,7 @@ activation_failure_handler (NMDevice *dev) g_object_set_data (G_OBJECT (connection), WIRELESS_SECRETS_TRIES, NULL); /* Clear any critical protocol notification in the wifi stack */ - wifi_utils_indicate_addressing_running (NM_DEVICE_WIFI_GET_PRIVATE (dev)->wifi_data, FALSE); + nm_platform_wifi_indicate_addressing_running (nm_device_get_ifindex (dev), FALSE); } static void @@ -3426,7 +3422,7 @@ device_state_changed (NMDevice *device, break; case NM_DEVICE_STATE_IP_CHECK: /* Clear any critical protocol notification in the wifi stack */ - wifi_utils_indicate_addressing_running (priv->wifi_data, FALSE); + nm_platform_wifi_indicate_addressing_running (nm_device_get_ifindex (device), FALSE); break; case NM_DEVICE_STATE_ACTIVATED: activation_success_handler (device); @@ -3555,9 +3551,6 @@ dispose (GObject *object) remove_all_aps (self); - if (priv->wifi_data) - wifi_utils_deinit (priv->wifi_data); - g_free (priv->ipw_rfkill_path); if (priv->ipw_rfkill_id) { g_source_remove (priv->ipw_rfkill_id); diff --git a/src/platform/nm-fake-platform.c b/src/platform/nm-fake-platform.c index 3eec6497f0..6215a81e77 100644 --- a/src/platform/nm-fake-platform.c +++ b/src/platform/nm-fake-platform.c @@ -678,6 +678,101 @@ gre_get_properties (NMPlatform *platform, int ifindex, NMPlatformGreProperties * return FALSE; } +static gboolean +wifi_get_capabilities (NMPlatform *platform, int ifindex, NMDeviceWifiCapabilities *caps) +{ + NMFakePlatformLink *device = link_get (platform, ifindex); + + g_return_val_if_fail (device, FALSE); + + if (device->link.type != NM_LINK_TYPE_WIFI) + return FALSE; + + if (caps) { + *caps = ( NM_WIFI_DEVICE_CAP_CIPHER_WEP40 + | NM_WIFI_DEVICE_CAP_CIPHER_WEP104 + | NM_WIFI_DEVICE_CAP_CIPHER_TKIP + | NM_WIFI_DEVICE_CAP_CIPHER_CCMP + | NM_WIFI_DEVICE_CAP_WPA + | NM_WIFI_DEVICE_CAP_RSN + | NM_WIFI_DEVICE_CAP_AP + | NM_WIFI_DEVICE_CAP_ADHOC); + } + return TRUE; +} + +static gboolean +wifi_get_bssid (NMPlatform *platform, int ifindex, struct ether_addr *bssid) +{ + return FALSE; +} + +static GByteArray * +wifi_get_ssid (NMPlatform *platform, int ifindex) +{ + return NULL; +} + +static guint32 +wifi_get_frequency (NMPlatform *platform, int ifindex) +{ + return 0; +} + +static int +wifi_get_quality (NMPlatform *platform, int ifindex) +{ + return 0; +} + +static guint32 +wifi_get_rate (NMPlatform *platform, int ifindex) +{ + return 0; +} + +static NM80211Mode +wifi_get_mode (NMPlatform *platform, int ifindex) +{ + return NM_802_11_MODE_UNKNOWN; +} + +static void +wifi_set_mode (NMPlatform *platform, int ifindex, NM80211Mode mode) +{ + ; +} + +static guint32 +wifi_find_frequency (NMPlatform *platform, int ifindex, const guint32 *freqs) +{ + return freqs[0]; +} + +static void +wifi_indicate_addressing_running (NMPlatform *platform, int ifindex, gboolean running) +{ + ; +} + +static guint32 +mesh_get_channel (NMPlatform *platform, int ifindex) +{ + return 0; +} + +static gboolean +mesh_set_channel (NMPlatform *platform, int ifindex, guint32 channel) +{ + return FALSE; +} + +static gboolean +mesh_set_ssid (NMPlatform *platform, int ifindex, const GByteArray *ssid) +{ + return FALSE; +} + /******************************************************************/ static GArray * @@ -1231,6 +1326,21 @@ nm_fake_platform_class_init (NMFakePlatformClass *klass) platform_class->vxlan_get_properties = vxlan_get_properties; platform_class->gre_get_properties = gre_get_properties; + platform_class->wifi_get_capabilities = wifi_get_capabilities; + platform_class->wifi_get_bssid = wifi_get_bssid; + platform_class->wifi_get_ssid = wifi_get_ssid; + platform_class->wifi_get_frequency = wifi_get_frequency; + platform_class->wifi_get_quality = wifi_get_quality; + platform_class->wifi_get_rate = wifi_get_rate; + platform_class->wifi_get_mode = wifi_get_mode; + platform_class->wifi_set_mode = wifi_set_mode; + platform_class->wifi_find_frequency = wifi_find_frequency; + platform_class->wifi_indicate_addressing_running = wifi_indicate_addressing_running; + + platform_class->mesh_get_channel = mesh_get_channel; + platform_class->mesh_set_channel = mesh_set_channel; + platform_class->mesh_set_ssid = mesh_set_ssid; + platform_class->ip4_address_get_all = ip4_address_get_all; platform_class->ip6_address_get_all = ip6_address_get_all; platform_class->ip4_address_add = ip4_address_add; diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c index 112e5095e9..439f0e8d02 100644 --- a/src/platform/nm-linux-platform.c +++ b/src/platform/nm-linux-platform.c @@ -49,6 +49,7 @@ #include "nm-utils.h" #include "nm-logging.h" #include "wifi/wifi-utils.h" +#include "wifi/wifi-utils-wext.h" /* This is only included for the translation of VLAN flags */ #include "nm-setting-vlan.h" @@ -69,6 +70,8 @@ typedef struct { GUdevClient *udev_client; GHashTable *udev_devices; + GHashTable *wifi_data; + int support_kernel_extended_ifa_flags; } NMLinuxPlatformPrivate; @@ -1220,6 +1223,7 @@ announce_object (NMPlatform *platform, const struct nl_object *object, ObjectSta case REMOVED: check_cache_items (platform, priv->address_cache, device.ifindex); check_cache_items (platform, priv->route_cache, device.ifindex); + g_hash_table_remove (priv->wifi_data, GINT_TO_POINTER (device.ifindex)); break; default: break; @@ -2699,6 +2703,176 @@ gre_get_properties (NMPlatform *platform, int ifindex, NMPlatformGreProperties * return (err == 0); } +static WifiData * +wifi_get_wifi_data (NMPlatform *platform, int ifindex) +{ + NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform); + WifiData *wifi_data; + + wifi_data = g_hash_table_lookup (priv->wifi_data, GINT_TO_POINTER (ifindex)); + if (!wifi_data) { + NMLinkType type; + const char *ifname; + + type = link_get_type (platform, ifindex); + ifname = link_get_name (platform, ifindex); + + if (type == NM_LINK_TYPE_WIFI) + wifi_data = wifi_utils_init (ifname, ifindex, TRUE); + else if (type == NM_LINK_TYPE_OLPC_MESH) { + /* The kernel driver now uses nl80211, but we force use of WEXT because + * the cfg80211 interactions are not quite ready to support access to + * mesh control through nl80211 just yet. + */ +#if HAVE_WEXT + wifi_data = wifi_wext_init (ifname, ifindex, FALSE); +#endif + } + + if (wifi_data) + g_hash_table_insert (priv->wifi_data, GINT_TO_POINTER (ifindex), wifi_data); + } + + return wifi_data; +} + +static gboolean +wifi_get_capabilities (NMPlatform *platform, int ifindex, NMDeviceWifiCapabilities *caps) +{ + WifiData *wifi_data = wifi_get_wifi_data (platform, ifindex); + + if (!wifi_data) + return FALSE; + + if (caps) + *caps = wifi_utils_get_caps (wifi_data); + return TRUE; +} + +static gboolean +wifi_get_bssid (NMPlatform *platform, int ifindex, struct ether_addr *bssid) +{ + WifiData *wifi_data = wifi_get_wifi_data (platform, ifindex); + + if (!wifi_data) + return FALSE; + return wifi_utils_get_bssid (wifi_data, bssid); +} + +static GByteArray * +wifi_get_ssid (NMPlatform *platform, int ifindex) +{ + WifiData *wifi_data = wifi_get_wifi_data (platform, ifindex); + + if (!wifi_data) + return NULL; + return wifi_utils_get_ssid (wifi_data); +} + +static guint32 +wifi_get_frequency (NMPlatform *platform, int ifindex) +{ + WifiData *wifi_data = wifi_get_wifi_data (platform, ifindex); + + if (!wifi_data) + return 0; + return wifi_utils_get_freq (wifi_data); +} + +static gboolean +wifi_get_quality (NMPlatform *platform, int ifindex) +{ + WifiData *wifi_data = wifi_get_wifi_data (platform, ifindex); + + if (!wifi_data) + return FALSE; + return wifi_utils_get_qual (wifi_data); +} + +static guint32 +wifi_get_rate (NMPlatform *platform, int ifindex) +{ + WifiData *wifi_data = wifi_get_wifi_data (platform, ifindex); + + if (!wifi_data) + return FALSE; + return wifi_utils_get_rate (wifi_data); +} + +static NM80211Mode +wifi_get_mode (NMPlatform *platform, int ifindex) +{ + WifiData *wifi_data = wifi_get_wifi_data (platform, ifindex); + + if (!wifi_data) + return NM_802_11_MODE_UNKNOWN; + + return wifi_utils_get_mode (wifi_data); +} + +static void +wifi_set_mode (NMPlatform *platform, int ifindex, NM80211Mode mode) +{ + WifiData *wifi_data = wifi_get_wifi_data (platform, ifindex); + + if (wifi_data) + wifi_utils_set_mode (wifi_data, mode); +} + +static guint32 +wifi_find_frequency (NMPlatform *platform, int ifindex, const guint32 *freqs) +{ + WifiData *wifi_data = wifi_get_wifi_data (platform, ifindex); + + if (!wifi_data) + return 0; + + return wifi_utils_find_freq (wifi_data, freqs); +} + +static void +wifi_indicate_addressing_running (NMPlatform *platform, int ifindex, gboolean running) +{ + WifiData *wifi_data = wifi_get_wifi_data (platform, ifindex); + + if (wifi_data) + wifi_utils_indicate_addressing_running (wifi_data, running); +} + + +static guint32 +mesh_get_channel (NMPlatform *platform, int ifindex) +{ + WifiData *wifi_data = wifi_get_wifi_data (platform, ifindex); + + if (!wifi_data) + return 0; + + return wifi_utils_get_mesh_channel (wifi_data); +} + +static gboolean +mesh_set_channel (NMPlatform *platform, int ifindex, guint32 channel) +{ + WifiData *wifi_data = wifi_get_wifi_data (platform, ifindex); + + if (!wifi_data) + return FALSE; + + return wifi_utils_set_mesh_channel (wifi_data, channel); +} + +static gboolean +mesh_set_ssid (NMPlatform *platform, int ifindex, const GByteArray *ssid) +{ + WifiData *wifi_data = wifi_get_wifi_data (platform, ifindex); + + if (!wifi_data) + return FALSE; + + return wifi_utils_set_mesh_ssid (wifi_data, ssid); +} + /******************************************************************/ static int @@ -3402,6 +3576,8 @@ setup (NMPlatform *platform) if (nle < 0) nm_log_warn (LOGD_PLATFORM, "Netlink error: requesting RTM_GETADDR failed with %s", nl_geterror (nle)); + priv->wifi_data = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify) wifi_utils_deinit); + return TRUE; } @@ -3421,6 +3597,7 @@ nm_linux_platform_finalize (GObject *object) g_object_unref (priv->udev_client); g_hash_table_unref (priv->udev_devices); + g_hash_table_unref (priv->wifi_data); G_OBJECT_CLASS (nm_linux_platform_parent_class)->finalize (object); } @@ -3492,6 +3669,21 @@ nm_linux_platform_class_init (NMLinuxPlatformClass *klass) platform_class->vxlan_get_properties = vxlan_get_properties; platform_class->gre_get_properties = gre_get_properties; + platform_class->wifi_get_capabilities = wifi_get_capabilities; + platform_class->wifi_get_bssid = wifi_get_bssid; + platform_class->wifi_get_ssid = wifi_get_ssid; + platform_class->wifi_get_frequency = wifi_get_frequency; + platform_class->wifi_get_quality = wifi_get_quality; + platform_class->wifi_get_rate = wifi_get_rate; + platform_class->wifi_get_mode = wifi_get_mode; + platform_class->wifi_set_mode = wifi_set_mode; + platform_class->wifi_find_frequency = wifi_find_frequency; + platform_class->wifi_indicate_addressing_running = wifi_indicate_addressing_running; + + platform_class->mesh_get_channel = mesh_get_channel; + platform_class->mesh_set_channel = mesh_set_channel; + platform_class->mesh_set_ssid = mesh_set_ssid; + platform_class->ip4_address_get_all = ip4_address_get_all; platform_class->ip6_address_get_all = ip6_address_get_all; platform_class->ip4_address_add = ip4_address_add; diff --git a/src/platform/nm-platform.c b/src/platform/nm-platform.c index 6d0436cd95..dc42b50d82 100644 --- a/src/platform/nm-platform.c +++ b/src/platform/nm-platform.c @@ -1221,6 +1221,138 @@ nm_platform_gre_get_properties (int ifindex, NMPlatformGreProperties *props) return klass->gre_get_properties (platform, ifindex, props); } +gboolean +nm_platform_wifi_get_capabilities (int ifindex, NMDeviceWifiCapabilities *caps) +{ + reset_error (); + + g_return_val_if_fail (ifindex > 0, FALSE); + + return klass->wifi_get_capabilities (platform, ifindex, caps); +} + +gboolean +nm_platform_wifi_get_bssid (int ifindex, struct ether_addr *bssid) +{ + reset_error (); + + g_return_val_if_fail (ifindex > 0, FALSE); + + return klass->wifi_get_bssid (platform, ifindex, bssid); +} + +GByteArray * +nm_platform_wifi_get_ssid (int ifindex) +{ + reset_error (); + + g_return_val_if_fail (ifindex > 0, NULL); + + return klass->wifi_get_ssid (platform, ifindex); +} + +guint32 +nm_platform_wifi_get_frequency (int ifindex) +{ + reset_error (); + + g_return_val_if_fail (ifindex > 0, 0); + + return klass->wifi_get_frequency (platform, ifindex); +} + +int +nm_platform_wifi_get_quality (int ifindex) +{ + reset_error (); + + g_return_val_if_fail (ifindex > 0, 0); + + return klass->wifi_get_quality (platform, ifindex); +} + +guint32 +nm_platform_wifi_get_rate (int ifindex) +{ + reset_error (); + + g_return_val_if_fail (ifindex > 0, 0); + + return klass->wifi_get_rate (platform, ifindex); +} + +NM80211Mode +nm_platform_wifi_get_mode (int ifindex) +{ + reset_error (); + + g_return_val_if_fail (ifindex > 0, NM_802_11_MODE_UNKNOWN); + + return klass->wifi_get_mode (platform, ifindex); +} + +void +nm_platform_wifi_set_mode (int ifindex, NM80211Mode mode) +{ + reset_error (); + + g_return_if_fail (ifindex > 0); + + klass->wifi_set_mode (platform, ifindex, mode); +} + +guint32 +nm_platform_wifi_find_frequency (int ifindex, const guint32 *freqs) +{ + reset_error (); + + g_return_val_if_fail (ifindex > 0, 0); + g_return_val_if_fail (freqs != NULL, 0); + + return klass->wifi_find_frequency (platform, ifindex, freqs); +} + +void +nm_platform_wifi_indicate_addressing_running (int ifindex, gboolean running) +{ + reset_error (); + + g_return_if_fail (ifindex > 0); + + klass->wifi_indicate_addressing_running (platform, ifindex, running); +} + +guint32 +nm_platform_mesh_get_channel (int ifindex) +{ + reset_error (); + + g_return_val_if_fail (ifindex > 0, 0); + + return klass->mesh_get_channel (platform, ifindex); +} + +gboolean +nm_platform_mesh_set_channel (int ifindex, guint32 channel) +{ + reset_error (); + + g_return_val_if_fail (ifindex > 0, FALSE); + + return klass->mesh_set_channel (platform, ifindex, channel); +} + +gboolean +nm_platform_mesh_set_ssid (int ifindex, const GByteArray *ssid) +{ + reset_error (); + + g_return_val_if_fail (ifindex > 0, FALSE); + g_return_val_if_fail (ssid != NULL, FALSE); + + return klass->mesh_set_ssid (platform, ifindex, ssid); +} + /******************************************************************/ GArray * diff --git a/src/platform/nm-platform.h b/src/platform/nm-platform.h index 3128ba5fb7..6be78108f1 100644 --- a/src/platform/nm-platform.h +++ b/src/platform/nm-platform.h @@ -24,9 +24,12 @@ #include <glib-object.h> #include "nm-glib-compat.h" #include <netinet/in.h> +#include <net/ethernet.h> #include <linux/if.h> #include <linux/if_addr.h> +#include <NetworkManager.h> + #define NM_TYPE_PLATFORM (nm_platform_get_type ()) #define NM_PLATFORM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_PLATFORM, NMPlatform)) #define NM_PLATFORM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_PLATFORM, NMPlatformClass)) @@ -343,6 +346,21 @@ typedef struct { gboolean (*vxlan_get_properties) (NMPlatform *, int ifindex, NMPlatformVxlanProperties *props); gboolean (*gre_get_properties) (NMPlatform *, int ifindex, NMPlatformGreProperties *props); + gboolean (*wifi_get_capabilities) (NMPlatform *, int ifindex, NMDeviceWifiCapabilities *caps); + gboolean (*wifi_get_bssid) (NMPlatform *, int ifindex, struct ether_addr *bssid); + GByteArray *(*wifi_get_ssid) (NMPlatform *, int ifindex); + guint32 (*wifi_get_frequency) (NMPlatform *, int ifindex); + int (*wifi_get_quality) (NMPlatform *, int ifindex); + guint32 (*wifi_get_rate) (NMPlatform *, int ifindex); + NM80211Mode (*wifi_get_mode) (NMPlatform *, int ifindex); + void (*wifi_set_mode) (NMPlatform *, int ifindex, NM80211Mode mode); + guint32 (*wifi_find_frequency) (NMPlatform *, int ifindex, const guint32 *freqs); + void (*wifi_indicate_addressing_running) (NMPlatform *, int ifindex, gboolean running); + + guint32 (*mesh_get_channel) (NMPlatform *, int ifindex); + gboolean (*mesh_set_channel) (NMPlatform *, int ifindex, guint32 channel); + gboolean (*mesh_set_ssid) (NMPlatform *, int ifindex, const GByteArray *ssid); + GArray * (*ip4_address_get_all) (NMPlatform *, int ifindex); GArray * (*ip6_address_get_all) (NMPlatform *, int ifindex); gboolean (*ip4_address_add) (NMPlatform *, int ifindex, @@ -474,6 +492,21 @@ gboolean nm_platform_macvlan_get_properties (int ifindex, NMPlatformMacvlanPrope gboolean nm_platform_vxlan_get_properties (int ifindex, NMPlatformVxlanProperties *props); gboolean nm_platform_gre_get_properties (int ifindex, NMPlatformGreProperties *props); +gboolean nm_platform_wifi_get_capabilities (int ifindex, NMDeviceWifiCapabilities *caps); +gboolean nm_platform_wifi_get_bssid (int ifindex, struct ether_addr *bssid); +GByteArray *nm_platform_wifi_get_ssid (int ifindex); +guint32 nm_platform_wifi_get_frequency (int ifindex); +int nm_platform_wifi_get_quality (int ifindex); +guint32 nm_platform_wifi_get_rate (int ifindex); +NM80211Mode nm_platform_wifi_get_mode (int ifindex); +void nm_platform_wifi_set_mode (int ifindex, NM80211Mode mode); +guint32 nm_platform_wifi_find_frequency (int ifindex, const guint32 *freqs); +void nm_platform_wifi_indicate_addressing_running (int ifindex, gboolean running); + +guint32 nm_platform_mesh_get_channel (int ifindex); +gboolean nm_platform_mesh_set_channel (int ifindex, guint32 channel); +gboolean nm_platform_mesh_set_ssid (int ifindex, const GByteArray *ssid); + GArray *nm_platform_ip4_address_get_all (int ifindex); GArray *nm_platform_ip6_address_get_all (int ifindex); gboolean nm_platform_ip4_address_add (int ifindex, diff --git a/src/wifi/wifi-utils-nl80211.c b/src/platform/wifi/wifi-utils-nl80211.c index 6da4a5737a..6da4a5737a 100644 --- a/src/wifi/wifi-utils-nl80211.c +++ b/src/platform/wifi/wifi-utils-nl80211.c diff --git a/src/wifi/wifi-utils-nl80211.h b/src/platform/wifi/wifi-utils-nl80211.h index 2a7fe874a2..2a7fe874a2 100644 --- a/src/wifi/wifi-utils-nl80211.h +++ b/src/platform/wifi/wifi-utils-nl80211.h diff --git a/src/wifi/wifi-utils-private.h b/src/platform/wifi/wifi-utils-private.h index 769e25298e..769e25298e 100644 --- a/src/wifi/wifi-utils-private.h +++ b/src/platform/wifi/wifi-utils-private.h diff --git a/src/wifi/wifi-utils-wext.c b/src/platform/wifi/wifi-utils-wext.c index a042944c2f..a042944c2f 100644 --- a/src/wifi/wifi-utils-wext.c +++ b/src/platform/wifi/wifi-utils-wext.c diff --git a/src/wifi/wifi-utils-wext.h b/src/platform/wifi/wifi-utils-wext.h index 96ad74eb40..96ad74eb40 100644 --- a/src/wifi/wifi-utils-wext.h +++ b/src/platform/wifi/wifi-utils-wext.h diff --git a/src/wifi/wifi-utils.c b/src/platform/wifi/wifi-utils.c index 2902d0c8b0..2902d0c8b0 100644 --- a/src/wifi/wifi-utils.c +++ b/src/platform/wifi/wifi-utils.c diff --git a/src/wifi/wifi-utils.h b/src/platform/wifi/wifi-utils.h index fa9dc14c61..fa9dc14c61 100644 --- a/src/wifi/wifi-utils.h +++ b/src/platform/wifi/wifi-utils.h diff --git a/src/settings/plugins/ifcfg-rh/Makefile.am b/src/settings/plugins/ifcfg-rh/Makefile.am index f0bc54b081..7feb262e79 100644 --- a/src/settings/plugins/ifcfg-rh/Makefile.am +++ b/src/settings/plugins/ifcfg-rh/Makefile.am @@ -27,7 +27,6 @@ libifcfg_rh_io_la_SOURCES = \ AM_CPPFLAGS = \ -I$(top_srcdir)/src/ \ -I$(top_srcdir)/src/platform \ - -I$(top_srcdir)/src/wifi \ -I$(top_srcdir)/src/settings \ -I$(top_srcdir)/src/posix-signals \ -I$(top_srcdir)/src/config \ diff --git a/src/settings/plugins/ifcfg-rh/reader.c b/src/settings/plugins/ifcfg-rh/reader.c index 8b82ff9ac4..c6aa393f25 100644 --- a/src/settings/plugins/ifcfg-rh/reader.c +++ b/src/settings/plugins/ifcfg-rh/reader.c @@ -53,7 +53,7 @@ #include <nm-util-private.h> #include <nm-utils.h> -#include "wifi-utils.h" +#include "nm-platform.h" #include "nm-posix-signals.h" #include "NetworkManagerUtils.h" @@ -4723,6 +4723,21 @@ is_vlan_device (const char *name, shvarFile *parsed) return FALSE; } +static gboolean +is_wifi_device (const char *name, shvarFile *parsed) +{ + int ifindex; + + g_return_val_if_fail (name != NULL, FALSE); + g_return_val_if_fail (parsed != NULL, FALSE); + + ifindex = nm_platform_link_get_ifindex (name); + if (ifindex == 0) + return FALSE; + + return nm_platform_link_get_type (ifindex) == NM_LINK_TYPE_WIFI; +} + static void parse_prio_map_list (NMSettingVlan *s_vlan, shvarFile *ifcfg, @@ -5130,8 +5145,7 @@ connection_from_file (const char *filename, type = g_strdup (TYPE_BOND); else if (is_vlan_device (device, parsed)) type = g_strdup (TYPE_VLAN); - /* Test wireless extensions */ - else if (wifi_utils_is_wifi (device, NULL)) + else if (is_wifi_device (device, parsed)) type = g_strdup (TYPE_WIRELESS); else type = g_strdup (TYPE_ETHERNET); diff --git a/src/settings/plugins/ifcfg-rh/tests/Makefile.am b/src/settings/plugins/ifcfg-rh/tests/Makefile.am index 6df9ac11b1..c360bba44c 100644 --- a/src/settings/plugins/ifcfg-rh/tests/Makefile.am +++ b/src/settings/plugins/ifcfg-rh/tests/Makefile.am @@ -16,7 +16,6 @@ AM_CPPFLAGS = \ -I$(top_srcdir)/src/ \ -I$(top_srcdir)/src/platform \ -I$(top_srcdir)/src/settings \ - -I$(top_srcdir)/src/wifi \ -I$(top_srcdir)/src/posix-signals \ -I$(srcdir)/../ \ -DNM_VERSION_MAX_ALLOWED=NM_VERSION_NEXT_STABLE \ diff --git a/src/settings/plugins/ifnet/Makefile.am b/src/settings/plugins/ifnet/Makefile.am index a849552d16..75048752bb 100644 --- a/src/settings/plugins/ifnet/Makefile.am +++ b/src/settings/plugins/ifnet/Makefile.am @@ -5,7 +5,7 @@ SUBDIRS = . tests AM_CPPFLAGS = \ -I$(top_srcdir)/src \ -I$(top_srcdir)/src/config \ - -I$(top_srcdir)/src/wifi \ + -I$(top_srcdir)/src/platform \ -I$(top_srcdir)/src/settings \ -I$(top_srcdir)/include \ -I$(top_builddir)/include \ diff --git a/src/settings/plugins/ifnet/net_parser.c b/src/settings/plugins/ifnet/net_parser.c index b39767b651..9e39925274 100644 --- a/src/settings/plugins/ifnet/net_parser.c +++ b/src/settings/plugins/ifnet/net_parser.c @@ -24,11 +24,10 @@ #include <stdio.h> #include <sys/ioctl.h> -#include <net/if.h> #include <unistd.h> #include "plugin.h" -#include "wifi-utils.h" +#include "nm-platform.h" #include "net_parser.h" #include "net_utils.h" @@ -172,13 +171,16 @@ init_block_by_line (gchar * buf) else if (ignore_connection_name (pos)) { /* ignored connection */ conn = add_new_connection_config ("ignore", pos); - } else - if (if_nametoindex (pos) && !wifi_utils_is_wifi (pos, NULL)) + } else { + int ifindex = nm_platform_link_get_ifindex (pos); + + if (ifindex && nm_platform_link_get_type (ifindex) != NM_LINK_TYPE_WIFI) /* wired connection */ conn = add_new_connection_config ("wired", pos); else /* wireless connection */ conn = add_new_connection_config ("wireless", pos); + } } data = g_strdup (key_value[1]); tmp = strip_string (data, '"'); diff --git a/src/settings/plugins/ifnet/tests/Makefile.am b/src/settings/plugins/ifnet/tests/Makefile.am index 31d35db655..01e57bc246 100644 --- a/src/settings/plugins/ifnet/tests/Makefile.am +++ b/src/settings/plugins/ifnet/tests/Makefile.am @@ -12,7 +12,7 @@ AM_CPPFLAGS= \ -I$(top_srcdir)/src \ -I$(top_srcdir)/src/config \ -I$(top_srcdir)/src/settings \ - -I$(top_srcdir)/src/wifi \ + -I$(top_srcdir)/src/platform \ -DNM_VERSION_MAX_ALLOWED=NM_VERSION_NEXT_STABLE \ $(CHECK_CFLAGS) \ $(GLIB_CFLAGS) \ |