2 * Network Configuration Module
4 * Copyright (c) 2012 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 peer functions.
23 * @file wifi-direct-peer.c
24 * @author Gibyoung Kim (lastkgb.kim@samsung.com)
34 #include <wifi-direct.h>
36 #include "wifi-direct-ipc.h"
37 #include "wifi-direct-manager.h"
38 #include "wifi-direct-oem.h"
39 #include "wifi-direct-util.h"
40 #include "wifi-direct-peer.h"
41 #include "wifi-direct-session.h"
42 #include "wifi-direct-log.h"
45 wfd_device_s *wfd_add_peer(void *data, unsigned char *dev_addr, char *dev_name)
47 __WDS_LOG_FUNC_ENTER__;
48 wfd_manager_s *manager = (wfd_manager_s*) data;
49 wfd_device_s *peer = NULL;
51 if (!data || !dev_addr || !dev_name) {
52 WDS_LOGE("Invalid parameter");
53 __WDS_LOG_FUNC_EXIT__;
57 peer = wfd_peer_find_by_dev_addr(manager, dev_addr);
59 WDS_LOGD("Peer already exist[" MACSECSTR "]", MAC2SECSTR(dev_addr));
60 __WDS_LOG_FUNC_EXIT__;
64 peer = (wfd_device_s*) g_try_malloc0(sizeof(wfd_device_s));
66 WDS_LOGE("Failed to allocate memory for peer[" MACSTR "]", MAC2STR(dev_addr));
67 __WDS_LOG_FUNC_EXIT__;
70 memcpy(peer->dev_addr, dev_addr, MACADDR_LEN);
71 g_strlcpy(peer->dev_name, dev_name, DEV_NAME_LEN + 1);
72 peer->is_legacy = FALSE;
74 manager->peers = g_list_prepend(manager->peers, peer);
75 manager->peer_count++;
76 WDS_LOGD("peer_count[%d]", manager->peer_count);
77 __WDS_LOG_FUNC_EXIT__;
81 int wfd_remove_peer(void *data, unsigned char *dev_addr)
83 __WDS_LOG_FUNC_ENTER__;
84 wfd_manager_s *manager = (wfd_manager_s*) data;
85 wfd_device_s *peer = NULL;
87 if (!data || !dev_addr) {
88 WDS_LOGE("Invalid parameter");
89 __WDS_LOG_FUNC_EXIT__;
93 peer = wfd_peer_find_by_dev_addr(manager, dev_addr);
95 WDS_LOGE("Failed to find peer device");
96 __WDS_LOG_FUNC_EXIT__;
100 manager->peers = g_list_remove(manager->peers, peer);
101 manager->peer_count--;
105 __WDS_LOG_FUNC_EXIT__;
109 int wfd_update_peer_time(void*data, unsigned char *peer_addr)
111 __WDS_LOG_FUNC_ENTER__;
112 wfd_manager_s *manager = (wfd_manager_s*) data;
113 wfd_device_s *peer = NULL;
115 if (!manager || !peer_addr) {
116 WDS_LOGE("Invalid parameter");
120 peer = wfd_peer_find_by_dev_addr(manager, peer_addr);
122 WDS_LOGD("Peer not found [" MACSECSTR "]", MAC2SECSTR(peer_addr));
126 #if !(__GNUC__ <= 4 && __GNUC_MINOR__ < 8)
127 wfd_util_get_current_time(&peer->time);
130 gettimeofday(&tval, NULL);
131 peer->time = tval.tv_sec;
134 __WDS_LOG_FUNC_EXIT__;
138 int wfd_update_peer(void *data, wfd_device_s *peer)
140 __WDS_LOG_FUNC_ENTER__;
141 wfd_manager_s *manager = (wfd_manager_s*) data;
142 wfd_oem_device_s *oem_dev = NULL;
146 WDS_LOGE("Invalid parameter");
150 res = wfd_oem_get_peer_info(manager->oem_ops, peer->dev_addr, &oem_dev);
151 if (res < 0 || !oem_dev) {
152 WDS_LOGE("Failed to get peer information");
156 if (oem_dev->age > 30 && peer->state == WFD_PEER_STATE_DISCOVERED) {
157 WDS_LOGE("Too old age to update peer");
161 g_strlcpy(peer->dev_name, oem_dev->dev_name, DEV_NAME_LEN + 1);
162 #ifndef CTRL_IFACE_DBUS
163 memcpy(peer->intf_addr, oem_dev->intf_addr, MACADDR_LEN);
164 #endif /* CTRL_IFACE_DBUS */
165 memcpy(peer->go_dev_addr, oem_dev->go_dev_addr, MACADDR_LEN);
166 peer->channel = oem_dev->channel;
167 peer->dev_role = oem_dev->dev_role;
168 peer->config_methods = oem_dev->config_methods;
169 peer->pri_dev_type = oem_dev->pri_dev_type;
170 peer->sec_dev_type = oem_dev->sec_dev_type;
171 peer->dev_flags = oem_dev->dev_flags;
172 peer->group_flags = oem_dev->group_flags;
173 peer->wps_mode = oem_dev->wps_mode;
175 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
176 memcpy(&(peer->display), &(oem_dev->display), sizeof(wfd_display_s));
177 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
181 #if !(__GNUC__ <= 4 && __GNUC_MINOR__ < 8)
182 wfd_util_get_current_time(&peer->time);
185 gettimeofday(&tval, NULL);
186 peer->time = tval.tv_sec;
189 __WDS_LOG_FUNC_EXIT__;
193 int wfd_peer_clear_all(void *data)
195 __WDS_LOG_FUNC_ENTER__;
196 wfd_manager_s *manager = (wfd_manager_s*) data;
197 wfd_device_s *peer = NULL;
200 if (manager->peer_count == 0) {
201 WDS_LOGD("Peer not exist");
205 temp = g_list_first(manager->peers);
207 peer = (wfd_device_s*) temp->data;
209 temp = g_list_next(temp);
210 manager->peer_count--;
213 if (manager->peers) {
214 g_list_free(manager->peers);
215 manager->peers = NULL;
218 if (manager->peer_count) {
219 WDS_LOGE("Peer count is not synced. left count=%d", manager->peer_count);
220 manager->peer_count = 0;
224 __WDS_LOG_FUNC_EXIT__;
228 wfd_device_s *wfd_peer_find_by_dev_addr(void *data, unsigned char *dev_addr)
230 __WDS_LOG_FUNC_ENTER__;
231 wfd_manager_s *manager = (wfd_manager_s*) data;
232 wfd_device_s *peer = NULL;
235 if (!data || !dev_addr) {
236 WDS_LOGE("Invalid parameter");
240 if (manager->peer_count == 0) {
241 WDS_LOGE("There is no peer data");
245 temp = g_list_first(manager->peers);
248 if (!memcmp(peer->dev_addr, dev_addr, MACADDR_LEN)) {
249 WDS_LOGD("Peer device found[" MACSECSTR "]", MAC2SECSTR(dev_addr));
252 temp = g_list_next(temp);
256 __WDS_LOG_FUNC_EXIT__;
261 wfd_device_s *wfd_peer_find_by_intf_addr(void *data, unsigned char *intf_addr)
263 __WDS_LOG_FUNC_ENTER__;
264 wfd_manager_s *manager = (wfd_manager_s*) data;
265 wfd_device_s *peer = NULL;
268 if (!data || !intf_addr) {
269 WDS_LOGE("Invalid parameter");
273 if (manager->peer_count == 0) {
274 WDS_LOGE("There is no peer data");
278 temp = g_list_first(manager->peers);
281 if (!memcmp(peer->intf_addr, intf_addr, MACADDR_LEN)) {
282 WDS_LOGD("Peer device found[" MACSECSTR "]", MAC2SECSTR(intf_addr));
285 temp = g_list_next(temp);
289 __WDS_LOG_FUNC_EXIT__;
294 wfd_device_s *wfd_peer_find_by_addr(void *data, unsigned char *addr)
296 __WDS_LOG_FUNC_ENTER__;
297 wfd_manager_s *manager = (wfd_manager_s*) data;
298 wfd_device_s *peer = NULL;
301 if (!data || !addr) {
302 WDS_LOGE("Invalid parameter");
306 if (manager->peer_count == 0) {
307 WDS_LOGE("There is no peer data");
311 temp = g_list_first(manager->peers);
314 if (!memcmp(peer->dev_addr, addr, MACADDR_LEN) ||
315 !memcmp(peer->intf_addr, addr, MACADDR_LEN)) {
316 WDS_LOGD("Peer device found[" MACSECSTR "]", MAC2SECSTR(addr));
319 temp = g_list_next(temp);
323 __WDS_LOG_FUNC_EXIT__;
328 wfd_device_s *wfd_peer_find_current_peer(void *data)
330 __WDS_LOG_FUNC_ENTER__;
331 wfd_manager_s *manager = (wfd_manager_s*) data;
333 WDS_LOGE("Invalid parameter");
337 wfd_session_s *session = manager->session;
339 WDS_LOGE("Session not found");
343 if (!session->peer) {
344 WDS_LOGE("Peer not found");
348 __WDS_LOG_FUNC_EXIT__;
349 return session->peer;
352 int wfd_peer_set_data(unsigned char *dev_addr, int type, int data)
354 __WDS_LOG_FUNC_ENTER__;
355 __WDS_LOG_FUNC_EXIT__;
359 int wfd_peer_get_data(unsigned char *dev_addr, int type, int data)
361 __WDS_LOG_FUNC_ENTER__;
362 __WDS_LOG_FUNC_EXIT__;