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