summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/dev/ic/malo.c60
-rw-r--r--sys/dev/ic/malo.h47
2 files changed, 98 insertions, 9 deletions
diff --git a/sys/dev/ic/malo.c b/sys/dev/ic/malo.c
index 379b75ef96b..6665dba9e0d 100644
--- a/sys/dev/ic/malo.c
+++ b/sys/dev/ic/malo.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: malo.c,v 1.7 2006/10/17 21:23:32 mglocker Exp $ */
+/* $OpenBSD: malo.c,v 1.8 2006/10/21 23:16:34 mglocker Exp $ */
/*
* Copyright (c) 2006 Claudio Jeker <claudio@openbsd.org>
@@ -48,6 +48,7 @@
#include <net80211/ieee80211_var.h>
#include <net80211/ieee80211_rssadapt.h>
+#include <net80211/ieee80211_radiotap.h>
#include <dev/ic/malo.h>
@@ -299,7 +300,16 @@ malo_attach(struct malo_softc *sc)
ieee80211_media_status);
#if NBPFILTER > 0
- /* TODO bpf mtap */
+ bpfattach(&sc->sc_drvbpf, ifp, DLT_IEEE802_11_RADIO,
+ sizeof(struct ieee80211_frame) + 64);
+
+ sc->sc_rxtap_len = sizeof(sc->sc_rxtapu);
+ sc->sc_rxtap.wr_ihdr.it_len = htole16(sc->sc_rxtap_len);
+ sc->sc_rxtap.wr_ihdr.it_present = htole32(MALO_RX_RADIOTAP_PRESENT);
+
+ sc->sc_txtap_len = sizeof(sc->sc_txtapu);
+ sc->sc_txtap.wt_ihdr.it_len = htole16(sc->sc_txtap_len);
+ sc->sc_txtap.wt_ihdr.it_present = htole32(MALO_TX_RADIOTAP_PRESENT);
#endif
return (0);
@@ -1013,7 +1023,15 @@ malo_rx_intr(struct malo_softc *sc)
sc->sc_rxring.cur * sizeof(struct malo_rx_desc),
sizeof(struct malo_rx_desc), BUS_DMASYNC_POSTREAD);
- if (!(letoh32(desc->status) & 0x01))
+ DPRINTF(("rx intr idx=%d, rxctrl=0x%02x, rssi=%d, "
+ "status=0x%02x, channel=%d, len=%d, res1=%02x, rate=%d, "
+ "physdata=0x%04x, physnext=0x%04x, qosctrl=%02x, res2=%d\n",
+ i, desc->rxctrl, desc->rssi, desc->status, desc->channel,
+ letoh16(desc->len), desc->reserved1, desc->datarate,
+ desc->physdata, desc->physnext, desc->qosctrl,
+ desc->reserved2));
+
+ if ((letoh32(desc->rxctrl) & 0x80) == 0)
break;
MGETHDR(mnew, M_DONTWAIT, MT_DATA);
@@ -1060,8 +1078,35 @@ malo_rx_intr(struct malo_softc *sc)
m->m_pkthdr.rcvif = ifp;
m->m_pkthdr.len = m->m_len = letoh32(desc->len);
-#if NBPFILER > 0
- /* TODO bpf mtap */
+ /*
+ * cut out chip specific control blocks from the 802.11 frame:
+ * 2 bytes ctrl, 24 bytes header, 6 byte ctrl, n bytes data
+ */
+ bcopy(m->m_data, m->m_data + 6, 26);
+ m_adj(m, 8);
+
+#if NBPFILTER > 0
+ if (sc->sc_drvbpf != NULL) {
+ /*
+ struct mbuf mb;
+ struct malo_rx_radiotap_hdr *tap = &sc->sc_rxtap;
+
+ tap->wr_flags = 0;
+ tap->wr_chan_freq =
+ htole16(ic->ic_bss->ni_chan->ic_freq);
+ tap->wr_chan_flags =
+ htole16(ic->ic_bss->ni_chan->ic_flags);
+ tap->wr_rssi = desc->rssi;
+ tap->wr_max_rssi = 100;
+
+ M_DUP_PKTHDR(&mb, m);
+ mb.m_data = (caddr_t)tap;
+ mb.m_len = sc->sc_rxtap_len;
+ mb.m_next = m;
+ mb.m_pkthdr.len += mb.m_len;
+ bpf_mtap(sc->sc_drvbpf, &mb, BPF_DIRECTION_IN);
+ */
+ }
#endif
wh = mtod(m, struct ieee80211_frame *);
@@ -1078,13 +1123,12 @@ malo_rx_intr(struct malo_softc *sc)
ieee80211_release_node(ic, ni);
skip:
+ desc->rxctrl = 0;
+
bus_dmamap_sync(sc->sc_dmat, sc->sc_rxring.map,
sc->sc_rxring.cur * sizeof(struct malo_rx_desc),
sizeof(struct malo_rx_desc), BUS_DMASYNC_PREWRITE);
- DPRINTF(("rx intr idx=%d, status=0x%02x, len=%d\n",
- i, desc->status, desc->len));
-
sc->sc_rxring.cur = (sc->sc_rxring.cur + 1) %
MALO_RX_RING_COUNT;
}
diff --git a/sys/dev/ic/malo.h b/sys/dev/ic/malo.h
index a6f36994ec9..ee8ef343899 100644
--- a/sys/dev/ic/malo.h
+++ b/sys/dev/ic/malo.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: malo.h,v 1.4 2006/10/17 19:40:39 claudio Exp $ */
+/* $OpenBSD: malo.h,v 1.5 2006/10/21 23:16:34 mglocker Exp $ */
/*
* Copyright (c) 2006 Claudio Jeker <claudio@openbsd.org>
@@ -46,6 +46,33 @@ struct malo_tx_ring {
int stat;
};
+#define MALO_RX_RADIOTAP_PRESENT \
+ ((1 << IEEE80211_RADIOTAP_FLAGS) | \
+ (1 << IEEE80211_RADIOTAP_CHANNEL) | \
+ (1 << IEEE80211_RADIOTAP_RSSI))
+
+struct malo_rx_radiotap_hdr {
+ struct ieee80211_radiotap_header wr_ihdr;
+ uint8_t wr_flags;
+ uint16_t wr_chan_freq;
+ uint16_t wr_chan_flags;
+ uint8_t wr_rssi;
+ uint8_t wr_max_rssi;
+} __packed;
+
+#define MALO_TX_RADIOTAP_PRESENT \
+ ((1 << IEEE80211_RADIOTAP_FLAGS) | \
+ (1 << IEEE80211_RADIOTAP_RATE) | \
+ (1 << IEEE80211_RADIOTAP_CHANNEL))
+
+struct malo_tx_radiotap_hdr {
+ struct ieee80211_radiotap_header wt_ihdr;
+ uint8_t wt_flags;
+ uint8_t wt_rate;
+ uint16_t wt_chan_freq;
+ uint16_t wt_chan_flags;
+} __packed;
+
struct malo_softc {
struct device sc_dev;
struct ieee80211com sc_ic;
@@ -71,6 +98,24 @@ struct malo_softc {
int (*sc_enable)(struct malo_softc *);
void (*sc_disable)(struct malo_softc *);
+
+#if NBPFILTER > 0
+ caddr_t sc_drvbpf;
+
+ union {
+ struct malo_rx_radiotap_hdr th;
+ uint8_t pad[64];
+ } sc_rxtapu;
+#define sc_rxtap sc_rxtapu.th
+ int sc_rxtap_len;
+
+ union {
+ struct malo_tx_radiotap_hdr th;
+ uint8_t pad[64];
+ } sc_txtapu;
+#define sc_txtap sc_txtapu.th
+ int sc_txtap_len;
+#endif
};
int malo_intr(void *arg);