When enabling tethering, try to first find a device without a network
connection that supports AP mode. If none is found, try again but this
time ignoring the network connection.

Factor out tethering enabling adding a boolea parameter that tells
whether to consider a connected network or not.

Reported by citylight2.
---
 plugins/wifi.c | 66 ++++++++++++++++++++++++++++++++++++++--------------------
 1 file changed, 43 insertions(+), 23 deletions(-)

diff --git a/plugins/wifi.c b/plugins/wifi.c
index 587dee2..f2b6ab2 100644
--- a/plugins/wifi.c
+++ b/plugins/wifi.c
@@ -3062,9 +3062,9 @@ static void sta_remove_callback(int result,
                                                        info);
 }
 
-static int tech_set_tethering(struct connman_technology *technology,
-                               const char *identifier, const char *passphrase,
-                               const char *bridge, bool enabled)
+static int enable_wifi_tethering(struct connman_technology *technology,
+                               const char *bridge, const char *identifier,
+                               const char *passphrase, bool available)
 {
        GList *list;
        GSupplicantInterface *interface;
@@ -3074,26 +3074,6 @@ static int tech_set_tethering(struct connman_technology 
*technology,
        unsigned int mode;
        int err;
 
-       DBG("");
-
-       if (!enabled) {
-               for (list = iface_list; list; list = list->next) {
-                       wifi = list->data;
-
-                       if (wifi->tethering) {
-                               wifi->tethering = false;
-
-                               connman_inet_remove_from_bridge(wifi->index,
-                                                                       bridge);
-                               wifi->bridged = false;
-                       }
-               }
-
-               connman_technology_tethering_notify(technology, false);
-
-               return 0;
-       }
-
        for (list = iface_list; list; list = list->next) {
                wifi = list->data;
 
@@ -3114,6 +3094,9 @@ static int tech_set_tethering(struct connman_technology 
*technology,
                        continue;
                }
 
+               if (wifi->network && available)
+                       continue;
+
                info = g_try_malloc0(sizeof(struct wifi_tethering_info));
                if (!info)
                        return -ENOMEM;
@@ -3167,6 +3150,43 @@ static int tech_set_tethering(struct connman_technology 
*technology,
        return -EOPNOTSUPP;
 }
 
+static int tech_set_tethering(struct connman_technology *technology,
+                               const char *identifier, const char *passphrase,
+                               const char *bridge, bool enabled)
+{
+       GList *list;
+       struct wifi_data *wifi;
+       int err;
+
+       DBG("");
+
+       if (!enabled) {
+               for (list = iface_list; list; list = list->next) {
+                       wifi = list->data;
+
+                       if (wifi->tethering) {
+                               wifi->tethering = false;
+
+                               connman_inet_remove_from_bridge(wifi->index,
+                                                                       bridge);
+                               wifi->bridged = false;
+                       }
+               }
+
+               connman_technology_tethering_notify(technology, false);
+
+               return 0;
+       }
+
+       err = enable_wifi_tethering(technology, bridge, identifier, passphrase,
+                               true);
+       if (err < 0)
+               err = enable_wifi_tethering(technology, bridge, identifier,
+                                       passphrase, false);
+
+       return err;
+}
+
 static void regdom_callback(int result, const char *alpha2, void *user_data)
 {
        DBG("");
-- 
2.1.4

_______________________________________________
connman mailing list
connman@connman.net
https://lists.connman.net/mailman/listinfo/connman

Reply via email to