Add feature for Application Service Platfrom (ASP) 69/69969/2
authorYu Jiung <jiung.yu@samsung.com>
Tue, 17 May 2016 11:50:36 +0000 (20:50 +0900)
committerYu Jiung <jiung.yu@samsung.com>
Wed, 18 May 2016 08:27:16 +0000 (17:27 +0900)
Description : Add service discovery part for ASP method
of p2p technology. AdvertiseService, CancelAdvertiseService,
SeekService and CancelSeekService. Add wpa_supplicant plugin
usage to use additional method.

Change-Id: Iff490a5db0825d0136444a1742e76fee08a21c37
Signed-off-by: Yu jiung <jiung.yu@samsung.com>
16 files changed:
CMakeLists.txt
include/wifi-direct-dbus.h
include/wifi-direct-manager.h
include/wifi-direct-util.h
oem/wifi-direct-oem.c
oem/wifi-direct-oem.h
packaging/dbus-wfd-manager.conf
packaging/wifi-direct-manager.spec
plugin/wpasupplicant/ctrl_iface_dbus/include/wfd-plugin-wpasupplicant.h
plugin/wpasupplicant/ctrl_iface_dbus/wfd-plugin-wpasupplicant.c
plugin/wpasupplicant/ctrl_iface_sock/include/wfd-plugin-wpasupplicant.h
plugin/wpasupplicant/ctrl_iface_sock/wfd-plugin-wpasupplicant.c
plugin/wpasupplicant/emul/include/wfd-plugin-wpasupplicant.h
plugin/wpasupplicant/emul/wfd-plugin-wpasupplicant-emul.c
src/wifi-direct-event.c
src/wifi-direct-iface.c

index ca156e2..7114109 100755 (executable)
@@ -50,6 +50,10 @@ IF(TIZEN_COMMON)
        ADD_DEFINITIONS(-DTIZEN_COMMON)
 ENDIF(TIZEN_COMMON)
 
+IF(TIZEN_FEATURE_ASP)
+       ADD_DEFINITIONS(-DTIZEN_FEATURE_ASP)
+ENDIF(TIZEN_FEATURE_ASP)
+
 IF(TIZEN_MOBILE)
        ADD_DEFINITIONS(-DTIZEN_MOBILE)
 ENDIF(TIZEN_MOBILE)
