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 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
45 #include "wifi-direct-service.h"
46 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
47 #ifdef TIZEN_FEATURE_ASP
48 #include "wifi-direct-asp.h"
49 #endif /* TIZEN_FEATURE_ASP */
51 #define WFD_DBUS_REPLY_ERROR_NONE(invocation) \
52 g_dbus_method_invocation_return_value((invocation), g_variant_new("(i)", WIFI_DIRECT_ERROR_NONE))
54 #define WFD_DBUS_REPLY_PARAMS(invocation, params) \
55 g_dbus_method_invocation_return_value((invocation), (params))
57 static int macaddr_atoe(const char *p, unsigned char mac[])
62 mac[i++] = (char) strtoul(p, (char **) &p, 16);
70 /* introspection xml to register interfaces */
71 const gchar wfd_manager_introspection_xml[] = {
72 "<node name='/net/wifidirect'>"
73 "<interface name='net.wifidirect'>"
74 "<method name='Activate'>"
75 "<arg type='i' name='error_code' direction='out'/>"
77 #ifdef TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND
78 "<method name='AddClient'>"
79 "<arg type='i' name='result' direction='out'/>"
81 #endif/* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
82 "<method name='Deactivate'>"
83 "<arg type='i' name='error_code' direction='out'/>"
85 "<method name='StartDiscovery'>"
86 "<arg type='a{sv}' name='parameters' direction='in'/>"
87 "<arg type='i' name='error_code' direction='out'/>"
89 "<method name='StopDiscovery'>"
90 "<arg type='i' name='error_code' direction='out'/>"
92 "<method name='GetDiscoveredPeers'>"
93 "<arg type='i' name='error_code' direction='out'/>"
94 "<arg type='aa{sv}' name='peer_details_list' direction='out'/>"
96 "<method name='Connect'>"
97 "<arg type='s' name='mac_address' direction='in'/>"
98 "<arg type='i' name='error_code' direction='out'/>"
100 "<method name='Disconnect'>"
101 "<arg type='s' name='mac_address' direction='in'/>"
102 "<arg type='i' name='error_code' direction='out'/>"
104 "<method name='CancelConnection'>"
105 "<arg type='s' name='mac_address' direction='in'/>"
106 "<arg type='i' name='error_code' direction='out'/>"
108 "<method name='AcceptConnection'>"
109 "<arg type='s' name='mac_address' direction='in'/>"
110 "<arg type='i' name='error_code' direction='out'/>"
112 "<method name='RejectConnection'>"
113 "<arg type='s' name='mac_address' direction='in'/>"
114 "<arg type='i' name='error_code' direction='out'/>"
116 "<method name='DisconnectAll'>"
117 "<arg type='i' name='error_code' direction='out'/>"
119 "<method name='GetConnectedPeers'>"
120 "<arg type='i' name='error_code' direction='out'/>"
121 "<arg type='aa{sv}' name='peer_details_list' direction='out'/>"
123 "<method name='GetConnectingPeer'>"
124 "<arg type='i' name='error_code' direction='out'/>"
125 "<arg type='a{sv}' name='peer_details' direction='out'/>"
127 "<method name='IsDiscoverable'>"
128 "<arg type='b' name='result' direction='out'/>"
130 "<method name='IsListeningOnly'>"
131 "<arg type='b' name='result' direction='out'/>"
133 "<method name='GetPeerInfo'>"
134 "<arg type='s' name='mac_address' direction='in'/>"
135 "<arg type='i' name='error_code' direction='out'/>"
136 "<arg type='a{sv}' name='peer_details' direction='out'/>"
138 "<method name='GetState'>"
139 "<arg type='i' name='error_code' direction='out'/>"
140 "<arg type='i' name='state' direction='out'/>"
142 "<signal name='Activation'>"
143 "<arg type='i' name='error_code'/>"
145 "<signal name='Deactivation'>"
146 "<arg type='i' name='error_code'/>"
148 "<signal name='Connection'>"
149 "<arg type='i' name='error_code'/>"
150 "<arg type='i' name='connection_state'/>"
151 "<arg type='s' name='peer_mac_address'/>"
153 "<signal name='Disconnection'>"
154 "<arg type='i' name='error_code'/>"
155 "<arg type='i' name='connection_state'/>"
156 "<arg type='s' name='peer_mac_address'/>"
158 "<signal name='ListenStarted'>"
160 "<signal name='DiscoveryStarted'>"
162 "<signal name='DiscoveryFinished'>"
164 "<signal name='PeerFound'>"
165 "<arg type='s' name='peer_mac_address'/>"
167 "<signal name='PeerLost'>"
168 "<arg type='s' name='peer_mac_address'/>"
170 "<signal name='PeerIPAssigned'>"
171 "<arg type='s' name='peer_mac_address'/>"
172 "<arg type='s' name='assigned_ip_address'/>"
175 "<interface name='net.wifidirect.group'>"
176 "<method name='CreateGroup'>"
177 "<arg type='i' name='error_code' direction='out'/>"
179 "<method name='DestroyGroup'>"
180 "<arg type='i' name='error_code' direction='out'/>"
182 "<method name='IsGroupOwner'>"
183 "<arg type='b' name='result' direction='out'/>"
185 "<method name='IsAutoGroup'>"
186 "<arg type='b' name='result' direction='out'/>"
188 "<method name='ActivatePushButton'>"
189 "<arg type='i' name='error_code' direction='out'/>"
191 "<method name='GetPersistentGroups'>"
192 "<arg type='i' name='error_code' direction='out'/>"
193 "<arg type='aa{sv}' name='result' direction='out'/>"
195 "<method name='RemovePersistentGroup'>"
196 "<arg type='s' name='mac_address' direction='in'/>"
197 "<arg type='s' name='ssid' direction='in'/>"
198 "<arg type='i' name='error_code' direction='out'/>"
200 "<method name='SetPassphrase'>"
201 "<arg type='s' name='passphrase' direction='in'/>"
202 "<arg type='i' name='error_code' direction='out'/>"
204 "<method name='GetPassphrase'>"
205 "<arg type='i' name='error_code' direction='out'/>"
206 "<arg type='s' name='passphrase' direction='out'/>"
208 "<method name='SetPersistentGroupEnabled'>"
209 "<arg type='b' name='enable' direction='in'/>"
210 "<arg type='i' name='error_code' direction='out'/>"
212 "<method name='IsPersistentGroupEnabled'>"
213 "<arg type='b' name='result' direction='out'/>"
215 "<signal name='Created'>"
217 "<signal name='Destroyed'>"
220 "<interface name='net.wifidirect.config'>"
221 "<method name='GetDeviceName'>"
222 "<arg type='i' name='error_code' direction='out'/>"
223 "<arg type='s' name='device_name' direction='out'/>"
225 "<method name='SetDeviceName'>"
226 "<arg type='s' name='device_name' direction='in'/>"
227 "<arg type='i' name='error_code' direction='out'/>"
229 "<method name='SetWpsPin'>"
230 "<arg type='s' name='wps_pin' direction='in'/>"
231 "<arg type='i' name='error_code' direction='out'/>"
233 "<method name='GetWpsPin'>"
234 "<arg type='i' name='error_code' direction='out'/>"
235 "<arg type='s' name='wps_pin' direction='out'/>"
237 "<method name='GenerateWpsPin'>"
238 "<arg type='i' name='error_code' direction='out'/>"
239 "<arg type='s' name='wps_pin' direction='out'/>"
241 "<method name='GetSupportedWpsMode'>"
242 "<arg type='i' name='error_code' direction='out'/>"
243 "<arg type='i' name='config_methods' direction='out'/>"
245 "<method name='GetReqWpsMode'>"
246 "<arg type='i' name='error_code' direction='out'/>"
247 "<arg type='i' name='req_wps_mode' direction='out'/>"
249 "<method name='SetReqWpsMode'>"
250 "<arg type='i' name='req_wps_mode' direction='in'/>"
251 "<arg type='i' name='error_code' direction='out'/>"
253 "<method name='GetLocalWpsMode'>"
254 "<arg type='i' name='error_code' direction='out'/>"
255 "<arg type='i' name='local_wps_mode' direction='out'/>"
257 "<method name='GetIPAddress'>"
258 "<arg type='i' name='error_code' direction='out'/>"
259 "<arg type='s' name='local_ip_address' direction='out'/>"
261 "<method name='GetMacAddress'>"
262 "<arg type='i' name='error_code' direction='out'/>"
263 "<arg type='s' name='local_mac_address' direction='out'/>"
265 "<method name='GetGoIntent'>"
266 "<arg type='i' name='error_code' direction='out'/>"
267 "<arg type='i' name='go_intent' direction='out'/>"
269 "<method name='SetGoIntent'>"
270 "<arg type='i' name='go_intent' direction='in'/>"
271 "<arg type='i' name='error_code' direction='out'/>"
273 "<method name='GetMaxClient'>"
274 "<arg type='i' name='error_code' direction='out'/>"
275 "<arg type='i' name='max_client' direction='out'/>"
277 "<method name='SetMaxClient'>"
278 "<arg type='i' name='max_client' direction='in'/>"
279 "<arg type='i' name='error_code' direction='out'/>"
281 "<method name='SetAutoConnectionMode'>"
282 "<arg type='b' name='auto_connection_mode' direction='in'/>"
283 "<arg type='i' name='error_code' direction='out'/>"
285 "<method name='IsAutoConnectionMode'>"
286 "<arg type='i' name='error_code' direction='out'/>"
287 "<arg type='b' name='result' direction='out'/>"
289 "<method name='GetOperatingChannel'>"
290 "<arg type='i' name='error_code' direction='out'/>"
291 "<arg type='i' name='operating_channel' direction='out'/>"
293 "<method name='SetAutoConnectionPeer'>"
294 "<arg type='s' name='peer_mac_address' direction='in'/>"
295 "<arg type='i' name='error_code' direction='out'/>"
297 "<method name='GetConnectingPeer'>"
298 "<arg type='i' name='error_code' direction='out'/>"
299 "<arg type='s' name='local_mac_address' direction='out'/>"
301 "<method name='GetInterfaceName'>"
302 "<arg type='i' name='error_code' direction='out'/>"
303 "<arg type='s' name='ifname' direction='out'/>"
305 "<method name='GetSubnetMask'>"
306 "<arg type='i' name='error_code' direction='out'/>"
307 "<arg type='s' name='subnet_mask' direction='out'/>"
309 "<method name='GetGateway'>"
310 "<arg type='i' name='error_code' direction='out'/>"
311 "<arg type='s' name='gateway_address' direction='out'/>"
313 "<method name='GetSessionTimer'>"
314 "<arg type='i' name='error_code' direction='out'/>"
315 "<arg type='i' name='session_timer' direction='out'/>"
317 "<method name='SetSessionTimer'>"
318 "<arg type='i' name='session_timer' direction='in'/>"
319 "<arg type='i' name='error_code' direction='out'/>"
321 "<method name='SetAutoGroupRemoval'>"
322 "<arg type='b' name='enable' direction='in'/>"
323 "<arg type='i' name='error_code' direction='out'/>"
325 "<method name='GetPrimaryDevType'>"
326 "<arg type='i' name='pri_dev_type' direction='out'/>"
327 "<arg type='i' name='error_code' direction='out'/>"
329 "<method name='GetSecondaryDevType'>"
330 "<arg type='i' name='sec_dev_type' direction='out'/>"
331 "<arg type='i' name='error_code' direction='out'/>"
333 "<method name='GetPeerRssi'>"
334 "<arg type='s' name='peer_mac_addr' direction='in'/>"
335 "<arg type='i' name='error_code' direction='out'/>"
336 "<arg type='i' name='rssi' direction='out'/>"
338 "<method name='AddVsie'>"
339 "<arg type='i' name='frame_id' direction='in'/>"
340 "<arg type='s' name='vsie' direction='in'/>"
341 "<arg type='i' name='error_code' direction='out'/>"
343 "<method name='GetVsie'>"
344 "<arg type='i' name='frame_id' direction='in'/>"
345 "<arg type='i' name='error_code' direction='out'/>"
346 "<arg type='s' name='vsie' direction='out'/>"
348 "<method name='RemoveVsie'>"
349 "<arg type='i' name='frame_id' direction='in'/>"
350 "<arg type='s' name='vsie' direction='in'/>"
351 "<arg type='i' name='error_code' direction='out'/>"
354 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
355 "<interface name='net.wifidirect.service'>"
356 "<method name='StartDiscovery'>"
357 "<arg type='i' name='service_type' direction='in'/>"
358 "<arg type='s' name='mac_addr' direction='in'/>"
359 "<arg type='i' name='error_code' direction='out'/>"
361 "<method name='StopDiscovery'>"
362 "<arg type='i' name='service_type' direction='in'/>"
363 "<arg type='s' name='mac_addr' direction='in'/>"
364 "<arg type='i' name='error_code' direction='out'/>"
366 "<method name='Register'>"
367 "<arg type='i' name='service_type' direction='in'/>"
368 "<arg type='s' name='info_string' direction='in'/>"
369 "<arg type='i' name='error_code' direction='out'/>"
370 "<arg type='i' name='service_id' direction='out'/>"
372 "<method name='Deregister'>"
373 "<arg type='i' name='service_id' direction='in'/>"
374 "<arg type='i' name='error_code' direction='out'/>"
376 "<signal name='DiscoveryStarted'>"
378 "<signal name='DiscoveryFound'>"
379 "<arg type='i' name='service_type'/>"
380 "<arg type='s' name='response_data'/>"
381 "<arg type='s' name='peer_mac_address'/>"
383 "<signal name='DiscoveryFinished'>"
386 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
387 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
388 "<interface name='net.wifidirect.display'>"
389 "<method name='Init'>"
390 "<arg type='i' name='error_code' direction='out'/>"
392 "<method name='Deinit'>"
393 "<arg type='i' name='error_code' direction='out'/>"
395 "<method name='SetConfig'>"
396 "<arg type='i' name='type' direction='in'/>"
397 "<arg type='i' name='port' direction='in'/>"
398 "<arg type='i' name='hdcp' direction='in'/>"
399 "<arg type='i' name='error_code' direction='out'/>"
401 "<method name='SetAvailiability'>"
402 "<arg type='i' name='availability' direction='in'/>"
403 "<arg type='i' name='error_code' direction='out'/>"
405 "<method name='GetPeerType'>"
406 "<arg type='s' name='peer_mac_addr' direction='in'/>"
407 "<arg type='i' name='error_code' direction='out'/>"
408 "<arg type='i' name='result' direction='out'/>"
410 "<method name='GetPeerAvailability'>"
411 "<arg type='s' name='peer_mac_addr' direction='in'/>"
412 "<arg type='i' name='error_code' direction='out'/>"
413 "<arg type='i' name='result' direction='out'/>"
415 "<method name='GetPeerHdcp'>"
416 "<arg type='s' name='peer_mac_addr' direction='in'/>"
417 "<arg type='i' name='error_code' direction='out'/>"
418 "<arg type='i' name='result' direction='out'/>"
420 "<method name='GetPeerPort'>"
421 "<arg type='s' name='peer_mac_addr' direction='in'/>"
422 "<arg type='i' name='error_code' direction='out'/>"
423 "<arg type='i' name='result' direction='out'/>"
425 "<method name='GetPeerThroughput'>"
426 "<arg type='s' name='peer_mac_addr' direction='in'/>"
427 "<arg type='i' name='error_code' direction='out'/>"
428 "<arg type='i' name='result' direction='out'/>"
431 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
432 #if defined(TIZEN_FEATURE_ASP)
433 "<interface name='net.wifidirect.asp'>"
434 "<method name='AdvertiseService'>"
435 "<arg type='a{sv}' name='parameters' direction='in'/>"
436 "<arg type='i' name='result' direction='out'/>"
438 "<method name='CancelAdvertiseService'>"
439 "<arg type='u' name='adv_id' direction='in'/>"
440 "<arg type='i' name='result' direction='out'/>"
442 "<method name='SeekService'>"
443 "<arg type='a{sv}' name='parameters' direction='in'/>"
444 "<arg type='i' name='result' direction='out'/>"
446 "<method name='CancelSeekService'>"
447 "<arg type='t' name='search_id' direction='in'/>"
448 "<arg type='i' name='result' direction='out'/>"
450 "<method name='ConnectSession'>"
451 "<arg type='a{sv}' name='parameters' direction='in'/>"
452 "<arg type='i' name='result' direction='out'/>"
454 "<method name='ConfirmSession'>"
455 "<arg type='a{sv}' name='parameters' direction='in'/>"
456 "<arg type='i' name='result' direction='out'/>"
458 "<signal name='SearchResult'>"
459 "<arg type='a{sv}' name='parameters'/>"
461 "<signal name='SessionRequest'>"
462 "<arg type='a{sv}' name='parameters'/>"
464 "<signal name='SessionConfigRequest'>"
465 "<arg type='a{sv}' name='parameters'/>"
467 "<signal name='ConnectStatus'>"
468 "<arg type='a{sv}' name='parameters'/>"
470 "<signal name='SessionStatus'>"
471 "<arg type='a{sv}' name='parameters'/>"
473 "<signal name='SessionPeerIPAssigned'>"
474 "<arg type='a{sv}' name='parameters'/>"
482 static void __wfd_manager_manage_iface_handler(const gchar *method_name,
483 GVariant *parameters,
484 GDBusMethodInvocation *invocation)
486 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
487 wfd_manager_s *manager = wfd_get_manager();
488 GVariant *return_parameters = NULL;
490 gchar* dbus_error_name = NULL;
491 WDS_LOGD("%s", method_name);
493 if (!g_strcmp0(method_name, "Activate")) {
495 WFD_DBUS_REPLY_ERROR_NONE(invocation);
497 ret = wfd_manager_activate(manager);
498 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
500 g_variant_new("(i)", ret));
502 #ifdef TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND
503 } else if (!g_strcmp0(method_name, "AddClient")) {
504 return_parameters = g_variant_new("(i)", WIFI_DIRECT_ERROR_NONE);
506 #endif/* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
507 } else if (!g_strcmp0(method_name, "Deactivate")) {
509 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
510 WDS_LOGE("Already deactivated");
511 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
515 WFD_DBUS_REPLY_ERROR_NONE(invocation);
517 ret = wfd_manager_deactivate(manager);
518 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
520 g_variant_new("(i)", ret));
523 } else if (!g_strcmp0(method_name, "StartDiscovery")) {
524 gboolean mode = FALSE;
527 gint32 frequency = 0;
528 const gchar *type = NULL;
529 GVariantIter *iter = NULL;
531 GVariant *var = NULL;
533 g_variant_get(parameters, "(a{sv})", &iter);
534 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
535 if (!g_strcmp0(key, "Mode"))
536 g_variant_get(var, "b", &mode);
537 else if (!g_strcmp0(key, "Timeout"))
538 g_variant_get(var, "i", &timeout);
539 else if (!g_strcmp0(key, "Type"))
540 g_variant_get(var, "&s", &type);
541 else if (!g_strcmp0(key, "Channel"))
542 g_variant_get(var, "i", &channel);
543 else if (!g_strcmp0(key, "Frequency"))
544 g_variant_get(var, "i", &frequency);
548 g_variant_iter_free(iter);
550 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
551 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
552 manager->state != WIFI_DIRECT_STATE_GROUP_OWNER) {
553 WDS_LOGE("Wi-Fi Direct is not available status for scanning.");
554 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
558 if (mode && (manager->local->dev_role == WFD_DEV_ROLE_GO)) {
559 WDS_LOGW("Wi-Fi Direct device is already visible, do not start listen");
560 ret = WIFI_DIRECT_ERROR_NONE;
561 return_parameters = g_variant_new("(i)", ret);
565 WFD_DBUS_REPLY_ERROR_NONE(invocation);
567 ret = wfd_manager_start_discovery(manager, mode, timeout, type,
569 if (ret == WIFI_DIRECT_ERROR_NONE) {
570 if (mode == WFD_OEM_SCAN_MODE_PASSIVE) {
571 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
575 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
582 } else if (!g_strcmp0(method_name, "StopDiscovery")) {
583 int mode = manager->scan_mode;
584 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
585 manager->state != WIFI_DIRECT_STATE_DISCOVERING) {
586 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
590 WFD_DBUS_REPLY_ERROR_NONE(invocation);
592 ret = wfd_manager_cancel_discovery(manager);
593 if (ret == WIFI_DIRECT_ERROR_NONE && mode == WFD_SCAN_MODE_PASSIVE)
594 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
595 "DiscoveryFinished", NULL);
598 } else if (!g_strcmp0(method_name, "GetDiscoveredPeers")) {
599 wfd_discovery_entry_s *peers = NULL;
600 GVariantBuilder *builder_peers = NULL;
604 builder_peers = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
606 peer_cnt = wfd_manager_get_peers(manager, &peers);
607 WDS_LOGD("Peer count [%d], Peer list [%p]", peer_cnt, peers);
609 WDS_LOGE("Failed to get scan result");
610 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
617 for (i = 0; i < peer_cnt; i++) {
618 GVariantBuilder builder_peer;
619 g_variant_builder_init(&builder_peer, G_VARIANT_TYPE("a{sv}"));
621 g_variant_builder_add(&builder_peer, "{sv}",
623 g_variant_new_string(peers[i].device_name));
624 g_variant_builder_add(&builder_peer, "{sv}",
626 wfd_manager_dbus_pack_ay(peers[i].mac_address, MACADDR_LEN));
627 g_variant_builder_add(&builder_peer, "{sv}",
629 wfd_manager_dbus_pack_ay(peers[i].intf_address, MACADDR_LEN));
630 g_variant_builder_add(&builder_peer, "{sv}",
632 g_variant_new_uint16(peers[i].channel));
633 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
634 g_variant_builder_add(&builder_peer, "{sv}",
636 g_variant_new_uint16(peers[i].services));
637 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
638 g_variant_builder_add(&builder_peer, "{sv}",
640 g_variant_new_boolean(peers[i].is_group_owner));
641 g_variant_builder_add(&builder_peer, "{sv}",
643 g_variant_new_boolean(peers[i].is_persistent_go));
644 g_variant_builder_add(&builder_peer, "{sv}",
646 g_variant_new_boolean(peers[i].is_connected));
647 g_variant_builder_add(&builder_peer, "{sv}",
649 g_variant_new_uint16(peers[i].wps_device_pwd_id));
650 g_variant_builder_add(&builder_peer, "{sv}",
652 g_variant_new_uint16(peers[i].wps_cfg_methods));
653 g_variant_builder_add(&builder_peer, "{sv}",
655 g_variant_new_uint16(peers[i].category));
656 g_variant_builder_add(&builder_peer, "{sv}",
658 g_variant_new_uint16(peers[i].subcategory));
659 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
660 g_variant_builder_add(&builder_peer, "{sv}",
662 g_variant_new_boolean(peers[i].is_wfd_device));
663 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
665 WDS_LOGD("%dth peer [%s]", i, peers[i].device_name);
666 g_variant_builder_add_value(builder_peers, g_variant_builder_end(&builder_peer));
669 ret = WIFI_DIRECT_ERROR_NONE;
670 return_parameters = g_variant_new("(iaa{sv})", ret, builder_peers);
671 g_variant_builder_unref(builder_peers);
674 } else if (!g_strcmp0(method_name, "Connect")) {
675 const char *peer_mac_address = NULL;
676 unsigned char mac_addr[MACADDR_LEN] = {0, };
678 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
679 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
680 manager->state != WIFI_DIRECT_STATE_GROUP_OWNER) {
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 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
935 g_variant_builder_add(&builder_peer, "{sv}",
937 g_variant_new_uint16(peers[i].services));
938 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
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));
948 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
949 g_variant_builder_add(&builder_peer, "{sv}",
951 g_variant_new_boolean(peers[i].is_wfd_device));
952 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
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));
1024 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
1025 g_variant_builder_add(builder_peer, "{sv}",
1027 g_variant_new_boolean(false));
1028 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
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 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1084 g_variant_builder_add(builder_peer, "{sv}",
1086 g_variant_new_uint16(peer->services));
1087 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
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));
1109 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
1110 g_variant_builder_add(builder_peer, "{sv}",
1112 g_variant_new_boolean(peer->is_wfd_device));
1113 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
1114 #ifdef TIZEN_FEATURE_ASP
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));
1125 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
1127 ret = WIFI_DIRECT_ERROR_NONE;
1128 return_parameters = g_variant_new("(ia{sv})", ret, builder_peer);
1129 g_variant_builder_unref(builder_peer);
1133 } else if (!g_strcmp0(method_name, "GetState")) {
1134 ret = WIFI_DIRECT_ERROR_NONE;
1135 return_parameters = g_variant_new("(ii)", ret, manager->state);
1139 WDS_LOGD("method not handled");
1140 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1145 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
1150 /*g_dbus_method_invocation_return_dbus_error
1151 * (invocation, WFD_MANAGER_SERVICE ".Error", ".OperationFailed"); */
1153 wfd_error_set_gerror(ret, &err);
1154 dbus_error_name = g_dbus_error_encode_gerror(err);
1155 WDS_LOGD("g_dbus_method_invocation_return_gerror with [%s]", dbus_error_name);
1156 g_free(dbus_error_name);
1157 g_dbus_method_invocation_return_gerror(invocation, err);
1158 g_clear_error(&err);
1162 static void __wfd_manager_group_iface_handler(const gchar *method_name,
1163 GVariant *parameters,
1164 GDBusMethodInvocation *invocation)
1166 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1167 wfd_manager_s *manager = wfd_get_manager();
1168 GVariant *return_parameters = NULL;
1170 WDS_LOGD("%s", method_name);
1172 if (!g_strcmp0(method_name, "CreateGroup")) {
1173 wfd_group_s *group = manager->group;
1174 wfd_oem_group_param_s param;
1176 if (group || manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1177 WDS_LOGE("Group already exist or not a proper state");
1178 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1182 #ifdef TIZEN_WLAN_BOARD_SPRD
1183 group = wfd_create_pending_group(manager, manager->local->dev_addr);
1185 group = wfd_create_pending_group(manager, manager->local->intf_addr);
1188 WDS_LOGE("Failed to create pending group");
1189 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1192 group->flags |= WFD_GROUP_FLAG_AUTONOMOUS;
1193 manager->group = group;
1195 memset(¶m, 0x0, sizeof(param));
1197 param.persistent = (manager->local->group_flags &
1198 WFD_GROUP_FLAG_PERSISTENT);
1199 memcpy(&(param.passphrase), manager->local->passphrase,
1200 sizeof(param.passphrase));
1202 #ifndef TIZEN_WLAN_BOARD_SPRD
1203 param.freq = WFD_FREQ_2G;
1206 ret = wfd_oem_create_group(manager->oem_ops, ¶m);
1208 WDS_LOGE("Failed to create group");
1209 wfd_destroy_group(manager);
1210 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1214 WDS_LOGD("Succeeded to create pending group");
1215 memset(manager->local->passphrase, 0x0, PASSPHRASE_LEN_MAX + 1);
1216 ret = WIFI_DIRECT_ERROR_NONE;
1217 return_parameters = g_variant_new("(i)", ret);
1220 } else if (!g_strcmp0(method_name, "DestroyGroup")) {
1221 wfd_group_s *group = manager->group;
1223 WDS_LOGE("Group not exist");
1224 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1228 if (group->pending == FALSE) {
1229 ret = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1231 WDS_LOGE("Failed to destroy group");
1232 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1237 ret = wfd_destroy_group(manager);
1239 WDS_LOGE("Failed to destroy group");
1241 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1242 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1244 WFD_DBUS_REPLY_ERROR_NONE(invocation);
1246 wfd_manager_dbus_emit_signal(WFD_MANAGER_GROUP_INTERFACE,
1250 } else if (!g_strcmp0(method_name, "IsGroupOwner")) {
1252 wfd_device_s *local = manager->local;
1253 result = local->dev_role == WFD_DEV_ROLE_GO;
1254 WDS_LOGI("Is group owner : [%s]", result ? "Yes" : "No");
1255 return_parameters = g_variant_new("(b)", result);
1258 } else if (!g_strcmp0(method_name, "IsAutoGroup")) {
1260 if ((result = wfd_group_is_autonomous(manager->group)) < 0)
1263 WDS_LOGI("Is autonomous group : [%s]", result ? "Yes" : "No");
1264 return_parameters = g_variant_new("(b)", result);
1267 } else if (!g_strcmp0(method_name, "ActivatePushButton")) {
1268 if (manager->local->dev_role != WFD_DEV_ROLE_GO) {
1269 WDS_LOGE("Wi-Fi Direct is not Group Owner.");
1270 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1274 ret = wfd_oem_wps_start(manager->oem_ops, NULL,
1275 WFD_WPS_MODE_PBC, NULL);
1277 WDS_LOGE("Failed to start wps");
1278 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1281 return_parameters = g_variant_new("(i)", ret);
1284 } else if (!g_strcmp0(method_name, "GetPersistentGroups")) {
1285 int persistent_group_count = 0;
1286 wfd_persistent_group_info_s *plist;
1287 GVariantBuilder *builder_groups = NULL;
1290 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1291 WDS_LOGE("Wi-Fi Direct is not activated.");
1292 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1297 ret = wfd_oem_get_persistent_groups(manager->oem_ops,
1298 (wfd_oem_persistent_group_s**) &plist, &persistent_group_count);
1300 WDS_LOGE("Error!! wfd_oem_get_persistent_group_info() failed..");
1301 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1305 builder_groups = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
1307 for (i = 0; i < persistent_group_count; i++) {
1308 GVariantBuilder builder_group;
1309 g_variant_builder_init(&builder_group, G_VARIANT_TYPE("a{sv}"));
1311 g_variant_builder_add(&builder_group, "{sv}",
1313 g_variant_new_uint32(plist[i].network_id));
1314 g_variant_builder_add(&builder_group, "{sv}",
1316 g_variant_new_string(plist[i].ssid));
1317 g_variant_builder_add(&builder_group, "{sv}",
1319 wfd_manager_dbus_pack_ay(plist[i].go_mac_address, MACADDR_LEN));
1321 WDS_LOGD("%dth peer [%s]", i, plist[i].ssid);
1322 g_variant_builder_add_value(builder_groups, g_variant_builder_end(&builder_group));
1325 ret = WIFI_DIRECT_ERROR_NONE;
1326 return_parameters = g_variant_new("(iaa{sv})", ret, builder_groups);
1327 g_variant_builder_unref(builder_groups);
1330 } else if (!g_strcmp0(method_name, "RemovePersistentGroup")) {
1333 unsigned char go_mac_address[6];
1334 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1335 WDS_LOGE("Wi-Fi Direct is not activated.");
1336 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1340 g_variant_get(parameters, "(&s&s)", &mac_address, &ssid);
1341 if (mac_address == NULL || ssid == NULL) {
1342 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1346 macaddr_atoe(mac_address, go_mac_address);
1347 WDS_LOGD("Remove persistent group [%s][" MACSTR "]", ssid, MAC2STR(go_mac_address));
1349 ret = wfd_oem_remove_persistent_group(manager->oem_ops, ssid,
1352 WDS_LOGE("Failed to remove persistent group");
1353 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1356 return_parameters = g_variant_new("(i)", ret);
1359 } else if (!g_strcmp0(method_name, "SetPassphrase")) {
1361 int passphrase_len = 0;
1362 wfd_group_s *group = manager->group;
1365 WDS_LOGE("Group already exists");
1366 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1370 g_variant_get(parameters, "(&s)", &passphrase);
1371 if (passphrase == NULL) {
1372 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1376 passphrase_len = strlen(passphrase);
1378 if (passphrase_len < PASSPHRASE_LEN_MIN ||
1379 passphrase_len > PASSPHRASE_LEN_MAX) {
1380 WDS_LOGE("Passphrase length incorrect [%s]:[%d]",
1381 passphrase, passphrase_len);
1382 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1386 g_strlcpy(manager->local->passphrase, passphrase, PASSPHRASE_LEN_MAX + 1);
1387 WDS_LOGI("Passphrase string [%s]", manager->local->passphrase);
1389 ret = WIFI_DIRECT_ERROR_NONE;
1390 return_parameters = g_variant_new("(i)", ret);
1393 } else if (!g_strcmp0(method_name, "GetPassphrase")) {
1394 wfd_group_s *group = manager->group;
1396 WDS_LOGE("Group not exist");
1397 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1401 if (group->role == WFD_DEV_ROLE_GC) {
1402 WDS_LOGE("Device is not GO");
1403 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1407 ret = WIFI_DIRECT_ERROR_NONE;
1408 return_parameters = g_variant_new("(is)", ret, group->passphrase);
1409 WDS_LOGI("group->pass : [%s]", group->passphrase);
1413 } else if (!g_strcmp0(method_name, "SetPersistentGroupEnabled")) {
1416 g_variant_get(parameters, "(b)", &enabled);
1417 WDS_LOGI("Activate Persistent Group : [%s]",
1418 enabled ? "True" : "False");
1420 manager->local->group_flags |= WFD_GROUP_FLAG_PERSISTENT;
1422 manager->local->group_flags &= ~(WFD_GROUP_FLAG_PERSISTENT);
1423 ret = WIFI_DIRECT_ERROR_NONE;
1424 return_parameters = g_variant_new("(i)", ret);
1427 } else if (!g_strcmp0(method_name, "IsPersistentGroupEnabled")) {
1429 result = ((manager->local->group_flags &
1430 WFD_GROUP_FLAG_PERSISTENT)
1431 == WFD_GROUP_FLAG_PERSISTENT);
1432 WDS_LOGI("Is persistent group : [%s]", result ? "Yes" : "No");
1433 return_parameters = g_variant_new("(b)", result);
1437 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1442 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
1446 wfd_error_set_gerror(ret, &err);
1447 g_dbus_method_invocation_return_gerror(invocation, err);
1448 g_clear_error(&err);
1452 static void __wfd_manager_config_iface_handler(const gchar *method_name,
1453 GVariant *parameters,
1454 GDBusMethodInvocation *invocation)
1456 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1457 wfd_manager_s *manager = wfd_get_manager();
1458 GVariant *return_parameters = NULL;
1460 WDS_LOGD("%s", method_name);
1462 if (!g_strcmp0(method_name, "GetDeviceName")) {
1463 char device_name[WIFI_DIRECT_MAX_DEVICE_NAME_LEN+1] = {0, };
1465 ret = wfd_local_get_dev_name(device_name);
1467 WDS_LOGE("Failed to get device name");
1468 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1472 ret = WIFI_DIRECT_ERROR_NONE;
1473 return_parameters = g_variant_new("(is)", ret, device_name);
1477 } else if (!g_strcmp0(method_name, "SetDeviceName")) {
1478 const char *device_name = NULL;
1479 g_variant_get(parameters, "(&s)", &device_name);
1480 if (device_name == NULL) {
1481 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1485 ret = wfd_local_set_dev_name((char *)device_name);
1487 WDS_LOGE("Failed to set device name");
1488 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1492 ret = WIFI_DIRECT_ERROR_NONE;
1493 return_parameters = g_variant_new("(i)", ret);
1496 } else if (!g_strcmp0(method_name, "GetWpsPin")) {
1497 wfd_session_s *session = (wfd_session_s*) manager->session;
1498 if (!session || manager->auto_pin[0] != 0) {
1499 WDS_LOGE("Session not exist");
1500 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1504 if (session->wps_pin[0] == '\0') {
1505 WDS_LOGE("WPS PIN is not set");
1506 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1510 ret = WIFI_DIRECT_ERROR_NONE;
1511 return_parameters = g_variant_new("(is)", ret, session->wps_pin);
1514 } else if (!g_strcmp0(method_name, "SetWpsPin")) {
1515 const char *pin = NULL;
1516 wfd_session_s *session = (wfd_session_s*) manager->session;
1518 g_variant_get(parameters, "(&s)", &pin);
1520 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1525 WDS_LOGE("Session not exist");
1526 g_strlcpy(manager->auto_pin, pin, strlen(pin) + 1);
1528 g_strlcpy(session->wps_pin, pin, strlen(pin) + 1);
1531 ret = WIFI_DIRECT_ERROR_NONE;
1532 return_parameters = g_variant_new("(i)", ret);
1535 } else if (!g_strcmp0(method_name, "GetSupportedWpsMode")) {
1536 int config_methods = 0;
1538 ret = wfd_local_get_supported_wps_mode(&config_methods);
1540 WDS_LOGE("Failed to get supported wps mode");
1541 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1545 ret = WIFI_DIRECT_ERROR_NONE;
1546 return_parameters = g_variant_new("(ii)", ret, config_methods);
1549 } else if (!g_strcmp0(method_name, "GetReqWpsMode")) {
1552 ret = wfd_manager_get_req_wps_mode(&wps_mode);
1554 WDS_LOGE("Failed to get request wps mode");
1555 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1559 ret = WIFI_DIRECT_ERROR_NONE;
1560 return_parameters = g_variant_new("(ii)", ret, wps_mode);
1563 } else if (!g_strcmp0(method_name, "SetReqWpsMode")) {
1566 g_variant_get(parameters, "(i)", &type);
1567 ret = wfd_manager_set_req_wps_mode(type);
1569 WDS_LOGE("Failed to set request wps mode");
1570 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1574 ret = WIFI_DIRECT_ERROR_NONE;
1575 return_parameters = g_variant_new("(i)", ret);
1578 } else if (!g_strcmp0(method_name, "GetLocalWpsMode")) {
1581 ret = wfd_local_get_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, "GetIPAddress")) {
1593 char ip_addr_str[IPSTR_LEN+1] = {0, };
1595 if (manager->state < WIFI_DIRECT_STATE_CONNECTED) {
1596 WDS_LOGE("Device is not connected yet");
1597 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1601 ret = wfd_local_get_ip_addr((char *)ip_addr_str);
1603 WDS_LOGE("Failed to get local IP address");
1604 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1608 return_parameters = g_variant_new("(is)", ret, ip_addr_str);
1609 WDS_LOGI("IP addr : [%s]", ip_addr_str);
1612 } else if (!g_strcmp0(method_name, "GetMacAddress")) {
1613 char device_mac[MACSTR_LEN+1] = {0, };
1615 ret = wfd_local_get_dev_mac(device_mac);
1617 WDS_LOGE("Failed to get device mac");
1618 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1622 ret = WIFI_DIRECT_ERROR_NONE;
1623 return_parameters = g_variant_new("(is)", ret, device_mac);
1626 } else if (!g_strcmp0(method_name, "GetGoIntent")) {
1629 ret = wfd_manager_get_go_intent(&go_intent);
1631 WDS_LOGE("Failed to get GO intent");
1632 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1636 ret = WIFI_DIRECT_ERROR_NONE;
1637 return_parameters = g_variant_new("(ii)", ret, go_intent);
1640 } else if (!g_strcmp0(method_name, "SetGoIntent")) {
1643 g_variant_get(parameters, "(i)", &go_intent);
1644 ret = wfd_manager_set_go_intent(go_intent);
1646 WDS_LOGE("Failed to set GO intent");
1647 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1651 ret = WIFI_DIRECT_ERROR_NONE;
1652 return_parameters = g_variant_new("(i)", ret);
1655 } else if (!g_strcmp0(method_name, "GetMaxClient")) {
1658 ret = wfd_manager_get_max_station(&max_client);
1660 WDS_LOGE("Failed to get max station");
1661 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1665 ret = WIFI_DIRECT_ERROR_NONE;
1666 return_parameters = g_variant_new("(ii)", ret, max_client);
1669 } else if (!g_strcmp0(method_name, "SetMaxClient")) {
1671 g_variant_get(parameters, "(i)", &max_client);
1673 ret = wfd_manager_set_max_station(max_client);
1675 WDS_LOGE("Failed to set max station");
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, "SetAutoConnectionMode")) {
1685 gboolean mode = FALSE;
1687 g_variant_get(parameters, "(b)", &mode);
1688 ret = wfd_manager_set_autoconnection(mode);
1690 WDS_LOGE("Failed to set autoconnection");
1691 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1695 ret = WIFI_DIRECT_ERROR_NONE;
1696 return_parameters = g_variant_new("(i)", ret);
1699 } else if (!g_strcmp0(method_name, "IsAutoConnectionMode")) {
1702 ret = wfd_manager_get_autoconnection(&mode);
1704 WDS_LOGE("Failed to get autoconnection");
1705 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1709 ret = WIFI_DIRECT_ERROR_NONE;
1710 return_parameters = g_variant_new("(ib)", ret, mode);
1713 } else if (!g_strcmp0(method_name, "GetOperatingChannel")) {
1716 wfd_group_s *group = manager->group;
1718 WDS_LOGE("Group not exist");
1719 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1723 channel = wfd_util_freq_to_channel(group->freq);
1725 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1729 ret = WIFI_DIRECT_ERROR_NONE;
1730 return_parameters = g_variant_new("(ii)", ret, channel);
1733 } else if (!g_strcmp0(method_name, "SetAutoConnectionPeer")) {
1734 ret = WIFI_DIRECT_ERROR_NONE;
1735 return_parameters = g_variant_new("(i)", ret);
1738 } else if (!g_strcmp0(method_name, "GetInterfaceName")) {
1739 wfd_group_s *group = (wfd_group_s *)manager->group;
1741 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1744 ret = WIFI_DIRECT_ERROR_NONE;
1745 return_parameters = g_variant_new("(is)", ret, group->ifname);
1748 } else if (!g_strcmp0(method_name, "GetSubnetMask")) {
1749 char *get_str = NULL;
1750 char subnet_mask[IPSTR_LEN+1] = {0, };
1752 get_str = vconf_get_str(VCONFKEY_WIFI_DIRECT_P2P_SUBNET_MASK);
1754 WDS_LOGE("Get Subnet Mask failed");
1755 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1758 WDS_LOGD("VCONFKEY_WIFI_DIRECT_P2P_SUBNET_MASK(%s) : %s", VCONFKEY_WIFI_DIRECT_P2P_SUBNET_MASK,
1760 ret = WIFI_DIRECT_ERROR_NONE;
1761 g_strlcpy(subnet_mask, get_str, IPSTR_LEN + 1);
1762 return_parameters = g_variant_new("(is)", ret, subnet_mask);
1766 } else if (!g_strcmp0(method_name, "GetGateway")) {
1767 char *get_str = NULL;
1768 char gateway_addr[IPSTR_LEN+1] = {0, };
1769 get_str = vconf_get_str(VCONFKEY_WIFI_DIRECT_P2P_GATEWAY);
1771 WDS_LOGE("Get Gateway failed");
1772 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1775 WDS_LOGD("VCONFKEY_WIFI_DIRECT_P2P_GATEWAY_ADDR(%s) : %s", VCONFKEY_WIFI_DIRECT_P2P_GATEWAY,
1777 ret = WIFI_DIRECT_ERROR_NONE;
1778 g_strlcpy(gateway_addr, get_str, IPSTR_LEN + 1);
1779 return_parameters = g_variant_new("(is)", ret, gateway_addr);
1783 } else if (!g_strcmp0(method_name, "GetSessionTimer")) {
1785 int session_timer = 0;
1786 ret = WIFI_DIRECT_ERROR_NONE;
1787 session_timer = manager->session_timer;
1788 WDS_LOGD("Get Session Timer value is %d", session_timer);
1789 return_parameters = g_variant_new("(ii)", ret, session_timer);
1792 } else if (!g_strcmp0(method_name, "SetSessionTimer")) {
1794 int session_timer = 0;
1795 g_variant_get(parameters, "(i)", &session_timer);
1796 WDS_LOGD("Set Session Timer value is %d", session_timer);
1797 manager->session_timer = session_timer;
1798 ret = WIFI_DIRECT_ERROR_NONE;
1799 return_parameters = g_variant_new("(i)", ret);
1802 } else if (!g_strcmp0(method_name, "SetAutoGroupRemoval")) {
1805 g_variant_get(parameters, "(b)", &enable);
1806 WDS_LOGE("Activate Auto Group Removal Mode : [%s]",
1807 enable ? "True" : "False");
1809 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1810 WDS_LOGE("Wi-Fi Direct is not activated.");
1811 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1816 manager->auto_group_remove_enable = TRUE;
1818 /* Enable Group destroy only if state is connecting */
1819 if (manager->state == WIFI_DIRECT_STATE_CONNECTING) {
1820 WDS_LOGE("Wi-Fi Direct state is CONNECTING");
1821 ret = WIFI_DIRECT_ERROR_NONE;
1822 return_parameters = g_variant_new("(i)", ret);
1825 /* Remove group immediately if no connected peer found */
1826 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1827 wfd_group_s *group = (wfd_group_s*) manager->group;
1828 if (group && !group->member_count
1829 && wfd_util_is_remove_group_allowed())
1830 wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1834 manager->auto_group_remove_enable = FALSE;
1837 ret = WIFI_DIRECT_ERROR_NONE;
1838 return_parameters = g_variant_new("(i)", ret);
1841 } else if (!g_strcmp0(method_name, "GetPrimaryDevType")) {
1843 int pri_dev_type = 0;
1844 ret = WIFI_DIRECT_ERROR_NONE;
1845 pri_dev_type = DEFAULT_PRIMARY_DEVICE_TYPE;
1846 WDS_LOGD("Get primary dev type value is %d", pri_dev_type);
1847 return_parameters = g_variant_new("(ii)", ret, pri_dev_type);
1850 } else if (!g_strcmp0(method_name, "GetSecondaryDevType")) {
1852 int sec_dev_type = 0;
1853 ret = WIFI_DIRECT_ERROR_NONE;
1854 sec_dev_type = DEFAULT_SECONDARY_DEVICE_TYPE;
1855 WDS_LOGD("Get secondary dev type value is %d", sec_dev_type);
1856 return_parameters = g_variant_new("(ii)", ret, sec_dev_type);
1859 } else if (!g_strcmp0(method_name, "GetPeerRssi")) {
1860 wfd_device_s *peer = NULL;
1861 const char *mac_address = NULL;
1862 unsigned char mac_addr[MACADDR_LEN] = {0, };
1864 g_variant_get(parameters, "(&s)", &mac_address);
1865 macaddr_atoe(mac_address, mac_addr);
1867 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1868 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1872 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
1874 WDS_LOGE("Failed to get peer");
1875 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1879 ret = WIFI_DIRECT_ERROR_NONE;
1880 return_parameters = g_variant_new("(ii)", ret, peer->rssi);
1883 } else if (!g_strcmp0(method_name, "AddVsie")) {
1884 const char *vsie = NULL;
1887 g_variant_get(parameters, "(i&s)", &frame_id, &vsie);
1889 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1890 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1894 if (wfd_oem_add_vsie(manager->oem_ops, frame_id, vsie) < 0) {
1895 WDS_LOGE("Failed to add vsie");
1896 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1900 ret = WIFI_DIRECT_ERROR_NONE;
1901 return_parameters = g_variant_new("(i)", ret);
1904 } else if (!g_strcmp0(method_name, "GetVsie")) {
1908 g_variant_get(parameters, "(i)", &frame_id);
1910 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1911 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1915 if (wfd_oem_get_vsie(manager->oem_ops, frame_id, &vsie) < 0) {
1916 WDS_LOGE("Failed to get vsie");
1917 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1921 WDS_LOGD("Received VSIE [%s]", vsie);
1923 ret = WIFI_DIRECT_ERROR_NONE;
1924 return_parameters = g_variant_new("(is)", ret, vsie);
1929 } else if (!g_strcmp0(method_name, "RemoveVsie")) {
1930 const char *vsie = NULL;
1933 g_variant_get(parameters, "(i&s)", &frame_id, &vsie);
1935 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1936 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1940 if (wfd_oem_remove_vsie(manager->oem_ops, frame_id, vsie) < 0) {
1941 WDS_LOGE("Failed to remove vsie");
1942 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1946 ret = WIFI_DIRECT_ERROR_NONE;
1947 return_parameters = g_variant_new("(i)", ret);
1951 WDS_LOGE("method not handled");
1952 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1957 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
1961 wfd_error_set_gerror(ret, &err);
1962 g_dbus_method_invocation_return_gerror(invocation, err);
1963 g_clear_error(&err);
1967 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1968 static void __wfd_manager_service_iface_handler(const gchar *method_name,
1969 GVariant *parameters,
1970 GDBusMethodInvocation *invocation)
1972 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1973 wfd_manager_s *manager = wfd_get_manager();
1974 GVariant *return_parameters = NULL;
1976 WDS_LOGD("%s", method_name);
1978 if (!g_strcmp0(method_name, "StartDiscovery")) {
1979 const char *mac_address = NULL;
1981 unsigned char mac_addr[MACADDR_LEN] = {0, };
1983 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1984 WDS_LOGE("Wi-Fi Direct is not activated.");
1985 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1989 g_variant_get(parameters, "(i&s)", &service_type, &mac_address);
1990 if (mac_address == NULL) {
1991 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1995 WDS_LOGD("Service type [%d]", service_type);
1996 macaddr_atoe(mac_address, mac_addr);
1998 ret = wfd_oem_start_service_discovery(manager->oem_ops,
1999 mac_addr, service_type);
2001 WDS_LOGE("Failed to start service discovery");
2002 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2006 WFD_DBUS_REPLY_ERROR_NONE(invocation);
2008 wfd_manager_dbus_emit_signal(WFD_MANAGER_SERVICE_INTERFACE,
2009 "DiscoveryStarted", NULL);
2012 } else if (!g_strcmp0(method_name, "StopDiscovery")) {
2013 const char *mac_address = NULL;
2015 unsigned char mac_addr[MACADDR_LEN] = {0, };
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_cancel_service_discovery(manager->oem_ops,
2033 mac_addr, service_type);
2035 WDS_LOGE("Failed to cancel service discovery");
2036 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2039 ret = WIFI_DIRECT_ERROR_NONE;
2040 return_parameters = g_variant_new("(i)", ret);
2043 } else if (!g_strcmp0(method_name, "Register")) {
2046 const char *info_str = NULL;
2048 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2049 WDS_LOGE("Wi-Fi Direct is not activated.");
2050 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2054 g_variant_get(parameters, "(i&s)", &service_type, &info_str);
2055 WDS_LOGD("Register service [%d: %s]", service_type, info_str);
2057 ret = wfd_service_add(service_type, (char *)info_str, &service_id);
2059 WDS_LOGE("Failed to add service");
2060 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2064 ret = WIFI_DIRECT_ERROR_NONE;
2065 return_parameters = g_variant_new("(ii)", ret, service_id);
2068 } else if (!g_strcmp0(method_name, "Deregister")) {
2071 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2072 WDS_LOGE("Wi-Fi Direct is not activated.");
2073 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2077 g_variant_get(parameters, "(i)", &service_id);
2078 WDS_LOGD("Service id [%d]", service_id);
2080 ret = wfd_service_del(service_id);
2082 WDS_LOGE("Failed to delete service");
2083 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2087 ret = WIFI_DIRECT_ERROR_NONE;
2088 return_parameters = g_variant_new("(i)", ret);
2092 WDS_LOGD("method not handled");
2093 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2098 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
2102 wfd_error_set_gerror(ret, &err);
2103 g_dbus_method_invocation_return_gerror(invocation, err);
2104 g_clear_error(&err);
2107 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
2109 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
2110 static void __wfd_manager_display_iface_handler(const gchar *method_name,
2111 GVariant *parameters,
2112 GDBusMethodInvocation *invocation)
2114 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2115 wfd_manager_s *manager = wfd_get_manager();
2116 GVariant *return_parameters = NULL;
2118 WDS_LOGD("%s", method_name);
2120 if (!g_strcmp0(method_name, "Init")) {
2121 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2122 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2126 wfd_device_s * device = manager->local;
2128 ret = wfd_oem_miracast_init(manager->oem_ops, TRUE);
2130 WDS_LOGE("Failed to initialize display");
2131 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2135 device->display.type = WIFI_DISPLAY_DEFAULT_TYPE;
2136 device->display.port = WIFI_DISPLAY_DEFAULT_PORT;
2137 device->display.availability = WIFI_DISPLAY_DEFAULT_AVAIL;
2138 device->display.hdcp_support = WIFI_DISPLAY_DEFAULT_HDCP;
2140 ret = WIFI_DIRECT_ERROR_NONE;
2141 return_parameters = g_variant_new("(i)", ret);
2144 } else if (!g_strcmp0(method_name, "Deinit")) {
2145 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2146 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2150 wfd_device_s * device = manager->local;
2152 ret = wfd_oem_miracast_init(manager->oem_ops, FALSE);
2154 WDS_LOGE("Failed to deinitialize display");
2155 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2159 memset(&(device->display), 0x0, sizeof(wfd_display_type_e));
2161 ret = WIFI_DIRECT_ERROR_NONE;
2162 return_parameters = g_variant_new("(i)", ret);
2165 } else if (!g_strcmp0(method_name, "SetConfig")) {
2166 int type, port, hdcp;
2167 g_variant_get(parameters, "(iii)", &type, &port, &hdcp);
2169 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2170 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2174 WDS_LOGD("type %d port %d hdcp %d", type, port, hdcp);
2176 ret = wfd_manager_set_display_device(type, port, hdcp);
2178 WDS_LOGE("Failed to set display device settings");
2179 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2183 ret = WIFI_DIRECT_ERROR_NONE;
2184 return_parameters = g_variant_new("(i)", ret);
2187 } else if (!g_strcmp0(method_name, "SetAvailiability")) {
2189 g_variant_get(parameters, "(i)", &availability);
2191 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2192 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2196 ret = wfd_manager_set_session_availability(availability);
2198 WDS_LOGE("Failed to set session availability");
2199 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2203 ret = WIFI_DIRECT_ERROR_NONE;
2204 return_parameters = g_variant_new("(i)", ret);
2207 } else if (!g_strcmp0(method_name, "GetPeerType")) {
2208 wfd_device_s *peer = NULL;
2209 const char *mac_address = NULL;
2210 unsigned char mac_addr[MACADDR_LEN] = {0, };
2212 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2213 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2217 g_variant_get(parameters, "(&s)", &mac_address);
2218 if (mac_address == NULL) {
2219 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2223 macaddr_atoe(mac_address, mac_addr);
2224 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
2226 WDS_LOGE("Failed to get peer");
2227 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2231 ret = WIFI_DIRECT_ERROR_NONE;
2232 return_parameters = g_variant_new("(ii)", ret, peer->display.type);
2235 } else if (!g_strcmp0(method_name, "GetPeerAvailability")) {
2236 wfd_device_s *peer = NULL;
2237 const char *mac_address = NULL;
2238 unsigned char mac_addr[MACADDR_LEN] = {0, };
2240 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2241 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2245 g_variant_get(parameters, "(&s)", &mac_address);
2246 if (mac_address == NULL) {
2247 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2251 macaddr_atoe(mac_address, mac_addr);
2252 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
2254 WDS_LOGE("Failed to get peer");
2255 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2259 ret = WIFI_DIRECT_ERROR_NONE;
2260 return_parameters = g_variant_new("(ii)", ret, peer->display.availability);
2263 } else if (!g_strcmp0(method_name, "GetPeerHdcp")) {
2264 wfd_device_s *peer = NULL;
2265 const char *mac_address = NULL;
2266 unsigned char mac_addr[MACADDR_LEN] = {0, };
2268 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2269 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2273 g_variant_get(parameters, "(&s)", &mac_address);
2274 if (mac_address == NULL) {
2275 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2279 macaddr_atoe(mac_address, mac_addr);
2280 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
2282 WDS_LOGE("Failed to get peer");
2283 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2287 ret = WIFI_DIRECT_ERROR_NONE;
2288 return_parameters = g_variant_new("(ii)", ret, peer->display.hdcp_support);
2291 } else if (!g_strcmp0(method_name, "GetPeerPort")) {
2292 wfd_device_s *peer = NULL;
2293 const char *mac_address = NULL;
2294 unsigned char mac_addr[MACADDR_LEN] = {0, };
2296 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2297 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2301 g_variant_get(parameters, "(&s)", &mac_address);
2302 if (mac_address == NULL) {
2303 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2307 macaddr_atoe(mac_address, mac_addr);
2308 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
2310 WDS_LOGE("Failed to get peer");
2311 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2315 ret = WIFI_DIRECT_ERROR_NONE;
2316 return_parameters = g_variant_new("(ii)", ret, peer->display.port);
2319 } else if (!g_strcmp0(method_name, "GetPeerThroughput")) {
2320 wfd_device_s *peer = NULL;
2321 const char *mac_address = NULL;
2322 unsigned char mac_addr[MACADDR_LEN] = {0, };
2324 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2325 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2329 g_variant_get(parameters, "(&s)", &mac_address);
2330 if (mac_address == NULL) {
2331 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2335 macaddr_atoe(mac_address, mac_addr);
2336 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
2338 WDS_LOGE("Failed to get peer");
2339 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2343 ret = WIFI_DIRECT_ERROR_NONE;
2344 return_parameters = g_variant_new("(ii)", ret, peer->display.max_tput);
2348 WDS_LOGD("method not handled");
2349 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2354 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
2358 wfd_error_set_gerror(ret, &err);
2359 g_dbus_method_invocation_return_gerror(invocation, err);
2360 g_clear_error(&err);
2363 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
2364 #if defined(TIZEN_FEATURE_ASP)
2366 static void __g_variant_to_txt_record(GVariant *variant, char **txt_record)
2368 GVariantIter *iter = NULL;
2370 GVariant *value = NULL;
2372 const char *str = NULL;
2376 gsize value_length = 0;
2377 __WDS_LOG_FUNC_ENTER__;
2379 DBUS_DEBUG_VARIANT(variant);
2380 g_variant_get(variant, "a{sv}", &iter);
2381 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
2382 WDS_LOGD("%s %s", key, g_variant_get_string(value, &value_length));
2383 txt_length += strlen(key);
2384 str = g_variant_get_string(value, &value_length);
2385 txt_length += (int)value_length;
2389 g_variant_iter_free(iter);
2390 if (txt_length == 0) {
2391 __WDS_LOG_FUNC_EXIT__;
2395 buff = g_try_malloc0(txt_length);
2397 WDS_LOGE("g_try_malloc0 failed");
2398 __WDS_LOG_FUNC_EXIT__;
2402 g_variant_get(variant, "a{sv}", &iter);
2403 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
2404 key_length = strlen(key);
2405 str = g_variant_get_string(value, &value_length);
2407 g_strlcpy(pos, key, key_length + 1);
2412 g_strlcpy(pos, str, value_length + 1);
2413 pos += (int)value_length;
2417 buff[txt_length -1] = '\0';
2419 g_variant_iter_free(iter);
2422 __WDS_LOG_FUNC_EXIT__;
2426 static void __g_variant_to_seek_info(GVariant *variant, char **seek_info)
2428 GVariantIter *iter = NULL;
2432 int seek_length = 0;
2435 DBUS_DEBUG_VARIANT(variant);
2436 g_variant_get(variant, "as", &iter);
2437 while (g_variant_iter_loop(iter, "s", &key)) {
2438 seek_length += strlen(key);
2442 g_variant_iter_free(iter);
2443 if (seek_length == 0)
2446 buff = g_try_malloc0(seek_length);
2448 WDS_LOGE("g_try_malloc0 failed");
2452 g_variant_get(variant, "as", &iter);
2453 while (g_variant_iter_loop(iter, "s", &key)) {
2454 key_length = strlen(key);
2456 g_strlcpy(pos, key, key_length + 1);
2461 buff[seek_length -1] = '\0';
2463 g_variant_iter_free(iter);
2469 static void __wfd_manager_asp_iface_handler(const gchar *method_name,
2470 GVariant *parameters,
2471 GDBusMethodInvocation *invocation)
2473 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2474 wfd_manager_s *manager = wfd_get_manager();
2475 GVariant *return_parameters = NULL;
2477 WDS_LOGD("%s", method_name);
2479 if (!g_strcmp0(method_name, "AdvertiseService")) {
2481 wfd_oem_asp_service_s service;
2482 GVariantIter *iter = NULL;
2484 GVariant *var = NULL;
2487 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
2488 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
2489 manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
2490 WDS_LOGE("Wi-Fi Direct is not available status for Advertising.");
2491 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2495 memset(&service, 0, sizeof(wfd_oem_asp_service_s));
2496 g_variant_get(parameters, "(a{sv})", &iter);
2497 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
2498 if (!g_strcmp0(key, "adv_id"))
2499 g_variant_get(var, "u", &(service.adv_id));
2500 else if (!g_strcmp0(key, "discovery_tech"))
2501 g_variant_get(var, "i", &(service.discovery_tech));
2502 else if (!g_strcmp0(key, "preferred_connection"))
2503 g_variant_get(var, "y", &(service.preferred_connection));
2504 else if (!g_strcmp0(key, "auto_accept"))
2505 g_variant_get(var, "i", &(service.auto_accept));
2506 else if (!g_strcmp0(key, "status"))
2507 g_variant_get(var, "y", &(service.status));
2508 else if (!g_strcmp0(key, "role"))
2509 g_variant_get(var, "y", &(service.role));
2510 else if (!g_strcmp0(key, "replace"))
2511 g_variant_get(var, "i", &(replace));
2512 else if (!g_strcmp0(key, "config_method"))
2513 g_variant_get(var, "u", &(service.config_method));
2514 else if (!g_strcmp0(key, "instance_name"))
2515 g_variant_get(var, "&s", &(service.instance_name));
2516 else if (!g_strcmp0(key, "service_type"))
2517 g_variant_get(var, "&s", &(service.service_type));
2518 else if (!g_strcmp0(key, "service_info"))
2519 __g_variant_to_txt_record(var, &(service.service_info));
2520 else if (!g_strcmp0(key, "rsp_info"))
2521 g_variant_get(var, "&s", &(service.rsp_info));
2526 ret = wfd_oem_advertise_service(manager->oem_ops, &service, replace);
2528 WDS_LOGE("Failed to add service");
2529 g_free(service.service_info);
2530 g_variant_iter_free(iter);
2531 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2534 g_free(service.service_info);
2535 g_variant_iter_free(iter);
2537 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
2538 WDS_LOGW("Wi-Fi Direct device is already visible, do not start listen");
2542 ret = wfd_manager_start_discovery(manager,
2543 WFD_OEM_SCAN_MODE_PASSIVE, 0,
2545 if (ret == WIFI_DIRECT_ERROR_NONE) {
2546 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
2550 wfd_oem_cancel_advertise_service(manager->oem_ops, &service);
2551 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2555 ret = WIFI_DIRECT_ERROR_NONE;
2556 return_parameters = g_variant_new("(i)", ret);
2559 } else if (!g_strcmp0(method_name, "CancelAdvertiseService")) {
2561 wfd_oem_asp_service_s service;
2562 memset(&service, 0, sizeof(wfd_oem_asp_service_s));
2564 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2565 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2569 g_variant_get(parameters, "(u)", &(service.adv_id));
2570 ret = wfd_oem_cancel_advertise_service(manager->oem_ops, &service);
2572 WDS_LOGE("Failed to del service");
2573 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2577 ret = WIFI_DIRECT_ERROR_NONE;
2578 return_parameters = g_variant_new("(i)", ret);
2581 } else if (!g_strcmp0(method_name, "SeekService")) {
2583 wfd_oem_asp_service_s service;
2584 GVariantIter *iter = NULL;
2586 GVariant *var = NULL;
2588 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
2589 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
2590 manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
2591 WDS_LOGE("Wi-Fi Direct is not available status to Seek.");
2592 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2596 memset(&service, 0, sizeof(wfd_oem_asp_service_s));
2597 g_variant_get(parameters, "(a{sv})", &iter);
2598 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
2599 if (!g_strcmp0(key, "discovery_tech"))
2600 g_variant_get(var, "i", &(service.discovery_tech));
2601 else if (!g_strcmp0(key, "search_id"))
2602 g_variant_get(var, "t", &(service.asp_search_id));
2603 else if (!g_strcmp0(key, "preferred_connection"))
2604 g_variant_get(var, "y", &(service.preferred_connection));
2605 else if (!g_strcmp0(key, "service_type"))
2606 g_variant_get(var, "&s", &(service.service_type));
2607 else if (!g_strcmp0(key, "service_info"))
2608 __g_variant_to_seek_info(var, &(service.service_info));
2613 ret = wfd_oem_seek_service(manager->oem_ops, &service);
2615 WDS_LOGE("Failed to seek service");
2616 g_free(service.service_info);
2617 g_variant_iter_free(iter);
2618 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2621 g_free(service.service_info);
2622 g_variant_iter_free(iter);
2624 WDS_LOGD("search_id [%x]", service.search_id);
2626 ret = wfd_manager_start_discovery(manager,
2627 WFD_OEM_SCAN_MODE_ACTIVE, 0,
2629 if (ret == WIFI_DIRECT_ERROR_NONE) {
2630 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
2634 wfd_oem_cancel_seek_service(manager->oem_ops, &service);
2635 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2639 ret = WIFI_DIRECT_ERROR_NONE;
2640 return_parameters = g_variant_new("(i)", ret);
2643 } else if (!g_strcmp0(method_name, "CancelSeekService")) {
2645 wfd_oem_asp_service_s service;
2646 memset(&service, 0, sizeof(wfd_oem_asp_service_s));
2648 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2649 WDS_LOGE("Wi-Fi Direct is not activated.");
2650 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2654 g_variant_get(parameters, "(t)", &(service.asp_search_id));
2655 ret = wfd_oem_cancel_seek_service(manager->oem_ops, &service);
2657 WDS_LOGE("Failed to cancel seek service");
2658 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2662 ret = WIFI_DIRECT_ERROR_NONE;
2663 return_parameters = g_variant_new("(i)", ret);
2665 } else if (!g_strcmp0(method_name, "ConnectSession")) {
2667 GVariantIter *iter = NULL;
2669 GVariant *var = NULL;
2670 wfd_oem_asp_prov_s prov_params;
2671 const char *mac_str = NULL;
2672 unsigned char role = 0;
2673 unsigned int config = 0;
2676 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
2677 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
2678 manager->state != WIFI_DIRECT_STATE_GROUP_OWNER) {
2679 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2683 memset(&prov_params, 0, sizeof(wfd_oem_asp_prov_s));
2685 g_variant_get(parameters, "(a{sv})", &iter);
2686 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
2688 if (!g_strcmp0(key, "service_mac")) {
2689 g_variant_get(var, "&s", &mac_str);
2690 if (mac_str == NULL) {
2691 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2692 g_variant_iter_free(iter);
2695 macaddr_atoe(mac_str, prov_params.service_mac);
2696 } else if (!g_strcmp0(key, "adv_id")) {
2697 g_variant_get(var, "u", &(prov_params.adv_id));
2698 } else if (!g_strcmp0(key, "session_mac")) {
2699 g_variant_get(var, "&s", &mac_str);
2700 if (mac_str == NULL) {
2701 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2702 g_variant_iter_free(iter);
2705 macaddr_atoe(mac_str, prov_params.session_mac);
2706 } else if (!g_strcmp0(key, "session_id")) {
2707 g_variant_get(var, "u", &(prov_params.session_id));
2708 } else if (!g_strcmp0(key, "role")) {
2709 g_variant_get(var, "y", &(role));
2710 prov_params.network_role = (int)role;
2711 } else if (!g_strcmp0(key, "config_method")) {
2712 g_variant_get(var, "u", &(config));
2713 prov_params.network_config = (int)config;
2714 } else if (!g_strcmp0(key, "session_info")) {
2715 g_variant_get(var, "&s", &(prov_params.session_information));
2721 if (ISZEROMACADDR(prov_params.service_mac) ||
2722 ISZEROMACADDR(prov_params.session_mac)) {
2723 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2724 g_variant_iter_free(iter);
2728 WFD_DBUS_REPLY_ERROR_NONE(invocation);
2730 wfd_asp_connect_status(prov_params.session_mac,
2731 prov_params.session_id,
2732 ASP_CONNECT_STATUS_REQUEST_SENT,
2735 wfd_group_s *group = (wfd_group_s*) manager->group;
2736 if (group && group->member_count >= manager->max_station) {
2738 status = ASP_CONNECT_STATUS_NOMORE_CONNECT;
2739 wfd_asp_connect_status(prov_params.session_mac,
2740 prov_params.session_id,
2743 g_variant_iter_free(iter);
2744 __WDS_LOG_FUNC_EXIT__;
2748 ret = wfd_manager_asp_connect_session(manager, &prov_params);
2749 if (ret == WIFI_DIRECT_ERROR_NONE) {
2750 char peer_mac_address[MACSTR_LEN] = {0,};
2751 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(prov_params.service_mac));
2752 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
2754 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
2755 WFD_EVENT_CONNECTION_IN_PROGRESS,
2758 wfd_asp_connect_status(prov_params.session_mac,
2759 prov_params.session_id,
2760 ASP_CONNECT_STATUS_REQUEST_FAILED,
2763 g_variant_iter_free(iter);
2764 __WDS_LOG_FUNC_EXIT__;
2767 } else if (!g_strcmp0(method_name, "ConfirmSession")) {
2769 GVariantIter *iter = NULL;
2771 GVariant *var = NULL;
2772 wfd_oem_asp_prov_s prov_params;
2773 const char *mac_str = NULL;
2774 const char *pin = NULL;
2777 if (manager->state != WIFI_DIRECT_STATE_CONNECTING) {
2778 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2782 memset(&prov_params, 0, sizeof(wfd_oem_asp_prov_s));
2784 g_variant_get(parameters, "(a{sv})", &iter);
2785 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
2787 if (!g_strcmp0(key, "service_mac")) {
2788 g_variant_get(var, "&s", &mac_str);
2789 if (mac_str == NULL) {
2790 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2791 g_variant_iter_free(iter);
2794 macaddr_atoe(mac_str, prov_params.service_mac);
2795 } else if (!g_strcmp0(key, "adv_id")) {
2796 g_variant_get(var, "u", &(prov_params.adv_id));
2797 } else if (!g_strcmp0(key, "session_mac")) {
2798 g_variant_get(var, "&s", &mac_str);
2799 if (mac_str == NULL) {
2800 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2801 g_variant_iter_free(iter);
2804 macaddr_atoe(mac_str, prov_params.session_mac);
2805 } else if (!g_strcmp0(key, "session_id")) {
2806 g_variant_get(var, "u", &(prov_params.session_id));
2807 } else if (!g_strcmp0(key, "confirm")) {
2808 g_variant_get(var, "i", &(confirmed));
2809 } else if (!g_strcmp0(key, "pin")) {
2810 g_variant_get(var, "&s", &(pin));
2811 g_strlcpy(prov_params.wps_pin, pin, PINSTR_LEN);
2817 if (ISZEROMACADDR(prov_params.session_mac)) {
2818 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2819 g_variant_iter_free(iter);
2823 WFD_DBUS_REPLY_ERROR_NONE(invocation);
2825 ret = wfd_manager_asp_confirm_session(manager, &prov_params, confirmed);
2826 if (ret == WIFI_DIRECT_ERROR_NONE && confirmed > 0) {
2827 char peer_mac_address[MACSTR_LEN] = {0,};
2828 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(prov_params.service_mac));
2829 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
2831 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
2832 WFD_EVENT_CONNECTION_IN_PROGRESS,
2834 wfd_asp_connect_status(prov_params.session_mac,
2835 prov_params.session_id,
2836 ASP_CONNECT_STATUS_REQUEST_ACCEPTED,
2839 wfd_asp_connect_status(prov_params.session_mac,
2840 prov_params.session_id,
2841 ASP_CONNECT_STATUS_REQUEST_FAILED,
2844 g_variant_iter_free(iter);
2845 __WDS_LOG_FUNC_EXIT__;
2850 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
2851 __WDS_LOG_FUNC_EXIT__;
2855 wfd_error_set_gerror(ret, &err);
2856 g_dbus_method_invocation_return_gerror(invocation, err);
2857 g_clear_error(&err);
2858 __WDS_LOG_FUNC_EXIT__;
2865 const gchar *iface_name;
2866 void (*function) (const gchar *method_name,
2867 GVariant *parameters,
2868 GDBusMethodInvocation *invocation);
2869 } wfd_manager_iface_map[] = {
2872 WFD_MANAGER_MANAGE_INTERFACE,
2873 __wfd_manager_manage_iface_handler
2877 WFD_MANAGER_GROUP_INTERFACE,
2878 __wfd_manager_group_iface_handler
2882 WFD_MANAGER_CONFIG_INTERFACE,
2883 __wfd_manager_config_iface_handler
2885 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
2888 WFD_MANAGER_SERVICE_INTERFACE,
2889 __wfd_manager_service_iface_handler
2891 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
2892 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
2895 WFD_MANAGER_DISPLAY_INTERFACE,
2896 __wfd_manager_display_iface_handler
2898 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
2899 #if defined(TIZEN_FEATURE_ASP)
2902 WFD_MANAGER_ASP_INTERFACE,
2903 __wfd_manager_asp_iface_handler
2913 /* GDBus method handler */
2914 static void wfd_manager_method_call_handler (GDBusConnection *connection,
2915 const gchar *sender,
2916 const gchar *object_path,
2917 const gchar *interface_name,
2918 const gchar *method_name,
2919 GVariant *parameters,
2920 GDBusMethodInvocation *invocation,
2925 #ifdef TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND
2926 if (!g_strcmp0(method_name, "AddClient"))
2927 wfd_manager_add_active_client(sender);
2928 #endif /* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
2931 WDS_LOGD("interface : [%s], method : [%s]", interface_name, method_name);
2932 DBUS_DEBUG_VARIANT(parameters);
2934 while (wfd_manager_iface_map[count].iface_name != NULL) {
2935 if (!g_strcmp0(interface_name, wfd_manager_iface_map[count].iface_name)) {
2937 wfd_manager_iface_map[count].function(method_name,
2946 static const GDBusInterfaceVTable wfd_manager_interface_vtable = {
2947 wfd_manager_method_call_handler, NULL, NULL};
2949 void wfd_manager_dbus_unregister(void)
2953 wfd_error_deregister();
2955 while (wfd_manager_iface_map[count].iface_name != NULL) {
2956 wfd_manager_dbus_iface_unregister(wfd_manager_iface_map[count].reg_id);
2961 gboolean wfd_manager_dbus_register(void)
2963 GDBusNodeInfo *node_info = NULL;
2964 GError *Error = NULL;
2967 wfd_error_register();
2969 node_info = g_dbus_node_info_new_for_xml(wfd_manager_introspection_xml, &Error);
2970 if (node_info == NULL) {
2971 WDS_LOGE("Failed to get node info, Error: %s", Error->message);
2972 g_clear_error(&Error);
2976 while (wfd_manager_iface_map[count].iface_name != NULL) {
2977 wfd_manager_iface_map[count].reg_id =
2978 wfd_manager_dbus_iface_register(wfd_manager_iface_map[count].iface_name,
2981 &wfd_manager_interface_vtable);
2983 WDS_LOGD("Registered Interface [%d, %s]",
2984 wfd_manager_iface_map[count].reg_id,
2985 wfd_manager_iface_map[count].iface_name);
2990 g_dbus_node_info_unref(node_info);