All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 1/4] netdev: move failure point out of netdev_connect_common
@ 2021-08-09 17:16 James Prestwood
  2021-08-09 17:16 ` [PATCH v2 2/4] station: add ConnectBssid() developer method James Prestwood
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: James Prestwood @ 2021-08-09 17:16 UTC (permalink / raw)
  To: iwd

[-- Attachment #1: Type: text/plain, Size: 2727 bytes --]

The only point of failure in netdev_connect_common was setting
up the handshake type. Moving this outside of netdev_connect_common
makes the code flow much better in netdev_{connect,reassociate} as
nothing needs to be reset upon failure.
---
 src/netdev.c | 30 ++++++++++++++++--------------
 1 file changed, 16 insertions(+), 14 deletions(-)

diff --git a/src/netdev.c b/src/netdev.c
index 1b72b0a7..479791fd 100644
--- a/src/netdev.c
+++ b/src/netdev.c
@@ -3442,7 +3442,7 @@ offload_1x:
 	return 0;
 }
 
-static int netdev_connect_common(struct netdev *netdev,
+static void netdev_connect_common(struct netdev *netdev,
 					struct scan_bss *bss,
 					struct scan_bss *prev_bss,
 					struct handshake_state *hs,
@@ -3463,9 +3463,6 @@ static int netdev_connect_common(struct netdev *netdev,
 		goto build_cmd_connect;
 	}
 
-	if (netdev_handshake_state_setup_connection_type(hs) < 0)
-		return -ENOTSUP;
-
 	if (nhs->type != CONNECTION_TYPE_SOFTMAC)
 		goto build_cmd_connect;
 
@@ -3534,7 +3531,7 @@ build_cmd_connect:
 	wiphy_radio_work_insert(netdev->wiphy, &netdev->work, 1,
 				&connect_work_ops);
 
-	return 0;
+	return;
 }
 
 int netdev_connect(struct netdev *netdev, struct scan_bss *bss,
@@ -3554,9 +3551,14 @@ int netdev_connect(struct netdev *netdev, struct scan_bss *bss,
 	if (netdev->connected || netdev->connect_cmd_id || netdev->work.id)
 		return -EISCONN;
 
-	return netdev_connect_common(netdev, bss, NULL, hs, vendor_ies,
+	if (netdev_handshake_state_setup_connection_type(hs) < 0)
+		return -ENOTSUP;
+
+	netdev_connect_common(netdev, bss, NULL, hs, vendor_ies,
 					num_vendor_ies, event_filter, cb,
 					user_data);
+
+	return 0;
 }
 
 static void disconnect_idle(struct l_idle *idle, void *user_data)
@@ -3646,24 +3648,24 @@ int netdev_reassociate(struct netdev *netdev, struct scan_bss *target_bss,
 {
 	struct handshake_state *old_hs;
 	struct eapol_sm *old_sm;
-	int ret;
 
 	old_sm = netdev->sm;
 	old_hs = netdev->handshake;
 
-	ret = netdev_connect_common(netdev, target_bss, orig_bss, hs, NULL, 0,
-					event_filter, cb, user_data);
-	if (ret < 0)
-		return ret;
-
-	if (netdev->ap)
-		memcpy(netdev->ap->prev_bssid, orig_bss->addr, ETH_ALEN);
+	if (netdev_handshake_state_setup_connection_type(hs) < 0)
+		return -ENOTSUP;
 
 	netdev->associated = false;
 	netdev->operational = false;
 	netdev->connected = false;
 	netdev->in_reassoc = true;
 
+	netdev_connect_common(netdev, target_bss, orig_bss, hs, NULL, 0,
+					event_filter, cb, user_data);
+
+	if (netdev->ap)
+		memcpy(netdev->ap->prev_bssid, orig_bss->addr, ETH_ALEN);
+
 	netdev_rssi_polling_update(netdev);
 
 	if (old_sm)
-- 
2.31.1

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH v2 2/4] station: add ConnectBssid() developer method
  2021-08-09 17:16 [PATCH v2 1/4] netdev: move failure point out of netdev_connect_common James Prestwood
@ 2021-08-09 17:16 ` James Prestwood
  2021-08-09 17:16 ` [PATCH v2 3/4] station: move Roam() under station debug interface James Prestwood
  2021-08-09 17:16 ` [PATCH v2 4/4] test: update force-roam to use Debug interface James Prestwood
  2 siblings, 0 replies; 4+ messages in thread
