#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__ */
#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"
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__ */
#define EXPORT_API __attribute__((visibility("default")))
+#include <glib.h>
+
#define MAC_LEN 6
+#define MACSTR_LEN 17
#define DEVICE_NAME_LEN 32
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();
} 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);
#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__ */
#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,
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 {
/**
* 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;
/**
* 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;
/**
* 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__ */
<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'>
<signal name='SessionStatus'>
<arg type='a{sv}' name='parameters'/>
</signal>
+ <signal name='PortStatus'>
+ <arg type='a{sv}' name='parameters'/>
+ </signal>
</interface>
</node>
* 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__;
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,
__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__;
#include "asp-manager-gdbus.h"
#include "asp-service.h"
#include "asp-session.h"
+#include "asp-tech.h"
#include "generated-code.h"
#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",
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) {
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) {
__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) {
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) {
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:
__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) {
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;
{
__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(¶ms, 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(¶ms, &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:
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);
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);
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);
{
__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__;
{
__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__;
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;
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;
__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;
__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__;
__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__;
__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__;
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));
__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__;
__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__;
__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__;
__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__;
+}
+
* 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;
}
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");
* 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;
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;
{
__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) {
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)
* 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);
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);
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);
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);
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;
--- /dev/null
+/*
+ * 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);
+}
--- /dev/null
+/*
+ * 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__ */
--- /dev/null
+/*
+ * 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, ¶ms);
+ 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;
+}
--- /dev/null
+#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
--- /dev/null
+/*
+ * 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__ */
--- /dev/null
+#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; */
+}
--- /dev/null
+#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
+
/*****************************************************************************
* 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;
}
+++ /dev/null
-/*
- * 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;
-}
--- /dev/null
+#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;
+}
--- /dev/null
+#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
* 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;
.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,
};
* 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;
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;
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));
}
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);
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);
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;
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");
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;
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:
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) {
}
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");
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) {
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) {
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);
}
/* 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;
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,
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,
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,
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;
.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,
};
* 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;
.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,
};
* 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;
.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,
};
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);
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);
* 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;
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);
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;
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__;
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;
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__;
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;
} 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);
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__;
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;
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__;
}
}
- 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);
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!");
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!");
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!");
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!");
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) {
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);
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);
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;
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;
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);
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));
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) {
__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);
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);
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,
.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,
};
void asp_tech_init()
{
__ASP_LOG_FUNC_ENTER__;
- int result = 0;
+ gint32 result = 0;
result = asp_techs[ASP_TECH_P2P]->init();
if (result < 0) {
/* TODO : exclude p2p technology */
}
-
result = asp_techs[ASP_TECH_INFRA]->init();
if (result < 0) {
ASP_LOGE("Failed to initialize infra");
void asp_tech_deinit()
{
__ASP_LOG_FUNC_ENTER__;
- int result = 0;
+ gint32 result = 0;
result = asp_techs[ASP_TECH_P2P]->deinit();
if (result < 0) {
/* TODO : exclude p2p technology */
}
-
result = asp_techs[ASP_TECH_INFRA]->deinit();
if (result < 0) {
ASP_LOGE("Failed to deinitialize infra");
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);
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);
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);
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);
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);
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);
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 */
__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;
+}