diff options
-rw-r--r-- | plugins/wifi.c | 42 |
1 files changed, 33 insertions, 9 deletions
diff --git a/plugins/wifi.c b/plugins/wifi.c index 83745064..93ae9019 100644 --- a/plugins/wifi.c +++ b/plugins/wifi.c @@ -66,6 +66,8 @@ struct wifi_data { connman_bool_t connected; connman_bool_t disconnecting; connman_bool_t tethering; + connman_bool_t bridged; + const char *bridge; int index; unsigned flags; unsigned int watch; @@ -73,6 +75,25 @@ struct wifi_data { static GList *iface_list = NULL; +static void handle_tethering(struct wifi_data *wifi) +{ + if (wifi->tethering == FALSE) + return; + + if (wifi->bridge == NULL) + return; + + if (wifi->bridged == TRUE) + return; + + DBG("index %d bridge %s", wifi->index, wifi->bridge); + + if (connman_inet_add_to_bridge(wifi->index, wifi->bridge) < 0) + return; + + wifi->bridged = TRUE; +} + static void wifi_newlink(unsigned flags, unsigned change, void *user_data) { struct connman_device *device = user_data; @@ -91,9 +112,11 @@ static void wifi_newlink(unsigned flags, unsigned change, void *user_data) } if ((wifi->flags & IFF_LOWER_UP) != (flags & IFF_LOWER_UP)) { - if (flags & IFF_LOWER_UP) + if (flags & IFF_LOWER_UP) { DBG("carrier on"); - else + + handle_tethering(wifi); + } else DBG("carrier off"); } @@ -113,6 +136,8 @@ static int wifi_probe(struct connman_device *device) wifi->connected = FALSE; wifi->disconnecting = FALSE; wifi->tethering = FALSE; + wifi->bridged = FALSE; + wifi->bridge = NULL; wifi->state = G_SUPPLICANT_STATE_INACTIVE; connman_device_set_data(device, wifi); @@ -837,7 +862,6 @@ struct wifi_tethering_info { struct wifi_data *wifi; struct connman_technology *technology; char *ifname; - const char *bridge; GSupplicantSSID *ssid; }; @@ -875,11 +899,11 @@ static void ap_start_callback(int result, GSupplicantInterface *interface, struct wifi_tethering_info *info = user_data; DBG("result %d index %d bridge %s", - result, info->wifi->index, info->bridge); + result, info->wifi->index, info->wifi->bridge); if (result < 0) { connman_inet_remove_from_bridge(info->wifi->index, - info->bridge); + info->wifi->bridge); connman_technology_tethering_notify(info->technology, FALSE); } @@ -899,7 +923,7 @@ static void ap_create_callback(int result, if (result < 0) { connman_inet_remove_from_bridge(info->wifi->index, - info->bridge); + info->wifi->bridge); connman_technology_tethering_notify(info->technology, FALSE); g_free(info->ifname); @@ -938,9 +962,8 @@ static void sta_remove_callback(int result, info->wifi->interface = NULL; connman_technology_tethering_notify(info->technology, TRUE); - connman_inet_add_to_bridge(info->wifi->index, info->bridge); - g_supplicant_interface_create(info->ifname, driver, info->bridge, + g_supplicant_interface_create(info->ifname, driver, info->wifi->bridge, ap_create_callback, info); } @@ -968,6 +991,7 @@ static int tech_set_tethering(struct connman_technology *technology, connman_inet_remove_from_bridge(wifi->index, bridge); + wifi->bridged = FALSE; } } @@ -998,7 +1022,7 @@ static int tech_set_tethering(struct connman_technology *technology, info->wifi = wifi; info->technology = technology; - info->bridge = bridge; + info->wifi->bridge = bridge; info->ssid = ssid_ap_init(identifier, passphrase); if (info->ssid == NULL) { g_free(info); |