Revise directory structure 09/238909/1 accepted/tizen_6.0_unified accepted/tizen_6.0_unified_hotfix accepted/tizen_6.5_unified accepted/tizen_7.0_unified accepted/tizen_7.0_unified_hotfix accepted/tizen_8.0_unified tizen_6.0 tizen_6.0_hotfix tizen_6.5 tizen_7.0 tizen_7.0_hotfix tizen_8.0 accepted/tizen/6.0/unified/20201030.120257 accepted/tizen/6.0/unified/hotfix/20201103.050129 accepted/tizen/6.5/unified/20211028.095824 accepted/tizen/7.0/unified/20221110.062855 accepted/tizen/7.0/unified/hotfix/20221116.105135 accepted/tizen/8.0/unified/20231005.093155 accepted/tizen/unified/20200720.125552 submit/tizen/20200720.073624 submit/tizen_6.0/20201029.205103 submit/tizen_6.0_hotfix/20201102.192503 submit/tizen_6.0_hotfix/20201103.114803 submit/tizen_6.5/20211028.162201 tizen_6.0.m2_release tizen_6.5.m2_release tizen_7.0_m2_release tizen_8.0_m2_release
authorCheoleun Moon <chleun.moon@samsung.com>
Mon, 20 Jul 2020 07:24:55 +0000 (16:24 +0900)
committerCheoleun Moon <chleun.moon@samsung.com>
Mon, 20 Jul 2020 07:25:04 +0000 (16:25 +0900)
Change-Id: Ifc73069efe05d2bad2229c19dd473dba117424bc

45 files changed:
src/CMakeLists.txt
src/asp-coordination-protocol.c [new file with mode: 0644]
src/asp-coordination-protocol.h [new file with mode: 0644]
src/asp-p2p-conn.c [new file with mode: 0644]
src/asp-p2p-conn.h [new file with mode: 0644]
src/asp-service.c [new file with mode: 0755]
src/asp-session-peer-interface.h [new file with mode: 0644]
src/asp-session-peer.c [new file with mode: 0644]
src/asp-session-peer.h [new file with mode: 0644]
src/asp-session.c [new file with mode: 0644]
src/asp-tech-ble.c [new file with mode: 0755]
src/asp-tech-ble.h [new file with mode: 0755]
src/asp-tech-infra.c [new file with mode: 0644]
src/asp-tech-infra.h [new file with mode: 0755]
src/asp-tech-nan.c [new file with mode: 0755]
src/asp-tech-nan.h [new file with mode: 0755]
src/asp-tech-nfc.c [new file with mode: 0755]
src/asp-tech-nfc.h [new file with mode: 0755]
src/asp-tech-p2p.c [new file with mode: 0755]
src/asp-tech-p2p.h [new file with mode: 0755]
src/asp-tech.c [new file with mode: 0755]
src/gfsm.c [new file with mode: 0644]
src/gfsm.h [new file with mode: 0644]
src/service/asp-service.c [deleted file]
src/session/asp-coordination-protocol.c [deleted file]
src/session/asp-coordination-protocol.h [deleted file]
src/session/asp-p2p-conn.c [deleted file]
src/session/asp-p2p-conn.h [deleted file]
src/session/asp-session-peer-interface.h [deleted file]
src/session/asp-session-peer.c [deleted file]
src/session/asp-session-peer.h [deleted file]
src/session/asp-session.c [deleted file]
src/session/gfsm.c [deleted file]
src/session/gfsm.h [deleted file]
src/tech/asp-tech-ble.c [deleted file]
src/tech/asp-tech-ble.h [deleted file]
src/tech/asp-tech-infra.c [deleted file]
src/tech/asp-tech-infra.h [deleted file]
src/tech/asp-tech-nan.c [deleted file]
src/tech/asp-tech-nan.h [deleted file]
src/tech/asp-tech-nfc.c [deleted file]
src/tech/asp-tech-nfc.h [deleted file]
src/tech/asp-tech-p2p.c [deleted file]
src/tech/asp-tech-p2p.h [deleted file]
src/tech/asp-tech.c [deleted file]

