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)
33 #include <wifi-direct-internal.h>
35 #include "wifi-direct-manager.h"
36 #include "wifi-direct-oem.h"
37 #include "wifi-direct-util.h"
38 #include "wifi-direct-peer.h"
39 #include "wifi-direct-session.h"
42 wfd_device_s *wfd_add_peer(void *data, unsigned char *dev_addr, char *dev_name)
44 __WDS_LOG_FUNC_ENTER__;
45 wfd_manager_s *manager = (wfd_manager_s*) data;
46 wfd_device_s *peer = NULL;
48 if (!data || !dev_addr || !dev_name) {
49 WDS_LOGE("Invalid parameter");
50 __WDS_LOG_FUNC_EXIT__;
54 peer = wfd_peer_find_by_dev_addr(manager, dev_addr);
56 WDS_LOGE("Peer already exist[" MACSTR "]", MAC2STR(dev_addr));
57 __WDS_LOG_FUNC_EXIT__;
61 peer = (wfd_device_s*) calloc(1, sizeof(wfd_device_s));
62 memcpy(peer->dev_addr, dev_addr, MACADDR_LEN);
63 strncpy(peer->dev_name, dev_name, DEV_NAME_LEN);
64 peer->dev_name[DEV_NAME_LEN-1] = '\0';
66 manager->peers = g_list_prepend(manager->peers, peer);
67 manager->peer_count++;
68 WDS_LOGD("peer_count[%d]", manager->peer_count);
69 __WDS_LOG_FUNC_EXIT__;
73 int wfd_remove_peer(void *data, unsigned char *dev_addr)
75 __WDS_LOG_FUNC_ENTER__;
76 wfd_manager_s *manager = (wfd_manager_s*) data;
77 wfd_device_s *peer = NULL;
79 if (!data || !dev_addr) {
80 WDS_LOGE("Invalid parameter");
81 __WDS_LOG_FUNC_EXIT__;
85 peer = wfd_peer_find_by_dev_addr(manager, dev_addr);
87 WDS_LOGE("Failed to find peer device");
88 __WDS_LOG_FUNC_EXIT__;
92 manager->peers = g_list_remove(manager->peers, peer);
93 manager->peer_count--;
95 wfd_manager_init_service(peer);
96 if(peer->wifi_display)
97 free(peer->wifi_display);
99 __WDS_LOG_FUNC_EXIT__;
103 int wfd_update_peer_time(void*data, unsigned char *peer_addr)
105 __WDS_LOG_FUNC_ENTER__;
106 wfd_manager_s *manager = (wfd_manager_s*) data;
107 wfd_device_s *peer = NULL;
109 if (!manager || !peer_addr) {
110 WDS_LOGE("Invalid parameter");
114 peer = wfd_peer_find_by_dev_addr(manager, peer_addr);
116 WDS_LOGE("Peer not found [" MACSTR "]", MAC2STR(peer_addr));
121 gettimeofday(&tval, NULL);
122 peer->time = tval.tv_sec;
124 __WDS_LOG_FUNC_EXIT__;
128 int wfd_update_peer(void *data, wfd_device_s *peer)
130 __WDS_LOG_FUNC_ENTER__;
131 wfd_manager_s *manager = (wfd_manager_s*) data;
132 wfd_oem_device_s *oem_dev = NULL;
136 WDS_LOGE("Invalid parameter");
140 res = wfd_oem_get_peer_info(manager->oem_ops, peer->dev_addr, &oem_dev);
142 WDS_LOGE("Failed to get peer information");
146 if (oem_dev->age > 4 && peer->state == WFD_PEER_STATE_DISCOVERED) {
147 WDS_LOGE("Too old age to update peer");
150 strncpy(peer->dev_name, oem_dev->dev_name, DEV_NAME_LEN);
151 peer->dev_name[DEV_NAME_LEN] = '\0';
152 memcpy(peer->intf_addr, oem_dev->intf_addr, MACADDR_LEN);
153 memcpy(peer->go_dev_addr, oem_dev->go_dev_addr, MACADDR_LEN);
154 peer->dev_role = oem_dev->dev_role;
155 peer->config_methods = oem_dev->config_methods;
156 peer->pri_dev_type = oem_dev->pri_dev_type;
157 peer->sec_dev_type = oem_dev->sec_dev_type;
158 peer->dev_flags = oem_dev->dev_flags;
159 peer->group_flags = oem_dev->group_flags;
160 peer->wps_mode = oem_dev->wps_mode;
162 if(!peer->wifi_display)
163 peer->wifi_display = calloc(1, sizeof(wfd_display_info_s));
164 memcpy(peer->wifi_display, &oem_dev->wifi_display, sizeof(wfd_display_info_s));
167 gettimeofday(&tval, NULL);
168 peer->time = tval.tv_sec;
170 __WDS_LOG_FUNC_EXIT__;
174 int wfd_peer_clear_all(void *data)
176 __WDS_LOG_FUNC_ENTER__;
177 wfd_manager_s *manager = (wfd_manager_s*) data;
178 wfd_device_s *peer = NULL;
181 if (manager->peer_count == 0) {
182 WDS_LOGD("Peer not exist");
186 temp = g_list_first(manager->peers);
188 peer = (wfd_device_s*) temp->data;
189 wfd_manager_init_service(peer);
190 if(peer->wifi_display)
191 free(peer->wifi_display);
193 temp = g_list_next(temp);
194 manager->peer_count--;
196 g_list_free(manager->peers);
197 manager->peers = NULL;
199 if (manager->peer_count){
200 WDS_LOGE("Peer count is not synced. left count=%d", manager->peer_count);
201 manager->peer_count = 0;
205 __WDS_LOG_FUNC_EXIT__;
209 wfd_device_s *wfd_peer_find_by_dev_addr(void *data, unsigned char *dev_addr)
211 __WDS_LOG_FUNC_ENTER__;
212 wfd_manager_s *manager = (wfd_manager_s*) data;
213 wfd_device_s *peer = NULL;
216 if (!data || !dev_addr) {
217 WDS_LOGE("Invalid parameter");
221 if (manager->peer_count == 0) {
222 WDS_LOGE("There is no peer data");
226 temp = g_list_first(manager->peers);
229 if (!memcmp(peer->dev_addr, dev_addr, MACADDR_LEN)) {
230 WDS_LOGD("Peer device found[" MACSTR "]", MAC2STR(dev_addr));
233 temp = g_list_next(temp);
237 __WDS_LOG_FUNC_EXIT__;
241 wfd_device_s *wfd_peer_find_by_intf_addr(void *data, unsigned char *intf_addr)
243 __WDS_LOG_FUNC_ENTER__;
244 wfd_manager_s *manager = (wfd_manager_s*) data;
245 wfd_device_s *peer = NULL;
248 if (!data || !intf_addr) {
249 WDS_LOGE("Invalid parameter");
253 if (manager->peer_count == 0) {
254 WDS_LOGE("There is no peer data");
258 temp = g_list_first(manager->peers);
261 if (!memcmp(peer->intf_addr, intf_addr, MACADDR_LEN)) {
262 WDS_LOGD("Peer device found[" MACSTR "]", MAC2STR(intf_addr));
265 temp = g_list_next(temp);
269 __WDS_LOG_FUNC_EXIT__;
273 wfd_device_s *wfd_peer_find_by_addr(void *data, unsigned char *addr)
275 __WDS_LOG_FUNC_ENTER__;
276 wfd_manager_s *manager = (wfd_manager_s*) data;
277 wfd_device_s *peer = NULL;
280 if (!data || !addr) {
281 WDS_LOGE("Invalid parameter");
285 if (manager->peer_count == 0) {
286 WDS_LOGE("There is no peer data");
290 temp = g_list_first(manager->peers);
293 if (!memcmp(peer->dev_addr, addr, MACADDR_LEN) ||
294 !memcmp(peer->intf_addr, addr, MACADDR_LEN)) {
295 WDS_LOGE("Peer device found[" MACSTR "]", MAC2STR(addr));
298 temp = g_list_next(temp);
302 __WDS_LOG_FUNC_EXIT__;
306 wfd_device_s *wfd_peer_find_current_peer(void *data)
308 __WDS_LOG_FUNC_ENTER__;
309 wfd_device_s *peer = NULL;
310 wfd_manager_s *manager = (wfd_manager_s*) data;
312 WDS_LOGE("Invalid parameter");
316 wfd_session_s *session = manager->session;
318 WDS_LOGE("Session not found");
322 peer = session->peer;
324 __WDS_LOG_FUNC_EXIT__;
328 int wfd_peer_set_data(unsigned char *dev_addr, int type, int data)
330 __WDS_LOG_FUNC_ENTER__;
331 __WDS_LOG_FUNC_EXIT__;
335 int wfd_peer_get_data(unsigned char *dev_addr, int type, int data)
337 __WDS_LOG_FUNC_ENTER__;
338 __WDS_LOG_FUNC_EXIT__;