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