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 "<method name='AddClient'>"
74 "<arg type='i' name='result' direction='out'/>"
76 "<method name='Deactivate'>"
77 "<arg type='i' name='error_code' direction='out'/>"
79 "<method name='StartDiscovery'>"
80 "<arg type='a{sv}' name='parameters' direction='in'/>"
81 "<arg type='i' name='error_code' direction='out'/>"
83 "<method name='StopDiscovery'>"
84 "<arg type='i' name='error_code' direction='out'/>"
86 "<method name='GetDiscoveredPeers'>"
87 "<arg type='i' name='error_code' direction='out'/>"
88 "<arg type='aa{sv}' name='peer_details_list' direction='out'/>"
90 "<method name='Connect'>"
91 "<arg type='s' name='mac_address' direction='in'/>"
92 "<arg type='i' name='error_code' direction='out'/>"
94 "<method name='Disconnect'>"
95 "<arg type='s' name='mac_address' direction='in'/>"
96 "<arg type='i' name='error_code' direction='out'/>"
98 "<method name='CancelConnection'>"
99 "<arg type='s' name='mac_address' direction='in'/>"
100 "<arg type='i' name='error_code' direction='out'/>"
102 "<method name='AcceptConnection'>"
103 "<arg type='s' name='mac_address' direction='in'/>"
104 "<arg type='i' name='error_code' direction='out'/>"
106 "<method name='RejectConnection'>"
107 "<arg type='s' name='mac_address' direction='in'/>"
108 "<arg type='i' name='error_code' direction='out'/>"
110 "<method name='DisconnectAll'>"
111 "<arg type='i' name='error_code' direction='out'/>"
113 "<method name='GetConnectedPeers'>"
114 "<arg type='i' name='error_code' direction='out'/>"
115 "<arg type='aa{sv}' name='peer_details_list' direction='out'/>"
117 "<method name='GetConnectingPeer'>"
118 "<arg type='i' name='error_code' direction='out'/>"
119 "<arg type='a{sv}' name='peer_details' direction='out'/>"
121 "<method name='IsDiscoverable'>"
122 "<arg type='b' name='result' direction='out'/>"
124 "<method name='IsListeningOnly'>"
125 "<arg type='b' name='result' direction='out'/>"
127 "<method name='GetPeerInfo'>"
128 "<arg type='s' name='mac_address' direction='in'/>"
129 "<arg type='i' name='error_code' direction='out'/>"
130 "<arg type='a{sv}' name='peer_details' direction='out'/>"
132 "<method name='GetState'>"
133 "<arg type='i' name='error_code' direction='out'/>"
134 "<arg type='i' name='state' direction='out'/>"
136 "<signal name='Activation'>"
137 "<arg type='i' name='error_code'/>"
139 "<signal name='Deactivation'>"
140 "<arg type='i' name='error_code'/>"
142 "<signal name='Connection'>"
143 "<arg type='i' name='error_code'/>"
144 "<arg type='i' name='connection_state'/>"
145 "<arg type='s' name='peer_mac_address'/>"
147 "<signal name='Disconnection'>"
148 "<arg type='i' name='error_code'/>"
149 "<arg type='i' name='connection_state'/>"
150 "<arg type='s' name='peer_mac_address'/>"
152 "<signal name='ListenStarted'>"
154 "<signal name='DiscoveryStarted'>"
156 "<signal name='DiscoveryFinished'>"
158 "<signal name='PeerFound'>"
159 "<arg type='s' name='peer_mac_address'/>"
161 "<signal name='PeerLost'>"
162 "<arg type='s' name='peer_mac_address'/>"
164 "<signal name='PeerIPAssigned'>"
165 "<arg type='s' name='peer_mac_address'/>"
166 "<arg type='s' name='assigned_ip_address'/>"
169 "<interface name='net.wifidirect.group'>"
170 "<method name='CreateGroup'>"
171 "<arg type='a{sv}' name='parameters' direction='in'/>"
172 "<arg type='i' name='error_code' direction='out'/>"
174 "<method name='DestroyGroup'>"
175 "<arg type='i' name='error_code' direction='out'/>"
177 "<method name='IsGroupOwner'>"
178 "<arg type='b' name='result' direction='out'/>"
180 "<method name='IsAutoGroup'>"
181 "<arg type='b' name='result' direction='out'/>"
183 "<method name='ActivatePushButton'>"
184 "<arg type='i' name='error_code' direction='out'/>"
186 "<method name='GetPersistentGroups'>"
187 "<arg type='i' name='error_code' direction='out'/>"
188 "<arg type='aa{sv}' name='result' direction='out'/>"
190 "<method name='RemovePersistentGroup'>"
191 "<arg type='s' name='mac_address' direction='in'/>"
192 "<arg type='s' name='ssid' direction='in'/>"
193 "<arg type='i' name='error_code' direction='out'/>"
195 "<method name='SetPassphrase'>"
196 "<arg type='s' name='passphrase' direction='in'/>"
197 "<arg type='i' name='error_code' direction='out'/>"
199 "<method name='GetPassphrase'>"
200 "<arg type='i' name='error_code' direction='out'/>"
201 "<arg type='s' name='passphrase' direction='out'/>"
203 "<method name='SetPersistentGroupEnabled'>"
204 "<arg type='b' name='enable' direction='in'/>"
205 "<arg type='i' name='error_code' direction='out'/>"
207 "<method name='IsPersistentGroupEnabled'>"
208 "<arg type='b' name='result' direction='out'/>"
210 "<signal name='Created'>"
212 "<signal name='Destroyed'>"
215 "<interface name='net.wifidirect.config'>"
216 "<method name='GetDeviceName'>"
217 "<arg type='i' name='error_code' direction='out'/>"
218 "<arg type='s' name='device_name' direction='out'/>"
220 "<method name='SetDeviceName'>"
221 "<arg type='s' name='device_name' direction='in'/>"
222 "<arg type='i' name='error_code' direction='out'/>"
224 "<method name='SetWpsPin'>"
225 "<arg type='s' name='wps_pin' direction='in'/>"
226 "<arg type='i' name='error_code' direction='out'/>"
228 "<method name='GetWpsPin'>"
229 "<arg type='i' name='error_code' direction='out'/>"
230 "<arg type='s' name='wps_pin' direction='out'/>"
232 "<method name='GenerateWpsPin'>"
233 "<arg type='i' name='error_code' direction='out'/>"
234 "<arg type='s' name='wps_pin' direction='out'/>"
236 "<method name='GetSupportedWpsMode'>"
237 "<arg type='i' name='error_code' direction='out'/>"
238 "<arg type='i' name='config_methods' direction='out'/>"
240 "<method name='GetReqWpsMode'>"
241 "<arg type='i' name='error_code' direction='out'/>"
242 "<arg type='i' name='req_wps_mode' direction='out'/>"
244 "<method name='SetReqWpsMode'>"
245 "<arg type='i' name='req_wps_mode' direction='in'/>"
246 "<arg type='i' name='error_code' direction='out'/>"
248 "<method name='GetLocalWpsMode'>"
249 "<arg type='i' name='error_code' direction='out'/>"
250 "<arg type='i' name='local_wps_mode' direction='out'/>"
252 "<method name='GetIPAddress'>"
253 "<arg type='i' name='error_code' direction='out'/>"
254 "<arg type='s' name='local_ip_address' direction='out'/>"
256 "<method name='GetMacAddress'>"
257 "<arg type='i' name='error_code' direction='out'/>"
258 "<arg type='s' name='local_mac_address' direction='out'/>"
260 "<method name='GetGoIntent'>"
261 "<arg type='i' name='error_code' direction='out'/>"
262 "<arg type='i' name='go_intent' direction='out'/>"
264 "<method name='SetGoIntent'>"
265 "<arg type='i' name='go_intent' direction='in'/>"
266 "<arg type='i' name='error_code' direction='out'/>"
268 "<method name='GetMaxClient'>"
269 "<arg type='i' name='error_code' direction='out'/>"
270 "<arg type='i' name='max_client' direction='out'/>"
272 "<method name='SetMaxClient'>"
273 "<arg type='i' name='max_client' direction='in'/>"
274 "<arg type='i' name='error_code' direction='out'/>"
276 "<method name='SetAutoConnectionMode'>"
277 "<arg type='b' name='auto_connection_mode' direction='in'/>"
278 "<arg type='i' name='error_code' direction='out'/>"
280 "<method name='IsAutoConnectionMode'>"
281 "<arg type='i' name='error_code' direction='out'/>"
282 "<arg type='b' name='result' direction='out'/>"
284 "<method name='GetOperatingChannel'>"
285 "<arg type='i' name='error_code' direction='out'/>"
286 "<arg type='i' name='operating_channel' direction='out'/>"
288 "<method name='SetAutoConnectionPeer'>"
289 "<arg type='s' name='peer_mac_address' direction='in'/>"
290 "<arg type='i' name='error_code' direction='out'/>"
292 "<method name='GetConnectingPeer'>"
293 "<arg type='i' name='error_code' direction='out'/>"
294 "<arg type='s' name='local_mac_address' direction='out'/>"
296 "<method name='GetInterfaceName'>"
297 "<arg type='i' name='error_code' direction='out'/>"
298 "<arg type='s' name='ifname' direction='out'/>"
300 "<method name='GetSubnetMask'>"
301 "<arg type='i' name='error_code' direction='out'/>"
302 "<arg type='s' name='subnet_mask' direction='out'/>"
304 "<method name='GetGateway'>"
305 "<arg type='i' name='error_code' direction='out'/>"
306 "<arg type='s' name='gateway_address' direction='out'/>"
308 "<method name='GetSessionTimer'>"
309 "<arg type='i' name='error_code' direction='out'/>"
310 "<arg type='i' name='session_timer' direction='out'/>"
312 "<method name='SetSessionTimer'>"
313 "<arg type='i' name='session_timer' direction='in'/>"
314 "<arg type='i' name='error_code' direction='out'/>"
316 "<method name='SetAutoGroupRemoval'>"
317 "<arg type='b' name='enable' direction='in'/>"
318 "<arg type='i' name='error_code' direction='out'/>"
320 "<method name='GetPrimaryDevType'>"
321 "<arg type='i' name='pri_dev_type' direction='out'/>"
322 "<arg type='i' name='error_code' direction='out'/>"
324 "<method name='GetSecondaryDevType'>"
325 "<arg type='i' name='sec_dev_type' direction='out'/>"
326 "<arg type='i' name='error_code' direction='out'/>"
328 "<method name='GetPeerRssi'>"
329 "<arg type='s' name='peer_mac_addr' direction='in'/>"
330 "<arg type='i' name='error_code' direction='out'/>"
331 "<arg type='i' name='rssi' direction='out'/>"
333 "<method name='AddVsie'>"
334 "<arg type='i' name='frame_id' direction='in'/>"
335 "<arg type='s' name='vsie' direction='in'/>"
336 "<arg type='i' name='error_code' direction='out'/>"
338 "<method name='GetVsie'>"
339 "<arg type='i' name='frame_id' direction='in'/>"
340 "<arg type='i' name='error_code' direction='out'/>"
341 "<arg type='s' name='vsie' direction='out'/>"
343 "<method name='RemoveVsie'>"
344 "<arg type='i' name='frame_id' direction='in'/>"
345 "<arg type='s' name='vsie' direction='in'/>"
346 "<arg type='i' name='error_code' direction='out'/>"
349 "<interface name='net.wifidirect.service'>"
350 "<method name='StartDiscovery'>"
351 "<arg type='i' name='service_type' direction='in'/>"
352 "<arg type='s' name='mac_addr' direction='in'/>"
353 "<arg type='i' name='error_code' direction='out'/>"
355 "<method name='StopDiscovery'>"
356 "<arg type='i' name='service_type' direction='in'/>"
357 "<arg type='s' name='mac_addr' direction='in'/>"
358 "<arg type='i' name='error_code' direction='out'/>"
360 "<method name='Register'>"
361 "<arg type='i' name='service_type' direction='in'/>"
362 "<arg type='s' name='info_string' direction='in'/>"
363 "<arg type='i' name='error_code' direction='out'/>"
364 "<arg type='i' name='service_id' direction='out'/>"
366 "<method name='Deregister'>"
367 "<arg type='i' name='service_id' direction='in'/>"
368 "<arg type='i' name='error_code' direction='out'/>"
370 "<signal name='DiscoveryStarted'>"
372 "<signal name='DiscoveryFound'>"
373 "<arg type='i' name='service_type'/>"
374 "<arg type='s' name='response_data'/>"
375 "<arg type='s' name='peer_mac_address'/>"
377 "<signal name='DiscoveryFinished'>"
380 "<interface name='net.wifidirect.display'>"
381 "<method name='Init'>"
382 "<arg type='i' name='error_code' direction='out'/>"
384 "<method name='Deinit'>"
385 "<arg type='i' name='error_code' direction='out'/>"
387 "<method name='SetConfig'>"
388 "<arg type='i' name='type' direction='in'/>"
389 "<arg type='i' name='port' direction='in'/>"
390 "<arg type='i' name='hdcp' direction='in'/>"
391 "<arg type='i' name='error_code' direction='out'/>"
393 "<method name='SetAvailiability'>"
394 "<arg type='i' name='availability' direction='in'/>"
395 "<arg type='i' name='error_code' direction='out'/>"
397 "<method name='GetPeerType'>"
398 "<arg type='s' name='peer_mac_addr' direction='in'/>"
399 "<arg type='i' name='error_code' direction='out'/>"
400 "<arg type='i' name='result' direction='out'/>"
402 "<method name='GetPeerAvailability'>"
403 "<arg type='s' name='peer_mac_addr' direction='in'/>"
404 "<arg type='i' name='error_code' direction='out'/>"
405 "<arg type='i' name='result' direction='out'/>"
407 "<method name='GetPeerHdcp'>"
408 "<arg type='s' name='peer_mac_addr' direction='in'/>"
409 "<arg type='i' name='error_code' direction='out'/>"
410 "<arg type='i' name='result' direction='out'/>"
412 "<method name='GetPeerPort'>"
413 "<arg type='s' name='peer_mac_addr' direction='in'/>"
414 "<arg type='i' name='error_code' direction='out'/>"
415 "<arg type='i' name='result' direction='out'/>"
417 "<method name='GetPeerThroughput'>"
418 "<arg type='s' name='peer_mac_addr' direction='in'/>"
419 "<arg type='i' name='error_code' direction='out'/>"
420 "<arg type='i' name='result' direction='out'/>"
423 "<interface name='net.wifidirect.asp'>"
424 "<method name='AdvertiseService'>"
425 "<arg type='a{sv}' name='parameters' direction='in'/>"
426 "<arg type='i' name='result' direction='out'/>"
428 "<method name='CancelAdvertiseService'>"
429 "<arg type='u' name='adv_id' direction='in'/>"
430 "<arg type='i' name='result' direction='out'/>"
432 "<method name='SeekService'>"
433 "<arg type='a{sv}' name='parameters' direction='in'/>"
434 "<arg type='i' name='result' direction='out'/>"
436 "<method name='CancelSeekService'>"
437 "<arg type='t' name='search_id' direction='in'/>"
438 "<arg type='i' name='result' direction='out'/>"
440 "<method name='ConnectSession'>"
441 "<arg type='a{sv}' name='parameters' direction='in'/>"
442 "<arg type='i' name='result' direction='out'/>"
444 "<method name='ConfirmSession'>"
445 "<arg type='a{sv}' name='parameters' direction='in'/>"
446 "<arg type='i' name='result' direction='out'/>"
448 "<signal name='SearchResult'>"
449 "<arg type='a{sv}' name='parameters'/>"
451 "<signal name='SessionRequest'>"
452 "<arg type='a{sv}' name='parameters'/>"
454 "<signal name='SessionConfigRequest'>"
455 "<arg type='a{sv}' name='parameters'/>"
457 "<signal name='ConnectStatus'>"
458 "<arg type='a{sv}' name='parameters'/>"
460 "<signal name='SessionStatus'>"
461 "<arg type='a{sv}' name='parameters'/>"
463 "<signal name='SessionPeerIPAssigned'>"
464 "<arg type='a{sv}' name='parameters'/>"
470 static bool __is_discovery_available(wfd_manager_s *manager)
472 return manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
473 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
474 manager->state != WIFI_DIRECT_STATE_GROUP_OWNER;
477 static void __wfd_manager_manage_iface_handler(const gchar *method_name,
478 GVariant *parameters,
479 GDBusMethodInvocation *invocation)
481 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
482 wfd_manager_s *manager = wfd_get_manager();
483 GVariant *return_parameters = NULL;
485 gchar* dbus_error_name = NULL;
486 WDS_LOGD("%s", method_name);
488 if (!g_strcmp0(method_name, "Activate")) {
490 WFD_DBUS_REPLY_ERROR_NONE(invocation);
492 ret = wfd_manager_activate(manager);
493 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
495 g_variant_new("(i)", ret));
497 } else if (!g_strcmp0(method_name, "AddClient")) {
498 return_parameters = g_variant_new("(i)", WIFI_DIRECT_ERROR_NONE);
500 } else if (!g_strcmp0(method_name, "Deactivate")) {
502 ret = wfd_util_check_p2p_hotspot_state();
504 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
508 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
509 WDS_LOGE("Already deactivated");
510 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
514 WFD_DBUS_REPLY_ERROR_NONE(invocation);
516 ret = wfd_manager_deactivate(manager);
517 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
519 g_variant_new("(i)", ret));
522 } else if (!g_strcmp0(method_name, "StartDiscovery")) {
523 gboolean mode = FALSE;
526 gint32 frequency = 0;
527 const gchar *type = NULL;
528 GVariantIter *iter = NULL;
530 GVariant *var = NULL;
532 g_variant_get(parameters, "(a{sv})", &iter);
534 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
538 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
539 if (!g_strcmp0(key, "Mode"))
540 g_variant_get(var, "b", &mode);
541 else if (!g_strcmp0(key, "Timeout"))
542 g_variant_get(var, "i", &timeout);
543 else if (!g_strcmp0(key, "Type"))
544 g_variant_get(var, "&s", &type);
545 else if (!g_strcmp0(key, "Channel"))
546 g_variant_get(var, "i", &channel);
547 else if (!g_strcmp0(key, "Frequency"))
548 g_variant_get(var, "i", &frequency);
552 g_variant_iter_free(iter);
554 if (__is_discovery_available(manager)) {
555 WDS_LOGE("Wi-Fi Direct is not available status for scanning.");
556 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
560 if (mode && (manager->local->dev_role == WFD_DEV_ROLE_GO)) {
561 WDS_LOGW("Wi-Fi Direct device is already visible, do not start listen");
562 ret = WIFI_DIRECT_ERROR_NONE;
563 return_parameters = g_variant_new("(i)", ret);
567 WFD_DBUS_REPLY_ERROR_NONE(invocation);
569 ret = wfd_manager_start_discovery(manager, mode, timeout, type,
571 if (ret == WIFI_DIRECT_ERROR_NONE) {
572 if (mode == WFD_OEM_SCAN_MODE_PASSIVE) {
573 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
577 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
584 } else if (!g_strcmp0(method_name, "StopDiscovery")) {
585 int mode = manager->scan_mode;
586 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
587 manager->state != WIFI_DIRECT_STATE_DISCOVERING) {
588 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
592 WFD_DBUS_REPLY_ERROR_NONE(invocation);
594 ret = wfd_manager_cancel_discovery(manager);
595 if (ret == WIFI_DIRECT_ERROR_NONE && mode == WFD_SCAN_MODE_PASSIVE)
596 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
597 "DiscoveryFinished", NULL);
600 } else if (!g_strcmp0(method_name, "GetDiscoveredPeers")) {
601 wfd_discovery_entry_s *peers = NULL;
602 GVariantBuilder *builder_peers = NULL;
606 builder_peers = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
608 peer_cnt = wfd_manager_get_peers(manager, &peers);
609 WDS_LOGD("Peer count [%d], Peer list [%p]", peer_cnt, peers);
611 WDS_LOGE("Failed to get scan result");
612 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
619 for (i = 0; i < peer_cnt; i++) {
620 GVariantBuilder builder_peer;
621 g_variant_builder_init(&builder_peer, G_VARIANT_TYPE("a{sv}"));
623 g_variant_builder_add(&builder_peer, "{sv}",
625 g_variant_new_string(peers[i].device_name));
626 g_variant_builder_add(&builder_peer, "{sv}",
628 wfd_manager_dbus_pack_ay(peers[i].mac_address, MACADDR_LEN));
629 g_variant_builder_add(&builder_peer, "{sv}",
631 wfd_manager_dbus_pack_ay(peers[i].intf_address, MACADDR_LEN));
632 g_variant_builder_add(&builder_peer, "{sv}",
634 g_variant_new_uint16(peers[i].channel));
636 if (manager->is_service_discovery_supported) {
637 g_variant_builder_add(&builder_peer, "{sv}",
639 g_variant_new_uint16(peers[i].services));
641 g_variant_builder_add(&builder_peer, "{sv}",
643 g_variant_new_boolean(peers[i].is_group_owner));
644 g_variant_builder_add(&builder_peer, "{sv}",
646 g_variant_new_boolean(peers[i].is_persistent_go));
647 g_variant_builder_add(&builder_peer, "{sv}",
649 g_variant_new_boolean(peers[i].is_connected));
650 g_variant_builder_add(&builder_peer, "{sv}",
652 g_variant_new_uint16(peers[i].wps_device_pwd_id));
653 g_variant_builder_add(&builder_peer, "{sv}",
655 g_variant_new_uint16(peers[i].wps_cfg_methods));
656 g_variant_builder_add(&builder_peer, "{sv}",
658 g_variant_new_uint16(peers[i].category));
659 g_variant_builder_add(&builder_peer, "{sv}",
661 g_variant_new_uint16(peers[i].subcategory));
663 if (manager->is_wifi_display_supported)
664 g_variant_builder_add(&builder_peer, "{sv}",
666 g_variant_new_boolean(peers[i].is_wfd_device));
668 WDS_LOGD("%dth peer [%s]", i, peers[i].device_name);
669 g_variant_builder_add_value(builder_peers, g_variant_builder_end(&builder_peer));
672 ret = WIFI_DIRECT_ERROR_NONE;
673 return_parameters = g_variant_new("(iaa{sv})", ret, builder_peers);
674 g_variant_builder_unref(builder_peers);
677 } else if (!g_strcmp0(method_name, "Connect")) {
678 const char *peer_mac_address = NULL;
679 unsigned char mac_addr[MACADDR_LEN] = {0, };
681 if (__is_discovery_available(manager)) {
682 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
686 wfd_group_s *group = (wfd_group_s*) manager->group;
687 if (group && group->member_count >= manager->max_station) {
688 ret = WIFI_DIRECT_ERROR_TOO_MANY_CLIENT;
692 g_variant_get(parameters, "(&s)", &peer_mac_address);
693 if (peer_mac_address == NULL) {
694 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
698 WFD_DBUS_REPLY_ERROR_NONE(invocation);
700 macaddr_atoe(peer_mac_address, mac_addr);
701 ret = wfd_manager_connect(manager, mac_addr);
702 if (ret == WIFI_DIRECT_ERROR_NONE)
703 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
705 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
706 WFD_EVENT_CONNECTION_IN_PROGRESS,
710 } else if (!g_strcmp0(method_name, "Disconnect")) {
711 const char *peer_mac_address = NULL;
712 unsigned char mac_addr[MACADDR_LEN] = {0, };
714 if (!manager->group || manager->state < WIFI_DIRECT_STATE_CONNECTED) {
715 if (WIFI_DIRECT_STATE_DISCOVERING == manager->state) {
716 ret = wfd_oem_stop_scan(manager->oem_ops);
718 WDS_LOGE("Failed to stop scan");
719 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
722 WDS_LOGI("Succeeded to stop scan");
723 if (WFD_DEV_ROLE_GO == manager->local->dev_role) {
724 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
725 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
727 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
728 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
731 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
736 g_variant_get(parameters, "(&s)", &peer_mac_address);
737 if (peer_mac_address == NULL) {
738 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
742 WFD_DBUS_REPLY_ERROR_NONE(invocation);
744 macaddr_atoe(peer_mac_address, mac_addr);
745 ret = wfd_manager_disconnect(manager, mac_addr);
746 if (ret == WIFI_DIRECT_ERROR_NONE)
747 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
749 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
750 WFD_EVENT_DISCONNECTION_RSP,
754 } else if (!g_strcmp0(method_name, "CancelConnection")) {
755 const char *peer_mac_address = NULL;
756 unsigned char mac_addr[MACADDR_LEN] = {0, };
758 if (!manager->session && manager->state != WIFI_DIRECT_STATE_CONNECTING) {
759 WDS_LOGE("It's not CONNECTING state");
760 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
764 g_variant_get(parameters, "(&s)", &peer_mac_address);
765 if (peer_mac_address == NULL) {
766 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
770 WFD_DBUS_REPLY_ERROR_NONE(invocation);
772 macaddr_atoe(peer_mac_address, mac_addr);
773 ret = wfd_manager_cancel_connection(manager, mac_addr);
774 if (ret == WIFI_DIRECT_ERROR_NONE)
775 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
777 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_CANCELED,
778 WFD_EVENT_CONNECTION_RSP,
782 } else if (!g_strcmp0(method_name, "AcceptConnection")) {
783 const char *peer_mac_address = NULL;
784 unsigned char mac_addr[MACADDR_LEN] = {0, };
786 if (manager->state != WIFI_DIRECT_STATE_CONNECTING) {
787 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
791 wfd_group_s *group = (wfd_group_s*) manager->group;
792 if (group && group->member_count >= manager->max_station) {
793 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
797 g_variant_get(parameters, "(&s)", &peer_mac_address);
798 if (peer_mac_address == NULL) {
799 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
803 WFD_DBUS_REPLY_ERROR_NONE(invocation);
805 macaddr_atoe(peer_mac_address, mac_addr);
806 ret = wfd_manager_accept_connection(manager, mac_addr);
807 if (ret == WIFI_DIRECT_ERROR_NONE) {
808 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
810 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
811 WFD_EVENT_CONNECTION_IN_PROGRESS,
814 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
816 g_variant_new("(iis)", WIFI_DIRECT_ERROR_OPERATION_FAILED,
817 WFD_EVENT_CONNECTION_RSP,
822 } else if (!g_strcmp0(method_name, "RejectConnection")) {
823 wfd_session_s *session = manager->session;
824 const char *peer_mac_address = NULL;
825 unsigned char mac_addr[MACADDR_LEN] = {0, };
827 if (!session || manager->state != WIFI_DIRECT_STATE_CONNECTING) {
828 WDS_LOGE("It's not permitted with this state [%d]", manager->state);
829 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
833 if (session->direction != SESSION_DIRECTION_INCOMING) {
834 WDS_LOGE("Only incomming session can be rejected");
835 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
839 g_variant_get(parameters, "(&s)", &peer_mac_address);
840 if (peer_mac_address == NULL) {
841 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
845 WFD_DBUS_REPLY_ERROR_NONE(invocation);
847 macaddr_atoe(peer_mac_address, mac_addr);
848 ret = wfd_manager_reject_connection(manager, mac_addr);
849 if (ret == WIFI_DIRECT_ERROR_NONE)
850 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
852 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_CANCELED,
853 WFD_EVENT_CONNECTION_RSP,
857 } else if (!g_strcmp0(method_name, "DisconnectAll")) {
859 if (!manager->group || manager->state < WIFI_DIRECT_STATE_CONNECTED) {
860 if (WIFI_DIRECT_STATE_DISCOVERING == manager->state) {
861 ret = wfd_oem_stop_scan(manager->oem_ops);
863 WDS_LOGE("Failed to stop scan");
864 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
867 WDS_LOGI("Succeeded to stop scan");
868 if (WFD_DEV_ROLE_GO == manager->local->dev_role) {
869 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
870 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
872 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
873 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
876 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
881 WFD_DBUS_REPLY_ERROR_NONE(invocation);
883 ret = wfd_manager_disconnect_all(manager);
884 if (ret == WIFI_DIRECT_ERROR_NONE)
885 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
887 g_variant_new("(iis)", ret,
888 WFD_EVENT_DISCONNECTION_RSP,
892 } else if (!g_strcmp0(method_name, "GetConnectedPeers")) {
893 wfd_connected_peer_info_s *peers = NULL;
894 GVariantBuilder *builder_peers = NULL;
898 /* even though status is not CONNECTED,
899 * this command can be excuted only when group exist */
900 if (!manager->group && manager->state < WIFI_DIRECT_STATE_CONNECTED) {
901 WDS_LOGD("It's not connected state [%d]", manager->state);
902 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
906 peer_cnt = wfd_manager_get_connected_peers(manager, &peers);
907 WDS_LOGD("Peer count [%d], Peer list [%x]", peer_cnt, peers);
909 WDS_LOGE("Failed to get scan result");
910 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
914 builder_peers = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
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);
964 } else if (!g_strcmp0(method_name, "GetConnectingPeer")) {
965 wfd_session_s *session;
966 wfd_device_s *peer = NULL;
967 wfd_discovery_entry_s *connecting_peer = NULL;
968 GVariantBuilder *builder_peer = NULL;
970 if (!manager->session ||
971 manager->state != WIFI_DIRECT_STATE_CONNECTING) {
972 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
976 session = manager->session;
977 if (!session->peer) {
978 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
981 peer = session->peer;
983 connecting_peer = (wfd_discovery_entry_s *)
984 g_try_malloc0(sizeof(wfd_discovery_entry_s));
985 if (!connecting_peer) {
986 WDS_LOGF("Failed to allocate memory for peer data.");
987 ret = WIFI_DIRECT_ERROR_OUT_OF_MEMORY;
991 builder_peer = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
993 g_variant_builder_add(builder_peer, "{sv}",
995 g_variant_new_string(peer->dev_name));
996 g_variant_builder_add(builder_peer, "{sv}",
998 wfd_manager_dbus_pack_ay(peer->dev_addr,
1000 g_variant_builder_add(builder_peer, "{sv}",
1002 wfd_manager_dbus_pack_ay(peer->intf_addr,
1004 g_variant_builder_add(builder_peer, "{sv}",
1006 g_variant_new_uint16(peer->channel));
1007 g_variant_builder_add(builder_peer, "{sv}",
1009 g_variant_new_boolean(peer->dev_role == WFD_DEV_ROLE_GC));
1010 g_variant_builder_add(builder_peer, "{sv}",
1012 g_variant_new_boolean(peer->dev_role == WFD_OEM_DEV_ROLE_GO));
1013 g_variant_builder_add(builder_peer, "{sv}",
1015 g_variant_new_boolean(peer->group_flags & WFD_OEM_GROUP_FLAG_PERSISTENT_GROUP));
1016 g_variant_builder_add(builder_peer, "{sv}",
1018 g_variant_new_uint16(peer->pri_dev_type));
1019 g_variant_builder_add(builder_peer, "{sv}",
1021 g_variant_new_uint16(peer->sec_dev_type));
1022 g_variant_builder_add(builder_peer, "{sv}",
1024 g_variant_new_uint16(peer->config_methods));
1026 if (manager->is_wifi_display_supported)
1027 g_variant_builder_add(builder_peer, "{sv}",
1029 g_variant_new_boolean(false));
1031 ret = WIFI_DIRECT_ERROR_NONE;
1032 return_parameters = g_variant_new("(ia{sv})", ret,
1034 g_variant_builder_unref(builder_peer);
1035 g_free(connecting_peer);
1038 } else if (!g_strcmp0(method_name, "IsDiscoverable")) {
1039 ret = WIFI_DIRECT_ERROR_NONE;
1040 return_parameters = g_variant_new("(b)",
1041 (manager->state == WIFI_DIRECT_STATE_DISCOVERING ||
1042 wfd_group_is_autonomous(manager->group) == TRUE));
1045 } else if (!g_strcmp0(method_name, "IsListeningOnly")) {
1046 ret = WIFI_DIRECT_ERROR_NONE;
1047 return_parameters = g_variant_new("(b)", (manager->scan_mode == WFD_SCAN_MODE_PASSIVE));
1050 } else if (!g_strcmp0(method_name, "GetPeerInfo")) {
1051 wfd_discovery_entry_s *peer = NULL;
1052 GVariantBuilder *builder_peer = NULL;
1053 const char *peer_mac_address = NULL;
1054 unsigned char mac_addr[MACADDR_LEN] = {0, };
1056 g_variant_get(parameters, "(&s)", &peer_mac_address);
1057 if (peer_mac_address == NULL) {
1058 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1062 macaddr_atoe(peer_mac_address, mac_addr);
1063 ret = wfd_manager_get_peer_info(manager, mac_addr, &peer);
1064 if (ret < 0 || !peer) {
1065 WDS_LOGE("Failed to get peer info");
1067 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1071 builder_peer = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
1072 g_variant_builder_add(builder_peer, "{sv}",
1074 g_variant_new_string(peer->device_name));
1075 g_variant_builder_add(builder_peer, "{sv}",
1077 wfd_manager_dbus_pack_ay(peer->mac_address, MACADDR_LEN));
1078 g_variant_builder_add(builder_peer, "{sv}",
1080 wfd_manager_dbus_pack_ay(peer->intf_address, MACADDR_LEN));
1081 g_variant_builder_add(builder_peer, "{sv}",
1083 g_variant_new_uint16(peer->channel));
1084 if (manager->is_service_discovery_supported) {
1085 g_variant_builder_add(builder_peer, "{sv}",
1087 g_variant_new_uint16(peer->services));
1089 g_variant_builder_add(builder_peer, "{sv}",
1091 g_variant_new_boolean(peer->is_group_owner));
1092 g_variant_builder_add(builder_peer, "{sv}",
1094 g_variant_new_boolean(peer->is_persistent_go));
1095 g_variant_builder_add(builder_peer, "{sv}",
1097 g_variant_new_boolean(peer->is_connected));
1098 g_variant_builder_add(builder_peer, "{sv}",
1100 g_variant_new_uint16(peer->wps_device_pwd_id));
1101 g_variant_builder_add(builder_peer, "{sv}",
1103 g_variant_new_uint16(peer->wps_cfg_methods));
1104 g_variant_builder_add(builder_peer, "{sv}",
1106 g_variant_new_uint16(peer->category));
1107 g_variant_builder_add(builder_peer, "{sv}",
1109 g_variant_new_uint16(peer->subcategory));
1111 if (manager->is_wifi_display_supported)
1112 g_variant_builder_add(builder_peer, "{sv}",
1114 g_variant_new_boolean(peer->is_wfd_device));
1116 wfd_device_s *connected_peer = NULL;
1117 connected_peer = wfd_group_find_member_by_addr(manager->group, mac_addr);
1118 if (connected_peer) {
1119 g_variant_builder_add(builder_peer, "{sv}",
1121 g_variant_new_boolean(true));
1122 g_variant_builder_add(builder_peer, "{sv}",
1124 wfd_manager_dbus_pack_ay(connected_peer->ip_addr, IPADDR_LEN));
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;
1175 wfd_oem_config_s *oem_conf = (wfd_oem_config_s *) manager->wfd_oem_conf;
1176 GVariantIter *iter = NULL;
1178 GVariant *var = NULL;
1179 const char *ssid = NULL;
1181 g_variant_get(parameters, "(a{sv})", &iter);
1183 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1187 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
1188 if (!g_strcmp0(key, "ssid")) {
1189 g_variant_get(var, "&s", &ssid);
1191 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1192 g_variant_iter_free(iter);
1195 WDS_LOGD("SSID received [%s]", ssid);
1199 if (group || manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1200 WDS_LOGE("Group already exist or not a proper state");
1201 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1202 g_variant_iter_free(iter);
1206 group = wfd_create_pending_group(manager, manager->local->intf_addr);
1208 WDS_LOGE("Failed to create pending group");
1209 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1210 g_variant_iter_free(iter);
1213 group->flags |= WFD_GROUP_FLAG_AUTONOMOUS;
1214 manager->group = group;
1216 memset(¶m, 0x0, sizeof(param));
1218 param.persistent = (manager->local->group_flags &
1219 WFD_GROUP_FLAG_PERSISTENT);
1220 memcpy(&(param.passphrase), manager->local->passphrase,
1221 sizeof(param.passphrase));
1223 if (oem_conf && oem_conf->group_operating_freq != 0)
1224 param.freq = oem_conf->group_operating_freq;
1227 g_strlcpy(param.ssid, ssid, WIFI_DIRECT_MAX_DEVICE_NAME_LEN+1);
1229 g_variant_iter_free(iter);
1231 ret = wfd_oem_create_group(manager->oem_ops, ¶m);
1233 WDS_LOGE("Failed to create group");
1234 wfd_destroy_group(manager);
1235 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1239 WDS_LOGD("Succeeded to create pending group");
1240 memset(manager->local->passphrase, 0x0, PASSPHRASE_LEN_MAX + 1);
1241 ret = WIFI_DIRECT_ERROR_NONE;
1242 return_parameters = g_variant_new("(i)", ret);
1245 } else if (!g_strcmp0(method_name, "DestroyGroup")) {
1246 wfd_group_s *group = manager->group;
1248 WDS_LOGE("Group not exist");
1249 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1253 ret = wfd_util_check_p2p_hotspot_state();
1255 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1259 if (group->pending == FALSE) {
1260 ret = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1262 WDS_LOGE("Failed to destroy group");
1263 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1268 ret = wfd_destroy_group(manager);
1270 WDS_LOGE("Failed to destroy group");
1272 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1273 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1275 WFD_DBUS_REPLY_ERROR_NONE(invocation);
1277 wfd_manager_dbus_emit_signal(WFD_MANAGER_GROUP_INTERFACE,
1281 } else if (!g_strcmp0(method_name, "IsGroupOwner")) {
1283 wfd_device_s *local = manager->local;
1284 result = local->dev_role == WFD_DEV_ROLE_GO;
1285 WDS_LOGI("Is group owner : [%s]", result ? "Yes" : "No");
1286 return_parameters = g_variant_new("(b)", result);
1289 } else if (!g_strcmp0(method_name, "IsAutoGroup")) {
1291 if ((result = wfd_group_is_autonomous(manager->group)) < 0)
1294 WDS_LOGI("Is autonomous group : [%s]", result ? "Yes" : "No");
1295 return_parameters = g_variant_new("(b)", result);
1298 } else if (!g_strcmp0(method_name, "ActivatePushButton")) {
1299 if (manager->local->dev_role != WFD_DEV_ROLE_GO) {
1300 WDS_LOGE("Wi-Fi Direct is not Group Owner.");
1301 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1305 ret = wfd_oem_wps_start(manager->oem_ops, NULL,
1306 WFD_WPS_MODE_PBC, NULL);
1308 WDS_LOGE("Failed to start wps");
1309 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1312 return_parameters = g_variant_new("(i)", ret);
1315 } else if (!g_strcmp0(method_name, "GetPersistentGroups")) {
1316 int persistent_group_count = 0;
1317 wfd_persistent_group_info_s *plist;
1318 GVariantBuilder *builder_groups = NULL;
1321 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1322 WDS_LOGE("Wi-Fi Direct is not activated.");
1323 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1328 ret = wfd_oem_get_persistent_groups(manager->oem_ops,
1329 (wfd_oem_persistent_group_s**) &plist, &persistent_group_count);
1331 WDS_LOGE("Error!! wfd_oem_get_persistent_group_info() failed..");
1332 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1336 builder_groups = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
1338 for (i = 0; i < persistent_group_count; i++) {
1339 GVariantBuilder builder_group;
1340 g_variant_builder_init(&builder_group, G_VARIANT_TYPE("a{sv}"));
1342 g_variant_builder_add(&builder_group, "{sv}",
1344 g_variant_new_uint32(plist[i].network_id));
1345 g_variant_builder_add(&builder_group, "{sv}",
1347 g_variant_new_string(plist[i].ssid));
1348 g_variant_builder_add(&builder_group, "{sv}",
1350 wfd_manager_dbus_pack_ay(plist[i].go_mac_address, MACADDR_LEN));
1352 WDS_LOGD("%dth peer [%s]", i, plist[i].ssid);
1353 g_variant_builder_add_value(builder_groups, g_variant_builder_end(&builder_group));
1356 ret = WIFI_DIRECT_ERROR_NONE;
1357 return_parameters = g_variant_new("(iaa{sv})", ret, builder_groups);
1358 g_variant_builder_unref(builder_groups);
1361 } else if (!g_strcmp0(method_name, "RemovePersistentGroup")) {
1364 unsigned char go_mac_address[6];
1365 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1366 WDS_LOGE("Wi-Fi Direct is not activated.");
1367 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1371 g_variant_get(parameters, "(&s&s)", &mac_address, &ssid);
1372 if (mac_address == NULL || ssid == NULL) {
1373 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1377 macaddr_atoe(mac_address, go_mac_address);
1378 WDS_LOGD("Remove persistent group [%s][" MACSTR "]", ssid, MAC2STR(go_mac_address));
1380 ret = wfd_oem_remove_persistent_group(manager->oem_ops, ssid,
1383 WDS_LOGE("Failed to remove persistent group");
1384 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1387 return_parameters = g_variant_new("(i)", ret);
1390 } else if (!g_strcmp0(method_name, "SetPassphrase")) {
1392 int passphrase_len = 0;
1393 wfd_group_s *group = manager->group;
1396 WDS_LOGE("Group already exists");
1397 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1401 g_variant_get(parameters, "(&s)", &passphrase);
1402 if (passphrase == NULL) {
1403 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1407 passphrase_len = strlen(passphrase);
1409 if (passphrase_len < PASSPHRASE_LEN_MIN ||
1410 passphrase_len > PASSPHRASE_LEN_MAX) {
1411 WDS_LOGE("Passphrase length incorrect [%s]:[%d]",
1412 passphrase, passphrase_len);
1413 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1417 g_strlcpy(manager->local->passphrase, passphrase, PASSPHRASE_LEN_MAX + 1);
1418 WDS_LOGI("Passphrase string [%s]", manager->local->passphrase);
1420 ret = WIFI_DIRECT_ERROR_NONE;
1421 return_parameters = g_variant_new("(i)", ret);
1424 } else if (!g_strcmp0(method_name, "GetPassphrase")) {
1425 wfd_group_s *group = manager->group;
1427 WDS_LOGE("Group not exist");
1428 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1432 if (group->role == WFD_DEV_ROLE_GC) {
1433 WDS_LOGE("Device is not GO");
1434 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1438 ret = WIFI_DIRECT_ERROR_NONE;
1439 return_parameters = g_variant_new("(is)", ret, group->passphrase);
1440 WDS_LOGI("group->pass : [%s]", group->passphrase);
1444 } else if (!g_strcmp0(method_name, "SetPersistentGroupEnabled")) {
1447 g_variant_get(parameters, "(b)", &enabled);
1448 WDS_LOGI("Activate Persistent Group : [%s]",
1449 enabled ? "True" : "False");
1451 manager->local->group_flags |= WFD_GROUP_FLAG_PERSISTENT;
1453 manager->local->group_flags &= ~(WFD_GROUP_FLAG_PERSISTENT);
1454 ret = WIFI_DIRECT_ERROR_NONE;
1455 return_parameters = g_variant_new("(i)", ret);
1458 } else if (!g_strcmp0(method_name, "IsPersistentGroupEnabled")) {
1460 result = ((manager->local->group_flags &
1461 WFD_GROUP_FLAG_PERSISTENT)
1462 == WFD_GROUP_FLAG_PERSISTENT);
1463 WDS_LOGI("Is persistent group : [%s]", result ? "Yes" : "No");
1464 return_parameters = g_variant_new("(b)", result);
1468 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1473 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
1477 wfd_error_set_gerror(ret, &err);
1478 g_dbus_method_invocation_return_gerror(invocation, err);
1479 g_clear_error(&err);
1483 static void __wfd_manager_config_iface_handler(const gchar *method_name,
1484 GVariant *parameters,
1485 GDBusMethodInvocation *invocation)
1487 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1488 wfd_manager_s *manager = wfd_get_manager();
1489 GVariant *return_parameters = NULL;
1491 WDS_LOGD("%s", method_name);
1493 if (!g_strcmp0(method_name, "GetDeviceName")) {
1494 char device_name[WIFI_DIRECT_MAX_DEVICE_NAME_LEN+1] = {0, };
1496 ret = wfd_local_get_dev_name(device_name);
1498 WDS_LOGE("Failed to get device name");
1499 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1503 ret = WIFI_DIRECT_ERROR_NONE;
1504 return_parameters = g_variant_new("(is)", ret, device_name);
1508 } else if (!g_strcmp0(method_name, "SetDeviceName")) {
1509 const char *device_name = NULL;
1510 g_variant_get(parameters, "(&s)", &device_name);
1511 if (device_name == NULL) {
1512 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1516 ret = wfd_local_set_dev_name((char *)device_name);
1518 WDS_LOGE("Failed to set device name");
1519 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1523 ret = WIFI_DIRECT_ERROR_NONE;
1524 return_parameters = g_variant_new("(i)", ret);
1527 } else if (!g_strcmp0(method_name, "GetWpsPin")) {
1528 wfd_session_s *session = (wfd_session_s*) manager->session;
1529 if (!session || manager->auto_pin[0] != 0) {
1530 WDS_LOGE("Session not exist");
1531 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1535 if (session->wps_pin[0] == '\0') {
1536 WDS_LOGE("WPS PIN is not set");
1537 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1541 ret = WIFI_DIRECT_ERROR_NONE;
1542 return_parameters = g_variant_new("(is)", ret, session->wps_pin);
1545 } else if (!g_strcmp0(method_name, "SetWpsPin")) {
1546 const char *pin = NULL;
1547 wfd_session_s *session = (wfd_session_s*) manager->session;
1549 g_variant_get(parameters, "(&s)", &pin);
1551 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1556 WDS_LOGE("Session not exist");
1557 g_strlcpy(manager->auto_pin, pin, strlen(pin) + 1);
1559 g_strlcpy(session->wps_pin, pin, strlen(pin) + 1);
1562 ret = WIFI_DIRECT_ERROR_NONE;
1563 return_parameters = g_variant_new("(i)", ret);
1566 } else if (!g_strcmp0(method_name, "GetSupportedWpsMode")) {
1567 int config_methods = 0;
1569 ret = wfd_local_get_supported_wps_mode(&config_methods);
1571 WDS_LOGE("Failed to get supported wps mode");
1572 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1576 ret = WIFI_DIRECT_ERROR_NONE;
1577 return_parameters = g_variant_new("(ii)", ret, config_methods);
1580 } else if (!g_strcmp0(method_name, "GetReqWpsMode")) {
1583 ret = wfd_manager_get_req_wps_mode(&wps_mode);
1585 WDS_LOGE("Failed to get request wps mode");
1586 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1590 ret = WIFI_DIRECT_ERROR_NONE;
1591 return_parameters = g_variant_new("(ii)", ret, wps_mode);
1594 } else if (!g_strcmp0(method_name, "SetReqWpsMode")) {
1597 g_variant_get(parameters, "(i)", &type);
1598 ret = wfd_manager_set_req_wps_mode(type);
1600 WDS_LOGE("Failed to set request wps mode");
1601 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1605 ret = WIFI_DIRECT_ERROR_NONE;
1606 return_parameters = g_variant_new("(i)", ret);
1609 } else if (!g_strcmp0(method_name, "GetLocalWpsMode")) {
1612 ret = wfd_local_get_wps_mode(&wps_mode);
1614 WDS_LOGE("Failed to get request wps mode");
1615 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1619 ret = WIFI_DIRECT_ERROR_NONE;
1620 return_parameters = g_variant_new("(ii)", ret, wps_mode);
1623 } else if (!g_strcmp0(method_name, "GetIPAddress")) {
1624 char ip_addr_str[IPSTR_LEN+1] = {0, };
1626 if (manager->state < WIFI_DIRECT_STATE_CONNECTED) {
1627 WDS_LOGE("Device is not connected yet");
1628 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1632 ret = wfd_local_get_ip_addr((char *)ip_addr_str);
1634 WDS_LOGE("Failed to get local IP address");
1635 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1639 return_parameters = g_variant_new("(is)", ret, ip_addr_str);
1640 WDS_LOGI("IP addr : [%s]", ip_addr_str);
1643 } else if (!g_strcmp0(method_name, "GetMacAddress")) {
1644 char device_mac[MACSTR_LEN+1] = {0, };
1646 ret = wfd_local_get_dev_mac(device_mac);
1648 WDS_LOGE("Failed to get device mac");
1649 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1653 ret = WIFI_DIRECT_ERROR_NONE;
1654 return_parameters = g_variant_new("(is)", ret, device_mac);
1657 } else if (!g_strcmp0(method_name, "GetGoIntent")) {
1660 ret = wfd_manager_get_go_intent(&go_intent);
1662 WDS_LOGE("Failed to get GO intent");
1663 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1667 ret = WIFI_DIRECT_ERROR_NONE;
1668 return_parameters = g_variant_new("(ii)", ret, go_intent);
1671 } else if (!g_strcmp0(method_name, "SetGoIntent")) {
1674 g_variant_get(parameters, "(i)", &go_intent);
1675 ret = wfd_manager_set_go_intent(go_intent);
1677 WDS_LOGE("Failed to set GO intent");
1678 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1682 ret = WIFI_DIRECT_ERROR_NONE;
1683 return_parameters = g_variant_new("(i)", ret);
1686 } else if (!g_strcmp0(method_name, "GetMaxClient")) {
1689 ret = wfd_manager_get_max_station(&max_client);
1691 WDS_LOGE("Failed to get max station");
1692 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1696 ret = WIFI_DIRECT_ERROR_NONE;
1697 return_parameters = g_variant_new("(ii)", ret, max_client);
1700 } else if (!g_strcmp0(method_name, "SetMaxClient")) {
1702 g_variant_get(parameters, "(i)", &max_client);
1704 ret = wfd_manager_set_max_station(max_client);
1706 WDS_LOGE("Failed to set max station");
1707 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1711 ret = WIFI_DIRECT_ERROR_NONE;
1712 return_parameters = g_variant_new("(i)", ret);
1715 } else if (!g_strcmp0(method_name, "SetAutoConnectionMode")) {
1716 gboolean mode = FALSE;
1718 g_variant_get(parameters, "(b)", &mode);
1719 ret = wfd_manager_set_autoconnection(mode);
1721 WDS_LOGE("Failed to set autoconnection");
1722 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1726 ret = WIFI_DIRECT_ERROR_NONE;
1727 return_parameters = g_variant_new("(i)", ret);
1730 } else if (!g_strcmp0(method_name, "IsAutoConnectionMode")) {
1733 ret = wfd_manager_get_autoconnection(&mode);
1735 WDS_LOGE("Failed to get autoconnection");
1736 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1740 ret = WIFI_DIRECT_ERROR_NONE;
1741 return_parameters = g_variant_new("(ib)", ret, mode);
1744 } else if (!g_strcmp0(method_name, "GetOperatingChannel")) {
1747 wfd_group_s *group = manager->group;
1749 WDS_LOGE("Group not exist");
1750 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1754 channel = wfd_util_freq_to_channel(group->freq);
1756 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1760 ret = WIFI_DIRECT_ERROR_NONE;
1761 return_parameters = g_variant_new("(ii)", ret, channel);
1764 } else if (!g_strcmp0(method_name, "SetAutoConnectionPeer")) {
1765 ret = WIFI_DIRECT_ERROR_NONE;
1766 return_parameters = g_variant_new("(i)", ret);
1769 } else if (!g_strcmp0(method_name, "GetInterfaceName")) {
1770 wfd_group_s *group = (wfd_group_s *)manager->group;
1772 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1775 ret = WIFI_DIRECT_ERROR_NONE;
1776 return_parameters = g_variant_new("(is)", ret, group->ifname);
1779 } else if (!g_strcmp0(method_name, "GetSubnetMask")) {
1780 char *get_str = NULL;
1781 char subnet_mask[IPSTR_LEN+1] = {0, };
1783 get_str = vconf_get_str(VCONFKEY_WIFI_DIRECT_P2P_SUBNET_MASK);
1785 WDS_LOGE("Get Subnet Mask failed");
1786 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1789 WDS_LOGD("VCONFKEY_WIFI_DIRECT_P2P_SUBNET_MASK(%s) : %s", VCONFKEY_WIFI_DIRECT_P2P_SUBNET_MASK,
1791 ret = WIFI_DIRECT_ERROR_NONE;
1792 g_strlcpy(subnet_mask, get_str, IPSTR_LEN + 1);
1793 return_parameters = g_variant_new("(is)", ret, subnet_mask);
1797 } else if (!g_strcmp0(method_name, "GetGateway")) {
1798 char *get_str = NULL;
1799 char gateway_addr[IPSTR_LEN+1] = {0, };
1800 get_str = vconf_get_str(VCONFKEY_WIFI_DIRECT_P2P_GATEWAY);
1802 WDS_LOGE("Get Gateway failed");
1803 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1806 WDS_LOGD("VCONFKEY_WIFI_DIRECT_P2P_GATEWAY_ADDR(%s) : %s", VCONFKEY_WIFI_DIRECT_P2P_GATEWAY,
1808 ret = WIFI_DIRECT_ERROR_NONE;
1809 g_strlcpy(gateway_addr, get_str, IPSTR_LEN + 1);
1810 return_parameters = g_variant_new("(is)", ret, gateway_addr);
1814 } else if (!g_strcmp0(method_name, "GetSessionTimer")) {
1816 int session_timer = 0;
1817 ret = WIFI_DIRECT_ERROR_NONE;
1818 session_timer = manager->session_timer;
1819 WDS_LOGD("Get Session Timer value is %d", session_timer);
1820 return_parameters = g_variant_new("(ii)", ret, session_timer);
1823 } else if (!g_strcmp0(method_name, "SetSessionTimer")) {
1825 int session_timer = 0;
1826 g_variant_get(parameters, "(i)", &session_timer);
1827 WDS_LOGD("Set Session Timer value is %d", session_timer);
1828 manager->session_timer = session_timer;
1829 ret = WIFI_DIRECT_ERROR_NONE;
1830 return_parameters = g_variant_new("(i)", ret);
1833 } else if (!g_strcmp0(method_name, "SetAutoGroupRemoval")) {
1836 g_variant_get(parameters, "(b)", &enable);
1837 WDS_LOGE("Activate Auto Group Removal Mode : [%s]",
1838 enable ? "True" : "False");
1840 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1841 WDS_LOGE("Wi-Fi Direct is not activated.");
1842 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1847 manager->auto_group_remove_enable = TRUE;
1849 /* Enable Group destroy only if state is connecting */
1850 if (manager->state == WIFI_DIRECT_STATE_CONNECTING) {
1851 WDS_LOGE("Wi-Fi Direct state is CONNECTING");
1852 ret = WIFI_DIRECT_ERROR_NONE;
1853 return_parameters = g_variant_new("(i)", ret);
1856 /* Remove group immediately if no connected peer found */
1857 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1858 wfd_group_s *group = (wfd_group_s*) manager->group;
1859 if (group && !group->member_count
1860 && wfd_util_is_remove_group_allowed())
1861 wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1865 manager->auto_group_remove_enable = FALSE;
1868 ret = WIFI_DIRECT_ERROR_NONE;
1869 return_parameters = g_variant_new("(i)", ret);
1872 } else if (!g_strcmp0(method_name, "GetPrimaryDevType")) {
1874 int pri_dev_type = 0;
1875 ret = WIFI_DIRECT_ERROR_NONE;
1876 pri_dev_type = DEFAULT_PRIMARY_DEVICE_TYPE;
1877 WDS_LOGD("Get primary dev type value is %d", pri_dev_type);
1878 return_parameters = g_variant_new("(ii)", ret, pri_dev_type);
1881 } else if (!g_strcmp0(method_name, "GetSecondaryDevType")) {
1883 int sec_dev_type = 0;
1884 ret = WIFI_DIRECT_ERROR_NONE;
1885 sec_dev_type = DEFAULT_SECONDARY_DEVICE_TYPE;
1886 WDS_LOGD("Get secondary dev type value is %d", sec_dev_type);
1887 return_parameters = g_variant_new("(ii)", ret, sec_dev_type);
1890 } else if (!g_strcmp0(method_name, "GetPeerRssi")) {
1891 wfd_device_s *peer = NULL;
1892 const char *mac_address = NULL;
1893 unsigned char mac_addr[MACADDR_LEN] = {0, };
1895 g_variant_get(parameters, "(&s)", &mac_address);
1896 macaddr_atoe(mac_address, mac_addr);
1898 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1899 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1903 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
1905 WDS_LOGE("Failed to get peer");
1906 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1910 ret = WIFI_DIRECT_ERROR_NONE;
1911 return_parameters = g_variant_new("(ii)", ret, peer->rssi);
1914 } else if (!g_strcmp0(method_name, "AddVsie")) {
1915 const char *vsie = NULL;
1918 g_variant_get(parameters, "(i&s)", &frame_id, &vsie);
1920 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1921 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1925 if (wfd_oem_add_vsie(manager->oem_ops, frame_id, vsie) < 0) {
1926 WDS_LOGE("Failed to add vsie");
1927 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1931 ret = WIFI_DIRECT_ERROR_NONE;
1932 return_parameters = g_variant_new("(i)", ret);
1935 } else if (!g_strcmp0(method_name, "GetVsie")) {
1939 g_variant_get(parameters, "(i)", &frame_id);
1941 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1942 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1946 if (wfd_oem_get_vsie(manager->oem_ops, frame_id, &vsie) < 0) {
1947 WDS_LOGE("Failed to get vsie");
1948 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1952 WDS_LOGD("Received VSIE [%s]", vsie);
1954 ret = WIFI_DIRECT_ERROR_NONE;
1955 return_parameters = g_variant_new("(is)", ret, vsie);
1960 } else if (!g_strcmp0(method_name, "RemoveVsie")) {
1961 const char *vsie = NULL;
1964 g_variant_get(parameters, "(i&s)", &frame_id, &vsie);
1966 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
1967 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
1971 if (wfd_oem_remove_vsie(manager->oem_ops, frame_id, vsie) < 0) {
1972 WDS_LOGE("Failed to remove vsie");
1973 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1977 ret = WIFI_DIRECT_ERROR_NONE;
1978 return_parameters = g_variant_new("(i)", ret);
1982 WDS_LOGE("method not handled");
1983 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1988 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
1992 wfd_error_set_gerror(ret, &err);
1993 g_dbus_method_invocation_return_gerror(invocation, err);
1994 g_clear_error(&err);
1998 static void __wfd_manager_service_iface_handler(const gchar *method_name,
1999 GVariant *parameters,
2000 GDBusMethodInvocation *invocation)
2002 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2003 wfd_manager_s *manager = wfd_get_manager();
2004 GVariant *return_parameters = NULL;
2006 WDS_LOGD("%s", method_name);
2008 if (!g_strcmp0(method_name, "StartDiscovery")) {
2009 const char *mac_address = NULL;
2011 unsigned char mac_addr[MACADDR_LEN] = {0, };
2013 if (!manager->is_service_discovery_supported) {
2014 WDS_LOGE("Wi-Fi Direct service discovery is not supported.");
2015 ret = WIFI_DIRECT_ERROR_NOT_SUPPORTED;
2019 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2020 WDS_LOGE("Wi-Fi Direct is not activated.");
2021 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2025 g_variant_get(parameters, "(i&s)", &service_type, &mac_address);
2026 if (mac_address == NULL) {
2027 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2031 WDS_LOGD("Service type [%d]", service_type);
2032 macaddr_atoe(mac_address, mac_addr);
2034 ret = wfd_oem_start_service_discovery(manager->oem_ops,
2035 mac_addr, service_type);
2037 WDS_LOGE("Failed to start service discovery");
2038 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2042 WFD_DBUS_REPLY_ERROR_NONE(invocation);
2044 wfd_manager_dbus_emit_signal(WFD_MANAGER_SERVICE_INTERFACE,
2045 "DiscoveryStarted", NULL);
2048 } else if (!g_strcmp0(method_name, "StopDiscovery")) {
2049 const char *mac_address = NULL;
2051 unsigned char mac_addr[MACADDR_LEN] = {0, };
2053 if (!manager->is_service_discovery_supported) {
2054 WDS_LOGE("Wi-Fi Direct service discovery is not supported.");
2055 ret = WIFI_DIRECT_ERROR_NOT_SUPPORTED;
2059 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2060 WDS_LOGE("Wi-Fi Direct is not activated.");
2061 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2065 g_variant_get(parameters, "(i&s)", &service_type, &mac_address);
2066 if (mac_address == NULL) {
2067 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2071 WDS_LOGD("Service type [%d]", service_type);
2072 macaddr_atoe(mac_address, mac_addr);
2074 ret = wfd_oem_cancel_service_discovery(manager->oem_ops,
2075 mac_addr, service_type);
2077 WDS_LOGE("Failed to cancel service discovery");
2078 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2081 ret = WIFI_DIRECT_ERROR_NONE;
2082 return_parameters = g_variant_new("(i)", ret);
2085 } else if (!g_strcmp0(method_name, "Register")) {
2088 const char *info_str = NULL;
2090 if (!manager->is_service_discovery_supported) {
2091 WDS_LOGE("Wi-Fi Direct service discovery is not supported.");
2092 ret = WIFI_DIRECT_ERROR_NOT_SUPPORTED;
2096 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2097 WDS_LOGE("Wi-Fi Direct is not activated.");
2098 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2102 g_variant_get(parameters, "(i&s)", &service_type, &info_str);
2103 WDS_LOGD("Register service [%d: %s]", service_type, info_str);
2105 ret = wfd_service_add(service_type, (char *)info_str, &service_id);
2107 WDS_LOGE("Failed to add service");
2108 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2112 ret = WIFI_DIRECT_ERROR_NONE;
2113 return_parameters = g_variant_new("(ii)", ret, service_id);
2116 } else if (!g_strcmp0(method_name, "Deregister")) {
2119 if (!manager->is_service_discovery_supported) {
2120 WDS_LOGE("Wi-Fi Direct service discovery is not supported.");
2121 ret = WIFI_DIRECT_ERROR_NOT_SUPPORTED;
2125 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2126 WDS_LOGE("Wi-Fi Direct is not activated.");
2127 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2131 g_variant_get(parameters, "(i)", &service_id);
2132 WDS_LOGD("Service id [%d]", service_id);
2134 ret = wfd_service_del(service_id);
2136 WDS_LOGE("Failed to delete service");
2137 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2141 ret = WIFI_DIRECT_ERROR_NONE;
2142 return_parameters = g_variant_new("(i)", ret);
2146 WDS_LOGD("method not handled");
2147 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2152 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
2156 wfd_error_set_gerror(ret, &err);
2157 g_dbus_method_invocation_return_gerror(invocation, err);
2158 g_clear_error(&err);
2162 static void __wfd_manager_display_iface_handler(const gchar *method_name,
2163 GVariant *parameters,
2164 GDBusMethodInvocation *invocation)
2166 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2167 wfd_manager_s *manager = wfd_get_manager();
2168 GVariant *return_parameters = NULL;
2170 WDS_LOGD("%s", method_name);
2172 if (!g_strcmp0(method_name, "Init")) {
2173 if (!manager->is_wifi_display_supported) {
2174 ret = WIFI_DIRECT_ERROR_NOT_SUPPORTED;
2178 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2179 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2183 wfd_device_s * device = manager->local;
2185 ret = wfd_oem_miracast_init(manager->oem_ops, TRUE);
2187 WDS_LOGE("Failed to initialize display");
2188 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2192 device->display.type = WIFI_DISPLAY_DEFAULT_TYPE;
2193 device->display.port = WIFI_DISPLAY_DEFAULT_PORT;
2194 device->display.availability = WIFI_DISPLAY_DEFAULT_AVAIL;
2195 device->display.hdcp_support = WIFI_DISPLAY_DEFAULT_HDCP;
2197 ret = WIFI_DIRECT_ERROR_NONE;
2198 return_parameters = g_variant_new("(i)", ret);
2201 } else if (!g_strcmp0(method_name, "Deinit")) {
2202 if (!manager->is_wifi_display_supported) {
2203 ret = WIFI_DIRECT_ERROR_NOT_SUPPORTED;
2207 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2208 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2212 wfd_device_s * device = manager->local;
2214 ret = wfd_oem_miracast_init(manager->oem_ops, FALSE);
2216 WDS_LOGE("Failed to deinitialize display");
2217 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2221 memset(&(device->display), 0x0, sizeof(wfd_display_type_e));
2223 ret = WIFI_DIRECT_ERROR_NONE;
2224 return_parameters = g_variant_new("(i)", ret);
2227 } else if (!g_strcmp0(method_name, "SetConfig")) {
2228 int type, port, hdcp;
2230 if (!manager->is_wifi_display_supported) {
2231 ret = WIFI_DIRECT_ERROR_NOT_SUPPORTED;
2235 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2236 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2240 g_variant_get(parameters, "(iii)", &type, &port, &hdcp);
2241 WDS_LOGD("type %d port %d hdcp %d", type, port, hdcp);
2243 ret = wfd_manager_set_display_device(type, port, hdcp);
2245 WDS_LOGE("Failed to set display device settings");
2246 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2250 ret = WIFI_DIRECT_ERROR_NONE;
2251 return_parameters = g_variant_new("(i)", ret);
2254 } else if (!g_strcmp0(method_name, "SetAvailiability")) {
2257 if (!manager->is_wifi_display_supported) {
2258 ret = WIFI_DIRECT_ERROR_NOT_SUPPORTED;
2262 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2263 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2267 g_variant_get(parameters, "(i)", &availability);
2268 ret = wfd_manager_set_session_availability(availability);
2270 WDS_LOGE("Failed to set session availability");
2271 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2275 ret = WIFI_DIRECT_ERROR_NONE;
2276 return_parameters = g_variant_new("(i)", ret);
2279 } else if (!g_strcmp0(method_name, "GetPeerType")) {
2280 wfd_device_s *peer = NULL;
2281 const char *mac_address = NULL;
2282 unsigned char mac_addr[MACADDR_LEN] = {0, };
2284 if (!manager->is_wifi_display_supported) {
2285 ret = WIFI_DIRECT_ERROR_NOT_SUPPORTED;
2289 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2290 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2294 g_variant_get(parameters, "(&s)", &mac_address);
2295 if (mac_address == NULL) {
2296 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2300 macaddr_atoe(mac_address, mac_addr);
2301 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
2303 WDS_LOGE("Failed to get peer");
2304 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2308 ret = WIFI_DIRECT_ERROR_NONE;
2309 return_parameters = g_variant_new("(ii)", ret, peer->display.type);
2312 } else if (!g_strcmp0(method_name, "GetPeerAvailability")) {
2313 wfd_device_s *peer = NULL;
2314 const char *mac_address = NULL;
2315 unsigned char mac_addr[MACADDR_LEN] = {0, };
2317 if (!manager->is_wifi_display_supported) {
2318 ret = WIFI_DIRECT_ERROR_NOT_SUPPORTED;
2322 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2323 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2327 g_variant_get(parameters, "(&s)", &mac_address);
2328 if (mac_address == NULL) {
2329 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2333 macaddr_atoe(mac_address, mac_addr);
2334 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
2336 WDS_LOGE("Failed to get peer");
2337 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2341 ret = WIFI_DIRECT_ERROR_NONE;
2342 return_parameters = g_variant_new("(ii)", ret, peer->display.availability);
2345 } else if (!g_strcmp0(method_name, "GetPeerHdcp")) {
2346 wfd_device_s *peer = NULL;
2347 const char *mac_address = NULL;
2348 unsigned char mac_addr[MACADDR_LEN] = {0, };
2350 if (!manager->is_wifi_display_supported) {
2351 ret = WIFI_DIRECT_ERROR_NOT_SUPPORTED;
2355 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2356 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2360 g_variant_get(parameters, "(&s)", &mac_address);
2361 if (mac_address == NULL) {
2362 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2366 macaddr_atoe(mac_address, mac_addr);
2367 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
2369 WDS_LOGE("Failed to get peer");
2370 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2374 ret = WIFI_DIRECT_ERROR_NONE;
2375 return_parameters = g_variant_new("(ii)", ret, peer->display.hdcp_support);
2378 } else if (!g_strcmp0(method_name, "GetPeerPort")) {
2379 wfd_device_s *peer = NULL;
2380 const char *mac_address = NULL;
2381 unsigned char mac_addr[MACADDR_LEN] = {0, };
2383 if (!manager->is_wifi_display_supported) {
2384 ret = WIFI_DIRECT_ERROR_NOT_SUPPORTED;
2388 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2389 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2393 g_variant_get(parameters, "(&s)", &mac_address);
2394 if (mac_address == NULL) {
2395 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2399 macaddr_atoe(mac_address, mac_addr);
2400 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
2402 WDS_LOGE("Failed to get peer");
2403 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2407 ret = WIFI_DIRECT_ERROR_NONE;
2408 return_parameters = g_variant_new("(ii)", ret, peer->display.port);
2411 } else if (!g_strcmp0(method_name, "GetPeerThroughput")) {
2412 wfd_device_s *peer = NULL;
2413 const char *mac_address = NULL;
2414 unsigned char mac_addr[MACADDR_LEN] = {0, };
2416 if (!manager->is_wifi_display_supported) {
2417 ret = WIFI_DIRECT_ERROR_NOT_SUPPORTED;
2421 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2422 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2426 g_variant_get(parameters, "(&s)", &mac_address);
2427 if (mac_address == NULL) {
2428 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2432 macaddr_atoe(mac_address, mac_addr);
2433 peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
2435 WDS_LOGE("Failed to get peer");
2436 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2440 ret = WIFI_DIRECT_ERROR_NONE;
2441 return_parameters = g_variant_new("(ii)", ret, peer->display.max_tput);
2445 WDS_LOGD("method not handled");
2446 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2451 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
2455 wfd_error_set_gerror(ret, &err);
2456 g_dbus_method_invocation_return_gerror(invocation, err);
2457 g_clear_error(&err);
2461 static void __g_variant_to_txt_record(GVariant *variant, char **txt_record)
2463 GVariantIter *iter = NULL;
2465 GVariant *value = NULL;
2467 const char *str = NULL;
2471 gsize value_length = 0;
2472 __WDS_LOG_FUNC_ENTER__;
2474 DBUS_DEBUG_VARIANT(variant);
2476 g_variant_get(variant, "a{sv}", &iter);
2478 __WDS_LOG_FUNC_EXIT__;
2482 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
2483 WDS_LOGD("%s %s", key, g_variant_get_string(value, &value_length));
2484 txt_length += strlen(key);
2485 str = g_variant_get_string(value, &value_length);
2486 txt_length += (int)value_length;
2490 g_variant_iter_free(iter);
2491 if (txt_length == 0) {
2492 __WDS_LOG_FUNC_EXIT__;
2496 buff = g_try_malloc0(txt_length);
2498 WDS_LOGE("g_try_malloc0 failed");
2499 __WDS_LOG_FUNC_EXIT__;
2503 g_variant_get(variant, "a{sv}", &iter);
2504 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
2505 key_length = strlen(key);
2506 str = g_variant_get_string(value, &value_length);
2508 g_strlcpy(pos, key, key_length + 1);
2513 g_strlcpy(pos, str, value_length + 1);
2514 pos += (int)value_length;
2518 buff[txt_length -1] = '\0';
2520 g_variant_iter_free(iter);
2523 __WDS_LOG_FUNC_EXIT__;
2527 static void __g_variant_to_seek_info(GVariant *variant, char **seek_info)
2529 GVariantIter *iter = NULL;
2533 int seek_length = 0;
2536 DBUS_DEBUG_VARIANT(variant);
2537 g_variant_get(variant, "as", &iter);
2542 while (g_variant_iter_loop(iter, "s", &key)) {
2543 seek_length += strlen(key);
2547 g_variant_iter_free(iter);
2548 if (seek_length == 0)
2551 buff = g_try_malloc0(seek_length);
2553 WDS_LOGE("g_try_malloc0 failed");
2557 g_variant_get(variant, "as", &iter);
2558 while (g_variant_iter_loop(iter, "s", &key)) {
2559 key_length = strlen(key);
2561 g_strlcpy(pos, key, key_length + 1);
2566 buff[seek_length -1] = '\0';
2568 g_variant_iter_free(iter);
2574 static void __get_asp_advertise_params(GVariantIter *iter, wfd_oem_asp_service_s *service, int *replace)
2577 GVariant *var = NULL;
2583 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
2584 if (!g_strcmp0(key, "adv_id"))
2585 g_variant_get(var, "u", &(service->adv_id));
2586 else if (!g_strcmp0(key, "discovery_tech"))
2587 g_variant_get(var, "i", &(service->discovery_tech));
2588 else if (!g_strcmp0(key, "preferred_connection"))
2589 g_variant_get(var, "y", &(service->preferred_connection));
2590 else if (!g_strcmp0(key, "auto_accept"))
2591 g_variant_get(var, "i", &(service->auto_accept));
2592 else if (!g_strcmp0(key, "status"))
2593 g_variant_get(var, "y", &(service->status));
2594 else if (!g_strcmp0(key, "role"))
2595 g_variant_get(var, "y", &(service->role));
2596 else if (!g_strcmp0(key, "replace"))
2597 g_variant_get(var, "i", replace);
2598 else if (!g_strcmp0(key, "config_method"))
2599 g_variant_get(var, "u", &(service->config_method));
2600 else if (!g_strcmp0(key, "instance_name"))
2601 g_variant_get(var, "&s", &(service->instance_name));
2602 else if (!g_strcmp0(key, "service_type"))
2603 g_variant_get(var, "&s", &(service->service_type));
2604 else if (!g_strcmp0(key, "service_info"))
2605 __g_variant_to_txt_record(var, &(service->service_info));
2606 else if (!g_strcmp0(key, "rsp_info"))
2607 g_variant_get(var, "&s", &(service->rsp_info));
2615 static void __get_asp_seek_params(GVariantIter *iter, wfd_oem_asp_service_s *service)
2618 GVariant *var = NULL;
2623 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
2624 if (!g_strcmp0(key, "discovery_tech"))
2625 g_variant_get(var, "i", &(service->discovery_tech));
2626 else if (!g_strcmp0(key, "search_id"))
2627 g_variant_get(var, "t", &(service->asp_search_id));
2628 else if (!g_strcmp0(key, "preferred_connection"))
2629 g_variant_get(var, "y", &(service->preferred_connection));
2630 else if (!g_strcmp0(key, "service_type"))
2631 g_variant_get(var, "&s", &(service->service_type));
2632 else if (!g_strcmp0(key, "service_info"))
2633 __g_variant_to_seek_info(var, &(service->service_info));
2640 static void __get_asp_connect_params(GVariantIter *iter, wfd_oem_asp_prov_s *prov_params)
2643 GVariant *var = NULL;
2644 const char *mac_str = NULL;
2645 unsigned char role = 0;
2646 unsigned int config = 0;
2651 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
2653 if (!g_strcmp0(key, "service_mac")) {
2654 g_variant_get(var, "&s", &mac_str);
2655 if (mac_str == NULL)
2656 memset(prov_params->service_mac, 0, sizeof(prov_params->service_mac));
2658 macaddr_atoe(mac_str, prov_params->service_mac);
2659 } else if (!g_strcmp0(key, "adv_id")) {
2660 g_variant_get(var, "u", &(prov_params->adv_id));
2661 } else if (!g_strcmp0(key, "session_mac")) {
2662 g_variant_get(var, "&s", &mac_str);
2663 if (mac_str == NULL)
2664 memset(prov_params->session_mac, 0, sizeof(prov_params->session_mac));
2666 macaddr_atoe(mac_str, prov_params->session_mac);
2667 } else if (!g_strcmp0(key, "session_id")) {
2668 g_variant_get(var, "u", &(prov_params->session_id));
2669 } else if (!g_strcmp0(key, "role")) {
2670 g_variant_get(var, "y", &(role));
2671 prov_params->network_role = (int)role;
2672 } else if (!g_strcmp0(key, "config_method")) {
2673 g_variant_get(var, "u", &(config));
2674 prov_params->network_config = (int)config;
2675 } else if (!g_strcmp0(key, "session_info")) {
2676 g_variant_get(var, "&s", &(prov_params->session_information));
2686 static void __get_asp_confirm_params(GVariantIter *iter, wfd_oem_asp_prov_s *prov_params, int *confirmed)
2689 GVariant *var = NULL;
2690 const char *mac_str = NULL;
2691 const char *pin = NULL;
2696 while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
2698 if (!g_strcmp0(key, "service_mac")) {
2699 g_variant_get(var, "&s", &mac_str);
2700 if (mac_str == NULL)
2701 memset(prov_params->service_mac, 0, sizeof(prov_params->service_mac));
2703 macaddr_atoe(mac_str, prov_params->service_mac);
2704 } else if (!g_strcmp0(key, "adv_id")) {
2705 g_variant_get(var, "u", &(prov_params->adv_id));
2706 } else if (!g_strcmp0(key, "session_mac")) {
2707 g_variant_get(var, "&s", &mac_str);
2708 if (mac_str == NULL)
2709 memset(prov_params->session_mac, 0, sizeof(prov_params->session_mac));
2711 macaddr_atoe(mac_str, prov_params->session_mac);
2712 } else if (!g_strcmp0(key, "session_id")) {
2713 g_variant_get(var, "u", &(prov_params->session_id));
2714 } else if (!g_strcmp0(key, "confirm")) {
2715 g_variant_get(var, "i", confirmed);
2716 } else if (!g_strcmp0(key, "pin")) {
2717 g_variant_get(var, "&s", &(pin));
2718 g_strlcpy(prov_params->wps_pin, pin, PINSTR_LEN);
2727 static void __wfd_manager_asp_iface_handler(const gchar *method_name,
2728 GVariant *parameters,
2729 GDBusMethodInvocation *invocation)
2731 int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2732 wfd_manager_s *manager = wfd_get_manager();
2733 GVariant *return_parameters = NULL;
2734 GVariantIter *iter = NULL;
2736 WDS_LOGD("%s", method_name);
2739 WDS_LOGD("manager is not initialized.");
2740 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2744 if (!g_strcmp0(method_name, "AdvertiseService")) {
2746 wfd_oem_asp_service_s service;
2749 if (!manager->is_asp_supported) {
2750 WDS_LOGD("ASP is not supported.");
2751 ret = WIFI_DIRECT_ERROR_NOT_SUPPORTED;
2755 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
2756 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
2757 manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
2758 WDS_LOGE("Wi-Fi Direct is not available status for Advertising.");
2759 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2763 g_variant_get(parameters, "(a{sv})", &iter);
2765 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2769 memset(&service, 0, sizeof(wfd_oem_asp_service_s));
2770 __get_asp_advertise_params(iter, &service, &replace);
2771 ret = wfd_oem_advertise_service(manager->oem_ops, &service, replace);
2773 WDS_LOGE("Failed to add service");
2774 g_free(service.service_info);
2775 g_variant_iter_free(iter);
2776 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2779 g_free(service.service_info);
2780 g_variant_iter_free(iter);
2782 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
2783 WDS_LOGW("Wi-Fi Direct device is already visible, do not start listen");
2787 ret = wfd_manager_start_discovery(manager,
2788 WFD_OEM_SCAN_MODE_PASSIVE, 0,
2790 if (ret == WIFI_DIRECT_ERROR_NONE) {
2791 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
2795 wfd_oem_cancel_advertise_service(manager->oem_ops, &service);
2796 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2800 ret = WIFI_DIRECT_ERROR_NONE;
2801 return_parameters = g_variant_new("(i)", ret);
2804 } else if (!g_strcmp0(method_name, "CancelAdvertiseService")) {
2806 wfd_oem_asp_service_s service;
2807 memset(&service, 0, sizeof(wfd_oem_asp_service_s));
2809 if (!manager->is_asp_supported) {
2810 WDS_LOGD("ASP is not supported.");
2811 ret = WIFI_DIRECT_ERROR_NOT_SUPPORTED;
2815 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2816 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2820 g_variant_get(parameters, "(u)", &(service.adv_id));
2821 ret = wfd_oem_cancel_advertise_service(manager->oem_ops, &service);
2823 WDS_LOGE("Failed to del service");
2824 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2828 ret = WIFI_DIRECT_ERROR_NONE;
2829 return_parameters = g_variant_new("(i)", ret);
2832 } else if (!g_strcmp0(method_name, "SeekService")) {
2834 wfd_oem_asp_service_s service;
2835 GVariantIter *iter = NULL;
2837 if (!manager->is_asp_supported) {
2838 WDS_LOGD("ASP is not supported.");
2839 ret = WIFI_DIRECT_ERROR_NOT_SUPPORTED;
2843 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
2844 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
2845 manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
2846 WDS_LOGE("Wi-Fi Direct is not available status to Seek.");
2847 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2851 g_variant_get(parameters, "(a{sv})", &iter);
2853 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2857 memset(&service, 0, sizeof(wfd_oem_asp_service_s));
2858 __get_asp_seek_params(iter, &service);
2859 ret = wfd_oem_seek_service(manager->oem_ops, &service);
2861 WDS_LOGE("Failed to seek service");
2862 g_free(service.service_info);
2863 g_variant_iter_free(iter);
2864 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2867 g_free(service.service_info);
2868 g_variant_iter_free(iter);
2870 WDS_LOGD("search_id [%x]", service.search_id);
2872 ret = wfd_manager_start_discovery(manager,
2873 WFD_OEM_SCAN_MODE_ACTIVE, 0,
2875 if (ret == WIFI_DIRECT_ERROR_NONE) {
2876 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
2880 wfd_oem_cancel_seek_service(manager->oem_ops, &service);
2881 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2885 ret = WIFI_DIRECT_ERROR_NONE;
2886 return_parameters = g_variant_new("(i)", ret);
2889 } else if (!g_strcmp0(method_name, "CancelSeekService")) {
2891 wfd_oem_asp_service_s service;
2892 memset(&service, 0, sizeof(wfd_oem_asp_service_s));
2894 if (!manager->is_asp_supported) {
2895 WDS_LOGD("ASP is not supported.");
2896 ret = WIFI_DIRECT_ERROR_NOT_SUPPORTED;
2900 if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
2901 WDS_LOGE("Wi-Fi Direct is not activated.");
2902 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2906 g_variant_get(parameters, "(t)", &(service.asp_search_id));
2907 ret = wfd_oem_cancel_seek_service(manager->oem_ops, &service);
2909 WDS_LOGE("Failed to cancel seek service");
2910 ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
2914 ret = WIFI_DIRECT_ERROR_NONE;
2915 return_parameters = g_variant_new("(i)", ret);
2917 } else if (!g_strcmp0(method_name, "ConnectSession")) {
2919 GVariantIter *iter = NULL;
2920 wfd_oem_asp_prov_s prov_params;
2922 if (manager && !manager->is_asp_supported) {
2923 WDS_LOGD("ASP is not supported.");
2924 ret = WIFI_DIRECT_ERROR_NOT_SUPPORTED;
2928 if (__is_discovery_available(manager)) {
2929 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
2933 g_variant_get(parameters, "(a{sv})", &iter);
2935 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2939 memset(&prov_params, 0, sizeof(wfd_oem_asp_prov_s));
2940 __get_asp_connect_params(iter, &prov_params);
2942 if (ISZEROMACADDR(prov_params.service_mac) ||
2943 ISZEROMACADDR(prov_params.session_mac)) {
2944 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
2945 g_variant_iter_free(iter);
2949 WFD_DBUS_REPLY_ERROR_NONE(invocation);
2951 wfd_asp_connect_status(prov_params.session_mac,
2952 prov_params.session_id,
2953 ASP_CONNECT_STATUS_REQUEST_SENT,
2956 wfd_group_s *group = (wfd_group_s*) manager->group;
2957 if (group && group->member_count >= manager->max_station) {
2959 wfd_asp_connect_status(prov_params.session_mac,
2960 prov_params.session_id,
2961 ASP_CONNECT_STATUS_NOMORE_CONNECT,
2963 g_variant_iter_free(iter);
2964 __WDS_LOG_FUNC_EXIT__;
2968 ret = wfd_manager_asp_connect_session(manager, &prov_params);
2969 if (ret == WIFI_DIRECT_ERROR_NONE) {
2970 char peer_mac_address[MACSTR_LEN] = {0,};
2971 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(prov_params.service_mac));
2972 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
2974 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
2975 WFD_EVENT_CONNECTION_IN_PROGRESS,
2978 wfd_asp_connect_status(prov_params.session_mac,
2979 prov_params.session_id,
2980 ASP_CONNECT_STATUS_REQUEST_FAILED,
2983 g_variant_iter_free(iter);
2984 __WDS_LOG_FUNC_EXIT__;
2987 } else if (!g_strcmp0(method_name, "ConfirmSession")) {
2989 GVariantIter *iter = NULL;
2990 wfd_oem_asp_prov_s prov_params;
2993 if (manager && !manager->is_asp_supported) {
2994 WDS_LOGD("ASP is not supported.");
2995 ret = WIFI_DIRECT_ERROR_NOT_SUPPORTED;
2999 if (manager->state != WIFI_DIRECT_STATE_CONNECTING) {
3000 ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
3004 g_variant_get(parameters, "(a{sv})", &iter);
3006 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
3010 memset(&prov_params, 0, sizeof(wfd_oem_asp_prov_s));
3011 __get_asp_confirm_params(iter, &prov_params, &confirmed);
3013 if (ISZEROMACADDR(prov_params.session_mac)) {
3014 ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
3015 g_variant_iter_free(iter);
3019 WFD_DBUS_REPLY_ERROR_NONE(invocation);
3021 ret = wfd_manager_asp_confirm_session(manager, &prov_params, confirmed);
3022 if (ret == WIFI_DIRECT_ERROR_NONE && confirmed > 0) {
3023 char peer_mac_address[MACSTR_LEN] = {0,};
3024 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(prov_params.service_mac));
3025 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
3027 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
3028 WFD_EVENT_CONNECTION_IN_PROGRESS,
3030 wfd_asp_connect_status(prov_params.session_mac,
3031 prov_params.session_id,
3032 ASP_CONNECT_STATUS_REQUEST_ACCEPTED,
3035 wfd_asp_connect_status(prov_params.session_mac,
3036 prov_params.session_id,
3037 ASP_CONNECT_STATUS_REQUEST_FAILED,
3040 g_variant_iter_free(iter);
3041 __WDS_LOG_FUNC_EXIT__;
3046 WFD_DBUS_REPLY_PARAMS(invocation, return_parameters);
3047 __WDS_LOG_FUNC_EXIT__;
3051 wfd_error_set_gerror(ret, &err);
3052 g_dbus_method_invocation_return_gerror(invocation, err);
3053 g_clear_error(&err);
3054 __WDS_LOG_FUNC_EXIT__;
3060 const gchar *iface_name;
3061 void (*function) (const gchar *method_name,
3062 GVariant *parameters,
3063 GDBusMethodInvocation *invocation);
3064 } wfd_manager_iface_map[] = {
3067 WFD_MANAGER_MANAGE_INTERFACE,
3068 __wfd_manager_manage_iface_handler
3072 WFD_MANAGER_GROUP_INTERFACE,
3073 __wfd_manager_group_iface_handler
3077 WFD_MANAGER_CONFIG_INTERFACE,
3078 __wfd_manager_config_iface_handler
3082 WFD_MANAGER_SERVICE_INTERFACE,
3083 __wfd_manager_service_iface_handler
3087 WFD_MANAGER_DISPLAY_INTERFACE,
3088 __wfd_manager_display_iface_handler
3092 WFD_MANAGER_ASP_INTERFACE,
3093 __wfd_manager_asp_iface_handler
3102 /* GDBus method handler */
3103 static void wfd_manager_method_call_handler (GDBusConnection *connection,
3104 const gchar *sender,
3105 const gchar *object_path,
3106 const gchar *interface_name,
3107 const gchar *method_name,
3108 GVariant *parameters,
3109 GDBusMethodInvocation *invocation,
3114 if (!g_strcmp0(method_name, "AddClient"))
3115 wfd_manager_add_active_client(sender);
3118 WDS_LOGD("interface : [%s], method : [%s]", interface_name, method_name);
3119 DBUS_DEBUG_VARIANT(parameters);
3121 while (wfd_manager_iface_map[count].iface_name != NULL) {
3122 if (!g_strcmp0(interface_name, wfd_manager_iface_map[count].iface_name)) {
3124 wfd_manager_iface_map[count].function(method_name,
3133 static const GDBusInterfaceVTable wfd_manager_interface_vtable = {
3134 wfd_manager_method_call_handler, NULL, NULL};
3136 void wfd_manager_dbus_unregister(void)
3140 wfd_error_deregister();
3142 while (wfd_manager_iface_map[count].iface_name != NULL) {
3143 wfd_manager_dbus_iface_unregister(wfd_manager_iface_map[count].reg_id);
3148 gboolean wfd_manager_dbus_register(void)
3150 GDBusNodeInfo *node_info = NULL;
3151 GError *Error = NULL;
3154 wfd_error_register();
3156 node_info = g_dbus_node_info_new_for_xml(wfd_manager_introspection_xml, &Error);
3157 if (node_info == NULL) {
3158 WDS_LOGE("Failed to get node info, Error: %s", Error->message);
3159 g_clear_error(&Error);
3163 while (wfd_manager_iface_map[count].iface_name != NULL) {
3164 wfd_manager_iface_map[count].reg_id =
3165 wfd_manager_dbus_iface_register(wfd_manager_iface_map[count].iface_name,
3168 &wfd_manager_interface_vtable);
3170 WDS_LOGD("Registered Interface [%d, %s]",
3171 wfd_manager_iface_map[count].reg_id,
3172 wfd_manager_iface_map[count].iface_name);
3177 g_dbus_node_info_unref(node_info);