1209139Srpaulo/* 2209139Srpaulo * WPA Supplicant - Windows/NDIS driver interface - event processing 3209139Srpaulo * Copyright (c) 2004-2005, Jouni Malinen <j@w1.fi> 4209139Srpaulo * 5209139Srpaulo * This program is free software; you can redistribute it and/or modify 6209139Srpaulo * it under the terms of the GNU General Public License version 2 as 7209139Srpaulo * published by the Free Software Foundation. 8209139Srpaulo * 9209139Srpaulo * Alternatively, this software may be distributed under the terms of BSD 10209139Srpaulo * license. 11209139Srpaulo * 12209139Srpaulo * See README and COPYING for more details. 13209139Srpaulo */ 14209139Srpaulo 15209139Srpaulo#include "includes.h" 16209139Srpaulo 17209139Srpaulo#include "common.h" 18209139Srpaulo#include "driver.h" 19209139Srpaulo#include "eloop.h" 20209139Srpaulo 21209139Srpaulo/* Keep this event processing in a separate file and without WinPcap headers to 22209139Srpaulo * avoid conflicts with some of the header files. */ 23209139Srpaulostruct _ADAPTER; 24209139Srpaulotypedef struct _ADAPTER * LPADAPTER; 25209139Srpaulo#include "driver_ndis.h" 26209139Srpaulo 27209139Srpaulo 28209139Srpaulovoid wpa_driver_ndis_event_connect(struct wpa_driver_ndis_data *drv); 29209139Srpaulovoid wpa_driver_ndis_event_disconnect(struct wpa_driver_ndis_data *drv); 30209139Srpaulovoid wpa_driver_ndis_event_media_specific(struct wpa_driver_ndis_data *drv, 31209139Srpaulo const u8 *data, size_t data_len); 32209139Srpaulovoid wpa_driver_ndis_event_adapter_arrival(struct wpa_driver_ndis_data *drv); 33209139Srpaulovoid wpa_driver_ndis_event_adapter_removal(struct wpa_driver_ndis_data *drv); 34209139Srpaulo 35209139Srpaulo 36209139Srpauloenum event_types { EVENT_CONNECT, EVENT_DISCONNECT, 37209139Srpaulo EVENT_MEDIA_SPECIFIC, EVENT_ADAPTER_ARRIVAL, 38209139Srpaulo EVENT_ADAPTER_REMOVAL }; 39209139Srpaulo 40209139Srpaulo/* Event data: 41209139Srpaulo * enum event_types (as int, i.e., 4 octets) 42209139Srpaulo * data length (2 octets (big endian), optional) 43209139Srpaulo * data (variable len, optional) 44209139Srpaulo */ 45209139Srpaulo 46209139Srpaulo 47209139Srpaulostatic void wpa_driver_ndis_event_process(struct wpa_driver_ndis_data *drv, 48209139Srpaulo u8 *buf, size_t len) 49209139Srpaulo{ 50209139Srpaulo u8 *pos, *data = NULL; 51209139Srpaulo enum event_types type; 52209139Srpaulo size_t data_len = 0; 53209139Srpaulo 54209139Srpaulo wpa_hexdump(MSG_MSGDUMP, "NDIS: received event data", buf, len); 55209139Srpaulo if (len < sizeof(int)) 56209139Srpaulo return; 57209139Srpaulo type = *((int *) buf); 58209139Srpaulo pos = buf + sizeof(int); 59209139Srpaulo wpa_printf(MSG_DEBUG, "NDIS: event - type %d", type); 60209139Srpaulo 61209139Srpaulo if (buf + len - pos > 2) { 62209139Srpaulo data_len = (int) *pos++ << 8; 63209139Srpaulo data_len += *pos++; 64209139Srpaulo if (data_len > (size_t) (buf + len - pos)) { 65209139Srpaulo wpa_printf(MSG_DEBUG, "NDIS: event data overflow"); 66209139Srpaulo return; 67209139Srpaulo } 68209139Srpaulo data = pos; 69209139Srpaulo wpa_hexdump(MSG_MSGDUMP, "NDIS: event data", data, data_len); 70209139Srpaulo } 71209139Srpaulo 72209139Srpaulo switch (type) { 73209139Srpaulo case EVENT_CONNECT: 74209139Srpaulo wpa_driver_ndis_event_connect(drv); 75209139Srpaulo break; 76209139Srpaulo case EVENT_DISCONNECT: 77209139Srpaulo wpa_driver_ndis_event_disconnect(drv); 78209139Srpaulo break; 79209139Srpaulo case EVENT_MEDIA_SPECIFIC: 80209139Srpaulo wpa_driver_ndis_event_media_specific(drv, data, data_len); 81209139Srpaulo break; 82209139Srpaulo case EVENT_ADAPTER_ARRIVAL: 83209139Srpaulo wpa_driver_ndis_event_adapter_arrival(drv); 84209139Srpaulo break; 85209139Srpaulo case EVENT_ADAPTER_REMOVAL: 86209139Srpaulo wpa_driver_ndis_event_adapter_removal(drv); 87209139Srpaulo break; 88209139Srpaulo } 89209139Srpaulo} 90209139Srpaulo 91209139Srpaulo 92209139Srpaulovoid wpa_driver_ndis_event_pipe_cb(void *eloop_data, void *user_data) 93209139Srpaulo{ 94209139Srpaulo struct wpa_driver_ndis_data *drv = eloop_data; 95209139Srpaulo u8 buf[512]; 96209139Srpaulo DWORD len; 97209139Srpaulo 98209139Srpaulo ResetEvent(drv->event_avail); 99209139Srpaulo if (ReadFile(drv->events_pipe, buf, sizeof(buf), &len, NULL)) 100209139Srpaulo wpa_driver_ndis_event_process(drv, buf, len); 101209139Srpaulo else { 102209139Srpaulo wpa_printf(MSG_DEBUG, "%s: ReadFile() failed: %d", __func__, 103209139Srpaulo (int) GetLastError()); 104209139Srpaulo } 105209139Srpaulo} 106