2 #include "asp-session-peer.h"
3 #include "asp-session-peer-interface.h"
4 #include "asp-coordination-protocol.h"
5 #include "asp-manager-util.h"
7 #define ASP_SESS_PEER_FSM_TRACE_ENTER()
8 #define ASP_SESS_PEER_FSM_TRACE_LEAVE()
10 #define ASP_SESS_PEER_HEADER "SESSION_PEER_FSM"
12 typedef struct asp_sess_peer {
13 gfsm_context_s *context;
14 GSocketAddress *p_sock_addr;
18 void *p_sending_msg_data;
22 typedef struct asp_sess_peer_key {
26 } asp_sess_peer_key_s;
28 typedef struct asp_sess_peer_sess_key {
31 } asp_sess_peer_sess_key_s;
33 enum asp_sess_peer_state_t {
34 ASP_S_PEER_STATE_INIT,
35 ASP_S_PEER_STATE_CREATED,
36 ASP_S_PEER_STATE_VERSION_SENT,
37 ASP_S_PEER_STATE_WAIT_VERSION,
38 ASP_S_PEER_STATE_WAIT_ACK,
39 ASP_S_PEER_STATE_OPENED,
40 ASP_S_PEER_STATE_IDLE,
41 /* ASP_S_PEER_STATE_REQ_SENT, */
42 ASP_S_PEER_STATE_CLOSED,
46 enum asp_sess_peer_event_t {
47 ASP_S_PEER_EVENT_START,
48 ASP_S_PEER_EVENT_ADD_SESSION,
49 ASP_S_PEER_EVENT_DEL_SESSION,
50 ASP_S_PEER_EVENT_SEND_REQ,
51 ASP_S_PEER_EVENT_SEND_ACK,
52 ASP_S_PEER_EVENT_SEND_NACK,
53 ASP_S_PEER_EVENT_RECV_VERSION,
54 ASP_S_PEER_EVENT_RECV_REQ,
55 ASP_S_PEER_EVENT_RECV_ACK,
56 ASP_S_PEER_EVENT_RECV_NACK,
57 ASP_S_PEER_EVENT_TIMEOUT,
58 ASP_S_PEER_EVENT_CLOSE,
62 static asp_sess_peer_s *_asp_sess_peer_create_peer(GSocketAddress *p_sock_addr);
63 static void _asp_sess_peer_destroy_peer(void *p_peer);
64 static asp_sess_peer_s *_asp_sess_peer_tree_find_peer(GSocketAddress
66 static gboolean _asp_sess_peer_tree_insert_peer(GSocketAddress *p_sock_addr,
67 asp_sess_peer_s *p_peer);
68 /*static gboolean _asp_sess_peer_tree_remove_peer(GSocketAddress* p_sock_addr); */
69 static gint _asp_sess_peer_tree_compare_cb(gconstpointer a, gconstpointer b,
70 gpointer p_user_data);
71 static void _asp_sess_peer_tree_key_destructor_cb(gpointer a);
72 static void _asp_sess_peer_tree_value_destructor_cb(gpointer a);
73 static void *asp_sess_peer_dup_msg_data(void *p_msg);
74 static void _asp_sess_peer_set_sending_msg_data(asp_sess_peer_s *p_peer,
76 static asp_sess_peer_sess_key_s *_asp_sess_peer_sess_tree_create_key(
77 guint8 session_mac[], guint32 session_id);
78 static gint _asp_sess_peer_sess_tree_compare_cb(gconstpointer a,
79 gconstpointer b, gpointer user_data);
80 static void _asp_sess_peer_sess_tree_key_destructor_cb(gpointer p_data);
81 static void _asp_sess_peer_sess_tree_value_destructor_cb(gpointer p_value);
82 static void _asp_sess_peer_stop_timer(asp_sess_peer_s *p_peer);
83 static void _asp_sess_peer_start_timer(asp_sess_peer_s *p_peer, guint sec);
85 static gboolean _asp_sess_peer_send_req(GSocketAddress *p_sock_addr,
87 static gboolean _asp_sess_peer_send_ack(GSocketAddress *p_sock_addr,
89 static gboolean _asp_sess_peer_send_nack(GSocketAddress *p_sock_addr,
92 static gboolean _asp_sess_peer_recv_req(GSocketAddress *p_sock_addr,
94 static gboolean _asp_sess_peer_recv_ack(GSocketAddress *p_sock_addr,
96 static gboolean _asp_sess_peer_recv_nack(GSocketAddress *p_sock_addr,
99 static gboolean _asp_sess_peer_recv_version(GSocketAddress *p_sock_addr,
101 static void _asp_sess_peer_send_nack_to_protocol(GSocketAddress *p_sock_addr,
102 guint8 seq_num, guint8 reason);
104 void _asp_sess_peer_state_init_entry_action(void *p_context_data);
105 static void _asp_sess_peer_state_init_exit_action(void *p_context_data);
106 static gfsm_state_id_t _asp_sess_peer_state_init_reaction_start(
107 void *p_context_data, void *p_event_data);
109 static void _asp_sess_peer_state_created_entry_action(void *p_context_data);
110 static void _asp_sess_peer_state_created_exit_action(void *p_context_data);
111 static gfsm_state_id_t _asp_sess_peer_state_created_reaction_add_session(
112 void *p_context_data, void *p_event_data);
113 static gfsm_state_id_t _asp_sess_peer_state_created_reaction_del_session(
114 void *p_context_data, void *p_event_data);
115 static gfsm_state_id_t _asp_sess_peer_state_created_reaction_close(
116 void *p_context_data, void *p_event_data);
117 static gfsm_state_id_t _asp_sess_peer_state_created_reaction_send_ack(
118 void *p_context_data, void *p_event_data);
119 static gfsm_state_id_t _asp_sess_peer_state_created_reaction_send_nack(
120 void *p_context_data, void *p_event_data);
122 static void _asp_sess_peer_state_version_sent_entry_action(
123 void *p_context_data);
124 static void _asp_sess_peer_state_version_sent_exit_action(void *p_context_data);
125 /*static gfsm_state_id_t asp_sess_peer_state_version_sent_reaction_send_req (void* p_context_data, void* p_event_data); */
126 /*static gfsm_state_id_t asp_sess_peer_state_version_sent_reaction_recv_version (void* p_context_data, void* p_event_data); */
127 /*static gfsm_state_id_t asp_sess_peer_state_version_sent_reaction_recv_req (void* p_context_data, void* p_event_data); */
128 static gfsm_state_id_t _asp_sess_peer_state_version_sent_reaction_recv_ack(
129 void *p_context_data, void *p_event_data);
130 static gfsm_state_id_t _asp_sess_peer_state_version_sent_reaction_recv_nack(
131 void *p_context_data, void *p_event_data);
132 static gfsm_state_id_t _asp_sess_peer_state_version_sent_reaction_timeout(
133 void *p_context_data, void *p_event_data);
135 static void _asp_sess_peer_state_wait_version_entry_action(
136 void *p_context_data);
137 static void _asp_sess_peer_state_wait_version_exit_action(void *p_context_data);
138 /*static gfsm_state_id_t asp_sess_peer_state_wait_version_reaction_send_req (void* p_context_data, void* p_event_data); */
139 static gfsm_state_id_t _asp_sess_peer_state_wait_version_reaction_recv_version(
140 void *p_context_data, void *p_event_data);
141 static gfsm_state_id_t _asp_sess_peer_state_wait_version_reaction_recv_req(
142 void *p_context_data, void *p_event_data);
143 /*static gfsm_state_id_t asp_sess_peer_state_wait_version_reaction_recv_ack (void* p_context_data, void* p_event_data); */
144 /*static gfsm_state_id_t asp_sess_peer_state_wait_version_reaction_recv_nack (void* p_context_data, void* p_event_data); */
145 static gfsm_state_id_t _asp_sess_peer_state_wait_version_reaction_timeout(
146 void *p_context_data, void *p_event_data);
148 static void _asp_sess_peer_state_opened_entry_action(void *p_context_data);
149 static void _asp_sess_peer_state_opened_exit_action(void *p_context_data);
150 static gfsm_state_id_t _asp_sess_peer_state_opened_reaction_recv_version(
151 void *p_context_data, void *p_event_data);
152 static gfsm_state_id_t _asp_sess_peer_state_opened_reaction_recv_req(
153 void *p_context_data, void *p_event_data);
155 static void _asp_sess_peer_state_idle_entry_action(void *p_context_data);
156 static void _asp_sess_peer_state_idle_exit_action(void *p_context_data);
157 static gfsm_state_id_t _asp_sess_peer_state_idle_reaction_send_req(
158 void *p_context_data, void *p_event_data);
160 static void _asp_sess_peer_state_wait_ack_entry_action(void *p_context_data);
161 static void _asp_sess_peer_state_wait_ack_exit_action(void *p_context_data);
162 /*static gfsm_state_id_t asp_sess_peer_state_wait_ack_reaction_send_req (void* p_context_data, void* p_event_data); */
163 static gfsm_state_id_t _asp_sess_peer_state_wait_ack_reaction_recv_ack(
164 void *p_context_data, void *p_event_data);
165 static gfsm_state_id_t _asp_sess_peer_state_wait_ack_reaction_recv_nack(
166 void *p_context_data, void *p_event_data);
167 static gfsm_state_id_t _asp_sess_peer_state_wait_ack_reaction_timeout(
168 void *p_context_data, void *p_event_data);
170 static void _asp_sess_peer_state_close_entry_action(void *p_context_data);
171 static void _asp_sess_peer_state_close_exit_action(void *p_context_data);
173 static void asp_sess_peer_fsm_init();
175 static gfsm_s *asm_sess_peer_fsm;
176 static gfsm_state_s *asp_sess_peer_state_init;
177 static gfsm_state_s *asp_sess_peer_state_created;
178 static gfsm_state_s *asp_sess_peer_state_version_sent;
179 static gfsm_state_s *asp_sess_peer_state_wait_version;
180 static gfsm_state_s *asp_sess_peer_state_opened;
181 static gfsm_state_s *asp_sess_peer_state_idle;
182 /*static gfsm_state_s asp_sess_peer_state_req_sent; */
183 static gfsm_state_s *asp_sess_peer_state_wait_ack;
184 static gfsm_state_s *asp_sess_peer_state_closed;
185 static GTree *gp_peer_tree = 0;
187 void asp_sess_peer_init()
191 gp_peer_tree = g_tree_new_full(_asp_sess_peer_tree_compare_cb, NULL,
192 _asp_sess_peer_tree_key_destructor_cb, _asp_sess_peer_tree_value_destructor_cb);
194 asp_sess_peer_fsm_init();
196 asp_coordination_protocol_init();
199 void asp_sess_peer_destroy()
203 gfsm_destroy_fsm(asm_sess_peer_fsm);
204 g_tree_destroy(gp_peer_tree);
208 gboolean asp_sess_peer_send_msg(GSocketAddress *p_sock_addr, void *p_msg)
212 asp_coord_header_s *p_header = (asp_coord_header_s *)p_msg;
214 switch (p_header->opcode) {
215 case ASP_OPCODE_REQUEST_SESSION:
216 ASP_LOGD("%s asp_sess_peer_send_msg, ASP_OPCODE_REQUEST_SESSION session_id:%d",
217 ROLE, ((asp_request_session_s *)p_msg)->session_id);
218 return _asp_sess_peer_send_req(p_sock_addr, p_msg);
219 case ASP_OPCODE_ADDED_SESSION:
221 case ASP_OPCODE_REJECTED_SESSION:
223 case ASP_OPCODE_REMOVE_SESSION:
225 case ASP_OPCODE_ALLOWED_PORT:
227 case ASP_OPCODE_DEFERRED_SESSION:
228 return _asp_sess_peer_send_req(p_sock_addr, p_msg);
229 case ASP_OPCODE_VERSION:
232 return _asp_sess_peer_send_ack(p_sock_addr, p_msg);
233 case ASP_OPCODE_NACK:
234 return _asp_sess_peer_send_nack(p_sock_addr, p_msg);
242 gboolean asp_sess_peer_recv_msg(GSocketAddress *p_sock_addr, void *p_msg)
246 asp_coord_header_s *p_header = (asp_coord_header_s *)p_msg;
248 switch (p_header->opcode) {
249 case ASP_OPCODE_REQUEST_SESSION:
251 case ASP_OPCODE_ADDED_SESSION:
253 case ASP_OPCODE_REJECTED_SESSION:
255 case ASP_OPCODE_REMOVE_SESSION:
257 case ASP_OPCODE_ALLOWED_PORT:
259 case ASP_OPCODE_DEFERRED_SESSION:
260 return _asp_sess_peer_recv_req(p_sock_addr, p_msg);
261 case ASP_OPCODE_VERSION:
262 return _asp_sess_peer_recv_version(p_sock_addr, p_msg);
264 return _asp_sess_peer_recv_ack(p_sock_addr, p_msg);
265 case ASP_OPCODE_NACK:
266 return _asp_sess_peer_recv_nack(p_sock_addr, p_msg);
268 _asp_sess_peer_send_nack_to_protocol(p_sock_addr, p_header->seq_num,
269 ASP_NACK_REASON_INVALID_OPCODE);
276 gboolean _asp_sess_peer_send_req(GSocketAddress *p_sock_addr, void *p_msg)
280 asp_sess_peer_s *p_peer = _asp_sess_peer_tree_find_peer(p_sock_addr);
282 if (NULL == p_peer) {
283 p_peer = _asp_sess_peer_create_peer(p_sock_addr);
286 gfsm_process_event(&(p_peer->context), gfsm_create_event(ASP_S_PEER_EVENT_START,
290 if (p_peer && p_peer->context)
291 gfsm_process_event(&(p_peer->context), gfsm_create_event(ASP_S_PEER_EVENT_SEND_REQ,
292 asp_sess_peer_dup_msg_data(p_msg), g_free));
297 gboolean _asp_sess_peer_send_ack(GSocketAddress *p_sock_addr, void *p_msg)
301 asp_sess_peer_s *p_peer = _asp_sess_peer_tree_find_peer(p_sock_addr);
306 gfsm_process_event(&(p_peer->context), gfsm_create_event(ASP_S_PEER_EVENT_SEND_ACK,
307 asp_sess_peer_dup_msg_data(p_msg), g_free));
312 gboolean _asp_sess_peer_send_nack(GSocketAddress *p_sock_addr, void *p_msg)
316 asp_sess_peer_s *p_peer = _asp_sess_peer_tree_find_peer(p_sock_addr);
321 gfsm_process_event(&(p_peer->context),
322 gfsm_create_event(ASP_S_PEER_EVENT_SEND_NACK, asp_sess_peer_dup_msg_data(p_msg),
328 gboolean _asp_sess_peer_recv_version(GSocketAddress *p_sock_addr, void *p_msg)
332 asp_sess_peer_s *p_peer = _asp_sess_peer_tree_find_peer(p_sock_addr);
334 if (NULL == p_peer) {
335 p_peer = _asp_sess_peer_create_peer(p_sock_addr);
340 ack.opcode = ASP_OPCODE_ACK;
341 ack.seq_num = ((asp_version_s *)p_msg)->seq_num;
342 asp_coordination_protocol_send_msg(p_sock_addr, &ack);
344 gfsm_process_event(&(p_peer->context), gfsm_create_event(ASP_S_PEER_EVENT_START,
348 ack.opcode = ASP_OPCODE_ACK;
349 ack.seq_num = ((asp_version_s *)p_msg)->seq_num;
350 asp_coordination_protocol_send_msg(p_sock_addr, &ack);
353 if (p_peer && p_peer->context)
354 gfsm_process_event(&(p_peer->context),
355 gfsm_create_event(ASP_S_PEER_EVENT_RECV_VERSION,
356 asp_sess_peer_dup_msg_data(p_msg), g_free));
361 gboolean _asp_sess_peer_recv_req(GSocketAddress *p_sock_addr, void *p_msg)
365 asp_sess_peer_s *p_peer = _asp_sess_peer_tree_find_peer(p_sock_addr);
366 asp_coord_header_s *p_header = (asp_coord_header_s *)p_msg;
368 if (NULL == p_peer) {
369 _asp_sess_peer_send_nack_to_protocol(p_sock_addr, p_header->seq_num,
370 ASP_NACK_REASON_NO_SESSION_EXIST);
374 gfsm_process_event(&(p_peer->context), gfsm_create_event(ASP_S_PEER_EVENT_RECV_REQ,
375 asp_sess_peer_dup_msg_data(p_msg), g_free));
380 gboolean _asp_sess_peer_recv_ack(GSocketAddress *p_sock_addr, void *p_msg)
384 asp_sess_peer_s *p_peer = _asp_sess_peer_tree_find_peer(p_sock_addr);
389 asp_request_header_s *p_header = (asp_request_header_s *)
390 p_peer->p_sending_msg_data;
391 ASP_LOGD("%s _asp_sess_peer_recv_ack, opcode:%d session_id:%d", ROLE,
392 p_header->opcode, p_header->session_id);
394 gfsm_process_event(&(p_peer->context), gfsm_create_event(ASP_S_PEER_EVENT_RECV_ACK,
395 asp_sess_peer_dup_msg_data(p_msg), g_free));
400 gboolean _asp_sess_peer_recv_nack(GSocketAddress *p_sock_addr, void *p_msg)
404 asp_sess_peer_s *p_peer = _asp_sess_peer_tree_find_peer(p_sock_addr);
409 gfsm_process_event(&(p_peer->context),
410 gfsm_create_event(ASP_S_PEER_EVENT_RECV_NACK, asp_sess_peer_dup_msg_data(p_msg),
416 gboolean asp_sess_peer_add_session(GSocketAddress *p_sock_addr,
417 guint8 session_mac[], guint32 session_id)
421 asp_sess_peer_s *p_peer = _asp_sess_peer_tree_find_peer(p_sock_addr);
423 if (NULL == p_peer) {
424 ASP_LOGD("create peer");
425 p_peer = _asp_sess_peer_create_peer(p_sock_addr);
428 gfsm_process_event(&(p_peer->context), gfsm_create_event(ASP_S_PEER_EVENT_START,
431 if (p_peer && p_peer->context)
432 gfsm_process_event(&(p_peer->context),
433 gfsm_create_event(ASP_S_PEER_EVENT_ADD_SESSION,
434 _asp_sess_peer_sess_tree_create_key(session_mac, session_id), g_free));
439 gboolean asp_sess_peer_del_session(GSocketAddress *p_sock_addr,
440 guint8 session_mac[], guint32 session_id)
444 asp_sess_peer_s *p_peer = NULL;
446 if (p_sock_addr == NULL)
449 p_peer = _asp_sess_peer_tree_find_peer(p_sock_addr);
453 /*asp_sess_peer_remove_session(p_peer,session_mac,sessiond_id); */
454 gfsm_process_event(&(p_peer->context),
455 gfsm_create_event(ASP_S_PEER_EVENT_DEL_SESSION,
456 _asp_sess_peer_sess_tree_create_key(session_mac, session_id), g_free));
461 asp_sess_peer_key_s *_asp_sess_peer_tree_create_peer_key(
462 GSocketAddress *p_sock_addr)
466 GInetSocketAddress *p_inet_sock_addr = G_INET_SOCKET_ADDRESS(p_sock_addr);
468 g_assert(p_inet_sock_addr);
470 GInetAddress *p_inet_addr = g_inet_socket_address_get_address(p_inet_sock_addr);
472 g_assert(p_inet_addr);
474 asp_sess_peer_key_s *p_key = (asp_sess_peer_key_s *) g_malloc(sizeof(
475 asp_sess_peer_key_s));
479 p_key->ip_addr_len = g_inet_address_get_native_size(p_inet_addr);
481 memcpy(p_key->ip_addr, g_inet_address_to_bytes(p_inet_addr),
484 p_key->port = g_inet_socket_address_get_port(p_inet_sock_addr);
486 /*g_object_unref(p_inet_addr); // */
491 asp_sess_peer_s *_asp_sess_peer_tree_find_peer(GSocketAddress *p_sock_addr)
495 asp_sess_peer_key_s *p_key = _asp_sess_peer_tree_create_peer_key(p_sock_addr);
499 return (asp_sess_peer_s *) g_tree_lookup(gp_peer_tree, p_key);
502 gboolean _asp_sess_peer_tree_insert_peer(GSocketAddress *p_sock_addr,
503 asp_sess_peer_s *p_peer)
507 asp_sess_peer_key_s *p_key = _asp_sess_peer_tree_create_peer_key(p_sock_addr);
511 g_tree_insert(gp_peer_tree, p_key, p_peer);
517 gboolean _asp_sess_peer_tree_remove_peer(GSocketAddress* p_sock_addr)
519 asp_sess_peer_key_s* p_key = _asp_sess_peer_tree_create_peer_key(p_sock_addr);
523 g_tree_remove(gp_peer_tree, p_key);
529 gint _asp_sess_peer_tree_compare_cb(gconstpointer a, gconstpointer b,
530 gpointer p_user_data)
532 asp_sess_peer_key_s *p_l = (asp_sess_peer_key_s *) a;
533 asp_sess_peer_key_s *p_r = (asp_sess_peer_key_s *) b;
535 g_assert(p_l->ip_addr_len == 4 || p_l->ip_addr_len == 16);
537 if (p_l->port < p_r->port)
539 else if (p_l->port > p_r->port)
541 else if (p_l->ip_addr_len < p_r->ip_addr_len)
543 else if (p_l->ip_addr_len > p_r->ip_addr_len)
546 return memcmp(p_l->ip_addr, p_r->ip_addr, p_l->ip_addr_len);
549 void _asp_sess_peer_tree_key_destructor_cb(gpointer a)
554 void _asp_sess_peer_tree_value_destructor_cb(gpointer a)
559 asp_sess_peer_s *_asp_sess_peer_create_peer(GSocketAddress *p_sock_addr)
563 asp_sess_peer_s *p_peer = (asp_sess_peer_s *) g_malloc(sizeof(asp_sess_peer_s));
567 p_peer->p_sock_addr = (GSocketAddress *) g_object_ref(p_sock_addr);
570 p_peer->timer_id = 0;
571 p_peer->p_sending_msg_data = 0;
572 p_peer->p_sess_tree = g_tree_new_full(_asp_sess_peer_sess_tree_compare_cb,
574 _asp_sess_peer_sess_tree_key_destructor_cb,
575 _asp_sess_peer_sess_tree_value_destructor_cb);
577 ASP_LOGD("insert peer");
578 _asp_sess_peer_tree_insert_peer(p_sock_addr, p_peer);
580 p_peer->context = gfsm_create_context(asm_sess_peer_fsm,
581 _asp_sess_peer_destroy_peer, p_peer);
586 void _asp_sess_peer_destroy_peer(void *p_context_data)
588 asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data;
591 if (p_peer->p_sock_addr) {
592 g_object_unref(p_peer->p_sock_addr);
593 p_peer->p_sock_addr = 0;
596 if (p_peer->p_sending_msg_data) {
597 g_free(p_peer->p_sending_msg_data);
598 p_peer->p_sending_msg_data = 0;
601 if (p_peer->p_sess_tree) {
602 g_tree_destroy(p_peer->p_sess_tree);
603 p_peer->p_sess_tree = 0;
609 void _asp_sess_peer_set_sending_msg_data(asp_sess_peer_s *p_peer, void *p_msg)
613 asp_coord_header_s *p_header = (asp_coord_header_s *)p_msg;
615 if (p_peer->p_sending_msg_data)
616 g_free(p_peer->p_sending_msg_data);
620 p_header->seq_num = p_peer->seq_num;
622 p_peer->p_sending_msg_data = p_msg;
625 void _asp_sess_peer_clear_sending_msg_data(asp_sess_peer_s *p_peer)
629 if (p_peer->p_sending_msg_data) {
630 g_free(p_peer->p_sending_msg_data);
631 p_peer->p_sending_msg_data = 0;
635 void _asp_sess_peer_forward_req_to_sessmgmt(asp_sess_peer_s *p_peer,
638 asp_session_recv_req(p_peer->p_sock_addr, p_msg_data);
641 void _asp_sess_peer_forward_ack_to_sessmgmt(asp_sess_peer_s *p_peer,
644 asp_request_header_s *p_header = (asp_request_header_s *)
645 p_peer->p_sending_msg_data;
646 asp_session_recv_ack(p_peer->p_sock_addr, p_header->session_mac,
647 p_header->session_id, p_msg_data);
650 void _asp_sess_peer_forward_nack_to_sessmgmt(asp_sess_peer_s *p_peer,
653 asp_request_header_s *p_header = (asp_request_header_s *)
654 p_peer->p_sending_msg_data;
655 asp_session_recv_nack(p_peer->p_sock_addr, p_header->session_mac,
656 p_header->session_id, p_msg_data);
659 gboolean _asp_sess_peer_notify_timeout_cb(gpointer p_user_data)
661 asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_user_data;
663 p_peer->timer_id = 0;
665 gfsm_process_event(&(p_peer->context), gfsm_create_event(ASP_S_PEER_EVENT_TIMEOUT,
671 void _asp_sess_peer_start_timer(asp_sess_peer_s *p_peer, guint sec)
675 if (p_peer->timer_id != 0)
676 _asp_sess_peer_stop_timer(p_peer);
678 p_peer->timer_id = g_timeout_add_seconds(sec, _asp_sess_peer_notify_timeout_cb,
682 void _asp_sess_peer_stop_timer(asp_sess_peer_s *p_peer)
686 if (p_peer->timer_id != 0) {
687 g_source_remove(p_peer->timer_id);
688 p_peer->timer_id = 0;
692 void _asp_sess_peer_increase_seq_num(asp_sess_peer_s *p_peer)
697 asp_sess_peer_sess_key_s *_asp_sess_peer_sess_tree_create_key(
698 guint8 session_mac[], guint32 session_id)
701 asp_sess_peer_sess_key_s *p_key = (asp_sess_peer_sess_key_s *) g_malloc(sizeof(
702 asp_sess_peer_sess_key_s));
706 p_key->sess_id = session_id;
707 memcpy(p_key->sess_mac, session_mac, 6);
712 void _asp_sess_peer_insert_session(asp_sess_peer_s *p_peer,
713 asp_sess_peer_sess_key_s *p_key)
715 asp_sess_peer_sess_key_s *p_value = (asp_sess_peer_sess_key_s *) g_tree_lookup(
716 p_peer->p_sess_tree, p_key);
721 g_tree_insert(p_peer->p_sess_tree, p_key, p_key);
724 void _asp_sess_peer_remove_session(asp_sess_peer_s *p_peer,
725 asp_sess_peer_sess_key_s *p_key)
727 g_tree_remove(p_peer->p_sess_tree, p_key);
730 gint _asp_sess_peer_sess_tree_compare_cb(gconstpointer a, gconstpointer b,
734 asp_sess_peer_sess_key_s *p_l = (asp_sess_peer_sess_key_s *) a;
735 asp_sess_peer_sess_key_s *p_r = (asp_sess_peer_sess_key_s *) b;
737 if (p_l->sess_id < p_r->sess_id)
739 else if (p_l->sess_id > p_r->sess_id)
742 return memcmp(p_l->sess_mac, p_r->sess_mac, 6);
745 void _asp_sess_peer_sess_tree_key_destructor_cb(gpointer p_data)
748 asp_sess_peer_sess_key_s *p_key = (asp_sess_peer_sess_key_s *) p_data;
749 asp_session_peer_destroyed(p_key->sess_mac, p_key->sess_id);
753 void _asp_sess_peer_sess_tree_value_destructor_cb(gpointer p_value)
757 /*p_key and p_value is same pointer. */
760 void *_asp_sess_peer_dup_request_session(void *p_msg)
762 asp_request_session_s *p_dup_msg = (asp_request_session_s *)g_malloc(sizeof(
763 asp_request_session_s));
764 memcpy(p_dup_msg, p_msg, sizeof(asp_request_session_s));
769 void *_asp_sess_peer_dup_msg_added_session(void *p_msg)
771 asp_added_session_s *p_dup_msg = (asp_added_session_s *)g_malloc(sizeof(
772 asp_added_session_s));
773 memcpy(p_dup_msg, p_msg, sizeof(asp_added_session_s));
778 void *_asp_sess_peer_dup_msg_rejected_session(void *p_msg)
780 asp_rejected_session_s *p_dup_msg = (asp_rejected_session_s *)g_malloc(sizeof(
781 asp_rejected_session_s));
782 memcpy(p_dup_msg, p_msg, sizeof(asp_rejected_session_s));
787 void *_asp_sess_peer_dup_msg_remove_session(void *p_msg)
789 asp_remove_session_s *p_dup_msg = (asp_remove_session_s *)g_malloc(sizeof(
790 asp_remove_session_s));
791 memcpy(p_dup_msg, p_msg, sizeof(asp_remove_session_s));
796 void *_asp_sess_peer_dup_msg_allowed_port(void *p_msg)
798 asp_allowed_port_s *p_dup_msg = (asp_allowed_port_s *)g_malloc(sizeof(
799 asp_allowed_port_s));
800 memcpy(p_dup_msg, p_msg, sizeof(asp_allowed_port_s));
805 void *_asp_sess_peer_dup_msg_version(void *p_msg)
807 asp_version_s *p_dup_msg = (asp_version_s *)g_malloc(sizeof(asp_version_s));
808 memcpy(p_dup_msg, p_msg, sizeof(asp_version_s));
813 void *_asp_sess_peer_dup_msg_deferred_session(void *p_msg)
815 asp_deferred_session_s *p_dup_msg = (asp_deferred_session_s *)g_malloc(sizeof(
816 asp_deferred_session_s));
817 memcpy(p_dup_msg, p_msg, sizeof(asp_deferred_session_s));
819 printf("_asp_sess_peer_dup_msg_deferred_session, session_id:%d\n",
820 p_dup_msg->session_id);
824 void *_asp_sess_peer_dup_msg_ack(void *p_msg)
826 asp_ack_s *p_dup_msg = (asp_ack_s *)g_malloc(sizeof(asp_ack_s));
827 memcpy(p_dup_msg, p_msg, sizeof(asp_ack_s));
831 void *_asp_sess_peer_dup_msg_nack(void *p_msg)
833 asp_nack_s *p_dup_msg = (asp_nack_s *)g_malloc(sizeof(asp_nack_s));
834 memcpy(p_dup_msg, p_msg, sizeof(asp_nack_s));
838 void *asp_sess_peer_dup_msg_data(void *p_msg)
840 asp_coord_header_s *p_header = (asp_coord_header_s *)p_msg;
843 switch (p_header->opcode) {
844 case ASP_OPCODE_REQUEST_SESSION:
845 ret = _asp_sess_peer_dup_request_session(p_msg);
847 case ASP_OPCODE_ADDED_SESSION:
848 ret = _asp_sess_peer_dup_msg_added_session(p_msg);
850 case ASP_OPCODE_REJECTED_SESSION:
851 ret = _asp_sess_peer_dup_msg_rejected_session(p_msg);
853 case ASP_OPCODE_REMOVE_SESSION:
854 ret = _asp_sess_peer_dup_msg_remove_session(p_msg);
856 case ASP_OPCODE_ALLOWED_PORT:
857 ret = _asp_sess_peer_dup_msg_allowed_port(p_msg);
859 case ASP_OPCODE_VERSION:
860 ret = _asp_sess_peer_dup_msg_version(p_msg);
862 case ASP_OPCODE_DEFERRED_SESSION:
863 ret = _asp_sess_peer_dup_msg_deferred_session(p_msg);
866 ret = _asp_sess_peer_dup_msg_ack(p_msg);
868 case ASP_OPCODE_NACK:
869 ret = _asp_sess_peer_dup_msg_nack(p_msg);
876 void _asp_sess_peer_send_nack_to_protocol(GSocketAddress *p_sock_addr,
877 guint8 seq_num, guint8 reason)
881 nack_msg.opcode = ASP_OPCODE_NACK;
882 nack_msg.seq_num = seq_num;;
883 nack_msg.reason = reason;
885 asp_coordination_protocol_send_msg(p_sock_addr, &nack_msg);
888 const char *_asp_sess_peer_fsm_get_state_name_cb(gfsm_state_id_t state_id)
890 const char *ret_val = NULL;
893 case ASP_S_PEER_STATE_INIT:
894 ret_val = "ASP_S_PEER_STATE_INIT";
896 case ASP_S_PEER_STATE_CREATED:
897 ret_val = "ASP_S_PEER_STATE_CREATED";
899 case ASP_S_PEER_STATE_VERSION_SENT:
900 ret_val = "ASP_S_PEER_STATE_VERSION_SENT";
902 case ASP_S_PEER_STATE_WAIT_VERSION:
903 ret_val = "ASP_S_PEER_STATE_WAIT_VERSION";
905 case ASP_S_PEER_STATE_WAIT_ACK:
906 ret_val = "ASP_S_PEER_STATE_WAIT_ACK";
908 case ASP_S_PEER_STATE_OPENED:
909 ret_val = "ASP_S_PEER_STATE_OPENED";
911 case ASP_S_PEER_STATE_IDLE:
912 ret_val = "ASP_S_PEER_STATE_IDLE";
915 case ASP_S_PEER_STATE_REQ_SENT:
916 ret_val = "ASP_S_PEER_STATE_REQ_SENT";
919 case ASP_S_PEER_STATE_CLOSED:
920 ret_val = "ASP_S_PEER_STATE_CLOSED";
923 ret_val = "ASP_S_PEER_STATE_MAX";
930 const char *_asp_sess_peer_gfsm_get_event_name_cb(gfsm_event_id_t event_id)
932 const char *ret_val = NULL;
935 case ASP_S_PEER_EVENT_START:
936 ret_val = "ASP_S_PEER_EVENT_START";
938 case ASP_S_PEER_EVENT_ADD_SESSION:
939 ret_val = "ASP_S_PEER_EVENT_ADD_SESSION";
941 case ASP_S_PEER_EVENT_DEL_SESSION:
942 ret_val = "ASP_S_PEER_EVENT_DEL_SESSION";
944 case ASP_S_PEER_EVENT_SEND_REQ:
945 ret_val = "ASP_S_PEER_EVENT_SEND_REQ";
947 case ASP_S_PEER_EVENT_SEND_ACK:
948 ret_val = "ASP_S_PEER_EVENT_SEND_ACK";
950 case ASP_S_PEER_EVENT_SEND_NACK:
951 ret_val = "ASP_S_PEER_EVENT_SEND_NACK";
953 case ASP_S_PEER_EVENT_RECV_VERSION:
954 ret_val = "ASP_S_PEER_EVENT_RECV_VERSION";
956 case ASP_S_PEER_EVENT_RECV_REQ:
957 ret_val = "ASP_S_PEER_EVENT_RECV_REQ";
959 case ASP_S_PEER_EVENT_RECV_ACK:
960 ret_val = "ASP_S_PEER_EVENT_RECV_ACK";
962 case ASP_S_PEER_EVENT_RECV_NACK:
963 ret_val = "ASP_S_PEER_EVENT_RECV_NACK";
965 case ASP_S_PEER_EVENT_TIMEOUT:
966 ret_val = "ASP_S_PEER_EVENT_TIMEOUT";
968 case ASP_S_PEER_EVENT_CLOSE:
969 ret_val = "ASP_S_PEER_EVENT_CLOSE";
972 ret_val = "ASP_S_PEER_EVENT_MAX";
979 int _asp_sess_peer_fsm_log_func(const char *format, ...)
983 va_start(args, format);
984 g_vsnprintf(buffer, 255, format, args);
987 ASP_LOGD("%s", buffer);
992 void asp_sess_peer_fsm_init()
996 asm_sess_peer_fsm = gfsm_create_fsm(ASP_S_PEER_STATE_MAX, ASP_S_PEER_EVENT_MAX,
997 ASP_S_PEER_STATE_INIT);
999 asp_sess_peer_state_init = gfsm_create_state(ASP_S_PEER_STATE_INIT,
1000 asm_sess_peer_fsm, _asp_sess_peer_state_init_entry_action,
1001 _asp_sess_peer_state_init_exit_action);
1002 gfsm_add_reaction(asp_sess_peer_state_init, ASP_S_PEER_EVENT_START,
1003 _asp_sess_peer_state_init_reaction_start);
1005 asp_sess_peer_state_created = gfsm_create_state(ASP_S_PEER_STATE_CREATED,
1006 asm_sess_peer_fsm, _asp_sess_peer_state_created_entry_action,
1007 _asp_sess_peer_state_created_exit_action);
1008 gfsm_add_reaction(asp_sess_peer_state_created, ASP_S_PEER_EVENT_ADD_SESSION,
1009 _asp_sess_peer_state_created_reaction_add_session);
1010 gfsm_add_reaction(asp_sess_peer_state_created, ASP_S_PEER_EVENT_DEL_SESSION,
1011 _asp_sess_peer_state_created_reaction_del_session);
1012 gfsm_add_reaction(asp_sess_peer_state_created, ASP_S_PEER_EVENT_CLOSE,
1013 _asp_sess_peer_state_created_reaction_close);
1014 gfsm_add_reaction(asp_sess_peer_state_created, ASP_S_PEER_EVENT_SEND_ACK,
1015 _asp_sess_peer_state_created_reaction_send_ack);
1016 gfsm_add_reaction(asp_sess_peer_state_created, ASP_S_PEER_EVENT_SEND_NACK,
1017 _asp_sess_peer_state_created_reaction_send_nack);
1019 asp_sess_peer_state_version_sent = gfsm_create_state(
1020 ASP_S_PEER_STATE_VERSION_SENT, asm_sess_peer_fsm,
1021 _asp_sess_peer_state_version_sent_entry_action,
1022 _asp_sess_peer_state_version_sent_exit_action);
1023 gfsm_set_parent_state(asp_sess_peer_state_version_sent,
1024 asp_sess_peer_state_created);
1025 gfsm_add_reaction(asp_sess_peer_state_version_sent,
1026 ASP_S_PEER_EVENT_ADD_SESSION, gfsm_deferral_reaction);
1027 gfsm_add_reaction(asp_sess_peer_state_version_sent,
1028 ASP_S_PEER_EVENT_DEL_SESSION, gfsm_deferral_reaction);
1029 gfsm_add_reaction(asp_sess_peer_state_version_sent, ASP_S_PEER_EVENT_SEND_REQ,
1030 gfsm_deferral_reaction);
1031 gfsm_add_reaction(asp_sess_peer_state_version_sent,
1032 ASP_S_PEER_EVENT_RECV_VERSION, gfsm_deferral_reaction);
1033 gfsm_add_reaction(asp_sess_peer_state_version_sent, ASP_S_PEER_EVENT_RECV_REQ,
1034 gfsm_deferral_reaction);
1035 gfsm_add_reaction(asp_sess_peer_state_version_sent, ASP_S_PEER_EVENT_RECV_ACK,
1036 _asp_sess_peer_state_version_sent_reaction_recv_ack);
1037 gfsm_add_reaction(asp_sess_peer_state_version_sent, ASP_S_PEER_EVENT_RECV_NACK,
1038 _asp_sess_peer_state_version_sent_reaction_recv_nack);
1039 gfsm_add_reaction(asp_sess_peer_state_version_sent, ASP_S_PEER_EVENT_TIMEOUT,
1040 _asp_sess_peer_state_version_sent_reaction_timeout);
1042 asp_sess_peer_state_wait_version = gfsm_create_state(
1043 ASP_S_PEER_STATE_WAIT_VERSION, asm_sess_peer_fsm,
1044 _asp_sess_peer_state_wait_version_entry_action,
1045 _asp_sess_peer_state_wait_version_exit_action);
1046 gfsm_set_parent_state(asp_sess_peer_state_wait_version,
1047 asp_sess_peer_state_created);
1048 gfsm_add_reaction(asp_sess_peer_state_wait_version,
1049 ASP_S_PEER_EVENT_ADD_SESSION, gfsm_deferral_reaction);
1050 gfsm_add_reaction(asp_sess_peer_state_wait_version,
1051 ASP_S_PEER_EVENT_DEL_SESSION, gfsm_deferral_reaction);
1052 gfsm_add_reaction(asp_sess_peer_state_wait_version, ASP_S_PEER_EVENT_SEND_REQ,
1053 gfsm_deferral_reaction);
1054 gfsm_add_reaction(asp_sess_peer_state_wait_version,
1055 ASP_S_PEER_EVENT_RECV_VERSION,
1056 _asp_sess_peer_state_wait_version_reaction_recv_version);
1057 gfsm_add_reaction(asp_sess_peer_state_wait_version, ASP_S_PEER_EVENT_RECV_REQ,
1058 _asp_sess_peer_state_wait_version_reaction_recv_req);
1059 gfsm_add_reaction(asp_sess_peer_state_wait_version, ASP_S_PEER_EVENT_TIMEOUT,
1060 _asp_sess_peer_state_wait_version_reaction_timeout);
1062 asp_sess_peer_state_opened = gfsm_create_state(ASP_S_PEER_STATE_OPENED,
1063 asm_sess_peer_fsm, _asp_sess_peer_state_opened_entry_action,
1064 _asp_sess_peer_state_opened_exit_action);
1065 gfsm_set_parent_state(asp_sess_peer_state_opened, asp_sess_peer_state_created);
1066 gfsm_add_reaction(asp_sess_peer_state_opened, ASP_S_PEER_EVENT_RECV_VERSION,
1067 _asp_sess_peer_state_opened_reaction_recv_version);
1068 gfsm_add_reaction(asp_sess_peer_state_opened, ASP_S_PEER_EVENT_RECV_REQ,
1069 _asp_sess_peer_state_opened_reaction_recv_req);
1071 asp_sess_peer_state_idle = gfsm_create_state(ASP_S_PEER_STATE_IDLE,
1072 asm_sess_peer_fsm, _asp_sess_peer_state_idle_entry_action,
1073 _asp_sess_peer_state_idle_exit_action);
1074 gfsm_set_parent_state(asp_sess_peer_state_idle, asp_sess_peer_state_opened);
1075 gfsm_add_reaction(asp_sess_peer_state_idle, ASP_S_PEER_EVENT_SEND_REQ,
1076 _asp_sess_peer_state_idle_reaction_send_req);
1078 asp_sess_peer_state_wait_ack = gfsm_create_state(ASP_S_PEER_STATE_WAIT_ACK,
1079 asm_sess_peer_fsm, _asp_sess_peer_state_wait_ack_entry_action,
1080 _asp_sess_peer_state_wait_ack_exit_action);
1081 gfsm_set_parent_state(asp_sess_peer_state_wait_ack, asp_sess_peer_state_opened);
1082 gfsm_add_reaction(asp_sess_peer_state_wait_ack, ASP_S_PEER_EVENT_SEND_REQ,
1083 gfsm_deferral_reaction);
1084 gfsm_add_reaction(asp_sess_peer_state_wait_ack, ASP_S_PEER_EVENT_RECV_ACK,
1085 _asp_sess_peer_state_wait_ack_reaction_recv_ack);
1086 gfsm_add_reaction(asp_sess_peer_state_wait_ack, ASP_S_PEER_EVENT_RECV_NACK,
1087 _asp_sess_peer_state_wait_ack_reaction_recv_nack);
1088 gfsm_add_reaction(asp_sess_peer_state_wait_ack, ASP_S_PEER_EVENT_TIMEOUT,
1089 _asp_sess_peer_state_wait_ack_reaction_timeout);
1091 asp_sess_peer_state_closed = gfsm_create_state(ASP_S_PEER_STATE_CLOSED,
1092 asm_sess_peer_fsm, _asp_sess_peer_state_close_entry_action,
1093 _asp_sess_peer_state_close_exit_action);
1094 gfsm_add_state(asm_sess_peer_fsm, asp_sess_peer_state_init);
1095 gfsm_add_state(asm_sess_peer_fsm, asp_sess_peer_state_created);
1096 gfsm_add_state(asm_sess_peer_fsm, asp_sess_peer_state_version_sent);
1097 gfsm_add_state(asm_sess_peer_fsm, asp_sess_peer_state_wait_version);
1098 gfsm_add_state(asm_sess_peer_fsm, asp_sess_peer_state_opened);
1099 gfsm_add_state(asm_sess_peer_fsm, asp_sess_peer_state_idle);
1100 /*gfsm_add_state(&asm_sess_peer_fsm,&asp_sess_peer_state_req_sent); */
1101 gfsm_add_state(asm_sess_peer_fsm, asp_sess_peer_state_wait_ack);
1102 gfsm_add_state(asm_sess_peer_fsm, asp_sess_peer_state_closed);
1104 gfsm_set_logger(asm_sess_peer_fsm, _asp_sess_peer_fsm_log_func,
1105 ASP_SESS_PEER_HEADER,
1106 _asp_sess_peer_fsm_get_state_name_cb,
1107 _asp_sess_peer_gfsm_get_event_name_cb);
1110 void _asp_sess_peer_state_init_entry_action(void *p_context_data)
1114 ASP_SESS_PEER_FSM_TRACE_ENTER();
1116 /* asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */
1118 /*p_peer->seq_num = 0; */
1119 /*p_peer->p_sending_msg_data = NULL; */
1121 ASP_SESS_PEER_FSM_TRACE_LEAVE();
1124 void _asp_sess_peer_state_init_exit_action(void *p_context_data)
1128 ASP_SESS_PEER_FSM_TRACE_ENTER();
1130 /*asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */
1132 ASP_SESS_PEER_FSM_TRACE_LEAVE();
1135 gfsm_state_id_t _asp_sess_peer_state_init_reaction_start(void *p_context_data,
1140 ASP_SESS_PEER_FSM_TRACE_ENTER();
1142 /* asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */
1144 ASP_SESS_PEER_FSM_TRACE_LEAVE();
1146 return ASP_S_PEER_STATE_VERSION_SENT;
1149 void _asp_sess_peer_state_created_entry_action(void *p_context_data)
1153 /* asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */
1156 void _asp_sess_peer_state_created_exit_action(void *p_context_data)
1160 /* asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */
1163 gfsm_state_id_t _asp_sess_peer_state_created_reaction_add_session(
1164 void *p_context_data, void *p_event_data)
1168 ASP_SESS_PEER_FSM_TRACE_ENTER();
1170 asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data;
1171 asp_sess_peer_sess_key_s *p_key = (asp_sess_peer_sess_key_s *) p_event_data;
1173 _asp_sess_peer_insert_session(p_peer, p_key);
1175 ASP_SESS_PEER_FSM_TRACE_LEAVE();
1177 return GFSM_DISCARD_EVENT;
1180 gfsm_state_id_t _asp_sess_peer_state_created_reaction_del_session(
1181 void *p_context_data, void *p_event_data)
1185 ASP_SESS_PEER_FSM_TRACE_ENTER();
1187 asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data;
1188 asp_sess_peer_sess_key_s *p_key = (asp_sess_peer_sess_key_s *) p_event_data;
1190 _asp_sess_peer_remove_session(p_peer, p_key);
1192 ASP_SESS_PEER_FSM_TRACE_LEAVE();
1194 return GFSM_DISCARD_EVENT;
1197 gfsm_state_id_t _asp_sess_peer_state_created_reaction_close(
1198 void *p_context_data, void *p_event_data)
1202 ASP_SESS_PEER_FSM_TRACE_ENTER();
1204 /* asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */
1206 ASP_SESS_PEER_FSM_TRACE_LEAVE();
1208 return ASP_S_PEER_STATE_CLOSED;
1211 gfsm_state_id_t _asp_sess_peer_state_created_reaction_send_ack(
1212 void *p_context_data, void *p_event_data)
1216 ASP_SESS_PEER_FSM_TRACE_ENTER();
1218 asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data;
1220 asp_coordination_protocol_send_msg(p_peer->p_sock_addr, p_event_data);
1222 ASP_SESS_PEER_FSM_TRACE_LEAVE();
1224 return GFSM_DISCARD_EVENT;
1227 gfsm_state_id_t _asp_sess_peer_state_created_reaction_send_nack(
1228 void *p_context_data, void *p_event_data)
1232 ASP_SESS_PEER_FSM_TRACE_ENTER();
1234 asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data;
1236 asp_coordination_protocol_send_msg(p_peer->p_sock_addr, p_event_data);
1238 ASP_SESS_PEER_FSM_TRACE_LEAVE();
1240 return GFSM_DISCARD_EVENT;
1243 void _asp_sess_peer_state_version_sent_entry_action(void *p_context_data)
1247 ASP_SESS_PEER_FSM_TRACE_ENTER();
1249 asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data;
1250 asp_version_s *p_msg_version = (asp_version_s *)g_malloc(sizeof(
1253 p_msg_version->opcode = ASP_OPCODE_VERSION;
1254 p_msg_version->seq_num = p_peer->seq_num;
1255 p_msg_version->coordination_version = 0;
1256 p_msg_version->vendor_information_length = 0;
1257 p_msg_version->vendor_information = 0;
1259 _asp_sess_peer_set_sending_msg_data(p_peer, p_msg_version);
1261 asp_coordination_protocol_send_msg(p_peer->p_sock_addr, p_msg_version);
1263 _asp_sess_peer_start_timer(p_peer, 1);
1265 ASP_SESS_PEER_FSM_TRACE_LEAVE();
1268 void _asp_sess_peer_state_version_sent_exit_action(void *p_context_data)
1272 asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data;
1274 _asp_sess_peer_clear_sending_msg_data(p_peer);
1275 _asp_sess_peer_stop_timer(p_peer);
1278 gfsm_state_id_t _asp_sess_peer_state_version_sent_reaction_recv_ack(
1279 void *p_context_data, void *p_event_data)
1283 asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data;
1284 asp_ack_s *p_ack = (asp_ack_s *)p_event_data;
1286 if (p_peer->seq_num != p_ack->seq_num)
1287 return GFSM_DISCARD_EVENT;
1289 _asp_sess_peer_increase_seq_num(p_peer);
1291 return ASP_S_PEER_STATE_WAIT_VERSION;
1294 gfsm_state_id_t _asp_sess_peer_state_version_sent_reaction_recv_nack(
1295 void *p_context_data, void *p_event_data)
1299 asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data;
1300 asp_nack_s *p_nack = (asp_nack_s *)p_event_data;
1302 if (p_peer->seq_num != p_nack->seq_num)
1303 return GFSM_DISCARD_EVENT;
1305 return ASP_S_PEER_STATE_CLOSED;
1308 gfsm_state_id_t _asp_sess_peer_state_version_sent_reaction_timeout(
1309 void *p_context_data, void *p_event_data)
1313 /*asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */
1315 return ASP_S_PEER_STATE_VERSION_SENT;
1318 void _asp_sess_peer_state_wait_version_entry_action(void *p_context_data)
1322 asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data;
1324 _asp_sess_peer_start_timer(p_peer, 10);
1327 void _asp_sess_peer_state_wait_version_exit_action(void *p_context_data)
1331 asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data;
1333 _asp_sess_peer_stop_timer(p_peer);
1336 gfsm_state_id_t _asp_sess_peer_state_wait_version_reaction_recv_version(
1337 void *p_context_data, void *p_event_data)
1341 /* asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */
1342 /* asp_coord_header_s* p_header = (asp_coord_header_s*)p_event_data; */
1344 return ASP_S_PEER_STATE_IDLE;
1347 gfsm_state_id_t _asp_sess_peer_state_wait_version_reaction_recv_req(
1348 void *p_context_data, void *p_event_data)
1352 asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data;
1353 asp_coord_header_s *p_header = (asp_coord_header_s *)p_event_data;
1355 _asp_sess_peer_send_nack_to_protocol(p_peer->p_sock_addr, p_header->seq_num,
1356 ASP_NACK_REASON_NO_SESSION_EXIST);
1358 return GFSM_DISCARD_EVENT;
1361 gfsm_state_id_t _asp_sess_peer_state_wait_version_reaction_timeout(
1362 void *p_context_data, void *p_event_data)
1366 /*asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */
1367 return ASP_S_PEER_STATE_CLOSED;
1370 void _asp_sess_peer_state_opened_entry_action(void *p_context_data)
1374 /*asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */
1377 void _asp_sess_peer_state_opened_exit_action(void *p_context_data)
1381 /*asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */
1384 gfsm_state_id_t _asp_sess_peer_state_opened_reaction_recv_version(
1385 void *p_context_data, void *p_event_data)
1389 /*asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */
1390 /*_asp_sess_peer_forward_req_to_sessmgmt(p_peer,p_event_data); */
1392 return GFSM_DISCARD_EVENT;
1395 gfsm_state_id_t _asp_sess_peer_state_opened_reaction_recv_req(
1396 void *p_context_data, void *p_event_data)
1400 asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data;
1401 _asp_sess_peer_forward_req_to_sessmgmt(p_peer, p_event_data);
1403 return GFSM_DISCARD_EVENT;
1406 void _asp_sess_peer_state_idle_entry_action(void *p_context_data)
1410 /*asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */
1413 void _asp_sess_peer_state_idle_exit_action(void *p_context_data)
1417 /*asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */
1420 gfsm_state_id_t _asp_sess_peer_state_idle_reaction_send_req(
1421 void *p_context_data, void *p_event_data)
1425 asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data;
1426 void *p_msg_data = asp_sess_peer_dup_msg_data(p_event_data);
1428 /*asp_sess_peer_add_sess_list(p_msg_data); */
1429 _asp_sess_peer_set_sending_msg_data(p_peer, p_msg_data);
1431 asp_coordination_protocol_send_msg(p_peer->p_sock_addr, p_msg_data);
1433 return ASP_S_PEER_STATE_WAIT_ACK;
1436 void _asp_sess_peer_state_wait_ack_entry_action(void *p_context_data)
1440 asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data;
1442 _asp_sess_peer_start_timer(p_peer, 1);
1445 void _asp_sess_peer_state_wait_ack_exit_action(void *p_context_data)
1449 asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data;
1451 _asp_sess_peer_stop_timer(p_peer);
1454 gfsm_state_id_t _asp_sess_peer_state_wait_ack_reaction_recv_ack(
1455 void *p_context_data, void *p_event_data)
1459 asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data;
1460 asp_ack_s *p_ack = (asp_ack_s *)p_event_data;
1462 if (p_ack->seq_num != p_peer->seq_num)
1463 return GFSM_DISCARD_EVENT;
1465 _asp_sess_peer_increase_seq_num(p_peer);
1467 _asp_sess_peer_forward_ack_to_sessmgmt(p_peer, p_event_data);
1469 _asp_sess_peer_clear_sending_msg_data(p_peer);
1471 return ASP_S_PEER_STATE_IDLE;
1474 gfsm_state_id_t _asp_sess_peer_state_wait_ack_reaction_recv_nack(
1475 void *p_context_data, void *p_event_data)
1479 asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data;
1480 asp_nack_s *p_nack = (asp_nack_s *)p_event_data;
1482 if (p_nack->seq_num != p_peer->seq_num)
1483 return GFSM_DISCARD_EVENT;
1485 _asp_sess_peer_forward_nack_to_sessmgmt(p_peer, p_event_data);
1487 _asp_sess_peer_clear_sending_msg_data(p_peer);
1489 return ASP_S_PEER_STATE_IDLE;
1492 gfsm_state_id_t _asp_sess_peer_state_wait_ack_reaction_timeout(
1493 void *p_context_data, void *p_event_data)
1497 asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data;
1499 if (p_peer->retry < 5) {
1501 asp_coordination_protocol_send_msg(p_peer->p_sock_addr,
1502 p_peer->p_sending_msg_data);
1503 return ASP_S_PEER_STATE_WAIT_ACK;
1506 _asp_sess_peer_clear_sending_msg_data(p_peer);
1507 return ASP_S_PEER_STATE_CLOSED;
1511 void _asp_sess_peer_state_close_entry_action(void *p_context_data)
1515 asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data;
1518 ASP_LOGD("p_peer is null");
1521 ASP_LOGD("context[%p]", p_peer->context);
1522 gfsm_destroy_context(p_peer->context);
1525 void _asp_sess_peer_state_close_exit_action(void *p_context_data)
1529 /*asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */