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);
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 if (!ISZEROMACADDR(oem_dev->intf_addr))
163 memcpy(peer->intf_addr, oem_dev->intf_addr, MACADDR_LEN);
164 memcpy(peer->go_dev_addr, oem_dev->go_dev_addr, MACADDR_LEN);
165 peer->channel = oem_dev->channel;
166 peer->dev_role = oem_dev->dev_role;
167 peer->config_methods = oem_dev->config_methods;
168 peer->pri_dev_type = oem_dev->pri_dev_type;
169 peer->sec_dev_type = oem_dev->sec_dev_type;
170 peer->dev_flags = oem_dev->dev_flags;
171 peer->group_flags = oem_dev->group_flags;
172 peer->wps_mode = oem_dev->wps_mode;
174 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
175 memcpy(&(peer->display), &(oem_dev->display), sizeof(wfd_display_s));
176 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
180 #if !(__GNUC__ <= 4 && __GNUC_MINOR__ < 8)
181 wfd_util_get_current_time(&peer->time);
184 gettimeofday(&tval, NULL);
185 peer->time = tval.tv_sec;
188 __WDS_LOG_FUNC_EXIT__;
192 int wfd_peer_clear_all(void *data)
194 __WDS_LOG_FUNC_ENTER__;
195 wfd_manager_s *manager = (wfd_manager_s*) data;
196 wfd_device_s *peer = NULL;
199 if (manager->peer_count == 0) {
200 WDS_LOGD("Peer not exist");
204 temp = g_list_first(manager->peers);
206 peer = (wfd_device_s*) temp->data;
208 temp = g_list_next(temp);
209 manager->peer_count--;
212 if (manager->peers) {
213 g_list_free(manager->peers);
214 manager->peers = NULL;
217 if (manager->peer_count) {
218 WDS_LOGE("Peer count is not synced. left count=%d", manager->peer_count);
219 manager->peer_count = 0;
223 __WDS_LOG_FUNC_EXIT__;
227 wfd_device_s *wfd_peer_find_by_dev_addr(void *data, unsigned char *dev_addr)
229 __WDS_LOG_FUNC_ENTER__;
230 wfd_manager_s *manager = (wfd_manager_s*) data;
231 wfd_device_s *peer = NULL;
234 if (!data || !dev_addr) {
235 WDS_LOGE("Invalid parameter");
239 if (manager->peer_count == 0) {
240 WDS_LOGE("There is no peer data");
244 temp = g_list_first(manager->peers);
247 if (!memcmp(peer->dev_addr, dev_addr, MACADDR_LEN)) {
248 WDS_LOGD("Peer device found[" MACSECSTR "]", MAC2SECSTR(dev_addr));
251 temp = g_list_next(temp);
255 __WDS_LOG_FUNC_EXIT__;
260 wfd_device_s *wfd_peer_find_by_intf_addr(void *data, unsigned char *intf_addr)
262 __WDS_LOG_FUNC_ENTER__;
263 wfd_manager_s *manager = (wfd_manager_s*) data;
264 wfd_device_s *peer = NULL;
267 if (!data || !intf_addr) {
268 WDS_LOGE("Invalid parameter");
272 if (manager->peer_count == 0) {
273 WDS_LOGE("There is no peer data");
277 temp = g_list_first(manager->peers);
280 if (!memcmp(peer->intf_addr, intf_addr, MACADDR_LEN)) {
281 WDS_LOGD("Peer device found[" MACSECSTR "]", MAC2SECSTR(intf_addr));
284 temp = g_list_next(temp);
288 __WDS_LOG_FUNC_EXIT__;
293 wfd_device_s *wfd_peer_find_by_addr(void *data, unsigned char *addr)
295 __WDS_LOG_FUNC_ENTER__;
296 wfd_manager_s *manager = (wfd_manager_s*) data;
297 wfd_device_s *peer = NULL;
300 if (!data || !addr) {
301 WDS_LOGE("Invalid parameter");
305 if (manager->peer_count == 0) {
306 WDS_LOGE("There is no peer data");
310 temp = g_list_first(manager->peers);
313 if (!memcmp(peer->dev_addr, addr, MACADDR_LEN) ||
314 !memcmp(peer->intf_addr, addr, MACADDR_LEN)) {
315 WDS_LOGD("Peer device found[" MACSECSTR "]", MAC2SECSTR(addr));
318 temp = g_list_next(temp);
322 __WDS_LOG_FUNC_EXIT__;
327 wfd_device_s *wfd_peer_find_current_peer(void *data)
329 __WDS_LOG_FUNC_ENTER__;
330 wfd_manager_s *manager = (wfd_manager_s*) data;
332 WDS_LOGE("Invalid parameter");
336 wfd_session_s *session = manager->session;
338 WDS_LOGE("Session not found");
342 if (!session->peer) {
343 WDS_LOGE("Peer not found");
347 __WDS_LOG_FUNC_EXIT__;
348 return session->peer;
351 int wfd_peer_set_data(unsigned char *dev_addr, int type, int data)
353 __WDS_LOG_FUNC_ENTER__;
354 __WDS_LOG_FUNC_EXIT__;
358 int wfd_peer_get_data(unsigned char *dev_addr, int type, int data)
360 __WDS_LOG_FUNC_ENTER__;
361 __WDS_LOG_FUNC_EXIT__;