]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
Use shared functions for network operations and param changes
authorWitold Sowa <witold.sowa@gmail.com>
Sun, 13 Sep 2009 18:16:43 +0000 (21:16 +0300)
committerJouni Malinen <j@w1.fi>
Sun, 13 Sep 2009 18:16:43 +0000 (21:16 +0300)
Instead of implementing these separately in various control
interface handlers, use shared functions. These add some of the
previously missing notification calls, too, for the affected areas.

wpa_supplicant/ctrl_iface.c
wpa_supplicant/ctrl_iface_dbus_handlers.c
wpa_supplicant/wpa_supplicant.c
wpa_supplicant/wpa_supplicant_i.h

index f593804068822f88d7161564dd7b58ae6df68cd1..04972d204201c01ea8ec05bfca91613a93295098 100644 (file)
@@ -830,37 +830,20 @@ static int wpa_supplicant_ctrl_iface_select_network(
        /* cmd: "<network id>" or "any" */
        if (os_strcmp(cmd, "any") == 0) {
                wpa_printf(MSG_DEBUG, "CTRL_IFACE: SELECT_NETWORK any");
-               ssid = wpa_s->conf->ssid;
-               while (ssid) {
-                       ssid->disabled = 0;
-                       ssid = ssid->next;
+               ssid = NULL;
+       } else {
+               id = atoi(cmd);
+               wpa_printf(MSG_DEBUG, "CTRL_IFACE: SELECT_NETWORK id=%d", id);
+
+               ssid = wpa_config_get_network(wpa_s->conf, id);
+               if (ssid == NULL) {
+                       wpa_printf(MSG_DEBUG, "CTRL_IFACE: Could not find "
+                                  "network id=%d", id);
+                       return -1;
                }
-               wpa_s->reassociate = 1;
-               wpa_supplicant_req_scan(wpa_s, 0, 0);
-               return 0;
        }
 
-       id = atoi(cmd);
-       wpa_printf(MSG_DEBUG, "CTRL_IFACE: SELECT_NETWORK id=%d", id);
-
-       ssid = wpa_config_get_network(wpa_s->conf, id);
-       if (ssid == NULL) {
-               wpa_printf(MSG_DEBUG, "CTRL_IFACE: Could not find network "
-                          "id=%d", id);
-               return -1;
-       }
-
-       if (ssid != wpa_s->current_ssid && wpa_s->current_ssid)
-               wpa_supplicant_disassociate(wpa_s, WLAN_REASON_DEAUTH_LEAVING);
-
-       /* Mark all other networks disabled and trigger reassociation */
-       ssid = wpa_s->conf->ssid;
-       while (ssid) {
-               ssid->disabled = id != ssid->id;
-               ssid = ssid->next;
-       }
-       wpa_s->reassociate = 1;
-       wpa_supplicant_req_scan(wpa_s, 0, 0);
+       wpa_supplicant_select_network(wpa_s, ssid);
 
        return 0;
 }
@@ -875,36 +858,19 @@ static int wpa_supplicant_ctrl_iface_enable_network(
        /* cmd: "<network id>" or "all" */
        if (os_strcmp(cmd, "all") == 0) {
                wpa_printf(MSG_DEBUG, "CTRL_IFACE: ENABLE_NETWORK all");
-               ssid = wpa_s->conf->ssid;
-               while (ssid) {
-                       if (ssid == wpa_s->current_ssid && ssid->disabled)
-                               wpa_s->reassociate = 1;
-                       ssid->disabled = 0;
-                       ssid = ssid->next;
-               }
-               if (wpa_s->reassociate)
-                       wpa_supplicant_req_scan(wpa_s, 0, 0);
-               return 0;
-       }
-
-       id = atoi(cmd);
-       wpa_printf(MSG_DEBUG, "CTRL_IFACE: ENABLE_NETWORK id=%d", id);
-
-       ssid = wpa_config_get_network(wpa_s->conf, id);
-       if (ssid == NULL) {
-               wpa_printf(MSG_DEBUG, "CTRL_IFACE: Could not find network "
-                          "id=%d", id);
-               return -1;
-       }
+               ssid = NULL;
+       } else {
+               id = atoi(cmd);
+               wpa_printf(MSG_DEBUG, "CTRL_IFACE: ENABLE_NETWORK id=%d", id);
 
-       if (wpa_s->current_ssid == NULL && ssid->disabled) {
-               /*
-                * Try to reassociate since there is no current configuration
-                * and a new network was made available. */
-               wpa_s->reassociate = 1;
-               wpa_supplicant_req_scan(wpa_s, 0, 0);
+               ssid = wpa_config_get_network(wpa_s->conf, id);
+               if (ssid == NULL) {
+                       wpa_printf(MSG_DEBUG, "CTRL_IFACE: Could not find "
+                                  "network id=%d", id);
+                       return -1;
+               }
        }
-       ssid->disabled = 0;
+       wpa_supplicant_enable_network(wpa_s, ssid);
 
        return 0;
 }
@@ -919,30 +885,19 @@ static int wpa_supplicant_ctrl_iface_disable_network(
        /* cmd: "<network id>" or "all" */
        if (os_strcmp(cmd, "all") == 0) {
                wpa_printf(MSG_DEBUG, "CTRL_IFACE: DISABLE_NETWORK all");
-               ssid = wpa_s->conf->ssid;
-               while (ssid) {
-                       ssid->disabled = 1;
-                       ssid = ssid->next;
-               }
-               if (wpa_s->current_ssid)
-                       wpa_supplicant_disassociate(wpa_s,
-                                                   WLAN_REASON_DEAUTH_LEAVING);
-               return 0;
-       }
-
-       id = atoi(cmd);
-       wpa_printf(MSG_DEBUG, "CTRL_IFACE: DISABLE_NETWORK id=%d", id);
+               ssid = NULL;
+       } else {
+               id = atoi(cmd);
+               wpa_printf(MSG_DEBUG, "CTRL_IFACE: DISABLE_NETWORK id=%d", id);
 
-       ssid = wpa_config_get_network(wpa_s->conf, id);
-       if (ssid == NULL) {
-               wpa_printf(MSG_DEBUG, "CTRL_IFACE: Could not find network "
-                          "id=%d", id);
-               return -1;
+               ssid = wpa_config_get_network(wpa_s->conf, id);
+               if (ssid == NULL) {
+                       wpa_printf(MSG_DEBUG, "CTRL_IFACE: Could not find "
+                                  "network id=%d", id);
+                       return -1;
+               }
        }
-
-       if (ssid == wpa_s->current_ssid)
-               wpa_supplicant_disassociate(wpa_s, WLAN_REASON_DEAUTH_LEAVING);
-       ssid->disabled = 1;
+       wpa_supplicant_disable_network(wpa_s, ssid);
 
        return 0;
 }
@@ -1569,11 +1524,7 @@ static int wpa_supplicant_ctrl_iface_ap_scan(
        struct wpa_supplicant *wpa_s, char *cmd)
 {
        int ap_scan = atoi(cmd);
-
-       if (ap_scan < 0 || ap_scan > 2)
-               return -1;
-       wpa_s->conf->ap_scan = ap_scan;
-       return 0;
+       return wpa_supplicant_set_ap_scan(wpa_s, ap_scan);
 }
 
 
index 458dbf7f69fdc3a5c0ed25e8e7de37f67801a75c..ea4d6824168838771fba9a21c62c89663f50650f 100644 (file)
@@ -310,19 +310,13 @@ DBusMessage * wpas_dbus_global_set_debugparams(DBusMessage *message,
                goto out;
        }
 
-       /* check for allowed debuglevels */
-       if (debug_level != MSG_MSGDUMP &&
-           debug_level != MSG_DEBUG &&
-           debug_level != MSG_INFO &&
-           debug_level != MSG_WARNING &&
-           debug_level != MSG_ERROR) {
+       if (wpa_supplicant_set_debug_params(global, debug_level,
+                                           debug_timestamp ? 1 : 0,
+                                           debug_show_keys ? 1 : 0)) {
                reply = wpas_dbus_new_invalid_opts_error(message, NULL);
                goto out;
        }
 
-       wpa_debug_level = debug_level;
-       wpa_debug_timestamp = debug_timestamp ? 1 : 0;
-       wpa_debug_show_keys = debug_show_keys ? 1 : 0;
        reply = wpas_dbus_new_success_reply(message);
 
 out:
@@ -1065,16 +1059,7 @@ DBusMessage * wpas_dbus_iface_enable_network(DBusMessage *message,
                                             struct wpa_supplicant *wpa_s,
                                             struct wpa_ssid *ssid)
 {
-       if (wpa_s->current_ssid == NULL && ssid->disabled) {
-               /*
-                * Try to reassociate since there is no current configuration
-                * and a new network was made available.
-                */
-               wpa_s->reassociate = 1;
-               wpa_supplicant_req_scan(wpa_s, 0, 0);
-       }
-       ssid->disabled = 0;
-
+       wpa_supplicant_enable_network(wpa_s, ssid);
        return wpas_dbus_new_success_reply(message);
 }
 
@@ -1093,10 +1078,7 @@ DBusMessage * wpas_dbus_iface_disable_network(DBusMessage *message,
                                              struct wpa_supplicant *wpa_s,
                                              struct wpa_ssid *ssid)
 {
-       if (ssid == wpa_s->current_ssid)
-               wpa_supplicant_disassociate(wpa_s, WLAN_REASON_DEAUTH_LEAVING);
-       ssid->disabled = 1;
-
+       wpa_supplicant_disable_network(wpa_s, ssid);
        return wpas_dbus_new_success_reply(message);
 }
 
@@ -1121,13 +1103,7 @@ DBusMessage * wpas_dbus_iface_select_network(DBusMessage *message,
 
        if (strlen(dbus_message_get_signature(message)) == 0) {
                /* Any network */
-               ssid = wpa_s->conf->ssid;
-               while (ssid) {
-                       ssid->disabled = 0;
-                       ssid = ssid->next;
-               }
-               wpa_s->reassociate = 1;
-               wpa_supplicant_req_scan(wpa_s, 0, 0);
+               ssid = NULL;
        } else {
                const char *obj_path;
                int nid;
@@ -1166,24 +1142,11 @@ DBusMessage * wpas_dbus_iface_select_network(DBusMessage *message,
                        reply = wpas_dbus_new_invalid_network_error(message);
                        goto out;
                }
-
-               /* Finally, associate with the network */
-               if (ssid != wpa_s->current_ssid && wpa_s->current_ssid)
-                       wpa_supplicant_disassociate(
-                               wpa_s, WLAN_REASON_DEAUTH_LEAVING);
-
-               /* Mark all other networks disabled and trigger reassociation
-                */
-               ssid = wpa_s->conf->ssid;
-               while (ssid) {
-                       ssid->disabled = (nid != ssid->id);
-                       ssid = ssid->next;
-               }
-               wpa_s->disconnected = 0;
-               wpa_s->reassociate = 1;
-               wpa_supplicant_req_scan(wpa_s, 0, 0);
        }
 
+       /* Finally, associate with the network */
+       wpa_supplicant_select_network(wpa_s, ssid);
+
        reply = wpas_dbus_new_success_reply(message);
 
 out:
@@ -1233,11 +1196,11 @@ DBusMessage * wpas_dbus_iface_set_ap_scan(DBusMessage *message,
                goto out;
        }
 
-       if (ap_scan > 2) {
+       if (wpa_supplicant_set_ap_scan(wpa_s, ap_scan)) {
                reply = wpas_dbus_new_invalid_opts_error(message, NULL);
                goto out;
        }
-       wpa_s->conf->ap_scan = ap_scan;
+
        reply = wpas_dbus_new_success_reply(message);
 
 out:
index 613d359815e0c17cb6a8f20611bab0e13fe578d2..fd2e321878bd0cc8535918564d5a9ec55f7606e3 100644 (file)
@@ -1349,6 +1349,202 @@ void wpa_supplicant_deauthenticate(struct wpa_supplicant *wpa_s,
 }
 
 
+/**
+ * wpa_supplicant_enable_network - Mark a configured network as enabled
+ * @wpa_s: wpa_supplicant structure for a network interface
+ * @ssid: wpa_ssid structure for a configured network or %NULL
+ *
+ * Enables the specified network or all networks if no network specified.
+ */
+void wpa_supplicant_enable_network(struct wpa_supplicant *wpa_s,
+                                  struct wpa_ssid *ssid)
+{
+       struct wpa_ssid *other_ssid;
+       int was_disabled;
+
+       if (ssid == NULL) {
+               other_ssid = wpa_s->conf->ssid;
+               while (other_ssid) {
+                       if (other_ssid == wpa_s->current_ssid &&
+                           other_ssid->disabled)
+                               wpa_s->reassociate = 1;
+
+                       was_disabled = other_ssid->disabled;
+
+                       other_ssid->disabled = 0;
+
+                       if (was_disabled != other_ssid->disabled)
+                               wpas_notify_network_enabled_changed(
+                                       wpa_s, other_ssid);
+
+                       other_ssid = other_ssid->next;
+               }
+               if (wpa_s->reassociate)
+                       wpa_supplicant_req_scan(wpa_s, 0, 0);
+       } else if (wpa_s->current_ssid == NULL && ssid->disabled) {
+               /*
+                * Try to reassociate since there is no current configuration
+                * and a new network was made available.
+                */
+               wpa_s->reassociate = 1;
+               wpa_supplicant_req_scan(wpa_s, 0, 0);
+
+               was_disabled = ssid->disabled;
+
+               ssid->disabled = 0;
+
+               if (was_disabled != ssid->disabled)
+                       wpas_notify_network_enabled_changed(wpa_s, ssid);
+       }
+}
+
+
+/**
+ * wpa_supplicant_disable_network - Mark a configured network as disabled
+ * @wpa_s: wpa_supplicant structure for a network interface
+ * @ssid: wpa_ssid structure for a configured network or %NULL
+ *
+ * Disables the specified network or all networks if no network specified.
+ */
+void wpa_supplicant_disable_network(struct wpa_supplicant *wpa_s,
+                                   struct wpa_ssid *ssid)
+{
+       struct wpa_ssid *other_ssid;
+       int was_disabled;
+
+       if (ssid == NULL) {
+               other_ssid = wpa_s->conf->ssid;
+               while (other_ssid) {
+                       was_disabled = other_ssid->disabled;
+
+                       other_ssid->disabled = 1;
+
+                       if (was_disabled != other_ssid->disabled)
+                               wpas_notify_network_enabled_changed(
+                                       wpa_s, other_ssid);
+
+                       other_ssid = other_ssid->next;
+               }
+               if (wpa_s->current_ssid)
+                       wpa_supplicant_disassociate(
+                               wpa_s, WLAN_REASON_DEAUTH_LEAVING);
+       } else {
+               if (ssid == wpa_s->current_ssid)
+                       wpa_supplicant_disassociate(
+                               wpa_s, WLAN_REASON_DEAUTH_LEAVING);
+
+               was_disabled = ssid->disabled;
+
+               ssid->disabled = 1;
+
+               if (was_disabled != ssid->disabled)
+                       wpas_notify_network_enabled_changed(wpa_s, ssid);
+       }
+}
+
+
+/**
+ * wpa_supplicant_select_network - Attempt association with a network
+ * @wpa_s: wpa_supplicant structure for a network interface
+ * @ssid: wpa_ssid structure for a configured network or %NULL for any network
+ */
+void wpa_supplicant_select_network(struct wpa_supplicant *wpa_s,
+                                  struct wpa_ssid *ssid)
+{
+
+       struct wpa_ssid *other_ssid;
+
+       if (ssid && ssid != wpa_s->current_ssid && wpa_s->current_ssid)
+               wpa_supplicant_disassociate(
+                       wpa_s, WLAN_REASON_DEAUTH_LEAVING);
+
+       /*
+        * Mark all other networks disabled or mark all networks enabled if no
+        * network specified.
+        */
+       other_ssid = wpa_s->conf->ssid;
+       while (other_ssid) {
+               int was_disabled = other_ssid->disabled;
+
+               other_ssid->disabled = ssid ? (ssid->id != other_ssid->id) : 0;
+
+               if (was_disabled != other_ssid->disabled)
+                       wpas_notify_network_enabled_changed(wpa_s, other_ssid);
+
+               other_ssid = other_ssid->next;
+       }
+       wpa_s->disconnected = 0;
+       wpa_s->reassociate = 1;
+       wpa_supplicant_req_scan(wpa_s, 0, 0);
+
+       wpas_notify_network_selected(wpa_s, ssid);
+}
+
+
+/**
+ * wpa_supplicant_set_ap_scan - Set AP scan mode for interface
+ * @wpa_s: wpa_supplicant structure for a network interface
+ * @ap_scan: AP scan mode
+ * Returns: 0 if succeed or -1 if ap_scan has an invalid value
+ *
+ */
+int wpa_supplicant_set_ap_scan(struct wpa_supplicant *wpa_s, int ap_scan)
+{
+
+       int old_ap_scan;
+
+       if (ap_scan < 0 || ap_scan > 2)
+               return -1;
+
+       old_ap_scan = wpa_s->conf->ap_scan;
+       wpa_s->conf->ap_scan = ap_scan;
+
+       if (old_ap_scan != wpa_s->conf->ap_scan)
+               wpas_notify_ap_scan_changed(wpa_s);
+
+       return 0;
+}
+
+
+/**
+ * wpa_supplicant_set_debug_params - Set global debug params
+ * @global: wpa_global structure
+ * @debug_level: debug level
+ * @debug_timestamp: determines if show timestamp in debug data
+ * @debug_show_keys: determines if show keys in debug data
+ * Returns: 0 if succeed or -1 if debug_level has wrong value
+ */
+int wpa_supplicant_set_debug_params(struct wpa_global *global, int debug_level,
+                                   int debug_timestamp, int debug_show_keys)
+{
+
+       int old_level, old_timestamp, old_show_keys;
+
+       /* check for allowed debuglevels */
+       if (debug_level != MSG_MSGDUMP &&
+           debug_level != MSG_DEBUG &&
+           debug_level != MSG_INFO &&
+           debug_level != MSG_WARNING &&
+           debug_level != MSG_ERROR)
+               return -1;
+
+       old_level = wpa_debug_level;
+       old_timestamp = wpa_debug_timestamp;
+       old_show_keys = wpa_debug_show_keys;
+
+       wpa_debug_level = debug_level;
+       wpa_debug_timestamp = debug_timestamp ? 1 : 0;
+       wpa_debug_show_keys = debug_show_keys ? 1 : 0;
+
+       if (wpa_debug_level != old_level ||
+           wpa_debug_timestamp != old_timestamp ||
+           wpa_debug_show_keys != old_show_keys)
+               wpas_notify_debug_params_changed(global);
+
+       return 0;
+}
+
+
 static int wpa_supplicant_get_scan_results_old(struct wpa_supplicant *wpa_s)
 {
 #define SCAN_AP_LIMIT 128
index e814f86b816005ade0a0d1472886a7f2b11d6fcc..a5eaaf1fb0e8e80fc861fec87f2b1ee280d73c7a 100644 (file)
@@ -418,6 +418,18 @@ void wpa_supplicant_deauthenticate(struct wpa_supplicant *wpa_s,
 void wpa_supplicant_disassociate(struct wpa_supplicant *wpa_s,
                                 int reason_code);
 
+void wpa_supplicant_enable_network(struct wpa_supplicant *wpa_s,
+                                  struct wpa_ssid *ssid);
+void wpa_supplicant_disable_network(struct wpa_supplicant *wpa_s,
+                                   struct wpa_ssid *ssid);
+void wpa_supplicant_select_network(struct wpa_supplicant *wpa_s,
+                                  struct wpa_ssid *ssid);
+int wpa_supplicant_set_ap_scan(struct wpa_supplicant *wpa_s,
+                              int ap_scan);
+int wpa_supplicant_set_debug_params(struct wpa_global *global,
+                                   int debug_level, int debug_timestamp,
+                                   int debug_show_keys);
+
 void wpa_show_license(void);
 
 struct wpa_supplicant * wpa_supplicant_add_iface(struct wpa_global *global,