From f6b549a9d693b01961947268903085e57d0487d2 Mon Sep 17 00:00:00 2001 From: Maneesh Jain Date: Wed, 19 Apr 2017 16:31:06 +0530 Subject: [PATCH] TDLS: Implement the Channel Switch support in net-config Change-Id: I390d3c4089deacb2b8296502545fc2812f6429a8 Signed-off-by: Maneesh Jain --- include/wifi-tdls.h | 11 ++- interfaces/netconfig-iface-wifi.xml | 9 ++ packaging/net-config.spec | 2 +- src/.wifi-tdls.c.swp | Bin 0 -> 20480 bytes src/wifi-tdls.c | 125 ++++++++++++++++++++++++++++ src/wifi.c | 4 + 6 files changed, 148 insertions(+), 3 deletions(-) create mode 100644 src/.wifi-tdls.c.swp diff --git a/include/wifi-tdls.h b/include/wifi-tdls.h index 616e540..db8acc7 100755 --- a/include/wifi-tdls.h +++ b/include/wifi-tdls.h @@ -30,9 +30,10 @@ typedef enum { NETCONFIG_ERROR_TDLS_NO_ERROR = 0x00, NETCONFIG_ERROR_TDLS_FAIL_DISCOVER = 0x01, - NETCONFIG_ERROR_TDLS_FAIL_DISCONNECT = 0x02, + NETCONFIG_ERROR_TDLS_FAIL_DISCONNECT = 0x02, NETCONFIG_ERROR_TDLS_FAIL_CONNECT = 0x03, - NETCONFIG_ERROR_TDLS_ALREADY_DONE = 0x04, + NETCONFIG_ERROR_TDLS_ALREADY_DONE = 0x04, + NETCONFIG_ERROR_TDLS_FAIL_CHANNEL_SWITCH = 0x05, } netconfig_tdls_error_e; void netconfig_wifi_tdls_peer_found_event(GVariant *message); @@ -43,6 +44,12 @@ gboolean handle_tdls_disconnect(Wifi *wifi, GDBusMethodInvocation *context, gcha gboolean handle_tdls_connected_peer(Wifi *wifi, GDBusMethodInvocation *context); gboolean handle_tdls_connect(Wifi *wifi, GDBusMethodInvocation *context, gchar *peer_mac_Addr); gboolean handle_tdls_discover(Wifi *wifi, GDBusMethodInvocation *context, gchar *peer_mac_Addr); +gboolean handle_tdls_channel_switch(Wifi *wifi, GDBusMethodInvocation *context, + gchar *peer_mac_Addr, int freq); +gboolean handle_tdls_cancel_channel_switch(Wifi *wifi, GDBusMethodInvocation *context, + gchar *peer_mac_Addr); + + #ifdef __cplusplus } diff --git a/interfaces/netconfig-iface-wifi.xml b/interfaces/netconfig-iface-wifi.xml index 4edb933..719a572 100755 --- a/interfaces/netconfig-iface-wifi.xml +++ b/interfaces/netconfig-iface-wifi.xml @@ -127,6 +127,15 @@ + + + + + + + + + diff --git a/packaging/net-config.spec b/packaging/net-config.spec index 4b722a6..d473173 100755 --- a/packaging/net-config.spec +++ b/packaging/net-config.spec @@ -1,6 +1,6 @@ Name: net-config Summary: TIZEN Network Configuration service -Version: 1.1.108 +Version: 1.1.109 Release: 2 Group: System/Network License: Apache-2.0 diff --git a/src/.wifi-tdls.c.swp b/src/.wifi-tdls.c.swp new file mode 100644 index 0000000000000000000000000000000000000000..3efa7db80ca9eba5ebf9195bc01b1d95762c0b75 GIT binary patch literal 20480 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 5825 || + (freq > 2484 && freq < 5180)) { + ERR("Invalid Frequence Range"); + return 0; + } + if (freq >= 5180) + return 36 + (freq - 5180)/5; + else if (freq <= 2472) + return 1 + (freq - 2412)/5; + else if (freq == 2484) + return 14; + else + return 0; +} + +static unsigned char _netconfig_get_operating_class(int freq) +{ + unsigned char channel = 0; + unsigned char oper_class = 0; + + channel = _netconfig_freq_to_channel(freq); + + if (channel) { + /* Operating class 81 - 2.4 GHz band channels 1..13 */ + if (channel >= 1 && channel <= 13) + oper_class = 81; + /* Operating class 115 - 5 GHz, channels 36-48 */ + else if (channel >= 36 && channel <= 48) + oper_class = 115; + /* Operating class 124 - 5 GHz, channels 149,153,157,161 */ + else + oper_class = 124; + + INFO("TDLS: Operating Class is [%d]", oper_class); + return oper_class; + } + return 0; +} + gboolean handle_tdls_connect(Wifi *wifi, GDBusMethodInvocation *context, gchar *peer_mac_Addr) { @@ -250,6 +291,90 @@ gboolean handle_tdls_connected_peer(Wifi *wifi, GDBusMethodInvocation *context) return TRUE; } +gboolean handle_tdls_channel_switch(Wifi *wifi, GDBusMethodInvocation *context, + gchar *peer_mac_Addr, int freq) +{ + GVariant *message = NULL; + GVariantBuilder *builder; + GVariant *params; + const char *if_path = NULL; + unsigned char oper_class = 0; + + if (peer_mac_Addr == NULL) { + ERR("TDLS: Invalid Parameter"); + wifi_complete_tdls_channel_switch(wifi, context, + NETCONFIG_ERROR_TDLS_FAIL_CHANNEL_SWITCH); + return TRUE; + } + + oper_class = _netconfig_get_operating_class(freq); + + if (!oper_class) { + ERR("TDLS: Invalid Parameter"); + wifi_complete_tdls_channel_switch(wifi, context, + NETCONFIG_ERROR_TDLS_FAIL_CHANNEL_SWITCH); + return TRUE; + } + + builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); + + g_variant_builder_add(builder, "{sv}", "PeerAddress", g_variant_new_string(peer_mac_Addr)); + g_variant_builder_add(builder, "{sv}", "Frequency", g_variant_new_int32(freq)); + g_variant_builder_add(builder, "{sv}", "OperClass", g_variant_new_byte(oper_class)); + params = g_variant_new("(@a{sv})", g_variant_builder_end(builder)); + g_variant_builder_unref(builder); + + if_path = netconfig_wifi_get_supplicant_interface(); + + if (if_path == NULL) { + ERR("Fail to get wpa_supplicant DBus path"); + wifi_complete_tdls_channel_switch(wifi, context, + NETCONFIG_ERROR_TDLS_FAIL_CHANNEL_SWITCH); + return TRUE; + } + + message = netconfig_invoke_dbus_method(SUPPLICANT_SERVICE, + if_path, SUPPLICANT_INTERFACE ".Interface", "TDLSChannelSwitch", params); + + if (message == NULL) { + ERR(" TDLS : Fail to Process TDLS Channel Switch Request !!!"); + wifi_complete_tdls_channel_switch(wifi, context, + NETCONFIG_ERROR_TDLS_FAIL_CHANNEL_SWITCH); + return TRUE; + } + + INFO("TDLS Channel Change Request: Success"); + wifi_complete_tdls_channel_switch(wifi, context, NETCONFIG_ERROR_TDLS_NO_ERROR); + + g_variant_unref(message); + return TRUE; +} + + +gboolean handle_tdls_cancel_channel_switch(Wifi *wifi, GDBusMethodInvocation *context, + gchar *peer_mac_Addr) +{ + GVariant *message = NULL; + + if (peer_mac_Addr == NULL) { + INFO("TDLS: Invalid Parameter"); + wifi_complete_tdls_cancel_channel_switch(wifi, context, NETCONFIG_ERROR_TDLS_FAIL_CHANNEL_SWITCH); + return TRUE; + } + message = __netconfig_wifi_tdls_send_dbus_str("TDLSCancelChannelSwitch", (const char*)peer_mac_Addr); + if (message == NULL) { + ERR(" TDLS : Fail to TDLS Cancel Channel Swicth Request !!!"); + wifi_complete_tdls_cancel_channel_switch(wifi, context, NETCONFIG_ERROR_TDLS_FAIL_CHANNEL_SWITCH); + return TRUE; + } + + INFO("TDLS Cancel Channel Swicth Request : Success"); + wifi_complete_tdls_cancel_channel_switch(wifi, context, NETCONFIG_ERROR_TDLS_NO_ERROR); + + g_variant_unref(message); + return TRUE; +} + void netconfig_wifi_tdls_connected_event(GVariant *message) { diff --git a/src/wifi.c b/src/wifi.c index d2aa830..18f0d39 100755 --- a/src/wifi.c +++ b/src/wifi.c @@ -245,6 +245,10 @@ void wifi_object_create_and_init(void) G_CALLBACK(handle_tdls_discover), NULL); g_signal_connect(wifi_object, "handle-tdls-connect", G_CALLBACK(handle_tdls_connect), NULL); + g_signal_connect(wifi_object, "handle-tdls-channel-switch", + G_CALLBACK(handle_tdls_channel_switch), NULL); + g_signal_connect(wifi_object, "handle-tdls-cancel-channel-switch", + G_CALLBACK(handle_tdls_cancel_channel_switch), NULL); if (!g_dbus_interface_skeleton_export(interface_wifi, connection, NETCONFIG_WIFI_PATH, NULL)) { -- 2.34.1