Hi Tomasz,
On pe, 2014-03-21 at 14:06 +0200, Tomasz Bursztyka wrote:
> Since P2P is dependent over wifi technology, it will get its technology
> registered by this one if only one of the interface supports it.
> Following the same logic, once an interface is removed the wifi
> technology will check if the P2P technology is still supported by - at
> least one of - the other interfaces, if any. If not, the P2P technology
> will be then unregistered.
> ---
> plugins/wifi.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 50 insertions(+)
>
> diff --git a/plugins/wifi.c b/plugins/wifi.c
> index 6da3c53..f19dd34 100644
> --- a/plugins/wifi.c
> +++ b/plugins/wifi.c
> @@ -64,6 +64,7 @@
> #define AUTOSCAN_DEFAULT "exponential:3:300"
>
> static struct connman_technology *wifi_technology = NULL;
> +static struct connman_technology *p2p_technology = NULL;
>
> struct hidden_params {
> char ssid[32];
> @@ -118,6 +119,25 @@ static GList *iface_list = NULL;
>
> static void start_autoscan(struct connman_device *device);
>
> +static int p2p_tech_probe(struct connman_technology *technology)
> +{
> + p2p_technology = technology;
> +
> + return 0;
> +}
> +
> +static void p2p_tech_remove(struct connman_technology *technology)
> +{
> + p2p_technology = NULL;
> +}
> +
> +static struct connman_technology_driver p2p_tech_driver = {
> + .name = "p2p",
> + .type = CONNMAN_SERVICE_TYPE_P2P,
> + .probe = p2p_tech_probe,
> + .remove = p2p_tech_remove,
> +};
> +
> static void handle_tethering(struct wifi_data *wifi)
> {
> if (!wifi->tethering)
> @@ -243,6 +263,23 @@ static void stop_autoscan(struct connman_device *device)
> connman_device_set_scanning(device, false);
> }
>
> +static void check_p2p_technology(void)
> +{
> + bool p2p_still_supported = false;
The variable name is confusing, what about naming it p2p_exists or
similar.
> + GList *list;
> +
> + for (list = iface_list; list; list = list->next) {
> + struct wifi_data *w = list->data;
> +
> + if (w->interface &&
> + g_supplicant_interface_has_p2p(w->interface))
> + p2p_still_supported = true;
> + }
> +
> + if (!p2p_still_supported)
> + connman_technology_driver_unregister(&p2p_tech_driver);
> +}
> +
> static void wifi_remove(struct connman_device *device)
> {
> struct wifi_data *wifi = connman_device_get_data(device);
> @@ -254,6 +291,8 @@ static void wifi_remove(struct connman_device *device)
>
> iface_list = g_list_remove(iface_list, wifi);
>
> + check_p2p_technology();
> +
> remove_networks(device, wifi);
>
> connman_device_set_powered(device, false);
> @@ -1743,6 +1782,16 @@ static void interface_removed(GSupplicantInterface
> *interface)
>
> wifi->interface = NULL;
> connman_device_set_powered(wifi->device, false);
> +
> + check_p2p_technology();
> +}
> +
> +static void p2p_support(GSupplicantInterface *interface)
> +{
> + DBG("");
> +
> + if (g_supplicant_interface_has_p2p(interface))
> + connman_technology_driver_register(&p2p_tech_driver);
> }
>
> static void scan_started(GSupplicantInterface *interface)
> @@ -1930,6 +1979,7 @@ static const GSupplicantCallbacks callbacks = {
> .interface_added = interface_added,
> .interface_state = interface_state,
> .interface_removed = interface_removed,
> + .p2p_support = p2p_support,
> .scan_started = scan_started,
> .scan_finished = scan_finished,
> .network_added = network_added,
Cheers,
Jukka
_______________________________________________
connman mailing list
[email protected]
https://lists.connman.net/mailman/listinfo/connman