You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

eapol.h 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. /*
  2. * Copyright (c) 2009 Joshua Oreman <oremanj@rwcr.net>.
  3. *
  4. * This program is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU General Public License as
  6. * published by the Free Software Foundation; either version 2 of the
  7. * License, or any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful, but
  10. * WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. * General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program; if not, write to the Free Software
  16. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17. */
  18. #ifndef _GPXE_EAPOL_H
  19. #define _GPXE_EAPOL_H
  20. /** @file
  21. *
  22. * Definitions for EAPOL (Extensible Authentication Protocol over
  23. * LANs) frames. Definitions for the packets usually encapsulated in
  24. * them are elsewhere.
  25. */
  26. #include <gpxe/tables.h>
  27. #include <stdint.h>
  28. FILE_LICENCE ( GPL2_OR_LATER );
  29. /**
  30. * @defgroup eapol_type EAPOL archetype identifiers
  31. * @{
  32. */
  33. #define EAPOL_TYPE_EAP 0 /**< EAP authentication handshake packet */
  34. #define EAPOL_TYPE_START 1 /**< Request by Peer to begin (no data) */
  35. #define EAPOL_TYPE_LOGOFF 2 /**< Request by Peer to terminate (no data) */
  36. #define EAPOL_TYPE_KEY 3 /**< EAPOL-Key packet */
  37. /** @} */
  38. /** Expected EAPOL version field value
  39. *
  40. * Version 2 is often seen and has no format differences from version 1;
  41. * however, many older APs will completely drop version-2 packets, so
  42. * we advertise ourselves as version 1.
  43. */
  44. #define EAPOL_THIS_VERSION 1
  45. /** Length of an EAPOL frame header */
  46. #define EAPOL_HDR_LEN 4
  47. /** An EAPOL frame
  48. *
  49. * This may encapsulate an eap_pkt, an eapol_key_pkt, or a Start or
  50. * Logoff request with no data attached. It is transmitted directly in
  51. * an Ethernet frame, with no IP packet header.
  52. */
  53. struct eapol_frame
  54. {
  55. /** EAPOL version identifier, always 1 */
  56. u8 version;
  57. /** EAPOL archetype identifier indicating format of payload */
  58. u8 type;
  59. /** Length of payload, in network byte order */
  60. u16 length;
  61. /** Payload, if @a type is EAP or EAPOL-Key */
  62. u8 data[0];
  63. } __attribute__ (( packed ));
  64. /** An EAPOL frame type handler
  65. *
  66. * Normally there will be at most two of these, one for EAP and one
  67. * for EAPOL-Key frames. The EAPOL interface code handles Start and
  68. * Logoff directly.
  69. */
  70. struct eapol_handler
  71. {
  72. /** EAPOL archetype identifier for payload this handler will handle */
  73. u8 type;
  74. /** Receive EAPOL-encapsulated packet of specified type
  75. *
  76. * @v iob I/O buffer containing packet payload
  77. * @v netdev Network device from which packet was received
  78. * @v ll_source Source link-layer address from which packet was received
  79. * @ret rc Return status code
  80. *
  81. * The I/O buffer will have the EAPOL header pulled off it, so
  82. * @c iob->data points to the first byte of the payload.
  83. *
  84. * This function takes ownership of the I/O buffer passed to it.
  85. */
  86. int ( * rx ) ( struct io_buffer *iob, struct net_device *netdev,
  87. const void *ll_source );
  88. };
  89. #define EAPOL_HANDLERS __table ( struct eapol_handler, "eapol_handlers" )
  90. #define __eapol_handler __table_entry ( EAPOL_HANDLERS, 01 )
  91. extern struct net_protocol eapol_protocol __net_protocol;
  92. #endif /* _GPXE_EAPOL_H */