Fix memory leak
[platform/core/connectivity/asp-manager.git] / src / session / asp-session.c
1 /*
2  * Copyright (c) 2016 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 /*****************************************************************************
18  * Standard headers
19  *****************************************************************************/
20 #include <stdio.h>
21 #include <stdlib.h>
22 /*#include <string.h> */
23 /*#include <time.h> */
24
25 #define HAVE_ASP_P2P_CONN
26
27 /*****************************************************************************
28  * System headers
29  *****************************************************************************/
30 /*#include <dlog.h> */
31 #include <gio/gio.h>
32
33 #ifdef HAVE_ASP_P2P_CONN
34 #include "asp-p2p-conn.h"
35 #endif
36
37 /*****************************************************************************
38  * Application Service Platform Daemon headers
39  *****************************************************************************/
40 #include "asp-manager.h"
41 #include "asp-manager-util.h"
42 #include "gfsm.h"
43 #include "asp-session.h"
44 #include "asp-session-peer.h"
45 #include "asp-coordination-protocol.h"
46 #include "asp-session-peer-interface.h"
47
48 /*****************************************************************************
49  * Macros and Typedefs
50  *****************************************************************************/
51 #define MAC_ADDRESS_LEN 6
52 #define ASP_SESSION_IPV4_BYTE 4
53 #define ASP_SESSION_IPV4_STR_LEN 16
54 #define ASP_SESSION_INFO_BYTE_MAX 144
55 #define ASP_DEFER_RESPONSE_BYTE_MAX 144
56 #define ASP_MAX_DEVICE_NAME_LEN 32
57 #define SESSION_STATUS_ADDITIONAL_INFO_LEN 16
58 #define SESSION_STATUS_ADDITIONAL_INFO_CO "REQUEST_SESSION"
59 #define SESSION_STATUS_ADDITIONAL_INFO_PD "PDRequest"
60
61 #define ASP_SESSION_HEADER "SESSION_FSM"
62
63 typedef enum asp_role {
64         ASP_ROLE_NONE,
65         ASP_ROLE_ADVERTIZER,
66         ASP_ROLE_SEEKER
67 } asp_role_e;
68
69 typedef struct asp_session {
70         /* Can be used as session argument from below */
71         gfsm_context_s *context;
72         asp_role_e asp_role;
73         guint8 session_mac[MAC_ADDRESS_LEN];    /* the MAC address of the P2P device that generated the session ID */
74         guint32 session_id;
75         guint8 service_mac[MAC_ADDRESS_LEN];    /* the MAC address of the P2P device that generated the session ID */
76         guint32 advertisement_id;
77         gchar peer_ip[ASP_SESSION_IPV4_STR_LEN];
78         GSocketAddress *sock_addr;
79         /*gchar peer_ipv6[ASP_SESSION_IPV6_STR_LEN]; */
80         /*GSocketFamily sock_family; // ipv4 or ipv6 */
81         asp_session_closed_state_e closed_state;
82         gboolean over_p2p;                      /*p2p or infra */
83         gboolean confirmed;
84         gchar additional_info[SESSION_STATUS_ADDITIONAL_INFO_LEN];
85 } asp_session_s;
86
87 typedef struct session_request_cb {
88         asp_session_session_request_cb cb;
89         gpointer user_data;
90 } session_request_cb_s;
91
92 typedef struct session_config_request_cb {
93         asp_session_session_config_request_cb cb;
94         gpointer user_data;
95 } session_config_request_cb_s;
96
97 typedef struct connect_status_cb {
98         asp_session_connect_status_cb cb;
99         gpointer user_data;
100 } connect_status_cb_s;
101
102 typedef struct port_status_cb {
103         asp_session_port_status_cb cb;
104         gpointer user_data;
105 } port_status_cb_s;
106
107 typedef struct session_status_cb {
108         asp_session_session_status_cb cb;
109         gpointer user_data;
110 } session_status_cb_s;
111
112 typedef struct asp_session_cb_v_table {
113         session_request_cb_s session_request;
114         session_config_request_cb_s session_config_request;
115         connect_status_cb_s connect_status;
116         port_status_cb_s port_status;
117         session_status_cb_s session_status;
118 } asp_session_cb_v_table_s;
119
120 typedef struct asp_session_key {
121         guint32 session_id;
122         guint8 session_mac[MAC_ADDRESS_LEN];
123 } asp_session_key_s;
124
125 typedef struct connect_session_param {
126         guint8 service_mac[MAC_ADDRESS_LEN];    /* the MAC address of the P2P device that generated the session ID */
127         guint8 session_info[ASP_SESSION_INFO_BYTE_MAX];
128         size_t info_length;
129         guint8 network_role;
130         guint8 network_config;
131 } connect_session_param_s;
132
133 typedef struct defer_session_param {
134         guint8 deferred_response[ASP_DEFER_RESPONSE_BYTE_MAX];
135         size_t length;
136 } defer_session_param_s;
137
138 typedef struct confirm_session_param {
139         gboolean confirmed;
140         guint32 pin;
141 } confirm_session_param_s;
142
143 typedef struct bound_port_param {
144         gchar local_ip[ASP_SESSION_IPV4_STR_LEN];
145         guint16 local_port;
146         guint8 proto;
147 } bound_port_param_s;
148
149 typedef struct session_request_param {
150         int error_code;
151         guint32 advertisement_id;
152         gchar device_name[ASP_MAX_DEVICE_NAME_LEN + 1];
153         size_t name_length;
154         guint8 session_info[ASP_SESSION_INFO_BYTE_MAX];
155         size_t info_length;
156         gboolean get_pin;
157         guint32 pin;
158 } session_request_param_s;
159
160 typedef struct connect_status_param {
161         asp_session_connect_status_e status;
162         char deferred_resp[ASP_DEFER_RESPONSE_BYTE_MAX];
163         size_t length;
164 } connect_status_param_s;
165
166 typedef struct session_config_request_param {
167         gboolean get_network_config_pin;
168         guint32 network_config_pin;
169 } session_config_request_param_s;
170
171 typedef struct ip_assigned_param {
172         char peer_ip_addr[ASP_SESSION_IPV4_STR_LEN];
173         size_t length;
174 } ip_assigned_param_s;
175
176 enum {
177         SESSION_STATE_NONE,
178         SESSION_STATE_CLOSED,
179         SESSION_STATE_RUNNING,
180         SESSION_STATE_L2CONNECTING,
181         SESSION_STATE_SESSION_REQUEST_SENT,
182         SESSION_STATE_SESSION_REQUEST_RECEIVED,
183         SESSION_STATE_SESSION_REQUEST_DEFERED,
184         SESSION_STATE_SESSION_REQUEST_ACCEPTED,
185         SESSION_STATE_ENTERING_PIN,
186         SESSION_STATE_GROUP_FORMATION_COMPLETED,
187         SESSION_STATE_L2CONNECTED,
188         SESSION_STATE_REQUEST_SESSION_SENT,
189         SESSION_STATE_OPEN,
190         SESSION_STATE_REQUEST_SESSION_RECEIVED,
191         SESSION_STATE_REJECT_SESSION_SENT,
192         SESSION_STATE_REMOVE_SESSION_SENT,
193         SESSION_STATE_MAX
194 } asp_session_state_e;
195
196 enum {
197         SESSION_EVENT_BOUND_PORT_CALLED,
198         SESSION_EVENT_CLOSE_SESSION_CALLED,
199         SESSION_EVENT_CONNECT_SESSION_CALLED,
200         SESSION_EVENT_CONFIRM_SESSION_CALLED,
201         SESSION_EVENT_DEFER_SESSION_CALLED,
202         SESSION_EVENT_SET_SESSION_READY_CALLED,
203
204         SESSION_EVENT_SESSION_REQUEST_CALLED,
205         SESSION_EVENT_SESSION_CONFIG_REQUEST_CALLED,
206         SESSION_EVENT_CONNECT_STATUS_CALLED,
207         SESSION_EVENT_IP_ASSIGNED,
208
209         SESSION_EVENT_REMOVE_SESSION_RECEIVED,
210         SESSION_EVENT_ALLOWED_PORT_RECEIVED,
211         SESSION_EVENT_DEFERRED_SESSION_RECEIVED,
212         SESSION_EVENT_REJECTED_SESSION_RECEIVED,
213         SESSION_EVENT_ADDED_SESSION_RECEIVED,
214         SESSION_EVENT_REQUEST_SESSION_RECEIVED,
215         SESSION_EVENT_ACK_RECEIVED,
216         SESSION_EVENT_NACK_RECEIVED,
217
218         SESSION_EVENT_PEER_DESTROYED,
219         SESSION_EVENT_TIMEOUT,
220         SESSION_EVENT_DELETE_SESSION,
221
222         SESSION_EVENT_MAX
223 } asp_session_event_e;
224
225 /*****************************************************************************
226  * Global Variables
227  *****************************************************************************/
228 static GTree *sessionTree =
229         NULL;   /* [key] - [asp_session_key_s*], [value] - [asp_session_s*] */
230 static asp_session_cb_v_table_s session_cb_v_table;
231 static char g_my_p2p_mac[MAC_ADDRESS_LEN];
232
233 static guint16 g_asp_cordination_port = 7235;
234
235 static gfsm_s *session_fsm;
236 static gfsm_state_s *session_state_none;
237 static gfsm_state_s *session_state_closed;
238 static gfsm_state_s *session_state_running;
239 static gfsm_state_s *session_state_l2connecting;
240 static gfsm_state_s *session_state_session_request_sent;
241 static gfsm_state_s *session_state_session_request_defered;
242 static gfsm_state_s *session_state_entering_pin;
243 static gfsm_state_s *session_state_session_request_received;
244 static gfsm_state_s *session_state_session_request_accepted;
245 static gfsm_state_s *session_state_group_formation_completed;
246 static gfsm_state_s *session_state_l2connected;
247 static gfsm_state_s *session_state_request_session_sent;
248 static gfsm_state_s *session_state_open;
249 static gfsm_state_s *session_state_request_session_received;
250 static gfsm_state_s *session_state_reject_session_sent;
251 static gfsm_state_s *session_state_remove_session_sent;
252
253 /*****************************************************************************
254  * Local Functions Declaration
255  *****************************************************************************/
256
257 /* send coordination protocol message */
258 static gboolean _send_request_session(asp_session_s *session,
259                                       guint8 *session_info, size_t session_info_len);
260 static gboolean _send_added_session(asp_session_s *session);
261 static gboolean _send_reject_session(asp_session_s *session);
262 static gboolean _send_remove_session(asp_session_s *session,
263                                      guint8 remove_reason);
264 static gboolean _send_allowed_port(asp_session_s *session, guint16 port,
265                                    guint8 protocol);
266 static gboolean _send_deferred_session(asp_session_s *session,
267                                        guint8 *deferred_response, size_t length);
268 static gboolean _send_nack(GSocketAddress *sock_addr, guint8 seq_num,
269                            guint8 reason);
270 static gboolean _send_ack(GSocketAddress *sock_addr, guint8 seq_num);
271
272 /* local functions */
273 static gint _session_tree_compare_func(gconstpointer a, gconstpointer b);
274 static void _session_tree_value_destoryed(gpointer data);
275 static void _session_tree_key_destoryed(gpointer data);
276 static void _insert_session(asp_session_s *session);
277 static void _remove_session(guint8 *session_mac, guint32 session_id);
278 static void _get_ip_from_socketaddress(GSocketAddress *sock_addr,
279                                        gchar *peer_ip);
280 static guint32 _alloc_session_id();
281 static asp_session_s *_get_exist_session(guint32 session_id,
282                 const guint8 *session_mac);
283 static asp_session_s *_new_session_by_request_session(GSocketAddress *sock_addr,
284                 const gchar *peer_ip, gpointer p_msg);
285 static asp_session_s *_new_session_over_infra(guint8 *session_mac,
286                 guint32 session_id, asp_role_e asp_role, guint32 advertisement_id,
287                 GSocketAddress *sock_addr, const gchar *peer_ip);
288 static asp_session_s *_new_session_over_p2p(const guint8 *session_mac,
289                 guint32 session_id, asp_role_e asp_role, const guint8 *service_mac,
290                 guint32 advertisement_id);
291 static asp_session_s *_new_session_from_session_request(
292         const guint8 *session_mac, guint32 session_id, guint32 advertisement_id);
293 static void _asp_session_destroy_session(void *p_context_data);
294 static asp_session_status_e _get_session_state(guint8 *session_mac,
295                 guint32 session_id);
296 static asp_session_key_s *_get_session_key(guint32 session_id,
297                 const guint8 *session_mac);
298 static void _store_peer_ip_addr(asp_session_s *session, char *peer_ip,
299                                 size_t length);
300 #ifdef HAVE_ASP_P2P_CONN
301 static guint8 *_get_peer_mac(asp_session_s *session);
302 #endif
303
304 static gpointer _asp_session_dup_reqeust_session(gpointer p_msg);
305 /*
306 static gpointer _asp_session_dup_added_session(gpointer p_msg);
307 static gpointer _asp_session_dup_rejected_session(gpointer p_msg);
308 static gpointer _asp_session_dup_remove_session(gpointer p_msg);
309 static gpointer _asp_session_dup_deferred_session(gpointer p_msg);
310 */
311 static gpointer _asp_session_dup_allowed_session(gpointer p_msg);
312 static void _call_session_request_cb(gint32 error_code, guint8 *session_mac,
313                                      guint32 session_id, guint32 advertisement_id, gchar *device_name,
314                                      size_t name_length, guint8 *session_info, size_t info_length, gboolean get_pin,
315                                      guint32 pin);      /*if pin is zero, it does not need to be displayed. */
316 static void _call_session_config_request_cb(gint32 error_code,
317                 guint8 *session_mac, guint32 session_id, gboolean get_pin, guint32 pin);
318 static void _call_session_status_cb(gint32 error_code, guint8 *session_mac,
319                                     guint32 session_id, asp_session_closed_state_e closed_state);
320 static void _call_connect_status_cb(gint32 error_code, guint8 *session_mac,
321                                     guint32 session_id, asp_session_connect_status_e status);
322 static void _call_port_status_cb(gint32 error_code, const guint8 *session_mac,
323                                  guint32 session_id, const gchar *peer_ip, guint16 port, guint8 protocol,
324                                  asp_session_port_status_e status);
325
326 /*callback functions for asp_p2p_conn */
327 void _p2p_conn_session_request_cb(gint32 error_code, const guint8 *session_mac,
328                                   guint32 session_id, guint32 advertisement_id, const gchar *device_name,
329                                   size_t name_length, const guint8 *session_info, size_t info_length,
330                                   gboolean get_pin, guint32 pin, gpointer user_data);
331 void _p2p_conn_session_config_request_cb(gint32 error_code,
332                 const guint8 *session_mac, guint32 session_id, gboolean get_pin, guint32 pin,
333                 gpointer user_data);
334 void _p2p_conn_connect_status_cb(gint32 error_code, const guint8 *session_mac,
335                                  guint32 session_id, asp_session_connect_status_e status, gpointer user_data);
336 void _p2p_conn_ip_assigned_cb(gint32 error_code, const guint8 *session_mac,
337                               guint32 session_id, const guint8 *service_mac, gchar *peer_ip_addr, gint32 ip_length,
338                               gpointer user_data);
339
340 /* state machine using gfsm */
341 static void _asp_session_fsm_init();
342 static void _asp_session_fsm_terminate();
343 static void _state_none_entry_action(void *p_context_data);
344 static void _state_none_exit_action(void *p_context_data);
345 static gfsm_state_id_t _state_none_reaction_connect_session_called(
346         void *p_context_data, void *p_event_data);
347 static gfsm_state_id_t _state_none_reaction_request_session_received(
348         void *p_context_data, void *p_event_data);
349 static gfsm_state_id_t _state_none_reaction_session_request_received(
350         void *p_context_data, void *p_event_data);
351 static void _state_closed_entry_action(void *p_context_data);
352 static void _state_closed_exit_action(void *p_context_data);
353 static gfsm_state_id_t _state_closed_reaction_delete_session(
354         void *p_context_data, void *p_event_data);
355 /*static gfsm_state_id_t _state_closed_reaction_connect_session_called (void* p_context_data, void* p_event_data); */
356 /*static gfsm_state_id_t _state_closed_reaction_request_session_received(void* p_context_data, void* p_event_data); */
357 static void _state_running_entry_action(void *p_context_data);
358 static void _state_running_exit_action(void *p_context_data);
359
360 static void _state_l2connecting_entry_action(void *p_context_data);
361 static void _state_l2connecting_exit_action(void *p_context_data);
362 static gfsm_state_id_t _state_l2connecting_reaction_close_session_called(
363         void *p_context_data, void *p_event_data);
364 static gfsm_state_id_t _state_l2connecting_reaction_timeout(
365         void *p_context_data, void *p_event_data);
366
367 static void _state_session_request_sent_entry_action(void *p_context_data);
368 static void _state_session_request_sent_exit_action(void *p_context_data);
369 static gfsm_state_id_t
370 _state_session_request_sent_reaction_connect_status_called(void *p_context_data,
371                 void *p_event_data);
372 static gfsm_state_id_t
373 _state_session_request_sent_reaction_session_config_request_called(
374         void *p_context_data, void *p_event_data);
375
376 static void _state_session_request_defered_entry_action(void *p_context_data);
377 static void _state_session_request_defered_exit_action(void *p_context_data);
378 static gfsm_state_id_t
379 _state_session_request_defered_reaction_connect_status_called(
380         void *p_context_data, void *p_event_data);
381 static gfsm_state_id_t
382 _state_session_request_defered_reaction_session_config_request_called(
383         void *p_context_data, void *p_event_data);
384
385 static void _state_session_request_received_entry_action(void *p_context_data);
386 static void _state_session_request_received_exit_action(void *p_context_data);
387 static gfsm_state_id_t
388 _state_session_request_received_reaction_confirm_session_called(
389         void *p_context_data, void *p_event_data);
390
391 static void _state_session_request_accepted_entry_action(void *p_context_data);
392 static void _state_session_request_accepted_exit_action(void *p_context_data);
393 static gfsm_state_id_t
394 _state_session_request_accepted_reaction_connect_status_received(
395         void *p_context_data, void *p_event_data);
396 static gfsm_state_id_t
397 _state_session_request_accepted_reaction_session_config_request_called(
398         void *p_context_data, void *p_event_data);
399 static gfsm_state_id_t
400 _state_session_request_accepted_reaction_set_session_ready_called(
401         void *p_context_data, void *p_event_data);
402
403 static void _state_entering_pin_entry_action(void *p_context_data);
404 static void _state_entering_pin_exit_action(void *p_context_data);
405 static gfsm_state_id_t _state_entering_pin_reaction_confirm_session_called(
406         void *p_context_data, void *p_event_data);
407
408 static void _state_group_formation_completed_entry_action(void *p_context_data);
409 static void _state_group_formation_completed_exit_action(void *p_context_data);
410 static gfsm_state_id_t _state_group_formation_completed_reaction_ip_assigned(
411         void *p_context_data, void *p_event_data);
412 static gfsm_state_id_t
413 _state_group_formation_completed_reaction_request_session_received(
414         void *p_context_data, void *p_event_data);
415 static gfsm_state_id_t
416 _state_group_formation_completed_reaction_set_session_ready_called(
417         void *p_context_data, void *p_event_data);
418
419 static void _state_l2connected_entry_action(void *p_context_data);
420 static void _state_l2connected_exit_action(void *p_context_data);
421 static gfsm_state_id_t _state_l2connected_reaction_close_session_called(
422         void *p_context_data, void *p_event_data);
423 static gfsm_state_id_t _state_l2connected_reaction_remove_session_received(
424         void *p_context_data, void *p_event_data);
425 static gfsm_state_id_t _state_l2connected_reaction_peer_destroyed(
426         void *p_context_data, void *p_event_data);
427
428 static void _state_request_session_sent_entry_action(void *p_context_data);
429 static void _state_request_session_sent_exit_action(void *p_context_data);
430 static gfsm_state_id_t
431 _state_request_session_sent_reaction_added_session_received(
432         void *p_context_data, void *p_event_data);
433 static gfsm_state_id_t
434 _state_request_session_sent_reaction_deferred_session_received(
435         void *p_context_data, void *p_event_data);
436 static gfsm_state_id_t
437 _state_request_session_sent_reaction_rejected_session_received(
438         void *p_context_data, void *p_event_data);
439 static gfsm_state_id_t _state_request_session_sent_reaction_timeout(
440         void *p_context_data, void *p_event_data);
441 static void _state_request_session_received_entry_action(void *p_context_data);
442 static void _state_request_session_received_exit_action(void *p_context_data);
443 static gfsm_state_id_t
444 _state_request_session_received_reaction_set_session_ready_called(
445         void *p_context_data, void *p_event_data);
446 static gfsm_state_id_t
447 _state_request_session_received_reaction_defer_session_called(
448         void *p_context_data, void *p_event_data);
449 static gfsm_state_id_t
450 _state_request_session_received_reaction_confirm_session_called(
451         void *p_context_data, void *p_event_data);
452 static void _state_open_entry_action(void *p_context_data);
453 static void _state_open_exit_action(void *p_context_data);
454 static gfsm_state_id_t _state_open_reaction_bound_port_called(
455         void *p_context_data, void *p_event_data);
456 static gfsm_state_id_t _state_open_reaction_allowed_port_received(
457         void *p_context_data, void *p_event_data);
458 static void _state_reject_session_sent_entry_action(void *p_context_data);
459 static void _state_reject_session_sent_exit_action(void *p_context_data);
460 static gfsm_state_id_t _state_reject_session_sent_reaction_ack_received(
461         void *p_context_data, void *p_event_data);
462 static gfsm_state_id_t _state_reject_session_sent_reaction_nack_received(
463         void *p_context_data, void *p_event_data);
464 static void _state_remove_session_sent_entry_action(void *p_context_data);
465 static void _state_remove_session_sent_exit_action(void *p_context_data);
466 static gfsm_state_id_t _state_remove_session_sent_reaction_ack_received(
467         void *p_context_data, void *p_event_data);
468 static gfsm_state_id_t _state_remove_session_sent_reaction_nack_received(
469         void *p_context_data, void *p_event_data);
470 static gfsm_state_id_t _state_remove_session_sent_reaction_peer_destroyed(
471         void *p_context_data, void *p_event_data);
472
473 /*****************************************************************************
474  * API Definition
475  *****************************************************************************/
476
477 gboolean asp_session_initialize()
478 {
479         INFO_MSG;
480
481 #ifdef HAVE_ASP_P2P_CONN
482         asp_p2p_conn_get_p2p_mac(g_my_p2p_mac);
483 #endif
484
485         asp_sess_peer_init();
486
487         sessionTree = g_tree_new_full((GCompareDataFunc) _session_tree_compare_func,
488                                       NULL, (GDestroyNotify) _session_tree_key_destoryed,
489                                       (GDestroyNotify) _session_tree_value_destoryed);
490
491         g_assert(sessionTree);
492
493         _asp_session_fsm_init();
494
495         session_cb_v_table.connect_status.cb = NULL;
496         session_cb_v_table.connect_status.user_data = NULL;
497         session_cb_v_table.port_status.cb = NULL;
498         session_cb_v_table.port_status.user_data = NULL;
499         session_cb_v_table.session_request.cb = NULL;
500         session_cb_v_table.session_request.user_data = NULL;
501         session_cb_v_table.session_config_request.cb = NULL;
502         session_cb_v_table.session_config_request.user_data = NULL;
503         session_cb_v_table.session_status.cb = NULL;
504         session_cb_v_table.session_status.user_data = NULL;
505
506 #ifdef HAVE_ASP_P2P_CONN
507         asp_p2p_conn_initialize();      /* it needs to be provided by p2p_conn , hjjee */
508         asp_p2p_conn_set_session_request_cb(_p2p_conn_session_request_cb, NULL);
509         asp_p2p_conn_set_session_config_request_cb(_p2p_conn_session_config_request_cb,
510                         NULL);
511         asp_p2p_conn_set_connect_status_cb(_p2p_conn_connect_status_cb, NULL);
512         asp_p2p_conn_set_ip_assigned_cb(_p2p_conn_ip_assigned_cb, NULL);
513 #endif
514
515         return TRUE;
516 }
517
518 gboolean asp_session_deinitialize()
519 {
520         INFO_MSG;
521
522         asp_sess_peer_destroy();
523
524         g_tree_destroy(sessionTree);
525         sessionTree = NULL;
526
527         session_cb_v_table.connect_status.cb = NULL;
528         session_cb_v_table.connect_status.user_data = NULL;
529         session_cb_v_table.port_status.cb = NULL;
530         session_cb_v_table.port_status.user_data = NULL;
531         session_cb_v_table.session_request.cb = NULL;
532         session_cb_v_table.session_request.user_data = NULL;
533         session_cb_v_table.session_config_request.cb = NULL;
534         session_cb_v_table.session_config_request.user_data = NULL;
535         session_cb_v_table.session_status.cb = NULL;
536         session_cb_v_table.session_status.user_data = NULL;
537
538         _asp_session_fsm_terminate();
539
540 #ifdef HAVE_ASP_P2P_CONN
541         asp_p2p_conn_deinitialize();
542 #endif
543
544         return TRUE;
545 }
546
547 gboolean asp_session_connect_session_over_p2p(const guint8 *service_mac,
548                 guint32 advertisement_id, const guint8 *session_info, size_t info_length,
549                 guint8 network_role, guint8 network_config, guint8 *session_mac,
550                 guint32 *p_session_id)
551 {
552         INFO_MSG;
553
554         memcpy(session_mac, g_my_p2p_mac, MAC_ADDRESS_LEN);
555
556         do {
557                 *p_session_id = _alloc_session_id();
558         } while (_get_exist_session(*p_session_id, session_mac) != NULL);
559
560         asp_session_s *session = _new_session_over_p2p(session_mac, *p_session_id,
561                                  ASP_ROLE_SEEKER, service_mac,
562                                  advertisement_id);     /*this function is not implemented yet, hjjee */
563         g_assert(session);
564
565         connect_session_param_s *p_connect_session = (connect_session_param_s *)
566                         g_malloc(sizeof(connect_session_param_s));
567
568         memcpy(p_connect_session->service_mac, service_mac, MAC_ADDRESS_LEN);
569         if (session_info) {
570                 p_connect_session->info_length = MIN(ASP_SESSION_INFO_BYTE_MAX, info_length);
571                 memcpy(p_connect_session->session_info, session_info,
572                        p_connect_session->info_length);
573         } else
574                 p_connect_session->info_length = 0;
575         p_connect_session->network_role = network_role;
576         p_connect_session->network_config = network_config;
577
578         gfsm_process_event(&(session->context),
579                            gfsm_create_event(SESSION_EVENT_CONNECT_SESSION_CALLED, p_connect_session,
580                                              g_free));
581
582         return TRUE;
583 }
584
585 gboolean asp_session_connect_session_over_infra(const gchar *peer_ip,
586                 guint32 advertisement_id, guint8 *session_info, size_t info_length,
587                 guint8 *session_mac, guint32 *p_session_id)
588 {
589         INFO_MSG;
590
591         memcpy(session_mac, g_my_p2p_mac, MAC_ADDRESS_LEN);
592
593         do {
594                 *p_session_id = _alloc_session_id();
595         } while (_get_exist_session(*p_session_id, session_mac) != NULL);
596
597         asp_session_s *session = _new_session_over_infra(session_mac, *p_session_id,
598                                  ASP_ROLE_SEEKER, advertisement_id, NULL,
599                                  peer_ip);      /*this function needs to be modified because there is new element in session structure., hjjee */
600         g_assert(session);
601
602         connect_session_param_s *p_connect_session = (connect_session_param_s *)
603                         g_malloc(sizeof(connect_session_param_s));
604
605         memset(p_connect_session->service_mac, 0, MAC_ADDRESS_LEN);
606         if (session_info) {
607                 p_connect_session->info_length = MIN(ASP_SESSION_INFO_BYTE_MAX, info_length);
608                 memcpy(p_connect_session->session_info, session_info,
609                        p_connect_session->info_length);
610         } else
611                 p_connect_session->info_length = 0;
612         p_connect_session->network_role = 0;
613         p_connect_session->network_config = 0;
614
615         gfsm_process_event(&(session->context),
616                            gfsm_create_event(SESSION_EVENT_CONNECT_SESSION_CALLED, p_connect_session,
617                                              g_free));
618
619         return TRUE;
620 }
621
622 gboolean asp_session_defer_session(guint8 *session_mac, guint32 session_id,
623                                    guint8 *deferred_response, size_t length)
624 {
625         INFO_MSG;
626
627         asp_session_s *session = _get_exist_session(session_id, session_mac);
628         defer_session_param_s *defer_session_param = (defer_session_param_s *)g_malloc(
629                                 sizeof(defer_session_param_s));
630
631         g_assert(session);
632
633         defer_session_param->length = length;
634         memcpy(defer_session_param->deferred_response, deferred_response, MIN(length,
635                         ASP_DEFER_RESPONSE_BYTE_MAX));
636
637         gfsm_process_event(&(session->context),
638                            gfsm_create_event(SESSION_EVENT_DEFER_SESSION_CALLED, defer_session_param,
639                                              g_free));
640
641         return TRUE;
642 }
643
644 gboolean asp_session_confirm_session(const guint8 *session_mac,
645                                      guint32 session_id, gboolean confirmed, guint32 pin)
646 {
647         INFO_MSG;
648
649         asp_session_s *session = _get_exist_session(session_id, session_mac);
650         g_assert(session);
651
652         confirm_session_param_s *confirmed_param = (confirm_session_param_s *)g_malloc(
653                                 sizeof(confirm_session_param_s));
654         confirmed_param->confirmed = confirmed;
655         confirmed_param->pin = pin;
656         session->confirmed = confirmed;
657
658         gfsm_process_event(&(session->context),
659                            gfsm_create_event(SESSION_EVENT_CONFIRM_SESSION_CALLED, confirmed_param,
660                                              g_free));
661
662         return TRUE;
663 }
664
665 gboolean asp_session_set_session_ready(const guint8 *session_mac,
666                                        guint32 session_id)
667 {
668         INFO_MSG;
669
670         asp_session_s *session = _get_exist_session(session_id, session_mac);
671         g_assert(session);
672
673         gfsm_process_event(&(session->context),
674                            gfsm_create_event(SESSION_EVENT_SET_SESSION_READY_CALLED, NULL, NULL));
675
676         return TRUE;
677 }
678
679 gboolean asp_session_close_session(guint8 *session_mac, guint32 session_id,
680                                    asp_remove_session_reason_e reason)
681 {
682         INFO_MSG;
683
684         asp_session_s *session = _get_exist_session(session_id, session_mac);
685         g_assert(session);
686
687         guint8 *close_reason = (guint8 *) g_malloc(sizeof(guint8));
688         *close_reason = (guint8) reason;
689
690         gfsm_process_event(&(session->context),
691                            gfsm_create_event(SESSION_EVENT_CLOSE_SESSION_CALLED, close_reason, g_free));
692
693         return TRUE;
694 }
695
696 gboolean asp_session_bound_port(guint8 *session_mac, guint32 session_id,
697                                 const gchar *local_ip, guint16 local_port, guint8 protocol)
698 {
699         INFO_MSG;
700
701         asp_session_s *session = _get_exist_session(session_id, session_mac);
702         g_assert(session);
703
704         bound_port_param_s *bound_port_param = (bound_port_param_s *)g_malloc(sizeof(
705                         bound_port_param_s));
706         g_strlcpy(bound_port_param->local_ip, local_ip, ASP_SESSION_IPV4_STR_LEN);
707         bound_port_param->local_port = local_port;
708         bound_port_param->proto = protocol;
709
710         gfsm_process_event(&(session->context),
711                            gfsm_create_event(SESSION_EVENT_BOUND_PORT_CALLED, bound_port_param, g_free));
712
713         return TRUE;
714 }
715
716 void _p2p_conn_session_request_cb(gint32 error_code, const guint8 *session_mac,
717                                   guint32 session_id, guint32 advertisement_id, const gchar *device_name,
718                                   size_t name_length, const guint8 *session_info, size_t info_length,
719                                   gboolean get_pin, guint32 pin, gpointer user_data)
720 {
721         asp_session_s *session = _get_exist_session(session_id, session_mac);
722
723         if (session) {
724                 /* Discard or delete previous session??? */
725                 return;
726         } else {
727                 session = _new_session_from_session_request(session_mac, session_id,
728                                 advertisement_id);
729                 g_assert(session);
730
731                 session_request_param_s *p_param = (session_request_param_s *)g_malloc(sizeof(
732                                 session_request_param_s));
733
734                 p_param->name_length = MIN(ASP_MAX_DEVICE_NAME_LEN, name_length);
735                 memcpy(p_param->device_name, device_name, p_param->name_length);
736                 p_param->device_name[p_param->name_length] = 0;
737                 if (session_info) {
738                         p_param->info_length = MIN(ASP_SESSION_INFO_BYTE_MAX, info_length);
739                         memcpy(p_param->session_info, session_info, p_param->info_length);
740                 } else
741                         p_param->info_length = 0;
742                 p_param->get_pin = get_pin;
743                 p_param->pin = pin;
744
745                 gfsm_process_event(&(session->context),
746                                    gfsm_create_event(SESSION_EVENT_SESSION_REQUEST_CALLED, p_param, g_free));
747         }
748 }
749
750 void _p2p_conn_session_config_request_cb(gint32 error_code,
751                 const guint8 *session_mac, guint32 session_id, gboolean get_pin, guint32 pin,
752                 gpointer user_data)
753 {
754         asp_session_s *session = _get_exist_session(session_id, session_mac);
755
756         if (session) {
757                 session_config_request_param_s *p_param = (session_config_request_param_s *)
758                                 g_malloc(sizeof(session_config_request_param_s));
759                 p_param->get_network_config_pin = get_pin;
760                 p_param->network_config_pin = pin;
761
762                 gfsm_process_event(&(session->context),
763                                    gfsm_create_event(SESSION_EVENT_SESSION_CONFIG_REQUEST_CALLED, p_param,
764                                                      g_free));
765         }
766 }
767
768 void _p2p_conn_connect_status_cb(gint32 error_code, const guint8 *session_mac,
769                                  guint32 session_id, asp_session_connect_status_e status, gpointer user_data)
770 {
771         asp_session_s *session = _get_exist_session(session_id, session_mac);
772
773         if (session) {
774                 connect_status_param_s *p_param = (connect_status_param_s *)g_malloc(sizeof(
775                                 connect_status_param_s));
776                 p_param->status = status;
777                 p_param->length = 0;
778
779                 gfsm_process_event(&(session->context),
780                                    gfsm_create_event(SESSION_EVENT_CONNECT_STATUS_CALLED, p_param, g_free));
781         }
782 }
783
784 void _p2p_conn_ip_assigned_cb(gint32 error_code, const guint8 *session_mac,
785                               guint32 session_id, const guint8 *service_mac, gchar *peer_ip_addr, gint32 ip_length,
786                               gpointer user_data)
787 {
788         INFO_MSG;
789
790         asp_session_s *session = _get_exist_session(session_id, session_mac);
791
792         if (session) {
793                 ip_assigned_param_s *p_param = (ip_assigned_param_s *)g_malloc(sizeof(
794                                                        ip_assigned_param_s));
795                 g_strlcpy(p_param->peer_ip_addr, peer_ip_addr, ASP_SESSION_IPV4_STR_LEN);
796                 p_param->length = ip_length;
797
798                 ASP_LOGD("%s %zu", p_param->peer_ip_addr, p_param->length);
799                 gfsm_process_event(&(session->context),
800                                    gfsm_create_event(SESSION_EVENT_IP_ASSIGNED, p_param, g_free));
801         }
802 }
803
804 gboolean asp_session_set_session_request_cb(asp_session_session_request_cb cb,
805                 gpointer user_data)
806 {
807         INFO_MSG;
808
809         session_cb_v_table.session_request.cb = cb;
810         session_cb_v_table.session_request.user_data = user_data;
811         return TRUE;
812 }
813
814 gboolean asp_session_set_session_config_request_cb(
815         asp_session_session_config_request_cb cb, gpointer user_data)
816 {
817         INFO_MSG;
818
819         session_cb_v_table.session_config_request.cb = cb;
820         session_cb_v_table.session_config_request.user_data = user_data;
821         return TRUE;
822 }
823
824 gboolean asp_session_set_connect_status_cb(asp_session_connect_status_cb cb,
825                 gpointer user_data)
826 {
827         INFO_MSG;
828
829         session_cb_v_table.connect_status.cb = cb;
830         session_cb_v_table.connect_status.user_data = user_data;
831         return TRUE;
832 }
833
834 gboolean asp_session_set_session_status_cb(asp_session_session_status_cb cb,
835                 gpointer user_data)
836 {
837         INFO_MSG;
838
839         session_cb_v_table.session_status.cb = cb;
840         session_cb_v_table.session_status.user_data = user_data;
841         return TRUE;
842 }
843
844 gboolean asp_session_set_port_status_cb(asp_session_port_status_cb cb,
845                                         gpointer user_data)
846 {
847         INFO_MSG;
848
849         session_cb_v_table.port_status.cb = cb;
850         session_cb_v_table.port_status.user_data = user_data;
851         return TRUE;
852 }
853
854 gboolean asp_session_get_advertisement_mac(const guint8 *session_mac,
855                 guint32 session_id, guint8 **adv_mac)
856 {
857         INFO_MSG;
858
859         asp_session_s *session = _get_exist_session(session_id, session_mac);
860         g_assert(session);
861
862         *adv_mac = session->service_mac;
863
864         return TRUE;
865 }
866
867 gboolean asp_session_get_advertisement_id(const guint8 *session_mac,
868                 guint32 session_id, guint32 *advertisement_id)
869 {
870         INFO_MSG;
871
872         asp_session_s *session = _get_exist_session(session_id, session_mac);
873         g_assert(session);
874
875         *advertisement_id = session->advertisement_id;
876
877         return TRUE;
878 }
879
880 gboolean asp_session_get_state(guint8 *session_mac, guint32 session_id,
881                                asp_session_status_e *state)
882 {
883         INFO_MSG;
884
885         *state = _get_session_state(session_mac, session_id);
886
887         return TRUE;
888 }
889
890 gboolean asp_session_get_peer_endpoint(guint8 *session_mac, guint32 session_id,
891                                        gchar *peer_ip, guint16 *port)
892 {
893         INFO_MSG;
894
895         asp_session_s *session = _get_exist_session(session_id, session_mac);
896         g_assert(session);
897
898         g_strlcpy(peer_ip, session->peer_ip, ASP_SESSION_IPV4_STR_LEN);
899
900         *port = g_asp_cordination_port;
901
902         return TRUE;
903 }
904
905 void asp_session_recv_req(GSocketAddress *sock_addr, gpointer p_msg)
906 {
907         INFO_MSG;
908
909         asp_request_header_s *p_header = (asp_request_header_s *)p_msg;
910
911         ASP_LOGD("%s asp_session_recv_req(), opcode:%d", ROLE, p_header->opcode);
912
913         asp_session_s *session = _get_exist_session(p_header->session_id,
914                                  p_header->session_mac);
915
916         if (!session &&
917             ASP_OPCODE_REQUEST_SESSION != p_header->opcode) {
918                 /* over infra */
919                 /* NACK shall be sent */
920                 _send_nack(sock_addr, p_header->seq_num, ASP_NACK_REASON_NO_SESSION_EXIST);
921                 return;
922         }
923
924         if (session && session->over_p2p && session->sock_addr == NULL) {
925                 ASP_LOGD("IpAssigned signal isn't yet received, discard event");
926                 return;
927         }
928
929         switch (p_header->opcode) {
930         case ASP_OPCODE_REQUEST_SESSION: {
931                         gchar peer_ip[ASP_SESSION_IPV4_STR_LEN];
932                         _get_ip_from_socketaddress(sock_addr, peer_ip);
933
934                         /* how to handle a case of that a same session is exist in Tree */
935                         if (session == NULL)
936                                 session = _new_session_by_request_session(sock_addr, peer_ip, p_msg);
937
938                         g_strlcpy(session->additional_info, SESSION_STATUS_ADDITIONAL_INFO_PD,
939                                         SESSION_STATUS_ADDITIONAL_INFO_LEN);
940                         g_assert(session);
941
942                         _send_ack(sock_addr, p_header->seq_num);
943
944                         gfsm_process_event(&(session->context),
945                                            gfsm_create_event(SESSION_EVENT_REQUEST_SESSION_RECEIVED,
946                                                              _asp_session_dup_reqeust_session(p_msg), g_free));
947                 }
948                 break;
949         case ASP_OPCODE_ADDED_SESSION:
950                 _send_ack(sock_addr, p_header->seq_num);
951                 gfsm_process_event(&(session->context),
952                                    gfsm_create_event(SESSION_EVENT_ADDED_SESSION_RECEIVED, NULL, NULL));
953                 break;
954         case ASP_OPCODE_REJECTED_SESSION:
955                 _send_ack(sock_addr, p_header->seq_num);
956                 gfsm_process_event(&(session->context),
957                                    gfsm_create_event(SESSION_EVENT_REJECTED_SESSION_RECEIVED, NULL, NULL));
958                 break;
959         case ASP_OPCODE_REMOVE_SESSION:
960                 _send_ack(sock_addr, p_header->seq_num);
961                 gfsm_process_event(&(session->context),
962                                    gfsm_create_event(SESSION_EVENT_REMOVE_SESSION_RECEIVED,
963                                                      &((asp_remove_session_s *)p_msg)->reason, NULL));
964                 break;
965         case ASP_OPCODE_ALLOWED_PORT:
966                 _send_ack(sock_addr, p_header->seq_num);
967                 gfsm_process_event(&(session->context),
968                                    gfsm_create_event(SESSION_EVENT_ALLOWED_PORT_RECEIVED,
969                                                      _asp_session_dup_allowed_session(p_msg), g_free));
970                 break;
971         case ASP_OPCODE_DEFERRED_SESSION:
972                 _send_ack(sock_addr, p_header->seq_num);
973                 gfsm_process_event(&(session->context),
974                                    gfsm_create_event(SESSION_EVENT_DEFERRED_SESSION_RECEIVED, NULL, NULL));
975                 break;
976
977         case ASP_OPCODE_ACK:
978         case ASP_OPCODE_NACK:
979         case ASP_OPCODE_VERSION:
980                 /* VERSION message is handled by asp-sess-peer */
981                 /* ANK & NACK is handled by asp_session_recv_ack() & asp_session_recv_nack() in asp-session */
982                 break;
983         default:
984                 /* error case */
985                 break;
986         }
987 }
988
989 void asp_session_recv_ack(GSocketAddress *sock_addr, guint8 *session_mac,
990                           guint32 session_id, gpointer p_msg)
991 {
992         INFO_MSG;
993
994         ASP_LOGD("%s asp_session_recv_ack: session_id:%d, session_mac[0]:%x", ROLE,
995                  session_id, session_mac[0]);
996         asp_session_s *session = _get_exist_session(session_id, session_mac);
997         g_assert(session);
998
999         gfsm_process_event(&(session->context),
1000                            gfsm_create_event(SESSION_EVENT_ACK_RECEIVED, NULL, NULL));
1001 }
1002
1003 void asp_session_recv_nack(GSocketAddress *sock_addr, guint8 *session_mac,
1004                            guint32 session_id, gpointer data)
1005 {
1006         INFO_MSG;
1007
1008         asp_session_s *session = _get_exist_session(session_id, session_mac);
1009         g_assert(session);
1010
1011         gfsm_process_event(&(session->context),
1012                            gfsm_create_event(SESSION_EVENT_NACK_RECEIVED, NULL, NULL));
1013 }
1014
1015 void asp_session_peer_destroyed(guint8 *session_mac, guint32 session_id)
1016 {
1017         INFO_MSG;
1018
1019         /*_remove_session(session_mac, session_id); */
1020         asp_session_s *session = _get_exist_session(session_id, session_mac);
1021
1022         if (session == NULL) {
1023                 ASP_LOGE("session [%u] already destroyed", session_id);
1024                 return;
1025         }
1026
1027         gfsm_process_event(&(session->context),
1028                            gfsm_create_event(SESSION_EVENT_PEER_DESTROYED, NULL, NULL));
1029 }
1030
1031 /*****************************************************************************
1032  * Local Function Definition
1033  *****************************************************************************/
1034
1035 gboolean _send_request_session(asp_session_s *session, guint8 *session_info,
1036                                size_t session_info_len)
1037 {
1038         INFO_MSG;
1039
1040         asp_request_session_s request_session_data;
1041
1042         request_session_data.opcode = ASP_OPCODE_REQUEST_SESSION;
1043         memcpy(request_session_data.session_mac, session->session_mac, MAC_ADDRESS_LEN);
1044         request_session_data.session_id = session->session_id;
1045         request_session_data.advertisement_id = session->advertisement_id;
1046         if (session_info) {
1047                 request_session_data.session_information_length = MIN(ASP_SESSION_INFO_BYTE_MAX,
1048                                 session_info_len);
1049                 memcpy(request_session_data.session_information, session_info,
1050                        session_info_len);
1051         } else
1052                 request_session_data.session_information_length = 0;
1053
1054         return asp_sess_peer_send_msg(session->sock_addr,
1055                                       (void *)&request_session_data);
1056 }
1057
1058 gboolean _send_remove_session(asp_session_s *session, guint8 remove_reason)
1059 {
1060         INFO_MSG;
1061
1062         asp_remove_session_s remove_session_data;
1063
1064         remove_session_data.opcode = ASP_OPCODE_REMOVE_SESSION;
1065         memcpy(remove_session_data.session_mac, session->session_mac, MAC_ADDRESS_LEN);
1066         remove_session_data.session_id = session->session_id;
1067         remove_session_data.reason = remove_reason;
1068
1069         return asp_sess_peer_send_msg(session->sock_addr, (void *)&remove_session_data);
1070 }
1071
1072 gboolean _send_reject_session(asp_session_s *session)
1073 {
1074         INFO_MSG;
1075
1076         asp_rejected_session_s rejected_session_data;
1077         rejected_session_data.opcode = ASP_OPCODE_REJECTED_SESSION;
1078         memcpy(rejected_session_data.session_mac, session->session_mac,
1079                MAC_ADDRESS_LEN);
1080         rejected_session_data.session_id = session->session_id;
1081
1082         return asp_sess_peer_send_msg(session->sock_addr,
1083                                       (void *)&rejected_session_data);
1084 }
1085
1086 gboolean _send_added_session(asp_session_s *session)
1087 {
1088         INFO_MSG;
1089
1090         asp_added_session_s add_session_data;
1091         add_session_data.opcode = ASP_OPCODE_ADDED_SESSION;
1092         memcpy(add_session_data.session_mac, session->session_mac, MAC_ADDRESS_LEN);
1093         add_session_data.session_id = session->session_id;
1094
1095         return asp_sess_peer_send_msg(session->sock_addr, (void *)&add_session_data);
1096 }
1097
1098 gboolean _send_deferred_session(asp_session_s *session,
1099                                 guint8 *deferred_response, size_t length)
1100 {
1101         INFO_MSG;
1102
1103         asp_deferred_session_s deferred_session_data;
1104         deferred_session_data.opcode = ASP_OPCODE_DEFERRED_SESSION;
1105         memcpy(deferred_session_data.session_mac, session->session_mac,
1106                MAC_ADDRESS_LEN);
1107         deferred_session_data.session_id = session->session_id;
1108         deferred_session_data.deferred_session__response_length = length;
1109         memcpy(deferred_session_data.deferred_session__response, deferred_response,
1110                length);
1111
1112         return asp_sess_peer_send_msg(session->sock_addr,
1113                                       (void *)&deferred_session_data);
1114 }
1115
1116 gboolean _send_allowed_port(asp_session_s *session, guint16 port,
1117                             guint8 protocol)
1118 {
1119         INFO_MSG;
1120
1121         asp_allowed_port_s allowed_port_data;
1122         allowed_port_data.opcode = ASP_OPCODE_ALLOWED_PORT;
1123         memcpy(allowed_port_data.session_mac, session->session_mac, MAC_ADDRESS_LEN);
1124         allowed_port_data.session_id = session->session_id;
1125         allowed_port_data.port = port;
1126         allowed_port_data.proto = protocol;
1127
1128         return asp_sess_peer_send_msg(session->sock_addr, (void *)&allowed_port_data);
1129 }
1130
1131 gboolean _send_nack(GSocketAddress *sock_addr, guint8 seq_num, guint8 reason)
1132 {
1133         INFO_MSG;
1134
1135         asp_nack_s nack_data;
1136         nack_data.opcode = ASP_OPCODE_NACK;
1137         nack_data.seq_num = seq_num;
1138         nack_data.reason = reason;
1139
1140         return asp_sess_peer_send_msg(sock_addr, (void *)&nack_data);
1141 }
1142
1143 gboolean _send_ack(GSocketAddress *sock_addr, guint8 seq_num)
1144 {
1145         INFO_MSG;
1146
1147         asp_nack_s ack_data;
1148         ack_data.opcode = ASP_OPCODE_ACK;
1149         ack_data.seq_num = seq_num;
1150
1151         return asp_sess_peer_send_msg(sock_addr, (void *)&ack_data);
1152 }
1153
1154 void _session_tree_value_destoryed(gpointer data)
1155 {
1156         INFO_MSG;
1157
1158         asp_session_s *session = (asp_session_s *)data;
1159
1160         /* destroy gfsm context */
1161         /*gfsm_destroy_context(session->context); */
1162
1163         if (session->sock_addr) {
1164                 g_object_unref(session->sock_addr);
1165                 session->sock_addr = NULL;
1166         }
1167
1168         g_free(session);
1169         session = NULL;
1170 }
1171
1172 void _session_tree_key_destoryed(gpointer data)
1173 {
1174         asp_session_key_s *key = (asp_session_key_s *)data;
1175
1176         g_free(key);
1177 }
1178
1179 gint _session_tree_compare_func(gconstpointer a, gconstpointer b)
1180 {
1181         asp_session_key_s *s1 = (asp_session_key_s *)a;
1182         asp_session_key_s *s2 = (asp_session_key_s *)b;
1183
1184         /* ascending sort */
1185         if (s1->session_id != s2->session_id)
1186                 return s1->session_id - s2->session_id;
1187         else
1188                 return memcmp(s1->session_mac, s2->session_mac, MAC_ADDRESS_LEN);
1189 }
1190
1191 void _call_session_request_cb(gint32 error_code, guint8 *session_mac,
1192                               guint32 session_id, guint32 advertisement_id, gchar *device_name,
1193                               size_t name_length, guint8 *session_info, size_t info_length, gboolean get_pin,
1194                               guint32 pin)
1195 {
1196         INFO_MSG;
1197
1198         if (NULL == session_cb_v_table.session_request.cb) {
1199                 /* a callback have not been registered yet */
1200                 return;
1201         }
1202
1203         session_cb_v_table.session_request.cb(error_code, session_mac, session_id,
1204                                               advertisement_id, device_name, name_length, session_info, info_length, get_pin,
1205                                               pin, session_cb_v_table.session_request.user_data);
1206 }
1207
1208 void _call_session_config_request_cb(gint32 error_code, guint8 *session_mac,
1209                                      guint32 session_id, gboolean get_pin, guint32 pin)
1210 {
1211         INFO_MSG;
1212
1213         if (NULL == session_cb_v_table.session_config_request.cb) {
1214                 /* a callback have not been registered yet */
1215                 return;
1216         }
1217
1218         session_cb_v_table.session_config_request.cb(error_code, session_mac,
1219                         session_id, get_pin, pin, session_cb_v_table.session_config_request.user_data);
1220 }
1221
1222 void _call_port_status_cb(gint32 error_code, const guint8 *session_mac,
1223                           guint32 session_id, const gchar *peer_ip, guint16 port, guint8 protocol,
1224                           asp_session_port_status_e status)
1225 {
1226         INFO_MSG;
1227
1228         if (NULL == session_cb_v_table.port_status.cb) {
1229                 /* a callback have not been registered yet */
1230                 return;
1231         }
1232
1233         session_cb_v_table.port_status.cb(error_code, session_mac, session_id, peer_ip,
1234                                           port, protocol, status, session_cb_v_table.port_status.user_data);
1235 }
1236
1237 void _call_session_status_cb(gint32 error_code, guint8 *session_mac,
1238                              guint32 session_id, asp_session_closed_state_e closed_state)
1239 {
1240         INFO_MSG;
1241
1242         g_assert(session_cb_v_table.session_status.cb);
1243
1244         asp_session_s *session = _get_exist_session(session_id, session_mac);
1245         g_assert(session);
1246
1247         session_cb_v_table.session_status.cb(error_code, session_mac, session_id,
1248                                              _get_session_state(session_mac, session_id), closed_state,
1249                                              session->additional_info, session_cb_v_table.session_status.user_data);
1250 }
1251
1252 void _call_connect_status_cb(gint32 error_code, guint8 *session_mac,
1253                              guint32 session_id, asp_session_connect_status_e status)
1254 {
1255         INFO_MSG;
1256
1257         g_assert(session_cb_v_table.session_status.cb);
1258
1259         asp_session_s *session = _get_exist_session(session_id, session_mac);
1260         g_assert(session);
1261
1262         /* temporary code */
1263         /*what is deferred_resp ? */
1264         guint8 *deferred_resp = NULL;
1265         size_t length = 0;
1266         /* temporary code */
1267
1268         session_cb_v_table.connect_status.cb(error_code, session_mac, session_id,
1269                                              status, deferred_resp, length, session_cb_v_table.connect_status.user_data);
1270 }
1271
1272 gpointer _asp_session_dup_reqeust_session(gpointer p_msg)
1273 {
1274         asp_request_session_s *p_dup_msg = (asp_request_session_s *)g_malloc(sizeof(
1275                         asp_request_session_s));
1276         memcpy(p_dup_msg, p_msg, sizeof(asp_request_session_s));
1277         return (gpointer) p_dup_msg;
1278 }
1279
1280 /*
1281
1282 gpointer _asp_session_dup_added_session(gpointer p_msg)
1283 {
1284     asp_added_session_s* p_dup_msg = (asp_added_session_s*)g_malloc(sizeof(asp_added_session_s));
1285     memcpy(p_dup_msg, p_msg, sizeof(asp_added_session_s));
1286     return (gpointer)p_dup_msg;
1287 }
1288
1289 gpointer _asp_session_dup_rejected_session(gpointer p_msg)
1290 {
1291     asp_rejected_session_s* p_dup_msg = (asp_rejected_session_s*)g_malloc(sizeof(asp_rejected_session_s));
1292     memcpy(p_dup_msg, p_msg, sizeof(asp_rejected_session_s));
1293     return (gpointer)p_dup_msg;
1294 }
1295
1296 gpointer _asp_session_dup_remove_session(gpointer p_msg)
1297 {
1298     asp_remove_session_s* p_dup_msg = (asp_remove_session_s*)g_malloc(sizeof(asp_remove_session_s));
1299     memcpy(p_dup_msg, p_msg, sizeof(asp_remove_session_s));
1300     return (gpointer)p_dup_msg;
1301 }
1302
1303 gpointer _asp_session_dup_deferred_session(gpointer p_msg)
1304 {
1305     asp_deferred_session_s* p_dup_msg = (asp_deferred_session_s*)g_malloc(sizeof(asp_deferred_session_s));
1306     memcpy(p_dup_msg, p_msg, sizeof(asp_deferred_session_s));
1307     return (gpointer)p_dup_msg;
1308 }
1309 */
1310
1311 gpointer _asp_session_dup_allowed_session(gpointer p_msg)
1312 {
1313         INFO_MSG;
1314
1315         asp_allowed_port_s *p_dup_msg = (asp_allowed_port_s *)g_malloc(sizeof(
1316                                                 asp_allowed_port_s));
1317         memcpy(p_dup_msg, p_msg, sizeof(asp_allowed_port_s));
1318         return (gpointer) p_dup_msg;
1319 }
1320
1321 guint32 _alloc_session_id()
1322 {
1323         static guint32 g_session_id = 0;
1324         return g_session_id++;
1325 }
1326
1327 asp_session_status_e _get_session_state(guint8 *session_mac, guint32 session_id)
1328 {
1329         INFO_MSG;
1330
1331         asp_session_status_e ret = ASP_SESSION_STATE_ERROR;
1332
1333         asp_session_s *session = _get_exist_session(session_id, session_mac);
1334         g_assert(session);
1335
1336         gfsm_state_id_t current_state = gfsm_get_current_state_id(session->context);
1337         ASP_LOGD("%s _get_session_state() current session_state : %d", ROLE, current_state);
1338         switch (current_state) {
1339         case SESSION_STATE_NONE:
1340         case SESSION_STATE_CLOSED:
1341         case SESSION_STATE_RUNNING:
1342                 ret = ASP_SESSION_STATE_CLOSED;
1343                 break;
1344         case SESSION_STATE_REQUEST_SESSION_SENT:
1345         case SESSION_STATE_SESSION_REQUEST_SENT:
1346                 ret = ASP_SESSION_STATE_INITIATED;
1347                 break;
1348         case SESSION_STATE_OPEN:
1349         case SESSION_STATE_REMOVE_SESSION_SENT:
1350                 ret = ASP_SESSION_STATE_OPEN;
1351                 break;
1352         case SESSION_STATE_REQUEST_SESSION_RECEIVED:
1353         case SESSION_STATE_SESSION_REQUEST_RECEIVED:
1354         /*case SESSION_STATE_DEFERRED_SESSION_SENT: */
1355         case SESSION_STATE_REJECT_SESSION_SENT:
1356                 ret = ASP_SESSION_STATE_REQUESTED;
1357                 break;
1358         default:
1359                 ret = ASP_SESSION_STATE_ERROR;
1360         }
1361
1362         ASP_LOGD("%s _get_session_state() session_state : %d", ROLE, ret);
1363
1364         return ret;
1365 }
1366
1367 asp_session_s *_new_session_by_request_session(GSocketAddress *sock_addr,
1368                 const gchar *peer_ip, gpointer p_msg)
1369 {
1370         INFO_MSG;
1371
1372         asp_session_s *session = NULL;
1373         asp_request_session_s *p_req_session = (asp_request_session_s *)p_msg;
1374         g_assert(p_req_session);
1375
1376         session = _new_session_over_infra(p_req_session->session_mac,
1377                                           p_req_session->session_id, ASP_ROLE_ADVERTIZER, p_req_session->advertisement_id,
1378                                           sock_addr, peer_ip);
1379
1380         return session;
1381 }
1382
1383 asp_session_s *_new_session_over_infra(guint8 *session_mac, guint32 session_id,
1384                                        asp_role_e asp_role, guint32 advertisement_id, GSocketAddress *sock_addr,
1385                                        const gchar *peer_ip)
1386 {
1387         INFO_MSG;
1388
1389         asp_session_s *session = NULL;
1390
1391         session = (asp_session_s *)g_malloc0(sizeof(asp_session_s));
1392
1393         session->asp_role = asp_role;
1394
1395         memcpy(session->session_mac, session_mac, MAC_ADDRESS_LEN);
1396         session->session_id = session_id;
1397         session->advertisement_id = advertisement_id, g_strlcpy(session->peer_ip,
1398                                     peer_ip, ASP_SESSION_IPV4_STR_LEN);
1399
1400         if (NULL == sock_addr)          /* seeker side */
1401                 session->sock_addr = g_inet_socket_address_new_from_string(peer_ip,
1402                                      (guint) g_asp_cordination_port);
1403         else                                            /* advertiser side */
1404                 session->sock_addr = (GSocketAddress *) g_object_ref(sock_addr);
1405         /*session->sock_family = G_SOCKET_FAMILY_IPV4; // temporary */
1406         session->over_p2p = FALSE;
1407
1408         g_strlcpy(session->additional_info, SESSION_STATUS_ADDITIONAL_INFO_CO,
1409                         SESSION_STATUS_ADDITIONAL_INFO_LEN);
1410
1411         session->context = gfsm_create_context(session_fsm,
1412                                                _asp_session_destroy_session, session);
1413
1414         _insert_session(session);
1415
1416         return session;
1417 }
1418
1419 asp_session_s *_new_session_over_p2p(const guint8 *session_mac,
1420                                      guint32 session_id, asp_role_e asp_role, const guint8 *service_mac,
1421                                      guint32 advertisement_id)
1422 {
1423         INFO_MSG;
1424
1425         asp_session_s *session = NULL;
1426
1427         session = (asp_session_s *)g_malloc0(sizeof(asp_session_s));
1428
1429         memcpy(session->session_mac, session_mac, MAC_ADDRESS_LEN);
1430         session->session_id = session_id;
1431
1432         session->asp_role = asp_role;
1433
1434         memcpy(session->service_mac, service_mac, MAC_ADDRESS_LEN);
1435         session->advertisement_id = advertisement_id,
1436                  /*session->sock_family = G_SOCKET_FAMILY_IPV4; // temporary */
1437                  session->over_p2p = TRUE;
1438         g_strlcpy(session->additional_info, SESSION_STATUS_ADDITIONAL_INFO_PD,
1439                         SESSION_STATUS_ADDITIONAL_INFO_LEN);
1440
1441         session->context = gfsm_create_context(session_fsm,
1442                                                _asp_session_destroy_session, session);
1443
1444         _insert_session(session);
1445
1446         return session;
1447 }
1448
1449 asp_session_s *_new_session_from_session_request(const guint8 *session_mac,
1450                 guint32 session_id, guint32 advertisement_id)
1451 {
1452         INFO_MSG;
1453
1454         asp_session_s *session = NULL;
1455
1456         session = (asp_session_s *)g_malloc0(sizeof(asp_session_s));
1457
1458         memcpy(session->session_mac, session_mac, MAC_ADDRESS_LEN);
1459         session->session_id = session_id;
1460
1461         session->asp_role = ASP_ROLE_ADVERTIZER;
1462
1463         memcpy(session->service_mac, g_my_p2p_mac, MAC_ADDRESS_LEN);
1464         session->advertisement_id = advertisement_id,
1465                  /*session->sock_family = G_SOCKET_FAMILY_IPV4; // temporary */
1466                  session->over_p2p = TRUE;
1467
1468         g_strlcpy(session->additional_info, SESSION_STATUS_ADDITIONAL_INFO_PD,
1469                         SESSION_STATUS_ADDITIONAL_INFO_LEN);
1470
1471         session->context = gfsm_create_context(session_fsm,
1472                                                _asp_session_destroy_session, session);
1473
1474         _insert_session(session);
1475
1476         return session;
1477 }
1478
1479 void _store_peer_ip_addr(asp_session_s *session, char *peer_ip, size_t length)
1480 {
1481         INFO_MSG;
1482         g_strlcpy(session->peer_ip, peer_ip, length);
1483         session->sock_addr = g_inet_socket_address_new_from_string(peer_ip,
1484                              (guint) g_asp_cordination_port);
1485
1486         if (session->sock_addr == NULL)
1487                 ASP_LOGD("Failed to create socket IP %s", peer_ip);
1488         else
1489                 ASP_LOGD("Succeeded to create socket IP %s", peer_ip);
1490
1491 }
1492
1493 #ifdef HAVE_ASP_P2P_CONN
1494 guint8 *_get_peer_mac(asp_session_s *session)
1495 {
1496         if (session->asp_role == ASP_ROLE_ADVERTIZER)
1497                 return session->session_mac;
1498         else
1499                 return session->service_mac;
1500 }
1501 #endif
1502
1503 void _asp_session_destroy_session(void *p_context_data)
1504 {
1505         INFO_MSG;
1506
1507         asp_session_s *session = (asp_session_s *)p_context_data;
1508         _remove_session(session->session_mac, session->session_id);
1509 }
1510
1511 void _remove_session(guint8 *session_mac, guint32 session_id)
1512 {
1513         INFO_MSG;
1514
1515         g_tree_remove(sessionTree, _get_session_key(session_id, session_mac));
1516         /* key & value pair in tree will be freed _session_tree_key_destoryed and _session_tree_value_destoryed */
1517 }
1518
1519 asp_session_s *_get_exist_session(guint32 session_id, const guint8 *session_mac)
1520 {
1521         asp_session_s *session = NULL;
1522
1523         session = (asp_session_s *)g_tree_lookup(sessionTree,
1524                         _get_session_key(session_id, session_mac));
1525
1526         return session;
1527 }
1528
1529 asp_session_key_s *_get_session_key(guint32 session_id,
1530                                     const guint8 *session_mac)
1531 {
1532         asp_session_key_s *key = (asp_session_key_s *)g_malloc(sizeof(
1533                                          asp_session_key_s));
1534         key->session_id = session_id;
1535         memcpy(key->session_mac, session_mac, MAC_ADDRESS_LEN); /* 6 bytes */
1536
1537         return key;
1538 }
1539
1540 void _insert_session(asp_session_s *session)
1541 {
1542         /* add a new session to hash table ( key - session_id, value - asp_session_s*) */
1543         g_tree_insert(sessionTree, _get_session_key(session->session_id,
1544                         session->session_mac), session);
1545 }
1546
1547 void _get_ip_from_socketaddress(GSocketAddress *sock_addr, gchar *peer_ip)
1548 {
1549         GInetSocketAddress *inetaddr;
1550         GInetAddress *hostaddr;
1551         gchar *ip_str = NULL;
1552
1553         inetaddr = G_INET_SOCKET_ADDRESS(sock_addr);
1554         hostaddr = g_inet_socket_address_get_address(inetaddr);
1555
1556         ip_str = g_inet_address_to_string(hostaddr);
1557         g_strlcpy(peer_ip, ip_str, ASP_SESSION_IPV4_STR_LEN);
1558
1559         ASP_LOGD("%s peer_ip: %s", ROLE, peer_ip);
1560         g_free(ip_str);
1561
1562         /*g_object_unref(hostaddr); */
1563         /*g_object_unref(inetaddr); */
1564 }
1565
1566 /*****************************************************************************
1567  * Local Function for state machine
1568  *****************************************************************************/
1569
1570 const char *_asp_session_fsm_get_state_name_cb(gfsm_state_id_t state_id)
1571 {
1572         const char *ret_val = NULL;
1573
1574         switch (state_id) {
1575         case SESSION_STATE_NONE:
1576                 ret_val = "SESSION_STATE_NONE";
1577                 break;
1578         case SESSION_STATE_CLOSED:
1579                 ret_val = "SESSION_STATE_CLOSED";
1580                 break;
1581         case SESSION_STATE_RUNNING:
1582                 ret_val = "SESSION_STATE_RUNNING";
1583                 break;
1584         case SESSION_STATE_L2CONNECTING:
1585                 ret_val = "SESSION_STATE_L2CONNECTING";
1586                 break;
1587         case SESSION_STATE_SESSION_REQUEST_SENT:
1588                 ret_val = "SESSION_STATE_SESSION_REQUEST_SENT";
1589                 break;
1590         case SESSION_STATE_SESSION_REQUEST_RECEIVED:
1591                 ret_val = "SESSION_STATE_SESSION_REQUEST_RECEIVED";
1592                 break;
1593         case SESSION_STATE_SESSION_REQUEST_DEFERED:
1594                 ret_val = "SESSION_STATE_SESSION_REQUEST_DEFERED";
1595                 break;
1596         case SESSION_STATE_SESSION_REQUEST_ACCEPTED:
1597                 ret_val = "SESSION_STATE_SESSION_REQUEST_ACCEPTED";
1598                 break;
1599         case SESSION_STATE_ENTERING_PIN:
1600                 ret_val = "SESSION_STATE_ENTERING_PIN";
1601                 break;
1602         case SESSION_STATE_GROUP_FORMATION_COMPLETED:
1603                 ret_val = "SESSION_STATE_GROUP_FORMATION_COMPLETED";
1604                 break;
1605         case SESSION_STATE_L2CONNECTED:
1606                 ret_val = "SESSION_STATE_L2CONNECTED";
1607                 break;
1608         case SESSION_STATE_REQUEST_SESSION_SENT:
1609                 ret_val = "SESSION_STATE_REQUEST_SESSION_SENT";
1610                 break;
1611         case SESSION_STATE_OPEN:
1612                 ret_val = "SESSION_STATE_OPEN";
1613                 break;
1614         case SESSION_STATE_REQUEST_SESSION_RECEIVED:
1615                 ret_val = "SESSION_STATE_REQUEST_SESSION_RECEIVED";
1616                 break;
1617         case SESSION_STATE_REJECT_SESSION_SENT:
1618                 ret_val = "SESSION_STATE_REJECT_SESSION_SENT";
1619                 break;
1620         case SESSION_STATE_REMOVE_SESSION_SENT:
1621                 ret_val = "SESSION_STATE_REMOVE_SESSION_SENT";
1622                 break;
1623         default:
1624                 ret_val = "SESSION_STATE_MAX";
1625                 break;
1626         }
1627
1628         return ret_val;
1629 }
1630
1631 const char *_asp_session_gfsm_get_event_name_cb(gfsm_event_id_t event_id)
1632 {
1633         const char *ret_val = NULL;
1634
1635         switch (event_id) {
1636         case SESSION_EVENT_BOUND_PORT_CALLED:
1637                 ret_val = "SESSION_EVENT_BOUND_PORT_CALLED";
1638                 break;
1639         case SESSION_EVENT_CLOSE_SESSION_CALLED:
1640                 ret_val = "SESSION_EVENT_CLOSE_SESSION_CALLED";
1641                 break;
1642         case SESSION_EVENT_CONNECT_SESSION_CALLED:
1643                 ret_val = "SESSION_EVENT_CONNECT_SESSION_CALLED";
1644                 break;
1645         case SESSION_EVENT_CONFIRM_SESSION_CALLED:
1646                 ret_val = "SESSION_EVENT_CONFIRM_SESSION_CALLED";
1647                 break;
1648         case SESSION_EVENT_DEFER_SESSION_CALLED:
1649                 ret_val = "SESSION_EVENT_DEFER_SESSION_CALLED";
1650                 break;
1651         case SESSION_EVENT_SET_SESSION_READY_CALLED:
1652                 ret_val = "SESSION_EVENT_SET_SESSION_READY_CALLED";
1653                 break;
1654         case SESSION_EVENT_SESSION_REQUEST_CALLED:
1655                 ret_val = "SESSION_EVENT_SESSION_REQUEST_CALLED";
1656                 break;
1657         case SESSION_EVENT_SESSION_CONFIG_REQUEST_CALLED:
1658                 ret_val = "SESSION_EVENT_SESSION_CONFIG_REQUEST_CALLED";
1659                 break;
1660         case SESSION_EVENT_CONNECT_STATUS_CALLED:
1661                 ret_val = "SESSION_EVENT_CONNECT_STATUS_CALLED";
1662                 break;
1663         case SESSION_EVENT_IP_ASSIGNED:
1664                 ret_val = "SESSION_EVENT_IP_ASSIGNED";
1665                 break;
1666         case SESSION_EVENT_REMOVE_SESSION_RECEIVED:
1667                 ret_val = "SESSION_EVENT_REMOVE_SESSION_RECEIVED";
1668                 break;
1669         case SESSION_EVENT_ALLOWED_PORT_RECEIVED:
1670                 ret_val = "SESSION_EVENT_ALLOWED_PORT_RECEIVED";
1671                 break;
1672         case SESSION_EVENT_DEFERRED_SESSION_RECEIVED:
1673                 ret_val = "SESSION_EVENT_DEFERRED_SESSION_RECEIVED";
1674                 break;
1675         case SESSION_EVENT_REJECTED_SESSION_RECEIVED:
1676                 ret_val = "SESSION_EVENT_REJECTED_SESSION_RECEIVED";
1677                 break;
1678         case SESSION_EVENT_ADDED_SESSION_RECEIVED:
1679                 ret_val = "SESSION_EVENT_ADDED_SESSION_RECEIVED";
1680                 break;
1681         case SESSION_EVENT_REQUEST_SESSION_RECEIVED:
1682                 ret_val = "SESSION_EVENT_REQUEST_SESSION_RECEIVED";
1683                 break;
1684         case SESSION_EVENT_ACK_RECEIVED:
1685                 ret_val = "SESSION_EVENT_ACK_RECEIVED";
1686                 break;
1687         case SESSION_EVENT_NACK_RECEIVED:
1688                 ret_val = "SESSION_EVENT_NACK_RECEIVED";
1689                 break;
1690         case SESSION_EVENT_PEER_DESTROYED:
1691                 ret_val = "SESSION_EVENT_PEER_DESTROYED";
1692                 break;
1693         case SESSION_EVENT_TIMEOUT:
1694                 ret_val = "SESSION_EVENT_TIMEOUT";
1695                 break;
1696         case SESSION_EVENT_DELETE_SESSION:
1697                 ret_val = "SESSION_EVENT_DELETE_SESSION";
1698                 break;
1699         default:
1700                 ret_val = "SESSION_EVENT_MAX";
1701                 break;
1702         }
1703
1704         return ret_val;
1705 }
1706
1707 int _asp_session_fsm_log_func(const char *format, ...)
1708 {
1709         gchar buffer[256];
1710         va_list args;
1711         va_start(args, format);
1712         g_vsnprintf(buffer, 255, format, args);
1713         va_end(args);
1714
1715         ASP_LOGD("%s", buffer);
1716
1717         return 0;
1718 }
1719
1720
1721 void _asp_session_fsm_init()
1722 {
1723         INFO_MSG;
1724
1725         session_fsm = gfsm_create_fsm(SESSION_STATE_MAX, SESSION_EVENT_MAX,
1726                                       SESSION_STATE_NONE);
1727
1728         session_state_none = gfsm_create_state(SESSION_STATE_NONE, session_fsm,
1729                                                _state_none_entry_action, _state_none_exit_action);
1730         gfsm_add_reaction(session_state_none, SESSION_EVENT_CONNECT_SESSION_CALLED,
1731                           _state_none_reaction_connect_session_called);
1732         gfsm_add_reaction(session_state_none, SESSION_EVENT_REQUEST_SESSION_RECEIVED,
1733                           _state_none_reaction_request_session_received);
1734         gfsm_add_reaction(session_state_none, SESSION_EVENT_SESSION_REQUEST_CALLED,
1735                           _state_none_reaction_session_request_received);
1736
1737         session_state_closed = gfsm_create_state(SESSION_STATE_CLOSED, session_fsm,
1738                                _state_closed_entry_action, _state_closed_exit_action);
1739         gfsm_add_reaction(session_state_closed, SESSION_EVENT_DELETE_SESSION,
1740                           _state_closed_reaction_delete_session);
1741         /*gfsm_add_reaction(&session_state_closed, SESSION_EVENT_CONNECT_SESSION_CALLED, _state_closed_reaction_connect_session_called); */
1742         /*gfsm_add_reaction(&session_state_closed, SESSION_EVENT_REQUEST_SESSION_RECEIVED, _state_closed_reaction_request_session_received); */
1743         /*gfsm_add_reaction(&session_state_closed, SESSION_EVENT_SESSION_REQUEST_CALLED, _state_closed_reaction_session_request_received);  // ???? */
1744
1745         session_state_running = gfsm_create_state(SESSION_STATE_RUNNING, session_fsm,
1746                                 _state_running_entry_action, _state_running_exit_action);
1747
1748         session_state_l2connecting = gfsm_create_state(SESSION_STATE_L2CONNECTING,
1749                                      session_fsm, _state_l2connecting_entry_action, _state_l2connecting_exit_action);
1750         gfsm_set_parent_state(session_state_l2connecting, session_state_running);
1751         gfsm_add_reaction(session_state_l2connecting,
1752                           SESSION_EVENT_CLOSE_SESSION_CALLED,
1753                           _state_l2connecting_reaction_close_session_called);
1754         gfsm_add_reaction(session_state_l2connecting, SESSION_EVENT_TIMEOUT,
1755                           _state_l2connecting_reaction_timeout);
1756
1757         session_state_session_request_sent = gfsm_create_state(
1758                         SESSION_STATE_SESSION_REQUEST_SENT, session_fsm,
1759                         _state_session_request_sent_entry_action,
1760                         _state_session_request_sent_exit_action);
1761         gfsm_set_parent_state(session_state_session_request_sent,
1762                               session_state_l2connecting);
1763         gfsm_add_reaction(session_state_session_request_sent,
1764                           SESSION_EVENT_CONNECT_STATUS_CALLED,
1765                           _state_session_request_sent_reaction_connect_status_called);
1766         gfsm_add_reaction(session_state_session_request_sent,
1767                           SESSION_EVENT_SESSION_CONFIG_REQUEST_CALLED,
1768                           _state_session_request_sent_reaction_session_config_request_called);
1769
1770         session_state_session_request_defered = gfsm_create_state(
1771                         SESSION_STATE_SESSION_REQUEST_DEFERED, session_fsm,
1772                         _state_session_request_defered_entry_action,
1773                         _state_session_request_defered_exit_action);
1774         gfsm_set_parent_state(session_state_session_request_defered,
1775                               session_state_l2connecting);
1776         gfsm_add_reaction(session_state_session_request_defered,
1777                           SESSION_EVENT_CONNECT_STATUS_CALLED,
1778                           _state_session_request_defered_reaction_connect_status_called);
1779         gfsm_add_reaction(session_state_session_request_defered,
1780                           SESSION_EVENT_SESSION_CONFIG_REQUEST_CALLED,
1781                           _state_session_request_defered_reaction_session_config_request_called);
1782
1783         session_state_session_request_received = gfsm_create_state(
1784                                 SESSION_STATE_SESSION_REQUEST_RECEIVED, session_fsm,
1785                                 _state_session_request_received_entry_action,
1786                                 _state_session_request_received_exit_action);
1787         gfsm_set_parent_state(session_state_session_request_received,
1788                               session_state_l2connecting);
1789         gfsm_add_reaction(session_state_session_request_received,
1790                           SESSION_EVENT_CONFIRM_SESSION_CALLED,
1791                           _state_session_request_received_reaction_confirm_session_called);
1792
1793         session_state_session_request_accepted = gfsm_create_state(
1794                                 SESSION_STATE_SESSION_REQUEST_ACCEPTED, session_fsm,
1795                                 _state_session_request_accepted_entry_action,
1796                                 _state_session_request_accepted_exit_action);
1797         gfsm_set_parent_state(session_state_session_request_accepted,
1798                               session_state_l2connecting);
1799         gfsm_add_reaction(session_state_session_request_accepted,
1800                           SESSION_EVENT_CONNECT_STATUS_CALLED,
1801                           _state_session_request_accepted_reaction_connect_status_received);
1802         gfsm_add_reaction(session_state_session_request_accepted,
1803                           SESSION_EVENT_SESSION_CONFIG_REQUEST_CALLED,
1804                           _state_session_request_accepted_reaction_session_config_request_called);
1805         gfsm_add_reaction(session_state_session_request_accepted,
1806                           SESSION_EVENT_SET_SESSION_READY_CALLED,
1807                           _state_session_request_accepted_reaction_set_session_ready_called);
1808
1809         session_state_entering_pin = gfsm_create_state(SESSION_STATE_ENTERING_PIN,
1810                                      session_fsm, _state_entering_pin_entry_action, _state_entering_pin_exit_action);
1811         gfsm_set_parent_state(session_state_entering_pin, session_state_l2connecting);
1812         gfsm_add_reaction(session_state_entering_pin,
1813                           SESSION_EVENT_CONFIRM_SESSION_CALLED,
1814                           _state_entering_pin_reaction_confirm_session_called);
1815
1816         session_state_group_formation_completed = gfsm_create_state(
1817                                 SESSION_STATE_GROUP_FORMATION_COMPLETED, session_fsm,
1818                                 _state_group_formation_completed_entry_action,
1819                                 _state_group_formation_completed_exit_action);
1820         gfsm_set_parent_state(session_state_group_formation_completed,
1821                               session_state_l2connecting);
1822         gfsm_add_reaction(session_state_group_formation_completed,
1823                           SESSION_EVENT_IP_ASSIGNED,
1824                           _state_group_formation_completed_reaction_ip_assigned);
1825         gfsm_add_reaction(session_state_group_formation_completed,
1826                           SESSION_EVENT_REQUEST_SESSION_RECEIVED,
1827                           _state_group_formation_completed_reaction_request_session_received);
1828         gfsm_add_reaction(session_state_group_formation_completed,
1829                           SESSION_EVENT_SET_SESSION_READY_CALLED,
1830                           _state_group_formation_completed_reaction_set_session_ready_called);
1831
1832         session_state_l2connected = gfsm_create_state(SESSION_STATE_L2CONNECTED,
1833                                     session_fsm, _state_l2connected_entry_action, _state_l2connected_exit_action);
1834         gfsm_set_parent_state(session_state_l2connected, session_state_running);
1835         gfsm_add_reaction(session_state_l2connected, SESSION_EVENT_CLOSE_SESSION_CALLED,
1836                           _state_l2connected_reaction_close_session_called);
1837         gfsm_add_reaction(session_state_l2connected,
1838                           SESSION_EVENT_REMOVE_SESSION_RECEIVED,
1839                           _state_l2connected_reaction_remove_session_received);
1840         gfsm_add_reaction(session_state_l2connected, SESSION_EVENT_PEER_DESTROYED,
1841                           _state_l2connected_reaction_peer_destroyed);
1842
1843         session_state_request_session_sent = gfsm_create_state(
1844                         SESSION_STATE_REQUEST_SESSION_SENT, session_fsm,
1845                         _state_request_session_sent_entry_action,
1846                         _state_request_session_sent_exit_action);
1847         gfsm_set_parent_state(session_state_request_session_sent,
1848                               session_state_l2connected);
1849         gfsm_add_reaction(session_state_request_session_sent,
1850                           SESSION_EVENT_ADDED_SESSION_RECEIVED,
1851                           _state_request_session_sent_reaction_added_session_received);
1852         gfsm_add_reaction(session_state_request_session_sent,
1853                           SESSION_EVENT_DEFERRED_SESSION_RECEIVED,
1854                           _state_request_session_sent_reaction_deferred_session_received);
1855         gfsm_add_reaction(session_state_request_session_sent,
1856                           SESSION_EVENT_REJECTED_SESSION_RECEIVED,
1857                           _state_request_session_sent_reaction_rejected_session_received);
1858         gfsm_add_reaction(session_state_request_session_sent, SESSION_EVENT_TIMEOUT,
1859                           _state_request_session_sent_reaction_timeout);
1860
1861         session_state_request_session_received = gfsm_create_state(
1862                                 SESSION_STATE_REQUEST_SESSION_RECEIVED, session_fsm,
1863                                 _state_request_session_received_entry_action,
1864                                 _state_request_session_received_exit_action);
1865         gfsm_set_parent_state(session_state_request_session_received,
1866                               session_state_l2connected);
1867         gfsm_add_reaction(session_state_request_session_received,
1868                           SESSION_EVENT_SET_SESSION_READY_CALLED,
1869                           _state_request_session_received_reaction_set_session_ready_called);
1870         gfsm_add_reaction(session_state_request_session_received,
1871                           SESSION_EVENT_DEFER_SESSION_CALLED,
1872                           _state_request_session_received_reaction_defer_session_called);
1873         gfsm_add_reaction(session_state_request_session_received,
1874                           SESSION_EVENT_CONFIRM_SESSION_CALLED,
1875                           _state_request_session_received_reaction_confirm_session_called);
1876
1877         session_state_open = gfsm_create_state(SESSION_STATE_OPEN, session_fsm,
1878                                                _state_open_entry_action, _state_open_exit_action);
1879         gfsm_set_parent_state(session_state_open, session_state_l2connected);
1880         gfsm_add_reaction(session_state_open, SESSION_EVENT_BOUND_PORT_CALLED,
1881                           _state_open_reaction_bound_port_called);
1882         gfsm_add_reaction(session_state_open, SESSION_EVENT_ALLOWED_PORT_RECEIVED,
1883                           _state_open_reaction_allowed_port_received);
1884
1885         session_state_reject_session_sent = gfsm_create_state(
1886                         SESSION_STATE_REJECT_SESSION_SENT, session_fsm,
1887                         _state_reject_session_sent_entry_action,
1888                         _state_reject_session_sent_exit_action);
1889         gfsm_add_reaction(session_state_reject_session_sent, SESSION_EVENT_ACK_RECEIVED,
1890                           _state_reject_session_sent_reaction_ack_received);
1891         gfsm_add_reaction(session_state_reject_session_sent,
1892                           SESSION_EVENT_NACK_RECEIVED, _state_reject_session_sent_reaction_nack_received);
1893
1894         session_state_remove_session_sent = gfsm_create_state(
1895                         SESSION_STATE_REMOVE_SESSION_SENT, session_fsm,
1896                         _state_remove_session_sent_entry_action,
1897                         _state_remove_session_sent_exit_action);
1898         gfsm_add_reaction(session_state_remove_session_sent, SESSION_EVENT_ACK_RECEIVED,
1899                           _state_remove_session_sent_reaction_ack_received);
1900         gfsm_add_reaction(session_state_remove_session_sent,
1901                           SESSION_EVENT_NACK_RECEIVED, _state_remove_session_sent_reaction_nack_received);
1902         gfsm_add_reaction(session_state_remove_session_sent, SESSION_EVENT_PEER_DESTROYED,
1903                           _state_remove_session_sent_reaction_peer_destroyed);
1904
1905         gfsm_add_state(session_fsm, session_state_none);
1906         gfsm_add_state(session_fsm, session_state_closed);
1907         gfsm_add_state(session_fsm, session_state_running);
1908
1909         gfsm_add_state(session_fsm, session_state_l2connecting);
1910         gfsm_add_state(session_fsm, session_state_session_request_sent);
1911         gfsm_add_state(session_fsm, session_state_session_request_defered);
1912         gfsm_add_state(session_fsm, session_state_session_request_received);
1913         gfsm_add_state(session_fsm, session_state_session_request_accepted);
1914         gfsm_add_state(session_fsm, session_state_group_formation_completed);
1915
1916         gfsm_add_state(session_fsm, session_state_l2connected);
1917         gfsm_add_state(session_fsm, session_state_request_session_sent);
1918         gfsm_add_state(session_fsm, session_state_request_session_received);
1919         gfsm_add_state(session_fsm, session_state_open);
1920
1921         gfsm_add_state(session_fsm, session_state_reject_session_sent);
1922         gfsm_add_state(session_fsm, session_state_remove_session_sent);
1923
1924         gfsm_set_logger(session_fsm, _asp_session_fsm_log_func,
1925                         ASP_SESSION_HEADER,
1926                         _asp_session_fsm_get_state_name_cb,
1927                         _asp_session_gfsm_get_event_name_cb);
1928 }
1929
1930 void _asp_session_fsm_terminate()
1931 {
1932         gfsm_destroy_state(session_state_none);
1933         gfsm_destroy_state(session_state_closed);
1934         gfsm_destroy_state(session_state_running);
1935         gfsm_destroy_state(session_state_request_session_sent);
1936         gfsm_destroy_state(session_state_request_session_received);
1937         gfsm_destroy_state(session_state_open);
1938         gfsm_destroy_state(session_state_reject_session_sent);
1939         gfsm_destroy_state(session_state_remove_session_sent);
1940
1941         gfsm_destroy_fsm(session_fsm);
1942 }
1943
1944 void _state_none_entry_action(void *p_context_data)
1945 {
1946         INFO_MSG;
1947 }
1948
1949 void _state_none_exit_action(void *p_context_data)
1950 {
1951 }
1952
1953 gfsm_state_id_t _state_none_reaction_request_session_received(
1954         void *p_context_data, void *p_event_data)
1955 {
1956         INFO_MSG;
1957         asp_session_s *session = (asp_session_s *)p_context_data;
1958         asp_request_session_s *p_msg = (asp_request_session_s *)p_event_data;
1959
1960         if (!session->over_p2p)
1961                 _call_session_request_cb(0, session->session_mac, session->session_id,
1962                                          session->advertisement_id, NULL, 0, p_msg->session_information,
1963                                          p_msg->session_information_length, 0, 0);
1964
1965         return SESSION_STATE_REQUEST_SESSION_RECEIVED;
1966 }
1967
1968 gfsm_state_id_t _state_none_reaction_connect_session_called(
1969         void *p_context_data, void *p_event_data)
1970 {
1971         INFO_MSG;
1972
1973         asp_session_s *session = (asp_session_s *)p_context_data;
1974         connect_session_param_s *p_connect_session = (connect_session_param_s *)
1975                         p_event_data;
1976
1977         g_assert(session);
1978
1979         if (session->over_p2p
1980 #ifdef HAVE_ASP_P2P_CONN
1981             && FALSE == asp_p2p_conn_peer_is_connected(p_connect_session->service_mac)
1982 #endif
1983            ) {
1984 #ifdef HAVE_ASP_P2P_CONN
1985                 asp_p2p_conn_connect_session(session->session_mac, session->session_id,
1986                                              p_connect_session->service_mac, session->advertisement_id,
1987                                              p_connect_session->session_info, p_connect_session->info_length,
1988                                              p_connect_session->network_role, p_connect_session->network_config);
1989 #endif
1990                 return SESSION_STATE_SESSION_REQUEST_SENT;
1991         } else {
1992                 _send_request_session(session, p_connect_session->session_info,
1993                                       p_connect_session->info_length);
1994                 return SESSION_STATE_REQUEST_SESSION_SENT;
1995         }
1996 }
1997
1998 gfsm_state_id_t _state_none_reaction_session_request_received(
1999         void *p_context_data, void *p_event_data)
2000 {
2001         INFO_MSG;
2002
2003         asp_session_s *session = (asp_session_s *)p_context_data;
2004         session_request_param_s *p_session_request = (session_request_param_s *)
2005                         p_event_data;
2006
2007         _call_session_request_cb(0, session->session_mac, session->session_id,
2008                                  session->advertisement_id, p_session_request->device_name,
2009                                  p_session_request->name_length, p_session_request->session_info,
2010                                  p_session_request->info_length, p_session_request->get_pin,
2011                                  p_session_request->pin);
2012
2013         return SESSION_STATE_SESSION_REQUEST_RECEIVED;
2014 }
2015
2016 void _state_closed_entry_action(void *p_context_data)
2017 {
2018         INFO_MSG;
2019
2020         asp_session_s *session = (asp_session_s *)p_context_data;
2021
2022         g_assert(session);
2023
2024         _call_session_status_cb(0, session->session_mac, session->session_id,
2025                                 session->closed_state);
2026
2027         asp_sess_peer_del_session(session->sock_addr, session->session_mac,
2028                                   session->session_id);
2029
2030         gfsm_process_event(&(session->context),
2031                            gfsm_create_event(SESSION_EVENT_DELETE_SESSION, NULL, NULL));
2032 }
2033
2034 void _state_closed_exit_action(void *p_context_data)
2035 {
2036 }
2037
2038 gfsm_state_id_t _state_closed_reaction_delete_session(void *p_context_data,
2039                 void *p_event_data)
2040 {
2041         INFO_MSG;
2042
2043         asp_session_s *session = (asp_session_s *)p_context_data;
2044
2045         g_assert(session);
2046
2047         ASP_LOGD("context[%p]", session->context);
2048         gfsm_destroy_context(session->context);
2049
2050         return GFSM_DISCARD_EVENT;
2051 }
2052
2053 #if 0
2054 gfsm_state_id_t _state_closed_reaction_connect_session_called(
2055         void *p_context_data, void *p_event_data)
2056 {
2057         INFO_MSG;
2058
2059         /*asp_session_s* session = (asp_session_s*)p_context_data; */
2060
2061         /*ASP_LOGD("_state_closed_reaction_connect_session_called - session_id : %d, peer_ip:%s, peer_port:%d", session->session_id, session->peer_ip, session->peer_port); */
2062
2063         /*_send_request_session(session); */
2064
2065         return SESSION_STATE_REQUEST_SESSION_SENT;
2066 }
2067
2068 gfsm_state_id_t _state_closed_reaction_request_session_received(
2069         void *p_context_data, void *p_event_data)
2070 {
2071         INFO_MSG;
2072
2073         return SESSION_STATE_REQUEST_SESSION_RECEIVED;
2074 }
2075 #endif
2076
2077 void _state_running_entry_action(void *p_context_data)
2078 {
2079         INFO_MSG;
2080 }
2081
2082 void _state_running_exit_action(void *p_context_data)
2083 {
2084 }
2085
2086 void _state_l2connecting_entry_action(void *p_context_data)
2087 {
2088         INFO_MSG;
2089 }
2090
2091 void _state_l2connecting_exit_action(void *p_context_data)
2092 {
2093 }
2094
2095 gfsm_state_id_t _state_l2connecting_reaction_close_session_called(
2096         void *p_context_data, void *p_event_data)
2097 {
2098         INFO_MSG;
2099
2100         asp_session_s *session = (asp_session_s *)p_context_data;
2101
2102 #ifdef HAVE_ASP_P2P_CONN
2103         asp_p2p_conn_disconnect_p2p(_get_peer_mac(session));
2104 #endif
2105
2106         session->closed_state =
2107                 ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE;   /* temporary value. shall be changed */
2108
2109         return SESSION_STATE_CLOSED;
2110 }
2111
2112 gfsm_state_id_t _state_l2connecting_reaction_timeout(void *p_context_data,
2113                 void *p_event_data)
2114 {
2115         INFO_MSG;
2116
2117         asp_session_s *session = (asp_session_s *)p_context_data;
2118 #ifdef HAVE_ASP_P2P_CONN
2119
2120         asp_p2p_conn_disconnect_p2p(_get_peer_mac(session));
2121 #endif
2122
2123         session->closed_state = ASP_SESSION_CLOSED_STATE_DISASSOCIATED;
2124
2125         return SESSION_STATE_CLOSED;
2126 }
2127
2128 void _state_session_request_sent_entry_action(void *p_context_data)
2129 {
2130         INFO_MSG;
2131
2132         asp_session_s* session = (asp_session_s*)p_context_data;
2133         /*_start_timer(...); */
2134         _call_session_status_cb(0, session->session_mac, session->session_id,
2135                                         ASP_SESSION_CLOSED_STATE_NONE);
2136 }
2137
2138 void _state_session_request_sent_exit_action(void *p_context_data)
2139 {
2140         /*_stop_timer(...); */
2141 }
2142
2143 gfsm_state_id_t _state_session_request_sent_reaction_connect_status_called(
2144         void *p_context_data, void *p_event_data)
2145 {
2146         INFO_MSG;
2147
2148         connect_status_param_s *p_connect_status = (connect_status_param_s *)
2149                         p_event_data;
2150         asp_session_s *session = (asp_session_s *)p_context_data;
2151
2152         _call_connect_status_cb(0 /*?? */ , session->session_mac, session->session_id,
2153                                 p_connect_status->status);
2154
2155         switch (p_connect_status->status) {
2156         case ASP_SESSION_CONNECT_STATUS_NETWORK_ROLE_REJECTED:
2157                 /* need to assign a proper closed_state "session->closed_state = ???; */
2158                 return SESSION_STATE_CLOSED;
2159                 break;
2160         case ASP_SESSION_CONNECT_STATUS_NO_MORE_CONNECTION:
2161                 /* need to assign a proper closed_state "session->closed_state = ???; */
2162                 return SESSION_STATE_CLOSED;
2163                 break;
2164         case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_ACCEPTED:
2165                 return SESSION_STATE_SESSION_REQUEST_ACCEPTED;
2166                 break;
2167         case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_DEFFERED:
2168                 return SESSION_STATE_SESSION_REQUEST_DEFERED;
2169                 break;
2170         case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_FAILED:
2171                 /* need to assign a proper closed_state "session->closed_state = ???; */
2172                 return SESSION_STATE_CLOSED;
2173                 break;
2174         case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_SENT:   /*Fall through */
2175         case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_RECEIVED:       /*Fall through */
2176         /*case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_STARTED: */
2177         /*case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_COMPLETED:  // ???? */
2178         /*case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_FAILED: */
2179         default:
2180                 return GFSM_DISCARD_EVENT;
2181                 break;
2182         }
2183 }
2184
2185 gfsm_state_id_t
2186 _state_session_request_sent_reaction_session_config_request_called(
2187         void *p_context_data, void *p_event_data)
2188 {
2189         asp_session_s *session = (asp_session_s *)p_context_data;
2190         session_config_request_param_s *p_config_request_param =
2191                 (session_config_request_param_s *)p_event_data;
2192         g_assert(p_config_request_param);
2193
2194         _call_session_config_request_cb(0, session->session_mac, session->session_id,
2195                                         p_config_request_param->get_network_config_pin,
2196                                         p_config_request_param->network_config_pin);
2197
2198         if (p_config_request_param->get_network_config_pin)
2199                 return SESSION_STATE_ENTERING_PIN;
2200
2201         return GFSM_DISCARD_EVENT;
2202 }
2203
2204 void _state_session_request_defered_entry_action(void *p_context_data)
2205 {
2206         INFO_MSG;
2207         /*_start_timer(...); */
2208 }
2209
2210 void _state_session_request_defered_exit_action(void *p_context_data)
2211 {
2212         /*_stop_timer(...); */
2213 }
2214
2215 gfsm_state_id_t _state_session_request_defered_reaction_connect_status_called(
2216         void *p_context_data, void *p_event_data)
2217 {
2218         INFO_MSG;
2219
2220         connect_status_param_s *p_connect_status = (connect_status_param_s *)
2221                         p_event_data;
2222         asp_session_s *session = (asp_session_s *)p_context_data;
2223
2224         _call_connect_status_cb(0 /*?? */ , session->session_mac, session->session_id,
2225                                 p_connect_status->status);
2226
2227         switch (p_connect_status->status) {
2228         case ASP_SESSION_CONNECT_STATUS_NETWORK_ROLE_REJECTED:
2229                 /* need to assign a proper closed_state "session->closed_state = ???; */
2230                 return SESSION_STATE_CLOSED;
2231                 break;
2232         case ASP_SESSION_CONNECT_STATUS_NO_MORE_CONNECTION:
2233                 /* need to assign a proper closed_state "session->closed_state = ???; */
2234                 return SESSION_STATE_CLOSED;
2235                 break;
2236         case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_ACCEPTED:
2237                 return SESSION_STATE_SESSION_REQUEST_ACCEPTED;
2238                 break;
2239         case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_FAILED:
2240                 /* need to assign a proper closed_state "session->closed_state = ???; */
2241                 return SESSION_STATE_CLOSED;
2242                 break;
2243         case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_SENT:   /*Fall through */
2244         case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_RECEIVED:       /*Fall through */
2245         case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_DEFFERED:
2246         /*case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_STARTED: */
2247         /*case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_COMPLETED:  // ???? */
2248         /*case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_FAILED: */
2249         default:
2250                 return GFSM_DISCARD_EVENT;
2251                 break;
2252         }
2253 }
2254
2255 gfsm_state_id_t
2256 _state_session_request_defered_reaction_session_config_request_called(
2257         void *p_context_data, void *p_event_data)
2258 {
2259         asp_session_s *session = (asp_session_s *)p_context_data;
2260         session_config_request_param_s *p_config_request_param =
2261                 (session_config_request_param_s *)p_event_data;
2262         g_assert(p_config_request_param);
2263
2264         _call_session_config_request_cb(0, session->session_mac, session->session_id,
2265                                         p_config_request_param->get_network_config_pin,
2266                                         p_config_request_param->network_config_pin);
2267
2268         if (p_config_request_param->get_network_config_pin)
2269                 return SESSION_STATE_ENTERING_PIN;
2270
2271         return GFSM_DISCARD_EVENT;
2272 }
2273
2274 void _state_session_request_received_entry_action(void *p_context_data)
2275 {
2276         INFO_MSG;
2277
2278         asp_session_s* session = (asp_session_s*)p_context_data;
2279
2280         /*_start_timer(..); */
2281         _call_session_status_cb(0, session->session_mac, session->session_id,
2282                                         ASP_SESSION_CLOSED_STATE_NONE);
2283 }
2284
2285 void _state_session_request_received_exit_action(void *p_context_data)
2286 {
2287         /*_stop_timer(..); */
2288 }
2289
2290 gfsm_state_id_t _state_session_request_received_reaction_confirm_session_called(
2291         void *p_context_data, void *p_event_data)
2292 {
2293         INFO_MSG;
2294
2295 #ifdef HAVE_ASP_P2P_CONN
2296         asp_session_s *session = (asp_session_s *)p_context_data;
2297 #endif
2298         confirm_session_param_s *p_confirm_session = (confirm_session_param_s *)
2299                         p_event_data;
2300         g_assert(p_confirm_session);
2301
2302 #ifdef HAVE_ASP_P2P_CONN
2303         asp_p2p_conn_confirm_session(session->session_mac, session->session_id,
2304                                      p_confirm_session->confirmed, p_confirm_session->pin);
2305 #endif
2306
2307         if (p_confirm_session->confirmed)
2308                 return SESSION_STATE_SESSION_REQUEST_ACCEPTED;
2309         else {
2310                 /* need to assign a proper closed_state "session->closed_state = ???; */
2311                 return SESSION_STATE_CLOSED;
2312         }
2313 }
2314
2315 void _state_session_request_accepted_entry_action(void *p_context_data)
2316 {
2317         INFO_MSG;
2318         /*_start_timer(...) */
2319 }
2320
2321 void _state_session_request_accepted_exit_action(void *p_context_data)
2322 {
2323         /*_stop_timer(...) */
2324 }
2325
2326 gfsm_state_id_t
2327 _state_session_request_accepted_reaction_connect_status_received(
2328         void *p_context_data, void *p_event_data)
2329 {
2330         INFO_MSG;
2331
2332         connect_status_param_s *p_connect_status = (connect_status_param_s *)
2333                         p_event_data;
2334         asp_session_s *session = (asp_session_s *)p_context_data;
2335
2336         _call_connect_status_cb(0 /*?? */ , session->session_mac, session->session_id,
2337                                 p_connect_status->status);
2338
2339         switch (p_connect_status->status) {
2340         case ASP_SESSION_CONNECT_STATUS_NETWORK_ROLE_REJECTED:
2341                 /* need to assign a proper closed_state "session->closed_state = ???; */
2342                 return SESSION_STATE_CLOSED;
2343                 break;
2344         case ASP_SESSION_CONNECT_STATUS_NO_MORE_CONNECTION:
2345                 /* need to assign a proper closed_state "session->closed_state = ???; */
2346                 return SESSION_STATE_CLOSED;
2347                 break;
2348         case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_FAILED:
2349                 /* need to assign a proper closed_state "session->closed_state = ???; */
2350                 return SESSION_STATE_CLOSED;
2351                 break;
2352         case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_COMPLETED:      /* ???? */
2353                 return SESSION_STATE_GROUP_FORMATION_COMPLETED;
2354                 break;
2355         case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_FAILED:
2356                 /* need to assign a proper closed_state "session->closed_state = ???; */
2357                 return SESSION_STATE_CLOSED;
2358                 break;
2359         case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_SENT:   /*Fall through */
2360         case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_RECEIVED:       /*Fall through */
2361         case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_DEFFERED:       /*Fall through */
2362         /*case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_STARTED:   //Fall through */
2363         case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_ACCEPTED:       /*Fall through */
2364         default:
2365                 return GFSM_DISCARD_EVENT;
2366                 break;
2367         }
2368 }
2369
2370 gfsm_state_id_t
2371 _state_session_request_accepted_reaction_session_config_request_called(
2372         void *p_context_data, void *p_event_data)
2373 {
2374         asp_session_s *session = (asp_session_s *)p_context_data;
2375         session_config_request_param_s *p_config_request_param =
2376                 (session_config_request_param_s *)p_event_data;
2377         g_assert(p_config_request_param);
2378
2379         _call_session_config_request_cb(0, session->session_mac, session->session_id,
2380                                         p_config_request_param->get_network_config_pin,
2381                                         p_config_request_param->network_config_pin);
2382
2383         if (p_config_request_param->get_network_config_pin)
2384                 return SESSION_STATE_ENTERING_PIN;
2385
2386         return GFSM_DISCARD_EVENT;
2387 }
2388
2389 gfsm_state_id_t
2390 _state_session_request_accepted_reaction_set_session_ready_called(
2391         void *p_context_data, void *p_event_data)
2392 {
2393         return GFSM_DEFER_EVENT;
2394 }
2395
2396 void _state_entering_pin_entry_action(void *p_context_data)
2397 {
2398         /*start_timer */
2399 }
2400
2401 void _state_entering_pin_exit_action(void *p_context_data)
2402 {
2403         /*stop_timer */
2404 }
2405
2406 gfsm_state_id_t _state_entering_pin_reaction_confirm_session_called(
2407         void *p_context_data, void *p_event_data)
2408 {
2409 #ifdef HAVE_ASP_P2P_CONN
2410         asp_session_s *session = (asp_session_s *)p_context_data;
2411 #endif
2412         confirm_session_param_s *p_confirm_session = (confirm_session_param_s *)
2413                         p_event_data;
2414         g_assert(p_confirm_session);
2415
2416 #ifdef HAVE_ASP_P2P_CONN
2417         asp_p2p_conn_confirm_session(session->session_mac, session->session_id,
2418                                      p_confirm_session->confirmed, p_confirm_session->pin);
2419 #endif
2420
2421         if (p_confirm_session->confirmed)
2422                 return SESSION_STATE_SESSION_REQUEST_ACCEPTED;
2423         else {
2424                 /* need to assign a proper closed_state "session->closed_state = ???; */
2425                 return SESSION_STATE_CLOSED;
2426         }
2427 }
2428
2429 void _state_group_formation_completed_entry_action(void *p_context_data)
2430 {
2431         /*_start_timer(...); */
2432         INFO_MSG;
2433 }
2434
2435 void _state_group_formation_completed_exit_action(void *p_context_data)
2436 {
2437         /*_stop_timer(...); */
2438 }
2439
2440 gfsm_state_id_t _state_group_formation_completed_reaction_ip_assigned(
2441         void *p_context_data, void *p_event_data)
2442 {
2443         INFO_MSG;
2444         gfsm_state_id_t ret_state = GFSM_DISCARD_EVENT;
2445
2446         asp_session_s *session = (asp_session_s *)p_context_data;
2447         g_assert(session);
2448
2449         ip_assigned_param_s *p_ip_assigned_param = (ip_assigned_param_s *)p_event_data;
2450         g_assert(p_ip_assigned_param);
2451
2452         ASP_LOGD("peer IP %s", p_ip_assigned_param->peer_ip_addr);
2453         _store_peer_ip_addr(session, p_ip_assigned_param->peer_ip_addr,
2454                             p_ip_assigned_param->length);
2455         if (session->asp_role == ASP_ROLE_SEEKER)
2456                 ret_state = SESSION_STATE_REQUEST_SESSION_SENT;
2457         else
2458                 ret_state = SESSION_STATE_REQUEST_SESSION_RECEIVED;
2459
2460         return ret_state;
2461 }
2462
2463 gfsm_state_id_t
2464 _state_group_formation_completed_reaction_request_session_received(
2465         void *p_context_data, void *p_event_data)
2466 {
2467         INFO_MSG;
2468
2469         /*_call_session_request_cb does not need to be called because this is over-p2p case. */
2470
2471         return SESSION_STATE_REQUEST_SESSION_RECEIVED;
2472 }
2473
2474 gfsm_state_id_t
2475 _state_group_formation_completed_reaction_set_session_ready_called(
2476         void *p_context_data, void *p_event_data)
2477 {
2478         INFO_MSG;
2479         return GFSM_DEFER_EVENT;
2480 }
2481
2482 void _state_l2connected_entry_action(void *p_context_data)
2483 {
2484         INFO_MSG;
2485
2486         asp_session_s *session = (asp_session_s *)p_context_data;
2487
2488         asp_sess_peer_add_session(session->sock_addr, session->session_mac,
2489                                   session->session_id); /* into running state */
2490 }
2491
2492 void _state_l2connected_exit_action(void *p_context_data)
2493 {
2494 }
2495
2496 gfsm_state_id_t _state_l2connected_reaction_close_session_called(
2497         void *p_context_data, void *p_event_data)
2498 {
2499         INFO_MSG;
2500
2501         guint8 *close_reason = (guint8 *) p_event_data;
2502         asp_session_s *session = (asp_session_s *)p_context_data;
2503
2504         _send_remove_session(session, *close_reason);
2505
2506         return SESSION_STATE_REMOVE_SESSION_SENT;
2507 }
2508
2509 gfsm_state_id_t _state_l2connected_reaction_remove_session_received(
2510         void *p_context_data, void *p_event_data)
2511 {
2512         INFO_MSG;
2513
2514         /*guint8 remove_reason = *((guint8*)p_event_data); */
2515         asp_session_s *session = (asp_session_s *)p_context_data;
2516         session->closed_state = ASP_SESSION_CLOSED_STATE_REMOTE_CLOSE;
2517
2518         return SESSION_STATE_CLOSED;
2519 }
2520
2521 gfsm_state_id_t _state_l2connected_reaction_peer_destroyed(void *p_context_data,
2522                 void *p_event_data)
2523 {
2524         INFO_MSG;
2525
2526         return SESSION_STATE_CLOSED;
2527 }
2528
2529 void _state_request_session_sent_entry_action(void *p_context_data)
2530 {
2531         INFO_MSG;
2532
2533         asp_session_s *session = (asp_session_s *)p_context_data;
2534
2535         if (!session->over_p2p)
2536                 _call_connect_status_cb(0, session->session_mac, session->session_id,
2537                                 ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_SENT);
2538 }
2539
2540 void _state_request_session_sent_exit_action(void *p_context_data)
2541 {
2542 }
2543
2544 gfsm_state_id_t _state_request_session_sent_reaction_added_session_received(
2545         void *p_context_data, void *p_event_data)
2546 {
2547         INFO_MSG;
2548
2549         return SESSION_STATE_OPEN;
2550 }
2551
2552 gfsm_state_id_t _state_request_session_sent_reaction_deferred_session_received(
2553         void *p_context_data, void *p_event_data)
2554 {
2555
2556         INFO_MSG;
2557
2558         asp_session_s *session = (asp_session_s *)p_context_data;
2559
2560         _call_connect_status_cb(0, session->session_mac, session->session_id,
2561                                 ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_DEFFERED);
2562
2563         return GFSM_DISCARD_EVENT;
2564 }
2565
2566 gfsm_state_id_t _state_request_session_sent_reaction_rejected_session_received(
2567         void *p_context_data, void *p_event_data)
2568 {
2569         INFO_MSG;
2570
2571         asp_session_s *session = (asp_session_s *)p_context_data;
2572         session->closed_state = ASP_SESSION_CLOSED_STATE_REMOTE_CLOSE;
2573
2574         return SESSION_STATE_CLOSED;
2575 }
2576
2577 gfsm_state_id_t _state_request_session_sent_reaction_timeout(
2578         void *p_context_data, void *p_event_data)
2579 {
2580         INFO_MSG;
2581
2582         guint8 *remove_reason = (guint8 *) p_event_data;
2583         asp_session_s *session = (asp_session_s *)p_context_data;
2584
2585         _send_remove_session(session, *remove_reason);
2586
2587         return SESSION_STATE_REMOVE_SESSION_SENT;
2588 }
2589
2590 void _state_request_session_received_entry_action(void *p_context_data)
2591 {
2592         INFO_MSG;
2593
2594         asp_session_s *session = (asp_session_s *)p_context_data;
2595         g_assert(session);
2596         if (session->over_p2p && session->confirmed &&
2597                         session->asp_role == ASP_ROLE_ADVERTIZER) {
2598                 /* TODO: Set Session should done after this  event */
2599         } else {
2600                 /* session_request_cb */
2601                 /* what is user data ? */
2602                 _call_session_status_cb(0, session->session_mac, session->session_id,
2603                                         ASP_SESSION_CLOSED_STATE_NONE);
2604                 _call_connect_status_cb(0, session->session_mac, session->session_id,
2605                                         ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_RECEIVED);
2606         }
2607 }
2608
2609 void _state_request_session_received_exit_action(void *p_context_data)
2610 {
2611 }
2612
2613 gfsm_state_id_t
2614 _state_request_session_received_reaction_set_session_ready_called(
2615         void *p_context_data, void *p_event_data)
2616 {
2617         INFO_MSG;
2618
2619         asp_session_s *session = (asp_session_s *)p_context_data;
2620
2621         _send_added_session(session);
2622
2623         return SESSION_STATE_OPEN;
2624 }
2625
2626 gfsm_state_id_t _state_request_session_received_reaction_defer_session_called(
2627         void *p_context_data, void *p_event_data)
2628 {
2629         INFO_MSG;
2630
2631         defer_session_param_s *defer_session_param = (defer_session_param_s *)
2632                         p_event_data;
2633         asp_session_s *session = (asp_session_s *)p_context_data;
2634
2635         _send_deferred_session(session, defer_session_param->deferred_response,
2636                                defer_session_param->length);
2637
2638         _call_connect_status_cb(0, session->session_mac, session->session_id,
2639                                 ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_DEFFERED);
2640
2641         return GFSM_DISCARD_EVENT;
2642 }
2643
2644 gfsm_state_id_t _state_request_session_received_reaction_confirm_session_called(
2645         void *p_context_data, void *p_event_data)
2646 {
2647         INFO_MSG;
2648
2649         asp_session_s *session = (asp_session_s *)p_context_data;
2650         confirm_session_param_s *p_confirmed_param = (confirm_session_param_s *)
2651                         p_event_data;
2652
2653         if (FALSE == p_confirmed_param->confirmed) {
2654                 _send_reject_session(session);
2655
2656                 return SESSION_STATE_REJECT_SESSION_SENT;
2657         } else {
2658                 _call_connect_status_cb(0, session->session_mac, session->session_id,
2659                                         ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_ACCEPTED);
2660                 /* set_session_ready will be called soon */
2661         }
2662
2663         return GFSM_DISCARD_EVENT;
2664 }
2665
2666 void _state_open_entry_action(void *p_context_data)
2667 {
2668         INFO_MSG;
2669
2670         asp_session_s *session = (asp_session_s *)p_context_data;
2671         _call_session_status_cb(0, session->session_mac, session->session_id,
2672                                 ASP_SESSION_CLOSED_STATE_NONE);
2673 }
2674
2675 void _state_open_exit_action(void *p_context_data)
2676 {
2677 }
2678
2679 gfsm_state_id_t _state_open_reaction_bound_port_called(void *p_context_data,
2680                 void *p_event_data)
2681 {
2682         INFO_MSG;
2683
2684         bound_port_param_s *bound_port_param = (bound_port_param_s *)p_event_data;
2685         asp_session_s *session = (asp_session_s *)p_context_data;
2686
2687         if (_send_allowed_port(session, bound_port_param->local_port,
2688                                bound_port_param->proto)) {
2689                 /* error code?, user data? */
2690                 _call_port_status_cb(0, session->session_mac, session->session_id,
2691                                      bound_port_param->local_ip, bound_port_param->local_port,
2692                                      bound_port_param->proto, ASP_SESSION_PORT_STATUS_LOCAL_PORT_ALLOWED);
2693         } else {
2694                 /* error code?, user data? */
2695                 _call_port_status_cb(0, session->session_mac, session->session_id,
2696                                      bound_port_param->local_ip, bound_port_param->local_port,
2697                                      bound_port_param->proto, ASP_SESSION_PORT_STATUS_LOCAL_PORT_BLOCKED);
2698
2699                 /* session close? */
2700                 /* what event/state is proper? this is temporary */
2701         }
2702
2703         /* what event/state is proper? this is temporary */
2704         return GFSM_DISCARD_EVENT;
2705 }
2706
2707 gfsm_state_id_t _state_open_reaction_allowed_port_received(void *p_context_data,
2708                 void *p_event_data)
2709 {
2710         INFO_MSG;
2711
2712         asp_allowed_port_s *p_allowed_port = (asp_allowed_port_s *)p_event_data;
2713
2714         asp_session_s *session = _get_exist_session(p_allowed_port->session_id,
2715                                  p_allowed_port->session_mac);
2716         g_assert(session);
2717
2718         /* how to get error code ? */
2719         /* how to deside port status of remote ? */
2720         _call_port_status_cb(0, p_allowed_port->session_mac, p_allowed_port->session_id,
2721                              session->peer_ip, p_allowed_port->port, p_allowed_port->proto,
2722                              ASP_SESSION_PORT_STATUS_REMOTE_PORT_ALLOWED);
2723
2724         return GFSM_DISCARD_EVENT;
2725 }
2726
2727 void _state_reject_session_sent_entry_action(void *p_context_data)
2728 {
2729         INFO_MSG;
2730
2731         /*    asp_session_s* session = (asp_session_s*)p_context_data; */
2732 }
2733
2734 void _state_reject_session_sent_exit_action(void *p_context_data)
2735 {
2736 }
2737
2738 gfsm_state_id_t _state_reject_session_sent_reaction_ack_received(
2739         void *p_context_data, void *p_event_data)
2740 {
2741         INFO_MSG;
2742
2743         asp_session_s *session = (asp_session_s *)p_context_data;
2744         session->closed_state = ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE;
2745
2746         return SESSION_STATE_CLOSED;
2747 }
2748
2749 gfsm_state_id_t _state_reject_session_sent_reaction_nack_received(
2750         void *p_context_data, void *p_event_data)
2751 {
2752         INFO_MSG;
2753
2754         asp_session_s *session = (asp_session_s *)p_context_data;
2755         session->closed_state = ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE;
2756
2757         return SESSION_STATE_CLOSED;
2758 }
2759
2760 void _state_remove_session_sent_entry_action(void *p_context_data)
2761 {
2762         INFO_MSG;
2763
2764         /*asp_session_s* session = (asp_session_s*)p_context_data; */
2765 }
2766
2767 void _state_remove_session_sent_exit_action(void *p_context_data)
2768 {
2769 }
2770
2771 gfsm_state_id_t _state_remove_session_sent_reaction_ack_received(
2772         void *p_context_data, void *p_event_data)
2773 {
2774         INFO_MSG;
2775
2776         asp_session_s *session = (asp_session_s *)p_context_data;
2777         session->closed_state = ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE;
2778
2779         return SESSION_STATE_CLOSED;
2780 }
2781
2782 gfsm_state_id_t _state_remove_session_sent_reaction_nack_received(
2783         void *p_context_data, void *p_event_data)
2784 {
2785         INFO_MSG;
2786
2787         asp_session_s *session = (asp_session_s *)p_context_data;
2788         session->closed_state = ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE;
2789
2790         return SESSION_STATE_CLOSED;
2791 }
2792
2793 static gfsm_state_id_t _state_remove_session_sent_reaction_peer_destroyed(
2794                 void *p_context_data, void *p_event_data)
2795 {
2796         INFO_MSG;
2797
2798         asp_session_s *session = (asp_session_s *)p_context_data;
2799         session->closed_state = ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE;
2800
2801         return SESSION_STATE_CLOSED;
2802 }