00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "includes.h"
00016
00017 #include "common.h"
00018 #include "driver.h"
00019 #include "eloop.h"
00020
00021
00022
00023 struct _ADAPTER;
00024 typedef struct _ADAPTER * LPADAPTER;
00025 #include "driver_ndis.h"
00026
00027
00028 void wpa_driver_ndis_event_connect(struct wpa_driver_ndis_data *drv);
00029 void wpa_driver_ndis_event_disconnect(struct wpa_driver_ndis_data *drv);
00030 void wpa_driver_ndis_event_media_specific(struct wpa_driver_ndis_data *drv,
00031 const u8 *data, size_t data_len);
00032 void wpa_driver_ndis_event_adapter_arrival(struct wpa_driver_ndis_data *drv);
00033 void wpa_driver_ndis_event_adapter_removal(struct wpa_driver_ndis_data *drv);
00034
00035
00036 enum event_types { EVENT_CONNECT, EVENT_DISCONNECT,
00037 EVENT_MEDIA_SPECIFIC, EVENT_ADAPTER_ARRIVAL,
00038 EVENT_ADAPTER_REMOVAL };
00039
00040
00041
00042
00043
00044
00045
00046
00047 static void wpa_driver_ndis_event_process(struct wpa_driver_ndis_data *drv,
00048 u8 *buf, size_t len)
00049 {
00050 u8 *pos, *data = NULL;
00051 enum event_types type;
00052 size_t data_len = 0;
00053
00054 wpa_hexdump(MSG_MSGDUMP, "NDIS: received event data", buf, len);
00055 if (len < sizeof(int))
00056 return;
00057 type = *((int *) buf);
00058 pos = buf + sizeof(int);
00059 wpa_printf(MSG_DEBUG, "NDIS: event - type %d", type);
00060
00061 if (buf + len - pos > 2) {
00062 data_len = (int) *pos++ << 8;
00063 data_len += *pos++;
00064 if (data_len > (size_t) (buf + len - pos)) {
00065 wpa_printf(MSG_DEBUG, "NDIS: event data overflow");
00066 return;
00067 }
00068 data = pos;
00069 wpa_hexdump(MSG_MSGDUMP, "NDIS: event data", data, data_len);
00070 }
00071
00072 switch (type) {
00073 case EVENT_CONNECT:
00074 wpa_driver_ndis_event_connect(drv);
00075 break;
00076 case EVENT_DISCONNECT:
00077 wpa_driver_ndis_event_disconnect(drv);
00078 break;
00079 case EVENT_MEDIA_SPECIFIC:
00080 wpa_driver_ndis_event_media_specific(drv, data, data_len);
00081 break;
00082 case EVENT_ADAPTER_ARRIVAL:
00083 wpa_driver_ndis_event_adapter_arrival(drv);
00084 break;
00085 case EVENT_ADAPTER_REMOVAL:
00086 wpa_driver_ndis_event_adapter_removal(drv);
00087 break;
00088 }
00089 }
00090
00091
00092 void wpa_driver_ndis_event_pipe_cb(void *eloop_data, void *user_data)
00093 {
00094 struct wpa_driver_ndis_data *drv = eloop_data;
00095 u8 buf[512];
00096 DWORD len;
00097
00098 ResetEvent(drv->event_avail);
00099 if (ReadFile(drv->events_pipe, buf, sizeof(buf), &len, NULL))
00100 wpa_driver_ndis_event_process(drv, buf, len);
00101 else {
00102 wpa_printf(MSG_DEBUG, "%s: ReadFile() failed: %d", __func__,
00103 (int) GetLastError());
00104 }
00105 }