summaryrefslogtreecommitdiff
path: root/sys/dev/usb/if_atu.c
diff options
context:
space:
mode:
authorDavid Gwynne <dlg@cvs.openbsd.org>2004-12-04 23:56:51 +0000
committerDavid Gwynne <dlg@cvs.openbsd.org>2004-12-04 23:56:51 +0000
commit07a5f4616f006459591a72a1877123ba83c8519b (patch)
treed6dfeb954703b5bf05bd76468bd5d07f73ce4af7 /sys/dev/usb/if_atu.c
parentc53e29df38d74e5ae2e874097c4db7174be5803b (diff)
remove code that is now unused because of the move to net80211 and the
rx/tx cleanup
Diffstat (limited to 'sys/dev/usb/if_atu.c')
-rw-r--r--sys/dev/usb/if_atu.c757
1 files changed, 1 insertions, 756 deletions
diff --git a/sys/dev/usb/if_atu.c b/sys/dev/usb/if_atu.c
index b9db4320b28..68ed5d99e88 100644
--- a/sys/dev/usb/if_atu.c
+++ b/sys/dev/usb/if_atu.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_atu.c,v 1.29 2004/12/04 23:36:15 dlg Exp $ */
+/* $OpenBSD: if_atu.c,v 1.30 2004/12/04 23:56:49 dlg Exp $ */
/*
* Copyright (c) 2003, 2004
* Daan Vreeken <Danovitsch@Vitsch.net>. All rights reserved.
@@ -136,11 +136,9 @@ struct atu_type atu_devs[] = {
};
int atu_newbuf(struct atu_softc *, struct atu_chain *, struct mbuf *);
-int atu_encap(struct atu_softc *sc, struct mbuf *m, struct atu_chain *c);
void atu_rxeof(usbd_xfer_handle, usbd_private_handle, usbd_status);
void atu_txeof(usbd_xfer_handle, usbd_private_handle, usbd_status);
void atu_start(struct ifnet *);
-void atu_mgmt_loop(void *arg);
int atu_ioctl(struct ifnet *, u_long, caddr_t);
int atu_init(struct ifnet *);
void atu_stop(struct ifnet *, int);
@@ -163,17 +161,11 @@ int atu_start_scan(struct atu_softc *sc);
int atu_switch_radio(struct atu_softc *sc, int state);
int atu_initial_config(struct atu_softc *sc);
int atu_join(struct atu_softc *sc, struct ieee80211_node *node);
-int atu_send_packet(struct atu_softc *sc, struct atu_chain *c);
-int atu_send_mgmt_packet(struct atu_softc *sc,
- struct atu_chain *c, u_int16_t length);
-int atu_authenticate(struct atu_softc *sc);
-int atu_associate(struct atu_softc *sc);
int8_t atu_get_dfu_state(struct atu_softc *sc);
u_int8_t atu_get_opmode(struct atu_softc *sc, u_int8_t *mode);
int atu_upload_internal_firmware(struct atu_softc *sc);
int atu_upload_external_firmware(struct atu_softc *sc);
int atu_get_card_config(struct atu_softc *sc);
-int atu_mgmt_state_machine(struct atu_softc *sc);
int atu_media_change(struct ifnet *ifp);
void atu_media_status(struct ifnet *ifp, struct ifmediareq *req);
int atu_xfer_list_init(struct atu_softc *sc, struct atu_chain *ch,
@@ -181,8 +173,6 @@ int atu_xfer_list_init(struct atu_softc *sc, struct atu_chain *ch,
int atu_rx_list_init(struct atu_softc *);
void atu_xfer_list_free(struct atu_softc *sc, struct atu_chain *ch,
int listlen);
-void atu_print_beacon(struct atu_softc *sc, struct atu_rxpkt *pkt);
-void atu_handle_mgmt_packet(struct atu_softc *sc, struct atu_rxpkt *pkt);
void atu_print_a_bunch_of_debug_things(struct atu_softc *sc);
int atu_set_wepkey(struct atu_softc *sc, int nr, u_int8_t *key, int len);
@@ -749,197 +739,6 @@ atu_join(struct atu_softc *sc, struct ieee80211_node *node)
return err;
}
-int
-atu_send_packet(struct atu_softc *sc, struct atu_chain *c)
-{
- usbd_status err;
- struct atu_txpkt *pkt;
-
- /* Don't try to send when we're shutting down the driver */
- if (sc->atu_dying)
- return(EIO);
-
- pkt = (struct atu_txpkt *)c->atu_buf;
-
- usbd_setup_xfer(c->atu_xfer, sc->atu_ep[ATU_ENDPT_TX],
- c, c->atu_buf, c->atu_length, USBD_NO_COPY, ATU_TX_TIMEOUT,
- atu_txeof);
-
- /* Let's get this thing into the air! */
- c->atu_in_xfer = 1;
- err = usbd_transfer(c->atu_xfer);
- if (err != USBD_IN_PROGRESS) {
- atu_stop(&sc->sc_ic.ic_if, 0);
- return(EIO);
- }
-
- DPRINTFN(10, ("%s: tx packet...\n", USBDEVNAME(sc->atu_dev)));
- return 0;
-}
-
-int
-atu_send_mgmt_packet(struct atu_softc *sc, struct atu_chain *c,
- u_int16_t length)
-{
- struct ieee80211com *ic = &sc->sc_ic;
- struct atu_mgmt_packet *packet;
-
- packet = (struct atu_mgmt_packet *)c->atu_buf;
-
- packet->athdr.wlength = length - sizeof(packet->athdr);
- packet->athdr.tx_rate = 4;
- packet->athdr.padding = 0;
- memset(packet->athdr.reserved, 0x00, 4);
-
- packet->mgmt_hdr.duration = 0x8000;
- memcpy(packet->mgmt_hdr.dst_addr, sc->atu_bssid, ETHER_ADDR_LEN);
- memcpy(packet->mgmt_hdr.src_addr, ic->ic_myaddr, IEEE80211_ADDR_LEN);
- memcpy(packet->mgmt_hdr.bssid, sc->atu_bssid, ETHER_ADDR_LEN);
- packet->mgmt_hdr.seq_ctl = 0;
-
- c->atu_length = length;
- return atu_send_packet(sc, c);
-}
-
-int
-atu_authenticate(struct atu_softc *sc)
-{
- usbd_status err;
- struct atu_chain *ch;
- struct atu_auth_packet *packet;
-
- /*
- * now we should authenticate :
- * 7.2.3.10 - page 64 of 802.11b spec
- * 8.1 - page 74 of 802.11b spec
- * see 7.3.1.9 - page 69 for status codes
- *
- * open systems :
- * send: seq_nr=1 auth req
- * recv: seq_nr=2 auth resp. (with status code)
- *
- * shared key systems :
- * send: seq_nr=1 auth req
- * recv: seq_nr=2 auth challenge (with status code & challenge
- * text)
- * send: seq_nr=3 auth reponse (wep encr challenge text)
- * recv: seq_nr=4 auth result
- *
- * algorithm number :
- * 0 = open
- * 1 = shared
- */
-
- ch = SLIST_FIRST(&sc->atu_cdata.atu_mgmt_free);
- if (ch == NULL) {
- DPRINTF(("%s: authenticate: no mgmt transfers available\n",
- USBDEVNAME(sc->atu_dev)));
- return ENOMEM;
- }
- SLIST_REMOVE_HEAD(&sc->atu_cdata.atu_mgmt_free, atu_list);
-
- packet = (struct atu_auth_packet *)ch->atu_buf;
-
- packet->mgmt_hdr.frame_ctl = WI_FTYPE_MGMT |
- IEEE80211_FC0_SUBTYPE_AUTH;
-
- packet->auth_hdr.wi_algo = 0;
- packet->auth_hdr.wi_seq = 1;
- packet->auth_hdr.wi_status = 0;
-
- DPRINTFN(15, ("%s: auth packet: %30D\n", USBDEVNAME(sc->atu_dev),
- ((u_int8_t *)packet)+8, " "));
-
- err = atu_send_mgmt_packet(sc, ch, sizeof(*packet));
- if (err) {
- DPRINTF(("%s: could not send auth packet\n",
- USBDEVNAME(sc->atu_dev)));
- }
-
- /*
- * TODO: implement shared key auth
- */
- /*
- packet->algoritm = 1;
- packet->sequence = 3;
- packet->status = 0;
-
- memcpy(packet->challenge, the_challenge_text, the_challenge_length);
-
- DPRINTFN(15, ("%s: auth packet: %30D\n", USBDEVNAME(sc->atu_dev),
- ((u_int8_t *)packet)+8, " "));
-
- if (sc->atu_encrypt & ATU_WEP_TX) {
- packet->mgmt_hdr.frame_ctl |= WI_FCTL_WEP;
- DPRINTFN(20, ("%s: ==> WEP on please\n",
- USBDEVNAME(sc->atu_dev)));
- }
-
- err = atu_send_mgmt_packet(sc, ch, sizeof(*packet) + challenge_len);
- if (err) {
- DPRINTF(("%s: could not send auth packet 2\n",
- USBDEVNAME(sc->atu_dev)));
- }
- */
- return 0;
-}
-
-int
-atu_associate(struct atu_softc *sc)
-{
- usbd_status err;
- struct atu_chain *ch;
- u_int8_t *ptr;
- struct atu_assoc_packet *packet;
-
- /*
- * associate :
- * 7.2.3.4 - page 62 of 802.11b spec
- *
- */
-
- ch = SLIST_FIRST(&sc->atu_cdata.atu_mgmt_free);
- if (ch == NULL) {
- DPRINTF(("%s: associate: no mgmt transfers left\n",
- USBDEVNAME(sc->atu_dev)));
- return ENOMEM;
- }
- SLIST_REMOVE_HEAD(&sc->atu_cdata.atu_mgmt_free, atu_list);
-
- packet = (struct atu_assoc_packet *)ch->atu_buf;
-
- packet->mgmt_hdr.frame_ctl = WI_FTYPE_MGMT |
- IEEE80211_FC0_SUBTYPE_ASSOC_REQ;
-
- packet->capability = 1 + 32; /* ess & short preamble */
- packet->capability = 1;
- packet->listen_interval = 100; /* beacon interval */
-
- ptr = packet->data;
- *ptr++ = WI_VAR_SSID; /* SSID */
- *ptr++ = sc->atu_ssidlen;
- memcpy(ptr, sc->atu_ssid, sc->atu_ssidlen);
- ptr += sc->atu_ssidlen;
-
- *ptr++ = WI_VAR_SRATES; /* supported rates */
- *ptr++ = 0x04;
- *ptr++ = 0x82;
- *ptr++ = 0x84;
- *ptr++ = 0x8b;
- *ptr++ = 0x96;
-
- DPRINTFN(15, ("%s: associate packet: %50D\n",
- USBDEVNAME(sc->atu_dev), (u_int8_t *)packet, " "));
-
- err = atu_send_mgmt_packet(sc, ch, sizeof(*packet) + 2 +
- sc->atu_ssidlen + 6);
- if (err) {
- DPRINTF(("%s: could not send associate packet\n",
- USBDEVNAME(sc->atu_dev)));
- }
- return 0;
-}
-
/*
* Get the state of the DFU unit
*/
@@ -1290,222 +1089,6 @@ USB_MATCH(atu)
return(UMATCH_NONE);
}
-/*
- * this routine gets called from the mgmt thread at least once a second.
- * if we return 0 the thread will go to sleep, if we return 1 we will be
- * called again immediately (like 'continue' does in a while-loop)
- */
-int
-atu_mgmt_state_machine(struct atu_softc *sc)
-{
- struct atu_mgmt *vars = &sc->atu_mgmt_vars;
- usbd_status err;
- u_int8_t statusreq[6];
- int s;
-
- if (sc->atu_mgmt_flags & ATU_CHANGED_SETTINGS) {
- sc->atu_mgmt_flags &= ~ATU_CHANGED_SETTINGS;
- sc->atu_mgmt_flags &= ~ATU_FOUND_BSSID;
- sc->atu_mgmt_flags &= ~ATU_AUTH_OK;
- sc->atu_mgmt_flags &= ~ATU_RE_AUTH;
- sc->atu_mgmt_flags &= ~ATU_ASSOC_OK;
- sc->atu_mgmt_flags |= ATU_SEARCHING;
- vars->state = STATE_LISTENING;
- vars->retry = 0;
- }
-
- DPRINTFN(5, ("%s: [state=%s, retry=%d, chan=%d d-chan=%d enc=%d]\n",
- USBDEVNAME(sc->atu_dev), atu_mgmt_statename[vars->state],
- vars->retry, sc->atu_channel, sc->atu_desired_channel,
- sc->atu_encrypt));
-
- /* Fall back to authentication if needed */
- /* TODO: should we only allow this when in infra-mode? */
- if ((sc->atu_mgmt_flags & ATU_RE_AUTH) &&
- (vars->state >= STATE_AUTHENTICATING)) {
- vars->state = STATE_AUTHENTICATING;
- sc->atu_mgmt_flags &= ~(ATU_RE_AUTH | ATU_AUTH_OK |
- ATU_ASSOC_OK);
- vars->retry = 0;
- }
-
- /* Fall back to association if needed */
- /* TODO: should we only allow this when in infra-mode? */
- if ((sc->atu_mgmt_flags & ATU_RE_ASSOC) &&
- (vars->state >= STATE_ASSOCIATING)) {
- vars->state = STATE_ASSOCIATING;
- sc->atu_mgmt_flags &= ~(ATU_RE_ASSOC | ATU_AUTH_OK |
- ATU_ASSOC_OK);
- vars->retry = 0;
- }
-
- switch (vars->state) {
- case STATE_NONE:
- /* awaiting orders */
- break;
- case STATE_LISTENING:
- /* do some nifty scanning here */
-
- if (sc->atu_mgmt_flags & ATU_FOUND_BSSID) {
- vars->state = STATE_JOINING;
- vars->retry = 0;
- return 1;
- }
- s = splusb();
- err = atu_get_cmd_status(sc, CMD_JOIN, statusreq);
- if (err) {
- DPRINTF(("%s: get_cmd_status failed in mgmt_loop\n",
- USBDEVNAME(sc->atu_dev)));
- vars->state = STATE_GIVEN_UP;
- vars->retry = 0;
- }
- if (statusreq[5]==STATUS_IN_PROGRESS) {
- DPRINTFN(10, ("%s: scanning in progress...\n",
- USBDEVNAME(sc->atu_dev)));
- } else {
- err = atu_start_scan(sc);
- if (vars->retry++ > ATU_SCAN_RETRIES &&
- sc->atu_mode == AD_HOC_MODE) {
- DPRINTFN(10, ("%s: scanned long enough\n",
- USBDEVNAME(sc->atu_dev)));
- sc->atu_mgmt_flags &= ~ATU_SEARCHING;
- vars->state = STATE_CREATING_IBSS;
- vars->retry = 0;
- }
- if (err) {
- DPRINTF(("%s: get_cmd_failed in mgmt_loop\n",
- USBDEVNAME(sc->atu_dev)));
- vars->state = STATE_GIVEN_UP;
- vars->retry = 0;
- }
- }
- splx(s);
- break;
- case STATE_JOINING:
- DPRINTFN(10, ("%s: going to join\n",
- USBDEVNAME(sc->atu_dev)));
- //err = atu_join(sc, );
- if (err) {
- if (vars->retry++ > ATU_JOIN_RETRIES) {
- if (sc->atu_mode == AD_HOC_MODE)
- vars->state = STATE_CREATING_IBSS;
- else
- vars->state = STATE_GIVEN_UP;
- vars->retry = 0;
- }
- DPRINTF(("%s: error joining\n",
- USBDEVNAME(sc->atu_dev)));
- } else {
- if (sc->atu_mode == AD_HOC_MODE)
- vars->state = STATE_HAPPY_NETWORKING;
- else
- vars->state = STATE_AUTHENTICATING;
- vars->retry = 0;
- }
- break;
- case STATE_AUTHENTICATING:
- if (sc->atu_mgmt_flags & ATU_AUTH_OK) {
- vars->state = STATE_ASSOCIATING;
- vars->retry = 0;
- return 1;
- }
-
- DPRINTFN(10, ("%s: trying authentication\n",
- USBDEVNAME(sc->atu_dev)));
- atu_authenticate(sc);
- if (vars->retry++ > ATU_AUTH_RETRIES) {
- vars->state = STATE_GIVEN_UP;
- DPRINTF(("%s: error authenticating...\n",
- USBDEVNAME(sc->atu_dev)));
- }
- break;
- case STATE_ASSOCIATING:
- if (sc->atu_mgmt_flags & ATU_ASSOC_OK) {
- vars->state = STATE_HAPPY_NETWORKING;
- vars->retry = 0;
- return 1;
- }
- DPRINTFN(10, ("%s: trying to associate\n",
- USBDEVNAME(sc->atu_dev)));
- atu_associate(sc);
- if (vars->retry++ > ATU_ASSOC_RETRIES) {
- vars->state = STATE_GIVEN_UP;
- DPRINTF(("%s: error associating...\n",
- USBDEVNAME(sc->atu_dev)));
- }
- break;
- case STATE_CREATING_IBSS:
- DPRINTFN(10, ("%s: trying to create IBSS\n",
- USBDEVNAME(sc->atu_dev)));
- err = atu_start_ibss(sc);
- if (err) {
- if (vars->retry++ > ATU_IBSS_RETRIES)
- vars->state = STATE_GIVEN_UP;
- DPRINTF(("%s: error creating IBSS...\n",
- USBDEVNAME(sc->atu_dev)));
- } else {
- vars->state = STATE_HAPPY_NETWORKING;
- vars->retry = 0;
- }
- break;
- case STATE_HAPPY_NETWORKING:
- /* happy networking
- *
- * TODO:
- * we should bounce back to previous states from here
- * on beacon timeout.
- */
- break;
- case STATE_GIVEN_UP:
- /*
- * can only leave this state if someone changes the
- * config
- */
- break;
- }
-
- if (vars->state == STATE_HAPPY_NETWORKING)
- sc->atu_mgmt_flags |= ATU_NETWORK_OK;
- else
- sc->atu_mgmt_flags &= ~ATU_NETWORK_OK;
- return 0;
-}
-
-void
-atu_mgmt_loop(void *arg)
-{
- struct atu_softc *sc = arg;
- int again;
- int s;
-
- DPRINTFN(10, ("%s: mgmt task initialised\n",
- USBDEVNAME(sc->atu_dev)));
-
- sc->atu_mgmt_vars.state = STATE_NONE;
- sc->atu_mgmt_vars.retry = 0;
-
- while (!sc->atu_dying) {
- s = splnet();
- again = atu_mgmt_state_machine(sc);
- while (again)
- again = atu_mgmt_state_machine(sc);
- splx(s);
-
- /*
- * wait for something to happen (but not too long :)
- * if someone changes the config or a mgmt packet is received
- * we will be waken up
- */
- tsleep(sc, PZERO | PCATCH, "atum", ATU_MGMT_INTERVAL);
- }
-
- DPRINTFN(10, ("%s: mgmt thread stops now...\n",
- USBDEVNAME(sc->atu_dev)));
- sc->atu_dying++;
- sc->atu_mgmt_flags &= ~ATU_TASK_RUNNING;
- kthread_exit(0);
-}
-
int
atu_media_change(struct ifnet *ifp)
{
@@ -1962,310 +1545,6 @@ atu_xfer_list_free(struct atu_softc *sc, struct atu_chain *ch,
}
}
-void
-atu_print_beacon(struct atu_softc *sc, struct atu_rxpkt *pkt)
-{
- u_int8_t *ptr;
- struct tlv *tlv;
- u_int8_t *end;
- u_int8_t tmp;
- u_int8_t rate;
-
- /* Let's have a closer look at this beacon... */
- ptr = (u_int8_t *)pkt->WiHeader.addr4 + 12;
- end = ptr + pkt->AtHeader.wlength - 24 - 12 - 4;
- tlv = (struct tlv *)ptr;
-
- while ((ptr<end) && (ptr + 2 + tlv->length <= end)) {
- switch (tlv->type) {
- case WI_VAR_SSID: /* SSID */
- /* sanity check */
- if (tlv->length > 32)
- break;
-
- tmp = tlv->value[tlv->length];
- tlv->value[tlv->length] = 0;
- DPRINTF(("%s: ssid=[%s]\n", USBDEVNAME(sc->atu_dev),
- tlv->value));
- tlv->value[tlv->length] = tmp;
- break;
- case WI_VAR_SRATES: /* Supported rates */
- for (rate=0; rate<tlv->length; rate++) {
- tmp = tlv->value[rate] & (~0x80);
- DPRINTF(("%s: rate: %d kbps (%02x)\n",
- USBDEVNAME(sc->atu_dev), 500 * tmp,
- tlv->value[rate]));
- }
- break;
- case WI_VAR_DS: /* DS (channel) */
- DPRINTF(("%s: channel=%d\n",
- USBDEVNAME(sc->atu_dev), *tlv->value));
- break;
- default :
- DPRINTF(("%s: tlv: t=%02x l=%02x v[0]=%02x\n",
- USBDEVNAME(sc->atu_dev), tlv->type, tlv->length,
- tlv->value[0]));
- }
-
- ptr += 2 + tlv->length;
- tlv = (struct tlv *)ptr;
- }
-}
-
-void
-atu_handle_mgmt_packet(struct atu_softc *sc, struct atu_rxpkt *pkt)
-{
- u_int8_t *ptr;
- struct tlv *tlv;
- u_int8_t *end;
- u_int8_t tmp;
- int match;
- int match_channel = 1;
- struct wi_80211_beacon *beacon;
- struct wi_mgmt_auth_hdr *auth;
- struct wi_mgmt_deauth_hdr *deauth;
- struct wi_mgmt_disas_hdr *deassoc;
- struct wi_mgmt_asresp_hdr *assoc;
-
- switch (pkt->WiHeader.frame_ctl & WI_FCTL_STYPE) {
- case WI_STYPE_MGMT_AUTH:
- DPRINTFN(15, ("%s: received auth response...\n",
- USBDEVNAME(sc->atu_dev)));
-
- auth = (struct wi_mgmt_auth_hdr *)pkt->WiHeader.addr4;
-
- if (auth->wi_seq != 2) {
- DPRINTF(("%s: auth wrong seq.nr (%x)\n",
- USBDEVNAME(sc->atu_dev), auth->wi_seq));
- break;
- }
- if (auth->wi_status != 0) {
- DPRINTF(("%s: auth status error (%x)\n",
- USBDEVNAME(sc->atu_dev), auth->wi_status));
- break;
- }
-
- /* TODO: should check bssid & mac ! */
-
- sc->atu_mgmt_flags |= ATU_AUTH_OK;
- wakeup(sc);
-
- /*
- * TODO: DAAN Daan daan - Add challenge text blah blah
- * (for shared-key systems)
- */
- /*
- memcpy(the_challenge_text, ((u_int8_t *)&pkt->WiHeader) + 30,
- the_challenge_length);
- DPRINTFN(15, ("%s: challenge= %100D\n",
- USBDEVNAME(sc->atu_dev), the_challende_text, " "));
- */
- break;
-
- case WI_STYPE_MGMT_DEAUTH:
- DPRINTF(("%s: the AP has de-authenticated us\n",
- USBDEVNAME(sc->atu_dev)));
-
- deauth = (struct wi_mgmt_deauth_hdr *)pkt->WiHeader.addr4;
-
- DPRINTF(("%s: de-authentication reason: %04x\n",
- USBDEVNAME(sc->atu_dev), deauth->wi_reason));
-
- /* TODO: should check bssid & mac ! */
-
- /* wake up the state machine to get us re-authenticated */
- sc->atu_mgmt_flags |= ATU_RE_AUTH;
- wakeup(sc);
- break;
-
- case WI_STYPE_MGMT_ASRESP:
- DPRINTFN(15, ("%s: received assoc response...\n",
- USBDEVNAME(sc->atu_dev)));
-
- assoc = (struct wi_mgmt_asresp_hdr *)pkt->WiHeader.addr4;
-
- if (assoc->wi_status == 0) {
- sc->atu_mgmt_flags |= ATU_ASSOC_OK;
- wakeup(sc);
- } else {
- DPRINTF(("%s: assoc status error (%x)\n",
- USBDEVNAME(sc->atu_dev), assoc->wi_status));
- break;
- }
-
- /* TODO: should check bssid & mac ! */
- wakeup(sc);
-
- break;
-
- case WI_STYPE_MGMT_DISAS:
- DPRINTF(("%s: the AP has de-associated us",
- USBDEVNAME(sc->atu_dev)));
-
- deassoc = (struct wi_mgmt_disas_hdr *)pkt->WiHeader.addr4;
-
- DPRINTF(("%s: de-association reason: %04x\n",
- USBDEVNAME(sc->atu_dev), deassoc->wi_reason));
-
- /* TODO: should check bssid & mac ! */
-
- /* wake up the state machine to get us re-authenticated */
- sc->atu_mgmt_flags |= ATU_RE_ASSOC;
- wakeup(sc);
- break;
-
- case WI_STYPE_MGMT_PROBERESP:
- DPRINTFN(20, ("%s: PROBE RESPONSE\n",
- USBDEVNAME(sc->atu_dev)));
- /* FALLTHROUGH */
- case WI_STYPE_MGMT_BEACON:
-
- beacon = (struct wi_80211_beacon *)&pkt->WiHeader.addr4;
-
- /* Show beacon src MAC & signal strength */
- DPRINTFN(18, ("%s: mgmt bssid=%s", USBDEVNAME(sc->atu_dev),
- ether_sprintf(pkt->WiHeader.addr3)));
- DPRINTFN(18, (" mac=%s signal=%d\n",
- ether_sprintf(pkt->WiHeader.addr2), pkt->AtHeader.rssi));
-
-#ifdef ATU_DEBUG
- if (atudebug > 20) {
- /*
- * calculate average signal strength, can be very
- * usefull when precisely aiming antenna's
- * NOTE: this is done on ALL beacons, so multiple
- * stations can end up in the average. this only
- * works well if we're only receiving one station.
- */
- sc->atu_signaltotal += pkt->AtHeader.rssi;
- sc->atu_signaltotal -=
- sc->atu_signalarr[sc->atu_signalptr];
- sc->atu_signalarr[sc->atu_signalptr] =
- pkt->AtHeader.rssi;
- sc->atu_signalptr=(sc->atu_signalptr+1) %
- ATU_AVG_TIME;
- DPRINTF(("%s: mgmt mac=%s signal=%02d ptr=%02d "
- "avg=%02d.%02d\n", USBDEVNAME(sc->atu_dev),
- ether_sprintf(pkt->WiHeader.addr2),
- pkt->AtHeader.rssi, sc->atu_signalptr,
- sc->atu_signaltotal / ATU_AVG_TIME,
- (sc->atu_signaltotal * 100 / ATU_AVG_TIME) %
- 100));
- }
-#endif
-
- DPRINTFN(18, ("%s: mgmt capabilities=%04x (mode=%s, wep=%s, "
- "short-preamble=%s)\n", USBDEVNAME(sc->atu_dev),
- beacon->flags,
- (beacon->flags & IEEE80211_CAPINFO_ESS) ?
- "infra" : "ad-hoc",
- (beacon->flags & IEEE80211_CAPINFO_PRIVACY) ?
- "on" : "off",
- (beacon->flags & IEEE80211_CAPINFO_SHORT_PREAMBLE) ?
- "yes" : "no"));
-
-#ifdef ATU_DEBUG
- if (atudebug > 18)
- atu_print_beacon(sc, pkt);
-#endif
- if (!(sc->atu_mgmt_flags & ATU_SEARCHING))
- break;
-
- /* Let's have a closer look at this beacon... */
- ptr = (u_int8_t *)pkt->WiHeader.addr4 + 12;
- end = ptr + pkt->AtHeader.wlength - 24 - 12 - 4;
- tlv = (struct tlv *)ptr;
- match = 0;
- while ((ptr<end) && (ptr + 2 + tlv->length <= end)) {
- switch (tlv->type) {
- case WI_VAR_SSID: /* SSID */
- /* sanity check */
- if (tlv->length > 32)
- break;
-
- tmp = tlv->value[tlv->length];
- tlv->value[tlv->length] = 0;
- sc->atu_ssid[sc->atu_ssidlen] = 0;
- if (!strcmp(tlv->value, sc->atu_ssid)) {
- match = 1;
- }
- tlv->value[tlv->length] = tmp;
- break;
- case WI_VAR_SRATES: /* Supported rates */
- /*
- * TODO: should check if we support all
- * mandatory rates
- */
- break;
- case WI_VAR_DS: /* DS (channel) */
- if (match)
- match_channel = *tlv->value;
- break;
- }
-
- ptr += 2 + tlv->length;
- tlv = (struct tlv *)ptr;
- }
-
- /* check mode... */
- beacon = (struct wi_80211_beacon *)&pkt->WiHeader.addr4;
- if (match) {
- if ((sc->atu_mode == AD_HOC_MODE) &&
- (beacon->flags & IEEE80211_CAPINFO_ESS)) {
- match = 0;
- DPRINTF(("%s: SSID matches, but we're in "
- "adhoc mode instead of infra\n",
- USBDEVNAME(sc->atu_dev)));
- }
- if ((sc->atu_mode == INFRASTRUCTURE_MODE) &&
- (!(beacon->flags & IEEE80211_CAPINFO_ESS))) {
- match = 0;
- DPRINTF(("%s: SSID matches, but we're in "
- "infra mode instead of adhoc\n",
- USBDEVNAME(sc->atu_dev)));
- }
- if ((sc->atu_desired_channel != IEEE80211_CHAN_ANY) &&
- (match_channel != sc->atu_desired_channel)) {
- match = 0;
- DPRINTF(("%s: SSID matches, but the channel "
- "doesn't (%d != %d)\n",
- USBDEVNAME(sc->atu_dev), match_channel,
- sc->atu_desired_channel));
- }
-
- if (!match) {
- break;
- }
- }
-
- if (match) {
- DPRINTF(("%s: ==> MATCH! (BSSID=%s, ch=%d)\n",
- USBDEVNAME(sc->atu_dev),
- ether_sprintf(pkt->WiHeader.addr3),
- match_channel));
-
- /*
- * TODO: should do some channel-checking here instead
- * of just ignoring the channel the user sets
- */
-
- memcpy(sc->atu_bssid, pkt->WiHeader.addr3,
- ETHER_ADDR_LEN);
- sc->atu_channel = match_channel;
-
- sc->atu_mgmt_flags &= ~ATU_SEARCHING;
- sc->atu_mgmt_flags |= ATU_FOUND_BSSID;
- }
-
- break;
-
- default:
- DPRINTF(("%s: FIXME: unhandled mgmt type! (stype=%x)\n",
- USBDEVNAME(sc->atu_dev),
- pkt->WiHeader.frame_ctl & WI_FCTL_STYPE));
- }
-}
-
/* XXX Horrible hack to fix channel number of beacons and probe responses */
void
atu_fix_channel(struct ieee80211com *ic, struct mbuf *m)
@@ -2488,40 +1767,6 @@ atu_calculate_padding(int size)
#endif /* ATU_TX_PADDING */
int
-atu_encap(struct atu_softc *sc, struct mbuf *m, struct atu_chain *c)
-{
- int total_len;
- struct atu_txpkt *pkt;
-#ifdef ATU_TX_PADDING
- u_int8_t padding;
-#endif /* ATU_TX_PADDING */
-
- /*
- * Copy the mbuf data into a contiguous buffer, leaving
- * enough room for the atmel & 802.11 headers
- */
- total_len = m->m_pkthdr.len;
-
- m_copydata(m, 0, m->m_pkthdr.len, c->atu_buf + sizeof(pkt->AtHeader));
-
- pkt = (struct atu_txpkt *)c->atu_buf;
- pkt->AtHeader.wlength = total_len;
- pkt->AtHeader.tx_rate = 4; /* rate = auto */
- pkt->AtHeader.padding = 0;
- memset(pkt->AtHeader.reserved, 0x00, sizeof(pkt->AtHeader.reserved));
-
- total_len += sizeof(pkt->AtHeader);
-#ifdef ATU_TX_PADDING
- padding = atu_calculate_padding(total_len % 64);
- total_len += padding;
- pkt->AtHeader.padding = padding;
-#endif /* ATU_TX_PADDING */
- c->atu_length = total_len;
- c->atu_mbuf = m;
- return(0);
-}
-
-int
atu_tx_start(struct atu_softc *sc, struct ieee80211_node *ni,
struct atu_chain *c, struct mbuf *m)
{