Index: sys/net80211/ieee80211.h =================================================================== --- sys/net80211/ieee80211.h +++ sys/net80211/ieee80211.h @@ -39,6 +39,9 @@ #define IEEE80211_IS_MULTICAST(_a) (*(_a) & 0x01) #ifdef _KERNEL +#ifdef NETDUMP +#include +#endif extern const uint8_t ieee80211broadcastaddr[]; #endif @@ -1444,5 +1447,38 @@ IEEE80211_DUR_DS_LONG_PREAMBLE + \ IEEE80211_DUR_DS_SLOW_PLCPHDR + \ IEEE80211_DUR_DIFS) +#ifdef _KERNEL +#ifdef NETDUMP +struct ieee80211com; +struct mbuf; + +typedef void net80211dump_init_t(struct ieee80211com *, int *nrxr, int *ncl, + int *clsize); +typedef void net80211dump_event_t(struct ieee80211com *, enum netdump_ev); +typedef int net80211dump_poll_t(struct ieee80211com *, int); + +struct net80211dump_methods { + net80211dump_init_t *nd8_init; + net80211dump_event_t *nd8_event; + net80211dump_poll_t *nd8_poll; +}; + +#define NET80211DUMP_DEFINE(driver) \ + static net80211dump_init_t driver##_net80211dump_init; \ + static net80211dump_event_t driver##_net80211dump_event; \ + static net80211dump_poll_t driver##_net80211dump_poll; \ + \ + static struct net80211dump_methods driver##_net80211dump_methods = { \ + .nd8_init = driver##_net80211dump_init, \ + .nd8_event = driver##_net80211dump_event, \ + .nd8_poll = driver##_net80211dump_poll, \ + } +#define NET80211DUMP_SET(ic, driver) \ + (ic)->ic_netdump_meth = &driver##_net80211dump_methods +#else +#define NET80211DUMP_DEFINE(driver) +#define NET80211DUMP_SET(ic, driver) +#endif +#endif #endif /* _NET80211_IEEE80211_H_ */ Index: sys/net80211/ieee80211.c =================================================================== --- sys/net80211/ieee80211.c +++ sys/net80211/ieee80211.c @@ -104,6 +104,7 @@ static uint64_t ieee80211_get_counter(struct ifnet *, ift_counter); MALLOC_DEFINE(M_80211_VAP, "80211vap", "802.11 vap state"); +NETDUMP_DEFINE(ieee80211); /* * Default supported rates for 802.11 operation (in IEEE .5Mb units). @@ -706,6 +707,11 @@ ieee80211_syncflag_vht_locked(ic, IEEE80211_FVHT_USEVHT80); ieee80211_syncflag_vht_locked(ic, IEEE80211_FVHT_USEVHT80P80); ieee80211_syncflag_vht_locked(ic, IEEE80211_FVHT_USEVHT160); + +#ifdef NETDUMP + if (ic->ic_netdump_meth != NULL) + NETDUMP_SET(ifp, ieee80211); +#endif IEEE80211_UNLOCK(ic); return 1; @@ -2514,3 +2520,51 @@ return 'b'; return 'f'; } + +#ifdef NETDUMP +static void +ieee80211_netdump_init(struct ifnet *ifp, int *nrxr, int *ncl, int *clsize) +{ + struct ieee80211vap *vap; + struct ieee80211com *ic; + + vap = if_getsoftc(ifp); + ic = vap->iv_ic; + + IEEE80211_LOCK(ic); + ic->ic_netdump_meth->nd8_init(ic, nrxr, ncl, clsize); + IEEE80211_UNLOCK(ic); +} + +static void +ieee80211_netdump_event(struct ifnet *ifp, enum netdump_ev ev) +{ + struct ieee80211vap *vap; + struct ieee80211com *ic; + + vap = if_getsoftc(ifp); + ic = vap->iv_ic; + + IEEE80211_LOCK(ic); + ic->ic_netdump_meth->nd8_event(ic, ev); + IEEE80211_UNLOCK(ic); +} + +static int +ieee80211_netdump_transmit(struct ifnet *ifp, struct mbuf *m) +{ + return (ieee80211_vap_transmit(ifp, m)); +} + +static int +ieee80211_netdump_poll(struct ifnet *ifp, int count) +{ + struct ieee80211vap *vap; + struct ieee80211com *ic; + + vap = if_getsoftc(ifp); + ic = vap->iv_ic; + + return (ic->ic_netdump_meth->nd8_poll(ic, count)); +} +#endif Index: sys/net80211/ieee80211_var.h =================================================================== --- sys/net80211/ieee80211_var.h +++ sys/net80211/ieee80211_var.h @@ -370,6 +370,9 @@ /* The channel width has changed (20<->2040) */ void (*ic_update_chw)(struct ieee80211com *); +#ifdef NETDUMP + const struct net80211dump_methods *ic_netdump_meth; +#endif uint64_t ic_spare[7]; };