INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/wifi-direct-dhcp.sh DESTINATION bin)
INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/p2p_supp.sh DESTINATION sbin)
INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/p2p_supp.conf DESTINATION etc/wifi-direct)
+INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/access_list DESTINATION etc/wifi-direct)
ADD_SUBDIRECTORY(plugin/wpasupplicant)
void *group;
GList *query_handles;
+ GList *access_list;
void *oem_ops;
void *plugin_handle;
int wfd_manager_get_req_wps_mode(int *req_wps_mode);
int wfd_manager_set_req_wps_mode(int req_wps_mode);
+int wfd_manager_access_control(wfd_manager_s *manager, unsigned char *dev_addr);
+int wfd_manager_add_to_access_list(wfd_manager_s *manager, wfd_device_s *peer, int allowed);
+int wfd_manager_del_from_access_list(wfd_manager_s *manager, unsigned char *mac);
+
int wfd_manager_service_add(wfd_manager_s *manager, wifi_direct_service_type_e type, char *data);
int wfd_manager_service_del(wfd_manager_s *manager, wifi_direct_service_type_e type, char *data);
int wfd_manager_serv_disc_req(wfd_manager_s *manager, unsigned char* mad_addr, wifi_direct_service_type_e type, char *data);
int wfd_manager_reject_connection(wfd_manager_s *manager, unsigned char *peer_addr);
int wfd_manager_disconnect(wfd_manager_s *manager, unsigned char *peer_addr);
int wfd_manager_disconnect_all(wfd_manager_s *manager);
+int wfd_manager_get_access_list(wfd_manager_s *manager, wfd_access_list_info_s **access_list_data);
int wfd_manager_get_peers(wfd_manager_s *manager, wfd_discovery_entry_s **peers);
int wfd_manager_get_connected_peers(wfd_manager_s *manager, wfd_connected_peer_info_s **peers_data);
wfd_device_s *wfd_manager_find_connected_peer(wfd_manager_s *manager, unsigned char *peer_addr);
#define __WIFI_DIRECT_UTIL_H__
#define DEFAULT_MAC_FILE_PATH "/opt/etc/.mac.info"
+#define DEFAULT_DEVICE_LIST_FILE_PATH "/usr/etc/wifi-direct/access_list"
#define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]
#define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x"
#define IP2STR(a) (a)[0], (a)[1], (a)[2], (a)[3]
int wfd_util_get_wifi_direct_state();
int wfd_util_set_wifi_direct_state(int state);
int wfd_util_get_local_dev_mac(unsigned char *dev_mac);
+
+int wfd_util_get_access_list(GList **access_list);
+int wfd_util_rewrite_device_list_to_file(GList *access_list);
+int wfd_util_add_device_to_list(wfd_device_s *peer, int allowed);
+int wfd_util_reset_access_list_file();
int wfd_util_start_wifi_direct_popup();
int wfd_util_dhcps_start();
int wfd_util_dhcps_wait_ip_leased(wfd_device_s *peer);
+Fri, 07 Mar 2014 Jiung Yu <jiung.yu@samaung.com> (1.0.10)
+ * Add support for managing device access list
+
Thu, 13 Feb 2014 Jiung Yu <jiung.yu@samaung.com> (1.0.9)
* Add Wifi Direct Display support
Name: wifi-direct-manager
Summary: Wi-Fi Direct manger
-Version: 1.0.9
+Version: 1.0.10
Release: 1
Group: Network & Connectivity/Wireless
License: Apache-2.0
/usr/etc/wifi-direct/dhcpd.p2p.conf
/usr/etc/wifi-direct/udhcp_script.non-autoip
/usr/etc/wifi-direct/p2p_supp.conf
+/usr/etc/wifi-direct/access_list
%{_bindir}/dhcpd-notify.sh
%{_bindir}/wifi-direct-server.sh
%{_bindir}/wifi-direct-dhcp.sh
return "WIFI_DIRECT_CMD_GET_DISPLAY_PORT";
case WIFI_DIRECT_CMD_GET_DISPLAY_TYPE:
return "WIFI_DIRECT_CMD_GET_DISPLAY_TYPE";
+ case WIFI_DIRECT_CMD_GET_ACCESS_LIST:
+ return"WIFI_DIRECT_CMD_GET_ACCESS_LIST";
+ case WIFI_DIRECT_CMD_ADD_TO_ACCESS_LIST:
+ return "WIFI_DIRECT_CMD_ADD_TO_ACCESS_LIST";
+ case WIFI_DIRECT_CMD_DEL_FROM_ACCESS_LIST:
+ return "WIFI_DIRECT_CMD_DEL_FROM_ACCESS_LIST";
default:
return "WIFI_DIRECT_CMD_INVALID";
break;
case WIFI_DIRECT_CMD_GET_DISPLAY_TYPE:
{
- res = wfd_local_get_display_type(&rsp.param1);
+ res = wfd_local_get_display_type((wifi_direct_display_type_e *)&rsp.param1);
if (res < 0) {
WDS_LOGE("Failed to get local wifi display type");
rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
}
}
break;
+ case WIFI_DIRECT_CMD_GET_ACCESS_LIST:
+ {
+ wfd_access_list_info_s *devices = NULL;
+ int device_cnt = 0;
+ device_cnt = wfd_manager_get_access_list(manager, &devices);
+ WDS_LOGD("device in access list count [%d], access list [%x]", device_cnt, devices);
+ if (device_cnt < 0) {
+ WDS_LOGE("Failed to get access list");
+ rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ break;
+ }
+ rsp.param1 = device_cnt;
+ rsp.result = WIFI_DIRECT_ERROR_NONE;
+
+ rsp.data_length = device_cnt * sizeof(wfd_access_list_info_s);
+ extra_rsp = (char*) devices;
+ WDS_LOGD("extra_rsp length [%d], extra_rsp [%x]", rsp.data_length, extra_rsp);
+ }
+ break;
+ case WIFI_DIRECT_CMD_ADD_TO_ACCESS_LIST:
+ {
+ wfd_device_s *peer = NULL;
+ peer = wfd_peer_find_by_addr(manager, req.data.mac_addr);
+ if(peer)
+ res = wfd_manager_add_to_access_list(manager, peer, req.data.int1);
+ else
+ res = -1;
+
+ if (res < 0) {
+ WDS_LOGE("Failed to add device to list");
+ rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ }
+ }
+ break;
+ case WIFI_DIRECT_CMD_DEL_FROM_ACCESS_LIST:
+ {
+ res = wfd_manager_del_from_access_list(manager, req.data.mac_addr);
+ if (res < 0) {
+ WDS_LOGE("Failed to delete device from list");
+ rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ }
+ }
+ break;
default:
WDS_LOGE("Unknown command[%d]", req.cmd);
rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
case WFD_OEM_EVENT_PROV_DISC_DISPLAY:
case WFD_OEM_EVENT_PROV_DISC_KEYPAD:
{
+ wfd_group_s *group = (wfd_group_s*) manager->group;
+ if ((group && group->member_count >= manager->max_station) ||
+ !wfd_manager_access_control(manager, event->dev_addr)) {
+ WDS_LOGD("Provision discovery is not granted");
+ break;
+ }
+
wfd_device_s *peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
if (!peer) {
WDS_LOGD("Porv_disc from unknown peer. Add new peer");
break;
case WFD_OEM_EVENT_INVITATION_REQ:
{
+ if (!wfd_manager_access_control(manager, event->dev_addr)) {
+ WDS_LOGD("Invitation request is not granted");
+ break;
+ }
wfd_device_s *peer = NULL;
wfd_session_s *session = NULL;
wfd_oem_invite_data_s *edata = (wfd_oem_invite_data_s*) event->edata;
}
break;
case WFD_OEM_EVENT_GO_NEG_REQ:
+ {
+ if (!wfd_manager_access_control(manager, event->dev_addr)) {
+ WDS_LOGD("GO negotiation is not granted");
+ break;
+ }
+ }
case WFD_OEM_EVENT_GO_NEG_DONE:
case WFD_OEM_EVENT_WPS_DONE:
wfd_session_process_event(manager, event);
break;
}
+ if(wfd_manager_find_connected_peer(manager, event->intf_addr)) {
+ WDS_LOGD("Ignore this event");
+ break;
+ }
+
wfd_session_s *session = (wfd_session_s*) manager->session;
if (!session) {
WDS_LOGE("Unexpected event. Session is NULL [peer: " MACSTR "]",
if (res < 0) {
WDS_LOGE("Failed to get local device MAC address");
}
-
memcpy(local->intf_addr, local->dev_addr, MACADDR_LEN);
local->intf_addr[4] ^= 0x80;
WDS_LOGD("Local Interface MAC address [" MACSTR "]", MAC2STR(local->intf_addr));
return res;
}
+int wfd_manager_get_access_list(wfd_manager_s *manager, wfd_access_list_info_s **access_list_data)
+{
+ __WDS_LOG_FUNC_ENTER__;
+ GList *temp = NULL;
+ wfd_access_list_info_s *device = NULL;
+ wfd_access_list_info_s *devices = NULL;
+ int device_count = 0;
+ int count = 0;
+ int res = 0;
+
+ if (!manager || !access_list_data) {
+ WDS_LOGE("Invalid parameter");
+ return -1;
+ }
+
+ device_count = g_list_length(manager->access_list);
+ if (device_count < 0)
+ return -1;
+ else if (device_count == 0)
+ return 0;
+
+ errno = 0;
+ devices = (wfd_access_list_info_s*) calloc(device_count, sizeof(wfd_access_list_info_s));
+ if (!devices) {
+ WDS_LOGF("Failed to allocate memory for access list. [%s]", strerror(errno));
+ return -1;
+ }
+
+ temp = g_list_first(manager->access_list);
+ while (temp && count < device_count) {
+ device = temp->data;
+ if (!device)
+ goto next;
+
+ strncpy(devices[count].device_name, device->device_name, DEV_NAME_LEN);
+ devices[count].device_name[DEV_NAME_LEN] = '\0';
+ memcpy(devices[count].mac_address, device->mac_address, MACADDR_LEN);
+ devices[count].allowed = device->allowed;
+
+ count++;
+ WDS_LOGD("%dth device in list [%s]", count, device->device_name);
+next:
+ temp = g_list_next(temp);
+ device = NULL;
+ }
+ WDS_LOGD("%d devices converted", count);
+ WDS_LOGD("Final device count is %d", device_count);
+
+ *access_list_data = devices;
+
+ __WDS_LOG_FUNC_EXIT__;
+ return count;
+}
+
int wfd_manager_get_peers(wfd_manager_s *manager, wfd_discovery_entry_s **peers_data)
{
__WDS_LOG_FUNC_ENTER__;
return 0;
}
+static wfd_access_list_info_s *_wfd_manager_get_device_from_access_list(void *data, unsigned char *dev_addr)
+{
+ __WDS_LOG_FUNC_ENTER__;
+ wfd_manager_s *manager = (wfd_manager_s*) data;
+ wfd_access_list_info_s *device = NULL;
+ GList *temp = NULL;
+
+ if (!data || !dev_addr) {
+ WDS_LOGE("Invalid parameter");
+ return NULL;
+ }
+
+ temp = g_list_first(manager->access_list);
+ while (temp) {
+ device = temp->data;
+ if (!memcmp(device->mac_address, dev_addr, MACADDR_LEN)) {
+ WDS_LOGD("device found[" MACSTR "]", MAC2STR(dev_addr));
+ break;
+ }
+ temp = g_list_next(temp);
+ device = NULL;
+ }
+
+ __WDS_LOG_FUNC_EXIT__;
+ return device;
+}
+
+int wfd_manager_access_control(wfd_manager_s *manager, unsigned char *dev_addr)
+{
+ __WDS_LOG_FUNC_ENTER__;
+ wfd_access_list_info_s *result = NULL;
+ int res = 0;
+
+ result = _wfd_manager_get_device_from_access_list(manager, dev_addr);
+
+ if(result)
+ res = result->allowed;
+ else
+ res = 1;
+
+ __WDS_LOG_FUNC_EXIT__;
+ return res;
+}
+
+int wfd_manager_add_to_access_list(wfd_manager_s *manager, wfd_device_s *peer, int allowed)
+{
+ __WDS_LOG_FUNC_ENTER__;
+ wfd_access_list_info_s *result = NULL;
+ GList *temp = NULL;
+ int res = 0;
+
+ result = _wfd_manager_get_device_from_access_list(manager, peer->dev_addr);
+ if(result)
+ {
+ if(result->allowed == allowed &&
+ !strcmp(result->device_name, peer->dev_name))
+ {
+ WDS_LOGD("already exist");
+ __WDS_LOG_FUNC_EXIT__;
+ return res;
+ }else {
+
+ result->allowed = allowed;
+ strncpy(result->device_name, peer->dev_name, DEV_NAME_LEN);
+ result->device_name[DEV_NAME_LEN] = '\0';
+ res = wfd_util_rewrite_device_list_to_file(manager->access_list);
+ if(res < 0)
+ {
+ WDS_LOGE("fail to modify the peer in access list file");
+ }
+
+ }
+ }else {
+
+ res = wfd_util_add_device_to_list(peer, allowed);
+ if(res > 0)
+ {
+ result = calloc(1, sizeof(wfd_access_list_info_s));
+ strncpy(result->mac_address, peer->dev_addr, MACADDR_LEN);
+ strncpy(result->device_name, peer->dev_name, DEV_NAME_LEN);
+ result->device_name[DEV_NAME_LEN] = '\0';
+ result->allowed = allowed;
+ manager->access_list = g_list_append(manager->access_list, result);
+ }else {
+ WDS_LOGE("fail to append peer to access list file");
+ res = -1;
+ }
+ }
+ __WDS_LOG_FUNC_EXIT__;
+ return res;
+}
+
+int wfd_manager_del_from_access_list(wfd_manager_s *manager, unsigned char *mac)
+{
+ __WDS_LOG_FUNC_ENTER__;
+ wfd_access_list_info_s *device = NULL;
+ GList *temp = NULL;
+ int res = 0;
+
+ device = _wfd_manager_get_device_from_access_list(manager, mac);
+ if(device)
+ {
+ manager->access_list = g_list_remove(manager->access_list , device);
+ free(device);
+
+ res = wfd_util_rewrite_device_list_to_file(manager->access_list);
+ if (res < 0)
+ WDS_LOGE("fail to remove device from list file!");
+
+
+ }else if(!memcmp(mac,"\0x00\0x00\0x00\0x00\0x00\0x00",MACADDR_LEN)){
+
+ res = wfd_util_reset_access_list_file();
+ if(res == 0)
+ {
+ g_list_foreach (manager->access_list, (GFunc)g_free, NULL);
+ g_list_free (manager->access_list);
+ manager->access_list = NULL;
+ }else {
+ WDS_LOGE("fail to reset access list file");
+ }
+
+ }else {
+ WDS_LOGD("device dose not exist");
+ }
+ __WDS_LOG_FUNC_EXIT__;
+ return res;
+}
+
static wfd_service_s *_wfd_service_find(wfd_device_s *device, wifi_direct_service_type_e type, char *data)
{
__WDS_LOG_FUNC_ENTER__;
manager->req_wps_mode = WFD_WPS_MODE_PBC;
manager->max_station = 8;
+ res = wfd_util_get_access_list(&(manager->access_list));
+ if (res < 0) {
+ WDS_LOGE("Failed to get access list");
+ }
+
res = _wfd_local_init_device(manager);
if (res < 0) {
WDS_LOGE("Failed to initialize local device");
g_source_remove(manager->exit_timer);
manager->exit_timer = 0;
+ g_list_foreach (manager->access_list, (GFunc)g_free, NULL);
+ g_list_free (manager->access_list);
+ manager->access_list = NULL;
+
_wfd_local_deinit_device(manager);
if (manager)
return 0;
}
+int wfd_util_get_access_list(GList **access_list)
+{
+ __WDS_LOG_FUNC_ENTER__;
+
+ wfd_access_list_info_s * device = NULL;
+ char device_info[MACSTR_LEN + DEV_NAME_LEN + 1] = {0, };
+ char dev_mac[MACADDR_LEN] = {0, };
+ int info_str_len = 0;
+
+ FILE *fd = NULL;
+ int res = 0;
+
+
+ fd = fopen(DEFAULT_DEVICE_LIST_FILE_PATH, "r");
+ if (!fd) {
+ WDS_LOGE("Failed to open access list file (%s)", strerror(errno));
+ __WDS_LOG_FUNC_EXIT__;
+ return -1;
+ }
+
+ while ((res = fgets(device_info, MACSTR_LEN + DEV_NAME_LEN + 2, fd)) != NULL)
+ {
+ if (device_info[0] == '\0') {
+ printf("end of list\n");
+ fclose(fd);
+ return 0;
+ }
+
+ info_str_len = strlen(device_info);
+ if(info_str_len > MACSTR_LEN)
+ device_info[info_str_len -1] = '\0';
+
+ res = _txt_to_mac(device_info, dev_mac);
+ if (res < 0) {
+ WDS_LOGE("Failed to convert text to MAC address");
+ continue;
+ }
+
+ device = calloc(1, sizeof(wfd_access_list_info_s));
+ memcpy(device->mac_address, dev_mac, MACADDR_LEN);
+ strncpy(device->device_name, &device_info[MACSTR_LEN], strlen(&device_info[MACSTR_LEN]));
+ device->allowed = (device_info[MACSTR_LEN - 1] == 'O');
+
+ *access_list = g_list_append(*access_list, device);
+ }
+ fclose(fd);
+ __WDS_LOG_FUNC_EXIT__;
+ return 0;
+}
+
+int wfd_util_rewrite_device_list_to_file(GList *access_list)
+{
+ __WDS_LOG_FUNC_ENTER__;
+ FILE *fd = NULL;
+ GList *temp = NULL;
+ wfd_access_list_info_s * device = NULL;
+
+ int list_cnt =0;
+ char * buf = NULL;
+ char * ptr = NULL;
+
+ int res = 0;
+ int i;
+
+ list_cnt = g_list_length(access_list);
+
+ fd = fopen(DEFAULT_DEVICE_LIST_FILE_PATH, "w");
+ if (!fd) {
+ WDS_LOGE("Failed to open access list file (%s)", strerror(errno));
+ free(buf);
+ __WDS_LOG_FUNC_EXIT__;
+ return -1;
+ }
+ if(list_cnt > 0)
+ {
+ buf = calloc(1,(MACSTR_LEN + DEV_NAME_LEN + 1)*list_cnt +1);
+ ptr = buf;
+ temp = g_list_first(access_list);
+
+ for(i =0; i < list_cnt; i++)
+ {
+ device = (wfd_access_list_info_s *)temp->data;
+ snprintf(ptr, MACSTR_LEN + DEV_NAME_LEN + 2, MACSTR "%c%s\n",
+ MAC2STR(device->mac_address), device->allowed?'O':'X', device->device_name);
+ ptr+=strlen(ptr);
+ temp = g_list_next(temp);
+ }
+ res = fprintf(fd, "%s",buf);
+ }
+
+ fclose(fd);
+ if(buf != NULL)
+ free(buf);
+ __WDS_LOG_FUNC_EXIT__;
+ return res;
+}
+
+int wfd_util_add_device_to_list(wfd_device_s *peer, int allowed)
+{
+ __WDS_LOG_FUNC_ENTER__;
+ FILE *fd = NULL;
+ char buf[MACSTR_LEN + DEV_NAME_LEN + 2] = {0, };
+ int res = 0;
+
+ if(peer == NULL)
+ {
+ WDS_LOGD("There is nothing to add to list");
+ return -1;
+ }
+
+ snprintf(buf, MACSTR_LEN + DEV_NAME_LEN + 2, MACSTR "%c%s\n",
+ MAC2STR(peer->dev_addr), allowed?'O':'X', peer->dev_name);
+
+ fd = fopen(DEFAULT_DEVICE_LIST_FILE_PATH, "a");
+ if (!fd) {
+ WDS_LOGE("Failed to open access list file (%s)", strerror(errno));
+ __WDS_LOG_FUNC_EXIT__;
+ return -1;
+ }
+ res = fprintf(fd,"%s", buf);
+
+ if(res < 0)
+ WDS_LOGE("Failed to write to access list file (%s)", strerror(errno));
+
+ fclose(fd);
+ __WDS_LOG_FUNC_EXIT__;
+ return res;
+}
+
+int wfd_util_reset_access_list_file()
+{
+ __WDS_LOG_FUNC_ENTER__;
+ int res = 0;
+
+ FILE *fd = NULL;
+ fd = fopen(DEFAULT_DEVICE_LIST_FILE_PATH, "w");
+
+ if (!fd) {
+ WDS_LOGE("Failed to open reset access list file (%s)", strerror(errno));
+ res = -1;
+ }
+ fclose(fd);
+
+ __WDS_LOG_FUNC_EXIT__;
+ return 0;
+
+}
+
int wfd_util_start_wifi_direct_popup()
{
__WDS_LOG_FUNC_ENTER__;