2 * Copyright (c) 2016 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 /*****************************************************************************
19 *****************************************************************************/
22 /*#include <string.h> */
23 /*#include <time.h> */
25 #define HAVE_ASP_P2P_CONN
27 /*****************************************************************************
29 *****************************************************************************/
30 /*#include <dlog.h> */
33 #ifdef HAVE_ASP_P2P_CONN
34 #include "asp-p2p-conn.h"
37 /*****************************************************************************
38 * Application Service Platform Daemon headers
39 *****************************************************************************/
40 #include "asp-manager.h"
41 #include "asp-manager-util.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"
48 /*****************************************************************************
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"
61 #define ASP_SESSION_HEADER "SESSION_FSM"
63 typedef enum asp_role {
69 typedef struct asp_session {
70 /* Can be used as session argument from below */
71 gfsm_context_s *context;
73 guint8 session_mac[MAC_ADDRESS_LEN]; /* the MAC address of the P2P device that generated the 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 */
84 gchar additional_info[SESSION_STATUS_ADDITIONAL_INFO_LEN];
87 typedef struct session_request_cb {
88 asp_session_session_request_cb cb;
90 } session_request_cb_s;
92 typedef struct session_config_request_cb {
93 asp_session_session_config_request_cb cb;
95 } session_config_request_cb_s;
97 typedef struct connect_status_cb {
98 asp_session_connect_status_cb cb;
100 } connect_status_cb_s;
102 typedef struct port_status_cb {
103 asp_session_port_status_cb cb;
107 typedef struct session_status_cb {
108 asp_session_session_status_cb cb;
110 } session_status_cb_s;
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;
120 typedef struct asp_session_key {
122 guint8 session_mac[MAC_ADDRESS_LEN];
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];
130 guint8 network_config;
131 } connect_session_param_s;
133 typedef struct defer_session_param {
134 guint8 deferred_response[ASP_DEFER_RESPONSE_BYTE_MAX];
136 } defer_session_param_s;
138 typedef struct confirm_session_param {
141 } confirm_session_param_s;
143 typedef struct bound_port_param {
144 gchar local_ip[ASP_SESSION_IPV4_STR_LEN];
147 } bound_port_param_s;
149 typedef struct session_request_param {
151 guint32 advertisement_id;
152 gchar device_name[ASP_MAX_DEVICE_NAME_LEN + 1];
154 guint8 session_info[ASP_SESSION_INFO_BYTE_MAX];
158 } session_request_param_s;
160 typedef struct connect_status_param {
161 asp_session_connect_status_e status;
162 char deferred_resp[ASP_DEFER_RESPONSE_BYTE_MAX];
164 } connect_status_param_s;
166 typedef struct session_config_request_param {
167 gboolean get_network_config_pin;
168 guint32 network_config_pin;
169 } session_config_request_param_s;
171 typedef struct ip_assigned_param {
172 char peer_ip_addr[ASP_SESSION_IPV4_STR_LEN];
174 } ip_assigned_param_s;
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,
190 SESSION_STATE_REQUEST_SESSION_RECEIVED,
191 SESSION_STATE_REJECT_SESSION_SENT,
192 SESSION_STATE_REMOVE_SESSION_SENT,
194 } asp_session_state_e;
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,
204 SESSION_EVENT_SESSION_REQUEST_CALLED,
205 SESSION_EVENT_SESSION_CONFIG_REQUEST_CALLED,
206 SESSION_EVENT_CONNECT_STATUS_CALLED,
207 SESSION_EVENT_IP_ASSIGNED,
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,
218 SESSION_EVENT_PEER_DESTROYED,
219 SESSION_EVENT_TIMEOUT,
220 SESSION_EVENT_DELETE_SESSION,
223 } asp_session_event_e;
225 /*****************************************************************************
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];
233 static guint16 g_asp_cordination_port = 7235;
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;
253 /*****************************************************************************
254 * Local Functions Declaration
255 *****************************************************************************/
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,
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,
270 static gboolean _send_ack(GSocketAddress *sock_addr, guint8 seq_num);
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,
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,
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,
300 #ifdef HAVE_ASP_P2P_CONN
301 static guint8 *_get_peer_mac(asp_session_s *session);
304 static gpointer _asp_session_dup_reqeust_session(gpointer p_msg);
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);
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);
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,
334 void _p2p_conn_connect_status_cb(gint32 error_code, const guint8 *session_mac,
335 guint32 session_id, asp_session_connect_status_e status, gpointer user_data);
336 void _p2p_conn_ip_assigned_cb(gint32 error_code, const guint8 *session_mac,
337 guint32 session_id, const guint8 *service_mac, gchar *peer_ip_addr, gint32 ip_length,
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);
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);
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,
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);
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);
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);
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);
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);
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);
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);
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);
473 /*****************************************************************************
475 *****************************************************************************/
477 gboolean asp_session_initialize()
481 #ifdef HAVE_ASP_P2P_CONN
482 asp_p2p_conn_get_p2p_mac(g_my_p2p_mac);
485 asp_sess_peer_init();
487 sessionTree = g_tree_new_full((GCompareDataFunc) _session_tree_compare_func,
488 NULL, (GDestroyNotify) _session_tree_key_destoryed,
489 (GDestroyNotify) _session_tree_value_destoryed);
491 g_assert(sessionTree);
493 _asp_session_fsm_init();
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;
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,
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);
518 gboolean asp_session_deinitialize()
522 asp_sess_peer_destroy();
524 g_tree_destroy(sessionTree);
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;
538 _asp_session_fsm_terminate();
540 #ifdef HAVE_ASP_P2P_CONN
541 asp_p2p_conn_deinitialize();
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)
554 memcpy(session_mac, g_my_p2p_mac, MAC_ADDRESS_LEN);
557 *p_session_id = _alloc_session_id();
558 } while (_get_exist_session(*p_session_id, session_mac) != NULL);
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 */
565 connect_session_param_s *p_connect_session = (connect_session_param_s *)
566 g_malloc(sizeof(connect_session_param_s));
568 memcpy(p_connect_session->service_mac, service_mac, MAC_ADDRESS_LEN);
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);
574 p_connect_session->info_length = 0;
575 p_connect_session->network_role = network_role;
576 p_connect_session->network_config = network_config;
578 gfsm_process_event(&(session->context),
579 gfsm_create_event(SESSION_EVENT_CONNECT_SESSION_CALLED, p_connect_session,
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)
591 memcpy(session_mac, g_my_p2p_mac, MAC_ADDRESS_LEN);
594 *p_session_id = _alloc_session_id();
595 } while (_get_exist_session(*p_session_id, session_mac) != NULL);
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 */
602 connect_session_param_s *p_connect_session = (connect_session_param_s *)
603 g_malloc(sizeof(connect_session_param_s));
605 memset(p_connect_session->service_mac, 0, MAC_ADDRESS_LEN);
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);
611 p_connect_session->info_length = 0;
612 p_connect_session->network_role = 0;
613 p_connect_session->network_config = 0;
615 gfsm_process_event(&(session->context),
616 gfsm_create_event(SESSION_EVENT_CONNECT_SESSION_CALLED, p_connect_session,
622 gboolean asp_session_defer_session(guint8 *session_mac, guint32 session_id,
623 guint8 *deferred_response, size_t length)
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));
633 defer_session_param->length = length;
634 memcpy(defer_session_param->deferred_response, deferred_response, MIN(length,
635 ASP_DEFER_RESPONSE_BYTE_MAX));
637 gfsm_process_event(&(session->context),
638 gfsm_create_event(SESSION_EVENT_DEFER_SESSION_CALLED, defer_session_param,
644 gboolean asp_session_confirm_session(const guint8 *session_mac,
645 guint32 session_id, gboolean confirmed, guint32 pin)
649 asp_session_s *session = _get_exist_session(session_id, session_mac);
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;
658 gfsm_process_event(&(session->context),
659 gfsm_create_event(SESSION_EVENT_CONFIRM_SESSION_CALLED, confirmed_param,
665 gboolean asp_session_set_session_ready(const guint8 *session_mac,
670 asp_session_s *session = _get_exist_session(session_id, session_mac);
673 gfsm_process_event(&(session->context),
674 gfsm_create_event(SESSION_EVENT_SET_SESSION_READY_CALLED, NULL, NULL));
679 gboolean asp_session_close_session(guint8 *session_mac, guint32 session_id,
680 asp_remove_session_reason_e reason)
684 asp_session_s *session = _get_exist_session(session_id, session_mac);
687 guint8 *close_reason = (guint8 *) g_malloc(sizeof(guint8));
688 *close_reason = (guint8) reason;
690 gfsm_process_event(&(session->context),
691 gfsm_create_event(SESSION_EVENT_CLOSE_SESSION_CALLED, close_reason, g_free));
696 gboolean asp_session_bound_port(guint8 *session_mac, guint32 session_id,
697 const gchar *local_ip, guint16 local_port, guint8 protocol)
701 asp_session_s *session = _get_exist_session(session_id, session_mac);
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;
710 gfsm_process_event(&(session->context),
711 gfsm_create_event(SESSION_EVENT_BOUND_PORT_CALLED, bound_port_param, g_free));
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)
721 asp_session_s *session = _get_exist_session(session_id, session_mac);
724 /* Discard or delete previous session??? */
727 session = _new_session_from_session_request(session_mac, session_id,
731 session_request_param_s *p_param = (session_request_param_s *)g_malloc(sizeof(
732 session_request_param_s));
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;
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);
741 p_param->info_length = 0;
742 p_param->get_pin = get_pin;
745 gfsm_process_event(&(session->context),
746 gfsm_create_event(SESSION_EVENT_SESSION_REQUEST_CALLED, p_param, g_free));
750 void _p2p_conn_session_config_request_cb(gint32 error_code,
751 const guint8 *session_mac, guint32 session_id, gboolean get_pin, guint32 pin,
754 asp_session_s *session = _get_exist_session(session_id, session_mac);
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;
762 gfsm_process_event(&(session->context),
763 gfsm_create_event(SESSION_EVENT_SESSION_CONFIG_REQUEST_CALLED, p_param,
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)
771 asp_session_s *session = _get_exist_session(session_id, session_mac);
774 connect_status_param_s *p_param = (connect_status_param_s *)g_malloc(sizeof(
775 connect_status_param_s));
776 p_param->status = status;
779 gfsm_process_event(&(session->context),
780 gfsm_create_event(SESSION_EVENT_CONNECT_STATUS_CALLED, p_param, g_free));
784 void _p2p_conn_ip_assigned_cb(gint32 error_code, const guint8 *session_mac,
785 guint32 session_id, const guint8 *service_mac, gchar *peer_ip_addr, gint32 ip_length,
790 asp_session_s *session = _get_exist_session(session_id, session_mac);
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;
798 ASP_LOGD("%s %zu", p_param->peer_ip_addr, p_param->length);
799 gfsm_process_event(&(session->context),
800 gfsm_create_event(SESSION_EVENT_IP_ASSIGNED, p_param, g_free));
804 gboolean asp_session_set_session_request_cb(asp_session_session_request_cb cb,
809 session_cb_v_table.session_request.cb = cb;
810 session_cb_v_table.session_request.user_data = user_data;
814 gboolean asp_session_set_session_config_request_cb(
815 asp_session_session_config_request_cb cb, gpointer user_data)
819 session_cb_v_table.session_config_request.cb = cb;
820 session_cb_v_table.session_config_request.user_data = user_data;
824 gboolean asp_session_set_connect_status_cb(asp_session_connect_status_cb cb,
829 session_cb_v_table.connect_status.cb = cb;
830 session_cb_v_table.connect_status.user_data = user_data;
834 gboolean asp_session_set_session_status_cb(asp_session_session_status_cb cb,
839 session_cb_v_table.session_status.cb = cb;
840 session_cb_v_table.session_status.user_data = user_data;
844 gboolean asp_session_set_port_status_cb(asp_session_port_status_cb cb,
849 session_cb_v_table.port_status.cb = cb;
850 session_cb_v_table.port_status.user_data = user_data;
854 gboolean asp_session_get_advertisement_mac(const guint8 *session_mac,
855 guint32 session_id, guint8 **adv_mac)
859 asp_session_s *session = _get_exist_session(session_id, session_mac);
862 *adv_mac = session->service_mac;
867 gboolean asp_session_get_advertisement_id(const guint8 *session_mac,
868 guint32 session_id, guint32 *advertisement_id)
872 asp_session_s *session = _get_exist_session(session_id, session_mac);
875 *advertisement_id = session->advertisement_id;
880 gboolean asp_session_get_state(guint8 *session_mac, guint32 session_id,
881 asp_session_status_e *state)
885 *state = _get_session_state(session_mac, session_id);
890 gboolean asp_session_get_peer_endpoint(guint8 *session_mac, guint32 session_id,
891 gchar *peer_ip, guint16 *port)
895 asp_session_s *session = _get_exist_session(session_id, session_mac);
898 g_strlcpy(peer_ip, session->peer_ip, ASP_SESSION_IPV4_STR_LEN);
900 *port = g_asp_cordination_port;
905 void asp_session_recv_req(GSocketAddress *sock_addr, gpointer p_msg)
909 asp_request_header_s *p_header = (asp_request_header_s *)p_msg;
911 ASP_LOGD("%s asp_session_recv_req(), opcode:%d", ROLE, p_header->opcode);
913 asp_session_s *session = _get_exist_session(p_header->session_id,
914 p_header->session_mac);
917 ASP_OPCODE_REQUEST_SESSION != p_header->opcode) {
919 /* NACK shall be sent */
920 _send_nack(sock_addr, p_header->seq_num, ASP_NACK_REASON_NO_SESSION_EXIST);
924 if (session && session->over_p2p && session->sock_addr == NULL) {
925 ASP_LOGD("IpAssigned signal isn't yet received, discard event");
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);
934 /* how to handle a case of that a same session is exist in Tree */
936 session = _new_session_by_request_session(sock_addr, peer_ip, p_msg);
938 g_strlcpy(session->additional_info, SESSION_STATUS_ADDITIONAL_INFO_PD,
939 SESSION_STATUS_ADDITIONAL_INFO_LEN);
942 _send_ack(sock_addr, p_header->seq_num);
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));
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));
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));
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));
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));
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));
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 */
989 void asp_session_recv_ack(GSocketAddress *sock_addr, guint8 *session_mac,
990 guint32 session_id, gpointer p_msg)
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);
999 gfsm_process_event(&(session->context),
1000 gfsm_create_event(SESSION_EVENT_ACK_RECEIVED, NULL, NULL));
1003 void asp_session_recv_nack(GSocketAddress *sock_addr, guint8 *session_mac,
1004 guint32 session_id, gpointer data)
1008 asp_session_s *session = _get_exist_session(session_id, session_mac);
1011 gfsm_process_event(&(session->context),
1012 gfsm_create_event(SESSION_EVENT_NACK_RECEIVED, NULL, NULL));
1015 void asp_session_peer_destroyed(guint8 *session_mac, guint32 session_id)
1019 /*_remove_session(session_mac, session_id); */
1020 asp_session_s *session = _get_exist_session(session_id, session_mac);
1022 if (session == NULL) {
1023 ASP_LOGE("session [%u] already destroyed", session_id);
1027 gfsm_process_event(&(session->context),
1028 gfsm_create_event(SESSION_EVENT_PEER_DESTROYED, NULL, NULL));
1031 /*****************************************************************************
1032 * Local Function Definition
1033 *****************************************************************************/
1035 gboolean _send_request_session(asp_session_s *session, guint8 *session_info,
1036 size_t session_info_len)
1040 asp_request_session_s request_session_data;
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;
1047 request_session_data.session_information_length = MIN(ASP_SESSION_INFO_BYTE_MAX,
1049 memcpy(request_session_data.session_information, session_info,
1052 request_session_data.session_information_length = 0;
1054 return asp_sess_peer_send_msg(session->sock_addr,
1055 (void *)&request_session_data);
1058 gboolean _send_remove_session(asp_session_s *session, guint8 remove_reason)
1062 asp_remove_session_s remove_session_data;
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;
1069 return asp_sess_peer_send_msg(session->sock_addr, (void *)&remove_session_data);
1072 gboolean _send_reject_session(asp_session_s *session)
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,
1080 rejected_session_data.session_id = session->session_id;
1082 return asp_sess_peer_send_msg(session->sock_addr,
1083 (void *)&rejected_session_data);
1086 gboolean _send_added_session(asp_session_s *session)
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;
1095 return asp_sess_peer_send_msg(session->sock_addr, (void *)&add_session_data);
1098 gboolean _send_deferred_session(asp_session_s *session,
1099 guint8 *deferred_response, size_t length)
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,
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,
1112 return asp_sess_peer_send_msg(session->sock_addr,
1113 (void *)&deferred_session_data);
1116 gboolean _send_allowed_port(asp_session_s *session, guint16 port,
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;
1128 return asp_sess_peer_send_msg(session->sock_addr, (void *)&allowed_port_data);
1131 gboolean _send_nack(GSocketAddress *sock_addr, guint8 seq_num, guint8 reason)
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;
1140 return asp_sess_peer_send_msg(sock_addr, (void *)&nack_data);
1143 gboolean _send_ack(GSocketAddress *sock_addr, guint8 seq_num)
1147 asp_nack_s ack_data;
1148 ack_data.opcode = ASP_OPCODE_ACK;
1149 ack_data.seq_num = seq_num;
1151 return asp_sess_peer_send_msg(sock_addr, (void *)&ack_data);
1154 void _session_tree_value_destoryed(gpointer data)
1158 asp_session_s *session = (asp_session_s *)data;
1160 /* destroy gfsm context */
1161 /*gfsm_destroy_context(session->context); */
1163 if (session->sock_addr) {
1164 g_object_unref(session->sock_addr);
1165 session->sock_addr = NULL;
1172 void _session_tree_key_destoryed(gpointer data)
1174 asp_session_key_s *key = (asp_session_key_s *)data;
1179 gint _session_tree_compare_func(gconstpointer a, gconstpointer b)
1181 asp_session_key_s *s1 = (asp_session_key_s *)a;
1182 asp_session_key_s *s2 = (asp_session_key_s *)b;
1184 /* ascending sort */
1185 if (s1->session_id != s2->session_id)
1186 return s1->session_id - s2->session_id;
1188 return memcmp(s1->session_mac, s2->session_mac, MAC_ADDRESS_LEN);
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,
1198 if (NULL == session_cb_v_table.session_request.cb) {
1199 /* a callback have not been registered yet */
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);
1208 void _call_session_config_request_cb(gint32 error_code, guint8 *session_mac,
1209 guint32 session_id, gboolean get_pin, guint32 pin)
1213 if (NULL == session_cb_v_table.session_config_request.cb) {
1214 /* a callback have not been registered yet */
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);
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)
1228 if (NULL == session_cb_v_table.port_status.cb) {
1229 /* a callback have not been registered yet */
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);
1237 void _call_session_status_cb(gint32 error_code, guint8 *session_mac,
1238 guint32 session_id, asp_session_closed_state_e closed_state)
1242 g_assert(session_cb_v_table.session_status.cb);
1244 asp_session_s *session = _get_exist_session(session_id, session_mac);
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);
1252 void _call_connect_status_cb(gint32 error_code, guint8 *session_mac,
1253 guint32 session_id, asp_session_connect_status_e status)
1257 g_assert(session_cb_v_table.session_status.cb);
1259 asp_session_s *session = _get_exist_session(session_id, session_mac);
1262 /* temporary code */
1263 /*what is deferred_resp ? */
1264 guint8 *deferred_resp = NULL;
1266 /* temporary code */
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);
1272 gpointer _asp_session_dup_reqeust_session(gpointer p_msg)
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;
1282 gpointer _asp_session_dup_added_session(gpointer p_msg)
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;
1289 gpointer _asp_session_dup_rejected_session(gpointer p_msg)
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;
1296 gpointer _asp_session_dup_remove_session(gpointer p_msg)
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;
1303 gpointer _asp_session_dup_deferred_session(gpointer p_msg)
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;
1311 gpointer _asp_session_dup_allowed_session(gpointer p_msg)
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;
1321 guint32 _alloc_session_id()
1323 static guint32 g_session_id = 0;
1324 return g_session_id++;
1327 asp_session_status_e _get_session_state(guint8 *session_mac, guint32 session_id)
1331 asp_session_status_e ret = ASP_SESSION_STATE_ERROR;
1333 asp_session_s *session = _get_exist_session(session_id, session_mac);
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;
1344 case SESSION_STATE_REQUEST_SESSION_SENT:
1345 case SESSION_STATE_SESSION_REQUEST_SENT:
1346 ret = ASP_SESSION_STATE_INITIATED;
1348 case SESSION_STATE_OPEN:
1349 case SESSION_STATE_REMOVE_SESSION_SENT:
1350 ret = ASP_SESSION_STATE_OPEN;
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;
1359 ret = ASP_SESSION_STATE_ERROR;
1362 ASP_LOGD("%s _get_session_state() session_state : %d", ROLE, ret);
1367 asp_session_s *_new_session_by_request_session(GSocketAddress *sock_addr,
1368 const gchar *peer_ip, gpointer p_msg)
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);
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);
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)
1389 asp_session_s *session = NULL;
1391 session = (asp_session_s *)g_malloc0(sizeof(asp_session_s));
1393 session->asp_role = asp_role;
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);
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;
1408 g_strlcpy(session->additional_info, SESSION_STATUS_ADDITIONAL_INFO_CO,
1409 SESSION_STATUS_ADDITIONAL_INFO_LEN);
1411 session->context = gfsm_create_context(session_fsm,
1412 _asp_session_destroy_session, session);
1414 _insert_session(session);
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)
1425 asp_session_s *session = NULL;
1427 session = (asp_session_s *)g_malloc0(sizeof(asp_session_s));
1429 memcpy(session->session_mac, session_mac, MAC_ADDRESS_LEN);
1430 session->session_id = session_id;
1432 session->asp_role = asp_role;
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);
1441 session->context = gfsm_create_context(session_fsm,
1442 _asp_session_destroy_session, session);
1444 _insert_session(session);
1449 asp_session_s *_new_session_from_session_request(const guint8 *session_mac,
1450 guint32 session_id, guint32 advertisement_id)
1454 asp_session_s *session = NULL;
1456 session = (asp_session_s *)g_malloc0(sizeof(asp_session_s));
1458 memcpy(session->session_mac, session_mac, MAC_ADDRESS_LEN);
1459 session->session_id = session_id;
1461 session->asp_role = ASP_ROLE_ADVERTIZER;
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;
1468 g_strlcpy(session->additional_info, SESSION_STATUS_ADDITIONAL_INFO_PD,
1469 SESSION_STATUS_ADDITIONAL_INFO_LEN);
1471 session->context = gfsm_create_context(session_fsm,
1472 _asp_session_destroy_session, session);
1474 _insert_session(session);
1479 void _store_peer_ip_addr(asp_session_s *session, char *peer_ip, size_t length)
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);
1486 if (session->sock_addr == NULL)
1487 ASP_LOGD("Failed to create socket IP %s", peer_ip);
1489 ASP_LOGD("Succeeded to create socket IP %s", peer_ip);
1493 #ifdef HAVE_ASP_P2P_CONN
1494 guint8 *_get_peer_mac(asp_session_s *session)
1496 if (session->asp_role == ASP_ROLE_ADVERTIZER)
1497 return session->session_mac;
1499 return session->service_mac;
1503 void _asp_session_destroy_session(void *p_context_data)
1507 asp_session_s *session = (asp_session_s *)p_context_data;
1508 _remove_session(session->session_mac, session->session_id);
1511 void _remove_session(guint8 *session_mac, guint32 session_id)
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 */
1519 asp_session_s *_get_exist_session(guint32 session_id, const guint8 *session_mac)
1521 asp_session_s *session = NULL;
1523 session = (asp_session_s *)g_tree_lookup(sessionTree,
1524 _get_session_key(session_id, session_mac));
1529 asp_session_key_s *_get_session_key(guint32 session_id,
1530 const guint8 *session_mac)
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 */
1540 void _insert_session(asp_session_s *session)
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);
1547 void _get_ip_from_socketaddress(GSocketAddress *sock_addr, gchar *peer_ip)
1549 GInetSocketAddress *inetaddr;
1550 GInetAddress *hostaddr;
1551 gchar *ip_str = NULL;
1553 inetaddr = G_INET_SOCKET_ADDRESS(sock_addr);
1554 hostaddr = g_inet_socket_address_get_address(inetaddr);
1556 ip_str = g_inet_address_to_string(hostaddr);
1557 g_strlcpy(peer_ip, ip_str, ASP_SESSION_IPV4_STR_LEN);
1559 ASP_LOGD("%s peer_ip: %s", ROLE, peer_ip);
1562 /*g_object_unref(hostaddr); */
1563 /*g_object_unref(inetaddr); */
1566 /*****************************************************************************
1567 * Local Function for state machine
1568 *****************************************************************************/
1570 const char *_asp_session_fsm_get_state_name_cb(gfsm_state_id_t state_id)
1572 const char *ret_val = NULL;
1575 case SESSION_STATE_NONE:
1576 ret_val = "SESSION_STATE_NONE";
1578 case SESSION_STATE_CLOSED:
1579 ret_val = "SESSION_STATE_CLOSED";
1581 case SESSION_STATE_RUNNING:
1582 ret_val = "SESSION_STATE_RUNNING";
1584 case SESSION_STATE_L2CONNECTING:
1585 ret_val = "SESSION_STATE_L2CONNECTING";
1587 case SESSION_STATE_SESSION_REQUEST_SENT:
1588 ret_val = "SESSION_STATE_SESSION_REQUEST_SENT";
1590 case SESSION_STATE_SESSION_REQUEST_RECEIVED:
1591 ret_val = "SESSION_STATE_SESSION_REQUEST_RECEIVED";
1593 case SESSION_STATE_SESSION_REQUEST_DEFERED:
1594 ret_val = "SESSION_STATE_SESSION_REQUEST_DEFERED";
1596 case SESSION_STATE_SESSION_REQUEST_ACCEPTED:
1597 ret_val = "SESSION_STATE_SESSION_REQUEST_ACCEPTED";
1599 case SESSION_STATE_ENTERING_PIN:
1600 ret_val = "SESSION_STATE_ENTERING_PIN";
1602 case SESSION_STATE_GROUP_FORMATION_COMPLETED:
1603 ret_val = "SESSION_STATE_GROUP_FORMATION_COMPLETED";
1605 case SESSION_STATE_L2CONNECTED:
1606 ret_val = "SESSION_STATE_L2CONNECTED";
1608 case SESSION_STATE_REQUEST_SESSION_SENT:
1609 ret_val = "SESSION_STATE_REQUEST_SESSION_SENT";
1611 case SESSION_STATE_OPEN:
1612 ret_val = "SESSION_STATE_OPEN";
1614 case SESSION_STATE_REQUEST_SESSION_RECEIVED:
1615 ret_val = "SESSION_STATE_REQUEST_SESSION_RECEIVED";
1617 case SESSION_STATE_REJECT_SESSION_SENT:
1618 ret_val = "SESSION_STATE_REJECT_SESSION_SENT";
1620 case SESSION_STATE_REMOVE_SESSION_SENT:
1621 ret_val = "SESSION_STATE_REMOVE_SESSION_SENT";
1624 ret_val = "SESSION_STATE_MAX";
1631 const char *_asp_session_gfsm_get_event_name_cb(gfsm_event_id_t event_id)
1633 const char *ret_val = NULL;
1636 case SESSION_EVENT_BOUND_PORT_CALLED:
1637 ret_val = "SESSION_EVENT_BOUND_PORT_CALLED";
1639 case SESSION_EVENT_CLOSE_SESSION_CALLED:
1640 ret_val = "SESSION_EVENT_CLOSE_SESSION_CALLED";
1642 case SESSION_EVENT_CONNECT_SESSION_CALLED:
1643 ret_val = "SESSION_EVENT_CONNECT_SESSION_CALLED";
1645 case SESSION_EVENT_CONFIRM_SESSION_CALLED:
1646 ret_val = "SESSION_EVENT_CONFIRM_SESSION_CALLED";
1648 case SESSION_EVENT_DEFER_SESSION_CALLED:
1649 ret_val = "SESSION_EVENT_DEFER_SESSION_CALLED";
1651 case SESSION_EVENT_SET_SESSION_READY_CALLED:
1652 ret_val = "SESSION_EVENT_SET_SESSION_READY_CALLED";
1654 case SESSION_EVENT_SESSION_REQUEST_CALLED:
1655 ret_val = "SESSION_EVENT_SESSION_REQUEST_CALLED";
1657 case SESSION_EVENT_SESSION_CONFIG_REQUEST_CALLED:
1658 ret_val = "SESSION_EVENT_SESSION_CONFIG_REQUEST_CALLED";
1660 case SESSION_EVENT_CONNECT_STATUS_CALLED:
1661 ret_val = "SESSION_EVENT_CONNECT_STATUS_CALLED";
1663 case SESSION_EVENT_IP_ASSIGNED:
1664 ret_val = "SESSION_EVENT_IP_ASSIGNED";
1666 case SESSION_EVENT_REMOVE_SESSION_RECEIVED:
1667 ret_val = "SESSION_EVENT_REMOVE_SESSION_RECEIVED";
1669 case SESSION_EVENT_ALLOWED_PORT_RECEIVED:
1670 ret_val = "SESSION_EVENT_ALLOWED_PORT_RECEIVED";
1672 case SESSION_EVENT_DEFERRED_SESSION_RECEIVED:
1673 ret_val = "SESSION_EVENT_DEFERRED_SESSION_RECEIVED";
1675 case SESSION_EVENT_REJECTED_SESSION_RECEIVED:
1676 ret_val = "SESSION_EVENT_REJECTED_SESSION_RECEIVED";
1678 case SESSION_EVENT_ADDED_SESSION_RECEIVED:
1679 ret_val = "SESSION_EVENT_ADDED_SESSION_RECEIVED";
1681 case SESSION_EVENT_REQUEST_SESSION_RECEIVED:
1682 ret_val = "SESSION_EVENT_REQUEST_SESSION_RECEIVED";
1684 case SESSION_EVENT_ACK_RECEIVED:
1685 ret_val = "SESSION_EVENT_ACK_RECEIVED";
1687 case SESSION_EVENT_NACK_RECEIVED:
1688 ret_val = "SESSION_EVENT_NACK_RECEIVED";
1690 case SESSION_EVENT_PEER_DESTROYED:
1691 ret_val = "SESSION_EVENT_PEER_DESTROYED";
1693 case SESSION_EVENT_TIMEOUT:
1694 ret_val = "SESSION_EVENT_TIMEOUT";
1696 case SESSION_EVENT_DELETE_SESSION:
1697 ret_val = "SESSION_EVENT_DELETE_SESSION";
1700 ret_val = "SESSION_EVENT_MAX";
1707 int _asp_session_fsm_log_func(const char *format, ...)
1711 va_start(args, format);
1712 g_vsnprintf(buffer, 255, format, args);
1715 ASP_LOGD("%s", buffer);
1721 void _asp_session_fsm_init()
1725 session_fsm = gfsm_create_fsm(SESSION_STATE_MAX, SESSION_EVENT_MAX,
1726 SESSION_STATE_NONE);
1728 session_state_none = gfsm_create_state(SESSION_STATE_NONE, session_fsm,
1729 _state_none_entry_action, _state_none_exit_action);
1730 gfsm_add_reaction(session_state_none, SESSION_EVENT_CONNECT_SESSION_CALLED,
1731 _state_none_reaction_connect_session_called);
1732 gfsm_add_reaction(session_state_none, SESSION_EVENT_REQUEST_SESSION_RECEIVED,
1733 _state_none_reaction_request_session_received);
1734 gfsm_add_reaction(session_state_none, SESSION_EVENT_SESSION_REQUEST_CALLED,
1735 _state_none_reaction_session_request_received);
1737 session_state_closed = gfsm_create_state(SESSION_STATE_CLOSED, session_fsm,
1738 _state_closed_entry_action, _state_closed_exit_action);
1739 gfsm_add_reaction(session_state_closed, SESSION_EVENT_DELETE_SESSION,
1740 _state_closed_reaction_delete_session);
1741 /*gfsm_add_reaction(&session_state_closed, SESSION_EVENT_CONNECT_SESSION_CALLED, _state_closed_reaction_connect_session_called); */
1742 /*gfsm_add_reaction(&session_state_closed, SESSION_EVENT_REQUEST_SESSION_RECEIVED, _state_closed_reaction_request_session_received); */
1743 /*gfsm_add_reaction(&session_state_closed, SESSION_EVENT_SESSION_REQUEST_CALLED, _state_closed_reaction_session_request_received); // ???? */
1745 session_state_running = gfsm_create_state(SESSION_STATE_RUNNING, session_fsm,
1746 _state_running_entry_action, _state_running_exit_action);
1748 session_state_l2connecting = gfsm_create_state(SESSION_STATE_L2CONNECTING,
1749 session_fsm, _state_l2connecting_entry_action, _state_l2connecting_exit_action);
1750 gfsm_set_parent_state(session_state_l2connecting, session_state_running);
1751 gfsm_add_reaction(session_state_l2connecting,
1752 SESSION_EVENT_CLOSE_SESSION_CALLED,
1753 _state_l2connecting_reaction_close_session_called);
1754 gfsm_add_reaction(session_state_l2connecting, SESSION_EVENT_TIMEOUT,
1755 _state_l2connecting_reaction_timeout);
1757 session_state_session_request_sent = gfsm_create_state(
1758 SESSION_STATE_SESSION_REQUEST_SENT, session_fsm,
1759 _state_session_request_sent_entry_action,
1760 _state_session_request_sent_exit_action);
1761 gfsm_set_parent_state(session_state_session_request_sent,
1762 session_state_l2connecting);
1763 gfsm_add_reaction(session_state_session_request_sent,
1764 SESSION_EVENT_CONNECT_STATUS_CALLED,
1765 _state_session_request_sent_reaction_connect_status_called);
1766 gfsm_add_reaction(session_state_session_request_sent,
1767 SESSION_EVENT_SESSION_CONFIG_REQUEST_CALLED,
1768 _state_session_request_sent_reaction_session_config_request_called);
1770 session_state_session_request_defered = gfsm_create_state(
1771 SESSION_STATE_SESSION_REQUEST_DEFERED, session_fsm,
1772 _state_session_request_defered_entry_action,
1773 _state_session_request_defered_exit_action);
1774 gfsm_set_parent_state(session_state_session_request_defered,
1775 session_state_l2connecting);
1776 gfsm_add_reaction(session_state_session_request_defered,
1777 SESSION_EVENT_CONNECT_STATUS_CALLED,
1778 _state_session_request_defered_reaction_connect_status_called);
1779 gfsm_add_reaction(session_state_session_request_defered,
1780 SESSION_EVENT_SESSION_CONFIG_REQUEST_CALLED,
1781 _state_session_request_defered_reaction_session_config_request_called);
1783 session_state_session_request_received = gfsm_create_state(
1784 SESSION_STATE_SESSION_REQUEST_RECEIVED, session_fsm,
1785 _state_session_request_received_entry_action,
1786 _state_session_request_received_exit_action);
1787 gfsm_set_parent_state(session_state_session_request_received,
1788 session_state_l2connecting);
1789 gfsm_add_reaction(session_state_session_request_received,
1790 SESSION_EVENT_CONFIRM_SESSION_CALLED,
1791 _state_session_request_received_reaction_confirm_session_called);
1793 session_state_session_request_accepted = gfsm_create_state(
1794 SESSION_STATE_SESSION_REQUEST_ACCEPTED, session_fsm,
1795 _state_session_request_accepted_entry_action,
1796 _state_session_request_accepted_exit_action);
1797 gfsm_set_parent_state(session_state_session_request_accepted,
1798 session_state_l2connecting);
1799 gfsm_add_reaction(session_state_session_request_accepted,
1800 SESSION_EVENT_CONNECT_STATUS_CALLED,
1801 _state_session_request_accepted_reaction_connect_status_received);
1802 gfsm_add_reaction(session_state_session_request_accepted,
1803 SESSION_EVENT_SESSION_CONFIG_REQUEST_CALLED,
1804 _state_session_request_accepted_reaction_session_config_request_called);
1805 gfsm_add_reaction(session_state_session_request_accepted,
1806 SESSION_EVENT_SET_SESSION_READY_CALLED,
1807 _state_session_request_accepted_reaction_set_session_ready_called);
1809 session_state_entering_pin = gfsm_create_state(SESSION_STATE_ENTERING_PIN,
1810 session_fsm, _state_entering_pin_entry_action, _state_entering_pin_exit_action);
1811 gfsm_set_parent_state(session_state_entering_pin, session_state_l2connecting);
1812 gfsm_add_reaction(session_state_entering_pin,
1813 SESSION_EVENT_CONFIRM_SESSION_CALLED,
1814 _state_entering_pin_reaction_confirm_session_called);
1816 session_state_group_formation_completed = gfsm_create_state(
1817 SESSION_STATE_GROUP_FORMATION_COMPLETED, session_fsm,
1818 _state_group_formation_completed_entry_action,
1819 _state_group_formation_completed_exit_action);
1820 gfsm_set_parent_state(session_state_group_formation_completed,
1821 session_state_l2connecting);
1822 gfsm_add_reaction(session_state_group_formation_completed,
1823 SESSION_EVENT_IP_ASSIGNED,
1824 _state_group_formation_completed_reaction_ip_assigned);
1825 gfsm_add_reaction(session_state_group_formation_completed,
1826 SESSION_EVENT_REQUEST_SESSION_RECEIVED,
1827 _state_group_formation_completed_reaction_request_session_received);
1828 gfsm_add_reaction(session_state_group_formation_completed,
1829 SESSION_EVENT_SET_SESSION_READY_CALLED,
1830 _state_group_formation_completed_reaction_set_session_ready_called);
1832 session_state_l2connected = gfsm_create_state(SESSION_STATE_L2CONNECTED,
1833 session_fsm, _state_l2connected_entry_action, _state_l2connected_exit_action);
1834 gfsm_set_parent_state(session_state_l2connected, session_state_running);
1835 gfsm_add_reaction(session_state_l2connected, SESSION_EVENT_CLOSE_SESSION_CALLED,
1836 _state_l2connected_reaction_close_session_called);
1837 gfsm_add_reaction(session_state_l2connected,
1838 SESSION_EVENT_REMOVE_SESSION_RECEIVED,
1839 _state_l2connected_reaction_remove_session_received);
1840 gfsm_add_reaction(session_state_l2connected, SESSION_EVENT_PEER_DESTROYED,
1841 _state_l2connected_reaction_peer_destroyed);
1843 session_state_request_session_sent = gfsm_create_state(
1844 SESSION_STATE_REQUEST_SESSION_SENT, session_fsm,
1845 _state_request_session_sent_entry_action,
1846 _state_request_session_sent_exit_action);
1847 gfsm_set_parent_state(session_state_request_session_sent,
1848 session_state_l2connected);
1849 gfsm_add_reaction(session_state_request_session_sent,
1850 SESSION_EVENT_ADDED_SESSION_RECEIVED,
1851 _state_request_session_sent_reaction_added_session_received);
1852 gfsm_add_reaction(session_state_request_session_sent,
1853 SESSION_EVENT_DEFERRED_SESSION_RECEIVED,
1854 _state_request_session_sent_reaction_deferred_session_received);
1855 gfsm_add_reaction(session_state_request_session_sent,
1856 SESSION_EVENT_REJECTED_SESSION_RECEIVED,
1857 _state_request_session_sent_reaction_rejected_session_received);
1858 gfsm_add_reaction(session_state_request_session_sent, SESSION_EVENT_TIMEOUT,
1859 _state_request_session_sent_reaction_timeout);
1861 session_state_request_session_received = gfsm_create_state(
1862 SESSION_STATE_REQUEST_SESSION_RECEIVED, session_fsm,
1863 _state_request_session_received_entry_action,
1864 _state_request_session_received_exit_action);
1865 gfsm_set_parent_state(session_state_request_session_received,
1866 session_state_l2connected);
1867 gfsm_add_reaction(session_state_request_session_received,
1868 SESSION_EVENT_SET_SESSION_READY_CALLED,
1869 _state_request_session_received_reaction_set_session_ready_called);
1870 gfsm_add_reaction(session_state_request_session_received,
1871 SESSION_EVENT_DEFER_SESSION_CALLED,
1872 _state_request_session_received_reaction_defer_session_called);
1873 gfsm_add_reaction(session_state_request_session_received,
1874 SESSION_EVENT_CONFIRM_SESSION_CALLED,
1875 _state_request_session_received_reaction_confirm_session_called);
1877 session_state_open = gfsm_create_state(SESSION_STATE_OPEN, session_fsm,
1878 _state_open_entry_action, _state_open_exit_action);
1879 gfsm_set_parent_state(session_state_open, session_state_l2connected);
1880 gfsm_add_reaction(session_state_open, SESSION_EVENT_BOUND_PORT_CALLED,
1881 _state_open_reaction_bound_port_called);
1882 gfsm_add_reaction(session_state_open, SESSION_EVENT_ALLOWED_PORT_RECEIVED,
1883 _state_open_reaction_allowed_port_received);
1885 session_state_reject_session_sent = gfsm_create_state(
1886 SESSION_STATE_REJECT_SESSION_SENT, session_fsm,
1887 _state_reject_session_sent_entry_action,
1888 _state_reject_session_sent_exit_action);
1889 gfsm_add_reaction(session_state_reject_session_sent, SESSION_EVENT_ACK_RECEIVED,
1890 _state_reject_session_sent_reaction_ack_received);
1891 gfsm_add_reaction(session_state_reject_session_sent,
1892 SESSION_EVENT_NACK_RECEIVED, _state_reject_session_sent_reaction_nack_received);
1894 session_state_remove_session_sent = gfsm_create_state(
1895 SESSION_STATE_REMOVE_SESSION_SENT, session_fsm,
1896 _state_remove_session_sent_entry_action,
1897 _state_remove_session_sent_exit_action);
1898 gfsm_add_reaction(session_state_remove_session_sent, SESSION_EVENT_ACK_RECEIVED,
1899 _state_remove_session_sent_reaction_ack_received);
1900 gfsm_add_reaction(session_state_remove_session_sent,
1901 SESSION_EVENT_NACK_RECEIVED, _state_remove_session_sent_reaction_nack_received);
1902 gfsm_add_reaction(session_state_remove_session_sent, SESSION_EVENT_PEER_DESTROYED,
1903 _state_remove_session_sent_reaction_peer_destroyed);
1905 gfsm_add_state(session_fsm, session_state_none);
1906 gfsm_add_state(session_fsm, session_state_closed);
1907 gfsm_add_state(session_fsm, session_state_running);
1909 gfsm_add_state(session_fsm, session_state_l2connecting);
1910 gfsm_add_state(session_fsm, session_state_session_request_sent);
1911 gfsm_add_state(session_fsm, session_state_session_request_defered);
1912 gfsm_add_state(session_fsm, session_state_session_request_received);
1913 gfsm_add_state(session_fsm, session_state_session_request_accepted);
1914 gfsm_add_state(session_fsm, session_state_group_formation_completed);
1916 gfsm_add_state(session_fsm, session_state_l2connected);
1917 gfsm_add_state(session_fsm, session_state_request_session_sent);
1918 gfsm_add_state(session_fsm, session_state_request_session_received);
1919 gfsm_add_state(session_fsm, session_state_open);
1921 gfsm_add_state(session_fsm, session_state_reject_session_sent);
1922 gfsm_add_state(session_fsm, session_state_remove_session_sent);
1924 gfsm_set_logger(session_fsm, _asp_session_fsm_log_func,
1926 _asp_session_fsm_get_state_name_cb,
1927 _asp_session_gfsm_get_event_name_cb);
1930 void _asp_session_fsm_terminate()
1932 gfsm_destroy_state(session_state_none);
1933 gfsm_destroy_state(session_state_closed);
1934 gfsm_destroy_state(session_state_running);
1935 gfsm_destroy_state(session_state_request_session_sent);
1936 gfsm_destroy_state(session_state_request_session_received);
1937 gfsm_destroy_state(session_state_open);
1938 gfsm_destroy_state(session_state_reject_session_sent);
1939 gfsm_destroy_state(session_state_remove_session_sent);
1941 gfsm_destroy_fsm(session_fsm);
1944 void _state_none_entry_action(void *p_context_data)
1949 void _state_none_exit_action(void *p_context_data)
1953 gfsm_state_id_t _state_none_reaction_request_session_received(
1954 void *p_context_data, void *p_event_data)
1957 asp_session_s *session = (asp_session_s *)p_context_data;
1958 asp_request_session_s *p_msg = (asp_request_session_s *)p_event_data;
1960 if (!session->over_p2p)
1961 _call_session_request_cb(0, session->session_mac, session->session_id,
1962 session->advertisement_id, NULL, 0, p_msg->session_information,
1963 p_msg->session_information_length, 0, 0);
1965 return SESSION_STATE_REQUEST_SESSION_RECEIVED;
1968 gfsm_state_id_t _state_none_reaction_connect_session_called(
1969 void *p_context_data, void *p_event_data)
1973 asp_session_s *session = (asp_session_s *)p_context_data;
1974 connect_session_param_s *p_connect_session = (connect_session_param_s *)
1979 if (session->over_p2p
1980 #ifdef HAVE_ASP_P2P_CONN
1981 && FALSE == asp_p2p_conn_peer_is_connected(p_connect_session->service_mac)
1984 #ifdef HAVE_ASP_P2P_CONN
1985 asp_p2p_conn_connect_session(session->session_mac, session->session_id,
1986 p_connect_session->service_mac, session->advertisement_id,
1987 p_connect_session->session_info, p_connect_session->info_length,
1988 p_connect_session->network_role, p_connect_session->network_config);
1990 return SESSION_STATE_SESSION_REQUEST_SENT;
1992 _send_request_session(session, p_connect_session->session_info,
1993 p_connect_session->info_length);
1994 return SESSION_STATE_REQUEST_SESSION_SENT;
1998 gfsm_state_id_t _state_none_reaction_session_request_received(
1999 void *p_context_data, void *p_event_data)
2003 asp_session_s *session = (asp_session_s *)p_context_data;
2004 session_request_param_s *p_session_request = (session_request_param_s *)
2007 _call_session_request_cb(0, session->session_mac, session->session_id,
2008 session->advertisement_id, p_session_request->device_name,
2009 p_session_request->name_length, p_session_request->session_info,
2010 p_session_request->info_length, p_session_request->get_pin,
2011 p_session_request->pin);
2013 return SESSION_STATE_SESSION_REQUEST_RECEIVED;
2016 void _state_closed_entry_action(void *p_context_data)
2020 asp_session_s *session = (asp_session_s *)p_context_data;
2024 _call_session_status_cb(0, session->session_mac, session->session_id,
2025 session->closed_state);
2027 asp_sess_peer_del_session(session->sock_addr, session->session_mac,
2028 session->session_id);
2030 gfsm_process_event(&(session->context),
2031 gfsm_create_event(SESSION_EVENT_DELETE_SESSION, NULL, NULL));
2034 void _state_closed_exit_action(void *p_context_data)
2038 gfsm_state_id_t _state_closed_reaction_delete_session(void *p_context_data,
2043 asp_session_s *session = (asp_session_s *)p_context_data;
2047 ASP_LOGD("context[%p]", session->context);
2048 gfsm_destroy_context(session->context);
2050 return GFSM_DISCARD_EVENT;
2054 gfsm_state_id_t _state_closed_reaction_connect_session_called(
2055 void *p_context_data, void *p_event_data)
2059 /*asp_session_s* session = (asp_session_s*)p_context_data; */
2061 /*ASP_LOGD("_state_closed_reaction_connect_session_called - session_id : %d, peer_ip:%s, peer_port:%d", session->session_id, session->peer_ip, session->peer_port); */
2063 /*_send_request_session(session); */
2065 return SESSION_STATE_REQUEST_SESSION_SENT;
2068 gfsm_state_id_t _state_closed_reaction_request_session_received(
2069 void *p_context_data, void *p_event_data)
2073 return SESSION_STATE_REQUEST_SESSION_RECEIVED;
2077 void _state_running_entry_action(void *p_context_data)
2082 void _state_running_exit_action(void *p_context_data)
2086 void _state_l2connecting_entry_action(void *p_context_data)
2091 void _state_l2connecting_exit_action(void *p_context_data)
2095 gfsm_state_id_t _state_l2connecting_reaction_close_session_called(
2096 void *p_context_data, void *p_event_data)
2100 asp_session_s *session = (asp_session_s *)p_context_data;
2102 #ifdef HAVE_ASP_P2P_CONN
2103 asp_p2p_conn_disconnect_p2p(_get_peer_mac(session));
2106 session->closed_state =
2107 ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE; /* temporary value. shall be changed */
2109 return SESSION_STATE_CLOSED;
2112 gfsm_state_id_t _state_l2connecting_reaction_timeout(void *p_context_data,
2117 asp_session_s *session = (asp_session_s *)p_context_data;
2118 #ifdef HAVE_ASP_P2P_CONN
2120 asp_p2p_conn_disconnect_p2p(_get_peer_mac(session));
2123 session->closed_state = ASP_SESSION_CLOSED_STATE_DISASSOCIATED;
2125 return SESSION_STATE_CLOSED;
2128 void _state_session_request_sent_entry_action(void *p_context_data)
2132 asp_session_s* session = (asp_session_s*)p_context_data;
2133 /*_start_timer(...); */
2134 _call_session_status_cb(0, session->session_mac, session->session_id,
2135 ASP_SESSION_CLOSED_STATE_NONE);
2138 void _state_session_request_sent_exit_action(void *p_context_data)
2140 /*_stop_timer(...); */
2143 gfsm_state_id_t _state_session_request_sent_reaction_connect_status_called(
2144 void *p_context_data, void *p_event_data)
2148 connect_status_param_s *p_connect_status = (connect_status_param_s *)
2150 asp_session_s *session = (asp_session_s *)p_context_data;
2152 _call_connect_status_cb(0 /*?? */ , session->session_mac, session->session_id,
2153 p_connect_status->status);
2155 switch (p_connect_status->status) {
2156 case ASP_SESSION_CONNECT_STATUS_NETWORK_ROLE_REJECTED:
2157 /* need to assign a proper closed_state "session->closed_state = ???; */
2158 return SESSION_STATE_CLOSED;
2160 case ASP_SESSION_CONNECT_STATUS_NO_MORE_CONNECTION:
2161 /* need to assign a proper closed_state "session->closed_state = ???; */
2162 return SESSION_STATE_CLOSED;
2164 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_ACCEPTED:
2165 return SESSION_STATE_SESSION_REQUEST_ACCEPTED;
2167 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_DEFFERED:
2168 return SESSION_STATE_SESSION_REQUEST_DEFERED;
2170 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_FAILED:
2171 /* need to assign a proper closed_state "session->closed_state = ???; */
2172 return SESSION_STATE_CLOSED;
2174 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_SENT: /*Fall through */
2175 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_RECEIVED: /*Fall through */
2176 /*case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_STARTED: */
2177 /*case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_COMPLETED: // ???? */
2178 /*case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_FAILED: */
2180 return GFSM_DISCARD_EVENT;
2186 _state_session_request_sent_reaction_session_config_request_called(
2187 void *p_context_data, void *p_event_data)
2189 asp_session_s *session = (asp_session_s *)p_context_data;
2190 session_config_request_param_s *p_config_request_param =
2191 (session_config_request_param_s *)p_event_data;
2192 g_assert(p_config_request_param);
2194 _call_session_config_request_cb(0, session->session_mac, session->session_id,
2195 p_config_request_param->get_network_config_pin,
2196 p_config_request_param->network_config_pin);
2198 if (p_config_request_param->get_network_config_pin)
2199 return SESSION_STATE_ENTERING_PIN;
2201 return GFSM_DISCARD_EVENT;
2204 void _state_session_request_defered_entry_action(void *p_context_data)
2207 /*_start_timer(...); */
2210 void _state_session_request_defered_exit_action(void *p_context_data)
2212 /*_stop_timer(...); */
2215 gfsm_state_id_t _state_session_request_defered_reaction_connect_status_called(
2216 void *p_context_data, void *p_event_data)
2220 connect_status_param_s *p_connect_status = (connect_status_param_s *)
2222 asp_session_s *session = (asp_session_s *)p_context_data;
2224 _call_connect_status_cb(0 /*?? */ , session->session_mac, session->session_id,
2225 p_connect_status->status);
2227 switch (p_connect_status->status) {
2228 case ASP_SESSION_CONNECT_STATUS_NETWORK_ROLE_REJECTED:
2229 /* need to assign a proper closed_state "session->closed_state = ???; */
2230 return SESSION_STATE_CLOSED;
2232 case ASP_SESSION_CONNECT_STATUS_NO_MORE_CONNECTION:
2233 /* need to assign a proper closed_state "session->closed_state = ???; */
2234 return SESSION_STATE_CLOSED;
2236 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_ACCEPTED:
2237 return SESSION_STATE_SESSION_REQUEST_ACCEPTED;
2239 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_FAILED:
2240 /* need to assign a proper closed_state "session->closed_state = ???; */
2241 return SESSION_STATE_CLOSED;
2243 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_SENT: /*Fall through */
2244 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_RECEIVED: /*Fall through */
2245 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_DEFFERED:
2246 /*case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_STARTED: */
2247 /*case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_COMPLETED: // ???? */
2248 /*case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_FAILED: */
2250 return GFSM_DISCARD_EVENT;
2256 _state_session_request_defered_reaction_session_config_request_called(
2257 void *p_context_data, void *p_event_data)
2259 asp_session_s *session = (asp_session_s *)p_context_data;
2260 session_config_request_param_s *p_config_request_param =
2261 (session_config_request_param_s *)p_event_data;
2262 g_assert(p_config_request_param);
2264 _call_session_config_request_cb(0, session->session_mac, session->session_id,
2265 p_config_request_param->get_network_config_pin,
2266 p_config_request_param->network_config_pin);
2268 if (p_config_request_param->get_network_config_pin)
2269 return SESSION_STATE_ENTERING_PIN;
2271 return GFSM_DISCARD_EVENT;
2274 void _state_session_request_received_entry_action(void *p_context_data)
2278 asp_session_s* session = (asp_session_s*)p_context_data;
2280 /*_start_timer(..); */
2281 _call_session_status_cb(0, session->session_mac, session->session_id,
2282 ASP_SESSION_CLOSED_STATE_NONE);
2285 void _state_session_request_received_exit_action(void *p_context_data)
2287 /*_stop_timer(..); */
2290 gfsm_state_id_t _state_session_request_received_reaction_confirm_session_called(
2291 void *p_context_data, void *p_event_data)
2295 #ifdef HAVE_ASP_P2P_CONN
2296 asp_session_s *session = (asp_session_s *)p_context_data;
2298 confirm_session_param_s *p_confirm_session = (confirm_session_param_s *)
2300 g_assert(p_confirm_session);
2302 #ifdef HAVE_ASP_P2P_CONN
2303 asp_p2p_conn_confirm_session(session->session_mac, session->session_id,
2304 p_confirm_session->confirmed, p_confirm_session->pin);
2307 if (p_confirm_session->confirmed)
2308 return SESSION_STATE_SESSION_REQUEST_ACCEPTED;
2310 /* need to assign a proper closed_state "session->closed_state = ???; */
2311 return SESSION_STATE_CLOSED;
2315 void _state_session_request_accepted_entry_action(void *p_context_data)
2318 /*_start_timer(...) */
2321 void _state_session_request_accepted_exit_action(void *p_context_data)
2323 /*_stop_timer(...) */
2327 _state_session_request_accepted_reaction_connect_status_received(
2328 void *p_context_data, void *p_event_data)
2332 connect_status_param_s *p_connect_status = (connect_status_param_s *)
2334 asp_session_s *session = (asp_session_s *)p_context_data;
2336 _call_connect_status_cb(0 /*?? */ , session->session_mac, session->session_id,
2337 p_connect_status->status);
2339 switch (p_connect_status->status) {
2340 case ASP_SESSION_CONNECT_STATUS_NETWORK_ROLE_REJECTED:
2341 /* need to assign a proper closed_state "session->closed_state = ???; */
2342 return SESSION_STATE_CLOSED;
2344 case ASP_SESSION_CONNECT_STATUS_NO_MORE_CONNECTION:
2345 /* need to assign a proper closed_state "session->closed_state = ???; */
2346 return SESSION_STATE_CLOSED;
2348 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_FAILED:
2349 /* need to assign a proper closed_state "session->closed_state = ???; */
2350 return SESSION_STATE_CLOSED;
2352 case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_COMPLETED: /* ???? */
2353 return SESSION_STATE_GROUP_FORMATION_COMPLETED;
2355 case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_FAILED:
2356 /* need to assign a proper closed_state "session->closed_state = ???; */
2357 return SESSION_STATE_CLOSED;
2359 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_SENT: /*Fall through */
2360 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_RECEIVED: /*Fall through */
2361 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_DEFFERED: /*Fall through */
2362 /*case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_STARTED: //Fall through */
2363 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_ACCEPTED: /*Fall through */
2365 return GFSM_DISCARD_EVENT;
2371 _state_session_request_accepted_reaction_session_config_request_called(
2372 void *p_context_data, void *p_event_data)
2374 asp_session_s *session = (asp_session_s *)p_context_data;
2375 session_config_request_param_s *p_config_request_param =
2376 (session_config_request_param_s *)p_event_data;
2377 g_assert(p_config_request_param);
2379 _call_session_config_request_cb(0, session->session_mac, session->session_id,
2380 p_config_request_param->get_network_config_pin,
2381 p_config_request_param->network_config_pin);
2383 if (p_config_request_param->get_network_config_pin)
2384 return SESSION_STATE_ENTERING_PIN;
2386 return GFSM_DISCARD_EVENT;
2390 _state_session_request_accepted_reaction_set_session_ready_called(
2391 void *p_context_data, void *p_event_data)
2393 return GFSM_DEFER_EVENT;
2396 void _state_entering_pin_entry_action(void *p_context_data)
2401 void _state_entering_pin_exit_action(void *p_context_data)
2406 gfsm_state_id_t _state_entering_pin_reaction_confirm_session_called(
2407 void *p_context_data, void *p_event_data)
2409 #ifdef HAVE_ASP_P2P_CONN
2410 asp_session_s *session = (asp_session_s *)p_context_data;
2412 confirm_session_param_s *p_confirm_session = (confirm_session_param_s *)
2414 g_assert(p_confirm_session);
2416 #ifdef HAVE_ASP_P2P_CONN
2417 asp_p2p_conn_confirm_session(session->session_mac, session->session_id,
2418 p_confirm_session->confirmed, p_confirm_session->pin);
2421 if (p_confirm_session->confirmed)
2422 return SESSION_STATE_SESSION_REQUEST_ACCEPTED;
2424 /* need to assign a proper closed_state "session->closed_state = ???; */
2425 return SESSION_STATE_CLOSED;
2429 void _state_group_formation_completed_entry_action(void *p_context_data)
2431 /*_start_timer(...); */
2435 void _state_group_formation_completed_exit_action(void *p_context_data)
2437 /*_stop_timer(...); */
2440 gfsm_state_id_t _state_group_formation_completed_reaction_ip_assigned(
2441 void *p_context_data, void *p_event_data)
2444 gfsm_state_id_t ret_state = GFSM_DISCARD_EVENT;
2446 asp_session_s *session = (asp_session_s *)p_context_data;
2449 ip_assigned_param_s *p_ip_assigned_param = (ip_assigned_param_s *)p_event_data;
2450 g_assert(p_ip_assigned_param);
2452 ASP_LOGD("peer IP %s", p_ip_assigned_param->peer_ip_addr);
2453 _store_peer_ip_addr(session, p_ip_assigned_param->peer_ip_addr,
2454 p_ip_assigned_param->length);
2455 if (session->asp_role == ASP_ROLE_SEEKER)
2456 ret_state = SESSION_STATE_REQUEST_SESSION_SENT;
2458 ret_state = SESSION_STATE_REQUEST_SESSION_RECEIVED;
2464 _state_group_formation_completed_reaction_request_session_received(
2465 void *p_context_data, void *p_event_data)
2469 /*_call_session_request_cb does not need to be called because this is over-p2p case. */
2471 return SESSION_STATE_REQUEST_SESSION_RECEIVED;
2475 _state_group_formation_completed_reaction_set_session_ready_called(
2476 void *p_context_data, void *p_event_data)
2479 return GFSM_DEFER_EVENT;
2482 void _state_l2connected_entry_action(void *p_context_data)
2486 asp_session_s *session = (asp_session_s *)p_context_data;
2488 asp_sess_peer_add_session(session->sock_addr, session->session_mac,
2489 session->session_id); /* into running state */
2492 void _state_l2connected_exit_action(void *p_context_data)
2496 gfsm_state_id_t _state_l2connected_reaction_close_session_called(
2497 void *p_context_data, void *p_event_data)
2501 guint8 *close_reason = (guint8 *) p_event_data;
2502 asp_session_s *session = (asp_session_s *)p_context_data;
2504 _send_remove_session(session, *close_reason);
2506 return SESSION_STATE_REMOVE_SESSION_SENT;
2509 gfsm_state_id_t _state_l2connected_reaction_remove_session_received(
2510 void *p_context_data, void *p_event_data)
2514 /*guint8 remove_reason = *((guint8*)p_event_data); */
2515 asp_session_s *session = (asp_session_s *)p_context_data;
2516 session->closed_state = ASP_SESSION_CLOSED_STATE_REMOTE_CLOSE;
2518 return SESSION_STATE_CLOSED;
2521 gfsm_state_id_t _state_l2connected_reaction_peer_destroyed(void *p_context_data,
2526 return SESSION_STATE_CLOSED;
2529 void _state_request_session_sent_entry_action(void *p_context_data)
2533 asp_session_s *session = (asp_session_s *)p_context_data;
2535 if (!session->over_p2p)
2536 _call_connect_status_cb(0, session->session_mac, session->session_id,
2537 ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_SENT);
2540 void _state_request_session_sent_exit_action(void *p_context_data)
2544 gfsm_state_id_t _state_request_session_sent_reaction_added_session_received(
2545 void *p_context_data, void *p_event_data)
2549 return SESSION_STATE_OPEN;
2552 gfsm_state_id_t _state_request_session_sent_reaction_deferred_session_received(
2553 void *p_context_data, void *p_event_data)
2558 asp_session_s *session = (asp_session_s *)p_context_data;
2560 _call_connect_status_cb(0, session->session_mac, session->session_id,
2561 ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_DEFFERED);
2563 return GFSM_DISCARD_EVENT;
2566 gfsm_state_id_t _state_request_session_sent_reaction_rejected_session_received(
2567 void *p_context_data, void *p_event_data)
2571 asp_session_s *session = (asp_session_s *)p_context_data;
2572 session->closed_state = ASP_SESSION_CLOSED_STATE_REMOTE_CLOSE;
2574 return SESSION_STATE_CLOSED;
2577 gfsm_state_id_t _state_request_session_sent_reaction_timeout(
2578 void *p_context_data, void *p_event_data)
2582 guint8 *remove_reason = (guint8 *) p_event_data;
2583 asp_session_s *session = (asp_session_s *)p_context_data;
2585 _send_remove_session(session, *remove_reason);
2587 return SESSION_STATE_REMOVE_SESSION_SENT;
2590 void _state_request_session_received_entry_action(void *p_context_data)
2594 asp_session_s *session = (asp_session_s *)p_context_data;
2596 if (session->over_p2p && session->confirmed &&
2597 session->asp_role == ASP_ROLE_ADVERTIZER) {
2598 /* TODO: Set Session should done after this event */
2600 /* session_request_cb */
2601 /* what is user data ? */
2602 _call_session_status_cb(0, session->session_mac, session->session_id,
2603 ASP_SESSION_CLOSED_STATE_NONE);
2604 _call_connect_status_cb(0, session->session_mac, session->session_id,
2605 ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_RECEIVED);
2609 void _state_request_session_received_exit_action(void *p_context_data)
2614 _state_request_session_received_reaction_set_session_ready_called(
2615 void *p_context_data, void *p_event_data)
2619 asp_session_s *session = (asp_session_s *)p_context_data;
2621 _send_added_session(session);
2623 return SESSION_STATE_OPEN;
2626 gfsm_state_id_t _state_request_session_received_reaction_defer_session_called(
2627 void *p_context_data, void *p_event_data)
2631 defer_session_param_s *defer_session_param = (defer_session_param_s *)
2633 asp_session_s *session = (asp_session_s *)p_context_data;
2635 _send_deferred_session(session, defer_session_param->deferred_response,
2636 defer_session_param->length);
2638 _call_connect_status_cb(0, session->session_mac, session->session_id,
2639 ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_DEFFERED);
2641 return GFSM_DISCARD_EVENT;
2644 gfsm_state_id_t _state_request_session_received_reaction_confirm_session_called(
2645 void *p_context_data, void *p_event_data)
2649 asp_session_s *session = (asp_session_s *)p_context_data;
2650 confirm_session_param_s *p_confirmed_param = (confirm_session_param_s *)
2653 if (FALSE == p_confirmed_param->confirmed) {
2654 _send_reject_session(session);
2656 return SESSION_STATE_REJECT_SESSION_SENT;
2658 _call_connect_status_cb(0, session->session_mac, session->session_id,
2659 ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_ACCEPTED);
2660 /* set_session_ready will be called soon */
2663 return GFSM_DISCARD_EVENT;
2666 void _state_open_entry_action(void *p_context_data)
2670 asp_session_s *session = (asp_session_s *)p_context_data;
2671 _call_session_status_cb(0, session->session_mac, session->session_id,
2672 ASP_SESSION_CLOSED_STATE_NONE);
2675 void _state_open_exit_action(void *p_context_data)
2679 gfsm_state_id_t _state_open_reaction_bound_port_called(void *p_context_data,
2684 bound_port_param_s *bound_port_param = (bound_port_param_s *)p_event_data;
2685 asp_session_s *session = (asp_session_s *)p_context_data;
2687 if (_send_allowed_port(session, bound_port_param->local_port,
2688 bound_port_param->proto)) {
2689 /* error code?, user data? */
2690 _call_port_status_cb(0, session->session_mac, session->session_id,
2691 bound_port_param->local_ip, bound_port_param->local_port,
2692 bound_port_param->proto, ASP_SESSION_PORT_STATUS_LOCAL_PORT_ALLOWED);
2694 /* error code?, user data? */
2695 _call_port_status_cb(0, session->session_mac, session->session_id,
2696 bound_port_param->local_ip, bound_port_param->local_port,
2697 bound_port_param->proto, ASP_SESSION_PORT_STATUS_LOCAL_PORT_BLOCKED);
2699 /* session close? */
2700 /* what event/state is proper? this is temporary */
2703 /* what event/state is proper? this is temporary */
2704 return GFSM_DISCARD_EVENT;
2707 gfsm_state_id_t _state_open_reaction_allowed_port_received(void *p_context_data,
2712 asp_allowed_port_s *p_allowed_port = (asp_allowed_port_s *)p_event_data;
2714 asp_session_s *session = _get_exist_session(p_allowed_port->session_id,
2715 p_allowed_port->session_mac);
2718 /* how to get error code ? */
2719 /* how to deside port status of remote ? */
2720 _call_port_status_cb(0, p_allowed_port->session_mac, p_allowed_port->session_id,
2721 session->peer_ip, p_allowed_port->port, p_allowed_port->proto,
2722 ASP_SESSION_PORT_STATUS_REMOTE_PORT_ALLOWED);
2724 return GFSM_DISCARD_EVENT;
2727 void _state_reject_session_sent_entry_action(void *p_context_data)
2731 /* asp_session_s* session = (asp_session_s*)p_context_data; */
2734 void _state_reject_session_sent_exit_action(void *p_context_data)
2738 gfsm_state_id_t _state_reject_session_sent_reaction_ack_received(
2739 void *p_context_data, void *p_event_data)
2743 asp_session_s *session = (asp_session_s *)p_context_data;
2744 session->closed_state = ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE;
2746 return SESSION_STATE_CLOSED;
2749 gfsm_state_id_t _state_reject_session_sent_reaction_nack_received(
2750 void *p_context_data, void *p_event_data)
2754 asp_session_s *session = (asp_session_s *)p_context_data;
2755 session->closed_state = ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE;
2757 return SESSION_STATE_CLOSED;
2760 void _state_remove_session_sent_entry_action(void *p_context_data)
2764 /*asp_session_s* session = (asp_session_s*)p_context_data; */
2767 void _state_remove_session_sent_exit_action(void *p_context_data)
2771 gfsm_state_id_t _state_remove_session_sent_reaction_ack_received(
2772 void *p_context_data, void *p_event_data)
2776 asp_session_s *session = (asp_session_s *)p_context_data;
2777 session->closed_state = ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE;
2779 return SESSION_STATE_CLOSED;
2782 gfsm_state_id_t _state_remove_session_sent_reaction_nack_received(
2783 void *p_context_data, void *p_event_data)
2787 asp_session_s *session = (asp_session_s *)p_context_data;
2788 session->closed_state = ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE;
2790 return SESSION_STATE_CLOSED;
2793 static gfsm_state_id_t _state_remove_session_sent_reaction_peer_destroyed(
2794 void *p_context_data, void *p_event_data)
2798 asp_session_s *session = (asp_session_s *)p_context_data;
2799 session->closed_state = ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE;
2801 return SESSION_STATE_CLOSED;