* Modifiy Provision Discovery Request/Response Event 08/18008/1
authorJiung Yu <jiung.yu@samsung.com>
Fri, 14 Mar 2014 02:08:45 +0000 (11:08 +0900)
committerJiung Yu <jiung.yu@samsung.com>
Fri, 14 Mar 2014 02:09:15 +0000 (11:09 +0900)
  * Add automatic connection using device access list

Change-Id: I8bd4131b88ca515d39e3599eca070a127d77b44d
Signed-off-by: Yu jiung <jiung.yu@samsung.com>
include/wifi-direct-manager.h
oem/wifi-direct-oem.h
packaging/wifi-direct-manager.changes
packaging/wifi-direct-manager.spec
plugin/wpasupplicant/wfd-plugin-wpasupplicant.c
plugin/wpasupplicant/wfd-plugin-wpasupplicant.h
src/wifi-direct-event.c
src/wifi-direct-manager.c
src/wifi-direct-session.c

index c45505e..8141552 100644 (file)
@@ -73,6 +73,12 @@ typedef enum {
        WFD_SCAN_MODE_PASSIVE,
 } wfd_scan_mode_e;
 
+typedef enum {
+       WFD_DEV_DENIED,
+       WFD_DEV_ALLOWED,
+       WFD_DEV_UNKNOWN,
+}wfd_dev_connection_flag_e;
+
 typedef struct {
        wifi_direct_display_type_e type;
        char dev_info[2];
index 2b597eb..eb315e6 100644 (file)
@@ -45,34 +45,32 @@ typedef enum {
        WFD_OEM_EVENT_DISCOVERY_FINISHED,
 
        WFD_OEM_EVENT_PROV_DISC_REQ,    // 5
-       WFD_OEM_EVENT_PROV_DISC_DISPLAY,
-       WFD_OEM_EVENT_PROV_DISC_KEYPAD,
        WFD_OEM_EVENT_PROV_DISC_RESP,
        WFD_OEM_EVENT_PROV_DISC_FAIL,
 
-       WFD_OEM_EVENT_GO_NEG_REQ,       // 10
+       WFD_OEM_EVENT_GO_NEG_REQ,
        WFD_OEM_EVENT_GO_NEG_FAIL,
-       WFD_OEM_EVENT_GO_NEG_DONE,
+       WFD_OEM_EVENT_GO_NEG_DONE,              // 10
        WFD_OEM_EVENT_WPS_FAIL,
        WFD_OEM_EVENT_WPS_DONE,
-       WFD_OEM_EVENT_KEY_NEG_FAIL,     // 15
+       WFD_OEM_EVENT_KEY_NEG_FAIL,
        WFD_OEM_EVENT_KEY_NEG_DONE,
 
-       WFD_OEM_EVENT_CONN_FAIL,
+       WFD_OEM_EVENT_CONN_FAIL,                // 15
        WFD_OEM_EVENT_CONN_DONE,
 
        WFD_OEM_EVENT_GROUP_CREATED,
-       WFD_OEM_EVENT_GROUP_DESTROYED,  // 20
+       WFD_OEM_EVENT_GROUP_DESTROYED,
 
        WFD_OEM_EVENT_INVITATION_REQ,
-       WFD_OEM_EVENT_INVITATION_RES,
+       WFD_OEM_EVENT_INVITATION_RES,   // 20
        WFD_OEM_EVENT_STA_CONNECTED,
        WFD_OEM_EVENT_STA_DISCONNECTED,
 
-       WFD_OEM_EVENT_CONNECTED,        // 25
+       WFD_OEM_EVENT_CONNECTED,
        WFD_OEM_EVENT_DISCONNECTED,
 
-       WFD_OEM_EVENT_SERV_DISC_RESP,
+       WFD_OEM_EVENT_SERV_DISC_RESP,   // 25
 
        WFD_OEM_EVENT_TERMINATING,
 
index 5e31730..d016a0d 100644 (file)
@@ -1,3 +1,7 @@
+Fri, 14 Mar 2014 Jiung Yu <jiung.yu@samaung.com> (1.0.11)
+  * Modifiy Provision Discovery Request/Response Event
+  * Add automatic connection using device access list
+
 Fri, 07 Mar 2014 Jiung Yu <jiung.yu@samaung.com> (1.0.10)
   * Add support for managing device access list
 
index 96979af..86c4dd7 100644 (file)
@@ -1,6 +1,6 @@
 Name:       wifi-direct-manager
 Summary:    Wi-Fi Direct manger
-Version:    1.0.10
+Version:    1.0.11
 Release:    1
 Group:      Network & Connectivity/Wireless
 License:    Apache-2.0
index 1d66acc..fb9ba3b 100644 (file)
@@ -31,6 +31,7 @@
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <sys/un.h>
+#include <sys/wait.h>
 #include <unistd.h>
 #include <fcntl.h>
 #define _GNU_SOURCE
@@ -210,6 +211,7 @@ static wfd_oem_ops_s supplicant_ops = {
        };
 
 static ws_plugin_data_s *g_pd;
+static unsigned char null_mac[OEM_MACADDR_LEN];
 
 static gboolean ws_event_handler(GIOChannel *source,
                                                           GIOCondition condition,
@@ -1022,7 +1024,6 @@ static int _parsing_peer_info(char *msg, wfd_oem_device_s *peer)
                                if (res < 0)
                                        memset(peer->go_dev_addr, 0x00, OEM_MACADDR_LEN);
 
-                               unsigned char null_mac[OEM_MACADDR_LEN] = {0, 0, 0, 0, 0, 0};
                                if (memcmp(peer->go_dev_addr, null_mac, OEM_MACADDR_LEN))
                                        peer->dev_role = WFD_OEM_DEV_ROLE_GC;
                        }
@@ -1761,10 +1762,14 @@ static gboolean ws_event_handler(GIOChannel *source,
                event_id = WFD_OEM_EVENT_PROV_DISC_RESP;
                break;
        case WS_EVENT_PROV_DISC_SHOW_PIN:
-               event_id = WFD_OEM_EVENT_PROV_DISC_DISPLAY;
-               break;
        case WS_EVENT_PROV_DISC_ENTER_PIN:
-               event_id = WFD_OEM_EVENT_PROV_DISC_KEYPAD;
+               if (!memcmp(g_pd->pd_addr, event->dev_addr, OEM_MACADDR_LEN))
+                       event_id = WFD_OEM_EVENT_PROV_DISC_RESP;
+               else if (!memcmp(g_pd->pd_addr, null_mac, OEM_MACADDR_LEN))
+                       event_id = WFD_OEM_EVENT_PROV_DISC_REQ;
+               else
+                       goto done;
+               memset(g_pd->pd_addr, 0x0, OEM_MACADDR_LEN);
                break;
        case WS_EVENT_GO_NEG_REQUEST:
                event_id = WFD_OEM_EVENT_GO_NEG_REQ;
@@ -1789,7 +1794,6 @@ static gboolean ws_event_handler(GIOChannel *source,
                break;
        case WS_EVENT_CONNECTED:
                {
-                       unsigned char null_mac[OEM_MACADDR_LEN] = {0, 0, 0, 0, 0, 0};
                        if (!memcmp(event->intf_addr, null_mac, OEM_MACADDR_LEN))
                                goto done;
                        event_id = WFD_OEM_EVENT_CONNECTED;
@@ -1818,9 +1822,7 @@ static gboolean ws_event_handler(GIOChannel *source,
                }
                break;
        case WS_EVENT_INVITATION_RECEIVED:
-               {
-                       event_id = WFD_OEM_EVENT_INVITATION_REQ;
-               }
+               event_id = WFD_OEM_EVENT_INVITATION_REQ;
                break;
        case WS_EVENT_INVITATION_RESULT:
                event_id = WFD_OEM_EVENT_INVITATION_RES;
@@ -2299,7 +2301,6 @@ int ws_prov_disc_req(unsigned char *peer_addr, wfd_oem_wps_mode_e wps_mode, int
                return -1;
        }
 
-
        snprintf(cmd, sizeof(cmd), WS_CMD_P2P_PROV_DISC MACSTR "%s",
                                                        MAC2STR(peer_addr), _ws_wps_to_txt(wps_mode));
 
@@ -2319,6 +2320,7 @@ int ws_prov_disc_req(unsigned char *peer_addr, wfd_oem_wps_mode_e wps_mode, int
                return -1;
        }
        WDP_LOGD("Succeeded to send provision discovery to peer[" MACSTR "]", MAC2STR(peer_addr));
+       memcpy(g_pd->pd_addr, peer_addr, OEM_MACADDR_LEN);
 
        __WDP_LOG_FUNC_EXIT__;
        return 0;
index e4a7ff3..0cb4673 100644 (file)
@@ -491,6 +491,9 @@ typedef struct {
        ws_sock_data_s *common;
        ws_sock_data_s *group;
        int group_cnt;
+
+       unsigned char pd_addr[OEM_MACADDR_LEN];
+
        wfd_oem_event_cb callback;
        void *user_data;
 } ws_plugin_data_s;
index b75c45a..28a4228 100644 (file)
@@ -416,12 +416,10 @@ int wfd_process_event(void *user_data, void *data)
        break;
        case WFD_OEM_EVENT_PROV_DISC_REQ:
        case WFD_OEM_EVENT_PROV_DISC_RESP:
-       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)) {
+                               (wfd_manager_access_control(manager, event->dev_addr) == WFD_DEV_DENIED)) {
                        WDS_LOGD("Provision discovery is not granted");
                        break;
                }
@@ -482,7 +480,9 @@ int wfd_process_event(void *user_data, void *data)
        break;
        case WFD_OEM_EVENT_INVITATION_REQ:
        {
-               if (!wfd_manager_access_control(manager, event->dev_addr)) {
+               wfd_dev_connection_flag_e flag = 0;
+               flag = wfd_manager_access_control(manager, event->dev_addr);
+               if (flag == WFD_DEV_DENIED) {
                        WDS_LOGD("Invitation request is not granted");
                        break;
                }
@@ -513,18 +513,24 @@ int wfd_process_event(void *user_data, void *data)
                wfd_session_timer(session, 1);
 
                wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
-
-               wifi_direct_client_noti_s noti;
-               memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
-               noti.event = WIFI_DIRECT_CLI_EVENT_INVITATION_REQ;
-               noti.error = WIFI_DIRECT_ERROR_NONE;
-               snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(event->dev_addr));
-               wfd_client_send_event(manager, &noti);
+               if(flag == WFD_DEV_UNKNOWN)
+               {
+                       WDS_LOGD("device is not in access/deny list");
+                       wifi_direct_client_noti_s noti;
+                       memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
+                       noti.event = WIFI_DIRECT_CLI_EVENT_INVITATION_REQ;
+                       noti.error = WIFI_DIRECT_ERROR_NONE;
+                       snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(event->dev_addr));
+                       wfd_client_send_event(manager, &noti);
+               }else {
+                       WDS_LOGD("device is allowed");
+                       wfd_session_start(session);
+               }
        }
        break;
        case WFD_OEM_EVENT_GO_NEG_REQ:
        {
-               if (!wfd_manager_access_control(manager, event->dev_addr)) {
+               if (wfd_manager_access_control(manager, event->dev_addr) == WFD_DEV_DENIED) {
                        WDS_LOGD("GO negotiation is not granted");
                        break;
                }
index 17f0c28..67b903d 100644 (file)
@@ -1239,7 +1239,7 @@ int wfd_manager_access_control(wfd_manager_s *manager, unsigned char *dev_addr)
        if(result)
                res = result->allowed;
        else
-               res = 1;
+               res = WFD_DEV_UNKNOWN;
 
        __WDS_LOG_FUNC_EXIT__;
        return res;
index c167d47..5bc3abe 100644 (file)
@@ -608,100 +608,65 @@ int wfd_session_process_event(wfd_manager_s *manager, wfd_oem_event_s *event)
                return -1;
        }
 
+       wfd_dev_connection_flag_e flag = 0;
+       flag = wfd_manager_access_control(manager, event->dev_addr);
+
        WDS_LOGD("event ID [%d]", event->event_id);
        session = manager->session;
 
        switch (event->event_id) {
        case WFD_OEM_EVENT_PROV_DISC_REQ:
-       case WFD_OEM_EVENT_PROV_DISC_DISPLAY:
-       case WFD_OEM_EVENT_PROV_DISC_KEYPAD:
        {
-               if (!session) {
-                       int req_wps_mode = WFD_WPS_MODE_NONE;
-                       int wps_mode = event->wps_mode;
-
-                       if (wps_mode == WFD_WPS_MODE_DISPLAY) {
-                               req_wps_mode = WFD_WPS_MODE_KEYPAD;
-                       } else if (wps_mode == WFD_WPS_MODE_KEYPAD) {
-                               req_wps_mode = WFD_WPS_MODE_DISPLAY;
-                       } else {
-                               req_wps_mode = WFD_WPS_MODE_PBC;
-                       }
+               if (session) {
+                       WDS_LOGE("Unexpected event. Session already exist. This request should be ignored");
+                       break;
+               }
 
-                       session = wfd_create_session(manager, event->dev_addr,
-                                                                               req_wps_mode, SESSION_DIRECTION_INCOMING);
-                       if (!session) {
-                               WDS_LOGE("Failed to create session with peer [" MACSTR "]", MAC2STR(event->dev_addr));
-                               break;
-                       }
+               /* Create new session */
+               session = wfd_create_session(manager, event->dev_addr,
+                                               event->wps_mode, SESSION_DIRECTION_INCOMING);
+               if (!session) {
+                       WDS_LOGE("Failed to create session with peer [" MACSTR "]",
+                                               MAC2STR(event->dev_addr));
+                       break;
+               }
 
-                       /* Update session */
-                       if (wps_mode == WFD_WPS_MODE_DISPLAY) {
-                               strncpy(session->wps_pin, event->wps_pin, PINSTR_LEN);
-                               session->wps_pin[PINSTR_LEN] = '\0';
-                       }
-                       session->state = SESSION_STATE_STARTED;
-                       wfd_session_timer(session, 1);
+               /* Update session */
+               if (event->wps_mode == WFD_OEM_WPS_MODE_DISPLAY) {
+                       strncpy(session->wps_pin, event->wps_pin, PINSTR_LEN);
+                       session->wps_pin[PINSTR_LEN] = '\0';
+               }
+               session->state = SESSION_STATE_STARTED;
+               wfd_session_timer(session, 1);
 
-                       manager->local->wps_mode = event->wps_mode;
+               /* Update manager */
+               manager->local->wps_mode = event->wps_mode;
+               wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
 
-                       wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
+               if(flag == WFD_DEV_ALLOWED)
+               {
+                       WDS_LOGD("device is allowed");
+                       if (manager->local->dev_role == WFD_DEV_ROLE_GO)
+                               wfd_session_wps(session);
+                       else
+                               wfd_session_connect(session);
 
+               }else {
+                       /* Send event to application */
+                       WDS_LOGD("device is not in access/deny list");
                        wifi_direct_client_noti_s noti;
                        memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
                        noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_REQ;
                        noti.error = WIFI_DIRECT_ERROR_NONE;
                        snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(event->dev_addr));
                        wfd_client_send_event(manager, &noti);
-               } else {
-                       if (session->state > SESSION_STATE_STARTED ||
-                                       session->direction == SESSION_DIRECTION_INCOMING) {
-                               WDS_LOGE("Unexpected event. Session is already started");
-                               break;
-                       }
-
-                       session->wps_mode = event->wps_mode;
-                       if (event->wps_mode == WFD_WPS_MODE_DISPLAY) {
-                               session->req_wps_mode = WFD_WPS_MODE_KEYPAD;
-                               strncpy(session->wps_pin, event->wps_pin, PINSTR_LEN);
-                               session->wps_pin[PINSTR_LEN] = '\0';
-                       } else if (event->wps_mode == WFD_WPS_MODE_KEYPAD) {
-                               session->req_wps_mode = WFD_WPS_MODE_DISPLAY;
-                       } else {
-                               session->req_wps_mode = WFD_WPS_MODE_PBC;
-                       }
-                       session->state = SESSION_STATE_STARTED;
-                       wfd_session_timer(session, 1);
-
-                       manager->local->wps_mode = event->wps_mode;
-                       WDS_LOGD("Local WPS mode is %d", session->wps_mode);
-
-                       if (session->wps_mode != WFD_WPS_MODE_PBC) {
-                               wifi_direct_client_noti_s noti;
-                               memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
-                               noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_WPS_REQ;
-                               snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(event->dev_addr));
-                               wfd_client_send_event(manager, &noti);
-                               if (session->wps_mode == WFD_WPS_MODE_KEYPAD)
-                                       break;
-                       }
-
-                       if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
-                               WDS_LOGD("Start WPS corresponding to OEM event [%d]", event->event_id);
-                               wfd_session_wps(session);
-                       } else if (session->peer->dev_role == WFD_DEV_ROLE_GO) {
-                               WDS_LOGD("Start WPS(join) corresponding to OEM event [%d]", event->event_id);
-                               wfd_session_join(session);
-                       } else {
-                               WDS_LOGD("Start connection corresponding to OEM event [%d]", event->event_id);
-                               wfd_session_connect(session);
-                       }
                }
        }
        break;
        case WFD_OEM_EVENT_PROV_DISC_RESP:
+       {
                if (!session) {
-                       WDS_LOGE("Unexpected event. Session is NULL [peer: " MACSTR "]", MAC2STR(event->dev_addr));
+                       WDS_LOGE("Unexpected event. Session not exist. This response should be ignored");
                        break;
                }
 
@@ -709,8 +674,36 @@ int wfd_session_process_event(wfd_manager_s *manager, wfd_oem_event_s *event)
                        WDS_LOGE("Unexpected event. Session is already started");
                        break;
                }
-               session->state = SESSION_STATE_STARTED;
 
+               /* Update session */
+               if (event->wps_mode == WFD_OEM_WPS_MODE_DISPLAY) {
+                       session->req_wps_mode = WFD_WPS_MODE_KEYPAD;
+                       strncpy(session->wps_pin, event->wps_pin, PINSTR_LEN);
+                       session->wps_pin[PINSTR_LEN] = '\0';
+               } else if (event->wps_mode == WFD_OEM_WPS_MODE_KEYPAD) {
+                       session->req_wps_mode = WFD_WPS_MODE_DISPLAY;
+               } else {
+                       session->req_wps_mode = WFD_WPS_MODE_PBC;
+               }
+               session->wps_mode = event->wps_mode;
+               wfd_session_timer(session, 1);
+
+               /* Update manager */
+               manager->local->wps_mode = event->wps_mode;
+               WDS_LOGD("Local WPS mode is %d", session->wps_mode);
+
+               if (event->wps_mode != WFD_OEM_WPS_MODE_PBC) {
+                       /* Notify WPS_MODE to application so it can display PIN or KEYPAD */
+                       wifi_direct_client_noti_s noti;
+                       memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
+                       noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_WPS_REQ;
+                       snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(event->dev_addr));
+                       wfd_client_send_event(manager, &noti);
+                       if (session->wps_mode == WFD_WPS_MODE_KEYPAD)
+                               break;
+               }
+
+               /* Go to next step of connection immediately */
                if (session->peer->dev_role == WFD_DEV_ROLE_GO) {
                        WDS_LOGD("Start joining corresponding to OEM event [%d]", event->event_id);
                        wfd_session_join(session);
@@ -721,7 +714,8 @@ int wfd_session_process_event(wfd_manager_s *manager, wfd_oem_event_s *event)
                        WDS_LOGD("Start connection corresponding to OEM event [%d]", event->event_id);
                        wfd_session_connect(session);
                }
-               break;
+       }
+       break;
        case WFD_OEM_EVENT_GO_NEG_REQ:
                if (!session) {         // TODO: check whether connection is started by negotiation not by prov_disc
                        WDS_LOGE("Unexpected event. Session is NULL [peer: " MACSTR "]", MAC2STR(event->dev_addr));