svn commit: r311578 - head/sys/net80211

Adrian Chadd adrian at freebsd.org
Sat Jan 7 07:16:44 UTC 2017


god damnit let me go fix that. Sorry, i have to commit another file.


-a


On 6 January 2017 at 21:46, Cy Schubert <Cy.Schubert at komquats.com> wrote:
> In message <201701070159.v071xd46009060 at 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 at cschubert.com>
> FreeBSD UNIX:  <cy at FreeBSD.org>   Web:  http://www.FreeBSD.org
>
>         The need of the many outweighs the greed of the few.
>
>


More information about the svn-src-all mailing list