@@ -2047,7 +2047,17 @@ static void nl80211_parse_rateinfo(struct nlattr **ri,
20472047 else if (ri [NL80211_RATE_INFO_BITRATE ])
20482048 re -> rate = nla_get_u16 (ri [NL80211_RATE_INFO_BITRATE ]) * 100 ;
20492049
2050- if (ri [NL80211_RATE_INFO_HE_MCS ])
2050+ if (ri [NL80211_RATE_INFO_EHT_MCS ])
2051+ {
2052+ re -> is_eht = 1 ;
2053+ re -> mcs = nla_get_u8 (ri [NL80211_RATE_INFO_EHT_MCS ]);
2054+
2055+ if (ri [NL80211_RATE_INFO_EHT_NSS ])
2056+ re -> nss = nla_get_u8 (ri [NL80211_RATE_INFO_EHT_NSS ]);
2057+ if (ri [NL80211_RATE_INFO_EHT_GI ])
2058+ re -> eht_gi = nla_get_u8 (ri [NL80211_RATE_INFO_EHT_GI ]);
2059+ }
2060+ else if (ri [NL80211_RATE_INFO_HE_MCS ])
20512061 {
20522062 re -> is_he = 1 ;
20532063 re -> mcs = nla_get_u8 (ri [NL80211_RATE_INFO_HE_MCS ]);
@@ -2084,6 +2094,8 @@ static void nl80211_parse_rateinfo(struct nlattr **ri,
20842094 else if (ri [NL80211_RATE_INFO_80P80_MHZ_WIDTH ] ||
20852095 ri [NL80211_RATE_INFO_160_MHZ_WIDTH ])
20862096 re -> mhz = 160 ;
2097+ else if (ri [NL80211_RATE_INFO_320_MHZ_WIDTH ])
2098+ re -> mhz_hi = 320 / 256 , re -> mhz = 320 % 256 ;
20872099 else
20882100 re -> mhz = 20 ;
20892101
@@ -3155,6 +3167,7 @@ struct nl80211_modes
31553167 uint16_t nl_ht ;
31563168 uint32_t nl_vht ;
31573169 uint16_t he_phy_cap [6 ];
3170+ uint16_t eht_phy_cap [9 ];
31583171};
31593172
31603173static void nl80211_eval_modelist (struct nl80211_modes * m )
@@ -3183,6 +3196,22 @@ static void nl80211_eval_modelist(struct nl80211_modes *m)
31833196 m -> ht |= IWINFO_HTMODE_HE160 | IWINFO_HTMODE_HE80_80 ;
31843197 }
31853198
3199+ if (m -> eht_phy_cap [0 ] != 0 ) {
3200+ m -> hw |= IWINFO_80211_BE ;
3201+ m -> ht |= IWINFO_HTMODE_EHT20 ;
3202+
3203+ if (m -> he_phy_cap [0 ] & BIT (9 ))
3204+ m -> ht |= IWINFO_HTMODE_EHT40 ;
3205+ if (m -> he_phy_cap [0 ] & BIT (10 ))
3206+ m -> ht |= IWINFO_HTMODE_EHT40 | IWINFO_HTMODE_EHT80 ;
3207+ if (m -> he_phy_cap [0 ] & BIT (11 ))
3208+ m -> ht |= IWINFO_HTMODE_EHT160 ;
3209+ if (m -> he_phy_cap [0 ] & BIT (12 ))
3210+ m -> ht |= IWINFO_HTMODE_EHT160 | IWINFO_HTMODE_EHT80_80 ;
3211+ if ((m -> eht_phy_cap [0 ] & BIT (9 )) && (m -> bands & IWINFO_BAND_6 ))
3212+ m -> ht |= IWINFO_HTMODE_EHT320 ;
3213+ }
3214+
31863215 if (m -> bands & IWINFO_BAND_24 )
31873216 {
31883217 m -> hw |= IWINFO_80211_B ;
@@ -3252,6 +3281,8 @@ static int nl80211_get_modelist_cb(struct nl_msg *msg, void *arg)
32523281 nla_for_each_nested (nl_iftype , bands [NL80211_BAND_ATTR_IFTYPE_DATA ], rem_band ) {
32533282 nla_parse (tb , NL80211_BAND_IFTYPE_ATTR_MAX ,
32543283 nla_data (nl_iftype ), nla_len (nl_iftype ), NULL );
3284+
3285+ // HE
32553286 if (tb [NL80211_BAND_IFTYPE_ATTR_HE_CAP_PHY ]) {
32563287 len = nla_len (tb [NL80211_BAND_IFTYPE_ATTR_HE_CAP_PHY ]);
32573288
@@ -3261,6 +3292,17 @@ static int nl80211_get_modelist_cb(struct nl_msg *msg, void *arg)
32613292 nla_data (tb [NL80211_BAND_IFTYPE_ATTR_HE_CAP_PHY ]),
32623293 len );
32633294 }
3295+
3296+ // EHT
3297+ if (tb [NL80211_BAND_IFTYPE_ATTR_EHT_CAP_PHY ]) {
3298+ len = nla_len (tb [NL80211_BAND_IFTYPE_ATTR_EHT_CAP_PHY ]);
3299+
3300+ if (len > sizeof (m -> eht_phy_cap ) - 1 )
3301+ len = sizeof (m -> eht_phy_cap ) - 1 ;
3302+ memcpy (& ((uint8_t * )m -> eht_phy_cap )[1 ],
3303+ nla_data (tb [NL80211_BAND_IFTYPE_ATTR_EHT_CAP_PHY ]),
3304+ len );
3305+ }
32643306 }
32653307 }
32663308 }
@@ -3325,6 +3367,7 @@ static int nl80211_get_htmode(const char *ifname, int *buf)
33253367 char * res , b [2 ] = { 0 };
33263368 int err ;
33273369 bool he = false;
3370+ bool eht = false;
33283371
33293372 res = nl80211_phy2ifname (ifname );
33303373 * buf = 0 ;
@@ -3335,6 +3378,9 @@ static int nl80211_get_htmode(const char *ifname, int *buf)
33353378 if (err )
33363379 return -1 ;
33373380
3381+ if (nl80211_hostapd_query (res ? res : ifname , "ieee80211be" , b , sizeof (b )))
3382+ eht = b [0 ] == '1' ;
3383+
33383384 if (nl80211_hostapd_query (res ? res : ifname , "ieee80211ax" , b , sizeof (b )))
33393385 he = b [0 ] == '1' ;
33403386 else if (nl80211_wpactl_query (res ? res : ifname , "wifi_generation" , b , sizeof (b )))
@@ -3343,38 +3389,41 @@ static int nl80211_get_htmode(const char *ifname, int *buf)
33433389 switch (chn .width ) {
33443390 case NL80211_CHAN_WIDTH_20 :
33453391 if (he )
3346- * buf = IWINFO_HTMODE_HE20 ;
3392+ * buf = ( eht == true) ? IWINFO_HTMODE_EHT20 : IWINFO_HTMODE_HE20 ;
33473393 else if (chn .mode == -1 )
33483394 * buf = IWINFO_HTMODE_VHT20 ;
33493395 else
33503396 * buf = IWINFO_HTMODE_HT20 ;
33513397 break ;
33523398 case NL80211_CHAN_WIDTH_40 :
33533399 if (he )
3354- * buf = IWINFO_HTMODE_HE40 ;
3400+ * buf = ( eht == true) ? IWINFO_HTMODE_EHT40 : IWINFO_HTMODE_HE40 ;
33553401 else if (chn .mode == -1 )
33563402 * buf = IWINFO_HTMODE_VHT40 ;
33573403 else
33583404 * buf = IWINFO_HTMODE_HT40 ;
33593405 break ;
33603406 case NL80211_CHAN_WIDTH_80 :
33613407 if (he )
3362- * buf = IWINFO_HTMODE_HE80 ;
3408+ * buf = ( eht == true) ? IWINFO_HTMODE_EHT80 : IWINFO_HTMODE_HE80 ;
33633409 else
33643410 * buf = IWINFO_HTMODE_VHT80 ;
33653411 break ;
33663412 case NL80211_CHAN_WIDTH_80P80 :
33673413 if (he )
3368- * buf = IWINFO_HTMODE_HE80_80 ;
3414+ * buf = ( eht == true) ? IWINFO_HTMODE_EHT80_80 : IWINFO_HTMODE_HE80_80 ;
33693415 else
33703416 * buf = IWINFO_HTMODE_VHT80_80 ;
33713417 break ;
33723418 case NL80211_CHAN_WIDTH_160 :
33733419 if (he )
3374- * buf = IWINFO_HTMODE_HE160 ;
3420+ * buf = ( eht == true) ? IWINFO_HTMODE_EHT160 : IWINFO_HTMODE_HE160 ;
33753421 else
33763422 * buf = IWINFO_HTMODE_VHT160 ;
33773423 break ;
3424+ case NL80211_CHAN_WIDTH_320 :
3425+ * buf = IWINFO_HTMODE_EHT320 ;
3426+ break ;
33783427 case NL80211_CHAN_WIDTH_5 :
33793428 case NL80211_CHAN_WIDTH_10 :
33803429 case NL80211_CHAN_WIDTH_20_NOHT :
0 commit comments