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