From: Cheoleun Moon Date: Mon, 20 Jul 2020 07:24:55 +0000 (+0900) Subject: Revise directory structure X-Git-Tag: submit/tizen/20200720.073624^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fheads%2Ftizen_6.0;p=platform%2Fcore%2Fconnectivity%2Fasp-manager.git Revise directory structure Change-Id: Ifc73069efe05d2bad2229c19dd473dba117424bc --- diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3f7b423..dfe4d34 100755 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -22,24 +22,31 @@ INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include) INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/interfaces) SET(SRCS + ${CMAKE_SOURCE_DIR}/src/asp-coordination-protocol.c ${CMAKE_SOURCE_DIR}/src/asp-manager.c ${CMAKE_SOURCE_DIR}/src/asp-manager-event.c ${CMAKE_SOURCE_DIR}/src/asp-manager-gdbus.c - ${CMAKE_SOURCE_DIR}/src/asp-manager-util.c ${CMAKE_SOURCE_DIR}/src/asp-manager-main.c + ${CMAKE_SOURCE_DIR}/src/asp-manager-util.c + ${CMAKE_SOURCE_DIR}/src/asp-p2p-conn.c + ${CMAKE_SOURCE_DIR}/src/asp-service.c + ${CMAKE_SOURCE_DIR}/src/asp-session.c + ${CMAKE_SOURCE_DIR}/src/asp-session-peer.c + ${CMAKE_SOURCE_DIR}/src/asp-tech-ble.c + ${CMAKE_SOURCE_DIR}/src/asp-tech.c + ${CMAKE_SOURCE_DIR}/src/asp-tech-infra.c + ${CMAKE_SOURCE_DIR}/src/asp-tech-nan.c + ${CMAKE_SOURCE_DIR}/src/asp-tech-nfc.c + ${CMAKE_SOURCE_DIR}/src/asp-tech-p2p.c + ${CMAKE_SOURCE_DIR}/src/gfsm.c ${CMAKE_SOURCE_DIR}/interfaces/generated-code.c ) SET_SOURCE_FILES_PROPERTIES(${CMAKE_SOURCE_DIR}/interfaces/generated-code.c PROPERTIES GENERATED TRUE) -FILE(GLOB SERVICE_SRCS ${CMAKE_SOURCE_DIR}/src/service/*.c) -FILE(GLOB SESSION_SRCS ${CMAKE_SOURCE_DIR}/src/session/*.c) -FILE(GLOB TECH_SRCS ${CMAKE_SOURCE_DIR}/src/tech/*.c) - - ADD_DEFINITIONS("-DUSE_DLOG") -ADD_EXECUTABLE(${PROJECT_NAME} ${SRCS} ${SERVICE_SRCS} ${SESSION_SRCS} ${TECH_SRCS}) +ADD_EXECUTABLE(${PROJECT_NAME} ${SRCS}) ADD_DEPENDENCIES(${PROJECT_NAME} GENERATED_DBUS_CODE) TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${asp_pkgs_LDFLAGS} -ldl) diff --git a/src/asp-coordination-protocol.c b/src/asp-coordination-protocol.c new file mode 100644 index 0000000..0d85ca3 --- /dev/null +++ b/src/asp-coordination-protocol.c @@ -0,0 +1,526 @@ +/* + * 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, + void *input_data); +static void asp_coordination_protocol_nack_handler(GSocketAddress *sock_addr, + void *input_data); +static void asp_coordination_protocol_version_handler(GSocketAddress *sock_addr, + void *input_data); +static void asp_coordination_protocol_request_session_handler( + GSocketAddress *sock_addr, void *input_data); +static void asp_coordination_protocol_allowed_port_handler( + GSocketAddress *sock_addr, void *input_data); +static void asp_coordination_protocol_remove_session_handler( + GSocketAddress *sock_addr, void *input_data); + +static gboolean asp_coordination_protocol_send_ack(GSocketAddress *sock_addr, + asp_ack_s *input_data); +static gboolean asp_coordination_protocol_send_nack(GSocketAddress *sock_addr, + asp_nack_s *input_data); +static gboolean asp_coordination_protocol_send_version(GSocketAddress + *sock_addr, asp_version_s *input_data); +static gboolean asp_coordination_protocol_send_added_session( + GSocketAddress *sock_addr, asp_added_session_s *input_data); +static gboolean asp_coordination_protocol_send_deferred_session( + GSocketAddress *sock_addr, asp_deferred_session_s *input_data); +static gboolean asp_coordination_protocol_send_rejected_session( + GSocketAddress *sock_addr, asp_rejected_session_s *input_data); +static gboolean asp_coordination_protocol_send_allowed_port( + GSocketAddress *sock_addr, asp_allowed_port_s *input_data); + +static gboolean asp_coordination_protocol_send_request_session( + GSocketAddress *dest_addr, asp_request_session_s *input_data); +static gboolean asp_coordination_protocol_send_remove_session( + GSocketAddress *sock_addr, asp_remove_session_s *input_data); +static void asp_coordination_protocol_added_session_handler( + GSocketAddress *sock_addr, char *input_data); +static void asp_coordination_protocol_rejected_session_handler( + GSocketAddress *sock_addr, char *input_data); +static void asp_coordination_protocol_deferred_session_handler( + GSocketAddress *sock_addr, char *input_data); + + +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); + + coordination_protocol_sockaddr = g_inet_socket_address_new(inet_addr, + ASP_COORDINATION_PROTOCOL_PORT); + + 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); + g_clear_error(&error); + + return ret_val; +} + +gboolean asp_coordination_protocol_send_msg(GSocketAddress *input_sock_addr, + void *input_data) +{ + INFO_MSG; + + gboolean ret_val = FALSE; + + asp_coord_header_s *asp_cord_header = (asp_coord_header_s *)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_s *)input_data); + break; + } + case ASP_OPCODE_ADDED_SESSION: { + ret_val = asp_coordination_protocol_send_added_session(input_sock_addr, + (asp_added_session_s *)input_data); + break; + } + case ASP_OPCODE_REJECTED_SESSION: { + ret_val = asp_coordination_protocol_send_rejected_session(input_sock_addr, + (asp_rejected_session_s *)input_data); + break; + } + case ASP_OPCODE_REMOVE_SESSION: { + ret_val = asp_coordination_protocol_send_remove_session(input_sock_addr, + (asp_remove_session_s *)input_data); + break; + } + case ASP_OPCODE_ALLOWED_PORT: { + ret_val = asp_coordination_protocol_send_allowed_port(input_sock_addr, + (asp_allowed_port_s *)input_data); + break; + } + case ASP_OPCODE_VERSION: { + ret_val = asp_coordination_protocol_send_version(input_sock_addr, + (asp_version_s *)input_data); + break; + } + case ASP_OPCODE_DEFERRED_SESSION: { + ret_val = asp_coordination_protocol_send_deferred_session(input_sock_addr, + (asp_deferred_session_s *)input_data); + break; + } + case ASP_OPCODE_ACK: { + ret_val = asp_coordination_protocol_send_ack(input_sock_addr, + (asp_ack_s *)input_data); + break; + } + case ASP_OPCODE_NACK: { + ret_val = asp_coordination_protocol_send_nack(input_sock_addr, + (asp_nack_s *)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); + g_clear_error(&error); + + return TRUE; +} + +static void asp_coordination_protocol_ack_handler(GSocketAddress *sock_addr, + void *input_data) +{ + INFO_MSG; + + asp_ack_s *ack_data = (asp_ack_s *)input_data; + asp_sess_peer_recv_msg(sock_addr, ack_data); +} + +static void asp_coordination_protocol_nack_handler(GSocketAddress *sock_addr, + void *input_data) +{ + INFO_MSG; + + asp_nack_s *nack_data = (asp_nack_s *)input_data; + asp_sess_peer_recv_msg(sock_addr, nack_data); +} + +static void asp_coordination_protocol_version_handler(GSocketAddress *sock_addr, + void *input_data) +{ + INFO_MSG; + + asp_version_s *ver = (asp_version_s *)input_data; + asp_sess_peer_recv_msg(sock_addr, ver); +} + +static void asp_coordination_protocol_request_session_handler( + GSocketAddress *sock_addr, void *input_data) +{ + INFO_MSG; + + asp_request_session_s *request_sess = (asp_request_session_s *)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, void *input_data) +{ + INFO_MSG; + + asp_allowed_port_s *allowed_port_data = (asp_allowed_port_s *)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, void *input_data) +{ + INFO_MSG; + + asp_remove_session_s *remove_sess = (asp_remove_session_s *)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_s *input_data) +{ + INFO_MSG; + + GError *error = NULL; + asp_ack_s *send_ack = input_data; + + g_socket_send_to(coordination_protocol_socket, sock_addr, (char *)send_ack, + sizeof(asp_ack_s), NULL, &error); + + return TRUE; +} + +static gboolean asp_coordination_protocol_send_nack(GSocketAddress *sock_addr, + asp_nack_s *input_data) +{ + INFO_MSG; + + GError *error = NULL; + asp_nack_s *send_nack = input_data; + + g_socket_send_to(coordination_protocol_socket, sock_addr, (char *)send_nack, + sizeof(asp_nack_s), NULL, &error); + + return TRUE; +} + +static gboolean asp_coordination_protocol_send_version(GSocketAddress + *sock_addr, asp_version_s *input_data) +{ + INFO_MSG; + + GError *error = NULL; + asp_version_s *send_version = input_data; + + g_socket_send_to(coordination_protocol_socket, sock_addr, (char *)send_version, + sizeof(asp_version_s), NULL, &error); + + return TRUE; +} + +static gboolean asp_coordination_protocol_send_added_session( + GSocketAddress *sock_addr, asp_added_session_s *input_data) +{ + INFO_MSG; + + GError *error = NULL; + asp_added_session_s added_sess; + memcpy(&added_sess, input_data, sizeof(asp_added_session_s)); + added_sess.session_id = htonl(added_sess.session_id); + + g_socket_send_to(coordination_protocol_socket, sock_addr, (char *)&added_sess, + sizeof(asp_added_session_s), NULL, &error); + + return TRUE; +} + +static gboolean asp_coordination_protocol_send_deferred_session( + GSocketAddress *sock_addr, asp_deferred_session_s *input_data) +{ + INFO_MSG; + + GError *error = NULL; + asp_deferred_session_s deferred_sess; + memcpy(&deferred_sess, input_data, sizeof(asp_deferred_session_s)); + 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, + (char *)&deferred_sess, sizeof(asp_deferred_session_s) + + 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_s *input_data) +{ + INFO_MSG; + + GError *error = NULL; + asp_rejected_session_s rejected_sess; + memcpy(&rejected_sess, input_data, sizeof(asp_rejected_session_s)); + rejected_sess.session_id = htonl(rejected_sess.session_id); + + g_socket_send_to(coordination_protocol_socket, sock_addr, + (char *)&rejected_sess, sizeof(asp_rejected_session_s), NULL, &error); + + return TRUE; +} + +static gboolean asp_coordination_protocol_send_allowed_port( + GSocketAddress *sock_addr, asp_allowed_port_s *input_data) +{ + INFO_MSG; + + GError *error = NULL; + asp_allowed_port_s allowed_port_data; + memcpy(&allowed_port_data, input_data, sizeof(asp_allowed_port_s)); + allowed_port_data.session_id = htonl(allowed_port_data.session_id); + + g_socket_send_to(coordination_protocol_socket, sock_addr, + (char *)&allowed_port_data, sizeof(asp_allowed_port_s), NULL, &error); + + return TRUE; +} + +static gboolean asp_coordination_protocol_send_request_session( + GSocketAddress *dest_sock_addr, asp_request_session_s *input_data) +{ + INFO_MSG; + + GError *error = NULL; + + asp_request_session_s request_sess; + memcpy(&request_sess, input_data, sizeof(asp_request_session_s)); + 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, + (char *)&request_sess, sizeof(asp_request_session_s) + + 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_s *input_data) +{ + INFO_MSG; + + GError *error = NULL; + asp_remove_session_s remove_sess; + memcpy(&remove_sess, input_data, sizeof(asp_remove_session_s)); + remove_sess.session_id = htonl(remove_sess.session_id); + + g_socket_send_to(coordination_protocol_socket, sock_addr, (char *)&remove_sess, + sizeof(asp_remove_session_s), NULL, &error); + + return TRUE; +} + +static void asp_coordination_protocol_added_session_handler( + GSocketAddress *sock_addr, char *input_data) +{ + INFO_MSG; + + asp_added_session_s *added_sess = (asp_added_session_s *)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, char *input_data) +{ + INFO_MSG; + + asp_rejected_session_s *rejected_sess = (asp_rejected_session_s *)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, char *input_data) +{ + INFO_MSG; + + asp_deferred_session_s *deferred_sess = (asp_deferred_session_s *)input_data; + deferred_sess->session_id = ntohl(deferred_sess->session_id); + asp_sess_peer_recv_msg(sock_addr, deferred_sess); +} diff --git a/src/asp-coordination-protocol.h b/src/asp-coordination-protocol.h new file mode 100644 index 0000000..c2b6dd7 --- /dev/null +++ b/src/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", ROLE, __TIME__) +#else +#define ROLE "[advertiser]" +#define INFO_MSG ASP_LOGD("%s %s", ROLE, __TIME__) +#endif + +typedef struct asp_coord_header { + guint8 opcode; + guint8 seq_num; +} __attribute__((packed)) asp_coord_header_s; + +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_s; + +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_s; + +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_s; + +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_s; + +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_s; + +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_s; + +typedef struct asp_version { + guint8 opcode; + guint8 seq_num; + guint8 coordination_version; + guint8 vendor_information_length; + guint32 vendor_information; +} __attribute__((packed)) asp_version_s; + +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_s; + +typedef struct asp_ack { + guint8 opcode; + guint8 seq_num; +} __attribute__((packed)) asp_ack_s; + +typedef struct asp_nack { + guint8 opcode; + guint8 seq_num; + guint8 reason; +} __attribute__((packed)) asp_nack_s; + +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, + void *input_data); + +#endif /* __ASP_COORDINATION_PROTOCOL_H__ */ diff --git a/src/asp-p2p-conn.c b/src/asp-p2p-conn.c new file mode 100644 index 0000000..bfb4f13 --- /dev/null +++ b/src/asp-p2p-conn.c @@ -0,0 +1,254 @@ +/* + * 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); + if (params.session_information) + 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/asp-p2p-conn.h b/src/asp-p2p-conn.h new file mode 100644 index 0000000..462fef6 --- /dev/null +++ b/src/asp-p2p-conn.h @@ -0,0 +1,54 @@ +/* + * 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_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, const guint8 *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/asp-service.c b/src/asp-service.c new file mode 100755 index 0000000..827aada --- /dev/null +++ b/src/asp-service.c @@ -0,0 +1,190 @@ +/* + * 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 + +#include + +/***************************************************************************** + * Application Service Platform Daemon headers + *****************************************************************************/ +#include "asp-manager-util.h" +#include "asp-manager-gdbus.h" +#include "asp-service.h" +#include "asp-session.h" +#include "asp-tech.h" + +#include "generated-code.h" + +/***************************************************************************** + * Macros and Typedefs + *****************************************************************************/ + +/* TODO : define service data structure */ + +/***************************************************************************** + * Global Variables + *****************************************************************************/ + +/* TODO : define local memory for service data structure */ + +/***************************************************************************** + * Local Functions Definition + *****************************************************************************/ + +static guint64 asp_service_search_id; + +gint32 asp_service_init() +{ + __ASP_LOG_FUNC_ENTER__; + gint32 result = 0; + asp_service_search_id = 0; + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_service_deinit() +{ + __ASP_LOG_FUNC_ENTER__; + gint32 result = 0; + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_service_advertise(asp_service_advertise_s *service, gint32 replace) +{ + __ASP_LOG_FUNC_ENTER__; + gint32 discovery_tech = service->discovery_tech; + gint32 result = 0; + + ASP_LOGD("Discovery tech %x", discovery_tech); + result = asp_tech_advertise(discovery_tech, service, replace); + if (result < 0) { + /* TODO */ + /* error handling */ + + } + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_service_cancel_advertise(asp_service_advertise_s *service) +{ + __ASP_LOG_FUNC_ENTER__; + gint32 discovery_tech = service->discovery_tech; + gint32 result = 0; + + ASP_LOGD("Discovery tech %x", discovery_tech); + result = asp_tech_cancel_advertise(discovery_tech, service); + if (result < 0) { + /* TODO */ + /* error handling */ + + } + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_service_seek(asp_service_seek_s *service, guint64 *search_id) +{ + __ASP_LOG_FUNC_ENTER__; + gint32 discovery_tech = service->discovery_tech; + gint32 result = 0; + + ASP_LOGD("Discovery tech %x", discovery_tech); + service->search_id = asp_service_search_id; + result = asp_tech_seek(discovery_tech, service); + if (result < 0) { + /* TODO */ + /* error handling */ + + } + + *search_id = service->search_id; + asp_service_search_id++; + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_service_cancel_seek(asp_service_seek_s *service) +{ + __ASP_LOG_FUNC_ENTER__; + gint32 discovery_tech = service->discovery_tech; + gint32 result = 0; + + ASP_LOGD("Discovery tech %x", discovery_tech); + result = asp_tech_cancel_seek(discovery_tech, service); + if (result < 0) { + /* TODO */ + /* error handling */ + + } + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +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__; + gint32 result = 0; + + asp_manager_gdbus_notify_advertise_status(adv_id, (guint8)status, (gint32)reason); + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +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__; + gint32 result = 0; + + asp_manager_gdbus_notify_search_result(search_id, + 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/asp-session-peer-interface.h b/src/asp-session-peer-interface.h new file mode 100644 index 0000000..f0b4112 --- /dev/null +++ b/src/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/asp-session-peer.c b/src/asp-session-peer.c new file mode 100644 index 0000000..33f328a --- /dev/null +++ b/src/asp-session-peer.c @@ -0,0 +1,1530 @@ +#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() + +#define ASP_SESS_PEER_HEADER "SESSION_PEER_FSM" + +typedef struct asp_sess_peer { + gfsm_context_s *context; + GSocketAddress *p_sock_addr; + guint8 seq_num; + guint8 retry; + guint timer_id; + void *p_sending_msg_data; + GTree *p_sess_tree; +} asp_sess_peer_s; + +typedef struct asp_sess_peer_key { + guint8 ip_addr[16]; + guint8 ip_addr_len; + guint16 port; +} asp_sess_peer_key_s; + +typedef struct asp_sess_peer_sess_key { + guint32 sess_id; + guint8 sess_mac[6]; +} asp_sess_peer_sess_key_s; + +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_s *_asp_sess_peer_create_peer(GSocketAddress *p_sock_addr); +static void _asp_sess_peer_destroy_peer(void *p_peer); +static asp_sess_peer_s *_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_s *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 void *asp_sess_peer_dup_msg_data(void *p_msg); +static void _asp_sess_peer_set_sending_msg_data(asp_sess_peer_s *p_peer, + void *p_msg); +static asp_sess_peer_sess_key_s *_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_s *p_peer); +static void _asp_sess_peer_start_timer(asp_sess_peer_s *p_peer, guint sec); + +static gboolean _asp_sess_peer_send_req(GSocketAddress *p_sock_addr, + void *p_msg); +static gboolean _asp_sess_peer_send_ack(GSocketAddress *p_sock_addr, + void *p_msg); +static gboolean _asp_sess_peer_send_nack(GSocketAddress *p_sock_addr, + void *p_msg); + +static gboolean _asp_sess_peer_recv_req(GSocketAddress *p_sock_addr, + void *p_msg); +static gboolean _asp_sess_peer_recv_ack(GSocketAddress *p_sock_addr, + void *p_msg); +static gboolean _asp_sess_peer_recv_nack(GSocketAddress *p_sock_addr, + void *p_msg); + +static gboolean _asp_sess_peer_recv_version(GSocketAddress *p_sock_addr, + void *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(void *p_context_data); +static void _asp_sess_peer_state_init_exit_action(void *p_context_data); +static gfsm_state_id_t _asp_sess_peer_state_init_reaction_start( + void *p_context_data, void *p_event_data); + +static void _asp_sess_peer_state_created_entry_action(void *p_context_data); +static void _asp_sess_peer_state_created_exit_action(void *p_context_data); +static gfsm_state_id_t _asp_sess_peer_state_created_reaction_add_session( + void *p_context_data, void *p_event_data); +static gfsm_state_id_t _asp_sess_peer_state_created_reaction_del_session( + void *p_context_data, void *p_event_data); +static gfsm_state_id_t _asp_sess_peer_state_created_reaction_close( + void *p_context_data, void *p_event_data); +static gfsm_state_id_t _asp_sess_peer_state_created_reaction_send_ack( + void *p_context_data, void *p_event_data); +static gfsm_state_id_t _asp_sess_peer_state_created_reaction_send_nack( + void *p_context_data, void *p_event_data); + +static void _asp_sess_peer_state_version_sent_entry_action( + void *p_context_data); +static void _asp_sess_peer_state_version_sent_exit_action(void *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( + void *p_context_data, void *p_event_data); +static gfsm_state_id_t _asp_sess_peer_state_version_sent_reaction_recv_nack( + void *p_context_data, void *p_event_data); +static gfsm_state_id_t _asp_sess_peer_state_version_sent_reaction_timeout( + void *p_context_data, void *p_event_data); + +static void _asp_sess_peer_state_wait_version_entry_action( + void *p_context_data); +static void _asp_sess_peer_state_wait_version_exit_action(void *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( + void *p_context_data, void *p_event_data); +static gfsm_state_id_t _asp_sess_peer_state_wait_version_reaction_recv_req( + void *p_context_data, void *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( + void *p_context_data, void *p_event_data); + +static void _asp_sess_peer_state_opened_entry_action(void *p_context_data); +static void _asp_sess_peer_state_opened_exit_action(void *p_context_data); +static gfsm_state_id_t _asp_sess_peer_state_opened_reaction_recv_version( + void *p_context_data, void *p_event_data); +static gfsm_state_id_t _asp_sess_peer_state_opened_reaction_recv_req( + void *p_context_data, void *p_event_data); + +static void _asp_sess_peer_state_idle_entry_action(void *p_context_data); +static void _asp_sess_peer_state_idle_exit_action(void *p_context_data); +static gfsm_state_id_t _asp_sess_peer_state_idle_reaction_send_req( + void *p_context_data, void *p_event_data); + +static void _asp_sess_peer_state_wait_ack_entry_action(void *p_context_data); +static void _asp_sess_peer_state_wait_ack_exit_action(void *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( + void *p_context_data, void *p_event_data); +static gfsm_state_id_t _asp_sess_peer_state_wait_ack_reaction_recv_nack( + void *p_context_data, void *p_event_data); +static gfsm_state_id_t _asp_sess_peer_state_wait_ack_reaction_timeout( + void *p_context_data, void *p_event_data); + +static void _asp_sess_peer_state_close_entry_action(void *p_context_data); +static void _asp_sess_peer_state_close_exit_action(void *p_context_data); + +static void asp_sess_peer_fsm_init(); + +static gfsm_s *asm_sess_peer_fsm; +static gfsm_state_s *asp_sess_peer_state_init; +static gfsm_state_s *asp_sess_peer_state_created; +static gfsm_state_s *asp_sess_peer_state_version_sent; +static gfsm_state_s *asp_sess_peer_state_wait_version; +static gfsm_state_s *asp_sess_peer_state_opened; +static gfsm_state_s *asp_sess_peer_state_idle; +/*static gfsm_state_s asp_sess_peer_state_req_sent; */ +static gfsm_state_s *asp_sess_peer_state_wait_ack; +static gfsm_state_s *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_destroy_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, void *p_msg) +{ + INFO_MSG; + + asp_coord_header_s *p_header = (asp_coord_header_s *)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_s *)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, void *p_msg) +{ + INFO_MSG; + + asp_coord_header_s *p_header = (asp_coord_header_s *)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, void *p_msg) +{ + INFO_MSG; + + asp_sess_peer_s *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)); + } + + if (p_peer && p_peer->context) + 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, void *p_msg) +{ + INFO_MSG; + + asp_sess_peer_s *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, void *p_msg) +{ + INFO_MSG; + + asp_sess_peer_s *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, void *p_msg) +{ + INFO_MSG; + + asp_sess_peer_s *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_s ack; + ack.opcode = ASP_OPCODE_ACK; + ack.seq_num = ((asp_version_s *)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_s ack; + ack.opcode = ASP_OPCODE_ACK; + ack.seq_num = ((asp_version_s *)p_msg)->seq_num; + asp_coordination_protocol_send_msg(p_sock_addr, &ack); + } + + if (p_peer && p_peer->context) + 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, void *p_msg) +{ + INFO_MSG; + + asp_sess_peer_s *p_peer = _asp_sess_peer_tree_find_peer(p_sock_addr); + asp_coord_header_s *p_header = (asp_coord_header_s *)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, void *p_msg) +{ + INFO_MSG; + + asp_sess_peer_s *p_peer = _asp_sess_peer_tree_find_peer(p_sock_addr); + + if (NULL == p_peer) + return FALSE; + + asp_request_header_s *p_header = (asp_request_header_s *) + 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, void *p_msg) +{ + INFO_MSG; + + asp_sess_peer_s *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_s *p_peer = _asp_sess_peer_tree_find_peer(p_sock_addr); + + if (NULL == p_peer) { + ASP_LOGD("create 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)); + } + if (p_peer && p_peer->context) + 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_s *p_peer = NULL; + + if (p_sock_addr == NULL) + return TRUE; + + 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_s *_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_s *p_key = (asp_sess_peer_key_s *) g_malloc(sizeof( + asp_sess_peer_key_s)); + + 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_s *_asp_sess_peer_tree_find_peer(GSocketAddress *p_sock_addr) +{ + INFO_MSG; + + asp_sess_peer_key_s *p_key = _asp_sess_peer_tree_create_peer_key(p_sock_addr); + + g_assert(p_key); + + return (asp_sess_peer_s *) g_tree_lookup(gp_peer_tree, p_key); +} + +gboolean _asp_sess_peer_tree_insert_peer(GSocketAddress *p_sock_addr, + asp_sess_peer_s *p_peer) +{ + INFO_MSG; + + asp_sess_peer_key_s *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_s* 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) +{ + asp_sess_peer_key_s *p_l = (asp_sess_peer_key_s *) a; + asp_sess_peer_key_s *p_r = (asp_sess_peer_key_s *) 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) +{ + g_free(a); +} + +void _asp_sess_peer_tree_value_destructor_cb(gpointer a) +{ + g_free(a); +} + +asp_sess_peer_s *_asp_sess_peer_create_peer(GSocketAddress *p_sock_addr) +{ + INFO_MSG; + + asp_sess_peer_s *p_peer = (asp_sess_peer_s *) g_malloc(sizeof(asp_sess_peer_s)); + + g_assert(p_peer); + + p_peer->p_sock_addr = (GSocketAddress *) 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_LOGD("insert peer"); + _asp_sess_peer_tree_insert_peer(p_sock_addr, p_peer); + + p_peer->context = gfsm_create_context(asm_sess_peer_fsm, + _asp_sess_peer_destroy_peer, p_peer); + + return p_peer; +} + +void _asp_sess_peer_destroy_peer(void *p_context_data) +{ + asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data; + + INFO_MSG; + 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_s *p_peer, void *p_msg) +{ + INFO_MSG; + + asp_coord_header_s *p_header = (asp_coord_header_s *)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_s *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_s *p_peer, + void *p_msg_data) +{ + asp_session_recv_req(p_peer->p_sock_addr, p_msg_data); +} + +void _asp_sess_peer_forward_ack_to_sessmgmt(asp_sess_peer_s *p_peer, + void *p_msg_data) +{ + asp_request_header_s *p_header = (asp_request_header_s *) + 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_s *p_peer, + void *p_msg_data) +{ + asp_request_header_s *p_header = (asp_request_header_s *) + 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) +{ + asp_sess_peer_s *p_peer = (asp_sess_peer_s *) 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_s *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_s *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_s *p_peer) +{ + ++p_peer->retry; +} + +asp_sess_peer_sess_key_s *_asp_sess_peer_sess_tree_create_key( + guint8 session_mac[], guint32 session_id) +{ + INFO_MSG; + asp_sess_peer_sess_key_s *p_key = (asp_sess_peer_sess_key_s *) g_malloc(sizeof( + asp_sess_peer_sess_key_s)); + + 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_s *p_peer, + asp_sess_peer_sess_key_s *p_key) +{ + asp_sess_peer_sess_key_s *p_value = (asp_sess_peer_sess_key_s *) 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_s *p_peer, + asp_sess_peer_sess_key_s *p_key) +{ + 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_s *p_l = (asp_sess_peer_sess_key_s *) a; + asp_sess_peer_sess_key_s *p_r = (asp_sess_peer_sess_key_s *) 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_s *p_key = (asp_sess_peer_sess_key_s *) 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. */ +} + +void *_asp_sess_peer_dup_request_session(void *p_msg) +{ + asp_request_session_s *p_dup_msg = (asp_request_session_s *)g_malloc(sizeof( + asp_request_session_s)); + memcpy(p_dup_msg, p_msg, sizeof(asp_request_session_s)); + + return p_dup_msg; +} + +void *_asp_sess_peer_dup_msg_added_session(void *p_msg) +{ + asp_added_session_s *p_dup_msg = (asp_added_session_s *)g_malloc(sizeof( + asp_added_session_s)); + memcpy(p_dup_msg, p_msg, sizeof(asp_added_session_s)); + + return p_dup_msg; +} + +void *_asp_sess_peer_dup_msg_rejected_session(void *p_msg) +{ + asp_rejected_session_s *p_dup_msg = (asp_rejected_session_s *)g_malloc(sizeof( + asp_rejected_session_s)); + memcpy(p_dup_msg, p_msg, sizeof(asp_rejected_session_s)); + + return p_dup_msg; +} + +void *_asp_sess_peer_dup_msg_remove_session(void *p_msg) +{ + asp_remove_session_s *p_dup_msg = (asp_remove_session_s *)g_malloc(sizeof( + asp_remove_session_s)); + memcpy(p_dup_msg, p_msg, sizeof(asp_remove_session_s)); + + return p_dup_msg; +} + +void *_asp_sess_peer_dup_msg_allowed_port(void *p_msg) +{ + asp_allowed_port_s *p_dup_msg = (asp_allowed_port_s *)g_malloc(sizeof( + asp_allowed_port_s)); + memcpy(p_dup_msg, p_msg, sizeof(asp_allowed_port_s)); + + return p_dup_msg; +} + +void *_asp_sess_peer_dup_msg_version(void *p_msg) +{ + asp_version_s *p_dup_msg = (asp_version_s *)g_malloc(sizeof(asp_version_s)); + memcpy(p_dup_msg, p_msg, sizeof(asp_version_s)); + + return p_dup_msg; +} + +void *_asp_sess_peer_dup_msg_deferred_session(void *p_msg) +{ + asp_deferred_session_s *p_dup_msg = (asp_deferred_session_s *)g_malloc(sizeof( + asp_deferred_session_s)); + memcpy(p_dup_msg, p_msg, sizeof(asp_deferred_session_s)); + + printf("_asp_sess_peer_dup_msg_deferred_session, session_id:%d\n", + p_dup_msg->session_id); + return p_dup_msg; +} + +void *_asp_sess_peer_dup_msg_ack(void *p_msg) +{ + asp_ack_s *p_dup_msg = (asp_ack_s *)g_malloc(sizeof(asp_ack_s)); + memcpy(p_dup_msg, p_msg, sizeof(asp_ack_s)); + return p_dup_msg; +} + +void *_asp_sess_peer_dup_msg_nack(void *p_msg) +{ + asp_nack_s *p_dup_msg = (asp_nack_s *)g_malloc(sizeof(asp_nack_s)); + memcpy(p_dup_msg, p_msg, sizeof(asp_nack_s)); + return p_dup_msg; +} + +void *asp_sess_peer_dup_msg_data(void *p_msg) +{ + asp_coord_header_s *p_header = (asp_coord_header_s *)p_msg; + void *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 (void *)ret; +} + +void _asp_sess_peer_send_nack_to_protocol(GSocketAddress *p_sock_addr, + guint8 seq_num, guint8 reason) +{ + asp_nack_s 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); +} + +const char *_asp_sess_peer_fsm_get_state_name_cb(gfsm_state_id_t state_id) +{ + const char *ret_val = NULL; + + switch (state_id) { + case ASP_S_PEER_STATE_INIT: + ret_val = "ASP_S_PEER_STATE_INIT"; + break; + case ASP_S_PEER_STATE_CREATED: + ret_val = "ASP_S_PEER_STATE_CREATED"; + break; + case ASP_S_PEER_STATE_VERSION_SENT: + ret_val = "ASP_S_PEER_STATE_VERSION_SENT"; + break; + case ASP_S_PEER_STATE_WAIT_VERSION: + ret_val = "ASP_S_PEER_STATE_WAIT_VERSION"; + break; + case ASP_S_PEER_STATE_WAIT_ACK: + ret_val = "ASP_S_PEER_STATE_WAIT_ACK"; + break; + case ASP_S_PEER_STATE_OPENED: + ret_val = "ASP_S_PEER_STATE_OPENED"; + break; + case ASP_S_PEER_STATE_IDLE: + ret_val = "ASP_S_PEER_STATE_IDLE"; + break; + /* + case ASP_S_PEER_STATE_REQ_SENT: + ret_val = "ASP_S_PEER_STATE_REQ_SENT"; + break; + */ + case ASP_S_PEER_STATE_CLOSED: + ret_val = "ASP_S_PEER_STATE_CLOSED"; + break; + default: + ret_val = "ASP_S_PEER_STATE_MAX"; + break; + } + + return ret_val; +} + +const char *_asp_sess_peer_gfsm_get_event_name_cb(gfsm_event_id_t event_id) +{ + const char *ret_val = NULL; + + switch (event_id) { + case ASP_S_PEER_EVENT_START: + ret_val = "ASP_S_PEER_EVENT_START"; + break; + case ASP_S_PEER_EVENT_ADD_SESSION: + ret_val = "ASP_S_PEER_EVENT_ADD_SESSION"; + break; + case ASP_S_PEER_EVENT_DEL_SESSION: + ret_val = "ASP_S_PEER_EVENT_DEL_SESSION"; + break; + case ASP_S_PEER_EVENT_SEND_REQ: + ret_val = "ASP_S_PEER_EVENT_SEND_REQ"; + break; + case ASP_S_PEER_EVENT_SEND_ACK: + ret_val = "ASP_S_PEER_EVENT_SEND_ACK"; + break; + case ASP_S_PEER_EVENT_SEND_NACK: + ret_val = "ASP_S_PEER_EVENT_SEND_NACK"; + break; + case ASP_S_PEER_EVENT_RECV_VERSION: + ret_val = "ASP_S_PEER_EVENT_RECV_VERSION"; + break; + case ASP_S_PEER_EVENT_RECV_REQ: + ret_val = "ASP_S_PEER_EVENT_RECV_REQ"; + break; + case ASP_S_PEER_EVENT_RECV_ACK: + ret_val = "ASP_S_PEER_EVENT_RECV_ACK"; + break; + case ASP_S_PEER_EVENT_RECV_NACK: + ret_val = "ASP_S_PEER_EVENT_RECV_NACK"; + break; + case ASP_S_PEER_EVENT_TIMEOUT: + ret_val = "ASP_S_PEER_EVENT_TIMEOUT"; + break; + case ASP_S_PEER_EVENT_CLOSE: + ret_val = "ASP_S_PEER_EVENT_CLOSE"; + break; + default: + ret_val = "ASP_S_PEER_EVENT_MAX"; + break; + } + + return ret_val; +} + +int _asp_sess_peer_fsm_log_func(const char *format, ...) +{ + gchar buffer[256]; + va_list args; + va_start(args, format); + g_vsnprintf(buffer, 255, format, args); + va_end(args); + + ASP_LOGD("%s", buffer); + + return 0; +} + +void asp_sess_peer_fsm_init() +{ + INFO_MSG; + + asm_sess_peer_fsm = gfsm_create_fsm(ASP_S_PEER_STATE_MAX, ASP_S_PEER_EVENT_MAX, + ASP_S_PEER_STATE_INIT); + + asp_sess_peer_state_init = gfsm_create_state(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); + + asp_sess_peer_state_created = gfsm_create_state(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); + + asp_sess_peer_state_version_sent = gfsm_create_state( + 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); + + asp_sess_peer_state_wait_version = gfsm_create_state( + 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); + + asp_sess_peer_state_opened = gfsm_create_state(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); + + asp_sess_peer_state_idle = gfsm_create_state(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); + + asp_sess_peer_state_wait_ack = gfsm_create_state(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); + + asp_sess_peer_state_closed = gfsm_create_state(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); + + gfsm_set_logger(asm_sess_peer_fsm, _asp_sess_peer_fsm_log_func, + ASP_SESS_PEER_HEADER, + _asp_sess_peer_fsm_get_state_name_cb, + _asp_sess_peer_gfsm_get_event_name_cb); +} + +void _asp_sess_peer_state_init_entry_action(void *p_context_data) +{ + INFO_MSG; + + ASP_SESS_PEER_FSM_TRACE_ENTER(); + + /* asp_sess_peer_s* p_peer = (asp_sess_peer_s*)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(void *p_context_data) +{ + INFO_MSG; + + ASP_SESS_PEER_FSM_TRACE_ENTER(); + + /*asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */ + + ASP_SESS_PEER_FSM_TRACE_LEAVE(); +} + +gfsm_state_id_t _asp_sess_peer_state_init_reaction_start(void *p_context_data, + void *p_event_data) +{ + INFO_MSG; + + ASP_SESS_PEER_FSM_TRACE_ENTER(); + + /* asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */ + + ASP_SESS_PEER_FSM_TRACE_LEAVE(); + + return ASP_S_PEER_STATE_VERSION_SENT; +} + +void _asp_sess_peer_state_created_entry_action(void *p_context_data) +{ + INFO_MSG; + + /* asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */ +} + +void _asp_sess_peer_state_created_exit_action(void *p_context_data) +{ + INFO_MSG; + + /* asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */ +} + +gfsm_state_id_t _asp_sess_peer_state_created_reaction_add_session( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + + ASP_SESS_PEER_FSM_TRACE_ENTER(); + + asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data; + asp_sess_peer_sess_key_s *p_key = (asp_sess_peer_sess_key_s *) 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( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + + ASP_SESS_PEER_FSM_TRACE_ENTER(); + + asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data; + asp_sess_peer_sess_key_s *p_key = (asp_sess_peer_sess_key_s *) 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( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + + ASP_SESS_PEER_FSM_TRACE_ENTER(); + + /* asp_sess_peer_s* p_peer = (asp_sess_peer_s*)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( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + + ASP_SESS_PEER_FSM_TRACE_ENTER(); + + asp_sess_peer_s *p_peer = (asp_sess_peer_s *) 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( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + + ASP_SESS_PEER_FSM_TRACE_ENTER(); + + asp_sess_peer_s *p_peer = (asp_sess_peer_s *) 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(void *p_context_data) +{ + INFO_MSG; + + ASP_SESS_PEER_FSM_TRACE_ENTER(); + + asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data; + asp_version_s *p_msg_version = (asp_version_s *)g_malloc(sizeof( + asp_version_s)); + + 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); + + ASP_SESS_PEER_FSM_TRACE_LEAVE(); +} + +void _asp_sess_peer_state_version_sent_exit_action(void *p_context_data) +{ + INFO_MSG; + + asp_sess_peer_s *p_peer = (asp_sess_peer_s *) 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( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + + asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data; + asp_ack_s *p_ack = (asp_ack_s *)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( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + + asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data; + asp_nack_s *p_nack = (asp_nack_s *)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( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + + /*asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */ + + return ASP_S_PEER_STATE_VERSION_SENT; +} + +void _asp_sess_peer_state_wait_version_entry_action(void *p_context_data) +{ + INFO_MSG; + + asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data; + + _asp_sess_peer_start_timer(p_peer, 10); +} + +void _asp_sess_peer_state_wait_version_exit_action(void *p_context_data) +{ + INFO_MSG; + + asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data; + + _asp_sess_peer_stop_timer(p_peer); +} + +gfsm_state_id_t _asp_sess_peer_state_wait_version_reaction_recv_version( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + + /* asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */ + /* asp_coord_header_s* p_header = (asp_coord_header_s*)p_event_data; */ + + return ASP_S_PEER_STATE_IDLE; +} + +gfsm_state_id_t _asp_sess_peer_state_wait_version_reaction_recv_req( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + + asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data; + asp_coord_header_s *p_header = (asp_coord_header_s *)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( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + + /*asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */ + return ASP_S_PEER_STATE_CLOSED; +} + +void _asp_sess_peer_state_opened_entry_action(void *p_context_data) +{ + INFO_MSG; + + /*asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */ +} + +void _asp_sess_peer_state_opened_exit_action(void *p_context_data) +{ + INFO_MSG; + + /*asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */ +} + +gfsm_state_id_t _asp_sess_peer_state_opened_reaction_recv_version( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + + /*asp_sess_peer_s* p_peer = (asp_sess_peer_s*)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( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + + asp_sess_peer_s *p_peer = (asp_sess_peer_s *) 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(void *p_context_data) +{ + INFO_MSG; + + /*asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */ +} + +void _asp_sess_peer_state_idle_exit_action(void *p_context_data) +{ + INFO_MSG; + + /*asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */ +} + +gfsm_state_id_t _asp_sess_peer_state_idle_reaction_send_req( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + + asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data; + void *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(void *p_context_data) +{ + INFO_MSG; + + asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data; + + _asp_sess_peer_start_timer(p_peer, 1); +} + +void _asp_sess_peer_state_wait_ack_exit_action(void *p_context_data) +{ + INFO_MSG; + + asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data; + + _asp_sess_peer_stop_timer(p_peer); +} + +gfsm_state_id_t _asp_sess_peer_state_wait_ack_reaction_recv_ack( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + + asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data; + asp_ack_s *p_ack = (asp_ack_s *)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( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + + asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data; + asp_nack_s *p_nack = (asp_nack_s *)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( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + + asp_sess_peer_s *p_peer = (asp_sess_peer_s *) 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(void *p_context_data) +{ + INFO_MSG; + + asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data; + + if (!p_peer) { + ASP_LOGD("p_peer is null"); + return; + } + ASP_LOGD("context[%p]", p_peer->context); + gfsm_destroy_context(p_peer->context); +} + +void _asp_sess_peer_state_close_exit_action(void *p_context_data) +{ + INFO_MSG; + + /*asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */ +} diff --git a/src/asp-session-peer.h b/src/asp-session-peer.h new file mode 100644 index 0000000..ff3e635 --- /dev/null +++ b/src/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, void *p_msg); +gboolean asp_sess_peer_recv_msg(GSocketAddress *p_sock_addr, void *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/asp-session.c b/src/asp-session.c new file mode 100644 index 0000000..52adfde --- /dev/null +++ b/src/asp-session.c @@ -0,0 +1,2802 @@ +/* + * 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 */ + +#define HAVE_ASP_P2P_CONN + +/***************************************************************************** + * System headers + *****************************************************************************/ +/*#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 "gfsm.h" +#include "asp-session.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_LEN 16 +#define SESSION_STATUS_ADDITIONAL_INFO_CO "REQUEST_SESSION" +#define SESSION_STATUS_ADDITIONAL_INFO_PD "PDRequest" + +#define ASP_SESSION_HEADER "SESSION_FSM" + +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_s *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 */ + gboolean confirmed; + gchar additional_info[SESSION_STATUS_ADDITIONAL_INFO_LEN]; +} asp_session_s; + +typedef struct session_request_cb { + asp_session_session_request_cb cb; + gpointer user_data; +} session_request_cb_s; + +typedef struct session_config_request_cb { + asp_session_session_config_request_cb cb; + gpointer user_data; +} session_config_request_cb_s; + +typedef struct connect_status_cb { + asp_session_connect_status_cb cb; + gpointer user_data; +} connect_status_cb_s; + +typedef struct port_status_cb { + asp_session_port_status_cb cb; + gpointer user_data; +} port_status_cb_s; + +typedef struct session_status_cb { + asp_session_session_status_cb cb; + gpointer user_data; +} session_status_cb_s; + +typedef struct asp_session_cb_v_table { + session_request_cb_s session_request; + session_config_request_cb_s session_config_request; + connect_status_cb_s connect_status; + port_status_cb_s port_status; + session_status_cb_s session_status; +} asp_session_cb_v_table_s; + +typedef struct asp_session_key { + guint32 session_id; + guint8 session_mac[MAC_ADDRESS_LEN]; +} asp_session_key_s; + +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_s; + +typedef struct defer_session_param { + guint8 deferred_response[ASP_DEFER_RESPONSE_BYTE_MAX]; + size_t length; +} defer_session_param_s; + +typedef struct confirm_session_param { + gboolean confirmed; + guint32 pin; +} confirm_session_param_s; + +typedef struct bound_port_param { + gchar local_ip[ASP_SESSION_IPV4_STR_LEN]; + guint16 local_port; + guint8 proto; +} bound_port_param_s; + +typedef struct session_request_param { + int 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_s; + +typedef struct connect_status_param { + asp_session_connect_status_e status; + char deferred_resp[ASP_DEFER_RESPONSE_BYTE_MAX]; + size_t length; +} connect_status_param_s; + +typedef struct session_config_request_param { + gboolean get_network_config_pin; + guint32 network_config_pin; +} session_config_request_param_s; + +typedef struct ip_assigned_param { + char peer_ip_addr[ASP_SESSION_IPV4_STR_LEN]; + size_t length; +} ip_assigned_param_s; + +enum { + 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 +} asp_session_state_e; + +enum { + 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_DELETE_SESSION, + + SESSION_EVENT_MAX +} asp_session_event_e; + +/***************************************************************************** + * Global Variables + *****************************************************************************/ +static GTree *sessionTree = + NULL; /* [key] - [asp_session_key_s*], [value] - [asp_session_s*] */ +static asp_session_cb_v_table_s session_cb_v_table; +static char g_my_p2p_mac[MAC_ADDRESS_LEN]; + +static guint16 g_asp_cordination_port = 7235; + +static gfsm_s *session_fsm; +static gfsm_state_s *session_state_none; +static gfsm_state_s *session_state_closed; +static gfsm_state_s *session_state_running; +static gfsm_state_s *session_state_l2connecting; +static gfsm_state_s *session_state_session_request_sent; +static gfsm_state_s *session_state_session_request_defered; +static gfsm_state_s *session_state_entering_pin; +static gfsm_state_s *session_state_session_request_received; +static gfsm_state_s *session_state_session_request_accepted; +static gfsm_state_s *session_state_group_formation_completed; +static gfsm_state_s *session_state_l2connected; +static gfsm_state_s *session_state_request_session_sent; +static gfsm_state_s *session_state_open; +static gfsm_state_s *session_state_request_session_received; +static gfsm_state_s *session_state_reject_session_sent; +static gfsm_state_s *session_state_remove_session_sent; + +/***************************************************************************** + * Local Functions Declaration + *****************************************************************************/ + +/* send coordination protocol message */ +static gboolean _send_request_session(asp_session_s *session, + guint8 *session_info, size_t session_info_len); +static gboolean _send_added_session(asp_session_s *session); +static gboolean _send_reject_session(asp_session_s *session); +static gboolean _send_remove_session(asp_session_s *session, + guint8 remove_reason); +static gboolean _send_allowed_port(asp_session_s *session, guint16 port, + guint8 protocol); +static gboolean _send_deferred_session(asp_session_s *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_s *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_s *_get_exist_session(guint32 session_id, + const guint8 *session_mac); +static asp_session_s *_new_session_by_request_session(GSocketAddress *sock_addr, + const gchar *peer_ip, gpointer p_msg); +static asp_session_s *_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_s *_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_s *_new_session_from_session_request( + const guint8 *session_mac, guint32 session_id, guint32 advertisement_id); +static void _asp_session_destroy_session(void *p_context_data); +static asp_session_status_e _get_session_state(guint8 *session_mac, + guint32 session_id); +static asp_session_key_s *_get_session_key(guint32 session_id, + const guint8 *session_mac); +static void _store_peer_ip_addr(asp_session_s *session, char *peer_ip, + size_t length); +#ifdef HAVE_ASP_P2P_CONN +static guint8 *_get_peer_mac(asp_session_s *session); +#endif + +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); +void _p2p_conn_ip_assigned_cb(gint32 error_code, const guint8 *session_mac, + guint32 session_id, const guint8 *service_mac, gchar *peer_ip_addr, gint32 ip_length, + 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(void *p_context_data); +static void _state_none_exit_action(void *p_context_data); +static gfsm_state_id_t _state_none_reaction_connect_session_called( + void *p_context_data, void *p_event_data); +static gfsm_state_id_t _state_none_reaction_request_session_received( + void *p_context_data, void *p_event_data); +static gfsm_state_id_t _state_none_reaction_session_request_received( + void *p_context_data, void *p_event_data); +static void _state_closed_entry_action(void *p_context_data); +static void _state_closed_exit_action(void *p_context_data); +static gfsm_state_id_t _state_closed_reaction_delete_session( + void *p_context_data, void *p_event_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(void *p_context_data); +static void _state_running_exit_action(void *p_context_data); + +static void _state_l2connecting_entry_action(void *p_context_data); +static void _state_l2connecting_exit_action(void *p_context_data); +static gfsm_state_id_t _state_l2connecting_reaction_close_session_called( + void *p_context_data, void *p_event_data); +static gfsm_state_id_t _state_l2connecting_reaction_timeout( + void *p_context_data, void *p_event_data); + +static void _state_session_request_sent_entry_action(void *p_context_data); +static void _state_session_request_sent_exit_action(void *p_context_data); +static gfsm_state_id_t +_state_session_request_sent_reaction_connect_status_called(void *p_context_data, + void *p_event_data); +static gfsm_state_id_t +_state_session_request_sent_reaction_session_config_request_called( + void *p_context_data, void *p_event_data); + +static void _state_session_request_defered_entry_action(void *p_context_data); +static void _state_session_request_defered_exit_action(void *p_context_data); +static gfsm_state_id_t +_state_session_request_defered_reaction_connect_status_called( + void *p_context_data, void *p_event_data); +static gfsm_state_id_t +_state_session_request_defered_reaction_session_config_request_called( + void *p_context_data, void *p_event_data); + +static void _state_session_request_received_entry_action(void *p_context_data); +static void _state_session_request_received_exit_action(void *p_context_data); +static gfsm_state_id_t +_state_session_request_received_reaction_confirm_session_called( + void *p_context_data, void *p_event_data); + +static void _state_session_request_accepted_entry_action(void *p_context_data); +static void _state_session_request_accepted_exit_action(void *p_context_data); +static gfsm_state_id_t +_state_session_request_accepted_reaction_connect_status_received( + void *p_context_data, void *p_event_data); +static gfsm_state_id_t +_state_session_request_accepted_reaction_session_config_request_called( + void *p_context_data, void *p_event_data); +static gfsm_state_id_t +_state_session_request_accepted_reaction_set_session_ready_called( + void *p_context_data, void *p_event_data); + +static void _state_entering_pin_entry_action(void *p_context_data); +static void _state_entering_pin_exit_action(void *p_context_data); +static gfsm_state_id_t _state_entering_pin_reaction_confirm_session_called( + void *p_context_data, void *p_event_data); + +static void _state_group_formation_completed_entry_action(void *p_context_data); +static void _state_group_formation_completed_exit_action(void *p_context_data); +static gfsm_state_id_t _state_group_formation_completed_reaction_ip_assigned( + void *p_context_data, void *p_event_data); +static gfsm_state_id_t +_state_group_formation_completed_reaction_request_session_received( + void *p_context_data, void *p_event_data); +static gfsm_state_id_t +_state_group_formation_completed_reaction_set_session_ready_called( + void *p_context_data, void *p_event_data); + +static void _state_l2connected_entry_action(void *p_context_data); +static void _state_l2connected_exit_action(void *p_context_data); +static gfsm_state_id_t _state_l2connected_reaction_close_session_called( + void *p_context_data, void *p_event_data); +static gfsm_state_id_t _state_l2connected_reaction_remove_session_received( + void *p_context_data, void *p_event_data); +static gfsm_state_id_t _state_l2connected_reaction_peer_destroyed( + void *p_context_data, void *p_event_data); + +static void _state_request_session_sent_entry_action(void *p_context_data); +static void _state_request_session_sent_exit_action(void *p_context_data); +static gfsm_state_id_t +_state_request_session_sent_reaction_added_session_received( + void *p_context_data, void *p_event_data); +static gfsm_state_id_t +_state_request_session_sent_reaction_deferred_session_received( + void *p_context_data, void *p_event_data); +static gfsm_state_id_t +_state_request_session_sent_reaction_rejected_session_received( + void *p_context_data, void *p_event_data); +static gfsm_state_id_t _state_request_session_sent_reaction_timeout( + void *p_context_data, void *p_event_data); +static void _state_request_session_received_entry_action(void *p_context_data); +static void _state_request_session_received_exit_action(void *p_context_data); +static gfsm_state_id_t +_state_request_session_received_reaction_set_session_ready_called( + void *p_context_data, void *p_event_data); +static gfsm_state_id_t +_state_request_session_received_reaction_defer_session_called( + void *p_context_data, void *p_event_data); +static gfsm_state_id_t +_state_request_session_received_reaction_confirm_session_called( + void *p_context_data, void *p_event_data); +static void _state_open_entry_action(void *p_context_data); +static void _state_open_exit_action(void *p_context_data); +static gfsm_state_id_t _state_open_reaction_bound_port_called( + void *p_context_data, void *p_event_data); +static gfsm_state_id_t _state_open_reaction_allowed_port_received( + void *p_context_data, void *p_event_data); +static void _state_reject_session_sent_entry_action(void *p_context_data); +static void _state_reject_session_sent_exit_action(void *p_context_data); +static gfsm_state_id_t _state_reject_session_sent_reaction_ack_received( + void *p_context_data, void *p_event_data); +static gfsm_state_id_t _state_reject_session_sent_reaction_nack_received( + void *p_context_data, void *p_event_data); +static void _state_remove_session_sent_entry_action(void *p_context_data); +static void _state_remove_session_sent_exit_action(void *p_context_data); +static gfsm_state_id_t _state_remove_session_sent_reaction_ack_received( + void *p_context_data, void *p_event_data); +static gfsm_state_id_t _state_remove_session_sent_reaction_nack_received( + void *p_context_data, void *p_event_data); +static gfsm_state_id_t _state_remove_session_sent_reaction_peer_destroyed( + void *p_context_data, void *p_event_data); + +/***************************************************************************** + * API Definition + *****************************************************************************/ + +gboolean asp_session_initialize() +{ + INFO_MSG; + +#ifdef HAVE_ASP_P2P_CONN + asp_p2p_conn_get_p2p_mac(g_my_p2p_mac); +#endif + + asp_sess_peer_init(); + + sessionTree = g_tree_new_full((GCompareDataFunc) _session_tree_compare_func, + NULL, (GDestroyNotify) _session_tree_key_destoryed, + (GDestroyNotify) _session_tree_value_destoryed); + + 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); + asp_p2p_conn_set_ip_assigned_cb(_p2p_conn_ip_assigned_cb, NULL); +#endif + + return TRUE; +} + +gboolean asp_session_deinitialize() +{ + INFO_MSG; + + asp_sess_peer_destroy(); + + 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_s *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_s *p_connect_session = (connect_session_param_s *) + g_malloc(sizeof(connect_session_param_s)); + + 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_infra(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_s *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_s *p_connect_session = (connect_session_param_s *) + g_malloc(sizeof(connect_session_param_s)); + + 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_s *session = _get_exist_session(session_id, session_mac); + defer_session_param_s *defer_session_param = (defer_session_param_s *)g_malloc( + sizeof(defer_session_param_s)); + + 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_s *session = _get_exist_session(session_id, session_mac); + g_assert(session); + + confirm_session_param_s *confirmed_param = (confirm_session_param_s *)g_malloc( + sizeof(confirm_session_param_s)); + confirmed_param->confirmed = confirmed; + confirmed_param->pin = pin; + session->confirmed = confirmed; + + 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_s *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_s *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; +} + +gboolean asp_session_bound_port(guint8 *session_mac, guint32 session_id, + const gchar *local_ip, guint16 local_port, guint8 protocol) +{ + INFO_MSG; + + asp_session_s *session = _get_exist_session(session_id, session_mac); + g_assert(session); + + bound_port_param_s *bound_port_param = (bound_port_param_s *)g_malloc(sizeof( + bound_port_param_s)); + 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_s *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); + + session_request_param_s *p_param = (session_request_param_s *)g_malloc(sizeof( + session_request_param_s)); + + 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_s *session = _get_exist_session(session_id, session_mac); + + if (session) { + session_config_request_param_s *p_param = (session_config_request_param_s *) + g_malloc(sizeof(session_config_request_param_s)); + p_param->get_network_config_pin = get_pin; + p_param->network_config_pin = pin; + + 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_s *session = _get_exist_session(session_id, session_mac); + + if (session) { + connect_status_param_s *p_param = (connect_status_param_s *)g_malloc(sizeof( + connect_status_param_s)); + p_param->status = status; + p_param->length = 0; + + gfsm_process_event(&(session->context), + gfsm_create_event(SESSION_EVENT_CONNECT_STATUS_CALLED, p_param, g_free)); + } +} + +void _p2p_conn_ip_assigned_cb(gint32 error_code, const guint8 *session_mac, + guint32 session_id, const guint8 *service_mac, gchar *peer_ip_addr, gint32 ip_length, + gpointer user_data) +{ + INFO_MSG; + + asp_session_s *session = _get_exist_session(session_id, session_mac); + + if (session) { + ip_assigned_param_s *p_param = (ip_assigned_param_s *)g_malloc(sizeof( + ip_assigned_param_s)); + g_strlcpy(p_param->peer_ip_addr, peer_ip_addr, ASP_SESSION_IPV4_STR_LEN); + p_param->length = ip_length; + + ASP_LOGD("%s %zu", p_param->peer_ip_addr, p_param->length); + gfsm_process_event(&(session->context), + gfsm_create_event(SESSION_EVENT_IP_ASSIGNED, p_param, g_free)); + } +} + +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_mac(const guint8 *session_mac, + guint32 session_id, guint8 **adv_mac) +{ + INFO_MSG; + + asp_session_s *session = _get_exist_session(session_id, session_mac); + g_assert(session); + + *adv_mac = session->service_mac; + + return TRUE; +} + +gboolean asp_session_get_advertisement_id(const guint8 *session_mac, + guint32 session_id, guint32 *advertisement_id) +{ + INFO_MSG; + + asp_session_s *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); + + return TRUE; +} + +gboolean asp_session_get_peer_endpoint(guint8 *session_mac, guint32 session_id, + gchar *peer_ip, guint16 *port) +{ + INFO_MSG; + + asp_session_s *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_s *p_header = (asp_request_header_s *)p_msg; + + ASP_LOGD("%s asp_session_recv_req(), opcode:%d", ROLE, p_header->opcode); + + asp_session_s *session = _get_exist_session(p_header->session_id, + p_header->session_mac); + + if (!session && + ASP_OPCODE_REQUEST_SESSION != p_header->opcode) { + /* over infra */ + /* NACK shall be sent */ + _send_nack(sock_addr, p_header->seq_num, ASP_NACK_REASON_NO_SESSION_EXIST); + return; + } + + if (session && session->over_p2p && session->sock_addr == NULL) { + ASP_LOGD("IpAssigned signal isn't yet received, discard event"); + return; + } + + 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_strlcpy(session->additional_info, SESSION_STATUS_ADDITIONAL_INFO_PD, + SESSION_STATUS_ADDITIONAL_INFO_LEN); + 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)); + 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_s *)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_LOGD("%s asp_session_recv_ack: session_id:%d, session_mac[0]:%x", ROLE, + session_id, session_mac[0]); + asp_session_s *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)); +} + +void asp_session_recv_nack(GSocketAddress *sock_addr, guint8 *session_mac, + guint32 session_id, gpointer data) +{ + INFO_MSG; + + asp_session_s *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_s *session = _get_exist_session(session_id, session_mac); + + if (session == NULL) { + ASP_LOGE("session [%u] already destroyed", session_id); + return; + } + + gfsm_process_event(&(session->context), + gfsm_create_event(SESSION_EVENT_PEER_DESTROYED, NULL, NULL)); +} + +/***************************************************************************** + * Local Function Definition + *****************************************************************************/ + +gboolean _send_request_session(asp_session_s *session, guint8 *session_info, + size_t session_info_len) +{ + INFO_MSG; + + asp_request_session_s 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, + (void *)&request_session_data); +} + +gboolean _send_remove_session(asp_session_s *session, guint8 remove_reason) +{ + INFO_MSG; + + asp_remove_session_s 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, (void *)&remove_session_data); +} + +gboolean _send_reject_session(asp_session_s *session) +{ + INFO_MSG; + + asp_rejected_session_s 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, + (void *)&rejected_session_data); +} + +gboolean _send_added_session(asp_session_s *session) +{ + INFO_MSG; + + asp_added_session_s 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, (void *)&add_session_data); +} + +gboolean _send_deferred_session(asp_session_s *session, + guint8 *deferred_response, size_t length) +{ + INFO_MSG; + + asp_deferred_session_s 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, + (void *)&deferred_session_data); +} + +gboolean _send_allowed_port(asp_session_s *session, guint16 port, + guint8 protocol) +{ + INFO_MSG; + + asp_allowed_port_s 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, (void *)&allowed_port_data); +} + +gboolean _send_nack(GSocketAddress *sock_addr, guint8 seq_num, guint8 reason) +{ + INFO_MSG; + + asp_nack_s 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, (void *)&nack_data); +} + +gboolean _send_ack(GSocketAddress *sock_addr, guint8 seq_num) +{ + INFO_MSG; + + asp_nack_s ack_data; + ack_data.opcode = ASP_OPCODE_ACK; + ack_data.seq_num = seq_num; + + return asp_sess_peer_send_msg(sock_addr, (void *)&ack_data); +} + +void _session_tree_value_destoryed(gpointer data) +{ + INFO_MSG; + + asp_session_s *session = (asp_session_s *)data; + + /* destroy gfsm context */ + /*gfsm_destroy_context(session->context); */ + + if (session->sock_addr) { + g_object_unref(session->sock_addr); + session->sock_addr = NULL; + } + + g_free(session); + session = NULL; +} + +void _session_tree_key_destoryed(gpointer data) +{ + asp_session_key_s *key = (asp_session_key_s *)data; + + g_free(key); +} + +gint _session_tree_compare_func(gconstpointer a, gconstpointer b) +{ + asp_session_key_s *s1 = (asp_session_key_s *)a; + asp_session_key_s *s2 = (asp_session_key_s *)b; + + /* ascending sort */ + if (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); +} + +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) +{ + INFO_MSG; + + if (NULL == session_cb_v_table.session_request.cb) { + /* a callback have not been registered yet */ + return; + } + + 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); +} + +void _call_session_config_request_cb(gint32 error_code, guint8 *session_mac, + guint32 session_id, gboolean get_pin, guint32 pin) +{ + INFO_MSG; + + if (NULL == session_cb_v_table.session_config_request.cb) { + /* a callback have not been registered yet */ + return; + } + + 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; + } + + 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; + + g_assert(session_cb_v_table.session_status.cb); + + asp_session_s *session = _get_exist_session(session_id, session_mac); + g_assert(session); + + session_cb_v_table.session_status.cb(error_code, session_mac, session_id, + _get_session_state(session_mac, session_id), closed_state, + session->additional_info, session_cb_v_table.session_status.user_data); +} + +void _call_connect_status_cb(gint32 error_code, guint8 *session_mac, + guint32 session_id, asp_session_connect_status_e status) +{ + INFO_MSG; + + g_assert(session_cb_v_table.session_status.cb); + + asp_session_s *session = _get_exist_session(session_id, session_mac); + g_assert(session); + + /* temporary code */ + /*what is deferred_resp ? */ + guint8 *deferred_resp = NULL; + size_t length = 0; + /* temporary code */ + + 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); +} + +gpointer _asp_session_dup_reqeust_session(gpointer p_msg) +{ + asp_request_session_s *p_dup_msg = (asp_request_session_s *)g_malloc(sizeof( + asp_request_session_s)); + memcpy(p_dup_msg, p_msg, sizeof(asp_request_session_s)); + return (gpointer) p_dup_msg; +} + +/* + +gpointer _asp_session_dup_added_session(gpointer p_msg) +{ + asp_added_session_s* p_dup_msg = (asp_added_session_s*)g_malloc(sizeof(asp_added_session_s)); + memcpy(p_dup_msg, p_msg, sizeof(asp_added_session_s)); + return (gpointer)p_dup_msg; +} + +gpointer _asp_session_dup_rejected_session(gpointer p_msg) +{ + asp_rejected_session_s* p_dup_msg = (asp_rejected_session_s*)g_malloc(sizeof(asp_rejected_session_s)); + memcpy(p_dup_msg, p_msg, sizeof(asp_rejected_session_s)); + return (gpointer)p_dup_msg; +} + +gpointer _asp_session_dup_remove_session(gpointer p_msg) +{ + asp_remove_session_s* p_dup_msg = (asp_remove_session_s*)g_malloc(sizeof(asp_remove_session_s)); + memcpy(p_dup_msg, p_msg, sizeof(asp_remove_session_s)); + return (gpointer)p_dup_msg; +} + +gpointer _asp_session_dup_deferred_session(gpointer p_msg) +{ + asp_deferred_session_s* p_dup_msg = (asp_deferred_session_s*)g_malloc(sizeof(asp_deferred_session_s)); + memcpy(p_dup_msg, p_msg, sizeof(asp_deferred_session_s)); + return (gpointer)p_dup_msg; +} +*/ + +gpointer _asp_session_dup_allowed_session(gpointer p_msg) +{ + INFO_MSG; + + asp_allowed_port_s *p_dup_msg = (asp_allowed_port_s *)g_malloc(sizeof( + asp_allowed_port_s)); + memcpy(p_dup_msg, p_msg, sizeof(asp_allowed_port_s)); + 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_s *session = _get_exist_session(session_id, session_mac); + g_assert(session); + + gfsm_state_id_t current_state = gfsm_get_current_state_id(session->context); + ASP_LOGD("%s _get_session_state() current session_state : %d", ROLE, current_state); + switch (current_state) { + case SESSION_STATE_NONE: + case SESSION_STATE_CLOSED: + case SESSION_STATE_RUNNING: + ret = ASP_SESSION_STATE_CLOSED; + break; + case SESSION_STATE_REQUEST_SESSION_SENT: + case SESSION_STATE_SESSION_REQUEST_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_SESSION_REQUEST_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_s *_new_session_by_request_session(GSocketAddress *sock_addr, + const gchar *peer_ip, gpointer p_msg) +{ + INFO_MSG; + + asp_session_s *session = NULL; + asp_request_session_s *p_req_session = (asp_request_session_s *)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_s *_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_s *session = NULL; + + session = (asp_session_s *)g_malloc0(sizeof(asp_session_s)); + + 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 = (GSocketAddress *) g_object_ref(sock_addr); + /*session->sock_family = G_SOCKET_FAMILY_IPV4; // temporary */ + session->over_p2p = FALSE; + + g_strlcpy(session->additional_info, SESSION_STATUS_ADDITIONAL_INFO_CO, + SESSION_STATUS_ADDITIONAL_INFO_LEN); + + session->context = gfsm_create_context(session_fsm, + _asp_session_destroy_session, session); + + _insert_session(session); + + return session; +} + +asp_session_s *_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_s *session = NULL; + + session = (asp_session_s *)g_malloc0(sizeof(asp_session_s)); + + 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, + /*session->sock_family = G_SOCKET_FAMILY_IPV4; // temporary */ + session->over_p2p = TRUE; + g_strlcpy(session->additional_info, SESSION_STATUS_ADDITIONAL_INFO_PD, + SESSION_STATUS_ADDITIONAL_INFO_LEN); + + session->context = gfsm_create_context(session_fsm, + _asp_session_destroy_session, session); + + _insert_session(session); + + return session; +} + +asp_session_s *_new_session_from_session_request(const guint8 *session_mac, + guint32 session_id, guint32 advertisement_id) +{ + INFO_MSG; + + asp_session_s *session = NULL; + + session = (asp_session_s *)g_malloc0(sizeof(asp_session_s)); + + 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; + + g_strlcpy(session->additional_info, SESSION_STATUS_ADDITIONAL_INFO_PD, + SESSION_STATUS_ADDITIONAL_INFO_LEN); + + session->context = gfsm_create_context(session_fsm, + _asp_session_destroy_session, session); + + _insert_session(session); + + return session; +} + +void _store_peer_ip_addr(asp_session_s *session, char *peer_ip, size_t length) +{ + INFO_MSG; + g_strlcpy(session->peer_ip, peer_ip, length); + session->sock_addr = g_inet_socket_address_new_from_string(peer_ip, + (guint) g_asp_cordination_port); + + if (session->sock_addr == NULL) + ASP_LOGD("Failed to create socket IP %s", peer_ip); + else + ASP_LOGD("Succeeded to create socket IP %s", peer_ip); + +} + +#ifdef HAVE_ASP_P2P_CONN +guint8 *_get_peer_mac(asp_session_s *session) +{ + if (session->asp_role == ASP_ROLE_ADVERTIZER) + return session->session_mac; + else + return session->service_mac; +} +#endif + +void _asp_session_destroy_session(void *p_context_data) +{ + INFO_MSG; + + asp_session_s *session = (asp_session_s *)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_s *_get_exist_session(guint32 session_id, const guint8 *session_mac) +{ + asp_session_s *session = NULL; + + session = (asp_session_s *)g_tree_lookup(sessionTree, + _get_session_key(session_id, session_mac)); + + return session; +} + +asp_session_key_s *_get_session_key(guint32 session_id, + const guint8 *session_mac) +{ + asp_session_key_s *key = (asp_session_key_s *)g_malloc(sizeof( + asp_session_key_s)); + key->session_id = session_id; + memcpy(key->session_mac, session_mac, MAC_ADDRESS_LEN); /* 6 bytes */ + + return key; +} + +void _insert_session(asp_session_s *session) +{ + /* add a new session to hash table ( key - session_id, value - asp_session_s*) */ + 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) +{ + GInetSocketAddress *inetaddr; + GInetAddress *hostaddr; + gchar *ip_str = NULL; + + inetaddr = G_INET_SOCKET_ADDRESS(sock_addr); + hostaddr = g_inet_socket_address_get_address(inetaddr); + + ip_str = g_inet_address_to_string(hostaddr); + g_strlcpy(peer_ip, ip_str, ASP_SESSION_IPV4_STR_LEN); + + ASP_LOGD("%s peer_ip: %s", ROLE, peer_ip); + g_free(ip_str); + + /*g_object_unref(hostaddr); */ + /*g_object_unref(inetaddr); */ +} + +/***************************************************************************** + * Local Function for state machine + *****************************************************************************/ + +const char *_asp_session_fsm_get_state_name_cb(gfsm_state_id_t state_id) +{ + const char *ret_val = NULL; + + switch (state_id) { + case SESSION_STATE_NONE: + ret_val = "SESSION_STATE_NONE"; + break; + case SESSION_STATE_CLOSED: + ret_val = "SESSION_STATE_CLOSED"; + break; + case SESSION_STATE_RUNNING: + ret_val = "SESSION_STATE_RUNNING"; + break; + case SESSION_STATE_L2CONNECTING: + ret_val = "SESSION_STATE_L2CONNECTING"; + break; + case SESSION_STATE_SESSION_REQUEST_SENT: + ret_val = "SESSION_STATE_SESSION_REQUEST_SENT"; + break; + case SESSION_STATE_SESSION_REQUEST_RECEIVED: + ret_val = "SESSION_STATE_SESSION_REQUEST_RECEIVED"; + break; + case SESSION_STATE_SESSION_REQUEST_DEFERED: + ret_val = "SESSION_STATE_SESSION_REQUEST_DEFERED"; + break; + case SESSION_STATE_SESSION_REQUEST_ACCEPTED: + ret_val = "SESSION_STATE_SESSION_REQUEST_ACCEPTED"; + break; + case SESSION_STATE_ENTERING_PIN: + ret_val = "SESSION_STATE_ENTERING_PIN"; + break; + case SESSION_STATE_GROUP_FORMATION_COMPLETED: + ret_val = "SESSION_STATE_GROUP_FORMATION_COMPLETED"; + break; + case SESSION_STATE_L2CONNECTED: + ret_val = "SESSION_STATE_L2CONNECTED"; + break; + case SESSION_STATE_REQUEST_SESSION_SENT: + ret_val = "SESSION_STATE_REQUEST_SESSION_SENT"; + break; + case SESSION_STATE_OPEN: + ret_val = "SESSION_STATE_OPEN"; + break; + case SESSION_STATE_REQUEST_SESSION_RECEIVED: + ret_val = "SESSION_STATE_REQUEST_SESSION_RECEIVED"; + break; + case SESSION_STATE_REJECT_SESSION_SENT: + ret_val = "SESSION_STATE_REJECT_SESSION_SENT"; + break; + case SESSION_STATE_REMOVE_SESSION_SENT: + ret_val = "SESSION_STATE_REMOVE_SESSION_SENT"; + break; + default: + ret_val = "SESSION_STATE_MAX"; + break; + } + + return ret_val; +} + +const char *_asp_session_gfsm_get_event_name_cb(gfsm_event_id_t event_id) +{ + const char *ret_val = NULL; + + switch (event_id) { + case SESSION_EVENT_BOUND_PORT_CALLED: + ret_val = "SESSION_EVENT_BOUND_PORT_CALLED"; + break; + case SESSION_EVENT_CLOSE_SESSION_CALLED: + ret_val = "SESSION_EVENT_CLOSE_SESSION_CALLED"; + break; + case SESSION_EVENT_CONNECT_SESSION_CALLED: + ret_val = "SESSION_EVENT_CONNECT_SESSION_CALLED"; + break; + case SESSION_EVENT_CONFIRM_SESSION_CALLED: + ret_val = "SESSION_EVENT_CONFIRM_SESSION_CALLED"; + break; + case SESSION_EVENT_DEFER_SESSION_CALLED: + ret_val = "SESSION_EVENT_DEFER_SESSION_CALLED"; + break; + case SESSION_EVENT_SET_SESSION_READY_CALLED: + ret_val = "SESSION_EVENT_SET_SESSION_READY_CALLED"; + break; + case SESSION_EVENT_SESSION_REQUEST_CALLED: + ret_val = "SESSION_EVENT_SESSION_REQUEST_CALLED"; + break; + case SESSION_EVENT_SESSION_CONFIG_REQUEST_CALLED: + ret_val = "SESSION_EVENT_SESSION_CONFIG_REQUEST_CALLED"; + break; + case SESSION_EVENT_CONNECT_STATUS_CALLED: + ret_val = "SESSION_EVENT_CONNECT_STATUS_CALLED"; + break; + case SESSION_EVENT_IP_ASSIGNED: + ret_val = "SESSION_EVENT_IP_ASSIGNED"; + break; + case SESSION_EVENT_REMOVE_SESSION_RECEIVED: + ret_val = "SESSION_EVENT_REMOVE_SESSION_RECEIVED"; + break; + case SESSION_EVENT_ALLOWED_PORT_RECEIVED: + ret_val = "SESSION_EVENT_ALLOWED_PORT_RECEIVED"; + break; + case SESSION_EVENT_DEFERRED_SESSION_RECEIVED: + ret_val = "SESSION_EVENT_DEFERRED_SESSION_RECEIVED"; + break; + case SESSION_EVENT_REJECTED_SESSION_RECEIVED: + ret_val = "SESSION_EVENT_REJECTED_SESSION_RECEIVED"; + break; + case SESSION_EVENT_ADDED_SESSION_RECEIVED: + ret_val = "SESSION_EVENT_ADDED_SESSION_RECEIVED"; + break; + case SESSION_EVENT_REQUEST_SESSION_RECEIVED: + ret_val = "SESSION_EVENT_REQUEST_SESSION_RECEIVED"; + break; + case SESSION_EVENT_ACK_RECEIVED: + ret_val = "SESSION_EVENT_ACK_RECEIVED"; + break; + case SESSION_EVENT_NACK_RECEIVED: + ret_val = "SESSION_EVENT_NACK_RECEIVED"; + break; + case SESSION_EVENT_PEER_DESTROYED: + ret_val = "SESSION_EVENT_PEER_DESTROYED"; + break; + case SESSION_EVENT_TIMEOUT: + ret_val = "SESSION_EVENT_TIMEOUT"; + break; + case SESSION_EVENT_DELETE_SESSION: + ret_val = "SESSION_EVENT_DELETE_SESSION"; + break; + default: + ret_val = "SESSION_EVENT_MAX"; + break; + } + + return ret_val; +} + +int _asp_session_fsm_log_func(const char *format, ...) +{ + gchar buffer[256]; + va_list args; + va_start(args, format); + g_vsnprintf(buffer, 255, format, args); + va_end(args); + + ASP_LOGD("%s", buffer); + + return 0; +} + + +void _asp_session_fsm_init() +{ + INFO_MSG; + + session_fsm = gfsm_create_fsm(SESSION_STATE_MAX, SESSION_EVENT_MAX, + SESSION_STATE_NONE); + + session_state_none = gfsm_create_state(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); + + session_state_closed = gfsm_create_state(SESSION_STATE_CLOSED, session_fsm, + _state_closed_entry_action, _state_closed_exit_action); + gfsm_add_reaction(session_state_closed, SESSION_EVENT_DELETE_SESSION, + _state_closed_reaction_delete_session); + /*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); // ???? */ + + session_state_running = gfsm_create_state(SESSION_STATE_RUNNING, session_fsm, + _state_running_entry_action, _state_running_exit_action); + + session_state_l2connecting = gfsm_create_state(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); + + session_state_session_request_sent = gfsm_create_state( + 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); + + session_state_session_request_defered = gfsm_create_state( + 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); + + session_state_session_request_received = gfsm_create_state( + 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); + + session_state_session_request_accepted = gfsm_create_state( + 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_add_reaction(session_state_session_request_accepted, + SESSION_EVENT_SET_SESSION_READY_CALLED, + _state_session_request_accepted_reaction_set_session_ready_called); + + session_state_entering_pin = gfsm_create_state(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); + + session_state_group_formation_completed = gfsm_create_state( + 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_add_reaction(session_state_group_formation_completed, + SESSION_EVENT_SET_SESSION_READY_CALLED, + _state_group_formation_completed_reaction_set_session_ready_called); + + session_state_l2connected = gfsm_create_state(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); + + session_state_request_session_sent = gfsm_create_state( + 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); + + session_state_request_session_received = gfsm_create_state( + 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); + + session_state_open = gfsm_create_state(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); + + session_state_reject_session_sent = gfsm_create_state( + 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); + + session_state_remove_session_sent = gfsm_create_state( + 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_reaction(session_state_remove_session_sent, SESSION_EVENT_PEER_DESTROYED, + _state_remove_session_sent_reaction_peer_destroyed); + + 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); + + gfsm_set_logger(session_fsm, _asp_session_fsm_log_func, + ASP_SESSION_HEADER, + _asp_session_fsm_get_state_name_cb, + _asp_session_gfsm_get_event_name_cb); +} + +void _asp_session_fsm_terminate() +{ + gfsm_destroy_state(session_state_none); + gfsm_destroy_state(session_state_closed); + gfsm_destroy_state(session_state_running); + gfsm_destroy_state(session_state_request_session_sent); + gfsm_destroy_state(session_state_request_session_received); + gfsm_destroy_state(session_state_open); + gfsm_destroy_state(session_state_reject_session_sent); + gfsm_destroy_state(session_state_remove_session_sent); + + gfsm_destroy_fsm(session_fsm); +} + +void _state_none_entry_action(void *p_context_data) +{ + INFO_MSG; +} + +void _state_none_exit_action(void *p_context_data) +{ +} + +gfsm_state_id_t _state_none_reaction_request_session_received( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + asp_session_s *session = (asp_session_s *)p_context_data; + asp_request_session_s *p_msg = (asp_request_session_s *)p_event_data; + + if (!session->over_p2p) + _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( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + + asp_session_s *session = (asp_session_s *)p_context_data; + connect_session_param_s *p_connect_session = (connect_session_param_s *) + 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( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + + asp_session_s *session = (asp_session_s *)p_context_data; + session_request_param_s *p_session_request = (session_request_param_s *) + 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(void *p_context_data) +{ + INFO_MSG; + + asp_session_s *session = (asp_session_s *)p_context_data; + + g_assert(session); + + _call_session_status_cb(0, session->session_mac, session->session_id, + session->closed_state); + + asp_sess_peer_del_session(session->sock_addr, session->session_mac, + session->session_id); + + gfsm_process_event(&(session->context), + gfsm_create_event(SESSION_EVENT_DELETE_SESSION, NULL, NULL)); +} + +void _state_closed_exit_action(void *p_context_data) +{ +} + +gfsm_state_id_t _state_closed_reaction_delete_session(void *p_context_data, + void *p_event_data) +{ + INFO_MSG; + + asp_session_s *session = (asp_session_s *)p_context_data; + + g_assert(session); + + ASP_LOGD("context[%p]", session->context); + gfsm_destroy_context(session->context); + + return GFSM_DISCARD_EVENT; +} + +#if 0 +gfsm_state_id_t _state_closed_reaction_connect_session_called( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + + /*asp_session_s* session = (asp_session_s*)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( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + + return SESSION_STATE_REQUEST_SESSION_RECEIVED; +} +#endif + +void _state_running_entry_action(void *p_context_data) +{ + INFO_MSG; +} + +void _state_running_exit_action(void *p_context_data) +{ +} + +void _state_l2connecting_entry_action(void *p_context_data) +{ + INFO_MSG; +} + +void _state_l2connecting_exit_action(void *p_context_data) +{ +} + +gfsm_state_id_t _state_l2connecting_reaction_close_session_called( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + + asp_session_s *session = (asp_session_s *)p_context_data; + +#ifdef HAVE_ASP_P2P_CONN + asp_p2p_conn_disconnect_p2p(_get_peer_mac(session)); +#endif + + session->closed_state = + ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE; /* temporary value. shall be changed */ + + return SESSION_STATE_CLOSED; +} + +gfsm_state_id_t _state_l2connecting_reaction_timeout(void *p_context_data, + void *p_event_data) +{ + INFO_MSG; + + asp_session_s *session = (asp_session_s *)p_context_data; +#ifdef HAVE_ASP_P2P_CONN + + asp_p2p_conn_disconnect_p2p(_get_peer_mac(session)); +#endif + + session->closed_state = ASP_SESSION_CLOSED_STATE_DISASSOCIATED; + + return SESSION_STATE_CLOSED; +} + +void _state_session_request_sent_entry_action(void *p_context_data) +{ + INFO_MSG; + + asp_session_s* session = (asp_session_s*)p_context_data; + /*_start_timer(...); */ + _call_session_status_cb(0, session->session_mac, session->session_id, + ASP_SESSION_CLOSED_STATE_NONE); +} + +void _state_session_request_sent_exit_action(void *p_context_data) +{ + /*_stop_timer(...); */ +} + +gfsm_state_id_t _state_session_request_sent_reaction_connect_status_called( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + + connect_status_param_s *p_connect_status = (connect_status_param_s *) + p_event_data; + asp_session_s *session = (asp_session_s *)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: + /* need to assign a proper closed_state "session->closed_state = ???; */ + return SESSION_STATE_CLOSED; + break; + case ASP_SESSION_CONNECT_STATUS_NO_MORE_CONNECTION: + /* need to assign a proper closed_state "session->closed_state = ???; */ + 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: + /* need to assign a proper closed_state "session->closed_state = ???; */ + 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( + void *p_context_data, void *p_event_data) +{ + asp_session_s *session = (asp_session_s *)p_context_data; + session_config_request_param_s *p_config_request_param = + (session_config_request_param_s *)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(void *p_context_data) +{ + INFO_MSG; + /*_start_timer(...); */ +} + +void _state_session_request_defered_exit_action(void *p_context_data) +{ + /*_stop_timer(...); */ +} + +gfsm_state_id_t _state_session_request_defered_reaction_connect_status_called( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + + connect_status_param_s *p_connect_status = (connect_status_param_s *) + p_event_data; + asp_session_s *session = (asp_session_s *)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: + /* need to assign a proper closed_state "session->closed_state = ???; */ + return SESSION_STATE_CLOSED; + break; + case ASP_SESSION_CONNECT_STATUS_NO_MORE_CONNECTION: + /* need to assign a proper closed_state "session->closed_state = ???; */ + 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: + /* need to assign a proper closed_state "session->closed_state = ???; */ + 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( + void *p_context_data, void *p_event_data) +{ + asp_session_s *session = (asp_session_s *)p_context_data; + session_config_request_param_s *p_config_request_param = + (session_config_request_param_s *)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(void *p_context_data) +{ + INFO_MSG; + + asp_session_s* session = (asp_session_s*)p_context_data; + + /*_start_timer(..); */ + _call_session_status_cb(0, session->session_mac, session->session_id, + ASP_SESSION_CLOSED_STATE_NONE); +} + +void _state_session_request_received_exit_action(void *p_context_data) +{ + /*_stop_timer(..); */ +} + +gfsm_state_id_t _state_session_request_received_reaction_confirm_session_called( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + +#ifdef HAVE_ASP_P2P_CONN + asp_session_s *session = (asp_session_s *)p_context_data; +#endif + confirm_session_param_s *p_confirm_session = (confirm_session_param_s *) + 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 { + /* need to assign a proper closed_state "session->closed_state = ???; */ + return SESSION_STATE_CLOSED; + } +} + +void _state_session_request_accepted_entry_action(void *p_context_data) +{ + INFO_MSG; + /*_start_timer(...) */ +} + +void _state_session_request_accepted_exit_action(void *p_context_data) +{ + /*_stop_timer(...) */ +} + +gfsm_state_id_t +_state_session_request_accepted_reaction_connect_status_received( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + + connect_status_param_s *p_connect_status = (connect_status_param_s *) + p_event_data; + asp_session_s *session = (asp_session_s *)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: + /* need to assign a proper closed_state "session->closed_state = ???; */ + return SESSION_STATE_CLOSED; + break; + case ASP_SESSION_CONNECT_STATUS_NO_MORE_CONNECTION: + /* need to assign a proper closed_state "session->closed_state = ???; */ + return SESSION_STATE_CLOSED; + break; + case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_FAILED: + /* need to assign a proper closed_state "session->closed_state = ???; */ + 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: + /* need to assign a proper closed_state "session->closed_state = ???; */ + 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( + void *p_context_data, void *p_event_data) +{ + asp_session_s *session = (asp_session_s *)p_context_data; + session_config_request_param_s *p_config_request_param = + (session_config_request_param_s *)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; +} + +gfsm_state_id_t +_state_session_request_accepted_reaction_set_session_ready_called( + void *p_context_data, void *p_event_data) +{ + return GFSM_DEFER_EVENT; +} + +void _state_entering_pin_entry_action(void *p_context_data) +{ + /*start_timer */ +} + +void _state_entering_pin_exit_action(void *p_context_data) +{ + /*stop_timer */ +} + +gfsm_state_id_t _state_entering_pin_reaction_confirm_session_called( + void *p_context_data, void *p_event_data) +{ +#ifdef HAVE_ASP_P2P_CONN + asp_session_s *session = (asp_session_s *)p_context_data; +#endif + confirm_session_param_s *p_confirm_session = (confirm_session_param_s *) + 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 { + /* need to assign a proper closed_state "session->closed_state = ???; */ + return SESSION_STATE_CLOSED; + } +} + +void _state_group_formation_completed_entry_action(void *p_context_data) +{ + /*_start_timer(...); */ + INFO_MSG; +} + +void _state_group_formation_completed_exit_action(void *p_context_data) +{ + /*_stop_timer(...); */ +} + +gfsm_state_id_t _state_group_formation_completed_reaction_ip_assigned( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + gfsm_state_id_t ret_state = GFSM_DISCARD_EVENT; + + asp_session_s *session = (asp_session_s *)p_context_data; + g_assert(session); + + ip_assigned_param_s *p_ip_assigned_param = (ip_assigned_param_s *)p_event_data; + g_assert(p_ip_assigned_param); + + ASP_LOGD("peer IP %s", p_ip_assigned_param->peer_ip_addr); + _store_peer_ip_addr(session, p_ip_assigned_param->peer_ip_addr, + p_ip_assigned_param->length); + if (session->asp_role == ASP_ROLE_SEEKER) + ret_state = SESSION_STATE_REQUEST_SESSION_SENT; + else + ret_state = SESSION_STATE_REQUEST_SESSION_RECEIVED; + + return ret_state; +} + +gfsm_state_id_t +_state_group_formation_completed_reaction_request_session_received( + void *p_context_data, void *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; +} + +gfsm_state_id_t +_state_group_formation_completed_reaction_set_session_ready_called( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + return GFSM_DEFER_EVENT; +} + +void _state_l2connected_entry_action(void *p_context_data) +{ + INFO_MSG; + + asp_session_s *session = (asp_session_s *)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(void *p_context_data) +{ +} + +gfsm_state_id_t _state_l2connected_reaction_close_session_called( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + + guint8 *close_reason = (guint8 *) p_event_data; + asp_session_s *session = (asp_session_s *)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( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + + /*guint8 remove_reason = *((guint8*)p_event_data); */ + asp_session_s *session = (asp_session_s *)p_context_data; + session->closed_state = ASP_SESSION_CLOSED_STATE_REMOTE_CLOSE; + + return SESSION_STATE_CLOSED; +} + +gfsm_state_id_t _state_l2connected_reaction_peer_destroyed(void *p_context_data, + void *p_event_data) +{ + INFO_MSG; + + return SESSION_STATE_CLOSED; +} + +void _state_request_session_sent_entry_action(void *p_context_data) +{ + INFO_MSG; + + asp_session_s *session = (asp_session_s *)p_context_data; + + if (!session->over_p2p) + _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(void *p_context_data) +{ +} + +gfsm_state_id_t _state_request_session_sent_reaction_added_session_received( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + + return SESSION_STATE_OPEN; +} + +gfsm_state_id_t _state_request_session_sent_reaction_deferred_session_received( + void *p_context_data, void *p_event_data) +{ + + INFO_MSG; + + asp_session_s *session = (asp_session_s *)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( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + + asp_session_s *session = (asp_session_s *)p_context_data; + session->closed_state = ASP_SESSION_CLOSED_STATE_REMOTE_CLOSE; + + return SESSION_STATE_CLOSED; +} + +gfsm_state_id_t _state_request_session_sent_reaction_timeout( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + + guint8 *remove_reason = (guint8 *) p_event_data; + asp_session_s *session = (asp_session_s *)p_context_data; + + _send_remove_session(session, *remove_reason); + + return SESSION_STATE_REMOVE_SESSION_SENT; +} + +void _state_request_session_received_entry_action(void *p_context_data) +{ + INFO_MSG; + + asp_session_s *session = (asp_session_s *)p_context_data; + g_assert(session); + if (session->over_p2p && session->confirmed && + session->asp_role == ASP_ROLE_ADVERTIZER) { + /* TODO: Set Session should done after this event */ + } else { + /* 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(void *p_context_data) +{ +} + +gfsm_state_id_t +_state_request_session_received_reaction_set_session_ready_called( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + + asp_session_s *session = (asp_session_s *)p_context_data; + + _send_added_session(session); + + return SESSION_STATE_OPEN; +} + +gfsm_state_id_t _state_request_session_received_reaction_defer_session_called( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + + defer_session_param_s *defer_session_param = (defer_session_param_s *) + p_event_data; + asp_session_s *session = (asp_session_s *)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( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + + asp_session_s *session = (asp_session_s *)p_context_data; + confirm_session_param_s *p_confirmed_param = (confirm_session_param_s *) + 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(void *p_context_data) +{ + INFO_MSG; + + asp_session_s *session = (asp_session_s *)p_context_data; + _call_session_status_cb(0, session->session_mac, session->session_id, + ASP_SESSION_CLOSED_STATE_NONE); +} + +void _state_open_exit_action(void *p_context_data) +{ +} + +gfsm_state_id_t _state_open_reaction_bound_port_called(void *p_context_data, + void *p_event_data) +{ + INFO_MSG; + + bound_port_param_s *bound_port_param = (bound_port_param_s *)p_event_data; + asp_session_s *session = (asp_session_s *)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(void *p_context_data, + void *p_event_data) +{ + INFO_MSG; + + asp_allowed_port_s *p_allowed_port = (asp_allowed_port_s *)p_event_data; + + asp_session_s *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(void *p_context_data) +{ + INFO_MSG; + + /* asp_session_s* session = (asp_session_s*)p_context_data; */ +} + +void _state_reject_session_sent_exit_action(void *p_context_data) +{ +} + +gfsm_state_id_t _state_reject_session_sent_reaction_ack_received( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + + asp_session_s *session = (asp_session_s *)p_context_data; + session->closed_state = ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE; + + return SESSION_STATE_CLOSED; +} + +gfsm_state_id_t _state_reject_session_sent_reaction_nack_received( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + + asp_session_s *session = (asp_session_s *)p_context_data; + session->closed_state = ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE; + + return SESSION_STATE_CLOSED; +} + +void _state_remove_session_sent_entry_action(void *p_context_data) +{ + INFO_MSG; + + /*asp_session_s* session = (asp_session_s*)p_context_data; */ +} + +void _state_remove_session_sent_exit_action(void *p_context_data) +{ +} + +gfsm_state_id_t _state_remove_session_sent_reaction_ack_received( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + + asp_session_s *session = (asp_session_s *)p_context_data; + session->closed_state = ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE; + + return SESSION_STATE_CLOSED; +} + +gfsm_state_id_t _state_remove_session_sent_reaction_nack_received( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + + asp_session_s *session = (asp_session_s *)p_context_data; + session->closed_state = ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE; + + return SESSION_STATE_CLOSED; +} + +static gfsm_state_id_t _state_remove_session_sent_reaction_peer_destroyed( + void *p_context_data, void *p_event_data) +{ + INFO_MSG; + + asp_session_s *session = (asp_session_s *)p_context_data; + session->closed_state = ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE; + + return SESSION_STATE_CLOSED; +} diff --git a/src/asp-tech-ble.c b/src/asp-tech-ble.c new file mode 100755 index 0000000..052ae1a --- /dev/null +++ b/src/asp-tech-ble.c @@ -0,0 +1,166 @@ +/* + * 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-util.h" +#include "asp-service.h" +#include "asp-session.h" +#include "asp-tech.h" +#include "asp-tech-ble.h" + +/***************************************************************************** + * Macros and Typedefs + *****************************************************************************/ + +/* TODO : define service data structure */ + +/***************************************************************************** + * Global Variables + *****************************************************************************/ + +/* TODO : define local memory for service data structure */ + +/***************************************************************************** + * Local Functions Definition + *****************************************************************************/ + +gint32 asp_tech_ble_init() +{ + __ASP_LOG_FUNC_ENTER__; + gint32 result = 0; + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_ble_deinit() +{ + __ASP_LOG_FUNC_ENTER__; + gint32 result = 0; + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_ble_advertise(asp_service_advertise_s *service, gint32 replace) +{ + __ASP_LOG_FUNC_ENTER__; + gint32 result = 0; + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_ble_cancel_advertise(asp_service_advertise_s *service) +{ + __ASP_LOG_FUNC_ENTER__; + gint32 result = 0; + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_ble_seek(asp_service_seek_s *service) +{ + __ASP_LOG_FUNC_ENTER__; + gint32 result = 0; + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_ble_cancel_seek(asp_service_seek_s *service) +{ + __ASP_LOG_FUNC_ENTER__; + gint32 result = 0; + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_ble_connect_session(asp_tech_session_request_params_s *params) +{ + __ASP_LOG_FUNC_ENTER__; + gint32 result = 0; + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_ble_confirm_session(const guint8 *session_mac, gint32 session_id, gint32 confirm, guint32 pin) +{ + __ASP_LOG_FUNC_ENTER__; + gint32 result = 0; + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_ble_destroy_connection(const guint8 *peer_id, gint32 peer_id_length) +{ + __ASP_LOG_FUNC_ENTER__; + 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; +} + +asp_tech_ops_s asp_tech_ble_ops = { + .init = asp_tech_ble_init, + .deinit = asp_tech_ble_deinit, + .advertise = asp_tech_ble_advertise, + .cancel_advertise = asp_tech_ble_cancel_advertise, + .seek = asp_tech_ble_seek, + .cancel_seek = asp_tech_ble_cancel_seek, + .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/asp-tech-ble.h b/src/asp-tech-ble.h new file mode 100755 index 0000000..5a77e44 --- /dev/null +++ b/src/asp-tech-ble.h @@ -0,0 +1,20 @@ +/* + * 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_TECH_BLE_H__ +#define __ASP_TECH_BLE_H__ + +#endif /* __ASP_TECH_BLE_H__ */ diff --git a/src/asp-tech-infra.c b/src/asp-tech-infra.c new file mode 100644 index 0000000..44dca7e --- /dev/null +++ b/src/asp-tech-infra.c @@ -0,0 +1,621 @@ +/* + * 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 + +#include +#include + +#include +#include + +#include + +/***************************************************************************** + * Application Service Platform Daemon headers + *****************************************************************************/ +#include "asp-manager-util.h" +#include "asp-service.h" +#include "asp-session.h" +#include "asp-tech.h" +#include "asp-tech-infra.h" + +/***************************************************************************** + * Macros and Typedefs + *****************************************************************************/ + +/* TODO : define service data structure */ + +/***************************************************************************** + * Global Variables + *****************************************************************************/ +static __thread GHashTable *g_local_service_hash = NULL; +static __thread GHashTable *g_browser_hash = NULL; + + +/* TODO : define local memory for service data structure */ + +/***************************************************************************** + * Local Functions Definition + *****************************************************************************/ +static void _advertise_status_cb(dnssd_error_e result, + dnssd_service_h local_service, gpointer user_data) +{ + guint32 adv_id = GPOINTER_TO_UINT(user_data); + asp_service_advertise_status_e status = 0; + asp_service_advertise_reason_e reason = 0; + + switch (result) { + case DNSSD_ERROR_NONE: + case DNSSD_ERROR_ALREADY_REGISTERED: + status = ASP_SERVICE_ADV_STATUS_ADVERTISED; + reason = ASP_SERVICE_ADVERTISE_REASON_SUCCESS; + break; + case DNSSD_ERROR_NAME_CONFLICT: + status = ASP_SERVICE_ADV_STATUS_NOT_ADVERTISED; + reason = ASP_SERVICE_ADVERTISE_REASON_DUP; + break; + default: + status = ASP_SERVICE_ADV_STATUS_NOT_ADVERTISED; + reason = ASP_SERVICE_ADVERTISE_REASON_OTHER; + } + + asp_service_notify_advertise_status(adv_id, status, reason); +} + +static void __txt_record_to_g_hash(unsigned short txt_len, const gchar *txt_records, + GHashTable *service_info_map) +{ + const gchar *ptr = txt_records; + const gchar *max = txt_records + txt_len; + + ASP_LOGD("Parsing TXT record. Length: %hu", txt_len); + + while (ptr < max) { + unsigned short len = ptr[0]; + gchar *buf = g_strndup(ptr + 1, len); + ASP_LOGD("buf: %s", buf); + 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)); + ASP_LOGD("Insert (%s, %s) to hash. len: %d)", key, value, len); + g_free(buf); + ptr = ptr + 1 + len; + } +} + +static asp_service_status_e __get_service_status(dnssd_service_state_e service_state) +{ + asp_service_status_e service_status; + switch (service_state) { + case DNSSD_SERVICE_STATE_AVAILABLE: + service_status = ASP_SERVICE_STATUS_AVAILABLE; + break; + case DNSSD_SERVICE_STATE_UNAVAILABLE: + case DNSSD_SERVICE_STATE_NAME_LOOKUP_FAILED: + case DNSSD_SERVICE_STATE_HOST_NAME_LOOKUP_FAILED: + case DNSSD_SERVICE_STATE_ADDRESS_LOOKUP_FAILED: + service_status = ASP_SERVICE_STATUS_NOT_AVAILABLE; + break; + default: + service_status = ASP_SERVICE_STATUS_NOT_AVAILABLE; + } + + return service_status; +} + +static void _search_result_cb(dnssd_service_state_e service_state, + dnssd_service_h remote_service, gpointer user_data) +{ + asp_event_data event; + guint32 search_id = -1; + gchar *service_mac = NULL; + gchar *service_device_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; + gchar *txt = NULL; + const gchar *adv_id_str = NULL; + + ASP_LOGD("A service is found %u", remote_service); + + search_id = GPOINTER_TO_UINT(user_data); + dnssd_service_get_name(remote_service, &service_name); + ASP_LOGD("Service name: %s", service_name); + + service_status = __get_service_status(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, (gpointer)&txt); + if (txt_len > 1) { + service_info_map = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); + __txt_record_to_g_hash(txt_len, txt, service_info_map); + if (g_hash_table_contains(service_info_map, ASP_INFRA_ADV_KEY)) { + adv_id_str = g_hash_table_lookup(service_info_map, ASP_INFRA_ADV_KEY); + adv_id = g_ascii_strtoll(adv_id_str, NULL, 10); + ASP_LOGD("Advertisement ID: %u", adv_id); + } else { + ASP_LOGE("TXT records don't contain advertisement ID"); + g_hash_table_unref(service_info_map); + g_free(service_name); + g_free(txt); + return; + } + + 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", service_mac); + } else { + ASP_LOGE("TXT records don't contain advertisement MAC"); + g_hash_table_unref(service_info_map); + g_free(service_name); + g_free(txt); + return; + } + + if (g_hash_table_contains(service_info_map, ASP_INFRA_DEV_NAME)) { + service_device_name = g_strdup(g_hash_table_lookup(service_info_map, ASP_INFRA_DEV_NAME)); + ASP_LOGD("Service device name: %s", service_device_name); + } + } else { + ASP_LOGE("Found service should has at least one TXT record"); + g_free(service_name); + g_free(txt); + return; + } + + memset(&event, 0x0, sizeof(asp_event_data)); + event.search_result.tech = ASP_TECH_INFRA; + 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 + 1); + event.search_result.device_name = NULL; + event.search_result.instance_name = service_name; + event.search_result.service_info = service_info_map; + asp_manager_event(NULL, ASP_EVENT_SEARCH_RESULT, &event); + + g_hash_table_unref(service_info_map); + g_free(service_device_name); + g_free(service_mac); + g_free(txt); +} + +static gint32 __asp_service_infra_convert_error_type(gint32 dnssd_error) +{ + switch (dnssd_error) { + case DNSSD_ERROR_NONE: + return ASP_ERROR_NONE; + case DNSSD_ERROR_OUT_OF_MEMORY: + return ASP_ERROR_MEMORY; + case DNSSD_ERROR_INVALID_PARAMETER: + return ASP_ERROR_INVALIED_PARAMS; + case DNSSD_ERROR_NOT_SUPPORTED: + return ASP_ERROR_NOT_SUPPORTED_TECH; + case DNSSD_ERROR_SERVICE_NOT_FOUND: + return ASP_ERROR_SERVICE_NOT_FOUND; + case DNSSD_ERROR_INVALID_OPERATION: + case DNSSD_ERROR_NOT_INITIALIZED: + case DNSSD_ERROR_ALREADY_REGISTERED: + case DNSSD_ERROR_NAME_CONFLICT: + case DNSSD_ERROR_SERVICE_NOT_RUNNING: + case DNSSD_ERROR_OPERATION_FAILED: + return ASP_ERROR_OPERATION_FAILED; + default: + return ASP_ERROR_UNKNOWN; + } + return dnssd_error; +} + +static void __init_hash_tables() +{ + g_local_service_hash = g_hash_table_new(g_direct_hash, g_direct_equal); + g_browser_hash = g_hash_table_new(g_direct_hash, g_direct_equal); +} + +static void __g_hash_free_handle(gpointer key, gpointer value, gpointer user_data) +{ +} + +static void __deinit_hash_tables() +{ + g_hash_table_foreach(g_local_service_hash, (GHFunc)__g_hash_free_handle, NULL); + g_hash_table_foreach(g_browser_hash, (GHFunc)__g_hash_free_handle, NULL); + + g_local_service_hash = NULL; + g_browser_hash = NULL; +} + +static gint32 __add_txt_record(dnssd_service_h handle, const gchar* key, const gchar* value, gint32 len) +{ + gint32 result = 0; + unsigned short txt_length; + gpointer txt_data = NULL; + + result = dnssd_service_add_txt_record(handle, key, (unsigned short)len, value); + if (result != DNSSD_ERROR_NONE) { + result = __asp_service_infra_convert_error_type(result); + return result; + } + ASP_LOGD("Add (%s=%s) TXT record. length: %d", key, value, len); + + result = dnssd_service_get_all_txt_record(handle, &txt_length, &txt_data); + if (result != DNSSD_ERROR_NONE) { + result = __asp_service_infra_convert_error_type(result); + return result; + } + ASP_LOGD("Get all TXT records"); + + 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"); + result = __asp_service_infra_convert_error_type(result); + g_free(txt_data); + return result; + } + ASP_LOGD("Add TXT records"); + return result; +} + +gint32 asp_tech_infra_init() +{ + __ASP_LOG_FUNC_ENTER__; + gint32 result = 0; + + result = dnssd_initialize(); + if (result != DNSSD_ERROR_NONE) { + result = __asp_service_infra_convert_error_type(result); + return result; + } + + __init_hash_tables(); + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_infra_deinit() +{ + __ASP_LOG_FUNC_ENTER__; + gint32 result = 0; + + result = dnssd_deinitialize(); + if (result != DNSSD_ERROR_NONE) { + result = __asp_service_infra_convert_error_type(result); + return result; + } + + __deinit_hash_tables(); + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_infra_advertise(asp_service_advertise_s *service, gint32 replace) +{ + __ASP_LOG_FUNC_ENTER__; + gint32 result = 0; + dnssd_service_h service_handle = 0; + 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 */ + gchar *if_name; + wifi_manager_h wifi_handle = NULL; + + ASP_LOGD("Infrastructure advertise service. replace: %d", replace); + + if (replace) { + /* TODO */ + ; + } + + result = dnssd_create_local_service(service->service_type, &service_handle); + if (result != DNSSD_ERROR_NONE) { + result = __asp_service_infra_convert_error_type(result); + return result; + } + ASP_LOGD("Success to create local service handle: %u, service type: %s", + service_handle, service->service_type); + + result = dnssd_service_set_name(service_handle, service->instance_name); + if (result != DNSSD_ERROR_NONE) { + result = __asp_service_infra_convert_error_type(result); + return result; + } + ASP_LOGD("Success to set service name %s", service->instance_name); + + /* TODO set port */ + result = dnssd_service_set_port(service_handle, port); + if (result != DNSSD_ERROR_NONE) { + result = __asp_service_infra_convert_error_type(result); + return result; + } + ASP_LOGD("Success to set port %d", port); + + result = wifi_manager_initialize(&wifi_handle); + if (result != WIFI_MANAGER_ERROR_NONE) { + ASP_LOGD("Failed to initialize wifi-manager"); + return ASP_ERROR_OPERATION_FAILED; + } + result = wifi_manager_get_network_interface_name(wifi_handle, &if_name); + if (result != WIFI_MANAGER_ERROR_NONE) { + ASP_LOGD("Failed to get interface name"); + return ASP_ERROR_OPERATION_FAILED; + } + ASP_LOGD("Success to get wifi interface name %s", if_name); + result = wifi_manager_deinitialize(wifi_handle); + if (result != WIFI_MANAGER_ERROR_NONE) { + ASP_LOGD("Failed to deinitialize wifi_manager"); + free(if_name); + return ASP_ERROR_OPERATION_FAILED; + } + + result = dnssd_service_set_interface(service_handle, if_name); + if (result != DNSSD_ERROR_NONE) { + result = __asp_service_infra_convert_error_type(result); + free(if_name); + return result; + } + ASP_LOGD("Success to set interface %s", if_name); + free(if_name); + + result = dnssd_register_local_service(service_handle, + _advertise_status_cb, GUINT_TO_POINTER(service->adv_id)); + if (result != DNSSD_ERROR_NONE) { + result = __asp_service_infra_convert_error_type(result); + return result; + } + ASP_LOGD("Success to register local service %u", service_handle); + + g_hash_table_insert(g_local_service_hash, + GUINT_TO_POINTER(service->adv_id), GUINT_TO_POINTER(service_handle)); + + ASP_LOGD("Insert (%u, %u) to g_local_service_hash (size: %d)", + service->adv_id, service_handle, + g_hash_table_size(g_local_service_hash)); + + + /* Add TXT records */ + /* First of all, add Advertisement ID */ + snprintf(adv_id, ASP_SERVICE_ADV_ID_LEN + 1, "%u", service->adv_id); + adv_id_len = strlen(adv_id); + result = __add_txt_record(service_handle, ASP_INFRA_ADV_KEY, adv_id, adv_id_len); + if (result != DNSSD_ERROR_NONE) { + result = __asp_service_infra_convert_error_type(result); + return result; + } + + /* Add MAC Address to TXT record */ + mac_addr = vconf_get_str(VCONFKEY_WIFI_BSSID_ADDRESS); + if (!mac_addr) { + ASP_LOGE("Failed to get vconf value for %s", VCONFKEY_WIFI_BSSID_ADDRESS); + return ASP_ERROR_OPERATION_FAILED; + } + + mac_addr_len = strlen(mac_addr); + result = __add_txt_record(service_handle, ASP_INFRA_MAC_ADDR_KEY, mac_addr, mac_addr_len); + if (result != DNSSD_ERROR_NONE) { + result = __asp_service_infra_convert_error_type(result); + free(mac_addr); + return result; + } + free(mac_addr); + + /* Other TXT records */ + if (service->service_info_map != NULL) { + GHashTableIter iter; + gpointer key, value; + + g_hash_table_iter_init(&iter, service->service_info_map); + while (g_hash_table_iter_next(&iter, &key, &value)) { + unsigned short len = (unsigned short)strlen(value); + result = __add_txt_record(service_handle, key, value, len); + } + } + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_infra_cancel_advertise(asp_service_advertise_s *service) +{ + __ASP_LOG_FUNC_ENTER__; + gint32 result = 0; + dnssd_service_h service_handle; + + service_handle = (dnssd_service_h)GPOINTER_TO_UINT(g_hash_table_lookup(g_local_service_hash, + GUINT_TO_POINTER(service->adv_id))); + + if (!service_handle) { + /* TODO */ + ASP_LOGE("Failed to lookup advertisement id %u", service->adv_id); + return result; + } + + result = dnssd_deregister_local_service(service_handle); + if (result != DNSSD_ERROR_NONE) { + result = __asp_service_infra_convert_error_type(result); + ASP_LOGE("Failed to deregister local service %u", service_handle); + return result; + } + ASP_LOGD("Success to deregister local service: %u", service_handle); + + result = dnssd_destroy_local_service(service_handle); + if (result != DNSSD_ERROR_NONE) { + result = __asp_service_infra_convert_error_type(result); + return result; + } + ASP_LOGD("Success to destroy local service: %u", service_handle); + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_infra_seek(asp_service_seek_s *service) +{ + __ASP_LOG_FUNC_ENTER__; + gint32 result = 0; + dnssd_browser_h browser_handle; + gchar *if_name; + wifi_manager_h wifi_handle = NULL; + + result = wifi_manager_initialize(&wifi_handle); + if (result != WIFI_MANAGER_ERROR_NONE) { + ASP_LOGD("Failed to initialize wifi-manager"); + return ASP_ERROR_OPERATION_FAILED; + } + result = wifi_manager_get_network_interface_name(wifi_handle, &if_name); + if (result != WIFI_MANAGER_ERROR_NONE) { + ASP_LOGD("Failed to get interface name"); + return ASP_ERROR_OPERATION_FAILED; + } + ASP_LOGD("Success to get wifi interface name %s", if_name); + result = wifi_manager_deinitialize(wifi_handle); + if (result != WIFI_MANAGER_ERROR_NONE) { + ASP_LOGD("Failed to deinitialize wifi-manager"); + free(if_name); + return ASP_ERROR_OPERATION_FAILED; + } + + result = dnssd_start_browsing_service_on_interface(service->service_type, + if_name, &browser_handle, + _search_result_cb, + GUINT_TO_POINTER(service->search_id)); + + if (result != DNSSD_ERROR_NONE) { + result = __asp_service_infra_convert_error_type(result); + free(if_name); + return result; + } + ASP_LOGD("Success to start browsing service. service_type: %s, browser_handle: %u", + service->service_type, browser_handle); + + g_hash_table_insert(g_browser_hash, + GUINT_TO_POINTER(service->search_id), GUINT_TO_POINTER(browser_handle)); + + ASP_LOGD("Insert (%" G_GUINT64_FORMAT ", %u) to g_browser_hash (size: %d)", + service->search_id, browser_handle, + g_hash_table_size(g_browser_hash)); + + free(if_name); + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_infra_cancel_seek(asp_service_seek_s *service) +{ + __ASP_LOG_FUNC_ENTER__; + gint32 result = 0; + dnssd_browser_h browser_handle; + + browser_handle = (dnssd_browser_h)GPOINTER_TO_UINT(g_hash_table_lookup(g_browser_hash, + GUINT_TO_POINTER(service->search_id))); + + if (!browser_handle) { + /* TODO */ + ASP_LOGE("Failed to lookup search id %" G_GUINT64_FORMAT, service->search_id); + return result; + } + + result = dnssd_stop_browsing_service(browser_handle); + if (result != DNSSD_ERROR_NONE) { + result = __asp_service_infra_convert_error_type(result); + return result; + } + ASP_LOGD("Success to stop browsing. browser_handle: %u", browser_handle); + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_infra_connect_session(asp_tech_session_request_params_s *params) +{ + __ASP_LOG_FUNC_ENTER__; + gint32 result = 0; + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_infra_confirm_session(const guint8 *session_mac, gint32 session_id, gint32 confirm, guint32 pin) +{ + __ASP_LOG_FUNC_ENTER__; + gint32 result = 0; + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_infra_destroy_connection(const guint8 *peer_id, gint32 peer_id_length) +{ + __ASP_LOG_FUNC_ENTER__; + 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; +} + +asp_tech_ops_s asp_tech_infra_ops = { + .init = asp_tech_infra_init, + .deinit = asp_tech_infra_deinit, + .advertise = asp_tech_infra_advertise, + .cancel_advertise = asp_tech_infra_cancel_advertise, + .seek = asp_tech_infra_seek, + .cancel_seek = asp_tech_infra_cancel_seek, + .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/asp-tech-infra.h b/src/asp-tech-infra.h new file mode 100755 index 0000000..99492bf --- /dev/null +++ b/src/asp-tech-infra.h @@ -0,0 +1,26 @@ +/* + * 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_TECH_INFRA_H__ +#define __ASP_TECH_INFRA_H__ + +#define ASP_INFRA_ADV_KEY "wfa_asp_adv_id" +#define ASP_INFRA_MAC_ADDR_KEY "wfa_asp_mac_addr" +#define ASP_INFRA_DEV_NAME "wfa_asp_dev_name" + +#define ASP_INFRA_DNSSD_TXT_RECORD_TYPE 16 + +#endif /* __ASP_TECH_INFRA_H__ */ diff --git a/src/asp-tech-nan.c b/src/asp-tech-nan.c new file mode 100755 index 0000000..15893db --- /dev/null +++ b/src/asp-tech-nan.c @@ -0,0 +1,166 @@ +/* + * 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-util.h" +#include "asp-service.h" +#include "asp-session.h" +#include "asp-tech.h" +#include "asp-tech-nan.h" + +/***************************************************************************** + * Macros and Typedefs + *****************************************************************************/ + +/* TODO : define service data structure */ + +/***************************************************************************** + * Global Variables + *****************************************************************************/ + +/* TODO : define local memory for service data structure */ + +/***************************************************************************** + * Local Functions Definition + *****************************************************************************/ + +gint32 asp_tech_nan_init() +{ + __ASP_LOG_FUNC_ENTER__; + gint32 result = 0; + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_nan_deinit() +{ + __ASP_LOG_FUNC_ENTER__; + gint32 result = 0; + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_nan_advertise(asp_service_advertise_s *service, gint32 replace) +{ + __ASP_LOG_FUNC_ENTER__; + gint32 result = 0; + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_nan_cancel_advertise(asp_service_advertise_s *service) +{ + __ASP_LOG_FUNC_ENTER__; + gint32 result = 0; + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_nan_seek(asp_service_seek_s *service) +{ + __ASP_LOG_FUNC_ENTER__; + gint32 result = 0; + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_nan_cancel_seek(asp_service_seek_s *service) +{ + __ASP_LOG_FUNC_ENTER__; + gint32 result = 0; + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_nan_connect_session(asp_tech_session_request_params_s *params) +{ + __ASP_LOG_FUNC_ENTER__; + gint32 result = 0; + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_nan_confirm_session(const guint8 *session_mac, gint32 session_id, gint32 confirm, guint32 pin) +{ + __ASP_LOG_FUNC_ENTER__; + gint32 result = 0; + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_nan_destroy_connection(const guint8 *peer_id, gint32 peer_id_length) +{ + __ASP_LOG_FUNC_ENTER__; + 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; +} + +asp_tech_ops_s asp_tech_nan_ops = { + .init = asp_tech_nan_init, + .deinit = asp_tech_nan_deinit, + .advertise = asp_tech_nan_advertise, + .cancel_advertise = asp_tech_nan_cancel_advertise, + .seek = asp_tech_nan_seek, + .cancel_seek = asp_tech_nan_cancel_seek, + .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/asp-tech-nan.h b/src/asp-tech-nan.h new file mode 100755 index 0000000..ea06a36 --- /dev/null +++ b/src/asp-tech-nan.h @@ -0,0 +1,20 @@ +/* + * 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_TECH_NAN_H__ +#define __ASP_TECH_NAN_H__ + +#endif /* __ASP_TECH_NAN_H__ */ diff --git a/src/asp-tech-nfc.c b/src/asp-tech-nfc.c new file mode 100755 index 0000000..4940477 --- /dev/null +++ b/src/asp-tech-nfc.c @@ -0,0 +1,166 @@ +/* + * 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-util.h" +#include "asp-service.h" +#include "asp-session.h" +#include "asp-tech.h" +#include "asp-tech-nfc.h" + +/***************************************************************************** + * Macros and Typedefs + *****************************************************************************/ + +/* TODO : define service data structure */ + +/***************************************************************************** + * Global Variables + *****************************************************************************/ + +/* TODO : define local memory for service data structure */ + +/***************************************************************************** + * Local Functions Definition + *****************************************************************************/ + +gint32 asp_tech_nfc_advertise(asp_service_advertise_s *service, gint32 replace) +{ + __ASP_LOG_FUNC_ENTER__; + gint32 result = 0; + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_nfc_cancel_advertise(asp_service_advertise_s *service) +{ + __ASP_LOG_FUNC_ENTER__; + gint32 result = 0; + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_nfc_seek(asp_service_seek_s *service) +{ + __ASP_LOG_FUNC_ENTER__; + gint32 result = 0; + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_nfc_cancel_seek(asp_service_seek_s *service) +{ + __ASP_LOG_FUNC_ENTER__; + gint32 result = 0; + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_nfc_init() +{ + __ASP_LOG_FUNC_ENTER__; + gint32 result = 0; + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_nfc_deinit() +{ + __ASP_LOG_FUNC_ENTER__; + gint32 result = 0; + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_nfc_connect_session(asp_tech_session_request_params_s *params) +{ + __ASP_LOG_FUNC_ENTER__; + gint32 result = 0; + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_nfc_confirm_session(const guint8 *session_mac, gint32 session_id, gint32 confirm, guint32 pin) +{ + __ASP_LOG_FUNC_ENTER__; + gint32 result = 0; + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_nfc_destroy_connection(const guint8 *peer_id, gint32 peer_id_length) +{ + __ASP_LOG_FUNC_ENTER__; + 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; +} + +asp_tech_ops_s asp_tech_nfc_ops = { + .init = asp_tech_nfc_init, + .deinit = asp_tech_nfc_deinit, + .advertise = asp_tech_nfc_advertise, + .cancel_advertise = asp_tech_nfc_cancel_advertise, + .seek = asp_tech_nfc_seek, + .cancel_seek = asp_tech_nfc_cancel_seek, + .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/asp-tech-nfc.h b/src/asp-tech-nfc.h new file mode 100755 index 0000000..a4e2192 --- /dev/null +++ b/src/asp-tech-nfc.h @@ -0,0 +1,20 @@ +/* + * 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_TECH_NFC_H__ +#define __ASP_TECH_NFC_H__ + +#endif /* __ASP_TECH_NFC_H__ */ diff --git a/src/asp-tech-p2p.c b/src/asp-tech-p2p.c new file mode 100755 index 0000000..4a21c28 --- /dev/null +++ b/src/asp-tech-p2p.c @@ -0,0 +1,1142 @@ +/* + * 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 +#include + +/***************************************************************************** + * Application Service Platform Daemon headers + *****************************************************************************/ +#include "asp-manager.h" +#include "asp-manager-util.h" +#include "asp-service.h" +#include "asp-session.h" +#include "asp-tech.h" +#include "asp-tech-p2p.h" + +/***************************************************************************** + * Macros and Typedefs + *****************************************************************************/ + +#define ASP_TECH_P2P_ROLE_NEW 1 +#define ASP_TECH_P2P_ROLE_GC 2 +#define ASP_TECH_P2P_ROLE_GO 4 + +#define WFD_MANAGER_SERVICE "net.wifidirect" +#define WFD_MANAGER_PATH "/net/wifidirect" +#define WFD_MANAGER_MANAGE_INTERFACE WFD_MANAGER_SERVICE +#define WFD_MANAGER_CONFIG_INTERFACE WFD_MANAGER_SERVICE ".config" +#define WFD_MANAGER_GROUP_INTERFACE WFD_MANAGER_SERVICE ".group" +#define WFD_MANAGER_ASP_INTERFACE WFD_MANAGER_SERVICE ".asp" + +#define DBUS_REPLY_TIMEOUT_SYNC 10 * 1000 +#define DBUS_OBJECT_PATH_MAX 150 + +#define WFD_MANAGER_QUARK (g_quark_from_string("wifi-direct-manager")) + +#define asp_tech_p2p_dbus_method_call_sync(interface_name, method, params, error) \ + __asp_tech_p2p_dbus_method_call_sync_debug(interface_name, method, params, error, __func__) + +#define DBUS_DEBUG_VARIANT(parameters) \ + do {\ + gchar *parameters_debug_str = NULL;\ + if (parameters)\ + parameters_debug_str = g_variant_print(parameters, TRUE);\ + ASP_LOGD("signal params [%s]", parameters_debug_str ? parameters_debug_str : "NULL");\ + g_free(parameters_debug_str);\ + } while (0) + +asp_tech_ops_s asp_tech_p2p_ops; + +void asp_tech_p2p_process_activation(GDBusConnection *connection, + const gchar *object_path, GVariant *parameters); + +void asp_tech_p2p_process_deactivation(GDBusConnection *connection, + const gchar *object_path, GVariant *parameters); + +void asp_tech_p2p_process_search_result(GDBusConnection *connection, + const gchar *object_path, GVariant *parameters); + +void asp_tech_p2p_process_session_request(GDBusConnection *connection, + const gchar *object_path, GVariant *parameters); + +void asp_tech_p2p_process_session_config_request(GDBusConnection *connection, + const gchar *object_path, GVariant *parameters); + +void asp_tech_p2p_process_connect_status(GDBusConnection *connection, + const gchar *object_path, GVariant *parameters); + +void asp_tech_p2p_process_session_peer_ip(GDBusConnection *connection, + const gchar *object_path, GVariant *parameters); + +/***************************************************************************** + * Global Variables + *****************************************************************************/ + +static GDBusConnection *g_wfd_gdbus_conn; +static guint g_wfd_signal_id; + +static struct { + const gchar *interface; + const gchar *member; + void (*function) (GDBusConnection *connection, + const gchar *object_path, + GVariant *parameters); +} asp_tech_p2p_dbus_signal_map[] = { + { + WFD_MANAGER_MANAGE_INTERFACE, + "Activation", + asp_tech_p2p_process_activation + }, + { + WFD_MANAGER_MANAGE_INTERFACE, + "Deactivation", + asp_tech_p2p_process_deactivation + }, + { + WFD_MANAGER_ASP_INTERFACE, + "SearchResult", + asp_tech_p2p_process_search_result + }, + { + WFD_MANAGER_ASP_INTERFACE, + "SessionRequest", + asp_tech_p2p_process_session_request + }, + { + WFD_MANAGER_ASP_INTERFACE, + "SessionConfigRequest", + asp_tech_p2p_process_session_config_request + }, + { + WFD_MANAGER_ASP_INTERFACE, + "ConnectStatus", + asp_tech_p2p_process_connect_status + }, + { + WFD_MANAGER_ASP_INTERFACE, + "SessionPeerIPAssigned", + asp_tech_p2p_process_session_peer_ip + }, + { + NULL, + NULL, + NULL + } +}; + +/***************************************************************************** + * Local Functions Definition + *****************************************************************************/ + +static gint32 __net_wifidirect_gerror_to_enum(GError* error) +{ + gint32 res = 0; + if (error == NULL) { + ASP_LOGI("GError is NULL!!"); + return res; + } + + ASP_LOGE("wifi_direct_dbus_method_call_sync() failed. error [%d: %s]", + error->code, error->message); + + res = -1; + /* + if (NULL == strstr(error->message, "net.wifidirect.Error")) { + if (NULL != strstr(error->message, ".AccessDenied")) { + ASP_LOGE("Client doesn't have wifidirect privilege"); + res = -1; + } else { + ASP_LOGE("DBus failure"); + res = -1; + } + } else { + if (NULL != strstr(error->message, "InvalidParameter")) + res = -1; + else if (NULL != strstr(error->message, "NotPermitted")) + res = -1; + else if (NULL != strstr(error->message, "OperationFailed")) + res = -1; + else if (NULL != strstr(error->message, "TooManyClient")) + res = -1; + else + res = -1; + } + */ + return res; +} + + +static void __asp_tech_p2p_dbus_signal_cb(GDBusConnection *connection, + const gchar *sender, const gchar *object_path, + const gchar *interface, const gchar *signal, + GVariant *parameters, gpointer user_data) +{ + gint32 i = 0; + + ASP_LOGD("Signal Name [%s]", signal); + DBUS_DEBUG_VARIANT(parameters); + + for (i = 0; asp_tech_p2p_dbus_signal_map[i].member != NULL; i++) { + if (!g_strcmp0(signal, asp_tech_p2p_dbus_signal_map[i].member) && + !g_strcmp0(interface, asp_tech_p2p_dbus_signal_map[i].interface) && + asp_tech_p2p_dbus_signal_map[i].function != NULL) { + asp_tech_p2p_dbus_signal_map[i].function(connection, object_path, parameters); + break; + } + } +} + +static GVariant *__g_hash_table_to_g_variant(GHashTable *hash) +{ + GVariantBuilder builder; + + g_variant_builder_init(&builder, G_VARIANT_TYPE("a{sv}")); + + GHashTableIter iter; + gpointer key, value; + + g_hash_table_iter_init(&iter, hash); + while (g_hash_table_iter_next(&iter, &key, &value)) + g_variant_builder_add(&builder, "{sv}", key, g_variant_new_string(value)); + + return g_variant_builder_end(&builder); +} + +static GVariant *__g_hash_keys_to_g_variant(GHashTable *hash) +{ + GVariantBuilder builder; + + g_variant_builder_init(&builder, G_VARIANT_TYPE("as")); + + GHashTableIter iter; + gpointer key, value; + + g_hash_table_iter_init(&iter, hash); + while (g_hash_table_iter_next(&iter, &key, &value)) + g_variant_builder_add(&builder, "s", key); + + return g_variant_builder_end(&builder); +} + +GVariant *__asp_tech_p2p_dbus_method_call_sync_debug(const gchar* interface_name, + const gchar* method, + GVariant *params, + GError **error, + const gchar *calling_func) +{ + GVariant *reply = NULL; + + if (g_wfd_gdbus_conn == NULL) { + ASP_LOGE("GDBusconnection is NULL"); + return reply; + } + + ASP_LOGD("[%s][%s.%s]", calling_func, interface_name, method); + DBUS_DEBUG_VARIANT(params); + + reply = g_dbus_connection_call_sync(g_wfd_gdbus_conn, + WFD_MANAGER_SERVICE, /* bus name */ + WFD_MANAGER_PATH, /* object path */ + interface_name, /* interface name */ + method, /* method name */ + params, /* GVariant *params */ + NULL, /* reply_type */ + G_DBUS_CALL_FLAGS_NONE, /* flags */ + DBUS_REPLY_TIMEOUT_SYNC, /* timeout */ + NULL, /* cancellable */ + error); /* error */ + DBUS_DEBUG_VARIANT(reply); + return reply; +} + +void asp_tech_p2p_process_activation(GDBusConnection *connection, + const gchar *object_path, GVariant *parameters) +{ + __ASP_LOG_FUNC_ENTER__; + + ASP_LOGE("Wi-Fi Direct activated"); + + __ASP_LOG_FUNC_EXIT__; + return; +} + +void asp_tech_p2p_process_deactivation(GDBusConnection *connection, + const gchar *object_path, GVariant *parameters) +{ + __ASP_LOG_FUNC_ENTER__; + + ASP_LOGE("Wi-Fi Direct deactivated"); + + __ASP_LOG_FUNC_EXIT__; + return; +} + +static void __service_info_to_g_hash(const gchar *service_info, + GHashTable *service_info_map) +{ + const gchar *key = NULL; + const gchar *value = NULL; + gsize pos = 0; + gsize key_length = 0; + gsize value_length = 0; + gsize info_length = 0; + + info_length = strlen(service_info); + + while (service_info[pos] != '\0' && pos < info_length) { + key = &service_info[pos]; + while (service_info[pos] != '=' && pos < info_length) { + key_length++; + pos++; + } + + if (pos >= info_length - 1) { + g_hash_table_replace(service_info_map, g_strndup(key, key_length), + g_strdup("")); + break; + } + + pos++; + value = &service_info[pos]; + while (service_info[pos] != ',' && pos < info_length) { + value_length++; + pos++; + } + + g_hash_table_replace(service_info_map, g_strndup(key, key_length), + g_strndup(value, value_length)); + ASP_LOGD("Insert (%s, %s) to hash.", key, value); + + if (service_info[pos] == ',' && pos == info_length) + break; + } + return; +} + +void asp_tech_p2p_process_search_result(GDBusConnection *connection, + const gchar *object_path, GVariant *parameters) +{ + __ASP_LOG_FUNC_ENTER__; + + GVariantIter *iter = NULL; + GVariant *var = NULL; + GHashTable *service_info_map = NULL; + asp_event_data event; + const gchar *service_mac = NULL; + const gchar *key = NULL; + const gchar *str = NULL; + long long unsigned search_id = 0; + gchar *device_name = NULL; + guint32 advertisement_id = 0; + guint32 config_method = 0; + gchar *instance_name = NULL; + guint8 status = 0; + + if (!parameters) { + __ASP_LOG_FUNC_EXIT__; + return; + } + + g_variant_get(parameters, "(a{sv})", &iter); + while (g_variant_iter_loop(iter, "{sv}", &key, &var)) { + if (!g_strcmp0(key, "search_id")) { + g_variant_get(var, "t", &search_id); + } else if (!g_strcmp0(key, "service_mac")) { + g_variant_get(var, "&s", &service_mac); + } else if (!g_strcmp0(key, "device_name")) { + g_variant_get(var, "&s", &str); + device_name = g_strndup(str, ASP_SERVICE_DEVICE_NAME_LEN); + } else if (!g_strcmp0(key, "advertisement_id")) { + g_variant_get(var, "u", &advertisement_id); + } else if (!g_strcmp0(key, "config_method")) { + g_variant_get(var, "u", &config_method); + } else if (!g_strcmp0(key, "instance_name")) { + g_variant_get(var, "&s", &str); + instance_name = g_strdup(str); + } else if (!g_strcmp0(key, "status")) { + g_variant_get(var, "y", &status); + } else if (!g_strcmp0(key, "service_info")) { + g_variant_get(var, "&s", &str); + service_info_map = g_hash_table_new_full(g_str_hash, + g_str_equal, g_free, g_free); + __service_info_to_g_hash(str, service_info_map); + } else { + ;/* Do Nothing */ + } + } + + memset(&event, 0x0, sizeof(asp_event_data)); + event.search_result.tech = ASP_TECH_P2P; + event.search_result.search_id = search_id; + event.search_result.advertisement_id = advertisement_id; + event.search_result.service_status = status; + if (service_mac) + 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 = service_info_map; + asp_manager_event(NULL, ASP_EVENT_SEARCH_RESULT, &event); + + g_free(device_name); + g_free(instance_name); + g_hash_table_unref(service_info_map); + g_variant_iter_free(iter); + + __ASP_LOG_FUNC_EXIT__; + return; +} + +void asp_tech_p2p_process_session_request(GDBusConnection *connection, + const gchar *object_path, GVariant *parameters) +{ + __ASP_LOG_FUNC_ENTER__; + + GVariantIter *iter = NULL; + GVariant *var = NULL; + 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; + guint32 pin = 0; + + if (!parameters) { + __ASP_LOG_FUNC_EXIT__; + return; + } + + 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", &adv_id); + } else if (!g_strcmp0(key, "session_mac")) { + if (asp_dbus_unpack_ay(session_mac, var, MAC_LEN) < 0) { + g_free(device_name); + g_free(session_info); + g_variant_iter_free(iter); + return; + } + } else if (!g_strcmp0(key, "session_id")) { + g_variant_get(var, "u", &session_id); + } 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", &str); + pin = (guint32)atoi(str); + } else if (!g_strcmp0(key, "session_info")) { + str = NULL; + g_variant_get(var, "&s", &str); + if (!str) + continue; + info_length = strlen(str); + g_free(session_info); + session_info = g_try_malloc0(info_length + 1); + if (session_info) + memcpy(session_info, str, info_length); + } else { + ;/* Do Nothing */ + } + } + + 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_variant_iter_free(iter); + g_free(device_name); + g_free(session_info); + + __ASP_LOG_FUNC_EXIT__; + return; +} + +void asp_tech_p2p_process_session_config_request(GDBusConnection *connection, + const gchar *object_path, GVariant *parameters) +{ + __ASP_LOG_FUNC_ENTER__; + + GVariantIter *iter = NULL; + GVariant *var = NULL; + const gchar *key = NULL; + const gchar *str = NULL; + const guint8 session_mac[MAC_LEN] = {0,}; + guint32 session_id = 0; + gboolean get_pin = FALSE; + guint32 pin = 0; + + if (!parameters) { + __ASP_LOG_FUNC_EXIT__; + return; + } + + g_variant_get(parameters, "(a{sv})", &iter); + while (g_variant_iter_loop(iter, "{sv}", &key, &var)) { + if (!g_strcmp0(key, "session_id")) { + g_variant_get(var, "u", &session_id); + } 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", &str); + pin = (guint32)atoi(str); + } else { + ;/* Do Nothing */ + } + } + + 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); + } + g_variant_iter_free(iter); + + __ASP_LOG_FUNC_EXIT__; + return; +} + +void asp_tech_p2p_process_connect_status(GDBusConnection *connection, + const gchar *object_path, GVariant *parameters) +{ + __ASP_LOG_FUNC_ENTER__; + + GVariantIter *iter = NULL; + GVariant *var = 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__; + return; + } + + g_variant_get(parameters, "(a{sv})", &iter); + while (g_variant_iter_loop(iter, "{sv}", &key, &var)) { + if (!g_strcmp0(key, "session_mac")) { + if (asp_dbus_unpack_ay(session_mac, var, MAC_LEN) < 0) { + g_variant_iter_free(iter); + g_free(deferred); + return; + } + } else if (!g_strcmp0(key, "session_id")) { + g_variant_get(var, "u", &session_id); + } else if (!g_strcmp0(key, "status")) { + g_variant_get(var, "i", &status); + } else if (!g_strcmp0(key, "deferred")) { + g_variant_get(var, "&s", &str); + g_free(deferred); + deferred = g_strdup(str); + } else { + ;/* Do Nothing */ + } + } + + 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_variant_iter_free(iter); + g_free(deferred); + + __ASP_LOG_FUNC_EXIT__; + return; +} + +void asp_tech_p2p_process_session_peer_ip(GDBusConnection *connection, + const gchar *object_path, GVariant *parameters) +{ + __ASP_LOG_FUNC_ENTER__; + + GVariantIter *iter = NULL; + GVariant *var = NULL; + const gchar *key = NULL; + guint8 session_mac[MAC_LEN] = {0,}; + guint8 service_mac[MAC_LEN] = {0,}; + guint32 session_id = 0; + gchar *peer_ip = NULL; + + if (!parameters) { + __ASP_LOG_FUNC_EXIT__; + return; + } + + g_variant_get(parameters, "(a{sv})", &iter); + while (g_variant_iter_loop(iter, "{sv}", &key, &var)) { + if (!g_strcmp0(key, "session_mac")) { + if (asp_dbus_unpack_ay(session_mac, var, MAC_LEN) < 0) { + g_variant_iter_free(iter); + return; + } + } else if (!g_strcmp0(key, "session_id")) { + g_variant_get(var, "u", &session_id); + } else if (!g_strcmp0(key, "service_mac")) { + if (asp_dbus_unpack_ay(service_mac, var, MAC_LEN) < 0) { + g_variant_iter_free(iter); + return; + } + + } else if (!g_strcmp0(key, "assigned_ip_address")) { + g_variant_get(var, "&s", &peer_ip); + } else { + ;/* Do Nothing */ + } + } + + if (peer_ip == NULL) { + ASP_LOGE("Invalid peer IP address"); + g_variant_iter_free(iter); + return; + } + + if (asp_tech_p2p_ops.ip_assigned_cb) { + asp_tech_p2p_ops.ip_assigned_cb(0, + session_mac, session_id, service_mac, peer_ip, + strlen(peer_ip), asp_tech_p2p_ops.ip_assigned_cb_user_data); + } + + g_variant_iter_free(iter); + + __ASP_LOG_FUNC_EXIT__; + return; +} + +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; + gint32 result = 0; + + if (!service || !g_wfd_gdbus_conn) { + ASP_LOGE("Invalid parameter!"); + __ASP_LOG_FUNC_EXIT__; + return -1; + } + + builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); + g_variant_builder_add(builder, "{sv}", "adv_id", g_variant_new("u", service->adv_id)); + g_variant_builder_add(builder, "{sv}", "discovery_tech", g_variant_new("i", service->discovery_tech)); + g_variant_builder_add(builder, "{sv}", "preferred_connection", g_variant_new("y", service->preferred_connection)); + g_variant_builder_add(builder, "{sv}", "auto_accept", g_variant_new("i", service->auto_accept)); + g_variant_builder_add(builder, "{sv}", "status", g_variant_new("y", service->status)); + g_variant_builder_add(builder, "{sv}", "role", g_variant_new("y", service->role)); + g_variant_builder_add(builder, "{sv}", "replace", g_variant_new("i", replace)); + g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new("u", service->config_method)); + + if (service->instance_name) + g_variant_builder_add(builder, "{sv}", "instance_name", g_variant_new("s", service->instance_name)); + if (service->service_type) + g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new("s", service->service_type)); + if (service->service_info_map != NULL) + g_variant_builder_add(builder, "{sv}", "service_info", + __g_hash_table_to_g_variant(service->service_info_map)); + if (service->rsp_info) + g_variant_builder_add(builder, "{sv}", "rsp_info", g_variant_new("s", service->rsp_info)); + params = g_variant_new("(a{sv})", builder); + g_variant_builder_unref(builder); + + reply = asp_tech_p2p_dbus_method_call_sync(WFD_MANAGER_ASP_INTERFACE, + "AdvertiseService", params, &error); + if (error != NULL) { + result = __net_wifidirect_gerror_to_enum(error); + g_error_free(error); + __ASP_LOG_FUNC_EXIT__; + return result; + } + + g_variant_get(reply, "(i)", &result); + g_variant_unref(reply); + + ASP_LOGD("%s() return : [%d]", __func__, result); + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_p2p_cancel_advertise(asp_service_advertise_s *service) +{ + __ASP_LOG_FUNC_ENTER__; + GVariant *params = NULL; + GError *error = NULL; + GVariant *reply = NULL; + gint32 result = 0; + + if (!service || !g_wfd_gdbus_conn) { + ASP_LOGE("Invalid parameter!"); + __ASP_LOG_FUNC_EXIT__; + return -1; + } + + params = g_variant_new("(u)", service->adv_id); + reply = asp_tech_p2p_dbus_method_call_sync(WFD_MANAGER_ASP_INTERFACE, + "CancelAdvertiseService", params, &error); + if (error != NULL) { + result = __net_wifidirect_gerror_to_enum(error); + g_error_free(error); + __ASP_LOG_FUNC_EXIT__; + return result; + } + + g_variant_get(reply, "(i)", &result); + g_variant_unref(reply); + + ASP_LOGD("%s() return : [%d]", __func__, result); + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +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; + gint32 result = 0; + + if (!service || !g_wfd_gdbus_conn) { + ASP_LOGE("Invalid parameter!"); + __ASP_LOG_FUNC_EXIT__; + return -1; + } + + + builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); + g_variant_builder_add(builder, "{sv}", "discovery_tech", g_variant_new("i", service->discovery_tech)); + g_variant_builder_add(builder, "{sv}", "preferred_connection", g_variant_new("y", service->preferred_connection)); + g_variant_builder_add(builder, "{sv}", "search_id", g_variant_new("t", service->search_id)); + g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new("s", service->service_type)); + if (service->service_info_map != NULL) + g_variant_builder_add(builder, "{sv}", "service_info", __g_hash_keys_to_g_variant(service->service_info_map)); + params = g_variant_new("(a{sv})", builder); + g_variant_builder_unref(builder); + ASP_LOGI("instance name (%s)", service->instance_name); + + reply = asp_tech_p2p_dbus_method_call_sync(WFD_MANAGER_ASP_INTERFACE, + "SeekService", params, &error); + if (error != NULL) { + result = __net_wifidirect_gerror_to_enum(error); + g_error_free(error); + __ASP_LOG_FUNC_EXIT__; + return result; + } + + g_variant_get(reply, "(i)", &result); + g_variant_unref(reply); + + ASP_LOGD("%s() return : [%d]", __func__, result); + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_p2p_cancel_seek(asp_service_seek_s *service) +{ + __ASP_LOG_FUNC_ENTER__; + GVariant *params = NULL; + GError *error = NULL; + GVariant *reply = NULL; + gint32 result = 0; + + if (!service || !g_wfd_gdbus_conn) { + ASP_LOGE("Invalid parameter!"); + __ASP_LOG_FUNC_EXIT__; + return -1; + } + + params = g_variant_new("(t)", service->search_id); + reply = asp_tech_p2p_dbus_method_call_sync(WFD_MANAGER_ASP_INTERFACE, + "CancelSeekService", params, &error); + if (error != NULL) { + result = __net_wifidirect_gerror_to_enum(error); + g_error_free(error); + __ASP_LOG_FUNC_EXIT__; + return result; + } + + g_variant_get(reply, "(i)", &result); + g_variant_unref(reply); + + ASP_LOGD("%s() return : [%d]", __func__, result); + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +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 gchar *str = NULL; + gint32 result = 0; + + asp = asp_get_manager(); + if (asp == NULL) { + ASP_LOGE("Failed to get asp"); + __ASP_LOG_FUNC_EXIT__; + return -1; + } + + g_wfd_gdbus_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error); + if (g_wfd_gdbus_conn == NULL) { + ASP_LOGE("Failed to get connection, Error[%s]", error->message); + g_error_free(error); + __ASP_LOG_FUNC_EXIT__; + return -1; + } + + /* subscribe signal handler */ + g_wfd_signal_id = g_dbus_connection_signal_subscribe(g_wfd_gdbus_conn, + WFD_MANAGER_SERVICE, /* bus name */ + NULL, /* interface */ + NULL, /* member */ + WFD_MANAGER_PATH, /* object_path */ + NULL, /* arg0 */ + G_DBUS_SIGNAL_FLAGS_NONE, + __asp_tech_p2p_dbus_signal_cb, + NULL, + NULL); + ASP_LOGI("Subscribed dbus signals [%d]", g_wfd_signal_id); + + /* Get local P2P device address*/ + reply = asp_tech_p2p_dbus_method_call_sync(WFD_MANAGER_CONFIG_INTERFACE, + "GetMacAddress", NULL, &error); + if (error != NULL) { + result = __net_wifidirect_gerror_to_enum(error); + g_error_free(error); + __ASP_LOG_FUNC_EXIT__; + 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); + + /* Get local P2P Device Name*/ + reply = asp_tech_p2p_dbus_method_call_sync(WFD_MANAGER_CONFIG_INTERFACE, + "GetDeviceName", NULL, &error); + if (error != NULL) { + result = __net_wifidirect_gerror_to_enum(error); + g_error_free(error); + __ASP_LOG_FUNC_EXIT__; + return result; + } + g_variant_get(reply, "(i&s)", &result, &str); + g_strlcpy(asp->p2p_device_name, str, DEVICE_NAME_LEN + 1); + + g_variant_unref(reply); + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_p2p_deinit() +{ + __ASP_LOG_FUNC_ENTER__; + gint32 result = 0; + + if (g_wfd_gdbus_conn == NULL) + return -1; + + /* unsubscribe signal handler */ + g_dbus_connection_signal_unsubscribe(g_wfd_gdbus_conn, g_wfd_signal_id); + g_wfd_signal_id = 0; + + /* unref gdbus connection */ + g_object_unref(g_wfd_gdbus_conn); + g_wfd_gdbus_conn = NULL; + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_p2p_get_peer_role(const guint8 *mac_addr, gint32 *is_connected, gint32 *role) +{ + __ASP_LOG_FUNC_ENTER__; + GVariant *params = NULL; + GVariant *reply = NULL; + GError* error = NULL; + + GVariantIter *iter_peer = NULL; + GVariant *var = NULL; + gchar *key = NULL; + gchar mac_address[18] = {0,}; + gboolean is_group_client = FALSE; + gboolean is_group_owner = FALSE; + gboolean is_in_group = FALSE; + gint32 result = 0; + + /* Get P2P peer info*/ + 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); + if (error != NULL) { + result = __net_wifidirect_gerror_to_enum(error); + g_error_free(error); + __ASP_LOG_FUNC_EXIT__; + return result; + } + + g_variant_get(reply, "(ia{sv})", &result, &iter_peer); + if (result != 0) { + __ASP_LOG_FUNC_EXIT__; + return -1; + } + + while (g_variant_iter_loop(iter_peer, "{sv}", &key, &var)) { + if (!g_strcmp0(key, "IsConnected")) + is_group_client = g_variant_get_boolean(var); + + else if (!g_strcmp0(key, "IsGroupOwner")) + is_group_owner = g_variant_get_boolean(var); + + else if (!g_strcmp0(key, "IsInGroup")) + is_in_group = g_variant_get_boolean(var); + + else + ;/* Do Nothing */ + } + + g_variant_iter_free(iter_peer); + g_variant_unref(reply); + if (is_group_owner) + *role = ASP_TECH_P2P_ROLE_GO; + if (is_group_client) + *role = ASP_TECH_P2P_ROLE_GC; + + if (is_in_group) + *is_connected = is_in_group; + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +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; + 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 + 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 + 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)); + g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new("u", params->network_config)); + if (params->session_information) + g_variant_builder_add(builder, "{sv}", "session _info", g_variant_new("s", params->session_information)); + + variant_params = g_variant_new("(a{sv})", builder); + g_variant_builder_unref(builder); + + /* Connect ASP session via P2P group */ + reply = asp_tech_p2p_dbus_method_call_sync(WFD_MANAGER_ASP_INTERFACE, + "ConnectSession", variant_params, &error); + if (error != NULL) { + result = __net_wifidirect_gerror_to_enum(error); + g_error_free(error); + __ASP_LOG_FUNC_EXIT__; + return result; + } + + g_variant_get(reply, "(i)", &result); + g_variant_unref(reply); + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_p2p_connect_session(asp_tech_session_request_params_s *params) +{ + __ASP_LOG_FUNC_ENTER__; + gint32 is_connected = 0; + gint32 role = ASP_TECH_P2P_ROLE_NEW; + gint32 result = 0; + + result = asp_tech_p2p_get_peer_role(params->service_mac, &is_connected, &role); + if (result < 0) { + ASP_LOGE("get peer role failed"); + __ASP_LOG_FUNC_EXIT__; + return ASP_ERROR_OPERATION_FAILED; + } + + if (params->network_role != ASP_TECH_P2P_ROLE_NEW && + params->network_role == role) { + ASP_LOGE("Device can't be requested role"); + __ASP_LOG_FUNC_EXIT__; + return ASP_ERROR_NETWORK_ROLE_REJECTED; + } + result = __asp_tech_p2p_send_prov(params); + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +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; + guint8 *service_mac = NULL; + guint32 adv_id = 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 + 1, MACSTR, MAC2STR(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", session_id)); + g_variant_builder_add(builder, "{sv}", "confirm", g_variant_new("i", confirm)); + 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)); + } + if (asp_session_get_advertisement_mac(session_mac, session_id, &service_mac)) { + g_snprintf(mac_str, MACSTR_LEN + 1, MACSTR, MAC2STR(service_mac)); + g_variant_builder_add(builder, "{sv}", "service_mac", g_variant_new("s", mac_str)); + } + if (asp_session_get_advertisement_id(session_mac, session_id, &adv_id)) + g_variant_builder_add(builder, "{sv}", "adv_id", g_variant_new("u", adv_id)); + + params = g_variant_new("(a{sv})", builder); + g_variant_builder_unref(builder); + + /* Confirm session requested via P2P */ + reply = asp_tech_p2p_dbus_method_call_sync(WFD_MANAGER_ASP_INTERFACE, + "ConfirmSession", params, &error); + if (error != NULL) { + result = __net_wifidirect_gerror_to_enum(error); + g_error_free(error); + __ASP_LOG_FUNC_EXIT__; + return result; + } + + g_variant_get(reply, "(i)", &result); + g_variant_unref(reply); + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_p2p_destroy_connection(const guint8 *peer_id, gint32 peer_id_length) +{ + __ASP_LOG_FUNC_ENTER__; + GVariant *reply = NULL; + GError* error = NULL; + 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); + if (error != NULL) { + result = __net_wifidirect_gerror_to_enum(error); + g_error_free(error); + __ASP_LOG_FUNC_EXIT__; + return result; + } + + g_variant_get(reply, "(i)", &result); + g_variant_unref(reply); + + __ASP_LOG_FUNC_EXIT__; + 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, + .advertise = asp_tech_p2p_advertise, + .cancel_advertise = asp_tech_p2p_cancel_advertise, + .seek = asp_tech_p2p_seek, + .cancel_seek = asp_tech_p2p_cancel_seek, + .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/asp-tech-p2p.h b/src/asp-tech-p2p.h new file mode 100755 index 0000000..c6182c6 --- /dev/null +++ b/src/asp-tech-p2p.h @@ -0,0 +1,20 @@ +/* + * 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_TECH_P2P_H__ +#define __ASP_TECH_P2P_H__ + +#endif /* __ASP_TECH_P2P_H__ */ diff --git a/src/asp-tech.c b/src/asp-tech.c new file mode 100755 index 0000000..0cbea7a --- /dev/null +++ b/src/asp-tech.c @@ -0,0 +1,356 @@ +/* + * 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-util.h" +#include "asp-service.h" +#include "asp-session.h" +#include "asp-tech.h" + +/***************************************************************************** + * Macros and Typedefs + *****************************************************************************/ + +/* TODO : define service data structure */ + +/***************************************************************************** + * Global Variables + *****************************************************************************/ + +/* TODO : define local memory for service data structure */ + +extern asp_tech_ops_s asp_tech_p2p_ops; +extern asp_tech_ops_s asp_tech_ble_ops; +extern asp_tech_ops_s asp_tech_nfc_ops; +extern asp_tech_ops_s asp_tech_infra_ops; +extern asp_tech_ops_s asp_tech_nan_ops; + +asp_tech_ops_s *asp_techs[] = { + NULL, + &asp_tech_p2p_ops, + &asp_tech_ble_ops, + &asp_tech_nfc_ops, + &asp_tech_infra_ops, + &asp_tech_nan_ops, + NULL +}; + +/***************************************************************************** + * Local Functions Definition + *****************************************************************************/ + +void asp_tech_init() +{ + __ASP_LOG_FUNC_ENTER__; + gint32 result = 0; + + result = asp_techs[ASP_TECH_P2P]->init(); + if (result < 0) { + ASP_LOGE("Failed to initialize p2p"); + /* TODO : exclude p2p technology */ + } + + result = asp_techs[ASP_TECH_INFRA]->init(); + if (result < 0) { + ASP_LOGE("Failed to initialize infra"); + /* TODO : exclude infra technology */ + } + + __ASP_LOG_FUNC_EXIT__; + return; +} + +void asp_tech_deinit() +{ + __ASP_LOG_FUNC_ENTER__; + gint32 result = 0; + + result = asp_techs[ASP_TECH_P2P]->deinit(); + if (result < 0) { + ASP_LOGE("Failed to deinitialize p2p"); + /* TODO : exclude p2p technology */ + } + + result = asp_techs[ASP_TECH_INFRA]->deinit(); + if (result < 0) { + ASP_LOGE("Failed to deinitialize infra"); + /* TODO : exclude infra technology */ + } + + __ASP_LOG_FUNC_EXIT__; + return; +} + +gint32 asp_tech_advertise(gint32 tech, asp_service_advertise_s *service, gint32 replace) +{ + __ASP_LOG_FUNC_ENTER__; + 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); + if (tech & tech_idx) { + ASP_LOGD("Advertise using tech %d", tech); + result = asp_techs[i]->advertise(service, replace); + } + /* TODO */ + /* error handling */ + } + + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_cancel_advertise(gint32 tech, asp_service_advertise_s *service) +{ + __ASP_LOG_FUNC_ENTER__; + 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); + if (tech & tech_idx) { + ASP_LOGD("Cancel advertise using tech %d", tech_idx); + result = asp_techs[i]->cancel_advertise(service); + } + /* TODO */ + /* error handling */ + } + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_seek(gint32 tech, asp_service_seek_s *service) +{ + __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("Seek service using tech %d", tech_idx); + result = asp_techs[i]->seek(service); + } + /* TODO */ + /* error handling */ + } + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_cancel_seek(gint32 tech, asp_service_seek_s *service) +{ + __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("Cancel seek service using tech %d", tech_idx); + result = asp_techs[i]->cancel_seek(service); + } + /* TODO */ + /* error handling */ + } + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_connect_session(gint32 tech, asp_tech_session_request_params_s *params) +{ + __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("Connect session using tech %d", tech_idx); + result = asp_techs[i]->connect_session(params); + /* TODO */ + /* error handling */ + break; + } + } + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_confirm_session(gint32 tech, const guint8 *session_mac, gint32 session_id, gint32 confirm, guint32 pin) +{ + __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("Confirm session using tech %d", tech_idx); + result = asp_techs[i]->confirm_session(session_mac, session_id, confirm, pin); + /* TODO */ + /* error handling */ + break; + } + } + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_destroy_connection(gint32 tech, const guint8 *peer_id, gint32 peer_id_length) +{ + __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("Destroy connection using tech %d", tech_idx); + result = asp_techs[i]->destroy_connection(peer_id, peer_id_length); + } + /* TODO */ + /* error handling */ + } + __ASP_LOG_FUNC_EXIT__; + return result; +} + +gint32 asp_tech_is_peer_connected(gint32 tech, const guint8 *peer_id, gint32 peer_id_length, gint32 *is_connected) +{ + __ASP_LOG_FUNC_ENTER__; + gint32 tech_idx = 0; + gint32 i = 0; + gint32 result = 0; + + for (i = 1; i != ASP_TECH_MAX; i++) { + tech_idx = 1 << (i - 1); + if (tech & tech_idx) { + ASP_LOGD("Is peer connected using tech %d", tech_idx); + result = asp_techs[i]->is_peer_connected(peer_id, peer_id_length, is_connected); + } + /* TODO */ + /* error handling */ + } + __ASP_LOG_FUNC_EXIT__; + return result; +} + +void asp_tech_set_session_request_cb(gint32 tech, asp_tech_session_request_cb cb, gpointer user_data) +{ + __ASP_LOG_FUNC_ENTER__; + gint32 tech_idx = 0; + gint32 i = 0; + + for (i = 1; i != ASP_TECH_MAX; i++) { + tech_idx = 1 << (i - 1); + if (tech & tech_idx) { + ASP_LOGD("Set session_request_cb using tech %d", tech_idx); + asp_techs[i]->session_request_cb = cb; + asp_techs[i]->session_request_cb_user_data = user_data; + } + /* TODO */ + /* error handling */ + } + __ASP_LOG_FUNC_EXIT__; + return; +} + +void asp_tech_set_session_config_request_cb(gint32 tech, asp_tech_session_config_request_cb cb, gpointer user_data) +{ + __ASP_LOG_FUNC_ENTER__; + gint32 tech_idx = 0; + gint32 i = 0; + + for (i = 1; i != ASP_TECH_MAX; i++) { + tech_idx = 1 << (i - 1); + if (tech & tech_idx) { + ASP_LOGD("Set session_config_request_cb using tech %d", tech_idx); + asp_techs[i]->session_config_request_cb = cb; + asp_techs[i]->session_config_request_cb_user_data = user_data; + } + /* TODO */ + /* error handling */ + } + __ASP_LOG_FUNC_EXIT__; + return; +} + +void asp_tech_set_connect_status_cb(gint32 tech, asp_tech_connect_status_cb cb, gpointer user_data) +{ + __ASP_LOG_FUNC_ENTER__; + gint32 tech_idx = 0; + gint32 i = 0; + + for (i = 1; i != ASP_TECH_MAX; i++) { + tech_idx = 1 << (i - 1); + if (tech & tech_idx) { + ASP_LOGD("Set connect_status_cb using tech %d", tech_idx); + asp_techs[i]->connect_status_cb = cb; + asp_techs[i]->connect_status_cb_user_data = user_data; + } + /* TODO */ + /* error handling */ + } + __ASP_LOG_FUNC_EXIT__; + return; +} + +void asp_tech_set_ip_assigned_cb(gint32 tech, asp_tech_ip_assigned_cb cb, gpointer user_data) +{ + __ASP_LOG_FUNC_ENTER__; + gint32 tech_idx = 0; + gint32 i = 0; + + for (i = 1; i != ASP_TECH_MAX; i++) { + tech_idx = 1 << (i - 1); + if (tech & tech_idx) { + ASP_LOGD("Set ip_assigned_cb using tech %d", tech_idx); + asp_techs[i]->ip_assigned_cb = cb; + asp_techs[i]->ip_assigned_cb_user_data = user_data; + } + /* TODO */ + /* error handling */ + } + __ASP_LOG_FUNC_EXIT__; + return; +} diff --git a/src/gfsm.c b/src/gfsm.c new file mode 100644 index 0000000..04578af --- /dev/null +++ b/src/gfsm.c @@ -0,0 +1,596 @@ +/*finite state machine + * + * Copyright (c) 2011 - 2013 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Hojeen Jee , Jaejun Sim , + * Jinho Ha + * + * 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. + * + */ + +#include +#include +#include +#include +#include +#include "gfsm.h" +#include "asp-manager-util.h" + + +typedef struct gfsm_event_queue { + gfsm_event_s *p_head; + gfsm_event_s *p_tail; +} gfsm_event_queue_s; + +struct gfsm_event { + struct gfsm_event *p_next; + gfsm_event_id_t event_id; + void *p_event_data; + gfsm_event_data_destructor_cb destructor; +}; + +struct gfsm_state { + gfsm_state_id_t state_id; + gfsm_s *p_fsm; + gfsm_state_s *p_parent_state; + gfsm_state_s *p_internal_init_state; + gfsm_entry_action_cb entry_action_cb; + gfsm_exit_action_cb exit_action_cb; + gfsm_reaction_cb *reaction_table; +}; + +struct gfsm { + gfsm_state_s **pp_state_table; + gfsm_state_id_t max_state; + gfsm_event_id_t max_event; + gfsm_state_id_t init_state_id; + gfsm_log_func log_func; + gfsm_get_state_name_cb state_name_cb; + gfsm_get_event_name_cb event_name_cb; + char *p_header; +}; + +struct gfsm_context { + gfsm_s *p_fsm; + gfsm_state_id_t current_state_id; + gfsm_event_queue_s event_queue; + gfsm_event_queue_s defer_event_queue; + unsigned char processing_event; /*true or false; */ + unsigned char terminating; /*true or false; */ + gfsm_context_termination_notifier_cb termination_notifier_cb; + void *p_context_data; +}; + +static void _gfsm_process_event(gfsm_context_s *p_context, + gfsm_event_s *p_event); +static void gfsm_process_transition(gfsm_context_s *p_context, + gfsm_state_id_t next_state_id); +static void gfsm_do_exit_action(gfsm_state_s *p_current_state, + gfsm_state_s *p_common_ancesstor, gfsm_context_s *p_context); +static void gfsm_do_entry_action(gfsm_state_s *p_common_ancesstor, + gfsm_state_s *p_next_state, gfsm_context_s *p_context); +static void gfsm_reenqueue_deferred_event(gfsm_context_s *p_context); +static void gfsm_init_event_queue(gfsm_event_queue_s *p_queue); +static void gfsm_destroy_event_queue(gfsm_event_queue_s *p_queue); +static void gfsm_enqueue_event(gfsm_event_queue_s *p_queue, + gfsm_event_s *p_event); +static gfsm_event_s *gfsm_dequeue_event(gfsm_event_queue_s *p_queue); +static gfsm_state_s *gfsm_find_last_child_state(gfsm_state_s *p_state); +static gfsm_state_s *gfsm_find_common_ancesstor_state(gfsm_state_s *p_state_1, + gfsm_state_s *p_state_2); + +gfsm_s *gfsm_create_fsm(gfsm_state_id_t max_state, gfsm_event_id_t max_event, + gfsm_state_id_t init_state) +{ + gfsm_s *p_fsm = (gfsm_s *)malloc(sizeof(gfsm_s)); + + assert(p_fsm); + assert(init_state < max_state); + + size_t state_table_size = sizeof(gfsm_state_s *) * max_state; + + p_fsm->pp_state_table = (gfsm_state_s **) 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; + + p_fsm->log_func = NULL; + p_fsm->state_name_cb = NULL; + p_fsm->event_name_cb = NULL; + p_fsm->p_header = NULL; + + return p_fsm; +} + +void gfsm_destroy_fsm(gfsm_s *p_fsm) +{ + assert(p_fsm); + assert(p_fsm->pp_state_table); + + free(p_fsm->pp_state_table); + if (p_fsm->p_header) + free(p_fsm->p_header); + free(p_fsm); +} + +gfsm_state_s *gfsm_create_state(gfsm_state_id_t state_id, gfsm_s *p_fsm, + gfsm_entry_action_cb entry_action, gfsm_exit_action_cb exit_action) +{ + size_t event_table_size; + gfsm_state_s *p_state = (gfsm_state_s *)malloc(sizeof(gfsm_state_s)); + + 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 = (gfsm_reaction_cb *) malloc(event_table_size); + + assert(p_state->reaction_table); + + memset(p_state->reaction_table, 0, event_table_size); + + return p_state; +} + +void gfsm_destroy_state(gfsm_state_s *p_state) +{ + assert(p_state); + assert(p_state->reaction_table); + + free(p_state->reaction_table); + free(p_state); +} + +gfsm_context_s *gfsm_create_context(gfsm_s *p_fsm, + gfsm_context_termination_notifier_cb termination_notifier_cb, + void *p_context_data) +{ + gfsm_state_s *p_next_state; + gfsm_context_s *p_context = (gfsm_context_s *)malloc(sizeof(gfsm_context_s)); + + assert(p_fsm); + assert(p_context); + + 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_cb = termination_notifier_cb; + + 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_s *p_context) +{ + assert(p_context); + return p_context->current_state_id; +} + +void gfsm_destroy_context(gfsm_context_s *p_context) +{ + gfsm_state_s *p_current_state; + + if (p_context->processing_event) { + if (p_context->p_fsm->log_func) + p_context->p_fsm->log_func("[%s] destroy_context is scheduled\n", + p_context->p_fsm->p_header); + + p_context->terminating = 1; + return; + } + + ASP_LOGD("context[%p]", p_context); + 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_cb) + p_context->termination_notifier_cb(p_context->p_context_data); + + if (p_context->p_fsm->log_func) + p_context->p_fsm->log_func("[%s] context is destroyed\n", + p_context->p_fsm->p_header); + + free(p_context); +} + +void gfsm_add_reaction(gfsm_state_s *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_s *p_state, gfsm_state_s *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_s* p_state, gfsm_state_s* 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_s *p_fsm, gfsm_state_s *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_s *gfsm_create_event(gfsm_event_id_t event_id, void *p_event_data, + gfsm_event_data_destructor_cb destructor) +{ + gfsm_event_s *p_event = (gfsm_event_s *)malloc(sizeof(gfsm_event_s)); + + 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_s *gfsm_get_fsm_of_state(gfsm_state_s *p_state) +{ + assert(p_state); + return p_state->p_fsm; +} + +gfsm_s *gfsm_get_fsm_of_context(gfsm_context_s *p_context) +{ + assert(p_context); + return p_context->p_fsm; +} + +void gfsm_process_event(gfsm_context_s **pp_context, gfsm_event_s *p_event) +{ + gfsm_context_s *p_context = *pp_context; + gfsm_s *p_fsm; + + ASP_LOGD("process event"); + if (p_context == NULL) + ASP_LOGD("context is NULL"); + 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 */ + if (p_fsm->log_func) + p_fsm->log_func("[%s] event(%s) is posted\n", p_fsm->p_header, + p_fsm->event_name_cb(p_event->event_id)); + + 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) { + if (p_fsm->log_func) + p_fsm->log_func("[%s] destroy_context was scheduled\n", p_fsm->p_header); + + ASP_LOGD("context[%p]", p_context); + gfsm_destroy_context(p_context); + } +} + +void _gfsm_process_event(gfsm_context_s *p_context, gfsm_event_s *p_event) +{ + gfsm_s *p_fsm; + gfsm_state_s *p_state; + gfsm_state_id_t next_state_id = GFSM_DISCARD_EVENT; + gfsm_event_id_t event_id; + + ASP_LOGD("inner process event"); + assert(p_context && p_event); + + event_id = p_event->event_id; + p_fsm = p_context->p_fsm; + + assert(p_context->current_state_id < p_fsm->max_state); + + if (p_fsm->log_func) + p_fsm->log_func("[%s] current state is (%s), event(%s) is received\n", + p_fsm->p_header, p_fsm->state_name_cb(p_context->current_state_id), + p_fsm->event_name_cb(event_id)); + + 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[event_id]) { + if (p_fsm->log_func) + p_fsm->log_func("[%s] state(%s)'s reaction is called for event(%s)\n", + p_fsm->p_header, p_fsm->state_name_cb(p_state->state_id), + p_fsm->event_name_cb(event_id)); + + next_state_id = p_state->reaction_table[event_id](p_context->p_context_data, + p_event->p_event_data); + break; + } + } + + if (GFSM_DEFER_EVENT == next_state_id) { + if (p_fsm->log_func) + p_fsm->log_func("[%s] event(%s) is defered\n", p_fsm->p_header, + p_fsm->event_name_cb(event_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) { + if (p_fsm->log_func) + p_fsm->log_func("[%s] state(%s) have no reaction for event(%s)\n", + p_fsm->p_header, p_fsm->state_name_cb(p_context->current_state_id), + p_fsm->event_name_cb(event_id)); + + return; + } + + if (GFSM_DISCARD_EVENT == next_state_id) { + if (p_fsm->log_func) + p_fsm->log_func("[%s] to stay in state(%s)\n", p_fsm->p_header, + p_fsm->state_name_cb(p_context->current_state_id)); + + return; + } + + gfsm_process_transition(p_context, next_state_id); +} + +void gfsm_process_transition(gfsm_context_s *p_context, + gfsm_state_id_t next_state_id) +{ + gfsm_state_s *p_next_state; + gfsm_state_s *p_current_state; + gfsm_state_s *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); + + if (p_context->p_fsm->log_func) + p_context->p_fsm->log_func("[%s] From (%s) to (%s)\n", + p_context->p_fsm->p_header, + p_context->p_fsm->state_name_cb(p_context->current_state_id), + p_context->p_fsm->state_name_cb(p_next_state->state_id)); + 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_s *p_current_state, + gfsm_state_s *p_common_ancesstor, gfsm_context_s *p_context) +{ + gfsm_state_s *p_state = p_current_state; + + while (p_state && p_state != p_common_ancesstor) { + if (p_state->exit_action_cb) + p_state->exit_action_cb(p_context->p_context_data); + + if (p_context->p_fsm->log_func) + p_context->p_fsm->log_func("[%s] exiting state(%s)\n", + p_context->p_fsm->p_header, p_context->p_fsm->state_name_cb(p_state->state_id)); + + p_state = p_state->p_parent_state; + } +} + +void gfsm_do_entry_action(gfsm_state_s *p_common_ancesstor, + gfsm_state_s *p_next_state, gfsm_context_s *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); + + if (p_context->p_fsm->log_func) + p_context->p_fsm->log_func("[%s] entering state(%s)\n", + p_context->p_fsm->p_header, + p_context->p_fsm->state_name_cb(p_next_state->state_id)); + + if (p_next_state->entry_action_cb) + p_next_state->entry_action_cb(p_context->p_context_data); +} + +void gfsm_reenqueue_deferred_event(gfsm_context_s *p_context) +{ + gfsm_event_s *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(void *p_context_data, void *p_event_data) +{ + return GFSM_DEFER_EVENT; +} + +void gfsm_init_event_queue(gfsm_event_queue_s *p_queue) +{ + assert(p_queue); + p_queue->p_head = p_queue->p_tail = NULL; +} + +void gfsm_destroy_event_queue(gfsm_event_queue_s *p_queue) +{ + gfsm_event_s *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_s *p_queue, gfsm_event_s *p_event) +{ + ASP_LOGD("enqueue"); + 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_s *gfsm_dequeue_event(gfsm_event_queue_s *p_queue) +{ + assert(p_queue); + + gfsm_event_s *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_s *gfsm_find_last_child_state(gfsm_state_s *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_s *gfsm_find_common_ancesstor_state(gfsm_state_s *p_state_l, + gfsm_state_s *p_state_r) +{ + gfsm_state_s *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; +} + +void gfsm_set_logger(gfsm_s *p_fsm, gfsm_log_func log_func, const char *header, + gfsm_get_state_name_cb state_name_cb, gfsm_get_event_name_cb event_name_cb) +{ + int header_len = 0; + + assert(p_fsm && log_func && header && state_name_cb && event_name_cb); + + if (header) + header_len = strlen(header); + + p_fsm->log_func = log_func; + p_fsm->state_name_cb = state_name_cb; + p_fsm->event_name_cb = event_name_cb; + p_fsm->p_header = (char *)malloc(header_len + 1); + strncpy(p_fsm->p_header, header, header_len + 1); +} diff --git a/src/gfsm.h b/src/gfsm.h new file mode 100644 index 0000000..ab9d2b7 --- /dev/null +++ b/src/gfsm.h @@ -0,0 +1,195 @@ +/*finite state machine + * + * Copyright (c) 2011 - 2013 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Hojeen Jee , Jaejun Sim , + * Jinho Ha + * + * 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 _GFSM_ +#define _GFSM_ + +/***************************************************************************** + * constants and Typedefs + *****************************************************************************/ + +typedef unsigned int gfsm_state_id_t; +typedef unsigned int gfsm_event_id_t; + +typedef struct gfsm_event gfsm_event_s; +typedef struct gfsm_state gfsm_state_s; +typedef struct gfsm gfsm_s; +typedef struct gfsm_context gfsm_context_s; + +typedef void (*gfsm_entry_action_cb)(void *p_context_data); +typedef void (*gfsm_exit_action_cb)(void *p_context_data); +typedef gfsm_state_id_t(*gfsm_reaction_cb)(void *p_context_data, + void *p_event_data); +typedef void (*gfsm_event_data_destructor_cb)(void *p_event_data); +typedef void (*gfsm_context_termination_notifier_cb)(void *p_context_data); + +typedef const char *(*gfsm_get_state_name_cb)(gfsm_state_id_t state_id); +typedef const char *(*gfsm_get_event_name_cb)(gfsm_event_id_t event_id); +typedef int (*gfsm_log_func)(const char *format, ...); + +static const gfsm_state_id_t GFSM_DISCARD_EVENT = 0xFFFFFFFF; +static const gfsm_state_id_t GFSM_DEFER_EVENT = 0xFFFFFFFE; + +/** + * @brief This function creates a generic fsm object + * @param [in] max_state maximum num of state + * @param [in] max_event maximum num of event + * @param [in] init_state state id of initial state + * @return a pointer of gfsm object +*/ +gfsm_s *gfsm_create_fsm(gfsm_state_id_t max_state, gfsm_event_id_t max_event, + gfsm_state_id_t init_state); + +/** + * @brief This function destroys a generic fsm object + * @param [in] a pointer of gfsm object + * @return void +*/ +void gfsm_destroy_fsm(gfsm_s *p_fsm); + +/** + * @brief This function add a state on a gfsm object + * @param [in] p_fsm a pointer of a gfsm + * @param [in] p_state a pointer of a gfsm_state + * @return void +*/ +void gfsm_add_state(gfsm_s *p_fsm, gfsm_state_s *p_state); + +/** + * @brief This function create a state object + * @param [in] state_id state id of this state + * @param [in] p_fsm a pointer of gfsm + * @param [in] entry_action callback function that will be called when entering into this state. + * @param [in] exit_action callback function that will be called when exiting from this state. + * @return a pointer of state object +*/ +gfsm_state_s *gfsm_create_state(gfsm_state_id_t state_id, gfsm_s *p_fsm, + gfsm_entry_action_cb entry_action, gfsm_exit_action_cb exit_action); + +/** + * @brief This function destroys a state object + * @param [in] p_state a pointer of state object + * @return void +*/ +void gfsm_destroy_state(gfsm_state_s *p_state); + +/** + * @brief This function set parent state of this state + * @param [in] p_state a pointer of child state + * @param [in] p_parent_state a pointer of parent state + * @return void +*/ +void gfsm_set_parent_state(gfsm_state_s *p_state, gfsm_state_s *p_parent_state); + +/** + * @brief This function add reaction of event on a state + * @param [in] p_state a pointer of state + * @param [in] event_id ID of event that will be processed on this state + * @param [in] reacton_cb callback function that will be called when event is received. + * @return void +*/ +void gfsm_add_reaction(gfsm_state_s *p_state, gfsm_event_id_t event_id, + gfsm_reaction_cb reaction_cb); + +/** + * @brief This function will return a pointer of fsm that has this state. + * @param [in] p_state a pointer of state + * @return a pointer of fsm that possess this state +*/ +gfsm_s *gfsm_get_fsm_of_state(gfsm_state_s *p_state); + +/** + * @brief This function create a context object. + * @param [in] p_fsm a pointer of fsm + * @param [in] termination_notifier callback function that will be called when context is destroyed + * @param [in] p_context_data user data that will be passed to reaction action, entry action, exit action + * @return a pointer of context +*/ +gfsm_context_s *gfsm_create_context(gfsm_s *p_fsm, + gfsm_context_termination_notifier_cb termination_notifier, + void *p_context_data); + +/** + * @brief This function detroy a context object. + * @param [in] p_context a pointer of context + * @return void +*/ +void gfsm_destroy_context(gfsm_context_s *p_context); + +/** + * @brief this function process event + * @param [in] pp_context a pointer of pointer of context + * @param [in] p_event a pointer of event that will be processed + * @return void +*/ +void gfsm_process_event(gfsm_context_s **pp_context, gfsm_event_s *p_event); + +/** + * @brief this function return a current state id + * @param [in] p_context a pointer of context + * @return current state id +*/ +gfsm_state_id_t gfsm_get_current_state_id(gfsm_context_s *p_context); + +/** + * @brief This function will return a pointer of fsm that has this context. + * @param [in] p_context a pointer of context + * @return a pointer of fsm that possess this context +*/ +gfsm_s *gfsm_get_fsm_of_context(gfsm_context_s *p_context); + +/** + * @brief this function create event object + * @param [in] event_id id of event that will be created + * @param [in] p_event_data user data that will be delivered to reaction functions + * @param [in] destructor callback function that will be called in order to destroy p_event_data + * @return a pointer of event +*/ +gfsm_event_s *gfsm_create_event(gfsm_event_id_t event_id, void *p_event_data, + gfsm_event_data_destructor_cb destructor); + +/** + * @brief predefined reaction function to defer event + * @param [in] p_context_data user data of context + * @param [in] p_event_data user data of event + * @return a next state id + * + * @verbatim + * gfsm_add_reaction(state1,event1,gfsm_deferral_reaction); + * @endverbatim +*/ +gfsm_state_id_t gfsm_deferral_reaction(void *p_context_data, + void *p_event_data); + +/** + * @brief this function will set logger function to help debugging + * @param [in] p_fsm a pointer of fsm object + * @param [in] log_func a function pointer to print log + * @param [in] header a string that will be shown at the head of every log + * @param [in] state_name_cb callback function that will pass string of state name + * @param [in] event_name_cb callback function that will pass string of event name + * @return void + * +*/ +void gfsm_set_logger(gfsm_s *p_fsm, gfsm_log_func log_func, const char *header, + gfsm_get_state_name_cb state_name_cb, gfsm_get_event_name_cb event_name_cb); + +#endif diff --git a/src/service/asp-service.c b/src/service/asp-service.c deleted file mode 100755 index 827aada..0000000 --- a/src/service/asp-service.c +++ /dev/null @@ -1,190 +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 - -/***************************************************************************** - * System headers - *****************************************************************************/ - -#include -#include - -#include - -/***************************************************************************** - * Application Service Platform Daemon headers - *****************************************************************************/ -#include "asp-manager-util.h" -#include "asp-manager-gdbus.h" -#include "asp-service.h" -#include "asp-session.h" -#include "asp-tech.h" - -#include "generated-code.h" - -/***************************************************************************** - * Macros and Typedefs - *****************************************************************************/ - -/* TODO : define service data structure */ - -/***************************************************************************** - * Global Variables - *****************************************************************************/ - -/* TODO : define local memory for service data structure */ - -/***************************************************************************** - * Local Functions Definition - *****************************************************************************/ - -static guint64 asp_service_search_id; - -gint32 asp_service_init() -{ - __ASP_LOG_FUNC_ENTER__; - gint32 result = 0; - asp_service_search_id = 0; - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_service_deinit() -{ - __ASP_LOG_FUNC_ENTER__; - gint32 result = 0; - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_service_advertise(asp_service_advertise_s *service, gint32 replace) -{ - __ASP_LOG_FUNC_ENTER__; - gint32 discovery_tech = service->discovery_tech; - gint32 result = 0; - - ASP_LOGD("Discovery tech %x", discovery_tech); - result = asp_tech_advertise(discovery_tech, service, replace); - if (result < 0) { - /* TODO */ - /* error handling */ - - } - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_service_cancel_advertise(asp_service_advertise_s *service) -{ - __ASP_LOG_FUNC_ENTER__; - gint32 discovery_tech = service->discovery_tech; - gint32 result = 0; - - ASP_LOGD("Discovery tech %x", discovery_tech); - result = asp_tech_cancel_advertise(discovery_tech, service); - if (result < 0) { - /* TODO */ - /* error handling */ - - } - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_service_seek(asp_service_seek_s *service, guint64 *search_id) -{ - __ASP_LOG_FUNC_ENTER__; - gint32 discovery_tech = service->discovery_tech; - gint32 result = 0; - - ASP_LOGD("Discovery tech %x", discovery_tech); - service->search_id = asp_service_search_id; - result = asp_tech_seek(discovery_tech, service); - if (result < 0) { - /* TODO */ - /* error handling */ - - } - - *search_id = service->search_id; - asp_service_search_id++; - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_service_cancel_seek(asp_service_seek_s *service) -{ - __ASP_LOG_FUNC_ENTER__; - gint32 discovery_tech = service->discovery_tech; - gint32 result = 0; - - ASP_LOGD("Discovery tech %x", discovery_tech); - result = asp_tech_cancel_seek(discovery_tech, service); - if (result < 0) { - /* TODO */ - /* error handling */ - - } - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -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__; - gint32 result = 0; - - asp_manager_gdbus_notify_advertise_status(adv_id, (guint8)status, (gint32)reason); - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -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__; - gint32 result = 0; - - asp_manager_gdbus_notify_search_result(search_id, - 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 deleted file mode 100644 index 0d85ca3..0000000 --- a/src/session/asp-coordination-protocol.c +++ /dev/null @@ -1,526 +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 - -/***************************************************************************** - * 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, - void *input_data); -static void asp_coordination_protocol_nack_handler(GSocketAddress *sock_addr, - void *input_data); -static void asp_coordination_protocol_version_handler(GSocketAddress *sock_addr, - void *input_data); -static void asp_coordination_protocol_request_session_handler( - GSocketAddress *sock_addr, void *input_data); -static void asp_coordination_protocol_allowed_port_handler( - GSocketAddress *sock_addr, void *input_data); -static void asp_coordination_protocol_remove_session_handler( - GSocketAddress *sock_addr, void *input_data); - -static gboolean asp_coordination_protocol_send_ack(GSocketAddress *sock_addr, - asp_ack_s *input_data); -static gboolean asp_coordination_protocol_send_nack(GSocketAddress *sock_addr, - asp_nack_s *input_data); -static gboolean asp_coordination_protocol_send_version(GSocketAddress - *sock_addr, asp_version_s *input_data); -static gboolean asp_coordination_protocol_send_added_session( - GSocketAddress *sock_addr, asp_added_session_s *input_data); -static gboolean asp_coordination_protocol_send_deferred_session( - GSocketAddress *sock_addr, asp_deferred_session_s *input_data); -static gboolean asp_coordination_protocol_send_rejected_session( - GSocketAddress *sock_addr, asp_rejected_session_s *input_data); -static gboolean asp_coordination_protocol_send_allowed_port( - GSocketAddress *sock_addr, asp_allowed_port_s *input_data); - -static gboolean asp_coordination_protocol_send_request_session( - GSocketAddress *dest_addr, asp_request_session_s *input_data); -static gboolean asp_coordination_protocol_send_remove_session( - GSocketAddress *sock_addr, asp_remove_session_s *input_data); -static void asp_coordination_protocol_added_session_handler( - GSocketAddress *sock_addr, char *input_data); -static void asp_coordination_protocol_rejected_session_handler( - GSocketAddress *sock_addr, char *input_data); -static void asp_coordination_protocol_deferred_session_handler( - GSocketAddress *sock_addr, char *input_data); - - -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); - - coordination_protocol_sockaddr = g_inet_socket_address_new(inet_addr, - ASP_COORDINATION_PROTOCOL_PORT); - - 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); - g_clear_error(&error); - - return ret_val; -} - -gboolean asp_coordination_protocol_send_msg(GSocketAddress *input_sock_addr, - void *input_data) -{ - INFO_MSG; - - gboolean ret_val = FALSE; - - asp_coord_header_s *asp_cord_header = (asp_coord_header_s *)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_s *)input_data); - break; - } - case ASP_OPCODE_ADDED_SESSION: { - ret_val = asp_coordination_protocol_send_added_session(input_sock_addr, - (asp_added_session_s *)input_data); - break; - } - case ASP_OPCODE_REJECTED_SESSION: { - ret_val = asp_coordination_protocol_send_rejected_session(input_sock_addr, - (asp_rejected_session_s *)input_data); - break; - } - case ASP_OPCODE_REMOVE_SESSION: { - ret_val = asp_coordination_protocol_send_remove_session(input_sock_addr, - (asp_remove_session_s *)input_data); - break; - } - case ASP_OPCODE_ALLOWED_PORT: { - ret_val = asp_coordination_protocol_send_allowed_port(input_sock_addr, - (asp_allowed_port_s *)input_data); - break; - } - case ASP_OPCODE_VERSION: { - ret_val = asp_coordination_protocol_send_version(input_sock_addr, - (asp_version_s *)input_data); - break; - } - case ASP_OPCODE_DEFERRED_SESSION: { - ret_val = asp_coordination_protocol_send_deferred_session(input_sock_addr, - (asp_deferred_session_s *)input_data); - break; - } - case ASP_OPCODE_ACK: { - ret_val = asp_coordination_protocol_send_ack(input_sock_addr, - (asp_ack_s *)input_data); - break; - } - case ASP_OPCODE_NACK: { - ret_val = asp_coordination_protocol_send_nack(input_sock_addr, - (asp_nack_s *)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); - g_clear_error(&error); - - return TRUE; -} - -static void asp_coordination_protocol_ack_handler(GSocketAddress *sock_addr, - void *input_data) -{ - INFO_MSG; - - asp_ack_s *ack_data = (asp_ack_s *)input_data; - asp_sess_peer_recv_msg(sock_addr, ack_data); -} - -static void asp_coordination_protocol_nack_handler(GSocketAddress *sock_addr, - void *input_data) -{ - INFO_MSG; - - asp_nack_s *nack_data = (asp_nack_s *)input_data; - asp_sess_peer_recv_msg(sock_addr, nack_data); -} - -static void asp_coordination_protocol_version_handler(GSocketAddress *sock_addr, - void *input_data) -{ - INFO_MSG; - - asp_version_s *ver = (asp_version_s *)input_data; - asp_sess_peer_recv_msg(sock_addr, ver); -} - -static void asp_coordination_protocol_request_session_handler( - GSocketAddress *sock_addr, void *input_data) -{ - INFO_MSG; - - asp_request_session_s *request_sess = (asp_request_session_s *)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, void *input_data) -{ - INFO_MSG; - - asp_allowed_port_s *allowed_port_data = (asp_allowed_port_s *)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, void *input_data) -{ - INFO_MSG; - - asp_remove_session_s *remove_sess = (asp_remove_session_s *)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_s *input_data) -{ - INFO_MSG; - - GError *error = NULL; - asp_ack_s *send_ack = input_data; - - g_socket_send_to(coordination_protocol_socket, sock_addr, (char *)send_ack, - sizeof(asp_ack_s), NULL, &error); - - return TRUE; -} - -static gboolean asp_coordination_protocol_send_nack(GSocketAddress *sock_addr, - asp_nack_s *input_data) -{ - INFO_MSG; - - GError *error = NULL; - asp_nack_s *send_nack = input_data; - - g_socket_send_to(coordination_protocol_socket, sock_addr, (char *)send_nack, - sizeof(asp_nack_s), NULL, &error); - - return TRUE; -} - -static gboolean asp_coordination_protocol_send_version(GSocketAddress - *sock_addr, asp_version_s *input_data) -{ - INFO_MSG; - - GError *error = NULL; - asp_version_s *send_version = input_data; - - g_socket_send_to(coordination_protocol_socket, sock_addr, (char *)send_version, - sizeof(asp_version_s), NULL, &error); - - return TRUE; -} - -static gboolean asp_coordination_protocol_send_added_session( - GSocketAddress *sock_addr, asp_added_session_s *input_data) -{ - INFO_MSG; - - GError *error = NULL; - asp_added_session_s added_sess; - memcpy(&added_sess, input_data, sizeof(asp_added_session_s)); - added_sess.session_id = htonl(added_sess.session_id); - - g_socket_send_to(coordination_protocol_socket, sock_addr, (char *)&added_sess, - sizeof(asp_added_session_s), NULL, &error); - - return TRUE; -} - -static gboolean asp_coordination_protocol_send_deferred_session( - GSocketAddress *sock_addr, asp_deferred_session_s *input_data) -{ - INFO_MSG; - - GError *error = NULL; - asp_deferred_session_s deferred_sess; - memcpy(&deferred_sess, input_data, sizeof(asp_deferred_session_s)); - 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, - (char *)&deferred_sess, sizeof(asp_deferred_session_s) + - 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_s *input_data) -{ - INFO_MSG; - - GError *error = NULL; - asp_rejected_session_s rejected_sess; - memcpy(&rejected_sess, input_data, sizeof(asp_rejected_session_s)); - rejected_sess.session_id = htonl(rejected_sess.session_id); - - g_socket_send_to(coordination_protocol_socket, sock_addr, - (char *)&rejected_sess, sizeof(asp_rejected_session_s), NULL, &error); - - return TRUE; -} - -static gboolean asp_coordination_protocol_send_allowed_port( - GSocketAddress *sock_addr, asp_allowed_port_s *input_data) -{ - INFO_MSG; - - GError *error = NULL; - asp_allowed_port_s allowed_port_data; - memcpy(&allowed_port_data, input_data, sizeof(asp_allowed_port_s)); - allowed_port_data.session_id = htonl(allowed_port_data.session_id); - - g_socket_send_to(coordination_protocol_socket, sock_addr, - (char *)&allowed_port_data, sizeof(asp_allowed_port_s), NULL, &error); - - return TRUE; -} - -static gboolean asp_coordination_protocol_send_request_session( - GSocketAddress *dest_sock_addr, asp_request_session_s *input_data) -{ - INFO_MSG; - - GError *error = NULL; - - asp_request_session_s request_sess; - memcpy(&request_sess, input_data, sizeof(asp_request_session_s)); - 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, - (char *)&request_sess, sizeof(asp_request_session_s) + - 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_s *input_data) -{ - INFO_MSG; - - GError *error = NULL; - asp_remove_session_s remove_sess; - memcpy(&remove_sess, input_data, sizeof(asp_remove_session_s)); - remove_sess.session_id = htonl(remove_sess.session_id); - - g_socket_send_to(coordination_protocol_socket, sock_addr, (char *)&remove_sess, - sizeof(asp_remove_session_s), NULL, &error); - - return TRUE; -} - -static void asp_coordination_protocol_added_session_handler( - GSocketAddress *sock_addr, char *input_data) -{ - INFO_MSG; - - asp_added_session_s *added_sess = (asp_added_session_s *)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, char *input_data) -{ - INFO_MSG; - - asp_rejected_session_s *rejected_sess = (asp_rejected_session_s *)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, char *input_data) -{ - INFO_MSG; - - asp_deferred_session_s *deferred_sess = (asp_deferred_session_s *)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 deleted file mode 100644 index c2b6dd7..0000000 --- a/src/session/asp-coordination-protocol.h +++ /dev/null @@ -1,154 +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. - */ - -#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", ROLE, __TIME__) -#else -#define ROLE "[advertiser]" -#define INFO_MSG ASP_LOGD("%s %s", ROLE, __TIME__) -#endif - -typedef struct asp_coord_header { - guint8 opcode; - guint8 seq_num; -} __attribute__((packed)) asp_coord_header_s; - -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_s; - -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_s; - -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_s; - -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_s; - -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_s; - -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_s; - -typedef struct asp_version { - guint8 opcode; - guint8 seq_num; - guint8 coordination_version; - guint8 vendor_information_length; - guint32 vendor_information; -} __attribute__((packed)) asp_version_s; - -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_s; - -typedef struct asp_ack { - guint8 opcode; - guint8 seq_num; -} __attribute__((packed)) asp_ack_s; - -typedef struct asp_nack { - guint8 opcode; - guint8 seq_num; - guint8 reason; -} __attribute__((packed)) asp_nack_s; - -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, - void *input_data); - -#endif /* __ASP_COORDINATION_PROTOCOL_H__ */ diff --git a/src/session/asp-p2p-conn.c b/src/session/asp-p2p-conn.c deleted file mode 100644 index bfb4f13..0000000 --- a/src/session/asp-p2p-conn.c +++ /dev/null @@ -1,254 +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 - -/***************************************************************************** - * 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); - if (params.session_information) - 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 deleted file mode 100644 index 462fef6..0000000 --- a/src/session/asp-p2p-conn.h +++ /dev/null @@ -1,54 +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. - */ - -#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, const guint8 *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 deleted file mode 100644 index f0b4112..0000000 --- a/src/session/asp-session-peer-interface.h +++ /dev/null @@ -1,30 +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. - */ - -#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 deleted file mode 100644 index 33f328a..0000000 --- a/src/session/asp-session-peer.c +++ /dev/null @@ -1,1530 +0,0 @@ -#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() - -#define ASP_SESS_PEER_HEADER "SESSION_PEER_FSM" - -typedef struct asp_sess_peer { - gfsm_context_s *context; - GSocketAddress *p_sock_addr; - guint8 seq_num; - guint8 retry; - guint timer_id; - void *p_sending_msg_data; - GTree *p_sess_tree; -} asp_sess_peer_s; - -typedef struct asp_sess_peer_key { - guint8 ip_addr[16]; - guint8 ip_addr_len; - guint16 port; -} asp_sess_peer_key_s; - -typedef struct asp_sess_peer_sess_key { - guint32 sess_id; - guint8 sess_mac[6]; -} asp_sess_peer_sess_key_s; - -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_s *_asp_sess_peer_create_peer(GSocketAddress *p_sock_addr); -static void _asp_sess_peer_destroy_peer(void *p_peer); -static asp_sess_peer_s *_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_s *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 void *asp_sess_peer_dup_msg_data(void *p_msg); -static void _asp_sess_peer_set_sending_msg_data(asp_sess_peer_s *p_peer, - void *p_msg); -static asp_sess_peer_sess_key_s *_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_s *p_peer); -static void _asp_sess_peer_start_timer(asp_sess_peer_s *p_peer, guint sec); - -static gboolean _asp_sess_peer_send_req(GSocketAddress *p_sock_addr, - void *p_msg); -static gboolean _asp_sess_peer_send_ack(GSocketAddress *p_sock_addr, - void *p_msg); -static gboolean _asp_sess_peer_send_nack(GSocketAddress *p_sock_addr, - void *p_msg); - -static gboolean _asp_sess_peer_recv_req(GSocketAddress *p_sock_addr, - void *p_msg); -static gboolean _asp_sess_peer_recv_ack(GSocketAddress *p_sock_addr, - void *p_msg); -static gboolean _asp_sess_peer_recv_nack(GSocketAddress *p_sock_addr, - void *p_msg); - -static gboolean _asp_sess_peer_recv_version(GSocketAddress *p_sock_addr, - void *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(void *p_context_data); -static void _asp_sess_peer_state_init_exit_action(void *p_context_data); -static gfsm_state_id_t _asp_sess_peer_state_init_reaction_start( - void *p_context_data, void *p_event_data); - -static void _asp_sess_peer_state_created_entry_action(void *p_context_data); -static void _asp_sess_peer_state_created_exit_action(void *p_context_data); -static gfsm_state_id_t _asp_sess_peer_state_created_reaction_add_session( - void *p_context_data, void *p_event_data); -static gfsm_state_id_t _asp_sess_peer_state_created_reaction_del_session( - void *p_context_data, void *p_event_data); -static gfsm_state_id_t _asp_sess_peer_state_created_reaction_close( - void *p_context_data, void *p_event_data); -static gfsm_state_id_t _asp_sess_peer_state_created_reaction_send_ack( - void *p_context_data, void *p_event_data); -static gfsm_state_id_t _asp_sess_peer_state_created_reaction_send_nack( - void *p_context_data, void *p_event_data); - -static void _asp_sess_peer_state_version_sent_entry_action( - void *p_context_data); -static void _asp_sess_peer_state_version_sent_exit_action(void *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( - void *p_context_data, void *p_event_data); -static gfsm_state_id_t _asp_sess_peer_state_version_sent_reaction_recv_nack( - void *p_context_data, void *p_event_data); -static gfsm_state_id_t _asp_sess_peer_state_version_sent_reaction_timeout( - void *p_context_data, void *p_event_data); - -static void _asp_sess_peer_state_wait_version_entry_action( - void *p_context_data); -static void _asp_sess_peer_state_wait_version_exit_action(void *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( - void *p_context_data, void *p_event_data); -static gfsm_state_id_t _asp_sess_peer_state_wait_version_reaction_recv_req( - void *p_context_data, void *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( - void *p_context_data, void *p_event_data); - -static void _asp_sess_peer_state_opened_entry_action(void *p_context_data); -static void _asp_sess_peer_state_opened_exit_action(void *p_context_data); -static gfsm_state_id_t _asp_sess_peer_state_opened_reaction_recv_version( - void *p_context_data, void *p_event_data); -static gfsm_state_id_t _asp_sess_peer_state_opened_reaction_recv_req( - void *p_context_data, void *p_event_data); - -static void _asp_sess_peer_state_idle_entry_action(void *p_context_data); -static void _asp_sess_peer_state_idle_exit_action(void *p_context_data); -static gfsm_state_id_t _asp_sess_peer_state_idle_reaction_send_req( - void *p_context_data, void *p_event_data); - -static void _asp_sess_peer_state_wait_ack_entry_action(void *p_context_data); -static void _asp_sess_peer_state_wait_ack_exit_action(void *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( - void *p_context_data, void *p_event_data); -static gfsm_state_id_t _asp_sess_peer_state_wait_ack_reaction_recv_nack( - void *p_context_data, void *p_event_data); -static gfsm_state_id_t _asp_sess_peer_state_wait_ack_reaction_timeout( - void *p_context_data, void *p_event_data); - -static void _asp_sess_peer_state_close_entry_action(void *p_context_data); -static void _asp_sess_peer_state_close_exit_action(void *p_context_data); - -static void asp_sess_peer_fsm_init(); - -static gfsm_s *asm_sess_peer_fsm; -static gfsm_state_s *asp_sess_peer_state_init; -static gfsm_state_s *asp_sess_peer_state_created; -static gfsm_state_s *asp_sess_peer_state_version_sent; -static gfsm_state_s *asp_sess_peer_state_wait_version; -static gfsm_state_s *asp_sess_peer_state_opened; -static gfsm_state_s *asp_sess_peer_state_idle; -/*static gfsm_state_s asp_sess_peer_state_req_sent; */ -static gfsm_state_s *asp_sess_peer_state_wait_ack; -static gfsm_state_s *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_destroy_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, void *p_msg) -{ - INFO_MSG; - - asp_coord_header_s *p_header = (asp_coord_header_s *)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_s *)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, void *p_msg) -{ - INFO_MSG; - - asp_coord_header_s *p_header = (asp_coord_header_s *)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, void *p_msg) -{ - INFO_MSG; - - asp_sess_peer_s *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)); - } - - if (p_peer && p_peer->context) - 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, void *p_msg) -{ - INFO_MSG; - - asp_sess_peer_s *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, void *p_msg) -{ - INFO_MSG; - - asp_sess_peer_s *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, void *p_msg) -{ - INFO_MSG; - - asp_sess_peer_s *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_s ack; - ack.opcode = ASP_OPCODE_ACK; - ack.seq_num = ((asp_version_s *)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_s ack; - ack.opcode = ASP_OPCODE_ACK; - ack.seq_num = ((asp_version_s *)p_msg)->seq_num; - asp_coordination_protocol_send_msg(p_sock_addr, &ack); - } - - if (p_peer && p_peer->context) - 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, void *p_msg) -{ - INFO_MSG; - - asp_sess_peer_s *p_peer = _asp_sess_peer_tree_find_peer(p_sock_addr); - asp_coord_header_s *p_header = (asp_coord_header_s *)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, void *p_msg) -{ - INFO_MSG; - - asp_sess_peer_s *p_peer = _asp_sess_peer_tree_find_peer(p_sock_addr); - - if (NULL == p_peer) - return FALSE; - - asp_request_header_s *p_header = (asp_request_header_s *) - 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, void *p_msg) -{ - INFO_MSG; - - asp_sess_peer_s *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_s *p_peer = _asp_sess_peer_tree_find_peer(p_sock_addr); - - if (NULL == p_peer) { - ASP_LOGD("create 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)); - } - if (p_peer && p_peer->context) - 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_s *p_peer = NULL; - - if (p_sock_addr == NULL) - return TRUE; - - 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_s *_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_s *p_key = (asp_sess_peer_key_s *) g_malloc(sizeof( - asp_sess_peer_key_s)); - - 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_s *_asp_sess_peer_tree_find_peer(GSocketAddress *p_sock_addr) -{ - INFO_MSG; - - asp_sess_peer_key_s *p_key = _asp_sess_peer_tree_create_peer_key(p_sock_addr); - - g_assert(p_key); - - return (asp_sess_peer_s *) g_tree_lookup(gp_peer_tree, p_key); -} - -gboolean _asp_sess_peer_tree_insert_peer(GSocketAddress *p_sock_addr, - asp_sess_peer_s *p_peer) -{ - INFO_MSG; - - asp_sess_peer_key_s *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_s* 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) -{ - asp_sess_peer_key_s *p_l = (asp_sess_peer_key_s *) a; - asp_sess_peer_key_s *p_r = (asp_sess_peer_key_s *) 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) -{ - g_free(a); -} - -void _asp_sess_peer_tree_value_destructor_cb(gpointer a) -{ - g_free(a); -} - -asp_sess_peer_s *_asp_sess_peer_create_peer(GSocketAddress *p_sock_addr) -{ - INFO_MSG; - - asp_sess_peer_s *p_peer = (asp_sess_peer_s *) g_malloc(sizeof(asp_sess_peer_s)); - - g_assert(p_peer); - - p_peer->p_sock_addr = (GSocketAddress *) 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_LOGD("insert peer"); - _asp_sess_peer_tree_insert_peer(p_sock_addr, p_peer); - - p_peer->context = gfsm_create_context(asm_sess_peer_fsm, - _asp_sess_peer_destroy_peer, p_peer); - - return p_peer; -} - -void _asp_sess_peer_destroy_peer(void *p_context_data) -{ - asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data; - - INFO_MSG; - 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_s *p_peer, void *p_msg) -{ - INFO_MSG; - - asp_coord_header_s *p_header = (asp_coord_header_s *)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_s *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_s *p_peer, - void *p_msg_data) -{ - asp_session_recv_req(p_peer->p_sock_addr, p_msg_data); -} - -void _asp_sess_peer_forward_ack_to_sessmgmt(asp_sess_peer_s *p_peer, - void *p_msg_data) -{ - asp_request_header_s *p_header = (asp_request_header_s *) - 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_s *p_peer, - void *p_msg_data) -{ - asp_request_header_s *p_header = (asp_request_header_s *) - 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) -{ - asp_sess_peer_s *p_peer = (asp_sess_peer_s *) 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_s *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_s *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_s *p_peer) -{ - ++p_peer->retry; -} - -asp_sess_peer_sess_key_s *_asp_sess_peer_sess_tree_create_key( - guint8 session_mac[], guint32 session_id) -{ - INFO_MSG; - asp_sess_peer_sess_key_s *p_key = (asp_sess_peer_sess_key_s *) g_malloc(sizeof( - asp_sess_peer_sess_key_s)); - - 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_s *p_peer, - asp_sess_peer_sess_key_s *p_key) -{ - asp_sess_peer_sess_key_s *p_value = (asp_sess_peer_sess_key_s *) 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_s *p_peer, - asp_sess_peer_sess_key_s *p_key) -{ - 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_s *p_l = (asp_sess_peer_sess_key_s *) a; - asp_sess_peer_sess_key_s *p_r = (asp_sess_peer_sess_key_s *) 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_s *p_key = (asp_sess_peer_sess_key_s *) 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. */ -} - -void *_asp_sess_peer_dup_request_session(void *p_msg) -{ - asp_request_session_s *p_dup_msg = (asp_request_session_s *)g_malloc(sizeof( - asp_request_session_s)); - memcpy(p_dup_msg, p_msg, sizeof(asp_request_session_s)); - - return p_dup_msg; -} - -void *_asp_sess_peer_dup_msg_added_session(void *p_msg) -{ - asp_added_session_s *p_dup_msg = (asp_added_session_s *)g_malloc(sizeof( - asp_added_session_s)); - memcpy(p_dup_msg, p_msg, sizeof(asp_added_session_s)); - - return p_dup_msg; -} - -void *_asp_sess_peer_dup_msg_rejected_session(void *p_msg) -{ - asp_rejected_session_s *p_dup_msg = (asp_rejected_session_s *)g_malloc(sizeof( - asp_rejected_session_s)); - memcpy(p_dup_msg, p_msg, sizeof(asp_rejected_session_s)); - - return p_dup_msg; -} - -void *_asp_sess_peer_dup_msg_remove_session(void *p_msg) -{ - asp_remove_session_s *p_dup_msg = (asp_remove_session_s *)g_malloc(sizeof( - asp_remove_session_s)); - memcpy(p_dup_msg, p_msg, sizeof(asp_remove_session_s)); - - return p_dup_msg; -} - -void *_asp_sess_peer_dup_msg_allowed_port(void *p_msg) -{ - asp_allowed_port_s *p_dup_msg = (asp_allowed_port_s *)g_malloc(sizeof( - asp_allowed_port_s)); - memcpy(p_dup_msg, p_msg, sizeof(asp_allowed_port_s)); - - return p_dup_msg; -} - -void *_asp_sess_peer_dup_msg_version(void *p_msg) -{ - asp_version_s *p_dup_msg = (asp_version_s *)g_malloc(sizeof(asp_version_s)); - memcpy(p_dup_msg, p_msg, sizeof(asp_version_s)); - - return p_dup_msg; -} - -void *_asp_sess_peer_dup_msg_deferred_session(void *p_msg) -{ - asp_deferred_session_s *p_dup_msg = (asp_deferred_session_s *)g_malloc(sizeof( - asp_deferred_session_s)); - memcpy(p_dup_msg, p_msg, sizeof(asp_deferred_session_s)); - - printf("_asp_sess_peer_dup_msg_deferred_session, session_id:%d\n", - p_dup_msg->session_id); - return p_dup_msg; -} - -void *_asp_sess_peer_dup_msg_ack(void *p_msg) -{ - asp_ack_s *p_dup_msg = (asp_ack_s *)g_malloc(sizeof(asp_ack_s)); - memcpy(p_dup_msg, p_msg, sizeof(asp_ack_s)); - return p_dup_msg; -} - -void *_asp_sess_peer_dup_msg_nack(void *p_msg) -{ - asp_nack_s *p_dup_msg = (asp_nack_s *)g_malloc(sizeof(asp_nack_s)); - memcpy(p_dup_msg, p_msg, sizeof(asp_nack_s)); - return p_dup_msg; -} - -void *asp_sess_peer_dup_msg_data(void *p_msg) -{ - asp_coord_header_s *p_header = (asp_coord_header_s *)p_msg; - void *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 (void *)ret; -} - -void _asp_sess_peer_send_nack_to_protocol(GSocketAddress *p_sock_addr, - guint8 seq_num, guint8 reason) -{ - asp_nack_s 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); -} - -const char *_asp_sess_peer_fsm_get_state_name_cb(gfsm_state_id_t state_id) -{ - const char *ret_val = NULL; - - switch (state_id) { - case ASP_S_PEER_STATE_INIT: - ret_val = "ASP_S_PEER_STATE_INIT"; - break; - case ASP_S_PEER_STATE_CREATED: - ret_val = "ASP_S_PEER_STATE_CREATED"; - break; - case ASP_S_PEER_STATE_VERSION_SENT: - ret_val = "ASP_S_PEER_STATE_VERSION_SENT"; - break; - case ASP_S_PEER_STATE_WAIT_VERSION: - ret_val = "ASP_S_PEER_STATE_WAIT_VERSION"; - break; - case ASP_S_PEER_STATE_WAIT_ACK: - ret_val = "ASP_S_PEER_STATE_WAIT_ACK"; - break; - case ASP_S_PEER_STATE_OPENED: - ret_val = "ASP_S_PEER_STATE_OPENED"; - break; - case ASP_S_PEER_STATE_IDLE: - ret_val = "ASP_S_PEER_STATE_IDLE"; - break; - /* - case ASP_S_PEER_STATE_REQ_SENT: - ret_val = "ASP_S_PEER_STATE_REQ_SENT"; - break; - */ - case ASP_S_PEER_STATE_CLOSED: - ret_val = "ASP_S_PEER_STATE_CLOSED"; - break; - default: - ret_val = "ASP_S_PEER_STATE_MAX"; - break; - } - - return ret_val; -} - -const char *_asp_sess_peer_gfsm_get_event_name_cb(gfsm_event_id_t event_id) -{ - const char *ret_val = NULL; - - switch (event_id) { - case ASP_S_PEER_EVENT_START: - ret_val = "ASP_S_PEER_EVENT_START"; - break; - case ASP_S_PEER_EVENT_ADD_SESSION: - ret_val = "ASP_S_PEER_EVENT_ADD_SESSION"; - break; - case ASP_S_PEER_EVENT_DEL_SESSION: - ret_val = "ASP_S_PEER_EVENT_DEL_SESSION"; - break; - case ASP_S_PEER_EVENT_SEND_REQ: - ret_val = "ASP_S_PEER_EVENT_SEND_REQ"; - break; - case ASP_S_PEER_EVENT_SEND_ACK: - ret_val = "ASP_S_PEER_EVENT_SEND_ACK"; - break; - case ASP_S_PEER_EVENT_SEND_NACK: - ret_val = "ASP_S_PEER_EVENT_SEND_NACK"; - break; - case ASP_S_PEER_EVENT_RECV_VERSION: - ret_val = "ASP_S_PEER_EVENT_RECV_VERSION"; - break; - case ASP_S_PEER_EVENT_RECV_REQ: - ret_val = "ASP_S_PEER_EVENT_RECV_REQ"; - break; - case ASP_S_PEER_EVENT_RECV_ACK: - ret_val = "ASP_S_PEER_EVENT_RECV_ACK"; - break; - case ASP_S_PEER_EVENT_RECV_NACK: - ret_val = "ASP_S_PEER_EVENT_RECV_NACK"; - break; - case ASP_S_PEER_EVENT_TIMEOUT: - ret_val = "ASP_S_PEER_EVENT_TIMEOUT"; - break; - case ASP_S_PEER_EVENT_CLOSE: - ret_val = "ASP_S_PEER_EVENT_CLOSE"; - break; - default: - ret_val = "ASP_S_PEER_EVENT_MAX"; - break; - } - - return ret_val; -} - -int _asp_sess_peer_fsm_log_func(const char *format, ...) -{ - gchar buffer[256]; - va_list args; - va_start(args, format); - g_vsnprintf(buffer, 255, format, args); - va_end(args); - - ASP_LOGD("%s", buffer); - - return 0; -} - -void asp_sess_peer_fsm_init() -{ - INFO_MSG; - - asm_sess_peer_fsm = gfsm_create_fsm(ASP_S_PEER_STATE_MAX, ASP_S_PEER_EVENT_MAX, - ASP_S_PEER_STATE_INIT); - - asp_sess_peer_state_init = gfsm_create_state(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); - - asp_sess_peer_state_created = gfsm_create_state(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); - - asp_sess_peer_state_version_sent = gfsm_create_state( - 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); - - asp_sess_peer_state_wait_version = gfsm_create_state( - 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); - - asp_sess_peer_state_opened = gfsm_create_state(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); - - asp_sess_peer_state_idle = gfsm_create_state(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); - - asp_sess_peer_state_wait_ack = gfsm_create_state(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); - - asp_sess_peer_state_closed = gfsm_create_state(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); - - gfsm_set_logger(asm_sess_peer_fsm, _asp_sess_peer_fsm_log_func, - ASP_SESS_PEER_HEADER, - _asp_sess_peer_fsm_get_state_name_cb, - _asp_sess_peer_gfsm_get_event_name_cb); -} - -void _asp_sess_peer_state_init_entry_action(void *p_context_data) -{ - INFO_MSG; - - ASP_SESS_PEER_FSM_TRACE_ENTER(); - - /* asp_sess_peer_s* p_peer = (asp_sess_peer_s*)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(void *p_context_data) -{ - INFO_MSG; - - ASP_SESS_PEER_FSM_TRACE_ENTER(); - - /*asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */ - - ASP_SESS_PEER_FSM_TRACE_LEAVE(); -} - -gfsm_state_id_t _asp_sess_peer_state_init_reaction_start(void *p_context_data, - void *p_event_data) -{ - INFO_MSG; - - ASP_SESS_PEER_FSM_TRACE_ENTER(); - - /* asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */ - - ASP_SESS_PEER_FSM_TRACE_LEAVE(); - - return ASP_S_PEER_STATE_VERSION_SENT; -} - -void _asp_sess_peer_state_created_entry_action(void *p_context_data) -{ - INFO_MSG; - - /* asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */ -} - -void _asp_sess_peer_state_created_exit_action(void *p_context_data) -{ - INFO_MSG; - - /* asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */ -} - -gfsm_state_id_t _asp_sess_peer_state_created_reaction_add_session( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - - ASP_SESS_PEER_FSM_TRACE_ENTER(); - - asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data; - asp_sess_peer_sess_key_s *p_key = (asp_sess_peer_sess_key_s *) 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( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - - ASP_SESS_PEER_FSM_TRACE_ENTER(); - - asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data; - asp_sess_peer_sess_key_s *p_key = (asp_sess_peer_sess_key_s *) 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( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - - ASP_SESS_PEER_FSM_TRACE_ENTER(); - - /* asp_sess_peer_s* p_peer = (asp_sess_peer_s*)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( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - - ASP_SESS_PEER_FSM_TRACE_ENTER(); - - asp_sess_peer_s *p_peer = (asp_sess_peer_s *) 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( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - - ASP_SESS_PEER_FSM_TRACE_ENTER(); - - asp_sess_peer_s *p_peer = (asp_sess_peer_s *) 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(void *p_context_data) -{ - INFO_MSG; - - ASP_SESS_PEER_FSM_TRACE_ENTER(); - - asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data; - asp_version_s *p_msg_version = (asp_version_s *)g_malloc(sizeof( - asp_version_s)); - - 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); - - ASP_SESS_PEER_FSM_TRACE_LEAVE(); -} - -void _asp_sess_peer_state_version_sent_exit_action(void *p_context_data) -{ - INFO_MSG; - - asp_sess_peer_s *p_peer = (asp_sess_peer_s *) 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( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - - asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data; - asp_ack_s *p_ack = (asp_ack_s *)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( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - - asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data; - asp_nack_s *p_nack = (asp_nack_s *)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( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - - /*asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */ - - return ASP_S_PEER_STATE_VERSION_SENT; -} - -void _asp_sess_peer_state_wait_version_entry_action(void *p_context_data) -{ - INFO_MSG; - - asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data; - - _asp_sess_peer_start_timer(p_peer, 10); -} - -void _asp_sess_peer_state_wait_version_exit_action(void *p_context_data) -{ - INFO_MSG; - - asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data; - - _asp_sess_peer_stop_timer(p_peer); -} - -gfsm_state_id_t _asp_sess_peer_state_wait_version_reaction_recv_version( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - - /* asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */ - /* asp_coord_header_s* p_header = (asp_coord_header_s*)p_event_data; */ - - return ASP_S_PEER_STATE_IDLE; -} - -gfsm_state_id_t _asp_sess_peer_state_wait_version_reaction_recv_req( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - - asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data; - asp_coord_header_s *p_header = (asp_coord_header_s *)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( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - - /*asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */ - return ASP_S_PEER_STATE_CLOSED; -} - -void _asp_sess_peer_state_opened_entry_action(void *p_context_data) -{ - INFO_MSG; - - /*asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */ -} - -void _asp_sess_peer_state_opened_exit_action(void *p_context_data) -{ - INFO_MSG; - - /*asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */ -} - -gfsm_state_id_t _asp_sess_peer_state_opened_reaction_recv_version( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - - /*asp_sess_peer_s* p_peer = (asp_sess_peer_s*)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( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - - asp_sess_peer_s *p_peer = (asp_sess_peer_s *) 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(void *p_context_data) -{ - INFO_MSG; - - /*asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */ -} - -void _asp_sess_peer_state_idle_exit_action(void *p_context_data) -{ - INFO_MSG; - - /*asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */ -} - -gfsm_state_id_t _asp_sess_peer_state_idle_reaction_send_req( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - - asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data; - void *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(void *p_context_data) -{ - INFO_MSG; - - asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data; - - _asp_sess_peer_start_timer(p_peer, 1); -} - -void _asp_sess_peer_state_wait_ack_exit_action(void *p_context_data) -{ - INFO_MSG; - - asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data; - - _asp_sess_peer_stop_timer(p_peer); -} - -gfsm_state_id_t _asp_sess_peer_state_wait_ack_reaction_recv_ack( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - - asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data; - asp_ack_s *p_ack = (asp_ack_s *)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( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - - asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data; - asp_nack_s *p_nack = (asp_nack_s *)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( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - - asp_sess_peer_s *p_peer = (asp_sess_peer_s *) 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(void *p_context_data) -{ - INFO_MSG; - - asp_sess_peer_s *p_peer = (asp_sess_peer_s *) p_context_data; - - if (!p_peer) { - ASP_LOGD("p_peer is null"); - return; - } - ASP_LOGD("context[%p]", p_peer->context); - gfsm_destroy_context(p_peer->context); -} - -void _asp_sess_peer_state_close_exit_action(void *p_context_data) -{ - INFO_MSG; - - /*asp_sess_peer_s* p_peer = (asp_sess_peer_s*)p_context_data; */ -} diff --git a/src/session/asp-session-peer.h b/src/session/asp-session-peer.h deleted file mode 100644 index ff3e635..0000000 --- a/src/session/asp-session-peer.h +++ /dev/null @@ -1,19 +0,0 @@ -#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, void *p_msg); -gboolean asp_sess_peer_recv_msg(GSocketAddress *p_sock_addr, void *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 deleted file mode 100644 index 52adfde..0000000 --- a/src/session/asp-session.c +++ /dev/null @@ -1,2802 +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 */ - -#define HAVE_ASP_P2P_CONN - -/***************************************************************************** - * System headers - *****************************************************************************/ -/*#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 "gfsm.h" -#include "asp-session.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_LEN 16 -#define SESSION_STATUS_ADDITIONAL_INFO_CO "REQUEST_SESSION" -#define SESSION_STATUS_ADDITIONAL_INFO_PD "PDRequest" - -#define ASP_SESSION_HEADER "SESSION_FSM" - -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_s *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 */ - gboolean confirmed; - gchar additional_info[SESSION_STATUS_ADDITIONAL_INFO_LEN]; -} asp_session_s; - -typedef struct session_request_cb { - asp_session_session_request_cb cb; - gpointer user_data; -} session_request_cb_s; - -typedef struct session_config_request_cb { - asp_session_session_config_request_cb cb; - gpointer user_data; -} session_config_request_cb_s; - -typedef struct connect_status_cb { - asp_session_connect_status_cb cb; - gpointer user_data; -} connect_status_cb_s; - -typedef struct port_status_cb { - asp_session_port_status_cb cb; - gpointer user_data; -} port_status_cb_s; - -typedef struct session_status_cb { - asp_session_session_status_cb cb; - gpointer user_data; -} session_status_cb_s; - -typedef struct asp_session_cb_v_table { - session_request_cb_s session_request; - session_config_request_cb_s session_config_request; - connect_status_cb_s connect_status; - port_status_cb_s port_status; - session_status_cb_s session_status; -} asp_session_cb_v_table_s; - -typedef struct asp_session_key { - guint32 session_id; - guint8 session_mac[MAC_ADDRESS_LEN]; -} asp_session_key_s; - -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_s; - -typedef struct defer_session_param { - guint8 deferred_response[ASP_DEFER_RESPONSE_BYTE_MAX]; - size_t length; -} defer_session_param_s; - -typedef struct confirm_session_param { - gboolean confirmed; - guint32 pin; -} confirm_session_param_s; - -typedef struct bound_port_param { - gchar local_ip[ASP_SESSION_IPV4_STR_LEN]; - guint16 local_port; - guint8 proto; -} bound_port_param_s; - -typedef struct session_request_param { - int 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_s; - -typedef struct connect_status_param { - asp_session_connect_status_e status; - char deferred_resp[ASP_DEFER_RESPONSE_BYTE_MAX]; - size_t length; -} connect_status_param_s; - -typedef struct session_config_request_param { - gboolean get_network_config_pin; - guint32 network_config_pin; -} session_config_request_param_s; - -typedef struct ip_assigned_param { - char peer_ip_addr[ASP_SESSION_IPV4_STR_LEN]; - size_t length; -} ip_assigned_param_s; - -enum { - 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 -} asp_session_state_e; - -enum { - 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_DELETE_SESSION, - - SESSION_EVENT_MAX -} asp_session_event_e; - -/***************************************************************************** - * Global Variables - *****************************************************************************/ -static GTree *sessionTree = - NULL; /* [key] - [asp_session_key_s*], [value] - [asp_session_s*] */ -static asp_session_cb_v_table_s session_cb_v_table; -static char g_my_p2p_mac[MAC_ADDRESS_LEN]; - -static guint16 g_asp_cordination_port = 7235; - -static gfsm_s *session_fsm; -static gfsm_state_s *session_state_none; -static gfsm_state_s *session_state_closed; -static gfsm_state_s *session_state_running; -static gfsm_state_s *session_state_l2connecting; -static gfsm_state_s *session_state_session_request_sent; -static gfsm_state_s *session_state_session_request_defered; -static gfsm_state_s *session_state_entering_pin; -static gfsm_state_s *session_state_session_request_received; -static gfsm_state_s *session_state_session_request_accepted; -static gfsm_state_s *session_state_group_formation_completed; -static gfsm_state_s *session_state_l2connected; -static gfsm_state_s *session_state_request_session_sent; -static gfsm_state_s *session_state_open; -static gfsm_state_s *session_state_request_session_received; -static gfsm_state_s *session_state_reject_session_sent; -static gfsm_state_s *session_state_remove_session_sent; - -/***************************************************************************** - * Local Functions Declaration - *****************************************************************************/ - -/* send coordination protocol message */ -static gboolean _send_request_session(asp_session_s *session, - guint8 *session_info, size_t session_info_len); -static gboolean _send_added_session(asp_session_s *session); -static gboolean _send_reject_session(asp_session_s *session); -static gboolean _send_remove_session(asp_session_s *session, - guint8 remove_reason); -static gboolean _send_allowed_port(asp_session_s *session, guint16 port, - guint8 protocol); -static gboolean _send_deferred_session(asp_session_s *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_s *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_s *_get_exist_session(guint32 session_id, - const guint8 *session_mac); -static asp_session_s *_new_session_by_request_session(GSocketAddress *sock_addr, - const gchar *peer_ip, gpointer p_msg); -static asp_session_s *_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_s *_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_s *_new_session_from_session_request( - const guint8 *session_mac, guint32 session_id, guint32 advertisement_id); -static void _asp_session_destroy_session(void *p_context_data); -static asp_session_status_e _get_session_state(guint8 *session_mac, - guint32 session_id); -static asp_session_key_s *_get_session_key(guint32 session_id, - const guint8 *session_mac); -static void _store_peer_ip_addr(asp_session_s *session, char *peer_ip, - size_t length); -#ifdef HAVE_ASP_P2P_CONN -static guint8 *_get_peer_mac(asp_session_s *session); -#endif - -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); -void _p2p_conn_ip_assigned_cb(gint32 error_code, const guint8 *session_mac, - guint32 session_id, const guint8 *service_mac, gchar *peer_ip_addr, gint32 ip_length, - 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(void *p_context_data); -static void _state_none_exit_action(void *p_context_data); -static gfsm_state_id_t _state_none_reaction_connect_session_called( - void *p_context_data, void *p_event_data); -static gfsm_state_id_t _state_none_reaction_request_session_received( - void *p_context_data, void *p_event_data); -static gfsm_state_id_t _state_none_reaction_session_request_received( - void *p_context_data, void *p_event_data); -static void _state_closed_entry_action(void *p_context_data); -static void _state_closed_exit_action(void *p_context_data); -static gfsm_state_id_t _state_closed_reaction_delete_session( - void *p_context_data, void *p_event_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(void *p_context_data); -static void _state_running_exit_action(void *p_context_data); - -static void _state_l2connecting_entry_action(void *p_context_data); -static void _state_l2connecting_exit_action(void *p_context_data); -static gfsm_state_id_t _state_l2connecting_reaction_close_session_called( - void *p_context_data, void *p_event_data); -static gfsm_state_id_t _state_l2connecting_reaction_timeout( - void *p_context_data, void *p_event_data); - -static void _state_session_request_sent_entry_action(void *p_context_data); -static void _state_session_request_sent_exit_action(void *p_context_data); -static gfsm_state_id_t -_state_session_request_sent_reaction_connect_status_called(void *p_context_data, - void *p_event_data); -static gfsm_state_id_t -_state_session_request_sent_reaction_session_config_request_called( - void *p_context_data, void *p_event_data); - -static void _state_session_request_defered_entry_action(void *p_context_data); -static void _state_session_request_defered_exit_action(void *p_context_data); -static gfsm_state_id_t -_state_session_request_defered_reaction_connect_status_called( - void *p_context_data, void *p_event_data); -static gfsm_state_id_t -_state_session_request_defered_reaction_session_config_request_called( - void *p_context_data, void *p_event_data); - -static void _state_session_request_received_entry_action(void *p_context_data); -static void _state_session_request_received_exit_action(void *p_context_data); -static gfsm_state_id_t -_state_session_request_received_reaction_confirm_session_called( - void *p_context_data, void *p_event_data); - -static void _state_session_request_accepted_entry_action(void *p_context_data); -static void _state_session_request_accepted_exit_action(void *p_context_data); -static gfsm_state_id_t -_state_session_request_accepted_reaction_connect_status_received( - void *p_context_data, void *p_event_data); -static gfsm_state_id_t -_state_session_request_accepted_reaction_session_config_request_called( - void *p_context_data, void *p_event_data); -static gfsm_state_id_t -_state_session_request_accepted_reaction_set_session_ready_called( - void *p_context_data, void *p_event_data); - -static void _state_entering_pin_entry_action(void *p_context_data); -static void _state_entering_pin_exit_action(void *p_context_data); -static gfsm_state_id_t _state_entering_pin_reaction_confirm_session_called( - void *p_context_data, void *p_event_data); - -static void _state_group_formation_completed_entry_action(void *p_context_data); -static void _state_group_formation_completed_exit_action(void *p_context_data); -static gfsm_state_id_t _state_group_formation_completed_reaction_ip_assigned( - void *p_context_data, void *p_event_data); -static gfsm_state_id_t -_state_group_formation_completed_reaction_request_session_received( - void *p_context_data, void *p_event_data); -static gfsm_state_id_t -_state_group_formation_completed_reaction_set_session_ready_called( - void *p_context_data, void *p_event_data); - -static void _state_l2connected_entry_action(void *p_context_data); -static void _state_l2connected_exit_action(void *p_context_data); -static gfsm_state_id_t _state_l2connected_reaction_close_session_called( - void *p_context_data, void *p_event_data); -static gfsm_state_id_t _state_l2connected_reaction_remove_session_received( - void *p_context_data, void *p_event_data); -static gfsm_state_id_t _state_l2connected_reaction_peer_destroyed( - void *p_context_data, void *p_event_data); - -static void _state_request_session_sent_entry_action(void *p_context_data); -static void _state_request_session_sent_exit_action(void *p_context_data); -static gfsm_state_id_t -_state_request_session_sent_reaction_added_session_received( - void *p_context_data, void *p_event_data); -static gfsm_state_id_t -_state_request_session_sent_reaction_deferred_session_received( - void *p_context_data, void *p_event_data); -static gfsm_state_id_t -_state_request_session_sent_reaction_rejected_session_received( - void *p_context_data, void *p_event_data); -static gfsm_state_id_t _state_request_session_sent_reaction_timeout( - void *p_context_data, void *p_event_data); -static void _state_request_session_received_entry_action(void *p_context_data); -static void _state_request_session_received_exit_action(void *p_context_data); -static gfsm_state_id_t -_state_request_session_received_reaction_set_session_ready_called( - void *p_context_data, void *p_event_data); -static gfsm_state_id_t -_state_request_session_received_reaction_defer_session_called( - void *p_context_data, void *p_event_data); -static gfsm_state_id_t -_state_request_session_received_reaction_confirm_session_called( - void *p_context_data, void *p_event_data); -static void _state_open_entry_action(void *p_context_data); -static void _state_open_exit_action(void *p_context_data); -static gfsm_state_id_t _state_open_reaction_bound_port_called( - void *p_context_data, void *p_event_data); -static gfsm_state_id_t _state_open_reaction_allowed_port_received( - void *p_context_data, void *p_event_data); -static void _state_reject_session_sent_entry_action(void *p_context_data); -static void _state_reject_session_sent_exit_action(void *p_context_data); -static gfsm_state_id_t _state_reject_session_sent_reaction_ack_received( - void *p_context_data, void *p_event_data); -static gfsm_state_id_t _state_reject_session_sent_reaction_nack_received( - void *p_context_data, void *p_event_data); -static void _state_remove_session_sent_entry_action(void *p_context_data); -static void _state_remove_session_sent_exit_action(void *p_context_data); -static gfsm_state_id_t _state_remove_session_sent_reaction_ack_received( - void *p_context_data, void *p_event_data); -static gfsm_state_id_t _state_remove_session_sent_reaction_nack_received( - void *p_context_data, void *p_event_data); -static gfsm_state_id_t _state_remove_session_sent_reaction_peer_destroyed( - void *p_context_data, void *p_event_data); - -/***************************************************************************** - * API Definition - *****************************************************************************/ - -gboolean asp_session_initialize() -{ - INFO_MSG; - -#ifdef HAVE_ASP_P2P_CONN - asp_p2p_conn_get_p2p_mac(g_my_p2p_mac); -#endif - - asp_sess_peer_init(); - - sessionTree = g_tree_new_full((GCompareDataFunc) _session_tree_compare_func, - NULL, (GDestroyNotify) _session_tree_key_destoryed, - (GDestroyNotify) _session_tree_value_destoryed); - - 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); - asp_p2p_conn_set_ip_assigned_cb(_p2p_conn_ip_assigned_cb, NULL); -#endif - - return TRUE; -} - -gboolean asp_session_deinitialize() -{ - INFO_MSG; - - asp_sess_peer_destroy(); - - 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_s *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_s *p_connect_session = (connect_session_param_s *) - g_malloc(sizeof(connect_session_param_s)); - - 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_infra(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_s *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_s *p_connect_session = (connect_session_param_s *) - g_malloc(sizeof(connect_session_param_s)); - - 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_s *session = _get_exist_session(session_id, session_mac); - defer_session_param_s *defer_session_param = (defer_session_param_s *)g_malloc( - sizeof(defer_session_param_s)); - - 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_s *session = _get_exist_session(session_id, session_mac); - g_assert(session); - - confirm_session_param_s *confirmed_param = (confirm_session_param_s *)g_malloc( - sizeof(confirm_session_param_s)); - confirmed_param->confirmed = confirmed; - confirmed_param->pin = pin; - session->confirmed = confirmed; - - 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_s *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_s *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; -} - -gboolean asp_session_bound_port(guint8 *session_mac, guint32 session_id, - const gchar *local_ip, guint16 local_port, guint8 protocol) -{ - INFO_MSG; - - asp_session_s *session = _get_exist_session(session_id, session_mac); - g_assert(session); - - bound_port_param_s *bound_port_param = (bound_port_param_s *)g_malloc(sizeof( - bound_port_param_s)); - 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_s *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); - - session_request_param_s *p_param = (session_request_param_s *)g_malloc(sizeof( - session_request_param_s)); - - 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_s *session = _get_exist_session(session_id, session_mac); - - if (session) { - session_config_request_param_s *p_param = (session_config_request_param_s *) - g_malloc(sizeof(session_config_request_param_s)); - p_param->get_network_config_pin = get_pin; - p_param->network_config_pin = pin; - - 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_s *session = _get_exist_session(session_id, session_mac); - - if (session) { - connect_status_param_s *p_param = (connect_status_param_s *)g_malloc(sizeof( - connect_status_param_s)); - p_param->status = status; - p_param->length = 0; - - gfsm_process_event(&(session->context), - gfsm_create_event(SESSION_EVENT_CONNECT_STATUS_CALLED, p_param, g_free)); - } -} - -void _p2p_conn_ip_assigned_cb(gint32 error_code, const guint8 *session_mac, - guint32 session_id, const guint8 *service_mac, gchar *peer_ip_addr, gint32 ip_length, - gpointer user_data) -{ - INFO_MSG; - - asp_session_s *session = _get_exist_session(session_id, session_mac); - - if (session) { - ip_assigned_param_s *p_param = (ip_assigned_param_s *)g_malloc(sizeof( - ip_assigned_param_s)); - g_strlcpy(p_param->peer_ip_addr, peer_ip_addr, ASP_SESSION_IPV4_STR_LEN); - p_param->length = ip_length; - - ASP_LOGD("%s %zu", p_param->peer_ip_addr, p_param->length); - gfsm_process_event(&(session->context), - gfsm_create_event(SESSION_EVENT_IP_ASSIGNED, p_param, g_free)); - } -} - -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_mac(const guint8 *session_mac, - guint32 session_id, guint8 **adv_mac) -{ - INFO_MSG; - - asp_session_s *session = _get_exist_session(session_id, session_mac); - g_assert(session); - - *adv_mac = session->service_mac; - - return TRUE; -} - -gboolean asp_session_get_advertisement_id(const guint8 *session_mac, - guint32 session_id, guint32 *advertisement_id) -{ - INFO_MSG; - - asp_session_s *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); - - return TRUE; -} - -gboolean asp_session_get_peer_endpoint(guint8 *session_mac, guint32 session_id, - gchar *peer_ip, guint16 *port) -{ - INFO_MSG; - - asp_session_s *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_s *p_header = (asp_request_header_s *)p_msg; - - ASP_LOGD("%s asp_session_recv_req(), opcode:%d", ROLE, p_header->opcode); - - asp_session_s *session = _get_exist_session(p_header->session_id, - p_header->session_mac); - - if (!session && - ASP_OPCODE_REQUEST_SESSION != p_header->opcode) { - /* over infra */ - /* NACK shall be sent */ - _send_nack(sock_addr, p_header->seq_num, ASP_NACK_REASON_NO_SESSION_EXIST); - return; - } - - if (session && session->over_p2p && session->sock_addr == NULL) { - ASP_LOGD("IpAssigned signal isn't yet received, discard event"); - return; - } - - 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_strlcpy(session->additional_info, SESSION_STATUS_ADDITIONAL_INFO_PD, - SESSION_STATUS_ADDITIONAL_INFO_LEN); - 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)); - 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_s *)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_LOGD("%s asp_session_recv_ack: session_id:%d, session_mac[0]:%x", ROLE, - session_id, session_mac[0]); - asp_session_s *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)); -} - -void asp_session_recv_nack(GSocketAddress *sock_addr, guint8 *session_mac, - guint32 session_id, gpointer data) -{ - INFO_MSG; - - asp_session_s *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_s *session = _get_exist_session(session_id, session_mac); - - if (session == NULL) { - ASP_LOGE("session [%u] already destroyed", session_id); - return; - } - - gfsm_process_event(&(session->context), - gfsm_create_event(SESSION_EVENT_PEER_DESTROYED, NULL, NULL)); -} - -/***************************************************************************** - * Local Function Definition - *****************************************************************************/ - -gboolean _send_request_session(asp_session_s *session, guint8 *session_info, - size_t session_info_len) -{ - INFO_MSG; - - asp_request_session_s 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, - (void *)&request_session_data); -} - -gboolean _send_remove_session(asp_session_s *session, guint8 remove_reason) -{ - INFO_MSG; - - asp_remove_session_s 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, (void *)&remove_session_data); -} - -gboolean _send_reject_session(asp_session_s *session) -{ - INFO_MSG; - - asp_rejected_session_s 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, - (void *)&rejected_session_data); -} - -gboolean _send_added_session(asp_session_s *session) -{ - INFO_MSG; - - asp_added_session_s 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, (void *)&add_session_data); -} - -gboolean _send_deferred_session(asp_session_s *session, - guint8 *deferred_response, size_t length) -{ - INFO_MSG; - - asp_deferred_session_s 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, - (void *)&deferred_session_data); -} - -gboolean _send_allowed_port(asp_session_s *session, guint16 port, - guint8 protocol) -{ - INFO_MSG; - - asp_allowed_port_s 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, (void *)&allowed_port_data); -} - -gboolean _send_nack(GSocketAddress *sock_addr, guint8 seq_num, guint8 reason) -{ - INFO_MSG; - - asp_nack_s 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, (void *)&nack_data); -} - -gboolean _send_ack(GSocketAddress *sock_addr, guint8 seq_num) -{ - INFO_MSG; - - asp_nack_s ack_data; - ack_data.opcode = ASP_OPCODE_ACK; - ack_data.seq_num = seq_num; - - return asp_sess_peer_send_msg(sock_addr, (void *)&ack_data); -} - -void _session_tree_value_destoryed(gpointer data) -{ - INFO_MSG; - - asp_session_s *session = (asp_session_s *)data; - - /* destroy gfsm context */ - /*gfsm_destroy_context(session->context); */ - - if (session->sock_addr) { - g_object_unref(session->sock_addr); - session->sock_addr = NULL; - } - - g_free(session); - session = NULL; -} - -void _session_tree_key_destoryed(gpointer data) -{ - asp_session_key_s *key = (asp_session_key_s *)data; - - g_free(key); -} - -gint _session_tree_compare_func(gconstpointer a, gconstpointer b) -{ - asp_session_key_s *s1 = (asp_session_key_s *)a; - asp_session_key_s *s2 = (asp_session_key_s *)b; - - /* ascending sort */ - if (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); -} - -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) -{ - INFO_MSG; - - if (NULL == session_cb_v_table.session_request.cb) { - /* a callback have not been registered yet */ - return; - } - - 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); -} - -void _call_session_config_request_cb(gint32 error_code, guint8 *session_mac, - guint32 session_id, gboolean get_pin, guint32 pin) -{ - INFO_MSG; - - if (NULL == session_cb_v_table.session_config_request.cb) { - /* a callback have not been registered yet */ - return; - } - - 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; - } - - 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; - - g_assert(session_cb_v_table.session_status.cb); - - asp_session_s *session = _get_exist_session(session_id, session_mac); - g_assert(session); - - session_cb_v_table.session_status.cb(error_code, session_mac, session_id, - _get_session_state(session_mac, session_id), closed_state, - session->additional_info, session_cb_v_table.session_status.user_data); -} - -void _call_connect_status_cb(gint32 error_code, guint8 *session_mac, - guint32 session_id, asp_session_connect_status_e status) -{ - INFO_MSG; - - g_assert(session_cb_v_table.session_status.cb); - - asp_session_s *session = _get_exist_session(session_id, session_mac); - g_assert(session); - - /* temporary code */ - /*what is deferred_resp ? */ - guint8 *deferred_resp = NULL; - size_t length = 0; - /* temporary code */ - - 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); -} - -gpointer _asp_session_dup_reqeust_session(gpointer p_msg) -{ - asp_request_session_s *p_dup_msg = (asp_request_session_s *)g_malloc(sizeof( - asp_request_session_s)); - memcpy(p_dup_msg, p_msg, sizeof(asp_request_session_s)); - return (gpointer) p_dup_msg; -} - -/* - -gpointer _asp_session_dup_added_session(gpointer p_msg) -{ - asp_added_session_s* p_dup_msg = (asp_added_session_s*)g_malloc(sizeof(asp_added_session_s)); - memcpy(p_dup_msg, p_msg, sizeof(asp_added_session_s)); - return (gpointer)p_dup_msg; -} - -gpointer _asp_session_dup_rejected_session(gpointer p_msg) -{ - asp_rejected_session_s* p_dup_msg = (asp_rejected_session_s*)g_malloc(sizeof(asp_rejected_session_s)); - memcpy(p_dup_msg, p_msg, sizeof(asp_rejected_session_s)); - return (gpointer)p_dup_msg; -} - -gpointer _asp_session_dup_remove_session(gpointer p_msg) -{ - asp_remove_session_s* p_dup_msg = (asp_remove_session_s*)g_malloc(sizeof(asp_remove_session_s)); - memcpy(p_dup_msg, p_msg, sizeof(asp_remove_session_s)); - return (gpointer)p_dup_msg; -} - -gpointer _asp_session_dup_deferred_session(gpointer p_msg) -{ - asp_deferred_session_s* p_dup_msg = (asp_deferred_session_s*)g_malloc(sizeof(asp_deferred_session_s)); - memcpy(p_dup_msg, p_msg, sizeof(asp_deferred_session_s)); - return (gpointer)p_dup_msg; -} -*/ - -gpointer _asp_session_dup_allowed_session(gpointer p_msg) -{ - INFO_MSG; - - asp_allowed_port_s *p_dup_msg = (asp_allowed_port_s *)g_malloc(sizeof( - asp_allowed_port_s)); - memcpy(p_dup_msg, p_msg, sizeof(asp_allowed_port_s)); - 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_s *session = _get_exist_session(session_id, session_mac); - g_assert(session); - - gfsm_state_id_t current_state = gfsm_get_current_state_id(session->context); - ASP_LOGD("%s _get_session_state() current session_state : %d", ROLE, current_state); - switch (current_state) { - case SESSION_STATE_NONE: - case SESSION_STATE_CLOSED: - case SESSION_STATE_RUNNING: - ret = ASP_SESSION_STATE_CLOSED; - break; - case SESSION_STATE_REQUEST_SESSION_SENT: - case SESSION_STATE_SESSION_REQUEST_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_SESSION_REQUEST_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_s *_new_session_by_request_session(GSocketAddress *sock_addr, - const gchar *peer_ip, gpointer p_msg) -{ - INFO_MSG; - - asp_session_s *session = NULL; - asp_request_session_s *p_req_session = (asp_request_session_s *)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_s *_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_s *session = NULL; - - session = (asp_session_s *)g_malloc0(sizeof(asp_session_s)); - - 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 = (GSocketAddress *) g_object_ref(sock_addr); - /*session->sock_family = G_SOCKET_FAMILY_IPV4; // temporary */ - session->over_p2p = FALSE; - - g_strlcpy(session->additional_info, SESSION_STATUS_ADDITIONAL_INFO_CO, - SESSION_STATUS_ADDITIONAL_INFO_LEN); - - session->context = gfsm_create_context(session_fsm, - _asp_session_destroy_session, session); - - _insert_session(session); - - return session; -} - -asp_session_s *_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_s *session = NULL; - - session = (asp_session_s *)g_malloc0(sizeof(asp_session_s)); - - 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, - /*session->sock_family = G_SOCKET_FAMILY_IPV4; // temporary */ - session->over_p2p = TRUE; - g_strlcpy(session->additional_info, SESSION_STATUS_ADDITIONAL_INFO_PD, - SESSION_STATUS_ADDITIONAL_INFO_LEN); - - session->context = gfsm_create_context(session_fsm, - _asp_session_destroy_session, session); - - _insert_session(session); - - return session; -} - -asp_session_s *_new_session_from_session_request(const guint8 *session_mac, - guint32 session_id, guint32 advertisement_id) -{ - INFO_MSG; - - asp_session_s *session = NULL; - - session = (asp_session_s *)g_malloc0(sizeof(asp_session_s)); - - 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; - - g_strlcpy(session->additional_info, SESSION_STATUS_ADDITIONAL_INFO_PD, - SESSION_STATUS_ADDITIONAL_INFO_LEN); - - session->context = gfsm_create_context(session_fsm, - _asp_session_destroy_session, session); - - _insert_session(session); - - return session; -} - -void _store_peer_ip_addr(asp_session_s *session, char *peer_ip, size_t length) -{ - INFO_MSG; - g_strlcpy(session->peer_ip, peer_ip, length); - session->sock_addr = g_inet_socket_address_new_from_string(peer_ip, - (guint) g_asp_cordination_port); - - if (session->sock_addr == NULL) - ASP_LOGD("Failed to create socket IP %s", peer_ip); - else - ASP_LOGD("Succeeded to create socket IP %s", peer_ip); - -} - -#ifdef HAVE_ASP_P2P_CONN -guint8 *_get_peer_mac(asp_session_s *session) -{ - if (session->asp_role == ASP_ROLE_ADVERTIZER) - return session->session_mac; - else - return session->service_mac; -} -#endif - -void _asp_session_destroy_session(void *p_context_data) -{ - INFO_MSG; - - asp_session_s *session = (asp_session_s *)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_s *_get_exist_session(guint32 session_id, const guint8 *session_mac) -{ - asp_session_s *session = NULL; - - session = (asp_session_s *)g_tree_lookup(sessionTree, - _get_session_key(session_id, session_mac)); - - return session; -} - -asp_session_key_s *_get_session_key(guint32 session_id, - const guint8 *session_mac) -{ - asp_session_key_s *key = (asp_session_key_s *)g_malloc(sizeof( - asp_session_key_s)); - key->session_id = session_id; - memcpy(key->session_mac, session_mac, MAC_ADDRESS_LEN); /* 6 bytes */ - - return key; -} - -void _insert_session(asp_session_s *session) -{ - /* add a new session to hash table ( key - session_id, value - asp_session_s*) */ - 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) -{ - GInetSocketAddress *inetaddr; - GInetAddress *hostaddr; - gchar *ip_str = NULL; - - inetaddr = G_INET_SOCKET_ADDRESS(sock_addr); - hostaddr = g_inet_socket_address_get_address(inetaddr); - - ip_str = g_inet_address_to_string(hostaddr); - g_strlcpy(peer_ip, ip_str, ASP_SESSION_IPV4_STR_LEN); - - ASP_LOGD("%s peer_ip: %s", ROLE, peer_ip); - g_free(ip_str); - - /*g_object_unref(hostaddr); */ - /*g_object_unref(inetaddr); */ -} - -/***************************************************************************** - * Local Function for state machine - *****************************************************************************/ - -const char *_asp_session_fsm_get_state_name_cb(gfsm_state_id_t state_id) -{ - const char *ret_val = NULL; - - switch (state_id) { - case SESSION_STATE_NONE: - ret_val = "SESSION_STATE_NONE"; - break; - case SESSION_STATE_CLOSED: - ret_val = "SESSION_STATE_CLOSED"; - break; - case SESSION_STATE_RUNNING: - ret_val = "SESSION_STATE_RUNNING"; - break; - case SESSION_STATE_L2CONNECTING: - ret_val = "SESSION_STATE_L2CONNECTING"; - break; - case SESSION_STATE_SESSION_REQUEST_SENT: - ret_val = "SESSION_STATE_SESSION_REQUEST_SENT"; - break; - case SESSION_STATE_SESSION_REQUEST_RECEIVED: - ret_val = "SESSION_STATE_SESSION_REQUEST_RECEIVED"; - break; - case SESSION_STATE_SESSION_REQUEST_DEFERED: - ret_val = "SESSION_STATE_SESSION_REQUEST_DEFERED"; - break; - case SESSION_STATE_SESSION_REQUEST_ACCEPTED: - ret_val = "SESSION_STATE_SESSION_REQUEST_ACCEPTED"; - break; - case SESSION_STATE_ENTERING_PIN: - ret_val = "SESSION_STATE_ENTERING_PIN"; - break; - case SESSION_STATE_GROUP_FORMATION_COMPLETED: - ret_val = "SESSION_STATE_GROUP_FORMATION_COMPLETED"; - break; - case SESSION_STATE_L2CONNECTED: - ret_val = "SESSION_STATE_L2CONNECTED"; - break; - case SESSION_STATE_REQUEST_SESSION_SENT: - ret_val = "SESSION_STATE_REQUEST_SESSION_SENT"; - break; - case SESSION_STATE_OPEN: - ret_val = "SESSION_STATE_OPEN"; - break; - case SESSION_STATE_REQUEST_SESSION_RECEIVED: - ret_val = "SESSION_STATE_REQUEST_SESSION_RECEIVED"; - break; - case SESSION_STATE_REJECT_SESSION_SENT: - ret_val = "SESSION_STATE_REJECT_SESSION_SENT"; - break; - case SESSION_STATE_REMOVE_SESSION_SENT: - ret_val = "SESSION_STATE_REMOVE_SESSION_SENT"; - break; - default: - ret_val = "SESSION_STATE_MAX"; - break; - } - - return ret_val; -} - -const char *_asp_session_gfsm_get_event_name_cb(gfsm_event_id_t event_id) -{ - const char *ret_val = NULL; - - switch (event_id) { - case SESSION_EVENT_BOUND_PORT_CALLED: - ret_val = "SESSION_EVENT_BOUND_PORT_CALLED"; - break; - case SESSION_EVENT_CLOSE_SESSION_CALLED: - ret_val = "SESSION_EVENT_CLOSE_SESSION_CALLED"; - break; - case SESSION_EVENT_CONNECT_SESSION_CALLED: - ret_val = "SESSION_EVENT_CONNECT_SESSION_CALLED"; - break; - case SESSION_EVENT_CONFIRM_SESSION_CALLED: - ret_val = "SESSION_EVENT_CONFIRM_SESSION_CALLED"; - break; - case SESSION_EVENT_DEFER_SESSION_CALLED: - ret_val = "SESSION_EVENT_DEFER_SESSION_CALLED"; - break; - case SESSION_EVENT_SET_SESSION_READY_CALLED: - ret_val = "SESSION_EVENT_SET_SESSION_READY_CALLED"; - break; - case SESSION_EVENT_SESSION_REQUEST_CALLED: - ret_val = "SESSION_EVENT_SESSION_REQUEST_CALLED"; - break; - case SESSION_EVENT_SESSION_CONFIG_REQUEST_CALLED: - ret_val = "SESSION_EVENT_SESSION_CONFIG_REQUEST_CALLED"; - break; - case SESSION_EVENT_CONNECT_STATUS_CALLED: - ret_val = "SESSION_EVENT_CONNECT_STATUS_CALLED"; - break; - case SESSION_EVENT_IP_ASSIGNED: - ret_val = "SESSION_EVENT_IP_ASSIGNED"; - break; - case SESSION_EVENT_REMOVE_SESSION_RECEIVED: - ret_val = "SESSION_EVENT_REMOVE_SESSION_RECEIVED"; - break; - case SESSION_EVENT_ALLOWED_PORT_RECEIVED: - ret_val = "SESSION_EVENT_ALLOWED_PORT_RECEIVED"; - break; - case SESSION_EVENT_DEFERRED_SESSION_RECEIVED: - ret_val = "SESSION_EVENT_DEFERRED_SESSION_RECEIVED"; - break; - case SESSION_EVENT_REJECTED_SESSION_RECEIVED: - ret_val = "SESSION_EVENT_REJECTED_SESSION_RECEIVED"; - break; - case SESSION_EVENT_ADDED_SESSION_RECEIVED: - ret_val = "SESSION_EVENT_ADDED_SESSION_RECEIVED"; - break; - case SESSION_EVENT_REQUEST_SESSION_RECEIVED: - ret_val = "SESSION_EVENT_REQUEST_SESSION_RECEIVED"; - break; - case SESSION_EVENT_ACK_RECEIVED: - ret_val = "SESSION_EVENT_ACK_RECEIVED"; - break; - case SESSION_EVENT_NACK_RECEIVED: - ret_val = "SESSION_EVENT_NACK_RECEIVED"; - break; - case SESSION_EVENT_PEER_DESTROYED: - ret_val = "SESSION_EVENT_PEER_DESTROYED"; - break; - case SESSION_EVENT_TIMEOUT: - ret_val = "SESSION_EVENT_TIMEOUT"; - break; - case SESSION_EVENT_DELETE_SESSION: - ret_val = "SESSION_EVENT_DELETE_SESSION"; - break; - default: - ret_val = "SESSION_EVENT_MAX"; - break; - } - - return ret_val; -} - -int _asp_session_fsm_log_func(const char *format, ...) -{ - gchar buffer[256]; - va_list args; - va_start(args, format); - g_vsnprintf(buffer, 255, format, args); - va_end(args); - - ASP_LOGD("%s", buffer); - - return 0; -} - - -void _asp_session_fsm_init() -{ - INFO_MSG; - - session_fsm = gfsm_create_fsm(SESSION_STATE_MAX, SESSION_EVENT_MAX, - SESSION_STATE_NONE); - - session_state_none = gfsm_create_state(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); - - session_state_closed = gfsm_create_state(SESSION_STATE_CLOSED, session_fsm, - _state_closed_entry_action, _state_closed_exit_action); - gfsm_add_reaction(session_state_closed, SESSION_EVENT_DELETE_SESSION, - _state_closed_reaction_delete_session); - /*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); // ???? */ - - session_state_running = gfsm_create_state(SESSION_STATE_RUNNING, session_fsm, - _state_running_entry_action, _state_running_exit_action); - - session_state_l2connecting = gfsm_create_state(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); - - session_state_session_request_sent = gfsm_create_state( - 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); - - session_state_session_request_defered = gfsm_create_state( - 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); - - session_state_session_request_received = gfsm_create_state( - 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); - - session_state_session_request_accepted = gfsm_create_state( - 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_add_reaction(session_state_session_request_accepted, - SESSION_EVENT_SET_SESSION_READY_CALLED, - _state_session_request_accepted_reaction_set_session_ready_called); - - session_state_entering_pin = gfsm_create_state(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); - - session_state_group_formation_completed = gfsm_create_state( - 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_add_reaction(session_state_group_formation_completed, - SESSION_EVENT_SET_SESSION_READY_CALLED, - _state_group_formation_completed_reaction_set_session_ready_called); - - session_state_l2connected = gfsm_create_state(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); - - session_state_request_session_sent = gfsm_create_state( - 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); - - session_state_request_session_received = gfsm_create_state( - 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); - - session_state_open = gfsm_create_state(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); - - session_state_reject_session_sent = gfsm_create_state( - 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); - - session_state_remove_session_sent = gfsm_create_state( - 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_reaction(session_state_remove_session_sent, SESSION_EVENT_PEER_DESTROYED, - _state_remove_session_sent_reaction_peer_destroyed); - - 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); - - gfsm_set_logger(session_fsm, _asp_session_fsm_log_func, - ASP_SESSION_HEADER, - _asp_session_fsm_get_state_name_cb, - _asp_session_gfsm_get_event_name_cb); -} - -void _asp_session_fsm_terminate() -{ - gfsm_destroy_state(session_state_none); - gfsm_destroy_state(session_state_closed); - gfsm_destroy_state(session_state_running); - gfsm_destroy_state(session_state_request_session_sent); - gfsm_destroy_state(session_state_request_session_received); - gfsm_destroy_state(session_state_open); - gfsm_destroy_state(session_state_reject_session_sent); - gfsm_destroy_state(session_state_remove_session_sent); - - gfsm_destroy_fsm(session_fsm); -} - -void _state_none_entry_action(void *p_context_data) -{ - INFO_MSG; -} - -void _state_none_exit_action(void *p_context_data) -{ -} - -gfsm_state_id_t _state_none_reaction_request_session_received( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - asp_session_s *session = (asp_session_s *)p_context_data; - asp_request_session_s *p_msg = (asp_request_session_s *)p_event_data; - - if (!session->over_p2p) - _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( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - - asp_session_s *session = (asp_session_s *)p_context_data; - connect_session_param_s *p_connect_session = (connect_session_param_s *) - 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( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - - asp_session_s *session = (asp_session_s *)p_context_data; - session_request_param_s *p_session_request = (session_request_param_s *) - 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(void *p_context_data) -{ - INFO_MSG; - - asp_session_s *session = (asp_session_s *)p_context_data; - - g_assert(session); - - _call_session_status_cb(0, session->session_mac, session->session_id, - session->closed_state); - - asp_sess_peer_del_session(session->sock_addr, session->session_mac, - session->session_id); - - gfsm_process_event(&(session->context), - gfsm_create_event(SESSION_EVENT_DELETE_SESSION, NULL, NULL)); -} - -void _state_closed_exit_action(void *p_context_data) -{ -} - -gfsm_state_id_t _state_closed_reaction_delete_session(void *p_context_data, - void *p_event_data) -{ - INFO_MSG; - - asp_session_s *session = (asp_session_s *)p_context_data; - - g_assert(session); - - ASP_LOGD("context[%p]", session->context); - gfsm_destroy_context(session->context); - - return GFSM_DISCARD_EVENT; -} - -#if 0 -gfsm_state_id_t _state_closed_reaction_connect_session_called( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - - /*asp_session_s* session = (asp_session_s*)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( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - - return SESSION_STATE_REQUEST_SESSION_RECEIVED; -} -#endif - -void _state_running_entry_action(void *p_context_data) -{ - INFO_MSG; -} - -void _state_running_exit_action(void *p_context_data) -{ -} - -void _state_l2connecting_entry_action(void *p_context_data) -{ - INFO_MSG; -} - -void _state_l2connecting_exit_action(void *p_context_data) -{ -} - -gfsm_state_id_t _state_l2connecting_reaction_close_session_called( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - - asp_session_s *session = (asp_session_s *)p_context_data; - -#ifdef HAVE_ASP_P2P_CONN - asp_p2p_conn_disconnect_p2p(_get_peer_mac(session)); -#endif - - session->closed_state = - ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE; /* temporary value. shall be changed */ - - return SESSION_STATE_CLOSED; -} - -gfsm_state_id_t _state_l2connecting_reaction_timeout(void *p_context_data, - void *p_event_data) -{ - INFO_MSG; - - asp_session_s *session = (asp_session_s *)p_context_data; -#ifdef HAVE_ASP_P2P_CONN - - asp_p2p_conn_disconnect_p2p(_get_peer_mac(session)); -#endif - - session->closed_state = ASP_SESSION_CLOSED_STATE_DISASSOCIATED; - - return SESSION_STATE_CLOSED; -} - -void _state_session_request_sent_entry_action(void *p_context_data) -{ - INFO_MSG; - - asp_session_s* session = (asp_session_s*)p_context_data; - /*_start_timer(...); */ - _call_session_status_cb(0, session->session_mac, session->session_id, - ASP_SESSION_CLOSED_STATE_NONE); -} - -void _state_session_request_sent_exit_action(void *p_context_data) -{ - /*_stop_timer(...); */ -} - -gfsm_state_id_t _state_session_request_sent_reaction_connect_status_called( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - - connect_status_param_s *p_connect_status = (connect_status_param_s *) - p_event_data; - asp_session_s *session = (asp_session_s *)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: - /* need to assign a proper closed_state "session->closed_state = ???; */ - return SESSION_STATE_CLOSED; - break; - case ASP_SESSION_CONNECT_STATUS_NO_MORE_CONNECTION: - /* need to assign a proper closed_state "session->closed_state = ???; */ - 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: - /* need to assign a proper closed_state "session->closed_state = ???; */ - 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( - void *p_context_data, void *p_event_data) -{ - asp_session_s *session = (asp_session_s *)p_context_data; - session_config_request_param_s *p_config_request_param = - (session_config_request_param_s *)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(void *p_context_data) -{ - INFO_MSG; - /*_start_timer(...); */ -} - -void _state_session_request_defered_exit_action(void *p_context_data) -{ - /*_stop_timer(...); */ -} - -gfsm_state_id_t _state_session_request_defered_reaction_connect_status_called( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - - connect_status_param_s *p_connect_status = (connect_status_param_s *) - p_event_data; - asp_session_s *session = (asp_session_s *)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: - /* need to assign a proper closed_state "session->closed_state = ???; */ - return SESSION_STATE_CLOSED; - break; - case ASP_SESSION_CONNECT_STATUS_NO_MORE_CONNECTION: - /* need to assign a proper closed_state "session->closed_state = ???; */ - 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: - /* need to assign a proper closed_state "session->closed_state = ???; */ - 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( - void *p_context_data, void *p_event_data) -{ - asp_session_s *session = (asp_session_s *)p_context_data; - session_config_request_param_s *p_config_request_param = - (session_config_request_param_s *)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(void *p_context_data) -{ - INFO_MSG; - - asp_session_s* session = (asp_session_s*)p_context_data; - - /*_start_timer(..); */ - _call_session_status_cb(0, session->session_mac, session->session_id, - ASP_SESSION_CLOSED_STATE_NONE); -} - -void _state_session_request_received_exit_action(void *p_context_data) -{ - /*_stop_timer(..); */ -} - -gfsm_state_id_t _state_session_request_received_reaction_confirm_session_called( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - -#ifdef HAVE_ASP_P2P_CONN - asp_session_s *session = (asp_session_s *)p_context_data; -#endif - confirm_session_param_s *p_confirm_session = (confirm_session_param_s *) - 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 { - /* need to assign a proper closed_state "session->closed_state = ???; */ - return SESSION_STATE_CLOSED; - } -} - -void _state_session_request_accepted_entry_action(void *p_context_data) -{ - INFO_MSG; - /*_start_timer(...) */ -} - -void _state_session_request_accepted_exit_action(void *p_context_data) -{ - /*_stop_timer(...) */ -} - -gfsm_state_id_t -_state_session_request_accepted_reaction_connect_status_received( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - - connect_status_param_s *p_connect_status = (connect_status_param_s *) - p_event_data; - asp_session_s *session = (asp_session_s *)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: - /* need to assign a proper closed_state "session->closed_state = ???; */ - return SESSION_STATE_CLOSED; - break; - case ASP_SESSION_CONNECT_STATUS_NO_MORE_CONNECTION: - /* need to assign a proper closed_state "session->closed_state = ???; */ - return SESSION_STATE_CLOSED; - break; - case ASP_SESSION_CONNECT_STATUS_SESSION_REQUEST_FAILED: - /* need to assign a proper closed_state "session->closed_state = ???; */ - 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: - /* need to assign a proper closed_state "session->closed_state = ???; */ - 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( - void *p_context_data, void *p_event_data) -{ - asp_session_s *session = (asp_session_s *)p_context_data; - session_config_request_param_s *p_config_request_param = - (session_config_request_param_s *)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; -} - -gfsm_state_id_t -_state_session_request_accepted_reaction_set_session_ready_called( - void *p_context_data, void *p_event_data) -{ - return GFSM_DEFER_EVENT; -} - -void _state_entering_pin_entry_action(void *p_context_data) -{ - /*start_timer */ -} - -void _state_entering_pin_exit_action(void *p_context_data) -{ - /*stop_timer */ -} - -gfsm_state_id_t _state_entering_pin_reaction_confirm_session_called( - void *p_context_data, void *p_event_data) -{ -#ifdef HAVE_ASP_P2P_CONN - asp_session_s *session = (asp_session_s *)p_context_data; -#endif - confirm_session_param_s *p_confirm_session = (confirm_session_param_s *) - 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 { - /* need to assign a proper closed_state "session->closed_state = ???; */ - return SESSION_STATE_CLOSED; - } -} - -void _state_group_formation_completed_entry_action(void *p_context_data) -{ - /*_start_timer(...); */ - INFO_MSG; -} - -void _state_group_formation_completed_exit_action(void *p_context_data) -{ - /*_stop_timer(...); */ -} - -gfsm_state_id_t _state_group_formation_completed_reaction_ip_assigned( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - gfsm_state_id_t ret_state = GFSM_DISCARD_EVENT; - - asp_session_s *session = (asp_session_s *)p_context_data; - g_assert(session); - - ip_assigned_param_s *p_ip_assigned_param = (ip_assigned_param_s *)p_event_data; - g_assert(p_ip_assigned_param); - - ASP_LOGD("peer IP %s", p_ip_assigned_param->peer_ip_addr); - _store_peer_ip_addr(session, p_ip_assigned_param->peer_ip_addr, - p_ip_assigned_param->length); - if (session->asp_role == ASP_ROLE_SEEKER) - ret_state = SESSION_STATE_REQUEST_SESSION_SENT; - else - ret_state = SESSION_STATE_REQUEST_SESSION_RECEIVED; - - return ret_state; -} - -gfsm_state_id_t -_state_group_formation_completed_reaction_request_session_received( - void *p_context_data, void *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; -} - -gfsm_state_id_t -_state_group_formation_completed_reaction_set_session_ready_called( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - return GFSM_DEFER_EVENT; -} - -void _state_l2connected_entry_action(void *p_context_data) -{ - INFO_MSG; - - asp_session_s *session = (asp_session_s *)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(void *p_context_data) -{ -} - -gfsm_state_id_t _state_l2connected_reaction_close_session_called( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - - guint8 *close_reason = (guint8 *) p_event_data; - asp_session_s *session = (asp_session_s *)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( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - - /*guint8 remove_reason = *((guint8*)p_event_data); */ - asp_session_s *session = (asp_session_s *)p_context_data; - session->closed_state = ASP_SESSION_CLOSED_STATE_REMOTE_CLOSE; - - return SESSION_STATE_CLOSED; -} - -gfsm_state_id_t _state_l2connected_reaction_peer_destroyed(void *p_context_data, - void *p_event_data) -{ - INFO_MSG; - - return SESSION_STATE_CLOSED; -} - -void _state_request_session_sent_entry_action(void *p_context_data) -{ - INFO_MSG; - - asp_session_s *session = (asp_session_s *)p_context_data; - - if (!session->over_p2p) - _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(void *p_context_data) -{ -} - -gfsm_state_id_t _state_request_session_sent_reaction_added_session_received( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - - return SESSION_STATE_OPEN; -} - -gfsm_state_id_t _state_request_session_sent_reaction_deferred_session_received( - void *p_context_data, void *p_event_data) -{ - - INFO_MSG; - - asp_session_s *session = (asp_session_s *)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( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - - asp_session_s *session = (asp_session_s *)p_context_data; - session->closed_state = ASP_SESSION_CLOSED_STATE_REMOTE_CLOSE; - - return SESSION_STATE_CLOSED; -} - -gfsm_state_id_t _state_request_session_sent_reaction_timeout( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - - guint8 *remove_reason = (guint8 *) p_event_data; - asp_session_s *session = (asp_session_s *)p_context_data; - - _send_remove_session(session, *remove_reason); - - return SESSION_STATE_REMOVE_SESSION_SENT; -} - -void _state_request_session_received_entry_action(void *p_context_data) -{ - INFO_MSG; - - asp_session_s *session = (asp_session_s *)p_context_data; - g_assert(session); - if (session->over_p2p && session->confirmed && - session->asp_role == ASP_ROLE_ADVERTIZER) { - /* TODO: Set Session should done after this event */ - } else { - /* 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(void *p_context_data) -{ -} - -gfsm_state_id_t -_state_request_session_received_reaction_set_session_ready_called( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - - asp_session_s *session = (asp_session_s *)p_context_data; - - _send_added_session(session); - - return SESSION_STATE_OPEN; -} - -gfsm_state_id_t _state_request_session_received_reaction_defer_session_called( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - - defer_session_param_s *defer_session_param = (defer_session_param_s *) - p_event_data; - asp_session_s *session = (asp_session_s *)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( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - - asp_session_s *session = (asp_session_s *)p_context_data; - confirm_session_param_s *p_confirmed_param = (confirm_session_param_s *) - 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(void *p_context_data) -{ - INFO_MSG; - - asp_session_s *session = (asp_session_s *)p_context_data; - _call_session_status_cb(0, session->session_mac, session->session_id, - ASP_SESSION_CLOSED_STATE_NONE); -} - -void _state_open_exit_action(void *p_context_data) -{ -} - -gfsm_state_id_t _state_open_reaction_bound_port_called(void *p_context_data, - void *p_event_data) -{ - INFO_MSG; - - bound_port_param_s *bound_port_param = (bound_port_param_s *)p_event_data; - asp_session_s *session = (asp_session_s *)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(void *p_context_data, - void *p_event_data) -{ - INFO_MSG; - - asp_allowed_port_s *p_allowed_port = (asp_allowed_port_s *)p_event_data; - - asp_session_s *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(void *p_context_data) -{ - INFO_MSG; - - /* asp_session_s* session = (asp_session_s*)p_context_data; */ -} - -void _state_reject_session_sent_exit_action(void *p_context_data) -{ -} - -gfsm_state_id_t _state_reject_session_sent_reaction_ack_received( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - - asp_session_s *session = (asp_session_s *)p_context_data; - session->closed_state = ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE; - - return SESSION_STATE_CLOSED; -} - -gfsm_state_id_t _state_reject_session_sent_reaction_nack_received( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - - asp_session_s *session = (asp_session_s *)p_context_data; - session->closed_state = ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE; - - return SESSION_STATE_CLOSED; -} - -void _state_remove_session_sent_entry_action(void *p_context_data) -{ - INFO_MSG; - - /*asp_session_s* session = (asp_session_s*)p_context_data; */ -} - -void _state_remove_session_sent_exit_action(void *p_context_data) -{ -} - -gfsm_state_id_t _state_remove_session_sent_reaction_ack_received( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - - asp_session_s *session = (asp_session_s *)p_context_data; - session->closed_state = ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE; - - return SESSION_STATE_CLOSED; -} - -gfsm_state_id_t _state_remove_session_sent_reaction_nack_received( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - - asp_session_s *session = (asp_session_s *)p_context_data; - session->closed_state = ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE; - - return SESSION_STATE_CLOSED; -} - -static gfsm_state_id_t _state_remove_session_sent_reaction_peer_destroyed( - void *p_context_data, void *p_event_data) -{ - INFO_MSG; - - asp_session_s *session = (asp_session_s *)p_context_data; - session->closed_state = ASP_SESSION_CLOSED_STATE_LOCAL_CLOSE; - - return SESSION_STATE_CLOSED; -} diff --git a/src/session/gfsm.c b/src/session/gfsm.c deleted file mode 100644 index 04578af..0000000 --- a/src/session/gfsm.c +++ /dev/null @@ -1,596 +0,0 @@ -/*finite state machine - * - * Copyright (c) 2011 - 2013 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Hojeen Jee , Jaejun Sim , - * Jinho Ha - * - * 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. - * - */ - -#include -#include -#include -#include -#include -#include "gfsm.h" -#include "asp-manager-util.h" - - -typedef struct gfsm_event_queue { - gfsm_event_s *p_head; - gfsm_event_s *p_tail; -} gfsm_event_queue_s; - -struct gfsm_event { - struct gfsm_event *p_next; - gfsm_event_id_t event_id; - void *p_event_data; - gfsm_event_data_destructor_cb destructor; -}; - -struct gfsm_state { - gfsm_state_id_t state_id; - gfsm_s *p_fsm; - gfsm_state_s *p_parent_state; - gfsm_state_s *p_internal_init_state; - gfsm_entry_action_cb entry_action_cb; - gfsm_exit_action_cb exit_action_cb; - gfsm_reaction_cb *reaction_table; -}; - -struct gfsm { - gfsm_state_s **pp_state_table; - gfsm_state_id_t max_state; - gfsm_event_id_t max_event; - gfsm_state_id_t init_state_id; - gfsm_log_func log_func; - gfsm_get_state_name_cb state_name_cb; - gfsm_get_event_name_cb event_name_cb; - char *p_header; -}; - -struct gfsm_context { - gfsm_s *p_fsm; - gfsm_state_id_t current_state_id; - gfsm_event_queue_s event_queue; - gfsm_event_queue_s defer_event_queue; - unsigned char processing_event; /*true or false; */ - unsigned char terminating; /*true or false; */ - gfsm_context_termination_notifier_cb termination_notifier_cb; - void *p_context_data; -}; - -static void _gfsm_process_event(gfsm_context_s *p_context, - gfsm_event_s *p_event); -static void gfsm_process_transition(gfsm_context_s *p_context, - gfsm_state_id_t next_state_id); -static void gfsm_do_exit_action(gfsm_state_s *p_current_state, - gfsm_state_s *p_common_ancesstor, gfsm_context_s *p_context); -static void gfsm_do_entry_action(gfsm_state_s *p_common_ancesstor, - gfsm_state_s *p_next_state, gfsm_context_s *p_context); -static void gfsm_reenqueue_deferred_event(gfsm_context_s *p_context); -static void gfsm_init_event_queue(gfsm_event_queue_s *p_queue); -static void gfsm_destroy_event_queue(gfsm_event_queue_s *p_queue); -static void gfsm_enqueue_event(gfsm_event_queue_s *p_queue, - gfsm_event_s *p_event); -static gfsm_event_s *gfsm_dequeue_event(gfsm_event_queue_s *p_queue); -static gfsm_state_s *gfsm_find_last_child_state(gfsm_state_s *p_state); -static gfsm_state_s *gfsm_find_common_ancesstor_state(gfsm_state_s *p_state_1, - gfsm_state_s *p_state_2); - -gfsm_s *gfsm_create_fsm(gfsm_state_id_t max_state, gfsm_event_id_t max_event, - gfsm_state_id_t init_state) -{ - gfsm_s *p_fsm = (gfsm_s *)malloc(sizeof(gfsm_s)); - - assert(p_fsm); - assert(init_state < max_state); - - size_t state_table_size = sizeof(gfsm_state_s *) * max_state; - - p_fsm->pp_state_table = (gfsm_state_s **) 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; - - p_fsm->log_func = NULL; - p_fsm->state_name_cb = NULL; - p_fsm->event_name_cb = NULL; - p_fsm->p_header = NULL; - - return p_fsm; -} - -void gfsm_destroy_fsm(gfsm_s *p_fsm) -{ - assert(p_fsm); - assert(p_fsm->pp_state_table); - - free(p_fsm->pp_state_table); - if (p_fsm->p_header) - free(p_fsm->p_header); - free(p_fsm); -} - -gfsm_state_s *gfsm_create_state(gfsm_state_id_t state_id, gfsm_s *p_fsm, - gfsm_entry_action_cb entry_action, gfsm_exit_action_cb exit_action) -{ - size_t event_table_size; - gfsm_state_s *p_state = (gfsm_state_s *)malloc(sizeof(gfsm_state_s)); - - 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 = (gfsm_reaction_cb *) malloc(event_table_size); - - assert(p_state->reaction_table); - - memset(p_state->reaction_table, 0, event_table_size); - - return p_state; -} - -void gfsm_destroy_state(gfsm_state_s *p_state) -{ - assert(p_state); - assert(p_state->reaction_table); - - free(p_state->reaction_table); - free(p_state); -} - -gfsm_context_s *gfsm_create_context(gfsm_s *p_fsm, - gfsm_context_termination_notifier_cb termination_notifier_cb, - void *p_context_data) -{ - gfsm_state_s *p_next_state; - gfsm_context_s *p_context = (gfsm_context_s *)malloc(sizeof(gfsm_context_s)); - - assert(p_fsm); - assert(p_context); - - 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_cb = termination_notifier_cb; - - 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_s *p_context) -{ - assert(p_context); - return p_context->current_state_id; -} - -void gfsm_destroy_context(gfsm_context_s *p_context) -{ - gfsm_state_s *p_current_state; - - if (p_context->processing_event) { - if (p_context->p_fsm->log_func) - p_context->p_fsm->log_func("[%s] destroy_context is scheduled\n", - p_context->p_fsm->p_header); - - p_context->terminating = 1; - return; - } - - ASP_LOGD("context[%p]", p_context); - 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_cb) - p_context->termination_notifier_cb(p_context->p_context_data); - - if (p_context->p_fsm->log_func) - p_context->p_fsm->log_func("[%s] context is destroyed\n", - p_context->p_fsm->p_header); - - free(p_context); -} - -void gfsm_add_reaction(gfsm_state_s *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_s *p_state, gfsm_state_s *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_s* p_state, gfsm_state_s* 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_s *p_fsm, gfsm_state_s *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_s *gfsm_create_event(gfsm_event_id_t event_id, void *p_event_data, - gfsm_event_data_destructor_cb destructor) -{ - gfsm_event_s *p_event = (gfsm_event_s *)malloc(sizeof(gfsm_event_s)); - - 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_s *gfsm_get_fsm_of_state(gfsm_state_s *p_state) -{ - assert(p_state); - return p_state->p_fsm; -} - -gfsm_s *gfsm_get_fsm_of_context(gfsm_context_s *p_context) -{ - assert(p_context); - return p_context->p_fsm; -} - -void gfsm_process_event(gfsm_context_s **pp_context, gfsm_event_s *p_event) -{ - gfsm_context_s *p_context = *pp_context; - gfsm_s *p_fsm; - - ASP_LOGD("process event"); - if (p_context == NULL) - ASP_LOGD("context is NULL"); - 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 */ - if (p_fsm->log_func) - p_fsm->log_func("[%s] event(%s) is posted\n", p_fsm->p_header, - p_fsm->event_name_cb(p_event->event_id)); - - 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) { - if (p_fsm->log_func) - p_fsm->log_func("[%s] destroy_context was scheduled\n", p_fsm->p_header); - - ASP_LOGD("context[%p]", p_context); - gfsm_destroy_context(p_context); - } -} - -void _gfsm_process_event(gfsm_context_s *p_context, gfsm_event_s *p_event) -{ - gfsm_s *p_fsm; - gfsm_state_s *p_state; - gfsm_state_id_t next_state_id = GFSM_DISCARD_EVENT; - gfsm_event_id_t event_id; - - ASP_LOGD("inner process event"); - assert(p_context && p_event); - - event_id = p_event->event_id; - p_fsm = p_context->p_fsm; - - assert(p_context->current_state_id < p_fsm->max_state); - - if (p_fsm->log_func) - p_fsm->log_func("[%s] current state is (%s), event(%s) is received\n", - p_fsm->p_header, p_fsm->state_name_cb(p_context->current_state_id), - p_fsm->event_name_cb(event_id)); - - 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[event_id]) { - if (p_fsm->log_func) - p_fsm->log_func("[%s] state(%s)'s reaction is called for event(%s)\n", - p_fsm->p_header, p_fsm->state_name_cb(p_state->state_id), - p_fsm->event_name_cb(event_id)); - - next_state_id = p_state->reaction_table[event_id](p_context->p_context_data, - p_event->p_event_data); - break; - } - } - - if (GFSM_DEFER_EVENT == next_state_id) { - if (p_fsm->log_func) - p_fsm->log_func("[%s] event(%s) is defered\n", p_fsm->p_header, - p_fsm->event_name_cb(event_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) { - if (p_fsm->log_func) - p_fsm->log_func("[%s] state(%s) have no reaction for event(%s)\n", - p_fsm->p_header, p_fsm->state_name_cb(p_context->current_state_id), - p_fsm->event_name_cb(event_id)); - - return; - } - - if (GFSM_DISCARD_EVENT == next_state_id) { - if (p_fsm->log_func) - p_fsm->log_func("[%s] to stay in state(%s)\n", p_fsm->p_header, - p_fsm->state_name_cb(p_context->current_state_id)); - - return; - } - - gfsm_process_transition(p_context, next_state_id); -} - -void gfsm_process_transition(gfsm_context_s *p_context, - gfsm_state_id_t next_state_id) -{ - gfsm_state_s *p_next_state; - gfsm_state_s *p_current_state; - gfsm_state_s *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); - - if (p_context->p_fsm->log_func) - p_context->p_fsm->log_func("[%s] From (%s) to (%s)\n", - p_context->p_fsm->p_header, - p_context->p_fsm->state_name_cb(p_context->current_state_id), - p_context->p_fsm->state_name_cb(p_next_state->state_id)); - 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_s *p_current_state, - gfsm_state_s *p_common_ancesstor, gfsm_context_s *p_context) -{ - gfsm_state_s *p_state = p_current_state; - - while (p_state && p_state != p_common_ancesstor) { - if (p_state->exit_action_cb) - p_state->exit_action_cb(p_context->p_context_data); - - if (p_context->p_fsm->log_func) - p_context->p_fsm->log_func("[%s] exiting state(%s)\n", - p_context->p_fsm->p_header, p_context->p_fsm->state_name_cb(p_state->state_id)); - - p_state = p_state->p_parent_state; - } -} - -void gfsm_do_entry_action(gfsm_state_s *p_common_ancesstor, - gfsm_state_s *p_next_state, gfsm_context_s *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); - - if (p_context->p_fsm->log_func) - p_context->p_fsm->log_func("[%s] entering state(%s)\n", - p_context->p_fsm->p_header, - p_context->p_fsm->state_name_cb(p_next_state->state_id)); - - if (p_next_state->entry_action_cb) - p_next_state->entry_action_cb(p_context->p_context_data); -} - -void gfsm_reenqueue_deferred_event(gfsm_context_s *p_context) -{ - gfsm_event_s *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(void *p_context_data, void *p_event_data) -{ - return GFSM_DEFER_EVENT; -} - -void gfsm_init_event_queue(gfsm_event_queue_s *p_queue) -{ - assert(p_queue); - p_queue->p_head = p_queue->p_tail = NULL; -} - -void gfsm_destroy_event_queue(gfsm_event_queue_s *p_queue) -{ - gfsm_event_s *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_s *p_queue, gfsm_event_s *p_event) -{ - ASP_LOGD("enqueue"); - 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_s *gfsm_dequeue_event(gfsm_event_queue_s *p_queue) -{ - assert(p_queue); - - gfsm_event_s *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_s *gfsm_find_last_child_state(gfsm_state_s *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_s *gfsm_find_common_ancesstor_state(gfsm_state_s *p_state_l, - gfsm_state_s *p_state_r) -{ - gfsm_state_s *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; -} - -void gfsm_set_logger(gfsm_s *p_fsm, gfsm_log_func log_func, const char *header, - gfsm_get_state_name_cb state_name_cb, gfsm_get_event_name_cb event_name_cb) -{ - int header_len = 0; - - assert(p_fsm && log_func && header && state_name_cb && event_name_cb); - - if (header) - header_len = strlen(header); - - p_fsm->log_func = log_func; - p_fsm->state_name_cb = state_name_cb; - p_fsm->event_name_cb = event_name_cb; - p_fsm->p_header = (char *)malloc(header_len + 1); - strncpy(p_fsm->p_header, header, header_len + 1); -} diff --git a/src/session/gfsm.h b/src/session/gfsm.h deleted file mode 100644 index ab9d2b7..0000000 --- a/src/session/gfsm.h +++ /dev/null @@ -1,195 +0,0 @@ -/*finite state machine - * - * Copyright (c) 2011 - 2013 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Hojeen Jee , Jaejun Sim , - * Jinho Ha - * - * 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 _GFSM_ -#define _GFSM_ - -/***************************************************************************** - * constants and Typedefs - *****************************************************************************/ - -typedef unsigned int gfsm_state_id_t; -typedef unsigned int gfsm_event_id_t; - -typedef struct gfsm_event gfsm_event_s; -typedef struct gfsm_state gfsm_state_s; -typedef struct gfsm gfsm_s; -typedef struct gfsm_context gfsm_context_s; - -typedef void (*gfsm_entry_action_cb)(void *p_context_data); -typedef void (*gfsm_exit_action_cb)(void *p_context_data); -typedef gfsm_state_id_t(*gfsm_reaction_cb)(void *p_context_data, - void *p_event_data); -typedef void (*gfsm_event_data_destructor_cb)(void *p_event_data); -typedef void (*gfsm_context_termination_notifier_cb)(void *p_context_data); - -typedef const char *(*gfsm_get_state_name_cb)(gfsm_state_id_t state_id); -typedef const char *(*gfsm_get_event_name_cb)(gfsm_event_id_t event_id); -typedef int (*gfsm_log_func)(const char *format, ...); - -static const gfsm_state_id_t GFSM_DISCARD_EVENT = 0xFFFFFFFF; -static const gfsm_state_id_t GFSM_DEFER_EVENT = 0xFFFFFFFE; - -/** - * @brief This function creates a generic fsm object - * @param [in] max_state maximum num of state - * @param [in] max_event maximum num of event - * @param [in] init_state state id of initial state - * @return a pointer of gfsm object -*/ -gfsm_s *gfsm_create_fsm(gfsm_state_id_t max_state, gfsm_event_id_t max_event, - gfsm_state_id_t init_state); - -/** - * @brief This function destroys a generic fsm object - * @param [in] a pointer of gfsm object - * @return void -*/ -void gfsm_destroy_fsm(gfsm_s *p_fsm); - -/** - * @brief This function add a state on a gfsm object - * @param [in] p_fsm a pointer of a gfsm - * @param [in] p_state a pointer of a gfsm_state - * @return void -*/ -void gfsm_add_state(gfsm_s *p_fsm, gfsm_state_s *p_state); - -/** - * @brief This function create a state object - * @param [in] state_id state id of this state - * @param [in] p_fsm a pointer of gfsm - * @param [in] entry_action callback function that will be called when entering into this state. - * @param [in] exit_action callback function that will be called when exiting from this state. - * @return a pointer of state object -*/ -gfsm_state_s *gfsm_create_state(gfsm_state_id_t state_id, gfsm_s *p_fsm, - gfsm_entry_action_cb entry_action, gfsm_exit_action_cb exit_action); - -/** - * @brief This function destroys a state object - * @param [in] p_state a pointer of state object - * @return void -*/ -void gfsm_destroy_state(gfsm_state_s *p_state); - -/** - * @brief This function set parent state of this state - * @param [in] p_state a pointer of child state - * @param [in] p_parent_state a pointer of parent state - * @return void -*/ -void gfsm_set_parent_state(gfsm_state_s *p_state, gfsm_state_s *p_parent_state); - -/** - * @brief This function add reaction of event on a state - * @param [in] p_state a pointer of state - * @param [in] event_id ID of event that will be processed on this state - * @param [in] reacton_cb callback function that will be called when event is received. - * @return void -*/ -void gfsm_add_reaction(gfsm_state_s *p_state, gfsm_event_id_t event_id, - gfsm_reaction_cb reaction_cb); - -/** - * @brief This function will return a pointer of fsm that has this state. - * @param [in] p_state a pointer of state - * @return a pointer of fsm that possess this state -*/ -gfsm_s *gfsm_get_fsm_of_state(gfsm_state_s *p_state); - -/** - * @brief This function create a context object. - * @param [in] p_fsm a pointer of fsm - * @param [in] termination_notifier callback function that will be called when context is destroyed - * @param [in] p_context_data user data that will be passed to reaction action, entry action, exit action - * @return a pointer of context -*/ -gfsm_context_s *gfsm_create_context(gfsm_s *p_fsm, - gfsm_context_termination_notifier_cb termination_notifier, - void *p_context_data); - -/** - * @brief This function detroy a context object. - * @param [in] p_context a pointer of context - * @return void -*/ -void gfsm_destroy_context(gfsm_context_s *p_context); - -/** - * @brief this function process event - * @param [in] pp_context a pointer of pointer of context - * @param [in] p_event a pointer of event that will be processed - * @return void -*/ -void gfsm_process_event(gfsm_context_s **pp_context, gfsm_event_s *p_event); - -/** - * @brief this function return a current state id - * @param [in] p_context a pointer of context - * @return current state id -*/ -gfsm_state_id_t gfsm_get_current_state_id(gfsm_context_s *p_context); - -/** - * @brief This function will return a pointer of fsm that has this context. - * @param [in] p_context a pointer of context - * @return a pointer of fsm that possess this context -*/ -gfsm_s *gfsm_get_fsm_of_context(gfsm_context_s *p_context); - -/** - * @brief this function create event object - * @param [in] event_id id of event that will be created - * @param [in] p_event_data user data that will be delivered to reaction functions - * @param [in] destructor callback function that will be called in order to destroy p_event_data - * @return a pointer of event -*/ -gfsm_event_s *gfsm_create_event(gfsm_event_id_t event_id, void *p_event_data, - gfsm_event_data_destructor_cb destructor); - -/** - * @brief predefined reaction function to defer event - * @param [in] p_context_data user data of context - * @param [in] p_event_data user data of event - * @return a next state id - * - * @verbatim - * gfsm_add_reaction(state1,event1,gfsm_deferral_reaction); - * @endverbatim -*/ -gfsm_state_id_t gfsm_deferral_reaction(void *p_context_data, - void *p_event_data); - -/** - * @brief this function will set logger function to help debugging - * @param [in] p_fsm a pointer of fsm object - * @param [in] log_func a function pointer to print log - * @param [in] header a string that will be shown at the head of every log - * @param [in] state_name_cb callback function that will pass string of state name - * @param [in] event_name_cb callback function that will pass string of event name - * @return void - * -*/ -void gfsm_set_logger(gfsm_s *p_fsm, gfsm_log_func log_func, const char *header, - gfsm_get_state_name_cb state_name_cb, gfsm_get_event_name_cb event_name_cb); - -#endif diff --git a/src/tech/asp-tech-ble.c b/src/tech/asp-tech-ble.c deleted file mode 100755 index 052ae1a..0000000 --- a/src/tech/asp-tech-ble.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 - -/***************************************************************************** - * System headers - *****************************************************************************/ - -#include -#include - -/***************************************************************************** - * Application Service Platform Daemon headers - *****************************************************************************/ -#include "asp-manager-util.h" -#include "asp-service.h" -#include "asp-session.h" -#include "asp-tech.h" -#include "asp-tech-ble.h" - -/***************************************************************************** - * Macros and Typedefs - *****************************************************************************/ - -/* TODO : define service data structure */ - -/***************************************************************************** - * Global Variables - *****************************************************************************/ - -/* TODO : define local memory for service data structure */ - -/***************************************************************************** - * Local Functions Definition - *****************************************************************************/ - -gint32 asp_tech_ble_init() -{ - __ASP_LOG_FUNC_ENTER__; - gint32 result = 0; - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_ble_deinit() -{ - __ASP_LOG_FUNC_ENTER__; - gint32 result = 0; - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_ble_advertise(asp_service_advertise_s *service, gint32 replace) -{ - __ASP_LOG_FUNC_ENTER__; - gint32 result = 0; - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_ble_cancel_advertise(asp_service_advertise_s *service) -{ - __ASP_LOG_FUNC_ENTER__; - gint32 result = 0; - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_ble_seek(asp_service_seek_s *service) -{ - __ASP_LOG_FUNC_ENTER__; - gint32 result = 0; - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_ble_cancel_seek(asp_service_seek_s *service) -{ - __ASP_LOG_FUNC_ENTER__; - gint32 result = 0; - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_ble_connect_session(asp_tech_session_request_params_s *params) -{ - __ASP_LOG_FUNC_ENTER__; - gint32 result = 0; - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_ble_confirm_session(const guint8 *session_mac, gint32 session_id, gint32 confirm, guint32 pin) -{ - __ASP_LOG_FUNC_ENTER__; - gint32 result = 0; - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_ble_destroy_connection(const guint8 *peer_id, gint32 peer_id_length) -{ - __ASP_LOG_FUNC_ENTER__; - 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; -} - -asp_tech_ops_s asp_tech_ble_ops = { - .init = asp_tech_ble_init, - .deinit = asp_tech_ble_deinit, - .advertise = asp_tech_ble_advertise, - .cancel_advertise = asp_tech_ble_cancel_advertise, - .seek = asp_tech_ble_seek, - .cancel_seek = asp_tech_ble_cancel_seek, - .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-ble.h b/src/tech/asp-tech-ble.h deleted file mode 100755 index 5a77e44..0000000 --- a/src/tech/asp-tech-ble.h +++ /dev/null @@ -1,20 +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. - */ - -#ifndef __ASP_TECH_BLE_H__ -#define __ASP_TECH_BLE_H__ - -#endif /* __ASP_TECH_BLE_H__ */ diff --git a/src/tech/asp-tech-infra.c b/src/tech/asp-tech-infra.c deleted file mode 100644 index 44dca7e..0000000 --- a/src/tech/asp-tech-infra.c +++ /dev/null @@ -1,621 +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 - -/***************************************************************************** - * System headers - *****************************************************************************/ - -#include -#include - -#include -#include - -#include -#include - -#include - -/***************************************************************************** - * Application Service Platform Daemon headers - *****************************************************************************/ -#include "asp-manager-util.h" -#include "asp-service.h" -#include "asp-session.h" -#include "asp-tech.h" -#include "asp-tech-infra.h" - -/***************************************************************************** - * Macros and Typedefs - *****************************************************************************/ - -/* TODO : define service data structure */ - -/***************************************************************************** - * Global Variables - *****************************************************************************/ -static __thread GHashTable *g_local_service_hash = NULL; -static __thread GHashTable *g_browser_hash = NULL; - - -/* TODO : define local memory for service data structure */ - -/***************************************************************************** - * Local Functions Definition - *****************************************************************************/ -static void _advertise_status_cb(dnssd_error_e result, - dnssd_service_h local_service, gpointer user_data) -{ - guint32 adv_id = GPOINTER_TO_UINT(user_data); - asp_service_advertise_status_e status = 0; - asp_service_advertise_reason_e reason = 0; - - switch (result) { - case DNSSD_ERROR_NONE: - case DNSSD_ERROR_ALREADY_REGISTERED: - status = ASP_SERVICE_ADV_STATUS_ADVERTISED; - reason = ASP_SERVICE_ADVERTISE_REASON_SUCCESS; - break; - case DNSSD_ERROR_NAME_CONFLICT: - status = ASP_SERVICE_ADV_STATUS_NOT_ADVERTISED; - reason = ASP_SERVICE_ADVERTISE_REASON_DUP; - break; - default: - status = ASP_SERVICE_ADV_STATUS_NOT_ADVERTISED; - reason = ASP_SERVICE_ADVERTISE_REASON_OTHER; - } - - asp_service_notify_advertise_status(adv_id, status, reason); -} - -static void __txt_record_to_g_hash(unsigned short txt_len, const gchar *txt_records, - GHashTable *service_info_map) -{ - const gchar *ptr = txt_records; - const gchar *max = txt_records + txt_len; - - ASP_LOGD("Parsing TXT record. Length: %hu", txt_len); - - while (ptr < max) { - unsigned short len = ptr[0]; - gchar *buf = g_strndup(ptr + 1, len); - ASP_LOGD("buf: %s", buf); - 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)); - ASP_LOGD("Insert (%s, %s) to hash. len: %d)", key, value, len); - g_free(buf); - ptr = ptr + 1 + len; - } -} - -static asp_service_status_e __get_service_status(dnssd_service_state_e service_state) -{ - asp_service_status_e service_status; - switch (service_state) { - case DNSSD_SERVICE_STATE_AVAILABLE: - service_status = ASP_SERVICE_STATUS_AVAILABLE; - break; - case DNSSD_SERVICE_STATE_UNAVAILABLE: - case DNSSD_SERVICE_STATE_NAME_LOOKUP_FAILED: - case DNSSD_SERVICE_STATE_HOST_NAME_LOOKUP_FAILED: - case DNSSD_SERVICE_STATE_ADDRESS_LOOKUP_FAILED: - service_status = ASP_SERVICE_STATUS_NOT_AVAILABLE; - break; - default: - service_status = ASP_SERVICE_STATUS_NOT_AVAILABLE; - } - - return service_status; -} - -static void _search_result_cb(dnssd_service_state_e service_state, - dnssd_service_h remote_service, gpointer user_data) -{ - asp_event_data event; - guint32 search_id = -1; - gchar *service_mac = NULL; - gchar *service_device_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; - gchar *txt = NULL; - const gchar *adv_id_str = NULL; - - ASP_LOGD("A service is found %u", remote_service); - - search_id = GPOINTER_TO_UINT(user_data); - dnssd_service_get_name(remote_service, &service_name); - ASP_LOGD("Service name: %s", service_name); - - service_status = __get_service_status(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, (gpointer)&txt); - if (txt_len > 1) { - service_info_map = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); - __txt_record_to_g_hash(txt_len, txt, service_info_map); - if (g_hash_table_contains(service_info_map, ASP_INFRA_ADV_KEY)) { - adv_id_str = g_hash_table_lookup(service_info_map, ASP_INFRA_ADV_KEY); - adv_id = g_ascii_strtoll(adv_id_str, NULL, 10); - ASP_LOGD("Advertisement ID: %u", adv_id); - } else { - ASP_LOGE("TXT records don't contain advertisement ID"); - g_hash_table_unref(service_info_map); - g_free(service_name); - g_free(txt); - return; - } - - 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", service_mac); - } else { - ASP_LOGE("TXT records don't contain advertisement MAC"); - g_hash_table_unref(service_info_map); - g_free(service_name); - g_free(txt); - return; - } - - if (g_hash_table_contains(service_info_map, ASP_INFRA_DEV_NAME)) { - service_device_name = g_strdup(g_hash_table_lookup(service_info_map, ASP_INFRA_DEV_NAME)); - ASP_LOGD("Service device name: %s", service_device_name); - } - } else { - ASP_LOGE("Found service should has at least one TXT record"); - g_free(service_name); - g_free(txt); - return; - } - - memset(&event, 0x0, sizeof(asp_event_data)); - event.search_result.tech = ASP_TECH_INFRA; - 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 + 1); - event.search_result.device_name = NULL; - event.search_result.instance_name = service_name; - event.search_result.service_info = service_info_map; - asp_manager_event(NULL, ASP_EVENT_SEARCH_RESULT, &event); - - g_hash_table_unref(service_info_map); - g_free(service_device_name); - g_free(service_mac); - g_free(txt); -} - -static gint32 __asp_service_infra_convert_error_type(gint32 dnssd_error) -{ - switch (dnssd_error) { - case DNSSD_ERROR_NONE: - return ASP_ERROR_NONE; - case DNSSD_ERROR_OUT_OF_MEMORY: - return ASP_ERROR_MEMORY; - case DNSSD_ERROR_INVALID_PARAMETER: - return ASP_ERROR_INVALIED_PARAMS; - case DNSSD_ERROR_NOT_SUPPORTED: - return ASP_ERROR_NOT_SUPPORTED_TECH; - case DNSSD_ERROR_SERVICE_NOT_FOUND: - return ASP_ERROR_SERVICE_NOT_FOUND; - case DNSSD_ERROR_INVALID_OPERATION: - case DNSSD_ERROR_NOT_INITIALIZED: - case DNSSD_ERROR_ALREADY_REGISTERED: - case DNSSD_ERROR_NAME_CONFLICT: - case DNSSD_ERROR_SERVICE_NOT_RUNNING: - case DNSSD_ERROR_OPERATION_FAILED: - return ASP_ERROR_OPERATION_FAILED; - default: - return ASP_ERROR_UNKNOWN; - } - return dnssd_error; -} - -static void __init_hash_tables() -{ - g_local_service_hash = g_hash_table_new(g_direct_hash, g_direct_equal); - g_browser_hash = g_hash_table_new(g_direct_hash, g_direct_equal); -} - -static void __g_hash_free_handle(gpointer key, gpointer value, gpointer user_data) -{ -} - -static void __deinit_hash_tables() -{ - g_hash_table_foreach(g_local_service_hash, (GHFunc)__g_hash_free_handle, NULL); - g_hash_table_foreach(g_browser_hash, (GHFunc)__g_hash_free_handle, NULL); - - g_local_service_hash = NULL; - g_browser_hash = NULL; -} - -static gint32 __add_txt_record(dnssd_service_h handle, const gchar* key, const gchar* value, gint32 len) -{ - gint32 result = 0; - unsigned short txt_length; - gpointer txt_data = NULL; - - result = dnssd_service_add_txt_record(handle, key, (unsigned short)len, value); - if (result != DNSSD_ERROR_NONE) { - result = __asp_service_infra_convert_error_type(result); - return result; - } - ASP_LOGD("Add (%s=%s) TXT record. length: %d", key, value, len); - - result = dnssd_service_get_all_txt_record(handle, &txt_length, &txt_data); - if (result != DNSSD_ERROR_NONE) { - result = __asp_service_infra_convert_error_type(result); - return result; - } - ASP_LOGD("Get all TXT records"); - - 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"); - result = __asp_service_infra_convert_error_type(result); - g_free(txt_data); - return result; - } - ASP_LOGD("Add TXT records"); - return result; -} - -gint32 asp_tech_infra_init() -{ - __ASP_LOG_FUNC_ENTER__; - gint32 result = 0; - - result = dnssd_initialize(); - if (result != DNSSD_ERROR_NONE) { - result = __asp_service_infra_convert_error_type(result); - return result; - } - - __init_hash_tables(); - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_infra_deinit() -{ - __ASP_LOG_FUNC_ENTER__; - gint32 result = 0; - - result = dnssd_deinitialize(); - if (result != DNSSD_ERROR_NONE) { - result = __asp_service_infra_convert_error_type(result); - return result; - } - - __deinit_hash_tables(); - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_infra_advertise(asp_service_advertise_s *service, gint32 replace) -{ - __ASP_LOG_FUNC_ENTER__; - gint32 result = 0; - dnssd_service_h service_handle = 0; - 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 */ - gchar *if_name; - wifi_manager_h wifi_handle = NULL; - - ASP_LOGD("Infrastructure advertise service. replace: %d", replace); - - if (replace) { - /* TODO */ - ; - } - - result = dnssd_create_local_service(service->service_type, &service_handle); - if (result != DNSSD_ERROR_NONE) { - result = __asp_service_infra_convert_error_type(result); - return result; - } - ASP_LOGD("Success to create local service handle: %u, service type: %s", - service_handle, service->service_type); - - result = dnssd_service_set_name(service_handle, service->instance_name); - if (result != DNSSD_ERROR_NONE) { - result = __asp_service_infra_convert_error_type(result); - return result; - } - ASP_LOGD("Success to set service name %s", service->instance_name); - - /* TODO set port */ - result = dnssd_service_set_port(service_handle, port); - if (result != DNSSD_ERROR_NONE) { - result = __asp_service_infra_convert_error_type(result); - return result; - } - ASP_LOGD("Success to set port %d", port); - - result = wifi_manager_initialize(&wifi_handle); - if (result != WIFI_MANAGER_ERROR_NONE) { - ASP_LOGD("Failed to initialize wifi-manager"); - return ASP_ERROR_OPERATION_FAILED; - } - result = wifi_manager_get_network_interface_name(wifi_handle, &if_name); - if (result != WIFI_MANAGER_ERROR_NONE) { - ASP_LOGD("Failed to get interface name"); - return ASP_ERROR_OPERATION_FAILED; - } - ASP_LOGD("Success to get wifi interface name %s", if_name); - result = wifi_manager_deinitialize(wifi_handle); - if (result != WIFI_MANAGER_ERROR_NONE) { - ASP_LOGD("Failed to deinitialize wifi_manager"); - free(if_name); - return ASP_ERROR_OPERATION_FAILED; - } - - result = dnssd_service_set_interface(service_handle, if_name); - if (result != DNSSD_ERROR_NONE) { - result = __asp_service_infra_convert_error_type(result); - free(if_name); - return result; - } - ASP_LOGD("Success to set interface %s", if_name); - free(if_name); - - result = dnssd_register_local_service(service_handle, - _advertise_status_cb, GUINT_TO_POINTER(service->adv_id)); - if (result != DNSSD_ERROR_NONE) { - result = __asp_service_infra_convert_error_type(result); - return result; - } - ASP_LOGD("Success to register local service %u", service_handle); - - g_hash_table_insert(g_local_service_hash, - GUINT_TO_POINTER(service->adv_id), GUINT_TO_POINTER(service_handle)); - - ASP_LOGD("Insert (%u, %u) to g_local_service_hash (size: %d)", - service->adv_id, service_handle, - g_hash_table_size(g_local_service_hash)); - - - /* Add TXT records */ - /* First of all, add Advertisement ID */ - snprintf(adv_id, ASP_SERVICE_ADV_ID_LEN + 1, "%u", service->adv_id); - adv_id_len = strlen(adv_id); - result = __add_txt_record(service_handle, ASP_INFRA_ADV_KEY, adv_id, adv_id_len); - if (result != DNSSD_ERROR_NONE) { - result = __asp_service_infra_convert_error_type(result); - return result; - } - - /* Add MAC Address to TXT record */ - mac_addr = vconf_get_str(VCONFKEY_WIFI_BSSID_ADDRESS); - if (!mac_addr) { - ASP_LOGE("Failed to get vconf value for %s", VCONFKEY_WIFI_BSSID_ADDRESS); - return ASP_ERROR_OPERATION_FAILED; - } - - mac_addr_len = strlen(mac_addr); - result = __add_txt_record(service_handle, ASP_INFRA_MAC_ADDR_KEY, mac_addr, mac_addr_len); - if (result != DNSSD_ERROR_NONE) { - result = __asp_service_infra_convert_error_type(result); - free(mac_addr); - return result; - } - free(mac_addr); - - /* Other TXT records */ - if (service->service_info_map != NULL) { - GHashTableIter iter; - gpointer key, value; - - g_hash_table_iter_init(&iter, service->service_info_map); - while (g_hash_table_iter_next(&iter, &key, &value)) { - unsigned short len = (unsigned short)strlen(value); - result = __add_txt_record(service_handle, key, value, len); - } - } - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_infra_cancel_advertise(asp_service_advertise_s *service) -{ - __ASP_LOG_FUNC_ENTER__; - gint32 result = 0; - dnssd_service_h service_handle; - - service_handle = (dnssd_service_h)GPOINTER_TO_UINT(g_hash_table_lookup(g_local_service_hash, - GUINT_TO_POINTER(service->adv_id))); - - if (!service_handle) { - /* TODO */ - ASP_LOGE("Failed to lookup advertisement id %u", service->adv_id); - return result; - } - - result = dnssd_deregister_local_service(service_handle); - if (result != DNSSD_ERROR_NONE) { - result = __asp_service_infra_convert_error_type(result); - ASP_LOGE("Failed to deregister local service %u", service_handle); - return result; - } - ASP_LOGD("Success to deregister local service: %u", service_handle); - - result = dnssd_destroy_local_service(service_handle); - if (result != DNSSD_ERROR_NONE) { - result = __asp_service_infra_convert_error_type(result); - return result; - } - ASP_LOGD("Success to destroy local service: %u", service_handle); - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_infra_seek(asp_service_seek_s *service) -{ - __ASP_LOG_FUNC_ENTER__; - gint32 result = 0; - dnssd_browser_h browser_handle; - gchar *if_name; - wifi_manager_h wifi_handle = NULL; - - result = wifi_manager_initialize(&wifi_handle); - if (result != WIFI_MANAGER_ERROR_NONE) { - ASP_LOGD("Failed to initialize wifi-manager"); - return ASP_ERROR_OPERATION_FAILED; - } - result = wifi_manager_get_network_interface_name(wifi_handle, &if_name); - if (result != WIFI_MANAGER_ERROR_NONE) { - ASP_LOGD("Failed to get interface name"); - return ASP_ERROR_OPERATION_FAILED; - } - ASP_LOGD("Success to get wifi interface name %s", if_name); - result = wifi_manager_deinitialize(wifi_handle); - if (result != WIFI_MANAGER_ERROR_NONE) { - ASP_LOGD("Failed to deinitialize wifi-manager"); - free(if_name); - return ASP_ERROR_OPERATION_FAILED; - } - - result = dnssd_start_browsing_service_on_interface(service->service_type, - if_name, &browser_handle, - _search_result_cb, - GUINT_TO_POINTER(service->search_id)); - - if (result != DNSSD_ERROR_NONE) { - result = __asp_service_infra_convert_error_type(result); - free(if_name); - return result; - } - ASP_LOGD("Success to start browsing service. service_type: %s, browser_handle: %u", - service->service_type, browser_handle); - - g_hash_table_insert(g_browser_hash, - GUINT_TO_POINTER(service->search_id), GUINT_TO_POINTER(browser_handle)); - - ASP_LOGD("Insert (%" G_GUINT64_FORMAT ", %u) to g_browser_hash (size: %d)", - service->search_id, browser_handle, - g_hash_table_size(g_browser_hash)); - - free(if_name); - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_infra_cancel_seek(asp_service_seek_s *service) -{ - __ASP_LOG_FUNC_ENTER__; - gint32 result = 0; - dnssd_browser_h browser_handle; - - browser_handle = (dnssd_browser_h)GPOINTER_TO_UINT(g_hash_table_lookup(g_browser_hash, - GUINT_TO_POINTER(service->search_id))); - - if (!browser_handle) { - /* TODO */ - ASP_LOGE("Failed to lookup search id %" G_GUINT64_FORMAT, service->search_id); - return result; - } - - result = dnssd_stop_browsing_service(browser_handle); - if (result != DNSSD_ERROR_NONE) { - result = __asp_service_infra_convert_error_type(result); - return result; - } - ASP_LOGD("Success to stop browsing. browser_handle: %u", browser_handle); - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_infra_connect_session(asp_tech_session_request_params_s *params) -{ - __ASP_LOG_FUNC_ENTER__; - gint32 result = 0; - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_infra_confirm_session(const guint8 *session_mac, gint32 session_id, gint32 confirm, guint32 pin) -{ - __ASP_LOG_FUNC_ENTER__; - gint32 result = 0; - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_infra_destroy_connection(const guint8 *peer_id, gint32 peer_id_length) -{ - __ASP_LOG_FUNC_ENTER__; - 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; -} - -asp_tech_ops_s asp_tech_infra_ops = { - .init = asp_tech_infra_init, - .deinit = asp_tech_infra_deinit, - .advertise = asp_tech_infra_advertise, - .cancel_advertise = asp_tech_infra_cancel_advertise, - .seek = asp_tech_infra_seek, - .cancel_seek = asp_tech_infra_cancel_seek, - .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-infra.h b/src/tech/asp-tech-infra.h deleted file mode 100755 index 99492bf..0000000 --- a/src/tech/asp-tech-infra.h +++ /dev/null @@ -1,26 +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. - */ - -#ifndef __ASP_TECH_INFRA_H__ -#define __ASP_TECH_INFRA_H__ - -#define ASP_INFRA_ADV_KEY "wfa_asp_adv_id" -#define ASP_INFRA_MAC_ADDR_KEY "wfa_asp_mac_addr" -#define ASP_INFRA_DEV_NAME "wfa_asp_dev_name" - -#define ASP_INFRA_DNSSD_TXT_RECORD_TYPE 16 - -#endif /* __ASP_TECH_INFRA_H__ */ diff --git a/src/tech/asp-tech-nan.c b/src/tech/asp-tech-nan.c deleted file mode 100755 index 15893db..0000000 --- a/src/tech/asp-tech-nan.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 - -/***************************************************************************** - * System headers - *****************************************************************************/ - -#include -#include - -/***************************************************************************** - * Application Service Platform Daemon headers - *****************************************************************************/ -#include "asp-manager-util.h" -#include "asp-service.h" -#include "asp-session.h" -#include "asp-tech.h" -#include "asp-tech-nan.h" - -/***************************************************************************** - * Macros and Typedefs - *****************************************************************************/ - -/* TODO : define service data structure */ - -/***************************************************************************** - * Global Variables - *****************************************************************************/ - -/* TODO : define local memory for service data structure */ - -/***************************************************************************** - * Local Functions Definition - *****************************************************************************/ - -gint32 asp_tech_nan_init() -{ - __ASP_LOG_FUNC_ENTER__; - gint32 result = 0; - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_nan_deinit() -{ - __ASP_LOG_FUNC_ENTER__; - gint32 result = 0; - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_nan_advertise(asp_service_advertise_s *service, gint32 replace) -{ - __ASP_LOG_FUNC_ENTER__; - gint32 result = 0; - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_nan_cancel_advertise(asp_service_advertise_s *service) -{ - __ASP_LOG_FUNC_ENTER__; - gint32 result = 0; - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_nan_seek(asp_service_seek_s *service) -{ - __ASP_LOG_FUNC_ENTER__; - gint32 result = 0; - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_nan_cancel_seek(asp_service_seek_s *service) -{ - __ASP_LOG_FUNC_ENTER__; - gint32 result = 0; - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_nan_connect_session(asp_tech_session_request_params_s *params) -{ - __ASP_LOG_FUNC_ENTER__; - gint32 result = 0; - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_nan_confirm_session(const guint8 *session_mac, gint32 session_id, gint32 confirm, guint32 pin) -{ - __ASP_LOG_FUNC_ENTER__; - gint32 result = 0; - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_nan_destroy_connection(const guint8 *peer_id, gint32 peer_id_length) -{ - __ASP_LOG_FUNC_ENTER__; - 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; -} - -asp_tech_ops_s asp_tech_nan_ops = { - .init = asp_tech_nan_init, - .deinit = asp_tech_nan_deinit, - .advertise = asp_tech_nan_advertise, - .cancel_advertise = asp_tech_nan_cancel_advertise, - .seek = asp_tech_nan_seek, - .cancel_seek = asp_tech_nan_cancel_seek, - .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-nan.h b/src/tech/asp-tech-nan.h deleted file mode 100755 index ea06a36..0000000 --- a/src/tech/asp-tech-nan.h +++ /dev/null @@ -1,20 +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. - */ - -#ifndef __ASP_TECH_NAN_H__ -#define __ASP_TECH_NAN_H__ - -#endif /* __ASP_TECH_NAN_H__ */ diff --git a/src/tech/asp-tech-nfc.c b/src/tech/asp-tech-nfc.c deleted file mode 100755 index 4940477..0000000 --- a/src/tech/asp-tech-nfc.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 - -/***************************************************************************** - * System headers - *****************************************************************************/ - -#include -#include - -/***************************************************************************** - * Application Service Platform Daemon headers - *****************************************************************************/ -#include "asp-manager-util.h" -#include "asp-service.h" -#include "asp-session.h" -#include "asp-tech.h" -#include "asp-tech-nfc.h" - -/***************************************************************************** - * Macros and Typedefs - *****************************************************************************/ - -/* TODO : define service data structure */ - -/***************************************************************************** - * Global Variables - *****************************************************************************/ - -/* TODO : define local memory for service data structure */ - -/***************************************************************************** - * Local Functions Definition - *****************************************************************************/ - -gint32 asp_tech_nfc_advertise(asp_service_advertise_s *service, gint32 replace) -{ - __ASP_LOG_FUNC_ENTER__; - gint32 result = 0; - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_nfc_cancel_advertise(asp_service_advertise_s *service) -{ - __ASP_LOG_FUNC_ENTER__; - gint32 result = 0; - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_nfc_seek(asp_service_seek_s *service) -{ - __ASP_LOG_FUNC_ENTER__; - gint32 result = 0; - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_nfc_cancel_seek(asp_service_seek_s *service) -{ - __ASP_LOG_FUNC_ENTER__; - gint32 result = 0; - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_nfc_init() -{ - __ASP_LOG_FUNC_ENTER__; - gint32 result = 0; - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_nfc_deinit() -{ - __ASP_LOG_FUNC_ENTER__; - gint32 result = 0; - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_nfc_connect_session(asp_tech_session_request_params_s *params) -{ - __ASP_LOG_FUNC_ENTER__; - gint32 result = 0; - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_nfc_confirm_session(const guint8 *session_mac, gint32 session_id, gint32 confirm, guint32 pin) -{ - __ASP_LOG_FUNC_ENTER__; - gint32 result = 0; - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_nfc_destroy_connection(const guint8 *peer_id, gint32 peer_id_length) -{ - __ASP_LOG_FUNC_ENTER__; - 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; -} - -asp_tech_ops_s asp_tech_nfc_ops = { - .init = asp_tech_nfc_init, - .deinit = asp_tech_nfc_deinit, - .advertise = asp_tech_nfc_advertise, - .cancel_advertise = asp_tech_nfc_cancel_advertise, - .seek = asp_tech_nfc_seek, - .cancel_seek = asp_tech_nfc_cancel_seek, - .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-nfc.h b/src/tech/asp-tech-nfc.h deleted file mode 100755 index a4e2192..0000000 --- a/src/tech/asp-tech-nfc.h +++ /dev/null @@ -1,20 +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. - */ - -#ifndef __ASP_TECH_NFC_H__ -#define __ASP_TECH_NFC_H__ - -#endif /* __ASP_TECH_NFC_H__ */ diff --git a/src/tech/asp-tech-p2p.c b/src/tech/asp-tech-p2p.c deleted file mode 100755 index 4a21c28..0000000 --- a/src/tech/asp-tech-p2p.c +++ /dev/null @@ -1,1142 +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 - -/***************************************************************************** - * System headers - *****************************************************************************/ - -#include -#include -#include - -/***************************************************************************** - * Application Service Platform Daemon headers - *****************************************************************************/ -#include "asp-manager.h" -#include "asp-manager-util.h" -#include "asp-service.h" -#include "asp-session.h" -#include "asp-tech.h" -#include "asp-tech-p2p.h" - -/***************************************************************************** - * Macros and Typedefs - *****************************************************************************/ - -#define ASP_TECH_P2P_ROLE_NEW 1 -#define ASP_TECH_P2P_ROLE_GC 2 -#define ASP_TECH_P2P_ROLE_GO 4 - -#define WFD_MANAGER_SERVICE "net.wifidirect" -#define WFD_MANAGER_PATH "/net/wifidirect" -#define WFD_MANAGER_MANAGE_INTERFACE WFD_MANAGER_SERVICE -#define WFD_MANAGER_CONFIG_INTERFACE WFD_MANAGER_SERVICE ".config" -#define WFD_MANAGER_GROUP_INTERFACE WFD_MANAGER_SERVICE ".group" -#define WFD_MANAGER_ASP_INTERFACE WFD_MANAGER_SERVICE ".asp" - -#define DBUS_REPLY_TIMEOUT_SYNC 10 * 1000 -#define DBUS_OBJECT_PATH_MAX 150 - -#define WFD_MANAGER_QUARK (g_quark_from_string("wifi-direct-manager")) - -#define asp_tech_p2p_dbus_method_call_sync(interface_name, method, params, error) \ - __asp_tech_p2p_dbus_method_call_sync_debug(interface_name, method, params, error, __func__) - -#define DBUS_DEBUG_VARIANT(parameters) \ - do {\ - gchar *parameters_debug_str = NULL;\ - if (parameters)\ - parameters_debug_str = g_variant_print(parameters, TRUE);\ - ASP_LOGD("signal params [%s]", parameters_debug_str ? parameters_debug_str : "NULL");\ - g_free(parameters_debug_str);\ - } while (0) - -asp_tech_ops_s asp_tech_p2p_ops; - -void asp_tech_p2p_process_activation(GDBusConnection *connection, - const gchar *object_path, GVariant *parameters); - -void asp_tech_p2p_process_deactivation(GDBusConnection *connection, - const gchar *object_path, GVariant *parameters); - -void asp_tech_p2p_process_search_result(GDBusConnection *connection, - const gchar *object_path, GVariant *parameters); - -void asp_tech_p2p_process_session_request(GDBusConnection *connection, - const gchar *object_path, GVariant *parameters); - -void asp_tech_p2p_process_session_config_request(GDBusConnection *connection, - const gchar *object_path, GVariant *parameters); - -void asp_tech_p2p_process_connect_status(GDBusConnection *connection, - const gchar *object_path, GVariant *parameters); - -void asp_tech_p2p_process_session_peer_ip(GDBusConnection *connection, - const gchar *object_path, GVariant *parameters); - -/***************************************************************************** - * Global Variables - *****************************************************************************/ - -static GDBusConnection *g_wfd_gdbus_conn; -static guint g_wfd_signal_id; - -static struct { - const gchar *interface; - const gchar *member; - void (*function) (GDBusConnection *connection, - const gchar *object_path, - GVariant *parameters); -} asp_tech_p2p_dbus_signal_map[] = { - { - WFD_MANAGER_MANAGE_INTERFACE, - "Activation", - asp_tech_p2p_process_activation - }, - { - WFD_MANAGER_MANAGE_INTERFACE, - "Deactivation", - asp_tech_p2p_process_deactivation - }, - { - WFD_MANAGER_ASP_INTERFACE, - "SearchResult", - asp_tech_p2p_process_search_result - }, - { - WFD_MANAGER_ASP_INTERFACE, - "SessionRequest", - asp_tech_p2p_process_session_request - }, - { - WFD_MANAGER_ASP_INTERFACE, - "SessionConfigRequest", - asp_tech_p2p_process_session_config_request - }, - { - WFD_MANAGER_ASP_INTERFACE, - "ConnectStatus", - asp_tech_p2p_process_connect_status - }, - { - WFD_MANAGER_ASP_INTERFACE, - "SessionPeerIPAssigned", - asp_tech_p2p_process_session_peer_ip - }, - { - NULL, - NULL, - NULL - } -}; - -/***************************************************************************** - * Local Functions Definition - *****************************************************************************/ - -static gint32 __net_wifidirect_gerror_to_enum(GError* error) -{ - gint32 res = 0; - if (error == NULL) { - ASP_LOGI("GError is NULL!!"); - return res; - } - - ASP_LOGE("wifi_direct_dbus_method_call_sync() failed. error [%d: %s]", - error->code, error->message); - - res = -1; - /* - if (NULL == strstr(error->message, "net.wifidirect.Error")) { - if (NULL != strstr(error->message, ".AccessDenied")) { - ASP_LOGE("Client doesn't have wifidirect privilege"); - res = -1; - } else { - ASP_LOGE("DBus failure"); - res = -1; - } - } else { - if (NULL != strstr(error->message, "InvalidParameter")) - res = -1; - else if (NULL != strstr(error->message, "NotPermitted")) - res = -1; - else if (NULL != strstr(error->message, "OperationFailed")) - res = -1; - else if (NULL != strstr(error->message, "TooManyClient")) - res = -1; - else - res = -1; - } - */ - return res; -} - - -static void __asp_tech_p2p_dbus_signal_cb(GDBusConnection *connection, - const gchar *sender, const gchar *object_path, - const gchar *interface, const gchar *signal, - GVariant *parameters, gpointer user_data) -{ - gint32 i = 0; - - ASP_LOGD("Signal Name [%s]", signal); - DBUS_DEBUG_VARIANT(parameters); - - for (i = 0; asp_tech_p2p_dbus_signal_map[i].member != NULL; i++) { - if (!g_strcmp0(signal, asp_tech_p2p_dbus_signal_map[i].member) && - !g_strcmp0(interface, asp_tech_p2p_dbus_signal_map[i].interface) && - asp_tech_p2p_dbus_signal_map[i].function != NULL) { - asp_tech_p2p_dbus_signal_map[i].function(connection, object_path, parameters); - break; - } - } -} - -static GVariant *__g_hash_table_to_g_variant(GHashTable *hash) -{ - GVariantBuilder builder; - - g_variant_builder_init(&builder, G_VARIANT_TYPE("a{sv}")); - - GHashTableIter iter; - gpointer key, value; - - g_hash_table_iter_init(&iter, hash); - while (g_hash_table_iter_next(&iter, &key, &value)) - g_variant_builder_add(&builder, "{sv}", key, g_variant_new_string(value)); - - return g_variant_builder_end(&builder); -} - -static GVariant *__g_hash_keys_to_g_variant(GHashTable *hash) -{ - GVariantBuilder builder; - - g_variant_builder_init(&builder, G_VARIANT_TYPE("as")); - - GHashTableIter iter; - gpointer key, value; - - g_hash_table_iter_init(&iter, hash); - while (g_hash_table_iter_next(&iter, &key, &value)) - g_variant_builder_add(&builder, "s", key); - - return g_variant_builder_end(&builder); -} - -GVariant *__asp_tech_p2p_dbus_method_call_sync_debug(const gchar* interface_name, - const gchar* method, - GVariant *params, - GError **error, - const gchar *calling_func) -{ - GVariant *reply = NULL; - - if (g_wfd_gdbus_conn == NULL) { - ASP_LOGE("GDBusconnection is NULL"); - return reply; - } - - ASP_LOGD("[%s][%s.%s]", calling_func, interface_name, method); - DBUS_DEBUG_VARIANT(params); - - reply = g_dbus_connection_call_sync(g_wfd_gdbus_conn, - WFD_MANAGER_SERVICE, /* bus name */ - WFD_MANAGER_PATH, /* object path */ - interface_name, /* interface name */ - method, /* method name */ - params, /* GVariant *params */ - NULL, /* reply_type */ - G_DBUS_CALL_FLAGS_NONE, /* flags */ - DBUS_REPLY_TIMEOUT_SYNC, /* timeout */ - NULL, /* cancellable */ - error); /* error */ - DBUS_DEBUG_VARIANT(reply); - return reply; -} - -void asp_tech_p2p_process_activation(GDBusConnection *connection, - const gchar *object_path, GVariant *parameters) -{ - __ASP_LOG_FUNC_ENTER__; - - ASP_LOGE("Wi-Fi Direct activated"); - - __ASP_LOG_FUNC_EXIT__; - return; -} - -void asp_tech_p2p_process_deactivation(GDBusConnection *connection, - const gchar *object_path, GVariant *parameters) -{ - __ASP_LOG_FUNC_ENTER__; - - ASP_LOGE("Wi-Fi Direct deactivated"); - - __ASP_LOG_FUNC_EXIT__; - return; -} - -static void __service_info_to_g_hash(const gchar *service_info, - GHashTable *service_info_map) -{ - const gchar *key = NULL; - const gchar *value = NULL; - gsize pos = 0; - gsize key_length = 0; - gsize value_length = 0; - gsize info_length = 0; - - info_length = strlen(service_info); - - while (service_info[pos] != '\0' && pos < info_length) { - key = &service_info[pos]; - while (service_info[pos] != '=' && pos < info_length) { - key_length++; - pos++; - } - - if (pos >= info_length - 1) { - g_hash_table_replace(service_info_map, g_strndup(key, key_length), - g_strdup("")); - break; - } - - pos++; - value = &service_info[pos]; - while (service_info[pos] != ',' && pos < info_length) { - value_length++; - pos++; - } - - g_hash_table_replace(service_info_map, g_strndup(key, key_length), - g_strndup(value, value_length)); - ASP_LOGD("Insert (%s, %s) to hash.", key, value); - - if (service_info[pos] == ',' && pos == info_length) - break; - } - return; -} - -void asp_tech_p2p_process_search_result(GDBusConnection *connection, - const gchar *object_path, GVariant *parameters) -{ - __ASP_LOG_FUNC_ENTER__; - - GVariantIter *iter = NULL; - GVariant *var = NULL; - GHashTable *service_info_map = NULL; - asp_event_data event; - const gchar *service_mac = NULL; - const gchar *key = NULL; - const gchar *str = NULL; - long long unsigned search_id = 0; - gchar *device_name = NULL; - guint32 advertisement_id = 0; - guint32 config_method = 0; - gchar *instance_name = NULL; - guint8 status = 0; - - if (!parameters) { - __ASP_LOG_FUNC_EXIT__; - return; - } - - g_variant_get(parameters, "(a{sv})", &iter); - while (g_variant_iter_loop(iter, "{sv}", &key, &var)) { - if (!g_strcmp0(key, "search_id")) { - g_variant_get(var, "t", &search_id); - } else if (!g_strcmp0(key, "service_mac")) { - g_variant_get(var, "&s", &service_mac); - } else if (!g_strcmp0(key, "device_name")) { - g_variant_get(var, "&s", &str); - device_name = g_strndup(str, ASP_SERVICE_DEVICE_NAME_LEN); - } else if (!g_strcmp0(key, "advertisement_id")) { - g_variant_get(var, "u", &advertisement_id); - } else if (!g_strcmp0(key, "config_method")) { - g_variant_get(var, "u", &config_method); - } else if (!g_strcmp0(key, "instance_name")) { - g_variant_get(var, "&s", &str); - instance_name = g_strdup(str); - } else if (!g_strcmp0(key, "status")) { - g_variant_get(var, "y", &status); - } else if (!g_strcmp0(key, "service_info")) { - g_variant_get(var, "&s", &str); - service_info_map = g_hash_table_new_full(g_str_hash, - g_str_equal, g_free, g_free); - __service_info_to_g_hash(str, service_info_map); - } else { - ;/* Do Nothing */ - } - } - - memset(&event, 0x0, sizeof(asp_event_data)); - event.search_result.tech = ASP_TECH_P2P; - event.search_result.search_id = search_id; - event.search_result.advertisement_id = advertisement_id; - event.search_result.service_status = status; - if (service_mac) - 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 = service_info_map; - asp_manager_event(NULL, ASP_EVENT_SEARCH_RESULT, &event); - - g_free(device_name); - g_free(instance_name); - g_hash_table_unref(service_info_map); - g_variant_iter_free(iter); - - __ASP_LOG_FUNC_EXIT__; - return; -} - -void asp_tech_p2p_process_session_request(GDBusConnection *connection, - const gchar *object_path, GVariant *parameters) -{ - __ASP_LOG_FUNC_ENTER__; - - GVariantIter *iter = NULL; - GVariant *var = NULL; - 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; - guint32 pin = 0; - - if (!parameters) { - __ASP_LOG_FUNC_EXIT__; - return; - } - - 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", &adv_id); - } else if (!g_strcmp0(key, "session_mac")) { - if (asp_dbus_unpack_ay(session_mac, var, MAC_LEN) < 0) { - g_free(device_name); - g_free(session_info); - g_variant_iter_free(iter); - return; - } - } else if (!g_strcmp0(key, "session_id")) { - g_variant_get(var, "u", &session_id); - } 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", &str); - pin = (guint32)atoi(str); - } else if (!g_strcmp0(key, "session_info")) { - str = NULL; - g_variant_get(var, "&s", &str); - if (!str) - continue; - info_length = strlen(str); - g_free(session_info); - session_info = g_try_malloc0(info_length + 1); - if (session_info) - memcpy(session_info, str, info_length); - } else { - ;/* Do Nothing */ - } - } - - 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_variant_iter_free(iter); - g_free(device_name); - g_free(session_info); - - __ASP_LOG_FUNC_EXIT__; - return; -} - -void asp_tech_p2p_process_session_config_request(GDBusConnection *connection, - const gchar *object_path, GVariant *parameters) -{ - __ASP_LOG_FUNC_ENTER__; - - GVariantIter *iter = NULL; - GVariant *var = NULL; - const gchar *key = NULL; - const gchar *str = NULL; - const guint8 session_mac[MAC_LEN] = {0,}; - guint32 session_id = 0; - gboolean get_pin = FALSE; - guint32 pin = 0; - - if (!parameters) { - __ASP_LOG_FUNC_EXIT__; - return; - } - - g_variant_get(parameters, "(a{sv})", &iter); - while (g_variant_iter_loop(iter, "{sv}", &key, &var)) { - if (!g_strcmp0(key, "session_id")) { - g_variant_get(var, "u", &session_id); - } 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", &str); - pin = (guint32)atoi(str); - } else { - ;/* Do Nothing */ - } - } - - 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); - } - g_variant_iter_free(iter); - - __ASP_LOG_FUNC_EXIT__; - return; -} - -void asp_tech_p2p_process_connect_status(GDBusConnection *connection, - const gchar *object_path, GVariant *parameters) -{ - __ASP_LOG_FUNC_ENTER__; - - GVariantIter *iter = NULL; - GVariant *var = 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__; - return; - } - - g_variant_get(parameters, "(a{sv})", &iter); - while (g_variant_iter_loop(iter, "{sv}", &key, &var)) { - if (!g_strcmp0(key, "session_mac")) { - if (asp_dbus_unpack_ay(session_mac, var, MAC_LEN) < 0) { - g_variant_iter_free(iter); - g_free(deferred); - return; - } - } else if (!g_strcmp0(key, "session_id")) { - g_variant_get(var, "u", &session_id); - } else if (!g_strcmp0(key, "status")) { - g_variant_get(var, "i", &status); - } else if (!g_strcmp0(key, "deferred")) { - g_variant_get(var, "&s", &str); - g_free(deferred); - deferred = g_strdup(str); - } else { - ;/* Do Nothing */ - } - } - - 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_variant_iter_free(iter); - g_free(deferred); - - __ASP_LOG_FUNC_EXIT__; - return; -} - -void asp_tech_p2p_process_session_peer_ip(GDBusConnection *connection, - const gchar *object_path, GVariant *parameters) -{ - __ASP_LOG_FUNC_ENTER__; - - GVariantIter *iter = NULL; - GVariant *var = NULL; - const gchar *key = NULL; - guint8 session_mac[MAC_LEN] = {0,}; - guint8 service_mac[MAC_LEN] = {0,}; - guint32 session_id = 0; - gchar *peer_ip = NULL; - - if (!parameters) { - __ASP_LOG_FUNC_EXIT__; - return; - } - - g_variant_get(parameters, "(a{sv})", &iter); - while (g_variant_iter_loop(iter, "{sv}", &key, &var)) { - if (!g_strcmp0(key, "session_mac")) { - if (asp_dbus_unpack_ay(session_mac, var, MAC_LEN) < 0) { - g_variant_iter_free(iter); - return; - } - } else if (!g_strcmp0(key, "session_id")) { - g_variant_get(var, "u", &session_id); - } else if (!g_strcmp0(key, "service_mac")) { - if (asp_dbus_unpack_ay(service_mac, var, MAC_LEN) < 0) { - g_variant_iter_free(iter); - return; - } - - } else if (!g_strcmp0(key, "assigned_ip_address")) { - g_variant_get(var, "&s", &peer_ip); - } else { - ;/* Do Nothing */ - } - } - - if (peer_ip == NULL) { - ASP_LOGE("Invalid peer IP address"); - g_variant_iter_free(iter); - return; - } - - if (asp_tech_p2p_ops.ip_assigned_cb) { - asp_tech_p2p_ops.ip_assigned_cb(0, - session_mac, session_id, service_mac, peer_ip, - strlen(peer_ip), asp_tech_p2p_ops.ip_assigned_cb_user_data); - } - - g_variant_iter_free(iter); - - __ASP_LOG_FUNC_EXIT__; - return; -} - -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; - gint32 result = 0; - - if (!service || !g_wfd_gdbus_conn) { - ASP_LOGE("Invalid parameter!"); - __ASP_LOG_FUNC_EXIT__; - return -1; - } - - builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); - g_variant_builder_add(builder, "{sv}", "adv_id", g_variant_new("u", service->adv_id)); - g_variant_builder_add(builder, "{sv}", "discovery_tech", g_variant_new("i", service->discovery_tech)); - g_variant_builder_add(builder, "{sv}", "preferred_connection", g_variant_new("y", service->preferred_connection)); - g_variant_builder_add(builder, "{sv}", "auto_accept", g_variant_new("i", service->auto_accept)); - g_variant_builder_add(builder, "{sv}", "status", g_variant_new("y", service->status)); - g_variant_builder_add(builder, "{sv}", "role", g_variant_new("y", service->role)); - g_variant_builder_add(builder, "{sv}", "replace", g_variant_new("i", replace)); - g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new("u", service->config_method)); - - if (service->instance_name) - g_variant_builder_add(builder, "{sv}", "instance_name", g_variant_new("s", service->instance_name)); - if (service->service_type) - g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new("s", service->service_type)); - if (service->service_info_map != NULL) - g_variant_builder_add(builder, "{sv}", "service_info", - __g_hash_table_to_g_variant(service->service_info_map)); - if (service->rsp_info) - g_variant_builder_add(builder, "{sv}", "rsp_info", g_variant_new("s", service->rsp_info)); - params = g_variant_new("(a{sv})", builder); - g_variant_builder_unref(builder); - - reply = asp_tech_p2p_dbus_method_call_sync(WFD_MANAGER_ASP_INTERFACE, - "AdvertiseService", params, &error); - if (error != NULL) { - result = __net_wifidirect_gerror_to_enum(error); - g_error_free(error); - __ASP_LOG_FUNC_EXIT__; - return result; - } - - g_variant_get(reply, "(i)", &result); - g_variant_unref(reply); - - ASP_LOGD("%s() return : [%d]", __func__, result); - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_p2p_cancel_advertise(asp_service_advertise_s *service) -{ - __ASP_LOG_FUNC_ENTER__; - GVariant *params = NULL; - GError *error = NULL; - GVariant *reply = NULL; - gint32 result = 0; - - if (!service || !g_wfd_gdbus_conn) { - ASP_LOGE("Invalid parameter!"); - __ASP_LOG_FUNC_EXIT__; - return -1; - } - - params = g_variant_new("(u)", service->adv_id); - reply = asp_tech_p2p_dbus_method_call_sync(WFD_MANAGER_ASP_INTERFACE, - "CancelAdvertiseService", params, &error); - if (error != NULL) { - result = __net_wifidirect_gerror_to_enum(error); - g_error_free(error); - __ASP_LOG_FUNC_EXIT__; - return result; - } - - g_variant_get(reply, "(i)", &result); - g_variant_unref(reply); - - ASP_LOGD("%s() return : [%d]", __func__, result); - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -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; - gint32 result = 0; - - if (!service || !g_wfd_gdbus_conn) { - ASP_LOGE("Invalid parameter!"); - __ASP_LOG_FUNC_EXIT__; - return -1; - } - - - builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); - g_variant_builder_add(builder, "{sv}", "discovery_tech", g_variant_new("i", service->discovery_tech)); - g_variant_builder_add(builder, "{sv}", "preferred_connection", g_variant_new("y", service->preferred_connection)); - g_variant_builder_add(builder, "{sv}", "search_id", g_variant_new("t", service->search_id)); - g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new("s", service->service_type)); - if (service->service_info_map != NULL) - g_variant_builder_add(builder, "{sv}", "service_info", __g_hash_keys_to_g_variant(service->service_info_map)); - params = g_variant_new("(a{sv})", builder); - g_variant_builder_unref(builder); - ASP_LOGI("instance name (%s)", service->instance_name); - - reply = asp_tech_p2p_dbus_method_call_sync(WFD_MANAGER_ASP_INTERFACE, - "SeekService", params, &error); - if (error != NULL) { - result = __net_wifidirect_gerror_to_enum(error); - g_error_free(error); - __ASP_LOG_FUNC_EXIT__; - return result; - } - - g_variant_get(reply, "(i)", &result); - g_variant_unref(reply); - - ASP_LOGD("%s() return : [%d]", __func__, result); - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_p2p_cancel_seek(asp_service_seek_s *service) -{ - __ASP_LOG_FUNC_ENTER__; - GVariant *params = NULL; - GError *error = NULL; - GVariant *reply = NULL; - gint32 result = 0; - - if (!service || !g_wfd_gdbus_conn) { - ASP_LOGE("Invalid parameter!"); - __ASP_LOG_FUNC_EXIT__; - return -1; - } - - params = g_variant_new("(t)", service->search_id); - reply = asp_tech_p2p_dbus_method_call_sync(WFD_MANAGER_ASP_INTERFACE, - "CancelSeekService", params, &error); - if (error != NULL) { - result = __net_wifidirect_gerror_to_enum(error); - g_error_free(error); - __ASP_LOG_FUNC_EXIT__; - return result; - } - - g_variant_get(reply, "(i)", &result); - g_variant_unref(reply); - - ASP_LOGD("%s() return : [%d]", __func__, result); - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -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 gchar *str = NULL; - gint32 result = 0; - - asp = asp_get_manager(); - if (asp == NULL) { - ASP_LOGE("Failed to get asp"); - __ASP_LOG_FUNC_EXIT__; - return -1; - } - - g_wfd_gdbus_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error); - if (g_wfd_gdbus_conn == NULL) { - ASP_LOGE("Failed to get connection, Error[%s]", error->message); - g_error_free(error); - __ASP_LOG_FUNC_EXIT__; - return -1; - } - - /* subscribe signal handler */ - g_wfd_signal_id = g_dbus_connection_signal_subscribe(g_wfd_gdbus_conn, - WFD_MANAGER_SERVICE, /* bus name */ - NULL, /* interface */ - NULL, /* member */ - WFD_MANAGER_PATH, /* object_path */ - NULL, /* arg0 */ - G_DBUS_SIGNAL_FLAGS_NONE, - __asp_tech_p2p_dbus_signal_cb, - NULL, - NULL); - ASP_LOGI("Subscribed dbus signals [%d]", g_wfd_signal_id); - - /* Get local P2P device address*/ - reply = asp_tech_p2p_dbus_method_call_sync(WFD_MANAGER_CONFIG_INTERFACE, - "GetMacAddress", NULL, &error); - if (error != NULL) { - result = __net_wifidirect_gerror_to_enum(error); - g_error_free(error); - __ASP_LOG_FUNC_EXIT__; - 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); - - /* Get local P2P Device Name*/ - reply = asp_tech_p2p_dbus_method_call_sync(WFD_MANAGER_CONFIG_INTERFACE, - "GetDeviceName", NULL, &error); - if (error != NULL) { - result = __net_wifidirect_gerror_to_enum(error); - g_error_free(error); - __ASP_LOG_FUNC_EXIT__; - return result; - } - g_variant_get(reply, "(i&s)", &result, &str); - g_strlcpy(asp->p2p_device_name, str, DEVICE_NAME_LEN + 1); - - g_variant_unref(reply); - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_p2p_deinit() -{ - __ASP_LOG_FUNC_ENTER__; - gint32 result = 0; - - if (g_wfd_gdbus_conn == NULL) - return -1; - - /* unsubscribe signal handler */ - g_dbus_connection_signal_unsubscribe(g_wfd_gdbus_conn, g_wfd_signal_id); - g_wfd_signal_id = 0; - - /* unref gdbus connection */ - g_object_unref(g_wfd_gdbus_conn); - g_wfd_gdbus_conn = NULL; - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_p2p_get_peer_role(const guint8 *mac_addr, gint32 *is_connected, gint32 *role) -{ - __ASP_LOG_FUNC_ENTER__; - GVariant *params = NULL; - GVariant *reply = NULL; - GError* error = NULL; - - GVariantIter *iter_peer = NULL; - GVariant *var = NULL; - gchar *key = NULL; - gchar mac_address[18] = {0,}; - gboolean is_group_client = FALSE; - gboolean is_group_owner = FALSE; - gboolean is_in_group = FALSE; - gint32 result = 0; - - /* Get P2P peer info*/ - 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); - if (error != NULL) { - result = __net_wifidirect_gerror_to_enum(error); - g_error_free(error); - __ASP_LOG_FUNC_EXIT__; - return result; - } - - g_variant_get(reply, "(ia{sv})", &result, &iter_peer); - if (result != 0) { - __ASP_LOG_FUNC_EXIT__; - return -1; - } - - while (g_variant_iter_loop(iter_peer, "{sv}", &key, &var)) { - if (!g_strcmp0(key, "IsConnected")) - is_group_client = g_variant_get_boolean(var); - - else if (!g_strcmp0(key, "IsGroupOwner")) - is_group_owner = g_variant_get_boolean(var); - - else if (!g_strcmp0(key, "IsInGroup")) - is_in_group = g_variant_get_boolean(var); - - else - ;/* Do Nothing */ - } - - g_variant_iter_free(iter_peer); - g_variant_unref(reply); - if (is_group_owner) - *role = ASP_TECH_P2P_ROLE_GO; - if (is_group_client) - *role = ASP_TECH_P2P_ROLE_GC; - - if (is_in_group) - *is_connected = is_in_group; - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -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; - 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 + 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 + 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)); - g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new("u", params->network_config)); - if (params->session_information) - g_variant_builder_add(builder, "{sv}", "session _info", g_variant_new("s", params->session_information)); - - variant_params = g_variant_new("(a{sv})", builder); - g_variant_builder_unref(builder); - - /* Connect ASP session via P2P group */ - reply = asp_tech_p2p_dbus_method_call_sync(WFD_MANAGER_ASP_INTERFACE, - "ConnectSession", variant_params, &error); - if (error != NULL) { - result = __net_wifidirect_gerror_to_enum(error); - g_error_free(error); - __ASP_LOG_FUNC_EXIT__; - return result; - } - - g_variant_get(reply, "(i)", &result); - g_variant_unref(reply); - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_p2p_connect_session(asp_tech_session_request_params_s *params) -{ - __ASP_LOG_FUNC_ENTER__; - gint32 is_connected = 0; - gint32 role = ASP_TECH_P2P_ROLE_NEW; - gint32 result = 0; - - result = asp_tech_p2p_get_peer_role(params->service_mac, &is_connected, &role); - if (result < 0) { - ASP_LOGE("get peer role failed"); - __ASP_LOG_FUNC_EXIT__; - return ASP_ERROR_OPERATION_FAILED; - } - - if (params->network_role != ASP_TECH_P2P_ROLE_NEW && - params->network_role == role) { - ASP_LOGE("Device can't be requested role"); - __ASP_LOG_FUNC_EXIT__; - return ASP_ERROR_NETWORK_ROLE_REJECTED; - } - result = __asp_tech_p2p_send_prov(params); - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -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; - guint8 *service_mac = NULL; - guint32 adv_id = 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 + 1, MACSTR, MAC2STR(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", session_id)); - g_variant_builder_add(builder, "{sv}", "confirm", g_variant_new("i", confirm)); - 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)); - } - if (asp_session_get_advertisement_mac(session_mac, session_id, &service_mac)) { - g_snprintf(mac_str, MACSTR_LEN + 1, MACSTR, MAC2STR(service_mac)); - g_variant_builder_add(builder, "{sv}", "service_mac", g_variant_new("s", mac_str)); - } - if (asp_session_get_advertisement_id(session_mac, session_id, &adv_id)) - g_variant_builder_add(builder, "{sv}", "adv_id", g_variant_new("u", adv_id)); - - params = g_variant_new("(a{sv})", builder); - g_variant_builder_unref(builder); - - /* Confirm session requested via P2P */ - reply = asp_tech_p2p_dbus_method_call_sync(WFD_MANAGER_ASP_INTERFACE, - "ConfirmSession", params, &error); - if (error != NULL) { - result = __net_wifidirect_gerror_to_enum(error); - g_error_free(error); - __ASP_LOG_FUNC_EXIT__; - return result; - } - - g_variant_get(reply, "(i)", &result); - g_variant_unref(reply); - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_p2p_destroy_connection(const guint8 *peer_id, gint32 peer_id_length) -{ - __ASP_LOG_FUNC_ENTER__; - GVariant *reply = NULL; - GError* error = NULL; - 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); - if (error != NULL) { - result = __net_wifidirect_gerror_to_enum(error); - g_error_free(error); - __ASP_LOG_FUNC_EXIT__; - return result; - } - - g_variant_get(reply, "(i)", &result); - g_variant_unref(reply); - - __ASP_LOG_FUNC_EXIT__; - 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, - .advertise = asp_tech_p2p_advertise, - .cancel_advertise = asp_tech_p2p_cancel_advertise, - .seek = asp_tech_p2p_seek, - .cancel_seek = asp_tech_p2p_cancel_seek, - .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-p2p.h b/src/tech/asp-tech-p2p.h deleted file mode 100755 index c6182c6..0000000 --- a/src/tech/asp-tech-p2p.h +++ /dev/null @@ -1,20 +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. - */ - -#ifndef __ASP_TECH_P2P_H__ -#define __ASP_TECH_P2P_H__ - -#endif /* __ASP_TECH_P2P_H__ */ diff --git a/src/tech/asp-tech.c b/src/tech/asp-tech.c deleted file mode 100755 index 0cbea7a..0000000 --- a/src/tech/asp-tech.c +++ /dev/null @@ -1,356 +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 - -/***************************************************************************** - * System headers - *****************************************************************************/ - -#include -#include - -/***************************************************************************** - * Application Service Platform Daemon headers - *****************************************************************************/ -#include "asp-manager-util.h" -#include "asp-service.h" -#include "asp-session.h" -#include "asp-tech.h" - -/***************************************************************************** - * Macros and Typedefs - *****************************************************************************/ - -/* TODO : define service data structure */ - -/***************************************************************************** - * Global Variables - *****************************************************************************/ - -/* TODO : define local memory for service data structure */ - -extern asp_tech_ops_s asp_tech_p2p_ops; -extern asp_tech_ops_s asp_tech_ble_ops; -extern asp_tech_ops_s asp_tech_nfc_ops; -extern asp_tech_ops_s asp_tech_infra_ops; -extern asp_tech_ops_s asp_tech_nan_ops; - -asp_tech_ops_s *asp_techs[] = { - NULL, - &asp_tech_p2p_ops, - &asp_tech_ble_ops, - &asp_tech_nfc_ops, - &asp_tech_infra_ops, - &asp_tech_nan_ops, - NULL -}; - -/***************************************************************************** - * Local Functions Definition - *****************************************************************************/ - -void asp_tech_init() -{ - __ASP_LOG_FUNC_ENTER__; - gint32 result = 0; - - result = asp_techs[ASP_TECH_P2P]->init(); - if (result < 0) { - ASP_LOGE("Failed to initialize p2p"); - /* TODO : exclude p2p technology */ - } - - result = asp_techs[ASP_TECH_INFRA]->init(); - if (result < 0) { - ASP_LOGE("Failed to initialize infra"); - /* TODO : exclude infra technology */ - } - - __ASP_LOG_FUNC_EXIT__; - return; -} - -void asp_tech_deinit() -{ - __ASP_LOG_FUNC_ENTER__; - gint32 result = 0; - - result = asp_techs[ASP_TECH_P2P]->deinit(); - if (result < 0) { - ASP_LOGE("Failed to deinitialize p2p"); - /* TODO : exclude p2p technology */ - } - - result = asp_techs[ASP_TECH_INFRA]->deinit(); - if (result < 0) { - ASP_LOGE("Failed to deinitialize infra"); - /* TODO : exclude infra technology */ - } - - __ASP_LOG_FUNC_EXIT__; - return; -} - -gint32 asp_tech_advertise(gint32 tech, asp_service_advertise_s *service, gint32 replace) -{ - __ASP_LOG_FUNC_ENTER__; - 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); - if (tech & tech_idx) { - ASP_LOGD("Advertise using tech %d", tech); - result = asp_techs[i]->advertise(service, replace); - } - /* TODO */ - /* error handling */ - } - - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_cancel_advertise(gint32 tech, asp_service_advertise_s *service) -{ - __ASP_LOG_FUNC_ENTER__; - 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); - if (tech & tech_idx) { - ASP_LOGD("Cancel advertise using tech %d", tech_idx); - result = asp_techs[i]->cancel_advertise(service); - } - /* TODO */ - /* error handling */ - } - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_seek(gint32 tech, asp_service_seek_s *service) -{ - __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("Seek service using tech %d", tech_idx); - result = asp_techs[i]->seek(service); - } - /* TODO */ - /* error handling */ - } - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_cancel_seek(gint32 tech, asp_service_seek_s *service) -{ - __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("Cancel seek service using tech %d", tech_idx); - result = asp_techs[i]->cancel_seek(service); - } - /* TODO */ - /* error handling */ - } - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_connect_session(gint32 tech, asp_tech_session_request_params_s *params) -{ - __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("Connect session using tech %d", tech_idx); - result = asp_techs[i]->connect_session(params); - /* TODO */ - /* error handling */ - break; - } - } - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_confirm_session(gint32 tech, const guint8 *session_mac, gint32 session_id, gint32 confirm, guint32 pin) -{ - __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("Confirm session using tech %d", tech_idx); - result = asp_techs[i]->confirm_session(session_mac, session_id, confirm, pin); - /* TODO */ - /* error handling */ - break; - } - } - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_destroy_connection(gint32 tech, const guint8 *peer_id, gint32 peer_id_length) -{ - __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("Destroy connection using tech %d", tech_idx); - result = asp_techs[i]->destroy_connection(peer_id, peer_id_length); - } - /* TODO */ - /* error handling */ - } - __ASP_LOG_FUNC_EXIT__; - return result; -} - -gint32 asp_tech_is_peer_connected(gint32 tech, const guint8 *peer_id, gint32 peer_id_length, gint32 *is_connected) -{ - __ASP_LOG_FUNC_ENTER__; - gint32 tech_idx = 0; - gint32 i = 0; - gint32 result = 0; - - for (i = 1; i != ASP_TECH_MAX; i++) { - tech_idx = 1 << (i - 1); - if (tech & tech_idx) { - ASP_LOGD("Is peer connected using tech %d", tech_idx); - result = asp_techs[i]->is_peer_connected(peer_id, peer_id_length, is_connected); - } - /* TODO */ - /* error handling */ - } - __ASP_LOG_FUNC_EXIT__; - return result; -} - -void asp_tech_set_session_request_cb(gint32 tech, asp_tech_session_request_cb cb, gpointer user_data) -{ - __ASP_LOG_FUNC_ENTER__; - gint32 tech_idx = 0; - gint32 i = 0; - - for (i = 1; i != ASP_TECH_MAX; i++) { - tech_idx = 1 << (i - 1); - if (tech & tech_idx) { - ASP_LOGD("Set session_request_cb using tech %d", tech_idx); - asp_techs[i]->session_request_cb = cb; - asp_techs[i]->session_request_cb_user_data = user_data; - } - /* TODO */ - /* error handling */ - } - __ASP_LOG_FUNC_EXIT__; - return; -} - -void asp_tech_set_session_config_request_cb(gint32 tech, asp_tech_session_config_request_cb cb, gpointer user_data) -{ - __ASP_LOG_FUNC_ENTER__; - gint32 tech_idx = 0; - gint32 i = 0; - - for (i = 1; i != ASP_TECH_MAX; i++) { - tech_idx = 1 << (i - 1); - if (tech & tech_idx) { - ASP_LOGD("Set session_config_request_cb using tech %d", tech_idx); - asp_techs[i]->session_config_request_cb = cb; - asp_techs[i]->session_config_request_cb_user_data = user_data; - } - /* TODO */ - /* error handling */ - } - __ASP_LOG_FUNC_EXIT__; - return; -} - -void asp_tech_set_connect_status_cb(gint32 tech, asp_tech_connect_status_cb cb, gpointer user_data) -{ - __ASP_LOG_FUNC_ENTER__; - gint32 tech_idx = 0; - gint32 i = 0; - - for (i = 1; i != ASP_TECH_MAX; i++) { - tech_idx = 1 << (i - 1); - if (tech & tech_idx) { - ASP_LOGD("Set connect_status_cb using tech %d", tech_idx); - asp_techs[i]->connect_status_cb = cb; - asp_techs[i]->connect_status_cb_user_data = user_data; - } - /* TODO */ - /* error handling */ - } - __ASP_LOG_FUNC_EXIT__; - return; -} - -void asp_tech_set_ip_assigned_cb(gint32 tech, asp_tech_ip_assigned_cb cb, gpointer user_data) -{ - __ASP_LOG_FUNC_ENTER__; - gint32 tech_idx = 0; - gint32 i = 0; - - for (i = 1; i != ASP_TECH_MAX; i++) { - tech_idx = 1 << (i - 1); - if (tech & tech_idx) { - ASP_LOGD("Set ip_assigned_cb using tech %d", tech_idx); - asp_techs[i]->ip_assigned_cb = cb; - asp_techs[i]->ip_assigned_cb_user_data = user_data; - } - /* TODO */ - /* error handling */ - } - __ASP_LOG_FUNC_EXIT__; - return; -}