source: branches/backfire/package/mac80211/patches/540-mac80211_add_rx_rate.patch @ 25693

Last change on this file since 25693 was 25693, checked in by nbd, 5 years ago

mac80211: backport latest version from trunk

File size: 8.0 KB
  • include/net/cfg80211.h

    a b struct station_parameters { 
    414414 * @STATION_INFO_PLID: @plid filled 
    415415 * @STATION_INFO_PLINK_STATE: @plink_state filled 
    416416 * @STATION_INFO_SIGNAL: @signal filled 
    417  * @STATION_INFO_TX_BITRATE: @tx_bitrate fields are filled 
     417 * @STATION_INFO_TX_BITRATE: @txrate fields are filled 
    418418 *  (tx_bitrate, tx_bitrate_flags and tx_bitrate_mcs) 
    419419 * @STATION_INFO_RX_PACKETS: @rx_packets filled 
    420420 * @STATION_INFO_TX_PACKETS: @tx_packets filled 
    struct station_parameters { 
    422422 * @STATION_INFO_TX_FAILED: @tx_failed filled 
    423423 * @STATION_INFO_RX_DROP_MISC: @rx_dropped_misc filled 
    424424 * @STATION_INFO_SIGNAL_AVG: @signal_avg filled 
     425 * @STATION_INFO_RX_BITRATE: @rxrate fields are filled 
    425426 */ 
    426427enum station_info_flags { 
    427428        STATION_INFO_INACTIVE_TIME      = 1<<0, 
    enum station_info_flags { 
    438439        STATION_INFO_TX_FAILED          = 1<<11, 
    439440        STATION_INFO_RX_DROP_MISC       = 1<<12, 
    440441        STATION_INFO_SIGNAL_AVG         = 1<<13, 
     442        STATION_INFO_RX_BITRATE         = 1<<14, 
    441443}; 
    442444 
    443445/** 
    struct station_info { 
    507509        s8 signal; 
    508510        s8 signal_avg; 
    509511        struct rate_info txrate; 
     512        struct rate_info rxrate; 
    510513        u32 rx_packets; 
    511514        u32 tx_packets; 
    512515        u32 tx_retries; 
  • include/linux/nl80211.h

    a b enum nl80211_rate_info { 
    12431243 * @NL80211_STA_INFO_LLID: the station's mesh LLID 
    12441244 * @NL80211_STA_INFO_PLID: the station's mesh PLID 
    12451245 * @NL80211_STA_INFO_PLINK_STATE: peer link state for the station 
     1246 * @NL80211_STA_INFO_RX_BITRATE: last unicast rx rate, nested attribute 
     1247 *      containing info as possible, see &enum nl80211_sta_info_txrate. 
    12461248 * @__NL80211_STA_INFO_AFTER_LAST: internal 
    12471249 * @NL80211_STA_INFO_MAX: highest possible station info attribute 
    12481250 */ 
    enum nl80211_sta_info { 
    12611263        NL80211_STA_INFO_TX_RETRIES, 
    12621264        NL80211_STA_INFO_TX_FAILED, 
    12631265        NL80211_STA_INFO_SIGNAL_AVG, 
     1266        NL80211_STA_INFO_RX_BITRATE, 
    12641267 
    12651268        /* keep last */ 
    12661269        __NL80211_STA_INFO_AFTER_LAST, 
  • net/wireless/nl80211.c

    a b static int parse_station_flags(struct ge 
    19681968        return 0; 
    19691969} 
    19701970 
     1971static bool nl80211_put_sta_rate(struct sk_buff *msg, struct rate_info *info, 
     1972                                 int attr) 
     1973{ 
     1974        struct nlattr *rate; 
     1975        u16 bitrate; 
     1976 
     1977        rate = nla_nest_start(msg, attr); 
     1978        if (!rate) 
     1979                goto nla_put_failure; 
     1980 
     1981        /* cfg80211_calculate_bitrate will return 0 for mcs >= 32 */ 
     1982        bitrate = cfg80211_calculate_bitrate(info); 
     1983        if (bitrate > 0) 
     1984                NLA_PUT_U16(msg, NL80211_RATE_INFO_BITRATE, bitrate); 
     1985 
     1986        if (info->flags & RATE_INFO_FLAGS_MCS) 
     1987                NLA_PUT_U8(msg, NL80211_RATE_INFO_MCS, info->mcs); 
     1988        if (info->flags & RATE_INFO_FLAGS_40_MHZ_WIDTH) 
     1989                NLA_PUT_FLAG(msg, NL80211_RATE_INFO_40_MHZ_WIDTH); 
     1990        if (info->flags & RATE_INFO_FLAGS_SHORT_GI) 
     1991                NLA_PUT_FLAG(msg, NL80211_RATE_INFO_SHORT_GI); 
     1992 
     1993        nla_nest_end(msg, rate); 
     1994        return true; 
     1995 
     1996nla_put_failure: 
     1997        return false; 
     1998} 
     1999 
    19712000static int nl80211_send_station(struct sk_buff *msg, u32 pid, u32 seq, 
    19722001                                int flags, struct net_device *dev, 
    19732002                                const u8 *mac_addr, struct station_info *sinfo) 
    19742003{ 
    19752004        void *hdr; 
    1976         struct nlattr *sinfoattr, *txrate; 
    1977         u16 bitrate; 
     2005        struct nlattr *sinfoattr; 
    19782006 
    19792007        hdr = nl80211hdr_put(msg, pid, seq, flags, NL80211_CMD_NEW_STATION); 
    19802008        if (!hdr) 
    static int nl80211_send_station(struct s 
    20132041                NLA_PUT_U8(msg, NL80211_STA_INFO_SIGNAL_AVG, 
    20142042                           sinfo->signal_avg); 
    20152043        if (sinfo->filled & STATION_INFO_TX_BITRATE) { 
    2016                 txrate = nla_nest_start(msg, NL80211_STA_INFO_TX_BITRATE); 
    2017                 if (!txrate) 
     2044                if (!nl80211_put_sta_rate(msg, &sinfo->txrate, 
     2045                                          NL80211_STA_INFO_TX_BITRATE)) 
     2046                        goto nla_put_failure; 
     2047        } 
     2048        if (sinfo->filled & STATION_INFO_RX_BITRATE) { 
     2049                if (!nl80211_put_sta_rate(msg, &sinfo->rxrate, 
     2050                                          NL80211_STA_INFO_RX_BITRATE)) 
    20182051                        goto nla_put_failure; 
    2019  
    2020                 /* cfg80211_calculate_bitrate will return 0 for mcs >= 32 */ 
    2021                 bitrate = cfg80211_calculate_bitrate(&sinfo->txrate); 
    2022                 if (bitrate > 0) 
    2023                         NLA_PUT_U16(msg, NL80211_RATE_INFO_BITRATE, bitrate); 
    2024  
    2025                 if (sinfo->txrate.flags & RATE_INFO_FLAGS_MCS) 
    2026                         NLA_PUT_U8(msg, NL80211_RATE_INFO_MCS, 
    2027                                     sinfo->txrate.mcs); 
    2028                 if (sinfo->txrate.flags & RATE_INFO_FLAGS_40_MHZ_WIDTH) 
    2029                         NLA_PUT_FLAG(msg, NL80211_RATE_INFO_40_MHZ_WIDTH); 
    2030                 if (sinfo->txrate.flags & RATE_INFO_FLAGS_SHORT_GI) 
    2031                         NLA_PUT_FLAG(msg, NL80211_RATE_INFO_SHORT_GI); 
    2032  
    2033                 nla_nest_end(msg, txrate); 
    20342052        } 
    20352053        if (sinfo->filled & STATION_INFO_RX_PACKETS) 
    20362054                NLA_PUT_U32(msg, NL80211_STA_INFO_RX_PACKETS, 
  • net/mac80211/sta_info.h

    a b enum plink_state { 
    209209 * @rate_ctrl_priv: rate control private per-STA pointer 
    210210 * @last_tx_rate: rate used for last transmit, to report to userspace as 
    211211 *      "the" transmit rate 
     212 * @last_rx_rate_idx: rx status rate index of the last data packet 
     213 * @last_rx_rate_flag: rx status flag of the last data packet 
    212214 * @lock: used for locking all fields that require locking, see comments 
    213215 *      in the header file. 
    214216 * @flaglock: spinlock for flags accesses 
    struct sta_info { 
    311313        unsigned long tx_bytes; 
    312314        unsigned long tx_fragments; 
    313315        struct ieee80211_tx_rate last_tx_rate; 
     316        int last_rx_rate_idx; 
     317        int last_rx_rate_flag; 
    314318        u16 tid_seq[IEEE80211_QOS_CTL_TID_MASK + 1]; 
    315319 
    316320        /* 
  • net/mac80211/rx.c

    a b ieee80211_rx_h_sta_process(struct ieee80 
    11661166        if (rx->sdata->vif.type == NL80211_IFTYPE_ADHOC) { 
    11671167                u8 *bssid = ieee80211_get_bssid(hdr, rx->skb->len, 
    11681168                                                NL80211_IFTYPE_ADHOC); 
    1169                 if (compare_ether_addr(bssid, rx->sdata->u.ibss.bssid) == 0) 
     1169                if (compare_ether_addr(bssid, rx->sdata->u.ibss.bssid) == 0) { 
    11701170                        sta->last_rx = jiffies; 
     1171                        if (ieee80211_is_data(hdr->frame_control)) { 
     1172                                sta->last_rx_rate_idx = status->rate_idx; 
     1173                                sta->last_rx_rate_flag = status->flag; 
     1174                        } 
     1175                } 
    11711176        } else if (!is_multicast_ether_addr(hdr->addr1)) { 
    11721177                /* 
    11731178                 * Mesh beacons will update last_rx when if they are found to 
    11741179                 * match the current local configuration when processed. 
    11751180                 */ 
    11761181                sta->last_rx = jiffies; 
     1182                if (ieee80211_is_data(hdr->frame_control)) { 
     1183                        sta->last_rx_rate_idx = status->rate_idx; 
     1184                        sta->last_rx_rate_flag = status->flag; 
     1185                } 
    11771186        } 
    11781187 
    11791188        if (!(status->rx_flags & IEEE80211_RX_RA_MATCH)) 
  • net/mac80211/cfg.c

    a b static int ieee80211_config_default_mgmt 
    316316        return 0; 
    317317} 
    318318 
     319static void rate_idx_to_bitrate(struct rate_info *rate, struct sta_info *sta, int idx) 
     320{ 
     321        if (!(rate->flags & RATE_INFO_FLAGS_MCS)) { 
     322                struct ieee80211_supported_band *sband; 
     323                sband = sta->local->hw.wiphy->bands[ 
     324                                sta->local->hw.conf.channel->band]; 
     325                rate->legacy = sband->bitrates[idx].bitrate; 
     326        } else 
     327                rate->mcs = idx; 
     328} 
     329 
    319330static void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo) 
    320331{ 
    321332        struct ieee80211_sub_if_data *sdata = sta->sdata; 
    static void sta_set_sinfo(struct sta_inf 
    330341                        STATION_INFO_TX_RETRIES | 
    331342                        STATION_INFO_TX_FAILED | 
    332343                        STATION_INFO_TX_BITRATE | 
     344                        STATION_INFO_RX_BITRATE | 
    333345                        STATION_INFO_RX_DROP_MISC; 
    334346 
    335347        sinfo->inactive_time = jiffies_to_msecs(jiffies - sta->last_rx); 
    static void sta_set_sinfo(struct sta_inf 
    355367                sinfo->txrate.flags |= RATE_INFO_FLAGS_40_MHZ_WIDTH; 
    356368        if (sta->last_tx_rate.flags & IEEE80211_TX_RC_SHORT_GI) 
    357369                sinfo->txrate.flags |= RATE_INFO_FLAGS_SHORT_GI; 
     370        rate_idx_to_bitrate(&sinfo->txrate, sta, sta->last_tx_rate.idx); 
    358371 
    359         if (!(sta->last_tx_rate.flags & IEEE80211_TX_RC_MCS)) { 
    360                 struct ieee80211_supported_band *sband; 
    361                 sband = sta->local->hw.wiphy->bands[ 
    362                                 sta->local->hw.conf.channel->band]; 
    363                 sinfo->txrate.legacy = 
    364                         sband->bitrates[sta->last_tx_rate.idx].bitrate; 
    365         } else 
    366                 sinfo->txrate.mcs = sta->last_tx_rate.idx; 
     372        sinfo->rxrate.flags = 0; 
     373        if (sta->last_rx_rate_flag & RX_FLAG_HT) 
     374                sinfo->rxrate.flags |= RATE_INFO_FLAGS_MCS; 
     375        if (sta->last_rx_rate_flag & RX_FLAG_40MHZ) 
     376                sinfo->rxrate.flags |= RATE_INFO_FLAGS_40_MHZ_WIDTH; 
     377        if (sta->last_rx_rate_flag & RX_FLAG_SHORT_GI) 
     378                sinfo->rxrate.flags |= RATE_INFO_FLAGS_SHORT_GI; 
     379        rate_idx_to_bitrate(&sinfo->rxrate, sta, sta->last_rx_rate_idx); 
    367380 
    368381        if (ieee80211_vif_is_mesh(&sdata->vif)) { 
    369382#ifdef CONFIG_MAC80211_MESH 
Note: See TracBrowser for help on using the repository browser.