driver_ndis_.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /*
  2. * WPA Supplicant - Windows/NDIS driver interface - event processing
  3. * Copyright (c) 2004-2005, Jouni Malinen <j@w1.fi>
  4. *
  5. * This software may be distributed under the terms of the BSD license.
  6. * See README for more details.
  7. */
  8. #include "includes.h"
  9. #include "common.h"
  10. #include "driver.h"
  11. #include "eloop.h"
  12. /* Keep this event processing in a separate file and without WinPcap headers to
  13. * avoid conflicts with some of the header files. */
  14. struct _ADAPTER;
  15. typedef struct _ADAPTER * LPADAPTER;
  16. #include "driver_ndis.h"
  17. void wpa_driver_ndis_event_connect(struct wpa_driver_ndis_data *drv);
  18. void wpa_driver_ndis_event_disconnect(struct wpa_driver_ndis_data *drv);
  19. void wpa_driver_ndis_event_media_specific(struct wpa_driver_ndis_data *drv,
  20. const u8 *data, size_t data_len);
  21. void wpa_driver_ndis_event_adapter_arrival(struct wpa_driver_ndis_data *drv);
  22. void wpa_driver_ndis_event_adapter_removal(struct wpa_driver_ndis_data *drv);
  23. enum event_types { EVENT_CONNECT, EVENT_DISCONNECT,
  24. EVENT_MEDIA_SPECIFIC, EVENT_ADAPTER_ARRIVAL,
  25. EVENT_ADAPTER_REMOVAL };
  26. /* Event data:
  27. * enum event_types (as int, i.e., 4 octets)
  28. * data length (2 octets (big endian), optional)
  29. * data (variable len, optional)
  30. */
  31. static void wpa_driver_ndis_event_process(struct wpa_driver_ndis_data *drv,
  32. u8 *buf, size_t len)
  33. {
  34. u8 *pos, *data = NULL;
  35. enum event_types type;
  36. size_t data_len = 0;
  37. wpa_hexdump(MSG_MSGDUMP, "NDIS: received event data", buf, len);
  38. if (len < sizeof(int))
  39. return;
  40. type = *((int *) buf);
  41. pos = buf + sizeof(int);
  42. wpa_printf(MSG_DEBUG, "NDIS: event - type %d", type);
  43. if (buf + len - pos > 2) {
  44. data_len = (int) *pos++ << 8;
  45. data_len += *pos++;
  46. if (data_len > (size_t) (buf + len - pos)) {
  47. wpa_printf(MSG_DEBUG, "NDIS: event data overflow");
  48. return;
  49. }
  50. data = pos;
  51. wpa_hexdump(MSG_MSGDUMP, "NDIS: event data", data, data_len);
  52. }
  53. switch (type) {
  54. case EVENT_CONNECT:
  55. wpa_driver_ndis_event_connect(drv);
  56. break;
  57. case EVENT_DISCONNECT:
  58. wpa_driver_ndis_event_disconnect(drv);
  59. break;
  60. case EVENT_MEDIA_SPECIFIC:
  61. wpa_driver_ndis_event_media_specific(drv, data, data_len);
  62. break;
  63. case EVENT_ADAPTER_ARRIVAL:
  64. wpa_driver_ndis_event_adapter_arrival(drv);
  65. break;
  66. case EVENT_ADAPTER_REMOVAL:
  67. wpa_driver_ndis_event_adapter_removal(drv);
  68. break;
  69. }
  70. }
  71. void wpa_driver_ndis_event_pipe_cb(void *eloop_data, void *user_data)
  72. {
  73. struct wpa_driver_ndis_data *drv = eloop_data;
  74. u8 buf[512];
  75. DWORD len;
  76. ResetEvent(drv->event_avail);
  77. if (ReadFile(drv->events_pipe, buf, sizeof(buf), &len, NULL))
  78. wpa_driver_ndis_event_process(drv, buf, len);
  79. else {
  80. wpa_printf(MSG_DEBUG, "%s: ReadFile() failed: %d", __func__,
  81. (int) GetLastError());
  82. }
  83. }