Add support for new APIs 59/174259/9 accepted/tizen/unified/20180427.062359 submit/tizen/20180426.072841
authorMilind Murhekar <m.murhekar@samsung.com>
Thu, 29 Mar 2018 10:12:37 +0000 (15:42 +0530)
committerMilind Murhekar <m.murhekar@samsung.com>
Tue, 17 Apr 2018 07:12:02 +0000 (07:12 +0000)
This patch adds below functionalities
for wfd-manager.

a) set/get go intent based on device type
b) set/unset notification for peer device info connection state
c) set/get WPS config method e) remove persistent device based on BSSID
d) remove all persistent device

Change-Id: Icbe8a9c3428988dc1b386425191209428deb75d4
Signed-off-by: Milind Murhekar <m.murhekar@samsung.com>
13 files changed:
include/wifi-direct-ipc.h
include/wifi-direct-manager.h
include/wifi-direct-method.h
oem/wifi-direct-oem.c
oem/wifi-direct-oem.h
plugin/wpasupplicant/ctrl_iface_dbus/include/wfd-plugin-wpasupplicant.h
plugin/wpasupplicant/ctrl_iface_dbus/wfd-plugin-wpasupplicant.c
src/wifi-direct-dbus.c
src/wifi-direct-event.c
src/wifi-direct-iface.c
src/wifi-direct-manager.c
src/wifi-direct-method.c
src/wifi-direct-session.c

index 29ade36..ae36f07 100644 (file)
@@ -54,6 +54,7 @@ typedef unsigned int ipv4_addr_t;
 #endif /** FALSE */
 
 #define WIFI_DIRECT_MAX_SSID_LEN 32
+#define WIFI_DIRECT_MIN_SSID_LEN 1
 #define WIFI_DIRECT_MAX_DEVICE_NAME_LEN 32
 #define WIFI_DIRECT_WPS_PIN_LEN 8
 #define WIFI_DIRECT_MAX_SERVICES_LEN 1024
