Date: Fri, 06 Jan 2017 21:46:18 -0800 From: Cy Schubert <Cy.Schubert@komquats.com> To: Adrian Chadd <adrian@FreeBSD.org> Cc: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: Re: svn commit: r311578 - head/sys/net80211 Message-ID: <201701070546.v075kIGD052277@slippy.cwsent.com> In-Reply-To: Message from Adrian Chadd <adrian@FreeBSD.org> of "Sat, 07 Jan 2017 01:59:39 %2B0000." <201701070159.v071xd46009060@repo.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
In message <201701070159.v071xd46009060@repo.freebsd.org>, Adrian Chadd writes: > Author: adrian > Date: Sat Jan 7 01:59:39 2017 > New Revision: 311578 > URL: https://svnweb.freebsd.org/changeset/base/311578 > > Log: > [net80211] add VHT ioctl parameters and driver capabilities > > * Add the VHT capability element to the driver capabilities so ifconfig > can see if VHT is available > * Add ioctl plumbing for enabling/disabling VHT and each of the VHT > widths. > > Note: this DOES change the ABI (the driver caps ioctl struct size, sigh) > so this will require a recompile of at least ifconfig. > > Modified: > head/sys/net80211/ieee80211_ioctl.c > head/sys/net80211/ieee80211_ioctl.h > > Modified: head/sys/net80211/ieee80211_ioctl.c > ============================================================================= > = > --- head/sys/net80211/ieee80211_ioctl.c Sat Jan 7 01:56:10 2017 > (r311577) > +++ head/sys/net80211/ieee80211_ioctl.c Sat Jan 7 01:59:39 2017 > (r311578) > @@ -710,6 +710,7 @@ ieee80211_ioctl_getdevcaps(struct ieee80 > dc->dc_drivercaps = ic->ic_caps; > dc->dc_cryptocaps = ic->ic_cryptocaps; > dc->dc_htcaps = ic->ic_htcaps; > + dc->dc_vhtcaps = ic->ic_vhtcaps; > ci = &dc->dc_chaninfo; > ic->ic_getradiocaps(ic, maxchans, &ci->ic_nchans, ci->ic_chans); > KASSERT(ci->ic_nchans <= maxchans, > @@ -1135,6 +1136,22 @@ ieee80211_ioctl_get80211(struct ieee8021 > if (vap->iv_flags_ht & IEEE80211_FHT_STBC_RX) > ireq->i_val |= 2; > break; > + > + /* VHT */ > + case IEEE80211_IOC_VHTCONF: > + ireq->i_val = 0; > + if (vap->iv_flags_vht & IEEE80211_FVHT_VHT) > + ireq->i_val |= 1; > + if (vap->iv_flags_vht & IEEE80211_FVHT_USEVHT40) > + ireq->i_val |= 2; > + if (vap->iv_flags_vht & IEEE80211_FVHT_USEVHT80) > + ireq->i_val |= 4; > + if (vap->iv_flags_vht & IEEE80211_FVHT_USEVHT80P80) > + ireq->i_val |= 8; > + if (vap->iv_flags_vht & IEEE80211_FVHT_USEVHT160) > + ireq->i_val |= 16; > + break; > + > default: > error = ieee80211_ioctl_getdefault(vap, ireq); > break; > @@ -1869,6 +1886,8 @@ findchannel(struct ieee80211com *ic, int > /* NB: handled specially below */ > [IEEE80211_MODE_11NA] = IEEE80211_CHAN_A, > [IEEE80211_MODE_11NG] = IEEE80211_CHAN_G, > + [IEEE80211_MODE_VHT_5GHZ] = IEEE80211_CHAN_A, > + [IEEE80211_MODE_VHT_2GHZ] = IEEE80211_CHAN_G, > }; > u_int modeflags; > int i; > @@ -1893,11 +1912,27 @@ findchannel(struct ieee80211com *ic, int > !find11gchannel(ic, i, c->ic_freq)) > return c; > } else { > - /* must check HT specially */ > + /* must check VHT specifically */ > + if ((mode == IEEE80211_MODE_VHT_5GHZ || > + mode == IEEE80211_MODE_VHT_2GHZ) && > + !IEEE80211_IS_CHAN_VHT(c)) > + continue; > + > + /* > + * Must check HT specially - only match on HT, > + * not HT+VHT channels > + */ > if ((mode == IEEE80211_MODE_11NA || > mode == IEEE80211_MODE_11NG) && > !IEEE80211_IS_CHAN_HT(c)) > continue; > + > + if ((mode == IEEE80211_MODE_11NA || > + mode == IEEE80211_MODE_11NG) && > + IEEE80211_IS_CHAN_VHT(c)) > + continue; > + > + /* Check that the modeflags above match */ > if ((c->ic_flags & modeflags) == modeflags) > return c; > } > @@ -2021,6 +2056,7 @@ ieee80211_ioctl_setchannel(struct ieee80 > if (c == NULL) > return EINVAL; > } > + > /* > * Fine tune channel selection based on desired mode: > * if 11b is requested, find the 11b version of any > @@ -2031,6 +2067,9 @@ ieee80211_ioctl_setchannel(struct ieee80 > * 11a channel returned, > * if 11ng is requested, find the ht version of any > * 11g channel returned, > + * if 11ac is requested, find the 11ac version > + * of any 11a/11na channel returned, > + * (TBD) 11acg (2GHz VHT) > * otherwise we should be ok with what we've got. > */ > switch (vap->iv_des_mode) { > @@ -2067,6 +2106,17 @@ ieee80211_ioctl_setchannel(struct ieee80 > c = c2; > } > break; > + case IEEE80211_MODE_VHT_2GHZ: > + printf("%s: TBD\n", __func__); > + break; > + case IEEE80211_MODE_VHT_5GHZ: > + if (IEEE80211_IS_CHAN_A(c)) { > + c2 = findchannel(ic, ireq->i_val, > + IEEE80211_MODE_VHT_5GHZ); > + if (c2 != NULL) > + c = c2; > + } > + break; > default: /* NB: no static turboG */ > break; > } > @@ -2092,6 +2142,7 @@ ieee80211_ioctl_setcurchan(struct ieee80 > error = copyin(ireq->i_data, &chan, sizeof(chan)); > if (error != 0) > return error; > + > /* XXX 0xffff overflows 16-bit signed */ > if (chan.ic_freq == 0 || chan.ic_freq == IEEE80211_CHAN_ANY) { > c = IEEE80211_CHAN_ANYC; > @@ -3321,6 +3372,37 @@ ieee80211_ioctl_set80211(struct ieee8021 > if (isvapht(vap)) > error = ERESTART; > break; > + > + /* VHT */ > + case IEEE80211_IOC_VHTCONF: > + if (ireq->i_val & 1) > + ieee80211_syncflag_vht(vap, IEEE80211_FVHT_VHT); > + else > + ieee80211_syncflag_vht(vap, -IEEE80211_FVHT_VHT); > + > + if (ireq->i_val & 2) > + ieee80211_syncflag_vht(vap, IEEE80211_FVHT_USEVHT40); > + else > + ieee80211_syncflag_vht(vap, -IEEE80211_FVHT_USEVHT40); > + > + if (ireq->i_val & 4) > + ieee80211_syncflag_vht(vap, IEEE80211_FVHT_USEVHT80); > + else > + ieee80211_syncflag_vht(vap, -IEEE80211_FVHT_USEVHT80); > + > + if (ireq->i_val & 8) > + ieee80211_syncflag_vht(vap, IEEE80211_FVHT_USEVHT80P80) > ; > + else > + ieee80211_syncflag_vht(vap, -IEEE80211_FVHT_USEVHT80P80 > ); > + > + if (ireq->i_val & 16) > + ieee80211_syncflag_vht(vap, IEEE80211_FVHT_USEVHT160); > + else > + ieee80211_syncflag_vht(vap, -IEEE80211_FVHT_USEVHT160); Buildkernel is broken. Should these calls be to ieee80211_syncflag_ht instead or is there a missing new function? > + > + error = ENETRESET; > + break; > + > default: > error = ieee80211_ioctl_setdefault(vap, ireq); > break; > > Modified: head/sys/net80211/ieee80211_ioctl.h > ============================================================================= > = > --- head/sys/net80211/ieee80211_ioctl.h Sat Jan 7 01:56:10 2017 > (r311577) > +++ head/sys/net80211/ieee80211_ioctl.h Sat Jan 7 01:59:39 2017 > (r311578) > @@ -556,6 +556,7 @@ struct ieee80211_devcaps_req { > uint32_t dc_drivercaps; /* general driver caps */ > uint32_t dc_cryptocaps; /* hardware crypto support */ > uint32_t dc_htcaps; /* HT/802.11n support */ > + uint32_t dc_vhtcaps; /* VHT/802.11ac capabilities */ > struct ieee80211req_chaninfo dc_chaninfo; > }; > #define IEEE80211_DEVCAPS_SIZE(_nchan) \ > @@ -704,6 +705,9 @@ struct ieee80211req { > #define IEEE80211_IOC_STBC 113 /* STBC Tx/RX (on, off) > */ > #define IEEE80211_IOC_LDPC 114 /* LDPC Tx/RX (on, off) > */ > > +/* VHT */ > +#define IEEE80211_IOC_VHTCONF 130 /* VHT config (off, on; > widths) */ > + > #define IEEE80211_IOC_MESH_ID 170 /* mesh identifier */ > #define IEEE80211_IOC_MESH_AP 171 /* accepting peerings * > / > #define IEEE80211_IOC_MESH_FWRD 172 /* forward frames */ > > -- Cheers, Cy Schubert <Cy.Schubert@cschubert.com> FreeBSD UNIX: <cy@FreeBSD.org> Web: http://www.FreeBSD.org The need of the many outweighs the greed of the few.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201701070546.v075kIGD052277>