index 7f21653..cc706c9 100644 (file)
@@ -41,6 +41,9 @@ extern "C" {
 #define WFD_MANAGER_CONFIG_INTERFACE            WFD_MANAGER_SERVICE ".config"
 #define WFD_MANAGER_SERVICE_INTERFACE           WFD_MANAGER_SERVICE ".service"
 #define WFD_MANAGER_DISPLAY_INTERFACE           WFD_MANAGER_SERVICE ".display"
+#if defined(TIZEN_FEATURE_ASP)
+#define WFD_MANAGER_ASP_INTERFACE                        WFD_MANAGER_SERVICE ".asp"
+#endif
 
 #define WFD_MANAGER_DBUS_REPLY_TIMEOUT          10 * 1000
 #define WFD_MANAGER_DBUS_REPLY_TIMEOUT_SYNC     10 * 1000
index 1b39a9f..eaab959 100755 (executable)
@@ -75,6 +75,9 @@ typedef enum {
        WFD_WPS_MODE_PBC = 0x1,
        WFD_WPS_MODE_DISPLAY = 0x2,
        WFD_WPS_MODE_KEYPAD = 0x4,
+#if defined(TIZEN_FEATURE_ASP)
+       WFD_WPS_MODE_P2PS = 0x8,
+#endif /* TIZEN_FEATURE_ASP */
 } wfd_wps_mode_e;
 
 typedef enum {
index a7c71a3..6f9220e 100755 (executable)
@@ -33,6 +33,7 @@
 #define IP2STR(a) (a)[0], (a)[1], (a)[2], (a)[3]
 #define IPSTR "%d.%d.%d.%d"
 #define ZEROIP "0.0.0.0"
+#define ISZEROIP(a) !(a[0] | a[1] | a[2] | a[3])
 #define MAC2SECSTR(a) (a)[0], (a)[4], (a)[5]
 #define MACSECSTR "%02x:%02x:%02x"
 #define IP2SECSTR(a) (a)[0], (a)[3]
index d259972..c7768e7 100644 (file)
@@ -452,3 +452,40 @@ int wfd_oem_refresh(wfd_oem_ops_s *ops)
 
        return ops->refresh();
 }
+#if defined(TIZEN_FEATURE_ASP)
+int wfd_oem_advertise_service(wfd_oem_ops_s *ops, wfd_oem_asp_service_s *service, int replace)
+{
+       if (!ops || !ops->advertise_service) {
+               return -1;
+       }
+
+       return ops->advertise_service(service, replace);
+}
+
+int wfd_oem_cancel_advertise_service(wfd_oem_ops_s *ops, wfd_oem_asp_service_s *service)
+{
+       if (!ops || !ops->cancel_advertise_service) {
+               return -1;
+       }
+
+       return ops->cancel_advertise_service(service);
+}
+
+int wfd_oem_seek_service(wfd_oem_ops_s *ops, wfd_oem_asp_service_s *service)
+{
+       if (!ops || !ops->seek_service) {
+               return -1;
+       }
+
+       return ops->seek_service(service);
+}
+
+int wfd_oem_cancel_seek_service(wfd_oem_ops_s *ops, wfd_oem_asp_service_s *service)
+{
+       if (!ops || !ops->cancel_seek_service) {
+               return -1;
+       }
+
+       return ops->cancel_seek_service(service);
+}
+#endif /* TIZEN_FEATURE_ASP */
index 228e42c..c291595 100755 (executable)
 #define OEM_QUERY_ID_LEN 15
 #define OEM_SERVICE_MAX_LEN 1024
 
+#if defined(TIZEN_FEATURE_ASP)
+/* Referring to Wi-Fi Peer-to-Peer Services Technical Specification v1.1
+ * The default P2Ps PIN is 12345670. Any device decided to be GO will use
+ * that as device password
+ */
+#define OEM_DEFAULT_P2PS_PIN "12345670"
+#endif /* TIZEN_FEATURE_ASP */
+
 #define OEM_MAX_PEER_NUM 8
 
 typedef enum {
@@ -58,6 +66,9 @@ typedef enum {
        WFD_OEM_SC_FAIL_BOTH_GO_INTENT_15 = 9,
        WFD_OEM_SC_FAIL_INCOMPATIBLE_PROV_METHOD = 10,
        WFD_OEM_SC_FAIL_REJECTED_BY_USER = 11,
+#if defined(TIZEN_FEATURE_ASP)
+       WFD_OEM_SC_SUCCESS_ACCEPTED_BY_USER = 12,
+#endif /* TIZEN_FEATURE_ASP */
 } wfd_oem_status_code_e;
 
 typedef enum {
@@ -74,6 +85,15 @@ typedef enum {
        WFD_OEM_WPA_STATE_MAX,
 } ws_wpa_state_type_e;
 
+#if defined(TIZEN_FEATURE_ASP)
+typedef enum {
+       WFD_OEM_ASP_SESSION_ROLE_NONE = 0x00,  /**< Session network role none */
+       WFD_OEM_ASP_SESSION_ROLE_NEW = 0x01,  /**< Session network role new */
+       WFD_OEM_ASP_SESSION_ROLE_CLIENT = 0x02,  /**< Session network role client */
+       WFD_OEM_ASP_SESSION_ROLE_GO = 0x04,  /**< Session network role GO */
+} wfd_oem_asp_network_role_e;
+#endif /* TIZEN_FEATURE_ASP */
+
 typedef enum {
        WFD_OEM_EVENT_NONE,
        WFD_OEM_EVENT_DEACTIVATED,
@@ -113,6 +133,9 @@ typedef enum {
 
        WFD_OEM_EVENT_GROUP_FORMATION_FAILURE,
        WFD_OEM_EVENT_INVITATION_ACCEPTED,
+#if defined(TIZEN_FEATURE_ASP)
+       WFD_OEM_EVENT_ASP_SERV_RESP,
+#endif /* TIZEN_FEATURE_ASP */
 
        WFD_OEM_EVENT_MAX,
 } wfd_oem_event_e;
@@ -137,6 +160,15 @@ typedef struct {
 } wfd_oem_display_s;
 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
 
+#if defined(TIZEN_FEATURE_ASP)
+typedef struct {
+       unsigned int adv_id;
+       unsigned int config_method;
+       int service_type_length;
+       char *service_type;
+} wfd_oem_advertise_service_s;
+#endif /* TIZEN_FEATURE_ASP */
+
 typedef struct {
        int age;
        char dev_name[OEM_DEV_NAME_LEN+1];
@@ -154,6 +186,9 @@ typedef struct {
 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
        wfd_oem_display_s display;
 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
+#if defined(TIZEN_FEATURE_ASP)
+       wfd_oem_advertise_service_s asp_service;
+#endif /* TIZEN_FEATURE_ASP */
 } wfd_oem_device_s;
 
 typedef struct {
@@ -171,6 +206,9 @@ typedef struct {
        wfd_oem_display_s display;
 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
        unsigned char p2p_go_addr[OEM_MACADDR_LEN];
+#if defined(TIZEN_FEATURE_ASP)
+       wfd_oem_advertise_service_s asp_service;
+#endif /* TIZEN_FEATURE_ASP */
 } wfd_oem_dev_data_s;
 
 typedef struct {
@@ -245,6 +283,9 @@ typedef enum {
        WFD_OEM_EDATA_TYPE_GROUP,
        WFD_OEM_EDATA_TYPE_SERVICE,
        WFD_OEM_EDATA_TYPE_NEW_SERVICE,
+#if defined(TIZEN_FEATURE_ASP)
+       WFD_OEM_EDATA_TYPE_ASP_SERVICE,
+#endif /* TIZEN_FEATURE_ASP */
 } ws_event_type_e;
 
 typedef enum {
@@ -267,6 +308,9 @@ typedef enum {
        WFD_OEM_WPS_MODE_PBC = 0x1,
        WFD_OEM_WPS_MODE_DISPLAY = 0x2,
        WFD_OEM_WPS_MODE_KEYPAD = 0x4,
+#if defined(TIZEN_FEATURE_ASP)
+       WFD_OEM_WPS_MODE_P2PS = 0x8,
+#endif /* TIZEN_FEATURE_ASP */
 } wfd_oem_wps_mode_e;
 
 #define WFD_OEM_GROUP_FLAG_GROUP_OWNER 0x1
@@ -291,6 +335,9 @@ typedef struct {
        int scan_type;
        int freq;
        int refresh;
+#if defined(TIZEN_FEATURE_ASP)
+       char *seek;
+#endif /* TIZEN_FEATURE_ASP */
 } wfd_oem_scan_param_s;
 
 typedef struct {
@@ -420,6 +467,34 @@ typedef enum {
        WFD_OEM_PERSISTENT_MODE_GO = 0x3,
 } wfd_oem_persistent_mode_e;
 
+#if defined(TIZEN_FEATURE_ASP)
+typedef enum
+{
+       WFD_OEM_TYPE_ADVERTISE,
+       WFD_OEM_TYPE_SEEK,
+       WFD_OEM_TYPE_MAX,
+} wfd_oem_asp_service_type_e;
+
+typedef struct {
+       wfd_oem_asp_service_type_e type;
+       unsigned int adv_id;
+       long long unsigned search_id;
+       int auto_accept;
+       int discovery_tech;
+       unsigned char preferred_connection;
+
+       unsigned char status;
+       unsigned char role;
+       unsigned int config_method;
+       unsigned char tran_id;
+
+       char *instance_name;
+       char *service_name;
+       char *service_type;
+       char *service_info;
+       char *rsp_info;
+} wfd_oem_asp_service_s;
+#endif /* TIZEN_FEATURE_ASP */
 typedef struct
 {
        int network_id;
@@ -501,7 +576,12 @@ typedef struct _wfd_oem_ops_s {
        int (*remove_all_network)(void);
        int (*get_wpa_status)(int *wpa_status);
 
-
+#if defined(TIZEN_FEATURE_ASP)
+       int (*advertise_service)(wfd_oem_asp_service_s *service, int replace);
+       int (*cancel_advertise_service)(wfd_oem_asp_service_s *service);
+       int (*seek_service)(wfd_oem_asp_service_s *service);
+       int (*cancel_seek_service)(wfd_oem_asp_service_s *service);
+#endif /* TIZEN_FEATURE_ASP */
 } wfd_oem_ops_s;
 
 int wfd_oem_init(wfd_oem_ops_s *ops, wfd_oem_event_cb event_callback, void *user_data);
@@ -560,5 +640,11 @@ int wfd_oem_set_display(wfd_oem_ops_s *ops, wfd_oem_display_s *wifi_display);
 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
 
 int wfd_oem_refresh(wfd_oem_ops_s *ops);
+#if defined(TIZEN_FEATURE_ASP)
+int wfd_oem_advertise_service(wfd_oem_ops_s *ops, wfd_oem_asp_service_s *service, int replace);
+int wfd_oem_cancel_advertise_service(wfd_oem_ops_s *ops, wfd_oem_asp_service_s *service);
+int wfd_oem_seek_service(wfd_oem_ops_s *ops, wfd_oem_asp_service_s *service);
+int wfd_oem_cancel_seek_service(wfd_oem_ops_s *ops, wfd_oem_asp_service_s *service);
+#endif /* TIZEN_FEATURE_ASP */
 
 #endif /* __WIFI_DIRECT_OEM_H__ */
index 7eb171a..617560d 100644 (file)
@@ -13,5 +13,6 @@
                <check send_destination="net.wifidirect" send_interface="net.wifidirect.config" privilege="http://tizen.org/privilege/wifidirect" />
                <check send_destination="net.wifidirect" send_interface="net.wifidirect.service" privilege="http://tizen.org/privilege/wifidirect" />
                <check send_destination="net.wifidirect" send_interface="net.wifidirect.display" privilege="http://tizen.org/privilege/wifidirect" />
+               <check send_destination="net.wifidirect" send_interface="net.wifidirect.asp" privilege="http://tizen.org/privilege/wifidirect" />
        </policy>
 </busconfig>
index 10e4ef6..3577133 100755 (executable)
@@ -1,6 +1,6 @@
 Name:          wifi-direct-manager
 Summary:       Wi-Fi Direct manger
-Version:       1.2.156
+Version:       1.2.157
 Release:       1
 Group:      Network & Connectivity/Wireless
 License:    Apache-2.0
@@ -98,6 +98,7 @@ cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} -DARCHITECTURE=$ARCH \
         -DCTRL_IFACE_DBUS=1 \
         -DTIZEN_DEBUG_DBUS_VALUE=1 \
         -DTIZEN_MOBILE=1 \
+        -DTIZEN_FEATURE_ASP=1 \
 %else
 %if "%{profile}" == "tv"
        -DTIZEN_FEATURE_SERVICE_DISCOVERY=1 \
index 627a53e..eed3f5e 100755 (executable)
 #      define DEFAULT_LISTEN_CHANNEL 1
 #      define DEFAULT_OPER_REG_CLASS 81
 #      define DEFAULT_OPER_CHANNEL 1
+#if !defined(TIZEN_FEATURE_ASP)
 #      define DEFAULT_CONFIG_METHOD "display push_button keypad"
+#else
+#      define DEFAULT_CONFIG_METHOD "display push_button keypad p2ps"
+#endif
 #      define DEFAULT_NO_GROUP_IFACE 0
 #endif /* TIZEN_MOBILE */
 
 #define WS_CONFIG_METHOD_DISPLAY 0x0008
 #define WS_CONFIG_METHOD_PUSHBUTTON 0x0080
 #define WS_CONFIG_METHOD_KEYPAD 0x0100
+#if defined(TIZEN_FEATURE_ASP)
+#define WS_CONFIG_METHOD_P2PS 0x1000
+#endif /* TIZEN_FEATURE_ASP */
 
 #define WS_DBUS_STR_PBC "pbc"
 #define WS_DBUS_STR_DISPLAY "display"
 #define WS_DBUS_STR_KEYPAD "keypad"
+#if defined(TIZEN_FEATURE_ASP)
+#define WS_DBUS_STR_P2PS "p2ps"
+#endif /* TIZEN_FEATURE_ASP */
 #define WS_DBUS_STR_JOIN "join"
 #define WS_DBUS_STR_AUTH "auth"
 #define WS_DBUS_STR_PERSISTENT "persistent"
@@ -299,6 +309,10 @@ typedef enum {
         * method). This value may be further augmented with the optional
         * "Identity" attribute in M1. */
        WS_DEV_PASSWD_ID_REGISTRAR_SPECIFIED = 0x0005,  // ENTER-PIN
+
+#if defined(TIZEN_FEATURE_ASP)
+       WS_DEV_PASSWD_ID_P2PS = 0x0008,
+#endif /* TIZEN_FEATURE_ASP */
 } ws_dev_passwd_id_e;
 
 typedef enum {
@@ -445,6 +459,11 @@ int ws_set_operating_channel(int channel);
 int ws_remove_all_network(void);
 int ws_get_wpa_status(int *wpa_status);
 
-
+#if defined(TIZEN_FEATURE_ASP)
+int ws_advertise_service(wfd_oem_asp_service_s *service, int replace);
+int ws_cancel_advertise_service(wfd_oem_asp_service_s *service);
+int ws_seek_service(wfd_oem_asp_service_s *service);
+int ws_cancel_seek_service(wfd_oem_asp_service_s *service);
+#endif /* TIZEN_FEATURE_ASP */
 
 #endif /* __WFD_PLUGIN_WPASUPPLICANT_H__ */
index 1dfe392..d673cd0 100755 (executable)
 #include "wfd-plugin-wpasupplicant.h"
 #include "dbus/wfd-plugin-supplicant-dbus.h"
 
+#if defined(TIZEN_FEATURE_ASP)
+#define GLIST_ITER_START(arg_list, elem)\
+       GList *temp = NULL;\
+       temp = g_list_first(arg_list);\
+       while (temp) {\
+               elem = temp->data;\
+               temp = g_list_next(temp);\
+
+#define GLIST_ITER_END() }
+#endif
+
 #define NETCONFIG_SERVICE "net.netconfig"
 #define NETCONFIG_WIFI_INTERFACE "net.netconfig.wifi"
 #define NETCONFIG_WIFI_PATH "/net/netconfig/wifi"
@@ -132,6 +143,12 @@ static wfd_oem_ops_s supplicant_ops = {
        .remove_all_network = ws_remove_all_network,
        .get_wpa_status = ws_get_wpa_status,
 
+#if defined(TIZEN_FEATURE_ASP)
+       .advertise_service = ws_advertise_service,
+       .cancel_advertise_service = ws_cancel_advertise_service,
+       .seek_service = ws_seek_service,
+       .cancel_seek_service = ws_cancel_seek_service,
+#endif /* TIZEN_FEATURE_ASP */
        };
 
 static ws_dbus_plugin_data_s *g_pd;
@@ -140,6 +157,8 @@ static ws_dbus_plugin_data_s *g_pd;
 static GList *service_list;
 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
 
+static GList *seek_list;
+
 static void _supplicant_signal_cb(GDBusConnection *connection,
                const gchar *sender, const gchar *object_path, const gchar *interface,
                const gchar *signal, GVariant *parameters, gpointer user_data);
@@ -195,6 +214,11 @@ static char *__ws_wps_to_txt(int wps_mode)
        case WFD_OEM_WPS_MODE_KEYPAD:
                return WS_DBUS_STR_KEYPAD;
                break;
+#if defined(TIZEN_FEATURE_ASP)
+       case WFD_OEM_WPS_MODE_NONE:
+       case WFD_OEM_WPS_MODE_P2PS:
+               return WS_DBUS_STR_P2PS;
+#endif /* TIZEN_FEATURE_ASP */
        default:
                return "";
                break;
@@ -629,7 +653,10 @@ static void __ws_get_peer_property(const char *key, GVariant *value, void *user_
 
                if(!ISZEROMACADDR(peer->go_dev_addr))
                        peer->dev_role = WFD_OEM_DEV_ROLE_GC;
-
+#if defined(TIZEN_FEATURE_ASP)
+       } else if (g_strcmp0(key, "AdvertiseService") == 0) {
+               //TODO : parsing AdvertiseService
+#endif /* TIZEN_FEATURE_ASP */
        } else {
                WDP_LOGD("Unknown value");
        }
@@ -724,7 +751,10 @@ static void __ws_peer_property(const char *key, GVariant *value, void *user_data
 
                if(!ISZEROMACADDR(go_dev_addr))
                        peer->dev_role = WFD_OEM_DEV_ROLE_GC;
-
+#if defined(TIZEN_FEATURE_ASP)
+       } else if (g_strcmp0(key, "AdvertiseService") == 0) {
+               //TODO : parsing AdvertiseService
+#endif /* TIZEN_FEATURE_ASP */
        } else {
                WDP_LOGD("Unknown value");
        }
@@ -1102,6 +1132,73 @@ void __ws_extract_servicediscoveryresponse_details(const char *key, GVariant *va
 }
 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
 
+#if defined(TIZEN_FEATURE_ASP)
+static void __ws_extract_serviceaspresponse_details(const char *key, GVariant *value, void *user_data)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
+       if(!event || !event->edata)
+               return;
+
+       wfd_oem_asp_service_s *service = (wfd_oem_asp_service_s *)event->edata;
+
+       if (g_strcmp0(key, "peer_object") == 0) {
+               static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
+               const char *path = NULL;
+               char *loc = NULL;
+
+               g_variant_get(value, "o", &path);
+               if(path == NULL)
+                       return;
+
+               WDP_LOGD("Retrive Added path [%s]", path);
+               loc = strrchr(path,'/');
+               if(loc != NULL)
+                       __ws_mac_compact_to_normal(loc + 1, peer_dev);
+               __ws_txt_to_mac(peer_dev, event->dev_addr);
+
+       } else if (g_strcmp0(key, "srv_trans_id") == 0) {
+               unsigned int srv_trans_id = 0;
+               g_variant_get(value, "u", &srv_trans_id);
+               service->tran_id = srv_trans_id;
+               WDP_LOGD("Retrive srv_trans_id [%x]", service->tran_id);
+
+       } else if (g_strcmp0(key, "adv_id") == 0) {
+               unsigned int adv_id = 0;
+               g_variant_get(value, "u", &adv_id);
+               service->adv_id = adv_id;
+               WDP_LOGD("Retrive adv_id [%x]", service->adv_id);
+
+       } else if (g_strcmp0(key, "svc_status") == 0) {
+               unsigned char svc_status = 0;
+               g_variant_get(value, "u", &svc_status);
+               service->status = svc_status;
+               WDP_LOGD("Retrive svc_status [%x]", service->status);
+
+       } else if (g_strcmp0(key, "config_methods") == 0) {
+               unsigned int config_methods = 0;
+               g_variant_get(value, "q", &config_methods);
+               service->config_method = config_methods;
+               WDP_LOGD("Retrive config_methods [%x]", service->config_method);
+
+       } else if (g_strcmp0(key, "svc_str") == 0) {
+               const char *svc_str = NULL;
+               g_variant_get(value, "s", &svc_str);
+               if(svc_str != NULL)
+                       service->service_name = g_strdup(svc_str);
+               WDP_LOGD("Retrive srv_name [%s]", service->service_name);
+
+       } else if (g_strcmp0(key, "info") == 0) {
+               const char *info = NULL;
+               g_variant_get(value, "s", &info);
+               if(info != NULL)
+                       service->service_info = g_strdup(info);
+               WDP_LOGD("Retrive srv_info [%s]", service->service_info);
+       }
+       __WDP_LOG_FUNC_EXIT__;
+}
+#endif /* TIZEN_FEATURE_ASP */
+
 static int _ws_flush()
 {
        __WDP_LOG_FUNC_ENTER__;
@@ -1775,6 +1872,57 @@ static void _ws_process_service_discovery_response(GDBusConnection *connection,
 }
 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
 
+#if defined(TIZEN_FEATURE_ASP)
+static void _ws_process_service_asp_response(GDBusConnection *connection,
+               const gchar *object_path, GVariant *parameters)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       GVariantIter *iter = NULL;
+       wfd_oem_event_s event;
+       wfd_oem_asp_service_s *service, *tmp;
+
+       service = (wfd_oem_asp_service_s *) g_try_malloc0(sizeof(wfd_oem_asp_service_s));
+       if (!service) {
+               WDP_LOGF("Failed to allocate memory for event. [%s]",
+                               strerror(errno));
+               __WDP_LOG_FUNC_EXIT__;
+               return;
+       }
+       memset(&event, 0x0, sizeof(wfd_oem_event_s));
+
+       event.edata = (void*) service;
+       event.edata_type = WFD_OEM_EDATA_TYPE_ASP_SERVICE;
+       event.event_id = WFD_OEM_EVENT_ASP_SERV_RESP;
+
+       if(parameters != NULL) {
+               g_variant_get(parameters, "(a{sv})", &iter);
+               if(iter != NULL) {
+                       dbus_property_foreach(iter, __ws_extract_serviceaspresponse_details, &event);
+                       g_variant_iter_free(iter);
+               }
+       } else {
+               WDP_LOGE("No Properties");
+       }
+GLIST_ITER_START(seek_list, tmp)
+       if(tmp->tran_id == service->tran_id) {
+               WDP_LOGD("srv_trans_id matched [%d] search_id [%llu]"
+                               ,tmp->tran_id, tmp->search_id);
+               service->search_id = tmp->search_id;
+               break;
+       } else {
+               tmp = NULL;
+       }
+GLIST_ITER_END()
+       g_pd->callback(g_pd->user_data, &event);
+
+       g_free(service->service_name);
+       g_free(service->service_info);
+       g_free(service);
+
+       __WDP_LOG_FUNC_EXIT__;
+}
+#endif /* TIZEN_FEATURE_ASP */
+
 static void _ws_process_persistent_group_added(GDBusConnection *connection,
                const gchar *object_path, GVariant *parameters)
 {
@@ -1981,6 +2129,13 @@ static struct {
                _ws_process_service_discovery_response
        },
 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
+#if defined(TIZEN_FEATURE_ASP)
+       {
+               SUPPLICANT_P2PDEVICE,
+               "ServiceASPResponse",
+               _ws_process_service_asp_response
+       },
+#endif /* TIZEN_FEATURE_ASP */
        {
                SUPPLICANT_P2PDEVICE,
                "PersistentGroupAdded",
@@ -2988,6 +3143,7 @@ int ws_activate(int concurrent)
        g_pd->activated = TRUE;
        __ws_init_p2pdevice();
        __ws_set_config_methods();
+       seek_list = NULL;
 
        __WDP_LOG_FUNC_EXIT__;
        return 0;
@@ -2996,6 +3152,9 @@ int ws_activate(int concurrent)
 int ws_deactivate(int concurrent)
 {
        __WDP_LOG_FUNC_ENTER__;
+#if defined(TIZEN_FEATURE_ASP)
+       wfd_oem_asp_service_s *data = NULL;
+#endif /* TIZEN_FEATURE_ASP */
        int res = 0;
 
        if (!g_pd) {
@@ -3029,6 +3188,18 @@ int ws_deactivate(int concurrent)
        }
        g_pd->activated = FALSE;
 
+#if defined(TIZEN_FEATURE_ASP)
+       GLIST_ITER_START(seek_list, data)
+
+       if (data) {
+               temp = g_list_next(seek_list);
+               seek_list = g_list_remove(seek_list, data);
+               g_free(data->service_name);
+               g_free(data);
+       }
+
+       GLIST_ITER_END()
+#endif /* TIZEN_FEATURE_ASP */
        __WDP_LOG_FUNC_EXIT__;
        return 0;
 }
@@ -3045,6 +3216,42 @@ static gboolean _retry_start_scan(gpointer data)
 }
 #endif
 
+#if defined(TIZEN_FEATURE_ASP)
+static void __ws_add_seek_params(GVariantBuilder *builder)
+{
+       GVariantBuilder *outter = NULL;
+       GVariantBuilder *inner = NULL;
+       wfd_oem_asp_service_s *data = NULL;
+       int len = 0;
+       int i = 0;
+
+       if(seek_list == NULL || g_list_length(seek_list) == 0) {
+               WDP_LOGD("seek list is NULL");
+               return;
+       }
+       WDP_LOGD("seek list length [%d]", g_list_length(seek_list));
+
+       outter = g_variant_builder_new(G_VARIANT_TYPE("aay"));
+
+GLIST_ITER_START(seek_list, data)
+       if (data && data->service_type) {
+               len = strlen(data->service_type) + 1;
+               WDP_LOGD("data [%s] len [%d]", data->service_type, len);
+               inner = g_variant_builder_new(G_VARIANT_TYPE("ay"));
+               for(i = 0; i < len; i++)
+                       g_variant_builder_add(inner, "y", data->service_type[i]);
+               g_variant_builder_add(outter, "ay", inner);
+               g_variant_builder_unref(inner);
+       }
+GLIST_ITER_END()
+       g_variant_builder_add (builder, "{sv}", "Seek", g_variant_new ("aay", outter));
+       g_variant_builder_unref(outter);
+
+       return;
+}
+#endif /* TIZEN_FEATURE_ASP */
+
+
 int ws_start_scan(wfd_oem_scan_param_s *param)
 {
        __WDP_LOG_FUNC_ENTER__;
@@ -3083,6 +3290,10 @@ int ws_start_scan(wfd_oem_scan_param_s *param)
                        if (param->scan_type == WFD_OEM_SCAN_TYPE_SOCIAL)
                                g_variant_builder_add (builder, "{sv}", "DiscoveryType",
                                                        g_variant_new_string("social"));
+#if defined(TIZEN_FEATURE_ASP)
+                       if(seek_list != NULL)
+                               __ws_add_seek_params(builder);
+#endif /* TIZEN_FEATURE_ASP */
 
                        value = g_variant_new ("(a{sv})", builder);
                        g_variant_builder_unref (builder);
@@ -5440,3 +5651,257 @@ int ws_get_wpa_status(int *wpa_status)
        __WDP_LOG_FUNC_EXIT__;
        return 0;
 }
+
+#if defined(TIZEN_FEATURE_ASP)
+int ws_advertise_service(wfd_oem_asp_service_s *service, int replace)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       GDBusConnection *g_dbus = NULL;
+       GVariantBuilder *builder = NULL;
+       GVariant *value = NULL;
+       dbus_method_param_s params;
+       unsigned int config_method = 0x1108;
+       int auto_accept = 0;
+       gboolean rep;
+       int res = 0;
+
+       g_dbus = g_pd->g_dbus;
+       if (!g_dbus) {
+               WDP_LOGE("DBus connection is NULL");
+               return -1;
+       }
+
+       if (service->config_method == 2) {
+               config_method = WS_CONFIG_METHOD_KEYPAD |
+                               WS_CONFIG_METHOD_DISPLAY;
+       } else if (service->config_method == 3) {
+               config_method = WS_CONFIG_METHOD_DISPLAY;
+       } else if (service->config_method == 4) {
+               config_method = WS_CONFIG_METHOD_KEYPAD;
+       }
+
+       if(service->auto_accept) {
+               if(service->role == 0)
+                       auto_accept = 1;
+               else
+                       auto_accept = 2;
+       } else {
+               auto_accept = 0;
+       }
+
+       rep = (replace == 1);
+
+       memset(&params, 0x0, sizeof(dbus_method_param_s));
+
+       dbus_set_method_param(&params, "AddService", g_pd->iface_path, g_dbus);
+
+       builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}") );
+
+       g_variant_builder_add (builder, "{sv}", "service_type", g_variant_new_string("asp"));
+       g_variant_builder_add (builder, "{sv}", "auto_accept", g_variant_new_int32(auto_accept));
+       g_variant_builder_add (builder, "{sv}", "adv_id", g_variant_new_uint32(service->adv_id));
+       g_variant_builder_add (builder, "{sv}", "svc_state", g_variant_new_uint32(service->status));
+       g_variant_builder_add (builder, "{sv}", "config_method", g_variant_new_uint32(config_method));
+       g_variant_builder_add (builder, "{sv}", "replace", g_variant_new_boolean(rep));
+       if(service->service_type != NULL)
+               g_variant_builder_add (builder, "{sv}", "adv_str", g_variant_new_string(service->service_type));
+       if(service->service_info != NULL)
+               g_variant_builder_add (builder, "{sv}", "svc_info", g_variant_new_string(service->service_info));
+
+       value = g_variant_new ("(a{sv})", builder);
+       g_variant_builder_unref (builder);
+#if defined (TIZEN_DEBUG_DBUS_VALUE)
+       WDP_LOGE("params [%s]", g_variant_print(value, TRUE));
+#endif /* TIZEN_DEBUG_DBUS_VALUE */
+
+       params.params = value;
+
+       res = dbus_method_call(&params, SUPPLICANT_P2PDEVICE, NULL, NULL);
+       if (res < 0)
+               WDP_LOGE("Failed to send command to wpa_supplicant");
+       else
+               WDP_LOGD("Succeeded to add service");
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_cancel_advertise_service(wfd_oem_asp_service_s *service)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       GDBusConnection *g_dbus = NULL;
+       GVariantBuilder *builder = NULL;
+       GVariant *value = NULL;
+       dbus_method_param_s params;
+       int res = 0;
+
+       g_dbus = g_pd->g_dbus;
+       if (!g_dbus) {
+               WDP_LOGE("DBus connection is NULL");
+               return -1;
+       }
+       memset(&params, 0x0, sizeof(dbus_method_param_s));
+
+       dbus_set_method_param(&params, "DeleteService", g_pd->iface_path, g_dbus);
+
+       builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}"));
+
+       g_variant_builder_add (builder, "{sv}", "service_type", g_variant_new_string("asp"));
+       g_variant_builder_add (builder, "{sv}", "adv_id", g_variant_new_uint32(service->adv_id));
+
+       value = g_variant_new ("(a{sv})", builder);
+       g_variant_builder_unref (builder);
+#if defined (TIZEN_DEBUG_DBUS_VALUE)
+       WDP_LOGD("params [%s]", g_variant_print(value, TRUE));
+#endif /* TIZEN_DEBUG_DBUS_VALUE */
+       params.params = value;
+
+       res = dbus_method_call(&params, SUPPLICANT_P2PDEVICE, NULL, NULL);
+       if (res < 0)
+               WDP_LOGE("Failed to send command to wpa_supplicant");
+       else
+               WDP_LOGD("Succeeded to del service");
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+static void __remove_seek_service(long long unsigned search_id)
+{
+       wfd_oem_asp_service_s *data = NULL;
+       int count = 1;
+
+       GLIST_ITER_START(seek_list, data)
+
+       if (data) {
+               if(data->search_id == search_id) {
+                       WDP_LOGD("List remove");
+                       seek_list = g_list_remove(seek_list, data);
+                       g_free(data->service_type);
+                       g_free(data);
+               } else {
+                       data->tran_id = count;
+                       count++;
+               }
+       }
+
+       GLIST_ITER_END()
+       return;
+}
+
+static void __get_asp_search_id(GVariant *value, void *args)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       wfd_oem_asp_service_s *service = NULL;
+       wfd_oem_asp_service_s *tmp = NULL;
+       long long unsigned search_id = 0;
+
+       g_variant_get(value, "(t)", &search_id);
+
+       service = (wfd_oem_asp_service_s *)args;
+       if (!service) {
+               WDP_LOGE("invalid parameters");
+               return;
+       }
+
+       tmp = g_try_malloc0(sizeof(wfd_oem_asp_service_s));
+       if (!tmp) {
+               WDP_LOGE("Failed to allocate memory for service");
+               return;
+       }
+
+       service->search_id = search_id;
+       memcpy(tmp, service, sizeof(wfd_oem_asp_service_s));
+       if(service->service_type)
+               tmp->service_type = strdup(service->service_type);
+       seek_list = g_list_prepend(seek_list, tmp);
+
+       __WDP_LOG_FUNC_EXIT__;
+       return;
+
+}
+
+int ws_seek_service(wfd_oem_asp_service_s *service)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       GDBusConnection *g_dbus = NULL;
+       GVariantBuilder *builder = NULL;
+       GVariant *value = NULL;
+       dbus_method_param_s params;
+       int res = 0;
+
+       g_dbus = g_pd->g_dbus;
+       if (!g_dbus) {
+               WDP_LOGE("DBus connection is NULL");
+               return -1;
+       }
+       memset(&params, 0x0, sizeof(dbus_method_param_s));
+       service->tran_id = g_list_length(seek_list) + 1;
+
+       dbus_set_method_param(&params, "ServiceDiscoveryRequest", g_pd->iface_path, g_dbus);
+
+       builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}") );
+
+       g_variant_builder_add (builder, "{sv}", "service_type", g_variant_new_string("asp"));
+       g_variant_builder_add (builder, "{sv}", "transaction_id", g_variant_new_byte(service->tran_id));
+       if(service->service_type != NULL)
+               g_variant_builder_add (builder, "{sv}", "svc_str", g_variant_new_string(service->service_type));
+
+       if(service->service_info != NULL)
+               g_variant_builder_add (builder, "{sv}", "svc_info", g_variant_new_string(service->service_info));
+
+       value = g_variant_new ("(a{sv})", builder);
+       g_variant_builder_unref (builder);
+
+#if defined (TIZEN_DEBUG_DBUS_VALUE)
+       WDP_LOGD("params [%s]", g_variant_print(value, TRUE));
+#endif /* TIZEN_DEBUG_DBUS_VALUE */
+
+       params.params = value;
+
+       res = dbus_method_call(&params, SUPPLICANT_P2PDEVICE, __get_asp_search_id, service);
+       if (res < 0)
+               WDP_LOGE("Failed to send command to wpa_supplicant");
+       else
+               WDP_LOGD("Succeeded to seek service");
+
+       __WDP_LOG_FUNC_EXIT__;
+       return res;
+}
+
+int ws_cancel_seek_service(wfd_oem_asp_service_s *service)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       GDBusConnection *g_dbus = NULL;
+       dbus_method_param_s params;
+
+       int res = 0;
+
+       g_dbus = g_pd->g_dbus;
+       if (!g_dbus) {
+               WDP_LOGE("DBus connection is NULL");
+               return -1;
+       }
+
+       memset(&params, 0x0, sizeof(dbus_method_param_s));
+
+       dbus_set_method_param(&params, "ServiceDiscoveryCancelRequest", g_pd->iface_path, g_dbus);
+
+       params.params = g_variant_new ("(t)", service->search_id);
+
+#if defined (TIZEN_DEBUG_DBUS_VALUE)
+       WDP_LOGD("params [%s]", g_variant_print(params.params, TRUE));
+#endif /* TIZEN_DEBUG_DBUS_VALUE */
+
+       res = dbus_method_call(&params, SUPPLICANT_P2PDEVICE, NULL, NULL);
+       if (res < 0) {
+               WDP_LOGE("Failed to send command to wpa_supplicant");
+       } else {
+               WDP_LOGD("Succeeded to cancel seek service");
+               __remove_seek_service(service->search_id);
+       }
+
+       __WDP_LOG_FUNC_EXIT__;
+       return res;
+}
+#endif /* TIZEN_FEATURE_ASP */
index c3fa648..43135c8 100755 (executable)
@@ -584,5 +584,10 @@ int ws_set_operating_channel(int channel);
 int ws_remove_all_network(void);
 int ws_get_wpa_status(int *wpa_status);
 
-
+#if defined(TIZEN_FEATURE_ASP)
+int ws_advertise_service(wfd_oem_asp_service_s *service, int replace);
+int ws_cancel_advertise_service(wfd_oem_asp_service_s *service);
+int ws_seek_service(wfd_oem_asp_service_s *service);
+int ws_cancel_seek_service(wfd_oem_asp_service_s *service);
+#endif /* TIZEN_FEATURE_ASP */
 #endif /* __WFD_PLUGIN_WPASUPPLICANT_H__ */
index 7ef3e42..ff3b83f 100755 (executable)
@@ -275,6 +275,12 @@ static wfd_oem_ops_s supplicant_ops = {
        .remove_all_network = ws_remove_all_network,
        .get_wpa_status = ws_get_wpa_status,
 
+#if defined(TIZEN_FEATURE_ASP)
+       .advertise_service = ws_advertise_service,
+       .cancel_advertise_service = ws_cancel_advertise_service,
+       .seek_service = ws_seek_service,
+       .cancel_seek_service = ws_cancel_seek_service,
+#endif /* TIZEN_FEATURE_ASP */
        };
 
 static ws_plugin_data_s *g_pd;
@@ -4923,3 +4929,37 @@ int ws_get_wpa_status(int *wpa_status)
        __WDP_LOG_FUNC_EXIT__;
        return 0;
 }
+
+#if defined(TIZEN_FEATURE_ASP)
+int ws_advertise_service(wfd_oem_asp_service_s *service, int replace)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+
+int ws_cancel_advertise_service(wfd_oem_asp_service_s *service)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+
+int ws_seek_service(wfd_oem_asp_service_s *service)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+
+int ws_cancel_seek_service(wfd_oem_asp_service_s *service)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+#endif /* TIZEN_FEATURE_ASP */
index 1a6d68a..08931c4 100755 (executable)
@@ -123,6 +123,10 @@ int ws_set_operating_channel(int channel);
 int ws_remove_all_network(void);
 int ws_get_wpa_status(int *wpa_status);
 
-
-
+#if defined(TIZEN_FEATURE_ASP)
+int ws_advertise_service(wfd_oem_asp_service_s *service, int replace);
+int ws_cancel_advertise_service(wfd_oem_asp_service_s *service);
+int ws_seek_service(wfd_oem_asp_service_s *service);
+int ws_cancel_seek_service(wfd_oem_asp_service_s *service);
+#endif /* TIZEN_FEATURE_ASP */
 #endif /* __WFD_PLUGIN_WPASUPPLICANT_H__ */
index 031e8dc..5787171 100755 (executable)
@@ -73,6 +73,12 @@ static wfd_oem_ops_s supplicant_ops = {
        .remove_all_network = ws_remove_all_network,
        .get_wpa_status = ws_get_wpa_status,
 
+#if defined(TIZEN_FEATURE_ASP)
+       .advertise_service = ws_advertise_service,
+       .cancel_advertise_service = ws_cancel_advertise_service,
+       .seek_service = ws_seek_service,
+       .cancel_seek_service = ws_cancel_seek_service,
+#endif /* TIZEN_FEATURE_ASP */
        };
 
 int wfd_plugin_load(wfd_oem_ops_s **ops)
@@ -472,3 +478,37 @@ int ws_get_wpa_status(int *wpa_status)
        __WDP_LOG_FUNC_EXIT__;
        return -1;
 }
+
+#if defined(TIZEN_FEATURE_ASP)
+int ws_advertise_service(wfd_oem_asp_service_s *service, int replace)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+
+int ws_cancel_advertise_service(wfd_oem_asp_service_s *service)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+
+int ws_seek_service(wfd_oem_asp_service_s *service)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+
+int ws_cancel_seek_service(wfd_oem_asp_service_s *service)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       __WDP_LOG_FUNC_EXIT__;
+       return -1;
+}
+#endif /* TIZEN_FEATURE_ASP */
index 3be59db..d1e802b 100755 (executable)
@@ -1360,6 +1360,45 @@ static void __wfd_process_serv_disc_started(wfd_manager_s *manager, wfd_oem_even
 }
 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
 
+
+#if defined(TIZEN_FEATURE_ASP)
+static void __wfd_process_asp_serv_resp(wfd_manager_s *manager, wfd_oem_event_s *event)
+ {
+       __WDS_LOG_FUNC_ENTER__;
+
+       wfd_oem_asp_service_s *service = NULL;
+       GVariantBuilder *builder = NULL;
+       GVariant *params = NULL;
+
+       service = (wfd_oem_asp_service_s *)event->edata;
+       if(service == NULL) {
+               WDS_LOGE("P2P service found event has NULL information");
+               __WDS_LOG_FUNC_EXIT__;
+               return;
+       }
+
+       builder = g_variant_builder_new(G_VARIANT_TYPE ("a{sv}"));
+       g_variant_builder_add(builder, "{sv}", "search_id", g_variant_new("u", service->search_id));
+       g_variant_builder_add(builder, "{sv}", "service_mac", g_variant_new("s", event->dev_addr));
+       g_variant_builder_add(builder, "{sv}", "advertisement_id", g_variant_new("u", service->adv_id));
+       g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new("u", service->config_method));
+       if(service->service_type)
+               g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new("s", service->service_name));
+       if(service->service_info)
+               g_variant_builder_add(builder, "{sv}", "service_info", g_variant_new("s", service->service_info));
+       g_variant_builder_add(builder, "{sv}", "status", g_variant_new("y", service->status));
+       params = g_variant_new("(a{sv})", builder);
+       g_variant_builder_unref(builder);
+
+       wfd_manager_dbus_emit_signal(WFD_MANAGER_ASP_INTERFACE,
+                                    "SearchResult",
+                                    params);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return;
+ }
+#endif /* TIZEN_FEATURE_ASP */
+
 static struct {
  const int event_id;
  void (*function) (wfd_manager_s *manager, wfd_oem_event_s *event);
@@ -1479,6 +1518,12 @@ static struct {
                WFD_OEM_EVENT_INVITATION_ACCEPTED,
                __wfd_process_invitation_accepted
        },
+#if defined(TIZEN_FEATURE_ASP)
+       {
+               WFD_OEM_EVENT_ASP_SERV_RESP,
+               __wfd_process_asp_serv_resp,
+       },
+#endif /* TIZEN_FEATURE_ASP */
        {
                WFD_OEM_EVENT_MAX,
                NULL
index 1f8772b..1323a39 100644 (file)
@@ -377,6 +377,30 @@ const gchar wfd_manager_introspection_xml[] = {
                        "</method>"
                "</interface>"
 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
+#if defined(TIZEN_FEATURE_ASP)
+               "<interface name='net.wifidirect.asp'>"
+                       "<method name='AdvertiseService'>"
+                               "<arg type='a{sv}' name='parameters' direction='in'/>"
+                               "<arg type='i' name='result' direction='out'/>"
+                       "</method>"
+                       "<method name='CancelAdvertiseService'>"
+                               "<arg type='u' name='adv_id' direction='in'/>"
+                               "<arg type='i' name='result' direction='out'/>"
+                       "</method>"
+                       "<method name='SeekService'>"
+                               "<arg type='a{sv}' name='parameters' direction='in'/>"
+                               "<arg type='i' name='result' direction='out'/>"
+                               "<arg type='t' name='search_id' direction='out'/>"
+                       "</method>"
+                       "<method name='CancelSeekService'>"
+                               "<arg type='t' name='search_id' direction='in'/>"
+                               "<arg type='i' name='result' direction='out'/>"
+                       "</method>"
+                       "<signal name='SearchResult'>"
+                               "<arg type='a{sv}' name='parameters'/>"
+                       "</signal>"
+               "</interface>"
+#endif
        "</node>"
 };
 
@@ -1926,6 +1950,205 @@ failed:
        return;
 }
 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
+#if defined(TIZEN_FEATURE_ASP)
+static void __wfd_manager_asp_iface_handler(const gchar *method_name,
+                                              GVariant    *parameters,
+                                              GDBusMethodInvocation *invocation)
+{
+       int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+       wfd_manager_s *manager = wfd_get_manager();
+       GVariant *return_parameters = NULL;
+       GError *err = NULL;
+       WDS_LOGD("%s", method_name);
+
+       if (!g_strcmp0(method_name, "AdvertiseService")) {
+
+               wfd_oem_asp_service_s service;
+               GVariantIter *iter = NULL;
+               gchar *key = NULL;
+               GVariant *var = NULL;
+               int replace = 0;
+
+               if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
+                               manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
+                               manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
+                       WDS_LOGE("Wi-Fi Direct is not available status for Advertising.");
+                       ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                       goto failed;
+               }
+
+               memset(&service, 0, sizeof(wfd_oem_asp_service_s));
+               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", &(service.adv_id));
+                       else if (!g_strcmp0(key, "discovery_tech"))
+                               g_variant_get(var, "i", &(service.discovery_tech));
+                       else if (!g_strcmp0(key, "preferred_connection"))
+                               g_variant_get(var, "y", &(service.preferred_connection));
+                       else if (!g_strcmp0(key, "auto_accept"))
+                               g_variant_get(var, "i", &(service.auto_accept));
+                       else if (!g_strcmp0(key, "status"))
+                               g_variant_get(var, "y", &(service.status));
+                       else if (!g_strcmp0(key, "role"))
+                               g_variant_get(var, "y", &(service.role));
+                       else if (!g_strcmp0(key, "replace"))
+                               g_variant_get(var, "i", &(replace));
+                       else if (!g_strcmp0(key, "config_method"))
+                               g_variant_get(var, "u", &(service.config_method));
+                       else if (!g_strcmp0(key, "instance_name"))
+                                       g_variant_get(var, "&s", &(service.instance_name));
+                       else if (!g_strcmp0(key, "service_type"))
+                                       g_variant_get(var, "&s", &(service.service_type));
+                       else if (!g_strcmp0(key, "service_info"))
+                               g_variant_get(var, "&s", &(service.service_info));
+                       else if (!g_strcmp0(key, "rsp_info"))
+                               g_variant_get(var, "&s", &(service.rsp_info));
+                       else
+                               ;/* Do Nothing */
+               }
+
+               ret = wfd_oem_advertise_service(manager->oem_ops, &service, replace);
+               if (ret < 0) {
+                       WDS_LOGE("Failed to add service");
+                       g_variant_iter_free(iter);
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       goto failed;
+               }
+               g_variant_iter_free(iter);
+
+               if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
+                       WDS_LOGW("Wi-Fi Direct device is already visible, do not start listen");
+                       goto done;
+               }
+
+               ret = wfd_manager_start_discovery(manager, WFD_OEM_SCAN_MODE_PASSIVE, 0, 0, 0);
+               if (ret == WIFI_DIRECT_ERROR_NONE) {
+                       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                                        "ListenStarted",
+                                                        NULL);
+               } else {
+                       wfd_oem_cancel_advertise_service(manager->oem_ops, &service);
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       goto failed;
+               }
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               return_parameters = g_variant_new("(i)", ret);
+               goto done;
+
+       } else if (!g_strcmp0(method_name, "CancelAdvertiseService")) {
+
+               wfd_oem_asp_service_s service;
+               memset(&service, 0, sizeof(wfd_oem_asp_service_s));
+
+               if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
+                       ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                       goto failed;
+               }
+
+               g_variant_get(parameters, "(u)", &(service.adv_id));
+               ret = wfd_oem_cancel_advertise_service(manager->oem_ops, &service);
+               if (ret < 0) {
+                       WDS_LOGE("Failed to del service");
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       goto failed;
+               }
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               return_parameters = g_variant_new("(i)", ret);
+               goto done;
+
+       } else if (!g_strcmp0(method_name, "SeekService")) {
+
+               wfd_oem_asp_service_s service;
+               GVariantIter *iter = NULL;
+               gchar *key = NULL;
+               GVariant *var = NULL;
+
+               if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
+                               manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
+                               manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
+                       WDS_LOGE("Wi-Fi Direct is not available status to Seek.");
+                       ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                       goto failed;
+               }
+
+               memset(&service, 0, sizeof(wfd_oem_asp_service_s));
+               g_variant_get(parameters, "(a{sv})", &iter);
+               while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
+                       if (!g_strcmp0(key, "discovery_tech"))
+                               g_variant_get(var, "i", &(service.discovery_tech));
+                       else if (!g_strcmp0(key, "preferred_connection"))
+                               g_variant_get(var, "y", &(service.preferred_connection));
+                       else if (!g_strcmp0(key, "service_type"))
+                                       g_variant_get(var, "&s", &(service.service_type));
+                       else if (!g_strcmp0(key, "service_info"))
+                               g_variant_get(var, "&s", &(service.service_info));
+                       else
+                               ;/* Do Nothing */
+               }
+
+               ret = wfd_oem_seek_service(manager->oem_ops, &service);
+               if (ret < 0) {
+                       WDS_LOGE("Failed to seek service");
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       goto failed;
+               }
+               g_variant_iter_free(iter);
+
+               WDS_LOGD("search_id [%x]", service.search_id);
+
+               ret = wfd_manager_start_discovery(manager, WFD_OEM_SCAN_MODE_ACTIVE, 0, 0, 0);
+               if (ret == WIFI_DIRECT_ERROR_NONE) {
+                       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                                        "DiscoveryStarted",
+                                                        NULL);
+               } else {
+                       wfd_oem_cancel_seek_service(manager->oem_ops, &service);
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       goto failed;
+               }
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               return_parameters = g_variant_new("(it)", ret, service.search_id);
+               goto done;
+
+       } else if (!g_strcmp0(method_name, "CancelSeekService")) {
+
+               wfd_oem_asp_service_s service;
+               memset(&service, 0, sizeof(wfd_oem_asp_service_s));
+
+               if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
+                       WDS_LOGE("Wi-Fi Direct is not activated.");
+                       ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                       goto failed;
+               }
+
+               g_variant_get(parameters, "(t)", &(service.search_id));
+               ret = wfd_oem_cancel_seek_service(manager->oem_ops, &service);
+               if (ret < 0) {
+                       WDS_LOGE("Failed to cancel seek service");
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       goto failed;
+               }
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               return_parameters = g_variant_new("(i)", ret);
+               goto done;
+       }
+
+done:
+       WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
+       return;
+
+failed:
+       wfd_error_set_gerror(ret, &err);
+       g_dbus_method_invocation_return_gerror(invocation, err);
+       g_clear_error(&err);
+       return;
+}
+#endif
 
 static struct {
        guint reg_id;
@@ -1963,6 +2186,13 @@ static struct {
                __wfd_manager_display_iface_handler
        },
 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
+#if defined(TIZEN_FEATURE_ASP)
+       {
+               0,
+               WFD_MANAGER_ASP_INTERFACE,
+               __wfd_manager_asp_iface_handler
+       },
+#endif
        {
                0,
                NULL,