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);
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, gchar *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 %d", p_param->peer_ip_addr, p_param->length);
799 gfsm_process_event(session->context,
800 gfsm_create_event(SESSION_EVENT_IP_ASSIGNED, p_param, g_free));
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;
1552 inetaddr = G_INET_SOCKET_ADDRESS(sock_addr);
1553 hostaddr = g_inet_socket_address_get_address(inetaddr);
1555 g_strlcpy(peer_ip, g_inet_address_to_string(hostaddr),
1556 ASP_SESSION_IPV4_STR_LEN);
1558 ASP_LOGD("%s peer_ip: %s", ROLE, peer_ip);
1560 /*g_object_unref(hostaddr); */
1561 /*g_object_unref(inetaddr); */
1564 /*****************************************************************************
1565 * Local Function for state machine
1566 *****************************************************************************/
1568 const char *_asp_session_fsm_get_state_name_cb(gfsm_state_id_t state_id)
1570 const char *ret_val = NULL;
1573 case SESSION_STATE_NONE:
1574 ret_val = "SESSION_STATE_NONE";
1576 case SESSION_STATE_CLOSED:
1577 ret_val = "SESSION_STATE_CLOSED";
1579 case SESSION_STATE_RUNNING:
1580 ret_val = "SESSION_STATE_RUNNING";
1582 case SESSION_STATE_L2CONNECTING:
1583 ret_val = "SESSION_STATE_L2CONNECTING";
1585 case SESSION_STATE_SESSION_REQUEST_SENT:
1586 ret_val = "SESSION_STATE_SESSION_REQUEST_SENT";
1588 case SESSION_STATE_SESSION_REQUEST_RECEIVED:
1589 ret_val = "SESSION_STATE_SESSION_REQUEST_RECEIVED";
1591 case SESSION_STATE_SESSION_REQUEST_DEFERED:
1592 ret_val = "SESSION_STATE_SESSION_REQUEST_DEFERED";
1594 case SESSION_STATE_SESSION_REQUEST_ACCEPTED:
1595 ret_val = "SESSION_STATE_SESSION_REQUEST_ACCEPTED";
1597 case SESSION_STATE_ENTERING_PIN:
1598 ret_val = "SESSION_STATE_ENTERING_PIN";
1600 case SESSION_STATE_GROUP_FORMATION_COMPLETED:
1601 ret_val = "SESSION_STATE_GROUP_FORMATION_COMPLETED";
1603 case SESSION_STATE_L2CONNECTED:
1604 ret_val = "SESSION_STATE_L2CONNECTED";
1606 case SESSION_STATE_REQUEST_SESSION_SENT:
1607 ret_val = "SESSION_STATE_REQUEST_SESSION_SENT";
1609 case SESSION_STATE_OPEN:
1610 ret_val = "SESSION_STATE_OPEN";
1612 case SESSION_STATE_REQUEST_SESSION_RECEIVED:
1613 ret_val = "SESSION_STATE_REQUEST_SESSION_RECEIVED";
1615 case SESSION_STATE_REJECT_SESSION_SENT:
1616 ret_val = "SESSION_STATE_REJECT_SESSION_SENT";
1618 case SESSION_STATE_REMOVE_SESSION_SENT:
1619 ret_val = "SESSION_STATE_REMOVE_SESSION_SENT";
1622 ret_val = "SESSION_STATE_MAX";
1629 const char *_asp_session_gfsm_get_event_name_cb(gfsm_event_id_t event_id)
1631 const char *ret_val = NULL;
1634 case SESSION_EVENT_BOUND_PORT_CALLED:
1635 ret_val = "SESSION_EVENT_BOUND_PORT_CALLED";
1637 case SESSION_EVENT_CLOSE_SESSION_CALLED:
1638 ret_val = "SESSION_EVENT_CLOSE_SESSION_CALLED";
1640 case SESSION_EVENT_CONNECT_SESSION_CALLED:
1641 ret_val = "SESSION_EVENT_CONNECT_SESSION_CALLED";
1643 case SESSION_EVENT_CONFIRM_SESSION_CALLED:
1644 ret_val = "SESSION_EVENT_CONFIRM_SESSION_CALLED";
1646 case SESSION_EVENT_DEFER_SESSION_CALLED:
1647 ret_val = "SESSION_EVENT_DEFER_SESSION_CALLED";
1649 case SESSION_EVENT_SET_SESSION_READY_CALLED:
1650 ret_val = "SESSION_EVENT_SET_SESSION_READY_CALLED";
1652 case SESSION_EVENT_SESSION_REQUEST_CALLED:
1653 ret_val = "SESSION_EVENT_SESSION_REQUEST_CALLED";
1655 case SESSION_EVENT_SESSION_CONFIG_REQUEST_CALLED:
1656 ret_val = "SESSION_EVENT_SESSION_CONFIG_REQUEST_CALLED";
1658 case SESSION_EVENT_CONNECT_STATUS_CALLED:
1659 ret_val = "SESSION_EVENT_CONNECT_STATUS_CALLED";
1661 case SESSION_EVENT_IP_ASSIGNED:
1662 ret_val = "SESSION_EVENT_IP_ASSIGNED";
1664 case SESSION_EVENT_REMOVE_SESSION_RECEIVED:
1665 ret_val = "SESSION_EVENT_REMOVE_SESSION_RECEIVED";
1667 case SESSION_EVENT_ALLOWED_PORT_RECEIVED:
1668 ret_val = "SESSION_EVENT_ALLOWED_PORT_RECEIVED";
1670 case SESSION_EVENT_DEFERRED_SESSION_RECEIVED:
1671 ret_val = "SESSION_EVENT_DEFERRED_SESSION_RECEIVED";
1673 case SESSION_EVENT_REJECTED_SESSION_RECEIVED:
1674 ret_val = "SESSION_EVENT_REJECTED_SESSION_RECEIVED";
1676 case SESSION_EVENT_ADDED_SESSION_RECEIVED:
1677 ret_val = "SESSION_EVENT_ADDED_SESSION_RECEIVED";
1679 case SESSION_EVENT_REQUEST_SESSION_RECEIVED:
1680 ret_val = "SESSION_EVENT_REQUEST_SESSION_RECEIVED";
1682 case SESSION_EVENT_ACK_RECEIVED:
1683 ret_val = "SESSION_EVENT_ACK_RECEIVED";
1685 case SESSION_EVENT_NACK_RECEIVED:
1686 ret_val = "SESSION_EVENT_NACK_RECEIVED";
1688 case SESSION_EVENT_PEER_DESTROYED:
1689 ret_val = "SESSION_EVENT_PEER_DESTROYED";
1691 case SESSION_EVENT_TIMEOUT:
1692 ret_val = "SESSION_EVENT_TIMEOUT";
1694 case SESSION_EVENT_DELETE_SESSION:
1695 ret_val = "SESSION_EVENT_DELETE_SESSION";
1698 ret_val = "SESSION_EVENT_MAX";
1705 int _asp_session_fsm_log_func(const char *format, ...)
1709 va_start(args, format);
1710 g_vsnprintf(buffer, 255, format, args);
1713 ASP_LOGD("%s", buffer);
1719 void _asp_session_fsm_init()
1723 session_fsm = gfsm_create_fsm(SESSION_STATE_MAX, SESSION_EVENT_MAX,
1724 SESSION_STATE_NONE);
1726 session_state_none = gfsm_create_state(SESSION_STATE_NONE, session_fsm,
1727 _state_none_entry_action, _state_none_exit_action);
1728 gfsm_add_reaction(session_state_none, SESSION_EVENT_CONNECT_SESSION_CALLED,
1729 _state_none_reaction_connect_session_called);
1730 gfsm_add_reaction(session_state_none, SESSION_EVENT_REQUEST_SESSION_RECEIVED,
1731 _state_none_reaction_request_session_received);
1732 gfsm_add_reaction(session_state_none, SESSION_EVENT_SESSION_REQUEST_CALLED,
1733 _state_none_reaction_session_request_received);
1735 session_state_closed = gfsm_create_state(SESSION_STATE_CLOSED, session_fsm,
1736 _state_closed_entry_action, _state_closed_exit_action);
1737 gfsm_add_reaction(session_state_closed, SESSION_EVENT_DELETE_SESSION,
1738 _state_closed_reaction_delete_session);
1739 /*gfsm_add_reaction(&session_state_closed, SESSION_EVENT_CONNECT_SESSION_CALLED, _state_closed_reaction_connect_session_called); */
1740 /*gfsm_add_reaction(&session_state_closed, SESSION_EVENT_REQUEST_SESSION_RECEIVED, _state_closed_reaction_request_session_received); */
1741 /*gfsm_add_reaction(&session_state_closed, SESSION_EVENT_SESSION_REQUEST_CALLED, _state_closed_reaction_session_request_received); // ???? */
1743 session_state_running = gfsm_create_state(SESSION_STATE_RUNNING, session_fsm,
1744 _state_running_entry_action, _state_running_exit_action);
1746 session_state_l2connecting = gfsm_create_state(SESSION_STATE_L2CONNECTING,
1747 session_fsm, _state_l2connecting_entry_action, _state_l2connecting_exit_action);
1748 gfsm_set_parent_state(session_state_l2connecting, session_state_running);
1749 gfsm_add_reaction(session_state_l2connecting,
1750 SESSION_EVENT_CLOSE_SESSION_CALLED,
1751 _state_l2connecting_reaction_close_session_called);
1752 gfsm_add_reaction(session_state_l2connecting, SESSION_EVENT_TIMEOUT,
1753 _state_l2connecting_reaction_timeout);
1755 session_state_session_request_sent = gfsm_create_state(
1756 SESSION_STATE_SESSION_REQUEST_SENT, session_fsm,
1757 _state_session_request_sent_entry_action,
1758 _state_session_request_sent_exit_action);
1759 gfsm_set_parent_state(session_state_session_request_sent,
1760 session_state_l2connecting);
1761 gfsm_add_reaction(session_state_session_request_sent,
1762 SESSION_EVENT_CONNECT_STATUS_CALLED,
1763 _state_session_request_sent_reaction_connect_status_called);
1764 gfsm_add_reaction(session_state_session_request_sent,
1765 SESSION_EVENT_SESSION_CONFIG_REQUEST_CALLED,
1766 _state_session_request_sent_reaction_session_config_request_called);
1768 session_state_session_request_defered = gfsm_create_state(
1769 SESSION_STATE_SESSION_REQUEST_DEFERED, session_fsm,
1770 _state_session_request_defered_entry_action,
1771 _state_session_request_defered_exit_action);
1772 gfsm_set_parent_state(session_state_session_request_defered,
1773 session_state_l2connecting);
1774 gfsm_add_reaction(session_state_session_request_defered,
1775 SESSION_EVENT_CONNECT_STATUS_CALLED,
1776 _state_session_request_defered_reaction_connect_status_called);
1777 gfsm_add_reaction(session_state_session_request_defered,
1778 SESSION_EVENT_SESSION_CONFIG_REQUEST_CALLED,
1779 _state_session_request_defered_reaction_session_config_request_called);
1781 session_state_session_request_received = gfsm_create_state(
1782 SESSION_STATE_SESSION_REQUEST_RECEIVED, session_fsm,
1783 _state_session_request_received_entry_action,
1784 _state_session_request_received_exit_action);
1785 gfsm_set_parent_state(session_state_session_request_received,
1786 session_state_l2connecting);
1787 gfsm_add_reaction(session_state_session_request_received,
1788 SESSION_EVENT_CONFIRM_SESSION_CALLED,
1789 _state_session_request_received_reaction_confirm_session_called);
1791 session_state_session_request_accepted = gfsm_create_state(
1792 SESSION_STATE_SESSION_REQUEST_ACCEPTED, session_fsm,
1793 _state_session_request_accepted_entry_action,
1794 _state_session_request_accepted_exit_action);
1795 gfsm_set_parent_state(session_state_session_request_accepted,
1796 session_state_l2connecting);
1797 gfsm_add_reaction(session_state_session_request_accepted,
1798 SESSION_EVENT_CONNECT_STATUS_CALLED,
1799 _state_session_request_accepted_reaction_connect_status_received);
1800 gfsm_add_reaction(session_state_session_request_accepted,
1801 SESSION_EVENT_SESSION_CONFIG_REQUEST_CALLED,
1802 _state_session_request_accepted_reaction_session_config_request_called);
1803 gfsm_add_reaction(session_state_session_request_accepted,
1804 SESSION_EVENT_SET_SESSION_READY_CALLED,
1805 _state_session_request_accepted_reaction_set_session_ready_called);
1807 session_state_entering_pin = gfsm_create_state(SESSION_STATE_ENTERING_PIN,
1808 session_fsm, _state_entering_pin_entry_action, _state_entering_pin_exit_action);
1809 gfsm_set_parent_state(session_state_entering_pin, session_state_l2connecting);
1810 gfsm_add_reaction(session_state_entering_pin,
1811 SESSION_EVENT_CONFIRM_SESSION_CALLED,
1812 _state_entering_pin_reaction_confirm_session_called);
1814 session_state_group_formation_completed = gfsm_create_state(
1815 SESSION_STATE_GROUP_FORMATION_COMPLETED, session_fsm,
1816 _state_group_formation_completed_entry_action,
1817 _state_group_formation_completed_exit_action);
1818 gfsm_set_parent_state(session_state_group_formation_completed,
1819 session_state_l2connecting);
1820 gfsm_add_reaction(session_state_group_formation_completed,
1821 SESSION_EVENT_IP_ASSIGNED,
1822 _state_group_formation_completed_reaction_ip_assigned);
1823 gfsm_add_reaction(session_state_group_formation_completed,
1824 SESSION_EVENT_REQUEST_SESSION_RECEIVED,
1825 _state_group_formation_completed_reaction_request_session_received);
1826 gfsm_add_reaction(session_state_group_formation_completed,
1827 SESSION_EVENT_SET_SESSION_READY_CALLED,
1828 _state_group_formation_completed_reaction_set_session_ready_called);
1830 session_state_l2connected = gfsm_create_state(SESSION_STATE_L2CONNECTED,
1831 session_fsm, _state_l2connected_entry_action, _state_l2connected_exit_action);
1832 gfsm_set_parent_state(session_state_l2connected, session_state_running);
1833 gfsm_add_reaction(session_state_l2connected, SESSION_EVENT_CLOSE_SESSION_CALLED,
1834 _state_l2connected_reaction_close_session_called);
1835 gfsm_add_reaction(session_state_l2connected,
1836 SESSION_EVENT_REMOVE_SESSION_RECEIVED,
1837 _state_l2connected_reaction_remove_session_received);
1838 gfsm_add_reaction(session_state_l2connected, SESSION_EVENT_PEER_DESTROYED,
1839 _state_l2connected_reaction_peer_destroyed);
1841 session_state_request_session_sent = gfsm_create_state(
1842 SESSION_STATE_REQUEST_SESSION_SENT, session_fsm,
1843 _state_request_session_sent_entry_action,
1844 _state_request_session_sent_exit_action);
1845 gfsm_set_parent_state(session_state_request_session_sent,
1846 session_state_l2connected);
1847 gfsm_add_reaction(session_state_request_session_sent,
1848 SESSION_EVENT_ADDED_SESSION_RECEIVED,
1849 _state_request_session_sent_reaction_added_session_received);
1850 gfsm_add_reaction(session_state_request_session_sent,
1851 SESSION_EVENT_DEFERRED_SESSION_RECEIVED,
1852 _state_request_session_sent_reaction_deferred_session_received);
1853 gfsm_add_reaction(session_state_request_session_sent,
1854 SESSION_EVENT_REJECTED_SESSION_RECEIVED,
1855 _state_request_session_sent_reaction_rejected_session_received);
1856 gfsm_add_reaction(session_state_request_session_sent, SESSION_EVENT_TIMEOUT,
1857 _state_request_session_sent_reaction_timeout);
1859 session_state_request_session_received = gfsm_create_state(
1860 SESSION_STATE_REQUEST_SESSION_RECEIVED, session_fsm,
1861 _state_request_session_received_entry_action,
1862 _state_request_session_received_exit_action);
1863 gfsm_set_parent_state(session_state_request_session_received,
1864 session_state_l2connected);
1865 gfsm_add_reaction(session_state_request_session_received,
1866 SESSION_EVENT_SET_SESSION_READY_CALLED,
1867 _state_request_session_received_reaction_set_session_ready_called);
1868 gfsm_add_reaction(session_state_request_session_received,
1869 SESSION_EVENT_DEFER_SESSION_CALLED,
1870 _state_request_session_received_reaction_defer_session_called);
1871 gfsm_add_reaction(session_state_request_session_received,
1872 SESSION_EVENT_CONFIRM_SESSION_CALLED,
1873 _state_request_session_received_reaction_confirm_session_called);
1875 session_state_open = gfsm_create_state(SESSION_STATE_OPEN, session_fsm,
1876 _state_open_entry_action, _state_open_exit_action);
1877 gfsm_set_parent_state(session_state_open, session_state_l2connected);
1878 gfsm_add_reaction(session_state_open, SESSION_EVENT_BOUND_PORT_CALLED,
1879 _state_open_reaction_bound_port_called);
1880 gfsm_add_reaction(session_state_open, SESSION_EVENT_ALLOWED_PORT_RECEIVED,
1881 _state_open_reaction_allowed_port_received);
1883 session_state_reject_session_sent = gfsm_create_state(
1884 SESSION_STATE_REJECT_SESSION_SENT, session_fsm,
1885 _state_reject_session_sent_entry_action,
1886 _state_reject_session_sent_exit_action);
1887 gfsm_add_reaction(session_state_reject_session_sent, SESSION_EVENT_ACK_RECEIVED,
1888 _state_reject_session_sent_reaction_ack_received);
1889 gfsm_add_reaction(session_state_reject_session_sent,
1890 SESSION_EVENT_NACK_RECEIVED, _state_reject_session_sent_reaction_nack_received);
1892 session_state_remove_session_sent = gfsm_create_state(
1893 SESSION_STATE_REMOVE_SESSION_SENT, session_fsm,
1894 _state_remove_session_sent_entry_action,
1895 _state_remove_session_sent_exit_action);
1896 gfsm_add_reaction(session_state_remove_session_sent, SESSION_EVENT_ACK_RECEIVED,
1897 _state_remove_session_sent_reaction_ack_received);
1898 gfsm_add_reaction(session_state_remove_session_sent,
1899 SESSION_EVENT_NACK_RECEIVED, _state_remove_session_sent_reaction_nack_received);
1900 gfsm_add_reaction(session_state_remove_session_sent, SESSION_EVENT_PEER_DESTROYED,
1901 _state_remove_session_sent_reaction_peer_destroyed);
1903 gfsm_add_state(session_fsm, session_state_none);
1904 gfsm_add_state(session_fsm, session_state_closed);
1905 gfsm_add_state(session_fsm, session_state_running);
1907 gfsm_add_state(session_fsm, session_state_l2connecting);
1908 gfsm_add_state(session_fsm, session_state_session_request_sent);
1909 gfsm_add_state(session_fsm, session_state_session_request_defered);
1910 gfsm_add_state(session_fsm, session_state_session_request_received);
1911 gfsm_add_state(session_fsm, session_state_session_request_accepted);
1912 gfsm_add_state(session_fsm, session_state_group_formation_completed);
1914 gfsm_add_state(session_fsm, session_state_l2connected);
1915 gfsm_add_state(session_fsm, session_state_request_session_sent);
1916 gfsm_add_state(session_fsm, session_state_request_session_received);
1917 gfsm_add_state(session_fsm, session_state_open);
1919 gfsm_add_state(session_fsm, session_state_reject_session_sent);
1920 gfsm_add_state(session_fsm, session_state_remove_session_sent);
1922 gfsm_set_logger(session_fsm, _asp_session_fsm_log_func,
1924 _asp_session_fsm_get_state_name_cb,
1925 _asp_session_gfsm_get_event_name_cb);
1928 void _asp_session_fsm_terminate()
1930 gfsm_destroy_state(session_state_none);
1931 gfsm_destroy_state(session_state_closed);
1932 gfsm_destroy_state(session_state_running);
1933 gfsm_destroy_state(session_state_request_session_sent);
1934 gfsm_destroy_state(session_state_request_session_received);
1935 gfsm_destroy_state(session_state_open);
1936 gfsm_destroy_state(session_state_reject_session_sent);
1937 gfsm_destroy_state(session_state_remove_session_sent);
1939 gfsm_destroy_fsm(session_fsm);
1942 void _state_none_entry_action(void *p_context_data)
1947 void _state_none_exit_action(void *p_context_data)
1951 gfsm_state_id_t _state_none_reaction_request_session_received(
1952 void *p_context_data, void *p_event_data)
1955 asp_session_s *session = (asp_session_s *)p_context_data;
1956 asp_request_session_s *p_msg = (asp_request_session_s *)p_event_data;
1958 if (!session->over_p2p)
1959 _call_session_request_cb(0, session->session_mac, session->session_id,
1960 session->advertisement_id, NULL, 0, p_msg->session_information,
1961 p_msg->session_information_length, 0, 0);
1963 return SESSION_STATE_REQUEST_SESSION_RECEIVED;
1966 gfsm_state_id_t _state_none_reaction_connect_session_called(
1967 void *p_context_data, void *p_event_data)
1971 asp_session_s *session = (asp_session_s *)p_context_data;
1972 connect_session_param_s *p_connect_session = (connect_session_param_s *)
1977 if (session->over_p2p
1978 #ifdef HAVE_ASP_P2P_CONN
1979 && FALSE == asp_p2p_conn_peer_is_connected(p_connect_session->service_mac)
1982 #ifdef HAVE_ASP_P2P_CONN
1983 asp_p2p_conn_connect_session(session->session_mac, session->session_id,
1984 p_connect_session->service_mac, session->advertisement_id,
1985 p_connect_session->session_info, p_connect_session->info_length,
1986 p_connect_session->network_role, p_connect_session->network_config);
1988 return SESSION_STATE_SESSION_REQUEST_SENT;
1990 _send_request_session(session, p_connect_session->session_info,
1991 p_connect_session->info_length);
1992 return SESSION_STATE_REQUEST_SESSION_SENT;
1996 gfsm_state_id_t _state_none_reaction_session_request_received(
1997 void *p_context_data, void *p_event_data)
2001 asp_session_s *session = (asp_session_s *)p_context_data;
2002 session_request_param_s *p_session_request = (session_request_param_s *)
2005 _call_session_request_cb(0, session->session_mac, session->session_id,
2006 session->advertisement_id, p_session_request->device_name,
2007 p_session_request->name_length, p_session_request->session_info,
2008 p_session_request->info_length, p_session_request->get_pin,
2009 p_session_request->pin);
2011 return SESSION_STATE_SESSION_REQUEST_RECEIVED;
2014 void _state_closed_entry_action(void *p_context_data)
2018 asp_session_s *session = (asp_session_s *)p_context_data;
2022 _call_session_status_cb(0, session->session_mac, session->session_id,
2023 session->closed_state);
2025 asp_sess_peer_del_session(session->sock_addr, session->session_mac,
2026 session->session_id);
2028 gfsm_process_event(session->context,
2029 gfsm_create_event(SESSION_EVENT_DELETE_SESSION, NULL, NULL));
2032 void _state_closed_exit_action(void *p_context_data)
2036 gfsm_state_id_t _state_closed_reaction_delete_session(void *p_context_data,
2041 asp_session_s *session = (asp_session_s *)p_context_data;
2045 gfsm_destroy_context(session->context);
2047 return GFSM_DISCARD_EVENT;
2051 gfsm_state_id_t _state_closed_reaction_connect_session_called(
2052 void *p_context_data, void *p_event_data)
2056 /*asp_session_s* session = (asp_session_s*)p_context_data; */
2058 /*ASP_LOGD("_state_closed_reaction_connect_session_called - session_id : %d, peer_ip:%s, peer_port:%d", session->session_id, session->peer_ip, session->peer_port); */
2060 /*_send_request_session(session); */
2062 return SESSION_STATE_REQUEST_SESSION_SENT;
2065 gfsm_state_id_t _state_closed_reaction_request_session_received(
2066 void *p_context_data, void *p_event_data)
2070 return SESSION_STATE_REQUEST_SESSION_RECEIVED;
2074 void _state_running_entry_action(void *p_context_data)
2079 void _state_running_exit_action(void *p_context_data)
2083 void _state_l2connecting_entry_action(void *p_context_data)
2088 void _state_l2connecting_exit_action(void *p_context_data)
2092 gfsm_state_id_t _state_l2connecting_reaction_close_session_called(
2093 void *p_context_data, void *p_event_data)
2097 asp_session_s *session = (asp_session_s *)p_context_data;
2099 #ifdef HAVE_ASP_P2P_CONN
2100 asp_p2p_conn_disconnect_p2p(_get_peer_mac(session));
2103 session->closed_state =
2104 ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE; /* temporary value. shall be changed */
2106 return SESSION_STATE_CLOSED;
2109 gfsm_state_id_t _state_l2connecting_reaction_timeout(void *p_context_data,
2114 asp_session_s *session = (asp_session_s *)p_context_data;
2115 #ifdef HAVE_ASP_P2P_CONN
2117 asp_p2p_conn_disconnect_p2p(_get_peer_mac(session));
2120 session->closed_state = ASP_SESSION_CLOSED_STATE_DISASSOCIATED;
2122 return SESSION_STATE_CLOSED;
2125 void _state_session_request_sent_entry_action(void *p_context_data)
2129 asp_session_s* session = (asp_session_s*)p_context_data;
2130 /*_start_timer(...); */
2131 _call_session_status_cb(0, session->session_mac, session->session_id,
2132 ASP_SESSION_CLOSED_STATE_NONE);
2135 void _state_session_request_sent_exit_action(void *p_context_data)
2137 /*_stop_timer(...); */
2140 gfsm_state_id_t _state_session_request_sent_reaction_connect_status_called(
2141 void *p_context_data, void *p_event_data)
2145 connect_status_param_s *p_connect_status = (connect_status_param_s *)
2147 asp_session_s *session = (asp_session_s *)p_context_data;
2149 _call_connect_status_cb(0 /*?? */ , session->session_mac, session->session_id,
2150 p_connect_status->status);
2152 switch (p_connect_status->status) {
2153 case ASP_SESSION_CONNECT_STATUS_NETWORK_ROLE_REJECTED:
2154 /* need to assign a proper closed_state "session->closed_state = ???; */
2155 return SESSION_STATE_CLOSED;
2157 case ASP_SESSION_CONNECT_STATUS_NO_MORE_CONNECTION:
2158 /* need to assign a proper closed_state "session->closed_state = ???; */
2159 return SESSION_STATE_CLOSED;
2161 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_ACCEPTED:
2162 return SESSION_STATE_SESSION_REQUEST_ACCEPTED;
2164 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_DEFFERED:
2165 return SESSION_STATE_SESSION_REQUEST_DEFERED;
2167 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_FAILED:
2168 /* need to assign a proper closed_state "session->closed_state = ???; */
2169 return SESSION_STATE_CLOSED;
2171 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_SENT: /*Fall through */
2172 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_RECEIVED: /*Fall through */
2173 /*case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_STARTED: */
2174 /*case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_COMPLETED: // ???? */
2175 /*case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_FAILED: */
2177 return GFSM_DISCARD_EVENT;
2183 _state_session_request_sent_reaction_session_config_request_called(
2184 void *p_context_data, void *p_event_data)
2186 asp_session_s *session = (asp_session_s *)p_context_data;
2187 session_config_request_param_s *p_config_request_param =
2188 (session_config_request_param_s *)p_event_data;
2189 g_assert(p_config_request_param);
2191 _call_session_config_request_cb(0, session->session_mac, session->session_id,
2192 p_config_request_param->get_network_config_pin,
2193 p_config_request_param->network_config_pin);
2195 if (p_config_request_param->get_network_config_pin)
2196 return SESSION_STATE_ENTERING_PIN;
2198 return GFSM_DISCARD_EVENT;
2201 void _state_session_request_defered_entry_action(void *p_context_data)
2204 /*_start_timer(...); */
2207 void _state_session_request_defered_exit_action(void *p_context_data)
2209 /*_stop_timer(...); */
2212 gfsm_state_id_t _state_session_request_defered_reaction_connect_status_called(
2213 void *p_context_data, void *p_event_data)
2217 connect_status_param_s *p_connect_status = (connect_status_param_s *)
2219 asp_session_s *session = (asp_session_s *)p_context_data;
2221 _call_connect_status_cb(0 /*?? */ , session->session_mac, session->session_id,
2222 p_connect_status->status);
2224 switch (p_connect_status->status) {
2225 case ASP_SESSION_CONNECT_STATUS_NETWORK_ROLE_REJECTED:
2226 /* need to assign a proper closed_state "session->closed_state = ???; */
2227 return SESSION_STATE_CLOSED;
2229 case ASP_SESSION_CONNECT_STATUS_NO_MORE_CONNECTION:
2230 /* need to assign a proper closed_state "session->closed_state = ???; */
2231 return SESSION_STATE_CLOSED;
2233 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_ACCEPTED:
2234 return SESSION_STATE_SESSION_REQUEST_ACCEPTED;
2236 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_FAILED:
2237 /* need to assign a proper closed_state "session->closed_state = ???; */
2238 return SESSION_STATE_CLOSED;
2240 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_SENT: /*Fall through */
2241 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_RECEIVED: /*Fall through */
2242 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_DEFFERED:
2243 /*case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_STARTED: */
2244 /*case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_COMPLETED: // ???? */
2245 /*case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_FAILED: */
2247 return GFSM_DISCARD_EVENT;
2253 _state_session_request_defered_reaction_session_config_request_called(
2254 void *p_context_data, void *p_event_data)
2256 asp_session_s *session = (asp_session_s *)p_context_data;
2257 session_config_request_param_s *p_config_request_param =
2258 (session_config_request_param_s *)p_event_data;
2259 g_assert(p_config_request_param);
2261 _call_session_config_request_cb(0, session->session_mac, session->session_id,
2262 p_config_request_param->get_network_config_pin,
2263 p_config_request_param->network_config_pin);
2265 if (p_config_request_param->get_network_config_pin)
2266 return SESSION_STATE_ENTERING_PIN;
2268 return GFSM_DISCARD_EVENT;
2271 void _state_session_request_received_entry_action(void *p_context_data)
2275 asp_session_s* session = (asp_session_s*)p_context_data;
2277 /*_start_timer(..); */
2278 _call_session_status_cb(0, session->session_mac, session->session_id,
2279 ASP_SESSION_CLOSED_STATE_NONE);
2282 void _state_session_request_received_exit_action(void *p_context_data)
2284 /*_stop_timer(..); */
2287 gfsm_state_id_t _state_session_request_received_reaction_confirm_session_called(
2288 void *p_context_data, void *p_event_data)
2292 #ifdef HAVE_ASP_P2P_CONN
2293 asp_session_s *session = (asp_session_s *)p_context_data;
2295 confirm_session_param_s *p_confirm_session = (confirm_session_param_s *)
2297 g_assert(p_confirm_session);
2299 #ifdef HAVE_ASP_P2P_CONN
2300 asp_p2p_conn_confirm_session(session->session_mac, session->session_id,
2301 p_confirm_session->confirmed, p_confirm_session->pin);
2304 if (p_confirm_session->confirmed)
2305 return SESSION_STATE_SESSION_REQUEST_ACCEPTED;
2307 /* need to assign a proper closed_state "session->closed_state = ???; */
2308 return SESSION_STATE_CLOSED;
2312 void _state_session_request_accepted_entry_action(void *p_context_data)
2315 /*_start_timer(...) */
2318 void _state_session_request_accepted_exit_action(void *p_context_data)
2320 /*_stop_timer(...) */
2324 _state_session_request_accepted_reaction_connect_status_received(
2325 void *p_context_data, void *p_event_data)
2329 connect_status_param_s *p_connect_status = (connect_status_param_s *)
2331 asp_session_s *session = (asp_session_s *)p_context_data;
2333 _call_connect_status_cb(0 /*?? */ , session->session_mac, session->session_id,
2334 p_connect_status->status);
2336 switch (p_connect_status->status) {
2337 case ASP_SESSION_CONNECT_STATUS_NETWORK_ROLE_REJECTED:
2338 /* need to assign a proper closed_state "session->closed_state = ???; */
2339 return SESSION_STATE_CLOSED;
2341 case ASP_SESSION_CONNECT_STATUS_NO_MORE_CONNECTION:
2342 /* need to assign a proper closed_state "session->closed_state = ???; */
2343 return SESSION_STATE_CLOSED;
2345 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_FAILED:
2346 /* need to assign a proper closed_state "session->closed_state = ???; */
2347 return SESSION_STATE_CLOSED;
2349 case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_COMPLETED: /* ???? */
2350 return SESSION_STATE_GROUP_FORMATION_COMPLETED;
2352 case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_FAILED:
2353 /* need to assign a proper closed_state "session->closed_state = ???; */
2354 return SESSION_STATE_CLOSED;
2356 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_SENT: /*Fall through */
2357 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_RECEIVED: /*Fall through */
2358 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_DEFFERED: /*Fall through */
2359 /*case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_STARTED: //Fall through */
2360 case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_ACCEPTED: /*Fall through */
2362 return GFSM_DISCARD_EVENT;
2368 _state_session_request_accepted_reaction_session_config_request_called(
2369 void *p_context_data, void *p_event_data)
2371 asp_session_s *session = (asp_session_s *)p_context_data;
2372 session_config_request_param_s *p_config_request_param =
2373 (session_config_request_param_s *)p_event_data;
2374 g_assert(p_config_request_param);
2376 _call_session_config_request_cb(0, session->session_mac, session->session_id,
2377 p_config_request_param->get_network_config_pin,
2378 p_config_request_param->network_config_pin);
2380 if (p_config_request_param->get_network_config_pin)
2381 return SESSION_STATE_ENTERING_PIN;
2383 return GFSM_DISCARD_EVENT;
2387 _state_session_request_accepted_reaction_set_session_ready_called(
2388 void *p_context_data, void *p_event_data)
2390 return GFSM_DEFER_EVENT;
2393 void _state_entering_pin_entry_action(void *p_context_data)
2398 void _state_entering_pin_exit_action(void *p_context_data)
2403 gfsm_state_id_t _state_entering_pin_reaction_confirm_session_called(
2404 void *p_context_data, void *p_event_data)
2406 #ifdef HAVE_ASP_P2P_CONN
2407 asp_session_s *session = (asp_session_s *)p_context_data;
2409 confirm_session_param_s *p_confirm_session = (confirm_session_param_s *)
2411 g_assert(p_confirm_session);
2413 #ifdef HAVE_ASP_P2P_CONN
2414 asp_p2p_conn_confirm_session(session->session_mac, session->session_id,
2415 p_confirm_session->confirmed, p_confirm_session->pin);
2418 if (p_confirm_session->confirmed)
2419 return SESSION_STATE_SESSION_REQUEST_ACCEPTED;
2421 /* need to assign a proper closed_state "session->closed_state = ???; */
2422 return SESSION_STATE_CLOSED;
2426 void _state_group_formation_completed_entry_action(void *p_context_data)
2428 /*_start_timer(...); */
2432 void _state_group_formation_completed_exit_action(void *p_context_data)
2434 /*_stop_timer(...); */
2437 gfsm_state_id_t _state_group_formation_completed_reaction_ip_assigned(
2438 void *p_context_data, void *p_event_data)
2441 gfsm_state_id_t ret_state = GFSM_DISCARD_EVENT;
2443 asp_session_s *session = (asp_session_s *)p_context_data;
2446 ip_assigned_param_s *p_ip_assigned_param = (ip_assigned_param_s *)p_event_data;
2447 g_assert(p_ip_assigned_param);
2449 ASP_LOGD("peer IP %s", p_ip_assigned_param->peer_ip_addr);
2450 _store_peer_ip_addr(session, p_ip_assigned_param->peer_ip_addr,
2451 p_ip_assigned_param->length);
2452 if (session->asp_role == ASP_ROLE_SEEKER)
2453 ret_state = SESSION_STATE_REQUEST_SESSION_SENT;
2455 ret_state = SESSION_STATE_REQUEST_SESSION_RECEIVED;
2461 _state_group_formation_completed_reaction_request_session_received(
2462 void *p_context_data, void *p_event_data)
2466 /*_call_session_request_cb does not need to be called because this is over-p2p case. */
2468 return SESSION_STATE_REQUEST_SESSION_RECEIVED;
2472 _state_group_formation_completed_reaction_set_session_ready_called(
2473 void *p_context_data, void *p_event_data)
2476 return GFSM_DEFER_EVENT;
2479 void _state_l2connected_entry_action(void *p_context_data)
2483 asp_session_s *session = (asp_session_s *)p_context_data;
2485 asp_sess_peer_add_session(session->sock_addr, session->session_mac,
2486 session->session_id); /* into running state */
2489 void _state_l2connected_exit_action(void *p_context_data)
2493 gfsm_state_id_t _state_l2connected_reaction_close_session_called(
2494 void *p_context_data, void *p_event_data)
2498 guint8 *close_reason = (guint8 *) p_event_data;
2499 asp_session_s *session = (asp_session_s *)p_context_data;
2501 _send_remove_session(session, *close_reason);
2503 return SESSION_STATE_REMOVE_SESSION_SENT;
2506 gfsm_state_id_t _state_l2connected_reaction_remove_session_received(
2507 void *p_context_data, void *p_event_data)
2511 /*guint8 remove_reason = *((guint8*)p_event_data); */
2512 asp_session_s *session = (asp_session_s *)p_context_data;
2513 session->closed_state = ASP_SESSION_CLOSED_STATE_REMOTE_CLOSE;
2515 return SESSION_STATE_CLOSED;
2518 gfsm_state_id_t _state_l2connected_reaction_peer_destroyed(void *p_context_data,
2523 return SESSION_STATE_CLOSED;
2526 void _state_request_session_sent_entry_action(void *p_context_data)
2530 asp_session_s *session = (asp_session_s *)p_context_data;
2532 if (!session->over_p2p)
2533 _call_connect_status_cb(0, session->session_mac, session->session_id,
2534 ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_SENT);
2537 void _state_request_session_sent_exit_action(void *p_context_data)
2541 gfsm_state_id_t _state_request_session_sent_reaction_added_session_received(
2542 void *p_context_data, void *p_event_data)
2546 return SESSION_STATE_OPEN;
2549 gfsm_state_id_t _state_request_session_sent_reaction_deferred_session_received(
2550 void *p_context_data, void *p_event_data)
2555 asp_session_s *session = (asp_session_s *)p_context_data;
2557 _call_connect_status_cb(0, session->session_mac, session->session_id,
2558 ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_DEFFERED);
2560 return GFSM_DISCARD_EVENT;
2563 gfsm_state_id_t _state_request_session_sent_reaction_rejected_session_received(
2564 void *p_context_data, void *p_event_data)
2568 asp_session_s *session = (asp_session_s *)p_context_data;
2569 session->closed_state = ASP_SESSION_CLOSED_STATE_REMOTE_CLOSE;
2571 return SESSION_STATE_CLOSED;
2574 gfsm_state_id_t _state_request_session_sent_reaction_timeout(
2575 void *p_context_data, void *p_event_data)
2579 guint8 *remove_reason = (guint8 *) p_event_data;
2580 asp_session_s *session = (asp_session_s *)p_context_data;
2582 _send_remove_session(session, *remove_reason);
2584 return SESSION_STATE_REMOVE_SESSION_SENT;
2587 void _state_request_session_received_entry_action(void *p_context_data)
2591 asp_session_s *session = (asp_session_s *)p_context_data;
2593 if (session->over_p2p && session->confirmed &&
2594 session->asp_role == ASP_ROLE_ADVERTIZER) {
2595 /* TODO: Set Session should done after this event */
2597 /* session_request_cb */
2598 /* what is user data ? */
2599 _call_session_status_cb(0, session->session_mac, session->session_id,
2600 ASP_SESSION_CLOSED_STATE_NONE);
2601 _call_connect_status_cb(0, session->session_mac, session->session_id,
2602 ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_RECEIVED);
2606 void _state_request_session_received_exit_action(void *p_context_data)
2611 _state_request_session_received_reaction_set_session_ready_called(
2612 void *p_context_data, void *p_event_data)
2616 asp_session_s *session = (asp_session_s *)p_context_data;
2618 _send_added_session(session);
2620 return SESSION_STATE_OPEN;
2623 gfsm_state_id_t _state_request_session_received_reaction_defer_session_called(
2624 void *p_context_data, void *p_event_data)
2628 defer_session_param_s *defer_session_param = (defer_session_param_s *)
2630 asp_session_s *session = (asp_session_s *)p_context_data;
2632 _send_deferred_session(session, defer_session_param->deferred_response,
2633 defer_session_param->length);
2635 _call_connect_status_cb(0, session->session_mac, session->session_id,
2636 ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_DEFFERED);
2638 return GFSM_DISCARD_EVENT;
2641 gfsm_state_id_t _state_request_session_received_reaction_confirm_session_called(
2642 void *p_context_data, void *p_event_data)
2646 asp_session_s *session = (asp_session_s *)p_context_data;
2647 confirm_session_param_s *p_confirmed_param = (confirm_session_param_s *)
2650 if (FALSE == p_confirmed_param->confirmed) {
2651 _send_reject_session(session);
2653 return SESSION_STATE_REJECT_SESSION_SENT;
2655 _call_connect_status_cb(0, session->session_mac, session->session_id,
2656 ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_ACCEPTED);
2657 /* set_session_ready will be called soon */
2660 return GFSM_DISCARD_EVENT;
2663 void _state_open_entry_action(void *p_context_data)
2667 asp_session_s *session = (asp_session_s *)p_context_data;
2668 _call_session_status_cb(0, session->session_mac, session->session_id,
2669 ASP_SESSION_CLOSED_STATE_NONE);
2672 void _state_open_exit_action(void *p_context_data)
2676 gfsm_state_id_t _state_open_reaction_bound_port_called(void *p_context_data,
2681 bound_port_param_s *bound_port_param = (bound_port_param_s *)p_event_data;
2682 asp_session_s *session = (asp_session_s *)p_context_data;
2684 if (_send_allowed_port(session, bound_port_param->local_port,
2685 bound_port_param->proto)) {
2686 /* error code?, user data? */
2687 _call_port_status_cb(0, session->session_mac, session->session_id,
2688 bound_port_param->local_ip, bound_port_param->local_port,
2689 bound_port_param->proto, ASP_SESSION_PORT_STATUS_LOCAL_PORT_ALLOWED);
2691 /* error code?, user data? */
2692 _call_port_status_cb(0, session->session_mac, session->session_id,
2693 bound_port_param->local_ip, bound_port_param->local_port,
2694 bound_port_param->proto, ASP_SESSION_PORT_STATUS_LOCAL_PORT_BLOCKED);
2696 /* session close? */
2697 /* what event/state is proper? this is temporary */
2700 /* what event/state is proper? this is temporary */
2701 return GFSM_DISCARD_EVENT;
2704 gfsm_state_id_t _state_open_reaction_allowed_port_received(void *p_context_data,
2709 asp_allowed_port_s *p_allowed_port = (asp_allowed_port_s *)p_event_data;
2711 asp_session_s *session = _get_exist_session(p_allowed_port->session_id,
2712 p_allowed_port->session_mac);
2715 /* how to get error code ? */
2716 /* how to deside port status of remote ? */
2717 _call_port_status_cb(0, p_allowed_port->session_mac, p_allowed_port->session_id,
2718 session->peer_ip, p_allowed_port->port, p_allowed_port->proto,
2719 ASP_SESSION_PORT_STATUS_REMOTE_PORT_ALLOWED);
2721 return GFSM_DISCARD_EVENT;
2724 void _state_reject_session_sent_entry_action(void *p_context_data)
2728 /* asp_session_s* session = (asp_session_s*)p_context_data; */
2731 void _state_reject_session_sent_exit_action(void *p_context_data)
2735 gfsm_state_id_t _state_reject_session_sent_reaction_ack_received(
2736 void *p_context_data, void *p_event_data)
2740 asp_session_s *session = (asp_session_s *)p_context_data;
2741 session->closed_state = ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE;
2743 return SESSION_STATE_CLOSED;
2746 gfsm_state_id_t _state_reject_session_sent_reaction_nack_received(
2747 void *p_context_data, void *p_event_data)
2751 asp_session_s *session = (asp_session_s *)p_context_data;
2752 session->closed_state = ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE;
2754 return SESSION_STATE_CLOSED;
2757 void _state_remove_session_sent_entry_action(void *p_context_data)
2761 /*asp_session_s* session = (asp_session_s*)p_context_data; */
2764 void _state_remove_session_sent_exit_action(void *p_context_data)
2768 gfsm_state_id_t _state_remove_session_sent_reaction_ack_received(
2769 void *p_context_data, void *p_event_data)
2773 asp_session_s *session = (asp_session_s *)p_context_data;
2774 session->closed_state = ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE;
2776 return SESSION_STATE_CLOSED;
2779 gfsm_state_id_t _state_remove_session_sent_reaction_nack_received(
2780 void *p_context_data, void *p_event_data)
2784 asp_session_s *session = (asp_session_s *)p_context_data;
2785 session->closed_state = ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE;
2787 return SESSION_STATE_CLOSED;
2790 static gfsm_state_id_t _state_remove_session_sent_reaction_peer_destroyed(
2791 void *p_context_data, void *p_event_data)
2795 asp_session_s *session = (asp_session_s *)p_context_data;
2796 session->closed_state = ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE;
2798 return SESSION_STATE_CLOSED;