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)
--- /dev/null
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************
+ * Standard headers
+ *****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <arpa/inet.h>
+
+/*****************************************************************************
+ * System headers
+ *****************************************************************************/
+
+#include <glib.h>
+#include <gio/gio.h>
+/*#include <dlog.h> */
+
+/*****************************************************************************
+ * ASP coordination protocol header
+ *****************************************************************************/
+#include "asp-coordination-protocol.h"
+#include "asp-session-peer.h"
+#include "asp-manager-util.h"
+
+/*****************************************************************************
+ * Macros and Typedefs
+ *****************************************************************************/
+#define RW_BUF_SIZE 1600
+#define LENGTH_MAX 144
+#define ASP_COORDINATION_PROTOCOL_PORT 7235
+
+/* TODO : define session data structure */
+
+/*****************************************************************************
+ * Global Variables
+ *****************************************************************************/
+GSocket *coordination_protocol_socket = NULL;
+GSource *source = NULL;
+
+/* TODO : define local memory for session data structure */
+
+/*****************************************************************************
+ * Local Functions Definition
+ *****************************************************************************/
+
+static gboolean asp_coordination_protocol_read_cb(GIOChannel *src,
+ GIOCondition condition, gpointer data);
+static void asp_coordination_protocol_ack_handler(GSocketAddress *sock_addr,
+ 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);
+}
--- /dev/null
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __ASP_COORDINATION_PROTOCOL_H__
+#define __ASP_COORDINATION_PROTOCOL_H__
+
+#include <stdio.h>
+#include <string.h>
+#include <glib.h>
+#include <gio/gio.h>
+
+#define SESSION_MAC_BUF_SIZE 6
+#define SESSION_INFO_BUF_SIZE 144
+#define DEFERRED_INFO_BUF_SIZE 144
+
+#define ADV
+
+#ifdef SEEKER
+#define ROLE "[seeker ]"
+#define INFO_MSG ASP_LOGD("%s %s", 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__ */
--- /dev/null
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************
+ * Standard headers
+ *****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+/*****************************************************************************
+ * System headers
+ *****************************************************************************/
+
+#include <gio/gio.h>
+
+#include<dlog.h>
+
+/*****************************************************************************
+ * Application Service Platform Daemon headers
+ *****************************************************************************/
+#include "asp-manager.h"
+#include "asp-p2p-conn.h"
+#include "asp-service.h"
+#include "asp-tech.h"
+
+/*****************************************************************************
+ * Macros and Typedefs
+ *****************************************************************************/
+
+/*****************************************************************************
+ * Global Variables
+ *****************************************************************************/
+
+static asp_p2p_conn_session_request_cb session_request_cb = NULL;
+static gpointer session_request_cb_user_data = NULL;
+static asp_p2p_conn_session_config_request_cb session_config_request_cb = NULL;
+static gpointer session_config_request_cb_user_data = NULL;
+static asp_p2p_conn_connect_status_cb connect_status_cb = NULL;
+static gpointer connect_status_cb_user_data = NULL;
+static asp_p2p_conn_ip_assigned_cb ip_assigned_cb = NULL;
+static gpointer ip_assigned_cb_user_data = NULL;
+
+/*****************************************************************************
+ * Local Functions Definition
+ *****************************************************************************/
+
+void asp_p2p_conn_initialize()
+{
+ __ASP_LOG_FUNC_ENTER__;
+
+ session_request_cb = NULL;
+ session_request_cb_user_data = NULL;
+ session_config_request_cb = NULL;
+ session_config_request_cb_user_data = NULL;
+ connect_status_cb = NULL;
+ connect_status_cb_user_data = NULL;
+
+ __ASP_LOG_FUNC_EXIT__;
+ return;
+}
+
+void asp_p2p_conn_deinitialize()
+{
+ __ASP_LOG_FUNC_ENTER__;
+
+ session_request_cb = NULL;
+ session_request_cb_user_data = NULL;
+ session_config_request_cb = NULL;
+ session_config_request_cb_user_data = NULL;
+ connect_status_cb = NULL;
+ connect_status_cb_user_data = NULL;
+
+ __ASP_LOG_FUNC_EXIT__;
+ return;
+}
+
+void asp_p2p_conn_connect_session(const guint8 *session_mac, guint32 session_id,
+ const guint8 *service_mac,
+ guint32 adv_id, const guint8 *session_info, size_t info_length,
+ guint8 network_role, guint8 network_config)
+{
+ __ASP_LOG_FUNC_ENTER__;
+ asp_tech_session_request_params_s params = {{0, } };
+ gint32 res = 0;
+
+ /* Make connect parameter for session request */
+ memcpy(params.session_mac, session_mac, MAC_LEN);
+ params.session_id = session_id;
+ memcpy(params.service_mac, service_mac, MAC_LEN);
+ params.advertisement_id = adv_id;
+ params.network_role = network_role;
+ params.network_config = network_config;
+ if (info_length != 0) {
+ params.session_information = g_try_malloc0(info_length + 1);
+ if (params.session_information)
+ memcpy(params.session_information, session_info, info_length);
+ }
+
+ res = asp_tech_connect_session(ASP_TECH_P2P, ¶ms);
+ if (res != 0 && connect_status_cb) {
+ ASP_LOGE("request connect is failed");
+ /* TODO: assign proper error code and connect status. */
+ connect_status_cb(0, session_mac, session_id,
+ ASP_SESSION_CONNECT_STATUS_NETWORK_ROLE_REJECTED,
+ connect_status_cb_user_data);
+ }
+ g_free(params.session_information);
+
+ __ASP_LOG_FUNC_EXIT__;
+ return;
+}
+
+void asp_p2p_conn_confirm_session(const guint8 *session_mac, guint32 session_id,
+ gboolean confirmed, guint32 network_config_pin)
+{
+ __ASP_LOG_FUNC_ENTER__;
+ gint32 res = 0;
+
+ res = asp_tech_confirm_session(ASP_TECH_P2P, session_mac,
+ session_id, confirmed, network_config_pin);
+ if (res < 0) {
+ ASP_LOGE("confirm session is failed");
+ return;
+ }
+
+ __ASP_LOG_FUNC_EXIT__;
+ return;
+}
+
+void asp_p2p_conn_disconnect_p2p(const guint8 *peer_mac)
+{
+ __ASP_LOG_FUNC_ENTER__;
+ guint8 mac[MAC_LEN] = {0, };
+ gint32 res = 0;
+
+ memcpy(mac, peer_mac, MAC_LEN);
+ res = asp_tech_destroy_connection(ASP_TECH_P2P, mac, MAC_LEN);
+ if (res < 0) {
+ ASP_LOGE("asp_tech_destroy_connection is failed");
+ return;
+ }
+
+ __ASP_LOG_FUNC_EXIT__;
+ return;
+}
+
+gboolean asp_p2p_conn_peer_is_connected(const guint8 *peer_mac)
+{
+ __ASP_LOG_FUNC_ENTER__;
+ gint32 is_peer_connected = 0;
+ gboolean is_connected = 0;
+ guint8 mac[MAC_LEN] = {0, };
+ gint32 res = 0;
+
+ memcpy(mac, peer_mac, MAC_LEN);
+ res = asp_tech_is_peer_connected(ASP_TECH_P2P, mac,
+ MAC_LEN, &is_peer_connected);
+ if (res < 0) {
+ ASP_LOGE("asp_tech_is_peer_connected is failed");
+ return FALSE;
+ }
+
+ is_connected = is_peer_connected;
+ __ASP_LOG_FUNC_EXIT__;
+ return is_connected;
+}
+
+void asp_p2p_conn_set_session_request_cb(asp_p2p_conn_session_request_cb cb,
+ gpointer user_data)
+{
+ __ASP_LOG_FUNC_ENTER__;
+
+ session_request_cb = cb;
+ session_request_cb_user_data = user_data;
+
+ asp_tech_set_session_request_cb(ASP_TECH_P2P, cb, user_data);
+
+ __ASP_LOG_FUNC_EXIT__;
+ return;
+}
+
+void asp_p2p_conn_set_session_config_request_cb(
+ asp_p2p_conn_session_config_request_cb cb, gpointer user_data)
+{
+ __ASP_LOG_FUNC_ENTER__;
+
+ session_config_request_cb = cb;
+ session_config_request_cb_user_data = user_data;
+
+ asp_tech_set_session_config_request_cb(ASP_TECH_P2P, cb, user_data);
+
+ __ASP_LOG_FUNC_EXIT__;
+ return;
+}
+
+void asp_p2p_conn_set_connect_status_cb(asp_p2p_conn_connect_status_cb cb,
+ gpointer user_data)
+{
+ __ASP_LOG_FUNC_ENTER__;
+
+ connect_status_cb = cb;
+ connect_status_cb_user_data = user_data;
+
+ asp_tech_set_connect_status_cb(ASP_TECH_P2P, cb, user_data);
+
+ __ASP_LOG_FUNC_EXIT__;
+ return;
+}
+
+void asp_p2p_conn_set_ip_assigned_cb(asp_p2p_conn_ip_assigned_cb cb,
+ gpointer user_data)
+{
+ __ASP_LOG_FUNC_ENTER__;
+
+ ip_assigned_cb = cb;
+ ip_assigned_cb_user_data = user_data;
+
+ asp_tech_set_ip_assigned_cb(ASP_TECH_P2P, cb, user_data);
+
+ __ASP_LOG_FUNC_EXIT__;
+ return;
+}
+
+void asp_p2p_conn_get_p2p_mac(gchar *my_p2p_mac)
+{
+ __ASP_LOG_FUNC_ENTER__;
+
+ asp_s *asp = asp_get_manager();
+ if (asp == NULL) {
+ ASP_LOGE("memory allocation for asp-manager is failed");
+ return;
+ }
+
+ memcpy(my_p2p_mac, asp->p2p_local_address, MAC_LEN);
+
+ __ASP_LOG_FUNC_EXIT__;
+ return;
+}
--- /dev/null
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _ASP_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
--- /dev/null
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************
+ * Standard headers
+ *****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+/*****************************************************************************
+ * System headers
+ *****************************************************************************/
+
+#include <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;
+}
--- /dev/null
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __ASP_SESSION_PEER_INTERFACE_H__
+#define __ASP_SESSION_PEER_INTERFACE_H__
+
+#include <glib.h>
+#include <gio/gio.h>
+
+void asp_session_recv_req(GSocketAddress *sock_addr, gpointer p_msg);
+void asp_session_recv_ack(GSocketAddress *sock_addr, guint8 *session_mac,
+ guint32 session_id, gpointer p_msg);
+void asp_session_recv_nack(GSocketAddress *sock_addr, guint8 *session_mac,
+ guint32 session_id, gpointer p_msg);
+void asp_session_peer_destroyed(guint8 *session_mac, guint32 session_id);
+
+#endif /* __ASP_SESSION_PEER_INTERFACE_H__ */
--- /dev/null
+#include "gfsm.h"
+#include "asp-session-peer.h"
+#include "asp-session-peer-interface.h"
+#include "asp-coordination-protocol.h"
+#include "asp-manager-util.h"
+
+#define ASP_SESS_PEER_FSM_TRACE_ENTER()
+#define ASP_SESS_PEER_FSM_TRACE_LEAVE()
+
+#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; */
+}
--- /dev/null
+#ifndef _ASP_SESS_PEER_H_
+#define _ASP_SESS_PEER_H_
+
+#include <glib.h>
+#include <gio/gio.h>
+
+void asp_sess_peer_init();
+void asp_sess_peer_destroy();
+
+gboolean asp_sess_peer_send_msg(GSocketAddress *p_sock_addr, 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
+
--- /dev/null
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************
+ * Standard headers
+ *****************************************************************************/
+#include <stdio.h>
+#include <stdlib.h>
+/*#include <string.h> */
+/*#include <time.h> */
+
+#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;
+}
--- /dev/null
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************
+ * Standard headers
+ *****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+/*****************************************************************************
+ * System headers
+ *****************************************************************************/
+
+#include <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,
+};
--- /dev/null
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __ASP_TECH_BLE_H__
+#define __ASP_TECH_BLE_H__
+
+#endif /* __ASP_TECH_BLE_H__ */
--- /dev/null
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************
+ * Standard headers
+ *****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+/*****************************************************************************
+ * System headers
+ *****************************************************************************/
+
+#include <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,
+};
--- /dev/null
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __ASP_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__ */
--- /dev/null
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************
+ * Standard headers
+ *****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+/*****************************************************************************
+ * System headers
+ *****************************************************************************/
+
+#include <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,
+};
--- /dev/null
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __ASP_TECH_NAN_H__
+#define __ASP_TECH_NAN_H__
+
+#endif /* __ASP_TECH_NAN_H__ */
--- /dev/null
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************
+ * Standard headers
+ *****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+/*****************************************************************************
+ * System headers
+ *****************************************************************************/
+
+#include <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,
+};
--- /dev/null
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __ASP_TECH_NFC_H__
+#define __ASP_TECH_NFC_H__
+
+#endif /* __ASP_TECH_NFC_H__ */
--- /dev/null
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************
+ * Standard headers
+ *****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+/*****************************************************************************
+ * System headers
+ *****************************************************************************/
+
+#include <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,
+};
--- /dev/null
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __ASP_TECH_P2P_H__
+#define __ASP_TECH_P2P_H__
+
+#endif /* __ASP_TECH_P2P_H__ */
--- /dev/null
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************
+ * Standard headers
+ *****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+/*****************************************************************************
+ * System headers
+ *****************************************************************************/
+
+#include <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;
+}
--- /dev/null
+/*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);
+}
--- /dev/null
+/*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
+++ /dev/null
-/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*****************************************************************************
- * Standard headers
- *****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-
-/*****************************************************************************
- * System headers
- *****************************************************************************/
-
-#include <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;
-}
+++ /dev/null
-/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*****************************************************************************
- * Standard headers
- *****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <arpa/inet.h>
-
-/*****************************************************************************
- * System headers
- *****************************************************************************/
-
-#include <glib.h>
-#include <gio/gio.h>
-/*#include <dlog.h> */
-
-/*****************************************************************************
- * ASP coordination protocol header
- *****************************************************************************/
-#include "asp-coordination-protocol.h"
-#include "asp-session-peer.h"
-#include "asp-manager-util.h"
-
-/*****************************************************************************
- * Macros and Typedefs
- *****************************************************************************/
-#define RW_BUF_SIZE 1600
-#define LENGTH_MAX 144
-#define ASP_COORDINATION_PROTOCOL_PORT 7235
-
-/* TODO : define session data structure */
-
-/*****************************************************************************
- * Global Variables
- *****************************************************************************/
-GSocket *coordination_protocol_socket = NULL;
-GSource *source = NULL;
-
-/* TODO : define local memory for session data structure */
-
-/*****************************************************************************
- * Local Functions Definition
- *****************************************************************************/
-
-static gboolean asp_coordination_protocol_read_cb(GIOChannel *src,
- GIOCondition condition, gpointer data);
-static void asp_coordination_protocol_ack_handler(GSocketAddress *sock_addr,
- 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);
-}
+++ /dev/null
-/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __ASP_COORDINATION_PROTOCOL_H__
-#define __ASP_COORDINATION_PROTOCOL_H__
-
-#include <stdio.h>
-#include <string.h>
-#include <glib.h>
-#include <gio/gio.h>
-
-#define SESSION_MAC_BUF_SIZE 6
-#define SESSION_INFO_BUF_SIZE 144
-#define DEFERRED_INFO_BUF_SIZE 144
-
-#define ADV
-
-#ifdef SEEKER
-#define ROLE "[seeker ]"
-#define INFO_MSG ASP_LOGD("%s %s", 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__ */
+++ /dev/null
-/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*****************************************************************************
- * Standard headers
- *****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-
-/*****************************************************************************
- * System headers
- *****************************************************************************/
-
-#include <gio/gio.h>
-
-#include<dlog.h>
-
-/*****************************************************************************
- * Application Service Platform Daemon headers
- *****************************************************************************/
-#include "asp-manager.h"
-#include "asp-p2p-conn.h"
-#include "asp-service.h"
-#include "asp-tech.h"
-
-/*****************************************************************************
- * Macros and Typedefs
- *****************************************************************************/
-
-/*****************************************************************************
- * Global Variables
- *****************************************************************************/
-
-static asp_p2p_conn_session_request_cb session_request_cb = NULL;
-static gpointer session_request_cb_user_data = NULL;
-static asp_p2p_conn_session_config_request_cb session_config_request_cb = NULL;
-static gpointer session_config_request_cb_user_data = NULL;
-static asp_p2p_conn_connect_status_cb connect_status_cb = NULL;
-static gpointer connect_status_cb_user_data = NULL;
-static asp_p2p_conn_ip_assigned_cb ip_assigned_cb = NULL;
-static gpointer ip_assigned_cb_user_data = NULL;
-
-/*****************************************************************************
- * Local Functions Definition
- *****************************************************************************/
-
-void asp_p2p_conn_initialize()
-{
- __ASP_LOG_FUNC_ENTER__;
-
- session_request_cb = NULL;
- session_request_cb_user_data = NULL;
- session_config_request_cb = NULL;
- session_config_request_cb_user_data = NULL;
- connect_status_cb = NULL;
- connect_status_cb_user_data = NULL;
-
- __ASP_LOG_FUNC_EXIT__;
- return;
-}
-
-void asp_p2p_conn_deinitialize()
-{
- __ASP_LOG_FUNC_ENTER__;
-
- session_request_cb = NULL;
- session_request_cb_user_data = NULL;
- session_config_request_cb = NULL;
- session_config_request_cb_user_data = NULL;
- connect_status_cb = NULL;
- connect_status_cb_user_data = NULL;
-
- __ASP_LOG_FUNC_EXIT__;
- return;
-}
-
-void asp_p2p_conn_connect_session(const guint8 *session_mac, guint32 session_id,
- const guint8 *service_mac,
- guint32 adv_id, const guint8 *session_info, size_t info_length,
- guint8 network_role, guint8 network_config)
-{
- __ASP_LOG_FUNC_ENTER__;
- asp_tech_session_request_params_s params = {{0, } };
- gint32 res = 0;
-
- /* Make connect parameter for session request */
- memcpy(params.session_mac, session_mac, MAC_LEN);
- params.session_id = session_id;
- memcpy(params.service_mac, service_mac, MAC_LEN);
- params.advertisement_id = adv_id;
- params.network_role = network_role;
- params.network_config = network_config;
- if (info_length != 0) {
- params.session_information = g_try_malloc0(info_length + 1);
- if (params.session_information)
- memcpy(params.session_information, session_info, info_length);
- }
-
- res = asp_tech_connect_session(ASP_TECH_P2P, ¶ms);
- if (res != 0 && connect_status_cb) {
- ASP_LOGE("request connect is failed");
- /* TODO: assign proper error code and connect status. */
- connect_status_cb(0, session_mac, session_id,
- ASP_SESSION_CONNECT_STATUS_NETWORK_ROLE_REJECTED,
- connect_status_cb_user_data);
- }
- g_free(params.session_information);
-
- __ASP_LOG_FUNC_EXIT__;
- return;
-}
-
-void asp_p2p_conn_confirm_session(const guint8 *session_mac, guint32 session_id,
- gboolean confirmed, guint32 network_config_pin)
-{
- __ASP_LOG_FUNC_ENTER__;
- gint32 res = 0;
-
- res = asp_tech_confirm_session(ASP_TECH_P2P, session_mac,
- session_id, confirmed, network_config_pin);
- if (res < 0) {
- ASP_LOGE("confirm session is failed");
- return;
- }
-
- __ASP_LOG_FUNC_EXIT__;
- return;
-}
-
-void asp_p2p_conn_disconnect_p2p(const guint8 *peer_mac)
-{
- __ASP_LOG_FUNC_ENTER__;
- guint8 mac[MAC_LEN] = {0, };
- gint32 res = 0;
-
- memcpy(mac, peer_mac, MAC_LEN);
- res = asp_tech_destroy_connection(ASP_TECH_P2P, mac, MAC_LEN);
- if (res < 0) {
- ASP_LOGE("asp_tech_destroy_connection is failed");
- return;
- }
-
- __ASP_LOG_FUNC_EXIT__;
- return;
-}
-
-gboolean asp_p2p_conn_peer_is_connected(const guint8 *peer_mac)
-{
- __ASP_LOG_FUNC_ENTER__;
- gint32 is_peer_connected = 0;
- gboolean is_connected = 0;
- guint8 mac[MAC_LEN] = {0, };
- gint32 res = 0;
-
- memcpy(mac, peer_mac, MAC_LEN);
- res = asp_tech_is_peer_connected(ASP_TECH_P2P, mac,
- MAC_LEN, &is_peer_connected);
- if (res < 0) {
- ASP_LOGE("asp_tech_is_peer_connected is failed");
- return FALSE;
- }
-
- is_connected = is_peer_connected;
- __ASP_LOG_FUNC_EXIT__;
- return is_connected;
-}
-
-void asp_p2p_conn_set_session_request_cb(asp_p2p_conn_session_request_cb cb,
- gpointer user_data)
-{
- __ASP_LOG_FUNC_ENTER__;
-
- session_request_cb = cb;
- session_request_cb_user_data = user_data;
-
- asp_tech_set_session_request_cb(ASP_TECH_P2P, cb, user_data);
-
- __ASP_LOG_FUNC_EXIT__;
- return;
-}
-
-void asp_p2p_conn_set_session_config_request_cb(
- asp_p2p_conn_session_config_request_cb cb, gpointer user_data)
-{
- __ASP_LOG_FUNC_ENTER__;
-
- session_config_request_cb = cb;
- session_config_request_cb_user_data = user_data;
-
- asp_tech_set_session_config_request_cb(ASP_TECH_P2P, cb, user_data);
-
- __ASP_LOG_FUNC_EXIT__;
- return;
-}
-
-void asp_p2p_conn_set_connect_status_cb(asp_p2p_conn_connect_status_cb cb,
- gpointer user_data)
-{
- __ASP_LOG_FUNC_ENTER__;
-
- connect_status_cb = cb;
- connect_status_cb_user_data = user_data;
-
- asp_tech_set_connect_status_cb(ASP_TECH_P2P, cb, user_data);
-
- __ASP_LOG_FUNC_EXIT__;
- return;
-}
-
-void asp_p2p_conn_set_ip_assigned_cb(asp_p2p_conn_ip_assigned_cb cb,
- gpointer user_data)
-{
- __ASP_LOG_FUNC_ENTER__;
-
- ip_assigned_cb = cb;
- ip_assigned_cb_user_data = user_data;
-
- asp_tech_set_ip_assigned_cb(ASP_TECH_P2P, cb, user_data);
-
- __ASP_LOG_FUNC_EXIT__;
- return;
-}
-
-void asp_p2p_conn_get_p2p_mac(gchar *my_p2p_mac)
-{
- __ASP_LOG_FUNC_ENTER__;
-
- asp_s *asp = asp_get_manager();
- if (asp == NULL) {
- ASP_LOGE("memory allocation for asp-manager is failed");
- return;
- }
-
- memcpy(my_p2p_mac, asp->p2p_local_address, MAC_LEN);
-
- __ASP_LOG_FUNC_EXIT__;
- return;
-}
+++ /dev/null
-/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _ASP_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
+++ /dev/null
-/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __ASP_SESSION_PEER_INTERFACE_H__
-#define __ASP_SESSION_PEER_INTERFACE_H__
-
-#include <glib.h>
-#include <gio/gio.h>
-
-void asp_session_recv_req(GSocketAddress *sock_addr, gpointer p_msg);
-void asp_session_recv_ack(GSocketAddress *sock_addr, guint8 *session_mac,
- guint32 session_id, gpointer p_msg);
-void asp_session_recv_nack(GSocketAddress *sock_addr, guint8 *session_mac,
- guint32 session_id, gpointer p_msg);
-void asp_session_peer_destroyed(guint8 *session_mac, guint32 session_id);
-
-#endif /* __ASP_SESSION_PEER_INTERFACE_H__ */
+++ /dev/null
-#include "gfsm.h"
-#include "asp-session-peer.h"
-#include "asp-session-peer-interface.h"
-#include "asp-coordination-protocol.h"
-#include "asp-manager-util.h"
-
-#define ASP_SESS_PEER_FSM_TRACE_ENTER()
-#define ASP_SESS_PEER_FSM_TRACE_LEAVE()
-
-#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; */
-}
+++ /dev/null
-#ifndef _ASP_SESS_PEER_H_
-#define _ASP_SESS_PEER_H_
-
-#include <glib.h>
-#include <gio/gio.h>
-
-void asp_sess_peer_init();
-void asp_sess_peer_destroy();
-
-gboolean asp_sess_peer_send_msg(GSocketAddress *p_sock_addr, 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
-
+++ /dev/null
-/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*****************************************************************************
- * Standard headers
- *****************************************************************************/
-#include <stdio.h>
-#include <stdlib.h>
-/*#include <string.h> */
-/*#include <time.h> */
-
-#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;
-}
+++ /dev/null
-/*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);
-}
+++ /dev/null
-/*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
+++ /dev/null
-/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*****************************************************************************
- * Standard headers
- *****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-
-/*****************************************************************************
- * System headers
- *****************************************************************************/
-
-#include <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,
-};
+++ /dev/null
-/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __ASP_TECH_BLE_H__
-#define __ASP_TECH_BLE_H__
-
-#endif /* __ASP_TECH_BLE_H__ */
+++ /dev/null
-/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*****************************************************************************
- * Standard headers
- *****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-
-/*****************************************************************************
- * System headers
- *****************************************************************************/
-
-#include <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,
-};
+++ /dev/null
-/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __ASP_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__ */
+++ /dev/null
-/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*****************************************************************************
- * Standard headers
- *****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-
-/*****************************************************************************
- * System headers
- *****************************************************************************/
-
-#include <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,
-};
+++ /dev/null
-/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __ASP_TECH_NAN_H__
-#define __ASP_TECH_NAN_H__
-
-#endif /* __ASP_TECH_NAN_H__ */
+++ /dev/null
-/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*****************************************************************************
- * Standard headers
- *****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-
-/*****************************************************************************
- * System headers
- *****************************************************************************/
-
-#include <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,
-};
+++ /dev/null
-/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __ASP_TECH_NFC_H__
-#define __ASP_TECH_NFC_H__
-
-#endif /* __ASP_TECH_NFC_H__ */
+++ /dev/null
-/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*****************************************************************************
- * Standard headers
- *****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-
-/*****************************************************************************
- * System headers
- *****************************************************************************/
-
-#include <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,
-};
+++ /dev/null
-/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __ASP_TECH_P2P_H__
-#define __ASP_TECH_P2P_H__
-
-#endif /* __ASP_TECH_P2P_H__ */
+++ /dev/null
-/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*****************************************************************************
- * Standard headers
- *****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-
-/*****************************************************************************
- * System headers
- *****************************************************************************/
-
-#include <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;
-}