1209139Srpaulo/* 2209139Srpaulo * WPA Supplicant - Layer2 packet handling example with dummy functions 3209139Srpaulo * Copyright (c) 2003-2005, Jouni Malinen <j@w1.fi> 4209139Srpaulo * 5209139Srpaulo * This program is free software; you can redistribute it and/or modify 6209139Srpaulo * it under the terms of the GNU General Public License version 2 as 7209139Srpaulo * published by the Free Software Foundation. 8209139Srpaulo * 9209139Srpaulo * Alternatively, this software may be distributed under the terms of BSD 10209139Srpaulo * license. 11209139Srpaulo * 12209139Srpaulo * See README and COPYING for more details. 13209139Srpaulo * 14209139Srpaulo * This file can be used as a starting point for layer2 packet implementation. 15209139Srpaulo */ 16209139Srpaulo 17209139Srpaulo#include "includes.h" 18209139Srpaulo 19209139Srpaulo#include "common.h" 20209139Srpaulo#include "eloop.h" 21209139Srpaulo#include "l2_packet.h" 22209139Srpaulo 23209139Srpaulo 24209139Srpaulostruct l2_packet_data { 25209139Srpaulo char ifname[17]; 26209139Srpaulo u8 own_addr[ETH_ALEN]; 27209139Srpaulo void (*rx_callback)(void *ctx, const u8 *src_addr, 28209139Srpaulo const u8 *buf, size_t len); 29209139Srpaulo void *rx_callback_ctx; 30209139Srpaulo int l2_hdr; /* whether to include layer 2 (Ethernet) header data 31209139Srpaulo * buffers */ 32209139Srpaulo int fd; 33209139Srpaulo}; 34209139Srpaulo 35209139Srpaulo 36209139Srpauloint l2_packet_get_own_addr(struct l2_packet_data *l2, u8 *addr) 37209139Srpaulo{ 38209139Srpaulo os_memcpy(addr, l2->own_addr, ETH_ALEN); 39209139Srpaulo return 0; 40209139Srpaulo} 41209139Srpaulo 42209139Srpaulo 43209139Srpauloint l2_packet_send(struct l2_packet_data *l2, const u8 *dst_addr, u16 proto, 44209139Srpaulo const u8 *buf, size_t len) 45209139Srpaulo{ 46209139Srpaulo if (l2 == NULL) 47209139Srpaulo return -1; 48209139Srpaulo 49209139Srpaulo /* 50209139Srpaulo * TODO: Send frame (may need different implementation depending on 51209139Srpaulo * whether l2->l2_hdr is set). 52209139Srpaulo */ 53209139Srpaulo 54209139Srpaulo return 0; 55209139Srpaulo} 56209139Srpaulo 57209139Srpaulo 58209139Srpaulostatic void l2_packet_receive(int sock, void *eloop_ctx, void *sock_ctx) 59209139Srpaulo{ 60209139Srpaulo struct l2_packet_data *l2 = eloop_ctx; 61209139Srpaulo u8 buf[2300]; 62209139Srpaulo int res; 63209139Srpaulo 64209139Srpaulo /* TODO: receive frame (e.g., recv() using sock */ 65209139Srpaulo buf[0] = 0; 66209139Srpaulo res = 0; 67209139Srpaulo 68209139Srpaulo l2->rx_callback(l2->rx_callback_ctx, NULL /* TODO: src addr */, 69209139Srpaulo buf, res); 70209139Srpaulo} 71209139Srpaulo 72209139Srpaulo 73209139Srpaulostruct l2_packet_data * l2_packet_init( 74209139Srpaulo const char *ifname, const u8 *own_addr, unsigned short protocol, 75209139Srpaulo void (*rx_callback)(void *ctx, const u8 *src_addr, 76209139Srpaulo const u8 *buf, size_t len), 77209139Srpaulo void *rx_callback_ctx, int l2_hdr) 78209139Srpaulo{ 79209139Srpaulo struct l2_packet_data *l2; 80209139Srpaulo 81209139Srpaulo l2 = os_zalloc(sizeof(struct l2_packet_data)); 82209139Srpaulo if (l2 == NULL) 83209139Srpaulo return NULL; 84209139Srpaulo os_strlcpy(l2->ifname, ifname, sizeof(l2->ifname)); 85209139Srpaulo l2->rx_callback = rx_callback; 86209139Srpaulo l2->rx_callback_ctx = rx_callback_ctx; 87209139Srpaulo l2->l2_hdr = l2_hdr; 88209139Srpaulo 89209139Srpaulo /* 90209139Srpaulo * TODO: open connection for receiving frames 91209139Srpaulo */ 92209139Srpaulo l2->fd = -1; 93209139Srpaulo eloop_register_read_sock(l2->fd, l2_packet_receive, l2, NULL); 94209139Srpaulo 95209139Srpaulo return l2; 96209139Srpaulo} 97209139Srpaulo 98209139Srpaulo 99209139Srpaulovoid l2_packet_deinit(struct l2_packet_data *l2) 100209139Srpaulo{ 101209139Srpaulo if (l2 == NULL) 102209139Srpaulo return; 103209139Srpaulo 104209139Srpaulo if (l2->fd >= 0) { 105209139Srpaulo eloop_unregister_read_sock(l2->fd); 106209139Srpaulo /* TODO: close connection */ 107209139Srpaulo } 108209139Srpaulo 109209139Srpaulo os_free(l2); 110209139Srpaulo} 111209139Srpaulo 112209139Srpaulo 113209139Srpauloint l2_packet_get_ip_addr(struct l2_packet_data *l2, char *buf, size_t len) 114209139Srpaulo{ 115209139Srpaulo /* TODO: get interface IP address */ 116209139Srpaulo return -1; 117209139Srpaulo} 118209139Srpaulo 119209139Srpaulo 120209139Srpaulovoid l2_packet_notify_auth_start(struct l2_packet_data *l2) 121209139Srpaulo{ 122209139Srpaulo /* This function can be left empty */ 123209139Srpaulo} 124