mac80211: use BIT_ULL for NL80211_STA_INFO_* attribute types
authorOmer Efrat <omer.efrat@tandemg.com>
Sun, 17 Jun 2018 10:06:25 +0000 (13:06 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 29 Jun 2018 07:53:09 +0000 (09:53 +0200)
The BIT macro uses unsigned long which some architectures handle as 32 bit
and therefore might cause macro's shift to overflow when used on a value
equals or larger than 32 (NL80211_STA_INFO_RX_DURATION and afterwards).

Since 'filled' member in station_info changed to u64, BIT_ULL macro
should be used with all NL80211_STA_INFO_* attribute types instead of BIT
to prevent future possible bugs when one will use BIT macro for higher
attributes by mistake.

This commit cleans up all usages of BIT macro with the above field
in mac80211 by changing it to BIT_ULL instead.

Signed-off-by: Omer Efrat <omer.efrat@tandemg.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/ethtool.c
net/mac80211/sta_info.c

index 690c142a7a440b0b31b27fb436942162692e9787..5ac743816b59eb416f2153887e3608c72ca89b68 100644 (file)
@@ -116,16 +116,16 @@ static void ieee80211_get_stats(struct net_device *dev,
                data[i++] = sta->sta_state;
 
 
-               if (sinfo.filled & BIT(NL80211_STA_INFO_TX_BITRATE))
+               if (sinfo.filled & BIT_ULL(NL80211_STA_INFO_TX_BITRATE))
                        data[i] = 100000ULL *
                                cfg80211_calculate_bitrate(&sinfo.txrate);
                i++;
-               if (sinfo.filled & BIT(NL80211_STA_INFO_RX_BITRATE))
+               if (sinfo.filled & BIT_ULL(NL80211_STA_INFO_RX_BITRATE))
                        data[i] = 100000ULL *
                                cfg80211_calculate_bitrate(&sinfo.rxrate);
                i++;
 
-               if (sinfo.filled & BIT(NL80211_STA_INFO_SIGNAL_AVG))
+               if (sinfo.filled & BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG))
                        data[i] = (u8)sinfo.signal_avg;
                i++;
        } else {
index aa8fe771a8db0b5823e2055f7b962f6319163e1e..f34202242d24d074f5cca49c7b4b7a101114f73b 100644 (file)
@@ -2114,38 +2114,38 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo,
 
        drv_sta_statistics(local, sdata, &sta->sta, sinfo);
 
-       sinfo->filled |= BIT(NL80211_STA_INFO_INACTIVE_TIME) |
-                        BIT(NL80211_STA_INFO_STA_FLAGS) |
-                        BIT(NL80211_STA_INFO_BSS_PARAM) |
-                        BIT(NL80211_STA_INFO_CONNECTED_TIME) |
-                        BIT(NL80211_STA_INFO_RX_DROP_MISC);
+       sinfo->filled |= BIT_ULL(NL80211_STA_INFO_INACTIVE_TIME) |
+                        BIT_ULL(NL80211_STA_INFO_STA_FLAGS) |
+                        BIT_ULL(NL80211_STA_INFO_BSS_PARAM) |
+                        BIT_ULL(NL80211_STA_INFO_CONNECTED_TIME) |
+                        BIT_ULL(NL80211_STA_INFO_RX_DROP_MISC);
 
        if (sdata->vif.type == NL80211_IFTYPE_STATION) {
                sinfo->beacon_loss_count = sdata->u.mgd.beacon_loss_count;
-               sinfo->filled |= BIT(NL80211_STA_INFO_BEACON_LOSS);
+               sinfo->filled |= BIT_ULL(NL80211_STA_INFO_BEACON_LOSS);
        }
 
        sinfo->connected_time = ktime_get_seconds() - sta->last_connected;
        sinfo->inactive_time =
                jiffies_to_msecs(jiffies - ieee80211_sta_last_active(sta));
 
-       if (!(sinfo->filled & (BIT(NL80211_STA_INFO_TX_BYTES64) |
-                              BIT(NL80211_STA_INFO_TX_BYTES)))) {
+       if (!(sinfo->filled & (BIT_ULL(NL80211_STA_INFO_TX_BYTES64) |
+                              BIT_ULL(NL80211_STA_INFO_TX_BYTES)))) {
                sinfo->tx_bytes = 0;
                for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
                        sinfo->tx_bytes += sta->tx_stats.bytes[ac];
-               sinfo->filled |= BIT(NL80211_STA_INFO_TX_BYTES64);
+               sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BYTES64);
        }
 
-       if (!(sinfo->filled & BIT(NL80211_STA_INFO_TX_PACKETS))) {
+       if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_PACKETS))) {
                sinfo->tx_packets = 0;
                for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
                        sinfo->tx_packets += sta->tx_stats.packets[ac];
-               sinfo->filled |= BIT(NL80211_STA_INFO_TX_PACKETS);
+               sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_PACKETS);
        }
 