From: James Prestwood @ 2021-08-09 17:16 UTC (permalink / raw)
  To: iwd

[-- Attachment #1: Type: text/plain, Size: 6262 bytes --]

This method will initiate a connection to a specific BSS rather
than relying on a network based connection (which the user has
no control over which specific BSS is selected).
---
 src/station.c | 129 +++++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 111 insertions(+), 18 deletions(-)

diff --git a/src/station.c b/src/station.c
index bc4e7539..9a053c85 100644
--- a/src/station.c
+++ b/src/station.c
@@ -286,6 +286,34 @@ static int bss_signal_strength_compare(const void *a, const void *b, void *user)
 	return (bss->signal_strength > new_bss->signal_strength) ? 1 : -1;
 }
 
+static int station_parse_bss(struct station *station,
+				struct scan_bss *bss, char *ssid_out,
+				enum security *security_out,
+				char *path_out)
+{
+	struct ie_rsn_info info;
+	const char *path;
+	int r;
+
+	r = scan_bss_get_rsn_info(bss, &info);
+	if (r < 0) {
+		if (r != -ENOENT)
+			return r;
+
+		*security_out = security_determine(bss->capability, NULL);
+	} else
+		*security_out = security_determine(bss->capability, &info);
+
+	memcpy(ssid_out, bss->ssid, bss->ssid_len);
+	ssid_out[bss->ssid_len] = '\0';
+
+	path = iwd_network_get_path(station, ssid_out, *security_out);
+
+	strcpy(path_out, path);
+
+	return 0;
+}
+
 /*
  * Returns the network object the BSS was added to or NULL if ignored.
  */