index 3f7b4230269edd2c88e4dee4667a857cb5aa6e0c..dfe4d34ff5f65b7ec376b8dd4ed345b3d7687138 100755 (executable)
@@ -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 (file)
index 0000000..0d85ca3
--- /dev/null
@@ -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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <arpa/inet.h>
+
+/*****************************************************************************
+ * System headers
+ *****************************************************************************/
+
+#include <glib.h>
+#include <gio/gio.h>
+/*#include <dlog.h> */
+
+/*****************************************************************************
+ * ASP coordination protocol header
+ *****************************************************************************/
+#include "asp-coordination-protocol.h"
+#include "asp-session-peer.h"
+#include "asp-manager-util.h"
+
+/*****************************************************************************
+ * Macros and Typedefs
+ *****************************************************************************/
+#define RW_BUF_SIZE 1600
+#define LENGTH_MAX 144
+#define ASP_COORDINATION_PROTOCOL_PORT 7235
+
+/* TODO : define session data structure */
+
+/*****************************************************************************
+ * Global Variables
+ *****************************************************************************/
+GSocket *coordination_protocol_socket = NULL;
+GSource *source = NULL;
+
+/* TODO : define local memory for session data structure */
+
+/*****************************************************************************
+ * Local Functions Definition
+ *****************************************************************************/
+
+static gboolean asp_coordination_protocol_read_cb(GIOChannel *src,
+               GIOCondition condition, gpointer data);
+static void asp_coordination_protocol_ack_handler(GSocketAddress *sock_addr,
+               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 (file)
index 0000000..c2b6dd7
--- /dev/null
@@ -0,0 +1,154 @@
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __ASP_COORDINATION_PROTOCOL_H__
+#define __ASP_COORDINATION_PROTOCOL_H__
+
+#include <stdio.h>
+#include <string.h>
+#include <glib.h>
+#include <gio/gio.h>
+
+#define SESSION_MAC_BUF_SIZE 6
+#define SESSION_INFO_BUF_SIZE 144
+#define DEFERRED_INFO_BUF_SIZE 144
+
+#define ADV
+
+#ifdef SEEKER
+#define ROLE "[seeker    ]"
+#define INFO_MSG ASP_LOGD("%s %s", 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 (file)
index 0000000..bfb4f13
--- /dev/null
@@ -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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+/*****************************************************************************
+ * System headers
+ *****************************************************************************/
+
+#include <gio/gio.h>
+
+#include<dlog.h>
+
+/*****************************************************************************
+ * Application Service Platform Daemon headers
+ *****************************************************************************/
+#include "asp-manager.h"
+#include "asp-p2p-conn.h"
+#include "asp-service.h"
+#include "asp-tech.h"
+
+/*****************************************************************************
+ * Macros and Typedefs
+ *****************************************************************************/
+
+/*****************************************************************************
+ * Global Variables
+ *****************************************************************************/
+
+static asp_p2p_conn_session_request_cb session_request_cb = NULL;
+static gpointer session_request_cb_user_data = NULL;
+static asp_p2p_conn_session_config_request_cb session_config_request_cb = NULL;
+static gpointer session_config_request_cb_user_data = NULL;
+static asp_p2p_conn_connect_status_cb connect_status_cb = NULL;
+static gpointer connect_status_cb_user_data = NULL;
+static asp_p2p_conn_ip_assigned_cb ip_assigned_cb = NULL;
+static gpointer ip_assigned_cb_user_data = NULL;
+
+/*****************************************************************************
+ * Local Functions Definition
+ *****************************************************************************/
+
+void asp_p2p_conn_initialize()
+{
+       __ASP_LOG_FUNC_ENTER__;
+
+       session_request_cb = NULL;
+       session_request_cb_user_data = NULL;
+       session_config_request_cb = NULL;
+       session_config_request_cb_user_data = NULL;
+       connect_status_cb = NULL;
+       connect_status_cb_user_data = NULL;
+
+       __ASP_LOG_FUNC_EXIT__;
+       return;
+}
+
+void asp_p2p_conn_deinitialize()
+{
+       __ASP_LOG_FUNC_ENTER__;
+
+       session_request_cb = NULL;
+       session_request_cb_user_data = NULL;
+       session_config_request_cb = NULL;
+       session_config_request_cb_user_data = NULL;
+       connect_status_cb = NULL;
+       connect_status_cb_user_data = NULL;
+
+       __ASP_LOG_FUNC_EXIT__;
+       return;
+}
+
+void asp_p2p_conn_connect_session(const guint8 *session_mac, guint32 session_id,
+                                 const guint8 *service_mac,
+                                 guint32 adv_id, const guint8 *session_info, size_t info_length,
+                                 guint8 network_role, guint8 network_config)
+{
+       __ASP_LOG_FUNC_ENTER__;
+       asp_tech_session_request_params_s params = {{0, } };
+       gint32 res = 0;
+
+       /* Make connect parameter for session request */
+       memcpy(params.session_mac, session_mac, MAC_LEN);
+       params.session_id = session_id;
+       memcpy(params.service_mac, service_mac, MAC_LEN);
+       params.advertisement_id = adv_id;
+       params.network_role = network_role;
+       params.network_config = network_config;
+       if (info_length != 0) {
+               params.session_information = g_try_malloc0(info_length + 1);
+               if (params.session_information)
+                       memcpy(params.session_information, session_info, info_length);
+       }
+
+       res = asp_tech_connect_session(ASP_TECH_P2P, &params);
+       if (res != 0 && connect_status_cb) {
+               ASP_LOGE("request connect is failed");
+               /* TODO: assign proper error code and connect status. */
+               connect_status_cb(0, session_mac, session_id,
+                                 ASP_SESSION_CONNECT_STATUS_NETWORK_ROLE_REJECTED,
+                                 connect_status_cb_user_data);
+       }
+       g_free(params.session_information);
+
+       __ASP_LOG_FUNC_EXIT__;
+       return;
+}
+
+void asp_p2p_conn_confirm_session(const guint8 *session_mac, guint32 session_id,
+                                 gboolean confirmed, guint32 network_config_pin)
+{
+       __ASP_LOG_FUNC_ENTER__;
+       gint32 res = 0;
+
+       res = asp_tech_confirm_session(ASP_TECH_P2P, session_mac,
+                                      session_id, confirmed, network_config_pin);
+       if (res < 0) {
+               ASP_LOGE("confirm session is failed");
+               return;
+       }
+
+       __ASP_LOG_FUNC_EXIT__;
+       return;
+}
+
+void asp_p2p_conn_disconnect_p2p(const guint8 *peer_mac)
+{
+       __ASP_LOG_FUNC_ENTER__;
+       guint8 mac[MAC_LEN] = {0, };
+       gint32 res = 0;
+
+       memcpy(mac, peer_mac, MAC_LEN);
+       res = asp_tech_destroy_connection(ASP_TECH_P2P, mac, MAC_LEN);
+       if (res < 0) {
+               ASP_LOGE("asp_tech_destroy_connection is failed");
+               return;
+       }
+
+       __ASP_LOG_FUNC_EXIT__;
+       return;
+}
+
+gboolean asp_p2p_conn_peer_is_connected(const guint8 *peer_mac)
+{
+       __ASP_LOG_FUNC_ENTER__;
+       gint32 is_peer_connected = 0;
+       gboolean is_connected = 0;
+       guint8 mac[MAC_LEN] = {0, };
+       gint32 res = 0;
+
+       memcpy(mac, peer_mac, MAC_LEN);
+       res = asp_tech_is_peer_connected(ASP_TECH_P2P, mac,
+                                        MAC_LEN, &is_peer_connected);
+       if (res < 0) {
+               ASP_LOGE("asp_tech_is_peer_connected is failed");
+               return FALSE;
+       }
+
+       is_connected = is_peer_connected;
+       __ASP_LOG_FUNC_EXIT__;
+       return is_connected;
+}
+
+void asp_p2p_conn_set_session_request_cb(asp_p2p_conn_session_request_cb cb,
+               gpointer user_data)
+{
+       __ASP_LOG_FUNC_ENTER__;
+
+       session_request_cb = cb;
+       session_request_cb_user_data = user_data;
+
+       asp_tech_set_session_request_cb(ASP_TECH_P2P, cb, user_data);
+
+       __ASP_LOG_FUNC_EXIT__;
+       return;
+}
+
+void asp_p2p_conn_set_session_config_request_cb(
+       asp_p2p_conn_session_config_request_cb cb, gpointer user_data)
+{
+       __ASP_LOG_FUNC_ENTER__;
+
+       session_config_request_cb = cb;
+       session_config_request_cb_user_data = user_data;
+
+       asp_tech_set_session_config_request_cb(ASP_TECH_P2P, cb, user_data);
+
+       __ASP_LOG_FUNC_EXIT__;
+       return;
+}
+
+void asp_p2p_conn_set_connect_status_cb(asp_p2p_conn_connect_status_cb cb,
+                                       gpointer user_data)
+{
+       __ASP_LOG_FUNC_ENTER__;
+
+       connect_status_cb = cb;
+       connect_status_cb_user_data = user_data;
+
+       asp_tech_set_connect_status_cb(ASP_TECH_P2P, cb, user_data);
+
+       __ASP_LOG_FUNC_EXIT__;
+       return;
+}
+
+void asp_p2p_conn_set_ip_assigned_cb(asp_p2p_conn_ip_assigned_cb cb,
+                                    gpointer user_data)
+{
+       __ASP_LOG_FUNC_ENTER__;
+
+       ip_assigned_cb = cb;
+       ip_assigned_cb_user_data = user_data;
+
+       asp_tech_set_ip_assigned_cb(ASP_TECH_P2P, cb, user_data);
+
+       __ASP_LOG_FUNC_EXIT__;
+       return;
+}
+
+void asp_p2p_conn_get_p2p_mac(gchar *my_p2p_mac)
+{
+       __ASP_LOG_FUNC_ENTER__;
+
+       asp_s *asp = asp_get_manager();
+       if (asp == NULL) {
+               ASP_LOGE("memory allocation for asp-manager is failed");
+               return;
+       }
+
+       memcpy(my_p2p_mac, asp->p2p_local_address, MAC_LEN);
+
+       __ASP_LOG_FUNC_EXIT__;
+       return;
+}
diff --git a/src/asp-p2p-conn.h b/src/asp-p2p-conn.h
new file mode 100644 (file)
index 0000000..462fef6
--- /dev/null
@@ -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 (executable)
index 0000000..827aada
--- /dev/null
@@ -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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+/*****************************************************************************
+ * System headers
+ *****************************************************************************/
+
+#include <glib.h>
+#include <gio/gio.h>
+
+#include<dlog.h>
+
+/*****************************************************************************
+ * 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 (file)
index 0000000..f0b4112
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __ASP_SESSION_PEER_INTERFACE_H__
+#define __ASP_SESSION_PEER_INTERFACE_H__
+
+#include <glib.h>
+#include <gio/gio.h>
+
+void asp_session_recv_req(GSocketAddress *sock_addr, gpointer p_msg);
+void asp_session_recv_ack(GSocketAddress *sock_addr, guint8 *session_mac,
+                         guint32 session_id, gpointer p_msg);
+void asp_session_recv_nack(GSocketAddress *sock_addr, guint8 *session_mac,
+                          guint32 session_id, gpointer p_msg);
+void asp_session_peer_destroyed(guint8 *session_mac, guint32 session_id);
+
+#endif                                                 /* __ASP_SESSION_PEER_INTERFACE_H__ */
diff --git a/src/asp-session-peer.c b/src/asp-session-peer.c
new file mode 100644 (file)
index 0000000..33f328a
--- /dev/null
@@ -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 (file)
index 0000000..ff3e635
--- /dev/null
@@ -0,0 +1,19 @@
+#ifndef _ASP_SESS_PEER_H_
+#define _ASP_SESS_PEER_H_
+
+#include <glib.h>
+#include <gio/gio.h>
+
+void asp_sess_peer_init();
+void asp_sess_peer_destroy();
+
+gboolean asp_sess_peer_send_msg(GSocketAddress *p_sock_addr, 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 (file)
index 0000000..52adfde
--- /dev/null
@@ -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 <stdio.h>
+#include <stdlib.h>
+/*#include <string.h> */
+/*#include <time.h> */
+
+#define HAVE_ASP_P2P_CONN
+
+/*****************************************************************************
+ * System headers
+ *****************************************************************************/
+/*#include <dlog.h> */
+#include <gio/gio.h>
+
+#ifdef HAVE_ASP_P2P_CONN
+#include "asp-p2p-conn.h"
+#endif
+
+/*****************************************************************************
+ * Application Service Platform Daemon headers
+ *****************************************************************************/
+#include "asp-manager.h"
+#include "asp-manager-util.h"
+#include "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 (executable)
index 0000000..052ae1a
--- /dev/null
@@ -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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+/*****************************************************************************
+ * System headers
+ *****************************************************************************/
+
+#include <glib.h>
+#include<dlog.h>
+
+/*****************************************************************************
+ * 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 (executable)
index 0000000..5a77e44
--- /dev/null
@@ -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 (file)
index 0000000..44dca7e
--- /dev/null
@@ -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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+/*****************************************************************************
+ * System headers
+ *****************************************************************************/
+
+#include <glib.h>
+#include <dlog.h>
+
+#include <vconf.h>
+#include <vconf-keys.h>
+
+#include <dns-sd.h>
+#include <dns-sd-internal.h>
+
+#include <wifi-manager.h>
+
+/*****************************************************************************
+ * 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 (executable)
index 0000000..99492bf
--- /dev/null
@@ -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 (executable)
index 0000000..15893db
--- /dev/null
@@ -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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+/*****************************************************************************
+ * System headers
+ *****************************************************************************/
+
+#include <glib.h>
+#include<dlog.h>
+
+/*****************************************************************************
+ * 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 (executable)
index 0000000..ea06a36
--- /dev/null
@@ -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 (executable)
index 0000000..4940477
--- /dev/null
@@ -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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+/*****************************************************************************
+ * System headers
+ *****************************************************************************/
+
+#include <glib.h>
+#include<dlog.h>
+
+/*****************************************************************************
+ * 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 (executable)
index 0000000..a4e2192
--- /dev/null
@@ -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 (executable)
index 0000000..4a21c28
--- /dev/null
@@ -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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+/*****************************************************************************
+ * System headers
+ *****************************************************************************/
+
+#include <glib.h>
+#include <dlog.h>
+#include <gio/gio.h>
+
+/*****************************************************************************
+ * 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 (executable)
index 0000000..c6182c6
--- /dev/null
@@ -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 (executable)
index 0000000..0cbea7a
--- /dev/null
@@ -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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+/*****************************************************************************
+ * System headers
+ *****************************************************************************/
+
+#include <glib.h>
+#include <dlog.h>
+
+/*****************************************************************************
+ * 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 (file)
index 0000000..04578af
--- /dev/null
@@ -0,0 +1,596 @@
+/*finite state machine
+ *
+ * Copyright (c) 2011 - 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Hojeen Jee <hojeen.jee@samsung.com>, Jaejun Sim <jj.sim@samsung.com>,
+ * Jinho Ha <jinho89.ha@samsung.com>
+ *
+ * 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 <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <stdio.h>
+#include <glib.h>
+#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 (file)
index 0000000..ab9d2b7
--- /dev/null
@@ -0,0 +1,195 @@
+/*finite state machine
+ *
+ * Copyright (c) 2011 - 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Hojeen Jee <hojeen.jee@samsung.com>, Jaejun Sim <jj.sim@samsung.com>,
+ * Jinho Ha <jinho89.ha@samsung.com>
+ *
+ * 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 (executable)
index 827aada..0000000
+++ /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 <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-
-/*****************************************************************************
- * System headers
- *****************************************************************************/
-
-#include <glib.h>
-#include <gio/gio.h>
-
-#include<dlog.h>
-
-/*****************************************************************************
- * 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 (file)
index 0d85ca3..0000000
+++ /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 <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <arpa/inet.h>
-
-/*****************************************************************************
- * System headers
- *****************************************************************************/
-
-#include <glib.h>
-#include <gio/gio.h>
-/*#include <dlog.h> */
-
-/*****************************************************************************
- * ASP coordination protocol header
- *****************************************************************************/
-#include "asp-coordination-protocol.h"
-#include "asp-session-peer.h"
-#include "asp-manager-util.h"
-
-/*****************************************************************************
- * Macros and Typedefs
- *****************************************************************************/
-#define RW_BUF_SIZE 1600
-#define LENGTH_MAX 144
-#define ASP_COORDINATION_PROTOCOL_PORT 7235
-
-/* TODO : define session data structure */
-
-/*****************************************************************************
- * Global Variables
- *****************************************************************************/
-GSocket *coordination_protocol_socket = NULL;
-GSource *source = NULL;
-
-/* TODO : define local memory for session data structure */
-
-/*****************************************************************************
- * Local Functions Definition
- *****************************************************************************/
-
-static gboolean asp_coordination_protocol_read_cb(GIOChannel *src,
-               GIOCondition condition, gpointer data);
-static void asp_coordination_protocol_ack_handler(GSocketAddress *sock_addr,
-               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 (file)
index c2b6dd7..0000000
+++ /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 <stdio.h>
-#include <string.h>
-#include <glib.h>
-#include <gio/gio.h>
-
-#define SESSION_MAC_BUF_SIZE 6
-#define SESSION_INFO_BUF_SIZE 144
-#define DEFERRED_INFO_BUF_SIZE 144
-
-#define ADV
-
-#ifdef SEEKER
-#define ROLE "[seeker    ]"
-#define INFO_MSG ASP_LOGD("%s %s", 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 (file)
index bfb4f13..0000000
+++ /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 <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-
-/*****************************************************************************
- * System headers
- *****************************************************************************/
-
-#include <gio/gio.h>
-
-#include<dlog.h>
-
-/*****************************************************************************
- * Application Service Platform Daemon headers
- *****************************************************************************/
-#include "asp-manager.h"
-#include "asp-p2p-conn.h"
-#include "asp-service.h"
-#include "asp-tech.h"
-
-/*****************************************************************************
- * Macros and Typedefs
- *****************************************************************************/
-
-/*****************************************************************************
- * Global Variables
- *****************************************************************************/
-
-static asp_p2p_conn_session_request_cb session_request_cb = NULL;
-static gpointer session_request_cb_user_data = NULL;
-static asp_p2p_conn_session_config_request_cb session_config_request_cb = NULL;
-static gpointer session_config_request_cb_user_data = NULL;
-static asp_p2p_conn_connect_status_cb connect_status_cb = NULL;
-static gpointer connect_status_cb_user_data = NULL;
-static asp_p2p_conn_ip_assigned_cb ip_assigned_cb = NULL;
-static gpointer ip_assigned_cb_user_data = NULL;
-
-/*****************************************************************************
- * Local Functions Definition
- *****************************************************************************/
-
-void asp_p2p_conn_initialize()
-{
-       __ASP_LOG_FUNC_ENTER__;
-
-       session_request_cb = NULL;
-       session_request_cb_user_data = NULL;
-       session_config_request_cb = NULL;
-       session_config_request_cb_user_data = NULL;
-       connect_status_cb = NULL;
-       connect_status_cb_user_data = NULL;
-
-       __ASP_LOG_FUNC_EXIT__;
-       return;
-}
-
-void asp_p2p_conn_deinitialize()
-{
-       __ASP_LOG_FUNC_ENTER__;
-
-       session_request_cb = NULL;
-       session_request_cb_user_data = NULL;
-       session_config_request_cb = NULL;
-       session_config_request_cb_user_data = NULL;
-       connect_status_cb = NULL;
-       connect_status_cb_user_data = NULL;
-
-       __ASP_LOG_FUNC_EXIT__;
-       return;
-}
-
-void asp_p2p_conn_connect_session(const guint8 *session_mac, guint32 session_id,
-                                 const guint8 *service_mac,
-                                 guint32 adv_id, const guint8 *session_info, size_t info_length,
-                                 guint8 network_role, guint8 network_config)
-{
-       __ASP_LOG_FUNC_ENTER__;
-       asp_tech_session_request_params_s params = {{0, } };
-       gint32 res = 0;
-
-       /* Make connect parameter for session request */
-       memcpy(params.session_mac, session_mac, MAC_LEN);
-       params.session_id = session_id;
-       memcpy(params.service_mac, service_mac, MAC_LEN);
-       params.advertisement_id = adv_id;
-       params.network_role = network_role;
-       params.network_config = network_config;
-       if (info_length != 0) {
-               params.session_information = g_try_malloc0(info_length + 1);
-               if (params.session_information)
-                       memcpy(params.session_information, session_info, info_length);
-       }
-
-       res = asp_tech_connect_session(ASP_TECH_P2P, &params);
-       if (res != 0 && connect_status_cb) {
-               ASP_LOGE("request connect is failed");
-               /* TODO: assign proper error code and connect status. */
-               connect_status_cb(0, session_mac, session_id,
-                                 ASP_SESSION_CONNECT_STATUS_NETWORK_ROLE_REJECTED,
-                                 connect_status_cb_user_data);
-       }
-       g_free(params.session_information);
-
-       __ASP_LOG_FUNC_EXIT__;
-       return;
-}
-
-void asp_p2p_conn_confirm_session(const guint8 *session_mac, guint32 session_id,
-                                 gboolean confirmed, guint32 network_config_pin)
-{
-       __ASP_LOG_FUNC_ENTER__;
-       gint32 res = 0;
-
-       res = asp_tech_confirm_session(ASP_TECH_P2P, session_mac,
-                                      session_id, confirmed, network_config_pin);
-       if (res < 0) {
-               ASP_LOGE("confirm session is failed");
-               return;
-       }
-
-       __ASP_LOG_FUNC_EXIT__;
-       return;
-}
-
-void asp_p2p_conn_disconnect_p2p(const guint8 *peer_mac)
-{
-       __ASP_LOG_FUNC_ENTER__;
-       guint8 mac[MAC_LEN] = {0, };
-       gint32 res = 0;
-
-       memcpy(mac, peer_mac, MAC_LEN);
-       res = asp_tech_destroy_connection(ASP_TECH_P2P, mac, MAC_LEN);
-       if (res < 0) {
-               ASP_LOGE("asp_tech_destroy_connection is failed");
-               return;
-       }
-
-       __ASP_LOG_FUNC_EXIT__;
-       return;
-}
-
-gboolean asp_p2p_conn_peer_is_connected(const guint8 *peer_mac)
-{
-       __ASP_LOG_FUNC_ENTER__;
-       gint32 is_peer_connected = 0;
-       gboolean is_connected = 0;
-       guint8 mac[MAC_LEN] = {0, };
-       gint32 res = 0;
-
-       memcpy(mac, peer_mac, MAC_LEN);
-       res = asp_tech_is_peer_connected(ASP_TECH_P2P, mac,
-                                        MAC_LEN, &is_peer_connected);
-       if (res < 0) {
-               ASP_LOGE("asp_tech_is_peer_connected is failed");
-               return FALSE;
-       }
-
-       is_connected = is_peer_connected;
-       __ASP_LOG_FUNC_EXIT__;
-       return is_connected;
-}
-
-void asp_p2p_conn_set_session_request_cb(asp_p2p_conn_session_request_cb cb,
-               gpointer user_data)
-{
-       __ASP_LOG_FUNC_ENTER__;
-
-       session_request_cb = cb;
-       session_request_cb_user_data = user_data;
-
-       asp_tech_set_session_request_cb(ASP_TECH_P2P, cb, user_data);
-
-       __ASP_LOG_FUNC_EXIT__;
-       return;
-}
-
-void asp_p2p_conn_set_session_config_request_cb(
-       asp_p2p_conn_session_config_request_cb cb, gpointer user_data)
-{
-       __ASP_LOG_FUNC_ENTER__;
-
-       session_config_request_cb = cb;
-       session_config_request_cb_user_data = user_data;
-
-       asp_tech_set_session_config_request_cb(ASP_TECH_P2P, cb, user_data);
-
-       __ASP_LOG_FUNC_EXIT__;
-       return;
-}
-
-void asp_p2p_conn_set_connect_status_cb(asp_p2p_conn_connect_status_cb cb,
-                                       gpointer user_data)
-{
-       __ASP_LOG_FUNC_ENTER__;
-
-       connect_status_cb = cb;
-       connect_status_cb_user_data = user_data;
-
-       asp_tech_set_connect_status_cb(ASP_TECH_P2P, cb, user_data);
-
-       __ASP_LOG_FUNC_EXIT__;
-       return;
-}
-
-void asp_p2p_conn_set_ip_assigned_cb(asp_p2p_conn_ip_assigned_cb cb,
-                                    gpointer user_data)
-{
-       __ASP_LOG_FUNC_ENTER__;
-
-       ip_assigned_cb = cb;
-       ip_assigned_cb_user_data = user_data;
-
-       asp_tech_set_ip_assigned_cb(ASP_TECH_P2P, cb, user_data);
-
-       __ASP_LOG_FUNC_EXIT__;
-       return;
-}
-
-void asp_p2p_conn_get_p2p_mac(gchar *my_p2p_mac)
-{
-       __ASP_LOG_FUNC_ENTER__;
-
-       asp_s *asp = asp_get_manager();
-       if (asp == NULL) {
-               ASP_LOGE("memory allocation for asp-manager is failed");
-               return;
-       }
-
-       memcpy(my_p2p_mac, asp->p2p_local_address, MAC_LEN);
-
-       __ASP_LOG_FUNC_EXIT__;
-       return;
-}
diff --git a/src/session/asp-p2p-conn.h b/src/session/asp-p2p-conn.h
deleted file mode 100644 (file)
index 462fef6..0000000
+++ /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 (file)
index f0b4112..0000000
+++ /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 <glib.h>
-#include <gio/gio.h>
-
-void asp_session_recv_req(GSocketAddress *sock_addr, gpointer p_msg);
-void asp_session_recv_ack(GSocketAddress *sock_addr, guint8 *session_mac,
-                         guint32 session_id, gpointer p_msg);
-void asp_session_recv_nack(GSocketAddress *sock_addr, guint8 *session_mac,
-                          guint32 session_id, gpointer p_msg);
-void asp_session_peer_destroyed(guint8 *session_mac, guint32 session_id);
-
-#endif                                                 /* __ASP_SESSION_PEER_INTERFACE_H__ */
diff --git a/src/session/asp-session-peer.c b/src/session/asp-session-peer.c
deleted file mode 100644 (file)
index 33f328a..0000000
+++ /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 (file)
index ff3e635..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-#ifndef _ASP_SESS_PEER_H_
-#define _ASP_SESS_PEER_H_
-
-#include <glib.h>
-#include <gio/gio.h>
-
-void asp_sess_peer_init();
-void asp_sess_peer_destroy();
-
-gboolean asp_sess_peer_send_msg(GSocketAddress *p_sock_addr, 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 (file)
index 52adfde..0000000
+++ /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 <stdio.h>
-#include <stdlib.h>
-/*#include <string.h> */
-/*#include <time.h> */
-
-#define HAVE_ASP_P2P_CONN
-
-/*****************************************************************************
- * System headers
- *****************************************************************************/
-/*#include <dlog.h> */
-#include <gio/gio.h>
-
-#ifdef HAVE_ASP_P2P_CONN
-#include "asp-p2p-conn.h"
-#endif
-
-/*****************************************************************************
- * Application Service Platform Daemon headers
- *****************************************************************************/
-#include "asp-manager.h"
-#include "asp-manager-util.h"
-#include "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 (file)
index 04578af..0000000
+++ /dev/null
@@ -1,596 +0,0 @@
-/*finite state machine
- *
- * Copyright (c) 2011 - 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Contact: Hojeen Jee <hojeen.jee@samsung.com>, Jaejun Sim <jj.sim@samsung.com>,
- * Jinho Ha <jinho89.ha@samsung.com>
- *
- * 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 <stdlib.h>
-#include <string.h>
-#include <assert.h>
-#include <stdio.h>
-#include <glib.h>
-#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 (file)
index ab9d2b7..0000000
+++ /dev/null
@@ -1,195 +0,0 @@
-/*finite state machine
- *
- * Copyright (c) 2011 - 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Contact: Hojeen Jee <hojeen.jee@samsung.com>, Jaejun Sim <jj.sim@samsung.com>,
- * Jinho Ha <jinho89.ha@samsung.com>
- *
- * 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 (executable)
index 052ae1a..0000000
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*****************************************************************************
- * Standard headers
- *****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-
-/*****************************************************************************
- * System headers
- *****************************************************************************/
-
-#include <glib.h>
-#include<dlog.h>
-
-/*****************************************************************************
- * 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 (executable)
index 5a77e44..0000000
+++ /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 (file)
index 44dca7e..0000000
+++ /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 <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-
-/*****************************************************************************
- * System headers
- *****************************************************************************/
-
-#include <glib.h>
-#include <dlog.h>
-
-#include <vconf.h>
-#include <vconf-keys.h>
-
-#include <dns-sd.h>
-#include <dns-sd-internal.h>
-
-#include <wifi-manager.h>
-
-/*****************************************************************************
- * 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 (executable)
index 99492bf..0000000
+++ /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 (executable)
index 15893db..0000000
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*****************************************************************************
- * Standard headers
- *****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-
-/*****************************************************************************
- * System headers
- *****************************************************************************/
-
-#include <glib.h>
-#include<dlog.h>
-
-/*****************************************************************************
- * 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 (executable)
index ea06a36..0000000
+++ /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 (executable)
index 4940477..0000000
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*****************************************************************************
- * Standard headers
- *****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-
-/*****************************************************************************
- * System headers
- *****************************************************************************/
-
-#include <glib.h>
-#include<dlog.h>
-
-/*****************************************************************************
- * 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 (executable)
index a4e2192..0000000
+++ /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 (executable)
index 4a21c28..0000000
+++ /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 <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-
-/*****************************************************************************
- * System headers
- *****************************************************************************/
-
-#include <glib.h>
-#include <dlog.h>
-#include <gio/gio.h>
-
-/*****************************************************************************
- * 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 (executable)
index c6182c6..0000000
+++ /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 (executable)
index 0cbea7a..0000000
+++ /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 <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-
-/*****************************************************************************
- * System headers
- *****************************************************************************/
-
-#include <glib.h>
-#include <dlog.h>
-
-/*****************************************************************************
- * 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;
-}