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*/
__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;
}
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)
{
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) {
discover_timeout = TDLS_DISCOVER_TIMOUT;
}
+ is_timer_expired = 0;
tdls_timer_id = g_timeout_add_seconds(discover_timeout,
_tdls_timer_discover_event, NULL);
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_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);
+
+ 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)
{
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");
}