[wifi-tdls]: Fixed Memory Leak issue
[platform/core/connectivity/net-config.git] / src / wifi-tdls.c
1 /*\r
2  * Network Configuration Module\r
3  *\r
4  * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. All rights reserved.\r
5  *\r
6  * Licensed under the Apache License, Version 2.0 (the "License");\r
7  * you may not use this file except in compliance with the License.\r
8  * You may obtain a copy of the License at\r
9  *\r
10  * http://www.apache.org/licenses/LICENSE-2.0\r
11  *\r
12  * Unless required by applicable law or agreed to in writing, software\r
13  * distributed under the License is distributed on an "AS IS" BASIS,\r
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
15  * See the License for the specific language governing permissions and\r
16  * limitations under the License.\r
17  *\r
18  */\r
19 \r
20 #include <stdio.h>\r
21 #include <time.h>\r
22 #include <stdlib.h>\r
23 #include <sys/time.h>\r
24 #include <unistd.h>\r
25 #include <string.h>\r
26 #include "neterror.h"\r
27 #include "netdbus.h"\r
28 #include "netsupplicant.h"\r
29 #include "network-state.h"\r
30 #include <vconf.h>\r
31 #include <vconf-keys.h>\r
32 #include <arpa/inet.h>\r
33 #include <log.h>\r
34 #include "util.h"\r
35 #include "neterror.h"\r
36 #include "wifi-tdls.h"\r
37 #include <glib.h>\r
38 \r
39 wifi_tdls_wfd_info_s peer_info;\r
40 char *peer_mac = NULL;\r
41 \r
42 void __netconfig_wifi_notify_tdls_event(const char *sig_name,const char *peer_mac)\r
43 {\r
44         GVariantBuilder *builder;\r
45         GVariant *params;\r
46         builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));\r
47         g_variant_builder_add(builder, "{sv}", "peermac", g_variant_new_string(peer_mac));\r
48 \r
49         params = g_variant_new("(@a{sv})", g_variant_builder_end(builder));\r
50         g_variant_builder_unref(builder);\r
51 \r
52         netconfig_dbus_emit_signal(NULL,\r
53                                 NETCONFIG_WIFI_PATH,\r
54                                 NETCONFIG_WIFI_INTERFACE,\r
55                                 sig_name,\r
56                                 params);\r
57 \r
58         INFO("Sent signal (%s) Peer Mac (%s)", sig_name, peer_mac);\r
59 }\r
60 \r
61 static GVariant * __netconfig_wifi_tdls_send_dbus_str(const char* method, const char *str)\r
62 {\r
63         GVariant *message = NULL;\r
64         const char *if_path = NULL;\r
65         GVariant *params = NULL;\r
66 \r
67         if_path = netconfig_wifi_get_supplicant_interface();\r
68         if (if_path == NULL) {\r
69                 ERR("Fail to get wpa_supplicant DBus path");\r
70                 return NULL;\r
71         }\r
72 \r
73         params = g_variant_new("(s)", str);\r
74         INFO("[TizenMW-->WPAS] Sent Dbus Method :[%s],value[%s]", method,str);\r
75         message = netconfig_invoke_dbus_method(SUPPLICANT_SERVICE,\r
76                         if_path, SUPPLICANT_INTERFACE ".Interface", method, params);\r
77 \r
78         INFO("TDLS Returned from Blocking method for Send DBUS Command");\r
79         return message;\r
80 }\r
81 \r
82 gboolean handle_tdls_disconnect(Wifi *wifi, GDBusMethodInvocation *context,\r
83                         gchar *peer_mac_Addr)\r
84 {\r
85         DBG("[TizenMW-->WPAS]: TDLS Teardown Request: [%s]", peer_mac_Addr);\r
86 \r
87         if(!peer_info.is_connected) {\r
88                 ERR(" No active TDLS Connection !!!");\r
89 \r
90         } else {\r
91                 GVariant *message = NULL;\r
92                 message = __netconfig_wifi_tdls_send_dbus_str("TDLSTeardown", (const char*)peer_mac_Addr);\r
93                 DBG("[TizenMW<--WPAS] TDLS DBUS Command sent successfully");\r
94                 g_variant_unref(message);\r
95                 peer_info.is_connected = 0;\r
96         }\r
97 \r
98         wifi_complete_tdls_disconnect(wifi, context, 1);\r
99         return TRUE;\r
100 }\r
101 \r
102 gboolean handle_tdls_connected_peer(Wifi *wifi, GDBusMethodInvocation *context)\r
103 {\r
104         DBG("[TizenMW-->WPAS]: TDLS Connected Peer Request: ");\r
105 \r
106         GVariant *message = NULL;\r
107         const gchar* reply_str = NULL;\r
108 \r
109         if (peer_mac == NULL) {\r
110                 INFO("TDLS: No Active Connection");\r
111                 wifi_complete_tdls_connected_peer(wifi, context, "00.00.00.00.00.00");\r
112                 return TRUE;\r
113         }\r
114         message = __netconfig_wifi_tdls_send_dbus_str("TDLSStatus", (const char*)peer_mac);\r
115         if (message == NULL) {\r
116                 ERR(" TDLS : No active TDLS Link Setup !!!");\r
117                 wifi_complete_tdls_connected_peer(wifi, context, "00.00.00.00.00.00");\r
118                 return TRUE;\r
119         }\r
120 \r
121         g_variant_get(message, "(&s)", &reply_str);\r
122         INFO("TDLS reply: [%s]", reply_str);\r
123         INFO("TDLS :peer_mac [%s]", peer_mac);\r
124 \r
125         if (g_strcmp0("connected", reply_str) != 0) {\r
126                 ERR("[TizenMW<--WPAS] TDLS Connection not available");\r
127                 wifi_complete_tdls_connected_peer(wifi, context, "00.00.00.00.00.00");\r
128                 g_variant_unref(message);\r
129                 return TRUE;\r
130         }\r
131 \r
132         INFO("[TizenMW<--WPAS] TDLS Connection available, Peer Mac address %s", peer_mac);\r
133         wifi_complete_tdls_connected_peer(wifi, context, peer_mac);\r
134 \r
135         g_variant_unref(message);\r
136         return TRUE;\r
137 }\r
138 \r
139 void netconfig_wifi_tlds_connected_event(GVariant *message)\r
140 {\r
141 \r
142         DBG("[TizenMW<--WPAS] WiFi TDLS Connected EVENT");\r
143         if (peer_info.is_connected == 1) {\r
144                 INFO("TDLS Peer already connected");\r
145                 g_free(peer_mac);\r
146         }\r
147 \r
148         g_variant_get(message, "(s)", &peer_mac);\r
149         INFO("Peer Mac Address: [%s]", peer_mac);\r
150 \r
151         /*update the Peer Mac address in Gloablestructure*/\r
152         peer_info.is_connected = 1;\r
153         __netconfig_wifi_notify_tdls_event("TDLSConnect", peer_mac);\r
154 }\r
155 \r
156 void netconfig_wifi_tlds_disconnected_event(GVariant *message)\r
157 {\r
158         DBG("[TizenMW<--WPAS]: WiFi TDLS Disconnected EVENT");\r
159         const gchar *peer_mac_addr = NULL;\r
160 \r
161         g_variant_get(message, "(&s)", &peer_mac_addr);\r
162         if (g_strcmp0(peer_mac, peer_mac_addr) == 0) {\r
163                 INFO("TDLS Peer Disconnected Mac Address: [%s]", peer_mac);\r
164                 peer_info.is_connected = 0;\r
165                 __netconfig_wifi_notify_tdls_event("TDLSDisconnect",peer_mac);\r
166         } else\r
167                 INFO("TDLS Peer Disconnected peer_mac(%s) != peer_mac_address(%s)", peer_mac, peer_mac_addr);\r
168 }\r