X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fwifi-tdls.c;h=7b301fb531fec62208305952d587cc2cc5eaac5a;hb=807831a62d5d6b959d3e5a9a30269138136369ba;hp=cd09f21b3be050bd94839fc4c9c710146a4109dd;hpb=f8dc25aea5d2babe55ff6d3b405928b67bd1f709;p=platform%2Fcore%2Fconnectivity%2Fnet-config.git diff --git a/src/wifi-tdls.c b/src/wifi-tdls.c index cd09f21..7b301fb 100755 --- a/src/wifi-tdls.c +++ b/src/wifi-tdls.c @@ -40,6 +40,7 @@ char *peer_mac = NULL; int is_connected = 0; static gint tdls_timer_id = 0; int is_discover_broadcast = 0; +int is_timer_expired = 0; #define TDLS_DISCOVER_TIMOUT 4 /*TDLS Unicast Discovery Timeout*/ #define TDLS_DISCOVER_BROADCAST_TIMOUT 8 /*TDLS Broadcast Discovery Timeout*/ @@ -101,13 +102,15 @@ static gboolean _tdls_timer_discover_event(gpointer user_data) __netconfig_wifi_notify_tdls_discover_event("00:00:00:00:00:00", is_discover_broadcast); is_discover_broadcast = 0; stop_tdls_timer(); + is_timer_expired = 1; + return FALSE; } static GVariant * __netconfig_wifi_tdls_send_dbus_str(const char* method, const char *str) { GVariant *message = NULL; - const char *if_path = NULL; + char *if_path = NULL; GVariant *params = NULL; if_path = netconfig_wifi_get_supplicant_interface(); @@ -121,10 +124,52 @@ static GVariant * __netconfig_wifi_tdls_send_dbus_str(const char* method, const message = netconfig_invoke_dbus_method(SUPPLICANT_SERVICE, if_path, SUPPLICANT_INTERFACE ".Interface", method, params); + g_free(if_path); INFO("TDLS Returned from Blocking method for Send DBUS Command"); return message; } +static unsigned char _netconfig_freq_to_channel(int freq) +{ + if (freq < 2412 || freq > 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) { @@ -139,7 +184,7 @@ gboolean handle_tdls_connect(Wifi *wifi, GDBusMethodInvocation *context, if (message == NULL) { ERR(" TDLS : failed to connect !!!"); netconfig_error_dbus_method_return(context, NETCONFIG_ERROR_INTERNAL, "FailTdlsConnect"); - return FALSE; + return TRUE; } DBG("[TizenMW<--WPAS] TDLS DBUS Command sent successfully"); @@ -158,13 +203,20 @@ gboolean handle_tdls_discover(Wifi *wifi, GDBusMethodInvocation *context, int discover_timeout = 0; GVariant *message = NULL; + + if (tdls_timer_id > 0) { + DBG(" TDLS Discover is already progress !!!"); + wifi_complete_tdls_discover(wifi, context, NETCONFIG_ERROR_TDLS_ALREADY_DONE); + return TRUE; + } + message = __netconfig_wifi_tdls_send_dbus_str("TDLSDiscover", (const char*)peer_mac_Addr); if (message == NULL) { ERR(" TDLS : failed to discover !!!"); netconfig_error_dbus_method_return(context, NETCONFIG_ERROR_INTERNAL, "FailTdlsDiscover"); wifi_complete_tdls_discover(wifi, context, NETCONFIG_ERROR_TDLS_FAIL_DISCOVER); - return FALSE; + return TRUE; } DBG(" TDLS DBUS Command sent successfully"); @@ -179,6 +231,7 @@ gboolean handle_tdls_discover(Wifi *wifi, GDBusMethodInvocation *context, discover_timeout = TDLS_DISCOVER_TIMOUT; } + is_timer_expired = 0; tdls_timer_id = g_timeout_add_seconds(discover_timeout, _tdls_timer_discover_event, NULL); @@ -201,7 +254,7 @@ gboolean handle_tdls_disconnect(Wifi *wifi, GDBusMethodInvocation *context, if (message == NULL) { ERR(" TDLS : failed to disconnect !!!"); netconfig_error_dbus_method_return(context, NETCONFIG_ERROR_INTERNAL, "FailTdlsDisconnect"); - return FALSE; + return TRUE; } DBG("[TizenMW<--WPAS] TDLS DBUS Command sent successfully"); @@ -250,6 +303,91 @@ 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; + 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_uint32(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); + + g_free(if_path); + 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) { @@ -283,16 +421,19 @@ void netconfig_wifi_tdls_disconnected_event(GVariant *message) void netconfig_wifi_tdls_peer_found_event(GVariant *message) { - DBG("WiFi TDLS Discovery EVENT"); + DBG("WiFi TDLS Discovery EVENT Received !!"); const gchar *peer_mac_addr = NULL; - g_variant_get(message, "(s)", &peer_mac_addr); - INFO("Discover Peer Mac Address: [%s]", peer_mac_addr); + if (!is_timer_expired) { + g_variant_get(message, "(s)", &peer_mac_addr); + INFO("Discover Peer Mac Address: [%s]", peer_mac_addr); - if (is_discover_broadcast == 0) - stop_tdls_timer(); + if (is_discover_broadcast == 0) + stop_tdls_timer(); - __netconfig_wifi_notify_tdls_discover_event(peer_mac_addr, is_discover_broadcast); + __netconfig_wifi_notify_tdls_discover_event(peer_mac_addr, is_discover_broadcast); + } else + DBG("Timer expired: Do not process the TDLS Discovery Event"); }