1229970Sadrian/*-
2229970Sadrian * Copyright (c) 2010-2011 Monthadar Al Jaberi, TerraNet AB
3229970Sadrian * All rights reserved.
4229970Sadrian *
5229970Sadrian * Redistribution and use in source and binary forms, with or without
6229970Sadrian * modification, are permitted provided that the following conditions
7229970Sadrian * are met:
8229970Sadrian * 1. Redistributions of source code must retain the above copyright
9229970Sadrian *    notice, this list of conditions and the following disclaimer,
10229970Sadrian *    without modification.
11229970Sadrian * 2. Redistributions in binary form must reproduce at minimum a disclaimer
12229970Sadrian *    similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
13229970Sadrian *    redistribution must be conditioned upon including a substantially
14229970Sadrian *    similar Disclaimer requirement for further binary redistribution.
15229970Sadrian *
16229970Sadrian * NO WARRANTY
17229970Sadrian * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18229970Sadrian * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19229970Sadrian * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
20229970Sadrian * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
21229970Sadrian * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
22229970Sadrian * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23229970Sadrian * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24229970Sadrian * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25229970Sadrian * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26229970Sadrian * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
27229970Sadrian * THE POSSIBILITY OF SUCH DAMAGES.
28229970Sadrian *
29229970Sadrian * $FreeBSD$
30229970Sadrian */
31229970Sadrian#include "hal.h"
32229970Sadrian#include "../if_medium.h"
33229970Sadrian#include "handler.h"
34229970Sadrian
35229970Sadrianstatic void
36229970Sadrianhal_tx_proc(void *arg, int npending)
37229970Sadrian{
38229970Sadrian	struct wtap_hal *hal = (struct wtap_hal *)arg;
39229970Sadrian	struct packet *p;
40229970Sadrian
41229970Sadrian#if 0
42229970Sadrian	DWTAP_PRINTF("%s\n", __func__);
43229970Sadrian#endif
44229970Sadrian
45229970Sadrian	hal = (struct wtap_hal *)arg;
46229970Sadrian	for(;;){
47229970Sadrian		p = medium_get_next_packet(hal->hal_md);
48229970Sadrian		if(p == NULL)
49229970Sadrian		return;
50229970Sadrian
51229970Sadrian		hal->plugin->work(hal->plugin, p);
52229970Sadrian
53229970Sadrian#if 0
54229970Sadrian		DWTAP_PRINTF("[%d] freeing m=%p\n", p->id, p->m);
55229970Sadrian#endif
56229970Sadrian		m_free(p->m);
57229970Sadrian		free(p, M_WTAP_PACKET);
58229970Sadrian	}
59229970Sadrian}
60229970Sadrian
61229970Sadrianvoid
62229970Sadrianinit_hal(struct wtap_hal *hal)
63229970Sadrian{
64229970Sadrian
65229970Sadrian	DWTAP_PRINTF("%s\n", __func__);
66229970Sadrian	mtx_init(&hal->hal_mtx, "wtap_hal mtx", NULL, MTX_DEF | MTX_RECURSE);
67229970Sadrian
68229970Sadrian	hal->hal_md = (struct wtap_medium *)malloc(sizeof(struct wtap_medium),
69229970Sadrian	    M_WTAP, M_NOWAIT | M_ZERO);
70229970Sadrian	bzero(hal->hal_md, sizeof(struct wtap_medium));
71229970Sadrian
72229970Sadrian	init_medium(hal->hal_md);
73229970Sadrian	/* register event handler for packets */
74229970Sadrian	TASK_INIT(&hal->hal_md->tx_handler->proc, 0, hal_tx_proc, hal);
75229970Sadrian}
76229970Sadrian
77229970Sadrianvoid
78229970Sadrianregister_plugin(struct wtap_hal *hal, struct wtap_plugin *plugin)
79229970Sadrian{
80229970Sadrian
81229970Sadrian	plugin->init(plugin);
82229970Sadrian	hal->plugin = plugin;
83229970Sadrian}
84229970Sadrian
85229970Sadrianvoid
86229970Sadrianderegister_plugin(struct wtap_hal *hal)
87229970Sadrian{
88229970Sadrian
89229970Sadrian	hal->plugin->deinit(hal->plugin);
90229970Sadrian	hal->plugin = NULL; /* catch illegal usages */
91229970Sadrian}
92229970Sadrian
93229970Sadrianvoid
94229970Sadriandeinit_hal(struct wtap_hal *hal)
95229970Sadrian{
96229970Sadrian
97229970Sadrian	DWTAP_PRINTF("%s\n", __func__);
98229970Sadrian	deinit_medium(hal->hal_md);
99229970Sadrian	free(hal->hal_md, M_WTAP);
100229970Sadrian	mtx_destroy(&hal->hal_mtx);
101229970Sadrian}
102229970Sadrian
103229970Sadrianint32_t
104229970Sadriannew_wtap(struct wtap_hal *hal, int32_t id)
105229970Sadrian{
106229970Sadrian	static const uint8_t mac_pool[64][IEEE80211_ADDR_LEN] = {
107229970Sadrian	    {0,152,154,152,150,151},
108229970Sadrian	    {0,152,154,152,150,152},
109229970Sadrian	    {0,152,154,152,150,153},
110229970Sadrian	    {0,152,154,152,150,154},
111229970Sadrian	    {0,152,154,152,150,155},
112229970Sadrian	    {0,152,154,152,150,156},
113229970Sadrian	    {0,152,154,152,150,157},
114229970Sadrian	    {0,152,154,152,150,158},
115229970Sadrian	    {0,152,154,152,151,151},
116229970Sadrian	    {0,152,154,152,151,152},
117229970Sadrian	    {0,152,154,152,151,153},
118229970Sadrian	    {0,152,154,152,151,154},
119229970Sadrian	    {0,152,154,152,151,155},
120229970Sadrian	    {0,152,154,152,151,156},
121229970Sadrian	    {0,152,154,152,151,157},
122229970Sadrian	    {0,152,154,152,151,158},
123229970Sadrian	    {0,152,154,152,152,151},
124229970Sadrian	    {0,152,154,152,152,152},
125229970Sadrian	    {0,152,154,152,152,153},
126229970Sadrian	    {0,152,154,152,152,154},
127229970Sadrian	    {0,152,154,152,152,155},
128229970Sadrian	    {0,152,154,152,152,156},
129229970Sadrian	    {0,152,154,152,152,157},
130229970Sadrian	    {0,152,154,152,152,158},
131229970Sadrian	    {0,152,154,152,153,151},
132229970Sadrian	    {0,152,154,152,153,152},
133229970Sadrian	    {0,152,154,152,153,153},
134229970Sadrian	    {0,152,154,152,153,154},
135229970Sadrian	    {0,152,154,152,153,155},
136229970Sadrian	    {0,152,154,152,153,156},
137229970Sadrian	    {0,152,154,152,153,157},
138229970Sadrian	    {0,152,154,152,153,158},
139229970Sadrian	    {0,152,154,152,154,151},
140229970Sadrian	    {0,152,154,152,154,152},
141229970Sadrian	    {0,152,154,152,154,153},
142229970Sadrian	    {0,152,154,152,154,154},
143229970Sadrian	    {0,152,154,152,154,155},
144229970Sadrian	    {0,152,154,152,154,156},
145229970Sadrian	    {0,152,154,152,154,157},
146229970Sadrian	    {0,152,154,152,154,158},
147229970Sadrian	    {0,152,154,152,155,151},
148229970Sadrian	    {0,152,154,152,155,152},
149229970Sadrian	    {0,152,154,152,155,153},
150229970Sadrian	    {0,152,154,152,155,154},
151229970Sadrian	    {0,152,154,152,155,155},
152229970Sadrian	    {0,152,154,152,155,156},
153229970Sadrian	    {0,152,154,152,155,157},
154229970Sadrian	    {0,152,154,152,155,158},
155229970Sadrian	    {0,152,154,152,156,151},
156229970Sadrian	    {0,152,154,152,156,152},
157229970Sadrian	    {0,152,154,152,156,153},
158229970Sadrian	    {0,152,154,152,156,154},
159229970Sadrian	    {0,152,154,152,156,155},
160229970Sadrian	    {0,152,154,152,156,156},
161229970Sadrian	    {0,152,154,152,156,157},
162229970Sadrian	    {0,152,154,152,156,158},
163229970Sadrian	    {0,152,154,152,157,151},
164229970Sadrian	    {0,152,154,152,157,152},
165229970Sadrian	    {0,152,154,152,157,153},
166229970Sadrian	    {0,152,154,152,157,154},
167229970Sadrian	    {0,152,154,152,157,155},
168229970Sadrian	    {0,152,154,152,157,156},
169229970Sadrian	    {0,152,154,152,157,157},
170229970Sadrian	    {0,152,154,152,157,158}
171229970Sadrian	    };
172229970Sadrian
173229970Sadrian	DWTAP_PRINTF("%s\n", __func__);
174229970Sadrian	uint8_t const *macaddr = mac_pool[id];
175229970Sadrian	if(hal->hal_devs[id] != NULL){
176229970Sadrian		printf("error, wtap_id=%d already created\n", id);
177229970Sadrian		return -1;
178229970Sadrian	}
179229970Sadrian
180229970Sadrian	hal->hal_devs[id] = (struct wtap_softc *)malloc(
181229970Sadrian	    sizeof(struct wtap_softc), M_WTAP, M_NOWAIT | M_ZERO);
182229970Sadrian	bzero(hal->hal_devs[id], sizeof(struct wtap_softc));
183229970Sadrian	hal->hal_devs[id]->sc_md = hal->hal_md;
184229970Sadrian	hal->hal_devs[id]->id = id;
185229970Sadrian	mtx_init(&hal->hal_devs[id]->sc_mtx, "wtap_softc mtx", NULL,
186229970Sadrian	    MTX_DEF | MTX_RECURSE);
187229970Sadrian
188229970Sadrian	if(wtap_attach(hal->hal_devs[id], macaddr)){
189229970Sadrian		printf("%s, cant alloc new wtap\n", __func__);
190229970Sadrian		return -1;
191229970Sadrian	}
192229970Sadrian
193229970Sadrian	return 0;
194229970Sadrian}
195229970Sadrian
196229970Sadrianint32_t
197229970Sadrianfree_wtap(struct wtap_hal *hal, int32_t id)
198229970Sadrian{
199229970Sadrian
200229970Sadrian	DWTAP_PRINTF("%s\n", __func__);
201229970Sadrian	if(hal->hal_devs[id] == NULL){
202229970Sadrian		printf("error, wtap_id=%d never created\n", id);
203229970Sadrian		return -1;
204229970Sadrian	}
205229970Sadrian
206229970Sadrian	if(wtap_detach(hal->hal_devs[id]))
207229970Sadrian		printf("%s, cant alloc new wtap\n", __func__);
208229970Sadrian	mtx_destroy(&hal->hal_devs[id]->sc_mtx);
209229970Sadrian	free(hal->hal_devs[id], M_WTAP);
210229970Sadrian	hal->hal_devs[id] = NULL;
211229970Sadrian	return 0;
212229970Sadrian}
213229970Sadrian
214