1dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat/* 2dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat * Copyright (C) 2008 The Android Open Source Project 3dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat * 4dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat * Licensed under the Apache License, Version 2.0 (the "License"); 5dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat * you may not use this file except in compliance with the License. 6dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat * You may obtain a copy of the License at 7dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat * 8dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat * http://www.apache.org/licenses/LICENSE-2.0 9dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat * 10dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat * Unless required by applicable law or agreed to in writing, software 11dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat * distributed under the License is distributed on an "AS IS" BASIS, 12dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat * See the License for the specific language governing permissions and 14dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat * limitations under the License. 15dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat */ 163c5a6f0bc8aefc4dacab8e95ba9017a7ac7d91f5San Mehat 17dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat#include <errno.h> 18dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat#include <sys/types.h> 19dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat#include <pthread.h> 20dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat 21dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat#define LOG_TAG "SupplicantListener" 22dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat#include <cutils/log.h> 23dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat 24dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat#include "libwpa_client/wpa_ctrl.h" 25dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat 26dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat#include "SupplicantListener.h" 2778828ff4f5f959fcf8066ecb6a6b689d2a3c5985San Mehat#include "ISupplicantEventHandler.h" 283aff2d1de59972684bf2ab798351be5544158239San Mehat#include "SupplicantEventFactory.h" 293aff2d1de59972684bf2ab798351be5544158239San Mehat#include "SupplicantEvent.h" 303aff2d1de59972684bf2ab798351be5544158239San Mehat#include "SupplicantAssociatingEvent.h" 313aff2d1de59972684bf2ab798351be5544158239San Mehat#include "SupplicantAssociatedEvent.h" 323aff2d1de59972684bf2ab798351be5544158239San Mehat#include "SupplicantConnectedEvent.h" 333aff2d1de59972684bf2ab798351be5544158239San Mehat#include "SupplicantScanResultsEvent.h" 343aff2d1de59972684bf2ab798351be5544158239San Mehat#include "SupplicantStateChangeEvent.h" 35dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat 3678828ff4f5f959fcf8066ecb6a6b689d2a3c5985San MehatSupplicantListener::SupplicantListener(ISupplicantEventHandler *handlers, 3778828ff4f5f959fcf8066ecb6a6b689d2a3c5985San Mehat struct wpa_ctrl *monitor) : 38dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat SocketListener(wpa_ctrl_get_fd(monitor), false) { 3978828ff4f5f959fcf8066ecb6a6b689d2a3c5985San Mehat mHandlers = handlers; 40dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat mMonitor = monitor; 413aff2d1de59972684bf2ab798351be5544158239San Mehat mFactory = new SupplicantEventFactory(); 42dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat} 43dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat 441441e769b2767e212a3d905bee2fd3535b484ff2San Mehatbool SupplicantListener::onDataAvailable(SocketClient *cli) { 45dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat char buf[255]; 46dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat size_t buflen = sizeof(buf); 47dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat int rc; 48dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat size_t nread = buflen - 1; 49dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat 50dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat if ((rc = wpa_ctrl_recv(mMonitor, buf, &nread))) { 51dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat LOGE("wpa_ctrl_recv failed (%s)", strerror(errno)); 521441e769b2767e212a3d905bee2fd3535b484ff2San Mehat return false; 53dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat } 54dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat 55dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat buf[nread] = '\0'; 56dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat if (!rc && !nread) { 57dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat LOGD("Received EOF on supplicant socket\n"); 58dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat strncpy(buf, WPA_EVENT_TERMINATING " - signal 0 received", buflen-1); 59dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat buf[buflen-1] = '\0'; 60dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat return false; 61dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat } 62dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat 633aff2d1de59972684bf2ab798351be5544158239San Mehat SupplicantEvent *evt = mFactory->createEvent(buf, nread); 643aff2d1de59972684bf2ab798351be5544158239San Mehat 653aff2d1de59972684bf2ab798351be5544158239San Mehat if (!evt) { 663aff2d1de59972684bf2ab798351be5544158239San Mehat LOGW("Dropping unknown supplicant event '%s'", buf); 673aff2d1de59972684bf2ab798351be5544158239San Mehat return true; 683aff2d1de59972684bf2ab798351be5544158239San Mehat } 69dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat 703aff2d1de59972684bf2ab798351be5544158239San Mehat // Call the appropriate handler 713aff2d1de59972684bf2ab798351be5544158239San Mehat if (evt->getType() == SupplicantEvent::EVENT_ASSOCIATING) 723aff2d1de59972684bf2ab798351be5544158239San Mehat mHandlers->onAssociatingEvent((SupplicantAssociatingEvent *) evt); 733aff2d1de59972684bf2ab798351be5544158239San Mehat else if (evt->getType() == SupplicantEvent::EVENT_ASSOCIATED) 743aff2d1de59972684bf2ab798351be5544158239San Mehat mHandlers->onAssociatedEvent((SupplicantAssociatedEvent *) evt); 753aff2d1de59972684bf2ab798351be5544158239San Mehat else if (evt->getType() == SupplicantEvent::EVENT_CONNECTED) 763aff2d1de59972684bf2ab798351be5544158239San Mehat mHandlers->onConnectedEvent((SupplicantConnectedEvent *) evt); 773aff2d1de59972684bf2ab798351be5544158239San Mehat else if (evt->getType() == SupplicantEvent::EVENT_SCAN_RESULTS) 783aff2d1de59972684bf2ab798351be5544158239San Mehat mHandlers->onScanResultsEvent((SupplicantScanResultsEvent *) evt); 793aff2d1de59972684bf2ab798351be5544158239San Mehat else if (evt->getType() == SupplicantEvent::EVENT_STATE_CHANGE) 803aff2d1de59972684bf2ab798351be5544158239San Mehat mHandlers->onStateChangeEvent((SupplicantStateChangeEvent *) evt); 813aff2d1de59972684bf2ab798351be5544158239San Mehat else if (evt->getType() == SupplicantEvent::EVENT_CONNECTIONTIMEOUT) 823aff2d1de59972684bf2ab798351be5544158239San Mehat mHandlers->onConnectionTimeoutEvent((SupplicantConnectionTimeoutEvent *) evt); 83dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat else if (evt->getType() == SupplicantEvent::EVENT_DISCONNECTED) 843aff2d1de59972684bf2ab798351be5544158239San Mehat mHandlers->onDisconnectedEvent((SupplicantDisconnectedEvent *) evt); 853aff2d1de59972684bf2ab798351be5544158239San Mehat else 863aff2d1de59972684bf2ab798351be5544158239San Mehat LOGW("Whoops - no handler available for event '%s'\n", buf); 873aff2d1de59972684bf2ab798351be5544158239San Mehat#if 0 88dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat else if (evt->getType() == SupplicantEvent::EVENT_TERMINATING) 893aff2d1de59972684bf2ab798351be5544158239San Mehat mHandlers->onTerminatingEvent(evt); 90dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat else if (evt->getType() == SupplicantEvent::EVENT_PASSWORD_CHANGED) 913aff2d1de59972684bf2ab798351be5544158239San Mehat mHandlers->onPasswordChangedEvent(evt); 92dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat else if (evt->getType() == SupplicantEvent::EVENT_EAP_NOTIFICATION) 933aff2d1de59972684bf2ab798351be5544158239San Mehat mHandlers->onEapNotificationEvent(evt); 94dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat else if (evt->getType() == SupplicantEvent::EVENT_EAP_STARTED) 953aff2d1de59972684bf2ab798351be5544158239San Mehat mHandlers->onEapStartedEvent(evt); 96dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat else if (evt->getType() == SupplicantEvent::EVENT_EAP_SUCCESS) 973aff2d1de59972684bf2ab798351be5544158239San Mehat mHandlers->onEapSuccessEvent(evt); 98dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat else if (evt->getType() == SupplicantEvent::EVENT_EAP_FAILURE) 993aff2d1de59972684bf2ab798351be5544158239San Mehat mHandlers->onEapFailureEvent(evt); 100dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat else if (evt->getType() == SupplicantEvent::EVENT_LINK_SPEED) 1013aff2d1de59972684bf2ab798351be5544158239San Mehat mHandlers->onLinkSpeedEvent(evt); 102dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat else if (evt->getType() == SupplicantEvent::EVENT_DRIVER_STATE) 1033aff2d1de59972684bf2ab798351be5544158239San Mehat mHandlers->onDriverStateEvent(evt); 1043aff2d1de59972684bf2ab798351be5544158239San Mehat#endif 105dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat 106dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat delete evt; 1073c5a6f0bc8aefc4dacab8e95ba9017a7ac7d91f5San Mehat 108dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat return true; 109dc266073e7c3127caedf26671a1c125dc8aadd8dSan Mehat} 110