-       if (!(sinfo->filled & (BIT(NL80211_STA_INFO_RX_BYTES64) |
-                              BIT(NL80211_STA_INFO_RX_BYTES)))) {
+       if (!(sinfo->filled & (BIT_ULL(NL80211_STA_INFO_RX_BYTES64) |
+                              BIT_ULL(NL80211_STA_INFO_RX_BYTES)))) {
                sinfo->rx_bytes += sta_get_stats_bytes(&sta->rx_stats);
 
                if (sta->pcpu_rx_stats) {
@@ -2157,10 +2157,10 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo,
                        }
                }
 
-               sinfo->filled |= BIT(NL80211_STA_INFO_RX_BYTES64);
+               sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BYTES64);
        }
 
-       if (!(sinfo->filled & BIT(NL80211_STA_INFO_RX_PACKETS))) {
+       if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_PACKETS))) {
                sinfo->rx_packets = sta->rx_stats.packets;
                if (sta->pcpu_rx_stats) {
                        for_each_possible_cpu(cpu) {
@@ -2170,17 +2170,17 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo,
                                sinfo->rx_packets += cpurxs->packets;
                        }
                }
-               sinfo->filled |= BIT(NL80211_STA_INFO_RX_PACKETS);
+               sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_PACKETS);
        }
 
-       if (!(sinfo->filled & BIT(NL80211_STA_INFO_TX_RETRIES))) {
+       if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_RETRIES))) {
                sinfo->tx_retries = sta->status_stats.retry_count;
-               sinfo->filled |= BIT(NL80211_STA_INFO_TX_RETRIES);
+               sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES);
        }
 
-       if (!(sinfo->filled & BIT(NL80211_STA_INFO_TX_FAILED))) {
+       if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_FAILED))) {
                sinfo->tx_failed = sta->status_stats.retry_failed;
-               sinfo->filled |= BIT(NL80211_STA_INFO_TX_FAILED);
+               sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED);
        }
 
        sinfo->rx_dropped_misc = sta->rx_stats.dropped;
@@ -2195,23 +2195,23 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo,
 
        if (sdata->vif.type == NL80211_IFTYPE_STATION &&
            !(sdata->vif.driver_flags & IEEE80211_VIF_BEACON_FILTER)) {
-               sinfo->filled |= BIT(NL80211_STA_INFO_BEACON_RX) |
-                                BIT(NL80211_STA_INFO_BEACON_SIGNAL_AVG);
+               sinfo->filled |= BIT_ULL(NL80211_STA_INFO_BEACON_RX) |
+                                BIT_ULL(NL80211_STA_INFO_BEACON_SIGNAL_AVG);
                sinfo->rx_beacon_signal_avg = ieee80211_ave_rssi(&sdata->vif);
        }
 
        if (ieee80211_hw_check(&sta->local->hw, SIGNAL_DBM) ||
            ieee80211_hw_check(&sta->local->hw, SIGNAL_UNSPEC)) {
-               if (!(sinfo->filled & BIT(NL80211_STA_INFO_SIGNAL))) {
+               if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_SIGNAL))) {
                        sinfo->signal = (s8)last_rxstats->last_signal;
-                       sinfo->filled |= BIT(NL80211_STA_INFO_SIGNAL);
+                       sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
                }
 
                if (!sta->pcpu_rx_stats &&
-                   !(sinfo->filled & BIT(NL80211_STA_INFO_SIGNAL_AVG))) {
+                   !(sinfo->filled & BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG))) {
                        sinfo->signal_avg =
                                -ewma_signal_read(&sta->rx_stats_avg.signal);
-                       sinfo->filled |= BIT(NL80211_STA_INFO_SIGNAL_AVG);
+                       sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG);
                }
        }
 
