2 * Network Configuration Module
4 * Copyright (c) 2015 Samsung Electronics Co., Ltd. All rights reserved.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
21 * This file implements wifi direct manager interface functions.
23 * @file wifi-direct-iface.c
24 * @author Nishant Chaprana (n.chaprana@samsung.com)
30 #include <wifi-direct.h>
32 #include "wifi-direct-dbus.h"
33 #include "wifi-direct-iface.h"
34 #include "wifi-direct-ipc.h"
35 #include "wifi-direct-error.h"
36 #include "wifi-direct-log.h"
37 #include "wifi-direct-manager.h"
38 #include "wifi-direct-oem.h"
39 #include "wifi-direct-session.h"
40 #include "wifi-direct-util.h"
41 #include "wifi-direct-group.h"
42 #include "wifi-direct-state.h"
44 #include "wifi-direct-service.h"
45 #include "wifi-direct-asp.h"
47 #define WFD_DBUS_REPLY_ERROR_NONE(invocation) \
48 g_dbus_method_invocation_return_value((invocation), g_variant_new("(i)", WIFI_DIRECT_ERROR_NONE))
50 #define WFD_DBUS_REPLY_PARAMS(invocation, params) \
51 g_dbus_method_invocation_return_value((invocation), (params))
53 static int macaddr_atoe(const char *p, unsigned char mac[])
58 mac[i++] = (char) strtoul(p, (char **) &p, 16);
66 /* introspection xml to register interfaces */
67 const gchar wfd_manager_introspection_xml[] = {
68 "<node name='/net/wifidirect'>"
69 "<interface name='net.wifidirect'>"
70 "<method name='Activate'>"
71 "<arg type='i' name='error_code' direction='out'/>"
73 #ifdef TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND
74 "<method name='AddClient'>"
75 "<arg type='i' name='result' direction='out'/>"
77 #endif/* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
78 "<method name='Deactivate'>"
79 "<arg type='i' name='error_code' direction='out'/>"
81 "<method name='StartDiscovery'>"
82 "<arg type='a{sv}' name='parameters' direction='in'/>"
83 "<arg type='i' name='error_code' direction='out'/>"
85 "<method name='StopDiscovery'>"
86 "<arg type='i' name='error_code' direction='out'/>"
88 "<method name='GetDiscoveredPeers'>"
89 "<arg type='i' name='error_code' direction='out'/>"
90 "<arg type='aa{sv}' name='peer_details_list' direction='out'/>"
92 "<method name='Connect'>"
93 "<arg type='s' name='mac_address' direction='in'/>"
94 "<arg type='i' name='error_code' direction='out'/>"
96 "<method name='Disconnect'>"
97 "<arg type='s' name='mac_address' direction='in'/>"
98 "<arg type='i' name='error_code' direction='out'/>"
100 "<method name='CancelConnection'>"
101 "<arg type='s' name='mac_address' direction='in'/>"
102 "<arg type='i' name='error_code' direction='out'/>"
104 "<method name='AcceptConnection'>"
105 "<arg type='s' name='mac_address' direction='in'/>"
106 "<arg type='i' name='error_code' direction='out'/>"
108 "<method name='RejectConnection'>"
109 "<arg type='s' name='mac_address' direction='in'/>"
110 "<arg type='i' name='error_code' direction='out'/>"
112 "<method name='DisconnectAll'>"
113 "<arg type='i' name='error_code' direction='out'/>"
115 "<method name='GetConnectedPeers'>"
116 "<arg type='i' name='error_code' direction='out'/>"
117 "<arg type='aa{sv}' name='peer_details_list' direction='out'/>"
119 "<method name='GetConnectingPeer'>"
120 "<arg type='i' name='error_code' direction='out'/>"
121 "<arg type='a{sv}' name='peer_details' direction='out'/>"
123 "<method name='IsDiscoverable'>"
124 "<arg type='b' name='result' direction='out'/>"
126 "<method name='IsListeningOnly'>"
127 "<arg type='b' name='result' direction='out'/>"
129 "<method name='GetPeerInfo'>"
130 "<arg type='s' name='mac_address' direction='in'/>"
131 "<arg type='i' name='error_code' direction='out'/>"
132 "<arg type='a{sv}' name='peer_details' direction='out'/>"
134 "<method name='GetState'>"
135 "<arg type='i' name='error_code' direction='out'/>"
136 "<arg type='i' name='state' direction='out'/>"
138 "<signal name='Activation'>"
139 "<arg type='i' name='error_code'/>"
141 "<signal name='Deactivation'>"
142 "<arg type='i' name='error_code'/>"
144 "<signal name='Connection'>"
145 "<arg type='i' name='error_code'/>"
146 "<arg type='i' name='connection_state'/>"
147 "<arg type='s' name='peer_mac_address'/>"
149 "<signal name='Disconnection'>"
150 "<arg type='i' name='error_code'/>"
151 "<arg type='i' name='connection_state'/>"
152 "<arg type='s' name='peer_mac_address'/>"
154 "<signal name='ListenStarted'>"
156 "<signal name='DiscoveryStarted'>"
158 "<signal name='DiscoveryFinished'>"
160 "<signal name='PeerFound'>"
161 "<arg type='s' name='peer_mac_address'/>"
163 "<signal name='PeerLost'>"
164 "<arg type='s' name='peer_mac_address'/>"
166 "<signal name='PeerIPAssigned'>"
167 "<arg type='s' name='peer_mac_address'/>"
168 "<arg type='s' name='assigned_ip_address'/>"
171 "<interface name='net.wifidirect.group'>"
172 "<method name='CreateGroup'>"
173 "<arg type='a{sv}' name='parameters' direction='in'/>"
174 "<arg type='i' name='error_code' direction='out'/>"
176 "<method name='DestroyGroup'>"
177 "<arg type='i' name='error_code' direction='out'/>"
179 "<method name='IsGroupOwner'>"
180 "<arg type='b' name='result' direction='out'/>"
182 "<method name='IsAutoGroup'>"
183 "<arg type='b' name='result' direction='out'/>"
185 "<method name='ActivatePushButton'>"
186 "<arg type='i' name='error_code' direction='out'/>"
188 "<method name='GetPersistentGroups'>"
189 "<arg type='i' name='error_code' direction='out'/>"
190 "<arg type='aa{sv}' name='result' direction='out'/>"
192 "<method name='RemovePersistentGroup'>"
193 "<arg type='s' name='mac_address' direction='in'/>"
194 "<arg type='s' name='ssid' direction='in'/>"
195 "<arg type='i' name='error_code' direction='out'/>"
197 "<method name='SetPassphrase'>"
198 "<arg type='s' name='passphrase' direction='in'/>"
199 "<arg type='i' name='error_code' direction='out'/>"
201 "<method name='GetPassphrase'>"
202 "<arg type='i' name='error_code' direction='out'/>"
203 "<arg type='s' name='passphrase' direction='out'/>"
205 "<method name='SetPersistentGroupEnabled'>"
206 "<arg type='b' name='enable' direction='in'/>"
207 "<arg type='i' name='error_code' direction='out'/>"
209 "<method name='IsPersistentGroupEnabled'>"
210 "<arg type='b' name='result' direction='out'/>"
212 "<signal name='Created'>"
214 "<signal name='Destroyed'>"
217 "<interface name='net.wifidirect.config'>"
218 "<method name='GetDeviceName'>"
219 "<arg type='i' name='error_code' direction='out'/>"
220 "<arg type='s' name='device_name' direction='out'/>"
222 "<method name='SetDeviceName'>"
223 "<arg type='s' name='device_name' direction='in'/>"
224 "<arg type='i' name='error_code' direction='out'/>"
226 "<method name='SetWpsPin'>"
227 "<arg type='s' name='wps_pin' direction='in'/>"
228 "<arg type='i' name='error_code' direction='out'/>"
230 "<method name='GetWpsPin'>"
231 "<arg type='i' name='error_code' direction='out'/>"
232 "<arg type='s' name='wps_pin' direction='out'/>"
234 "<method name='GenerateWpsPin'>"
235 "<arg type='i' name='error_code' direction='out'/>"
236 "<arg type='s' name='wps_pin' direction='out'/>"
238 "<method name='GetSupportedWpsMode'>"
239 "<arg type='i' name='error_code' direction='out'/>"
240 "<arg type='i' name='config_methods' direction='out'/>"
242 "<method name='GetReqWpsMode'>"
243 "<arg type='i' name='error_code' direction='out'/>"
244 "<arg type='i' name='req_wps_mode' direction='out'/>"
246 "<method name='SetReqWpsMode'>"
247 "<arg type='i' name='req_wps_mode' direction='in'/>"
248 "<arg type='i' name='error_code' direction='out'/>"
250 "<method name='GetLocalWpsMode'>"
251 "<arg type='i' name='error_code' direction='out'/>"
252 "<arg type='i' name='local_wps_mode' direction='out'/>"
254 "<method name='GetIPAddress'>"
255 "<arg type='i' name='error_code' direction='out'/>"
256 "<arg type='s' name='local_ip_address' direction='out'/>"
258 "<method name='GetMacAddress'>"
259 "<arg type='i' name='error_code' direction='out'/>"
260 "<arg type='s' name='local_mac_address' direction='out'/>"
262 "<method name='GetGoIntent'>"
263 "<arg type='i' name='error_code' direction='out'/>"
264 "<arg type='i' name='go_intent' direction='out'/>"
266 "<method name='SetGoIntent'>"
267 "<arg type='i' name='go_intent' direction='in'/>"
268 "<arg type='i' name='error_code' direction='out'/>"
270 "<method name='GetMaxClient'>"
271 "<arg type='i' name='error_code' direction='out'/>"
272 "<arg type='i' name='max_client' direction='out'/>"
274 "<method name='SetMaxClient'>"
275 "<arg type='i' name='max_client' direction='in'/>"
276 "<arg type='i' name='error_code' direction='out'/>"
278 "<method name='SetAutoConnectionMode'>"
279 "<arg type='b' name='auto_connection_mode' direction='in'/>"
280 "<arg type='i' name='error_code' direction='out'/>"
282 "<method name='IsAutoConnectionMode'>"
283 "<arg type='i' name='error_code' direction='out'/>"
284 "<arg type='b' name='result' direction='out'/>"
286 "<method name='GetOperatingChannel'>"
287 "<arg type='i' name='error_code' direction='out'/>"
288 "<arg type='i' name='operating_channel' direction='out'/>"
290 "<method name='SetAutoConnectionPeer'>"
291 "<arg type='s' name='peer_mac_address' direction='in'/>"
292 "<arg type='i' name='error_code' direction='out'/>"
294 "<method name='GetConnectingPeer'>"
295 "<arg type='i' name='error_code' direction='out'/>"
296 "<arg type='s' name='local_mac_address' direction='out'/>"
298 "<method name='GetInterfaceName'>"
299 "<arg type='i' name='error_code' direction='out'/>"
300 "<arg type='s' name='ifname' direction='out'/>"
302 "<method name='GetSubnetMask'>"
303 "<arg type='i' name='error_code' direction='out'/>"
304 "<arg type='s' name='subnet_mask' direction='out'/>"
306 "<method name='GetGateway'>"
307 "<arg type='i' name='error_code' direction='out'/>"
308 "<arg type='s' name='gateway_address' direction='out'/>"
310 "<method name='GetSessionTimer'>"
311 "<arg type='i' name='error_code' direction='out'/>"
312 "<arg type='i' name='session_timer' direction='out'/>"
314 "<method name='SetSessionTimer'>"
315 "<arg type='i' name='session_timer' direction='in'/>"
316 "<arg type='i' name='error_code' direction='out'/>"
318 "<method name='SetAutoGroupRemoval'>"
319 "<arg type='b' name='enable' direction='in'/>"
320 "<arg type='i' name='error_code' direction='out'/>"
322 "<method name='GetPrimaryDevType'>"
323 "<arg type='i' name='pri_dev_type' direction='out'/>"
324 "<arg type='i' name='error_code' direction='out'/>"
326 "<method name='GetSecondaryDevType'>"
327 "<arg type='i' name='sec_dev_type' direction='out'/>"
328 "<arg type='i' name='error_code' direction='out'/>"
330 "<method name='GetPeerRssi'>"
331 "<arg type='s' name='peer_mac_addr' direction='in'/>"
332 "<arg type='i' name='error_code' direction='out'/>"
333 "<arg type='i' name='rssi' direction='out'/>"
335 "<method name='AddVsie'>"
336 "<arg type='i' name='frame_id' direction='in'/>"
337 "<arg type='s' name='vsie' direction='in'/>"
338 "<arg type='i' name='error_code' direction='out'/>"
340 "<method name='GetVsie'>"
341 "<arg type='i' name='frame_id' direction='in'/>"
342 "<arg type='i' name='error_code' direction='out'/>"
343 "<arg type='s' name='vsie' direction='out'/>"
345 "<method name='RemoveVsie'>"
346 "<arg type='i' name='frame_id' direction='in'/>"
347 "<arg type='s' name='vsie' direction='in'/>"
348 "<arg type='i' name='error_code' direction='out'/>"
351 "<interface name='net.wifidirect.service'>"
352 "<method name='StartDiscovery'>"
353 "<arg type='i' name='service_type' direction='in'/>"
354 "<arg type='s' name='mac_addr' direction='in'/>"
355 "<arg type='i' name='error_code' direction='out'/>"
357 "<method name='StopDiscovery'>"
358 "<arg type='i' name='service_type' direction='in'/>"
359 "<arg type='s' name='mac_addr' direction='in'/>"
360 "<arg type='i' name='error_code' direction='out'/>"
362 "<method name='Register'>"
363 "<arg type='i' name='service_type' direction='in'/>"
364 "<arg type='s' name='info_string' direction='in'/>"
365 "<arg type='i' name='error_code' direction='out'/>"
366 "<arg type='i' name='service_id' direction='out'/>"
368 "<method name='Deregister'>"
369 "<arg type='i' name='service_id' direction='in'/>"
370 "<arg type='i' name='error_code' direction='out'/>"
372 "<signal name='DiscoveryStarted'>"
374 "<signal name='DiscoveryFound'>"
375 "<arg type='i' name='service_type'/>"
376 "<arg type='s' name='response_data'/>"
377 "<arg type='s' name='peer_mac_address'/>"
379 "<signal name='DiscoveryFinished'>"
382 "<interface name='net.wifidirect.display'>"
383 "<method name='Init'>"
384 "<arg type='i' name='error_code' direction='out'/>"
386 "<method name='Deinit'>"
387 "<arg type='i' name='error_code' direction='out'/>"
389 "<method name='SetConfig'>"
390 "<arg type='i' name='type' direction='in'/>"
391 "<arg type='i' name='port' direction='in'/>"
392 "<arg type='i' name='hdcp' direction='in'/>"
393 "<arg type='i' name='error_code' direction='out'/>"
395 "<method name='SetAvailiability'>"
396 "<arg type='i' name='availability' direction='in'/>"
397 "<arg type='i' name='error_code' direction='out'/>"
399 "<method name='GetPeerType'>"
400 "<arg type='s' name='peer_mac_addr' direction='in'/>"
401 "<arg type='i' name='error_code' direction='out'/>"
402 "<arg type='i' name='result' direction='out'/>"
404 "<method name='GetPeerAvailability'>"
405 "<arg type='s' name='peer_mac_addr' direction='in'/>"
406 "<arg type='i' name='error_code' direction='out'/>"
407 "<arg type='i' name='result' direction='out'/>"
409 "<method name='GetPeerHdcp'>"
410 "<arg type='s' name='peer_mac_addr' direction='in'/>"
411 "<arg type='i' name='error_code' direction='out'/>"
412 "<arg type='i' name='result' direction='out'/>"
414 "<method name='GetPeerPort'>"
415 "<arg type='s' name='peer_mac_addr' direction='in'/>"
416 "<arg type='i' name='error_code' direction='out'/>"
417 "<arg type='i' name='result' direction='out'/>"
419 "<method name='GetPeerThroughput'>"
420 "<arg type='s' name='peer_mac_addr' direction='in'/>"
421 "<arg type='i' name='error_code' direction='out'/>"
422 "<arg type='i' name='result' direction='out'/>"
425 "<interface name='net.wifidirect.asp'>"
426 "<method name='AdvertiseService'>"
427 "<arg type='a{sv}' name='parameters' direction='in'/>"
428 "<arg type='i' name='result' direction='out'/>"
430 "<method name='CancelAdvertiseService'>"
431 "<arg type='u' name='adv_id' direction='in'/>"
432 "<arg type='i' name='result' direction='out'/>"
434 "<method name='SeekService'>"
435 "<arg type='a{sv}' name='parameters' direction='in'/>"
436 "<arg type='i' name='result' direction='out'/>"
438 "<method name='CancelSeekService'>"
439 "<arg type='t' name='search_id' direction='in'/>"
440 "<arg type='i' name='result' direction='out'/>"
442 "<method name='ConnectSession'>"
443 "<arg type='a{sv}' name='parameters' direction='in'/>"
444 "<arg type='i' name='result' direction='out'/>"
446 "<method name='ConfirmSession'>"
447 "<arg type='a{sv}' name='parameters' direction='in'/>"
448 "<arg type='i' name='result' direction='out'/>"
450 "<signal name='SearchResult'>"
451 "<arg type='a{sv}' name='parameters'/>"
453 "<signal name='SessionRequest'>"
454 "<arg type='a{sv}' name='parameters'/>"
456 "<signal name='SessionConfigRequest'>"
457 "<arg type='a{sv}' name='parameters'/>"
459 "<signal name='ConnectStatus'>"
460 "<arg type='a{sv}' name='parameters'/>"
462 "<signal name='SessionStatus'>"
463 "<arg type='a{sv}' name='parameters'/>"
465 "<signal name='SessionPeerIPAssigned'>"
466 "<arg type='a{sv}' name='parameters'/>"
472 static bool __is_discovery_available(wfd_manager_s *manager)
474 return manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
475 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
476 manager->state != WIFI_DIRECT_STATE_GROUP_OWNER;
479 static void __wfd_manager_manage_iface_handler(const gchar *method_name,
480 GVariant *parameters,
481 GDBusMethodInvocation *invocation)
483 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
484 wfd_manager_s *manager = wfd_get_manager();
485 GVariant *return_parameters = NULL;
487 gchar* dbus_error_name = NULL;
488 WDS_LOGD("%s", method_name);
490 if (!g_strcmp0(method_name, "Activate")) {
492 WFD_DBUS_REPLY_ERROR_NONE(invocation);
494 ret = wfd_manager_activate(manager);
495 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
497 g_variant_new("(i)", ret));
499 #ifdef TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND
500 } else if (!g_strcmp0(method_name, "AddClient")) {
501 return_parameters = g_variant_new("(i)", WIFI_DIRECT_ERROR_NONE);
503 #endif/* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
504 } else if (!g_strcmp0(method_name, "Deactivate")) {
506 ret = wfd_util_check_p2p_hotspot_state();
508 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
512 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
513 WDS_LOGE("Already deactivated");
514 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
518 WFD_DBUS_REPLY_ERROR_NONE(invocation);
520 ret = wfd_manager_deactivate(manager);
521 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
523 g_variant_new("(i)", ret));
526 } else if (!g_strcmp0(method_name, "StartDiscovery")) {
527 gboolean mode = FALSE;
530 gint32 frequency = 0;
531 const gchar *type = NULL;
532 GVariantIter *iter = NULL;
534 GVariant *var = NULL;
536 g_variant_get(parameters, "(a{sv})", &iter);
537 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
538 if (!g_strcmp0(key, "Mode"))
539 g_variant_get(var, "b", &mode);
540 else if (!g_strcmp0(key, "Timeout"))
541 g_variant_get(var, "i", &timeout);
542 else if (!g_strcmp0(key, "Type"))
543 g_variant_get(var, "&s", &type);
544 else if (!g_strcmp0(key, "Channel"))
545 g_variant_get(var, "i", &channel);
546 else if (!g_strcmp0(key, "Frequency"))
547 g_variant_get(var, "i", &frequency);
551 g_variant_iter_free(iter);
553 if (__is_discovery_available(manager)) {
554 WDS_LOGE("Wi-Fi Direct is not available status for scanning.");
555 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
559 if (mode && (manager->local->dev_role == WFD_DEV_ROLE_GO)) {
560 WDS_LOGW("Wi-Fi Direct device is already visible, do not start listen");
561 ret = WIFI_DIRECT_ERROR_NONE;
562 return_parameters = g_variant_new("(i)", ret);
566 WFD_DBUS_REPLY_ERROR_NONE(invocation);
568 ret = wfd_manager_start_discovery(manager, mode, timeout, type,
570 if (ret == WIFI_DIRECT_ERROR_NONE) {
571 if (mode == WFD_OEM_SCAN_MODE_PASSIVE) {
572 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
576 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
583 } else if (!g_strcmp0(method_name, "StopDiscovery")) {
584 int mode = manager->scan_mode;
585 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
586 manager->state != WIFI_DIRECT_STATE_DISCOVERING) {
587 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
591 WFD_DBUS_REPLY_ERROR_NONE(invocation);
593 ret = wfd_manager_cancel_discovery(manager);
594 if (ret == WIFI_DIRECT_ERROR_NONE && mode == WFD_SCAN_MODE_PASSIVE)
595 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
596 "DiscoveryFinished", NULL);
599 } else if (!g_strcmp0(method_name, "GetDiscoveredPeers")) {
600 wfd_discovery_entry_s *peers = NULL;
601 GVariantBuilder *builder_peers = NULL;
605 builder_peers = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
607 peer_cnt = wfd_manager_get_peers(manager, &peers);
608 WDS_LOGD("Peer count [%d], Peer list [%p]", peer_cnt, peers);
610 WDS_LOGE("Failed to get scan result");
611 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
618 for (i = 0; i < peer_cnt; i++) {
619 GVariantBuilder builder_peer;
620 g_variant_builder_init(&builder_peer, G_VARIANT_TYPE("a{sv}"));
622 g_variant_builder_add(&builder_peer, "{sv}",
624 g_variant_new_string(peers[i].device_name));
625 g_variant_builder_add(&builder_peer, "{sv}",
627 wfd_manager_dbus_pack_ay(peers[i].mac_address, MACADDR_LEN));
628 g_variant_builder_add(&builder_peer, "{sv}",
630 wfd_manager_dbus_pack_ay(peers[i].intf_address, MACADDR_LEN));
631 g_variant_builder_add(&builder_peer, "{sv}",
633 g_variant_new_uint16(peers[i].channel));
635 if (manager->is_service_discovery_supported) {
636 g_variant_builder_add(&builder_peer, "{sv}",
638 g_variant_new_uint16(peers[i].services));
640 g_variant_builder_add(&builder_peer, "{sv}",
642 g_variant_new_boolean(peers[i].is_group_owner));
643 g_variant_builder_add(&builder_peer, "{sv}",
645 g_variant_new_boolean(peers[i].is_persistent_go));
646 g_variant_builder_add(&builder_peer, "{sv}",
648 g_variant_new_boolean(peers[i].is_connected));
649 g_variant_builder_add(&builder_peer, "{sv}",
651 g_variant_new_uint16(peers[i].wps_device_pwd_id));
652 g_variant_builder_add(&builder_peer, "{sv}",
654 g_variant_new_uint16(peers[i].wps_cfg_methods));
655 g_variant_builder_add(&builder_peer, "{sv}",
657 g_variant_new_uint16(peers[i].category));
658 g_variant_builder_add(&builder_peer, "{sv}",
660 g_variant_new_uint16(peers[i].subcategory));
662 if (manager->is_wifi_display_supported)
663 g_variant_builder_add(&builder_peer, "{sv}",
665 g_variant_new_boolean(peers[i].is_wfd_device));
667 WDS_LOGD("%dth peer [%s]", i, peers[i].device_name);
668 g_variant_builder_add_value(builder_peers, g_variant_builder_end(&builder_peer));
671 ret = WIFI_DIRECT_ERROR_NONE;
672 return_parameters = g_variant_new("(iaa{sv})", ret, builder_peers);
673 g_variant_builder_unref(builder_peers);
676 } else if (!g_strcmp0(method_name, "Connect")) {
677 const char *peer_mac_address = NULL;
678 unsigned char mac_addr[MACADDR_LEN] = {0, };
680 if (__is_discovery_available(manager)) {
681 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
685 wfd_group_s *group = (wfd_group_s*) manager->group;
686 if (group && group->member_count >= manager->max_station) {
687 ret = WIFI_DIRECT_ERROR_TOO_MANY_CLIENT;
691 g_variant_get(parameters, "(&s)", &peer_mac_address);
692 if (peer_mac_address == NULL) {
693 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
697 WFD_DBUS_REPLY_ERROR_NONE(invocation);
699 macaddr_atoe(peer_mac_address, mac_addr);
700 ret = wfd_manager_connect(manager, mac_addr);
701 if (ret == WIFI_DIRECT_ERROR_NONE)
702 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
704 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
705 WFD_EVENT_CONNECTION_IN_PROGRESS,
709 } else if (!g_strcmp0(method_name, "Disconnect")) {
710 const char *peer_mac_address = NULL;
711 unsigned char mac_addr[MACADDR_LEN] = {0, };
713 if (!manager->group || manager->state < WIFI_DIRECT_STATE_CONNECTED) {
714 if (WIFI_DIRECT_STATE_DISCOVERING == manager->state) {
715 ret = wfd_oem_stop_scan(manager->oem_ops);
717 WDS_LOGE("Failed to stop scan");
718 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
721 WDS_LOGI("Succeeded to stop scan");
722 if (WFD_DEV_ROLE_GO == manager->local->dev_role) {
723 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
724 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
726 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
727 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
730 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
735 g_variant_get(parameters, "(&s)", &peer_mac_address);
736 if (peer_mac_address == NULL) {
737 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
741 WFD_DBUS_REPLY_ERROR_NONE(invocation);
743 macaddr_atoe(peer_mac_address, mac_addr);
744 ret = wfd_manager_disconnect(manager, mac_addr);
745 if (ret == WIFI_DIRECT_ERROR_NONE)
746 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
748 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
749 WFD_EVENT_DISCONNECTION_RSP,
753 } else if (!g_strcmp0(method_name, "CancelConnection")) {
754 const char *peer_mac_address = NULL;
755 unsigned char mac_addr[MACADDR_LEN] = {0, };
757 if (!manager->session && manager->state != WIFI_DIRECT_STATE_CONNECTING) {
758 WDS_LOGE("It's not CONNECTING state");
759 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
763 g_variant_get(parameters, "(&s)", &peer_mac_address);
764 if (peer_mac_address == NULL) {
765 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
769 WFD_DBUS_REPLY_ERROR_NONE(invocation);
771 macaddr_atoe(peer_mac_address, mac_addr);
772 ret = wfd_manager_cancel_connection(manager, mac_addr);
773 if (ret == WIFI_DIRECT_ERROR_NONE)
774 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
776 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_CANCELED,
777 WFD_EVENT_CONNECTION_RSP,
781 } else if (!g_strcmp0(method_name, "AcceptConnection")) {
782 const char *peer_mac_address = NULL;
783 unsigned char mac_addr[MACADDR_LEN] = {0, };
785 if (manager->state != WIFI_DIRECT_STATE_CONNECTING) {
786 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
790 wfd_group_s *group = (wfd_group_s*) manager->group;
791 if (group && group->member_count >= manager->max_station) {
792 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
796 g_variant_get(parameters, "(&s)", &peer_mac_address);
797 if (peer_mac_address == NULL) {
798 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
802 WFD_DBUS_REPLY_ERROR_NONE(invocation);
804 macaddr_atoe(peer_mac_address, mac_addr);
805 ret = wfd_manager_accept_connection(manager, mac_addr);
806 if (ret == WIFI_DIRECT_ERROR_NONE) {
807 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
809 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
810 WFD_EVENT_CONNECTION_IN_PROGRESS,
813 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
815 g_variant_new("(iis)", WIFI_DIRECT_ERROR_OPERATION_FAILED,
816 WFD_EVENT_CONNECTION_RSP,
821 } else if (!g_strcmp0(method_name, "RejectConnection")) {
822 wfd_session_s *session = manager->session;
823 const char *peer_mac_address = NULL;
824 unsigned char mac_addr[MACADDR_LEN] = {0, };
826 if (!session || manager->state != WIFI_DIRECT_STATE_CONNECTING) {
827 WDS_LOGE("It's not permitted with this state [%d]", manager->state);
828 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
832 if (session->direction != SESSION_DIRECTION_INCOMING) {
833 WDS_LOGE("Only incomming session can be rejected");
834 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
838 g_variant_get(parameters, "(&s)", &peer_mac_address);
839 if (peer_mac_address == NULL) {
840 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
844 WFD_DBUS_REPLY_ERROR_NONE(invocation);
846 macaddr_atoe(peer_mac_address, mac_addr);
847 ret = wfd_manager_reject_connection(manager, mac_addr);
848 if (ret == WIFI_DIRECT_ERROR_NONE)
849 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
851 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_CANCELED,
852 WFD_EVENT_CONNECTION_RSP,
856 } else if (!g_strcmp0(method_name, "DisconnectAll")) {
858 if (!manager->group || manager->state < WIFI_DIRECT_STATE_CONNECTED) {
859 if (WIFI_DIRECT_STATE_DISCOVERING == manager->state) {
860 ret = wfd_oem_stop_scan(manager->oem_ops);
862 WDS_LOGE("Failed to stop scan");
863 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
866 WDS_LOGI("Succeeded to stop scan");
867 if (WFD_DEV_ROLE_GO == manager->local->dev_role) {
868 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
869 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
871 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
872 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
875 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
880 WFD_DBUS_REPLY_ERROR_NONE(invocation);
882 ret = wfd_manager_disconnect_all(manager);
883 if (ret == WIFI_DIRECT_ERROR_NONE)
884 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
886 g_variant_new("(iis)", ret,
887 WFD_EVENT_DISCONNECTION_RSP,
891 } else if (!g_strcmp0(method_name, "GetConnectedPeers")) {
892 wfd_connected_peer_info_s *peers = NULL;
893 GVariantBuilder *builder_peers = NULL;
897 builder_peers = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
899 /* even though status is not CONNECTED,
900 * this command can be excuted only when group exist */
901 if (!manager->group && manager->state < WIFI_DIRECT_STATE_CONNECTED) {
902 WDS_LOGD("It's not connected state [%d]", manager->state);
903 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
907 peer_cnt = wfd_manager_get_connected_peers(manager, &peers);
908 WDS_LOGD("Peer count [%d], Peer list [%x]", peer_cnt, peers);
910 WDS_LOGE("Failed to get scan result");
911 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
915 for (i = 0; i < peer_cnt; i++) {
916 GVariantBuilder builder_peer;
917 g_variant_builder_init(&builder_peer, G_VARIANT_TYPE("a{sv}"));
919 g_variant_builder_add(&builder_peer, "{sv}",
921 g_variant_new_string(peers[i].device_name));
922 g_variant_builder_add(&builder_peer, "{sv}",
924 wfd_manager_dbus_pack_ay(peers[i].mac_address, MACADDR_LEN));
925 g_variant_builder_add(&builder_peer, "{sv}",
927 wfd_manager_dbus_pack_ay(peers[i].intf_address, MACADDR_LEN));
928 g_variant_builder_add(&builder_peer, "{sv}",
930 wfd_manager_dbus_pack_ay(peers[i].ip_address, IPADDR_LEN));
931 g_variant_builder_add(&builder_peer, "{sv}",
933 g_variant_new_uint16(peers[i].channel));
934 if (manager->is_service_discovery_supported) {
935 g_variant_builder_add(&builder_peer, "{sv}",
937 g_variant_new_uint16(peers[i].services));
939 g_variant_builder_add(&builder_peer, "{sv}",
941 g_variant_new_uint16(peers[i].category));
942 g_variant_builder_add(&builder_peer, "{sv}",
944 g_variant_new_uint16(peers[i].subcategory));
945 g_variant_builder_add(&builder_peer, "{sv}",
947 g_variant_new_boolean(peers[i].is_p2p));
949 if (manager->is_wifi_display_supported)
950 g_variant_builder_add(&builder_peer, "{sv}",
952 g_variant_new_boolean(peers[i].is_wfd_device));
954 WDS_LOGD("%dth peer [%s]", i, peers[i].device_name);
955 g_variant_builder_add_value(builder_peers, g_variant_builder_end(&builder_peer));
958 ret = WIFI_DIRECT_ERROR_NONE;
959 return_parameters = g_variant_new("(iaa{sv})", ret, builder_peers);
960 g_variant_builder_unref(builder_peers);
963 } else if (!g_strcmp0(method_name, "GetConnectingPeer")) {
964 wfd_session_s *session;
965 wfd_device_s *peer = NULL;
966 wfd_discovery_entry_s *connecting_peer = NULL;
967 GVariantBuilder *builder_peer = NULL;
969 if (!manager->session ||
970 manager->state != WIFI_DIRECT_STATE_CONNECTING) {
971 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
975 session = manager->session;
976 if (!session->peer) {
977 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
980 peer = session->peer;
982 connecting_peer = (wfd_discovery_entry_s *)
983 g_try_malloc0(sizeof(wfd_discovery_entry_s));
984 if (!connecting_peer) {
985 WDS_LOGF("Failed to allocate memory for peer data.");
986 ret = WIFI_DIRECT_ERROR_OUT_OF_MEMORY;
990 builder_peer = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
992 g_variant_builder_add(builder_peer, "{sv}",
994 g_variant_new_string(peer->dev_name));
995 g_variant_builder_add(builder_peer, "{sv}",
997 wfd_manager_dbus_pack_ay(peer->dev_addr,
999 g_variant_builder_add(builder_peer, "{sv}",
1001 wfd_manager_dbus_pack_ay(peer->intf_addr,
1003 g_variant_builder_add(builder_peer, "{sv}",
1005 g_variant_new_uint16(peer->channel));
1006 g_variant_builder_add(builder_peer, "{sv}",
1008 g_variant_new_boolean(peer->dev_role == WFD_DEV_ROLE_GC));
1009 g_variant_builder_add(builder_peer, "{sv}",
1011 g_variant_new_boolean(peer->dev_role == WFD_OEM_DEV_ROLE_GO));
1012 g_variant_builder_add(builder_peer, "{sv}",
1014 g_variant_new_boolean(peer->group_flags & WFD_OEM_GROUP_FLAG_PERSISTENT_GROUP));
1015 g_variant_builder_add(builder_peer, "{sv}",
1017 g_variant_new_uint16(peer->pri_dev_type));
1018 g_variant_builder_add(builder_peer, "{sv}",
1020 g_variant_new_uint16(peer->sec_dev_type));
1021 g_variant_builder_add(builder_peer, "{sv}",
1023 g_variant_new_uint16(peer->config_methods));
1025 if (manager->is_wifi_display_supported)
1026 g_variant_builder_add(builder_peer, "{sv}",
1028 g_variant_new_boolean(false));
1030 ret = WIFI_DIRECT_ERROR_NONE;
1031 return_parameters = g_variant_new("(ia{sv})", ret,
1033 g_variant_builder_unref(builder_peer);
1034 g_free(connecting_peer);
1037 } else if (!g_strcmp0(method_name, "IsDiscoverable")) {
1038 ret = WIFI_DIRECT_ERROR_NONE;
1039 return_parameters = g_variant_new("(b)",
1040 (manager->state == WIFI_DIRECT_STATE_DISCOVERING ||
1041 wfd_group_is_autonomous(manager->group) == TRUE));
1044 } else if (!g_strcmp0(method_name, "IsListeningOnly")) {
1045 ret = WIFI_DIRECT_ERROR_NONE;
1046 return_parameters = g_variant_new("(b)", (manager->scan_mode == WFD_SCAN_MODE_PASSIVE));
1049 } else if (!g_strcmp0(method_name, "GetPeerInfo")) {
1050 wfd_discovery_entry_s *peer = NULL;
1051 GVariantBuilder *builder_peer = NULL;
1052 const char *peer_mac_address = NULL;
1053 unsigned char mac_addr[MACADDR_LEN] = {0, };
1055 g_variant_get(parameters, "(&s)", &peer_mac_address);
1056 if (peer_mac_address == NULL) {
1057 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1061 macaddr_atoe(peer_mac_address, mac_addr);
1062 ret = wfd_manager_get_peer_info(manager, mac_addr, &peer);
1063 if (ret < 0 || !peer) {
1064 WDS_LOGE("Failed to get peer info");
1066 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1070 builder_peer = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
1071 g_variant_builder_add(builder_peer, "{sv}",
1073 g_variant_new_string(peer->device_name));
1074 g_variant_builder_add(builder_peer, "{sv}",
1076 wfd_manager_dbus_pack_ay(peer->mac_address, MACADDR_LEN));
1077 g_variant_builder_add(builder_peer, "{sv}",
1079 wfd_manager_dbus_pack_ay(peer->intf_address, MACADDR_LEN));
1080 g_variant_builder_add(builder_peer, "{sv}",
1082 g_variant_new_uint16(peer->channel));
1083 if (manager->is_service_discovery_supported) {
1084 g_variant_builder_add(builder_peer, "{sv}",
1086 g_variant_new_uint16(peer->services));
1088 g_variant_builder_add(builder_peer, "{sv}",
1090 g_variant_new_boolean(peer->is_group_owner));
1091 g_variant_builder_add(builder_peer, "{sv}",
1093 g_variant_new_boolean(peer->is_persistent_go));
1094 g_variant_builder_add(builder_peer, "{sv}",
1096 g_variant_new_boolean(peer->is_connected));
1097 g_variant_builder_add(builder_peer, "{sv}",
1099 g_variant_new_uint16(peer->wps_device_pwd_id));
1100 g_variant_builder_add(builder_peer, "{sv}",
1102 g_variant_new_uint16(peer->wps_cfg_methods));
1103 g_variant_builder_add(builder_peer, "{sv}",
1105 g_variant_new_uint16(peer->category));
1106 g_variant_builder_add(builder_peer, "{sv}",
1108 g_variant_new_uint16(peer->subcategory));
1110 if (manager->is_wifi_display_supported)
1111 g_variant_builder_add(builder_peer, "{sv}",
1113 g_variant_new_boolean(peer->is_wfd_device));
1115 wfd_device_s *connected_peer = NULL;
1116 connected_peer = wfd_group_find_member_by_addr(manager->group, mac_addr);
1117 if (connected_peer) {
1118 g_variant_builder_add(builder_peer, "{sv}",
1120 g_variant_new_boolean(true));
1121 g_variant_builder_add(builder_peer, "{sv}",
1123 wfd_manager_dbus_pack_ay(connected_peer->ip_addr, IPADDR_LEN));
1126 ret = WIFI_DIRECT_ERROR_NONE;
1127 return_parameters = g_variant_new("(ia{sv})", ret, builder_peer);
1128 g_variant_builder_unref(builder_peer);
1132 } else if (!g_strcmp0(method_name, "GetState")) {
1133 ret = WIFI_DIRECT_ERROR_NONE;
1134 return_parameters = g_variant_new("(ii)", ret, manager->state);
1138 WDS_LOGD("method not handled");
1139 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1144 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
1149 /*g_dbus_method_invocation_return_dbus_error
1150 * (invocation, WFD_MANAGER_SERVICE ".Error", ".OperationFailed"); */
1152 wfd_error_set_gerror(ret, &err);
1153 dbus_error_name = g_dbus_error_encode_gerror(err);
1154 WDS_LOGD("g_dbus_method_invocation_return_gerror with [%s]", dbus_error_name);
1155 g_free(dbus_error_name);
1156 g_dbus_method_invocation_return_gerror(invocation, err);
1157 g_clear_error(&err);
1161 static void __wfd_manager_group_iface_handler(const gchar *method_name,
1162 GVariant *parameters,
1163 GDBusMethodInvocation *invocation)
1165 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1166 wfd_manager_s *manager = wfd_get_manager();
1167 GVariant *return_parameters = NULL;
1169 WDS_LOGD("%s", method_name);
1171 if (!g_strcmp0(method_name, "CreateGroup")) {
1172 wfd_group_s *group = manager->group;
1173 wfd_oem_group_param_s param;
1174 GVariantIter *iter = NULL;
1176 GVariant *var = NULL;
1177 const char *ssid = NULL;
1179 g_variant_get(parameters, "(a{sv})", &iter);
1180 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
1181 if (!g_strcmp0(key, "ssid")) {
1182 g_variant_get(var, "&s", &ssid);
1184 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1185 g_variant_iter_free(iter);
1188 WDS_LOGD("SSID received [%s]", ssid);
1192 if (group || manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1193 WDS_LOGE("Group already exist or not a proper state");
1194 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1195 g_variant_iter_free(iter);
1199 #ifdef TIZEN_WLAN_BOARD_SPRD
1200 group = wfd_create_pending_group(manager, manager->local->dev_addr);
1202 group = wfd_create_pending_group(manager, manager->local->intf_addr);
1205 WDS_LOGE("Failed to create pending group");
1206 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1207 g_variant_iter_free(iter);
1210 group->flags |= WFD_GROUP_FLAG_AUTONOMOUS;
1211 manager->group = group;
1213 memset(¶m, 0x0, sizeof(param));
1215 param.persistent = (manager->local->group_flags &
1216 WFD_GROUP_FLAG_PERSISTENT);
1217 memcpy(&(param.passphrase), manager->local->passphrase,
1218 sizeof(param.passphrase));
1220 #ifndef TIZEN_WLAN_BOARD_SPRD
1221 param.freq = WFD_FREQ_2G;
1225 g_strlcpy(param.ssid, ssid, WIFI_DIRECT_MAX_DEVICE_NAME_LEN+1);
1227 g_variant_iter_free(iter);
1229 ret = wfd_oem_create_group(manager->oem_ops, ¶m);
1231 WDS_LOGE("Failed to create group");
1232 wfd_destroy_group(manager);
1233 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1237 WDS_LOGD("Succeeded to create pending group");
1238 memset(manager->local->passphrase, 0x0, PASSPHRASE_LEN_MAX + 1);
1239 ret = WIFI_DIRECT_ERROR_NONE;
1240 return_parameters = g_variant_new("(i)", ret);
1243 } else if (!g_strcmp0(method_name, "DestroyGroup")) {
1244 wfd_group_s *group = manager->group;
1246 WDS_LOGE("Group not exist");
1247 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1251 ret = wfd_util_check_p2p_hotspot_state();
1253 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1257 if (group->pending == FALSE) {
1258 ret = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1260 WDS_LOGE("Failed to destroy group");
1261 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1266 ret = wfd_destroy_group(manager);
1268 WDS_LOGE("Failed to destroy group");
1270 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1271 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1273 WFD_DBUS_REPLY_ERROR_NONE(invocation);
1275 wfd_manager_dbus_emit_signal(WFD_MANAGER_GROUP_INTERFACE,
1279 } else if (!g_strcmp0(method_name, "IsGroupOwner")) {
1281 wfd_device_s *local = manager->local;
1282 result = local->dev_role == WFD_DEV_ROLE_GO;
1283 WDS_LOGI("Is group owner : [%s]", result ? "Yes" : "No");
1284 return_parameters = g_variant_new("(b)", result);
1287 } else if (!g_strcmp0(method_name, "IsAutoGroup")) {
1289 if ((result = wfd_group_is_autonomous(manager->group)) < 0)
1292 WDS_LOGI("Is autonomous group : [%s]", result ? "Yes" : "No");
1293 return_parameters = g_variant_new("(b)", result);
1296 } else if (!g_strcmp0(method_name, "ActivatePushButton")) {
1297 if (manager->local->dev_role != WFD_DEV_ROLE_GO) {
1298 WDS_LOGE("Wi-Fi Direct is not Group Owner.");
1299 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1303 ret = wfd_oem_wps_start(manager->oem_ops, NULL,
1304 WFD_WPS_MODE_PBC, NULL);
1306 WDS_LOGE("Failed to start wps");
1307 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1310 return_parameters = g_variant_new("(i)", ret);
1313 } else if (!g_strcmp0(method_name, "GetPersistentGroups")) {
1314 int persistent_group_count = 0;
1315 wfd_persistent_group_info_s *plist;
1316 GVariantBuilder *builder_groups = NULL;
1319 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1320 WDS_LOGE("Wi-Fi Direct is not activated.");
1321 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1326 ret = wfd_oem_get_persistent_groups(manager->oem_ops,
1327 (wfd_oem_persistent_group_s**) &plist, &persistent_group_count);
1329 WDS_LOGE("Error!! wfd_oem_get_persistent_group_info() failed..");
1330 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1334 builder_groups = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
1336 for (i = 0; i < persistent_group_count; i++) {
1337 GVariantBuilder builder_group;
1338 g_variant_builder_init(&builder_group, G_VARIANT_TYPE("a{sv}"));
1340 g_variant_builder_add(&builder_group, "{sv}",
1342 g_variant_new_uint32(plist[i].network_id));
1343 g_variant_builder_add(&builder_group, "{sv}",
1345 g_variant_new_string(plist[i].ssid));
1346 g_variant_builder_add(&builder_group, "{sv}",
1348 wfd_manager_dbus_pack_ay(plist[i].go_mac_address, MACADDR_LEN));
1350 WDS_LOGD("%dth peer [%s]", i, plist[i].ssid);
1351 g_variant_builder_add_value(builder_groups, g_variant_builder_end(&builder_group));
1354 ret = WIFI_DIRECT_ERROR_NONE;
1355 return_parameters = g_variant_new("(iaa{sv})", ret, builder_groups);
1356 g_variant_builder_unref(builder_groups);
1359 } else if (!g_strcmp0(method_name, "RemovePersistentGroup")) {
1362 unsigned char go_mac_address[6];
1363 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1364 WDS_LOGE("Wi-Fi Direct is not activated.");
1365 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1369 g_variant_get(parameters, "(&s&s)", &mac_address, &ssid);
1370 if (mac_address == NULL || ssid == NULL) {
1371 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1375 macaddr_atoe(mac_address, go_mac_address);
1376 WDS_LOGD("Remove persistent group [%s][" MACSTR "]", ssid, MAC2STR(go_mac_address));
1378 ret = wfd_oem_remove_persistent_group(manager->oem_ops, ssid,
1381 WDS_LOGE("Failed to remove persistent group");
1382 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1385 return_parameters = g_variant_new("(i)", ret);
1388 } else if (!g_strcmp0(method_name, "SetPassphrase")) {
1390 int passphrase_len = 0;
1391 wfd_group_s *group = manager->group;
1394 WDS_LOGE("Group already exists");
1395 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1399 g_variant_get(parameters, "(&s)", &passphrase);
1400 if (passphrase == NULL) {
1401 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1405 passphrase_len = strlen(passphrase);
1407 if (passphrase_len < PASSPHRASE_LEN_MIN ||
1408 passphrase_len > PASSPHRASE_LEN_MAX) {
1409 WDS_LOGE("Passphrase length incorrect [%s]:[%d]",
1410 passphrase, passphrase_len);
1411 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1415 g_strlcpy(manager->local->passphrase, passphrase, PASSPHRASE_LEN_MAX + 1);
1416 WDS_LOGI("Passphrase string [%s]", manager->local->passphrase);
1418 ret = WIFI_DIRECT_ERROR_NONE;
1419 return_parameters = g_variant_new("(i)", ret);
1422 } else if (!g_strcmp0(method_name, "GetPassphrase")) {
1423 wfd_group_s *group = manager->group;
1425 WDS_LOGE("Group not exist");
1426 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1430 if (group->role == WFD_DEV_ROLE_GC) {
1431 WDS_LOGE("Device is not GO");
1432 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1436 ret = WIFI_DIRECT_ERROR_NONE;
1437 return_parameters = g_variant_new("(is)", ret, group->passphrase);
1438 WDS_LOGI("group->pass : [%s]", group->passphrase);
1442 } else if (!g_strcmp0(method_name, "SetPersistentGroupEnabled")) {
1445 g_variant_get(parameters, "(b)", &enabled);
1446 WDS_LOGI("Activate Persistent Group : [%s]",
1447 enabled ? "True" : "False");
1449 manager->local->group_flags |= WFD_GROUP_FLAG_PERSISTENT;
1451 manager->local->group_flags &= ~(WFD_GROUP_FLAG_PERSISTENT);
1452 ret = WIFI_DIRECT_ERROR_NONE;
1453 return_parameters = g_variant_new("(i)", ret);
1456 } else if (!g_strcmp0(method_name, "IsPersistentGroupEnabled")) {
1458 result = ((manager->local->group_flags &
1459 WFD_GROUP_FLAG_PERSISTENT)
1460 == WFD_GROUP_FLAG_PERSISTENT);
1461 WDS_LOGI("Is persistent group : [%s]", result ? "Yes" : "No");
1462 return_parameters = g_variant_new("(b)", result);
1466 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1471 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
1475 wfd_error_set_gerror(ret, &err);
1476 g_dbus_method_invocation_return_gerror(invocation, err);
1477 g_clear_error(&err);
1481 static void __wfd_manager_config_iface_handler(const gchar *method_name,
1482 GVariant *parameters,
1483 GDBusMethodInvocation *invocation)
1485 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1486 wfd_manager_s *manager = wfd_get_manager();
1487 GVariant *return_parameters = NULL;
1489 WDS_LOGD("%s", method_name);
1491 if (!g_strcmp0(method_name, "GetDeviceName")) {
1492 char device_name[WIFI_DIRECT_MAX_DEVICE_NAME_LEN+1] = {0, };
1494 ret = wfd_local_get_dev_name(device_name);
1496 WDS_LOGE("Failed to get device name");
1497 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1501 ret = WIFI_DIRECT_ERROR_NONE;
1502 return_parameters = g_variant_new("(is)", ret, device_name);
1506 } else if (!g_strcmp0(method_name, "SetDeviceName")) {
1507 const char *device_name = NULL;
1508 g_variant_get(parameters, "(&s)", &device_name);
1509 if (device_name == NULL) {
1510 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1514 ret = wfd_local_set_dev_name((char *)device_name);
1516 WDS_LOGE("Failed to set device name");
1517 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1521 ret = WIFI_DIRECT_ERROR_NONE;
1522 return_parameters = g_variant_new("(i)", ret);
1525 } else if (!g_strcmp0(method_name, "GetWpsPin")) {
1526 wfd_session_s *session = (wfd_session_s*) manager->session;
1527 if (!session || manager->auto_pin[0] != 0) {
1528 WDS_LOGE("Session not exist");
1529 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1533 if (session->wps_pin[0] == '\0') {
1534 WDS_LOGE("WPS PIN is not set");
1535 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1539 ret = WIFI_DIRECT_ERROR_NONE;
1540 return_parameters = g_variant_new("(is)", ret, session->wps_pin);
1543 } else if (!g_strcmp0(method_name, "SetWpsPin")) {
1544 const char *pin = NULL;
1545 wfd_session_s *session = (wfd_session_s*) manager->session;
1547 g_variant_get(parameters, "(&s)", &pin);
1549 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1554 WDS_LOGE("Session not exist");
1555 g_strlcpy(manager->auto_pin, pin, strlen(pin) + 1);
1557 g_strlcpy(session->wps_pin, pin, strlen(pin) + 1);
1560 ret = WIFI_DIRECT_ERROR_NONE;
1561 return_parameters = g_variant_new("(i)", ret);
1564 } else if (!g_strcmp0(method_name, "GetSupportedWpsMode")) {
1565 int config_methods = 0;
1567 ret = wfd_local_get_supported_wps_mode(&config_methods);
1569 WDS_LOGE("Failed to get supported wps mode");
1570 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1574 ret = WIFI_DIRECT_ERROR_NONE;
1575 return_parameters = g_variant_new("(ii)", ret, config_methods);
1578 } else if (!g_strcmp0(method_name, "GetReqWpsMode")) {
1581 ret = wfd_manager_get_req_wps_mode(&wps_mode);
1583 WDS_LOGE("Failed to get request wps mode");
1584 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1588 ret = WIFI_DIRECT_ERROR_NONE;
1589 return_parameters = g_variant_new("(ii)", ret, wps_mode);
1592 } else if (!g_strcmp0(method_name, "SetReqWpsMode")) {
1595 g_variant_get(parameters, "(i)", &type);
1596 ret = wfd_manager_set_req_wps_mode(type);
1598 WDS_LOGE("Failed to set request wps mode");
1599 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1603 ret = WIFI_DIRECT_ERROR_NONE;
1604 return_parameters = g_variant_new("(i)", ret);
1607 } else if (!g_strcmp0(method_name, "GetLocalWpsMode")) {
1610 ret = wfd_local_get_wps_mode(&wps_mode);
1612 WDS_LOGE("Failed to get request wps mode");
1613 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1617 ret = WIFI_DIRECT_ERROR_NONE;
1618 return_parameters = g_variant_new("(ii)", ret, wps_mode);
1621 } else if (!g_strcmp0(method_name, "GetIPAddress")) {
1622 char ip_addr_str[IPSTR_LEN+1] = {0, };
1624 if (manager->state < WIFI_DIRECT_STATE_CONNECTED) {
1625 WDS_LOGE("Device is not connected yet");
1626 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1630 ret = wfd_local_get_ip_addr((char *)ip_addr_str);
1632 WDS_LOGE("Failed to get local IP address");
1633 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1637 return_parameters = g_variant_new("(is)", ret, ip_addr_str);
1638 WDS_LOGI("IP addr : [%s]", ip_addr_str);
1641 } else if (!g_strcmp0(method_name, "GetMacAddress")) {
1642 char device_mac[MACSTR_LEN+1] = {0, };
1644 ret = wfd_local_get_dev_mac(device_mac);
1646 WDS_LOGE("Failed to get device mac");
1647 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1651 ret = WIFI_DIRECT_ERROR_NONE;
1652 return_parameters = g_variant_new("(is)", ret, device_mac);
1655 } else if (!g_strcmp0(method_name, "GetGoIntent")) {
1658 ret = wfd_manager_get_go_intent(&go_intent);
1660 WDS_LOGE("Failed to get GO intent");
1661 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1665 ret = WIFI_DIRECT_ERROR_NONE;
1666 return_parameters = g_variant_new("(ii)", ret, go_intent);
1669 } else if (!g_strcmp0(method_name, "SetGoIntent")) {
1672 g_variant_get(parameters, "(i)", &go_intent);
1673 ret = wfd_manager_set_go_intent(go_intent);
1675 WDS_LOGE("Failed to set GO intent");
1676 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1680 ret = WIFI_DIRECT_ERROR_NONE;
1681 return_parameters = g_variant_new("(i)", ret);
1684 } else if (!g_strcmp0(method_name, "GetMaxClient")) {
1687 ret = wfd_manager_get_max_station(&max_client);
1689 WDS_LOGE("Failed to get max station");
1690 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1694 ret = WIFI_DIRECT_ERROR_NONE;
1695 return_parameters = g_variant_new("(ii)", ret, max_client);
1698 } else if (!g_strcmp0(method_name, "SetMaxClient")) {
1700 g_variant_get(parameters, "(i)", &max_client);
1702 ret = wfd_manager_set_max_station(max_client);
1704 WDS_LOGE("Failed to set max station");
1705 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1709 ret = WIFI_DIRECT_ERROR_NONE;
1710 return_parameters = g_variant_new("(i)", ret);
1713 } else if (!g_strcmp0(method_name, "SetAutoConnectionMode")) {
1714 gboolean mode = FALSE;
1716 g_variant_get(parameters, "(b)", &mode);
1717 ret = wfd_manager_set_autoconnection(mode);
1719 WDS_LOGE("Failed to set autoconnection");
1720 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1724 ret = WIFI_DIRECT_ERROR_NONE;
1725 return_parameters = g_variant_new("(i)", ret);
1728 } else if (!g_strcmp0(method_name, "IsAutoConnectionMode")) {
1731 ret = wfd_manager_get_autoconnection(&mode);
1733 WDS_LOGE("Failed to get autoconnection");
1734 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1738 ret = WIFI_DIRECT_ERROR_NONE;
1739 return_parameters = g_variant_new("(ib)", ret, mode);
1742 } else if (!g_strcmp0(method_name, "GetOperatingChannel")) {
1745 wfd_group_s *group = manager->group;
1747 WDS_LOGE("Group not exist");
1748 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1752 channel = wfd_util_freq_to_channel(group->freq);
1754 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1758 ret = WIFI_DIRECT_ERROR_NONE;
1759 return_parameters = g_variant_new("(ii)", ret, channel);
1762 } else if (!g_strcmp0(method_name, "SetAutoConnectionPeer")) {
1763 ret = WIFI_DIRECT_ERROR_NONE;
1764 return_parameters = g_variant_new("(i)", ret);
1767 } else if (!g_strcmp0(method_name, "GetInterfaceName")) {
1768 wfd_group_s *group = (wfd_group_s *)manager->group;
1770 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1773 ret = WIFI_DIRECT_ERROR_NONE;
1774 return_parameters = g_variant_new("(is)", ret, group->ifname);
1777 } else if (!g_strcmp0(method_name, "GetSubnetMask")) {
1778 char *get_str = NULL;
1779 char subnet_mask[IPSTR_LEN+1] = {0, };
1781 get_str = vconf_get_str(VCONFKEY_WIFI_DIRECT_P2P_SUBNET_MASK);
1783 WDS_LOGE("Get Subnet Mask failed");
1784 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1787 WDS_LOGD("VCONFKEY_WIFI_DIRECT_P2P_SUBNET_MASK(%s) : %s", VCONFKEY_WIFI_DIRECT_P2P_SUBNET_MASK,
1789 ret = WIFI_DIRECT_ERROR_NONE;
1790 g_strlcpy(subnet_mask, get_str, IPSTR_LEN + 1);
1791 return_parameters = g_variant_new("(is)", ret, subnet_mask);
1795 } else if (!g_strcmp0(method_name, "GetGateway")) {
1796 char *get_str = NULL;
1797 char gateway_addr[IPSTR_LEN+1] = {0, };
1798 get_str = vconf_get_str(VCONFKEY_WIFI_DIRECT_P2P_GATEWAY);
1800 WDS_LOGE("Get Gateway failed");
1801 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1804 WDS_LOGD("VCONFKEY_WIFI_DIRECT_P2P_GATEWAY_ADDR(%s) : %s", VCONFKEY_WIFI_DIRECT_P2P_GATEWAY,
1806 ret = WIFI_DIRECT_ERROR_NONE;
1807 g_strlcpy(gateway_addr, get_str, IPSTR_LEN + 1);
1808 return_parameters = g_variant_new("(is)", ret, gateway_addr);
1812 } else if (!g_strcmp0(method_name, "GetSessionTimer")) {
1814 int session_timer = 0;
1815 ret = WIFI_DIRECT_ERROR_NONE;
1816 session_timer = manager->session_timer;
1817 WDS_LOGD("Get Session Timer value is %d", session_timer);
1818 return_parameters = g_variant_new("(ii)", ret, session_timer);
1821 } else if (!g_strcmp0(method_name, "SetSessionTimer")) {
1823 int session_timer = 0;
1824 g_variant_get(parameters, "(i)", &session_timer);
1825 WDS_LOGD("Set Session Timer value is %d", session_timer);
1826 manager->session_timer = session_timer;
1827 ret = WIFI_DIRECT_ERROR_NONE;
1828 return_parameters = g_variant_new("(i)", ret);
1831 } else if (!g_strcmp0(method_name, "SetAutoGroupRemoval")) {
1834 g_variant_get(parameters, "(b)", &enable);
1835 WDS_LOGE("Activate Auto Group Removal Mode : [%s]",
1836 enable ? "True" : "False");
1838 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1839 WDS_LOGE("Wi-Fi Direct is not activated.");
1840 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1845 manager->auto_group_remove_enable = TRUE;
1847 /* Enable Group destroy only if state is connecting */
1848 if (manager->state == WIFI_DIRECT_STATE_CONNECTING) {
1849 WDS_LOGE("Wi-Fi Direct state is CONNECTING");
1850 ret = WIFI_DIRECT_ERROR_NONE;
1851 return_parameters = g_variant_new("(i)", ret);
1854 /* Remove group immediately if no connected peer found */
1855 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1856 wfd_group_s *group = (wfd_group_s*) manager->group;
1857 if (group && !group->member_count
1858 && wfd_util_is_remove_group_allowed())
1859 wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1863 manager->auto_group_remove_enable = FALSE;
1866 ret = WIFI_DIRECT_ERROR_NONE;
1867 return_parameters = g_variant_new("(i)", ret);
1870 } else if (!g_strcmp0(method_name, "GetPrimaryDevType")) {
1872 int pri_dev_type = 0;
1873 ret = WIFI_DIRECT_ERROR_NONE;
1874 pri_dev_type = DEFAULT_PRIMARY_DEVICE_TYPE;
1875 WDS_LOGD("Get primary dev type value is %d", pri_dev_type);
1876 return_parameters = g_variant_new("(ii)", ret, pri_dev_type);
1879 } else if (!g_strcmp0(method_name, "GetSecondaryDevType")) {
1881 int sec_dev_type = 0;
1882 ret = WIFI_DIRECT_ERROR_NONE;
1883 sec_dev_type = DEFAULT_SECONDARY_DEVICE_TYPE;
1884 WDS_LOGD("Get secondary dev type value is %d", sec_dev_type);
1885 return_parameters = g_variant_new("(ii)", ret, sec_dev_type);
1888 } else if (!g_strcmp0(method_name, "GetPeerRssi")) {
1889 wfd_device_s *peer = NULL;
1890 const char *mac_address = NULL;
1891 unsigned char mac_addr[MACADDR_LEN] = {0, };
1893 g_variant_get(parameters, "(&s)", &mac_address);
1894 macaddr_atoe(mac_address, mac_addr);
1896 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1897 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1901 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
1903 WDS_LOGE("Failed to get peer");
1904 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1908 ret = WIFI_DIRECT_ERROR_NONE;
1909 return_parameters = g_variant_new("(ii)", ret, peer->rssi);
1912 } else if (!g_strcmp0(method_name, "AddVsie")) {
1913 const char *vsie = NULL;
1916 g_variant_get(parameters, "(i&s)", &frame_id, &vsie);
1918 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1919 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1923 if (wfd_oem_add_vsie(manager->oem_ops, frame_id, vsie) < 0) {
1924 WDS_LOGE("Failed to add vsie");
1925 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1929 ret = WIFI_DIRECT_ERROR_NONE;
1930 return_parameters = g_variant_new("(i)", ret);
1933 } else if (!g_strcmp0(method_name, "GetVsie")) {
1937 g_variant_get(parameters, "(i)", &frame_id);
1939 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1940 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1944 if (wfd_oem_get_vsie(manager->oem_ops, frame_id, &vsie) < 0) {
1945 WDS_LOGE("Failed to get vsie");
1946 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1950 WDS_LOGD("Received VSIE [%s]", vsie);
1952 ret = WIFI_DIRECT_ERROR_NONE;
1953 return_parameters = g_variant_new("(is)", ret, vsie);
1958 } else if (!g_strcmp0(method_name, "RemoveVsie")) {
1959 const char *vsie = NULL;
1962 g_variant_get(parameters, "(i&s)", &frame_id, &vsie);
1964 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1965 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1969 if (wfd_oem_remove_vsie(manager->oem_ops, frame_id, vsie) < 0) {
1970 WDS_LOGE("Failed to remove vsie");
1971 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1975 ret = WIFI_DIRECT_ERROR_NONE;
1976 return_parameters = g_variant_new("(i)", ret);
1980 WDS_LOGE("method not handled");
1981 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1986 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
1990 wfd_error_set_gerror(ret, &err);
1991 g_dbus_method_invocation_return_gerror(invocation, err);
1992 g_clear_error(&err);
1996 static void __wfd_manager_service_iface_handler(const gchar *method_name,
1997 GVariant *parameters,
1998 GDBusMethodInvocation *invocation)
2000 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2001 wfd_manager_s *manager = wfd_get_manager();
2002 GVariant *return_parameters = NULL;
2004 WDS_LOGD("%s", method_name);
2006 if (!g_strcmp0(method_name, "StartDiscovery")) {
2007 const char *mac_address = NULL;
2009 unsigned char mac_addr[MACADDR_LEN] = {0, };
2011 if (!manager->is_service_discovery_supported) {
2012 WDS_LOGE("Wi-Fi Direct service discovery is not supported.");
2013 ret = WIFI_DIRECT_ERROR_NOT_SUPPORTED;
2017 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2018 WDS_LOGE("Wi-Fi Direct is not activated.");
2019 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2023 g_variant_get(parameters, "(i&s)", &service_type, &mac_address);
2024 if (mac_address == NULL) {
2025 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2029 WDS_LOGD("Service type [%d]", service_type);
2030 macaddr_atoe(mac_address, mac_addr);
2032 ret = wfd_oem_start_service_discovery(manager->oem_ops,
2033 mac_addr, service_type);
2035 WDS_LOGE("Failed to start service discovery");
2036 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2040 WFD_DBUS_REPLY_ERROR_NONE(invocation);
2042 wfd_manager_dbus_emit_signal(WFD_MANAGER_SERVICE_INTERFACE,
2043 "DiscoveryStarted", NULL);
2046 } else if (!g_strcmp0(method_name, "StopDiscovery")) {
2047 const char *mac_address = NULL;
2049 unsigned char mac_addr[MACADDR_LEN] = {0, };
2051 if (!manager->is_service_discovery_supported) {
2052 WDS_LOGE("Wi-Fi Direct service discovery is not supported.");
2053 ret = WIFI_DIRECT_ERROR_NOT_SUPPORTED;
2057 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2058 WDS_LOGE("Wi-Fi Direct is not activated.");
2059 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2063 g_variant_get(parameters, "(i&s)", &service_type, &mac_address);
2064 if (mac_address == NULL) {
2065 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2069 WDS_LOGD("Service type [%d]", service_type);
2070 macaddr_atoe(mac_address, mac_addr);
2072 ret = wfd_oem_cancel_service_discovery(manager->oem_ops,
2073 mac_addr, service_type);
2075 WDS_LOGE("Failed to cancel service discovery");
2076 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2079 ret = WIFI_DIRECT_ERROR_NONE;
2080 return_parameters = g_variant_new("(i)", ret);
2083 } else if (!g_strcmp0(method_name, "Register")) {
2086 const char *info_str = NULL;
2088 if (!manager->is_service_discovery_supported) {
2089 WDS_LOGE("Wi-Fi Direct service discovery is not supported.");
2090 ret = WIFI_DIRECT_ERROR_NOT_SUPPORTED;
2094 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2095 WDS_LOGE("Wi-Fi Direct is not activated.");
2096 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2100 g_variant_get(parameters, "(i&s)", &service_type, &info_str);
2101 WDS_LOGD("Register service [%d: %s]", service_type, info_str);
2103 ret = wfd_service_add(service_type, (char *)info_str, &service_id);
2105 WDS_LOGE("Failed to add service");
2106 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2110 ret = WIFI_DIRECT_ERROR_NONE;
2111 return_parameters = g_variant_new("(ii)", ret, service_id);
2114 } else if (!g_strcmp0(method_name, "Deregister")) {
2117 if (!manager->is_service_discovery_supported) {
2118 WDS_LOGE("Wi-Fi Direct service discovery is not supported.");
2119 ret = WIFI_DIRECT_ERROR_NOT_SUPPORTED;
2123 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2124 WDS_LOGE("Wi-Fi Direct is not activated.");
2125 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2129 g_variant_get(parameters, "(i)", &service_id);
2130 WDS_LOGD("Service id [%d]", service_id);
2132 ret = wfd_service_del(service_id);
2134 WDS_LOGE("Failed to delete service");
2135 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2139 ret = WIFI_DIRECT_ERROR_NONE;
2140 return_parameters = g_variant_new("(i)", ret);
2144 WDS_LOGD("method not handled");
2145 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2150 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
2154 wfd_error_set_gerror(ret, &err);
2155 g_dbus_method_invocation_return_gerror(invocation, err);
2156 g_clear_error(&err);
2160 static void __wfd_manager_display_iface_handler(const gchar *method_name,
2161 GVariant *parameters,
2162 GDBusMethodInvocation *invocation)
2164 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2165 wfd_manager_s *manager = wfd_get_manager();
2166 GVariant *return_parameters = NULL;
2168 WDS_LOGD("%s", method_name);
2170 if (!g_strcmp0(method_name, "Init")) {
2171 if (!manager->is_wifi_display_supported) {
2172 ret = WIFI_DIRECT_ERROR_NOT_SUPPORTED;
2176 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2177 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2181 wfd_device_s * device = manager->local;
2183 ret = wfd_oem_miracast_init(manager->oem_ops, TRUE);
2185 WDS_LOGE("Failed to initialize display");
2186 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2190 device->display.type = WIFI_DISPLAY_DEFAULT_TYPE;
2191 device->display.port = WIFI_DISPLAY_DEFAULT_PORT;
2192 device->display.availability = WIFI_DISPLAY_DEFAULT_AVAIL;
2193 device->display.hdcp_support = WIFI_DISPLAY_DEFAULT_HDCP;
2195 ret = WIFI_DIRECT_ERROR_NONE;
2196 return_parameters = g_variant_new("(i)", ret);
2199 } else if (!g_strcmp0(method_name, "Deinit")) {
2200 if (!manager->is_wifi_display_supported) {
2201 ret = WIFI_DIRECT_ERROR_NOT_SUPPORTED;
2205 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2206 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2210 wfd_device_s * device = manager->local;
2212 ret = wfd_oem_miracast_init(manager->oem_ops, FALSE);
2214 WDS_LOGE("Failed to deinitialize display");
2215 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2219 memset(&(device->display), 0x0, sizeof(wfd_display_type_e));
2221 ret = WIFI_DIRECT_ERROR_NONE;
2222 return_parameters = g_variant_new("(i)", ret);
2225 } else if (!g_strcmp0(method_name, "SetConfig")) {
2226 int type, port, hdcp;
2228 if (!manager->is_wifi_display_supported) {
2229 ret = WIFI_DIRECT_ERROR_NOT_SUPPORTED;
2233 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2234 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2238 g_variant_get(parameters, "(iii)", &type, &port, &hdcp);
2239 WDS_LOGD("type %d port %d hdcp %d", type, port, hdcp);
2241 ret = wfd_manager_set_display_device(type, port, hdcp);
2243 WDS_LOGE("Failed to set display device settings");
2244 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2248 ret = WIFI_DIRECT_ERROR_NONE;
2249 return_parameters = g_variant_new("(i)", ret);
2252 } else if (!g_strcmp0(method_name, "SetAvailiability")) {
2255 if (!manager->is_wifi_display_supported) {
2256 ret = WIFI_DIRECT_ERROR_NOT_SUPPORTED;
2260 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2261 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2265 g_variant_get(parameters, "(i)", &availability);
2266 ret = wfd_manager_set_session_availability(availability);
2268 WDS_LOGE("Failed to set session availability");
2269 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2273 ret = WIFI_DIRECT_ERROR_NONE;
2274 return_parameters = g_variant_new("(i)", ret);
2277 } else if (!g_strcmp0(method_name, "GetPeerType")) {
2278 wfd_device_s *peer = NULL;
2279 const char *mac_address = NULL;
2280 unsigned char mac_addr[MACADDR_LEN] = {0, };
2282 if (!manager->is_wifi_display_supported) {
2283 ret = WIFI_DIRECT_ERROR_NOT_SUPPORTED;
2287 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2288 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2292 g_variant_get(parameters, "(&s)", &mac_address);
2293 if (mac_address == NULL) {
2294 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2298 macaddr_atoe(mac_address, mac_addr);
2299 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
2301 WDS_LOGE("Failed to get peer");
2302 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2306 ret = WIFI_DIRECT_ERROR_NONE;
2307 return_parameters = g_variant_new("(ii)", ret, peer->display.type);
2310 } else if (!g_strcmp0(method_name, "GetPeerAvailability")) {
2311 wfd_device_s *peer = NULL;
2312 const char *mac_address = NULL;
2313 unsigned char mac_addr[MACADDR_LEN] = {0, };
2315 if (!manager->is_wifi_display_supported) {
2316 ret = WIFI_DIRECT_ERROR_NOT_SUPPORTED;
2320 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2321 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2325 g_variant_get(parameters, "(&s)", &mac_address);
2326 if (mac_address == NULL) {
2327 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2331 macaddr_atoe(mac_address, mac_addr);
2332 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
2334 WDS_LOGE("Failed to get peer");
2335 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2339 ret = WIFI_DIRECT_ERROR_NONE;
2340 return_parameters = g_variant_new("(ii)", ret, peer->display.availability);
2343 } else if (!g_strcmp0(method_name, "GetPeerHdcp")) {
2344 wfd_device_s *peer = NULL;
2345 const char *mac_address = NULL;
2346 unsigned char mac_addr[MACADDR_LEN] = {0, };
2348 if (!manager->is_wifi_display_supported) {
2349 ret = WIFI_DIRECT_ERROR_NOT_SUPPORTED;
2353 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2354 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2358 g_variant_get(parameters, "(&s)", &mac_address);
2359 if (mac_address == NULL) {
2360 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2364 macaddr_atoe(mac_address, mac_addr);
2365 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
2367 WDS_LOGE("Failed to get peer");
2368 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2372 ret = WIFI_DIRECT_ERROR_NONE;
2373 return_parameters = g_variant_new("(ii)", ret, peer->display.hdcp_support);
2376 } else if (!g_strcmp0(method_name, "GetPeerPort")) {
2377 wfd_device_s *peer = NULL;
2378 const char *mac_address = NULL;
2379 unsigned char mac_addr[MACADDR_LEN] = {0, };
2381 if (!manager->is_wifi_display_supported) {
2382 ret = WIFI_DIRECT_ERROR_NOT_SUPPORTED;
2386 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2387 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2391 g_variant_get(parameters, "(&s)", &mac_address);
2392 if (mac_address == NULL) {
2393 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2397 macaddr_atoe(mac_address, mac_addr);
2398 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
2400 WDS_LOGE("Failed to get peer");
2401 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2405 ret = WIFI_DIRECT_ERROR_NONE;
2406 return_parameters = g_variant_new("(ii)", ret, peer->display.port);
2409 } else if (!g_strcmp0(method_name, "GetPeerThroughput")) {
2410 wfd_device_s *peer = NULL;
2411 const char *mac_address = NULL;
2412 unsigned char mac_addr[MACADDR_LEN] = {0, };
2414 if (!manager->is_wifi_display_supported) {
2415 ret = WIFI_DIRECT_ERROR_NOT_SUPPORTED;
2419 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2420 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2424 g_variant_get(parameters, "(&s)", &mac_address);
2425 if (mac_address == NULL) {
2426 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2430 macaddr_atoe(mac_address, mac_addr);
2431 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
2433 WDS_LOGE("Failed to get peer");
2434 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2438 ret = WIFI_DIRECT_ERROR_NONE;
2439 return_parameters = g_variant_new("(ii)", ret, peer->display.max_tput);
2443 WDS_LOGD("method not handled");
2444 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2449 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
2453 wfd_error_set_gerror(ret, &err);
2454 g_dbus_method_invocation_return_gerror(invocation, err);
2455 g_clear_error(&err);
2459 static void __g_variant_to_txt_record(GVariant *variant, char **txt_record)
2461 GVariantIter *iter = NULL;
2463 GVariant *value = NULL;
2465 const char *str = NULL;
2469 gsize value_length = 0;
2470 __WDS_LOG_FUNC_ENTER__;
2472 DBUS_DEBUG_VARIANT(variant);
2473 g_variant_get(variant, "a{sv}", &iter);
2474 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
2475 WDS_LOGD("%s %s", key, g_variant_get_string(value, &value_length));
2476 txt_length += strlen(key);
2477 str = g_variant_get_string(value, &value_length);
2478 txt_length += (int)value_length;
2482 g_variant_iter_free(iter);
2483 if (txt_length == 0) {
2484 __WDS_LOG_FUNC_EXIT__;
2488 buff = g_try_malloc0(txt_length);
2490 WDS_LOGE("g_try_malloc0 failed");
2491 __WDS_LOG_FUNC_EXIT__;
2495 g_variant_get(variant, "a{sv}", &iter);
2496 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
2497 key_length = strlen(key);
2498 str = g_variant_get_string(value, &value_length);
2500 g_strlcpy(pos, key, key_length + 1);
2505 g_strlcpy(pos, str, value_length + 1);
2506 pos += (int)value_length;
2510 buff[txt_length -1] = '\0';
2512 g_variant_iter_free(iter);
2515 __WDS_LOG_FUNC_EXIT__;
2519 static void __g_variant_to_seek_info(GVariant *variant, char **seek_info)
2521 GVariantIter *iter = NULL;
2525 int seek_length = 0;
2528 DBUS_DEBUG_VARIANT(variant);
2529 g_variant_get(variant, "as", &iter);
2530 while (g_variant_iter_loop(iter, "s", &key)) {
2531 seek_length += strlen(key);
2535 g_variant_iter_free(iter);
2536 if (seek_length == 0)
2539 buff = g_try_malloc0(seek_length);
2541 WDS_LOGE("g_try_malloc0 failed");
2545 g_variant_get(variant, "as", &iter);
2546 while (g_variant_iter_loop(iter, "s", &key)) {
2547 key_length = strlen(key);
2549 g_strlcpy(pos, key, key_length + 1);
2554 buff[seek_length -1] = '\0';
2556 g_variant_iter_free(iter);
2562 static void __get_asp_advertise_params(GVariantIter *iter, wfd_oem_asp_service_s *service, int *replace)
2565 GVariant *var = NULL;
2567 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
2568 if (!g_strcmp0(key, "adv_id"))
2569 g_variant_get(var, "u", &(service->adv_id));
2570 else if (!g_strcmp0(key, "discovery_tech"))
2571 g_variant_get(var, "i", &(service->discovery_tech));
2572 else if (!g_strcmp0(key, "preferred_connection"))
2573 g_variant_get(var, "y", &(service->preferred_connection));
2574 else if (!g_strcmp0(key, "auto_accept"))
2575 g_variant_get(var, "i", &(service->auto_accept));
2576 else if (!g_strcmp0(key, "status"))
2577 g_variant_get(var, "y", &(service->status));
2578 else if (!g_strcmp0(key, "role"))
2579 g_variant_get(var, "y", &(service->role));
2580 else if (!g_strcmp0(key, "replace"))
2581 g_variant_get(var, "i", replace);
2582 else if (!g_strcmp0(key, "config_method"))
2583 g_variant_get(var, "u", &(service->config_method));
2584 else if (!g_strcmp0(key, "instance_name"))
2585 g_variant_get(var, "&s", &(service->instance_name));
2586 else if (!g_strcmp0(key, "service_type"))
2587 g_variant_get(var, "&s", &(service->service_type));
2588 else if (!g_strcmp0(key, "service_info"))
2589 __g_variant_to_txt_record(var, &(service->service_info));
2590 else if (!g_strcmp0(key, "rsp_info"))
2591 g_variant_get(var, "&s", &(service->rsp_info));
2599 static void __get_asp_seek_params(GVariantIter *iter, wfd_oem_asp_service_s *service)
2602 GVariant *var = NULL;
2604 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
2605 if (!g_strcmp0(key, "discovery_tech"))
2606 g_variant_get(var, "i", &(service->discovery_tech));
2607 else if (!g_strcmp0(key, "search_id"))
2608 g_variant_get(var, "t", &(service->asp_search_id));
2609 else if (!g_strcmp0(key, "preferred_connection"))
2610 g_variant_get(var, "y", &(service->preferred_connection));
2611 else if (!g_strcmp0(key, "service_type"))
2612 g_variant_get(var, "&s", &(service->service_type));
2613 else if (!g_strcmp0(key, "service_info"))
2614 __g_variant_to_seek_info(var, &(service->service_info));
2621 static void __get_asp_connect_params(GVariantIter *iter, wfd_oem_asp_prov_s *prov_params)
2624 GVariant *var = NULL;
2625 const char *mac_str = NULL;
2626 unsigned char role = 0;
2627 unsigned int config = 0;
2629 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
2631 if (!g_strcmp0(key, "service_mac")) {
2632 g_variant_get(var, "&s", &mac_str);
2633 if (mac_str == NULL)
2634 memset(prov_params->session_mac, 0, sizeof(prov_params->service_mac));
2636 macaddr_atoe(mac_str, prov_params->service_mac);
2637 } else if (!g_strcmp0(key, "adv_id")) {
2638 g_variant_get(var, "u", &(prov_params->adv_id));
2639 } else if (!g_strcmp0(key, "session_mac")) {
2640 g_variant_get(var, "&s", &mac_str);
2641 if (mac_str == NULL)
2642 memset(prov_params->session_mac, 0, sizeof(prov_params->session_mac));
2644 macaddr_atoe(mac_str, prov_params->session_mac);
2645 } else if (!g_strcmp0(key, "session_id")) {
2646 g_variant_get(var, "u", &(prov_params->session_id));
2647 } else if (!g_strcmp0(key, "role")) {
2648 g_variant_get(var, "y", &(role));
2649 prov_params->network_role = (int)role;
2650 } else if (!g_strcmp0(key, "config_method")) {
2651 g_variant_get(var, "u", &(config));
2652 prov_params->network_config = (int)config;
2653 } else if (!g_strcmp0(key, "session_info")) {
2654 g_variant_get(var, "&s", &(prov_params->session_information));
2664 static void __get_asp_confirm_params(GVariantIter *iter, wfd_oem_asp_prov_s *prov_params, int *confirmed)
2667 GVariant *var = NULL;
2668 const char *mac_str = NULL;
2669 const char *pin = NULL;
2671 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
2673 if (!g_strcmp0(key, "service_mac")) {
2674 g_variant_get(var, "&s", &mac_str);
2675 if (mac_str == NULL)
2676 memset(prov_params->session_mac, 0, sizeof(prov_params->service_mac));
2678 macaddr_atoe(mac_str, prov_params->service_mac);
2679 } else if (!g_strcmp0(key, "adv_id")) {
2680 g_variant_get(var, "u", &(prov_params->adv_id));
2681 } else if (!g_strcmp0(key, "session_mac")) {
2682 g_variant_get(var, "&s", &mac_str);
2683 if (mac_str == NULL)
2684 memset(prov_params->session_mac, 0, sizeof(prov_params->session_mac));
2686 macaddr_atoe(mac_str, prov_params->session_mac);
2687 } else if (!g_strcmp0(key, "session_id")) {
2688 g_variant_get(var, "u", &(prov_params->session_id));
2689 } else if (!g_strcmp0(key, "confirm")) {
2690 g_variant_get(var, "i", confirmed);
2691 } else if (!g_strcmp0(key, "pin")) {
2692 g_variant_get(var, "&s", &(pin));
2693 g_strlcpy(prov_params->wps_pin, pin, PINSTR_LEN);
2702 static void __wfd_manager_asp_iface_handler(const gchar *method_name,
2703 GVariant *parameters,
2704 GDBusMethodInvocation *invocation)
2706 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2707 wfd_manager_s *manager = wfd_get_manager();
2708 GVariant *return_parameters = NULL;
2709 GVariantIter *iter = NULL;
2711 WDS_LOGD("%s", method_name);
2714 WDS_LOGD("manager is not initialized.");
2715 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2719 if (!g_strcmp0(method_name, "AdvertiseService")) {
2721 wfd_oem_asp_service_s service;
2724 if (!manager->is_asp_supported) {
2725 WDS_LOGD("ASP is not supported.");
2726 ret = WIFI_DIRECT_ERROR_NOT_SUPPORTED;
2730 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
2731 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
2732 manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
2733 WDS_LOGE("Wi-Fi Direct is not available status for Advertising.");
2734 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2738 memset(&service, 0, sizeof(wfd_oem_asp_service_s));
2739 g_variant_get(parameters, "(a{sv})", &iter);
2740 __get_asp_advertise_params(iter, &service, &replace);
2741 ret = wfd_oem_advertise_service(manager->oem_ops, &service, replace);
2743 WDS_LOGE("Failed to add service");
2744 g_free(service.service_info);
2745 g_variant_iter_free(iter);
2746 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2749 g_free(service.service_info);
2750 g_variant_iter_free(iter);
2752 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
2753 WDS_LOGW("Wi-Fi Direct device is already visible, do not start listen");
2757 ret = wfd_manager_start_discovery(manager,
2758 WFD_OEM_SCAN_MODE_PASSIVE, 0,
2760 if (ret == WIFI_DIRECT_ERROR_NONE) {
2761 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
2765 wfd_oem_cancel_advertise_service(manager->oem_ops, &service);
2766 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2770 ret = WIFI_DIRECT_ERROR_NONE;
2771 return_parameters = g_variant_new("(i)", ret);
2774 } else if (!g_strcmp0(method_name, "CancelAdvertiseService")) {
2776 wfd_oem_asp_service_s service;
2777 memset(&service, 0, sizeof(wfd_oem_asp_service_s));
2779 if (!manager->is_asp_supported) {
2780 WDS_LOGD("ASP is not supported.");
2781 ret = WIFI_DIRECT_ERROR_NOT_SUPPORTED;
2785 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2786 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2790 g_variant_get(parameters, "(u)", &(service.adv_id));
2791 ret = wfd_oem_cancel_advertise_service(manager->oem_ops, &service);
2793 WDS_LOGE("Failed to del service");
2794 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2798 ret = WIFI_DIRECT_ERROR_NONE;
2799 return_parameters = g_variant_new("(i)", ret);
2802 } else if (!g_strcmp0(method_name, "SeekService")) {
2804 wfd_oem_asp_service_s service;
2805 GVariantIter *iter = NULL;
2807 if (!manager->is_asp_supported) {
2808 WDS_LOGD("ASP is not supported.");
2809 ret = WIFI_DIRECT_ERROR_NOT_SUPPORTED;
2813 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
2814 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
2815 manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
2816 WDS_LOGE("Wi-Fi Direct is not available status to Seek.");
2817 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2821 memset(&service, 0, sizeof(wfd_oem_asp_service_s));
2822 g_variant_get(parameters, "(a{sv})", &iter);
2823 __get_asp_seek_params(iter, &service);
2824 ret = wfd_oem_seek_service(manager->oem_ops, &service);
2826 WDS_LOGE("Failed to seek service");
2827 g_free(service.service_info);
2828 g_variant_iter_free(iter);
2829 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2832 g_free(service.service_info);
2833 g_variant_iter_free(iter);
2835 WDS_LOGD("search_id [%x]", service.search_id);
2837 ret = wfd_manager_start_discovery(manager,
2838 WFD_OEM_SCAN_MODE_ACTIVE, 0,
2840 if (ret == WIFI_DIRECT_ERROR_NONE) {
2841 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
2845 wfd_oem_cancel_seek_service(manager->oem_ops, &service);
2846 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2850 ret = WIFI_DIRECT_ERROR_NONE;
2851 return_parameters = g_variant_new("(i)", ret);
2854 } else if (!g_strcmp0(method_name, "CancelSeekService")) {
2856 wfd_oem_asp_service_s service;
2857 memset(&service, 0, sizeof(wfd_oem_asp_service_s));
2859 if (!manager->is_asp_supported) {
2860 WDS_LOGD("ASP is not supported.");
2861 ret = WIFI_DIRECT_ERROR_NOT_SUPPORTED;
2865 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2866 WDS_LOGE("Wi-Fi Direct is not activated.");
2867 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2871 g_variant_get(parameters, "(t)", &(service.asp_search_id));
2872 ret = wfd_oem_cancel_seek_service(manager->oem_ops, &service);
2874 WDS_LOGE("Failed to cancel seek service");
2875 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2879 ret = WIFI_DIRECT_ERROR_NONE;
2880 return_parameters = g_variant_new("(i)", ret);
2882 } else if (!g_strcmp0(method_name, "ConnectSession")) {
2884 GVariantIter *iter = NULL;
2885 wfd_oem_asp_prov_s prov_params;
2887 if (manager && !manager->is_asp_supported) {
2888 WDS_LOGD("ASP is not supported.");
2889 ret = WIFI_DIRECT_ERROR_NOT_SUPPORTED;
2893 if (__is_discovery_available(manager)) {
2894 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2898 memset(&prov_params, 0, sizeof(wfd_oem_asp_prov_s));
2900 g_variant_get(parameters, "(a{sv})", &iter);
2901 __get_asp_connect_params(iter, &prov_params);
2903 if (ISZEROMACADDR(prov_params.service_mac) ||
2904 ISZEROMACADDR(prov_params.session_mac)) {
2905 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2906 g_variant_iter_free(iter);
2910 WFD_DBUS_REPLY_ERROR_NONE(invocation);
2912 wfd_asp_connect_status(prov_params.session_mac,
2913 prov_params.session_id,
2914 ASP_CONNECT_STATUS_REQUEST_SENT,
2917 wfd_group_s *group = (wfd_group_s*) manager->group;
2918 if (group && group->member_count >= manager->max_station) {
2920 wfd_asp_connect_status(prov_params.session_mac,
2921 prov_params.session_id,
2922 ASP_CONNECT_STATUS_NOMORE_CONNECT,
2924 g_variant_iter_free(iter);
2925 __WDS_LOG_FUNC_EXIT__;
2929 ret = wfd_manager_asp_connect_session(manager, &prov_params);
2930 if (ret == WIFI_DIRECT_ERROR_NONE) {
2931 char peer_mac_address[MACSTR_LEN] = {0,};
2932 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(prov_params.service_mac));
2933 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
2935 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
2936 WFD_EVENT_CONNECTION_IN_PROGRESS,
2939 wfd_asp_connect_status(prov_params.session_mac,
2940 prov_params.session_id,
2941 ASP_CONNECT_STATUS_REQUEST_FAILED,
2944 g_variant_iter_free(iter);
2945 __WDS_LOG_FUNC_EXIT__;
2948 } else if (!g_strcmp0(method_name, "ConfirmSession")) {
2950 GVariantIter *iter = NULL;
2951 wfd_oem_asp_prov_s prov_params;
2954 if (manager && !manager->is_asp_supported) {
2955 WDS_LOGD("ASP is not supported.");
2956 ret = WIFI_DIRECT_ERROR_NOT_SUPPORTED;
2960 if (manager->state != WIFI_DIRECT_STATE_CONNECTING) {
2961 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2965 memset(&prov_params, 0, sizeof(wfd_oem_asp_prov_s));
2967 g_variant_get(parameters, "(a{sv})", &iter);
2968 __get_asp_confirm_params(iter, &prov_params, &confirmed);
2970 if (ISZEROMACADDR(prov_params.session_mac)) {
2971 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2972 g_variant_iter_free(iter);
2976 WFD_DBUS_REPLY_ERROR_NONE(invocation);
2978 ret = wfd_manager_asp_confirm_session(manager, &prov_params, confirmed);
2979 if (ret == WIFI_DIRECT_ERROR_NONE && confirmed > 0) {
2980 char peer_mac_address[MACSTR_LEN] = {0,};
2981 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(prov_params.service_mac));
2982 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
2984 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
2985 WFD_EVENT_CONNECTION_IN_PROGRESS,
2987 wfd_asp_connect_status(prov_params.session_mac,
2988 prov_params.session_id,
2989 ASP_CONNECT_STATUS_REQUEST_ACCEPTED,
2992 wfd_asp_connect_status(prov_params.session_mac,
2993 prov_params.session_id,
2994 ASP_CONNECT_STATUS_REQUEST_FAILED,
2997 g_variant_iter_free(iter);
2998 __WDS_LOG_FUNC_EXIT__;
3003 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
3004 __WDS_LOG_FUNC_EXIT__;
3008 wfd_error_set_gerror(ret, &err);
3009 g_dbus_method_invocation_return_gerror(invocation, err);
3010 g_clear_error(&err);
3011 __WDS_LOG_FUNC_EXIT__;
3017 const gchar *iface_name;
3018 void (*function) (const gchar *method_name,
3019 GVariant *parameters,
3020 GDBusMethodInvocation *invocation);
3021 } wfd_manager_iface_map[] = {
3024 WFD_MANAGER_MANAGE_INTERFACE,
3025 __wfd_manager_manage_iface_handler
3029 WFD_MANAGER_GROUP_INTERFACE,
3030 __wfd_manager_group_iface_handler
3034 WFD_MANAGER_CONFIG_INTERFACE,
3035 __wfd_manager_config_iface_handler
3039 WFD_MANAGER_SERVICE_INTERFACE,
3040 __wfd_manager_service_iface_handler
3044 WFD_MANAGER_DISPLAY_INTERFACE,
3045 __wfd_manager_display_iface_handler
3049 WFD_MANAGER_ASP_INTERFACE,
3050 __wfd_manager_asp_iface_handler
3059 /* GDBus method handler */
3060 static void wfd_manager_method_call_handler (GDBusConnection *connection,
3061 const gchar *sender,
3062 const gchar *object_path,
3063 const gchar *interface_name,
3064 const gchar *method_name,
3065 GVariant *parameters,
3066 GDBusMethodInvocation *invocation,
3071 #ifdef TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND
3072 if (!g_strcmp0(method_name, "AddClient"))
3073 wfd_manager_add_active_client(sender);
3074 #endif /* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
3077 WDS_LOGD("interface : [%s], method : [%s]", interface_name, method_name);
3078 DBUS_DEBUG_VARIANT(parameters);
3080 while (wfd_manager_iface_map[count].iface_name != NULL) {
3081 if (!g_strcmp0(interface_name, wfd_manager_iface_map[count].iface_name)) {
3083 wfd_manager_iface_map[count].function(method_name,
3092 static const GDBusInterfaceVTable wfd_manager_interface_vtable = {
3093 wfd_manager_method_call_handler, NULL, NULL};
3095 void wfd_manager_dbus_unregister(void)
3099 wfd_error_deregister();
3101 while (wfd_manager_iface_map[count].iface_name != NULL) {
3102 wfd_manager_dbus_iface_unregister(wfd_manager_iface_map[count].reg_id);
3107 gboolean wfd_manager_dbus_register(void)
3109 GDBusNodeInfo *node_info = NULL;
3110 GError *Error = NULL;
3113 wfd_error_register();
3115 node_info = g_dbus_node_info_new_for_xml(wfd_manager_introspection_xml, &Error);
3116 if (node_info == NULL) {
3117 WDS_LOGE("Failed to get node info, Error: %s", Error->message);
3118 g_clear_error(&Error);
3122 while (wfd_manager_iface_map[count].iface_name != NULL) {
3123 wfd_manager_iface_map[count].reg_id =
3124 wfd_manager_dbus_iface_register(wfd_manager_iface_map[count].iface_name,
3127 &wfd_manager_interface_vtable);
3129 WDS_LOGD("Registered Interface [%d, %s]",
3130 wfd_manager_iface_map[count].reg_id,
3131 wfd_manager_iface_map[count].iface_name);
3136 g_dbus_node_info_unref(node_info);