From owner-svn-src-head@freebsd.org Sat Jun 13 00:59:38 2020 Return-Path: Delivered-To: svn-src-head@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 18BA734B83F; Sat, 13 Jun 2020 00:59:38 +0000 (UTC) (envelope-from cem@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 49kK4T6TQrz4KF6; Sat, 13 Jun 2020 00:59:37 +0000 (UTC) (envelope-from cem@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id D95F61265E; Sat, 13 Jun 2020 00:59:37 +0000 (UTC) (envelope-from cem@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 05D0xbqt002455; Sat, 13 Jun 2020 00:59:37 GMT (envelope-from cem@FreeBSD.org) Received: (from cem@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 05D0xbns002451; Sat, 13 Jun 2020 00:59:37 GMT (envelope-from cem@FreeBSD.org) Message-Id: <202006130059.05D0xbns002451@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: cem set sender to cem@FreeBSD.org using -f From: Conrad Meyer Date: Sat, 13 Jun 2020 00:59:37 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r362138 - head/sys/net80211 X-SVN-Group: head X-SVN-Commit-Author: cem X-SVN-Commit-Paths: head/sys/net80211 X-SVN-Commit-Revision: 362138 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.33 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 13 Jun 2020 00:59:38 -0000 Author: cem Date: Sat Jun 13 00:59:36 2020 New Revision: 362138 URL: https://svnweb.freebsd.org/changeset/base/362138 Log: net80211: Add framework for debugnet(4) support Allow net80211 drivers to register a small vtable of debugnet-related methods. This is not a functional change. Driver support is needed, similar to debugnet(4) for wired NICs. Reviewed by: adrian, markj (earlier version both) Differential Revision: https://reviews.freebsd.org/D17308 Modified: head/sys/net80211/ieee80211_freebsd.c head/sys/net80211/ieee80211_freebsd.h head/sys/net80211/ieee80211_var.h Modified: head/sys/net80211/ieee80211_freebsd.c ============================================================================== --- head/sys/net80211/ieee80211_freebsd.c Fri Jun 12 23:43:44 2020 (r362137) +++ head/sys/net80211/ieee80211_freebsd.c Sat Jun 13 00:59:36 2020 (r362138) @@ -60,6 +60,7 @@ __FBSDID("$FreeBSD$"); #include #include +DEBUGNET_DEFINE(ieee80211); SYSCTL_NODE(_net, OID_AUTO, wlan, CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "IEEE 80211 parameters"); @@ -111,7 +112,14 @@ wlan_clone_create(struct if_clone *ifc, int unit, cadd cp.icp_flags & IEEE80211_CLONE_MACADDR ? cp.icp_macaddr : ic->ic_macaddr); - return (vap == NULL ? EIO : 0); + if (vap == NULL) + return (EIO); + +#ifdef DEBUGNET + if (ic->ic_debugnet_meth != NULL) + DEBUGNET_SET(vap->iv_ifp, ieee80211); +#endif + return (0); } static void @@ -1046,6 +1054,54 @@ ieee80211_get_vap_ifname(struct ieee80211vap *vap) return "(none)"; return vap->iv_ifp->if_xname; } + +#ifdef DEBUGNET +static void +ieee80211_debugnet_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_debugnet_meth->dn8_init(ic, nrxr, ncl, clsize); + IEEE80211_UNLOCK(ic); +} + +static void +ieee80211_debugnet_event(struct ifnet *ifp, enum debugnet_ev ev) +{ + struct ieee80211vap *vap; + struct ieee80211com *ic; + + vap = if_getsoftc(ifp); + ic = vap->iv_ic; + + IEEE80211_LOCK(ic); + ic->ic_debugnet_meth->dn8_event(ic, ev); + IEEE80211_UNLOCK(ic); +} + +static int +ieee80211_debugnet_transmit(struct ifnet *ifp, struct mbuf *m) +{ + return (ieee80211_vap_transmit(ifp, m)); +} + +static int +ieee80211_debugnet_poll(struct ifnet *ifp, int count) +{ + struct ieee80211vap *vap; + struct ieee80211com *ic; + + vap = if_getsoftc(ifp); + ic = vap->iv_ic; + + return (ic->ic_debugnet_meth->dn8_poll(ic, count)); +} +#endif /* * Module glue. Modified: head/sys/net80211/ieee80211_freebsd.h ============================================================================== --- head/sys/net80211/ieee80211_freebsd.h Fri Jun 12 23:43:44 2020 (r362137) +++ head/sys/net80211/ieee80211_freebsd.h Sat Jun 13 00:59:36 2020 (r362138) @@ -40,6 +40,10 @@ #include #include +#ifdef DEBUGNET +#include +#endif + /* * Common state locking definitions. */ @@ -492,6 +496,36 @@ typedef int ieee80211_ioctl_setfunc(struct ieee80211va struct ieee80211req *); SET_DECLARE(ieee80211_ioctl_setset, ieee80211_ioctl_setfunc); #define IEEE80211_IOCTL_SET(_name, _set) TEXT_SET(ieee80211_ioctl_setset, _set) + +#ifdef DEBUGNET +typedef void debugnet80211_init_t(struct ieee80211com *, int *nrxr, int *ncl, + int *clsize); +typedef void debugnet80211_event_t(struct ieee80211com *, enum debugnet_ev); +typedef int debugnet80211_poll_t(struct ieee80211com *, int); + +struct debugnet80211_methods { + debugnet80211_init_t *dn8_init; + debugnet80211_event_t *dn8_event; + debugnet80211_poll_t *dn8_poll; +}; + +#define DEBUGNET80211_DEFINE(driver) \ + static debugnet80211_init_t driver##_debugnet80211_init; \ + static debugnet80211_event_t driver##_debugnet80211_event; \ + static debugnet80211_poll_t driver##_debugnet80211_poll; \ + \ + static struct debugnet80211_methods driver##_debugnet80211_methods = { \ + .dn8_init = driver##_debugnet80211_init, \ + .dn8_event = driver##_debugnet80211_event, \ + .dn8_poll = driver##_debugnet80211_poll, \ + } +#define DEBUGNET80211_SET(ic, driver) \ + (ic)->ic_debugnet_meth = &driver##_debugnet80211_methods +#else +#define DEBUGNET80211_DEFINE(driver) +#define DEBUGNET80211_SET(ic, driver) +#endif /* DEBUGNET */ + #endif /* _KERNEL */ /* XXX this stuff belongs elsewhere */ Modified: head/sys/net80211/ieee80211_var.h ============================================================================== --- head/sys/net80211/ieee80211_var.h Fri Jun 12 23:43:44 2020 (r362137) +++ head/sys/net80211/ieee80211_var.h Sat Jun 13 00:59:36 2020 (r362138) @@ -132,6 +132,8 @@ struct ieee80211_rx_ampdu; struct ieee80211_superg; struct ieee80211_frame; +struct net80211dump_methods; + struct ieee80211com { void *ic_softc; /* driver softc */ const char *ic_name; /* usually device name */ @@ -370,6 +372,7 @@ struct ieee80211com { /* The channel width has changed (20<->2040) */ void (*ic_update_chw)(struct ieee80211com *); + const struct debugnet80211_methods *ic_debugnet_meth; uint64_t ic_spare[7]; };