index 0189805..7f3d192 100644 (file)
@@ -37,6 +37,10 @@ extern "C" {
 #define DEFAULT_PRIMARY_DEVICE_TYPE WIFI_DIRECT_PRIMARY_DEVICE_TYPE_TELEPHONE
 #define DEFAULT_SECONDARY_DEVICE_TYPE WIFI_DIRECT_SECONDARY_DEVICE_TYPE_TELEPHONE_SMARTPHONE_DUAL
 
+#define WFD_MAX_TYPE 8
+#define WFD_GO_INTENT_MIN 0
+#define WFD_GO_INTENT_DISPLY_SOURCE 2
+#define WFD_GO_INTENT_MAX 15
 #define WFD_MAX_CLIENT 16
 #define WFD_MAX_STATION 8
 
@@ -85,6 +89,7 @@ typedef enum {
        WFD_DISPLAY_TYPE_PRISINK,
        WFD_DISPLAY_TYPE_SECSINK,
        WFD_DISPLAY_TYPE_DUAL,
+       WFD_DISPLAY_TYPE_NONE,
 } wfd_display_type_e;
 
 typedef struct {
@@ -169,6 +174,7 @@ typedef struct {
 #endif /* TIZEN_ENABLE_PRD */
 
        int session_timer;
+       int go_intent_per_type[WFD_MAX_TYPE];
        gboolean auto_group_remove_enable;
        gboolean is_on_demand_supported;
        gboolean is_service_discovery_supported;
@@ -199,6 +205,8 @@ int wfd_local_get_supported_wps_mode(int *wps_mode);
 int wfd_local_get_wps_mode(int *wps_mode);
 int wfd_manager_get_go_intent(int *go_intent);
 int wfd_manager_set_go_intent(int go_intent);
+int wfd_manager_get_go_intent_per_type(int type, int *go_intent);
+int wfd_manager_set_go_intent_per_type(int type, int go_intent);
 int wfd_manager_get_max_station(int *max_station);
 int wfd_manager_set_max_station(int max_station);
 int wfd_manager_get_autoconnection(int *autoconnection);
index 54e74de..ddf99ca 100644 (file)
@@ -75,6 +75,8 @@ void get_ip_address_handler(GVariant *parameters, void *dest);
 void get_mac_address_handler(GVariant *parameters, void *dest);
 void get_go_intent_handler(GVariant *parameters, void *dest);
 void set_go_intent_handler(GVariant *parameters, void *dest);
+void get_go_intent_per_type_handler(GVariant *parameters, void *dest);
+void set_go_intent_per_type_handler(GVariant *parameters, void *dest);
 void get_max_client_handler(GVariant *parameters, void *dest);
 void set_max_client_handler(GVariant *parameters, void *dest);
 void set_autoconnection_mode_handler(GVariant *parameters, void *dest);
@@ -112,6 +114,10 @@ void seek_service_handler(GVariant *parameters, void *dest);
 void cancel_seek_service_handler(GVariant *parameters, void *dest);
 void connect_sessoin_handler(GVariant *parameters, void *dest);
 void confirm_sessoin_handler(GVariant *parameters, void *dest);
+void get_wps_config_method_handler(GVariant *parameter, void *dest);
+void set_wps_config_method_handler(GVariant *parameter, void *dest);
+void remove_persistent_device_handler(GVariant *parameters, void *dest);
+void remove_all_persistent_device_handler(GVariant *parameters, void *dest);
 
 #ifdef __cplusplus
 }
index c5b820b..8a94aba 100644 (file)
@@ -726,3 +726,30 @@ int wfd_oem_prd_init(wfd_oem_ops_s *ops)
        return prd_ops->prd_init(&g_event_cbs);
 }
 #endif /* TIZEN_ENABLE_PRD */
+
+int wfd_oem_set_supported_wps_mode(wfd_oem_ops_s *ops, int wps_mode)
+{
+       if (!ops || !ops->set_supported_wps_mode) {
+               return -1;
+       }
+
+       return ops->set_supported_wps_mode(wps_mode);
+}
+
+int wfd_oem_remove_persistent_device(wfd_oem_ops_s *ops, unsigned char *peer_mac_address)
+{
+       if (!ops || !ops->remove_persistent_device) {
+               return -1;
+       }
+
+       return ops->remove_persistent_device(peer_mac_address);
+}
+
+int wfd_oem_remove_all_persistent_device(wfd_oem_ops_s *ops)
+{
+       if (!ops || !ops->remove_all_persistent_device) {
+               return -1;
+       }
+
+       return ops->remove_all_persistent_device();
+}
index 1c2b995..0ca2ab2 100644 (file)
@@ -697,6 +697,9 @@ typedef struct {
        int (*add_vsie)(wfd_oem_vsie_frames_e frame_id, const char* vsie);
        int (*get_vsie)(wfd_oem_vsie_frames_e frame_id, char **vsie);
        int (*remove_vsie)(wfd_oem_vsie_frames_e frame_id, const char *vsie);
+       int (*set_supported_wps_mode) (int wps_mode);
+       int (*remove_persistent_device) (unsigned char *peer_mac_addr);
+       int (*remove_all_persistent_device) (void);
 
        void *extra_data;
 } wfd_oem_ops_s;
@@ -770,6 +773,10 @@ int wfd_oem_get_vsie(wfd_oem_ops_s *ops, wfd_oem_vsie_frames_e frame_id,
                     char **vsie);
 int wfd_oem_remove_vsie(wfd_oem_ops_s *ops, wfd_oem_vsie_frames_e frame_id,
                        const char *vsie);
+int wfd_oem_get_supported_wps_mode(wfd_oem_ops_s *ops, int *wps_mode);
+int wfd_oem_set_supported_wps_mode(wfd_oem_ops_s *ops, int wps_mode);
+int wfd_oem_remove_persistent_device(wfd_oem_ops_s *ops, unsigned char *peer_mac_address);
+int wfd_oem_remove_all_persistent_device(wfd_oem_ops_s *ops);
 
 #if defined TIZEN_ENABLE_PRD
 typedef struct {
index 344cbf5..148ff9b 100644 (file)
@@ -382,6 +382,9 @@ int ws_set_eapol_ip_config(int enable);
 int ws_add_vsie(wfd_oem_vsie_frames_e frame_id, const char* vsie);
 int ws_get_vsie(wfd_oem_vsie_frames_e frame_id, char **vsie);
 int ws_remove_vsie(wfd_oem_vsie_frames_e frame_id, const char *vsie);
+int ws_set_supported_wps_mode(int wps_mode);
+int ws_remove_persistent_device(unsigned char *mac_addr);
+int ws_remove_all_persistent_device(void);
 
 #ifdef __cplusplus
 }
index 411743e..5c11d6d 100644 (file)
@@ -140,6 +140,9 @@ static wfd_oem_ops_s supplicant_ops = {
        .add_vsie = ws_add_vsie,
        .get_vsie = ws_get_vsie,
        .remove_vsie = ws_remove_vsie,
+       .set_supported_wps_mode = ws_set_supported_wps_mode,
+       .remove_persistent_device = ws_remove_persistent_device,
+       .remove_all_persistent_device = ws_remove_all_persistent_device,
 
        .extra_data = NULL
 };
@@ -148,6 +151,7 @@ static ws_dbus_plugin_data_s *g_pd;
 static wfd_oem_config_s *config = NULL;
 static int is_peer_joined_notified = 0;
 static int is_peer_disconnected_notified = 0;
+static int wps_config_method = WFD_OEM_WPS_MODE_PBC|WFD_OEM_WPS_MODE_DISPLAY|WFD_OEM_WPS_MODE_KEYPAD;
 
 static GList *service_list;
 static GList *seek_list;
@@ -5029,7 +5033,13 @@ int ws_generate_pin(char **pin)
 int ws_get_supported_wps_mode(int *wps_mode)
 {
        __WDP_LOG_FUNC_ENTER__;
+       if (!wps_mode) {
+               WDP_LOGE("Invalid parameter");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
 
+       *wps_mode = wps_config_method;
        __WDP_LOG_FUNC_EXIT__;
        return 0;
 }
@@ -7665,3 +7675,196 @@ int ws_remove_vsie(wfd_oem_vsie_frames_e frame_id, const char *vsie)
        __WDP_LOG_FUNC_EXIT__;
        return 0;
 }
+
+int ws_set_supported_wps_mode(int wps_mode)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       char config_value[DBUS_OBJECT_PATH_MAX+1] = {0,};
+       int length = 0;
+       int new_wps_mode = wps_mode;
+       int res = 0;
+
+       if (!config) {
+               WDP_LOGE("no configurable data found");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       if (new_wps_mode == 0) {
+               WDP_LOGE("Reset to default value");
+               new_wps_mode = WFD_OEM_WPS_MODE_PBC|WFD_OEM_WPS_MODE_DISPLAY|WFD_OEM_WPS_MODE_KEYPAD;
+       }
+
+       if (new_wps_mode & WFD_OEM_WPS_MODE_KEYPAD) {
+               strncat(config_value, "keypad ", 7);
+               length += 7;
+       }
+       if (new_wps_mode & WFD_OEM_WPS_MODE_PBC) {
+               strncat(config_value, "virtual_push_button ", 20);
+               length += 20;
+       }
+       if (new_wps_mode & WFD_OEM_WPS_MODE_DISPLAY) {
+               strncat(config_value, "physical_display ", 17);
+               length += 17;
+       }
+       config_value[length-1] = 0;
+       g_strlcpy(config->config_methods, config_value, OEM_CONFIG_METHOD_LEN);
+       WDP_LOGD("config_value = %s, length = %d", config_value, length-1);
+       res = __ws_set_config_methods();
+       if (res < 0) {
+               WDP_LOGE("Failed to set config method");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       wps_config_method = new_wps_mode;
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+static int _ws_remove_persistent_group_by_object_path(const char *object_path)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       GDBusConnection *g_dbus = NULL;
+       dbus_method_param_s params;
+       int res = 0;
+
+       if (!g_pd) {
+               WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       g_dbus = g_pd->g_dbus;
+       if (!g_dbus) {
+               WDP_LOGE("DBus connection is NULL");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       memset(&params, 0x0, sizeof(dbus_method_param_s));
+       dbus_set_method_param(&params, "RemovePersistentGroup",
+                       g_pd->iface_path, g_dbus);
+       params.params = g_variant_new("(o)", object_path);
+
+       res = dbus_method_call(&params, SUPPLICANT_P2PDEVICE, NULL, NULL);
+       if (res < 0) {
+               WDP_LOGE("Failed to send command to wpa_supplicant");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       ws_save_config();
+       WDP_LOGD("Succeeded to remove persistent group");;
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_remove_persistent_device(unsigned char *mac_addr)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       GDBusConnection *g_dbus = NULL;
+       ws_network_info_s networks[WS_MAX_PERSISTENT_COUNT];
+       int i = 0;
+       int cnt = 0;
+       int need_delete = 0;
+       int res = 0;
+
+       if (!g_pd) {
+               WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       g_dbus = g_pd->g_dbus;
+       if (!g_dbus) {
+               WDP_LOGE("DBus connection is NULL");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       memset(&networks, 0x0, WS_MAX_PERSISTENT_COUNT * sizeof(ws_network_info_s));
+       dbus_property_get_all(g_pd->iface_path, g_dbus, SUPPLICANT_P2PDEVICE,
+                       __ws_extract_p2pdevice_details, networks);
+
+       cnt = networks[0].total;
+
+       WDP_LOGD("Persistent Group Count=%d", cnt);
+       if (cnt > WS_MAX_PERSISTENT_COUNT) {
+               WDP_LOGE("Persistent group count exceeded or parsing error");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       for (i = 0 ; i < cnt ; i++) {
+               int j = 0;
+               need_delete = 0;
+
+               WDP_LOGD("----persistent group [%d]----", i);
+               WDP_LOGD("network_id [%d]", networks[i].network_id);
+               WDP_LOGD("ssid [%s]", networks[i].ssid);
+               WDP_LOGD("bssid ["MACSTR"]", MAC2STR(networks[i].bssid));
+               WDP_LOGD("p2p_client_num [%d]", networks[i].p2p_client_num);
+               for (j = 0; j < networks[i].p2p_client_num; j++) {
+                       WDP_LOGD("p2p_client_list ["MACSTR"]", MAC2STR(networks[i].p2p_client_list[j]));
+               }
+
+               WDP_LOGD("mac_addr ["MACSTR"]", MAC2STR(mac_addr));
+
+               if (memcmp(mac_addr, networks[i].bssid, WS_MACADDR_LEN) == 0) {
+                       WDP_LOGD("Persistent group owner found [%d: "MACSTR"]", networks[i].network_id, MAC2STR(mac_addr));
+                       need_delete = 1;
+               }
+
+               if (need_delete == 0) {
+                       for (j = 0; j < networks[i].p2p_client_num; j++) {
+                               if (!memcmp(mac_addr, networks[i].p2p_client_list[j], WS_MACADDR_LEN)) {
+                                       WDP_LOGD("Persistent group client found [%d: "MACSTR"]", networks[i].network_id, MAC2STR(mac_addr));
+                                       need_delete = 1;
+                               }
+                       }
+               }
+
+               if (need_delete) {
+                       res = _ws_remove_persistent_group_by_object_path(networks[i].persistent_path);
+                       WDP_LOGI("persistent group deleted [%s]", networks[i].persistent_path);
+                       if (res < 0) {
+                               WDP_LOGE("Failed to _ws_remove_persistent_group_by_object_path");
+                       } else {
+                               WDP_LOGD("Succeeded to _ws_remove_persistent_group_by_object_path");
+                       }
+               }
+       }
+
+       __WDP_LOG_FUNC_EXIT__;
+       return res;
+}
+
+int ws_remove_all_persistent_device(void)
+{
+       __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");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       memset(&params, 0x0, sizeof(dbus_method_param_s));
+
+       dbus_set_method_param(&params, "RemoveAllPersistentGroups", g_pd->iface_path, g_dbus);
+       params.params = NULL;
+
+       res = dbus_method_call(&params, SUPPLICANT_P2PDEVICE, NULL, NULL);
+       if (res < 0) {
+               WDP_LOGE("Failed to RemoveAllPersistentGroups");
+       } else {
+               WDP_LOGD("Succeeded to RemoveAllPersistentGroups");
+       }
+
+       ws_save_config();
+       WDP_LOGD("Succeeded to remove all network");
+       __WDP_LOG_FUNC_EXIT__;
+       return res;
+}
index 278137d..a7bf294 100644 (file)
@@ -182,6 +182,13 @@ const gchar wfd_manager_introspection_xml[] = {
                        "<method name='IsPersistentGroupEnabled'>"
                                "<arg type='b' name='result' direction='out'/>"
                        "</method>"
+                       "<method name='RemovePersistentDevice'>"
+                               "<arg type='s' name='mac_address' direction='in'/>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                       "</method>"
+                       "<method name='RemoveAllPersistentDevice'>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                       "</method>"
                        "<signal name='Created'>"
                        "</signal>"
                        "<signal name='Destroyed'>"
@@ -240,6 +247,16 @@ const gchar wfd_manager_introspection_xml[] = {
                                "<arg type='i' name='go_intent' direction='in'/>"
                                "<arg type='i' name='error_code' direction='out'/>"
                        "</method>"
+                       "<method name='SetGoIntentPerType'>"
+                               "<arg type='i' name='type' direction='in'/>"
+                               "<arg type='i' name='go_intent' direction='in'/>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                       "</method>"
+                       "<method name='GetGoIntentPerType'>"
+                           "<arg type='i' name='type' direction='in'/>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                               "<arg type='i' name='go_intent' direction='out'/>"
+                       "</method>"
                        "<method name='GetMaxClient'>"
                                "<arg type='i' name='error_code' direction='out'/>"
                                "<arg type='i' name='max_client' direction='out'/>"
@@ -320,6 +337,14 @@ const gchar wfd_manager_introspection_xml[] = {
                                "<arg type='s' name='vsie' direction='in'/>"
                                "<arg type='i' name='error_code' direction='out'/>"
                        "</method>"
+                       "<method name='GetWpsConfigMethod'>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                               "<arg type='i' name='req_wps_mode' direction='out'/>"
+                       "</method>"
+                       "<method name='SetWpsConfigMethod'>"
+                               "<arg type='i' name='req_wps_mode' direction='in'/>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                       "</method>"
                "</interface>"
                "<interface name='net.wifidirect.service'>"
                        "<method name='StartDiscovery'>"
index da165cb..20806b3 100644 (file)
@@ -1178,6 +1178,7 @@ void wfd_event_sta_disconnected(wfd_oem_event_s *event)
        wfd_device_s *peer = NULL;
        unsigned char peer_addr[MACADDR_LEN] = {0, };
        char peer_mac_address[MACSTR_LEN+1] = {0, };
+       char peer_dev_name[DEV_NAME_LEN+1] = {0, };
 
        group = (wfd_group_s*) manager->group;
        if (!group) {
@@ -1232,6 +1233,7 @@ void wfd_event_sta_disconnected(wfd_oem_event_s *event)
                }
        }
        memcpy(peer_addr, peer->dev_addr, MACADDR_LEN);
+       g_strlcpy(peer_dev_name, peer->dev_name, DEV_NAME_LEN+1);
 
        /**
         * If state is not DISCONNECTING, connection is finished by peer.
@@ -1244,16 +1246,16 @@ void wfd_event_sta_disconnected(wfd_oem_event_s *event)
                g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
                if (group->member_count) {
                        wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
-                                                    "Disconnection",
-                                                    g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+                                                    "DisconnectionInd",
+                                                    g_variant_new("(iiss)", WIFI_DIRECT_ERROR_NONE,
                                                                            WFD_EVENT_DISASSOCIATION_IND,
-                                                                           peer_mac_address));
+                                                                           peer_mac_address, peer_dev_name));
                } else {
                        wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
-                                                    "Disconnection",
-                                                    g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+                                                    "DisconnectionInd",
+                                                    g_variant_new("(iiss)", WIFI_DIRECT_ERROR_NONE,
                                                                            WFD_EVENT_DISCONNECTION_IND,
-                                                                           peer_mac_address));
+                                                                           peer_mac_address, peer_dev_name));
                }
 
        } else if (manager->state == WIFI_DIRECT_STATE_CONNECTING &&
@@ -1265,10 +1267,10 @@ void wfd_event_sta_disconnected(wfd_oem_event_s *event)
                        wfd_group_remove_member(group, peer_addr);
                        g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
                        wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
-                                                    "Disconnection",
-                                                    g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+                                                    "DisconnectionInd",
+                                                    g_variant_new("(iiss)", WIFI_DIRECT_ERROR_NONE,
                                                                            WFD_EVENT_DISASSOCIATION_IND,
-                                                                           peer_mac_address));
+                                                                           peer_mac_address, peer_dev_name));
 
                } else if (WFD_PEER_STATE_CONNECTING == peer->state) {
                        WDS_LOGD("Peer is Connecting...");//LCOV_EXCL_LINE
index 591ea90..073e485 100644 (file)
@@ -98,6 +98,8 @@ static wfd_manager_iface_method_handler wfd_manager_iface_group[] = {
                {"GetPassphrase", get_passphrase_handler},
                {"SetPersistentGroupEnabled", set_persistent_group_handler},
                {"IsPersistentGroupEnabled", is_persistent_group_enabled_handler},
+               {"RemovePersistentDevice", remove_persistent_device_handler},
+               {"RemoveAllPersistentDevice", remove_all_persistent_device_handler},
                {NULL, NULL},
 };
 
@@ -115,6 +117,8 @@ static wfd_manager_iface_method_handler wfd_manager_iface_config[] = {
                {"GetMacAddress", get_mac_address_handler},
                {"GetGoIntent", get_go_intent_handler},
                {"SetGoIntent", set_go_intent_handler},
+               {"SetGoIntentPerType", set_go_intent_per_type_handler},
+               {"GetGoIntentPerType", get_go_intent_per_type_handler},
                {"GetMaxClient", get_max_client_handler},
                {"SetMaxClient", set_max_client_handler},
                {"SetAutoConnectionMode", set_autoconnection_mode_handler},
@@ -134,6 +138,8 @@ static wfd_manager_iface_method_handler wfd_manager_iface_config[] = {
                {"AddVsie", add_vsie_handler},
                {"GetVsie", get_vsie_handler},
                {"RemoveVsie", remove_vsie_handler},
+               {"GetWpsConfigMethod", get_wps_config_method_handler},
+               {"SetWpsConfigMethod", set_wps_config_method_handler},
                {NULL, NULL},
 };
 
index d0d07f9..a67df0d 100644 (file)
@@ -415,6 +415,51 @@ int wfd_manager_set_go_intent(int go_intent)
        return 0;
 }
 
+int wfd_manager_get_go_intent_per_type(int type, int *go_intent)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       if (!go_intent) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       if (type < 0 || type >= WFD_MAX_TYPE) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       *go_intent = g_manager->go_intent_per_type[type];
+       WDS_LOGD("Get Go_Intent[%d] : [%d]", type, *go_intent);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_manager_set_go_intent_per_type(int type, int go_intent)
+{
+       __WDS_LOG_FUNC_ENTER__;
+
+       if (go_intent < 0 || go_intent > 15) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       if (type < 0 || type >= WFD_MAX_TYPE) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       g_manager->go_intent_per_type[type] = go_intent;
+       WDS_LOGD("Set Go_Intent[%d] : [%d]", type, g_manager->go_intent_per_type[type]);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
 int wfd_manager_get_max_station(int *max_station)
 {
        __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
@@ -1700,6 +1745,13 @@ static wfd_manager_s *wfd_manager_init()
        manager->max_station = 8;
        manager->session_timer = 120;
        manager->auto_group_remove_enable = TRUE;
+
+       manager->go_intent_per_type[WFD_DISPLAY_TYPE_SOURCE] = WFD_GO_INTENT_DISPLY_SOURCE;
+       manager->go_intent_per_type[WFD_DISPLAY_TYPE_PRISINK] = WFD_GO_INTENT_MAX;
+       manager->go_intent_per_type[WFD_DISPLAY_TYPE_SECSINK] = WFD_GO_INTENT_MAX;
+       manager->go_intent_per_type[WFD_DISPLAY_TYPE_DUAL] = WFD_GO_INTENT_MAX;
+       manager->go_intent_per_type[WFD_DISPLAY_TYPE_NONE] = WFD_GO_INTENT_MAX;
+
        wfd_util_check_features(manager);
        wfd_util_load_wfd_conf(manager);
 
index 4498312..2fbc2c9 100644 (file)
@@ -859,6 +859,7 @@ void create_group_handler(GVariant *parameters, void *dest)
        gchar *key = NULL;
        GVariant *var = NULL;
        const char *ssid = NULL;
+       int ssid_len = 0;
        GVariant *return_parameters = NULL;
        int ret;
 
@@ -910,8 +911,20 @@ void create_group_handler(GVariant *parameters, void *dest)
        if (oem_conf && oem_conf->group_operating_freq != 0)
                param.freq = oem_conf->group_operating_freq;
 
-       if (ssid != NULL)
-               g_strlcpy(param.ssid, ssid, WIFI_DIRECT_MAX_DEVICE_NAME_LEN+1);
+       if (ssid != NULL) {
+               ssid_len = strlen(ssid);
+               if (ssid_len < WIFI_DIRECT_MIN_SSID_LEN || ssid_len > WIFI_DIRECT_MAX_SSID_LEN) {
+                       WDS_LOGE("SSID length incorrect [%s]:[%d], whereas [Proper SSID Length Range is 1-32 ]", ssid, ssid_len);
+                       ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
+                       g_variant_iter_free(iter);
+                       return_parameters = g_variant_new("(i)", ret);
+                       wfd_manager_dbus_reply_params((GDBusMethodInvocation *)dest, return_parameters);
+                       __WDS_LOG_FUNC_EXIT__;
+                       return;
+               }
+
+               g_strlcpy(param.ssid, ssid, WIFI_DIRECT_MAX_SSID_LEN+1);
+       }
 
        g_variant_iter_free(iter);
 
@@ -1497,6 +1510,48 @@ void set_go_intent_handler(GVariant *parameters, void *dest)
        return;
 }
 
+void get_go_intent_per_type_handler(GVariant *parameters, void *dest)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       GVariant *return_parameters = NULL;
+       int go_intent = 0;
+       int type;
+       int ret;
+
+       g_variant_get(parameters, "(i)", &type);
+       ret = wfd_manager_get_go_intent_per_type(type, &go_intent);
+       if (ret < 0)
+               WIFI_DIRECT_METHOD_RET_ERR(WIFI_DIRECT_ERROR_OPERATION_FAILED, dest);
+
+       ret = WIFI_DIRECT_ERROR_NONE;
+       return_parameters = g_variant_new("(ii)", ret, go_intent);
+       wfd_manager_dbus_reply_params((GDBusMethodInvocation *)dest, return_parameters);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return;
+}
+
+void set_go_intent_per_type_handler(GVariant *parameters, void *dest)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+       GVariant *return_parameters = NULL;
+       int go_intent = 0;
+       int type;
+       int ret;
+
+       g_variant_get(parameters, "(ii)", &type, &go_intent);
+       ret = wfd_manager_set_go_intent_per_type(type, go_intent);
+       if (ret < 0)
+               WIFI_DIRECT_METHOD_RET_ERR(WIFI_DIRECT_ERROR_OPERATION_FAILED, dest);
+
+       ret = WIFI_DIRECT_ERROR_NONE;
+       return_parameters = g_variant_new("(i)", ret);
+       wfd_manager_dbus_reply_params((GDBusMethodInvocation *)dest, return_parameters);
+
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return;
+}
+
 void get_max_client_handler(GVariant *parameters, void *dest)
 {
        __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
@@ -1943,6 +1998,52 @@ void remove_vsie_handler(GVariant *parameters, void *dest)
        return;
 }
 
+void get_wps_config_method_handler(GVariant *parameter, void *dest)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_manager_s *manager = wfd_get_manager();
+       GVariant *return_parameters = NULL;
+       int wps_mode = 0;
+       int ret;
+
+       WIFI_DIRECT_METHOD_RET_IF_NULL(manager);
+
+       wfd_oem_get_supported_wps_mode(manager->oem_ops, &wps_mode);
+       WDS_LOGD("Requested wps mode [0x%x]", wps_mode);
+
+       ret = WIFI_DIRECT_ERROR_NONE;
+       return_parameters = g_variant_new("(ii)", ret, wps_mode);
+       wfd_manager_dbus_reply_params((GDBusMethodInvocation *)dest, return_parameters);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return;
+}
+
+void set_wps_config_method_handler(GVariant *parameter, void *dest)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_manager_s *manager = wfd_get_manager();
+       GVariant *return_parameters = NULL;
+       int wps_mode = 0;
+       int ret;
+
+       WIFI_DIRECT_METHOD_RET_IF_NULL(manager);
+
+       if (manager->state < WIFI_DIRECT_STATE_ACTIVATED)
+               WIFI_DIRECT_METHOD_RET_ERR(WIFI_DIRECT_ERROR_NOT_PERMITTED, dest);
+
+       g_variant_get(parameter, "(i)", &wps_mode);
+       WDS_LOGD("Requested wps mode [0x%x]", wps_mode);
+       wfd_oem_set_supported_wps_mode(manager->oem_ops, wps_mode);
+
+       ret = WIFI_DIRECT_ERROR_NONE;
+       return_parameters = g_variant_new("(i)", ret);
+       wfd_manager_dbus_reply_params((GDBusMethodInvocation *)dest, return_parameters);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return;
+}
+
 void srv_start_discovery_handler(GVariant *parameters, void *dest)
 {
        __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
@@ -2958,3 +3059,59 @@ void confirm_sessoin_handler(GVariant *parameters, void *dest)
        __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
        return;
 }
+
+void remove_persistent_device_handler(GVariant *parameters, void *dest)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_manager_s *manager = wfd_get_manager();
+       GVariant *return_parameters = NULL;
+       gchar *mac_address;
+       unsigned char peer_mac_address[6];
+       int ret;
+
+       WIFI_DIRECT_METHOD_RET_IF_NULL(manager);
+
+       if (manager->state < WIFI_DIRECT_STATE_ACTIVATED)
+               WIFI_DIRECT_METHOD_RET_ERR(WIFI_DIRECT_ERROR_NOT_PERMITTED, dest);
+
+       g_variant_get(parameters, "(&s)", &mac_address);
+       if (mac_address == NULL)
+               WIFI_DIRECT_METHOD_RET_ERR(WIFI_DIRECT_ERROR_INVALID_PARAMETER, dest);
+
+       macaddr_atoe(mac_address, peer_mac_address);
+       WDS_LOGD("Remove persistent device [" MACSTR "]", MAC2STR(peer_mac_address));
+
+       ret = wfd_oem_remove_persistent_device(manager->oem_ops, peer_mac_address);
+       if (ret < 0)
+               WIFI_DIRECT_METHOD_RET_ERR(WIFI_DIRECT_ERROR_OPERATION_FAILED, dest);
+
+       return_parameters = g_variant_new("(i)", ret);
+       wfd_manager_dbus_reply_params((GDBusMethodInvocation *)dest, return_parameters);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return;
+}
+
+void remove_all_persistent_device_handler(GVariant *parameters, void *dest)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       wfd_manager_s *manager = wfd_get_manager();
+       GVariant *return_parameters = NULL;
+       int ret;
+
+       WIFI_DIRECT_METHOD_RET_IF_NULL(manager);
+
+       if (manager->state < WIFI_DIRECT_STATE_ACTIVATED)
+               WIFI_DIRECT_METHOD_RET_ERR(WIFI_DIRECT_ERROR_NOT_PERMITTED, dest);
+
+       ret = wfd_oem_remove_all_persistent_device(manager->oem_ops);
+       if (ret < 0)
+               WIFI_DIRECT_METHOD_RET_ERR(WIFI_DIRECT_ERROR_OPERATION_FAILED, dest);
+
+       ret = WIFI_DIRECT_ERROR_NONE;
+       return_parameters = g_variant_new("(i)", ret);
+       wfd_manager_dbus_reply_params((GDBusMethodInvocation *)dest, return_parameters);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return;
+}
index 20ac78a..333e5b9 100644 (file)
@@ -454,6 +454,8 @@ int wfd_session_connect(wfd_session_s *session)
        if (peer->dev_role == WFD_DEV_ROLE_GO || session->type == SESSION_TYPE_INVITE)
                param.conn_flags |= WFD_OEM_CONN_TYPE_JOIN;
        param.go_intent = session->go_intent;
+       if (peer->display.availability)
+               param.go_intent = manager->go_intent_per_type[manager->local->display.type];
        param.freq = session->freq;
        if (manager->local->group_flags & WFD_GROUP_FLAG_PERSISTENT)
                param.conn_flags |= WFD_OEM_CONN_TYPE_PERSISTENT;