@@ -293,10 +321,8 @@ static struct network *station_add_seen_bss(struct station *station,
 						struct scan_bss *bss)
 {
 	struct network *network;
-	struct ie_rsn_info info;
-	int r;
 	enum security security;
-	const char *path;
+	char path[256];
 	char ssid[33];
 	uint32_t kbps100 = DIV_ROUND_CLOSEST(bss->data_rate, 100000);
 
@@ -315,25 +341,13 @@ static struct network *station_add_seen_bss(struct station *station,
 		return NULL;
 	}
 
-	memcpy(ssid, bss->ssid, bss->ssid_len);
-	ssid[bss->ssid_len] = '\0';
-
 	if (!(bss->capability & IE_BSS_CAP_ESS)) {
-		l_debug("Ignoring non-ESS BSS \"%s\"", ssid);
+		l_debug("Ignoring non-ESS BSS \"%.32s\"", ssid);
 		return NULL;
 	}
 
-	memset(&info, 0, sizeof(info));
-	r = scan_bss_get_rsn_info(bss, &info);
-	if (r < 0) {
-		if (r != -ENOENT)
-			return NULL;
-
-		security = security_determine(bss->capability, NULL);
-	} else
-		security = security_determine(bss->capability, &info);
-
-	path = iwd_network_get_path(station, ssid, security);
+	if (station_parse_bss(station, bss, ssid, &security, path) < 0)
+		return NULL;
 
 	network = l_hashmap_lookup(station->networks, path);
 	if (!network) {
@@ -3540,6 +3554,12 @@ static struct station *station_create(struct netdev *netdev)
 
 	station_fill_scan_freq_subsets(station);
 
+	if (iwd_is_developer_mode())
+		l_dbus_object_add_interface(dbus,
+					netdev_get_path(station->netdev),
+					IWD_STATION_DEBUG_INTERFACE,
+					station);
+
 	return station;
 }
 
@@ -3553,6 +3573,10 @@ static void station_free(struct station *station)
 	l_dbus_object_remove_interface(dbus_get_bus(),
 					netdev_get_path(station->netdev),
 					IWD_STATION_DIAGNOSTIC_INTERFACE);
+	if (iwd_is_developer_mode())
+		l_dbus_object_remove_interface(dbus_get_bus(),
+					netdev_get_path(station->netdev),
+					IWD_STATION_DEBUG_INTERFACE);
 
 	if (station->netconfig) {
 		netconfig_destroy(station->netconfig);
@@ -3761,6 +3785,19 @@ invalid_args:
 	return dbus_error_invalid_args(message);
 }
 
+static struct network *station_find_network_from_bss(struct station *station,
+						struct scan_bss *bss)
+{
+	enum security security;
+	static char path[256];
+	char ssid[33];
+
+	if (station_parse_bss(station, bss, ssid, &security, path) < 0)
+		return NULL;
+
+	return l_hashmap_lookup(station->networks, path);
+}
+
 static void station_setup_diagnostic_interface(
 					struct l_dbus_interface *interface)
 {
@@ -3777,6 +3814,53 @@ static void station_destroy_diagnostic_interface(void *user_data)
 {
 }
 
+static struct l_dbus_message *station_force_connect_bssid(struct l_dbus *dbus,
+						struct l_dbus_message *message,
+						void *user_data)
+{
+	struct station *station = user_data;
+	struct l_queue *bss_list;
+	struct scan_bss *target;
+	struct network *network;
+	struct l_dbus_message_iter iter;
+	uint8_t *mac;
+	uint32_t mac_len;
+
+	if (!l_dbus_message_get_arguments(message, "ay", &iter))
+		goto invalid_args;
+
+	if (!l_dbus_message_iter_get_fixed_array(&iter, &mac, &mac_len))
+		goto invalid_args;
+
+	if (mac_len != 6)
+		return dbus_error_invalid_args(message);
+
+	bss_list = station_get_bss_list(station);
+
+	target = l_queue_find(bss_list, bss_match_bssid, mac);
+	if (!target)
+		return dbus_error_invalid_args(message);
+
+	network = station_find_network_from_bss(station, target);
+	if (!network)
+		return dbus_error_invalid_args(message);
+
+	l_debug("Attempting forced connection to BSS "MAC, MAC_STR(mac));
+
+	return __network_connect(network, target, message);
+
+invalid_args:
+	return dbus_error_invalid_args(message);
+}
+
+static void station_setup_debug_interface(
+					struct l_dbus_interface *interface)
+{
+	l_dbus_interface_method(interface, "ConnectBssid", 0,
+					station_force_connect_bssid, "", "ay",
+					"mac");
+}
+
 static void ap_roam_frame_event(const struct mmpdu_header *hdr,
 					const void *body, size_t body_len,
 					int rssi, void *user_data)
@@ -3848,6 +3932,12 @@ static int station_init(void)
 					station_setup_diagnostic_interface,
 					station_destroy_diagnostic_interface,
 					false);
+	if (iwd_is_developer_mode())
+		l_dbus_register_interface(dbus_get_bus(),
+					IWD_STATION_DEBUG_INTERFACE,
+					station_setup_debug_interface,
+					NULL,
+					false);
 
 	if (!l_settings_get_uint(iwd_get_config(), "General",
 					"ManagementFrameProtection",
@@ -3889,6 +3979,9 @@ static void station_exit(void)
 {
 	l_dbus_unregister_interface(dbus_get_bus(),
 					IWD_STATION_DIAGNOSTIC_INTERFACE);
+	if (iwd_is_developer_mode())
+		l_dbus_unregister_interface(dbus_get_bus(),
+					IWD_STATION_DEBUG_INTERFACE);
 	l_dbus_unregister_interface(dbus_get_bus(), IWD_STATION_INTERFACE);
 	netdev_watch_remove(netdev_watch);
 	l_queue_destroy(station_list, NULL);
-- 
2.31.1

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH v2 3/4] station: move Roam() under station debug interface
  2021-08-09 17:16 [PATCH v2 1/4] netdev: move failure point out of netdev_connect_common James Prestwood
  2021-08-09 17:16 ` [PATCH v2 2/4] station: add ConnectBssid() developer method James Prestwood
@ 2021-08-09 17:16 ` James Prestwood
  2021-08-09 17:16 ` [PATCH v2 4/4] test: update force-roam to use Debug interface James Prestwood
  2 siblings, 0 replies; 4+ messages in thread
From: James Prestwood @ 2021-08-09 17:16 UTC (permalink / raw)
  To: iwd

[-- Attachment #1: Type: text/plain, Size: 969 bytes --]

---
 src/station.c | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/src/station.c b/src/station.c
index 9a053c85..02e61c10 100644
--- a/src/station.c
+++ b/src/station.c
@@ -3804,10 +3804,6 @@ static void station_setup_diagnostic_interface(
 	l_dbus_interface_method(interface, "GetDiagnostics", 0,
 				station_get_diagnostics, "a{sv}", "",
 				"diagnostics");
-
-	if (iwd_is_developer_mode())
-		l_dbus_interface_method(interface, "Roam", 0,
-					station_force_roam, "", "ay", "mac");
 }
 
 static void station_destroy_diagnostic_interface(void *user_data)
@@ -3859,6 +3855,8 @@ static void station_setup_debug_interface(
 	l_dbus_interface_method(interface, "ConnectBssid", 0,
 					station_force_connect_bssid, "", "ay",
 					"mac");
+	l_dbus_interface_method(interface, "Roam", 0,
+					station_force_roam, "", "ay", "mac");
 }
 
 static void ap_roam_frame_event(const struct mmpdu_header *hdr,
-- 
2.31.1

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH v2 4/4] test: update force-roam to use Debug interface
  2021-08-09 17:16 [PATCH v2 1/4] netdev: move failure point out of netdev_connect_common James Prestwood
  2021-08-09 17:16 ` [PATCH v2 2/4] station: add ConnectBssid() developer method James Prestwood
  2021-08-09 17:16 ` [PATCH v2 3/4] station: move Roam() under station debug interface James Prestwood
@ 2021-08-09 17:16 ` James Prestwood
  2 siblings, 0 replies; 4+ messages in thread
From: James Prestwood @ 2021-08-09 17:16 UTC (permalink / raw)
  To: iwd

[-- Attachment #1: Type: text/plain, Size: 552 bytes --]

---
 test/force-roam | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/test/force-roam b/test/force-roam
index b590c84a..b45ad2e6 100755
--- a/test/force-roam
+++ b/test/force-roam
@@ -9,7 +9,7 @@ if (len(sys.argv) != 3):
 
 bus = dbus.SystemBus()
 device = dbus.Interface(bus.get_object("net.connman.iwd", sys.argv[1]),
-                                    "net.connman.iwd.StationDiagnostic")
+                                    "net.connman.iwd.StationDebug")
 
 mac = sys.argv[2].replace(':', '')
 
-- 
2.31.1

^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2021-08-09 17:16 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-08-09 17:16 [PATCH v2 1/4] netdev: move failure point out of netdev_connect_common James Prestwood
2021-08-09 17:16 ` [PATCH v2 2/4] station: add ConnectBssid() developer method James Prestwood
2021-08-09 17:16 ` [PATCH v2 3/4] station: move Roam() under station debug interface James Prestwood
2021-08-09 17:16 ` [PATCH v2 4/4] test: update force-roam to use Debug interface James Prestwood

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.