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