don't hand-roll bpf_mtap_hdr for radiotap in wireless drivers

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

don't hand-roll bpf_mtap_hdr for radiotap in wireless drivers

David Gwynne-5
radiotap code puts an mbuf on the stack so it can build a chain that
includes a radiotap header for bpf_mtap to chew on. bpf_mtap_hdr can do
that for you though.

bpf_mtap_hdr also cheats by using an m_hdr instead of a full mbuf,
which makes the stack usage less, but im arguing for the diff because it
makes the calling code simpler.

this only tweaks the intel wireless drivers, there's a handful of other
ones that could be fixed too if this diff goes in.

tests? ok?

Index: if_ipw.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_ipw.c,v
retrieving revision 1.123
diff -u -p -r1.123 if_ipw.c
--- if_ipw.c 25 Jul 2019 01:46:14 -0000 1.123
+++ if_ipw.c 12 Sep 2019 03:14:03 -0000
@@ -878,7 +878,6 @@ ipw_data_intr(struct ipw_softc *sc, stru
 
 #if NBPFILTER > 0
  if (sc->sc_drvbpf != NULL) {
- struct mbuf mb;
  struct ipw_rx_radiotap_header *tap = &sc->sc_rxtap;
 
  tap->wr_flags = 0;
@@ -886,13 +885,8 @@ ipw_data_intr(struct ipw_softc *sc, stru
  tap->wr_chan_freq = htole16(ic->ic_ibss_chan->ic_freq);
  tap->wr_chan_flags = htole16(ic->ic_ibss_chan->ic_flags);
 
- mb.m_data = (caddr_t)tap;
- mb.m_len = sc->sc_rxtap_len;
- mb.m_next = m;
- mb.m_nextpkt = NULL;
- mb.m_type = 0;
- mb.m_flags = 0;
- bpf_mtap(sc->sc_drvbpf, &mb, BPF_DIRECTION_IN);
+ bpf_mtap_hdr(sc->sc_drvbpf, tap, sc->sc_rxtap_len,
+    m, BPF_DIRECTION_IN, NULL);
  }
 #endif
 
@@ -1153,20 +1147,14 @@ ipw_tx_start(struct ifnet *ifp, struct m
 
 #if NBPFILTER > 0
  if (sc->sc_drvbpf != NULL) {
- struct mbuf mb;
  struct ipw_tx_radiotap_header *tap = &sc->sc_txtap;
 
  tap->wt_flags = 0;
  tap->wt_chan_freq = htole16(ic->ic_ibss_chan->ic_freq);
  tap->wt_chan_flags = htole16(ic->ic_ibss_chan->ic_flags);
 
- mb.m_data = (caddr_t)tap;
- mb.m_len = sc->sc_txtap_len;
- mb.m_next = m;
- mb.m_nextpkt = NULL;
- mb.m_type = 0;
- mb.m_flags = 0;
- bpf_mtap(sc->sc_drvbpf, &mb, BPF_DIRECTION_OUT);
+ bpf_mtap_hdr(sc->sc_drvbpf, tap, sc->sc_txtap_len,
+    m, BPF_DIRECTION_OUT, NULL);
  }
 #endif
 
Index: if_iwi.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_iwi.c,v
retrieving revision 1.140
diff -u -p -r1.140 if_iwi.c
--- if_iwi.c 25 Jul 2019 01:46:14 -0000 1.140
+++ if_iwi.c 12 Sep 2019 03:14:03 -0000
@@ -923,7 +923,6 @@ iwi_frame_intr(struct iwi_softc *sc, str
 
 #if NBPFILTER > 0
  if (sc->sc_drvbpf != NULL) {
- struct mbuf mb;
  struct iwi_rx_radiotap_header *tap = &sc->sc_rxtap;
 
  tap->wr_flags = 0;
@@ -937,13 +936,8 @@ iwi_frame_intr(struct iwi_softc *sc, str
  if (frame->antenna & 0x40)
  tap->wr_flags |= IEEE80211_RADIOTAP_F_SHORTPRE;
 
- mb.m_data = (caddr_t)tap;
- mb.m_len = sc->sc_rxtap_len;
- mb.m_next = m;
- mb.m_nextpkt = NULL;
- mb.m_type = 0;
- mb.m_flags = 0;
- bpf_mtap(sc->sc_drvbpf, &mb, BPF_DIRECTION_IN);
+ bpf_mtap_hdr(sc->sc_drvbpf, tap, sc->sc_rxtap_len,
+    m, BPF_DIRECTION_IN, NULL);
  }
 #endif
 
@@ -1265,20 +1259,14 @@ iwi_tx_start(struct ifnet *ifp, struct m
 
 #if NBPFILTER > 0
  if (sc->sc_drvbpf != NULL) {
- struct mbuf mb;
  struct iwi_tx_radiotap_header *tap = &sc->sc_txtap;
 
  tap->wt_flags = 0;
  tap->wt_chan_freq = htole16(ic->ic_bss->ni_chan->ic_freq);
  tap->wt_chan_flags = htole16(ic->ic_bss->ni_chan->ic_flags);
 
- mb.m_data = (caddr_t)tap;
- mb.m_len = sc->sc_txtap_len;
- mb.m_next = m0;
- mb.m_nextpkt = NULL;
- mb.m_type = 0;
- mb.m_flags = 0;
- bpf_mtap(sc->sc_drvbpf, &mb, BPF_DIRECTION_OUT);
+ bpf_mtap_hdr(sc->sc_drvbpf, tap, sc->sc_txtap_len,
+    m0, BPF_DIRECTION_OUT, NULL);
  }
 #endif
 
Index: if_iwm.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_iwm.c,v
retrieving revision 1.244
diff -u -p -r1.244 if_iwm.c
--- if_iwm.c 8 Aug 2019 13:56:56 -0000 1.244
+++ if_iwm.c 12 Sep 2019 03:14:03 -0000
@@ -3629,7 +3629,6 @@ iwm_rx_rx_mpdu(struct iwm_softc *sc, str
 
 #if NBPFILTER > 0
  if (sc->sc_drvbpf != NULL) {
- struct mbuf mb;
  struct iwm_rx_radiotap_header *tap = &sc->sc_rxtap;
  uint16_t chan_flags;
 
@@ -3674,13 +3673,8 @@ iwm_rx_rx_mpdu(struct iwm_softc *sc, str
  }
  }
 
- mb.m_data = (caddr_t)tap;
- mb.m_len = sc->sc_rxtap_len;
- mb.m_next = m;
- mb.m_nextpkt = NULL;
- mb.m_type = 0;
- mb.m_flags = 0;
- bpf_mtap(sc->sc_drvbpf, &mb, BPF_DIRECTION_IN);
+ bpf_mtap_hdr(sc->sc_drvbpf, tap, sc->sc_rxtap_len,
+    m, BPF_DIRECTION_IN, NULL);
  }
 #endif
  ieee80211_input(IC2IFP(ic), m, ni, &rxi);
@@ -4367,7 +4361,6 @@ iwm_tx(struct iwm_softc *sc, struct mbuf
 
 #if NBPFILTER > 0
  if (sc->sc_drvbpf != NULL) {
- struct mbuf mb;
  struct iwm_tx_radiotap_header *tap = &sc->sc_txtap;
  uint16_t chan_flags;
 
@@ -4389,13 +4382,8 @@ iwm_tx(struct iwm_softc *sc, struct mbuf
     (wh->i_fc[1] & IEEE80211_FC1_PROTECTED))
  tap->wt_flags |= IEEE80211_RADIOTAP_F_WEP;
 
- mb.m_data = (caddr_t)tap;
- mb.m_len = sc->sc_txtap_len;
- mb.m_next = m;
- mb.m_nextpkt = NULL;
- mb.m_type = 0;
- mb.m_flags = 0;
- bpf_mtap(sc->sc_drvbpf, &mb, BPF_DIRECTION_OUT);
+ bpf_mtap_hdr(sc->sc_drvbpf, tap, sc->sc_txtap_len,
+    m, BPF_DIRECTION_OUT, NULL);
  }
 #endif
  totlen = m->m_pkthdr.len;
Index: if_iwn.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_iwn.c,v
retrieving revision 1.212
diff -u -p -r1.212 if_iwn.c
--- if_iwn.c 29 Jul 2019 10:50:08 -0000 1.212
+++ if_iwn.c 12 Sep 2019 03:14:03 -0000
@@ -2189,7 +2189,6 @@ iwn_rx_done(struct iwn_softc *sc, struct
 
 #if NBPFILTER > 0
  if (sc->sc_drvbpf != NULL) {
- struct mbuf mb;
  struct iwn_rx_radiotap_header *tap = &sc->sc_rxtap;
  uint16_t chan_flags;
 
@@ -2227,13 +2226,8 @@ iwn_rx_done(struct iwn_softc *sc, struct
  }
  }
 
- mb.m_data = (caddr_t)tap;
- mb.m_len = sc->sc_rxtap_len;
- mb.m_next = m;
- mb.m_nextpkt = NULL;
- mb.m_type = 0;
- mb.m_flags = 0;
- bpf_mtap(sc->sc_drvbpf, &mb, BPF_DIRECTION_IN);
+ bpf_mtap_hdr(sc->sc_drvbpf, tap, sc->sc_rxtap_len,
+    m, BPF_DIRECTION_IN, NULL);
  }
 #endif
 
@@ -3257,7 +3251,6 @@ iwn_tx(struct iwn_softc *sc, struct mbuf
  rinfo = &iwn_rates[ridx];
 #if NBPFILTER > 0
  if (sc->sc_drvbpf != NULL) {
- struct mbuf mb;
  struct iwn_tx_radiotap_header *tap = &sc->sc_txtap;
  uint16_t chan_flags;
 
@@ -3278,13 +3271,8 @@ iwn_tx(struct iwn_softc *sc, struct mbuf
     (wh->i_fc[1] & IEEE80211_FC1_PROTECTED))
  tap->wt_flags |= IEEE80211_RADIOTAP_F_WEP;
 
- mb.m_data = (caddr_t)tap;
- mb.m_len = sc->sc_txtap_len;
- mb.m_next = m;
- mb.m_nextpkt = NULL;
- mb.m_type = 0;
- mb.m_flags = 0;
- bpf_mtap(sc->sc_drvbpf, &mb, BPF_DIRECTION_OUT);
+ bpf_mtap_hdr(sc->sc_drvbpf, tap, sc->sc_txtap_len,
+    m, BPF_DIRECTION_OUT, NULL);
  }
 #endif
 
Index: if_wpi.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_wpi.c,v
retrieving revision 1.145
diff -u -p -r1.145 if_wpi.c
--- if_wpi.c 25 Jul 2019 01:46:15 -0000 1.145
+++ if_wpi.c 12 Sep 2019 03:14:03 -0000
@@ -1298,7 +1298,6 @@ wpi_rx_done(struct wpi_softc *sc, struct
 
 #if NBPFILTER > 0
  if (sc->sc_drvbpf != NULL) {
- struct mbuf mb;
  struct wpi_rx_radiotap_header *tap = &sc->sc_rxtap;
 
  tap->wr_flags = 0;
@@ -1331,13 +1330,8 @@ wpi_rx_done(struct wpi_softc *sc, struct
  default:  tap->wr_rate =   0;
  }
 
- mb.m_data = (caddr_t)tap;
- mb.m_len = sc->sc_rxtap_len;
- mb.m_next = m;
- mb.m_nextpkt = NULL;
- mb.m_type = 0;
- mb.m_flags = 0;
- bpf_mtap(sc->sc_drvbpf, &mb, BPF_DIRECTION_IN);
+ bpf_mtap_hdr(sc->sc_drvbpf, tap, sc->sc_rxtap_len,
+    m, BPF_DIRECTION_IN, NULL);
  }
 #endif
 
@@ -1703,7 +1697,6 @@ wpi_tx(struct wpi_softc *sc, struct mbuf
 
 #if NBPFILTER > 0
  if (sc->sc_drvbpf != NULL) {
- struct mbuf mb;
  struct wpi_tx_radiotap_header *tap = &sc->sc_txtap;
 
  tap->wt_flags = 0;
@@ -1715,13 +1708,8 @@ wpi_tx(struct wpi_softc *sc, struct mbuf
     (wh->i_fc[1] & IEEE80211_FC1_PROTECTED))
  tap->wt_flags |= IEEE80211_RADIOTAP_F_WEP;
 
- mb.m_data = (caddr_t)tap;
- mb.m_len = sc->sc_txtap_len;
- mb.m_next = m;
- mb.m_nextpkt = NULL;
- mb.m_type = 0;
- mb.m_flags = 0;
- bpf_mtap(sc->sc_drvbpf, &mb, BPF_DIRECTION_OUT);
+ bpf_mtap_hdr(sc->sc_drvbpf, tap, sc->sc_txtap_len,
+    m, BPF_DIRECTION_OUT, NULL);
  }
 #endif
 

Reply | Threaded
Open this post in threaded view
|

Re: don't hand-roll bpf_mtap_hdr for radiotap in wireless drivers

Claudio Jeker
On Thu, Sep 12, 2019 at 01:21:46PM +1000, David Gwynne wrote:

> radiotap code puts an mbuf on the stack so it can build a chain that
> includes a radiotap header for bpf_mtap to chew on. bpf_mtap_hdr can do
> that for you though.
>
> bpf_mtap_hdr also cheats by using an m_hdr instead of a full mbuf,
> which makes the stack usage less, but im arguing for the diff because it
> makes the calling code simpler.
>
> this only tweaks the intel wireless drivers, there's a handful of other
> ones that could be fixed too if this diff goes in.
>
> tests? ok?

OK claudio@
 

> Index: if_ipw.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/if_ipw.c,v
> retrieving revision 1.123
> diff -u -p -r1.123 if_ipw.c
> --- if_ipw.c 25 Jul 2019 01:46:14 -0000 1.123
> +++ if_ipw.c 12 Sep 2019 03:14:03 -0000
> @@ -878,7 +878,6 @@ ipw_data_intr(struct ipw_softc *sc, stru
>  
>  #if NBPFILTER > 0
>   if (sc->sc_drvbpf != NULL) {
> - struct mbuf mb;
>   struct ipw_rx_radiotap_header *tap = &sc->sc_rxtap;
>  
>   tap->wr_flags = 0;
> @@ -886,13 +885,8 @@ ipw_data_intr(struct ipw_softc *sc, stru
>   tap->wr_chan_freq = htole16(ic->ic_ibss_chan->ic_freq);
>   tap->wr_chan_flags = htole16(ic->ic_ibss_chan->ic_flags);
>  
> - mb.m_data = (caddr_t)tap;
> - mb.m_len = sc->sc_rxtap_len;
> - mb.m_next = m;
> - mb.m_nextpkt = NULL;
> - mb.m_type = 0;
> - mb.m_flags = 0;
> - bpf_mtap(sc->sc_drvbpf, &mb, BPF_DIRECTION_IN);
> + bpf_mtap_hdr(sc->sc_drvbpf, tap, sc->sc_rxtap_len,
> +    m, BPF_DIRECTION_IN, NULL);
>   }
>  #endif
>  
> @@ -1153,20 +1147,14 @@ ipw_tx_start(struct ifnet *ifp, struct m
>  
>  #if NBPFILTER > 0
>   if (sc->sc_drvbpf != NULL) {
> - struct mbuf mb;
>   struct ipw_tx_radiotap_header *tap = &sc->sc_txtap;
>  
>   tap->wt_flags = 0;
>   tap->wt_chan_freq = htole16(ic->ic_ibss_chan->ic_freq);
>   tap->wt_chan_flags = htole16(ic->ic_ibss_chan->ic_flags);
>  
> - mb.m_data = (caddr_t)tap;
> - mb.m_len = sc->sc_txtap_len;
> - mb.m_next = m;
> - mb.m_nextpkt = NULL;
> - mb.m_type = 0;
> - mb.m_flags = 0;
> - bpf_mtap(sc->sc_drvbpf, &mb, BPF_DIRECTION_OUT);
> + bpf_mtap_hdr(sc->sc_drvbpf, tap, sc->sc_txtap_len,
> +    m, BPF_DIRECTION_OUT, NULL);
>   }
>  #endif
>  
> Index: if_iwi.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/if_iwi.c,v
> retrieving revision 1.140
> diff -u -p -r1.140 if_iwi.c
> --- if_iwi.c 25 Jul 2019 01:46:14 -0000 1.140
> +++ if_iwi.c 12 Sep 2019 03:14:03 -0000
> @@ -923,7 +923,6 @@ iwi_frame_intr(struct iwi_softc *sc, str
>  
>  #if NBPFILTER > 0
>   if (sc->sc_drvbpf != NULL) {
> - struct mbuf mb;
>   struct iwi_rx_radiotap_header *tap = &sc->sc_rxtap;
>  
>   tap->wr_flags = 0;
> @@ -937,13 +936,8 @@ iwi_frame_intr(struct iwi_softc *sc, str
>   if (frame->antenna & 0x40)
>   tap->wr_flags |= IEEE80211_RADIOTAP_F_SHORTPRE;
>  
> - mb.m_data = (caddr_t)tap;
> - mb.m_len = sc->sc_rxtap_len;
> - mb.m_next = m;
> - mb.m_nextpkt = NULL;
> - mb.m_type = 0;
> - mb.m_flags = 0;
> - bpf_mtap(sc->sc_drvbpf, &mb, BPF_DIRECTION_IN);
> + bpf_mtap_hdr(sc->sc_drvbpf, tap, sc->sc_rxtap_len,
> +    m, BPF_DIRECTION_IN, NULL);
>   }
>  #endif
>  
> @@ -1265,20 +1259,14 @@ iwi_tx_start(struct ifnet *ifp, struct m
>  
>  #if NBPFILTER > 0
>   if (sc->sc_drvbpf != NULL) {
> - struct mbuf mb;
>   struct iwi_tx_radiotap_header *tap = &sc->sc_txtap;
>  
>   tap->wt_flags = 0;
>   tap->wt_chan_freq = htole16(ic->ic_bss->ni_chan->ic_freq);
>   tap->wt_chan_flags = htole16(ic->ic_bss->ni_chan->ic_flags);
>  
> - mb.m_data = (caddr_t)tap;
> - mb.m_len = sc->sc_txtap_len;
> - mb.m_next = m0;
> - mb.m_nextpkt = NULL;
> - mb.m_type = 0;
> - mb.m_flags = 0;
> - bpf_mtap(sc->sc_drvbpf, &mb, BPF_DIRECTION_OUT);
> + bpf_mtap_hdr(sc->sc_drvbpf, tap, sc->sc_txtap_len,
> +    m0, BPF_DIRECTION_OUT, NULL);
>   }
>  #endif
>  
> Index: if_iwm.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/if_iwm.c,v
> retrieving revision 1.244
> diff -u -p -r1.244 if_iwm.c
> --- if_iwm.c 8 Aug 2019 13:56:56 -0000 1.244
> +++ if_iwm.c 12 Sep 2019 03:14:03 -0000
> @@ -3629,7 +3629,6 @@ iwm_rx_rx_mpdu(struct iwm_softc *sc, str
>  
>  #if NBPFILTER > 0
>   if (sc->sc_drvbpf != NULL) {
> - struct mbuf mb;
>   struct iwm_rx_radiotap_header *tap = &sc->sc_rxtap;
>   uint16_t chan_flags;
>  
> @@ -3674,13 +3673,8 @@ iwm_rx_rx_mpdu(struct iwm_softc *sc, str
>   }
>   }
>  
> - mb.m_data = (caddr_t)tap;
> - mb.m_len = sc->sc_rxtap_len;
> - mb.m_next = m;
> - mb.m_nextpkt = NULL;
> - mb.m_type = 0;
> - mb.m_flags = 0;
> - bpf_mtap(sc->sc_drvbpf, &mb, BPF_DIRECTION_IN);
> + bpf_mtap_hdr(sc->sc_drvbpf, tap, sc->sc_rxtap_len,
> +    m, BPF_DIRECTION_IN, NULL);
>   }
>  #endif
>   ieee80211_input(IC2IFP(ic), m, ni, &rxi);
> @@ -4367,7 +4361,6 @@ iwm_tx(struct iwm_softc *sc, struct mbuf
>  
>  #if NBPFILTER > 0
>   if (sc->sc_drvbpf != NULL) {
> - struct mbuf mb;
>   struct iwm_tx_radiotap_header *tap = &sc->sc_txtap;
>   uint16_t chan_flags;
>  
> @@ -4389,13 +4382,8 @@ iwm_tx(struct iwm_softc *sc, struct mbuf
>      (wh->i_fc[1] & IEEE80211_FC1_PROTECTED))
>   tap->wt_flags |= IEEE80211_RADIOTAP_F_WEP;
>  
> - mb.m_data = (caddr_t)tap;
> - mb.m_len = sc->sc_txtap_len;
> - mb.m_next = m;
> - mb.m_nextpkt = NULL;
> - mb.m_type = 0;
> - mb.m_flags = 0;
> - bpf_mtap(sc->sc_drvbpf, &mb, BPF_DIRECTION_OUT);
> + bpf_mtap_hdr(sc->sc_drvbpf, tap, sc->sc_txtap_len,
> +    m, BPF_DIRECTION_OUT, NULL);
>   }
>  #endif
>   totlen = m->m_pkthdr.len;
> Index: if_iwn.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/if_iwn.c,v
> retrieving revision 1.212
> diff -u -p -r1.212 if_iwn.c
> --- if_iwn.c 29 Jul 2019 10:50:08 -0000 1.212
> +++ if_iwn.c 12 Sep 2019 03:14:03 -0000
> @@ -2189,7 +2189,6 @@ iwn_rx_done(struct iwn_softc *sc, struct
>  
>  #if NBPFILTER > 0
>   if (sc->sc_drvbpf != NULL) {
> - struct mbuf mb;
>   struct iwn_rx_radiotap_header *tap = &sc->sc_rxtap;
>   uint16_t chan_flags;
>  
> @@ -2227,13 +2226,8 @@ iwn_rx_done(struct iwn_softc *sc, struct
>   }
>   }
>  
> - mb.m_data = (caddr_t)tap;
> - mb.m_len = sc->sc_rxtap_len;
> - mb.m_next = m;
> - mb.m_nextpkt = NULL;
> - mb.m_type = 0;
> - mb.m_flags = 0;
> - bpf_mtap(sc->sc_drvbpf, &mb, BPF_DIRECTION_IN);
> + bpf_mtap_hdr(sc->sc_drvbpf, tap, sc->sc_rxtap_len,
> +    m, BPF_DIRECTION_IN, NULL);
>   }
>  #endif
>  
> @@ -3257,7 +3251,6 @@ iwn_tx(struct iwn_softc *sc, struct mbuf
>   rinfo = &iwn_rates[ridx];
>  #if NBPFILTER > 0
>   if (sc->sc_drvbpf != NULL) {
> - struct mbuf mb;
>   struct iwn_tx_radiotap_header *tap = &sc->sc_txtap;
>   uint16_t chan_flags;
>  
> @@ -3278,13 +3271,8 @@ iwn_tx(struct iwn_softc *sc, struct mbuf
>      (wh->i_fc[1] & IEEE80211_FC1_PROTECTED))
>   tap->wt_flags |= IEEE80211_RADIOTAP_F_WEP;
>  
> - mb.m_data = (caddr_t)tap;
> - mb.m_len = sc->sc_txtap_len;
> - mb.m_next = m;
> - mb.m_nextpkt = NULL;
> - mb.m_type = 0;
> - mb.m_flags = 0;
> - bpf_mtap(sc->sc_drvbpf, &mb, BPF_DIRECTION_OUT);
> + bpf_mtap_hdr(sc->sc_drvbpf, tap, sc->sc_txtap_len,
> +    m, BPF_DIRECTION_OUT, NULL);
>   }
>  #endif
>  
> Index: if_wpi.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/if_wpi.c,v
> retrieving revision 1.145
> diff -u -p -r1.145 if_wpi.c
> --- if_wpi.c 25 Jul 2019 01:46:15 -0000 1.145
> +++ if_wpi.c 12 Sep 2019 03:14:03 -0000
> @@ -1298,7 +1298,6 @@ wpi_rx_done(struct wpi_softc *sc, struct
>  
>  #if NBPFILTER > 0
>   if (sc->sc_drvbpf != NULL) {
> - struct mbuf mb;
>   struct wpi_rx_radiotap_header *tap = &sc->sc_rxtap;
>  
>   tap->wr_flags = 0;
> @@ -1331,13 +1330,8 @@ wpi_rx_done(struct wpi_softc *sc, struct
>   default:  tap->wr_rate =   0;
>   }
>  
> - mb.m_data = (caddr_t)tap;
> - mb.m_len = sc->sc_rxtap_len;
> - mb.m_next = m;
> - mb.m_nextpkt = NULL;
> - mb.m_type = 0;
> - mb.m_flags = 0;
> - bpf_mtap(sc->sc_drvbpf, &mb, BPF_DIRECTION_IN);
> + bpf_mtap_hdr(sc->sc_drvbpf, tap, sc->sc_rxtap_len,
> +    m, BPF_DIRECTION_IN, NULL);
>   }
>  #endif
>  
> @@ -1703,7 +1697,6 @@ wpi_tx(struct wpi_softc *sc, struct mbuf
>  
>  #if NBPFILTER > 0
>   if (sc->sc_drvbpf != NULL) {
> - struct mbuf mb;
>   struct wpi_tx_radiotap_header *tap = &sc->sc_txtap;
>  
>   tap->wt_flags = 0;
> @@ -1715,13 +1708,8 @@ wpi_tx(struct wpi_softc *sc, struct mbuf
>      (wh->i_fc[1] & IEEE80211_FC1_PROTECTED))
>   tap->wt_flags |= IEEE80211_RADIOTAP_F_WEP;
>  
> - mb.m_data = (caddr_t)tap;
> - mb.m_len = sc->sc_txtap_len;
> - mb.m_next = m;
> - mb.m_nextpkt = NULL;
> - mb.m_type = 0;
> - mb.m_flags = 0;
> - bpf_mtap(sc->sc_drvbpf, &mb, BPF_DIRECTION_OUT);
> + bpf_mtap_hdr(sc->sc_drvbpf, tap, sc->sc_txtap_len,
> +    m, BPF_DIRECTION_OUT, NULL);
>   }
>  #endif
>  
>

--
:wq Claudio