]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
DBus: Add "Roam" command support
authorBrian Norris <briannorris@chromium.org>
Tue, 23 Jun 2020 17:39:02 +0000 (10:39 -0700)
committerJouni Malinen <j@w1.fi>
Sat, 10 Oct 2020 16:59:17 +0000 (19:59 +0300)
Add D-Bus interface for ROAM command, imitating the existing wpa_cli
command.

Chromium OS has been carrying a form of this patch for a very long time.
I've cleaned it up a bit and documented it.

Signed-off-by: Brian Norris <briannorris@chromium.org>
doc/dbus.doxygen
wpa_supplicant/dbus/dbus_new.c
wpa_supplicant/dbus/dbus_new_handlers.c
wpa_supplicant/dbus/dbus_new_handlers.h

index 08488ad4c281dcff404443b1589cf612183b1abc..06e53b98c2786a05bccb3020a71b961e9618d5d2 100644 (file)
@@ -322,6 +322,24 @@ fi.w1.wpa_supplicant1.CreateInterface.
        </dl>
       </li>
 
+      <li>
+       <h3>Roam ( s : addr ) --> nothing</h3>
+       <p>Initiate a roam to another BSS within the current ESS.</p>
+       <h4>Possible errors</h4>
+       <dl>
+         <dt>fi.w1.wpa_supplicant1.InvalidArgs</dt>
+         <dd>Missing address argument.</dd>
+         <dt>fi.w1.wpa_supplicant1.InvalidArgs</dt>
+         <dd>Invalid hardware address format.</dd>
+         <dt>fi.w1.wpa_supplicant1.InvalidArgs</dt>
+         <dd>Target BSS not found.</dd>
+         <dt>fi.w1.wpa_supplicant1.NotConnected</dt>
+         <dd>Interface is not connected to any network.</dd>
+         <dt>fi.w1.wpa_supplicant1.UnknownError</dt>
+         <dd>Scan processing was not included in the build.</dd>
+       </dl>
+      </li>
+
       <li>
        <h3>AddBlob ( s : name, ay : data ) --> nothing</h3>
        <p>Adds a blob to the interface.</p>
index ab7628f87057b02e1a3f98bef455b40d62a1790e..6dcd948ada38841379daf376794f22a34e7f444d 100644 (file)
@@ -3212,6 +3212,14 @@ static const struct wpa_dbus_method_desc wpas_dbus_interface_methods[] = {
                  END_ARGS
          }
        },
+       { "Roam", WPAS_DBUS_NEW_IFACE_INTERFACE,
+         (WPADBusMethodHandler) wpas_dbus_handler_roam,
+         {
+                 { "addr", "s", ARG_IN },
+                 END_ARGS
+         }
+       },
+
 #ifndef CONFIG_NO_CONFIG_BLOBS
        { "AddBlob", WPAS_DBUS_NEW_IFACE_INTERFACE,
          (WPADBusMethodHandler) wpas_dbus_handler_add_blob,
index 66a0e21520ca5b9bff632c5463180730d0b57624..489d89a8def0806567380f452c6f7984833b50c3 100644 (file)
@@ -1976,6 +1976,55 @@ out:
 }
 
 
+/**
+ * wpas_dbus_handler_roam - Initiate a roam to another BSS within the ESS
+ * @message: Pointer to incoming dbus message
+ * @wpa_s: wpa_supplicant structure for a network interface
+ * Returns: NULL on success or dbus error on failure
+ *
+ * Handler function for "Roam" method call of network interface.
+ */
+DBusMessage * wpas_dbus_handler_roam(DBusMessage *message,
+                                    struct wpa_supplicant *wpa_s)
+{
+#ifdef CONFIG_NO_SCAN_PROCESSING
+       return wpas_dbus_error_unknown_error(message,
+                                            "scan processing not included");
+#else /* CONFIG_NO_SCAN_PROCESSING */
+       u8 bssid[ETH_ALEN];
+       struct wpa_bss *bss;
+       struct wpa_ssid *ssid = wpa_s->current_ssid;
+       char *addr;
+
+       if (!dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &addr,
+                                  DBUS_TYPE_INVALID))
+               return wpas_dbus_error_invalid_args(message, NULL);
+
+       if (hwaddr_aton(addr, bssid))
+               return wpas_dbus_error_invalid_args(
+                       message, "Invalid hardware address format");
+
+       wpa_printf(MSG_DEBUG, "dbus: Roam " MACSTR, MAC2STR(bssid));
+
+       if (!ssid)
+               return dbus_message_new_error(
+                       message, WPAS_DBUS_ERROR_NOT_CONNECTED,
+                       "This interface is not connected");
+
+       bss = wpa_bss_get(wpa_s, bssid, ssid->ssid, ssid->ssid_len);
+       if (!bss) {
+               wpa_printf(MSG_DEBUG, "dbus: Roam: Target BSS not found");
+               return wpas_dbus_error_invalid_args(
+                       message, "Target BSS not found");
+       }
+
+       wpa_s->reassociate = 1;
+       wpa_supplicant_connect(wpa_s, bss, ssid);
+
+       return NULL;
+#endif /* CONFIG_NO_SCAN_PROCESSING */
+}
+
 #ifndef CONFIG_NO_CONFIG_BLOBS
 
 /**
index d528c0816771b774210f09b1d7d99d07d73a530a..c36383f05668857596bb32c924c16a85b9d8ebb0 100644 (file)
@@ -117,6 +117,9 @@ DBusMessage * wpas_dbus_handler_select_network(DBusMessage *message,
 DBusMessage * wpas_dbus_handler_network_reply(DBusMessage *message,
                                              struct wpa_supplicant *wpa_s);
 
+DBusMessage * wpas_dbus_handler_roam(DBusMessage *message,
+                                    struct wpa_supplicant *wpa_s);
+
 DBusMessage * wpas_dbus_handler_add_blob(DBusMessage *message,
                                         struct wpa_supplicant *wpa_s);