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