@@ -2220,11 +2220,11 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo,
         * pcpu statistics
         */
        if (last_rxstats->chains &&
-           !(sinfo->filled & (BIT(NL80211_STA_INFO_CHAIN_SIGNAL) |
-                              BIT(NL80211_STA_INFO_CHAIN_SIGNAL_AVG)))) {
-               sinfo->filled |= BIT(NL80211_STA_INFO_CHAIN_SIGNAL);
+           !(sinfo->filled & (BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL) |
+                              BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG)))) {
+               sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL);
                if (!sta->pcpu_rx_stats)
-                       sinfo->filled |= BIT(NL80211_STA_INFO_CHAIN_SIGNAL_AVG);
+                       sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG);
 
                sinfo->chains = last_rxstats->chains;
 
@@ -2236,15 +2236,15 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo,
                }
        }
 
-       if (!(sinfo->filled & BIT(NL80211_STA_INFO_TX_BITRATE))) {
+       if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_BITRATE))) {
                sta_set_rate_info_tx(sta, &sta->tx_stats.last_rate,
                                     &sinfo->txrate);
-               sinfo->filled |= BIT(NL80211_STA_INFO_TX_BITRATE);
+               sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
        }
 
-       if (!(sinfo->filled & BIT(NL80211_STA_INFO_RX_BITRATE))) {
+       if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_BITRATE))) {
                if (sta_set_rate_info_rx(sta, &sinfo->rxrate) == 0)
-                       sinfo->filled |= BIT(NL80211_STA_INFO_RX_BITRATE);
+                       sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BITRATE);
        }
 
        if (tidstats && !cfg80211_sinfo_alloc_tid_stats(sinfo, GFP_KERNEL)) {
@@ -2257,18 +2257,18 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo,
 
        if (ieee80211_vif_is_mesh(&sdata->vif)) {
 #ifdef CONFIG_MAC80211_MESH
-               sinfo->filled |= BIT(NL80211_STA_INFO_LLID) |
-                                BIT(NL80211_STA_INFO_PLID) |
-                                BIT(NL80211_STA_INFO_PLINK_STATE) |
-                                BIT(NL80211_STA_INFO_LOCAL_PM) |
-                                BIT(NL80211_STA_INFO_PEER_PM) |
-                                BIT(NL80211_STA_INFO_NONPEER_PM);
+               sinfo->filled |= BIT_ULL(NL80211_STA_INFO_LLID) |
+                                BIT_ULL(NL80211_STA_INFO_PLID) |
+                                BIT_ULL(NL80211_STA_INFO_PLINK_STATE) |
+                                BIT_ULL(NL80211_STA_INFO_LOCAL_PM) |
+                                BIT_ULL(NL80211_STA_INFO_PEER_PM) |
+                                BIT_ULL(NL80211_STA_INFO_NONPEER_PM);
 
                sinfo->llid = sta->mesh->llid;
                sinfo->plid = sta->mesh->plid;
                sinfo->plink_state = sta->mesh->plink_state;
                if (test_sta_flag(sta, WLAN_STA_TOFFSET_KNOWN)) {
-                       sinfo->filled |= BIT(NL80211_STA_INFO_T_OFFSET);
+                       sinfo->filled |= BIT_ULL(NL80211_STA_INFO_T_OFFSET);
                        sinfo->t_offset = sta->mesh->t_offset;
                }
                sinfo->local_pm = sta->mesh->local_pm;
@@ -2313,7 +2313,7 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo,
        thr = sta_get_expected_throughput(sta);
 
        if (thr != 0) {
-               sinfo->filled |= BIT(NL80211_STA_INFO_EXPECTED_THROUGHPUT);
+               sinfo->filled |= BIT_ULL(NL80211_STA_INFO_EXPECTED_THROUGHPUT);
                sinfo->expected_throughput = thr;
        }