139beb93cSSam Leffler /* 239beb93cSSam Leffler * WPA Supplicant - Layer2 packet interface definition 339beb93cSSam Leffler * Copyright (c) 2003-2005, Jouni Malinen <j@w1.fi> 439beb93cSSam Leffler * 5*f05cddf9SRui Paulo * This software may be distributed under the terms of the BSD license. 6*f05cddf9SRui Paulo * See README for more details. 739beb93cSSam Leffler * 839beb93cSSam Leffler * This file defines an interface for layer 2 (link layer) packet sending and 939beb93cSSam Leffler * receiving. l2_packet_linux.c is one implementation for such a layer 2 1039beb93cSSam Leffler * implementation using Linux packet sockets and l2_packet_pcap.c another one 1139beb93cSSam Leffler * using libpcap and libdnet. When porting %wpa_supplicant to other operating 1239beb93cSSam Leffler * systems, a new l2_packet implementation may need to be added. 1339beb93cSSam Leffler */ 1439beb93cSSam Leffler 1539beb93cSSam Leffler #ifndef L2_PACKET_H 1639beb93cSSam Leffler #define L2_PACKET_H 1739beb93cSSam Leffler 1839beb93cSSam Leffler /** 1939beb93cSSam Leffler * struct l2_packet_data - Internal l2_packet data structure 2039beb93cSSam Leffler * 2139beb93cSSam Leffler * This structure is used by the l2_packet implementation to store its private 2239beb93cSSam Leffler * data. Other files use a pointer to this data when calling the l2_packet 2339beb93cSSam Leffler * functions, but the contents of this structure should not be used directly 2439beb93cSSam Leffler * outside l2_packet implementation. 2539beb93cSSam Leffler */ 2639beb93cSSam Leffler struct l2_packet_data; 2739beb93cSSam Leffler 2839beb93cSSam Leffler #ifdef _MSC_VER 2939beb93cSSam Leffler #pragma pack(push, 1) 3039beb93cSSam Leffler #endif /* _MSC_VER */ 3139beb93cSSam Leffler 3239beb93cSSam Leffler struct l2_ethhdr { 3339beb93cSSam Leffler u8 h_dest[ETH_ALEN]; 3439beb93cSSam Leffler u8 h_source[ETH_ALEN]; 3539beb93cSSam Leffler be16 h_proto; 3639beb93cSSam Leffler } STRUCT_PACKED; 3739beb93cSSam Leffler 3839beb93cSSam Leffler #ifdef _MSC_VER 3939beb93cSSam Leffler #pragma pack(pop) 4039beb93cSSam Leffler #endif /* _MSC_VER */ 4139beb93cSSam Leffler 4239beb93cSSam Leffler /** 4339beb93cSSam Leffler * l2_packet_init - Initialize l2_packet interface 4439beb93cSSam Leffler * @ifname: Interface name 4539beb93cSSam Leffler * @own_addr: Optional own MAC address if available from driver interface or 4639beb93cSSam Leffler * %NULL if not available 4739beb93cSSam Leffler * @protocol: Ethernet protocol number in host byte order 4839beb93cSSam Leffler * @rx_callback: Callback function that will be called for each received packet 4939beb93cSSam Leffler * @rx_callback_ctx: Callback data (ctx) for calls to rx_callback() 5039beb93cSSam Leffler * @l2_hdr: 1 = include layer 2 header, 0 = do not include header 5139beb93cSSam Leffler * Returns: Pointer to internal data or %NULL on failure 5239beb93cSSam Leffler * 5339beb93cSSam Leffler * rx_callback function will be called with src_addr pointing to the source 5439beb93cSSam Leffler * address (MAC address) of the the packet. If l2_hdr is set to 0, buf 5539beb93cSSam Leffler * points to len bytes of the payload after the layer 2 header and similarly, 5639beb93cSSam Leffler * TX buffers start with payload. This behavior can be changed by setting 5739beb93cSSam Leffler * l2_hdr=1 to include the layer 2 header in the data buffer. 5839beb93cSSam Leffler */ 5939beb93cSSam Leffler struct l2_packet_data * l2_packet_init( 6039beb93cSSam Leffler const char *ifname, const u8 *own_addr, unsigned short protocol, 6139beb93cSSam Leffler void (*rx_callback)(void *ctx, const u8 *src_addr, 6239beb93cSSam Leffler const u8 *buf, size_t len), 6339beb93cSSam Leffler void *rx_callback_ctx, int l2_hdr); 6439beb93cSSam Leffler 6539beb93cSSam Leffler /** 6639beb93cSSam Leffler * l2_packet_deinit - Deinitialize l2_packet interface 6739beb93cSSam Leffler * @l2: Pointer to internal l2_packet data from l2_packet_init() 6839beb93cSSam Leffler */ 6939beb93cSSam Leffler void l2_packet_deinit(struct l2_packet_data *l2); 7039beb93cSSam Leffler 7139beb93cSSam Leffler /** 7239beb93cSSam Leffler * l2_packet_get_own_addr - Get own layer 2 address 7339beb93cSSam Leffler * @l2: Pointer to internal l2_packet data from l2_packet_init() 7439beb93cSSam Leffler * @addr: Buffer for the own address (6 bytes) 7539beb93cSSam Leffler * Returns: 0 on success, -1 on failure 7639beb93cSSam Leffler */ 7739beb93cSSam Leffler int l2_packet_get_own_addr(struct l2_packet_data *l2, u8 *addr); 7839beb93cSSam Leffler 7939beb93cSSam Leffler /** 8039beb93cSSam Leffler * l2_packet_send - Send a packet 8139beb93cSSam Leffler * @l2: Pointer to internal l2_packet data from l2_packet_init() 8239beb93cSSam Leffler * @dst_addr: Destination address for the packet (only used if l2_hdr == 0) 8339beb93cSSam Leffler * @proto: Protocol/ethertype for the packet in host byte order (only used if 8439beb93cSSam Leffler * l2_hdr == 0) 8539beb93cSSam Leffler * @buf: Packet contents to be sent; including layer 2 header if l2_hdr was 8639beb93cSSam Leffler * set to 1 in l2_packet_init() call. Otherwise, only the payload of the packet 8739beb93cSSam Leffler * is included. 8839beb93cSSam Leffler * @len: Length of the buffer (including l2 header only if l2_hdr == 1) 8939beb93cSSam Leffler * Returns: >=0 on success, <0 on failure 9039beb93cSSam Leffler */ 9139beb93cSSam Leffler int l2_packet_send(struct l2_packet_data *l2, const u8 *dst_addr, u16 proto, 9239beb93cSSam Leffler const u8 *buf, size_t len); 9339beb93cSSam Leffler 9439beb93cSSam Leffler /** 9539beb93cSSam Leffler * l2_packet_get_ip_addr - Get the current IP address from the interface 9639beb93cSSam Leffler * @l2: Pointer to internal l2_packet data from l2_packet_init() 9739beb93cSSam Leffler * @buf: Buffer for the IP address in text format 9839beb93cSSam Leffler * @len: Maximum buffer length 9939beb93cSSam Leffler * Returns: 0 on success, -1 on failure 10039beb93cSSam Leffler * 10139beb93cSSam Leffler * This function can be used to get the current IP address from the interface 10239beb93cSSam Leffler * bound to the l2_packet. This is mainly for status information and the IP 10339beb93cSSam Leffler * address will be stored as an ASCII string. This function is not essential 10439beb93cSSam Leffler * for %wpa_supplicant operation, so full implementation is not required. 10539beb93cSSam Leffler * l2_packet implementation will need to define the function, but it can return 10639beb93cSSam Leffler * -1 if the IP address information is not available. 10739beb93cSSam Leffler */ 10839beb93cSSam Leffler int l2_packet_get_ip_addr(struct l2_packet_data *l2, char *buf, size_t len); 10939beb93cSSam Leffler 11039beb93cSSam Leffler 11139beb93cSSam Leffler /** 11239beb93cSSam Leffler * l2_packet_notify_auth_start - Notify l2_packet about start of authentication 11339beb93cSSam Leffler * @l2: Pointer to internal l2_packet data from l2_packet_init() 11439beb93cSSam Leffler * 11539beb93cSSam Leffler * This function is called when authentication is expected to start, e.g., when 11639beb93cSSam Leffler * association has been completed, in order to prepare l2_packet implementation 11739beb93cSSam Leffler * for EAPOL frames. This function is used mainly if the l2_packet code needs 11839beb93cSSam Leffler * to do polling in which case it can increasing polling frequency. This can 11939beb93cSSam Leffler * also be an empty function if the l2_packet implementation does not benefit 12039beb93cSSam Leffler * from knowing about the starting authentication. 12139beb93cSSam Leffler */ 12239beb93cSSam Leffler void l2_packet_notify_auth_start(struct l2_packet_data *l2); 12339beb93cSSam Leffler 12439beb93cSSam Leffler #endif /* L2_PACKET_H */ 125