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