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