In message <201701070159.v071xd46009...@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.schub...@cschubert.com>
FreeBSD UNIX:  <c...@freebsd.org>   Web:  http://www.FreeBSD.org

        The need of the many outweighs the greed of the few.


_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to