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,
#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
};
static ws_plugin_data_s *g_pd;
+static unsigned char null_mac[OEM_MACADDR_LEN];
static gboolean ws_event_handler(GIOChannel *source,
GIOCondition condition,
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;
}
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;
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;
}
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;
return -1;
}
-
snprintf(cmd, sizeof(cmd), WS_CMD_P2P_PROV_DISC MACSTR "%s",
MAC2STR(peer_addr), _ws_wps_to_txt(wps_mode));
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;
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;
}
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;
}
wfd_session_timer(session, 1);
wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
-
- wifi_direct_client_noti_s noti;
- memset(¬i, 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, ¬i);
+ if(flag == WFD_DEV_UNKNOWN)
+ {
+ WDS_LOGD("device is not in access/deny list");
+ wifi_direct_client_noti_s noti;
+ memset(¬i, 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, ¬i);
+ }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;
}
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(¬i, 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, ¬i);
- } 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(¬i, 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, ¬i);
- 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;
}
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(¬i, 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, ¬i);
+ 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);
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));