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, gchar *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);
471 /*****************************************************************************
473 *****************************************************************************/
475 gboolean asp_session_initialize()
479 #ifdef HAVE_ASP_P2P_CONN
480 asp_p2p_conn_get_p2p_mac(g_my_p2p_mac);
483 asp_sess_peer_init();
485 sessionTree = g_tree_new_full((GCompareDataFunc) _session_tree_compare_func,
486 NULL, (GDestroyNotify) _session_tree_key_destoryed,
487 (GDestroyNotify) _session_tree_value_destoryed);
489 g_assert(sessionTree);
491 _asp_session_fsm_init();
493 session_cb_v_table.connect_status.cb = NULL;
494 session_cb_v_table.connect_status.user_data = NULL;
495 session_cb_v_table.port_status.cb = NULL;
496 session_cb_v_table.port_status.user_data = NULL;
497 session_cb_v_table.session_request.cb = NULL;
498 session_cb_v_table.session_request.user_data = NULL;
499 session_cb_v_table.session_config_request.cb = NULL;
500 session_cb_v_table.session_config_request.user_data = NULL;
501 session_cb_v_table.session_status.cb = NULL;
502 session_cb_v_table.session_status.user_data = NULL;
504 #ifdef HAVE_ASP_P2P_CONN
505 asp_p2p_conn_initialize(); /* it needs to be provided by p2p_conn , hjjee */
506 asp_p2p_conn_set_session_request_cb(_p2p_conn_session_request_cb, NULL);
507 asp_p2p_conn_set_session_config_request_cb(_p2p_conn_session_config_request_cb,
509 asp_p2p_conn_set_connect_status_cb(_p2p_conn_connect_status_cb, NULL);
510 asp_p2p_conn_set_ip_assigned_cb(_p2p_conn_ip_assigned_cb, NULL);
516 gboolean asp_session_deinitialize()
520 asp_sess_peer_destroy();
522 g_tree_destroy(sessionTree);
525 session_cb_v_table.connect_status.cb = NULL;
526 session_cb_v_table.connect_status.user_data = NULL;
527 session_cb_v_table.port_status.cb = NULL;
528 session_cb_v_table.port_status.user_data = NULL;
529 session_cb_v_table.session_request.cb = NULL;
530 session_cb_v_table.session_request.user_data = NULL;
531 session_cb_v_table.session_config_request.cb = NULL;
532 session_cb_v_table.session_config_request.user_data = NULL;
533 session_cb_v_table.session_status.cb = NULL;
534 session_cb_v_table.session_status.user_data = NULL;
536 _asp_session_fsm_terminate();
538 #ifdef HAVE_ASP_P2P_CONN
539 asp_p2p_conn_deinitialize();
545 gboolean asp_session_connect_session_over_p2p(const guint8 *service_mac,
546 guint32 advertisement_id, const guint8 *session_info, size_t info_length,
547 guint8 network_role, guint8 network_config, guint8 *session_mac,
548 guint32 *p_session_id)
552 memcpy(session_mac, g_my_p2p_mac, MAC_ADDRESS_LEN);
555 *p_session_id = _alloc_session_id();
556 } while (_get_exist_session(*p_session_id, session_mac) != NULL);
558 asp_session_s *session = _new_session_over_p2p(session_mac, *p_session_id,
559 ASP_ROLE_SEEKER, service_mac,
560 advertisement_id); /*this function is not implemented yet, hjjee */
563 connect_session_param_s *p_connect_session = (connect_session_param_s *)
564 g_malloc(sizeof(connect_session_param_s));
566 memcpy(p_connect_session->service_mac, service_mac, MAC_ADDRESS_LEN);
568 p_connect_session->info_length = MIN(ASP_SESSION_INFO_BYTE_MAX, info_length);
569 memcpy(p_connect_session->session_info, session_info,
570 p_connect_session->info_length);
572 p_connect_session->info_length = 0;
573 p_connect_session->network_role = network_role;
574 p_connect_session->network_config = network_config;
576 gfsm_process_event(session->context,
577 gfsm_create_event(SESSION_EVENT_CONNECT_SESSION_CALLED, p_connect_session,
583 gboolean asp_session_connect_session_over_infra(const gchar *peer_ip,
584 guint32 advertisement_id, guint8 *session_info, size_t info_length,
585 guint8 *session_mac, guint32 *p_session_id)
589 memcpy(session_mac, g_my_p2p_mac, MAC_ADDRESS_LEN);
592 *p_session_id = _alloc_session_id();
593 } while (_get_exist_session(*p_session_id, session_mac) != NULL);
595 asp_session_s *session = _new_session_over_infra(session_mac, *p_session_id,
596 ASP_ROLE_SEEKER, advertisement_id, NULL,
597 peer_ip); /*this function needs to be modified because there is new element in session structure., hjjee */
600 connect_session_param_s *p_connect_session = (connect_session_param_s *)
601 g_malloc(sizeof(connect_session_param_s));
603 memset(p_connect_session->service_mac, 0, MAC_ADDRESS_LEN);
605 p_connect_session->info_length = MIN(ASP_SESSION_INFO_BYTE_MAX, info_length);
606 memcpy(p_connect_session->session_info, session_info,
607 p_connect_session->info_length);
609 p_connect_session->info_length = 0;
610 p_connect_session->network_role = 0;
611 p_connect_session->network_config = 0;
613 gfsm_process_event(session->context,
614 gfsm_create_event(SESSION_EVENT_CONNECT_SESSION_CALLED, p_connect_session,
620 gboolean asp_session_defer_session(guint8 *session_mac, guint32 session_id,
621 guint8 *deferred_response, size_t length)
625 asp_session_s *session = _get_exist_session(session_id, session_mac);
626 defer_session_param_s *defer_session_param = (defer_session_param_s *)g_malloc(
627 sizeof(defer_session_param_s));
631 defer_session_param->length = length;
632 memcpy(defer_session_param->deferred_response, deferred_response, MIN(length,
633 ASP_DEFER_RESPONSE_BYTE_MAX));
635 gfsm_process_event(session->context,
636 gfsm_create_event(SESSION_EVENT_DEFER_SESSION_CALLED, defer_session_param,
642 gboolean asp_session_confirm_session(const guint8 *session_mac,
643 guint32 session_id, gboolean confirmed, guint32 pin)
647 asp_session_s *session = _get_exist_session(session_id, session_mac);
650 confirm_session_param_s *confirmed_param = (confirm_session_param_s *)g_malloc(
651 sizeof(confirm_session_param_s));
652 confirmed_param->confirmed = confirmed;
653 confirmed_param->pin = pin;
654 session->confirmed = confirmed;
656 gfsm_process_event(session->context,
657 gfsm_create_event(SESSION_EVENT_CONFIRM_SESSION_CALLED, confirmed_param,
663 gboolean asp_session_set_session_ready(const guint8 *session_mac,
668 asp_session_s *session = _get_exist_session(session_id, session_mac);
671 gfsm_process_event(session->context,
672 gfsm_create_event(SESSION_EVENT_SET_SESSION_READY_CALLED, NULL, NULL));
677 gboolean asp_session_close_session(guint8 *session_mac, guint32 session_id,
678 asp_remove_session_reason_e reason)
682 asp_session_s *session = _get_exist_session(session_id, session_mac);
685 guint8 *close_reason = (guint8 *) g_malloc(sizeof(guint8));
686 *close_reason = (guint8) reason;
688 gfsm_process_event(session->context,
689 gfsm_create_event(SESSION_EVENT_CLOSE_SESSION_CALLED, close_reason, g_free));
694 gboolean asp_session_bound_port(guint8 *session_mac, guint32 session_id,
695 const gchar *local_ip, guint16 local_port, guint8 protocol)
699 asp_session_s *session = _get_exist_session(session_id, session_mac);
702 bound_port_param_s *bound_port_param = (bound_port_param_s *)g_malloc(sizeof(
703 bound_port_param_s));
704 g_strlcpy(bound_port_param->local_ip, local_ip, ASP_SESSION_IPV4_STR_LEN);
705 bound_port_param->local_port = local_port;
706 bound_port_param->proto = protocol;
708 gfsm_process_event(session->context,
709 gfsm_create_event(SESSION_EVENT_BOUND_PORT_CALLED, bound_port_param, g_free));
714 void _p2p_conn_session_request_cb(gint32 error_code, const guint8 *session_mac,
715 guint32 session_id, guint32 advertisement_id, const gchar *device_name,
716 size_t name_length, const guint8 *session_info, size_t info_length,
717 gboolean get_pin, guint32 pin, gpointer user_data)
719 asp_session_s *session = _get_exist_session(session_id, session_mac);
722 /* Discard or delete previous session??? */
725 session = _new_session_from_session_request(session_mac, session_id,
729 session_request_param_s *p_param = (session_request_param_s *)g_malloc(sizeof(
730 session_request_param_s));
732 p_param->name_length = MIN(ASP_MAX_DEVICE_NAME_LEN, name_length);
733 memcpy(p_param->device_name, device_name, p_param->name_length);
734 p_param->device_name[p_param->name_length] = 0;
736 p_param->info_length = MIN(ASP_SESSION_INFO_BYTE_MAX, info_length);
737 memcpy(p_param->session_info, session_info, p_param->info_length);
739 p_param->info_length = 0;
740 p_param->get_pin = get_pin;
743 gfsm_process_event(session->context,
744 gfsm_create_event(SESSION_EVENT_SESSION_REQUEST_CALLED, p_param, g_free));
748 void _p2p_conn_session_config_request_cb(gint32 error_code,
749 const guint8 *session_mac, guint32 session_id, gboolean get_pin, guint32 pin,
752 asp_session_s *session = _get_exist_session(session_id, session_mac);
755 session_config_request_param_s *p_param = (session_config_request_param_s *)
756 g_malloc(sizeof(session_config_request_param_s));
757 p_param->get_network_config_pin = get_pin;
758 p_param->network_config_pin = pin;
760 gfsm_process_event(session->context,
761 gfsm_create_event(SESSION_EVENT_SESSION_CONFIG_REQUEST_CALLED, p_param,
766 void _p2p_conn_connect_status_cb(gint32 error_code, const guint8 *session_mac,
767 guint32 session_id, asp_session_connect_status_e status, gpointer user_data)
769 asp_session_s *session = _get_exist_session(session_id, session_mac);
772 connect_status_param_s *p_param = (connect_status_param_s *)g_malloc(sizeof(
773 connect_status_param_s));
774 p_param->status = status;
777 gfsm_process_event(session->context,
778 gfsm_create_event(SESSION_EVENT_CONNECT_STATUS_CALLED, p_param, g_free));
782 void _p2p_conn_ip_assigned_cb(gint32 error_code, const guint8 *session_mac,
783 guint32 session_id, gchar *service_mac, gchar *peer_ip_addr, gint32 ip_length,
788 asp_session_s *session = _get_exist_session(session_id, session_mac);
791 ip_assigned_param_s *p_param = (ip_assigned_param_s *)g_malloc(sizeof(
792 ip_assigned_param_s));
793 g_strlcpy(p_param->peer_ip_addr, peer_ip_addr, ASP_SESSION_IPV4_STR_LEN);
794 p_param->length = ip_length;
796 ASP_LOGD("%s %d", p_param->peer_ip_addr, p_param->length);
797 gfsm_process_event(session->context,
798 gfsm_create_event(SESSION_EVENT_IP_ASSIGNED, p_param, g_free));
802 gboolean asp_session_set_session_request_cb(asp_session_session_request_cb cb,
807 session_cb_v_table.session_request.cb = cb;
808 session_cb_v_table.session_request.user_data = user_data;
812 gboolean asp_session_set_session_config_request_cb(
813 asp_session_session_config_request_cb cb, gpointer user_data)
817 session_cb_v_table.session_config_request.cb = cb;
818 session_cb_v_table.session_config_request.user_data = user_data;
822 gboolean asp_session_set_connect_status_cb(asp_session_connect_status_cb cb,
827 session_cb_v_table.connect_status.cb = cb;
828 session_cb_v_table.connect_status.user_data = user_data;
832 gboolean asp_session_set_session_status_cb(asp_session_session_status_cb cb,
837 session_cb_v_table.session_status.cb = cb;
838 session_cb_v_table.session_status.user_data = user_data;
842 gboolean asp_session_set_port_status_cb(asp_session_port_status_cb cb,
847 session_cb_v_table.port_status.cb = cb;
848 session_cb_v_table.port_status.user_data = user_data;
852 gboolean asp_session_get_advertisement_id(guint8 *session_mac,
853 guint32 session_id, guint32 *advertisement_id)
857 asp_session_s *session = _get_exist_session(session_id, session_mac);
860 *advertisement_id = session->advertisement_id;
865 gboolean asp_session_get_state(guint8 *session_mac, guint32 session_id,
866 asp_session_status_e *state)
870 *state = _get_session_state(session_mac, session_id);
875 gboolean asp_session_get_peer_endpoint(guint8 *session_mac, guint32 session_id,
876 gchar *peer_ip, guint16 *port)
880 asp_session_s *session = _get_exist_session(session_id, session_mac);
883 g_strlcpy(peer_ip, session->peer_ip, ASP_SESSION_IPV4_STR_LEN);
885 *port = g_asp_cordination_port;
890 void asp_session_recv_req(GSocketAddress *sock_addr, gpointer p_msg)
894 asp_request_header_s *p_header = (asp_request_header_s *)p_msg;
896 ASP_LOGD("%s asp_session_recv_req(), opcode:%d", ROLE, p_header->opcode);
898 asp_session_s *session = _get_exist_session(p_header->session_id,
899 p_header->session_mac);
901 if (!session->over_p2p && NULL == session &&
902 ASP_OPCODE_REQUEST_SESSION != p_header->opcode) {
904 /* NACK shall be sent */
905 _send_nack(sock_addr, p_header->seq_num, ASP_NACK_REASON_NO_SESSION_EXIST);
909 if (session->over_p2p && NULL == session) {
911 _send_nack(sock_addr, p_header->seq_num, ASP_NACK_REASON_NO_SESSION_EXIST);
915 if(session->over_p2p && session->sock_addr == NULL) {
916 ASP_LOGD("IpAssigned signal isn't yet received, discard event");
920 switch (p_header->opcode) {
921 case ASP_OPCODE_REQUEST_SESSION: {
922 gchar peer_ip[ASP_SESSION_IPV4_STR_LEN];
923 _get_ip_from_socketaddress(sock_addr, peer_ip);
925 /* how to handle a case of that a same session is exist in Tree */
927 session = _new_session_by_request_session(sock_addr, peer_ip, p_msg);
929 g_strlcpy(session->additional_info, SESSION_STATUS_ADDITIONAL_INFO_PD,
930 SESSION_STATUS_ADDITIONAL_INFO_LEN);
933 _send_ack(sock_addr, p_header->seq_num);
935 gfsm_process_event(session->context,
936 gfsm_create_event(SESSION_EVENT_REQUEST_SESSION_RECEIVED,
937 _asp_session_dup_reqeust_session(p_msg), g_free));
940 case ASP_OPCODE_ADDED_SESSION:
941 _send_ack(sock_addr, p_header->seq_num);
942 gfsm_process_event(session->context,
943 gfsm_create_event(SESSION_EVENT_ADDED_SESSION_RECEIVED, NULL, NULL));
945 case ASP_OPCODE_REJECTED_SESSION:
946 _send_ack(sock_addr, p_header->seq_num);
947 gfsm_process_event(session->context,
948 gfsm_create_event(SESSION_EVENT_REJECTED_SESSION_RECEIVED, NULL, NULL));
950 case ASP_OPCODE_REMOVE_SESSION:
951 _send_ack(sock_addr, p_header->seq_num);
952 gfsm_process_event(session->context,
953 gfsm_create_event(SESSION_EVENT_REMOVE_SESSION_RECEIVED,
954 &((asp_remove_session_s *)p_msg)->reason, NULL));
956 case ASP_OPCODE_ALLOWED_PORT:
957 _send_ack(sock_addr, p_header->seq_num);
958 gfsm_process_event(session->context,
959 gfsm_create_event(SESSION_EVENT_ALLOWED_PORT_RECEIVED,
960 _asp_session_dup_allowed_session(p_msg), g_free));
962 case ASP_OPCODE_DEFERRED_SESSION:
963 _send_ack(sock_addr, p_header->seq_num);
964 gfsm_process_event(session->context,
965 gfsm_create_event(SESSION_EVENT_DEFERRED_SESSION_RECEIVED, NULL, NULL));
969 case ASP_OPCODE_NACK:
970 case ASP_OPCODE_VERSION:
971 /* VERSION message is handled by asp-sess-peer */
972 /* ANK & NACK is handled by asp_session_recv_ack() & asp_session_recv_nack() in asp-session */
980 void asp_session_recv_ack(GSocketAddress *sock_addr, guint8 *session_mac,
981 guint32 session_id, gpointer p_msg)
985 ASP_LOGD("%s asp_session_recv_ack: session_id:%d, session_mac[0]:%x", ROLE,
986 session_id, session_mac[0]);
987 asp_session_s *session = _get_exist_session(session_id, session_mac);
990 gfsm_process_event(session->context,
991 gfsm_create_event(SESSION_EVENT_ACK_RECEIVED, NULL, NULL));
994 void asp_session_recv_nack(GSocketAddress *sock_addr, guint8 *session_mac,
995 guint32 session_id, gpointer data)
999 asp_session_s *session = _get_exist_session(session_id, session_mac);
1002 gfsm_process_event(session->context,
1003 gfsm_create_event(SESSION_EVENT_NACK_RECEIVED, NULL, NULL));
1006 void asp_session_peer_destroyed(guint8 *session_mac, guint32 session_id)
1010 /*_remove_session(session_mac, session_id); */
1011 asp_session_s *session = _get_exist_session(session_id, session_mac);
1012 gfsm_process_event(session->context,
1013 gfsm_create_event(SESSION_EVENT_PEER_DESTROYED, NULL, NULL));
1016 /*****************************************************************************
1017 * Local Function Definition
1018 *****************************************************************************/
1020 gboolean _send_request_session(asp_session_s *session, guint8 *session_info,
1021 size_t session_info_len)
1025 asp_request_session_s request_session_data;
1027 request_session_data.opcode = ASP_OPCODE_REQUEST_SESSION;
1028 memcpy(request_session_data.session_mac, session->session_mac, MAC_ADDRESS_LEN);
1029 request_session_data.session_id = session->session_id;
1030 request_session_data.advertisement_id = session->advertisement_id;
1032 request_session_data.session_information_length = MIN(ASP_SESSION_INFO_BYTE_MAX,
1034 memcpy(request_session_data.session_information, session_info,
1037 request_session_data.session_information_length = 0;
1039 return asp_sess_peer_send_msg(session->sock_addr,
1040 (void *)&request_session_data);
1043 gboolean _send_remove_session(asp_session_s *session, guint8 remove_reason)
1047 asp_remove_session_s remove_session_data;
1049 remove_session_data.opcode = ASP_OPCODE_REMOVE_SESSION;
1050 memcpy(remove_session_data.session_mac, session->session_mac, MAC_ADDRESS_LEN);
1051 remove_session_data.session_id = session->session_id;
1052 remove_session_data.reason = remove_reason;
1054 return asp_sess_peer_send_msg(session->sock_addr, (void *)&remove_session_data);
1057 gboolean _send_reject_session(asp_session_s *session)
1061 asp_rejected_session_s rejected_session_data;
1062 rejected_session_data.opcode = ASP_OPCODE_REJECTED_SESSION;
1063 memcpy(rejected_session_data.session_mac, session->session_mac,
1065 rejected_session_data.session_id = session->session_id;
1067 return asp_sess_peer_send_msg(session->sock_addr,
1068 (void *)&rejected_session_data);
1071 gboolean _send_added_session(asp_session_s *session)
1075 asp_added_session_s add_session_data;
1076 add_session_data.opcode = ASP_OPCODE_ADDED_SESSION;
1077 memcpy(add_session_data.session_mac, session->session_mac, MAC_ADDRESS_LEN);
1078 add_session_data.session_id = session->session_id;
1080 return asp_sess_peer_send_msg(session->sock_addr, (void *)&add_session_data);
1083 gboolean _send_deferred_session(asp_session_s *session,
1084 guint8 *deferred_response, size_t length)
1088 asp_deferred_session_s deferred_session_data;
1089 deferred_session_data.opcode = ASP_OPCODE_DEFERRED_SESSION;
1090 memcpy(deferred_session_data.session_mac, session->session_mac,
1092 deferred_session_data.session_id = session->session_id;
1093 deferred_session_data.deferred_session__response_length = length;
1094 memcpy(deferred_session_data.deferred_session__response, deferred_response,
1097 return asp_sess_peer_send_msg(session->sock_addr,
1098 (void *)&deferred_session_data);
1101 gboolean _send_allowed_port(asp_session_s *session, guint16 port,
1106 asp_allowed_port_s allowed_port_data;
1107 allowed_port_data.opcode = ASP_OPCODE_ALLOWED_PORT;
1108 memcpy(allowed_port_data.session_mac, session->session_mac, MAC_ADDRESS_LEN);
1109 allowed_port_data.session_id = session->session_id;
1110 allowed_port_data.port = port;
1111 allowed_port_data.proto = protocol;
1113 return asp_sess_peer_send_msg(session->sock_addr, (void *)&allowed_port_data);
1116 gboolean _send_nack(GSocketAddress *sock_addr, guint8 seq_num, guint8 reason)
1120 asp_nack_s nack_data;
1121 nack_data.opcode = ASP_OPCODE_NACK;
1122 nack_data.seq_num = seq_num;
1123 nack_data.reason = reason;
1125 return asp_sess_peer_send_msg(sock_addr, (void *)&nack_data);
1128 gboolean _send_ack(GSocketAddress *sock_addr, guint8 seq_num)
1132 asp_nack_s ack_data;
1133 ack_data.opcode = ASP_OPCODE_ACK;
1134 ack_data.seq_num = seq_num;
1136 return asp_sess_peer_send_msg(sock_addr, (void *)&ack_data);
1139 void _session_tree_value_destoryed(gpointer data)
1143 asp_session_s *session = (asp_session_s *)data;
1145 /* destroy gfsm context */
1146 /*gfsm_destroy_context(session->context); */
1148 if (session->sock_addr) {
1149 g_object_unref(session->sock_addr);
1150 session->sock_addr = NULL;
1157 void _session_tree_key_destoryed(gpointer data)
1159 asp_session_key_s *key = (asp_session_key_s *)data;
1164 gint _session_tree_compare_func(gconstpointer a, gconstpointer b)
1166 asp_session_key_s *s1 = (asp_session_key_s *)a;
1167 asp_session_key_s *s2 = (asp_session_key_s *)b;
1169 /* ascending sort */
1170 if (s1->session_id != s2->session_id)
1171 return s1->session_id - s2->session_id;
1173 return memcmp(s1->session_mac, s2->session_mac, MAC_ADDRESS_LEN);
1176 void _call_session_request_cb(gint32 error_code, guint8 *session_mac,
1177 guint32 session_id, guint32 advertisement_id, gchar *device_name,
1178 size_t name_length, guint8 *session_info, size_t info_length, gboolean get_pin,
1183 if (NULL == session_cb_v_table.session_request.cb) {
1184 /* a callback have not been registered yet */
1188 session_cb_v_table.session_request.cb(error_code, session_mac, session_id,
1189 advertisement_id, device_name, name_length, session_info, info_length, get_pin,
1190 pin, session_cb_v_table.session_request.user_data);
1193 void _call_session_config_request_cb(gint32 error_code, guint8 *session_mac,
1194 guint32 session_id, gboolean get_pin, guint32 pin)
1198 if (NULL == session_cb_v_table.session_config_request.cb) {
1199 /* a callback have not been registered yet */
1203 session_cb_v_table.session_config_request.cb(error_code, session_mac,
1204 session_id, get_pin, pin, session_cb_v_table.session_config_request.user_data);
1207 void _call_port_status_cb(gint32 error_code, const guint8 *session_mac,
1208 guint32 session_id, const gchar *peer_ip, guint16 port, guint8 protocol,
1209 asp_session_port_status_e status)
1213 if (NULL == session_cb_v_table.port_status.cb) {
1214 /* a callback have not been registered yet */
1218 session_cb_v_table.port_status.cb(error_code, session_mac, session_id, peer_ip,
1219 port, protocol, status, session_cb_v_table.port_status.user_data);
1222 void _call_session_status_cb(gint32 error_code, guint8 *session_mac,
1223 guint32 session_id, asp_session_closed_state_e closed_state)
1227 g_assert(session_cb_v_table.session_status.cb);
1229 asp_session_s *session = _get_exist_session(session_id, session_mac);
1232 session_cb_v_table.session_status.cb(error_code, session_mac, session_id,
1233 _get_session_state(session_mac, session_id), closed_state,
1234 session->additional_info, session_cb_v_table.session_status.user_data);
1237 void _call_connect_status_cb(gint32 error_code, guint8 *session_mac,
1238 guint32 session_id, asp_session_connect_status_e status)
1242 g_assert(session_cb_v_table.session_status.cb);
1244 asp_session_s *session = _get_exist_session(session_id, session_mac);
1247 /* temporary code */
1248 /*what is deferred_resp ? */
1249 guint8 *deferred_resp = NULL;
1251 /* temporary code */
1253 session_cb_v_table.connect_status.cb(error_code, session_mac, session_id,
1254 status, deferred_resp, length, session_cb_v_table.connect_status.user_data);
1257 gpointer _asp_session_dup_reqeust_session(gpointer p_msg)
1259 asp_request_session_s *p_dup_msg = (asp_request_session_s *)g_malloc(sizeof(
1260 asp_request_session_s));
1261 memcpy(p_dup_msg, p_msg, sizeof(asp_request_session_s));
1262 return (gpointer) p_dup_msg;
1267 gpointer _asp_session_dup_added_session(gpointer p_msg)
1269 asp_added_session_s* p_dup_msg = (asp_added_session_s*)g_malloc(sizeof(asp_added_session_s));
1270 memcpy(p_dup_msg, p_msg, sizeof(asp_added_session_s));
1271 return (gpointer)p_dup_msg;
1274 gpointer _asp_session_dup_rejected_session(gpointer p_msg)
1276 asp_rejected_session_s* p_dup_msg = (asp_rejected_session_s*)g_malloc(sizeof(asp_rejected_session_s));
1277 memcpy(p_dup_msg, p_msg, sizeof(asp_rejected_session_s));
1278 return (gpointer)p_dup_msg;
1281 gpointer _asp_session_dup_remove_session(gpointer p_msg)
1283 asp_remove_session_s* p_dup_msg = (asp_remove_session_s*)g_malloc(sizeof(asp_remove_session_s));
1284 memcpy(p_dup_msg, p_msg, sizeof(asp_remove_session_s));
1285 return (gpointer)p_dup_msg;
1288 gpointer _asp_session_dup_deferred_session(gpointer p_msg)
1290 asp_deferred_session_s* p_dup_msg = (asp_deferred_session_s*)g_malloc(sizeof(asp_deferred_session_s));
1291 memcpy(p_dup_msg, p_msg, sizeof(asp_deferred_session_s));
1292 return (gpointer)p_dup_msg;
1296 gpointer _asp_session_dup_allowed_session(gpointer p_msg)
1300 asp_allowed_port_s *p_dup_msg = (asp_allowed_port_s *)g_malloc(sizeof(
1301 asp_allowed_port_s));
1302 memcpy(p_dup_msg, p_msg, sizeof(asp_allowed_port_s));
1303 return (gpointer) p_dup_msg;
1306 guint32 _alloc_session_id()
1308 static guint32 g_session_id = 0;
1309 return g_session_id++;
1312 asp_session_status_e _get_session_state(guint8 *session_mac, guint32 session_id)
1316 asp_session_status_e ret = ASP_SESSION_STATE_ERROR;
1318 asp_session_s *session = _get_exist_session(session_id, session_mac);
1321 gfsm_state_id_t current_state = gfsm_get_current_state_id(session->context);
1322 ASP_LOGD("%s _get_session_state() current session_state : %d", ROLE, current_state);
1323 switch (current_state) {
1324 case SESSION_STATE_NONE:
1325 case SESSION_STATE_CLOSED:
1326 case SESSION_STATE_RUNNING:
1327 ret = ASP_SESSION_STATE_CLOSED;
1329 case SESSION_STATE_REQUEST_SESSION_SENT:
1330 case SESSION_STATE_SESSION_REQUEST_SENT:
1331 ret = ASP_SESSION_STATE_INITIATED;
1333 case SESSION_STATE_OPEN:
1334 case SESSION_STATE_REMOVE_SESSION_SENT:
1335 ret = ASP_SESSION_STATE_OPEN;
1337 case SESSION_STATE_REQUEST_SESSION_RECEIVED:
1338 case SESSION_STATE_SESSION_REQUEST_RECEIVED:
1339 /*case SESSION_STATE_DEFERRED_SESSION_SENT: */
1340 case SESSION_STATE_REJECT_SESSION_SENT:
1341 ret = ASP_SESSION_STATE_REQUESTED;
1344 ret = ASP_SESSION_STATE_ERROR;
1347 ASP_LOGD("%s _get_session_state() session_state : %d", ROLE, ret);
1352 asp_session_s *_new_session_by_request_session(GSocketAddress *sock_addr,
1353 const gchar *peer_ip, gpointer p_msg)
1357 asp_session_s *session = NULL;
1358 asp_request_session_s *p_req_session = (asp_request_session_s *)p_msg;
1359 g_assert(p_req_session);
1361 session = _new_session_over_infra(p_req_session->session_mac,
1362 p_req_session->session_id, ASP_ROLE_ADVERTIZER, p_req_session->advertisement_id,
1363 sock_addr, peer_ip);
1368 asp_session_s *_new_session_over_infra(guint8 *session_mac, guint32 session_id,
1369 asp_role_e asp_role, guint32 advertisement_id, GSocketAddress *sock_addr,
1370 const gchar *peer_ip)
1374 asp_session_s *session = NULL;
1376 session = (asp_session_s *)g_malloc0(sizeof(asp_session_s));
1378 session->asp_role = asp_role;
1380 memcpy(session->session_mac, session_mac, MAC_ADDRESS_LEN);
1381 session->session_id = session_id;
1382 session->advertisement_id = advertisement_id, g_strlcpy(session->peer_ip,
1383 peer_ip, ASP_SESSION_IPV4_STR_LEN);
1385 if (NULL == sock_addr) /* seeker side */
1386 session->sock_addr = g_inet_socket_address_new_from_string(peer_ip,
1387 (guint) g_asp_cordination_port);
1388 else /* advertiser side */
1389 session->sock_addr = (GSocketAddress *) g_object_ref(sock_addr);
1390 /*session->sock_family = G_SOCKET_FAMILY_IPV4; // temporary */
1391 session->over_p2p = FALSE;
1393 g_strlcpy(session->additional_info, SESSION_STATUS_ADDITIONAL_INFO_CO,
1394 SESSION_STATUS_ADDITIONAL_INFO_LEN);
1396 session->context = gfsm_create_context(session_fsm,
1397 _asp_session_destroy_session, session);
1399 _insert_session(session);
1404 asp_session_s *_new_session_over_p2p(const guint8 *session_mac,
1405 guint32 session_id, asp_role_e asp_role, const guint8 *service_mac,
1406 guint32 advertisement_id)
1410 asp_session_s *session = NULL;
1412 session = (asp_session_s *)g_malloc0(sizeof(asp_session_s));
1414 memcpy(session->session_mac, session_mac, MAC_ADDRESS_LEN);
1415 session->session_id = session_id;
1417 session->asp_role = asp_role;
1419 memcpy(session->service_mac, service_mac, MAC_ADDRESS_LEN);
1420 session->advertisement_id = advertisement_id,
1421 /*session->sock_family = G_SOCKET_FAMILY_IPV4; // temporary */
1422 session->over_p2p = TRUE;
1423 g_strlcpy(session->additional_info, SESSION_STATUS_ADDITIONAL_INFO_PD,
1424 SESSION_STATUS_ADDITIONAL_INFO_LEN);
1426 session->context = gfsm_create_context(session_fsm,
1427 _asp_session_destroy_session, session);
1429 _insert_session(session);
1434 asp_session_s *_new_session_from_session_request(const guint8 *session_mac,
1435 guint32 session_id, guint32 advertisement_id)
1439 asp_session_s *session = NULL;
1441 session = (asp_session_s *)g_malloc0(sizeof(asp_session_s));
1443 memcpy(session->session_mac, session_mac, MAC_ADDRESS_LEN);
1444 session->session_id = session_id;
1446 session->asp_role = ASP_ROLE_ADVERTIZER;
1448 memcpy(session->service_mac, g_my_p2p_mac, MAC_ADDRESS_LEN);
1449 session->advertisement_id = advertisement_id,
1450 /*session->sock_family = G_SOCKET_FAMILY_IPV4; // temporary */
1451 session->over_p2p = TRUE;
1453 g_strlcpy(session->additional_info, SESSION_STATUS_ADDITIONAL_INFO_PD,
1454 SESSION_STATUS_ADDITIONAL_INFO_LEN);
1456 session->context = gfsm_create_context(session_fsm,
1457 _asp_session_destroy_session, session);
1459 _insert_session(session);
1464 void _store_peer_ip_addr(asp_session_s *session, char *peer_ip, size_t length)
1467 g_strlcpy(session->peer_ip, peer_ip, length);
1468 session->sock_addr = g_inet_socket_address_new_from_string(peer_ip,
1469 (guint) g_asp_cordination_port);
1471 if (session->sock_addr == NULL)
1472 ASP_LOGD("Failed to create socket IP %s", peer_ip);
1474 ASP_LOGD("Succeeded to create socket IP %s", peer_ip);
1478 #ifdef HAVE_ASP_P2P_CONN
1479 guint8 *_get_peer_mac(asp_session_s *session)
1481 if (session->asp_role == ASP_ROLE_ADVERTIZER)
1482 return session->session_mac;
1484 return session->service_mac;
1488 void _asp_session_destroy_session(void *p_context_data)
1492 asp_session_s *session = (asp_session_s *)p_context_data;
1493 _remove_session(session->session_mac, session->session_id);
1496 void _remove_session(guint8 *session_mac, guint32 session_id)
1500 g_tree_remove(sessionTree, _get_session_key(session_id, session_mac));
1501 /* key & value pair in tree will be freed _session_tree_key_destoryed and _session_tree_value_destoryed */
1504 asp_session_s *_get_exist_session(guint32 session_id, const guint8 *session_mac)
1506 asp_session_s *session = NULL;
1508 session = (asp_session_s *)g_tree_lookup(sessionTree,
1509 _get_session_key(session_id, session_mac));
1514 asp_session_key_s *_get_session_key(guint32 session_id,
1515 const guint8 *session_mac)
1517 asp_session_key_s *key = (asp_session_key_s *)g_malloc(sizeof(
1518 asp_session_key_s));
1519 key->session_id = session_id;
1520 memcpy(key->session_mac, session_mac, MAC_ADDRESS_LEN); /* 6 bytes */
1525 void _insert_session(asp_session_s *session)
1527 /* add a new session to hash table ( key - session_id, value - asp_session_s*) */
1528 g_tree_insert(sessionTree, _get_session_key(session->session_id,
1529 session->session_mac), session);
1532 void _get_ip_from_socketaddress(GSocketAddress *sock_addr, gchar *peer_ip)
1534 GInetSocketAddress *inetaddr;
1535 GInetAddress *hostaddr;
1537 inetaddr = G_INET_SOCKET_ADDRESS(sock_addr);
1538 hostaddr = g_inet_socket_address_get_address(inetaddr);
1540 g_strlcpy(peer_ip, g_inet_address_to_string(hostaddr),
1541 ASP_SESSION_IPV4_STR_LEN);
1543 ASP_LOGD("%s peer_ip: %s", ROLE, peer_ip);
1545 /*g_object_unref(hostaddr); */
1546 /*g_object_unref(inetaddr); */
1549 /*****************************************************************************
1550 * Local Function for state machine
1551 *****************************************************************************/
1553 const char *_asp_session_fsm_get_state_name_cb(gfsm_state_id_t state_id)
1555 const char *ret_val = NULL;
1558 case SESSION_STATE_NONE:
1559 ret_val = "SESSION_STATE_NONE";
1561 case SESSION_STATE_CLOSED:
1562 ret_val = "SESSION_STATE_CLOSED";
1564 case SESSION_STATE_RUNNING:
1565 ret_val = "SESSION_STATE_RUNNING";
1567 case SESSION_STATE_L2CONNECTING:
1568 ret_val = "SESSION_STATE_L2CONNECTING";
1570 case SESSION_STATE_SESSION_REQUEST_SENT:
1571 ret_val = "SESSION_STATE_SESSION_REQUEST_SENT";
1573 case SESSION_STATE_SESSION_REQUEST_RECEIVED:
1574 ret_val = "SESSION_STATE_SESSION_REQUEST_RECEIVED";
1576 case SESSION_STATE_SESSION_REQUEST_DEFERED:
1577 ret_val = "SESSION_STATE_SESSION_REQUEST_DEFERED";
1579 case SESSION_STATE_SESSION_REQUEST_ACCEPTED:
1580 ret_val = "SESSION_STATE_SESSION_REQUEST_ACCEPTED";
1582 case SESSION_STATE_ENTERING_PIN:
1583 ret_val = "SESSION_STATE_ENTERING_PIN";
1585 case SESSION_STATE_GROUP_FORMATION_COMPLETED:
1586 ret_val = "SESSION_STATE_GROUP_FORMATION_COMPLETED";
1588 case SESSION_STATE_L2CONNECTED:
1589 ret_val = "SESSION_STATE_L2CONNECTED";
1591 case SESSION_STATE_REQUEST_SESSION_SENT:
1592 ret_val = "SESSION_STATE_REQUEST_SESSION_SENT";
1594 case SESSION_STATE_OPEN:
1595 ret_val = "SESSION_STATE_OPEN";
1597 case SESSION_STATE_REQUEST_SESSION_RECEIVED:
1598 ret_val = "SESSION_STATE_REQUEST_SESSION_RECEIVED";
1600 case SESSION_STATE_REJECT_SESSION_SENT:
1601 ret_val = "SESSION_STATE_REJECT_SESSION_SENT";
1603 case SESSION_STATE_REMOVE_SESSION_SENT:
1604 ret_val = "SESSION_STATE_REMOVE_SESSION_SENT";
1607 ret_val = "SESSION_STATE_MAX";
1614 const char *_asp_session_gfsm_get_event_name_cb(gfsm_event_id_t event_id)
1616 const char *ret_val = NULL;
1619 case SESSION_EVENT_BOUND_PORT_CALLED:
1620 ret_val = "SESSION_EVENT_BOUND_PORT_CALLED";
1622 case SESSION_EVENT_CLOSE_SESSION_CALLED:
1623 ret_val = "SESSION_EVENT_CLOSE_SESSION_CALLED";
1625 case SESSION_EVENT_CONNECT_SESSION_CALLED:
1626 ret_val = "SESSION_EVENT_CONNECT_SESSION_CALLED";
1628 case SESSION_EVENT_CONFIRM_SESSION_CALLED:
1629 ret_val = "SESSION_EVENT_CONFIRM_SESSION_CALLED";
1631 case SESSION_EVENT_DEFER_SESSION_CALLED:
1632 ret_val = "SESSION_EVENT_DEFER_SESSION_CALLED";
1634 case SESSION_EVENT_SET_SESSION_READY_CALLED:
1635 ret_val = "SESSION_EVENT_SET_SESSION_READY_CALLED";
1637 case SESSION_EVENT_SESSION_REQUEST_CALLED:
1638 ret_val = "SESSION_EVENT_SESSION_REQUEST_CALLED";
1640 case SESSION_EVENT_SESSION_CONFIG_REQUEST_CALLED:
1641 ret_val = "SESSION_EVENT_SESSION_CONFIG_REQUEST_CALLED";
1643 case SESSION_EVENT_CONNECT_STATUS_CALLED:
1644 ret_val = "SESSION_EVENT_CONNECT_STATUS_CALLED";
1646 case SESSION_EVENT_IP_ASSIGNED:
1647 ret_val = "SESSION_EVENT_IP_ASSIGNED";
1649 case SESSION_EVENT_REMOVE_SESSION_RECEIVED:
1650 ret_val = "SESSION_EVENT_REMOVE_SESSION_RECEIVED";
1652 case SESSION_EVENT_ALLOWED_PORT_RECEIVED:
1653 ret_val = "SESSION_EVENT_ALLOWED_PORT_RECEIVED";
1655 case SESSION_EVENT_DEFERRED_SESSION_RECEIVED:
1656 ret_val = "SESSION_EVENT_DEFERRED_SESSION_RECEIVED";
1658 case SESSION_EVENT_REJECTED_SESSION_RECEIVED:
1659 ret_val = "SESSION_EVENT_REJECTED_SESSION_RECEIVED";
1661 case SESSION_EVENT_ADDED_SESSION_RECEIVED:
1662 ret_val = "SESSION_EVENT_ADDED_SESSION_RECEIVED";
1664 case SESSION_EVENT_REQUEST_SESSION_RECEIVED:
1665 ret_val = "SESSION_EVENT_REQUEST_SESSION_RECEIVED";
1667 case SESSION_EVENT_ACK_RECEIVED:
1668 ret_val = "SESSION_EVENT_ACK_RECEIVED";
1670 case SESSION_EVENT_NACK_RECEIVED:
1671 ret_val = "SESSION_EVENT_NACK_RECEIVED";
1673 case SESSION_EVENT_PEER_DESTROYED:
1674 ret_val = "SESSION_EVENT_PEER_DESTROYED";
1676 case SESSION_EVENT_TIMEOUT:
1677 ret_val = "SESSION_EVENT_TIMEOUT";
1679 case SESSION_EVENT_DELETE_SESSION:
1680 ret_val = "SESSION_EVENT_DELETE_SESSION";
1683 ret_val = "SESSION_EVENT_MAX";
1690 int _asp_session_fsm_log_func(const char *format, ...)
1694 va_start (args, format);
1695 g_vsnprintf (buffer, 255, format, args);
1698 ASP_LOGD("%s", buffer);
1704 void _asp_session_fsm_init()
1708 session_fsm = gfsm_create_fsm(SESSION_STATE_MAX, SESSION_EVENT_MAX,
1709 SESSION_STATE_NONE);
1711 session_state_none = gfsm_create_state(SESSION_STATE_NONE, session_fsm,
1712 _state_none_entry_action, _state_none_exit_action);
1713 gfsm_add_reaction(session_state_none, SESSION_EVENT_CONNECT_SESSION_CALLED,
1714 _state_none_reaction_connect_session_called);
1715 gfsm_add_reaction(session_state_none, SESSION_EVENT_REQUEST_SESSION_RECEIVED,
1716 _state_none_reaction_request_session_received);
1717 gfsm_add_reaction(session_state_none, SESSION_EVENT_SESSION_REQUEST_CALLED,
1718 _state_none_reaction_session_request_received);
1720 session_state_closed = gfsm_create_state(SESSION_STATE_CLOSED, session_fsm,
1721 _state_closed_entry_action, _state_closed_exit_action);
1722 gfsm_add_reaction(session_state_closed, SESSION_EVENT_DELETE_SESSION,
1723 _state_closed_reaction_delete_session);
1724 /*gfsm_add_reaction(&session_state_closed, SESSION_EVENT_CONNECT_SESSION_CALLED, _state_closed_reaction_connect_session_called); */
1725 /*gfsm_add_reaction(&session_state_closed, SESSION_EVENT_REQUEST_SESSION_RECEIVED, _state_closed_reaction_request_session_received); */
1726 /*gfsm_add_reaction(&session_state_closed, SESSION_EVENT_SESSION_REQUEST_CALLED, _state_closed_reaction_session_request_received); // ???? */
1728 session_state_running = gfsm_create_state(SESSION_STATE_RUNNING, session_fsm,
1729 _state_running_entry_action, _state_running_exit_action);
1731 session_state_l2connecting = gfsm_create_state(SESSION_STATE_L2CONNECTING,
1732 session_fsm, _state_l2connecting_entry_action, _state_l2connecting_exit_action);
1733 gfsm_set_parent_state(session_state_l2connecting, session_state_running);
1734 gfsm_add_reaction(session_state_l2connecting,
1735 SESSION_EVENT_CLOSE_SESSION_CALLED,
1736 _state_l2connecting_reaction_close_session_called);
1737 gfsm_add_reaction(session_state_l2connecting, SESSION_EVENT_TIMEOUT,
1738 _state_l2connecting_reaction_timeout);
1740 session_state_session_request_sent = gfsm_create_state(
1741 SESSION_STATE_SESSION_REQUEST_SENT, session_fsm,
1742 _state_session_request_sent_entry_action,
1743 _state_session_request_sent_exit_action);
1744 gfsm_set_parent_state(session_state_session_request_sent,
1745 session_state_l2connecting);
1746 gfsm_add_reaction(session_state_session_request_sent,
1747 SESSION_EVENT_CONNECT_STATUS_CALLED,
1748 _state_session_request_sent_reaction_connect_status_called);
1749 gfsm_add_reaction(session_state_session_request_sent,
1750 SESSION_EVENT_SESSION_CONFIG_REQUEST_CALLED,
1751 _state_session_request_sent_reaction_session_config_request_called);
1753 session_state_session_request_defered = gfsm_create_state(
1754 SESSION_STATE_SESSION_REQUEST_DEFERED, session_fsm,
1755 _state_session_request_defered_entry_action,
1756 _state_session_request_defered_exit_action);
1757 gfsm_set_parent_state(session_state_session_request_defered,
1758 session_state_l2connecting);
1759 gfsm_add_reaction(session_state_session_request_defered,
1760 SESSION_EVENT_CONNECT_STATUS_CALLED,
1761 _state_session_request_defered_reaction_connect_status_called);
1762 gfsm_add_reaction(session_state_session_request_defered,
1763 SESSION_EVENT_SESSION_CONFIG_REQUEST_CALLED,
1764 _state_session_request_defered_reaction_session_config_request_called);
1766 session_state_session_request_received = gfsm_create_state(
1767 SESSION_STATE_SESSION_REQUEST_RECEIVED, session_fsm,
1768 _state_session_request_received_entry_action,
1769 _state_session_request_received_exit_action);
1770 gfsm_set_parent_state(session_state_session_request_received,
1771 session_state_l2connecting);
1772 gfsm_add_reaction(session_state_session_request_received,
1773 SESSION_EVENT_CONFIRM_SESSION_CALLED,
1774 _state_session_request_received_reaction_confirm_session_called);
1776 session_state_session_request_accepted = gfsm_create_state(
1777 SESSION_STATE_SESSION_REQUEST_ACCEPTED, session_fsm,
1778 _state_session_request_accepted_entry_action,
1779 _state_session_request_accepted_exit_action);
1780 gfsm_set_parent_state(session_state_session_request_accepted,
1781 session_state_l2connecting);
1782 gfsm_add_reaction(session_state_session_request_accepted,
1783 SESSION_EVENT_CONNECT_STATUS_CALLED,
1784 _state_session_request_accepted_reaction_connect_status_received);
1785 gfsm_add_reaction(session_state_session_request_accepted,
1786 SESSION_EVENT_SESSION_CONFIG_REQUEST_CALLED,
1787 _state_session_request_accepted_reaction_session_config_request_called);
1788 gfsm_add_reaction(session_state_session_request_accepted,
1789 SESSION_EVENT_SET_SESSION_READY_CALLED,
1790 _state_session_request_accepted_reaction_set_session_ready_called);
1792 session_state_entering_pin = gfsm_create_state(SESSION_STATE_ENTERING_PIN,
1793 session_fsm, _state_entering_pin_entry_action, _state_entering_pin_exit_action);
1794 gfsm_set_parent_state(session_state_entering_pin, session_state_l2connecting);
1795 gfsm_add_reaction(session_state_entering_pin,
1796 SESSION_EVENT_CONFIRM_SESSION_CALLED,
1797 _state_entering_pin_reaction_confirm_session_called);
1799 session_state_group_formation_completed = gfsm_create_state(
1800 SESSION_STATE_GROUP_FORMATION_COMPLETED, session_fsm,
1801 _state_group_formation_completed_entry_action,
1802 _state_group_formation_completed_exit_action);
1803 gfsm_set_parent_state(session_state_group_formation_completed,
1804 session_state_l2connecting);
1805 gfsm_add_reaction(session_state_group_formation_completed,
1806 SESSION_EVENT_IP_ASSIGNED,
1807 _state_group_formation_completed_reaction_ip_assigned);
1808 gfsm_add_reaction(session_state_group_formation_completed,
1809 SESSION_EVENT_REQUEST_SESSION_RECEIVED,
1810 _state_group_formation_completed_reaction_request_session_received);
1811 gfsm_add_reaction(session_state_group_formation_completed,
1812 SESSION_EVENT_SET_SESSION_READY_CALLED,
1813 _state_group_formation_completed_reaction_set_session_ready_called);
1815 session_state_l2connected = gfsm_create_state(SESSION_STATE_L2CONNECTED,
1816 session_fsm, _state_l2connected_entry_action, _state_l2connected_exit_action);
1817 gfsm_set_parent_state(session_state_l2connected, session_state_running);
1818 gfsm_add_reaction(session_state_l2connected, SESSION_EVENT_CLOSE_SESSION_CALLED,
1819 _state_l2connected_reaction_close_session_called);
1820 gfsm_add_reaction(session_state_l2connected,
1821 SESSION_EVENT_REMOVE_SESSION_RECEIVED,
1822 _state_l2connected_reaction_remove_session_received);
1823 gfsm_add_reaction(session_state_l2connected, SESSION_EVENT_PEER_DESTROYED,
1824 _state_l2connected_reaction_peer_destroyed);
1826 session_state_request_session_sent = gfsm_create_state(
1827 SESSION_STATE_REQUEST_SESSION_SENT, session_fsm,
1828 _state_request_session_sent_entry_action,
1829 _state_request_session_sent_exit_action);
1830 gfsm_set_parent_state(session_state_request_session_sent,
1831 session_state_l2connected);
1832 gfsm_add_reaction(session_state_request_session_sent,
1833 SESSION_EVENT_ADDED_SESSION_RECEIVED,
1834 _state_request_session_sent_reaction_added_session_received);
1835 gfsm_add_reaction(session_state_request_session_sent,
1836 SESSION_EVENT_DEFERRED_SESSION_RECEIVED,
1837 _state_request_session_sent_reaction_deferred_session_received);
1838 gfsm_add_reaction(session_state_request_session_sent,
1839 SESSION_EVENT_REJECTED_SESSION_RECEIVED,
1840 _state_request_session_sent_reaction_rejected_session_received);
1841 gfsm_add_reaction(session_state_request_session_sent, SESSION_EVENT_TIMEOUT,
1842 _state_request_session_sent_reaction_timeout);
1844 session_state_request_session_received = gfsm_create_state(
1845 SESSION_STATE_REQUEST_SESSION_RECEIVED, session_fsm,
1846 _state_request_session_received_entry_action,
1847 _state_request_session_received_exit_action);
1848 gfsm_set_parent_state(session_state_request_session_received,
1849 session_state_l2connected);
1850 gfsm_add_reaction(session_state_request_session_received,
1851 SESSION_EVENT_SET_SESSION_READY_CALLED,
1852 _state_request_session_received_reaction_set_session_ready_called);
1853 gfsm_add_reaction(session_state_request_session_received,
1854 SESSION_EVENT_DEFER_SESSION_CALLED,
1855 _state_request_session_received_reaction_defer_session_called);
1856 gfsm_add_reaction(session_state_request_session_received,
1857 SESSION_EVENT_CONFIRM_SESSION_CALLED,
1858 _state_request_session_received_reaction_confirm_session_called);
1860 session_state_open = gfsm_create_state(SESSION_STATE_OPEN, session_fsm,
1861 _state_open_entry_action, _state_open_exit_action);
1862 gfsm_set_parent_state(session_state_open, session_state_l2connected);
1863 gfsm_add_reaction(session_state_open, SESSION_EVENT_BOUND_PORT_CALLED,
1864 _state_open_reaction_bound_port_called);
1865 gfsm_add_reaction(session_state_open, SESSION_EVENT_ALLOWED_PORT_RECEIVED,
1866 _state_open_reaction_allowed_port_received);
1868 session_state_reject_session_sent = gfsm_create_state(
1869 SESSION_STATE_REJECT_SESSION_SENT, session_fsm,
1870 _state_reject_session_sent_entry_action,
1871 _state_reject_session_sent_exit_action);
1872 gfsm_add_reaction(session_state_reject_session_sent, SESSION_EVENT_ACK_RECEIVED,
1873 _state_reject_session_sent_reaction_ack_received);
1874 gfsm_add_reaction(session_state_reject_session_sent,
1875 SESSION_EVENT_NACK_RECEIVED, _state_reject_session_sent_reaction_nack_received);
1877 session_state_remove_session_sent = gfsm_create_state(
1878 SESSION_STATE_REMOVE_SESSION_SENT, session_fsm,
1879 _state_remove_session_sent_entry_action,
1880 _state_remove_session_sent_exit_action);
1881 gfsm_add_reaction(session_state_remove_session_sent, SESSION_EVENT_ACK_RECEIVED,
1882 _state_remove_session_sent_reaction_ack_received);
1883 gfsm_add_reaction(session_state_remove_session_sent,
1884 SESSION_EVENT_NACK_RECEIVED, _state_remove_session_sent_reaction_nack_received);
1886 gfsm_add_state(session_fsm, session_state_none);
1887 gfsm_add_state(session_fsm, session_state_closed);
1888 gfsm_add_state(session_fsm, session_state_running);
1890 gfsm_add_state(session_fsm, session_state_l2connecting);
1891 gfsm_add_state(session_fsm, session_state_session_request_sent);
1892 gfsm_add_state(session_fsm, session_state_session_request_defered);
1893 gfsm_add_state(session_fsm, session_state_session_request_received);
1894 gfsm_add_state(session_fsm, session_state_session_request_accepted);
1895 gfsm_add_state(session_fsm, session_state_group_formation_completed);
1897 gfsm_add_state(session_fsm, session_state_l2connected);
1898 gfsm_add_state(session_fsm, session_state_request_session_sent);
1899 gfsm_add_state(session_fsm, session_state_request_session_received);
1900 gfsm_add_state(session_fsm, session_state_open);
1902 gfsm_add_state(session_fsm, session_state_reject_session_sent);
1903 gfsm_add_state(session_fsm, session_state_remove_session_sent);
1905 gfsm_set_logger(session_fsm, _asp_session_fsm_log_func,
1907 _asp_session_fsm_get_state_name_cb,
1908 _asp_session_gfsm_get_event_name_cb);
1911 void _asp_session_fsm_terminate()
1913 gfsm_destroy_state(session_state_none);
1914 gfsm_destroy_state(session_state_closed);
1915 gfsm_destroy_state(session_state_running);
1916 gfsm_destroy_state(session_state_request_session_sent);
1917 gfsm_destroy_state(session_state_request_session_received);
1918 gfsm_destroy_state(session_state_open);
1919 gfsm_destroy_state(session_state_reject_session_sent);
1920 gfsm_destroy_state(session_state_remove_session_sent);
1922 gfsm_destroy_fsm(session_fsm);
1925 void _state_none_entry_action(void *p_context_data)
1930 void _state_none_exit_action(void *p_context_data)
1934 gfsm_state_id_t _state_none_reaction_request_session_received(
1935 void *p_context_data, void *p_event_data)
1938 asp_session_s *session = (asp_session_s *)p_context_data;
1939 asp_request_session_s *p_msg = (asp_request_session_s *)p_event_data;
1941 if (!session->over_p2p)
1942 _call_session_request_cb(0, session->session_mac, session->session_id,
1943 session->advertisement_id, NULL, 0, p_msg->session_information,
1944 p_msg->session_information_length, 0, 0);
1946 return SESSION_STATE_REQUEST_SESSION_RECEIVED;
1949 gfsm_state_id_t _state_none_reaction_connect_session_called(
1950 void *p_context_data, void *p_event_data)
1954 asp_session_s *session = (asp_session_s *)p_context_data;
1955 connect_session_param_s *p_connect_session = (connect_session_param_s *)
1960 if (session->over_p2p
1961 #ifdef HAVE_ASP_P2P_CONN
1962 && FALSE == asp_p2p_conn_peer_is_connected(p_connect_session->service_mac)
1965 #ifdef HAVE_ASP_P2P_CONN
1966 asp_p2p_conn_connect_session(session->session_mac, session->session_id,
1967 p_connect_session->service_mac, session->advertisement_id,
1968 p_connect_session->session_info, p_connect_session->info_length,
1969 p_connect_session->network_role, p_connect_session->network_config);
1971 return SESSION_STATE_SESSION_REQUEST_SENT;
1973 _send_request_session(session, p_connect_session->session_info,
1974 p_connect_session->info_length);
1975 return SESSION_STATE_REQUEST_SESSION_SENT;
1979 gfsm_state_id_t _state_none_reaction_session_request_received(
1980 void *p_context_data, void *p_event_data)
1984 asp_session_s *session = (asp_session_s *)p_context_data;
1985 session_request_param_s *p_session_request = (session_request_param_s *)
1988 _call_session_request_cb(0, session->session_mac, session->session_id,
1989 session->advertisement_id, p_session_request->device_name,
1990 p_session_request->name_length, p_session_request->session_info,
1991 p_session_request->info_length, p_session_request->get_pin,
1992 p_session_request->pin);
1994 return SESSION_STATE_SESSION_REQUEST_RECEIVED;
1997 void _state_closed_entry_action(void *p_context_data)
2001 asp_session_s *session = (asp_session_s *)p_context_data;
2005 _call_session_status_cb(0, session->session_mac, session->session_id,
2006 session->closed_state);
2008 asp_sess_peer_del_session(session->sock_addr, session->session_mac,
2009 session->session_id);
2011 gfsm_process_event(session->context,
2012 gfsm_create_event(SESSION_EVENT_DELETE_SESSION, NULL, NULL));
2015 void _state_closed_exit_action(void *p_context_data)
2019 gfsm_state_id_t _state_closed_reaction_delete_session(void *p_context_data,
2024 asp_session_s *session = (asp_session_s *)p_context_data;
2028 gfsm_destroy_context(session->context);
2030 return GFSM_DISCARD_EVENT;
2034 gfsm_state_id_t _state_closed_reaction_connect_session_called(
2035 void *p_context_data, void *p_event_data)
2039 /*asp_session_s* session = (asp_session_s*)p_context_data; */
2041 /*ASP_LOGD("_state_closed_reaction_connect_session_called - session_id : %d, peer_ip:%s, peer_port:%d", session->session_id, session->peer_ip, session->peer_port); */
2043 /*_send_request_session(session); */
2045 return SESSION_STATE_REQUEST_SESSION_SENT;
2048 gfsm_state_id_t _state_closed_reaction_request_session_received(
2049 void *p_context_data, void *p_event_data)
2053 return SESSION_STATE_REQUEST_SESSION_RECEIVED;
2057 void _state_running_entry_action(void *p_context_data)
2062 void _state_running_exit_action(void *p_context_data)
2066 void _state_l2connecting_entry_action(void *p_context_data)
2071 void _state_l2connecting_exit_action(void *p_context_data)
2075 gfsm_state_id_t _state_l2connecting_reaction_close_session_called(
2076 void *p_context_data, void *p_event_data)
2080 asp_session_s *session = (asp_session_s *)p_context_data;
2082 #ifdef HAVE_ASP_P2P_CONN
2083 asp_p2p_conn_disconnect_p2p(_get_peer_mac(session));
2086 session->closed_state =
2087 ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE; /* temporary value. shall be changed */
2089 return SESSION_STATE_CLOSED;
2092 gfsm_state_id_t _state_l2connecting_reaction_timeout(void *p_context_data,
2097 asp_session_s *session = (asp_session_s *)p_context_data;
2098 #ifdef HAVE_ASP_P2P_CONN
2100 asp_p2p_conn_disconnect_p2p(_get_peer_mac(session));
2103 session->closed_state = ASP_SESSION_CLOSED_STATE_DISASSOCIATED;
2105 return SESSION_STATE_CLOSED;
2108 void _state_session_request_sent_entry_action(void *p_context_data)
2112 asp_session_s* session = (asp_session_s*)p_context_data;
2113 /*_start_timer(...); */
2114 _call_session_status_cb(0, session->session_mac, session->session_id,
2115 ASP_SESSION_CLOSED_STATE_NONE);
2118 void _state_session_request_sent_exit_action(void *p_context_data)
2120 /*_stop_timer(...); */
2123 gfsm_state_id_t _state_session_request_sent_reaction_connect_status_called(
2124 void *p_context_data, void *p_event_data)
2128 connect_status_param_s *p_connect_status = (connect_status_param_s *)
2130 asp_session_s *session = (asp_session_s *)p_context_data;
2132 _call_connect_status_cb(0 /*?? */ , session->session_mac, session->session_id,
2133 p_connect_status->status);
2135 switch (p_connect_status->status) {
2136 case ASP_SESSION_CONNECT_STATUS_NETWORK_ROLE_REJECTED:
2137 /* need to assign a proper closed_state "session->closed_state = ???; */
2138 return SESSION_STATE_CLOSED;
2140 case ASP_SESSION_CONNECT_STATUS_NO_MORE_CONNECTION:
2141 /* need to assign a proper closed_state "session->closed_state = ???; */
2142 return SESSION_STATE_CLOSED;
2144 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_ACCEPTED:
2145 return SESSION_STATE_SESSION_REQUEST_ACCEPTED;
2147 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_DEFFERED:
2148 return SESSION_STATE_SESSION_REQUEST_DEFERED;
2150 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_FAILED:
2151 /* need to assign a proper closed_state "session->closed_state = ???; */
2152 return SESSION_STATE_CLOSED;
2154 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_SENT: /*Fall through */
2155 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_RECEIVED: /*Fall through */
2156 /*case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_STARTED: */
2157 /*case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_COMPLETED: // ???? */
2158 /*case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_FAILED: */
2160 return GFSM_DISCARD_EVENT;
2166 _state_session_request_sent_reaction_session_config_request_called(
2167 void *p_context_data, void *p_event_data)
2169 asp_session_s *session = (asp_session_s *)p_context_data;
2170 session_config_request_param_s *p_config_request_param =
2171 (session_config_request_param_s *)p_event_data;
2172 g_assert(p_config_request_param);
2174 _call_session_config_request_cb(0, session->session_mac, session->session_id,
2175 p_config_request_param->get_network_config_pin,
2176 p_config_request_param->network_config_pin);
2178 if (p_config_request_param->get_network_config_pin)
2179 return SESSION_STATE_ENTERING_PIN;
2181 return GFSM_DISCARD_EVENT;
2184 void _state_session_request_defered_entry_action(void *p_context_data)
2187 /*_start_timer(...); */
2190 void _state_session_request_defered_exit_action(void *p_context_data)
2192 /*_stop_timer(...); */
2195 gfsm_state_id_t _state_session_request_defered_reaction_connect_status_called(
2196 void *p_context_data, void *p_event_data)
2200 connect_status_param_s *p_connect_status = (connect_status_param_s *)
2202 asp_session_s *session = (asp_session_s *)p_context_data;
2204 _call_connect_status_cb(0 /*?? */ , session->session_mac, session->session_id,
2205 p_connect_status->status);
2207 switch (p_connect_status->status) {
2208 case ASP_SESSION_CONNECT_STATUS_NETWORK_ROLE_REJECTED:
2209 /* need to assign a proper closed_state "session->closed_state = ???; */
2210 return SESSION_STATE_CLOSED;
2212 case ASP_SESSION_CONNECT_STATUS_NO_MORE_CONNECTION:
2213 /* need to assign a proper closed_state "session->closed_state = ???; */
2214 return SESSION_STATE_CLOSED;
2216 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_ACCEPTED:
2217 return SESSION_STATE_SESSION_REQUEST_ACCEPTED;
2219 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_FAILED:
2220 /* need to assign a proper closed_state "session->closed_state = ???; */
2221 return SESSION_STATE_CLOSED;
2223 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_SENT: /*Fall through */
2224 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_RECEIVED: /*Fall through */
2225 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_DEFFERED:
2226 /*case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_STARTED: */
2227 /*case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_COMPLETED: // ???? */
2228 /*case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_FAILED: */
2230 return GFSM_DISCARD_EVENT;
2236 _state_session_request_defered_reaction_session_config_request_called(
2237 void *p_context_data, void *p_event_data)
2239 asp_session_s *session = (asp_session_s *)p_context_data;
2240 session_config_request_param_s *p_config_request_param =
2241 (session_config_request_param_s *)p_event_data;
2242 g_assert(p_config_request_param);
2244 _call_session_config_request_cb(0, session->session_mac, session->session_id,
2245 p_config_request_param->get_network_config_pin,
2246 p_config_request_param->network_config_pin);
2248 if (p_config_request_param->get_network_config_pin)
2249 return SESSION_STATE_ENTERING_PIN;
2251 return GFSM_DISCARD_EVENT;
2254 void _state_session_request_received_entry_action(void *p_context_data)
2258 asp_session_s* session = (asp_session_s*)p_context_data;
2260 /*_start_timer(..); */
2261 _call_session_status_cb(0, session->session_mac, session->session_id,
2262 ASP_SESSION_CLOSED_STATE_NONE);
2265 void _state_session_request_received_exit_action(void *p_context_data)
2267 /*_stop_timer(..); */
2270 gfsm_state_id_t _state_session_request_received_reaction_confirm_session_called(
2271 void *p_context_data, void *p_event_data)
2275 #ifdef HAVE_ASP_P2P_CONN
2276 asp_session_s *session = (asp_session_s *)p_context_data;
2278 confirm_session_param_s *p_confirm_session = (confirm_session_param_s *)
2280 g_assert(p_confirm_session);
2282 #ifdef HAVE_ASP_P2P_CONN
2283 asp_p2p_conn_confirm_session(session->session_mac, session->session_id,
2284 p_confirm_session->confirmed, p_confirm_session->pin);
2287 if (p_confirm_session->confirmed)
2288 return SESSION_STATE_SESSION_REQUEST_ACCEPTED;
2290 /* need to assign a proper closed_state "session->closed_state = ???; */
2291 return SESSION_STATE_CLOSED;
2295 void _state_session_request_accepted_entry_action(void *p_context_data)
2298 /*_start_timer(...) */
2301 void _state_session_request_accepted_exit_action(void *p_context_data)
2303 /*_stop_timer(...) */
2307 _state_session_request_accepted_reaction_connect_status_received(
2308 void *p_context_data, void *p_event_data)
2312 connect_status_param_s *p_connect_status = (connect_status_param_s *)
2314 asp_session_s *session = (asp_session_s *)p_context_data;
2316 _call_connect_status_cb(0 /*?? */ , session->session_mac, session->session_id,
2317 p_connect_status->status);
2319 switch (p_connect_status->status) {
2320 case ASP_SESSION_CONNECT_STATUS_NETWORK_ROLE_REJECTED:
2321 /* need to assign a proper closed_state "session->closed_state = ???; */
2322 return SESSION_STATE_CLOSED;
2324 case ASP_SESSION_CONNECT_STATUS_NO_MORE_CONNECTION:
2325 /* need to assign a proper closed_state "session->closed_state = ???; */
2326 return SESSION_STATE_CLOSED;
2328 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_FAILED:
2329 /* need to assign a proper closed_state "session->closed_state = ???; */
2330 return SESSION_STATE_CLOSED;
2332 case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_COMPLETED: /* ???? */
2333 return SESSION_STATE_GROUP_FORMATION_COMPLETED;
2335 case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_FAILED:
2336 /* need to assign a proper closed_state "session->closed_state = ???; */
2337 return SESSION_STATE_CLOSED;
2339 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_SENT: /*Fall through */
2340 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_RECEIVED: /*Fall through */
2341 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_DEFFERED: /*Fall through */
2342 /*case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_STARTED: //Fall through */
2343 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_ACCEPTED: /*Fall through */
2345 return GFSM_DISCARD_EVENT;
2351 _state_session_request_accepted_reaction_session_config_request_called(
2352 void *p_context_data, void *p_event_data)
2354 asp_session_s *session = (asp_session_s *)p_context_data;
2355 session_config_request_param_s *p_config_request_param =
2356 (session_config_request_param_s *)p_event_data;
2357 g_assert(p_config_request_param);
2359 _call_session_config_request_cb(0, session->session_mac, session->session_id,
2360 p_config_request_param->get_network_config_pin,
2361 p_config_request_param->network_config_pin);
2363 if (p_config_request_param->get_network_config_pin)
2364 return SESSION_STATE_ENTERING_PIN;
2366 return GFSM_DISCARD_EVENT;
2370 _state_session_request_accepted_reaction_set_session_ready_called(
2371 void *p_context_data, void *p_event_data)
2373 return GFSM_DEFER_EVENT;
2376 void _state_entering_pin_entry_action(void *p_context_data)
2381 void _state_entering_pin_exit_action(void *p_context_data)
2386 gfsm_state_id_t _state_entering_pin_reaction_confirm_session_called(
2387 void *p_context_data, void *p_event_data)
2389 #ifdef HAVE_ASP_P2P_CONN
2390 asp_session_s *session = (asp_session_s *)p_context_data;
2392 confirm_session_param_s *p_confirm_session = (confirm_session_param_s *)
2394 g_assert(p_confirm_session);
2396 #ifdef HAVE_ASP_P2P_CONN
2397 asp_p2p_conn_confirm_session(session->session_mac, session->session_id,
2398 p_confirm_session->confirmed, p_confirm_session->pin);
2401 if (p_confirm_session->confirmed)
2402 return SESSION_STATE_SESSION_REQUEST_ACCEPTED;
2404 /* need to assign a proper closed_state "session->closed_state = ???; */
2405 return SESSION_STATE_CLOSED;
2409 void _state_group_formation_completed_entry_action(void *p_context_data)
2411 /*_start_timer(...); */
2415 void _state_group_formation_completed_exit_action(void *p_context_data)
2417 /*_stop_timer(...); */
2420 gfsm_state_id_t _state_group_formation_completed_reaction_ip_assigned(
2421 void *p_context_data, void *p_event_data)
2424 gfsm_state_id_t ret_state = GFSM_DISCARD_EVENT;
2426 asp_session_s *session = (asp_session_s *)p_context_data;
2429 ip_assigned_param_s *p_ip_assigned_param = (ip_assigned_param_s *)p_event_data;
2430 g_assert(p_ip_assigned_param);
2432 ASP_LOGD("peer IP %s", p_ip_assigned_param->peer_ip_addr);
2433 _store_peer_ip_addr(session, p_ip_assigned_param->peer_ip_addr,
2434 p_ip_assigned_param->length);
2435 if (session->asp_role == ASP_ROLE_SEEKER) {
2436 ret_state = SESSION_STATE_REQUEST_SESSION_SENT;
2438 ret_state = SESSION_STATE_REQUEST_SESSION_RECEIVED;
2445 _state_group_formation_completed_reaction_request_session_received(
2446 void *p_context_data, void *p_event_data)
2450 /*_call_session_request_cb does not need to be called because this is over-p2p case. */
2452 return SESSION_STATE_REQUEST_SESSION_RECEIVED;
2456 _state_group_formation_completed_reaction_set_session_ready_called(
2457 void *p_context_data, void *p_event_data)
2460 return GFSM_DEFER_EVENT;
2463 void _state_l2connected_entry_action(void *p_context_data)
2467 asp_session_s *session = (asp_session_s *)p_context_data;
2469 asp_sess_peer_add_session(session->sock_addr, session->session_mac,
2470 session->session_id); /* into running state */
2473 void _state_l2connected_exit_action(void *p_context_data)
2477 gfsm_state_id_t _state_l2connected_reaction_close_session_called(
2478 void *p_context_data, void *p_event_data)
2482 guint8 *close_reason = (guint8 *) p_event_data;
2483 asp_session_s *session = (asp_session_s *)p_context_data;
2485 _send_remove_session(session, *close_reason);
2487 return SESSION_STATE_REMOVE_SESSION_SENT;
2490 gfsm_state_id_t _state_l2connected_reaction_remove_session_received(
2491 void *p_context_data, void *p_event_data)
2495 /*guint8 remove_reason = *((guint8*)p_event_data); */
2496 asp_session_s *session = (asp_session_s *)p_context_data;
2497 session->closed_state = ASP_SESSION_CLOSED_STATE_REMOTE_CLOSE;
2499 return SESSION_STATE_CLOSED;
2502 gfsm_state_id_t _state_l2connected_reaction_peer_destroyed(void *p_context_data,
2507 return SESSION_STATE_CLOSED;
2510 void _state_request_session_sent_entry_action(void *p_context_data)
2514 asp_session_s *session = (asp_session_s *)p_context_data;
2516 if(!session->over_p2p)
2517 _call_connect_status_cb(0, session->session_mac, session->session_id,
2518 ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_SENT);
2521 void _state_request_session_sent_exit_action(void *p_context_data)
2525 gfsm_state_id_t _state_request_session_sent_reaction_added_session_received(
2526 void *p_context_data, void *p_event_data)
2530 return SESSION_STATE_OPEN;
2533 gfsm_state_id_t _state_request_session_sent_reaction_deferred_session_received(
2534 void *p_context_data, void *p_event_data)
2539 asp_session_s *session = (asp_session_s *)p_context_data;
2541 _call_connect_status_cb(0, session->session_mac, session->session_id,
2542 ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_DEFFERED);
2544 return GFSM_DISCARD_EVENT;
2547 gfsm_state_id_t _state_request_session_sent_reaction_rejected_session_received(
2548 void *p_context_data, void *p_event_data)
2552 asp_session_s *session = (asp_session_s *)p_context_data;
2553 session->closed_state = ASP_SESSION_CLOSED_STATE_REMOTE_CLOSE;
2555 return SESSION_STATE_CLOSED;
2558 gfsm_state_id_t _state_request_session_sent_reaction_timeout(
2559 void *p_context_data, void *p_event_data)
2563 guint8 *remove_reason = (guint8 *) p_event_data;
2564 asp_session_s *session = (asp_session_s *)p_context_data;
2566 _send_remove_session(session, *remove_reason);
2568 return SESSION_STATE_REMOVE_SESSION_SENT;
2571 void _state_request_session_received_entry_action(void *p_context_data)
2575 asp_session_s *session = (asp_session_s *)p_context_data;
2577 if (session->over_p2p && session->confirmed &&
2578 session->asp_role == ASP_ROLE_ADVERTIZER ) {
2579 /* TODO: Set Session should done after this event*/
2581 /* session_request_cb */
2582 /* what is user data ? */
2583 _call_session_status_cb(0, session->session_mac, session->session_id,
2584 ASP_SESSION_CLOSED_STATE_NONE);
2585 _call_connect_status_cb(0, session->session_mac, session->session_id,
2586 ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_RECEIVED);
2590 void _state_request_session_received_exit_action(void *p_context_data)
2595 _state_request_session_received_reaction_set_session_ready_called(
2596 void *p_context_data, void *p_event_data)
2600 asp_session_s *session = (asp_session_s *)p_context_data;
2602 _send_added_session(session);
2604 return SESSION_STATE_OPEN;
2607 gfsm_state_id_t _state_request_session_received_reaction_defer_session_called(
2608 void *p_context_data, void *p_event_data)
2612 defer_session_param_s *defer_session_param = (defer_session_param_s *)
2614 asp_session_s *session = (asp_session_s *)p_context_data;
2616 _send_deferred_session(session, defer_session_param->deferred_response,
2617 defer_session_param->length);
2619 _call_connect_status_cb(0, session->session_mac, session->session_id,
2620 ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_DEFFERED);
2622 return GFSM_DISCARD_EVENT;
2625 gfsm_state_id_t _state_request_session_received_reaction_confirm_session_called(
2626 void *p_context_data, void *p_event_data)
2630 asp_session_s *session = (asp_session_s *)p_context_data;
2631 confirm_session_param_s *p_confirmed_param = (confirm_session_param_s *)
2634 if (FALSE == p_confirmed_param->confirmed) {
2635 _send_reject_session(session);
2637 return SESSION_STATE_REJECT_SESSION_SENT;
2639 _call_connect_status_cb(0, session->session_mac, session->session_id,
2640 ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_ACCEPTED);
2641 /* set_session_ready will be called soon */
2644 return GFSM_DISCARD_EVENT;
2647 void _state_open_entry_action(void *p_context_data)
2651 asp_session_s *session = (asp_session_s *)p_context_data;
2652 _call_session_status_cb(0, session->session_mac, session->session_id,
2653 ASP_SESSION_CLOSED_STATE_NONE);
2656 void _state_open_exit_action(void *p_context_data)
2660 gfsm_state_id_t _state_open_reaction_bound_port_called(void *p_context_data,
2665 bound_port_param_s *bound_port_param = (bound_port_param_s *)p_event_data;
2666 asp_session_s *session = (asp_session_s *)p_context_data;
2668 if (_send_allowed_port(session, bound_port_param->local_port,
2669 bound_port_param->proto)) {
2670 /* error code?, user data? */
2671 _call_port_status_cb(0, session->session_mac, session->session_id,
2672 bound_port_param->local_ip, bound_port_param->local_port,
2673 bound_port_param->proto, ASP_SESSION_PORT_STATUS_LOCAL_PORT_ALLOWED);
2675 /* error code?, user data? */
2676 _call_port_status_cb(0, session->session_mac, session->session_id,
2677 bound_port_param->local_ip, bound_port_param->local_port,
2678 bound_port_param->proto, ASP_SESSION_PORT_STATUS_LOCAL_PORT_BLOCKED);
2680 /* session close? */
2681 /* what event/state is proper? this is temporary */
2684 /* what event/state is proper? this is temporary */
2685 return GFSM_DISCARD_EVENT;
2688 gfsm_state_id_t _state_open_reaction_allowed_port_received(void *p_context_data,
2693 asp_allowed_port_s *p_allowed_port = (asp_allowed_port_s *)p_event_data;
2695 asp_session_s *session = _get_exist_session(p_allowed_port->session_id,
2696 p_allowed_port->session_mac);
2699 /* how to get error code ? */
2700 /* how to deside port status of remote ? */
2701 _call_port_status_cb(0, p_allowed_port->session_mac, p_allowed_port->session_id,
2702 session->peer_ip, p_allowed_port->port, p_allowed_port->proto,
2703 ASP_SESSION_PORT_STATUS_REMOTE_PORT_ALLOWED);
2705 return GFSM_DISCARD_EVENT;
2708 void _state_reject_session_sent_entry_action(void *p_context_data)
2712 /* asp_session_s* session = (asp_session_s*)p_context_data; */
2715 void _state_reject_session_sent_exit_action(void *p_context_data)
2719 gfsm_state_id_t _state_reject_session_sent_reaction_ack_received(
2720 void *p_context_data, void *p_event_data)
2724 asp_session_s *session = (asp_session_s *)p_context_data;
2725 session->closed_state = ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE;
2727 return SESSION_STATE_CLOSED;
2730 gfsm_state_id_t _state_reject_session_sent_reaction_nack_received(
2731 void *p_context_data, void *p_event_data)
2735 asp_session_s *session = (asp_session_s *)p_context_data;
2736 session->closed_state = ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE;
2738 return SESSION_STATE_CLOSED;
2741 void _state_remove_session_sent_entry_action(void *p_context_data)
2745 /*asp_session_s* session = (asp_session_s*)p_context_data; */
2748 void _state_remove_session_sent_exit_action(void *p_context_data)
2752 gfsm_state_id_t _state_remove_session_sent_reaction_ack_received(
2753 void *p_context_data, void *p_event_data)
2757 asp_session_s *session = (asp_session_s *)p_context_data;
2758 session->closed_state = ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE;
2760 return SESSION_STATE_CLOSED;
2763 gfsm_state_id_t _state_remove_session_sent_reaction_nack_received(
2764 void *p_context_data, void *p_event_data)
2768 asp_session_s *session = (asp_session_s *)p_context_data;
2769 session->closed_state = ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE;
2771 return SESSION_STATE_CLOSED;