Add session module for ASP 2.0 61/83661/7
authorYu Jiung <jiung.yu@samsung.com>
Fri, 12 Aug 2016 08:23:48 +0000 (17:23 +0900)
committerYu Jiung <jiung.yu@samsung.com>
Tue, 23 Aug 2016 07:10:06 +0000 (16:10 +0900)
Change-Id: I5e1252335b54f74173645db113974eeed1504691
Signed-off-by: Yu jiung <jiung.yu@samsung.com>
29 files changed:
include/asp-manager-gdbus.h
include/asp-manager-util.h
include/asp-manager.h
include/asp-service.h
include/asp-session.h
include/asp-tech.h
interfaces/aspmanager-iface-session.xml
src/asp-manager-event.c
src/asp-manager-gdbus.c
src/asp-manager-util.c
src/asp-manager.c
src/service/asp-service.c
src/session/asp-coordination-protocol.c [new file with mode: 0644]
src/session/asp-coordination-protocol.h [new file with mode: 0644]
src/session/asp-p2p-conn.c [new file with mode: 0644]
src/session/asp-p2p-conn.h [new file with mode: 0644]
src/session/asp-session-peer-interface.h [new file with mode: 0644]
src/session/asp-session-peer.c [new file with mode: 0644]
src/session/asp-session-peer.h [new file with mode: 0644]
src/session/asp-session.c [changed mode: 0755->0644]
src/session/asp-state.c [deleted file]
src/session/gfsm.c [new file with mode: 0644]
src/session/gfsm.h [new file with mode: 0644]
src/tech/asp-tech-ble.c
src/tech/asp-tech-infra.c
src/tech/asp-tech-nan.c
src/tech/asp-tech-nfc.c
src/tech/asp-tech-p2p.c
src/tech/asp-tech.c

index 8274a9f..e55e621 100755 (executable)
 #ifndef __ASP_MANAGER_GDBUS_H__
 #define __ASP_MANAGER_GDBUS_H__
 
-#include <glib.h>
-
 #include "asp-manager.h"
-#include "asp-manager-util.h"
 
 #define SERVICE_DBUS_ERROR_NAME "net.asp.service.Error.Failed"
 #define SESSION_DBUS_ERROR_NAME "net.asp.session.Error.Failed"
                g_free(parameters_debug_str);\
        } while (0)
 
-void asp_manager_gdbus_init(void *asp_manager);
-void asp_manager_gdbus_deinit(void *asp_manager);
-void asp_manager_gdbus_notify_advertise_status(unsigned int adv_id, unsigned char status, int reason);
+void asp_manager_gdbus_init(gpointer asp_manager);
+void asp_manager_gdbus_deinit(gpointer asp_manager);
+void asp_manager_gdbus_notify_advertise_status(guint32 adv_id, guint8 status, gint32 reason);
 
-void asp_manager_gdbus_notify_search_result(unsigned int search_id,
+void asp_manager_gdbus_notify_search_result(guint32 search_id,
                                                                                const gchar *service_mac,
                                                                                const gchar *service_device_name,
-                                                                               unsigned int adv_id,
+                                                                               guint32 adv_id,
                                                                                const gchar *instance_name,
                                                                                GHashTable *service_info_map,
-                                                                               unsigned char service_status);
+                                                                               guint8 service_status);
+
+void asp_manager_gdbus_notify_session_request(gint32 error_code,
+               gchar *session_mac, guint32 session_id, guint32 adv_id,
+               gchar *device_name, guint8 *session_info,
+               gboolean get_pin, gchar *pin);
 
-void asp_manager_gdbus_notify_session_request(unsigned int adv_id,
-               unsigned int sessoin_id, char *session_mac, char *device_name,
-               char *session_info, int get_pin, char *pin);
+void asp_manager_gdbus_notify_session_config_request(guint32 sessoin_id,
+               gboolean get_pin, gchar *pin);
 
-void asp_manager_gdbus_notify_session_config_request(unsigned int sessoin_id,
-               int get_pin, char *pin);
+void asp_manager_gdbus_notify_connect_status(gchar *session_mac,
+               guint32 session_id, gint32 status, gchar *deferred);
 
-void asp_manager_gdbus_notify_connect_status(char *session_mac,
-               unsigned int session_id, int status, char *deferred);
+void asp_manager_gdbus_notify_session_status(gchar *session_mac,
+               guint32 session_id, gint32 state, gint32 status, const gchar *info);
 
-void asp_manager_gdbus_notify_session_status(char *session_mac,
-               unsigned int session_id, int state, int status, char *info);
+void asp_manager_gdbus_notify_port_status(gchar *session_mac,
+               guint32 session_id, const gchar *ip, gint32 port, gint32 protocol,
+               gint32 status);
 
 #endif /* __ASP_MANAGER_GDBUS_H__ */
index a7710c7..ea05788 100755 (executable)
@@ -44,7 +44,6 @@
 #endif /* USE_DLOG */
 
 #define IPSTR_MAXLEN 40
-#define MACSTR_LEN 17
 #define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]
 #define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x"
 
@@ -60,7 +59,7 @@ typedef enum {
        ASP_ERROR_UNKNOWN = 0x10,
 } asp_error;
 
-int macaddr_atoe(const char *p, unsigned char mac[]);
-int asp_dbus_unpack_ay(unsigned char *dst, GVariant *src, int size);
+gint32 macaddr_atoe(const gchar *p, guint8 mac[]);
+gint32 asp_dbus_unpack_ay(guint8 *dst, GVariant *src, gint32 size);
 
 #endif /* __ASP_MANAGER_UTIL_H__ */
index 498c42d..72f3fbd 100755 (executable)
 
 #define EXPORT_API __attribute__((visibility("default")))
 
+#include <glib.h>
+
 #define MAC_LEN 6
+#define MACSTR_LEN 17
 #define DEVICE_NAME_LEN 32
 
 typedef struct {
@@ -28,15 +31,16 @@ typedef struct {
        GList *services;
        GList *sessions;
 
-       void *service_obj;
-       void *session_obj;
+       gpointer service_obj;
+       gpointer session_obj;
 
        GDBusObjectManagerServer *obj_mgr;
        GDBusConnection *connection;
        guint gdbus_owner_id;
 
-       unsigned char p2p_local_address[MAC_LEN];
-       char p2p_device_name[DEVICE_NAME_LEN + 1];
+       guint8 p2p_local_address[MAC_LEN];
+       gchar p2p_local_address_str[MACSTR_LEN + 1];
+       gchar p2p_device_name[DEVICE_NAME_LEN + 1];
 } asp_s;
 
 asp_s *asp_get_manager();
index 714a726..849bf44 100755 (executable)
@@ -53,54 +53,54 @@ typedef enum {
 } asp_service_status_e;
 
 typedef struct {
-       unsigned int adv_id;
-       unsigned int search_id;
-       int auto_accept;
-       int discovery_tech;
-       unsigned char preferred_connection;
-
-       unsigned char status;
-       unsigned char role;
-       unsigned int config_method;
-
-       char *instance_name;
-       char *service_type;
+       guint32 adv_id;
+       guint32 search_id;
+       gint32 auto_accept;
+       gint32 discovery_tech;
+       guint8 preferred_connection;
+
+       guint8 status;
+       guint8 role;
+       guint32 config_method;
+
+       gchar *instance_name;
+       gchar *service_type;
        GHashTable *service_info_map;
-       char *rsp_info;
+       gchar *rsp_info;
 } asp_service_advertise_s;
 
 typedef struct {
-       unsigned int adv_id;
-       unsigned int search_id;
-       int auto_accept;
-       int discovery_tech;
-       unsigned char preferred_connection;
-
-       unsigned char status;
-       unsigned char role;
-       unsigned int config_method;
-
-       char *instance_name;
-       char *service_type;
+       guint32 adv_id;
+       guint32 search_id;
+       gint32 auto_accept;
+       gint32 discovery_tech;
+       guint8 preferred_connection;
+
+       guint8 status;
+       guint8 role;
+       guint32 config_method;
+
+       gchar *instance_name;
+       gchar *service_type;
        GHashTable *service_info_map;
-       char *rsp_info;
+       gchar *rsp_info;
 } asp_service_seek_s;
 
-int asp_service_init();
-int asp_service_deinit();
-int asp_service_advertise(asp_service_advertise_s *service, int replace);
-int asp_service_cancel_advertise(asp_service_advertise_s *service);
-int asp_service_seek(asp_service_seek_s *service, unsigned long long *search_id);
-int asp_service_cancel_seek(asp_service_seek_s *service);
+gint32 asp_service_init();
+gint32 asp_service_deinit();
+gint32 asp_service_advertise(asp_service_advertise_s *service, gint32 replace);
+gint32 asp_service_cancel_advertise(asp_service_advertise_s *service);
+gint32 asp_service_seek(asp_service_seek_s *service, guint64 *search_id);
+gint32 asp_service_cancel_seek(asp_service_seek_s *service);
 
-int asp_service_event_cb(void *event);
-int asp_service_notify_advertise_status(unsigned int adv_id,
+gint32 asp_service_event_cb(gpointer event);
+gint32 asp_service_notify_advertise_status(guint32 adv_id,
                                                                                asp_service_advertise_status_e status,
                                                                                asp_service_advertise_reason_e reason);
-int asp_service_notify_search_result(unsigned int search_id,
+gint32 asp_service_notify_search_result(guint32 search_id,
                                                                        const gchar *service_mac,
                                                                        const gchar *service_device_name,
-                                                                       unsigned int adv_id,
+                                                                       guint32 adv_id,
                                                                        const gchar *instance_name,
                                                                        GHashTable *service_info,
                                                                        asp_service_status_e service_status);
index f1748c0..b983e61 100755 (executable)
 #ifndef __ASP_SESSION_H__
 #define __ASP_SESSION_H__
 
+#include <glib.h>
 
-#define ASP_SESSION_MACSTR_LEN 18
-#define ASP_SESSION_IP_LEN 4
+/*****************************************************************************
+ * Macros and Typedefs
+ *****************************************************************************/
 
 typedef enum {
-       ASP_SESSION_ROLE_REJECTED = -2,
-       ASP_SESSION_NOMORE_CONNECT = -1,
-       ASP_SESSION_NONE = 0,
-       ASP_SESSION_REQUEST_STARTED = 0x01,
-       ASP_SESSION_REQUEST_DEFERRED = 0x02,
-       ASP_SESSION_REQUEST_ACCEPTED = 0x04,
-       ASP_SESSION_REQUEST_FAILED = 0x08,
-       ASP_GROUP_FORMATION_STARTED = 0x10,
-       ASP_GROUP_FORMATION_COMPLETED = 0x20,
-       ASP_GROUP_FORMATION_FAILED = 0x40,
-} asp_session_sub_state_e;
+       ASP_SESSION_CONNECT_STATUS_NETWORK_ROLE_REJECTED,
+       ASP_SESSION_CONNECT_STATUS_NO_MORE_CONNECTION,
+       ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_SENT,
+       ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_RECEIVED,
+       ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_DEFFERED,
+       ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_ACCEPTED,
+       ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_FAILED,
+       ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_STARTED,
+       ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_COMPLETED,
+       ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_FAILED,
+} asp_session_connect_status_e;
 
 typedef enum {
-       ASP_SESSION_CLOSE_OK,
-       ASP_SESSION_CLOSE_DISASSOCIATED,
-       ASP_SESSION_CLOSE_LOCAL_CLOSE,
-       ASP_SESSION_CLOSE_REMOTE_CLOSE,
-       ASP_SESSION_CLOSE_SYSTEM_FAILURE,
-       ASP_SESSION_CLOSE_NO_RESPONSE,
-} asp_session_close_status_e;
+       ASP_SESSION_STATE_ERROR,
+       ASP_SESSION_STATE_CLOSED,
+       ASP_SESSION_STATE_INITIATED,
+       ASP_SESSION_STATE_REQUESTED,
+       ASP_SESSION_STATE_OPEN
+} asp_session_status_e;
 
 typedef enum {
-       ASP_SESSION_CLOESD,
-       ASP_SESSION_INITIATED,
-       ASP_SESSION_REQUESTED,
-       ASP_SESSION_OPEN,
-} asp_session_state_e;
-
-typedef struct {
-       /* Can be used as session argument from below */
-       unsigned int advertisement_id;
-       unsigned char service_mac[6];
-       unsigned int session_id;
-       unsigned char session_mac[6]; /* the MAC address of the P2P device that generated the session ID */
-       unsigned char local_ip[ASP_SESSION_IP_LEN];
-       unsigned char remote_ip[ASP_SESSION_IP_LEN];
-       int local_bound_port;
-       int local_bound_proto;
-
-       int state;
-
-} asp_session_s;
-
-typedef struct {
-       unsigned char service_mac[6];
-       unsigned int advertisement_id;
-       unsigned char session_mac[6];
-       unsigned int session_id;
-       int network_config;
-       int network_role;
-       char *session_information;
-} asp_connect_session_params;
-
-asp_session_s * asp_session_create(unsigned char *session_mac, int session_id, unsigned int adv_id);
-int asp_session_destroy(unsigned char *session_mac, int session_id);
-
-int asp_session_connect_session(asp_connect_session_params *params, asp_session_s **session);
-asp_session_s *asp_session_get_session(unsigned char *session_mac, int session_id);
-int asp_session_confirm_session(unsigned char *session_mac, int session_id, int confirm, const char *pin);
-int asp_session_close_session(unsigned char *session_mac, int session_id);
-void asp_session_set_session_ready(unsigned char *session_mac, int session_id);
-
-int asp_session_receive_request_session(void *data);
-int asp_session_receive_session_config_request(void *data);
-int asp_session_receive_connect_status(void *data);
-
-void asp_state_set(asp_session_s *session, int state, int status, char *info);
-void asp_state_set_sub(asp_session_s * session,  int status, char *deferred);
-
-#endif /* __ASP_SESSION_H__ */
+       ASP_SESSION_CLOSED_STATE_NONE,
+       ASP_SESSION_CLOSED_STATE_DISASSOCIATED,
+       ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE,
+       ASP_SESSION_CLOSED_STATE_REMOTE_CLOSE,
+       ASP_SESSION_CLOSED_STATE_SYSTEM_FAILURE,
+       CLOSED_STATE_NO_RESPONSE_FROM_REMOTE
+} asp_session_closed_state_e;
+
+typedef enum {
+       ASP_SESSION_PORT_STATUS_LOCAL_PORT_ALLOWED,
+       ASP_SESSION_PORT_STATUS_LOCAL_PORT_BLOCKED,
+       ASP_SESSION_PORT_STATUS_FAILURE,
+       ASP_SESSION_PORT_STATUS_REMOTE_PORT_ALLOWED
+} asp_session_port_status_e;
+
+typedef enum {
+       ASP_SESSION_REMOVE_SESSION_REASON_UNKNOWN = 0x00,
+       ASP_SESSION_REMOVE_SESSION_REASON_REJECTED_BY_USER = 0x01,
+       ASP_SESSION_REMOVE_SESSION_REASON_ADVERTISED_SERVICE_NOT_AVAILABLE = 0x02,
+       ASP_SESSION_REMOVE_SESSION_REASON_SYSTEM_FAILURE = 0x03
+} asp_remove_session_reason_e;
+
+typedef void (*asp_session_session_request_cb) (gint32 error_code,
+               guint8 *session_mac, guint32 session_id, guint32 adv_id,
+               gchar *device_name, size_t name_length, guint8 *session_info,
+               size_t info_length, gboolean get_pin, guint32 pin, gpointer user_data);
+               /*if pin is zero, it does not need to be displayed. */
+
+typedef void (*asp_session_session_config_request_cb) (gint32 error_code,
+               guint8 *session_mac, guint32 session_id, gboolean get_pin, guint32 pin,
+               gpointer user_data);
+
+typedef void (*asp_session_connect_status_cb) (gint32 error_code,
+               const guint8 *session_mac, guint32 session_id,
+               asp_session_connect_status_e status, guint8 *deferred_resp,
+               size_t resp_length, gpointer user_data);
+
+typedef void (*asp_session_session_status_cb) (gint32 error_code,
+               const guint8 *session_mac, guint32 session_id,
+               asp_session_status_e state, asp_session_closed_state_e status,
+               const gchar *requested_info, gpointer user_data);
+
+typedef void (*asp_session_port_status_cb) (gint32 error_code,
+               const guint8 *session_mac, guint32 session_id, const gchar *ip,
+               guint16 port, guint8 protocol, asp_session_port_status_e status,
+               gpointer user_data);
+
+/*****************************************************************************
+ * Functions Declaration
+ *****************************************************************************/
+
+/**
+ * @brief initialize asp-session
+ * @return void
+ *
+ * @paragraph <Example>
+ * asp-seesion will be initialized.
+ *
+ * @verbatim
+ * @endverbatim
+*/
+gboolean asp_session_initialize(void);
+
+/**
+ * @brief deinitialize asp-session
+ * @return void
+ *
+ * @paragraph <Example>
+ * asp-seesion will be deinitialized.
+ *
+ * @verbatim
+ * @endverbatim
+*/
+gboolean asp_session_deinitialize(void);
+
+/**
+ * @brief ASP session method - ConnectSession over P2P
+ * @param [in] service_mac p2p mac address of advertizer
+ * @param [in] adv_id advertisement ID assigned by the ASP when the Advertise Service method is called
+ * @param [in] session_info service-specific data payload(up to 144 bytes)
+ * @param [in] info_length length of 'session_info' parameter
+ * @param [in] network_role
+ * @param [in] network_config
+ * @param [out] session_mac mac address of the device that is calling this method
+ * @param [out] session_id ID of newly created session.
+ * @return gboolean
+ *
+ * @paragraph <Example>
+ * asp-seesion will be deinitialized.
+ *
+ * @verbatim
+ * @endverbatim
+*/
+gboolean asp_session_connect_session_over_p2p(const guint8 *service_mac,
+               guint32 adv_id, const guint8 *session_info, size_t info_length,
+               guint8 network_role, guint8 network_config, guint8 *session_mac,
+               guint32 *session_id);
+
+/**
+ * @brief ASP session method - ConnectSession over infra
+ * @param [in] peer_ip string type of peer's ip address like "111.222.333.444"
+ * @param [in] adv_id advertisement ID assigned by the ASP when the AdvertiseService method is called
+ * @param [in] session_info service-specific data payload(up to 144 bytes)
+ * @param [in] length length of 'session_info' parameter
+ * @param [out] session_mac mac address of the device that is calling this method
+ * @param [out] session_id ID of newly created session.
+ * @return gboolean
+ *
+ * @paragraph <Example>
+ * asp-seesion will be deinitialized.
+ *
+ * @verbatim
+ * @endverbatim
+*/
+gboolean asp_session_connect_session_over_infa(const gchar *peer_ip,
+               guint32 adv_id, guint8 *session_info, size_t length,
+               guint8 *session_mac, guint32 *session_id);
+
+/**
+ * @brief ASP session method - ConfirmSession
+ * @param [in] session_mac mac address of the device that assigned the value of session_id
+ * @param [in] session_id ASP session ID assigned by the remote ASP
+ * @param [in] confirmed TRUE or FALSE for session confirm
+ * @param [in] pin required by SessionConfigRequest event
+ * @return gboolean
+ *
+ * @paragraph <Example>
+ * asp-session will process 2 cases by confirmed parameter.
+ * in case of confrimed == TRUE => wait set_session_ready() from asp-manager
+ * in case of confirmed == FALSE > send REJECTED_SESSION coordination protocol messasge to peer
+ *
+ * @verbatim
+ * @endverbatim
+*/
+gboolean asp_session_confirm_session(const guint8 *session_mac,
+               guint32 session_id, gboolean confirmed, guint32 pin);
+
+/**
+ * @brief ASP session method - SetSessionReady
+ * @param [in] session_mac mac address of the device that assigned the value of session_id
+ * @param [in] session_id ASP session ID assigned by the remote ASP
+ * @return gboolean
+ *
+ * @paragraph <Example>
+ * asp-session will send ADDED_SESSION coordination protocol message to peer
+ *
+ * @verbatim
+ * @endverbatim
+*/
+gboolean asp_session_set_session_ready(const guint8 *session_mac, guint32 session_id);
+
+/**
+ * @brief ASP session method - CloseSssion
+ * @param [in] session_mac mac address of the device that assigned the value of session_id
+ * @param [in] session_id ASP session ID assigned by the remote ASP
+ * @param [in] reason reason of remove session
+ * @return gboolean
+ *
+ * @paragraph <Example>
+ * asp-session will send REMOVE_SESSION coordination protocol message to peer
+ *
+ * @verbatim
+ * @endverbatim
+*/
+gboolean asp_session_close_session(guint8 *session_mac, guint32 session_id,
+               asp_remove_session_reason_e reason);
+
+/**
+ * @brief ASP session method - BoundPort
+ * @param [in] session_mac mac address of the device that assigned the value of session_id
+ * @param [in] session_id ASP session ID assigned by the remote ASP
+ * @param [in] ip IP address on which the port is being used
+ * @param [in] port port number to be allowed
+ * @param [in] protocol The IANA protocol number
+ * @return gboolean
+ *
+ * @paragraph <Example>
+ * asp-seesion will send ALLOWED_PORT coordination protocol message to peer
+ *
+ * @verbatim
+ * @endverbatim
+*/
+gboolean asp_session_bound_port(guint8 *session_mac, guint32 session_id,
+               const gchar *ip, guint16 port, guint8 protocol);
+
+/**
+ * @brief method to set a session to a deferred session
+ * @param [in] session_mac mac address of the device that assigned the value of session_id
+ * @param [in] session_id ASP session ID assigned by the remote ASP
+ * @param [in] deferred_response reason of deferred session
+ * @param [in] length length of 'deferred_response' parameter
+ * @return gboolean
+ *
+ * @paragraph <Example>
+ * asp-seesion will send DEFERRED_SESSION coordination protocol message to peer
+ *
+ * @verbatim
+ * @endverbatim
+*/
+gboolean asp_session_defer_session(guint8 *session_mac, guint32 session_id,
+               guint8 *deferred_response, size_t length);
+
+/**
+ * @brief method to get an advertisement ID from a session
+ * @param [in] session_mac mac address of the device that assigned the value of session_id
+ * @param [in] session_id ASP session ID assigned by the remote ASP
+ * @param [out] adv_id advertisement ID
+ * @return gboolean
+ *
+ * @paragraph <Example>
+ *
+ * @verbatim
+ * guint32 adv_id;
+ * asp_session_get_advertisement_id(session_mac, session_id, &adv_id);
+ * @endverbatim
+*/
+gboolean asp_session_get_advertisement_id(guint8 *session_mac,
+               guint32 session_id, guint32 *adv_id);
+
+/**
+ * @brief method to get a session state from a session
+ * @param [in] session_mac mac address of the device that assigned the value of session_id
+ * @param [in] session_id ASP session ID assigned by the remote ASP
+ * @param [out] state current state of session. one of [OPEN, INITIATED, REQUESTED, CLOSE]
+ * @return gboolean
+ *
+ * @paragraph <Example>
+ *
+ * @verbatim
+ * asp_session_status_e state;
+ * asp_session_get_state(session_mac, sessoin_id, &state);
+ * @endverbatim
+*/
+gboolean asp_session_get_state(guint8 *session_mac, guint32 session_id,
+               asp_session_status_e *state);
+
+/**
+ * @brief method to get ip & port of the peer.
+ * @param [in] session_mac mac address of the device that assigned the value of session_id
+ * @param [in] session_id ASP session ID assigned by the remote ASP
+ * @param [out] peer_ip ip string
+ * @param [out] port port num
+ * @return gboolean
+ *
+ * @paragraph <Example>
+ *
+ * @verbatim
+ * gchar ip[16]; // example of IPV4
+ * guint16 port;
+ * asp_session_get_peer_endpoint(session_mac, session_id, ip, &port);
+ * @endverbatim
+*/
+gboolean asp_session_get_peer_endpoint(guint8 *session_mac, guint32 session_id,
+               gchar *peer_ip, guint16 *port);
+
+/**
+ * @brief method to register a callback for ASP SessionReqeust event
+ * @param [in] cb a callback for ASP SessionRequest event
+ * @param [in] user_data callback user data
+ * @return gboolean
+ *
+ * @paragraph <Example>
+ * the registered callback will be triggered when session reqeust callback need to be called
+ *
+ * @verbatim
+ * void my_cb(gint32 error_code, guint8* session_mac, guint32 session_id, guint32 adv_id, guint8* session_info, size_t length, gpointer user_data)
+ * {
+ * }
+ * asp_session_set_session_request_cb(some_cb,
+ * @endverbatim
+*/
+gboolean asp_session_set_session_request_cb(asp_session_session_request_cb cb, gpointer user_data);
+
+/**
+ * @brief method to register a callback for ASP SessionConfigRequest event
+ * @param [in] cb a callback for ASP SessionConfigRequest event
+ * @param [in] user_data callback user data
+ * @return gboolean
+ *
+ * @paragraph <Example>
+ * the registered callback will be triggered when session request callback need to be called
+ *
+ * @verbatim
+ * void my_cb (gint32 error_code, guint8* session_mac, guint32 session_id, gboolean get_pin, guint32 pin, gpointer user_data)
+ * {
+ * }
+ * asp_session_set_session_config_request_cb(some_cb, (gpointer) user_data);
+ * @endverbatim
+*/
+gboolean asp_session_set_session_config_request_cb(asp_session_session_config_request_cb cb, gpointer user_data);
+
+/**
+ * @brief method to register a callback for ASP ConnectStatus event
+ * @param [in] cb a callback for ASP ConnectStatus event
+ * @param [in] user_data callback user data
+ * @return gboolean
+ *
+ * @paragraph <Example>
+ * the registered callback will be triggered when connect status callback need to be called
+ *
+ * @verbatim
+ * void my_cb(gint32 error_code, const guint8* session_mac, guint32 session_id, asp_session_connect_status_e status, guint8* deferred_resp, size_t resp_length, gpointer user_data);
+ * {
+ * }
+ * asp_session_set_connect_status_cb(some_cb, (gpointer) user_data);
+ * @endverbatim
+*/
+gboolean asp_session_set_connect_status_cb(asp_session_connect_status_cb cb, gpointer user_data);
+
+/**
+ * @brief method to register a callback for ASP SessionStatus event
+ * @param [in] cb a callback for ASP SessionStatus event
+ * @param [in] user_data callback user data
+ * @return gboolean
+ *
+ * @paragraph <Example>
+ * the registered callback will be triggered when connect status callback need to be called
+ *
+ * @verbatim
+ * void my_cb(gint32 error_code, const guint8* session_mac, guint32 session_id, asp_session_status_e state, asp_session_closed_state_e status, const gchar* requested_info, gpointer user_data);
+ * {
+ * }
+ * asp_session_set_session_request_cb(some_cb, (gpointer) user_data);
+ * @endverbatim
+*/
+gboolean asp_session_set_session_status_cb(asp_session_session_status_cb cb, gpointer user_data);
+
+/**
+ * @brief method to register a callback for ASP PortStatus event
+ * @param [in] cb a callback for ASP PortStatus event
+ * @param [in] user_data callback user data
+ * @return gboolean
+ *
+ * @paragraph <Example>
+ * the registered callback will be triggered when port status callback need to be called
+ *
+ * @verbatim
+ * void my_cb(gint32 error_code, const guint8* session_mac, guint32 session_id, const gchar* peer_ip, guint16 port, guint8 protocol, asp_session_port_status_e status, gpointer user_data);
+ * {
+ * }
+ * asp_session_set_session_request_cb(my_cb, (gpointer) user_data);
+ * @endverbatim
+*/
+gboolean asp_session_set_port_status_cb(asp_session_port_status_cb cb, gpointer user_data);
+
+#endif                                                 /* __ASP_SESSION_H__ */
index e98616c..56588ab 100755 (executable)
 #ifndef __ASP_TECH_H__
 #define __ASP_TECH_H__
 
+#include <glib.h>
+
+typedef void (*asp_tech_session_request_cb)(gint32 error_code, const guint8 *session_mac, guint32 session_id, guint32 adv_id, const gchar *device_name, size_t name_length, const guint8 *session_info, size_t info_length, gboolean get_pin, guint32 pin, gpointer user_data);
+typedef void (*asp_tech_session_config_request_cb)(gint32 error_code, const guint8 *session_mac, guint32 session_id, gboolean get_pin, guint32 pin, gpointer user_data);
+typedef void (*asp_tech_connect_status_cb)(gint32 error_code, const guint8 *session_mac, guint32 session_id, asp_session_connect_status_e status, gpointer user_data);
+typedef void (*asp_tech_ip_assigned_cb)(gint32 error_code, const guint8 *session_mac, guint32 session_id, gchar *service_mac, gchar *peer_ip_addr, gint32 ip_length, gpointer user_data);
+
 #define PINSTR_LEN 8
+#ifndef MACSTR_LEN
+#define MACSTR_LEN 17
+#endif
+#ifndef MAC_LEN
+#define MAC_LEN 6
+#endif
 
 typedef enum {
        ASP_TECH_NONE,
@@ -34,12 +47,19 @@ typedef enum {
        ASP_EVENT_SEARCH_RESULT,
        ASP_EVENT_SEARCH_TERMINATED,
        ASP_EVENT_SESSION_REQUEST,
-       ASP_EVENT_SESSION_CONFIG_REQUEST,
-       ASP_EVENT_CONNECT_STATUS,
-       ASP_EVENT_SESSION_STATUS,
-       ASP_EVENT_PORT_STATUS,
        ASP_EVENT_MAX,
-} asp_event_type;
+} asp_event_type_e;
+
+typedef struct {
+       guint8 service_mac[MAC_LEN];
+       guint32 advertisement_id;
+       guint8 session_mac[MAC_LEN];
+       guint32 session_id;
+       gint32 network_config;
+       gint32 network_role;
+       gchar *session_information;
+} asp_tech_session_request_params_s;
+
 
 typedef union {
        /**
@@ -47,14 +67,14 @@ typedef union {
         * Data for ASP_EVENT_SEARCH_RESULT event
         */
        struct search_result {
-               int tech;
-               char service_mac[MACSTR_LEN + 1];
-               unsigned int search_id;
-               unsigned int advertisement_id;
-               int service_status;
-               char *device_name;
-               char *instance_name;
-               char *service_type;
+               gint32 tech;
+               gchar service_mac[MACSTR_LEN + 1];
+               guint32 search_id;
+               guint32 advertisement_id;
+               gint32 service_status;
+               gchar *device_name;
+               gchar *instance_name;
+               gchar *service_type;
                GHashTable *service_info;
        } search_result;
        /**
@@ -62,9 +82,9 @@ typedef union {
         * Data for ASP_EVENT_SEARCH_TERMINATED event
         */
        struct search_terminated {
-               int tech;
-               unsigned int search_id;
-               int reason;
+               gint32 tech;
+               guint32 search_id;
+               gint32 reason;
 
        } search_terminated;
        /**
@@ -72,88 +92,103 @@ typedef union {
         * Data for ASP_EVENT_SESSION_REQUEST event
         */
        struct session_request {
-               int tech;
-               unsigned int advertisement_id;
-               char session_mac[MACSTR_LEN + 1];
-               unsigned int session_id;
-               int get_pin;
-               char *device_name;
-               char pin[PINSTR_LEN + 1];
-               char *session_info;
+               gint32 tech;
+               guint32 advertisement_id;
+               gchar session_mac[MACSTR_LEN + 1];
+               guint32 session_id;
+               gint32 get_pin;
+               gchar *device_name;
+               gchar pin[PINSTR_LEN + 1];
+               gchar *session_info;
        } session_request;
        /**
         *  struct session_config_request -
         * Data for ASP_EVENT_SESSION_CONFIG_REQUEST event
         */
        struct session_config_request {
-               int tech;
-               unsigned int session_id;
-               int get_pin;
-               char pin[PINSTR_LEN + 1];
+               gint32 tech;
+               guint32 session_id;
+               gint32 get_pin;
+               gchar pin[PINSTR_LEN + 1];
        } session_config_request;
        /**
         *  struct connect_status -
         * Data for ASP_EVENT_CONNECT_STATUS event
         */
        struct connect_status {
-               int tech;
-               char session_mac[MACSTR_LEN + 1];
-               unsigned int session_id;
-               int status;
-               char *deferred;
+               gint32 tech;
+               gchar session_mac[MACSTR_LEN + 1];
+               guint32 session_id;
+               gint32 status;
+               gchar *deferred;
        } connect_status;
        /**
         *  struct session_status -
         * Data for ASP_EVENT_SESSION_STATUS event
         */
        struct session_status {
-               int tech;
-               char session_mac[MACSTR_LEN + 1];
-               unsigned int session_id;
-               int state;
-               int status;
-               char *info;
+               gint32 tech;
+               gchar session_mac[MACSTR_LEN + 1];
+               guint32 session_id;
+               gint32 state;
+               gint32 status;
+               gchar *info;
        } session_status ;
        /**
         *  struct port_status -
         * Data for ASP_EVENT_PORT_STATUS event
         */
        struct port_status {
-               int tech;
-               char session_mac[MACSTR_LEN + 1];
-               unsigned int session_id;
-               unsigned char ip[4];
-               int port;
-               int proto;
-               int status;
+               gint32 tech;
+               gchar session_mac[MACSTR_LEN + 1];
+               guint32 session_id;
+               guint8 ip[4];
+               gint32 port;
+               gint32 proto;
+               gint32 status;
 
        } port_status;
 
 } asp_event_data;
 
 typedef struct {
-       int (*init)();
-       int (*deinit)();
-       int (*advertise)(asp_service_advertise_s *service, int replace);
-       int (*cancel_advertise)(asp_service_advertise_s *service);
-       int (*seek)(asp_service_seek_s *service);
-       int (*cancel_seek)(asp_service_seek_s *service);
-       int (*connect_session)(asp_connect_session_params *params);
-       int (*confirm_session)(unsigned char *session_mac, int session_id, int confirm, const char *pin);
-       int (*destroy_connection)();
+       gint32 (*init)();
+       gint32 (*deinit)();
+       gint32 (*advertise)(asp_service_advertise_s *service, gint32 replace);
+       gint32 (*cancel_advertise)(asp_service_advertise_s *service);
+       gint32 (*seek)(asp_service_seek_s *service);
+       gint32 (*cancel_seek)(asp_service_seek_s *service);
+       gint32 (*connect_session)(asp_tech_session_request_params_s *params);
+       gint32 (*confirm_session)(const guint8 *session_mac, gint32 session_id, gint32 confirm, guint32 pin);
+       gint32 (*destroy_connection)(const guint8 *peer_id, gint32 peer_id_length);
+       gint32 (*is_peer_connected)(const guint8 *peer_id, gint32 peer_id_length, gint32 *is_connected);
+       asp_tech_session_request_cb session_request_cb;
+       gpointer session_request_cb_user_data;
+       asp_tech_session_config_request_cb session_config_request_cb;
+       gpointer session_config_request_cb_user_data;
+       asp_tech_connect_status_cb connect_status_cb;
+       gpointer connect_status_cb_user_data;
+       asp_tech_ip_assigned_cb ip_assigned_cb;
+       gpointer ip_assigned_cb_user_data;
 } asp_tech_ops_s;
 
 void asp_tech_init();
 void asp_tech_deinit();
 
-int asp_tech_advertise(int tech, asp_service_advertise_s *service, int replace);
-int asp_tech_cancel_advertise(int tech, asp_service_advertise_s *service);
-int asp_tech_seek(int tech, asp_service_seek_s *service);
-int asp_tech_cancel_seek(int tech, asp_service_seek_s *service);
-int asp_tech_connect_session(int tech, asp_connect_session_params *params);
-int asp_tech_confirm_session(int tech, unsigned char *session_mac, int session_id, int confirm, const char *pin);
-int asp_tech_destroy_connection(int tech);
+gint32 asp_tech_advertise(gint32 tech, asp_service_advertise_s *service, gint32 replace);
+gint32 asp_tech_cancel_advertise(gint32 tech, asp_service_advertise_s *service);
+gint32 asp_tech_seek(gint32 tech, asp_service_seek_s *service);
+gint32 asp_tech_cancel_seek(gint32 tech, asp_service_seek_s *service);
+gint32 asp_tech_connect_session(gint32 tech, asp_tech_session_request_params_s *params);
+gint32 asp_tech_confirm_session(gint32 tech, const guint8 *session_mac, gint32 session_id, gint32 confirm, guint32 pin);
+gint32 asp_tech_destroy_connection(gint32 tech, const guint8 *peer_id, gint32 peer_id_length);
+gint32 asp_tech_is_peer_connected(gint32 tech, const guint8 *peer_id, gint32 peer_id_length, gint32 *is_connected);
+
+void asp_tech_set_session_request_cb(gint32 tech, asp_tech_session_request_cb cb, gpointer user_data);
+void asp_tech_set_session_config_request_cb(gint32 tech, asp_tech_session_config_request_cb cb, gpointer user_data);
+void asp_tech_set_connect_status_cb(gint32 tech, asp_tech_connect_status_cb cb, gpointer user_data);
+void asp_tech_set_ip_assigned_cb(gint32 tech, asp_tech_ip_assigned_cb cb, gpointer user_data);
 
-void asp_manager_event(void *ctx, asp_event_type event, asp_event_data *data);
+void asp_manager_event(gpointer ctx, asp_event_type_e event, asp_event_data *data);
 
 #endif /* __ASP_TECH_H__ */
index 56611a3..9390d9f 100755 (executable)
@@ -3,6 +3,7 @@
                <method name='ConnectSession'>
                        <arg type='a{sv}' name='parameters' direction='in'/>
                        <arg type='i' name='error_code' direction='out'/>
+                       <arg type='u' name='session_id' direction='out'/>
                        <arg type='s' name='session_mac' direction='out'/>
                </method>
                <method name='ConfirmSession'>
@@ -38,5 +39,8 @@
                <signal name='SessionStatus'>
                        <arg type='a{sv}' name='parameters'/>
                </signal>
+               <signal name='PortStatus'>
+                       <arg type='a{sv}' name='parameters'/>
+               </signal>
                </interface>
 </node>
index 40260a9..1fd224c 100755 (executable)
@@ -52,7 +52,7 @@
  * Local Functions Definition
  *****************************************************************************/
 
-void __asp_process_search_result(void *ctx, asp_event_data *data)
+void __asp_process_search_result(gpointer ctx, asp_event_data *data)
 {
        __ASP_LOG_FUNC_ENTER__;
 
@@ -82,107 +82,9 @@ void __asp_process_search_terminated(void *ctx, asp_event_data *data)
        return;
 }
 
-void __asp_process_session_request(void *ctx, asp_event_data *data)
-{
-       __ASP_LOG_FUNC_ENTER__;
-
-       asp_s *asp = NULL;
-       asp_session_s * local_session = NULL;
-       unsigned char session_mac[MAC_LEN] = {0,};
-
-       asp = asp_get_manager();
-       if (asp == NULL) {
-               ASP_LOGE("memory allocation for session is failed");
-               return;
-       }
-
-       if (data == NULL) {
-               ASP_LOGE("Invalid parameters");
-               return;
-       }
-
-       macaddr_atoe(data->session_request.session_mac, session_mac);
-       /* Make local p2p address as session mac */
-       local_session = asp_session_create(
-                       session_mac,
-                       data->session_request.session_id,
-                       data->session_request.advertisement_id);
-       if (local_session == NULL) {
-               ASP_LOGE("memory allocation for session is failed");
-               return;
-       }
-       /* make local p2p address as service mac */
-       memcpy(local_session->service_mac, asp->p2p_local_address, MAC_LEN);
-
-       asp_manager_gdbus_notify_session_request(
-                       data->session_request.advertisement_id,
-                       data->session_request.session_id,
-                       data->session_request.session_mac,
-                       data->session_request.device_name,
-                       data->session_request.session_info,
-                       data->session_request.get_pin,
-                       data->session_request.pin);
-
-       if (data->session_request.tech == ASP_TECH_P2P)
-               asp_state_set(local_session, ASP_SESSION_REQUESTED, 0, "PDRequest");
-       else
-               asp_state_set(local_session, ASP_SESSION_REQUESTED, 0, "REQUEST_SESSION");
-
-       __ASP_LOG_FUNC_EXIT__;
-       return;
-}
-
-void __asp_process_session_config_request(void *ctx, asp_event_data *data)
-{
-       __ASP_LOG_FUNC_ENTER__;
-
-       if (data == NULL) {
-               ASP_LOGE("Invalid parameters");
-               return;
-       }
-
-       __ASP_LOG_FUNC_EXIT__;
-       return;
-}
-
-void __asp_process_connect_status(void *ctx, asp_event_data *data)
-{
-       __ASP_LOG_FUNC_ENTER__;
-
-       if (data == NULL) {
-               ASP_LOGE("Invalid parameters");
-               return;
-       }
-
-       asp_manager_gdbus_notify_connect_status(
-                       data->connect_status.session_mac,
-                       data->connect_status.session_id,
-                       data->connect_status.status,
-                       data->connect_status.deferred);
-
-       __ASP_LOG_FUNC_EXIT__;
-       return;
-}
-
-void __asp_process_session_status(void *ctx, asp_event_data *data)
-{
-       __ASP_LOG_FUNC_ENTER__;
-
-       __ASP_LOG_FUNC_EXIT__;
-       return;
-}
-
-void __asp_process_port_status(void *ctx, asp_event_data *data)
-{
-       __ASP_LOG_FUNC_ENTER__;
-
-       __ASP_LOG_FUNC_EXIT__;
-       return;
-}
-
 static struct {
-       const int event_id;
-       void (*function) (void *ctx, asp_event_data *data);
+       const gint32 event_id;
+       void (*function) (gpointer ctx, asp_event_data *data);
 } asp_event_map[] = {
                {
                                ASP_EVENT_NONE,
@@ -197,32 +99,12 @@ static struct {
                                __asp_process_search_terminated,
                },
                {
-                               ASP_EVENT_SESSION_REQUEST,
-                               __asp_process_session_request,
-               },
-               {
-                               ASP_EVENT_SESSION_CONFIG_REQUEST,
-                               __asp_process_session_config_request,
-               },
-               {
-                               ASP_EVENT_CONNECT_STATUS,
-                               __asp_process_connect_status,
-               },
-               {
-                               ASP_EVENT_SESSION_STATUS,
-                               __asp_process_session_status,
-               },
-               {
-                               ASP_EVENT_PORT_STATUS,
-                               __asp_process_port_status,
-               },
-               {
                                ASP_EVENT_MAX,
                                NULL
                }
 };
 
-void asp_manager_event(void *ctx, asp_event_type event, asp_event_data *data)
+void asp_manager_event(gpointer ctx, asp_event_type_e event, asp_event_data *data)
 {
        __ASP_LOG_FUNC_ENTER__;
 
index ac83e3f..ce28b3c 100755 (executable)
@@ -41,6 +41,7 @@
 #include "asp-manager-gdbus.h"
 #include "asp-service.h"
 #include "asp-session.h"
+#include "asp-tech.h"
 
 #include "generated-code.h"
 
@@ -53,7 +54,7 @@
 #define ASP_DBUS_SERVICE_ASP_SERVICE_PATH              "/net/asp/service"
 #define ASP_DBUS_SERVICE_ASP_SESSION_PATH              "/net/asp/session"
 
-static const char * asp_err_strs[] = {
+static const gchar *asp_err_strs[] = {
                "NO_ERR",
                "MEM_ERR",
                "INVALID_PARAM",
@@ -111,7 +112,7 @@ static gboolean __asp_manager_gdbus_advertise_service(AspService *object,
        GVariant *var = NULL;
        asp_service_advertise_s service;
        asp_s *asp = NULL;
-       int result = 0;
+       gint32 result = 0;
 
        asp = (asp_s *)user_data;
        if (!asp) {
@@ -180,7 +181,7 @@ static gboolean __asp_manager_gdbus_service_status_change(AspService *object,
        GVariant *var = NULL;
        asp_service_advertise_s service;
        asp_s *asp = NULL;
-       int result = 0;
+       gint32 result = 0;
 
        asp = (asp_s *)user_data;
        if (!asp) {
@@ -243,7 +244,7 @@ static gboolean __asp_manager_gdbus_cancel_advertise_service(AspService *object,
        __ASP_LOG_FUNC_ENTER__;
        asp_service_advertise_s service;
        asp_s *asp = NULL;
-       int result = 0;
+       gint32 result = 0;
 
        asp = (asp_s *)user_data;
        if (!asp) {
@@ -286,8 +287,8 @@ static gboolean __asp_manager_gdbus_seek_service(AspService *object,
        GVariant *var = NULL;
        asp_service_seek_s service;
        asp_s *asp = NULL;
-       int result = 0;
-       unsigned long long search_id = -1;
+       gint32 result = 0;
+       guint64 search_id = -1;
 
        asp = (asp_s *)user_data;
        if (!asp) {
@@ -323,12 +324,6 @@ static gboolean __asp_manager_gdbus_seek_service(AspService *object,
                goto out;
        }
 
-       if (search_id < 0) {
-               ASP_LOGE("Invalid search id");
-               ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
-               goto out;
-       }
-
        asp_service_complete_seek_service(object, invocation, result, search_id);
 
 out:
@@ -345,7 +340,7 @@ static gboolean __asp_manager_gdbus_cancel_seek_service(AspService *object,
        __ASP_LOG_FUNC_ENTER__;
        asp_service_seek_s service;
        asp_s *asp = NULL;
-       int result = 0;
+       gint32 result = 0;
 
        asp = (asp_s *)user_data;
        if (!asp) {
@@ -435,7 +430,7 @@ static gboolean __asp_manager_gdbus_service_init(asp_s *asp)
        g_dbus_object_manager_server_export(asp->obj_mgr, G_DBUS_OBJECT_SKELETON(object));
        g_object_unref(object);
 
-       asp->service_obj = (void *)service;
+       asp->service_obj = (gpointer)service;
 
        __ASP_LOG_FUNC_EXIT__;
        return ret;
@@ -448,66 +443,94 @@ static gboolean __asp_manager_gdbus_connect_session(AspSession *object,
 {
        __ASP_LOG_FUNC_ENTER__;
        GVariantIter *iter = NULL;
-       gchar *key = NULL;
        GVariant *var = NULL;
+       gchar *key = NULL;
+       gchar *str = NULL;
        asp_s *asp = NULL;
-       asp_session_s *session = NULL;
-       asp_connect_session_params params;
-       const char *service_mac = NULL;
-       char session_mac[MACSTR_LEN + 1] = {0,};
-       int result = 0;
+       guint8 service_mac[MAC_LEN] = {0,};
+       guint32 adv_id = 0;
+       guint8 * session_info = NULL;
+       size_t info_length = 0;
+       guint8 network_role = 0;
+       guint32 network_config = 0;
+       guint32 session_id = 0;
+       const gchar *service_mac_str = NULL;
+       gchar peer_ip_str[IPSTR_MAXLEN] = {0,};
+       gboolean res;
 
        asp = (asp_s *)user_data;
        if (!asp) {
                ASP_LOGE("Failed to get memory for asp structure");
-               ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
+               ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
                goto out;
        }
        DEBUG_PARAMS(parameters);
-       memset(&params, 0, sizeof(asp_connect_session_params));
 
        g_variant_get(parameters, "a{sv}", &iter);
        while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
 
-               if (!g_strcmp0(key, "service_mac"))
-                       g_variant_get(var, "&s", &service_mac);
-               else if (!g_strcmp0(key, "adv_id"))
-                       g_variant_get(var, "u", &(params.advertisement_id));
-               else if (!g_strcmp0(key, "session_id"))
-                       g_variant_get(var, "i", &(params.session_id));
-               else if (!g_strcmp0(key, "role"))
-                       g_variant_get(var, "y", &(params.network_role));
-               else if (!g_strcmp0(key, "config_method"))
-                       g_variant_get(var, "u", &(params.network_config));
-               else if (!g_strcmp0(key, "session_info"))
-                       g_variant_get(var, "&s", &(params.session_information));
-               else
+               if (!g_strcmp0(key, "service_mac")) {
+                       g_variant_get(var, "&s", &service_mac_str);
+               } else if (!g_strcmp0(key, "adv_id")) {
+                       g_variant_get(var, "u", &adv_id);
+               } else if (!g_strcmp0(key, "session_id")) {
+                       g_variant_get(var, "i", &session_id);
+               } else if (!g_strcmp0(key, "role")) {
+                       g_variant_get(var, "y", &network_role);
+               } else if (!g_strcmp0(key, "config_method")) {
+                       g_variant_get(var, "u", &network_config);
+               } else if (!g_strcmp0(key, "peer_id")) {
+                       g_variant_get(var, "&s", &str);
+                       g_strlcpy(peer_ip_str, str, IPSTR_MAXLEN);
+               }  else if (!g_strcmp0(key, "session_info")) {
+                       g_variant_get(var, "&s", &str);
+                       info_length = strlen(str);
+                       session_info = g_try_malloc0(info_length + 1);
+                       if (session_info == NULL) {
+                               ASP_LOGE("Memory Failure");
+                               ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_MEMORY);
+                               goto out;
+                       }
+                       memcpy(session_info, str, info_length);
+               } else {
                        ;/* Do Nothing */
+               }
        }
 
-       if (params.session_id == 0 || service_mac == NULL) {
+       if (service_mac_str == NULL) {
                ASP_LOGE("Invalid parameter");
-               ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
+               ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
                goto out;
        }
 
-       if (strlen(service_mac) != 17) {
+       if (strlen(service_mac_str) != 17) {
                ASP_LOGE("Invalid parameter");
-               ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
+               ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
                goto out;
        }
 
+       /* TODO: need proper usage of CCEX
+        * If user wants to connect via infra structured,
+        */
 
-       macaddr_atoe(service_mac, params.service_mac);
-       result = asp_session_connect_session(&params, &session);
-       if (result < 0 || session == NULL) {
-               ASP_LOGE("Operation failed");
-               ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
+       /*
+       res = asp_session_connect_session_over_infa(peer_ip_str, adv_id,
+                       session_info, info_length, session_mac,  &session_id);
+       */
+
+       macaddr_atoe(service_mac_str, service_mac);
+       ASP_LOGD("service mac" MACSTR, MAC2STR(service_mac));
+       res = asp_session_connect_session_over_p2p(service_mac, adv_id,
+                       session_info, info_length, network_role, network_config,
+                       asp->p2p_local_address, &session_id);
+       if (!res) {
+               ASP_LOGE("Operation Failed");
+               ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
                goto out;
        }
 
-       g_snprintf(session_mac, MACSTR_LEN, MACSTR, MAC2STR(session->session_mac));
-       asp_session_complete_connect_session(object, invocation, result, session_mac);
+       asp_session_complete_connect_session(object, invocation, ASP_ERROR_NONE,
+                       session_id, asp->p2p_local_address_str);
 
 out:
 
@@ -526,19 +549,19 @@ static gboolean __asp_manager_gdbus_confirm_session(AspSession *object,
        gchar *key = NULL;
        GVariant *var = NULL;
        asp_s *asp = NULL;
-       asp_session_s *session = NULL;
 
-       const char *session_mac = NULL;
-       unsigned int session_id = 0;
-       int confirmed = 0;
-       const char *pin = NULL;
-       unsigned char mac_addr[MAC_LEN] = {0,};
-       int result = 0;
+       const gchar *session_mac = NULL;
+       gint32 confirmed = 0;
+       const gchar *pin_str = NULL;
+       guint32 session_id = 0;
+       guint32 pin = 0;
+       guint8 mac_addr[MAC_LEN] = {0,};
+       gboolean res;
 
        asp = (asp_s *)user_data;
        if (!asp) {
                ASP_LOGE("Failed to get memory for asp structure");
-               ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
+               ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
                goto out;
        }
        DEBUG_PARAMS(parameters);
@@ -552,34 +575,33 @@ static gboolean __asp_manager_gdbus_confirm_session(AspSession *object,
                else if (!g_strcmp0(key, "confirmed"))
                        g_variant_get(var, "i", &confirmed);
                else if (!g_strcmp0(key, "pin"))
-                       g_variant_get(var, "&s", &pin);
+                       g_variant_get(var, "&s", &pin_str);
                else
                        ;/* Do Nothing */
        }
        if (session_id == 0 || session_mac == NULL) {
                ASP_LOGE("Invalid parameter");
-               ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
+               ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
                goto out;
        }
 
        if (strlen(session_mac) != 17) {
                ASP_LOGE("Invalid parameter");
-               ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
+               ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
                goto out;
        }
        ASP_LOGD("session ID [%u] session mac [%s]", session_id, session_mac);
 
        macaddr_atoe(session_mac, mac_addr);
-       session = asp_session_get_session(mac_addr, session_id);
-       if (session == NULL) {
-               ASP_LOGE("Failed to get session");
-               ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_SESSION_NOT_FOUND);
+       pin = (guint32)atoi(pin_str);
+       res = asp_session_confirm_session(mac_addr, session_id, confirmed, pin);
+       if (!res) {
+               ASP_LOGE("Operation Failed");
+               ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
                goto out;
        }
 
-       asp_session_complete_confirm_session(object, invocation, result);
-
-       asp_session_confirm_session(mac_addr, session_id, confirmed, pin);
+       asp_session_complete_confirm_session(object, invocation, ASP_ERROR_NONE);
 
 out:
        g_variant_iter_free(iter);
@@ -594,47 +616,42 @@ static gboolean __asp_manager_gdbus_get_session(AspSession *object,
                const gboolean *user_data)
 {
        __ASP_LOG_FUNC_ENTER__;
-       GVariant *session = NULL;
        GVariantBuilder *builder = NULL;
+       GVariant *session = NULL;
        asp_s *asp = NULL;
-       asp_session_s *local_session = NULL;
-       unsigned char mac_addr[MAC_LEN] = {0,};
-       int result = 0;
+       guint8 mac_addr[MAC_LEN] = {0,};
+       guint32 adv_id = 0;
+       gint32 result = 0;
 
        asp = (asp_s *)user_data;
        if (!asp) {
                ASP_LOGE("Failed to get memory for asp structure");
-               ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
+               ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
                goto out;
        }
 
        if (session_id == 0 || session_mac == NULL) {
                ASP_LOGE("Invalid parameter");
-               ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
+               ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
                goto out;
        }
 
        if (strlen(session_mac) != 17) {
                ASP_LOGE("Invalid parameter");
-               ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
+               ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
                goto out;
        }
        ASP_LOGD("session ID [%u] session mac [%s]", session_id, session_mac);
 
        macaddr_atoe(session_mac, mac_addr);
-       local_session = asp_session_get_session(mac_addr, session_id);
-       if (local_session == 0) {
+       if (!asp_session_get_advertisement_id(mac_addr, session_id, &adv_id)) {
                ASP_LOGE("Failed to get session");
                ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_SESSION_NOT_FOUND);
                goto out;
        }
 
        builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
-       g_variant_builder_add(builder, "{sv}", "adv_id", g_variant_new("u", local_session->advertisement_id));
-       g_variant_builder_add(builder, "{sv}", "service_mac", g_variant_new("s", local_session->service_mac));
-       g_variant_builder_add(builder, "{sv}", "session_id", g_variant_new("u", local_session->session_id));
-       g_variant_builder_add(builder, "{sv}", "session_mac", g_variant_new("s", local_session->session_mac));
-       g_variant_builder_add(builder, "{sv}", "state", g_variant_new("i", local_session->state));
+       g_variant_builder_add(builder, "{sv}", "adv_id", g_variant_new("u", adv_id));
 
        session = g_variant_new("(a{sv})", builder);
        g_variant_builder_unref(builder);
@@ -653,41 +670,38 @@ static gboolean __asp_manager_gdbus_set_session_ready(AspSession *object,
 {
        __ASP_LOG_FUNC_ENTER__;
        asp_s *asp = NULL;
-       asp_session_s *session = NULL;
-       unsigned char mac_addr[MAC_LEN] = {0,};
-       int result = 0;
+       guint8 mac_addr[MAC_LEN] = {0,};
+       gboolean res;
 
        asp = (asp_s *)user_data;
        if (!asp) {
                ASP_LOGE("Failed to get memory for asp structure");
-               ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
+               ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
                goto out;
        }
 
        if (session_id == 0 || session_mac == NULL) {
                ASP_LOGE("Invalid parameter");
-               ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
+               ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
                goto out;
        }
 
        if (strlen(session_mac) != 17) {
                ASP_LOGE("Invalid parameter");
-               ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
+               ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
                goto out;
        }
        ASP_LOGD("session ID [%u] session mac [%s]", session_id, session_mac);
 
        macaddr_atoe(session_mac, mac_addr);
-       session = asp_session_get_session(mac_addr, session_id);
-       if (session == NULL) {
-               ASP_LOGE("Failed to get session");
-               ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_SESSION_NOT_FOUND);
+       res = asp_session_set_session_ready(mac_addr, session_id);
+       if (!res) {
+               ASP_LOGE("Operation Failed");
+               ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
                goto out;
        }
 
-       asp_session_complete_set_session_ready(object, invocation, result);
-
-       asp_session_set_session_ready(mac_addr, session_id);
+       asp_session_complete_set_session_ready(object, invocation, ASP_ERROR_NONE);
 
 out:
        __ASP_LOG_FUNC_EXIT__;
@@ -702,41 +716,38 @@ static gboolean __asp_manager_gdbus_close_session(AspSession *object,
 {
        __ASP_LOG_FUNC_ENTER__;
        asp_s *asp = NULL;
-       asp_session_s *session = NULL;
-       unsigned char mac_addr[MAC_LEN] = {0,};
-       int result = 0;
+       guint8 mac_addr[MAC_LEN] = {0,};
+       gboolean res;
 
        asp = (asp_s *)user_data;
        if (!asp) {
                ASP_LOGE("Failed to get memory for asp structure");
-               ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
+               ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
                goto out;
        }
 
        if (session_id == 0 || session_mac == NULL) {
                ASP_LOGE("Invalid parameter");
-               ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
+               ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
                goto out;
        }
 
        if (strlen(session_mac) != 17) {
                ASP_LOGE("Invalid parameter");
-               ASP_RETURN_SERVICE_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
+               ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_INVALIED_PARAMS);
                goto out;
        }
        ASP_LOGD("session ID [%u] session mac [%s]", session_id, session_mac);
 
        macaddr_atoe(session_mac, mac_addr);
-       session = asp_session_get_session(mac_addr, session_id);
-       if (session == NULL) {
-               ASP_LOGE("Failed to get session");
-               ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_SESSION_NOT_FOUND);
+       res = asp_session_close_session(mac_addr, session_id, 0);
+       if (!res) {
+               ASP_LOGE("Operation Failed");
+               ASP_RETURN_SESSION_ERR(invocation, -ASP_ERROR_OPERATION_FAILED);
                goto out;
        }
 
-       asp_session_complete_close_session(object, invocation, result);
-
-       asp_session_close_session(mac_addr, session_id);
+       asp_session_complete_close_session(object, invocation, ASP_ERROR_NONE);
 
 out:
        __ASP_LOG_FUNC_EXIT__;
@@ -801,7 +812,7 @@ static gboolean __asp_manager_gdbus_session_init(asp_s *asp)
        g_dbus_object_manager_server_export(asp->obj_mgr, G_DBUS_OBJECT_SKELETON(object));
        g_object_unref(object);
 
-       asp->session_obj = (void *)session;
+       asp->session_obj = (gpointer)session;
 
        __ASP_LOG_FUNC_EXIT__;
        return ret;
@@ -865,7 +876,7 @@ static GVariant *__g_hash_table_to_g_variant(GHashTable *hash)
        return g_variant_builder_end(&builder);
 }
 
-void asp_manager_gdbus_init(void *asp_manager)
+void asp_manager_gdbus_init(gpointer asp_manager)
 {
        __ASP_LOG_FUNC_ENTER__;
        asp_s *asp = (asp_s *)asp_manager;
@@ -880,7 +891,7 @@ void asp_manager_gdbus_init(void *asp_manager)
        __ASP_LOG_FUNC_EXIT__;
 }
 
-void asp_manager_gdbus_deinit(void *asp_manager)
+void asp_manager_gdbus_deinit(gpointer asp_manager)
 {
        __ASP_LOG_FUNC_ENTER__;
        asp_s *asp = (asp_s *)asp_manager;
@@ -890,7 +901,7 @@ void asp_manager_gdbus_deinit(void *asp_manager)
        __ASP_LOG_FUNC_EXIT__;
 }
 
-void asp_manager_gdbus_notify_advertise_status(unsigned int adv_id, unsigned char status, int reason)
+void asp_manager_gdbus_notify_advertise_status(guint32 adv_id, guint8 status, gint32 reason)
 {
        __ASP_LOG_FUNC_ENTER__;
 
@@ -900,13 +911,13 @@ void asp_manager_gdbus_notify_advertise_status(unsigned int adv_id, unsigned cha
        __ASP_LOG_FUNC_EXIT__;
 }
 
-void asp_manager_gdbus_notify_search_result(unsigned int search_id,
+void asp_manager_gdbus_notify_search_result(guint32 search_id,
                                                                                const gchar *service_mac,
                                                                                const gchar *service_device_name,
-                                                                               unsigned int adv_id,
+                                                                               guint32 adv_id,
                                                                                const gchar *instance_name,
                                                                                GHashTable *service_info_map,
-                                                                               unsigned char service_status)
+                                                                               guint8 service_status)
 {
        __ASP_LOG_FUNC_ENTER__;
 
@@ -944,9 +955,10 @@ void asp_manager_gdbus_notify_search_result(unsigned int search_id,
        __ASP_LOG_FUNC_EXIT__;
 }
 
-void asp_manager_gdbus_notify_session_request(unsigned int adv_id,
-               unsigned int sessoin_id, char *session_mac, char *device_name,
-               char *session_info, int get_pin, char *pin)
+void asp_manager_gdbus_notify_session_request(gint32 error_code,
+               gchar * session_mac, guint32 session_id, guint32 adv_id,
+               gchar * device_name, guint8 * session_info,
+               gboolean get_pin, gchar *pin)
 {
        __ASP_LOG_FUNC_ENTER__;
 
@@ -956,7 +968,7 @@ void asp_manager_gdbus_notify_session_request(unsigned int adv_id,
 
        builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
        g_variant_builder_add(builder, "{sv}", "adv_id", g_variant_new("u", adv_id));
-       g_variant_builder_add(builder, "{sv}", "session_id", g_variant_new("u", sessoin_id));
+       g_variant_builder_add(builder, "{sv}", "session_id", g_variant_new("u", session_id));
        g_variant_builder_add(builder, "{sv}", "session_mac", g_variant_new("s", session_mac));
        g_variant_builder_add(builder, "{sv}", "device_name", g_variant_new("s", device_name));
        g_variant_builder_add(builder, "{sv}", "session_info", g_variant_new("s", session_info));
@@ -973,8 +985,8 @@ void asp_manager_gdbus_notify_session_request(unsigned int adv_id,
        __ASP_LOG_FUNC_EXIT__;
 }
 
-void asp_manager_gdbus_notify_session_config_request(unsigned int sessoin_id,
-               int get_pin, char *pin)
+void asp_manager_gdbus_notify_session_config_request(guint32 sessoin_id,
+               gboolean get_pin, gchar *pin)
 {
        __ASP_LOG_FUNC_ENTER__;
 
@@ -997,8 +1009,8 @@ void asp_manager_gdbus_notify_session_config_request(unsigned int sessoin_id,
        __ASP_LOG_FUNC_EXIT__;
 }
 
-void asp_manager_gdbus_notify_connect_status(char *session_mac,
-               unsigned int session_id, int status, char *deferred)
+void asp_manager_gdbus_notify_connect_status(gchar *session_mac,
+               guint32 session_id, gint32 status, gchar *deferred)
 {
        __ASP_LOG_FUNC_ENTER__;
 
@@ -1021,8 +1033,8 @@ void asp_manager_gdbus_notify_connect_status(char *session_mac,
        __ASP_LOG_FUNC_EXIT__;
 }
 
-void asp_manager_gdbus_notify_session_status(char *session_mac,
-               unsigned int session_id, int state, int status, char *info)
+void asp_manager_gdbus_notify_session_status(gchar *session_mac,
+               guint32 session_id, gint32 state, gint32 status, const gchar *info)
 {
        __ASP_LOG_FUNC_ENTER__;
 
@@ -1046,3 +1058,31 @@ void asp_manager_gdbus_notify_session_status(char *session_mac,
 
        __ASP_LOG_FUNC_EXIT__;
 }
+
+void asp_manager_gdbus_notify_port_status(gchar * session_mac,
+               guint32 session_id, const gchar *ip, gint32 port, gint32 protocol,
+               gint32 status)
+{
+       __ASP_LOG_FUNC_ENTER__;
+
+       AspSession *session = asp_get_manager()->session_obj;
+       GVariantBuilder *builder = NULL;
+       GVariant *params = NULL;
+
+       builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
+       g_variant_builder_add(builder, "{sv}", "session_mac", g_variant_new("s", session_mac));
+       g_variant_builder_add(builder, "{sv}", "session_id", g_variant_new("u", session_id));
+       g_variant_builder_add(builder, "{sv}", "ip", g_variant_new("s", ip));
+       g_variant_builder_add(builder, "{sv}", "port", g_variant_new("i", port));
+       g_variant_builder_add(builder, "{sv}", "protocol", g_variant_new("i", protocol));
+       g_variant_builder_add(builder, "{sv}", "status", g_variant_new("i", status));
+
+       params = g_variant_new("a{sv}", builder);
+       g_variant_builder_unref(builder);
+
+       ASP_LOGD("Created parameter for port status signal");
+       asp_session_emit_port_status(session, params);
+
+       __ASP_LOG_FUNC_EXIT__;
+}
+
index 2296b52..73d54c3 100755 (executable)
  * Local Functions Definition
  *****************************************************************************/
 
-int macaddr_atoe(const char *p, unsigned char mac[])
+gint32 macaddr_atoe(const gchar *p, guint8 mac[])
 {
-       int i = 0;
+       gint32 i = 0;
 
        for (;;) {
-               mac[i++] = (char) strtoul(p, (char **) &p, 16);
+               mac[i++] = (gchar)strtoul(p, (char **)&p, 16);
                if (!*p++ || i == 6)
                        break;
        }
@@ -65,11 +65,11 @@ int macaddr_atoe(const char *p, unsigned char mac[])
        return (i == 6);
 }
 
-int asp_dbus_unpack_ay(unsigned char *dst, GVariant *src, int size)
+gint32 asp_dbus_unpack_ay(guint8 *dst, GVariant *src, gint32 size)
 {
        GVariantIter *iter = NULL;
-       int length = 0;
-       int rv = 1;
+       gint32 length = 0;
+       gint32 rv = 1;
 
        if (!dst || !src || size == 0) {
                ASP_LOGE("Invalid parameter");
index 58053ed..d80d672 100755 (executable)
@@ -53,6 +53,91 @@ static asp_s *g_asp = NULL;
  * Local Functions Definition
  *****************************************************************************/
 
+static void __session_request_cb(gint32 error_code, guint8 *session_mac,
+               guint32 session_id, guint32 adv_id, gchar *device_name,
+               size_t name_length, guint8 *session_info, size_t info_length,
+               gboolean get_pin, guint32 pin, gpointer user_data)
+{
+       __ASP_LOG_FUNC_ENTER__;
+
+       gchar session_mac_str[MACSTR_LEN + 1] = {0,};
+       gchar pin_str[MACSTR_LEN + 1] = {0,};
+
+       g_snprintf(session_mac_str, MACSTR_LEN + 1, MACSTR, MAC2STR(session_mac));
+       g_snprintf(pin_str, PINSTR_LEN + 1, "%u", pin);
+       asp_manager_gdbus_notify_session_request(error_code, session_mac_str,
+                       session_id, adv_id, device_name, session_info, get_pin, pin_str);
+
+       __ASP_LOG_FUNC_EXIT__;
+       return;
+}
+
+static void __session_config_request_cb(gint32 error_code, guint8 *session_mac,
+               guint32 session_id, gboolean get_pin, guint32 pin, gpointer user_data)
+{
+       __ASP_LOG_FUNC_ENTER__;
+
+       gchar pin_str[MACSTR_LEN + 1] = {0,};
+       g_snprintf(pin_str, PINSTR_LEN + 1, "%u", pin);
+
+       asp_manager_gdbus_notify_session_config_request(session_id,
+                       get_pin, pin_str);
+
+       __ASP_LOG_FUNC_EXIT__;
+       return;
+}
+
+static void __connect_status_cb(gint32 error_code, const guint8 *session_mac,
+               guint32 session_id, asp_session_connect_status_e status,
+               guint8 *deferred_resp, size_t resp_length, gpointer user_data)
+{
+       __ASP_LOG_FUNC_ENTER__;
+
+       gchar session_mac_str[MACSTR_LEN + 1] = {0,};
+       g_snprintf(session_mac_str, MACSTR_LEN + 1, MACSTR, MAC2STR(session_mac));
+
+
+       asp_manager_gdbus_notify_connect_status(session_mac_str, session_id,
+                       status, deferred_resp);
+
+       __ASP_LOG_FUNC_EXIT__;
+       return;
+}
+
+static void __session_status_cb(gint32 error_code, const guint8 *session_mac,
+               guint32 session_id, asp_session_status_e state,
+               asp_session_closed_state_e status, const gchar *requested_info,
+               gpointer user_data)
+{
+       __ASP_LOG_FUNC_ENTER__;
+
+       gchar session_mac_str[MACSTR_LEN + 1] = {0,};
+       g_snprintf(session_mac_str, MACSTR_LEN + 1, MACSTR, MAC2STR(session_mac));
+
+       asp_manager_gdbus_notify_session_status(session_mac_str,
+                       session_id, state, status, requested_info);
+
+       __ASP_LOG_FUNC_EXIT__;
+       return;
+}
+
+static void __port_status_cb(gint32 error_code, const guint8 *session_mac,
+               guint32 session_id, const gchar *ip, guint16 port, guint8 protocol,
+               asp_session_port_status_e status, gpointer user_data)
+{
+       __ASP_LOG_FUNC_ENTER__;
+
+       gchar session_mac_str[MACSTR_LEN + 1] = {0,};
+       g_snprintf(session_mac_str, MACSTR_LEN + 1, MACSTR, MAC2STR(session_mac));
+
+       asp_manager_gdbus_notify_port_status(session_mac_str, session_id,
+                       ip, port, protocol, status);
+
+       __ASP_LOG_FUNC_EXIT__;
+       return;
+}
+
+
 asp_s *asp_get_manager()
 {
        return g_asp;
@@ -61,20 +146,23 @@ asp_s *asp_get_manager()
 static void __asp_manager_deinit()
 {
        __ASP_LOG_FUNC_ENTER__;
-       int res = 0;
+       gint32 res = 0;
 
        if (!g_asp) {
-               printf("Memory for manager structure is not allocated");
+               ASP_LOGD("Memory for manager structure is not allocated");
                return;
        }
 
+       if (!asp_session_deinitialize())
+               ASP_LOGE("Failed to deinitialize session");
+
        asp_tech_deinit();
 
        res = asp_service_deinit();
        if (res < 0)
                ASP_LOGE("Failed to deinitialize service");
 
-       asp_manager_gdbus_deinit((void *)g_asp);
+       asp_manager_gdbus_deinit((gpointer)g_asp);
 
        g_free(g_asp);
        g_asp = NULL;
@@ -85,7 +173,7 @@ static asp_s *__asp_manager_init()
 {
        __ASP_LOG_FUNC_ENTER__;
        asp_s *asp = NULL;
-       int res = 0;
+       gint32 res = 0;
 
        asp = (asp_s*) g_try_malloc0(sizeof(asp_s));
        if (!asp) {
@@ -105,17 +193,29 @@ static asp_s *__asp_manager_init()
                return NULL;
        }
 
-       asp_manager_gdbus_init((void *)asp);
+       if (!asp_session_initialize()) {
+               ASP_LOGE("Failed to initialize session");
+               g_free(asp);
+               return NULL;
+       }
+
+       asp_session_set_session_request_cb(__session_request_cb, NULL);
+       asp_session_set_session_config_request_cb(__session_config_request_cb, NULL);
+       asp_session_set_connect_status_cb(__connect_status_cb, NULL);
+       asp_session_set_session_status_cb(__session_status_cb, NULL);
+       asp_session_set_port_status_cb(__port_status_cb, NULL);
+
+       asp_manager_gdbus_init((gpointer)asp);
 
        ASP_LOGD("asp manager initialized");
        __ASP_LOG_FUNC_EXIT__;
        return asp;
 }
 
-int main(int argc, char *argv[])
+gint32 main(gint32 argc, gchar *argv[])
 {
        GMainLoop *main_loop = NULL;
-       int ret = -1;
+       gint32 ret = -1;
 
        /* Initialize required subsystems */
 #if !GLIB_CHECK_VERSION(2, 35, 0)
index 50367f9..2b1dc91 100755 (executable)
  * Local Functions Definition
  *****************************************************************************/
 
-unsigned long long asp_service_search_id;
+guint64 asp_service_search_id;
 
-int asp_service_init()
+gint32 asp_service_init()
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
        asp_service_search_id = 0;
 
        __ASP_LOG_FUNC_EXIT__;
        return result;
 }
 
-int asp_service_deinit()
+gint32 asp_service_deinit()
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
 
        __ASP_LOG_FUNC_EXIT__;
        return result;
 }
 
-int asp_service_advertise(asp_service_advertise_s *service, int replace)
+gint32 asp_service_advertise(asp_service_advertise_s *service, gint32 replace)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int discovery_tech = service->discovery_tech;
-       int result = 0;
+       gint32 discovery_tech = service->discovery_tech;
+       gint32 result = 0;
 
        ASP_LOGD("Discovery tech %x", discovery_tech);
        result = asp_tech_advertise(discovery_tech, service, replace);
@@ -98,11 +98,11 @@ int asp_service_advertise(asp_service_advertise_s *service, int replace)
        return result;
 }
 
-int asp_service_cancel_advertise(asp_service_advertise_s *service)
+gint32 asp_service_cancel_advertise(asp_service_advertise_s *service)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int discovery_tech = service->discovery_tech;
-       int result = 0;
+       gint32 discovery_tech = service->discovery_tech;
+       gint32 result = 0;
 
        ASP_LOGD("Discovery tech %x", discovery_tech);
        result = asp_tech_cancel_advertise(discovery_tech, service);
@@ -116,11 +116,11 @@ int asp_service_cancel_advertise(asp_service_advertise_s *service)
        return result;
 }
 
-int asp_service_seek(asp_service_seek_s *service, unsigned long long *search_id)
+gint32 asp_service_seek(asp_service_seek_s *service, guint64 *search_id)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int discovery_tech = service->discovery_tech;
-       int result = 0;
+       gint32 discovery_tech = service->discovery_tech;
+       gint32 result = 0;
 
        ASP_LOGD("Discovery tech %x", discovery_tech);
        result = asp_tech_seek(discovery_tech, service);
@@ -136,11 +136,11 @@ int asp_service_seek(asp_service_seek_s *service, unsigned long long *search_id)
        return result;
 }
 
-int asp_service_cancel_seek(asp_service_seek_s *service)
+gint32 asp_service_cancel_seek(asp_service_seek_s *service)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int discovery_tech = service->discovery_tech;
-       int result = 0;
+       gint32 discovery_tech = service->discovery_tech;
+       gint32 result = 0;
 
        ASP_LOGD("Discovery tech %x", discovery_tech);
        result = asp_tech_cancel_seek(discovery_tech, service);
@@ -154,37 +154,34 @@ int asp_service_cancel_seek(asp_service_seek_s *service)
        return result;
 }
 
-int asp_service_notify_advertise_status(unsigned int adv_id,
-                                                                               asp_service_advertise_status_e status,
-                                                                               asp_service_advertise_reason_e reason)
+gint32 asp_service_notify_advertise_status(guint32 adv_id,
+               asp_service_advertise_status_e status,
+               asp_service_advertise_reason_e reason)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
 
-       asp_manager_gdbus_notify_advertise_status(adv_id, (unsigned char)status, (int)reason);
+       asp_manager_gdbus_notify_advertise_status(adv_id, (guint8)status, (gint32)reason);
 
        __ASP_LOG_FUNC_EXIT__;
        return result;
 }
 
-int asp_service_notify_search_result(unsigned int search_id,
-                                                                       const gchar *service_mac,
-                                                                       const gchar *service_device_name,
-                                                                       unsigned int adv_id,
-                                                                       const gchar *instance_name,
-                                                                       GHashTable *service_info_map,
-                                                                       asp_service_status_e service_status)
+gint32 asp_service_notify_search_result(guint32 search_id,
+               const gchar *service_mac, const gchar *service_device_name,
+               guint32 adv_id, const gchar *instance_name,
+               GHashTable *service_info_map, asp_service_status_e service_status)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
 
        asp_manager_gdbus_notify_search_result(search_id,
-                                                                                       service_mac,
-                                                                                       service_device_name,
-                                                                                       adv_id,
-                                                                                       instance_name,
-                                                                                       service_info_map,
-                                                                                       (unsigned char)service_status);
+                       service_mac,
+                       service_device_name,
+                       adv_id,
+                       instance_name,
+                       service_info_map,
+                       (guint8)service_status);
 
        __ASP_LOG_FUNC_EXIT__;
        return result;
diff --git a/src/session/asp-coordination-protocol.c b/src/session/asp-coordination-protocol.c
new file mode 100644 (file)
index 0000000..2b36bdf
--- /dev/null
@@ -0,0 +1,534 @@
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************
+ * Standard headers
+ *****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <arpa/inet.h>
+
+/*****************************************************************************
+ * System headers
+ *****************************************************************************/
+
+#include <glib.h>
+#include <gio/gio.h>
+/*#include <dlog.h> */
+
+/*****************************************************************************
+ * ASP coordination protocol header
+ *****************************************************************************/
+#include "asp-coordination-protocol.h"
+#include "asp-session-peer.h"
+#include "asp-manager-util.h"
+
+/*****************************************************************************
+ * Macros and Typedefs
+ *****************************************************************************/
+#define RW_BUF_SIZE 1600
+#define LENGTH_MAX 144
+#define ASP_COORDINATION_PROTOCOL_PORT 7235
+
+/* TODO : define session data structure */
+
+/*****************************************************************************
+ * Global Variables
+ *****************************************************************************/
+GSocket *coordination_protocol_socket = NULL;
+GSource *source = NULL;
+
+/* TODO : define local memory for session data structure */
+
+/*****************************************************************************
+ * Local Functions Definition
+ *****************************************************************************/
+
+static gboolean asp_coordination_protocol_read_cb(GIOChannel *src,
+               GIOCondition condition, gpointer data);
+static void asp_coordination_protocol_ack_handler(GSocketAddress *sock_addr,
+               gpointer input_data);
+static void asp_coordination_protocol_nack_handler(GSocketAddress *sock_addr,
+               gpointer input_data);
+static void asp_coordination_protocol_version_handler(GSocketAddress *sock_addr,
+               gpointer input_data);
+static void asp_coordination_protocol_request_session_handler(
+       GSocketAddress *sock_addr, gpointer input_data);
+static void asp_coordination_protocol_allowed_port_handler(
+       GSocketAddress *sock_addr, gpointer input_data);
+static void asp_coordination_protocol_remove_session_handler(
+       GSocketAddress *sock_addr, gpointer input_data);
+
+static gboolean asp_coordination_protocol_send_ack(GSocketAddress *sock_addr,
+               asp_ack_t *input_data);
+static gboolean asp_coordination_protocol_send_nack(GSocketAddress *sock_addr,
+               asp_nack_t *input_data);
+static gboolean asp_coordination_protocol_send_version(GSocketAddress
+               *sock_addr, asp_version_t *input_data);
+static gboolean asp_coordination_protocol_send_added_session(
+       GSocketAddress *sock_addr, asp_added_session_t *input_data);
+static gboolean asp_coordination_protocol_send_deferred_session(
+       GSocketAddress *sock_addr, asp_deferred_session_t *input_data);
+static gboolean asp_coordination_protocol_send_rejected_session(
+       GSocketAddress *sock_addr, asp_rejected_session_t *input_data);
+static gboolean asp_coordination_protocol_send_allowed_port(
+       GSocketAddress *sock_addr, asp_allowed_port_t *input_data);
+
+static gboolean asp_coordination_protocol_send_request_session(
+       GSocketAddress *dest_addr, asp_request_session_t *input_data);
+static gboolean asp_coordination_protocol_send_remove_session(
+       GSocketAddress *sock_addr, asp_remove_session_t *input_data);
+static void asp_coordination_protocol_added_session_handler(
+       GSocketAddress *sock_addr, gchar *input_data);
+static void asp_coordination_protocol_rejected_session_handler(
+       GSocketAddress *sock_addr, gchar *input_data);
+static void asp_coordination_protocol_deferred_session_handler(
+       GSocketAddress *sock_addr, gchar *input_data);
+
+/* By using below comments, can find the client ip & port
+       gchar *print_addr;
+       GInetSocketAddress *inet_addr = G_INET_SOCKET_ADDRESS(sock_addr);
+       print_addr = g_inet_address_to_string(g_inet_socket_address_get_address(inet_addr));
+    SM_INFO("client ip : %s, port : %d", print_addr, g_inet_socket_address_get_port(inet_addr));
+*/
+
+gboolean asp_coordination_protocol_init()
+{
+       INFO_MSG;
+
+       GInetAddress *inet_addr = NULL;
+       GSocketAddress *coordination_protocol_sockaddr = NULL;
+       GError *error = NULL;
+
+       /* Create a udp socket as ipv4 */
+       coordination_protocol_socket = g_socket_new(G_SOCKET_FAMILY_IPV4,
+                                      G_SOCKET_TYPE_DATAGRAM, G_SOCKET_PROTOCOL_UDP, &error);
+       g_assert_no_error(error);
+
+       inet_addr = g_inet_address_new_any(G_SOCKET_FAMILY_IPV4);
+
+#ifdef SEEKER
+       /* for test */
+       /*coordination_protocol_sockaddr = g_inet_socket_address_new(inet_addr, 7233); */
+#else
+       coordination_protocol_sockaddr = g_inet_socket_address_new(inet_addr,
+                                        ASP_COORDINATION_PROTOCOL_PORT);
+#endif
+       g_object_unref(inet_addr);
+
+       if (!g_socket_bind(coordination_protocol_socket, coordination_protocol_sockaddr,
+                          TRUE, &error)) {
+               g_object_unref(coordination_protocol_socket);
+               return FALSE;
+       }
+       g_assert_no_error(error);
+
+       g_object_unref(coordination_protocol_sockaddr);
+
+       /* Get a source from socket */
+       source = g_socket_create_source(coordination_protocol_socket, G_IO_IN, NULL);
+
+       /* Set a callback to be called when socket is readable */
+       g_source_set_callback(source, (GSourceFunc) asp_coordination_protocol_read_cb,
+                             coordination_protocol_socket, NULL);
+
+       g_source_attach(source, g_main_context_default());
+
+       g_source_unref(source);
+       return TRUE;
+}
+
+gboolean asp_coordination_protocol_destroy()
+{
+       INFO_MSG;
+
+       GError *error = NULL;
+       gboolean ret_val = FALSE;
+       ret_val = g_socket_close(coordination_protocol_socket, &error);
+       g_object_unref(coordination_protocol_socket);
+       g_source_destroy(source);
+
+       return ret_val;
+}
+
+gboolean asp_coordination_protocol_send_msg(GSocketAddress *input_sock_addr,
+               gpointer input_data)
+{
+       INFO_MSG;
+
+       gboolean ret_val = FALSE;
+
+       asp_coord_header_t *asp_cord_header = (asp_coord_header_t *) input_data;
+
+       ASP_LOGD("%s asp_coordination_protocol_send_msg() asp_cord_header->opcode: %x",
+                ROLE, asp_cord_header->opcode);
+
+       switch (asp_cord_header->opcode) {
+       case ASP_OPCODE_REQUEST_SESSION: {
+                       ret_val = asp_coordination_protocol_send_request_session(input_sock_addr,
+                                       (asp_request_session_t *) input_data);
+                       break;
+               }
+       case ASP_OPCODE_ADDED_SESSION: {
+                       ret_val = asp_coordination_protocol_send_added_session(input_sock_addr,
+                                       (asp_added_session_t *) input_data);
+                       break;
+               }
+       case ASP_OPCODE_REJECTED_SESSION: {
+                       ret_val = asp_coordination_protocol_send_rejected_session(input_sock_addr,
+                                       (asp_rejected_session_t *) input_data);
+                       break;
+               }
+       case ASP_OPCODE_REMOVE_SESSION: {
+                       ret_val = asp_coordination_protocol_send_remove_session(input_sock_addr,
+                                       (asp_remove_session_t *) input_data);
+                       break;
+               }
+       case ASP_OPCODE_ALLOWED_PORT: {
+                       ret_val = asp_coordination_protocol_send_allowed_port(input_sock_addr,
+                                       (asp_allowed_port_t *) input_data);
+                       break;
+               }
+       case ASP_OPCODE_VERSION: {
+                       ret_val = asp_coordination_protocol_send_version(input_sock_addr,
+                                       (asp_version_t *) input_data);
+                       break;
+               }
+       case ASP_OPCODE_DEFERRED_SESSION: {
+                       ret_val = asp_coordination_protocol_send_deferred_session(input_sock_addr,
+                                       (asp_deferred_session_t *) input_data);
+                       break;
+               }
+       case ASP_OPCODE_ACK: {
+                       ret_val = asp_coordination_protocol_send_ack(input_sock_addr,
+                                       (asp_ack_t *) input_data);
+                       break;
+               }
+       case ASP_OPCODE_NACK: {
+                       ret_val = asp_coordination_protocol_send_nack(input_sock_addr,
+                                       (asp_nack_t *) input_data);
+                       break;
+               }
+       default: {
+                       break;
+               }
+       }
+       return ret_val;
+}
+
+static gboolean asp_coordination_protocol_read_cb(GIOChannel *src,
+               GIOCondition condition, gpointer data)
+{
+       INFO_MSG;
+
+       GSocket *read_sock = (GSocket *) data;
+       GSocketAddress *read_sock_addr = NULL;
+       static gchar read_buf[RW_BUF_SIZE];
+       GError *error = NULL;
+
+       g_socket_receive_from(read_sock, &read_sock_addr, read_buf, RW_BUF_SIZE, NULL,
+                             &error);
+
+       ASP_LOGD("%s commnad %x, %x", ROLE, (guint8) read_buf[0], (guint8) read_buf[1]);
+
+       switch ((guint8) read_buf[0]) {
+       case ASP_OPCODE_REQUEST_SESSION: {
+                       asp_coordination_protocol_request_session_handler(read_sock_addr, read_buf);
+                       break;
+               }
+       case ASP_OPCODE_ADDED_SESSION: {
+                       asp_coordination_protocol_added_session_handler(read_sock_addr, read_buf);
+                       break;
+               }
+       case ASP_OPCODE_REJECTED_SESSION: {
+                       asp_coordination_protocol_rejected_session_handler(read_sock_addr, read_buf);
+                       break;
+               }
+       case ASP_OPCODE_REMOVE_SESSION: {
+                       asp_coordination_protocol_remove_session_handler(read_sock_addr, read_buf);
+                       break;
+               }
+       case ASP_OPCODE_ALLOWED_PORT: {
+                       asp_coordination_protocol_allowed_port_handler(read_sock_addr, read_buf);
+                       break;
+               }
+       case ASP_OPCODE_VERSION: {
+                       asp_coordination_protocol_version_handler(read_sock_addr, read_buf);
+                       break;
+               }
+       case ASP_OPCODE_DEFERRED_SESSION: {
+                       asp_coordination_protocol_deferred_session_handler(read_sock_addr, read_buf);
+                       break;
+               }
+       case ASP_OPCODE_ACK: {
+                       asp_coordination_protocol_ack_handler(read_sock_addr, read_buf);
+                       break;
+               }
+       case ASP_OPCODE_NACK: {
+                       asp_coordination_protocol_nack_handler(read_sock_addr, read_buf);
+                       break;
+               }
+       default: {                                      /* Reserved msg or Error */
+                       ASP_LOGD("%s error case:%x", ROLE, read_buf[0]);
+                       break;
+               }
+
+       }
+
+       g_object_unref(read_sock_addr);
+
+       return TRUE;
+}
+
+static void asp_coordination_protocol_ack_handler(GSocketAddress *sock_addr,
+               gpointer input_data)
+{
+       INFO_MSG;
+
+       asp_ack_t *ack_data = (asp_ack_t *) input_data;
+       asp_sess_peer_recv_msg(sock_addr, ack_data);
+}
+
+static void asp_coordination_protocol_nack_handler(GSocketAddress *sock_addr,
+               gpointer input_data)
+{
+       INFO_MSG;
+
+       asp_nack_t *nack_data = (asp_nack_t *) input_data;
+       asp_sess_peer_recv_msg(sock_addr, nack_data);
+}
+
+static void asp_coordination_protocol_version_handler(GSocketAddress *sock_addr,
+               gpointer input_data)
+{
+       INFO_MSG;
+
+       asp_version_t *ver = (asp_version_t *) input_data;
+       asp_sess_peer_recv_msg(sock_addr, ver);
+}
+
+static void asp_coordination_protocol_request_session_handler(
+       GSocketAddress *sock_addr, gpointer input_data)
+{
+       INFO_MSG;
+
+       asp_request_session_t *request_sess = (asp_request_session_t *) input_data;
+       request_sess->session_id = ntohl(request_sess->session_id);
+       request_sess->advertisement_id = ntohl(request_sess->advertisement_id);
+       asp_sess_peer_recv_msg(sock_addr, request_sess);
+}
+
+static void asp_coordination_protocol_allowed_port_handler(
+       GSocketAddress *sock_addr, gpointer input_data)
+{
+       INFO_MSG;
+
+       asp_allowed_port_t *allowed_port_data = (asp_allowed_port_t *) input_data;
+       allowed_port_data->session_id = ntohl(allowed_port_data->session_id);
+       asp_sess_peer_recv_msg(sock_addr, allowed_port_data);
+}
+
+static void asp_coordination_protocol_remove_session_handler(
+       GSocketAddress *sock_addr, gpointer input_data)
+{
+       INFO_MSG;
+
+       asp_remove_session_t *remove_sess = (asp_remove_session_t *) input_data;
+       remove_sess->session_id = ntohl(remove_sess->session_id);
+       asp_sess_peer_recv_msg(sock_addr, remove_sess);
+}
+
+static gboolean asp_coordination_protocol_send_ack(GSocketAddress *sock_addr,
+               asp_ack_t *input_data)
+{
+       INFO_MSG;
+
+       GError *error = NULL;
+       asp_ack_t *send_ack = input_data;
+
+       g_socket_send_to(coordination_protocol_socket, sock_addr, (gchar *)send_ack,
+                        sizeof(asp_ack_t), NULL, &error);
+
+       return TRUE;
+}
+
+static gboolean asp_coordination_protocol_send_nack(GSocketAddress *sock_addr,
+               asp_nack_t *input_data)
+{
+       INFO_MSG;
+
+       GError *error = NULL;
+       asp_nack_t *send_nack = input_data;
+
+       g_socket_send_to(coordination_protocol_socket, sock_addr, (gchar *)send_nack,
+                        sizeof(asp_nack_t), NULL, &error);
+
+       return TRUE;
+}
+
+static gboolean asp_coordination_protocol_send_version(GSocketAddress
+               *sock_addr, asp_version_t *input_data)
+{
+       INFO_MSG;
+
+       GError *error = NULL;
+       asp_version_t *send_version = input_data;
+
+       g_socket_send_to(coordination_protocol_socket, sock_addr, (gchar *)send_version,
+                        sizeof(asp_version_t), NULL, &error);
+
+       return TRUE;
+}
+
+static gboolean asp_coordination_protocol_send_added_session(
+       GSocketAddress *sock_addr, asp_added_session_t *input_data)
+{
+       INFO_MSG;
+
+       GError *error = NULL;
+       asp_added_session_t added_sess;
+       memcpy(&added_sess, input_data, sizeof(asp_added_session_t));
+       added_sess.session_id = htonl(added_sess.session_id);
+
+       g_socket_send_to(coordination_protocol_socket, sock_addr, (gchar *)&added_sess,
+                        sizeof(asp_added_session_t), NULL, &error);
+
+       return TRUE;
+}
+
+static gboolean asp_coordination_protocol_send_deferred_session(
+       GSocketAddress *sock_addr, asp_deferred_session_t *input_data)
+{
+       INFO_MSG;
+
+       GError *error = NULL;
+       asp_deferred_session_t deferred_sess;
+       memcpy(&deferred_sess, input_data, sizeof(asp_deferred_session_t));
+       deferred_sess.session_id = htonl(deferred_sess.session_id);
+
+       if (deferred_sess.deferred_session__response_length <= LENGTH_MAX)
+               g_socket_send_to(coordination_protocol_socket, sock_addr,
+                                (gchar *)&deferred_sess,
+                                sizeof(asp_deferred_session_t) + deferred_sess.deferred_session__response_length
+                                - DEFERRED_INFO_BUF_SIZE, NULL, &error);
+       else
+               return FALSE;
+
+       return TRUE;
+}
+
+static gboolean asp_coordination_protocol_send_rejected_session(
+       GSocketAddress *sock_addr, asp_rejected_session_t *input_data)
+{
+       INFO_MSG;
+
+       GError *error = NULL;
+       asp_rejected_session_t rejected_sess;
+       memcpy(&rejected_sess, input_data, sizeof(asp_rejected_session_t));
+       rejected_sess.session_id = htonl(rejected_sess.session_id);
+
+       g_socket_send_to(coordination_protocol_socket, sock_addr,
+                        (gchar *)&rejected_sess, sizeof(asp_rejected_session_t), NULL, &error);
+
+       return TRUE;
+}
+
+static gboolean asp_coordination_protocol_send_allowed_port(
+       GSocketAddress *sock_addr, asp_allowed_port_t *input_data)
+{
+       INFO_MSG;
+
+       GError *error = NULL;
+       asp_allowed_port_t allowed_port_data;
+       memcpy(&allowed_port_data, input_data, sizeof(asp_allowed_port_t));
+       allowed_port_data.session_id = htonl(allowed_port_data.session_id);
+
+       g_socket_send_to(coordination_protocol_socket, sock_addr,
+                        (gchar *)&allowed_port_data, sizeof(asp_allowed_port_t), NULL, &error);
+
+       return TRUE;
+}
+
+static gboolean asp_coordination_protocol_send_request_session(
+       GSocketAddress *dest_sock_addr, asp_request_session_t *input_data)
+{
+       INFO_MSG;
+
+       GError *error = NULL;
+
+       asp_request_session_t request_sess;
+       memcpy(&request_sess, input_data, sizeof(asp_request_session_t));
+       request_sess.session_id = htonl(request_sess.session_id);
+       request_sess.advertisement_id = htonl(request_sess.advertisement_id);
+
+       if (request_sess.session_information_length <= LENGTH_MAX)
+               g_socket_send_to(coordination_protocol_socket, dest_sock_addr,
+                                (gchar *)&request_sess, sizeof(asp_request_session_t) +
+                                request_sess.session_information_length - SESSION_INFO_BUF_SIZE, NULL, &error);
+       else
+               return FALSE;
+
+       return TRUE;
+}
+
+static gboolean asp_coordination_protocol_send_remove_session(
+       GSocketAddress *sock_addr, asp_remove_session_t *input_data)
+{
+       INFO_MSG;
+
+       GError *error = NULL;
+       asp_remove_session_t remove_sess;
+       memcpy(&remove_sess, input_data, sizeof(asp_remove_session_t));
+       remove_sess.session_id = htonl(remove_sess.session_id);
+
+       g_socket_send_to(coordination_protocol_socket, sock_addr, (gchar *)&remove_sess,
+                        sizeof(asp_remove_session_t), NULL, &error);
+
+       return TRUE;
+}
+
+static void asp_coordination_protocol_added_session_handler(
+       GSocketAddress *sock_addr, gchar *input_data)
+{
+       INFO_MSG;
+
+       asp_added_session_t *added_sess = (asp_added_session_t *) input_data;
+       added_sess->session_id = ntohl(added_sess->session_id);
+       asp_sess_peer_recv_msg(sock_addr, added_sess);
+}
+
+static void asp_coordination_protocol_rejected_session_handler(
+       GSocketAddress *sock_addr, gchar *input_data)
+{
+       INFO_MSG;
+
+       asp_rejected_session_t *rejected_sess = (asp_rejected_session_t *) input_data;
+       rejected_sess->session_id = ntohl(rejected_sess->session_id);
+       asp_sess_peer_recv_msg(sock_addr, rejected_sess);
+}
+
+static void asp_coordination_protocol_deferred_session_handler(
+       GSocketAddress *sock_addr, gchar *input_data)
+{
+       INFO_MSG;
+
+       asp_deferred_session_t *deferred_sess = (asp_deferred_session_t *) input_data;
+       deferred_sess->session_id = ntohl(deferred_sess->session_id);
+       asp_sess_peer_recv_msg(sock_addr, deferred_sess);
+}
diff --git a/src/session/asp-coordination-protocol.h b/src/session/asp-coordination-protocol.h
new file mode 100644 (file)
index 0000000..af1b53d
--- /dev/null
@@ -0,0 +1,154 @@
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __ASP_COORDINATION_PROTOCOL_H__
+#define __ASP_COORDINATION_PROTOCOL_H__
+
+#include <stdio.h>
+#include <string.h>
+#include <glib.h>
+#include <gio/gio.h>
+
+#define SESSION_MAC_BUF_SIZE 6
+#define SESSION_INFO_BUF_SIZE 144
+#define DEFERRED_INFO_BUF_SIZE 144
+
+#define ADV
+
+#ifdef SEEKER
+#define ROLE "[seeker    ]"
+#define INFO_MSG ASP_LOGD("%s %s : %s(), :%s  line:%d", ROLE, __TIME__, __FILE__, __func__, __LINE__)
+#else
+#define ROLE "[advertiser]"
+#define INFO_MSG ASP_LOGD("%s %s : %s(), :%s  line:%d", ROLE, __TIME__, __FILE__, __func__, __LINE__)
+#endif
+
+typedef struct asp_coord_header {
+       guint8 opcode;
+       guint8 seq_num;
+} __attribute__((packed)) asp_coord_header_t;
+
+typedef struct asp_request_header {
+       guint8 opcode;
+       guint8 seq_num;
+       guint8 session_mac[SESSION_MAC_BUF_SIZE];
+       guint32 session_id;
+} __attribute__((packed)) asp_request_header_t;
+
+typedef struct asp_request_session {
+       guint8 opcode;
+       guint8 seq_num;
+       guint8 session_mac[SESSION_MAC_BUF_SIZE];
+       guint32 session_id;
+       guint32 advertisement_id;
+       guint8 session_information_length;
+       guint8 session_information[SESSION_INFO_BUF_SIZE];
+} __attribute__((packed)) asp_request_session_t;
+
+typedef struct asp_added_session {
+       guint8 opcode;
+       guint8 seq_num;
+       guint8 session_mac[SESSION_MAC_BUF_SIZE];
+       guint32 session_id;
+} __attribute__((packed)) asp_added_session_t;
+
+typedef struct asp_rejected_session {
+       guint8 opcode;
+       guint8 seq_num;
+       guint8 session_mac[SESSION_MAC_BUF_SIZE];
+       guint32 session_id;
+} __attribute__((packed)) asp_rejected_session_t;
+
+typedef struct asp_remove_session {
+       guint8 opcode;
+       guint8 seq_num;
+       guint8 session_mac[SESSION_MAC_BUF_SIZE];
+       guint32 session_id;
+       guint8 reason;
+} __attribute__((packed)) asp_remove_session_t;
+
+typedef struct asp_allowed_port {
+       guint8 opcode;
+       guint8 seq_num;
+       guint8 session_mac[SESSION_MAC_BUF_SIZE];
+       guint32 session_id;
+       guint16 port;
+       guint8 proto;
+} __attribute__((packed)) asp_allowed_port_t;
+
+typedef struct asp_version {
+       guint8 opcode;
+       guint8 seq_num;
+       guint8 coordination_version;
+       guint8 vendor_information_length;
+       guint32 vendor_information;
+} __attribute__((packed)) asp_version_t;
+
+typedef struct asp_deferred_session {
+       guint8 opcode;
+       guint8 seq_num;
+       guint8 session_mac[SESSION_MAC_BUF_SIZE];
+       guint32 session_id;
+       guint8 deferred_session__response_length;
+       guint8 deferred_session__response[DEFERRED_INFO_BUF_SIZE];
+} __attribute__((packed)) asp_deferred_session_t;
+
+typedef struct asp_ack {
+       guint8 opcode;
+       guint8 seq_num;
+} __attribute__((packed)) asp_ack_t;
+
+typedef struct asp_nack {
+       guint8 opcode;
+       guint8 seq_num;
+       guint8 reason;
+} __attribute__((packed)) asp_nack_t;
+
+enum {
+       ASP_OPCODE_REQUEST_SESSION = 0x00,
+       ASP_OPCODE_ADDED_SESSION = 0x01,
+       ASP_OPCODE_REJECTED_SESSION = 0x02,
+
+       ASP_OPCODE_REMOVE_SESSION = 0x03,
+       ASP_OPCODE_ALLOWED_PORT = 0x04,
+       ASP_OPCODE_VERSION = 0x05,
+       ASP_OPCODE_DEFERRED_SESSION = 0x06,
+       ASP_OPCODE_ACK = 0xFE,
+       ASP_OPCODE_NACK = 0xFF
+};
+
+enum {
+       ASP_REMOVE_SESS_REASON_UNKOWN_REASON = 0x00,
+       ASP_REMOVE_SESS_REASON_REJECTED_BY_USER = 0x01,
+       ASP_REMOVE_SESS_REASON_ADVERTISED_SERVICE_NOT_AVAILABLE = 0x02,
+       ASP_REMOVE_SESS_REASON_SYSTEM_FAILURE = 0x03
+};
+
+enum {
+       ASP_NACK_REASON_INVALID_SESSION_MAC = 0x00,
+       ASP_NACK_REASON_INVALID_SESSION_ID = 0x01,
+       ASP_NACK_REASON_INVALID_OPCODE = 0x02,
+       ASP_NACK_REASON_INVALID_SEQUENCE_NUM = 0x03,
+       ASP_NACK_REASON_NO_SESSION_EXIST = 0x04,
+       ASP_NACK_REASON_UNKNOWN_REASON = 0x05
+};
+
+gboolean asp_coordination_protocol_init();
+gboolean asp_coordination_protocol_destroy();
+gboolean asp_coordination_protocol_send_msg(GSocketAddress *input_sock_addr,
+               gpointer input_data);
+
+#endif                                                 /* __ASP_COORDINATION_PROTOCOL_H__ */
diff --git a/src/session/asp-p2p-conn.c b/src/session/asp-p2p-conn.c
new file mode 100644 (file)
index 0000000..41ec6e0
--- /dev/null
@@ -0,0 +1,253 @@
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************
+ * Standard headers
+ *****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+/*****************************************************************************
+ * System headers
+ *****************************************************************************/
+
+#include <gio/gio.h>
+
+#include<dlog.h>
+
+/*****************************************************************************
+ * Application Service Platform Daemon headers
+ *****************************************************************************/
+#include "asp-manager.h"
+#include "asp-p2p-conn.h"
+#include "asp-service.h"
+#include "asp-tech.h"
+
+/*****************************************************************************
+ * Macros and Typedefs
+ *****************************************************************************/
+
+/*****************************************************************************
+ * Global Variables
+ *****************************************************************************/
+
+static asp_p2p_conn_session_request_cb session_request_cb = NULL;
+static gpointer session_request_cb_user_data = NULL;
+static asp_p2p_conn_session_config_request_cb session_config_request_cb = NULL;
+static gpointer session_config_request_cb_user_data = NULL;
+static asp_p2p_conn_connect_status_cb connect_status_cb = NULL;
+static gpointer connect_status_cb_user_data = NULL;
+static asp_p2p_conn_ip_assigned_cb ip_assigned_cb = NULL;
+static gpointer ip_assigned_cb_user_data = NULL;
+
+/*****************************************************************************
+ * Local Functions Definition
+ *****************************************************************************/
+
+void asp_p2p_conn_initialize()
+{
+       __ASP_LOG_FUNC_ENTER__;
+
+       session_request_cb = NULL;
+       session_request_cb_user_data = NULL;
+       session_config_request_cb = NULL;
+       session_config_request_cb_user_data = NULL;
+       connect_status_cb = NULL;
+       connect_status_cb_user_data = NULL;
+
+       __ASP_LOG_FUNC_EXIT__;
+       return;
+}
+
+void asp_p2p_conn_deinitialize()
+{
+       __ASP_LOG_FUNC_ENTER__;
+
+       session_request_cb = NULL;
+       session_request_cb_user_data = NULL;
+       session_config_request_cb = NULL;
+       session_config_request_cb_user_data = NULL;
+       connect_status_cb = NULL;
+       connect_status_cb_user_data = NULL;
+
+       __ASP_LOG_FUNC_EXIT__;
+       return;
+}
+
+void asp_p2p_conn_connect_session(const guint8 *session_mac, guint32 session_id,
+                                 const guint8 *service_mac,
+                                 guint32 adv_id, const guint8 *session_info, size_t info_length,
+                                 guint8 network_role, guint8 network_config)
+{
+       __ASP_LOG_FUNC_ENTER__;
+       asp_tech_session_request_params_s params = {{0, } };
+       gint32 res = 0;
+
+       /* Make connect parameter for session request */
+       memcpy(params.session_mac, session_mac, MAC_LEN);
+       params.session_id = session_id;
+       memcpy(params.service_mac, service_mac, MAC_LEN);
+       params.advertisement_id = adv_id;
+       params.network_role = network_role;
+       params.network_config = network_config;
+       if (info_length != 0) {
+               params.session_information = g_try_malloc0(info_length + 1);
+               memcpy(params.session_information, session_info, info_length);
+       }
+
+       res = asp_tech_connect_session(ASP_TECH_P2P, &params);
+       if (res != 0 && connect_status_cb) {
+               ASP_LOGE("request connect is failed");
+               /* TODO: assign proper error code and connect status. */
+               connect_status_cb(0, session_mac, session_id,
+                                 ASP_SESSION_CONNECT_STATUS_NETWORK_ROLE_REJECTED,
+                                 connect_status_cb_user_data);
+       }
+       g_free(params.session_information);
+
+       __ASP_LOG_FUNC_EXIT__;
+       return;
+}
+
+void asp_p2p_conn_confirm_session(const guint8 *session_mac, guint32 session_id,
+                                 gboolean confirmed, guint32 network_config_pin)
+{
+       __ASP_LOG_FUNC_ENTER__;
+       gint32 res = 0;
+
+       res = asp_tech_confirm_session(ASP_TECH_P2P, session_mac,
+                                      session_id, confirmed, network_config_pin);
+       if (res < 0) {
+               ASP_LOGE("confirm session is failed");
+               return;
+       }
+
+       __ASP_LOG_FUNC_EXIT__;
+       return;
+}
+
+void asp_p2p_conn_disconnect_p2p(const guint8 *peer_mac)
+{
+       __ASP_LOG_FUNC_ENTER__;
+       guint8 mac[MAC_LEN] = {0, };
+       gint32 res = 0;
+
+       memcpy(mac, peer_mac, MAC_LEN);
+       res = asp_tech_destroy_connection(ASP_TECH_P2P, mac, MAC_LEN);
+       if (res < 0) {
+               ASP_LOGE("asp_tech_destroy_connection is failed");
+               return;
+       }
+
+       __ASP_LOG_FUNC_EXIT__;
+       return;
+}
+
+gboolean asp_p2p_conn_peer_is_connected(const guint8 *peer_mac)
+{
+       __ASP_LOG_FUNC_ENTER__;
+       gint32 is_peer_connected = 0;
+       gboolean is_connected = 0;
+       guint8 mac[MAC_LEN] = {0, };
+       gint32 res = 0;
+
+       memcpy(mac, peer_mac, MAC_LEN);
+       res = asp_tech_is_peer_connected(ASP_TECH_P2P, mac,
+                                        MAC_LEN, &is_peer_connected);
+       if (res < 0) {
+               ASP_LOGE("asp_tech_is_peer_connected is failed");
+               return FALSE;
+       }
+
+       is_connected = is_peer_connected;
+       __ASP_LOG_FUNC_EXIT__;
+       return is_connected;
+}
+
+void asp_p2p_conn_set_session_request_cb(asp_p2p_conn_session_request_cb cb,
+               gpointer user_data)
+{
+       __ASP_LOG_FUNC_ENTER__;
+
+       session_request_cb = cb;
+       session_request_cb_user_data = user_data;
+
+       asp_tech_set_session_request_cb(ASP_TECH_P2P, cb, user_data);
+
+       __ASP_LOG_FUNC_EXIT__;
+       return;
+}
+
+void asp_p2p_conn_set_session_config_request_cb(
+       asp_p2p_conn_session_config_request_cb cb, gpointer user_data)
+{
+       __ASP_LOG_FUNC_ENTER__;
+
+       session_config_request_cb = cb;
+       session_config_request_cb_user_data = user_data;
+
+       asp_tech_set_session_config_request_cb(ASP_TECH_P2P, cb, user_data);
+
+       __ASP_LOG_FUNC_EXIT__;
+       return;
+}
+
+void asp_p2p_conn_set_connect_status_cb(asp_p2p_conn_connect_status_cb cb,
+                                       gpointer user_data)
+{
+       __ASP_LOG_FUNC_ENTER__;
+
+       connect_status_cb = cb;
+       connect_status_cb_user_data = user_data;
+
+       asp_tech_set_connect_status_cb(ASP_TECH_P2P, cb, user_data);
+
+       __ASP_LOG_FUNC_EXIT__;
+       return;
+}
+
+void asp_p2p_conn_set_ip_assigned_cb(asp_p2p_conn_ip_assigned_cb cb,
+                                    gpointer user_data)
+{
+       __ASP_LOG_FUNC_ENTER__;
+
+       ip_assigned_cb = cb;
+       ip_assigned_cb_user_data = user_data;
+
+       asp_tech_set_ip_assigned_cb(ASP_TECH_P2P, cb, user_data);
+
+       __ASP_LOG_FUNC_EXIT__;
+       return;
+}
+
+void asp_p2p_conn_get_p2p_mac(gchar *my_p2p_mac)
+{
+       __ASP_LOG_FUNC_ENTER__;
+
+       asp_s *asp = asp_get_manager();
+       if (asp == NULL) {
+               ASP_LOGE("memory allocation for asp-manager is failed");
+               return;
+       }
+
+       memcpy(my_p2p_mac, asp->p2p_local_address, MAC_LEN);
+
+       __ASP_LOG_FUNC_EXIT__;
+       return;
+}
diff --git a/src/session/asp-p2p-conn.h b/src/session/asp-p2p-conn.h
new file mode 100644 (file)
index 0000000..155811f
--- /dev/null
@@ -0,0 +1,38 @@
+#ifndef _ASP_P2P_CONN_H_
+#include "asp-session.h"
+typedef void (*asp_p2p_conn_session_request_cb)(gint32 error_code,
+               const guint8 *session_mac, guint32 session_id, guint32 adv_id,
+               const gchar *device_name, size_t name_length, const guint8 *session_info,
+               size_t info_length, gboolean get_pin, guint32 pin, gpointer user_data);
+typedef void (*asp_p2p_conn_session_config_request_cb)(gint32 error_code,
+               const guint8 *session_mac, guint32 session_id, gboolean get_pin, guint32 pin,
+               gpointer user_data);
+typedef void (*asp_p2p_conn_connect_status_cb)(gint32 error_code,
+               const guint8 *session_mac, guint32 session_id,
+               asp_session_connect_status_e status, gpointer user_data);
+typedef void (*asp_p2p_conn_ip_assigned_cb)(gint32 error_code,
+               const guint8 *session_mac, guint32 session_id, gchar *service_mac,
+               gchar *peer_ip_addr, gint32 ip_length,  gpointer user_data);
+
+void asp_p2p_conn_initialize();
+void asp_p2p_conn_deinitialize();
+
+void asp_p2p_conn_connect_session(const guint8 *session_mac, guint32 session_id,
+                                 const guint8 *service_mac, guint32 adv_id, const guint8 *session_info,
+                                 size_t info_length, guint8 network_role, guint8 network_config);
+void asp_p2p_conn_confirm_session(const guint8 *session_mac, guint32 session_id,
+                                 gboolean confirmed, guint32 network_config_pin);
+void asp_p2p_conn_disconnect_p2p(const guint8 *peer_mac);
+gboolean asp_p2p_conn_peer_is_connected(const guint8 *peer_mac);
+
+void asp_p2p_conn_set_session_request_cb(asp_p2p_conn_session_request_cb cb,
+               gpointer user_data);
+void asp_p2p_conn_set_session_config_request_cb(
+       asp_p2p_conn_session_config_request_cb cb, gpointer user_data);
+void asp_p2p_conn_set_connect_status_cb(asp_p2p_conn_connect_status_cb cb,
+                                       gpointer user_data);
+void asp_p2p_conn_set_ip_assigned_cb(asp_p2p_conn_ip_assigned_cb cb,
+                                    gpointer user_data);
+
+void asp_p2p_conn_get_p2p_mac(gchar *my_p2p_mac);
+#endif
diff --git a/src/session/asp-session-peer-interface.h b/src/session/asp-session-peer-interface.h
new file mode 100644 (file)
index 0000000..f0b4112
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __ASP_SESSION_PEER_INTERFACE_H__
+#define __ASP_SESSION_PEER_INTERFACE_H__
+
+#include <glib.h>
+#include <gio/gio.h>
+
+void asp_session_recv_req(GSocketAddress *sock_addr, gpointer p_msg);
+void asp_session_recv_ack(GSocketAddress *sock_addr, guint8 *session_mac,
+                         guint32 session_id, gpointer p_msg);
+void asp_session_recv_nack(GSocketAddress *sock_addr, guint8 *session_mac,
+                          guint32 session_id, gpointer p_msg);
+void asp_session_peer_destroyed(guint8 *session_mac, guint32 session_id);
+
+#endif                                                 /* __ASP_SESSION_PEER_INTERFACE_H__ */
diff --git a/src/session/asp-session-peer.c b/src/session/asp-session-peer.c
new file mode 100644 (file)
index 0000000..6f8a029
--- /dev/null
@@ -0,0 +1,1465 @@
+#include "gfsm.h"
+#include "asp-session-peer.h"
+#include "asp-session-peer-interface.h"
+#include "asp-coordination-protocol.h"
+#include "asp-manager-util.h"
+
+#define ASP_SESS_PEER_FSM_TRACE_ENTER()
+#define ASP_SESS_PEER_FSM_TRACE_LEAVE()
+
+typedef struct asp_sess_peer {
+       gfsm_context_t context;
+       GSocketAddress *p_sock_addr;
+       guint8 seq_num;
+       guint8 retry;
+       guint timer_id;
+       gpointer p_sending_msg_data;
+       GTree *p_sess_tree;
+} asp_sess_peer_t;
+
+typedef struct asp_sess_peer_key {
+       guint8 ip_addr[16];
+       guint8 ip_addr_len;
+       guint16 port;
+} asp_sess_peer_key_t;
+
+typedef struct asp_sess_peer_sess_key {
+       guint32 sess_id;
+       guint8 sess_mac[6];
+} asp_sess_peer_sess_key_t;
+
+enum asp_sess_peer_state_t {
+       ASP_S_PEER_STATE_INIT,
+       ASP_S_PEER_STATE_CREATED,
+       ASP_S_PEER_STATE_VERSION_SENT,
+       ASP_S_PEER_STATE_WAIT_VERSION,
+       ASP_S_PEER_STATE_WAIT_ACK,
+       ASP_S_PEER_STATE_OPENED,
+       ASP_S_PEER_STATE_IDLE,
+       /*    ASP_S_PEER_STATE_REQ_SENT, */
+       ASP_S_PEER_STATE_CLOSED,
+       ASP_S_PEER_STATE_MAX,
+};
+
+enum asp_sess_peer_event_t {
+       ASP_S_PEER_EVENT_START,
+       ASP_S_PEER_EVENT_ADD_SESSION,
+       ASP_S_PEER_EVENT_DEL_SESSION,
+       ASP_S_PEER_EVENT_SEND_REQ,
+       ASP_S_PEER_EVENT_SEND_ACK,
+       ASP_S_PEER_EVENT_SEND_NACK,
+       ASP_S_PEER_EVENT_RECV_VERSION,
+       ASP_S_PEER_EVENT_RECV_REQ,
+       ASP_S_PEER_EVENT_RECV_ACK,
+       ASP_S_PEER_EVENT_RECV_NACK,
+       ASP_S_PEER_EVENT_TIMEOUT,
+       ASP_S_PEER_EVENT_CLOSE,
+       ASP_S_PEER_EVENT_MAX,
+};
+
+static asp_sess_peer_t *_asp_sess_peer_create_peer(GSocketAddress *p_sock_addr);
+static void _asp_sess_peer_destroy_peer(gpointer p_peer);
+static asp_sess_peer_t *_asp_sess_peer_tree_find_peer(GSocketAddress
+               *p_sock_addr);
+static gboolean _asp_sess_peer_tree_insert_peer(GSocketAddress *p_sock_addr,
+               asp_sess_peer_t *p_peer);
+/*static gboolean _asp_sess_peer_tree_remove_peer(GSocketAddress* p_sock_addr); */
+static gint _asp_sess_peer_tree_compare_cb(gconstpointer a, gconstpointer b,
+               gpointer p_user_data);
+static void _asp_sess_peer_tree_key_destructor_cb(gpointer a);
+static void _asp_sess_peer_tree_value_destructor_cb(gpointer a);
+static gpointer asp_sess_peer_dup_msg_data(gpointer p_msg);
+static void _asp_sess_peer_set_sending_msg_data(asp_sess_peer_t *p_peer,
+               gpointer p_msg);
+static asp_sess_peer_sess_key_t *_asp_sess_peer_sess_tree_create_key(
+       guint8 session_mac[], guint32 session_id);
+static gint _asp_sess_peer_sess_tree_compare_cb(gconstpointer a,
+               gconstpointer b, gpointer user_data);
+static void _asp_sess_peer_sess_tree_key_destructor_cb(gpointer p_data);
+static void _asp_sess_peer_sess_tree_value_destructor_cb(gpointer p_value);
+static void _asp_sess_peer_stop_timer(asp_sess_peer_t *p_peer);
+static void _asp_sess_peer_start_timer(asp_sess_peer_t *p_peer, guint sec);
+
+static gboolean _asp_sess_peer_send_req(GSocketAddress *p_sock_addr,
+                                       gpointer p_msg);
+static gboolean _asp_sess_peer_send_ack(GSocketAddress *p_sock_addr,
+                                       gpointer p_msg);
+static gboolean _asp_sess_peer_send_nack(GSocketAddress *p_sock_addr,
+               gpointer p_msg);
+
+static gboolean _asp_sess_peer_recv_req(GSocketAddress *p_sock_addr,
+                                       gpointer p_msg);
+static gboolean _asp_sess_peer_recv_ack(GSocketAddress *p_sock_addr,
+                                       gpointer p_msg);
+static gboolean _asp_sess_peer_recv_nack(GSocketAddress *p_sock_addr,
+               gpointer p_msg);
+
+static gboolean _asp_sess_peer_recv_version(GSocketAddress *p_sock_addr,
+               gpointer p_msg);
+static void _asp_sess_peer_send_nack_to_protocol(GSocketAddress *p_sock_addr,
+               guint8 seq_num, guint8 reason);
+
+void _asp_sess_peer_state_init_entry_action(gpointer p_context_data);
+static void _asp_sess_peer_state_init_exit_action(gpointer p_context_data);
+static gfsm_state_id_t _asp_sess_peer_state_init_reaction_start(
+       gpointer p_context_data, gpointer p_event_data);
+
+static void _asp_sess_peer_state_created_entry_action(gpointer p_context_data);
+static void _asp_sess_peer_state_created_exit_action(gpointer p_context_data);
+static gfsm_state_id_t _asp_sess_peer_state_created_reaction_add_session(
+       gpointer p_context_data, gpointer p_event_data);
+static gfsm_state_id_t _asp_sess_peer_state_created_reaction_del_session(
+       gpointer p_context_data, gpointer p_event_data);
+static gfsm_state_id_t _asp_sess_peer_state_created_reaction_close(
+       gpointer p_context_data, gpointer p_event_data);
+static gfsm_state_id_t _asp_sess_peer_state_created_reaction_send_ack(
+       gpointer p_context_data, gpointer p_event_data);
+static gfsm_state_id_t _asp_sess_peer_state_created_reaction_send_nack(
+       gpointer p_context_data, gpointer p_event_data);
+
+static void _asp_sess_peer_state_version_sent_entry_action(
+       gpointer p_context_data);
+static void _asp_sess_peer_state_version_sent_exit_action(
+       gpointer p_context_data);
+/*static gfsm_state_id_t asp_sess_peer_state_version_sent_reaction_send_req (void* p_context_data, void* p_event_data); */
+/*static gfsm_state_id_t asp_sess_peer_state_version_sent_reaction_recv_version (void* p_context_data, void* p_event_data); */
+/*static gfsm_state_id_t asp_sess_peer_state_version_sent_reaction_recv_req (void* p_context_data, void* p_event_data); */
+static gfsm_state_id_t _asp_sess_peer_state_version_sent_reaction_recv_ack(
+       gpointer p_context_data, gpointer p_event_data);
+static gfsm_state_id_t _asp_sess_peer_state_version_sent_reaction_recv_nack(
+       gpointer p_context_data, gpointer p_event_data);
+static gfsm_state_id_t _asp_sess_peer_state_version_sent_reaction_timeout(
+       gpointer p_context_data, gpointer p_event_data);
+
+static void _asp_sess_peer_state_wait_version_entry_action(
+       gpointer p_context_data);
+static void _asp_sess_peer_state_wait_version_exit_action(
+       gpointer p_context_data);
+/*static gfsm_state_id_t asp_sess_peer_state_wait_version_reaction_send_req (void* p_context_data, void* p_event_data); */
+static gfsm_state_id_t _asp_sess_peer_state_wait_version_reaction_recv_version(
+       gpointer p_context_data, gpointer p_event_data);
+static gfsm_state_id_t _asp_sess_peer_state_wait_version_reaction_recv_req(
+       gpointer p_context_data, gpointer p_event_data);
+/*static gfsm_state_id_t asp_sess_peer_state_wait_version_reaction_recv_ack (void* p_context_data, void* p_event_data); */
+/*static gfsm_state_id_t asp_sess_peer_state_wait_version_reaction_recv_nack (void* p_context_data, void* p_event_data); */
+static gfsm_state_id_t _asp_sess_peer_state_wait_version_reaction_timeout(
+       gpointer p_context_data, gpointer p_event_data);
+
+static void _asp_sess_peer_state_opened_entry_action(gpointer p_context_data);
+static void _asp_sess_peer_state_opened_exit_action(gpointer p_context_data);
+static gfsm_state_id_t _asp_sess_peer_state_opened_reaction_recv_version(
+       gpointer p_context_data, gpointer p_event_data);
+static gfsm_state_id_t _asp_sess_peer_state_opened_reaction_recv_req(
+       gpointer p_context_data, gpointer p_event_data);
+
+static void _asp_sess_peer_state_idle_entry_action(gpointer p_context_data);
+static void _asp_sess_peer_state_idle_exit_action(gpointer p_context_data);
+static gfsm_state_id_t _asp_sess_peer_state_idle_reaction_send_req(
+       gpointer p_context_data, gpointer p_event_data);
+
+static void _asp_sess_peer_state_wait_ack_entry_action(gpointer p_context_data);
+static void _asp_sess_peer_state_wait_ack_exit_action(gpointer p_context_data);
+/*static gfsm_state_id_t asp_sess_peer_state_wait_ack_reaction_send_req (void* p_context_data, void* p_event_data); */
+static gfsm_state_id_t _asp_sess_peer_state_wait_ack_reaction_recv_ack(
+       gpointer p_context_data, gpointer p_event_data);
+static gfsm_state_id_t _asp_sess_peer_state_wait_ack_reaction_recv_nack(
+       gpointer p_context_data, gpointer p_event_data);
+static gfsm_state_id_t _asp_sess_peer_state_wait_ack_reaction_timeout(
+       gpointer p_context_data, gpointer p_event_data);
+
+static void _asp_sess_peer_state_close_entry_action(gpointer p_context_data);
+static void _asp_sess_peer_state_close_exit_action(gpointer p_context_data);
+
+static void asp_sess_peer_fsm_init();
+
+static gfsm_t asm_sess_peer_fsm;
+static gfsm_state_t asp_sess_peer_state_init;
+static gfsm_state_t asp_sess_peer_state_created;
+static gfsm_state_t asp_sess_peer_state_version_sent;
+static gfsm_state_t asp_sess_peer_state_wait_version;
+static gfsm_state_t asp_sess_peer_state_opened;
+static gfsm_state_t asp_sess_peer_state_idle;
+/*static gfsm_state_t asp_sess_peer_state_req_sent; */
+static gfsm_state_t asp_sess_peer_state_wait_ack;
+static gfsm_state_t asp_sess_peer_state_closed;
+static GTree *gp_peer_tree = 0;
+
+void asp_sess_peer_init()
+{
+       INFO_MSG;
+
+       gp_peer_tree = g_tree_new_full(_asp_sess_peer_tree_compare_cb, NULL,
+                                      _asp_sess_peer_tree_key_destructor_cb, _asp_sess_peer_tree_value_destructor_cb);
+
+       asp_sess_peer_fsm_init();
+
+       asp_coordination_protocol_init();
+}
+
+void asp_sess_peer_destroy()
+{
+       INFO_MSG;
+
+       gfsm_terminate_fsm(&asm_sess_peer_fsm);
+       g_tree_destroy(gp_peer_tree);
+       gp_peer_tree = 0;
+}
+
+gboolean asp_sess_peer_send_msg(GSocketAddress *p_sock_addr, gpointer p_msg)
+{
+       INFO_MSG;
+
+       asp_coord_header_t *p_header = (asp_coord_header_t *) p_msg;
+
+       switch (p_header->opcode) {
+       case ASP_OPCODE_REQUEST_SESSION:
+               ASP_LOGD("%s asp_sess_peer_send_msg, ASP_OPCODE_REQUEST_SESSION session_id:%d",
+                        ROLE, ((asp_request_session_t *) p_msg)->session_id);
+               return _asp_sess_peer_send_req(p_sock_addr, p_msg);
+       case ASP_OPCODE_ADDED_SESSION:
+       /*FALL THROUGH */
+       case ASP_OPCODE_REJECTED_SESSION:
+       /*FALL THROUGH */
+       case ASP_OPCODE_REMOVE_SESSION:
+       /*FALL THROUGH */
+       case ASP_OPCODE_ALLOWED_PORT:
+       /*FALL THROUGH */
+       case ASP_OPCODE_DEFERRED_SESSION:
+               return _asp_sess_peer_send_req(p_sock_addr, p_msg);
+       case ASP_OPCODE_VERSION:
+               return FALSE;
+       case ASP_OPCODE_ACK:
+               return _asp_sess_peer_send_ack(p_sock_addr, p_msg);
+       case ASP_OPCODE_NACK:
+               return _asp_sess_peer_send_nack(p_sock_addr, p_msg);
+       default:
+               return FALSE;
+       }
+
+       return TRUE;
+}
+
+gboolean asp_sess_peer_recv_msg(GSocketAddress *p_sock_addr, gpointer p_msg)
+{
+       INFO_MSG;
+
+       asp_coord_header_t *p_header = (asp_coord_header_t *) p_msg;
+
+       switch (p_header->opcode) {
+       case ASP_OPCODE_REQUEST_SESSION:
+       /*FALL THROUGH */
+       case ASP_OPCODE_ADDED_SESSION:
+       /*FALL THROUGH */
+       case ASP_OPCODE_REJECTED_SESSION:
+       /*FALL THROUGH */
+       case ASP_OPCODE_REMOVE_SESSION:
+       /*FALL THROUGH */
+       case ASP_OPCODE_ALLOWED_PORT:
+       /*FALL THROUGH */
+       case ASP_OPCODE_DEFERRED_SESSION:
+               return _asp_sess_peer_recv_req(p_sock_addr, p_msg);
+       case ASP_OPCODE_VERSION:
+               return _asp_sess_peer_recv_version(p_sock_addr, p_msg);
+       case ASP_OPCODE_ACK:
+               return _asp_sess_peer_recv_ack(p_sock_addr, p_msg);
+       case ASP_OPCODE_NACK:
+               return _asp_sess_peer_recv_nack(p_sock_addr, p_msg);
+       default:
+               _asp_sess_peer_send_nack_to_protocol(p_sock_addr, p_header->seq_num,
+                                                    ASP_NACK_REASON_INVALID_OPCODE);
+               return FALSE;
+       }
+
+       return TRUE;
+}
+
+gboolean _asp_sess_peer_send_req(GSocketAddress *p_sock_addr, gpointer p_msg)
+{
+       INFO_MSG;
+
+       asp_sess_peer_t *p_peer = _asp_sess_peer_tree_find_peer(p_sock_addr);
+
+       if (NULL == p_peer) {
+               p_peer = _asp_sess_peer_create_peer(p_sock_addr);
+               g_assert(p_peer);
+
+               gfsm_process_event(&p_peer->context, gfsm_create_event(ASP_S_PEER_EVENT_START,
+                                  NULL, NULL));
+       }
+
+       gfsm_process_event(&p_peer->context,
+                          gfsm_create_event(ASP_S_PEER_EVENT_SEND_REQ, asp_sess_peer_dup_msg_data(p_msg),
+                                            g_free));
+
+       return TRUE;
+}
+
+gboolean _asp_sess_peer_send_ack(GSocketAddress *p_sock_addr, gpointer p_msg)
+{
+       INFO_MSG;
+
+       asp_sess_peer_t *p_peer = _asp_sess_peer_tree_find_peer(p_sock_addr);
+
+       if (NULL == p_peer)
+               return FALSE;
+
+       gfsm_process_event(&p_peer->context,
+                          gfsm_create_event(ASP_S_PEER_EVENT_SEND_ACK, asp_sess_peer_dup_msg_data(p_msg),
+                                            g_free));
+
+       return TRUE;
+}
+
+gboolean _asp_sess_peer_send_nack(GSocketAddress *p_sock_addr, gpointer p_msg)
+{
+       INFO_MSG;
+
+       asp_sess_peer_t *p_peer = _asp_sess_peer_tree_find_peer(p_sock_addr);
+
+       if (NULL == p_peer)
+               return FALSE;
+
+       gfsm_process_event(&p_peer->context,
+                          gfsm_create_event(ASP_S_PEER_EVENT_SEND_NACK, asp_sess_peer_dup_msg_data(p_msg),
+                                            g_free));
+
+       return TRUE;
+}
+
+gboolean _asp_sess_peer_recv_version(GSocketAddress *p_sock_addr,
+                                    gpointer p_msg)
+{
+       INFO_MSG;
+
+       asp_sess_peer_t *p_peer = _asp_sess_peer_tree_find_peer(p_sock_addr);
+
+       if (NULL == p_peer) {
+               p_peer = _asp_sess_peer_create_peer(p_sock_addr);
+
+               g_assert(p_peer);
+
+               asp_ack_t ack;
+               ack.opcode = ASP_OPCODE_ACK;
+               ack.seq_num = ((asp_version_t *) p_msg)->seq_num;
+               asp_coordination_protocol_send_msg(p_sock_addr, &ack);
+
+               gfsm_process_event(&p_peer->context, gfsm_create_event(ASP_S_PEER_EVENT_START,
+                                  NULL, NULL));
+       } else {
+               asp_ack_t ack;
+               ack.opcode = ASP_OPCODE_ACK;
+               ack.seq_num = ((asp_version_t *) p_msg)->seq_num;
+               asp_coordination_protocol_send_msg(p_sock_addr, &ack);
+       }
+
+       gfsm_process_event(&p_peer->context,
+                          gfsm_create_event(ASP_S_PEER_EVENT_RECV_VERSION,
+                                            asp_sess_peer_dup_msg_data(p_msg), g_free));
+
+       return TRUE;
+}
+
+gboolean _asp_sess_peer_recv_req(GSocketAddress *p_sock_addr, gpointer p_msg)
+{
+       INFO_MSG;
+
+       asp_sess_peer_t *p_peer = _asp_sess_peer_tree_find_peer(p_sock_addr);
+       asp_coord_header_t *p_header = (asp_coord_header_t *) p_msg;
+
+       if (NULL == p_peer) {
+               _asp_sess_peer_send_nack_to_protocol(p_sock_addr, p_header->seq_num,
+                                                    ASP_NACK_REASON_NO_SESSION_EXIST);
+               return FALSE;
+       }
+
+       gfsm_process_event(&p_peer->context,
+                          gfsm_create_event(ASP_S_PEER_EVENT_RECV_REQ, asp_sess_peer_dup_msg_data(p_msg),
+                                            g_free));
+
+       return TRUE;
+}
+
+gboolean _asp_sess_peer_recv_ack(GSocketAddress *p_sock_addr, gpointer p_msg)
+{
+       INFO_MSG;
+
+       asp_sess_peer_t *p_peer = _asp_sess_peer_tree_find_peer(p_sock_addr);
+
+       if (NULL == p_peer)
+               return FALSE;
+
+       asp_request_header_t *p_header = (asp_request_header_t *)
+                                        p_peer->p_sending_msg_data;
+       ASP_LOGD("%s _asp_sess_peer_recv_ack, opcode:%d session_id:%d", ROLE,
+                p_header->opcode, p_header->session_id);
+
+       gfsm_process_event(&p_peer->context,
+                          gfsm_create_event(ASP_S_PEER_EVENT_RECV_ACK, asp_sess_peer_dup_msg_data(p_msg),
+                                            g_free));
+
+       return TRUE;
+}
+
+gboolean _asp_sess_peer_recv_nack(GSocketAddress *p_sock_addr, gpointer p_msg)
+{
+       INFO_MSG;
+
+       asp_sess_peer_t *p_peer = _asp_sess_peer_tree_find_peer(p_sock_addr);
+
+       if (NULL == p_peer)
+               return FALSE;
+
+       gfsm_process_event(&p_peer->context,
+                          gfsm_create_event(ASP_S_PEER_EVENT_RECV_NACK, asp_sess_peer_dup_msg_data(p_msg),
+                                            g_free));
+
+       return TRUE;
+}
+
+gboolean asp_sess_peer_add_session(GSocketAddress *p_sock_addr,
+                                  guint8 session_mac[], guint32 session_id)
+{
+       INFO_MSG;
+
+       asp_sess_peer_t *p_peer = _asp_sess_peer_tree_find_peer(p_sock_addr);
+
+       if (NULL == p_peer) {
+               p_peer = _asp_sess_peer_create_peer(p_sock_addr);
+               g_assert(p_peer);
+
+               gfsm_process_event(&p_peer->context, gfsm_create_event(ASP_S_PEER_EVENT_START,
+                                  NULL, NULL));
+       }
+
+       gfsm_process_event(&p_peer->context,
+                          gfsm_create_event(ASP_S_PEER_EVENT_ADD_SESSION,
+                                            _asp_sess_peer_sess_tree_create_key(session_mac, session_id), g_free));
+
+       return TRUE;
+}
+
+gboolean asp_sess_peer_del_session(GSocketAddress *p_sock_addr,
+                                  guint8 session_mac[], guint32 session_id)
+{
+       INFO_MSG;
+
+       asp_sess_peer_t *p_peer = _asp_sess_peer_tree_find_peer(p_sock_addr);
+
+       if (NULL == p_peer)
+               return TRUE;
+
+       /*asp_sess_peer_remove_session(p_peer,session_mac,sessiond_id); */
+       gfsm_process_event(&p_peer->context,
+                          gfsm_create_event(ASP_S_PEER_EVENT_DEL_SESSION,
+                                            _asp_sess_peer_sess_tree_create_key(session_mac, session_id), g_free));
+
+       return TRUE;
+}
+
+asp_sess_peer_key_t *_asp_sess_peer_tree_create_peer_key(
+       GSocketAddress *p_sock_addr)
+{
+       INFO_MSG;
+
+       GInetSocketAddress *p_inet_sock_addr = G_INET_SOCKET_ADDRESS(p_sock_addr);
+
+       g_assert(p_inet_sock_addr);
+
+       GInetAddress *p_inet_addr = g_inet_socket_address_get_address(p_inet_sock_addr);
+
+       g_assert(p_inet_addr);
+
+       asp_sess_peer_key_t *p_key = g_malloc(sizeof(asp_sess_peer_key_t));
+
+       g_assert(p_key);
+
+       p_key->ip_addr_len = g_inet_address_get_native_size(p_inet_addr);
+
+       memcpy(p_key->ip_addr, g_inet_address_to_bytes(p_inet_addr),
+              p_key->ip_addr_len);
+
+       p_key->port = g_inet_socket_address_get_port(p_inet_sock_addr);
+
+       /*g_object_unref(p_inet_addr); // */
+
+       return p_key;
+}
+
+asp_sess_peer_t *_asp_sess_peer_tree_find_peer(GSocketAddress *p_sock_addr)
+{
+       INFO_MSG;
+
+       asp_sess_peer_key_t *p_key = _asp_sess_peer_tree_create_peer_key(p_sock_addr);
+
+       g_assert(p_key);
+
+       return (asp_sess_peer_t *) g_tree_lookup(gp_peer_tree, p_key);
+}
+
+gboolean _asp_sess_peer_tree_insert_peer(GSocketAddress *p_sock_addr,
+               asp_sess_peer_t *p_peer)
+{
+       INFO_MSG;
+
+       asp_sess_peer_key_t *p_key = _asp_sess_peer_tree_create_peer_key(p_sock_addr);
+
+       g_assert(p_key);
+
+       g_tree_insert(gp_peer_tree, p_key, p_peer);
+
+       return TRUE;
+}
+
+/* not used
+gboolean _asp_sess_peer_tree_remove_peer(GSocketAddress* p_sock_addr)
+{
+    asp_sess_peer_key_t* p_key = _asp_sess_peer_tree_create_peer_key(p_sock_addr);
+
+    g_assert(p_key);
+
+    g_tree_remove(gp_peer_tree, p_key);
+
+    return TRUE;
+}
+*/
+
+gint _asp_sess_peer_tree_compare_cb(gconstpointer a, gconstpointer b,
+                                   gpointer p_user_data)
+{
+       INFO_MSG;
+
+       asp_sess_peer_key_t *p_l = (asp_sess_peer_key_t *) a;
+       asp_sess_peer_key_t *p_r = (asp_sess_peer_key_t *) b;
+
+       g_assert(p_l->ip_addr_len == 4 || p_l->ip_addr_len == 16);
+
+       if (p_l->port < p_r->port)
+               return -1;
+       else if (p_l->port > p_r->port)
+               return 1;
+       else if (p_l->ip_addr_len < p_r->ip_addr_len)
+               return -1;
+       else if (p_l->ip_addr_len > p_r->ip_addr_len)
+               return 1;
+       else
+               return memcmp(p_l->ip_addr, p_r->ip_addr, p_l->ip_addr_len);
+}
+
+void _asp_sess_peer_tree_key_destructor_cb(gpointer a)
+{
+       INFO_MSG;
+
+       g_free(a);
+}
+
+void _asp_sess_peer_tree_value_destructor_cb(gpointer a)
+{
+       INFO_MSG;
+
+       g_free(a);
+}
+
+asp_sess_peer_t *_asp_sess_peer_create_peer(GSocketAddress *p_sock_addr)
+{
+       INFO_MSG;
+
+       asp_sess_peer_t *p_peer = g_malloc(sizeof(asp_sess_peer_t));
+
+       g_assert(p_peer);
+
+       p_peer->p_sock_addr = g_object_ref(p_sock_addr);
+       p_peer->seq_num = 0;
+       p_peer->retry = 0;
+       p_peer->timer_id = 0;
+       p_peer->p_sending_msg_data = 0;
+       p_peer->p_sess_tree = g_tree_new_full(_asp_sess_peer_sess_tree_compare_cb,
+                                             NULL,     /* ??? */
+                                             _asp_sess_peer_sess_tree_key_destructor_cb,
+                                             _asp_sess_peer_sess_tree_value_destructor_cb);
+
+       _asp_sess_peer_tree_insert_peer(p_sock_addr, p_peer);
+
+       gfsm_init_context(&p_peer->context, &asm_sess_peer_fsm,
+                         _asp_sess_peer_destroy_peer, p_peer);
+
+       return p_peer;
+}
+
+void _asp_sess_peer_destroy_peer(gpointer p_context_data)
+{
+       INFO_MSG;
+
+       asp_sess_peer_t *p_peer = (asp_sess_peer_t *) p_context_data;
+
+       if (p_peer->p_sock_addr) {
+               g_object_unref(p_peer->p_sock_addr);
+               p_peer->p_sock_addr = 0;
+       }
+
+       if (p_peer->p_sending_msg_data) {
+               g_free(p_peer->p_sending_msg_data);
+               p_peer->p_sending_msg_data = 0;
+       }
+
+       if (p_peer->p_sess_tree) {
+               g_tree_destroy(p_peer->p_sess_tree);
+               p_peer->p_sess_tree = 0;
+       }
+
+       g_free(p_peer);
+}
+
+void _asp_sess_peer_set_sending_msg_data(asp_sess_peer_t *p_peer,
+               gpointer p_msg)
+{
+       INFO_MSG;
+
+       asp_coord_header_t *p_header = (asp_coord_header_t *) p_msg;
+
+       if (p_peer->p_sending_msg_data)
+               g_free(p_peer->p_sending_msg_data);
+
+       p_peer->retry = 0;
+
+       p_header->seq_num = p_peer->seq_num;
+
+       p_peer->p_sending_msg_data = p_msg;
+}
+
+void _asp_sess_peer_clear_sending_msg_data(asp_sess_peer_t *p_peer)
+{
+       INFO_MSG;
+
+       if (p_peer->p_sending_msg_data) {
+               g_free(p_peer->p_sending_msg_data);
+               p_peer->p_sending_msg_data = 0;
+       }
+}
+
+void _asp_sess_peer_forward_req_to_sessmgmt(asp_sess_peer_t *p_peer,
+               gpointer p_msg_data)
+{
+       INFO_MSG;
+
+       asp_session_recv_req(p_peer->p_sock_addr, p_msg_data);
+}
+
+void _asp_sess_peer_forward_ack_to_sessmgmt(asp_sess_peer_t *p_peer,
+               gpointer p_msg_data)
+{
+       INFO_MSG;
+
+       asp_request_header_t *p_header = (asp_request_header_t *)
+                                        p_peer->p_sending_msg_data;
+       asp_session_recv_ack(p_peer->p_sock_addr, p_header->session_mac,
+                            p_header->session_id, p_msg_data);
+}
+
+void _asp_sess_peer_forward_nack_to_sessmgmt(asp_sess_peer_t *p_peer,
+               gpointer p_msg_data)
+{
+       INFO_MSG;
+
+       asp_request_header_t *p_header = (asp_request_header_t *)
+                                        p_peer->p_sending_msg_data;
+       asp_session_recv_nack(p_peer->p_sock_addr, p_header->session_mac,
+                             p_header->session_id, p_msg_data);
+}
+
+gboolean _asp_sess_peer_notify_timeout_cb(gpointer p_user_data)
+{
+       INFO_MSG;
+
+       asp_sess_peer_t *p_peer = (asp_sess_peer_t *) p_user_data;
+
+       p_peer->timer_id = 0;
+
+       gfsm_process_event(&p_peer->context, gfsm_create_event(ASP_S_PEER_EVENT_TIMEOUT,
+                          NULL, NULL));
+
+       return FALSE;
+}
+
+void _asp_sess_peer_start_timer(asp_sess_peer_t *p_peer, guint sec)
+{
+       INFO_MSG;
+
+       if (p_peer->timer_id != 0)
+               _asp_sess_peer_stop_timer(p_peer);
+
+       p_peer->timer_id = g_timeout_add_seconds(sec, _asp_sess_peer_notify_timeout_cb,
+                          p_peer);
+}
+
+void _asp_sess_peer_stop_timer(asp_sess_peer_t *p_peer)
+{
+       INFO_MSG;
+
+       if (p_peer->timer_id != 0) {
+               g_source_remove(p_peer->timer_id);
+               p_peer->timer_id = 0;
+       }
+}
+
+void _asp_sess_peer_increase_seq_num(asp_sess_peer_t *p_peer)
+{
+       INFO_MSG;
+
+       ++p_peer->retry;
+}
+
+asp_sess_peer_sess_key_t *_asp_sess_peer_sess_tree_create_key(
+       guint8 session_mac[], guint32 session_id)
+{
+       INFO_MSG;
+
+       asp_sess_peer_sess_key_t *p_key = g_malloc(sizeof(asp_sess_peer_sess_key_t));
+
+       g_assert(p_key);
+
+       p_key->sess_id = session_id;
+       memcpy(p_key->sess_mac, session_mac, 6);
+
+       return p_key;
+}
+
+void _asp_sess_peer_insert_session(asp_sess_peer_t *p_peer,
+                                  asp_sess_peer_sess_key_t *p_key)
+{
+       INFO_MSG;
+
+       asp_sess_peer_sess_key_t *p_value = (asp_sess_peer_sess_key_t *) g_tree_lookup(
+                       p_peer->p_sess_tree, p_key);
+
+       if (p_value)
+               return;
+
+       g_tree_insert(p_peer->p_sess_tree, p_key, p_key);
+}
+
+void _asp_sess_peer_remove_session(asp_sess_peer_t *p_peer,
+                                  asp_sess_peer_sess_key_t *p_key)
+{
+       INFO_MSG;
+
+       g_tree_remove(p_peer->p_sess_tree, p_key);
+}
+
+gint _asp_sess_peer_sess_tree_compare_cb(gconstpointer a, gconstpointer b,
+               gpointer user_data)
+{
+       INFO_MSG;
+
+       asp_sess_peer_sess_key_t *p_l = (asp_sess_peer_sess_key_t *) a;
+       asp_sess_peer_sess_key_t *p_r = (asp_sess_peer_sess_key_t *) b;
+
+       if (p_l->sess_id < p_r->sess_id)
+               return -1;
+       else if (p_l->sess_id > p_r->sess_id)
+               return 1;
+       else                                            /*equal */
+               return memcmp(p_l->sess_mac, p_r->sess_mac, 6);
+}
+
+void _asp_sess_peer_sess_tree_key_destructor_cb(gpointer p_data)
+{
+       INFO_MSG;
+
+       asp_sess_peer_sess_key_t *p_key = (asp_sess_peer_sess_key_t *) p_data;
+       asp_session_peer_destroyed(p_key->sess_mac, p_key->sess_id);
+       g_free(p_key);
+}
+
+void _asp_sess_peer_sess_tree_value_destructor_cb(gpointer p_value)
+{
+       INFO_MSG;
+
+       /*do nothing. */
+       /*p_key and p_value is same pointer. */
+}
+
+gpointer _asp_sess_peer_dup_request_session(gpointer p_msg)
+{
+       INFO_MSG;
+
+       asp_request_session_t *p_dup_msg = g_malloc(sizeof(asp_request_session_t));
+       memcpy(p_dup_msg, p_msg, sizeof(asp_request_session_t));
+
+       ASP_LOGD("%s _asp_sess_peer_dup_request_session, session_id:%d", ROLE,
+                p_dup_msg->session_id);
+       return p_dup_msg;
+}
+
+gpointer _asp_sess_peer_dup_msg_added_session(gpointer p_msg)
+{
+       INFO_MSG;
+
+       asp_added_session_t *p_dup_msg = g_malloc(sizeof(asp_added_session_t));
+       memcpy(p_dup_msg, p_msg, sizeof(asp_added_session_t));
+
+       ASP_LOGD("%s _asp_sess_peer_dup_msg_added_session, session_id:%d", ROLE,
+                p_dup_msg->session_id);
+       return p_dup_msg;
+}
+
+gpointer _asp_sess_peer_dup_msg_rejected_session(gpointer p_msg)
+{
+       INFO_MSG;
+
+       asp_rejected_session_t *p_dup_msg = g_malloc(sizeof(asp_rejected_session_t));
+       memcpy(p_dup_msg, p_msg, sizeof(asp_rejected_session_t));
+
+       ASP_LOGD("%s _asp_sess_peer_dup_msg_rejected_session, session_id:%d", ROLE,
+                p_dup_msg->session_id);
+       return p_dup_msg;
+}
+
+gpointer _asp_sess_peer_dup_msg_remove_session(gpointer p_msg)
+{
+       INFO_MSG;
+
+       asp_remove_session_t *p_dup_msg = g_malloc(sizeof(asp_remove_session_t));
+       memcpy(p_dup_msg, p_msg, sizeof(asp_remove_session_t));
+
+       ASP_LOGD("%s _asp_sess_peer_dup_msg_remove_session, session_id:%d", ROLE,
+                p_dup_msg->session_id);
+       return p_dup_msg;
+}
+
+gpointer _asp_sess_peer_dup_msg_allowed_port(gpointer p_msg)
+{
+       INFO_MSG;
+
+       asp_allowed_port_t *p_dup_msg = g_malloc(sizeof(asp_allowed_port_t));
+       memcpy(p_dup_msg, p_msg, sizeof(asp_allowed_port_t));
+
+       ASP_LOGD("%s, _asp_sess_peer_dup_msg_allowed_port, session_id:%d", ROLE,
+                p_dup_msg->session_id);
+       return p_dup_msg;
+}
+
+gpointer _asp_sess_peer_dup_msg_version(gpointer p_msg)
+{
+       INFO_MSG;
+
+       asp_version_t *p_dup_msg = g_malloc(sizeof(asp_version_t));
+       memcpy(p_dup_msg, p_msg, sizeof(asp_version_t));
+
+       return p_dup_msg;
+}
+
+gpointer _asp_sess_peer_dup_msg_deferred_session(gpointer p_msg)
+{
+       INFO_MSG;
+
+       asp_deferred_session_t *p_dup_msg = g_malloc(sizeof(asp_deferred_session_t));
+       memcpy(p_dup_msg, p_msg, sizeof(asp_deferred_session_t));
+
+       ASP_LOGD("_asp_sess_peer_dup_msg_deferred_session, session_id:%d",
+                p_dup_msg->session_id);
+       return p_dup_msg;
+}
+
+gpointer _asp_sess_peer_dup_msg_ack(gpointer p_msg)
+{
+       INFO_MSG;
+
+       asp_ack_t *p_dup_msg = g_malloc(sizeof(asp_ack_t));
+       memcpy(p_dup_msg, p_msg, sizeof(asp_ack_t));
+       return p_dup_msg;
+}
+
+gpointer _asp_sess_peer_dup_msg_nack(gpointer p_msg)
+{
+       INFO_MSG;
+
+       asp_nack_t *p_dup_msg = g_malloc(sizeof(asp_nack_t));
+       memcpy(p_dup_msg, p_msg, sizeof(asp_nack_t));
+       return p_dup_msg;
+}
+
+gpointer asp_sess_peer_dup_msg_data(gpointer p_msg)
+{
+       INFO_MSG;
+
+       asp_coord_header_t *p_header = (asp_coord_header_t *) p_msg;
+       gpointer ret = NULL;
+
+       switch (p_header->opcode) {
+       case ASP_OPCODE_REQUEST_SESSION:
+               ret = _asp_sess_peer_dup_request_session(p_msg);
+               break;
+       case ASP_OPCODE_ADDED_SESSION:
+               ret = _asp_sess_peer_dup_msg_added_session(p_msg);
+               break;
+       case ASP_OPCODE_REJECTED_SESSION:
+               ret = _asp_sess_peer_dup_msg_rejected_session(p_msg);
+               break;
+       case ASP_OPCODE_REMOVE_SESSION:
+               ret = _asp_sess_peer_dup_msg_remove_session(p_msg);
+               break;
+       case ASP_OPCODE_ALLOWED_PORT:
+               ret = _asp_sess_peer_dup_msg_allowed_port(p_msg);
+               break;
+       case ASP_OPCODE_VERSION:
+               ret = _asp_sess_peer_dup_msg_version(p_msg);
+               break;
+       case ASP_OPCODE_DEFERRED_SESSION:
+               ret = _asp_sess_peer_dup_msg_deferred_session(p_msg);
+               break;
+       case ASP_OPCODE_ACK:
+               ret = _asp_sess_peer_dup_msg_ack(p_msg);
+               break;
+       case ASP_OPCODE_NACK:
+               ret = _asp_sess_peer_dup_msg_nack(p_msg);
+               break;
+       }
+
+       return (gpointer)ret;
+}
+
+void _asp_sess_peer_send_nack_to_protocol(GSocketAddress *p_sock_addr,
+               guint8 seq_num, guint8 reason)
+{
+       INFO_MSG;
+
+       asp_nack_t nack_msg;
+
+       nack_msg.opcode = ASP_OPCODE_NACK;
+       nack_msg.seq_num = seq_num;;
+       nack_msg.reason = reason;
+
+       asp_coordination_protocol_send_msg(p_sock_addr, &nack_msg);
+}
+
+void asp_sess_peer_fsm_init()
+{
+       INFO_MSG;
+
+       gfsm_init_fsm(&asm_sess_peer_fsm, ASP_S_PEER_STATE_MAX, ASP_S_PEER_EVENT_MAX,
+                     ASP_S_PEER_STATE_INIT);
+
+       gfsm_init_state(&asp_sess_peer_state_init, ASP_S_PEER_STATE_INIT,
+                       &asm_sess_peer_fsm, _asp_sess_peer_state_init_entry_action,
+                       _asp_sess_peer_state_init_exit_action);
+       gfsm_add_reaction(&asp_sess_peer_state_init, ASP_S_PEER_EVENT_START,
+                         _asp_sess_peer_state_init_reaction_start);
+
+       gfsm_init_state(&asp_sess_peer_state_created, ASP_S_PEER_STATE_CREATED,
+                       &asm_sess_peer_fsm, _asp_sess_peer_state_created_entry_action,
+                       _asp_sess_peer_state_created_exit_action);
+       gfsm_add_reaction(&asp_sess_peer_state_created, ASP_S_PEER_EVENT_ADD_SESSION,
+                         _asp_sess_peer_state_created_reaction_add_session);
+       gfsm_add_reaction(&asp_sess_peer_state_created, ASP_S_PEER_EVENT_DEL_SESSION,
+                         _asp_sess_peer_state_created_reaction_del_session);
+       gfsm_add_reaction(&asp_sess_peer_state_created, ASP_S_PEER_EVENT_CLOSE,
+                         _asp_sess_peer_state_created_reaction_close);
+       gfsm_add_reaction(&asp_sess_peer_state_created, ASP_S_PEER_EVENT_SEND_ACK,
+                         _asp_sess_peer_state_created_reaction_send_ack);
+       gfsm_add_reaction(&asp_sess_peer_state_created, ASP_S_PEER_EVENT_SEND_NACK,
+                         _asp_sess_peer_state_created_reaction_send_nack);
+
+       gfsm_init_state(&asp_sess_peer_state_version_sent,
+                       ASP_S_PEER_STATE_VERSION_SENT, &asm_sess_peer_fsm,
+                       _asp_sess_peer_state_version_sent_entry_action,
+                       _asp_sess_peer_state_version_sent_exit_action);
+       gfsm_set_parent_state(&asp_sess_peer_state_version_sent,
+                             &asp_sess_peer_state_created);
+       gfsm_add_reaction(&asp_sess_peer_state_version_sent,
+                         ASP_S_PEER_EVENT_ADD_SESSION, gfsm_deferral_reaction);
+       gfsm_add_reaction(&asp_sess_peer_state_version_sent,
+                         ASP_S_PEER_EVENT_DEL_SESSION, gfsm_deferral_reaction);
+       gfsm_add_reaction(&asp_sess_peer_state_version_sent, ASP_S_PEER_EVENT_SEND_REQ,
+                         gfsm_deferral_reaction);
+       gfsm_add_reaction(&asp_sess_peer_state_version_sent,
+                         ASP_S_PEER_EVENT_RECV_VERSION, gfsm_deferral_reaction);
+       gfsm_add_reaction(&asp_sess_peer_state_version_sent, ASP_S_PEER_EVENT_RECV_REQ,
+                         gfsm_deferral_reaction);
+       gfsm_add_reaction(&asp_sess_peer_state_version_sent, ASP_S_PEER_EVENT_RECV_ACK,
+                         _asp_sess_peer_state_version_sent_reaction_recv_ack);
+       gfsm_add_reaction(&asp_sess_peer_state_version_sent, ASP_S_PEER_EVENT_RECV_NACK,
+                         _asp_sess_peer_state_version_sent_reaction_recv_nack);
+       gfsm_add_reaction(&asp_sess_peer_state_version_sent, ASP_S_PEER_EVENT_TIMEOUT,
+                         _asp_sess_peer_state_version_sent_reaction_timeout);
+
+       gfsm_init_state(&asp_sess_peer_state_wait_version,
+                       ASP_S_PEER_STATE_WAIT_VERSION, &asm_sess_peer_fsm,
+                       _asp_sess_peer_state_wait_version_entry_action,
+                       _asp_sess_peer_state_wait_version_exit_action);
+       gfsm_set_parent_state(&asp_sess_peer_state_wait_version,
+                             &asp_sess_peer_state_created);
+       gfsm_add_reaction(&asp_sess_peer_state_wait_version,
+                         ASP_S_PEER_EVENT_ADD_SESSION, gfsm_deferral_reaction);
+       gfsm_add_reaction(&asp_sess_peer_state_wait_version,
+                         ASP_S_PEER_EVENT_DEL_SESSION, gfsm_deferral_reaction);
+       gfsm_add_reaction(&asp_sess_peer_state_wait_version, ASP_S_PEER_EVENT_SEND_REQ,
+                         gfsm_deferral_reaction);
+       gfsm_add_reaction(&asp_sess_peer_state_wait_version,
+                         ASP_S_PEER_EVENT_RECV_VERSION,
+                         _asp_sess_peer_state_wait_version_reaction_recv_version);
+       gfsm_add_reaction(&asp_sess_peer_state_wait_version, ASP_S_PEER_EVENT_RECV_REQ,
+                         _asp_sess_peer_state_wait_version_reaction_recv_req);
+       gfsm_add_reaction(&asp_sess_peer_state_wait_version, ASP_S_PEER_EVENT_TIMEOUT,
+                         _asp_sess_peer_state_wait_version_reaction_timeout);
+
+       gfsm_init_state(&asp_sess_peer_state_opened, ASP_S_PEER_STATE_OPENED,
+                       &asm_sess_peer_fsm, _asp_sess_peer_state_opened_entry_action,
+                       _asp_sess_peer_state_opened_exit_action);
+       gfsm_set_parent_state(&asp_sess_peer_state_opened,
+                             &asp_sess_peer_state_created);
+       gfsm_add_reaction(&asp_sess_peer_state_opened, ASP_S_PEER_EVENT_RECV_VERSION,
+                         _asp_sess_peer_state_opened_reaction_recv_version);
+       gfsm_add_reaction(&asp_sess_peer_state_opened, ASP_S_PEER_EVENT_RECV_REQ,
+                         _asp_sess_peer_state_opened_reaction_recv_req);
+
+       gfsm_init_state(&asp_sess_peer_state_idle, ASP_S_PEER_STATE_IDLE,
+                       &asm_sess_peer_fsm, _asp_sess_peer_state_idle_entry_action,
+                       _asp_sess_peer_state_idle_exit_action);
+       gfsm_set_parent_state(&asp_sess_peer_state_idle, &asp_sess_peer_state_opened);
+       gfsm_add_reaction(&asp_sess_peer_state_idle, ASP_S_PEER_EVENT_SEND_REQ,
+                         _asp_sess_peer_state_idle_reaction_send_req);
+
+       gfsm_init_state(&asp_sess_peer_state_wait_ack, ASP_S_PEER_STATE_WAIT_ACK,
+                       &asm_sess_peer_fsm, _asp_sess_peer_state_wait_ack_entry_action,
+                       _asp_sess_peer_state_wait_ack_exit_action);
+       gfsm_set_parent_state(&asp_sess_peer_state_wait_ack,
+                             &asp_sess_peer_state_opened);
+       gfsm_add_reaction(&asp_sess_peer_state_wait_ack, ASP_S_PEER_EVENT_SEND_REQ,
+                         gfsm_deferral_reaction);
+       gfsm_add_reaction(&asp_sess_peer_state_wait_ack, ASP_S_PEER_EVENT_RECV_ACK,
+                         _asp_sess_peer_state_wait_ack_reaction_recv_ack);
+       gfsm_add_reaction(&asp_sess_peer_state_wait_ack, ASP_S_PEER_EVENT_RECV_NACK,
+                         _asp_sess_peer_state_wait_ack_reaction_recv_nack);
+       gfsm_add_reaction(&asp_sess_peer_state_wait_ack, ASP_S_PEER_EVENT_TIMEOUT,
+                         _asp_sess_peer_state_wait_ack_reaction_timeout);
+
+       gfsm_init_state(&asp_sess_peer_state_closed, ASP_S_PEER_STATE_CLOSED,
+                       &asm_sess_peer_fsm, _asp_sess_peer_state_close_entry_action,
+                       _asp_sess_peer_state_close_exit_action);
+
+       gfsm_add_state(&asm_sess_peer_fsm, &asp_sess_peer_state_init);
+       gfsm_add_state(&asm_sess_peer_fsm, &asp_sess_peer_state_created);
+       gfsm_add_state(&asm_sess_peer_fsm, &asp_sess_peer_state_version_sent);
+       gfsm_add_state(&asm_sess_peer_fsm, &asp_sess_peer_state_wait_version);
+       gfsm_add_state(&asm_sess_peer_fsm, &asp_sess_peer_state_opened);
+       gfsm_add_state(&asm_sess_peer_fsm, &asp_sess_peer_state_idle);
+       /*gfsm_add_state(&asm_sess_peer_fsm,&asp_sess_peer_state_req_sent); */
+       gfsm_add_state(&asm_sess_peer_fsm, &asp_sess_peer_state_wait_ack);
+       gfsm_add_state(&asm_sess_peer_fsm, &asp_sess_peer_state_closed);
+}
+
+void _asp_sess_peer_state_init_entry_action(gpointer p_context_data)
+{
+       INFO_MSG;
+
+       ASP_SESS_PEER_FSM_TRACE_ENTER();
+
+       /*    asp_sess_peer_t* p_peer = (asp_sess_peer_t*)p_context_data; */
+
+       /*p_peer->seq_num = 0; */
+       /*p_peer->p_sending_msg_data = NULL; */
+
+       ASP_SESS_PEER_FSM_TRACE_LEAVE();
+}
+
+void _asp_sess_peer_state_init_exit_action(gpointer p_context_data)
+{
+       INFO_MSG;
+
+       ASP_SESS_PEER_FSM_TRACE_ENTER();
+
+       /*asp_sess_peer_t* p_peer = (asp_sess_peer_t*)p_context_data; */
+
+       ASP_SESS_PEER_FSM_TRACE_LEAVE();
+}
+
+gfsm_state_id_t _asp_sess_peer_state_init_reaction_start(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       ASP_SESS_PEER_FSM_TRACE_ENTER();
+
+       /*    asp_sess_peer_t* p_peer = (asp_sess_peer_t*)p_context_data; */
+
+       ASP_SESS_PEER_FSM_TRACE_LEAVE();
+
+       return ASP_S_PEER_STATE_VERSION_SENT;
+}
+
+void _asp_sess_peer_state_created_entry_action(gpointer p_context_data)
+{
+       INFO_MSG;
+
+       /*    asp_sess_peer_t* p_peer = (asp_sess_peer_t*)p_context_data; */
+}
+
+void _asp_sess_peer_state_created_exit_action(gpointer p_context_data)
+{
+       INFO_MSG;
+
+       /*    asp_sess_peer_t* p_peer = (asp_sess_peer_t*)p_context_data; */
+}
+
+gfsm_state_id_t _asp_sess_peer_state_created_reaction_add_session(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       ASP_SESS_PEER_FSM_TRACE_ENTER();
+
+       asp_sess_peer_t *p_peer = (asp_sess_peer_t *) p_context_data;
+       asp_sess_peer_sess_key_t *p_key = (asp_sess_peer_sess_key_t *) p_event_data;
+
+       _asp_sess_peer_insert_session(p_peer, p_key);
+
+       ASP_SESS_PEER_FSM_TRACE_LEAVE();
+
+       return GFSM_DISCARD_EVENT;
+}
+
+gfsm_state_id_t _asp_sess_peer_state_created_reaction_del_session(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       ASP_SESS_PEER_FSM_TRACE_ENTER();
+
+       asp_sess_peer_t *p_peer = (asp_sess_peer_t *) p_context_data;
+       asp_sess_peer_sess_key_t *p_key = (asp_sess_peer_sess_key_t *) p_event_data;
+
+       _asp_sess_peer_remove_session(p_peer, p_key);
+
+       ASP_SESS_PEER_FSM_TRACE_LEAVE();
+
+       return GFSM_DISCARD_EVENT;
+}
+
+gfsm_state_id_t _asp_sess_peer_state_created_reaction_close(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       ASP_SESS_PEER_FSM_TRACE_ENTER();
+
+       /*    asp_sess_peer_t* p_peer = (asp_sess_peer_t*)p_context_data; */
+
+       ASP_SESS_PEER_FSM_TRACE_LEAVE();
+
+       return ASP_S_PEER_STATE_CLOSED;
+}
+
+gfsm_state_id_t _asp_sess_peer_state_created_reaction_send_ack(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       ASP_SESS_PEER_FSM_TRACE_ENTER();
+
+       asp_sess_peer_t *p_peer = (asp_sess_peer_t *) p_context_data;
+
+       asp_coordination_protocol_send_msg(p_peer->p_sock_addr, p_event_data);
+
+       ASP_SESS_PEER_FSM_TRACE_LEAVE();
+
+       return GFSM_DISCARD_EVENT;
+}
+
+gfsm_state_id_t _asp_sess_peer_state_created_reaction_send_nack(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       ASP_SESS_PEER_FSM_TRACE_ENTER();
+
+       asp_sess_peer_t *p_peer = (asp_sess_peer_t *) p_context_data;
+
+       asp_coordination_protocol_send_msg(p_peer->p_sock_addr, p_event_data);
+
+       ASP_SESS_PEER_FSM_TRACE_LEAVE();
+
+       return GFSM_DISCARD_EVENT;
+}
+
+void _asp_sess_peer_state_version_sent_entry_action(gpointer p_context_data)
+{
+       INFO_MSG;
+
+       ASP_SESS_PEER_FSM_TRACE_ENTER();
+
+       asp_sess_peer_t *p_peer = (asp_sess_peer_t *) p_context_data;
+       asp_version_t *p_msg_version = g_malloc(sizeof(asp_version_t));
+
+       p_msg_version->opcode = ASP_OPCODE_VERSION;
+       p_msg_version->seq_num = p_peer->seq_num;
+       p_msg_version->coordination_version = 0;
+       p_msg_version->vendor_information_length = 0;
+       p_msg_version->vendor_information = 0;
+
+       _asp_sess_peer_set_sending_msg_data(p_peer, p_msg_version);
+
+       asp_coordination_protocol_send_msg(p_peer->p_sock_addr, p_msg_version);
+
+       _asp_sess_peer_start_timer(p_peer, 1 /*sec */);
+
+       ASP_SESS_PEER_FSM_TRACE_LEAVE();
+}
+
+void _asp_sess_peer_state_version_sent_exit_action(gpointer p_context_data)
+{
+       INFO_MSG;
+
+       asp_sess_peer_t *p_peer = (asp_sess_peer_t *) p_context_data;
+
+       _asp_sess_peer_clear_sending_msg_data(p_peer);
+       _asp_sess_peer_stop_timer(p_peer);
+}
+
+gfsm_state_id_t _asp_sess_peer_state_version_sent_reaction_recv_ack(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       asp_sess_peer_t *p_peer = (asp_sess_peer_t *) p_context_data;
+       asp_ack_t *p_ack = (asp_ack_t *) p_event_data;
+
+       if (p_peer->seq_num != p_ack->seq_num)
+               return GFSM_DISCARD_EVENT;
+
+       _asp_sess_peer_increase_seq_num(p_peer);
+
+       return ASP_S_PEER_STATE_WAIT_VERSION;
+}
+
+gfsm_state_id_t _asp_sess_peer_state_version_sent_reaction_recv_nack(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       asp_sess_peer_t *p_peer = (asp_sess_peer_t *) p_context_data;
+       asp_nack_t *p_nack = (asp_nack_t *) p_event_data;
+
+       if (p_peer->seq_num != p_nack->seq_num)
+               return GFSM_DISCARD_EVENT;
+
+       return ASP_S_PEER_STATE_CLOSED;
+}
+
+gfsm_state_id_t _asp_sess_peer_state_version_sent_reaction_timeout(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       /*asp_sess_peer_t* p_peer = (asp_sess_peer_t*)p_context_data; */
+
+       return ASP_S_PEER_STATE_VERSION_SENT;
+}
+
+void _asp_sess_peer_state_wait_version_entry_action(gpointer p_context_data)
+{
+       INFO_MSG;
+
+       asp_sess_peer_t *p_peer = (asp_sess_peer_t *) p_context_data;
+
+       _asp_sess_peer_start_timer(p_peer, 10 /*sec */);
+}
+
+void _asp_sess_peer_state_wait_version_exit_action(gpointer p_context_data)
+{
+       INFO_MSG;
+
+       asp_sess_peer_t *p_peer = (asp_sess_peer_t *) p_context_data;
+
+       _asp_sess_peer_stop_timer(p_peer);
+}
+
+gfsm_state_id_t _asp_sess_peer_state_wait_version_reaction_recv_version(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       /*    asp_sess_peer_t* p_peer = (asp_sess_peer_t*)p_context_data; */
+       /*    asp_coord_header_t* p_header = (asp_coord_header_t*)p_event_data; */
+
+       return ASP_S_PEER_STATE_IDLE;
+}
+
+gfsm_state_id_t _asp_sess_peer_state_wait_version_reaction_recv_req(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       asp_sess_peer_t *p_peer = (asp_sess_peer_t *) p_context_data;
+       asp_coord_header_t *p_header = (asp_coord_header_t *) p_event_data;
+
+       _asp_sess_peer_send_nack_to_protocol(p_peer->p_sock_addr, p_header->seq_num,
+                                            ASP_NACK_REASON_NO_SESSION_EXIST);
+
+       return GFSM_DISCARD_EVENT;
+}
+
+gfsm_state_id_t _asp_sess_peer_state_wait_version_reaction_timeout(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       /*asp_sess_peer_t* p_peer = (asp_sess_peer_t*)p_context_data; */
+       return ASP_S_PEER_STATE_CLOSED;
+}
+
+void _asp_sess_peer_state_opened_entry_action(gpointer p_context_data)
+{
+       INFO_MSG;
+
+       /*asp_sess_peer_t* p_peer = (asp_sess_peer_t*)p_context_data; */
+}
+
+void _asp_sess_peer_state_opened_exit_action(gpointer p_context_data)
+{
+       INFO_MSG;
+
+       /*asp_sess_peer_t* p_peer = (asp_sess_peer_t*)p_context_data; */
+}
+
+gfsm_state_id_t _asp_sess_peer_state_opened_reaction_recv_version(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       /*asp_sess_peer_t* p_peer = (asp_sess_peer_t*)p_context_data; */
+       /*_asp_sess_peer_forward_req_to_sessmgmt(p_peer,p_event_data); */
+
+       return GFSM_DISCARD_EVENT;
+}
+
+gfsm_state_id_t _asp_sess_peer_state_opened_reaction_recv_req(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       asp_sess_peer_t *p_peer = (asp_sess_peer_t *) p_context_data;
+       _asp_sess_peer_forward_req_to_sessmgmt(p_peer, p_event_data);
+
+       return GFSM_DISCARD_EVENT;
+}
+
+void _asp_sess_peer_state_idle_entry_action(gpointer p_context_data)
+{
+       INFO_MSG;
+
+       /*asp_sess_peer_t* p_peer = (asp_sess_peer_t*)p_context_data; */
+}
+
+void _asp_sess_peer_state_idle_exit_action(gpointer p_context_data)
+{
+       INFO_MSG;
+
+       /*asp_sess_peer_t* p_peer = (asp_sess_peer_t*)p_context_data; */
+}
+
+gfsm_state_id_t _asp_sess_peer_state_idle_reaction_send_req(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       asp_sess_peer_t *p_peer = (asp_sess_peer_t *) p_context_data;
+       gpointer p_msg_data = asp_sess_peer_dup_msg_data(p_event_data);
+
+       /*asp_sess_peer_add_sess_list(p_msg_data); */
+       _asp_sess_peer_set_sending_msg_data(p_peer, p_msg_data);
+
+       asp_coordination_protocol_send_msg(p_peer->p_sock_addr, p_msg_data);
+
+       return ASP_S_PEER_STATE_WAIT_ACK;
+}
+
+void _asp_sess_peer_state_wait_ack_entry_action(gpointer p_context_data)
+{
+       INFO_MSG;
+
+       asp_sess_peer_t *p_peer = (asp_sess_peer_t *) p_context_data;
+
+       _asp_sess_peer_start_timer(p_peer, 1);
+}
+
+void _asp_sess_peer_state_wait_ack_exit_action(gpointer p_context_data)
+{
+       INFO_MSG;
+
+       asp_sess_peer_t *p_peer = (asp_sess_peer_t *) p_context_data;
+
+       _asp_sess_peer_stop_timer(p_peer);
+}
+
+gfsm_state_id_t _asp_sess_peer_state_wait_ack_reaction_recv_ack(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       asp_sess_peer_t *p_peer = (asp_sess_peer_t *) p_context_data;
+       asp_ack_t *p_ack = (asp_ack_t *) p_event_data;
+
+       if (p_ack->seq_num != p_peer->seq_num)
+               return GFSM_DISCARD_EVENT;
+
+       _asp_sess_peer_increase_seq_num(p_peer);
+
+       _asp_sess_peer_forward_ack_to_sessmgmt(p_peer, p_event_data);
+
+       _asp_sess_peer_clear_sending_msg_data(p_peer);
+
+       return ASP_S_PEER_STATE_IDLE;
+}
+
+gfsm_state_id_t _asp_sess_peer_state_wait_ack_reaction_recv_nack(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       asp_sess_peer_t *p_peer = (asp_sess_peer_t *) p_context_data;
+       asp_nack_t *p_nack = (asp_nack_t *) p_event_data;
+
+       if (p_nack->seq_num != p_peer->seq_num)
+               return GFSM_DISCARD_EVENT;
+
+       _asp_sess_peer_forward_nack_to_sessmgmt(p_peer, p_event_data);
+
+       _asp_sess_peer_clear_sending_msg_data(p_peer);
+
+       return ASP_S_PEER_STATE_IDLE;
+}
+
+gfsm_state_id_t _asp_sess_peer_state_wait_ack_reaction_timeout(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       asp_sess_peer_t *p_peer = (asp_sess_peer_t *) p_context_data;
+
+       if (p_peer->retry < 5) {
+               ++p_peer->retry;
+               asp_coordination_protocol_send_msg(p_peer->p_sock_addr,
+                                                  p_peer->p_sending_msg_data);
+               return ASP_S_PEER_STATE_WAIT_ACK;
+       } else {
+               p_peer->retry = 0;
+               _asp_sess_peer_clear_sending_msg_data(p_peer);
+               return ASP_S_PEER_STATE_CLOSED;
+       }
+}
+
+void _asp_sess_peer_state_close_entry_action(gpointer p_context_data)
+{
+       INFO_MSG;
+
+       asp_sess_peer_t *p_peer = (asp_sess_peer_t *) p_context_data;
+
+       gfsm_terminate_context(&p_peer->context);
+}
+
+void _asp_sess_peer_state_close_exit_action(gpointer p_context_data)
+{
+       INFO_MSG;
+
+       /*asp_sess_peer_t* p_peer = (asp_sess_peer_t*)p_context_data; */
+}
diff --git a/src/session/asp-session-peer.h b/src/session/asp-session-peer.h
new file mode 100644 (file)
index 0000000..136fe1b
--- /dev/null
@@ -0,0 +1,19 @@
+#ifndef _ASP_SESS_PEER_H_
+#define _ASP_SESS_PEER_H_
+
+#include <glib.h>
+#include <gio/gio.h>
+
+void asp_sess_peer_init();
+void asp_sess_peer_destroy();
+
+gboolean asp_sess_peer_send_msg(GSocketAddress *p_sock_addr, gpointer  p_msg);
+gboolean asp_sess_peer_recv_msg(GSocketAddress *p_sock_addr, gpointer  p_msg);
+
+gboolean asp_sess_peer_add_session(GSocketAddress *p_sock_addr,
+                                  guint8 session_mac[], guint32 session_id);
+gboolean asp_sess_peer_del_session(GSocketAddress *p_sock_addr,
+                                  guint8 session_mac[], guint32 session_id);
+
+#endif
+
old mode 100755 (executable)
new mode 100644 (file)
index 9aff5c8..7535ae3
 /*****************************************************************************
  * Standard headers
  *****************************************************************************/
-
 #include <stdio.h>
 #include <stdlib.h>
-#include <string.h>
-#include <time.h>
+/*#include <string.h> */
+/*#include <time.h> */
+
+#define HAVE_ASP_P2P_CONN
 
 /*****************************************************************************
  * System headers
  *****************************************************************************/
-
-#include<glib.h>
+/*#include <dlog.h> */
 #include <gio/gio.h>
 
-#include<dlog.h>
+#ifdef HAVE_ASP_P2P_CONN
+#include "asp-p2p-conn.h"
+#endif
 
 /*****************************************************************************
  * Application Service Platform Daemon headers
  *****************************************************************************/
 #include "asp-manager.h"
 #include "asp-manager-util.h"
-#include "asp-service.h"
+#include "gfsm.h"
 #include "asp-session.h"
-#include "asp-manager-gdbus.h"
-#include "asp-tech.h"
-
-#include "../generated-code.h"
+#include "asp-session-peer.h"
+#include "asp-coordination-protocol.h"
+#include "asp-session-peer-interface.h"
 
 /*****************************************************************************
  * Macros and Typedefs
  *****************************************************************************/
+#define MAC_ADDRESS_LEN 6
+#define ASP_SESSION_IPV4_BYTE 4
+#define ASP_SESSION_IPV4_STR_LEN 16
+#define ASP_SESSION_INFO_BYTE_MAX 144
+#define ASP_DEFER_RESPONSE_BYTE_MAX 144
+#define ASP_MAX_DEVICE_NAME_LEN 32
+#define SESSION_STATUS_ADDITIONAL_INFO "REQUEST_SESSION"
+
+typedef enum asp_role {
+       ASP_ROLE_NONE,
+       ASP_ROLE_ADVERTIZER,
+       ASP_ROLE_SEEKER
+} asp_role_e;
+
+typedef struct asp_session {
+       /* Can be used as session argument from below */
+       gfsm_context_t context;
+       asp_role_e asp_role;
+       guint8 session_mac[MAC_ADDRESS_LEN];    /* the MAC address of the P2P device that generated the session ID */
+       guint32 session_id;
+       guint8 service_mac[MAC_ADDRESS_LEN];    /* the MAC address of the P2P device that generated the session ID */
+       guint32 advertisement_id;
+       gchar peer_ip[ASP_SESSION_IPV4_STR_LEN];
+       GSocketAddress *sock_addr;
+       /*gchar peer_ipv6[ASP_SESSION_IPV6_STR_LEN]; */
+       /*GSocketFamily sock_family; // ipv4 or ipv6 */
+       asp_session_closed_state_e closed_state;
+       gboolean over_p2p;                      /*p2p or infra */
+} asp_session_t;
+
+typedef struct session_request_cb {
+       asp_session_session_request_cb cb;
+       gpointer user_data;
+} session_request_cb_t;
+
+typedef struct session_config_request_cb {
+       asp_session_session_config_request_cb cb;
+       gpointer user_data;
+} session_config_request_cb_t;
+
+typedef struct connect_status_cb {
+       asp_session_connect_status_cb cb;
+       gpointer user_data;
+} connect_status_cb_t;
+
+typedef struct port_status_cb {
+       asp_session_port_status_cb cb;
+       gpointer user_data;
+} port_status_cb_t;
+
+typedef struct session_status_cb {
+       asp_session_session_status_cb cb;
+       gpointer user_data;
+} session_status_cb_t;
+
+typedef struct asp_session_cb_v_table {
+       session_request_cb_t session_request;
+       session_config_request_cb_t session_config_request;
+       connect_status_cb_t connect_status;
+       port_status_cb_t port_status;
+       session_status_cb_t session_status;
+} asp_session_cb_v_table_t;
+
+typedef struct asp_session_key {
+       guint32 session_id;
+       guint8 session_mac[MAC_ADDRESS_LEN];
+} asp_session_key_t;
+
+typedef struct connect_session_param {
+       guint8 service_mac[MAC_ADDRESS_LEN];    /* the MAC address of the P2P device that generated the session ID */
+       guint8 session_info[ASP_SESSION_INFO_BYTE_MAX];
+       size_t info_length;
+       guint8 network_role;
+       guint8 network_config;
+} connect_session_param_t;
+
+typedef struct defer_session_param {
+       guint8 deferred_response[ASP_DEFER_RESPONSE_BYTE_MAX];
+       size_t length;
+} defer_session_param_t;
+
+typedef struct confirm_session_param {
+       gboolean confirmed;
+       guint32 pin;
+} confirm_session_param_t;
 
-/* TODO : define session data structure */
+typedef struct bound_port_param {
+       gchar local_ip[ASP_SESSION_IPV4_STR_LEN];
+       guint16 local_port;
+       guint8 proto;
+} bound_port_param_t;
+
+typedef struct session_request_param {
+       gint32 error_code;
+       guint32 advertisement_id;
+       gchar device_name[ASP_MAX_DEVICE_NAME_LEN + 1];
+       size_t name_length;
+       guint8 session_info[ASP_SESSION_INFO_BYTE_MAX];
+       size_t info_length;
+       gboolean get_pin;
+       guint32 pin;
+} session_request_param_t;
+
+typedef struct connect_status_param {
+       asp_session_connect_status_e status;
+       gchar deferred_resp[ASP_DEFER_RESPONSE_BYTE_MAX];
+       size_t length;
+} connect_status_param_t;
+
+typedef struct session_config_request_param {
+       gboolean get_network_config_pin;
+       guint32 network_config_pin;
+} session_config_request_param_t;
+
+typedef struct ip_assigned_param {
+       gchar peer_ip_addr[ASP_SESSION_IPV4_STR_LEN];
+       size_t length;
+} ip_assigned_param_t;
+
+enum asp_session_state_e {
+       SESSION_STATE_NONE,
+       SESSION_STATE_CLOSED,
+       SESSION_STATE_RUNNING,
+       SESSION_STATE_L2CONNECTING,
+       SESSION_STATE_SESSION_REQUEST_SENT,
+       SESSION_STATE_SESSION_REQUEST_RECEIVED,
+       SESSION_STATE_SESSION_REQUEST_DEFERED,
+       SESSION_STATE_SESSION_REQUEST_ACCEPTED,
+       SESSION_STATE_ENTERING_PIN,
+       SESSION_STATE_GROUP_FORMATION_COMPLETED,
+       SESSION_STATE_L2CONNECTED,
+       SESSION_STATE_REQUEST_SESSION_SENT,
+       SESSION_STATE_OPEN,
+       SESSION_STATE_REQUEST_SESSION_RECEIVED,
+       SESSION_STATE_REJECT_SESSION_SENT,
+       SESSION_STATE_REMOVE_SESSION_SENT,
+       SESSION_STATE_MAX
+};
+
+enum asp_session_event_e {
+       SESSION_EVENT_BOUND_PORT_CALLED,
+       SESSION_EVENT_CLOSE_SESSION_CALLED,
+       SESSION_EVENT_CONNECT_SESSION_CALLED,
+       SESSION_EVENT_CONFIRM_SESSION_CALLED,
+       SESSION_EVENT_DEFER_SESSION_CALLED,
+       SESSION_EVENT_SET_SESSION_READY_CALLED,
+
+       SESSION_EVENT_SESSION_REQUEST_CALLED,
+       SESSION_EVENT_SESSION_CONFIG_REQUEST_CALLED,
+       SESSION_EVENT_CONNECT_STATUS_CALLED,
+       SESSION_EVENT_IP_ASSIGNED,
+
+       SESSION_EVENT_REMOVE_SESSION_RECEIVED,
+       SESSION_EVENT_ALLOWED_PORT_RECEIVED,
+       SESSION_EVENT_DEFERRED_SESSION_RECEIVED,
+       SESSION_EVENT_REJECTED_SESSION_RECEIVED,
+       SESSION_EVENT_ADDED_SESSION_RECEIVED,
+       SESSION_EVENT_REQUEST_SESSION_RECEIVED,
+       SESSION_EVENT_ACK_RECEIVED,
+       SESSION_EVENT_NACK_RECEIVED,
+
+       SESSION_EVENT_PEER_DESTROYED,
+       SESSION_EVENT_TIMEOUT,
+
+       SESSION_EVENT_MAX
+};
 
 /*****************************************************************************
  * Global Variables
  *****************************************************************************/
+static GTree *sessionTree =
+       NULL;   /* [key] - [asp_session_key_t*], [value] - [asp_session_t*] */
+static asp_session_cb_v_table_t session_cb_v_table;
+static gchar g_my_p2p_mac[MAC_ADDRESS_LEN];
+static guint16 g_asp_cordination_port = 7235;
+
+static gfsm_t session_fsm;
+static gfsm_state_t session_state_none;
+static gfsm_state_t session_state_closed;
+static gfsm_state_t session_state_running;
+static gfsm_state_t session_state_l2connecting;
+static gfsm_state_t session_state_session_request_sent;
+static gfsm_state_t session_state_session_request_defered;
+static gfsm_state_t session_state_entering_pin;
+static gfsm_state_t session_state_session_request_received;
+static gfsm_state_t session_state_session_request_accepted;
+static gfsm_state_t session_state_entering_pin;
+static gfsm_state_t session_state_group_formation_completed;
+static gfsm_state_t session_state_l2connected;
+static gfsm_state_t session_state_request_session_sent;
+static gfsm_state_t session_state_open;
+static gfsm_state_t session_state_request_session_received;
+static gfsm_state_t session_state_reject_session_sent;
+static gfsm_state_t session_state_remove_session_sent;
+
+/*****************************************************************************
+ * Local Functions Declaration
+ *****************************************************************************/
+
+/* send coordination protocol message */
+static gboolean _send_request_session(asp_session_t *session,
+                                     guint8 *session_info, size_t session_info_len);
+static gboolean _send_added_session(asp_session_t *session);
+static gboolean _send_reject_session(asp_session_t *session);
+static gboolean _send_remove_session(asp_session_t *session,
+                                    guint8 remove_reason);
+static gboolean _send_allowed_port(asp_session_t *session, guint16 port,
+                                  guint8 protocol);
+static gboolean _send_deferred_session(asp_session_t *session,
+                                      guint8 *deferred_response, size_t length);
+static gboolean _send_nack(GSocketAddress *sock_addr, guint8 seq_num,
+                          guint8 reason);
+static gboolean _send_ack(GSocketAddress *sock_addr, guint8 seq_num);
+
+/* local functions */
+static gint _session_tree_compare_func(gconstpointer a, gconstpointer b);
+static void _session_tree_value_destoryed(gpointer data);
+static void _session_tree_key_destoryed(gpointer data);
+static void _insert_session(asp_session_t *session);
+static void _remove_session(guint8 *session_mac, guint32 session_id);
+static void _get_ip_from_socketaddress(GSocketAddress *sock_addr,
+                                      gchar *peer_ip);
+static guint32 _alloc_session_id();
+static asp_session_t *_get_exist_session(guint32 session_id,
+               const guint8 *session_mac);
+static asp_session_t *_new_session_by_request_session(GSocketAddress *sock_addr,
+               const gchar *peer_ip, gpointer p_msg);
+static asp_session_t *_new_session_over_infra(guint8 *session_mac,
+               guint32 session_id, asp_role_e asp_role, guint32 advertisement_id,
+               GSocketAddress *sock_addr, const gchar *peer_ip);
+static asp_session_t *_new_session_over_p2p(const guint8 *session_mac,
+               guint32 session_id, asp_role_e asp_role, const guint8 *service_mac,
+               guint32 advertisement_id);
+static asp_session_t *_new_session_from_session_request(
+       const guint8 *session_mac, guint32 session_id, guint32 advertisement_id);
+static void _asp_session_destroy_session(gpointer p_context_data);
+static asp_session_status_e _get_session_state(guint8 *session_mac,
+               guint32 session_id);
+static asp_session_key_t *_get_session_key(guint32 session_id,
+               const guint8 *session_mac);
+static void _store_peer_ip_addr(asp_session_t *session, gchar *peer_ip,
+                               size_t length);
+#ifdef HAVE_ASP_P2P_CONN
+static guint8 *_get_peer_mac(asp_session_t *session);
+#endif
 
-GList *g_sessions = NULL;
+static gpointer _asp_session_dup_reqeust_session(gpointer p_msg);
+/*
+static gpointer _asp_session_dup_added_session(gpointer p_msg);
+static gpointer _asp_session_dup_rejected_session(gpointer p_msg);
+static gpointer _asp_session_dup_remove_session(gpointer p_msg);
+static gpointer _asp_session_dup_deferred_session(gpointer p_msg);
+*/
+static gpointer _asp_session_dup_allowed_session(gpointer p_msg);
+static void _call_session_request_cb(gint32 error_code, guint8 *session_mac,
+                                    guint32 session_id, guint32 advertisement_id, gchar *device_name,
+                                    size_t name_length, guint8 *session_info, size_t info_length, gboolean get_pin,
+                                    guint32 pin);      /*if pin is zero, it does not need to be displayed. */
+static void _call_session_config_request_cb(gint32 error_code,
+               guint8 *session_mac, guint32 session_id, gboolean get_pin, guint32 pin);
+static void _call_session_status_cb(gint32 error_code, guint8 *session_mac,
+                                   guint32 session_id, asp_session_closed_state_e closed_state);
+static void _call_connect_status_cb(gint32 error_code, guint8 *session_mac,
+                                   guint32 session_id, asp_session_connect_status_e status);
+static void _call_port_status_cb(gint32 error_code, const guint8 *session_mac,
+                                guint32 session_id, const gchar *peer_ip, guint16 port, guint8 protocol,
+                                asp_session_port_status_e status);
+
+/*callback functions for asp_p2p_conn */
+void _p2p_conn_session_request_cb(gint32 error_code, const guint8 *session_mac,
+                                 guint32 session_id, guint32 advertisement_id, const gchar *device_name,
+                                 size_t name_length, const guint8 *session_info, size_t info_length,
+                                 gboolean get_pin, guint32 pin, gpointer user_data);
+void _p2p_conn_session_config_request_cb(gint32 error_code,
+               const guint8 *session_mac, guint32 session_id, gboolean get_pin, guint32 pin,
+               gpointer user_data);
+void _p2p_conn_connect_status_cb(gint32 error_code, const guint8 *session_mac,
+                                guint32 session_id, asp_session_connect_status_e status, gpointer user_data);
+
+/* state machine using gfsm */
+static void _asp_session_fsm_init();
+static void _asp_session_fsm_terminate();
+static void _state_none_entry_action(gpointer p_context_data);
+static void _state_none_exit_action(gpointer p_context_data);
+static gfsm_state_id_t _state_none_reaction_connect_session_called(
+       gpointer p_context_data, gpointer p_event_data);
+static gfsm_state_id_t _state_none_reaction_request_session_received(
+       gpointer p_context_data, gpointer p_event_data);
+static gfsm_state_id_t _state_none_reaction_session_request_received(
+       gpointer p_context_data, gpointer p_event_data);
+static void _state_closed_entry_action(gpointer p_context_data);
+static void _state_closed_exit_action(gpointer p_context_data);
+/*static gfsm_state_id_t _state_closed_reaction_connect_session_called (void* p_context_data, void* p_event_data); */
+/*static gfsm_state_id_t _state_closed_reaction_request_session_received(void* p_context_data, void* p_event_data); */
+static void _state_running_entry_action(gpointer p_context_data);
+static void _state_running_exit_action(gpointer p_context_data);
+
+static void _state_l2connecting_entry_action(gpointer p_context_data);
+static void _state_l2connecting_exit_action(gpointer p_context_data);
+static gfsm_state_id_t _state_l2connecting_reaction_close_session_called(
+       gpointer p_context_data, gpointer p_event_data);
+static gfsm_state_id_t _state_l2connecting_reaction_timeout(
+       gpointer p_context_data, gpointer p_event_data);
+
+static void _state_session_request_sent_entry_action(gpointer p_context_data);
+static void _state_session_request_sent_exit_action(gpointer p_context_data);
+static gfsm_state_id_t
+_state_session_request_sent_reaction_connect_status_called(
+       gpointer p_context_data, gpointer p_event_data);
+static gfsm_state_id_t
+_state_session_request_sent_reaction_session_config_request_called(
+       gpointer p_context_data, gpointer p_event_data);
+
+static void _state_session_request_defered_entry_action(
+       gpointer p_context_data);
+static void _state_session_request_defered_exit_action(gpointer p_context_data);
+static gfsm_state_id_t
+_state_session_request_defered_reaction_connect_status_called(
+       gpointer p_context_data, gpointer p_event_data);
+static gfsm_state_id_t
+_state_session_request_defered_reaction_session_config_request_called(
+       gpointer p_context_data, gpointer p_event_data);
+
+static void _state_session_request_received_entry_action(
+       gpointer p_context_data);
+static void _state_session_request_received_exit_action(
+       gpointer p_context_data);
+static gfsm_state_id_t
+_state_session_request_received_reaction_confirm_session_called(
+       gpointer p_context_data, gpointer p_event_data);
+
+static void _state_session_request_accepted_entry_action(
+       gpointer p_context_data);
+static void _state_session_request_accepted_exit_action(
+       gpointer p_context_data);
+static gfsm_state_id_t
+_state_session_request_accepted_reaction_connect_status_received(
+       gpointer p_context_data, gpointer p_event_data);
+static gfsm_state_id_t
+_state_session_request_accepted_reaction_session_config_request_called(
+       gpointer p_context_data, gpointer p_event_data);
+
+static void _state_entering_pin_entry_action(gpointer p_context_data);
+static void _state_entering_pin_exit_action(gpointer p_context_data);
+static gfsm_state_id_t _state_entering_pin_reaction_confirm_session_called(
+       gpointer p_context_data, gpointer p_event_data);
+
+static void _state_group_formation_completed_entry_action(
+       gpointer p_context_data);
+static void _state_group_formation_completed_exit_action(
+       gpointer p_context_data);
+static gfsm_state_id_t _state_group_formation_completed_reaction_ip_assigned(
+       gpointer p_context_data, gpointer p_event_data);
+static gfsm_state_id_t
+_state_group_formation_completed_reaction_request_session_received(
+       gpointer p_context_data, gpointer p_event_data);
+
+static void _state_l2connected_entry_action(gpointer p_context_data);
+static void _state_l2connected_exit_action(gpointer p_context_data);
+static gfsm_state_id_t _state_l2connected_reaction_close_session_called(
+       gpointer p_context_data, gpointer p_event_data);
+static gfsm_state_id_t _state_l2connected_reaction_remove_session_received(
+       gpointer p_context_data, gpointer p_event_data);
+static gfsm_state_id_t _state_l2connected_reaction_peer_destroyed(
+       gpointer p_context_data, gpointer p_event_data);
+
+static void _state_request_session_sent_entry_action(gpointer p_context_data);
+static void _state_request_session_sent_exit_action(gpointer p_context_data);
+static gfsm_state_id_t
+_state_request_session_sent_reaction_added_session_received(
+       gpointer p_context_data, gpointer p_event_data);
+static gfsm_state_id_t
+_state_request_session_sent_reaction_deferred_session_received(
+       gpointer p_context_data, gpointer p_event_data);
+static gfsm_state_id_t
+_state_request_session_sent_reaction_rejected_session_received(
+       gpointer p_context_data, gpointer p_event_data);
+static gfsm_state_id_t _state_request_session_sent_reaction_timeout(
+       gpointer p_context_data, gpointer p_event_data);
+static void _state_request_session_received_entry_action(
+       gpointer p_context_data);
+static void _state_request_session_received_exit_action(
+       gpointer p_context_data);
+static gfsm_state_id_t
+_state_request_session_received_reaction_set_session_ready_called(
+       gpointer p_context_data, gpointer p_event_data);
+static gfsm_state_id_t
+_state_request_session_received_reaction_defer_session_called(
+       gpointer p_context_data, gpointer p_event_data);
+static gfsm_state_id_t
+_state_request_session_received_reaction_confirm_session_called(
+       gpointer p_context_data, gpointer p_event_data);
+static void _state_open_entry_action(gpointer p_context_data);
+static void _state_open_exit_action(gpointer p_context_data);
+static gfsm_state_id_t _state_open_reaction_bound_port_called(
+       gpointer p_context_data, gpointer p_event_data);
+static gfsm_state_id_t _state_open_reaction_allowed_port_received(
+       gpointer p_context_data, gpointer p_event_data);
+static void _state_reject_session_sent_entry_action(gpointer p_context_data);
+static void _state_reject_session_sent_exit_action(gpointer p_context_data);
+static gfsm_state_id_t _state_reject_session_sent_reaction_ack_received(
+       gpointer p_context_data, gpointer p_event_data);
+static gfsm_state_id_t _state_reject_session_sent_reaction_nack_received(
+       gpointer p_context_data, gpointer p_event_data);
+static void _state_remove_session_sent_entry_action(gpointer p_context_data);
+static void _state_remove_session_sent_exit_action(gpointer p_context_data);
+static gfsm_state_id_t _state_remove_session_sent_reaction_ack_received(
+       gpointer p_context_data, gpointer p_event_data);
+static gfsm_state_id_t _state_remove_session_sent_reaction_nack_received(
+       gpointer p_context_data, gpointer p_event_data);
 
 /*****************************************************************************
- * Local Functions Definition
+ * API Definition
  *****************************************************************************/
 
-/* Allocate memory for session and initialized it */
-asp_session_s * asp_session_create(unsigned char *session_mac, int session_id, unsigned int adv_id)
+gboolean asp_session_initialize()
 {
-       __ASP_LOG_FUNC_ENTER__;
-       asp_session_s *session = NULL;
+       INFO_MSG;
 
-       session = (asp_session_s *)g_try_malloc0(sizeof(asp_session_s));
-       if (session == NULL) {
-               ASP_LOGE("memory allocation for session is failed");
-               return NULL;
-       }
+#ifdef HAVE_ASP_P2P_CONN
+       asp_p2p_conn_get_p2p_mac(g_my_p2p_mac);
+#endif
 
-       memcpy(session->service_mac, session_mac, MAC_LEN);
-       session->session_id = session_id;
-       session->advertisement_id = adv_id;
-       session->state = ASP_SESSION_CLOESD;
+       asp_sess_peer_init();
 
-       g_sessions = g_list_append(g_sessions, session);
+       sessionTree = g_tree_new_full((GCompareDataFunc) _session_tree_compare_func,
+                                     NULL, (GDestroyNotify) _session_tree_key_destoryed,
+                                     (GDestroyNotify) _session_tree_value_destoryed);
 
-       __ASP_LOG_FUNC_EXIT__;
-       return session;
+       g_assert(sessionTree);
+
+       _asp_session_fsm_init();
+
+       session_cb_v_table.connect_status.cb = NULL;
+       session_cb_v_table.connect_status.user_data = NULL;
+       session_cb_v_table.port_status.cb = NULL;
+       session_cb_v_table.port_status.user_data = NULL;
+       session_cb_v_table.session_request.cb = NULL;
+       session_cb_v_table.session_request.user_data = NULL;
+       session_cb_v_table.session_config_request.cb = NULL;
+       session_cb_v_table.session_config_request.user_data = NULL;
+       session_cb_v_table.session_status.cb = NULL;
+       session_cb_v_table.session_status.user_data = NULL;
+
+#ifdef HAVE_ASP_P2P_CONN
+       asp_p2p_conn_initialize();      /* it needs to be provided by p2p_conn , hjjee */
+       asp_p2p_conn_set_session_request_cb(_p2p_conn_session_request_cb, NULL);
+       asp_p2p_conn_set_session_config_request_cb(_p2p_conn_session_config_request_cb,
+                       NULL);
+       asp_p2p_conn_set_connect_status_cb(_p2p_conn_connect_status_cb, NULL);
+#endif
+
+       return TRUE;
 }
 
-/* Deallocate memory for session */
-int asp_session_destroy(unsigned char *session_mac, int session_id)
+gboolean asp_session_deinitialize()
 {
-       __ASP_LOG_FUNC_ENTER__;
-       asp_session_s *session = NULL;
-       int res = 0;
+       INFO_MSG;
 
-       session = asp_session_get_session(session_mac, session_id);
-       if (session == NULL) {
-               ASP_LOGE("There's no session");
-               return -1;
-       }
+       asp_sess_peer_destroy();
 
-       g_sessions = g_list_remove(g_sessions, session);
-       g_free(session);
+       g_tree_destroy(sessionTree);
+       sessionTree = NULL;
+
+       session_cb_v_table.connect_status.cb = NULL;
+       session_cb_v_table.connect_status.user_data = NULL;
+       session_cb_v_table.port_status.cb = NULL;
+       session_cb_v_table.port_status.user_data = NULL;
+       session_cb_v_table.session_request.cb = NULL;
+       session_cb_v_table.session_request.user_data = NULL;
+       session_cb_v_table.session_config_request.cb = NULL;
+       session_cb_v_table.session_config_request.user_data = NULL;
+       session_cb_v_table.session_status.cb = NULL;
+       session_cb_v_table.session_status.user_data = NULL;
+
+       _asp_session_fsm_terminate();
+
+#ifdef HAVE_ASP_P2P_CONN
+       asp_p2p_conn_deinitialize();
+#endif
+
+       return TRUE;
+}
+
+gboolean asp_session_connect_session_over_p2p(const guint8 *service_mac,
+               guint32 advertisement_id, const guint8 *session_info, size_t info_length,
+               guint8 network_role, guint8 network_config, guint8 *session_mac,
+               guint32 *p_session_id)
+{
+       INFO_MSG;
+
+       memcpy(session_mac, g_my_p2p_mac, MAC_ADDRESS_LEN);
+
+       do {
+               *p_session_id = _alloc_session_id();
+       } while (_get_exist_session(*p_session_id, session_mac) != NULL);
+
+       asp_session_t *session = _new_session_over_p2p(session_mac, *p_session_id,
+                                ASP_ROLE_SEEKER, service_mac,
+                                advertisement_id);     /*this function is not implemented yet, hjjee */
+       g_assert(session);
+
+       connect_session_param_t *p_connect_session = (connect_session_param_t *)
+                       g_malloc(sizeof(connect_session_param_t));
 
-       __ASP_LOG_FUNC_EXIT__;
-       return res;
+       memcpy(p_connect_session->service_mac, service_mac, MAC_ADDRESS_LEN);
+       if (session_info) {
+               p_connect_session->info_length = MIN(ASP_SESSION_INFO_BYTE_MAX, info_length);
+               memcpy(p_connect_session->session_info, session_info,
+                      p_connect_session->info_length);
+       } else
+               p_connect_session->info_length = 0;
+       p_connect_session->network_role = network_role;
+       p_connect_session->network_config = network_config;
+
+       gfsm_process_event(&session->context,
+                          gfsm_create_event(SESSION_EVENT_CONNECT_SESSION_CALLED, p_connect_session,
+                                            g_free));
+
+       return TRUE;
+}
+
+gboolean asp_session_connect_session_over_infa(const gchar *peer_ip,
+               guint32 advertisement_id, guint8 *session_info, size_t info_length,
+               guint8 *session_mac, guint32 *p_session_id)
+{
+       INFO_MSG;
+
+       memcpy(session_mac, g_my_p2p_mac, MAC_ADDRESS_LEN);
+
+       do {
+               *p_session_id = _alloc_session_id();
+       } while (_get_exist_session(*p_session_id, session_mac) != NULL);
+
+       asp_session_t *session = _new_session_over_infra(session_mac, *p_session_id,
+                                ASP_ROLE_SEEKER, advertisement_id, NULL,
+                                peer_ip);      /*this function needs to be modified because there is new element in session structure., hjjee */
+       g_assert(session);
+
+       connect_session_param_t *p_connect_session = (connect_session_param_t *)
+                       g_malloc(sizeof(connect_session_param_t));
+
+       memset(p_connect_session->service_mac, 0, MAC_ADDRESS_LEN);
+       if (session_info) {
+               p_connect_session->info_length = MIN(ASP_SESSION_INFO_BYTE_MAX, info_length);
+               memcpy(p_connect_session->session_info, session_info,
+                      p_connect_session->info_length);
+       } else
+               p_connect_session->info_length = 0;
+       p_connect_session->network_role = 0;
+       p_connect_session->network_config = 0;
+
+       gfsm_process_event(&session->context,
+                          gfsm_create_event(SESSION_EVENT_CONNECT_SESSION_CALLED, p_connect_session,
+                                            g_free));
+
+       return TRUE;
+}
+
+gboolean asp_session_defer_session(guint8 *session_mac, guint32 session_id,
+                                  guint8 *deferred_response, size_t length)
+{
+       INFO_MSG;
+
+       asp_session_t *session = _get_exist_session(session_id, session_mac);
+       defer_session_param_t *defer_session_param = (defer_session_param_t *) g_malloc(
+                               sizeof(defer_session_param_t));
+
+       g_assert(session);
+
+       defer_session_param->length = length;
+       memcpy(defer_session_param->deferred_response, deferred_response, MIN(length,
+                       ASP_DEFER_RESPONSE_BYTE_MAX));
+
+       gfsm_process_event(&session->context,
+                          gfsm_create_event(SESSION_EVENT_DEFER_SESSION_CALLED, defer_session_param,
+                                            g_free));
+
+       return TRUE;
+}
+
+gboolean asp_session_confirm_session(const guint8 *session_mac,
+                                    guint32 session_id, gboolean confirmed, guint32 pin)
+{
+       INFO_MSG;
+
+       asp_session_t *session = _get_exist_session(session_id, session_mac);
+       g_assert(session);
+
+       confirm_session_param_t *confirmed_param = (confirm_session_param_t *) g_malloc(
+                               sizeof(confirm_session_param_t));
+       confirmed_param->confirmed = confirmed;
+       confirmed_param->pin = pin;
+
+       gfsm_process_event(&session->context,
+                          gfsm_create_event(SESSION_EVENT_CONFIRM_SESSION_CALLED, confirmed_param,
+                                            g_free));
+
+       return TRUE;
+}
+
+gboolean asp_session_set_session_ready(const guint8 *session_mac,
+                                      guint32 session_id)
+{
+       INFO_MSG;
+
+       asp_session_t *session = _get_exist_session(session_id, session_mac);
+       g_assert(session);
+
+       gfsm_process_event(&session->context,
+                          gfsm_create_event(SESSION_EVENT_SET_SESSION_READY_CALLED, NULL, NULL));
+
+       return TRUE;
+}
+
+gboolean asp_session_close_session(guint8 *session_mac, guint32 session_id,
+                                  asp_remove_session_reason_e reason)
+{
+       INFO_MSG;
+
+       asp_session_t *session = _get_exist_session(session_id, session_mac);
+       g_assert(session);
+
+       guint8 *close_reason = (guint8 *) g_malloc(sizeof(guint8));
+       *close_reason = (guint8) reason;
+
+       gfsm_process_event(&session->context,
+                          gfsm_create_event(SESSION_EVENT_CLOSE_SESSION_CALLED, close_reason, g_free));
+
+       return TRUE;
 }
 
-int asp_session_connect_session(asp_connect_session_params *params, asp_session_s **session)
+gboolean asp_session_bound_port(guint8 *session_mac, guint32 session_id,
+                               const gchar *local_ip, guint16 local_port, guint8 protocol)
 {
-       __ASP_LOG_FUNC_ENTER__;
-       asp_s *asp = NULL;
-       asp_session_s * local_session = NULL;
-       int tech = 0;
-       int res = 0;
+       INFO_MSG;
+
+       asp_session_t *session = _get_exist_session(session_id, session_mac);
+       g_assert(session);
+
+       bound_port_param_t *bound_port_param = (bound_port_param_t *) g_malloc(sizeof(
+                       bound_port_param_t));
+       g_strlcpy(bound_port_param->local_ip, local_ip, ASP_SESSION_IPV4_STR_LEN);
+       bound_port_param->local_port = local_port;
+       bound_port_param->proto = protocol;
+
+       gfsm_process_event(&session->context,
+                          gfsm_create_event(SESSION_EVENT_BOUND_PORT_CALLED, bound_port_param, g_free));
+
+       return TRUE;
+}
+
+void _p2p_conn_session_request_cb(gint32 error_code, const guint8 *session_mac,
+                                 guint32 session_id, guint32 advertisement_id, const gchar *device_name,
+                                 size_t name_length, const guint8 *session_info, size_t info_length,
+                                 gboolean get_pin, guint32 pin, gpointer user_data)
+{
+       asp_session_t *session = _get_exist_session(session_id, session_mac);
+
+       if (session) {
+               /* Discard or delete previous session??? */
+               return;
+       } else {
+               session = _new_session_from_session_request(session_mac, session_id,
+                               advertisement_id);
+               g_assert(session);
 
-       asp = asp_get_manager();
-       if (asp == NULL) {
-               ASP_LOGE("memory allocation for session is failed");
-               return -1;
+               session_request_param_t *p_param = (session_request_param_t *) g_malloc(sizeof(
+                               session_request_param_t));
+
+               p_param->name_length = MIN(ASP_MAX_DEVICE_NAME_LEN, name_length);
+               memcpy(p_param->device_name, device_name, p_param->name_length);
+               p_param->device_name[p_param->name_length] = 0;
+               if (session_info) {
+                       p_param->info_length = MIN(ASP_SESSION_INFO_BYTE_MAX, info_length);
+                       memcpy(p_param->session_info, session_info, p_param->info_length);
+               } else
+                       p_param->info_length = 0;
+               p_param->get_pin = get_pin;
+               p_param->pin = pin;
+
+               gfsm_process_event(&session->context,
+                                  gfsm_create_event(SESSION_EVENT_SESSION_REQUEST_CALLED, p_param, g_free));
        }
+}
+
+void _p2p_conn_session_config_request_cb(gint32 error_code,
+               const guint8 *session_mac, guint32 session_id, gboolean get_pin, guint32 pin,
+               gpointer user_data)
+{
+       asp_session_t *session = _get_exist_session(session_id, session_mac);
+
+       if (session) {
+               session_config_request_param_t *p_param = (session_config_request_param_t *)
+                               g_malloc(sizeof(session_config_request_param_t));
+               p_param->get_network_config_pin = get_pin;
+               p_param->network_config_pin = pin;
 
-       /* Make local p2p address as session mac */
-       local_session = asp_session_create(asp->p2p_local_address,
-                       params->session_id, params->advertisement_id);
-       if (local_session == NULL) {
-               ASP_LOGE("memory allocation for session is failed");
-               return ASP_ERROR_MEMORY;
+               gfsm_process_event(&session->context,
+                                  gfsm_create_event(SESSION_EVENT_SESSION_CONFIG_REQUEST_CALLED, p_param,
+                                                    g_free));
        }
+}
+
+void _p2p_conn_connect_status_cb(gint32 error_code, const guint8 *session_mac,
+                                guint32 session_id, asp_session_connect_status_e status, gpointer user_data)
+{
+       asp_session_t *session = _get_exist_session(session_id, session_mac);
+
+       if (session) {
+               connect_status_param_t *p_param = (connect_status_param_t *) g_malloc(sizeof(
+                               connect_status_param_t));
+               p_param->status = status;
+               p_param->length = 0;
 
-       /* TODO : request connection on proper technology */
-       tech = ASP_TECH_P2P;
-       memcpy(params->session_mac, local_session->session_mac, MAC_LEN);
-       res = asp_tech_connect_session(tech, params);
-       if (res < 0) {
-               ASP_LOGE("request connect is failed");
-               asp_session_destroy(local_session->session_mac, local_session->session_id);
-               return -1;
+               gfsm_process_event(&session->context,
+                                  gfsm_create_event(SESSION_EVENT_CONNECT_STATUS_CALLED, p_param, g_free));
        }
-       *session = local_session;
-       asp_state_set(local_session, ASP_SESSION_INITIATED, 0, NULL);
+}
+
+gboolean asp_session_set_session_request_cb(asp_session_session_request_cb cb,
+               gpointer user_data)
+{
+       INFO_MSG;
+
+       session_cb_v_table.session_request.cb = cb;
+       session_cb_v_table.session_request.user_data = user_data;
+       return TRUE;
+}
+
+gboolean asp_session_set_session_config_request_cb(
+       asp_session_session_config_request_cb cb, gpointer user_data)
+{
+       INFO_MSG;
+
+       session_cb_v_table.session_config_request.cb = cb;
+       session_cb_v_table.session_config_request.user_data = user_data;
+       return TRUE;
+}
+
+gboolean asp_session_set_connect_status_cb(asp_session_connect_status_cb cb,
+               gpointer user_data)
+{
+       INFO_MSG;
+
+       session_cb_v_table.connect_status.cb = cb;
+       session_cb_v_table.connect_status.user_data = user_data;
+       return TRUE;
+}
+
+gboolean asp_session_set_session_status_cb(asp_session_session_status_cb cb,
+               gpointer user_data)
+{
+       INFO_MSG;
+
+       session_cb_v_table.session_status.cb = cb;
+       session_cb_v_table.session_status.user_data = user_data;
+       return TRUE;
+}
+
+gboolean asp_session_set_port_status_cb(asp_session_port_status_cb cb,
+                                       gpointer user_data)
+{
+       INFO_MSG;
+
+       session_cb_v_table.port_status.cb = cb;
+       session_cb_v_table.port_status.user_data = user_data;
+       return TRUE;
+}
+
+gboolean asp_session_get_advertisement_id(guint8 *session_mac,
+               guint32 session_id, guint32 *advertisement_id)
+{
+       INFO_MSG;
+
+       asp_session_t *session = _get_exist_session(session_id, session_mac);
+       g_assert(session);
+
+       *advertisement_id = session->advertisement_id;
+
+       return TRUE;
+}
+
+gboolean asp_session_get_state(guint8 *session_mac, guint32 session_id,
+                              asp_session_status_e *state)
+{
+       INFO_MSG;
+
+       *state = _get_session_state(session_mac, session_id);
 
-       __ASP_LOG_FUNC_EXIT__;
-       return res;
+       return TRUE;
 }
 
-int asp_session_confirm_session(unsigned char *session_mac, int session_id, int confirm, const char *pin)
+gboolean asp_session_get_peer_endpoint(guint8 *session_mac, guint32 session_id,
+                                      gchar *peer_ip, guint16 *port)
 {
-       __ASP_LOG_FUNC_ENTER__;
-       asp_session_s *session = NULL;
-       int res = 0;
+       INFO_MSG;
+
+       asp_session_t *session = _get_exist_session(session_id, session_mac);
+       g_assert(session);
+
+       g_strlcpy(peer_ip, session->peer_ip, ASP_SESSION_IPV4_STR_LEN);
+
+       *port = g_asp_cordination_port;
+
+       return TRUE;
+}
+
+void asp_session_recv_req(GSocketAddress *sock_addr, gpointer p_msg)
+{
+       INFO_MSG;
+
+       asp_request_header_t *p_header = (asp_request_header_t *) p_msg;
 
-       session = asp_session_get_session(session_mac, session_id);
-       if (session == NULL) {
-               ASP_LOGE("There's no session");
-               return -1;
+       ASP_LOGD("%s asp_session_recv_req(), opcode:%d", ROLE, p_header->opcode);
+
+       asp_session_t *session = _get_exist_session(p_header->session_id,
+                                p_header->session_mac);
+
+       if (NULL == session && ASP_OPCODE_REQUEST_SESSION != p_header->opcode) {
+               /* in case of session not found for reqeust message */
+               /* NACK shall be sent */
+               _send_nack(sock_addr, p_header->seq_num, ASP_NACK_REASON_NO_SESSION_EXIST);
+               return;
        }
-       res = asp_tech_confirm_session(ASP_TECH_P2P, session_mac,
-                       session_id, confirm, pin);
-       if (res < 0) {
-               ASP_LOGE("confirm session is failed");
-               asp_state_set(session, ASP_SESSION_CLOESD, ASP_SESSION_CLOSE_SYSTEM_FAILURE, NULL);
-               asp_session_destroy(session_mac, session_id);
-               return -1;
+
+       switch (p_header->opcode) {
+       case ASP_OPCODE_REQUEST_SESSION: {
+                       gchar peer_ip[ASP_SESSION_IPV4_STR_LEN];
+                       _get_ip_from_socketaddress(sock_addr, peer_ip);
+
+                       /* how to handle a case of that a same session is exist in Tree */
+                       if (session == NULL)
+                               session = _new_session_by_request_session(sock_addr, peer_ip, p_msg);
+
+                       g_assert(session);
+
+                       _send_ack(sock_addr, p_header->seq_num);
+
+                       gfsm_process_event(&session->context,
+                                          gfsm_create_event(SESSION_EVENT_REQUEST_SESSION_RECEIVED,
+                                                            _asp_session_dup_reqeust_session(p_msg), g_free));
+               }
+               break;
+       case ASP_OPCODE_ADDED_SESSION:
+               _send_ack(sock_addr, p_header->seq_num);
+               gfsm_process_event(&session->context,
+                                  gfsm_create_event(SESSION_EVENT_ADDED_SESSION_RECEIVED, NULL,
+                                                    NULL /*_asp_session_dup_added_session(p_msg), g_free*/));
+               break;
+       case ASP_OPCODE_REJECTED_SESSION:
+               _send_ack(sock_addr, p_header->seq_num);
+               gfsm_process_event(&session->context,
+                                  gfsm_create_event(SESSION_EVENT_REJECTED_SESSION_RECEIVED, NULL, NULL));
+               break;
+       case ASP_OPCODE_REMOVE_SESSION:
+               _send_ack(sock_addr, p_header->seq_num);
+               gfsm_process_event(&session->context,
+                                  gfsm_create_event(SESSION_EVENT_REMOVE_SESSION_RECEIVED,
+                                                    &((asp_remove_session_t *) p_msg)->reason, NULL));
+               break;
+       case ASP_OPCODE_ALLOWED_PORT:
+               _send_ack(sock_addr, p_header->seq_num);
+               gfsm_process_event(&session->context,
+                                  gfsm_create_event(SESSION_EVENT_ALLOWED_PORT_RECEIVED,
+                                                    _asp_session_dup_allowed_session(p_msg), g_free));
+               break;
+       case ASP_OPCODE_DEFERRED_SESSION:
+               _send_ack(sock_addr, p_header->seq_num);
+               gfsm_process_event(&session->context,
+                                  gfsm_create_event(SESSION_EVENT_DEFERRED_SESSION_RECEIVED, NULL, NULL));
+               break;
+
+       case ASP_OPCODE_ACK:
+       case ASP_OPCODE_NACK:
+       case ASP_OPCODE_VERSION:
+               /* VERSION message is handled by asp-sess-peer */
+               /* ANK & NACK is handled by asp_session_recv_ack() & asp_session_recv_nack() in asp-session */
+               break;
+       default:
+               /* error case */
+               break;
        }
+}
+
+void asp_session_recv_ack(GSocketAddress *sock_addr, guint8 *session_mac,
+                         guint32 session_id, gpointer p_msg)
+{
+       INFO_MSG;
 
-       __ASP_LOG_FUNC_EXIT__;
-       return res;
+       ASP_LOGD("%s asp_session_recv_ack: session_id:%d, session_mac[0]:%x", ROLE,
+                session_id, session_mac[0]);
+       asp_session_t *session = _get_exist_session(session_id, session_mac);
+       g_assert(session);
+
+       gfsm_process_event(&session->context,
+                          gfsm_create_event(SESSION_EVENT_ACK_RECEIVED, NULL, NULL));
 }
 
-asp_session_s *asp_session_get_session(unsigned char *session_mac, int session_id)
+void asp_session_recv_nack(GSocketAddress *sock_addr, guint8 *session_mac,
+                          guint32 session_id, gpointer data)
 {
-       __ASP_LOG_FUNC_ENTER__;
-       GList *list;
-       asp_session_s *session = NULL;
+       INFO_MSG;
 
-       for (list = g_sessions; list != NULL; list = list->next) {
-               session = list->data;
-               if (session != NULL) {
-                       if (session->session_id == session_id &&
-                                       memcmp(session->session_mac, session_mac, MAC_LEN)) {
-                               break;
-                       }
-               }
-               session = NULL;
+       asp_session_t *session = _get_exist_session(session_id, session_mac);
+       g_assert(session);
+
+       gfsm_process_event(&session->context,
+                          gfsm_create_event(SESSION_EVENT_NACK_RECEIVED, NULL, NULL));
+}
+
+void asp_session_peer_destroyed(guint8 *session_mac, guint32 session_id)
+{
+       INFO_MSG;
+
+       /*_remove_session(session_mac, session_id); */
+       asp_session_t *session = _get_exist_session(session_id, session_mac);
+       gfsm_process_event(&session->context,
+                          gfsm_create_event(SESSION_EVENT_PEER_DESTROYED, NULL, NULL));
+}
+
+/*****************************************************************************
+ * Local Function Definition
+ *****************************************************************************/
+
+gboolean _send_request_session(asp_session_t *session, guint8 *session_info,
+                              size_t session_info_len)
+{
+       INFO_MSG;
+
+       asp_request_session_t request_session_data;
+
+       request_session_data.opcode = ASP_OPCODE_REQUEST_SESSION;
+       memcpy(request_session_data.session_mac, session->session_mac, MAC_ADDRESS_LEN);
+       request_session_data.session_id = session->session_id;
+       request_session_data.advertisement_id = session->advertisement_id;
+       if (session_info) {
+               request_session_data.session_information_length = MIN(ASP_SESSION_INFO_BYTE_MAX,
+                               session_info_len);
+               memcpy(request_session_data.session_information, session_info,
+                      session_info_len);
+       } else
+               request_session_data.session_information_length = 0;
+
+       return asp_sess_peer_send_msg(session->sock_addr,
+                                     (gpointer)&request_session_data);
+}
+
+gboolean _send_remove_session(asp_session_t *session, guint8 remove_reason)
+{
+       INFO_MSG;
+
+       asp_remove_session_t remove_session_data;
+
+       remove_session_data.opcode = ASP_OPCODE_REMOVE_SESSION;
+       memcpy(remove_session_data.session_mac, session->session_mac, MAC_ADDRESS_LEN);
+       remove_session_data.session_id = session->session_id;
+       remove_session_data.reason = remove_reason;
+
+       return asp_sess_peer_send_msg(session->sock_addr,
+                                     (gpointer)&remove_session_data);
+}
+
+gboolean _send_reject_session(asp_session_t *session)
+{
+       INFO_MSG;
+
+       asp_rejected_session_t rejected_session_data;
+       rejected_session_data.opcode = ASP_OPCODE_REJECTED_SESSION;
+       memcpy(rejected_session_data.session_mac, session->session_mac,
+              MAC_ADDRESS_LEN);
+       rejected_session_data.session_id = session->session_id;
+
+       return asp_sess_peer_send_msg(session->sock_addr,
+                                     (gpointer)&rejected_session_data);
+}
+
+gboolean _send_added_session(asp_session_t *session)
+{
+       INFO_MSG;
+
+       asp_added_session_t add_session_data;
+       add_session_data.opcode = ASP_OPCODE_ADDED_SESSION;
+       memcpy(add_session_data.session_mac, session->session_mac, MAC_ADDRESS_LEN);
+       add_session_data.session_id = session->session_id;
+
+       return asp_sess_peer_send_msg(session->sock_addr, (gpointer)&add_session_data);
+}
+
+gboolean _send_deferred_session(asp_session_t *session,
+                               guint8 *deferred_response, size_t length)
+{
+       INFO_MSG;
+
+       asp_deferred_session_t deferred_session_data;
+       deferred_session_data.opcode = ASP_OPCODE_DEFERRED_SESSION;
+       memcpy(deferred_session_data.session_mac, session->session_mac,
+              MAC_ADDRESS_LEN);
+       deferred_session_data.session_id = session->session_id;
+       deferred_session_data.deferred_session__response_length = length;
+       memcpy(deferred_session_data.deferred_session__response, deferred_response,
+              length);
+
+       return asp_sess_peer_send_msg(session->sock_addr,
+                                     (gpointer)&deferred_session_data);
+}
+
+gboolean _send_allowed_port(asp_session_t *session, guint16 port,
+                           guint8 protocol)
+{
+       INFO_MSG;
+
+       asp_allowed_port_t allowed_port_data;
+       allowed_port_data.opcode = ASP_OPCODE_ALLOWED_PORT;
+       memcpy(allowed_port_data.session_mac, session->session_mac, MAC_ADDRESS_LEN);
+       allowed_port_data.session_id = session->session_id;
+       allowed_port_data.port = port;
+       allowed_port_data.proto = protocol;
+
+       return asp_sess_peer_send_msg(session->sock_addr, (gpointer)&allowed_port_data);
+}
+
+gboolean _send_nack(GSocketAddress *sock_addr, guint8 seq_num, guint8 reason)
+{
+       INFO_MSG;
+
+       asp_nack_t nack_data;
+       nack_data.opcode = ASP_OPCODE_NACK;
+       nack_data.seq_num = seq_num;
+       nack_data.reason = reason;
+
+       return asp_sess_peer_send_msg(sock_addr, (gpointer)&nack_data);
+}
+
+gboolean _send_ack(GSocketAddress *sock_addr, guint8 seq_num)
+{
+       INFO_MSG;
+
+       asp_nack_t ack_data;
+       ack_data.opcode = ASP_OPCODE_ACK;
+       ack_data.seq_num = seq_num;
+
+       return asp_sess_peer_send_msg(sock_addr, (gpointer)&ack_data);
+}
+
+void _session_tree_value_destoryed(gpointer data)
+{
+       INFO_MSG;
+
+       asp_session_t *session = (asp_session_t *) data;
+
+       /* terminate gfsm context */
+       gfsm_terminate_context(&session->context);
+
+       if (session->sock_addr) {
+               g_object_unref(session->sock_addr);
+               session->sock_addr = NULL;
        }
 
-       __ASP_LOG_FUNC_EXIT__;
-       return session;
+       g_free(session);
+       session = NULL;
 }
 
-void asp_session_set_session_ready(unsigned char *session_mac, int session_id)
+void _session_tree_key_destoryed(gpointer data)
 {
-       __ASP_LOG_FUNC_ENTER__;
+       INFO_MSG;
 
-       __ASP_LOG_FUNC_EXIT__;
-       return;
+       asp_session_key_t *key = (asp_session_key_t *) data;
+
+       g_free(key);
+}
+
+gint _session_tree_compare_func(gconstpointer a, gconstpointer b)
+{
+       INFO_MSG;
+
+       asp_session_key_t *s1 = (asp_session_key_t *) a;
+       asp_session_key_t *s2 = (asp_session_key_t *) b;
+
+       /* ascending sort */
+       if (s1->session_id != s2->session_id) {
+               ASP_LOGD("%s s1-id:%d, s2-id:%d", ROLE, s1->session_id, s2->session_id);
+               return s1->session_id - s2->session_id;
+       } else
+               return memcmp(s1->session_mac, s2->session_mac, MAC_ADDRESS_LEN);
 }
 
-int asp_session_close_session(unsigned char *session_mac, int session_id)
+void _call_session_request_cb(gint32 error_code, guint8 *session_mac,
+                             guint32 session_id, guint32 advertisement_id, gchar *device_name,
+                             size_t name_length, guint8 *session_info, size_t info_length, gboolean get_pin,
+                             guint32 pin)
 {
-       __ASP_LOG_FUNC_ENTER__;
-       asp_session_s *session = NULL;
-       int res = 0;
+       INFO_MSG;
 
-       session = asp_session_get_session(session_mac, session_id);
-       if (session == NULL) {
-               ASP_LOGE("There's no session");
-               return -1;
+       if (NULL == session_cb_v_table.session_request.cb) {
+               /* a callback have not been registered yet */
+               return;
        }
 
-       asp_state_set(session, ASP_SESSION_CLOESD, ASP_SESSION_CLOSE_LOCAL_CLOSE, NULL);
-       asp_session_destroy(session->session_mac, session->session_id);
-       __ASP_LOG_FUNC_EXIT__;
-       return res;
+       session_cb_v_table.session_request.cb(error_code, session_mac, session_id,
+                                             advertisement_id, device_name, name_length, session_info, info_length, get_pin,
+                                             pin, session_cb_v_table.session_request.user_data);
 }
 
-int asp_session_receive_request_session(void *data)
+void _call_session_config_request_cb(gint32 error_code, guint8 *session_mac,
+                                    guint32 session_id, gboolean get_pin, guint32 pin)
 {
-       __ASP_LOG_FUNC_ENTER__;
-       asp_s *asp = NULL;
-       asp_session_s *session = NULL;
-       asp_event_data *event = data;
-       unsigned char session_mac[MAC_LEN] = {0,};
-       int res = 0;
+       INFO_MSG;
 
-       asp = asp_get_manager();
-       if (asp == NULL) {
-               ASP_LOGE("memory allocation for session is failed");
-               return -1;
+       if (NULL == session_cb_v_table.session_config_request.cb) {
+               /* a callback have not been registered yet */
+               return;
        }
 
-       macaddr_atoe(event->session_request.session_mac, session_mac);
-       session = asp_session_create(session_mac, event->session_request.session_id,
-                       event->session_request.advertisement_id);
-       if (session == NULL) {
-               ASP_LOGE("memory allocation for session is failed");
-               return -1;
+       session_cb_v_table.session_config_request.cb(error_code, session_mac,
+                       session_id, get_pin, pin, session_cb_v_table.session_config_request.user_data);
+}
+
+void _call_port_status_cb(gint32 error_code, const guint8 *session_mac,
+                         guint32 session_id, const gchar *peer_ip, guint16 port, guint8 protocol,
+                         asp_session_port_status_e status)
+{
+       INFO_MSG;
+
+       if (NULL == session_cb_v_table.port_status.cb) {
+               /* a callback have not been registered yet */
+               return;
        }
 
-       /* make local p2p address as service mac */
-       memcpy(session->service_mac, asp->p2p_local_address, MAC_LEN);
+       session_cb_v_table.port_status.cb(error_code, session_mac, session_id, peer_ip,
+                                         port, protocol, status, session_cb_v_table.port_status.user_data);
+}
+
+void _call_session_status_cb(gint32 error_code, guint8 *session_mac,
+                            guint32 session_id, asp_session_closed_state_e closed_state)
+{
+       INFO_MSG;
 
-       asp_manager_gdbus_notify_session_request(event->session_request.advertisement_id,
-                       event->session_request.session_id, event->session_request.session_mac,
-                       event->session_request.device_name, event->session_request.session_info,
-                       event->session_request.get_pin, event->session_request.pin);
+       g_assert(session_cb_v_table.session_status.cb);
 
-       asp_state_set(session, ASP_SESSION_REQUESTED, 0, "PDRequest");
+       asp_session_t *session = _get_exist_session(session_id, session_mac);
+       g_assert(session);
 
-       __ASP_LOG_FUNC_EXIT__;
-       return res;
+       session_cb_v_table.session_status.cb(error_code, session_mac, session_id,
+                                            _get_session_state(session_mac, session_id), closed_state,
+                                            SESSION_STATUS_ADDITIONAL_INFO, session_cb_v_table.session_status.user_data);
 }
 
-/* SessionConfigRequest event is triggered by the ASP on a Service Seeker */
-int asp_session_receive_session_config_request(void *data)
+void _call_connect_status_cb(gint32 error_code, guint8 *session_mac,
+                            guint32 session_id, asp_session_connect_status_e status)
 {
-       __ASP_LOG_FUNC_ENTER__;
-       asp_s *asp = NULL;
-       asp_session_s *session = NULL;
-       asp_event_data *event = data;
-       int res = 0;
+       INFO_MSG;
 
-       asp = asp_get_manager();
-       if (asp == NULL) {
-               ASP_LOGE("memory allocation for session is failed");
-               return -1;
-       }
+       g_assert(session_cb_v_table.session_status.cb);
 
-       /* session config request only received on seeker */
-       session = asp_session_get_session(asp->p2p_local_address, event->session_config_request.session_id);
-       if (session == NULL) {
-               ASP_LOGE("There's no session");
-               return -1;
-       }
+       asp_session_t *session = _get_exist_session(session_id, session_mac);
+       g_assert(session);
 
-       asp_manager_gdbus_notify_session_config_request(
-                       event->session_config_request.session_id,
-                       event->session_config_request.get_pin,
-                       event->session_config_request.pin);
+       /* temporary code */
+       /*what is deferred_resp ? */
+       guint8 *deferred_resp = NULL;
+       size_t length = 0;
+       /* temporary code */
 
-       __ASP_LOG_FUNC_EXIT__;
-       return res;
+       session_cb_v_table.connect_status.cb(error_code, session_mac, session_id,
+                                            status, deferred_resp, length, session_cb_v_table.connect_status.user_data);
 }
 
-int asp_session_receive_connect_status(void *data)
+gpointer _asp_session_dup_reqeust_session(gpointer p_msg)
 {
-       __ASP_LOG_FUNC_ENTER__;
-       asp_session_s *session = NULL;
-       asp_event_data *event = data;
-       unsigned char session_mac[MAC_LEN] = {0,};
-       int res = 0;
+       asp_request_session_t *p_dup_msg = (asp_request_session_t *) g_malloc(sizeof(
+                       asp_request_session_t));
+       memcpy(p_dup_msg, p_msg, sizeof(asp_request_session_t));
+       return (gpointer) p_dup_msg;
+}
 
-       macaddr_atoe(event->session_request.session_mac, session_mac);
-       session = asp_session_get_session(session_mac,
-                       event->connect_status.session_id);
-       if (session == NULL) {
-               ASP_LOGE("There's no session");
-               return -1;
-       }
+/*
+
+gpointer _asp_session_dup_added_session(gpointer p_msg)
+{
+    asp_added_session_t* p_dup_msg = (asp_added_session_t*)g_malloc(sizeof(asp_added_session_t));
+    memcpy(p_dup_msg, p_msg, sizeof(asp_added_session_t));
+    return (gpointer)p_dup_msg;
+}
 
-       /* set session status */
-       asp_state_set_sub(session, event->connect_status.status, event->connect_status.deferred);
+gpointer _asp_session_dup_rejected_session(gpointer p_msg)
+{
+    asp_rejected_session_t* p_dup_msg = (asp_rejected_session_t*)g_malloc(sizeof(asp_rejected_session_t));
+    memcpy(p_dup_msg, p_msg, sizeof(asp_rejected_session_t));
+    return (gpointer)p_dup_msg;
+}
 
-       switch (event->connect_status.status) {
-       case ASP_SESSION_ROLE_REJECTED:
-       case ASP_SESSION_NOMORE_CONNECT:
-       case ASP_SESSION_REQUEST_FAILED:
-       case ASP_GROUP_FORMATION_FAILED:
-               asp_state_set(session, ASP_SESSION_CLOESD, ASP_SESSION_CLOSE_LOCAL_CLOSE, NULL);
-               asp_session_destroy(session->session_mac, session->session_id);
-       }
+gpointer _asp_session_dup_remove_session(gpointer p_msg)
+{
+    asp_remove_session_t* p_dup_msg = (asp_remove_session_t*)g_malloc(sizeof(asp_remove_session_t));
+    memcpy(p_dup_msg, p_msg, sizeof(asp_remove_session_t));
+    return (gpointer)p_dup_msg;
+}
+
+gpointer _asp_session_dup_deferred_session(gpointer p_msg)
+{
+    asp_deferred_session_t* p_dup_msg = (asp_deferred_session_t*)g_malloc(sizeof(asp_deferred_session_t));
+    memcpy(p_dup_msg, p_msg, sizeof(asp_deferred_session_t));
+    return (gpointer)p_dup_msg;
+}
+*/
+
+gpointer _asp_session_dup_allowed_session(gpointer p_msg)
+{
+       INFO_MSG;
+
+       asp_allowed_port_t *p_dup_msg = (asp_allowed_port_t *) g_malloc(sizeof(
+                                               asp_allowed_port_t));
+       memcpy(p_dup_msg, p_msg, sizeof(asp_allowed_port_t));
+       return (gpointer) p_dup_msg;
+}
+
+guint32 _alloc_session_id()
+{
+       static guint32 g_session_id = 0;
+       return g_session_id++;
+}
+
+asp_session_status_e _get_session_state(guint8 *session_mac, guint32 session_id)
+{
+       INFO_MSG;
+
+       asp_session_status_e ret = ASP_SESSION_STATE_ERROR;
+
+       asp_session_t *session = _get_exist_session(session_id, session_mac);
+       g_assert(session);
+
+       gfsm_state_id_t current_state = gfsm_get_current_state_id(&session->context);
+       switch (current_state) {
+       case SESSION_STATE_CLOSED:
+       case SESSION_STATE_RUNNING:
+               ret = ASP_SESSION_STATE_CLOSED;
+               break;
+       case SESSION_STATE_REQUEST_SESSION_SENT:
+               ret = ASP_SESSION_STATE_INITIATED;
+               break;
+       case SESSION_STATE_OPEN:
+       case SESSION_STATE_REMOVE_SESSION_SENT:
+               ret = ASP_SESSION_STATE_OPEN;
+               break;
+       case SESSION_STATE_REQUEST_SESSION_RECEIVED:
+       /*case SESSION_STATE_DEFERRED_SESSION_SENT: */
+       case SESSION_STATE_REJECT_SESSION_SENT:
+               ret = ASP_SESSION_STATE_REQUESTED;
+               break;
+       default:
+               ret = ASP_SESSION_STATE_ERROR;
+       }
+
+       ASP_LOGD("%s _get_session_state() session_state : %d", ROLE, ret);
+
+       return ret;
+}
+
+asp_session_t *_new_session_by_request_session(GSocketAddress *sock_addr,
+               const gchar *peer_ip, gpointer p_msg)
+{
+       INFO_MSG;
+
+       asp_session_t *session = NULL;
+       asp_request_session_t *p_req_session = (asp_request_session_t *) p_msg;
+       g_assert(p_req_session);
+
+       session = _new_session_over_infra(p_req_session->session_mac,
+                                         p_req_session->session_id, ASP_ROLE_ADVERTIZER, p_req_session->advertisement_id,
+                                         sock_addr, peer_ip);
+
+       return session;
+}
+
+asp_session_t *_new_session_over_infra(guint8 *session_mac, guint32 session_id,
+                                      asp_role_e asp_role, guint32 advertisement_id, GSocketAddress *sock_addr,
+                                      const gchar *peer_ip)
+{
+       INFO_MSG;
+
+       asp_session_t *session = NULL;
+
+       session = (asp_session_t *) g_malloc0(sizeof(asp_session_t));
+
+       session->asp_role = asp_role;
+
+       memcpy(session->session_mac, session_mac, MAC_ADDRESS_LEN);
+       session->session_id = session_id;
+       session->advertisement_id = advertisement_id, g_strlcpy(session->peer_ip,
+                                   peer_ip, ASP_SESSION_IPV4_STR_LEN);
+
+       if (NULL == sock_addr)          /* seeker side */
+               session->sock_addr = g_inet_socket_address_new_from_string(peer_ip,
+                                    (guint) g_asp_cordination_port);
+       else                                            /* advertiser side */
+               session->sock_addr = g_object_ref(sock_addr);
+       /*session->sock_family = G_SOCKET_FAMILY_IPV4; // temporary */
+       session->over_p2p = FALSE;
+
+       gfsm_init_context(&(session->context), &session_fsm,
+                         _asp_session_destroy_session, session);
+
+       _insert_session(session);
+
+       return session;
+}
+
+asp_session_t *_new_session_over_p2p(const guint8 *session_mac,
+                                    guint32 session_id, asp_role_e asp_role, const guint8 *service_mac,
+                                    guint32 advertisement_id)
+{
+       INFO_MSG;
+
+       asp_session_t *session = NULL;
+
+       session = (asp_session_t *) g_malloc0(sizeof(asp_session_t));
+
+       memcpy(session->session_mac, session_mac, MAC_ADDRESS_LEN);
+       session->session_id = session_id;
+
+       session->asp_role = asp_role;
+
+       memcpy(session->service_mac, service_mac, MAC_ADDRESS_LEN);
+       session->advertisement_id = advertisement_id;
+       /* temporal code session->sock_family = G_SOCKET_FAMILY_IPV4; */
+       session->over_p2p = TRUE;
+
+       gfsm_init_context(&(session->context), &session_fsm,
+                         _asp_session_destroy_session, session);
+
+       _insert_session(session);
+
+       return session;
+}
+
+asp_session_t *_new_session_from_session_request(const guint8 *session_mac,
+               guint32 session_id, guint32 advertisement_id)
+{
+       INFO_MSG;
+
+       asp_session_t *session = NULL;
+
+       session = (asp_session_t *) g_malloc0(sizeof(asp_session_t));
+
+       memcpy(session->session_mac, session_mac, MAC_ADDRESS_LEN);
+       session->session_id = session_id;
+
+       session->asp_role = ASP_ROLE_ADVERTIZER;
+
+       memcpy(session->service_mac, g_my_p2p_mac, MAC_ADDRESS_LEN);
+       session->advertisement_id = advertisement_id,
+                /*session->sock_family = G_SOCKET_FAMILY_IPV4; // temporary */
+                session->over_p2p = TRUE;
+
+       gfsm_init_context(&(session->context), &session_fsm,
+                         _asp_session_destroy_session, session);
+
+       _insert_session(session);
+
+       return session;
+}
+
+void _store_peer_ip_addr(asp_session_t *session, gchar *peer_ip, size_t length)
+{
+       g_strlcpy(session->peer_ip, peer_ip, ASP_SESSION_IPV4_STR_LEN);
+       session->sock_addr = g_inet_socket_address_new_from_string(peer_ip,
+                            (guint) g_asp_cordination_port);
+}
+
+#ifdef HAVE_ASP_P2P_CONN
+guint8 *_get_peer_mac(asp_session_t *session)
+{
+       if (session->asp_role == ASP_ROLE_ADVERTIZER)
+               return session->session_mac;
+       else
+               return session->service_mac;
+}
+#endif
+
+void _asp_session_destroy_session(gpointer p_context_data)
+{
+       INFO_MSG;
+
+       asp_session_t *session = (asp_session_t *) p_context_data;
+       _remove_session(session->session_mac, session->session_id);
+}
+
+void _remove_session(guint8 *session_mac, guint32 session_id)
+{
+       INFO_MSG;
+
+       g_tree_remove(sessionTree, _get_session_key(session_id, session_mac));
+       /* key & value pair in tree will be freed _session_tree_key_destoryed and _session_tree_value_destoryed */
+}
+
+asp_session_t *_get_exist_session(guint32 session_id, const guint8 *session_mac)
+{
+       INFO_MSG;
+       ASP_LOGD("%s _get_exist_session() session_id:%u, session_mac[0]:%x", ROLE,
+                session_id, session_mac[0]);
+
+       asp_session_t *session = NULL;
+
+       session = (asp_session_t *) g_tree_lookup(sessionTree,
+                       _get_session_key(session_id, session_mac));
+
+       return session;
+}
+
+asp_session_key_t *_get_session_key(guint32 session_id,
+                                   const guint8 *session_mac)
+{
+       INFO_MSG;
+
+       asp_session_key_t *key = (asp_session_key_t *) g_malloc(sizeof(
+                                        asp_session_key_t));
+       key->session_id = session_id;
+       memcpy(key->session_mac, session_mac, MAC_ADDRESS_LEN); /* 6 bytes */
+
+       return key;
+}
+
+void _insert_session(asp_session_t *session)
+{
+       INFO_MSG;
+
+       /* add a new session to hash table ( key - session_id, value - asp_session_t*) */
+       g_tree_insert(sessionTree, _get_session_key(session->session_id,
+                       session->session_mac), session);
+}
+
+void _get_ip_from_socketaddress(GSocketAddress *sock_addr, gchar *peer_ip)
+{
+       INFO_MSG;
+
+       GInetSocketAddress *inetaddr;
+       GInetAddress *hostaddr;
+
+       inetaddr = G_INET_SOCKET_ADDRESS(sock_addr);
+       hostaddr = g_inet_socket_address_get_address(inetaddr);
+
+       g_strlcpy(peer_ip, g_inet_address_to_string(hostaddr),
+                 ASP_SESSION_IPV4_STR_LEN);
+
+       ASP_LOGD("%s peer_ip: %s", ROLE, peer_ip);
+
+       /*g_object_unref(hostaddr); */
+       /*g_object_unref(inetaddr); */
+}
+
+/*****************************************************************************
+ * Local Function for state machine
+ *****************************************************************************/
+
+void _asp_session_fsm_init()
+{
+       INFO_MSG;
+
+       gfsm_init_fsm(&session_fsm, SESSION_STATE_MAX, SESSION_EVENT_MAX,
+                     SESSION_STATE_NONE);
+
+       gfsm_init_state(&session_state_none, SESSION_STATE_NONE, &session_fsm,
+                       _state_none_entry_action, _state_none_exit_action);
+       gfsm_add_reaction(&session_state_none, SESSION_EVENT_CONNECT_SESSION_CALLED,
+                         _state_none_reaction_connect_session_called);
+       gfsm_add_reaction(&session_state_none, SESSION_EVENT_REQUEST_SESSION_RECEIVED,
+                         _state_none_reaction_request_session_received);
+       gfsm_add_reaction(&session_state_none, SESSION_EVENT_SESSION_REQUEST_CALLED,
+                         _state_none_reaction_session_request_received);
+
+       gfsm_init_state(&session_state_closed, SESSION_STATE_CLOSED, &session_fsm,
+                       _state_closed_entry_action, _state_closed_exit_action);
+       /*gfsm_add_reaction(&session_state_closed, SESSION_EVENT_CONNECT_SESSION_CALLED, _state_closed_reaction_connect_session_called); */
+       /*gfsm_add_reaction(&session_state_closed, SESSION_EVENT_REQUEST_SESSION_RECEIVED, _state_closed_reaction_request_session_received); */
+       /*gfsm_add_reaction(&session_state_closed, SESSION_EVENT_SESSION_REQUEST_CALLED, _state_closed_reaction_session_request_received);  // ???? */
+
+       gfsm_init_state(&session_state_running, SESSION_STATE_RUNNING, &session_fsm,
+                       _state_running_entry_action, _state_running_exit_action);
+
+       gfsm_init_state(&session_state_l2connecting, SESSION_STATE_L2CONNECTING,
+                       &session_fsm, _state_l2connecting_entry_action,
+                       _state_l2connecting_exit_action);
+       gfsm_set_parent_state(&session_state_l2connecting, &session_state_running);
+       gfsm_add_reaction(&session_state_l2connecting,
+                         SESSION_EVENT_CLOSE_SESSION_CALLED,
+                         _state_l2connecting_reaction_close_session_called);
+       gfsm_add_reaction(&session_state_l2connecting, SESSION_EVENT_TIMEOUT,
+                         _state_l2connecting_reaction_timeout);
+
+       gfsm_init_state(&session_state_session_request_sent,
+                       SESSION_STATE_SESSION_REQUEST_SENT, &session_fsm,
+                       _state_session_request_sent_entry_action,
+                       _state_session_request_sent_exit_action);
+       gfsm_set_parent_state(&session_state_session_request_sent,
+                             &session_state_l2connecting);
+       gfsm_add_reaction(&session_state_session_request_sent,
+                         SESSION_EVENT_CONNECT_STATUS_CALLED,
+                         _state_session_request_sent_reaction_connect_status_called);
+       gfsm_add_reaction(&session_state_session_request_sent,
+                         SESSION_EVENT_SESSION_CONFIG_REQUEST_CALLED,
+                         _state_session_request_sent_reaction_session_config_request_called);
+
+       gfsm_init_state(&session_state_session_request_defered,
+                       SESSION_STATE_SESSION_REQUEST_DEFERED, &session_fsm,
+                       _state_session_request_defered_entry_action,
+                       _state_session_request_defered_exit_action);
+       gfsm_set_parent_state(&session_state_session_request_defered,
+                             &session_state_l2connecting);
+       gfsm_add_reaction(&session_state_session_request_defered,
+                         SESSION_EVENT_CONNECT_STATUS_CALLED,
+                         _state_session_request_defered_reaction_connect_status_called);
+       gfsm_add_reaction(&session_state_session_request_defered,
+                         SESSION_EVENT_SESSION_CONFIG_REQUEST_CALLED,
+                         _state_session_request_defered_reaction_session_config_request_called);
+
+       gfsm_init_state(&session_state_session_request_received,
+                       SESSION_STATE_SESSION_REQUEST_RECEIVED, &session_fsm,
+                       _state_session_request_received_entry_action,
+                       _state_session_request_received_exit_action);
+       gfsm_set_parent_state(&session_state_session_request_received,
+                             &session_state_l2connecting);
+       gfsm_add_reaction(&session_state_session_request_received,
+                         SESSION_EVENT_CONFIRM_SESSION_CALLED,
+                         _state_session_request_received_reaction_confirm_session_called);
+
+       gfsm_init_state(&session_state_session_request_accepted,
+                       SESSION_STATE_SESSION_REQUEST_ACCEPTED, &session_fsm,
+                       _state_session_request_accepted_entry_action,
+                       _state_session_request_accepted_exit_action);
+       gfsm_set_parent_state(&session_state_session_request_accepted,
+                             &session_state_l2connecting);
+       gfsm_add_reaction(&session_state_session_request_accepted,
+                         SESSION_EVENT_CONNECT_STATUS_CALLED,
+                         _state_session_request_accepted_reaction_connect_status_received);
+       gfsm_add_reaction(&session_state_session_request_accepted,
+                         SESSION_EVENT_SESSION_CONFIG_REQUEST_CALLED,
+                         _state_session_request_accepted_reaction_session_config_request_called);
+
+       gfsm_init_state(&session_state_entering_pin, SESSION_STATE_ENTERING_PIN,
+                       &session_fsm, _state_entering_pin_entry_action,
+                       _state_entering_pin_exit_action);
+       gfsm_set_parent_state(&session_state_entering_pin, &session_state_l2connecting);
+       gfsm_add_reaction(&session_state_entering_pin,
+                         SESSION_EVENT_CONFIRM_SESSION_CALLED,
+                         _state_entering_pin_reaction_confirm_session_called);
+
+       gfsm_init_state(&session_state_group_formation_completed,
+                       SESSION_STATE_GROUP_FORMATION_COMPLETED, &session_fsm,
+                       _state_group_formation_completed_entry_action,
+                       _state_group_formation_completed_exit_action);
+       gfsm_set_parent_state(&session_state_group_formation_completed,
+                             &session_state_l2connecting);
+       gfsm_add_reaction(&session_state_group_formation_completed,
+                         SESSION_EVENT_IP_ASSIGNED,
+                         _state_group_formation_completed_reaction_ip_assigned);
+       gfsm_add_reaction(&session_state_group_formation_completed,
+                         SESSION_EVENT_REQUEST_SESSION_RECEIVED,
+                         _state_group_formation_completed_reaction_request_session_received);
+
+       gfsm_init_state(&session_state_l2connected, SESSION_STATE_L2CONNECTED,
+                       &session_fsm, _state_l2connected_entry_action, _state_l2connected_exit_action);
+       gfsm_set_parent_state(&session_state_l2connected, &session_state_running);
+       gfsm_add_reaction(&session_state_l2connected,
+                         SESSION_EVENT_CLOSE_SESSION_CALLED,
+                         _state_l2connected_reaction_close_session_called);
+       gfsm_add_reaction(&session_state_l2connected,
+                         SESSION_EVENT_REMOVE_SESSION_RECEIVED,
+                         _state_l2connected_reaction_remove_session_received);
+       gfsm_add_reaction(&session_state_l2connected, SESSION_EVENT_PEER_DESTROYED,
+                         _state_l2connected_reaction_peer_destroyed);
+
+       gfsm_init_state(&session_state_request_session_sent,
+                       SESSION_STATE_REQUEST_SESSION_SENT, &session_fsm,
+                       _state_request_session_sent_entry_action,
+                       _state_request_session_sent_exit_action);
+       gfsm_set_parent_state(&session_state_request_session_sent,
+                             &session_state_l2connected);
+       gfsm_add_reaction(&session_state_request_session_sent,
+                         SESSION_EVENT_ADDED_SESSION_RECEIVED,
+                         _state_request_session_sent_reaction_added_session_received);
+       gfsm_add_reaction(&session_state_request_session_sent,
+                         SESSION_EVENT_DEFERRED_SESSION_RECEIVED,
+                         _state_request_session_sent_reaction_deferred_session_received);
+       gfsm_add_reaction(&session_state_request_session_sent,
+                         SESSION_EVENT_REJECTED_SESSION_RECEIVED,
+                         _state_request_session_sent_reaction_rejected_session_received);
+       gfsm_add_reaction(&session_state_request_session_sent, SESSION_EVENT_TIMEOUT,
+                         _state_request_session_sent_reaction_timeout);
+
+       gfsm_init_state(&session_state_request_session_received,
+                       SESSION_STATE_REQUEST_SESSION_RECEIVED, &session_fsm,
+                       _state_request_session_received_entry_action,
+                       _state_request_session_received_exit_action);
+       gfsm_set_parent_state(&session_state_request_session_received,
+                             &session_state_l2connected);
+       gfsm_add_reaction(&session_state_request_session_received,
+                         SESSION_EVENT_SET_SESSION_READY_CALLED,
+                         _state_request_session_received_reaction_set_session_ready_called);
+       gfsm_add_reaction(&session_state_request_session_received,
+                         SESSION_EVENT_DEFER_SESSION_CALLED,
+                         _state_request_session_received_reaction_defer_session_called);
+       gfsm_add_reaction(&session_state_request_session_received,
+                         SESSION_EVENT_CONFIRM_SESSION_CALLED,
+                         _state_request_session_received_reaction_confirm_session_called);
+
+       gfsm_init_state(&session_state_open, SESSION_STATE_OPEN, &session_fsm,
+                       _state_open_entry_action, _state_open_exit_action);
+       gfsm_set_parent_state(&session_state_open, &session_state_l2connected);
+       gfsm_add_reaction(&session_state_open, SESSION_EVENT_BOUND_PORT_CALLED,
+                         _state_open_reaction_bound_port_called);
+       gfsm_add_reaction(&session_state_open, SESSION_EVENT_ALLOWED_PORT_RECEIVED,
+                         _state_open_reaction_allowed_port_received);
+
+       gfsm_init_state(&session_state_reject_session_sent,
+                       SESSION_STATE_REJECT_SESSION_SENT, &session_fsm,
+                       _state_reject_session_sent_entry_action,
+                       _state_reject_session_sent_exit_action);
+       gfsm_add_reaction(&session_state_reject_session_sent,
+                         SESSION_EVENT_ACK_RECEIVED, _state_reject_session_sent_reaction_ack_received);
+       gfsm_add_reaction(&session_state_reject_session_sent,
+                         SESSION_EVENT_NACK_RECEIVED, _state_reject_session_sent_reaction_nack_received);
+
+       gfsm_init_state(&session_state_remove_session_sent,
+                       SESSION_STATE_REMOVE_SESSION_SENT, &session_fsm,
+                       _state_remove_session_sent_entry_action,
+                       _state_remove_session_sent_exit_action);
+       gfsm_add_reaction(&session_state_remove_session_sent,
+                         SESSION_EVENT_ACK_RECEIVED, _state_remove_session_sent_reaction_ack_received);
+       gfsm_add_reaction(&session_state_remove_session_sent,
+                         SESSION_EVENT_NACK_RECEIVED, _state_remove_session_sent_reaction_nack_received);
+
+       gfsm_add_state(&session_fsm, &session_state_none);
+       gfsm_add_state(&session_fsm, &session_state_closed);
+       gfsm_add_state(&session_fsm, &session_state_running);
+
+       gfsm_add_state(&session_fsm, &session_state_l2connecting);
+       gfsm_add_state(&session_fsm, &session_state_session_request_sent);
+       gfsm_add_state(&session_fsm, &session_state_session_request_defered);
+       gfsm_add_state(&session_fsm, &session_state_session_request_received);
+       gfsm_add_state(&session_fsm, &session_state_session_request_accepted);
+       gfsm_add_state(&session_fsm, &session_state_group_formation_completed);
+
+       gfsm_add_state(&session_fsm, &session_state_l2connected);
+       gfsm_add_state(&session_fsm, &session_state_request_session_sent);
+       gfsm_add_state(&session_fsm, &session_state_request_session_received);
+       gfsm_add_state(&session_fsm, &session_state_open);
+
+       gfsm_add_state(&session_fsm, &session_state_reject_session_sent);
+       gfsm_add_state(&session_fsm, &session_state_remove_session_sent);
+}
+
+void _asp_session_fsm_terminate()
+{
+       INFO_MSG;
+       gfsm_terminate_state(&session_state_none);
+       gfsm_terminate_state(&session_state_closed);
+       gfsm_terminate_state(&session_state_running);
+       gfsm_terminate_state(&session_state_request_session_sent);
+       gfsm_terminate_state(&session_state_request_session_received);
+       gfsm_terminate_state(&session_state_open);
+       gfsm_terminate_state(&session_state_reject_session_sent);
+       gfsm_terminate_state(&session_state_remove_session_sent);
+
+       gfsm_terminate_fsm(&session_fsm);
+}
+
+void _state_none_entry_action(gpointer p_context_data)
+{
+       INFO_MSG;
+}
+
+void _state_none_exit_action(gpointer p_context_data)
+{
+       INFO_MSG;
+}
+
+gfsm_state_id_t _state_none_reaction_request_session_received(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+       asp_session_t *session = (asp_session_t *) p_context_data;
+       asp_request_session_t *p_msg = (asp_request_session_t *) p_event_data;
+
+       _call_session_request_cb(0, session->session_mac, session->session_id,
+                                session->advertisement_id, NULL, 0, p_msg->session_information,
+                                p_msg->session_information_length, 0, 0);
+
+       return SESSION_STATE_REQUEST_SESSION_RECEIVED;
+}
+
+gfsm_state_id_t _state_none_reaction_connect_session_called(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       asp_session_t *session = (asp_session_t *) p_context_data;
+       connect_session_param_t *p_connect_session = (connect_session_param_t *)
+                       p_event_data;
+
+       g_assert(session);
+
+       if (session->over_p2p
+#ifdef HAVE_ASP_P2P_CONN
+           && FALSE == asp_p2p_conn_peer_is_connected(p_connect_session->service_mac)
+#endif
+          ) {
+#ifdef HAVE_ASP_P2P_CONN
+               asp_p2p_conn_connect_session(session->session_mac, session->session_id,
+                                            p_connect_session->service_mac, session->advertisement_id,
+                                            p_connect_session->session_info, p_connect_session->info_length,
+                                            p_connect_session->network_role, p_connect_session->network_config);
+#endif
+               return SESSION_STATE_SESSION_REQUEST_SENT;
+       } else {
+               _send_request_session(session, p_connect_session->session_info,
+                                     p_connect_session->info_length);
+               return SESSION_STATE_REQUEST_SESSION_SENT;
+       }
+}
+
+gfsm_state_id_t _state_none_reaction_session_request_received(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       asp_session_t *session = (asp_session_t *) p_context_data;
+       session_request_param_t *p_session_request = (session_request_param_t *)
+                       p_event_data;
+
+       _call_session_request_cb(0, session->session_mac, session->session_id,
+                                session->advertisement_id, p_session_request->device_name,
+                                p_session_request->name_length, p_session_request->session_info,
+                                p_session_request->info_length, p_session_request->get_pin,
+                                p_session_request->pin);
+
+       return SESSION_STATE_SESSION_REQUEST_RECEIVED;
+}
+
+void _state_closed_entry_action(gpointer p_context_data)
+{
+       INFO_MSG;
+
+       asp_session_t *session = (asp_session_t *) p_context_data;
+
+       g_assert(session);
+
+       asp_sess_peer_del_session(session->sock_addr, session->session_mac,
+                                 session->session_id);
+
+       gfsm_terminate_context(&session->context);
+}
+
+void _state_closed_exit_action(gpointer p_context_data)
+{
+       INFO_MSG;
+
+}
+
+#if 0
+gfsm_state_id_t _state_closed_reaction_connect_session_called(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       /*asp_session_t* session = (asp_session_t*)p_context_data; */
+
+       /*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); */
+
+       /*_send_request_session(session); */
+
+       return SESSION_STATE_REQUEST_SESSION_SENT;
+}
+
+gfsm_state_id_t _state_closed_reaction_request_session_received(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       return SESSION_STATE_REQUEST_SESSION_RECEIVED;
+}
+#endif
+
+void _state_running_entry_action(gpointer p_context_data)
+{
+       INFO_MSG;
+}
+
+void _state_running_exit_action(gpointer p_context_data)
+{
+       INFO_MSG;
+}
+
+void _state_l2connecting_entry_action(gpointer p_context_data)
+{
+       INFO_MSG;
+}
+
+void _state_l2connecting_exit_action(gpointer p_context_data)
+{
+       INFO_MSG;
+}
+
+gfsm_state_id_t _state_l2connecting_reaction_close_session_called(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+#ifdef HAVE_ASP_P2P_CONN
+       asp_session_t *session = (asp_session_t *) p_context_data;
+       asp_p2p_conn_disconnect_p2p(_get_peer_mac(session));
+#endif
+       return SESSION_STATE_CLOSED;
+}
+
+gfsm_state_id_t _state_l2connecting_reaction_timeout(gpointer p_context_data,
+               gpointer p_event_data)
+{
+       INFO_MSG;
+#ifdef HAVE_ASP_P2P_CONN
+       asp_session_t *session = (asp_session_t *) p_context_data;
+       asp_p2p_conn_disconnect_p2p(_get_peer_mac(session));
+#endif
+       return SESSION_STATE_CLOSED;
+}
+
+void _state_session_request_sent_entry_action(gpointer p_context_data)
+{
+       INFO_MSG;
+
+       /*asp_session_t* session = (asp_session_t*)p_context_data; */
+       /*_start_timer(...); */
+}
+
+void _state_session_request_sent_exit_action(gpointer p_context_data)
+{
+       INFO_MSG;
+       /*_stop_timer(...); */
+}
+
+gfsm_state_id_t _state_session_request_sent_reaction_connect_status_called(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       connect_status_param_t *p_connect_status = (connect_status_param_t *)
+                       p_event_data;
+       asp_session_t *session = (asp_session_t *) p_context_data;
+
+       _call_connect_status_cb(0 /*?? */ , session->session_mac, session->session_id,
+                               p_connect_status->status);
+
+       switch (p_connect_status->status) {
+       case ASP_SESSION_CONNECT_STATUS_NETWORK_ROLE_REJECTED:
+               return SESSION_STATE_CLOSED;
+               break;
+       case ASP_SESSION_CONNECT_STATUS_NO_MORE_CONNECTION:
+               return SESSION_STATE_CLOSED;
+               break;
+       case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_ACCEPTED:
+               return SESSION_STATE_SESSION_REQUEST_ACCEPTED;
+               break;
+       case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_DEFFERED:
+               return SESSION_STATE_SESSION_REQUEST_DEFERED;
+               break;
+       case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_FAILED:
+               return SESSION_STATE_CLOSED;
+               break;
+       case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_SENT:   /*Fall through */
+       case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_RECEIVED:       /*Fall through */
+       /*case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_STARTED: */
+       /*case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_COMPLETED:  // ???? */
+       /*case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_FAILED: */
+       default:
+               return GFSM_DISCARD_EVENT;
+               break;
+       }
+}
+
+gfsm_state_id_t
+_state_session_request_sent_reaction_session_config_request_called(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       asp_session_t *session = (asp_session_t *) p_context_data;
+       session_config_request_param_t *p_config_request_param =
+               (session_config_request_param_t *) p_event_data;
+       g_assert(p_config_request_param);
+
+       _call_session_config_request_cb(0, session->session_mac, session->session_id,
+                                       p_config_request_param->get_network_config_pin,
+                                       p_config_request_param->network_config_pin);
+
+       if (p_config_request_param->get_network_config_pin)
+               return SESSION_STATE_ENTERING_PIN;
+
+       return GFSM_DISCARD_EVENT;
+}
+
+void _state_session_request_defered_entry_action(gpointer p_context_data)
+{
+       INFO_MSG;
+       /*_start_timer(...); */
+}
+
+void _state_session_request_defered_exit_action(gpointer p_context_data)
+{
+       INFO_MSG;
+       /*_stop_timer(...); */
+}
+
+gfsm_state_id_t _state_session_request_defered_reaction_connect_status_called(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       connect_status_param_t *p_connect_status = (connect_status_param_t *)
+                       p_event_data;
+       asp_session_t *session = (asp_session_t *) p_context_data;
+
+       _call_connect_status_cb(0 /*?? */ , session->session_mac, session->session_id,
+                               p_connect_status->status);
+
+       switch (p_connect_status->status) {
+       case ASP_SESSION_CONNECT_STATUS_NETWORK_ROLE_REJECTED:
+               return SESSION_STATE_CLOSED;
+               break;
+       case ASP_SESSION_CONNECT_STATUS_NO_MORE_CONNECTION:
+               return SESSION_STATE_CLOSED;
+               break;
+       case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_ACCEPTED:
+               return SESSION_STATE_SESSION_REQUEST_ACCEPTED;
+               break;
+       case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_FAILED:
+               return SESSION_STATE_CLOSED;
+               break;
+       case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_SENT:   /*Fall through */
+       case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_RECEIVED:       /*Fall through */
+       case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_DEFFERED:
+       /*case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_STARTED: */
+       /*case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_COMPLETED:  // ???? */
+       /*case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_FAILED: */
+       default:
+               return GFSM_DISCARD_EVENT;
+               break;
+       }
+}
+
+gfsm_state_id_t
+_state_session_request_defered_reaction_session_config_request_called(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       asp_session_t *session = (asp_session_t *) p_context_data;
+       session_config_request_param_t *p_config_request_param =
+               (session_config_request_param_t *) p_event_data;
+       g_assert(p_config_request_param);
+
+       _call_session_config_request_cb(0, session->session_mac, session->session_id,
+                                       p_config_request_param->get_network_config_pin,
+                                       p_config_request_param->network_config_pin);
+
+       if (p_config_request_param->get_network_config_pin)
+               return SESSION_STATE_ENTERING_PIN;
+
+       return GFSM_DISCARD_EVENT;
+}
+
+void _state_session_request_received_entry_action(gpointer p_context_data)
+{
+       INFO_MSG;
+       /*_start_timer(..); */
+}
+
+void _state_session_request_received_exit_action(gpointer p_context_data)
+{
+       INFO_MSG;
+       /*_stop_timer(..); */
+}
+
+gfsm_state_id_t _state_session_request_received_reaction_confirm_session_called(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+#ifdef HAVE_ASP_P2P_CONN
+       asp_session_t *session = (asp_session_t *) p_context_data;
+#endif
+       confirm_session_param_t *p_confirm_session = (confirm_session_param_t *)
+                       p_event_data;
+       g_assert(p_confirm_session);
+
+#ifdef HAVE_ASP_P2P_CONN
+       asp_p2p_conn_confirm_session(session->session_mac, session->session_id,
+                                    p_confirm_session->confirmed, p_confirm_session->pin);
+#endif
+
+       if (p_confirm_session->confirmed)
+               return SESSION_STATE_SESSION_REQUEST_ACCEPTED;
+       else
+               return SESSION_STATE_CLOSED;
+}
+
+void _state_session_request_accepted_entry_action(gpointer p_context_data)
+{
+       INFO_MSG;
+       /*_start_timer(...) */
+}
+
+void _state_session_request_accepted_exit_action(gpointer p_context_data)
+{
+       INFO_MSG;
+       /*_stop_timer(...) */
+}
+
+gfsm_state_id_t
+_state_session_request_accepted_reaction_connect_status_received(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       connect_status_param_t *p_connect_status = (connect_status_param_t *)
+                       p_event_data;
+       asp_session_t *session = (asp_session_t *) p_context_data;
+
+       _call_connect_status_cb(0 /*?? */ , session->session_mac, session->session_id,
+                               p_connect_status->status);
+
+       switch (p_connect_status->status) {
+       case ASP_SESSION_CONNECT_STATUS_NETWORK_ROLE_REJECTED:
+               return SESSION_STATE_CLOSED;
+               break;
+       case ASP_SESSION_CONNECT_STATUS_NO_MORE_CONNECTION:
+               return SESSION_STATE_CLOSED;
+               break;
+       case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_FAILED:
+               return SESSION_STATE_CLOSED;
+               break;
+       case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_COMPLETED:      /* ???? */
+               return SESSION_STATE_GROUP_FORMATION_COMPLETED;
+               break;
+       case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_FAILED:
+               return SESSION_STATE_CLOSED;
+               break;
+       case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_SENT:   /*Fall through */
+       case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_RECEIVED:       /*Fall through */
+       case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_DEFFERED:       /*Fall through */
+       /*case ASP_SESSION_CONNECT_STATUS_GROUP_FORMATION_STARTED:   //Fall through */
+       case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_ACCEPTED:       /*Fall through */
+       default:
+               return GFSM_DISCARD_EVENT;
+               break;
+       }
+}
+
+gfsm_state_id_t
+_state_session_request_accepted_reaction_session_config_request_called(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       asp_session_t *session = (asp_session_t *) p_context_data;
+       session_config_request_param_t *p_config_request_param =
+               (session_config_request_param_t *) p_event_data;
+       g_assert(p_config_request_param);
+
+       _call_session_config_request_cb(0, session->session_mac, session->session_id,
+                                       p_config_request_param->get_network_config_pin,
+                                       p_config_request_param->network_config_pin);
+
+       if (p_config_request_param->get_network_config_pin)
+               return SESSION_STATE_ENTERING_PIN;
+
+       return GFSM_DISCARD_EVENT;
+}
+
+void _state_entering_pin_entry_action(gpointer p_context_data)
+{
+       /*start_timer */
+}
+
+void _state_entering_pin_exit_action(gpointer p_context_data)
+{
+       /*stop_timer */
+}
+
+gfsm_state_id_t _state_entering_pin_reaction_confirm_session_called(
+       gpointer p_context_data, gpointer p_event_data)
+{
+#ifdef HAVE_ASP_P2P_CONN
+       asp_session_t *session = (asp_session_t *) p_context_data;
+#endif
+       confirm_session_param_t *p_confirm_session = (confirm_session_param_t *)
+                       p_event_data;
+       g_assert(p_confirm_session);
+
+#ifdef HAVE_ASP_P2P_CONN
+       asp_p2p_conn_confirm_session(session->session_mac, session->session_id,
+                                    p_confirm_session->confirmed, p_confirm_session->pin);
+#endif
+
+       if (p_confirm_session->confirmed)
+               return SESSION_STATE_SESSION_REQUEST_ACCEPTED;
+       else
+               return SESSION_STATE_CLOSED;
+}
+
+void _state_group_formation_completed_entry_action(gpointer p_context_data)
+{
+       /*_start_timer(...); */
+       INFO_MSG;
+}
+
+void _state_group_formation_completed_exit_action(gpointer p_context_data)
+{
+       /*_stop_timer(...); */
+       INFO_MSG;
+}
+
+gfsm_state_id_t _state_group_formation_completed_reaction_ip_assigned(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       asp_session_t *session = (asp_session_t *) p_context_data;
+       g_assert(session);
+
+       if (session->asp_role == ASP_ROLE_ADVERTIZER)
+               return GFSM_DISCARD_EVENT;
+
+       ip_assigned_param_t *p_ip_assigned_param = (ip_assigned_param_t *) p_event_data;
+       g_assert(p_ip_assigned_param);
+
+       _store_peer_ip_addr(session, p_ip_assigned_param->peer_ip_addr,
+                           p_ip_assigned_param->length);
+
+       _send_request_session(session, NULL, 0);
+
+       return SESSION_STATE_REQUEST_SESSION_SENT;
+}
+
+gfsm_state_id_t
+_state_group_formation_completed_reaction_request_session_received(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       /*_call_session_request_cb does not need to be called because this is over-p2p case. */
+
+       return SESSION_STATE_REQUEST_SESSION_RECEIVED;
+}
+
+void _state_l2connected_entry_action(gpointer p_context_data)
+{
+       INFO_MSG;
+
+       asp_session_t *session = (asp_session_t *) p_context_data;
+
+       asp_sess_peer_add_session(session->sock_addr, session->session_mac,
+                                 session->session_id); /* into running state */
+}
+
+void _state_l2connected_exit_action(gpointer p_context_data)
+{
+       INFO_MSG;
+}
+
+gfsm_state_id_t _state_l2connected_reaction_close_session_called(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       guint8 *close_reason = (guint8 *) p_event_data;
+       asp_session_t *session = (asp_session_t *) p_context_data;
+
+       _send_remove_session(session, *close_reason);
+
+       return SESSION_STATE_REMOVE_SESSION_SENT;
+}
+
+gfsm_state_id_t _state_l2connected_reaction_remove_session_received(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       /*guint8 remove_reason = *((guint8*)p_event_data); */
+       asp_session_t *session = (asp_session_t *) p_context_data;
+
+       /* temporary error_code as 0 */
+       _call_session_status_cb(0, session->session_mac, session->session_id,
+                               ASP_SESSION_CLOSED_STATE_REMOTE_CLOSE);
+
+       return SESSION_STATE_CLOSED;
+}
+
+gfsm_state_id_t _state_l2connected_reaction_peer_destroyed(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       return SESSION_STATE_CLOSED;
+}
+
+void _state_request_session_sent_entry_action(gpointer p_context_data)
+{
+       INFO_MSG;
+
+       asp_session_t *session = (asp_session_t *) p_context_data;
+
+       _call_connect_status_cb(0, session->session_mac, session->session_id,
+                               ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_SENT);
+}
+
+void _state_request_session_sent_exit_action(gpointer p_context_data)
+{
+       INFO_MSG;
+}
+
+gfsm_state_id_t _state_request_session_sent_reaction_added_session_received(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       return SESSION_STATE_OPEN;
+}
+
+gfsm_state_id_t _state_request_session_sent_reaction_deferred_session_received(
+       gpointer p_context_data, gpointer p_event_data)
+{
+
+       INFO_MSG;
+
+       asp_session_t *session = (asp_session_t *) p_context_data;
+
+       _call_connect_status_cb(0, session->session_mac, session->session_id,
+                               ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_DEFFERED);
+
+       return GFSM_DISCARD_EVENT;
+}
+
+gfsm_state_id_t _state_request_session_sent_reaction_rejected_session_received(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       asp_session_t *session = (asp_session_t *) p_context_data;
+       _call_session_status_cb(0, session->session_mac, session->session_id,
+                               ASP_SESSION_CLOSED_STATE_REMOTE_CLOSE);
+       return SESSION_STATE_CLOSED;
+}
+
+gfsm_state_id_t _state_request_session_sent_reaction_timeout(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       guint8 *remove_reason = (guint8 *) p_event_data;
+       asp_session_t *session = (asp_session_t *) p_context_data;
+
+       _send_remove_session(session, *remove_reason);
+
+       return SESSION_STATE_REMOVE_SESSION_SENT;
+}
+
+void _state_request_session_received_entry_action(gpointer p_context_data)
+{
+       INFO_MSG;
+
+       asp_session_t *session = (asp_session_t *) p_context_data;
+
+       /* session_request_cb */
+       /* what is user data ? */
+       _call_session_status_cb(0, session->session_mac, session->session_id,
+                               ASP_SESSION_CLOSED_STATE_NONE);
+       _call_connect_status_cb(0, session->session_mac, session->session_id,
+                               ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_RECEIVED);
+}
+
+void _state_request_session_received_exit_action(gpointer p_context_data)
+{
+       INFO_MSG;
+}
+
+gfsm_state_id_t
+_state_request_session_received_reaction_set_session_ready_called(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       asp_session_t *session = (asp_session_t *) p_context_data;
+
+       _send_added_session(session);
+
+       return SESSION_STATE_OPEN;
+}
+
+gfsm_state_id_t _state_request_session_received_reaction_defer_session_called(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       defer_session_param_t *defer_session_param = (defer_session_param_t *)
+                       p_event_data;
+       asp_session_t *session = (asp_session_t *) p_context_data;
+
+       _send_deferred_session(session, defer_session_param->deferred_response,
+                              defer_session_param->length);
+
+       _call_connect_status_cb(0, session->session_mac, session->session_id,
+                               ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_DEFFERED);
+
+       return GFSM_DISCARD_EVENT;
+}
+
+gfsm_state_id_t _state_request_session_received_reaction_confirm_session_called(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       asp_session_t *session = (asp_session_t *) p_context_data;
+       confirm_session_param_t *p_confirmed_param = (confirm_session_param_t *)
+                       p_event_data;
+
+       if (FALSE == p_confirmed_param->confirmed) {
+               _send_reject_session(session);
+
+               return SESSION_STATE_REJECT_SESSION_SENT;
+       } else {
+               _call_connect_status_cb(0, session->session_mac, session->session_id,
+                                       ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_ACCEPTED);
+               /* set_session_ready will be called soon */
+       }
+
+       return GFSM_DISCARD_EVENT;
+}
+
+void _state_open_entry_action(gpointer p_context_data)
+{
+       INFO_MSG;
+
+       asp_session_t *session = (asp_session_t *) p_context_data;
+       _call_session_status_cb(0, session->session_mac, session->session_id,
+                               ASP_SESSION_CLOSED_STATE_NONE);
+}
+
+void _state_open_exit_action(gpointer p_context_data)
+{
+       INFO_MSG;
+}
+
+gfsm_state_id_t _state_open_reaction_bound_port_called(gpointer p_context_data,
+               gpointer p_event_data)
+{
+       INFO_MSG;
+
+       bound_port_param_t *bound_port_param = (bound_port_param_t *) p_event_data;
+       asp_session_t *session = (asp_session_t *) p_context_data;
+
+       if (_send_allowed_port(session, bound_port_param->local_port,
+                              bound_port_param->proto)) {
+               /* error code?, user data? */
+               _call_port_status_cb(0, session->session_mac, session->session_id,
+                                    bound_port_param->local_ip, bound_port_param->local_port,
+                                    bound_port_param->proto, ASP_SESSION_PORT_STATUS_LOCAL_PORT_ALLOWED);
+       } else {
+               /* error code?, user data? */
+               _call_port_status_cb(0, session->session_mac, session->session_id,
+                                    bound_port_param->local_ip, bound_port_param->local_port,
+                                    bound_port_param->proto, ASP_SESSION_PORT_STATUS_LOCAL_PORT_BLOCKED);
+
+               /* session close? */
+               /* what event/state is proper? this is temporary */
+       }
+
+       /* what event/state is proper? this is temporary */
+       return GFSM_DISCARD_EVENT;
+}
+
+gfsm_state_id_t _state_open_reaction_allowed_port_received(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       asp_allowed_port_t *p_allowed_port = (asp_allowed_port_t *) p_event_data;
+
+       asp_session_t *session = _get_exist_session(p_allowed_port->session_id,
+                                p_allowed_port->session_mac);
+       g_assert(session);
+
+       /* how to get error code ? */
+       /* how to deside port status of remote ? */
+       _call_port_status_cb(0, p_allowed_port->session_mac, p_allowed_port->session_id,
+                            session->peer_ip, p_allowed_port->port, p_allowed_port->proto,
+                            ASP_SESSION_PORT_STATUS_REMOTE_PORT_ALLOWED);
+
+       return GFSM_DISCARD_EVENT;
+}
+
+void _state_reject_session_sent_entry_action(gpointer p_context_data)
+{
+       INFO_MSG;
+
+       /*    asp_session_t* session = (asp_session_t*)p_context_data; */
+}
+
+void _state_reject_session_sent_exit_action(gpointer p_context_data)
+{
+       INFO_MSG;
+}
+
+gfsm_state_id_t _state_reject_session_sent_reaction_ack_received(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       asp_session_t *session = (asp_session_t *) p_context_data;
+       _call_session_status_cb(0, session->session_mac, session->session_id,
+                               ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE);
+       return SESSION_STATE_CLOSED;
+}
+
+gfsm_state_id_t _state_reject_session_sent_reaction_nack_received(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       asp_session_t *session = (asp_session_t *) p_context_data;
+       _call_session_status_cb(0, session->session_mac, session->session_id,
+                               ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE);
+       return SESSION_STATE_CLOSED;
+}
+
+void _state_remove_session_sent_entry_action(gpointer p_context_data)
+{
+       INFO_MSG;
+
+       /*asp_session_t* session = (asp_session_t*)p_context_data; */
+}
+
+void _state_remove_session_sent_exit_action(gpointer p_context_data)
+{
+       INFO_MSG;
+}
+
+gfsm_state_id_t _state_remove_session_sent_reaction_ack_received(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
+
+       asp_session_t *session = (asp_session_t *) p_context_data;
+       _call_session_status_cb(0, session->session_mac, session->session_id,
+                               ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE);
+       return SESSION_STATE_CLOSED;
+}
+
+gfsm_state_id_t _state_remove_session_sent_reaction_nack_received(
+       gpointer p_context_data, gpointer p_event_data)
+{
+       INFO_MSG;
 
-       __ASP_LOG_FUNC_EXIT__;
-       return res;
+       asp_session_t *session = (asp_session_t *) p_context_data;
+       _call_session_status_cb(0, session->session_mac, session->session_id,
+                               ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE);
+       return SESSION_STATE_CLOSED;
 }
diff --git a/src/session/asp-state.c b/src/session/asp-state.c
deleted file mode 100755 (executable)
index ceaa88a..0000000
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*****************************************************************************
- *      Standard headers
- *****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include <glib.h>
-#include <gio/gio.h>
-
-/*****************************************************************************
- *      System headers
- *****************************************************************************/
-
-/*****************************************************************************
- *      Application Service Platform headers
- *****************************************************************************/
-
-#include "asp-manager-util.h"
-#include "asp-manager.h"
-#include "asp-manager-gdbus.h"
-#include "asp-session.h"
-
-/*****************************************************************************
- *      Macros and Typedefs
- *****************************************************************************/
-
-#define STATE_MASK 0x00ff
-#define SUB_STATE_BIT 8
-#define ASP_GET_SUB_STATE(val) ((val) >> SUB_STATE_BIT)
-
-#define SUB_STATE_MASK 0xff00
-#define ASP_SET_SUB_STATE(sub_state, val) (val) = ((val) & STATE_MASK) | ((sub_state) << SUB_STATE_BIT)
-
-/*****************************************************************************
- *      Global Variables
- *****************************************************************************/
-
-/*****************************************************************************
- *      Local Functions Definition
- *****************************************************************************/
-
-void asp_state_set(asp_session_s *session, int state, int status, char *info)
-{
-       char mac_address[MACSTR_LEN + 1] = {0,};
-       if (session == NULL) {
-               ASP_LOGE("Invalid parameter");
-               return;
-       }
-
-       switch (state) {
-       case ASP_SESSION_CLOESD:
-       {
-               ASP_LOGI("ASP_SESSION_CLOESD");
-       }
-               break;
-       case ASP_SESSION_INITIATED:
-       {
-               ASP_LOGI("ASP_SESSION_INITIATED");
-       }
-               break;
-       case ASP_SESSION_REQUESTED:
-       {
-               ASP_LOGI("ASP_SESSION_REQUESTED");
-       }
-               break;
-       case ASP_SESSION_OPEN:
-       {
-               ASP_LOGI("ASP_SESSION_OPEN");
-       }
-               break;
-       default:
-       {
-               ASP_LOGE("Invalid Session State");
-               return;
-       }
-               break;
-       }
-       session->state = state;
-       g_snprintf(mac_address, MACSTR_LEN, MACSTR, MAC2STR(session->session_mac));
-       asp_manager_gdbus_notify_session_status(mac_address,
-                       session->session_id, state, status, info);
-       return;
-}
-
-void asp_state_set_sub(asp_session_s * session,  int status, char *deferred)
-{
-       char mac_address[MACSTR_LEN + 1] = {0,};
-       switch (status) {
-       case ASP_SESSION_ROLE_REJECTED:
-       {
-               ASP_LOGI("ASP_SESSION_ROLE_REJECTED");
-       }
-               break;
-       case ASP_SESSION_NOMORE_CONNECT:
-       {
-               ASP_LOGI("ASP_SESSION_NOMORE_CONNECT");
-       }
-               break;
-       case ASP_SESSION_REQUEST_STARTED:
-       {
-               ASP_LOGI("ASP_SESSION_REQUEST_STARTED");
-       }
-               break;
-       case ASP_SESSION_REQUEST_DEFERRED:
-       {
-               ASP_LOGI("ASP_SESSION_REQUEST_DEFERRED");
-       }
-               break;
-       case ASP_SESSION_REQUEST_ACCEPTED:
-       {
-               ASP_LOGI("ASP_SESSION_REQUEST_ACCEPTED");
-       }
-               break;
-       case ASP_SESSION_REQUEST_FAILED:
-       {
-               ASP_LOGI("ASP_SESSION_REQUEST_FAILED");
-       }
-               break;
-       case ASP_GROUP_FORMATION_STARTED:
-       {
-               ASP_LOGI("ASP_GROUP_FORMATION_STARTED");
-       }
-               break;
-       case ASP_GROUP_FORMATION_COMPLETED:
-       {
-               ASP_LOGI("ASP_GROUP_FORMATION_COMPLETED");
-       }
-               break;
-       case ASP_GROUP_FORMATION_FAILED:
-       {
-               ASP_LOGI("ASP_GROUP_FORMATION_FAILED");
-       }
-               break;
-       default:
-       {
-               ASP_LOGE("Invalid Session State");
-               return;
-       }
-               break;
-       }
-
-       ASP_SET_SUB_STATE(status, session->state);
-       g_snprintf(mac_address, MACSTR_LEN, MACSTR, MAC2STR(session->session_mac));
-       asp_manager_gdbus_notify_connect_status(mac_address,
-                       session->session_id, status, deferred);
-       return;
-}
diff --git a/src/session/gfsm.c b/src/session/gfsm.c
new file mode 100644 (file)
index 0000000..7ebffb9
--- /dev/null
@@ -0,0 +1,444 @@
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include "gfsm.h"
+#include <stdio.h>
+
+#if 0
+gfsm_get_state_name_cb g_state_name_cb = NULL;
+gfsm_get_event_name_cb g_event_name_cb = NULL;
+#endif
+
+static void _gfsm_process_event(gfsm_context_t *p_context,
+                               gfsm_event_t *p_event);
+static void gfsm_process_transition(gfsm_context_t *p_context,
+                                   gfsm_state_id_t next_state_id);
+static void gfsm_do_exit_action(gfsm_state_t *p_current_state,
+                               gfsm_state_t *p_common_ancesstor, gfsm_context_t *p_context);
+static void gfsm_do_entry_action(gfsm_state_t *p_common_ancesstor,
+                                gfsm_state_t *p_next_state, gfsm_context_t *p_context);
+static void gfsm_reenqueue_deferred_event(gfsm_context_t *p_context);
+static void gfsm_init_event_queue(gfsm_event_queue_t *p_queue);
+static void gfsm_destroy_event_queue(gfsm_event_queue_t *p_queue);
+static void gfsm_enqueue_event(gfsm_event_queue_t *p_queue,
+                              gfsm_event_t *p_event);
+static gfsm_event_t *gfsm_dequeue_event(gfsm_event_queue_t *p_queue);
+static gfsm_state_t *gfsm_find_last_child_state(gfsm_state_t *p_state);
+static gfsm_state_t *gfsm_find_common_ancesstor_state(gfsm_state_t *p_state_1,
+               gfsm_state_t *p_state_2);
+
+#if 0
+void gfsm_set_debugger(gfsm_get_state_name_cb state_name_cb,
+                      gfsm_get_event_name_cb event_name_cb)
+{
+       g_state_name_cb = state_name_cb;
+       g_event_name_cb = event_name_cb;
+}
+#endif
+
+gfsm_t *gfsm_init_fsm(gfsm_t *p_fsm, gfsm_state_id_t max_state,
+                     gfsm_event_id_t max_event, gfsm_state_id_t init_state)
+{
+       assert(p_fsm);
+       assert(init_state < max_state);
+
+       size_t state_table_size = sizeof(gfsm_state_t *) *max_state;
+
+       p_fsm->pp_state_table = malloc(state_table_size);
+
+       assert(p_fsm->pp_state_table);
+
+       memset(p_fsm->pp_state_table, 0, state_table_size);
+
+       p_fsm->max_state = max_state;
+       p_fsm->max_event = max_event;
+       p_fsm->init_state_id = init_state;
+
+       return p_fsm;
+}
+
+void gfsm_terminate_fsm(gfsm_t *p_fsm)
+{
+       assert(p_fsm);
+       assert(p_fsm->pp_state_table);
+
+       free(p_fsm->pp_state_table);
+       p_fsm->pp_state_table = 0;
+}
+
+gfsm_state_t *gfsm_init_state(gfsm_state_t *p_state, gfsm_state_id_t state_id,
+                             gfsm_t *p_fsm, gfsm_entry_action_cb entry_action,
+                             gfsm_exit_action_cb exit_action)
+{
+       size_t event_table_size;
+
+       assert(p_state);
+       assert(p_fsm);
+       assert(entry_action && exit_action);
+
+       p_state->state_id = state_id;
+       p_state->p_fsm = p_fsm;
+       p_state->p_parent_state = NULL;
+       p_state->p_internal_init_state = NULL;
+       p_state->entry_action_cb = entry_action;
+       p_state->exit_action_cb = exit_action;
+
+       event_table_size = sizeof(gfsm_reaction_cb) * p_fsm->max_event;
+
+       p_state->reaction_table = malloc(event_table_size);
+
+       assert(p_state->reaction_table);
+
+       memset(p_state->reaction_table, 0, event_table_size);
+
+       return p_state;
+}
+
+void gfsm_terminate_state(gfsm_state_t *p_state)
+{
+       assert(p_state);
+       assert(p_state->reaction_table);
+
+       free(p_state->reaction_table);
+       p_state->reaction_table = 0;
+}
+
+gfsm_context_t *gfsm_init_context(gfsm_context_t *p_context, gfsm_t *p_fsm,
+                                 gfsm_context_termination_notifier_cb termination_notifier,
+                                 gpointer p_context_data)
+{
+       gfsm_state_t *p_next_state;
+
+       assert(p_context && p_fsm);
+       p_context->p_fsm = p_fsm;
+       p_context->p_context_data = p_context_data;
+       p_context->current_state_id = p_fsm->init_state_id;
+
+       assert(p_context->current_state_id < p_fsm->max_state);
+
+       gfsm_init_event_queue(&p_context->event_queue);
+       gfsm_init_event_queue(&p_context->defer_event_queue);
+
+       p_context->processing_event = 0;
+       p_context->terminating = 0;
+       p_context->termination_notifier = termination_notifier;
+
+       p_next_state = p_fsm->pp_state_table[p_context->current_state_id];
+
+       assert(p_next_state);
+
+       gfsm_do_entry_action(NULL, p_next_state, p_context);
+
+       return p_context;
+}
+
+gfsm_state_id_t gfsm_get_current_state_id(gfsm_context_t *p_context)
+{
+       assert(p_context);
+       return p_context->current_state_id;
+}
+
+void gfsm_terminate_context(gfsm_context_t *p_context)
+{
+       gfsm_state_t *p_current_state;
+
+       if (p_context->processing_event) {
+               p_context->terminating = 1;
+               return;
+       }
+
+       p_current_state = p_context->p_fsm->pp_state_table[p_context->current_state_id];
+       gfsm_do_exit_action(p_current_state, NULL, p_context);
+
+       gfsm_destroy_event_queue(&p_context->event_queue);
+       gfsm_destroy_event_queue(&p_context->defer_event_queue);
+
+       if (p_context->termination_notifier)
+               p_context->termination_notifier(p_context->p_context_data);
+}
+
+void gfsm_add_reaction(gfsm_state_t *p_state, gfsm_event_id_t event_id,
+                      gfsm_reaction_cb reaction_cb)
+{
+       assert(p_state);
+       assert(reaction_cb);
+       assert(p_state->reaction_table);
+       assert(p_state->p_fsm);
+       assert(event_id < p_state->p_fsm->max_event);
+       assert(p_state->reaction_table[event_id] == NULL);
+
+       p_state->reaction_table[event_id] = reaction_cb;
+}
+
+void gfsm_set_parent_state(gfsm_state_t *p_state, gfsm_state_t *p_parent_state)
+{
+       assert(p_state && p_parent_state);
+       assert(p_state->p_parent_state == NULL);
+       /*assert(p_parent_state->p_internal_init_state != NULL); */
+
+       p_state->p_parent_state = p_parent_state;
+
+       if (NULL == p_parent_state->p_internal_init_state)
+               p_parent_state->p_internal_init_state = p_state;
+}
+
+/*
+void gfsm_set_internal_init_state(gfsm_state_t* p_state, gfsm_state_t* p_internal_init_state)
+{
+       assert(p_state && p_internal_init_state);
+       //assert(p_state->p_internal_init_state == NULL);
+       p_state->p_internal_init_state = p_internal_init_state;
+}
+*/
+
+void gfsm_add_state(gfsm_t *p_fsm, gfsm_state_t *p_state)
+{
+       assert(p_fsm && p_state);
+       assert(p_state->state_id < p_fsm->max_state);
+       assert(p_fsm->pp_state_table[p_state->state_id] == NULL);
+
+       p_fsm->pp_state_table[p_state->state_id] = p_state;
+}
+
+gfsm_event_t *gfsm_create_event(gfsm_event_id_t event_id, gpointer p_event_data,
+                               gfsm_event_data_destructor_cb destructor)
+{
+       gfsm_event_t *p_event = malloc(sizeof(gfsm_event_t));
+
+       assert(p_event);
+
+       p_event->p_next = NULL;
+       p_event->event_id = event_id;
+       p_event->p_event_data = p_event_data;
+       p_event->destructor = destructor;
+
+       return p_event;
+}
+
+gfsm_t *gfsm_get_fsm_of_state(gfsm_state_t *p_state)
+{
+       assert(p_state);
+       return p_state->p_fsm;
+}
+
+gfsm_t *gfsm_get_fsm_of_context(gfsm_context_t *p_context)
+{
+       assert(p_context);
+       return p_context->p_fsm;
+}
+
+void gfsm_process_event(gfsm_context_t *p_context, gfsm_event_t *p_event)
+{
+       gfsm_t *p_fsm;
+
+       assert(p_context && p_event);
+
+       p_fsm = p_context->p_fsm;
+
+       assert(p_fsm && p_event->event_id < p_fsm->max_event);
+
+       gfsm_enqueue_event(&p_context->event_queue, p_event);
+
+       if (p_context->processing_event)        /*recursive check */
+               return;
+
+       p_context->processing_event = 1;
+
+       while ((p_event = gfsm_dequeue_event(&p_context->event_queue)))
+               _gfsm_process_event(p_context, p_event);
+
+       p_context->processing_event = 0;
+
+       if (p_context->terminating)
+               gfsm_terminate_context(p_context);
+}
+
+void _gfsm_process_event(gfsm_context_t *p_context, gfsm_event_t *p_event)
+{
+       gfsm_t *p_fsm;
+       gfsm_state_t *p_state;
+       gfsm_state_id_t next_state_id = GFSM_DISCARD_EVENT;
+
+       assert(p_context && p_event);
+
+       p_fsm = p_context->p_fsm;
+
+       assert(p_context->current_state_id < p_fsm->max_state);
+
+       for (p_state = p_fsm->pp_state_table[p_context->current_state_id];
+            p_state != NULL; p_state = p_state->p_parent_state) {
+               if (p_state->reaction_table[p_event->event_id]) {
+                       next_state_id = p_state->reaction_table[p_event->event_id](p_context,
+                                       p_event->p_event_data);
+                       break;
+               }
+       }
+
+       if (GFSM_DEFER_EVENT == next_state_id) {
+               gfsm_enqueue_event(&p_context->defer_event_queue, p_event);
+               return;
+       }
+
+       if (p_event->destructor && p_event->p_event_data)
+               p_event->destructor(p_event->p_event_data);
+
+       free(p_event);
+
+       if (NULL == p_state)
+               return;
+
+       if (GFSM_DISCARD_EVENT == next_state_id)
+               return;
+
+       gfsm_process_transition(p_context, next_state_id);
+}
+
+void gfsm_process_transition(gfsm_context_t *p_context,
+                            gfsm_state_id_t next_state_id)
+{
+       gfsm_state_t *p_next_state;
+       gfsm_state_t *p_current_state;
+       gfsm_state_t *p_common_ancesstor;
+
+       assert(next_state_id < p_context->p_fsm->max_state);
+
+       p_next_state = p_context->p_fsm->pp_state_table[next_state_id];
+       p_current_state = p_context->p_fsm->pp_state_table[p_context->current_state_id];
+
+       assert(p_next_state && p_current_state);
+
+       p_common_ancesstor = gfsm_find_common_ancesstor_state(p_current_state,
+                            p_next_state);
+
+       p_next_state = gfsm_find_last_child_state(p_next_state);
+
+       assert(p_next_state);
+
+       gfsm_do_exit_action(p_current_state, p_common_ancesstor, p_context);
+
+       if (p_context->current_state_id != p_next_state->state_id)
+               gfsm_reenqueue_deferred_event(p_context);
+
+       p_context->current_state_id = p_next_state->state_id;
+
+       gfsm_do_entry_action(p_common_ancesstor, p_next_state, p_context);
+}
+
+void gfsm_do_exit_action(gfsm_state_t *p_current_state,
+                        gfsm_state_t *p_common_ancesstor, gfsm_context_t *p_context)
+{
+       gfsm_state_t *p_state = p_current_state;
+
+       while (p_state && p_state != p_common_ancesstor) {
+               p_state->exit_action_cb(p_context->p_context_data);
+               p_state = p_state->p_parent_state;
+       }
+}
+
+void gfsm_do_entry_action(gfsm_state_t *p_common_ancesstor,
+                         gfsm_state_t *p_next_state, gfsm_context_t *p_context)
+{
+       if (p_next_state == NULL || p_next_state == p_common_ancesstor)
+               return;
+
+       gfsm_do_entry_action(p_common_ancesstor, p_next_state->p_parent_state,
+                            p_context);
+
+       p_next_state->entry_action_cb(p_context->p_context_data);
+}
+
+void gfsm_reenqueue_deferred_event(gfsm_context_t *p_context)
+{
+       gfsm_event_t *p_event;
+
+       while ((p_event = gfsm_dequeue_event(&p_context->defer_event_queue)))
+               gfsm_enqueue_event(&p_context->event_queue, p_event);
+}
+
+/*gfsm_reaction_cb gfsm_deferral_reaction */
+gfsm_state_id_t gfsm_deferral_reaction(gpointer p_context_data,
+                                      gpointer p_event_data)
+{
+       return GFSM_DEFER_EVENT;
+}
+
+void gfsm_init_event_queue(gfsm_event_queue_t *p_queue)
+{
+       assert(p_queue);
+       p_queue->p_head = p_queue->p_tail = NULL;
+}
+
+void gfsm_destroy_event_queue(gfsm_event_queue_t *p_queue)
+{
+       gfsm_event_t *p_event;
+
+       while ((p_event = gfsm_dequeue_event(p_queue)) != NULL) {
+               if (p_event->destructor && p_event->p_event_data)
+                       p_event->destructor(p_event->p_event_data);
+
+               free(p_event);
+       }
+}
+
+void gfsm_enqueue_event(gfsm_event_queue_t *p_queue, gfsm_event_t *p_event)
+{
+       assert(p_queue);
+
+       if (p_queue->p_tail == NULL) {
+               assert(p_queue->p_head == NULL);
+
+               p_queue->p_head = p_queue->p_tail = p_event;
+       } else {
+               p_queue->p_tail->p_next = p_event;
+               p_queue->p_tail = p_event;
+       }
+
+}
+
+gfsm_event_t *gfsm_dequeue_event(gfsm_event_queue_t *p_queue)
+{
+       assert(p_queue);
+
+       gfsm_event_t *p_event = p_queue->p_head;
+
+       if (p_event == NULL)
+               assert(p_queue->p_tail == NULL);
+       else {
+               p_queue->p_head = p_event->p_next;
+               if (p_queue->p_head == NULL)
+                       p_queue->p_tail = NULL;
+       }
+
+       return p_event;
+}
+
+gfsm_state_t *gfsm_find_last_child_state(gfsm_state_t *p_state)
+{
+       assert(p_state);
+
+       while (p_state->p_internal_init_state)
+               p_state = p_state->p_internal_init_state;
+
+       return p_state;
+}
+
+gfsm_state_t *gfsm_find_common_ancesstor_state(gfsm_state_t *p_state_l,
+               gfsm_state_t *p_state_r)
+{
+       gfsm_state_t *p_state_1, *p_state_2;
+
+       assert(p_state_l && p_state_r);
+
+       for (p_state_1 = p_state_l->p_parent_state; p_state_1 != NULL;
+            p_state_1 = p_state_1->p_parent_state) {
+               for (p_state_2 = p_state_r->p_parent_state; p_state_2 != NULL;
+                    p_state_2 = p_state_2->p_parent_state) {
+                       /*printf("\np_state_1 : %d, p_state_2 : %d",p_state_1->state_id,p_state_2->state_id); */
+
+                       if (p_state_1->state_id == p_state_2->state_id)
+                               return p_state_1;
+               }
+       }
+
+       return NULL;
+}
diff --git a/src/session/gfsm.h b/src/session/gfsm.h
new file mode 100644 (file)
index 0000000..92e699b
--- /dev/null
@@ -0,0 +1,99 @@
+#ifndef _GFSM_
+#define _GFSM_
+
+#include <glib.h>
+#include <stdint.h>
+
+typedef guint32 gfsm_state_id_t;
+typedef guint32 gfsm_event_id_t;
+
+typedef gchar *(*gfsm_get_state_name_cb)(gfsm_state_id_t state_id);
+typedef gchar *(*gfsm_get_event_name_cb)(gfsm_event_id_t event_id);
+
+static const gfsm_state_id_t GFSM_DISCARD_EVENT = 0xFFFFFFFF;
+static const gfsm_state_id_t GFSM_DEFER_EVENT = 0xFFFFFFFE;
+
+typedef struct gfsm_event gfsm_event_t;
+typedef struct gfsm_state gfsm_state_t;
+typedef struct gfsm gfsm_t;
+typedef struct gfsm_context gfsm_context_t;
+
+typedef void (*gfsm_entry_action_cb)(gpointer p_context_data);
+typedef void (*gfsm_exit_action_cb)(gpointer p_context_data);
+typedef gfsm_state_id_t(*gfsm_reaction_cb)(gpointer p_context_data,
+               gpointer p_event_data);
+typedef void (*gfsm_event_data_destructor_cb)(gpointer p_event_data);
+typedef void (*gfsm_context_termination_notifier_cb)(gpointer p_context_data);
+
+typedef struct gfsm_event_queue {
+       gfsm_event_t *p_head;
+       gfsm_event_t *p_tail;
+} gfsm_event_queue_t;
+
+typedef struct gfsm_event {
+       struct gfsm_event *p_next;
+       gfsm_event_id_t event_id;
+       gpointer p_event_data;
+       gfsm_event_data_destructor_cb destructor;
+} gfsm_event_t;
+
+typedef struct gfsm_state {
+       gfsm_state_id_t state_id;
+       gfsm_t *p_fsm;
+       gfsm_state_t *p_parent_state;
+       gfsm_state_t *p_internal_init_state;
+       gfsm_entry_action_cb entry_action_cb;
+       gfsm_exit_action_cb exit_action_cb;
+       gfsm_reaction_cb *reaction_table;
+} gfsm_state_t;
+
+typedef struct gfsm {
+       gfsm_state_t **pp_state_table;
+       gfsm_state_id_t max_state;
+       gfsm_event_id_t max_event;
+       gfsm_state_id_t init_state_id;
+} gfsm_t;
+
+typedef struct gfsm_context {
+       gfsm_t *p_fsm;
+       gfsm_state_id_t current_state_id;
+       gfsm_event_queue_t event_queue;
+       gfsm_event_queue_t defer_event_queue;
+       uint8_t processing_event;       /*true or false; */
+       uint8_t terminating;            /*true or false; */
+       gfsm_context_termination_notifier_cb termination_notifier;
+       gpointer p_context_data;
+} gfsm_context_t;
+
+/*void gfsm_set_debugger(gint32 (*log)(const gchar *format, ...),gfsm_get_state_name_cb state_name_cb,gfsm_get_event_name_cb event_name_cb); */
+
+gfsm_t *gfsm_init_fsm(gfsm_t *p_fsm, gfsm_state_id_t max_state,
+                     gfsm_event_id_t max_event, gfsm_state_id_t init_state);
+void gfsm_terminate_fsm(gfsm_t *p_fsm);
+void gfsm_add_state(gfsm_t *p_fsm, gfsm_state_t *p_state);
+
+gfsm_state_t *gfsm_init_state(gfsm_state_t *state, gfsm_state_id_t state_id,
+                             gfsm_t *p_fsm, gfsm_entry_action_cb entry_action,
+                             gfsm_exit_action_cb exit_action);
+void gfsm_terminate_state(gfsm_state_t *state);
+void gfsm_set_parent_state(gfsm_state_t *state, gfsm_state_t *p_parent_state);
+/*void gfsm_set_internal_init_state(gfsm_state_t* state, gfsm_state_t* p_internal_init_state); */
+void gfsm_add_reaction(gfsm_state_t *p_state, gfsm_event_id_t event_id,
+                      gfsm_reaction_cb reaction_cb);
+gfsm_t *gfsm_get_fsm_of_state(gfsm_state_t *p_state);
+
+gfsm_context_t *gfsm_init_context(gfsm_context_t *p_context, gfsm_t *p_fsm,
+                                 gfsm_context_termination_notifier_cb termination_notifier,
+                                 gpointer p_context_data);
+void gfsm_terminate_context(gfsm_context_t *p_context);
+void gfsm_process_event(gfsm_context_t *p_context, gfsm_event_t *p_event);
+gfsm_state_id_t gfsm_get_current_state_id(gfsm_context_t *p_context);
+gfsm_t *gfsm_get_fsm_of_context(gfsm_context_t *p_context);
+
+gfsm_event_t *gfsm_create_event(gfsm_event_id_t event_id, gpointer p_event_data,
+                               gfsm_event_data_destructor_cb destructor);
+
+/*gfsm_reaction_cb gfsm_deferral_reaction; */
+gfsm_state_id_t gfsm_deferral_reaction(gpointer p_context_data,
+                                      gpointer p_event_data);
+#endif
index e6141b1..052ae1a 100755 (executable)
  * Local Functions Definition
  *****************************************************************************/
 
-int asp_tech_ble_init()
+gint32 asp_tech_ble_init()
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
 
        __ASP_LOG_FUNC_EXIT__;
        return result;
 }
 
-int asp_tech_ble_deinit()
+gint32 asp_tech_ble_deinit()
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
 
        __ASP_LOG_FUNC_EXIT__;
        return result;
 }
 
-int asp_tech_ble_advertise(asp_service_advertise_s *service, int replace)
+gint32 asp_tech_ble_advertise(asp_service_advertise_s *service, gint32 replace)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
 
        __ASP_LOG_FUNC_EXIT__;
        return result;
 }
 
-int asp_tech_ble_cancel_advertise(asp_service_advertise_s *service)
+gint32 asp_tech_ble_cancel_advertise(asp_service_advertise_s *service)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
 
        __ASP_LOG_FUNC_EXIT__;
        return result;
 }
 
-int asp_tech_ble_seek(asp_service_seek_s *service)
+gint32 asp_tech_ble_seek(asp_service_seek_s *service)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
 
        __ASP_LOG_FUNC_EXIT__;
        return result;
 }
 
-int asp_tech_ble_cancel_seek(asp_service_seek_s *service)
+gint32 asp_tech_ble_cancel_seek(asp_service_seek_s *service)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
 
        __ASP_LOG_FUNC_EXIT__;
        return result;
 }
 
-int asp_tech_ble_connect_session(asp_connect_session_params *params)
+gint32 asp_tech_ble_connect_session(asp_tech_session_request_params_s *params)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
 
        __ASP_LOG_FUNC_EXIT__;
        return result;
 }
 
-int asp_tech_ble_confirm_session(unsigned char *session_mac, int session_id, int confirm, const char *pin)
+gint32 asp_tech_ble_confirm_session(const guint8 *session_mac, gint32 session_id, gint32 confirm, guint32 pin)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
 
        __ASP_LOG_FUNC_EXIT__;
        return result;
 }
 
-int asp_tech_ble_destroy_connection()
+gint32 asp_tech_ble_destroy_connection(const guint8 *peer_id, gint32 peer_id_length)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
+
+       __ASP_LOG_FUNC_EXIT__;
+       return result;
+}
+
+gint32 asp_tech_ble_is_peer_connected(const guint8 *peer_id, gint32 peer_id_length, gint32 *is_connected)
+{
+       __ASP_LOG_FUNC_ENTER__;
+       gint32 result = 0;
 
        __ASP_LOG_FUNC_EXIT__;
        return result;
@@ -146,4 +155,12 @@ asp_tech_ops_s asp_tech_ble_ops = {
                .connect_session = asp_tech_ble_connect_session,
                .confirm_session = asp_tech_ble_confirm_session,
                .destroy_connection = asp_tech_ble_destroy_connection,
+               .is_peer_connected = asp_tech_ble_is_peer_connected,
+               .session_request_cb = NULL,
+               .session_request_cb_user_data = NULL,
+               .session_config_request_cb = NULL,
+               .connect_status_cb = NULL,
+               .connect_status_cb_user_data = NULL,
+               .ip_assigned_cb = NULL,
+               .ip_assigned_cb_user_data = NULL,
 };
index fcd1cd7..a4d64f1 100755 (executable)
@@ -63,9 +63,9 @@ static __thread GHashTable *g_browser_hash = NULL;
  * Local Functions Definition
  *****************************************************************************/
 static void _advertise_status_cb(dnssd_error_e result,
-               dnssd_service_h local_service, void *user_data)
+               dnssd_service_h local_service, gpointer user_data)
 {
-       unsigned int adv_id = GPOINTER_TO_UINT(user_data);
+       guint32 adv_id = GPOINTER_TO_UINT(user_data);
        asp_service_advertise_status_e status = 0;
        asp_service_advertise_reason_e reason = 0;
 
@@ -87,7 +87,7 @@ static void _advertise_status_cb(dnssd_error_e result,
        asp_service_notify_advertise_status(adv_id, status, reason);
 }
 
-static void __txt_record_to_g_hash(unsigned short txt_len, const char *txt_records,
+static void __txt_record_to_g_hash(unsigned short txt_len, const gchar *txt_records,
                GHashTable *service_info_map)
 {
        const gchar *ptr = txt_records;
@@ -97,11 +97,11 @@ static void __txt_record_to_g_hash(unsigned short txt_len, const char *txt_recor
 
        while (ptr < max) {
                unsigned short len = ptr[0];
-               char *buf = g_strndup(ptr + 1, len);
+               gchar *buf = g_strndup(ptr + 1, len);
                ASP_LOGD("buf: %s", buf);
-               char *key;
-               char *value;
-               char *save_str = NULL;
+               gchar *key;
+               gchar *value;
+               gchar *save_str = NULL;
                key = strtok_r(buf, "=", &save_str);
                value = strtok_r(NULL, "=", &save_str);
                g_hash_table_replace(service_info_map, g_strdup(key), g_strdup(value));
@@ -112,18 +112,18 @@ static void __txt_record_to_g_hash(unsigned short txt_len, const char *txt_recor
 }
 
 static void _search_result_cb(dnssd_service_state_e service_state,
-               dnssd_service_h remote_service, void *user_data)
+               dnssd_service_h remote_service, gpointer user_data)
 {
        asp_event_data event;
-       unsigned int search_id = -1;
-       char *service_mac = NULL;
+       guint32 search_id = -1;
+       gchar *service_mac = NULL;
        const gchar *service_device_name = NULL;
-       unsigned int adv_id = -1;
-       char *service_name = NULL;
+       guint32 adv_id = -1;
+       gchar *service_name = NULL;
        GHashTable *service_info_map = NULL;
        asp_service_status_e service_status;
        unsigned short txt_len = 0;
-       char *txt = NULL;
+       gchar *txt = NULL;
        const gchar *adv_id_str = NULL;
 
        ASP_LOGD("A service is found %u", remote_service);
@@ -148,7 +148,7 @@ static void _search_result_cb(dnssd_service_state_e service_state,
        ASP_LOGD("Service status: %s",
                        service_status == ASP_SERVICE_STATUS_AVAILABLE ? "Available" : "Unavailable");
 
-       dnssd_service_get_all_txt_record(remote_service, &txt_len, (void *)&txt);
+       dnssd_service_get_all_txt_record(remote_service, &txt_len, (gpointer)&txt);
        if (txt_len > 1) {
                service_info_map = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
                __txt_record_to_g_hash(txt_len, txt, service_info_map);
@@ -163,7 +163,7 @@ static void _search_result_cb(dnssd_service_state_e service_state,
 
                if (g_hash_table_contains(service_info_map, ASP_INFRA_MAC_ADDR_KEY)) {
                        service_mac = g_strdup(g_hash_table_lookup(service_info_map, ASP_INFRA_MAC_ADDR_KEY));
-                       ASP_LOGD("Advertisement MAC Address: %s\n", service_mac);
+                       ASP_LOGD("Advertisement MAC Address: %s", service_mac);
                } else {
                        ASP_LOGE("TXT records don't contain advertisement MAC");
                        return;
@@ -171,7 +171,7 @@ static void _search_result_cb(dnssd_service_state_e service_state,
 
                if (g_hash_table_contains(service_info_map, ASP_INFRA_DEV_NAME)) {
                        service_device_name = g_strdup(g_hash_table_lookup(service_info_map, ASP_INFRA_DEV_NAME));
-                       ASP_LOGD("Service device name: %s\n", service_device_name);
+                       ASP_LOGD("Service device name: %s", service_device_name);
                }
        } else {
                ASP_LOGE("Found service should has at least one TXT record");
@@ -183,7 +183,7 @@ static void _search_result_cb(dnssd_service_state_e service_state,
        event.search_result.search_id = search_id;
        event.search_result.advertisement_id = adv_id;
        event.search_result.service_status = service_status;
-       g_strlcpy(event.search_result.service_mac, service_mac, MACSTR_LEN);
+       g_strlcpy(event.search_result.service_mac, service_mac, MACSTR_LEN + 1);
        event.search_result.device_name = NULL;
        event.search_result.instance_name = service_name;
        event.search_result.service_info = service_info_map;
@@ -193,7 +193,7 @@ static void _search_result_cb(dnssd_service_state_e service_state,
                g_free(service_mac);
 }
 
-static int __asp_service_infra_convert_error_type(int dnssd_error)
+static gint32 __asp_service_infra_convert_error_type(gint32 dnssd_error)
 {
        switch (dnssd_error) {
        case DNSSD_ERROR_NONE:
@@ -238,11 +238,11 @@ static void __deinit_hash_tables()
        g_browser_hash = NULL;
 }
 
-static int __add_txt_record(dnssd_service_h handle, const char* key, const char* value, int len)
+static gint32 __add_txt_record(dnssd_service_h handle, const gchar* key, const gchar* value, gint32 len)
 {
-       int result = 0;
+       gint32 result = 0;
        unsigned short txt_length;
-       void *txt_data;
+       gpointer txt_data;
 
        result = dnssd_service_add_txt_record(handle, key, (unsigned short)len, value);
        if (result != DNSSD_ERROR_NONE) {
@@ -258,7 +258,7 @@ static int __add_txt_record(dnssd_service_h handle, const char* key, const char*
        }
        ASP_LOGD("Get all TXT records");
 
-       result = dnssd_service_set_record(handle, 
+       result = dnssd_service_set_record(handle,
                        ASP_INFRA_DNSSD_TXT_RECORD_TYPE, txt_length, txt_data);
        if (result != DNSSD_ERROR_NONE) {
                ASP_LOGE("Failed to add record");
@@ -269,10 +269,10 @@ static int __add_txt_record(dnssd_service_h handle, const char* key, const char*
        return result;
 }
 
-int asp_tech_infra_init()
+gint32 asp_tech_infra_init()
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
 
        result = dnssd_initialize();
        if (result != DNSSD_ERROR_NONE) {
@@ -286,10 +286,10 @@ int asp_tech_infra_init()
        return result;
 }
 
-int asp_tech_infra_deinit()
+gint32 asp_tech_infra_deinit()
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
 
        result = dnssd_deinitialize();
        if (result != DNSSD_ERROR_NONE) {
@@ -303,16 +303,16 @@ int asp_tech_infra_deinit()
        return result;
 }
 
-int asp_tech_infra_advertise(asp_service_advertise_s *service, int replace)
+gint32 asp_tech_infra_advertise(asp_service_advertise_s *service, gint32 replace)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
        dnssd_service_h service_handle = 0;
-       char adv_id[ASP_SERVICE_ADV_ID_LEN + 1];
-       int adv_id_len = 0;
-       char *mac_addr;
-       int mac_addr_len;
-       int port = 1234; /* TODO */
+       gchar adv_id[ASP_SERVICE_ADV_ID_LEN + 1];
+       gint32 adv_id_len = 0;
+       gchar *mac_addr;
+       gint32 mac_addr_len;
+       gint32 port = 1234; /* TODO */
 
        ASP_LOGD("Infrastructure advertise service. replace: %d", replace);
 
@@ -371,7 +371,7 @@ int asp_tech_infra_advertise(asp_service_advertise_s *service, int replace)
        }
 
        /* Add MAC Address to TXT record */
-       mac_addr = (char *)g_try_malloc0(ASP_SERVICE_MACSTR_LEN + 1);
+       mac_addr = (gchar *)g_try_malloc0(ASP_SERVICE_MACSTR_LEN + 1);
        if (mac_addr == NULL) {
                ASP_LOGE("Failed to malloc");
                return ASP_ERROR_MEMORY;
@@ -401,10 +401,10 @@ int asp_tech_infra_advertise(asp_service_advertise_s *service, int replace)
        return result;
 }
 
-int asp_tech_infra_cancel_advertise(asp_service_advertise_s *service)
+gint32 asp_tech_infra_cancel_advertise(asp_service_advertise_s *service)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
        dnssd_service_h service_handle;
 
        service_handle = *(dnssd_service_h*)g_hash_table_lookup(g_local_service_hash,
@@ -434,10 +434,10 @@ int asp_tech_infra_cancel_advertise(asp_service_advertise_s *service)
        return result;
 }
 
-int asp_tech_infra_seek(asp_service_seek_s *service)
+gint32 asp_tech_infra_seek(asp_service_seek_s *service)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
        dnssd_service_h browser_handle;
 
        result = dnssd_start_browsing_service(service->service_type,
@@ -463,10 +463,10 @@ int asp_tech_infra_seek(asp_service_seek_s *service)
        return result;
 }
 
-int asp_tech_infra_cancel_seek(asp_service_seek_s *service)
+gint32 asp_tech_infra_cancel_seek(asp_service_seek_s *service)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
        dnssd_service_h browser_handle;
 
        browser_handle = *(dnssd_service_h*)g_hash_table_lookup(g_browser_hash,
@@ -489,28 +489,37 @@ int asp_tech_infra_cancel_seek(asp_service_seek_s *service)
        return result;
 }
 
-int asp_tech_infra_connect_session(asp_connect_session_params *params)
+gint32 asp_tech_infra_connect_session(asp_tech_session_request_params_s *params)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
 
        __ASP_LOG_FUNC_EXIT__;
        return result;
 }
 
-int asp_tech_infra_confirm_session(unsigned char *session_mac, int session_id, int confirm, const char *pin)
+gint32 asp_tech_infra_confirm_session(const guint8 *session_mac, gint32 session_id, gint32 confirm, guint32 pin)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
 
        __ASP_LOG_FUNC_EXIT__;
        return result;
 }
 
-int asp_tech_infra_destroy_connection()
+gint32 asp_tech_infra_destroy_connection(const guint8 *peer_id, gint32 peer_id_length)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
+
+       __ASP_LOG_FUNC_EXIT__;
+       return result;
+}
+
+gint32 asp_tech_infra_is_peer_connected(const guint8 *peer_id, gint32 peer_id_length, gint32 *is_connected)
+{
+       __ASP_LOG_FUNC_ENTER__;
+       gint32 result = 0;
 
        __ASP_LOG_FUNC_EXIT__;
        return result;
@@ -526,4 +535,12 @@ asp_tech_ops_s asp_tech_infra_ops = {
                .connect_session = asp_tech_infra_connect_session,
                .confirm_session = asp_tech_infra_confirm_session,
                .destroy_connection = asp_tech_infra_destroy_connection,
+               .is_peer_connected = asp_tech_infra_is_peer_connected,
+               .session_request_cb = NULL,
+               .session_request_cb_user_data = NULL,
+               .session_config_request_cb = NULL,
+               .connect_status_cb = NULL,
+               .connect_status_cb_user_data = NULL,
+               .ip_assigned_cb = NULL,
+               .ip_assigned_cb_user_data = NULL,
 };
index 49344e5..15893db 100755 (executable)
  * Local Functions Definition
  *****************************************************************************/
 
-int asp_tech_nan_init()
+gint32 asp_tech_nan_init()
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
 
        __ASP_LOG_FUNC_EXIT__;
        return result;
 }
 
-int asp_tech_nan_deinit()
+gint32 asp_tech_nan_deinit()
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
 
        __ASP_LOG_FUNC_EXIT__;
        return result;
 }
 
-int asp_tech_nan_advertise(asp_service_advertise_s *service, int replace)
+gint32 asp_tech_nan_advertise(asp_service_advertise_s *service, gint32 replace)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
 
        __ASP_LOG_FUNC_EXIT__;
        return result;
 }
 
-int asp_tech_nan_cancel_advertise(asp_service_advertise_s *service)
+gint32 asp_tech_nan_cancel_advertise(asp_service_advertise_s *service)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
 
        __ASP_LOG_FUNC_EXIT__;
        return result;
 }
 
-int asp_tech_nan_seek(asp_service_seek_s *service)
+gint32 asp_tech_nan_seek(asp_service_seek_s *service)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
 
        __ASP_LOG_FUNC_EXIT__;
        return result;
 }
 
-int asp_tech_nan_cancel_seek(asp_service_seek_s *service)
+gint32 asp_tech_nan_cancel_seek(asp_service_seek_s *service)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
 
        __ASP_LOG_FUNC_EXIT__;
        return result;
 }
 
-int asp_tech_nan_connect_session(asp_connect_session_params *params)
+gint32 asp_tech_nan_connect_session(asp_tech_session_request_params_s *params)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
 
        __ASP_LOG_FUNC_EXIT__;
        return result;
 }
 
-int asp_tech_nan_confirm_session(unsigned char *session_mac, int session_id, int confirm, const char *pin)
+gint32 asp_tech_nan_confirm_session(const guint8 *session_mac, gint32 session_id, gint32 confirm, guint32 pin)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
 
        __ASP_LOG_FUNC_EXIT__;
        return result;
 }
 
-int asp_tech_nan_destroy_connection()
+gint32 asp_tech_nan_destroy_connection(const guint8 *peer_id, gint32 peer_id_length)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
+
+       __ASP_LOG_FUNC_EXIT__;
+       return result;
+}
+
+gint32 asp_tech_nan_is_peer_connected(const guint8 *peer_id, gint32 peer_id_length, gint32 *is_connected)
+{
+       __ASP_LOG_FUNC_ENTER__;
+       gint32 result = 0;
 
        __ASP_LOG_FUNC_EXIT__;
        return result;
@@ -146,4 +155,12 @@ asp_tech_ops_s asp_tech_nan_ops = {
                .connect_session = asp_tech_nan_connect_session,
                .confirm_session = asp_tech_nan_confirm_session,
                .destroy_connection = asp_tech_nan_destroy_connection,
+               .is_peer_connected = asp_tech_nan_is_peer_connected,
+               .session_request_cb = NULL,
+               .session_request_cb_user_data = NULL,
+               .session_config_request_cb = NULL,
+               .connect_status_cb = NULL,
+               .connect_status_cb_user_data = NULL,
+               .ip_assigned_cb = NULL,
+               .ip_assigned_cb_user_data = NULL,
 };
index dca58d5..4940477 100755 (executable)
  * Local Functions Definition
  *****************************************************************************/
 
-int asp_tech_nfc_advertise(asp_service_advertise_s *service, int replace)
+gint32 asp_tech_nfc_advertise(asp_service_advertise_s *service, gint32 replace)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
 
        __ASP_LOG_FUNC_EXIT__;
        return result;
 }
 
-int asp_tech_nfc_cancel_advertise(asp_service_advertise_s *service)
+gint32 asp_tech_nfc_cancel_advertise(asp_service_advertise_s *service)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
 
        __ASP_LOG_FUNC_EXIT__;
        return result;
 }
 
-int asp_tech_nfc_seek(asp_service_seek_s *service)
+gint32 asp_tech_nfc_seek(asp_service_seek_s *service)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
 
        __ASP_LOG_FUNC_EXIT__;
        return result;
 }
 
-int asp_tech_nfc_cancel_seek(asp_service_seek_s *service)
+gint32 asp_tech_nfc_cancel_seek(asp_service_seek_s *service)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
 
        __ASP_LOG_FUNC_EXIT__;
        return result;
 }
 
-int asp_tech_nfc_init()
+gint32 asp_tech_nfc_init()
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
 
        __ASP_LOG_FUNC_EXIT__;
        return result;
 }
 
-int asp_tech_nfc_deinit()
+gint32 asp_tech_nfc_deinit()
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
 
        __ASP_LOG_FUNC_EXIT__;
        return result;
 }
 
-int asp_tech_nfc_connect_session(asp_connect_session_params *params)
+gint32 asp_tech_nfc_connect_session(asp_tech_session_request_params_s *params)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
 
        __ASP_LOG_FUNC_EXIT__;
        return result;
 }
 
-int asp_tech_nfc_confirm_session(unsigned char *session_mac, int session_id, int confirm, const char *pin)
+gint32 asp_tech_nfc_confirm_session(const guint8 *session_mac, gint32 session_id, gint32 confirm, guint32 pin)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
 
        __ASP_LOG_FUNC_EXIT__;
        return result;
 }
 
-int asp_tech_nfc_destroy_connection()
+gint32 asp_tech_nfc_destroy_connection(const guint8 *peer_id, gint32 peer_id_length)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
+
+       __ASP_LOG_FUNC_EXIT__;
+       return result;
+}
+
+gint32 asp_tech_nfc_is_peer_connected(const guint8 *peer_id, gint32 peer_id_length, gint32 *is_connected)
+{
+       __ASP_LOG_FUNC_ENTER__;
+       gint32 result = 0;
 
        __ASP_LOG_FUNC_EXIT__;
        return result;
@@ -146,4 +155,12 @@ asp_tech_ops_s asp_tech_nfc_ops = {
                .connect_session = asp_tech_nfc_connect_session,
                .confirm_session = asp_tech_nfc_confirm_session,
                .destroy_connection = asp_tech_nfc_destroy_connection,
+               .is_peer_connected = asp_tech_nfc_is_peer_connected,
+               .session_request_cb = NULL,
+               .session_request_cb_user_data = NULL,
+               .session_config_request_cb = NULL,
+               .connect_status_cb = NULL,
+               .connect_status_cb_user_data = NULL,
+               .ip_assigned_cb = NULL,
+               .ip_assigned_cb_user_data = NULL,
 };
index a41d0a1..42345cb 100755 (executable)
@@ -73,6 +73,8 @@
                g_free(parameters_debug_str);\
        } while (0)
 
+asp_tech_ops_s asp_tech_p2p_ops;
+
 void asp_tech_p2p_process_activation(GDBusConnection *connection,
                const gchar *object_path, GVariant *parameters);
 
@@ -98,8 +100,8 @@ static GDBusConnection *g_wfd_gdbus_conn;
 static guint g_wfd_signal_id;
 
 static struct {
-       const char *interface;
-       const char *member;
+       const gchar *interface;
+       const gchar *member;
        void (*function) (GDBusConnection *connection,
                          const gchar *object_path,
                          GVariant *parameters);
@@ -145,9 +147,9 @@ static struct {
  * Local Functions Definition
  *****************************************************************************/
 
-static int __net_wifidirect_gerror_to_enum(GError* error)
+static gint32 __net_wifidirect_gerror_to_enum(GError* error)
 {
-       int res = 0;
+       gint32 res = 0;
        if (error == NULL) {
                ASP_LOGI("GError is NULL!!");
                return res;
@@ -185,7 +187,7 @@ static void __asp_tech_p2p_dbus_signal_cb(GDBusConnection *connection,
                const gchar *interface, const gchar *signal,
                GVariant *parameters, gpointer user_data)
 {
-       int i = 0;
+       gint32 i = 0;
 
        ASP_LOGD("Signal Name [%s]", signal);
        DBUS_DEBUG_VARIANT(parameters);
@@ -232,11 +234,11 @@ static GVariant *__g_hash_keys_to_g_variant(GHashTable *hash)
        return g_variant_builder_end(&builder);
 }
 
-GVariant *__asp_tech_p2p_dbus_method_call_sync_debug(const char* interface_name,
-                                                 const char* method,
+GVariant *__asp_tech_p2p_dbus_method_call_sync_debug(const gchar* interface_name,
+                                                 const gchar* method,
                                                  GVariant *params,
                                                  GError **error,
-                                                 const char *calling_func)
+                                                 const gchar *calling_func)
 {
        GVariant *reply = NULL;
 
@@ -293,16 +295,16 @@ void asp_tech_p2p_process_search_result(GDBusConnection *connection,
        GVariantIter *iter = NULL;
        GVariant *var = NULL;
        asp_event_data event;
-       const char *service_mac = NULL;
-       const char *key = NULL;
-       const char *str = NULL;
+       const gchar *service_mac = NULL;
+       const gchar *key = NULL;
+       const gchar *str = NULL;
        long long unsigned search_id = 0;
-       char *device_name = NULL;
-       unsigned int advertisement_id = 0;
-       unsigned int config_method = 0;
-       char *instance_name = NULL;
-       char *service_info = NULL;
-       unsigned char status = 0;
+       gchar *device_name = NULL;
+       guint32 advertisement_id = 0;
+       guint32 config_method = 0;
+       gchar *instance_name = NULL;
+       gchar *service_info = NULL;
+       guint8 status = 0;
 
        if (!parameters) {
                __ASP_LOG_FUNC_EXIT__;
@@ -337,7 +339,7 @@ void asp_tech_p2p_process_search_result(GDBusConnection *connection,
        event.search_result.search_id = search_id;
        event.search_result.advertisement_id = advertisement_id;
        event.search_result.service_status = status;
-       memcpy(event.search_result.service_mac, service_mac, MACSTR_LEN);
+       memcpy(event.search_result.service_mac, service_mac, MACSTR_LEN + 1);
        event.search_result.device_name = device_name;
        event.search_result.instance_name = instance_name;
        event.search_result.service_info = NULL;
@@ -358,16 +360,17 @@ void asp_tech_p2p_process_session_request(GDBusConnection *connection,
 
        GVariantIter *iter = NULL;
        GVariant *var = NULL;
-       asp_event_data event;
-       unsigned char session_mac[MAC_LEN] = {0,};
-       const char *key = NULL;
-       const char *str = NULL;
-       unsigned int advertisement_id = 0;
-       unsigned int session_id = 0;
+       const gchar *key = NULL;
+       const gchar *str = NULL;
+       guint8 session_mac[MAC_LEN] = {0,};
+       guint32 session_id = 0;
+       guint32 adv_id = 0;
+       gchar *device_name = NULL;
+       size_t name_length = 0;
+       guint8 *session_info = NULL;
+       size_t info_length = 0;
        gboolean get_pin = FALSE;
-       const char *pin = NULL;
-       char *device_name = NULL;
-       char *session_info = NULL;
+       guint32 pin = 0;
 
        if (!parameters) {
                __ASP_LOG_FUNC_EXIT__;
@@ -377,7 +380,7 @@ void asp_tech_p2p_process_session_request(GDBusConnection *connection,
        g_variant_get(parameters, "(a{sv})", &iter);
        while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
                if (!g_strcmp0(key, "adv_id")) {
-                       g_variant_get(var, "u", &advertisement_id);
+                       g_variant_get(var, "u", &adv_id);
                } else if (!g_strcmp0(key, "session_mac")) {
                        if (asp_dbus_unpack_ay(session_mac, var, MAC_LEN) < 0)
                                return;
@@ -386,30 +389,28 @@ void asp_tech_p2p_process_session_request(GDBusConnection *connection,
                }  else if (!g_strcmp0(key, "device_name")) {
                        g_variant_get(var, "&s", &str);
                        device_name = g_strndup(str, ASP_SERVICE_DEVICE_NAME_LEN);
+                       name_length = strlen(str);
                } else if (!g_strcmp0(key, "get_pin")) {
                        g_variant_get(var, "b", &get_pin);
                } else if (!g_strcmp0(key, "pin")) {
-                       g_variant_get(var, "&s", &pin);
+                       g_variant_get(var, "&s", &str);
+                       pin = (guint32)atoi(str);
                } else if (!g_strcmp0(key, "session_info")) {
                        g_variant_get(var, "&s", &str);
-                       session_info = g_strdup(str);
+                       info_length = strlen(str);
+                       session_info = g_try_malloc0(info_length + 1);
+                       memcpy(session_info, str, info_length);
                } else {
                                ;/* Do Nothing */
                }
        }
 
-       memset(&event, 0x0, sizeof(asp_event_data));
-       event.session_request.tech = ASP_TECH_P2P;
-       event.session_request.advertisement_id = advertisement_id;
-       g_snprintf(event.session_request.session_mac, MACSTR_LEN, MACSTR,
-                       MAC2STR(session_mac));
-       event.session_request.session_id = session_id;
-       event.session_request.device_name = device_name;
-       event.session_request.get_pin = get_pin;
-       if (pin)
-               g_strlcpy(event.session_request.pin, pin, PINSTR_LEN);
-       event.session_request.session_info = session_info;
-       asp_manager_event(NULL, ASP_EVENT_SESSION_REQUEST, &event);
+       if (asp_tech_p2p_ops.session_request_cb) {
+               asp_tech_p2p_ops.session_request_cb(0, session_mac, session_id,
+                               adv_id, device_name, name_length,
+                               session_info, info_length, get_pin, pin,
+                               asp_tech_p2p_ops.session_request_cb_user_data);
+       }
 
        g_free(device_name);
        g_free(session_info);
@@ -425,11 +426,12 @@ void asp_tech_p2p_process_session_config_request(GDBusConnection *connection,
 
        GVariantIter *iter = NULL;
        GVariant *var = NULL;
-       asp_event_data event;
-       const char *key = NULL;
-       unsigned int session_id = 0;
+       const gchar *key = NULL;
+       const gchar *str = NULL;
+       const guint8 session_mac[MAC_LEN] = {0,};
+       guint32 session_id = 0;
        gboolean get_pin = FALSE;
-       const char *pin = NULL;
+       guint32 pin = 0;
 
        if (!parameters) {
                __ASP_LOG_FUNC_EXIT__;
@@ -438,23 +440,23 @@ void asp_tech_p2p_process_session_config_request(GDBusConnection *connection,
 
        g_variant_get(parameters, "(a{sv})", &iter);
        while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
-               if (!g_strcmp0(key, "session_id"))
+               if (!g_strcmp0(key, "session_id")) {
                        g_variant_get(var, "u", &session_id);
-               else if (!g_strcmp0(key, "get_pin"))
+               } else if (!g_strcmp0(key, "get_pin")) {
                        g_variant_get(var, "b", &get_pin);
-               else if (!g_strcmp0(key, "pin"))
-                       g_variant_get(var, "&s", &pin);
-               else
+               } else if (!g_strcmp0(key, "pin")) {
+                       g_variant_get(var, "&s", &str);
+                       pin = (guint32)atoi(str);
+               } else {
                        ;/* Do Nothing */
+               }
        }
 
-       memset(&event, 0x0, sizeof(asp_event_data));
-       event.session_config_request.tech = ASP_TECH_P2P;
-       event.session_config_request.session_id = session_id;
-       event.session_config_request.get_pin = get_pin;
-       if (pin)
-               g_strlcpy(event.session_request.pin, pin, PINSTR_LEN);
-       asp_manager_event(NULL, ASP_EVENT_SESSION_CONFIG_REQUEST, &event);
+       if (asp_tech_p2p_ops.session_config_request_cb) {
+               asp_tech_p2p_ops.session_config_request_cb(0,
+                               session_mac, session_id, get_pin, pin,
+                               asp_tech_p2p_ops.session_config_request_cb_user_data);
+       }
 
        __ASP_LOG_FUNC_EXIT__;
        return;
@@ -467,13 +469,12 @@ void asp_tech_p2p_process_connect_status(GDBusConnection *connection,
 
        GVariantIter *iter = NULL;
        GVariant *var = NULL;
-       asp_event_data event;
-       unsigned char session_mac[MAC_LEN] = {0,};
-       const char *key = NULL;
-       const char *str = NULL;
-       unsigned int session_id = 0;
-       char status = 0;
-       char *deferred = NULL;
+       const gchar *key = NULL;
+       const gchar *str = NULL;
+       guint8 session_mac[MAC_LEN] = {0,};
+       guint32 session_id = 0;
+       guint32 status = 0;
+       gchar *deferred = NULL;
 
        if (!parameters) {
                __ASP_LOG_FUNC_EXIT__;
@@ -497,14 +498,11 @@ void asp_tech_p2p_process_connect_status(GDBusConnection *connection,
                }
        }
 
-       memset(&event, 0x0, sizeof(asp_event_data));
-       event.connect_status.tech = ASP_TECH_P2P;
-       g_snprintf(event.connect_status.session_mac, MACSTR_LEN, MACSTR,
-                       MAC2STR(session_mac));
-       event.connect_status.session_id = session_id;
-       event.connect_status.status = status;
-       event.connect_status.deferred = deferred;
-       asp_manager_event(NULL, ASP_EVENT_CONNECT_STATUS, &event);
+       if (asp_tech_p2p_ops.connect_status_cb) {
+               asp_tech_p2p_ops.connect_status_cb(0,
+                               session_mac, session_id, status,
+                               asp_tech_p2p_ops.connect_status_cb_user_data);
+       }
 
        g_free(deferred);
 
@@ -512,14 +510,14 @@ void asp_tech_p2p_process_connect_status(GDBusConnection *connection,
        return;
 }
 
-int asp_tech_p2p_advertise(asp_service_advertise_s *service, int replace)
+gint32 asp_tech_p2p_advertise(asp_service_advertise_s *service, gint32 replace)
 {
        __ASP_LOG_FUNC_ENTER__;
        GVariantBuilder *builder = NULL;
        GVariant *params = NULL;
        GError *error = NULL;
        GVariant *reply = NULL;
-       int result = 0;
+       gint32 result = 0;
 
        if (!service || !g_wfd_gdbus_conn) {
                ASP_LOGE("Invalid parameter!");
@@ -567,13 +565,13 @@ int asp_tech_p2p_advertise(asp_service_advertise_s *service, int replace)
        return result;
 }
 
-int asp_tech_p2p_cancel_advertise(asp_service_advertise_s *service)
+gint32 asp_tech_p2p_cancel_advertise(asp_service_advertise_s *service)
 {
        __ASP_LOG_FUNC_ENTER__;
        GVariant *params = NULL;
        GError *error = NULL;
        GVariant *reply = NULL;
-       int result = 0;
+       gint32 result = 0;
 
        if (!service || !g_wfd_gdbus_conn) {
                ASP_LOGE("Invalid parameter!");
@@ -600,14 +598,14 @@ int asp_tech_p2p_cancel_advertise(asp_service_advertise_s *service)
        return result;
 }
 
-int asp_tech_p2p_seek(asp_service_seek_s *service)
+gint32 asp_tech_p2p_seek(asp_service_seek_s *service)
 {
        __ASP_LOG_FUNC_ENTER__;
        GVariantBuilder *builder = NULL;
        GVariant *params = NULL;
        GError *error = NULL;
        GVariant *reply = NULL;
-       int result = 0;
+       gint32 result = 0;
 
        if (!service || !g_wfd_gdbus_conn) {
                ASP_LOGE("Invalid parameter!");
@@ -644,13 +642,13 @@ int asp_tech_p2p_seek(asp_service_seek_s *service)
        return result;
 }
 
-int asp_tech_p2p_cancel_seek(asp_service_seek_s *service)
+gint32 asp_tech_p2p_cancel_seek(asp_service_seek_s *service)
 {
        __ASP_LOG_FUNC_ENTER__;
        GVariant *params = NULL;
        GError *error = NULL;
        GVariant *reply = NULL;
-       int result = 0;
+       gint32 result = 0;
 
        if (!service || !g_wfd_gdbus_conn) {
                ASP_LOGE("Invalid parameter!");
@@ -677,15 +675,15 @@ int asp_tech_p2p_cancel_seek(asp_service_seek_s *service)
        return result;
 }
 
-int asp_tech_p2p_init()
+gint32 asp_tech_p2p_init()
 {
        __ASP_LOG_FUNC_ENTER__;
        GError* error = NULL;
        GVariant *reply = NULL;
        g_wfd_gdbus_conn = NULL;
        asp_s *asp = NULL;
-       const char *str = NULL;
-       int result = 0;
+       const gchar *str = NULL;
+       gint32 result = 0;
 
        asp = asp_get_manager();
        if (asp == NULL) {
@@ -725,6 +723,7 @@ int asp_tech_p2p_init()
                return result;
        }
        g_variant_get(reply, "(i&s)", &result, &str);
+       g_strlcpy(asp->p2p_local_address_str, str, MACSTR_LEN + 1);
        macaddr_atoe(str, asp->p2p_local_address);
 
        g_variant_unref(reply);
@@ -739,7 +738,7 @@ int asp_tech_p2p_init()
                return result;
        }
        g_variant_get(reply, "(i&s)", &result, &str);
-       g_strlcpy(asp->p2p_device_name, str, DEVICE_NAME_LEN);
+       g_strlcpy(asp->p2p_device_name, str, DEVICE_NAME_LEN + 1);
 
        g_variant_unref(reply);
 
@@ -747,10 +746,10 @@ int asp_tech_p2p_init()
        return result;
 }
 
-int asp_tech_p2p_deinit()
+gint32 asp_tech_p2p_deinit()
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
 
        if (g_wfd_gdbus_conn == NULL)
                return -1;
@@ -767,7 +766,7 @@ int asp_tech_p2p_deinit()
        return result;
 }
 
-int asp_tech_p2p_get_peer_role(unsigned char *mac_addr, int *is_connected, int *role)
+gint32 asp_tech_p2p_get_peer_role(const guint8 *mac_addr, gint32 *is_connected, gint32 *role)
 {
        __ASP_LOG_FUNC_ENTER__;
        GVariant *params = NULL;
@@ -777,14 +776,14 @@ int asp_tech_p2p_get_peer_role(unsigned char *mac_addr, int *is_connected, int *
        GVariantIter *iter_peer = NULL;
        GVariant *var = NULL;
        gchar *key = NULL;
-       char mac_address[18] = {0,};
+       gchar mac_address[18] = {0,};
        gboolean is_group_client = FALSE;
        gboolean is_group_owner = FALSE;
        gboolean is_in_group = FALSE;
-       int result = 0;
+       gint32 result = 0;
 
        /* Get P2P peer info*/
-       g_snprintf(mac_address, MACSTR_LEN, MACSTR, MAC2STR(mac_addr));
+       g_snprintf(mac_address, MACSTR_LEN + 1, MACSTR, MAC2STR(mac_addr));
        params = g_variant_new("(s)", mac_address);
        reply = asp_tech_p2p_dbus_method_call_sync(WFD_MANAGER_MANAGE_INTERFACE,
                                                  "GetPeerInfo", params, &error);
@@ -828,22 +827,22 @@ int asp_tech_p2p_get_peer_role(unsigned char *mac_addr, int *is_connected, int *
        return result;
 }
 
-int __asp_tech_p2p_send_prov(asp_connect_session_params *params)
+gint32 __asp_tech_p2p_send_prov(asp_tech_session_request_params_s *params)
 {
        GVariantBuilder *builder = NULL;
        GVariant *variant_params = NULL;
        GVariant *reply = NULL;
        GError* error = NULL;
-       char mac_str[MACSTR_LEN + 1] = {0, };
-       int result = 0;
+       gchar mac_str[MACSTR_LEN + 1] = {0, };
+       gint32 result = 0;
 
        builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
 
-       g_snprintf(mac_str, MACSTR_LEN, MACSTR, MAC2STR(params->service_mac));
+       g_snprintf(mac_str, MACSTR_LEN + 1, MACSTR, MAC2STR(params->service_mac));
        g_variant_builder_add(builder, "{sv}", "service_mac", g_variant_new("s", mac_str));
        g_variant_builder_add(builder, "{sv}", "adv_id", g_variant_new("u", params->advertisement_id));
 
-       g_snprintf(mac_str, MACSTR_LEN, MACSTR, MAC2STR(params->session_mac));
+       g_snprintf(mac_str, MACSTR_LEN + 1, MACSTR, MAC2STR(params->session_mac));
        g_variant_builder_add(builder, "{sv}", "session_mac", g_variant_new("s", mac_str));
        g_variant_builder_add(builder, "{sv}", "session_id", g_variant_new("u", params->session_id));
        g_variant_builder_add(builder, "{sv}", "role", g_variant_new("y", params->network_role));
@@ -871,12 +870,12 @@ int __asp_tech_p2p_send_prov(asp_connect_session_params *params)
        return result;
 }
 
-int asp_tech_p2p_connect_session(asp_connect_session_params *params)
+gint32 asp_tech_p2p_connect_session(asp_tech_session_request_params_s *params)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int is_connected = 0;
-       int role = ASP_TECH_P2P_ROLE_NEW;
-       int result = 0;
+       gint32 is_connected = 0;
+       gint32 role = ASP_TECH_P2P_ROLE_NEW;
+       gint32 result = 0;
 
        result = asp_tech_p2p_get_peer_role(params->service_mac, &is_connected, &role);
        if (result < 0) {
@@ -891,37 +890,33 @@ int asp_tech_p2p_connect_session(asp_connect_session_params *params)
                        __ASP_LOG_FUNC_EXIT__;
                        return ASP_ERROR_NETWORK_ROLE_REJECTED;
        }
-
-       if (!is_connected) {
-               ASP_LOGD("Device is not connected");
-               result = __asp_tech_p2p_send_prov(params);
-       } else {
-               ASP_LOGD("Device is connected");
-
-       }
+       result = __asp_tech_p2p_send_prov(params);
 
        __ASP_LOG_FUNC_EXIT__;
        return result;
 }
 
-int asp_tech_p2p_confirm_session(unsigned char *session_mac, int session_id, int confirm, const char *pin)
+gint32 asp_tech_p2p_confirm_session(const guint8 *session_mac, gint32 session_id, gint32 confirm, guint32 pin)
 {
        __ASP_LOG_FUNC_ENTER__;
        GVariantBuilder *builder = NULL;
        GVariant *params = NULL;
        GVariant *reply = NULL;
        GError* error = NULL;
-       char mac_str[MACSTR_LEN + 1] = {0, };
-       int result = 0;
+       gchar mac_str[MACSTR_LEN + 1] = {0, };
+       gchar pin_str[PINSTR_LEN + 1] = {0, };
+       gint32 result = 0;
 
        builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
 
-       g_snprintf(mac_str, MACSTR_LEN, MACSTR, MAC2STR(session_mac));
+       g_snprintf(mac_str, MACSTR_LEN + 1, MACSTR, MAC2STR(session_mac));
        g_variant_builder_add(builder, "{sv}", "service_mac", g_variant_new("s", mac_str));
        g_variant_builder_add(builder, "{sv}", "session_id", g_variant_new("u", session_id));
        g_variant_builder_add(builder, "{sv}", "confirm", g_variant_new("i", confirm));
-       if (pin)
-               g_variant_builder_add(builder, "{sv}", "pin", g_variant_new("s", pin));
+       if (pin != 0) {
+               g_snprintf(pin_str, PINSTR_LEN + 1, "%u", pin);
+               g_variant_builder_add(builder, "{sv}", "pin", g_variant_new("s", pin_str));
+       }
 
        params = g_variant_new("(a{sv})", builder);
        g_variant_builder_unref(builder);
@@ -943,13 +938,15 @@ int asp_tech_p2p_confirm_session(unsigned char *session_mac, int session_id, int
        return result;
 }
 
-int asp_tech_p2p_destroy_connection()
+gint32 asp_tech_p2p_destroy_connection(const guint8 *peer_id, gint32 peer_id_length)
 {
        __ASP_LOG_FUNC_ENTER__;
        GVariant *reply = NULL;
        GError* error = NULL;
-       int result = 0;
+       gchar mac_str[MACSTR_LEN + 1] = {0, };
+       gint32 result = 0;
 
+       g_snprintf(mac_str, MACSTR_LEN + 1, MACSTR, MAC2STR(peer_id));
        /* Destroy ASP P2P Group */
        reply = asp_tech_p2p_dbus_method_call_sync(WFD_MANAGER_GROUP_INTERFACE,
                                                  "DestroyGroup", NULL, &error);
@@ -967,6 +964,18 @@ int asp_tech_p2p_destroy_connection()
        return result;
 }
 
+gint32 asp_tech_p2p_is_peer_connected(const guint8 *peer_id, gint32 peer_id_length, gint32 *is_connected)
+{
+       __ASP_LOG_FUNC_ENTER__;
+       gint32 role = 0;
+       gint32 result = 0;
+
+       result = asp_tech_p2p_get_peer_role(peer_id, is_connected, &role);
+
+       __ASP_LOG_FUNC_EXIT__;
+       return result;
+}
+
 asp_tech_ops_s asp_tech_p2p_ops = {
                .init = asp_tech_p2p_init,
                .deinit = asp_tech_p2p_deinit,
@@ -977,4 +986,12 @@ asp_tech_ops_s asp_tech_p2p_ops = {
                .connect_session = asp_tech_p2p_connect_session,
                .confirm_session = asp_tech_p2p_confirm_session,
                .destroy_connection = asp_tech_p2p_destroy_connection,
+               .is_peer_connected = asp_tech_p2p_is_peer_connected,
+               .session_request_cb = NULL,
+               .session_request_cb_user_data = NULL,
+               .session_config_request_cb = NULL,
+               .connect_status_cb = NULL,
+               .connect_status_cb_user_data = NULL,
+               .ip_assigned_cb = NULL,
+               .ip_assigned_cb_user_data = NULL,
 };
index 5db7fb5..05b6104 100755 (executable)
@@ -73,7 +73,7 @@ asp_tech_ops_s *asp_techs[] = {
 void asp_tech_init()
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
 
        result = asp_techs[ASP_TECH_P2P]->init();
        if (result < 0) {
@@ -81,7 +81,6 @@ void asp_tech_init()
                /* TODO : exclude p2p technology */
        }
 
-
        result = asp_techs[ASP_TECH_INFRA]->init();
        if (result < 0) {
                ASP_LOGE("Failed to initialize infra");
@@ -95,7 +94,7 @@ void asp_tech_init()
 void asp_tech_deinit()
 {
        __ASP_LOG_FUNC_ENTER__;
-       int result = 0;
+       gint32 result = 0;
 
        result = asp_techs[ASP_TECH_P2P]->deinit();
        if (result < 0) {
@@ -103,7 +102,6 @@ void asp_tech_deinit()
                /* TODO : exclude p2p technology */
        }
 
-
        result = asp_techs[ASP_TECH_INFRA]->deinit();
        if (result < 0) {
                ASP_LOGE("Failed to deinitialize infra");
@@ -114,12 +112,12 @@ void asp_tech_deinit()
        return;
 }
 
-int asp_tech_advertise(int tech, asp_service_advertise_s *service, int replace)
+gint32 asp_tech_advertise(gint32 tech, asp_service_advertise_s *service, gint32 replace)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int tech_idx = 0;
-       int i = 0;
-       int result = 0;
+       gint32 tech_idx = 0;
+       gint32 i = 0;
+       gint32 result = 0;
 
        for (i = ASP_TECH_P2P; i != ASP_TECH_MAX; i++) {
                tech_idx =  1 << (i - 1);
@@ -135,12 +133,12 @@ int asp_tech_advertise(int tech, asp_service_advertise_s *service, int replace)
        return result;
 }
 
-int asp_tech_cancel_advertise(int tech, asp_service_advertise_s *service)
+gint32 asp_tech_cancel_advertise(gint32 tech, asp_service_advertise_s *service)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int tech_idx = 0;
-       int i = 0;
-       int result = 0;
+       gint32 tech_idx = 0;
+       gint32 i = 0;
+       gint32 result = 0;
 
        for (i = ASP_TECH_P2P; i != ASP_TECH_MAX; i++) {
                tech_idx =  1 << (i - 1);
@@ -155,12 +153,12 @@ int asp_tech_cancel_advertise(int tech, asp_service_advertise_s *service)
        return result;
 }
 
-int asp_tech_seek(int tech, asp_service_seek_s *service)
+gint32 asp_tech_seek(gint32 tech, asp_service_seek_s *service)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int tech_idx = 0;
-       int i = 0;
-       int result = 0;
+       gint32 tech_idx = 0;
+       gint32 i = 0;
+       gint32 result = 0;
 
        for (i = 1; i != ASP_TECH_MAX; i++) {
                tech_idx =  1 << (i - 1);
@@ -175,12 +173,12 @@ int asp_tech_seek(int tech, asp_service_seek_s *service)
        return result;
 }
 
-int asp_tech_cancel_seek(int tech, asp_service_seek_s *service)
+gint32 asp_tech_cancel_seek(gint32 tech, asp_service_seek_s *service)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int tech_idx = 0;
-       int i = 0;
-       int result = 0;
+       gint32 tech_idx = 0;
+       gint32 i = 0;
+       gint32 result = 0;
 
        for (i = 1; i != ASP_TECH_MAX; i++) {
                tech_idx =  1 << (i - 1);
@@ -195,12 +193,12 @@ int asp_tech_cancel_seek(int tech, asp_service_seek_s *service)
        return result;
 }
 
-int asp_tech_connect_session(int tech, asp_connect_session_params *params)
+gint32 asp_tech_connect_session(gint32 tech, asp_tech_session_request_params_s *params)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int tech_idx = 0;
-       int i = 0;
-       int result = 0;
+       gint32 tech_idx = 0;
+       gint32 i = 0;
+       gint32 result = 0;
 
        for (i = 1; i != ASP_TECH_MAX; i++) {
                tech_idx =  1 << (i - 1);
@@ -216,12 +214,12 @@ int asp_tech_connect_session(int tech, asp_connect_session_params *params)
        return result;
 }
 
-int asp_tech_confirm_session(int tech, unsigned char *session_mac, int session_id, int confirm, const char *pin)
+gint32 asp_tech_confirm_session(gint32 tech, const guint8 *session_mac, gint32 session_id, gint32 confirm, guint32 pin)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int tech_idx = 0;
-       int i = 0;
-       int result = 0;
+       gint32 tech_idx = 0;
+       gint32 i = 0;
+       gint32 result = 0;
 
        for (i = 1; i != ASP_TECH_MAX; i++) {
                tech_idx =  1 << (i - 1);
@@ -237,18 +235,38 @@ int asp_tech_confirm_session(int tech, unsigned char *session_mac, int session_i
        return result;
 }
 
-int asp_tech_destroy_connection(int tech)
+gint32 asp_tech_destroy_connection(gint32 tech, const guint8 *peer_id, gint32 peer_id_length)
 {
        __ASP_LOG_FUNC_ENTER__;
-       int tech_idx = 0;
-       int i = 0;
-       int result = 0;
+       gint32 tech_idx = 0;
+       gint32 i = 0;
+       gint32 result = 0;
 
        for (i = 1; i != ASP_TECH_MAX; i++) {
                tech_idx =  1 << (i - 1);
                if (tech & tech_idx) {
                        ASP_LOGD("Destroy connection using tech %d", tech_idx);
-                       result = asp_techs[i]->destroy_connection();
+                       result = asp_techs[i]->destroy_connection(peer_id, peer_id_length);
+               }
+               /* TODO */
+               /* error handling */
+       }
+       __ASP_LOG_FUNC_EXIT__;
+       return result;
+}
+
+gint32 asp_tech_is_peer_connected(gint32 tech, const guint8 *peer_id, gint32 peer_id_length, gint32 *is_connected)
+{
+       __ASP_LOG_FUNC_ENTER__;
+       gint32 tech_idx = 0;
+       gint32 i = 0;
+       gint32 result = 0;
+
+       for (i = 1; i != ASP_TECH_MAX; i++) {
+               tech_idx =  1 << (i - 1);
+               if (tech & tech_idx) {
+                       ASP_LOGD("Is peer connected using tech %d", tech_idx);
+                       result = asp_techs[i]->is_peer_connected(peer_id, peer_id_length, is_connected);
                }
                /* TODO */
                /* error handling */
@@ -256,3 +274,83 @@ int asp_tech_destroy_connection(int tech)
        __ASP_LOG_FUNC_EXIT__;
        return result;
 }
+
+void asp_tech_set_session_request_cb(gint32 tech, asp_tech_session_request_cb cb, gpointer user_data)
+{
+       __ASP_LOG_FUNC_ENTER__;
+       gint32 tech_idx = 0;
+       gint32 i = 0;
+
+       for (i = 1; i != ASP_TECH_MAX; i++) {
+               tech_idx =  1 << (i - 1);
+               if (tech & tech_idx) {
+                       ASP_LOGD("Set session_request_cb using tech %d", tech_idx);
+                       asp_techs[i]->session_request_cb = cb;
+                       asp_techs[i]->session_request_cb_user_data = user_data;
+               }
+               /* TODO */
+               /* error handling */
+       }
+       __ASP_LOG_FUNC_EXIT__;
+       return;
+}
+
+void asp_tech_set_session_config_request_cb(gint32 tech, asp_tech_session_config_request_cb cb, gpointer user_data)
+{
+       __ASP_LOG_FUNC_ENTER__;
+       gint32 tech_idx = 0;
+       gint32 i = 0;
+
+       for (i = 1; i != ASP_TECH_MAX; i++) {
+               tech_idx =  1 << (i - 1);
+               if (tech & tech_idx) {
+                       ASP_LOGD("Set session_config_request_cb using tech %d", tech_idx);
+                       asp_techs[i]->session_config_request_cb = cb;
+                       asp_techs[i]->session_config_request_cb_user_data = user_data;
+               }
+               /* TODO */
+               /* error handling */
+       }
+       __ASP_LOG_FUNC_EXIT__;
+       return;
+}
+
+void asp_tech_set_connect_status_cb(gint32 tech, asp_tech_connect_status_cb cb, gpointer user_data)
+{
+       __ASP_LOG_FUNC_ENTER__;
+       gint32 tech_idx = 0;
+       gint32 i = 0;
+
+       for (i = 1; i != ASP_TECH_MAX; i++) {
+               tech_idx =  1 << (i - 1);
+               if (tech & tech_idx) {
+                       ASP_LOGD("Set connect_status_cb using tech %d", tech_idx);
+                       asp_techs[i]->connect_status_cb = cb;
+                       asp_techs[i]->connect_status_cb_user_data = user_data;
+               }
+               /* TODO */
+               /* error handling */
+       }
+       __ASP_LOG_FUNC_EXIT__;
+       return;
+}
+
+void asp_tech_set_ip_assigned_cb(gint32 tech, asp_tech_ip_assigned_cb cb, gpointer user_data)
+{
+       __ASP_LOG_FUNC_ENTER__;
+       gint32 tech_idx = 0;
+       gint32 i = 0;
+
+       for (i = 1; i != ASP_TECH_MAX; i++) {
+               tech_idx =  1 << (i - 1);
+               if (tech & tech_idx) {
+                       ASP_LOGD("Set ip_assigned_cb using tech %d", tech_idx);
+                       asp_techs[i]->ip_assigned_cb = cb;
+                       asp_techs[i]->ip_assigned_cb_user_data = user_data;
+               }
+               /* TODO */
+               /* error handling */
+       }
+       __ASP_LOG_FUNC_EXIT__;
+       return;
+}