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