LCOV - code coverage report
Current view: top level - net/mac80211 - iface.c (source / functions) Hit Total Coverage
Test: combined.info Lines: 6 1067 0.6 %
Date: 2022-03-28 16:04:14 Functions: 2 42 4.8 %
Branches: 2 693 0.3 %

           Branch data     Line data    Source code
       1                 :            : // SPDX-License-Identifier: GPL-2.0-only
       2                 :            : /*
       3                 :            :  * Interface handling
       4                 :            :  *
       5                 :            :  * Copyright 2002-2005, Instant802 Networks, Inc.
       6                 :            :  * Copyright 2005-2006, Devicescape Software, Inc.
       7                 :            :  * Copyright (c) 2006 Jiri Benc <jbenc@suse.cz>
       8                 :            :  * Copyright 2008, Johannes Berg <johannes@sipsolutions.net>
       9                 :            :  * Copyright 2013-2014  Intel Mobile Communications GmbH
      10                 :            :  * Copyright (c) 2016        Intel Deutschland GmbH
      11                 :            :  * Copyright (C) 2018 Intel Corporation
      12                 :            :  */
      13                 :            : #include <linux/slab.h>
      14                 :            : #include <linux/kernel.h>
      15                 :            : #include <linux/if_arp.h>
      16                 :            : #include <linux/netdevice.h>
      17                 :            : #include <linux/rtnetlink.h>
      18                 :            : #include <net/mac80211.h>
      19                 :            : #include <net/ieee80211_radiotap.h>
      20                 :            : #include "ieee80211_i.h"
      21                 :            : #include "sta_info.h"
      22                 :            : #include "debugfs_netdev.h"
      23                 :            : #include "mesh.h"
      24                 :            : #include "led.h"
      25                 :            : #include "driver-ops.h"
      26                 :            : #include "wme.h"
      27                 :            : #include "rate.h"
      28                 :            : 
      29                 :            : /**
      30                 :            :  * DOC: Interface list locking
      31                 :            :  *
      32                 :            :  * The interface list in each struct ieee80211_local is protected
      33                 :            :  * three-fold:
      34                 :            :  *
      35                 :            :  * (1) modifications may only be done under the RTNL
      36                 :            :  * (2) modifications and readers are protected against each other by
      37                 :            :  *     the iflist_mtx.
      38                 :            :  * (3) modifications are done in an RCU manner so atomic readers
      39                 :            :  *     can traverse the list in RCU-safe blocks.
      40                 :            :  *
      41                 :            :  * As a consequence, reads (traversals) of the list can be protected
      42                 :            :  * by either the RTNL, the iflist_mtx or RCU.
      43                 :            :  */
      44                 :            : 
      45                 :            : static void ieee80211_iface_work(struct work_struct *work);
      46                 :            : 
      47                 :          0 : bool __ieee80211_recalc_txpower(struct ieee80211_sub_if_data *sdata)
      48                 :            : {
      49                 :          0 :         struct ieee80211_chanctx_conf *chanctx_conf;
      50                 :          0 :         int power;
      51                 :            : 
      52                 :          0 :         rcu_read_lock();
      53         [ #  # ]:          0 :         chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
      54         [ #  # ]:          0 :         if (!chanctx_conf) {
      55                 :          0 :                 rcu_read_unlock();
      56                 :          0 :                 return false;
      57                 :            :         }
      58                 :            : 
      59      [ #  #  # ]:          0 :         power = ieee80211_chandef_max_power(&chanctx_conf->def);
      60                 :          0 :         rcu_read_unlock();
      61                 :            : 
      62         [ #  # ]:          0 :         if (sdata->user_power_level != IEEE80211_UNSET_POWER_LEVEL)
      63                 :          0 :                 power = min(power, sdata->user_power_level);
      64                 :            : 
      65         [ #  # ]:          0 :         if (sdata->ap_power_level != IEEE80211_UNSET_POWER_LEVEL)
      66                 :          0 :                 power = min(power, sdata->ap_power_level);
      67                 :            : 
      68         [ #  # ]:          0 :         if (power != sdata->vif.bss_conf.txpower) {
      69                 :          0 :                 sdata->vif.bss_conf.txpower = power;
      70                 :          0 :                 ieee80211_hw_config(sdata->local, 0);
      71                 :          0 :                 return true;
      72                 :            :         }
      73                 :            : 
      74                 :            :         return false;
      75                 :            : }
      76                 :            : 
      77                 :          0 : void ieee80211_recalc_txpower(struct ieee80211_sub_if_data *sdata,
      78                 :            :                               bool update_bss)
      79                 :            : {
      80   [ #  #  #  # ]:          0 :         if (__ieee80211_recalc_txpower(sdata) ||
      81         [ #  # ]:          0 :             (update_bss && ieee80211_sdata_running(sdata)))
      82                 :          0 :                 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_TXPOWER);
      83                 :          0 : }
      84                 :            : 
      85                 :          0 : static u32 __ieee80211_idle_off(struct ieee80211_local *local)
      86                 :            : {
      87                 :          0 :         if (!(local->hw.conf.flags & IEEE80211_CONF_IDLE))
      88                 :            :                 return 0;
      89                 :            : 
      90                 :          0 :         local->hw.conf.flags &= ~IEEE80211_CONF_IDLE;
      91                 :          0 :         return IEEE80211_CONF_CHANGE_IDLE;
      92                 :            : }
      93                 :            : 
      94                 :          0 : static u32 __ieee80211_idle_on(struct ieee80211_local *local)
      95                 :            : {
      96                 :          0 :         if (local->hw.conf.flags & IEEE80211_CONF_IDLE)
      97                 :            :                 return 0;
      98                 :            : 
      99                 :          0 :         ieee80211_flush_queues(local, NULL, false);
     100                 :            : 
     101                 :          0 :         local->hw.conf.flags |= IEEE80211_CONF_IDLE;
     102                 :          0 :         return IEEE80211_CONF_CHANGE_IDLE;
     103                 :            : }
     104                 :            : 
     105                 :          0 : static u32 __ieee80211_recalc_idle(struct ieee80211_local *local,
     106                 :            :                                    bool force_active)
     107                 :            : {
     108                 :          0 :         bool working, scanning, active;
     109                 :          0 :         unsigned int led_trig_start = 0, led_trig_stop = 0;
     110                 :            : 
     111                 :          0 :         lockdep_assert_held(&local->mtx);
     112                 :            : 
     113         [ #  # ]:          0 :         active = force_active ||
     114   [ #  #  #  # ]:          0 :                  !list_empty(&local->chanctx_list) ||
     115         [ #  # ]:          0 :                  local->monitors;
     116                 :            : 
     117   [ #  #  #  # ]:          0 :         working = !local->ops->remain_on_channel &&
     118         [ #  # ]:          0 :                   !list_empty(&local->roc_list);
     119                 :            : 
     120   [ #  #  #  # ]:          0 :         scanning = test_bit(SCAN_SW_SCANNING, &local->scanning) ||
     121                 :            :                    test_bit(SCAN_ONCHANNEL_SCANNING, &local->scanning);
     122                 :            : 
     123         [ #  # ]:          0 :         if (working || scanning)
     124                 :            :                 led_trig_start |= IEEE80211_TPT_LEDTRIG_FL_WORK;
     125                 :            :         else
     126                 :          0 :                 led_trig_stop |= IEEE80211_TPT_LEDTRIG_FL_WORK;
     127                 :            : 
     128         [ #  # ]:          0 :         if (active)
     129                 :          0 :                 led_trig_start |= IEEE80211_TPT_LEDTRIG_FL_CONNECTED;
     130                 :            :         else
     131                 :          0 :                 led_trig_stop |= IEEE80211_TPT_LEDTRIG_FL_CONNECTED;
     132                 :            : 
     133                 :          0 :         ieee80211_mod_tpt_led_trig(local, led_trig_start, led_trig_stop);
     134                 :            : 
     135         [ #  # ]:          0 :         if (working || scanning || active)
     136         [ #  # ]:          0 :                 return __ieee80211_idle_off(local);
     137         [ #  # ]:          0 :         return __ieee80211_idle_on(local);
     138                 :            : }
     139                 :            : 
     140                 :          0 : u32 ieee80211_idle_off(struct ieee80211_local *local)
     141                 :            : {
     142                 :          0 :         return __ieee80211_recalc_idle(local, true);
     143                 :            : }
     144                 :            : 
     145                 :          0 : void ieee80211_recalc_idle(struct ieee80211_local *local)
     146                 :            : {
     147                 :          0 :         u32 change = __ieee80211_recalc_idle(local, false);
     148         [ #  # ]:          0 :         if (change)
     149                 :          0 :                 ieee80211_hw_config(local, change);
     150                 :          0 : }
     151                 :            : 
     152                 :          0 : static int ieee80211_verify_mac(struct ieee80211_sub_if_data *sdata, u8 *addr,
     153                 :            :                                 bool check_dup)
     154                 :            : {
     155                 :          0 :         struct ieee80211_local *local = sdata->local;
     156                 :          0 :         struct ieee80211_sub_if_data *iter;
     157                 :          0 :         u64 new, mask, tmp;
     158                 :          0 :         u8 *m;
     159                 :          0 :         int ret = 0;
     160                 :            : 
     161         [ #  # ]:          0 :         if (is_zero_ether_addr(local->hw.wiphy->addr_mask))
     162                 :            :                 return 0;
     163                 :            : 
     164                 :          0 :         m = addr;
     165                 :          0 :         new =   ((u64)m[0] << 5*8) | ((u64)m[1] << 4*8) |
     166                 :          0 :                 ((u64)m[2] << 3*8) | ((u64)m[3] << 2*8) |
     167                 :          0 :                 ((u64)m[4] << 1*8) | ((u64)m[5] << 0*8);
     168                 :            : 
     169                 :          0 :         m = local->hw.wiphy->addr_mask;
     170                 :          0 :         mask =  ((u64)m[0] << 5*8) | ((u64)m[1] << 4*8) |
     171                 :          0 :                 ((u64)m[2] << 3*8) | ((u64)m[3] << 2*8) |
     172                 :          0 :                 ((u64)m[4] << 1*8) | ((u64)m[5] << 0*8);
     173                 :            : 
     174         [ #  # ]:          0 :         if (!check_dup)
     175                 :            :                 return ret;
     176                 :            : 
     177                 :          0 :         mutex_lock(&local->iflist_mtx);
     178         [ #  # ]:          0 :         list_for_each_entry(iter, &local->interfaces, list) {
     179         [ #  # ]:          0 :                 if (iter == sdata)
     180                 :          0 :                         continue;
     181                 :            : 
     182         [ #  # ]:          0 :                 if (iter->vif.type == NL80211_IFTYPE_MONITOR &&
     183         [ #  # ]:          0 :                     !(iter->u.mntr.flags & MONITOR_FLAG_ACTIVE))
     184                 :          0 :                         continue;
     185                 :            : 
     186                 :          0 :                 m = iter->vif.addr;
     187                 :          0 :                 tmp =   ((u64)m[0] << 5*8) | ((u64)m[1] << 4*8) |
     188                 :          0 :                         ((u64)m[2] << 3*8) | ((u64)m[3] << 2*8) |
     189                 :          0 :                         ((u64)m[4] << 1*8) | ((u64)m[5] << 0*8);
     190                 :            : 
     191         [ #  # ]:          0 :                 if ((new & ~mask) != (tmp & ~mask)) {
     192                 :            :                         ret = -EINVAL;
     193                 :            :                         break;
     194                 :            :                 }
     195                 :            :         }
     196                 :          0 :         mutex_unlock(&local->iflist_mtx);
     197                 :            : 
     198                 :          0 :         return ret;
     199                 :            : }
     200                 :            : 
     201                 :          0 : static int ieee80211_change_mac(struct net_device *dev, void *addr)
     202                 :            : {
     203                 :          0 :         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
     204                 :          0 :         struct sockaddr *sa = addr;
     205                 :          0 :         bool check_dup = true;
     206                 :          0 :         int ret;
     207                 :            : 
     208         [ #  # ]:          0 :         if (ieee80211_sdata_running(sdata))
     209                 :            :                 return -EBUSY;
     210                 :            : 
     211         [ #  # ]:          0 :         if (sdata->vif.type == NL80211_IFTYPE_MONITOR &&
     212         [ #  # ]:          0 :             !(sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE))
     213                 :          0 :                 check_dup = false;
     214                 :            : 
     215                 :          0 :         ret = ieee80211_verify_mac(sdata, sa->sa_data, check_dup);
     216         [ #  # ]:          0 :         if (ret)
     217                 :            :                 return ret;
     218                 :            : 
     219                 :          0 :         ret = eth_mac_addr(dev, sa);
     220                 :            : 
     221         [ #  # ]:          0 :         if (ret == 0)
     222                 :          0 :                 memcpy(sdata->vif.addr, sa->sa_data, ETH_ALEN);
     223                 :            : 
     224                 :            :         return ret;
     225                 :            : }
     226                 :            : 
     227                 :          0 : static inline int identical_mac_addr_allowed(int type1, int type2)
     228                 :            : {
     229                 :          0 :         return type1 == NL80211_IFTYPE_MONITOR ||
     230                 :          0 :                 type2 == NL80211_IFTYPE_MONITOR ||
     231                 :          0 :                 type1 == NL80211_IFTYPE_P2P_DEVICE ||
     232         [ #  # ]:          0 :                 type2 == NL80211_IFTYPE_P2P_DEVICE ||
     233   [ #  #  #  # ]:          0 :                 (type1 == NL80211_IFTYPE_AP && type2 == NL80211_IFTYPE_WDS) ||
     234                 :          0 :                 (type1 == NL80211_IFTYPE_WDS &&
     235                 :          0 :                         (type2 == NL80211_IFTYPE_WDS ||
     236         [ #  # ]:          0 :                          type2 == NL80211_IFTYPE_AP)) ||
     237   [ #  #  #  #  :          0 :                 (type1 == NL80211_IFTYPE_AP && type2 == NL80211_IFTYPE_AP_VLAN) ||
                   #  # ]
     238                 :          0 :                 (type1 == NL80211_IFTYPE_AP_VLAN &&
     239         [ #  # ]:          0 :                         (type2 == NL80211_IFTYPE_AP ||
     240                 :            :                          type2 == NL80211_IFTYPE_AP_VLAN));
     241                 :            : }
     242                 :            : 
     243                 :          0 : static int ieee80211_check_concurrent_iface(struct ieee80211_sub_if_data *sdata,
     244                 :            :                                             enum nl80211_iftype iftype)
     245                 :            : {
     246                 :          0 :         struct ieee80211_local *local = sdata->local;
     247                 :          0 :         struct ieee80211_sub_if_data *nsdata;
     248                 :          0 :         int ret;
     249                 :            : 
     250   [ #  #  #  # ]:          0 :         ASSERT_RTNL();
     251                 :            : 
     252                 :            :         /* we hold the RTNL here so can safely walk the list */
     253         [ #  # ]:          0 :         list_for_each_entry(nsdata, &local->interfaces, list) {
     254   [ #  #  #  # ]:          0 :                 if (nsdata != sdata && ieee80211_sdata_running(nsdata)) {
     255                 :            :                         /*
     256                 :            :                          * Only OCB and monitor mode may coexist
     257                 :            :                          */
     258         [ #  # ]:          0 :                         if ((sdata->vif.type == NL80211_IFTYPE_OCB &&
     259   [ #  #  #  # ]:          0 :                              nsdata->vif.type != NL80211_IFTYPE_MONITOR) ||
     260                 :          0 :                             (sdata->vif.type != NL80211_IFTYPE_MONITOR &&
     261         [ #  # ]:          0 :                              nsdata->vif.type == NL80211_IFTYPE_OCB))
     262                 :            :                                 return -EBUSY;
     263                 :            : 
     264                 :            :                         /*
     265                 :            :                          * Allow only a single IBSS interface to be up at any
     266                 :            :                          * time. This is restricted because beacon distribution
     267                 :            :                          * cannot work properly if both are in the same IBSS.
     268                 :            :                          *
     269                 :            :                          * To remove this restriction we'd have to disallow them
     270                 :            :                          * from setting the same SSID on different IBSS interfaces
     271                 :            :                          * belonging to the same hardware. Then, however, we're
     272                 :            :                          * faced with having to adopt two different TSF timers...
     273                 :            :                          */
     274         [ #  # ]:          0 :                         if (iftype == NL80211_IFTYPE_ADHOC &&
     275         [ #  # ]:          0 :                             nsdata->vif.type == NL80211_IFTYPE_ADHOC)
     276                 :            :                                 return -EBUSY;
     277                 :            :                         /*
     278                 :            :                          * will not add another interface while any channel
     279                 :            :                          * switch is active.
     280                 :            :                          */
     281         [ #  # ]:          0 :                         if (nsdata->vif.csa_active)
     282                 :            :                                 return -EBUSY;
     283                 :            : 
     284                 :            :                         /*
     285                 :            :                          * The remaining checks are only performed for interfaces
     286                 :            :                          * with the same MAC address.
     287                 :            :                          */
     288         [ #  # ]:          0 :                         if (!ether_addr_equal(sdata->vif.addr,
     289                 :            :                                               nsdata->vif.addr))
     290                 :          0 :                                 continue;
     291                 :            : 
     292                 :            :                         /*
     293                 :            :                          * check whether it may have the same address
     294                 :            :                          */
     295                 :          0 :                         if (!identical_mac_addr_allowed(iftype,
     296         [ #  # ]:          0 :                                                         nsdata->vif.type))
     297                 :            :                                 return -ENOTUNIQ;
     298                 :            : 
     299                 :            :                         /*
     300                 :            :                          * can only add VLANs to enabled APs
     301                 :            :                          */
     302   [ #  #  #  # ]:          0 :                         if (iftype == NL80211_IFTYPE_AP_VLAN &&
     303                 :            :                             nsdata->vif.type == NL80211_IFTYPE_AP)
     304                 :          0 :                                 sdata->bss = &nsdata->u.ap;
     305                 :            :                 }
     306                 :            :         }
     307                 :            : 
     308                 :          0 :         mutex_lock(&local->chanctx_mtx);
     309                 :          0 :         ret = ieee80211_check_combinations(sdata, NULL, 0, 0);
     310                 :          0 :         mutex_unlock(&local->chanctx_mtx);
     311                 :          0 :         return ret;
     312                 :            : }
     313                 :            : 
     314                 :          0 : static int ieee80211_check_queues(struct ieee80211_sub_if_data *sdata,
     315                 :            :                                   enum nl80211_iftype iftype)
     316                 :            : {
     317                 :          0 :         int n_queues = sdata->local->hw.queues;
     318                 :          0 :         int i;
     319                 :            : 
     320         [ #  # ]:          0 :         if (iftype == NL80211_IFTYPE_NAN)
     321                 :            :                 return 0;
     322                 :            : 
     323         [ #  # ]:          0 :         if (iftype != NL80211_IFTYPE_P2P_DEVICE) {
     324         [ #  # ]:          0 :                 for (i = 0; i < IEEE80211_NUM_ACS; i++) {
     325   [ #  #  #  # ]:          0 :                         if (WARN_ON_ONCE(sdata->vif.hw_queue[i] ==
     326                 :            :                                          IEEE80211_INVAL_HW_QUEUE))
     327                 :            :                                 return -EINVAL;
     328   [ #  #  #  # ]:          0 :                         if (WARN_ON_ONCE(sdata->vif.hw_queue[i] >=
     329                 :            :                                          n_queues))
     330                 :            :                                 return -EINVAL;
     331                 :            :                 }
     332                 :            :         }
     333                 :            : 
     334                 :          0 :         if ((iftype != NL80211_IFTYPE_AP &&
     335   [ #  #  #  # ]:          0 :              iftype != NL80211_IFTYPE_P2P_GO &&
     336         [ #  # ]:          0 :              iftype != NL80211_IFTYPE_MESH_POINT) ||
     337                 :            :             !ieee80211_hw_check(&sdata->local->hw, QUEUE_CONTROL)) {
     338                 :          0 :                 sdata->vif.cab_queue = IEEE80211_INVAL_HW_QUEUE;
     339                 :          0 :                 return 0;
     340                 :            :         }
     341                 :            : 
     342   [ #  #  #  # ]:          0 :         if (WARN_ON_ONCE(sdata->vif.cab_queue == IEEE80211_INVAL_HW_QUEUE))
     343                 :            :                 return -EINVAL;
     344                 :            : 
     345   [ #  #  #  # ]:          0 :         if (WARN_ON_ONCE(sdata->vif.cab_queue >= n_queues))
     346                 :          0 :                 return -EINVAL;
     347                 :            : 
     348                 :            :         return 0;
     349                 :            : }
     350                 :            : 
     351                 :          0 : void ieee80211_adjust_monitor_flags(struct ieee80211_sub_if_data *sdata,
     352                 :            :                                     const int offset)
     353                 :            : {
     354                 :          0 :         struct ieee80211_local *local = sdata->local;
     355                 :          0 :         u32 flags = sdata->u.mntr.flags;
     356                 :            : 
     357                 :            : #define ADJUST(_f, _s)  do {                                    \
     358                 :            :         if (flags & MONITOR_FLAG_##_f)                              \
     359                 :            :                 local->fif_##_s += offset;                   \
     360                 :            :         } while (0)
     361                 :            : 
     362         [ #  # ]:          0 :         ADJUST(FCSFAIL, fcsfail);
     363         [ #  # ]:          0 :         ADJUST(PLCPFAIL, plcpfail);
     364         [ #  # ]:          0 :         ADJUST(CONTROL, control);
     365         [ #  # ]:          0 :         ADJUST(CONTROL, pspoll);
     366         [ #  # ]:          0 :         ADJUST(OTHER_BSS, other_bss);
     367                 :            : 
     368                 :            : #undef ADJUST
     369                 :          0 : }
     370                 :            : 
     371                 :          0 : static void ieee80211_set_default_queues(struct ieee80211_sub_if_data *sdata)
     372                 :            : {
     373                 :          0 :         struct ieee80211_local *local = sdata->local;
     374                 :          0 :         int i;
     375                 :            : 
     376         [ #  # ]:          0 :         for (i = 0; i < IEEE80211_NUM_ACS; i++) {
     377         [ #  # ]:          0 :                 if (ieee80211_hw_check(&local->hw, QUEUE_CONTROL))
     378                 :          0 :                         sdata->vif.hw_queue[i] = IEEE80211_INVAL_HW_QUEUE;
     379         [ #  # ]:          0 :                 else if (local->hw.queues >= IEEE80211_NUM_ACS)
     380                 :          0 :                         sdata->vif.hw_queue[i] = i;
     381                 :            :                 else
     382                 :          0 :                         sdata->vif.hw_queue[i] = 0;
     383                 :            :         }
     384                 :          0 :         sdata->vif.cab_queue = IEEE80211_INVAL_HW_QUEUE;
     385                 :          0 : }
     386                 :            : 
     387                 :          0 : int ieee80211_add_virtual_monitor(struct ieee80211_local *local)
     388                 :            : {
     389                 :          0 :         struct ieee80211_sub_if_data *sdata;
     390                 :          0 :         int ret;
     391                 :            : 
     392         [ #  # ]:          0 :         if (!ieee80211_hw_check(&local->hw, WANT_MONITOR_VIF))
     393                 :            :                 return 0;
     394                 :            : 
     395   [ #  #  #  # ]:          0 :         ASSERT_RTNL();
     396                 :            : 
     397         [ #  # ]:          0 :         if (local->monitor_sdata)
     398                 :            :                 return 0;
     399                 :            : 
     400                 :          0 :         sdata = kzalloc(sizeof(*sdata) + local->hw.vif_data_size, GFP_KERNEL);
     401         [ #  # ]:          0 :         if (!sdata)
     402                 :            :                 return -ENOMEM;
     403                 :            : 
     404                 :            :         /* set up data */
     405                 :          0 :         sdata->local = local;
     406                 :          0 :         sdata->vif.type = NL80211_IFTYPE_MONITOR;
     407                 :          0 :         snprintf(sdata->name, IFNAMSIZ, "%s-monitor",
     408         [ #  # ]:          0 :                  wiphy_name(local->hw.wiphy));
     409                 :          0 :         sdata->wdev.iftype = NL80211_IFTYPE_MONITOR;
     410                 :            : 
     411                 :          0 :         sdata->encrypt_headroom = IEEE80211_ENCRYPT_HEADROOM;
     412                 :            : 
     413                 :          0 :         ieee80211_set_default_queues(sdata);
     414                 :            : 
     415                 :          0 :         ret = drv_add_interface(local, sdata);
     416   [ #  #  #  # ]:          0 :         if (WARN_ON(ret)) {
     417                 :            :                 /* ok .. stupid driver, it asked for this! */
     418                 :          0 :                 kfree(sdata);
     419                 :          0 :                 return ret;
     420                 :            :         }
     421                 :            : 
     422                 :          0 :         ret = ieee80211_check_queues(sdata, NL80211_IFTYPE_MONITOR);
     423         [ #  # ]:          0 :         if (ret) {
     424                 :          0 :                 kfree(sdata);
     425                 :          0 :                 return ret;
     426                 :            :         }
     427                 :            : 
     428                 :          0 :         mutex_lock(&local->iflist_mtx);
     429                 :          0 :         rcu_assign_pointer(local->monitor_sdata, sdata);
     430                 :          0 :         mutex_unlock(&local->iflist_mtx);
     431                 :            : 
     432                 :          0 :         mutex_lock(&local->mtx);
     433                 :          0 :         ret = ieee80211_vif_use_channel(sdata, &local->monitor_chandef,
     434                 :            :                                         IEEE80211_CHANCTX_EXCLUSIVE);
     435                 :          0 :         mutex_unlock(&local->mtx);
     436         [ #  # ]:          0 :         if (ret) {
     437                 :          0 :                 mutex_lock(&local->iflist_mtx);
     438                 :          0 :                 RCU_INIT_POINTER(local->monitor_sdata, NULL);
     439                 :          0 :                 mutex_unlock(&local->iflist_mtx);
     440                 :          0 :                 synchronize_net();
     441                 :          0 :                 drv_remove_interface(local, sdata);
     442                 :          0 :                 kfree(sdata);
     443                 :          0 :                 return ret;
     444                 :            :         }
     445                 :            : 
     446                 :          0 :         skb_queue_head_init(&sdata->skb_queue);
     447                 :          0 :         INIT_WORK(&sdata->work, ieee80211_iface_work);
     448                 :            : 
     449                 :          0 :         return 0;
     450                 :            : }
     451                 :            : 
     452                 :          0 : void ieee80211_del_virtual_monitor(struct ieee80211_local *local)
     453                 :            : {
     454                 :          0 :         struct ieee80211_sub_if_data *sdata;
     455                 :            : 
     456         [ #  # ]:          0 :         if (!ieee80211_hw_check(&local->hw, WANT_MONITOR_VIF))
     457                 :            :                 return;
     458                 :            : 
     459   [ #  #  #  # ]:          0 :         ASSERT_RTNL();
     460                 :            : 
     461                 :          0 :         mutex_lock(&local->iflist_mtx);
     462                 :            : 
     463                 :          0 :         sdata = rcu_dereference_protected(local->monitor_sdata,
     464                 :            :                                           lockdep_is_held(&local->iflist_mtx));
     465         [ #  # ]:          0 :         if (!sdata) {
     466                 :          0 :                 mutex_unlock(&local->iflist_mtx);
     467                 :          0 :                 return;
     468                 :            :         }
     469                 :            : 
     470                 :          0 :         RCU_INIT_POINTER(local->monitor_sdata, NULL);
     471                 :          0 :         mutex_unlock(&local->iflist_mtx);
     472                 :            : 
     473                 :          0 :         synchronize_net();
     474                 :            : 
     475                 :          0 :         mutex_lock(&local->mtx);
     476                 :          0 :         ieee80211_vif_release_channel(sdata);
     477                 :          0 :         mutex_unlock(&local->mtx);
     478                 :            : 
     479                 :          0 :         drv_remove_interface(local, sdata);
     480                 :            : 
     481                 :          0 :         kfree(sdata);
     482                 :            : }
     483                 :            : 
     484                 :            : /*
     485                 :            :  * NOTE: Be very careful when changing this function, it must NOT return
     486                 :            :  * an error on interface type changes that have been pre-checked, so most
     487                 :            :  * checks should be in ieee80211_check_concurrent_iface.
     488                 :            :  */
     489                 :          0 : int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up)
     490                 :            : {
     491   [ #  #  #  #  :          0 :         struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
                      # ]
     492                 :          0 :         struct net_device *dev = wdev->netdev;
     493                 :          0 :         struct ieee80211_local *local = sdata->local;
     494                 :          0 :         struct sta_info *sta;
     495                 :          0 :         u32 changed = 0;
     496                 :          0 :         int res;
     497                 :          0 :         u32 hw_reconf_flags = 0;
     498                 :            : 
     499   [ #  #  #  #  :          0 :         switch (sdata->vif.type) {
                      # ]
     500                 :          0 :         case NL80211_IFTYPE_WDS:
     501   [ #  #  #  # ]:          0 :                 if (!is_valid_ether_addr(sdata->u.wds.remote_addr))
     502                 :            :                         return -ENOLINK;
     503                 :            :                 break;
     504                 :          0 :         case NL80211_IFTYPE_AP_VLAN: {
     505                 :          0 :                 struct ieee80211_sub_if_data *master;
     506                 :            : 
     507         [ #  # ]:          0 :                 if (!sdata->bss)
     508                 :            :                         return -ENOLINK;
     509                 :            : 
     510                 :          0 :                 mutex_lock(&local->mtx);
     511                 :          0 :                 list_add(&sdata->u.vlan.list, &sdata->bss->vlans);
     512                 :          0 :                 mutex_unlock(&local->mtx);
     513                 :            : 
     514                 :          0 :                 master = container_of(sdata->bss,
     515                 :            :                                       struct ieee80211_sub_if_data, u.ap);
     516                 :          0 :                 sdata->control_port_protocol =
     517                 :          0 :                         master->control_port_protocol;
     518                 :          0 :                 sdata->control_port_no_encrypt =
     519                 :          0 :                         master->control_port_no_encrypt;
     520                 :          0 :                 sdata->control_port_over_nl80211 =
     521                 :          0 :                         master->control_port_over_nl80211;
     522                 :          0 :                 sdata->vif.cab_queue = master->vif.cab_queue;
     523                 :          0 :                 memcpy(sdata->vif.hw_queue, master->vif.hw_queue,
     524                 :            :                        sizeof(sdata->vif.hw_queue));
     525                 :          0 :                 sdata->vif.bss_conf.chandef = master->vif.bss_conf.chandef;
     526                 :            : 
     527                 :          0 :                 mutex_lock(&local->key_mtx);
     528                 :          0 :                 sdata->crypto_tx_tailroom_needed_cnt +=
     529                 :          0 :                         master->crypto_tx_tailroom_needed_cnt;
     530                 :          0 :                 mutex_unlock(&local->key_mtx);
     531                 :            : 
     532                 :          0 :                 break;
     533                 :            :                 }
     534                 :          0 :         case NL80211_IFTYPE_AP:
     535                 :          0 :                 sdata->bss = &sdata->u.ap;
     536                 :          0 :                 break;
     537                 :            :         case NL80211_IFTYPE_MESH_POINT:
     538                 :            :         case NL80211_IFTYPE_STATION:
     539                 :            :         case NL80211_IFTYPE_MONITOR:
     540                 :            :         case NL80211_IFTYPE_ADHOC:
     541                 :            :         case NL80211_IFTYPE_P2P_DEVICE:
     542                 :            :         case NL80211_IFTYPE_OCB:
     543                 :            :         case NL80211_IFTYPE_NAN:
     544                 :            :                 /* no special treatment */
     545                 :            :                 break;
     546                 :            :         case NL80211_IFTYPE_UNSPECIFIED:
     547                 :            :         case NUM_NL80211_IFTYPES:
     548                 :            :         case NL80211_IFTYPE_P2P_CLIENT:
     549                 :            :         case NL80211_IFTYPE_P2P_GO:
     550                 :            :                 /* cannot happen */
     551                 :          0 :                 WARN_ON(1);
     552                 :          0 :                 break;
     553                 :            :         }
     554                 :            : 
     555         [ #  # ]:          0 :         if (local->open_count == 0) {
     556                 :          0 :                 res = drv_start(local);
     557         [ #  # ]:          0 :                 if (res)
     558                 :          0 :                         goto err_del_bss;
     559                 :            :                 /* we're brought up, everything changes */
     560                 :          0 :                 hw_reconf_flags = ~0;
     561                 :          0 :                 ieee80211_led_radio(local, true);
     562                 :          0 :                 ieee80211_mod_tpt_led_trig(local,
     563                 :            :                                            IEEE80211_TPT_LEDTRIG_FL_RADIO, 0);
     564                 :            :         }
     565                 :            : 
     566                 :            :         /*
     567                 :            :          * Copy the hopefully now-present MAC address to
     568                 :            :          * this interface, if it has the special null one.
     569                 :            :          */
     570   [ #  #  #  # ]:          0 :         if (dev && is_zero_ether_addr(dev->dev_addr)) {
     571                 :          0 :                 memcpy(dev->dev_addr,
     572                 :          0 :                        local->hw.wiphy->perm_addr,
     573                 :            :                        ETH_ALEN);
     574                 :          0 :                 memcpy(dev->perm_addr, dev->dev_addr, ETH_ALEN);
     575                 :            : 
     576   [ #  #  #  # ]:          0 :                 if (!is_valid_ether_addr(dev->dev_addr)) {
     577                 :          0 :                         res = -EADDRNOTAVAIL;
     578                 :          0 :                         goto err_stop;
     579                 :            :                 }
     580                 :            :         }
     581                 :            : 
     582      [ #  #  # ]:          0 :         switch (sdata->vif.type) {
     583                 :          0 :         case NL80211_IFTYPE_AP_VLAN:
     584                 :            :                 /* no need to tell driver, but set carrier and chanctx */
     585         [ #  # ]:          0 :                 if (rtnl_dereference(sdata->bss->beacon)) {
     586                 :          0 :                         ieee80211_vif_vlan_copy_chanctx(sdata);
     587                 :          0 :                         netif_carrier_on(dev);
     588                 :            :                 } else {
     589                 :          0 :                         netif_carrier_off(dev);
     590                 :            :                 }
     591                 :            :                 break;
     592                 :          0 :         case NL80211_IFTYPE_MONITOR:
     593         [ #  # ]:          0 :                 if (sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES) {
     594                 :          0 :                         local->cooked_mntrs++;
     595                 :          0 :                         break;
     596                 :            :                 }
     597                 :            : 
     598         [ #  # ]:          0 :                 if (sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE) {
     599                 :          0 :                         res = drv_add_interface(local, sdata);
     600         [ #  # ]:          0 :                         if (res)
     601                 :          0 :                                 goto err_stop;
     602   [ #  #  #  # ]:          0 :                 } else if (local->monitors == 0 && local->open_count == 0) {
     603                 :          0 :                         res = ieee80211_add_virtual_monitor(local);
     604         [ #  # ]:          0 :                         if (res)
     605                 :          0 :                                 goto err_stop;
     606                 :            :                 }
     607                 :            : 
     608                 :            :                 /* must be before the call to ieee80211_configure_filter */
     609                 :          0 :                 local->monitors++;
     610         [ #  # ]:          0 :                 if (local->monitors == 1) {
     611                 :          0 :                         local->hw.conf.flags |= IEEE80211_CONF_MONITOR;
     612                 :          0 :                         hw_reconf_flags |= IEEE80211_CONF_CHANGE_MONITOR;
     613                 :            :                 }
     614                 :            : 
     615                 :          0 :                 ieee80211_adjust_monitor_flags(sdata, 1);
     616                 :          0 :                 ieee80211_configure_filter(local);
     617                 :          0 :                 mutex_lock(&local->mtx);
     618                 :          0 :                 ieee80211_recalc_idle(local);
     619                 :          0 :                 mutex_unlock(&local->mtx);
     620                 :            : 
     621                 :          0 :                 netif_carrier_on(dev);
     622                 :          0 :                 break;
     623                 :          0 :         default:
     624         [ #  # ]:          0 :                 if (coming_up) {
     625                 :          0 :                         ieee80211_del_virtual_monitor(local);
     626                 :            : 
     627                 :          0 :                         res = drv_add_interface(local, sdata);
     628         [ #  # ]:          0 :                         if (res)
     629                 :          0 :                                 goto err_stop;
     630         [ #  # ]:          0 :                         res = ieee80211_check_queues(sdata,
     631                 :            :                                 ieee80211_vif_type_p2p(&sdata->vif));
     632         [ #  # ]:          0 :                         if (res)
     633                 :          0 :                                 goto err_del_interface;
     634                 :            :                 }
     635                 :            : 
     636         [ #  # ]:          0 :                 if (sdata->vif.type == NL80211_IFTYPE_AP) {
     637                 :          0 :                         local->fif_pspoll++;
     638                 :          0 :                         local->fif_probe_req++;
     639                 :            : 
     640                 :          0 :                         ieee80211_configure_filter(local);
     641         [ #  # ]:          0 :                 } else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) {
     642                 :          0 :                         local->fif_probe_req++;
     643                 :            :                 }
     644                 :            : 
     645         [ #  # ]:          0 :                 if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE &&
     646                 :            :                     sdata->vif.type != NL80211_IFTYPE_NAN)
     647                 :          0 :                         changed |= ieee80211_reset_erp_info(sdata);
     648                 :          0 :                 ieee80211_bss_info_change_notify(sdata, changed);
     649                 :            : 
     650      [ #  #  # ]:          0 :                 switch (sdata->vif.type) {
     651                 :          0 :                 case NL80211_IFTYPE_STATION:
     652                 :            :                 case NL80211_IFTYPE_ADHOC:
     653                 :            :                 case NL80211_IFTYPE_AP:
     654                 :            :                 case NL80211_IFTYPE_MESH_POINT:
     655                 :            :                 case NL80211_IFTYPE_OCB:
     656                 :          0 :                         netif_carrier_off(dev);
     657                 :          0 :                         break;
     658                 :            :                 case NL80211_IFTYPE_WDS:
     659                 :            :                 case NL80211_IFTYPE_P2P_DEVICE:
     660                 :            :                 case NL80211_IFTYPE_NAN:
     661                 :            :                         break;
     662                 :            :                 default:
     663                 :            :                         /* not reached */
     664                 :          0 :                         WARN_ON(1);
     665                 :            :                 }
     666                 :            : 
     667                 :            :                 /*
     668                 :            :                  * Set default queue parameters so drivers don't
     669                 :            :                  * need to initialise the hardware if the hardware
     670                 :            :                  * doesn't start up with sane defaults.
     671                 :            :                  * Enable QoS for anything but station interfaces.
     672                 :            :                  */
     673                 :          0 :                 ieee80211_set_wmm_default(sdata, true,
     674                 :          0 :                         sdata->vif.type != NL80211_IFTYPE_STATION);
     675                 :            :         }
     676                 :            : 
     677                 :          0 :         set_bit(SDATA_STATE_RUNNING, &sdata->state);
     678                 :            : 
     679   [ #  #  #  # ]:          0 :         switch (sdata->vif.type) {
     680                 :          0 :         case NL80211_IFTYPE_WDS:
     681                 :            :                 /* Create STA entry for the WDS peer */
     682                 :          0 :                 sta = sta_info_alloc(sdata, sdata->u.wds.remote_addr,
     683                 :            :                                      GFP_KERNEL);
     684         [ #  # ]:          0 :                 if (!sta) {
     685                 :          0 :                         res = -ENOMEM;
     686                 :          0 :                         goto err_del_interface;
     687                 :            :                 }
     688                 :            : 
     689                 :          0 :                 sta_info_pre_move_state(sta, IEEE80211_STA_AUTH);
     690                 :          0 :                 sta_info_pre_move_state(sta, IEEE80211_STA_ASSOC);
     691                 :          0 :                 sta_info_pre_move_state(sta, IEEE80211_STA_AUTHORIZED);
     692                 :            : 
     693                 :          0 :                 res = sta_info_insert(sta);
     694         [ #  # ]:          0 :                 if (res) {
     695                 :            :                         /* STA has been freed */
     696                 :          0 :                         goto err_del_interface;
     697                 :            :                 }
     698                 :            : 
     699                 :          0 :                 rate_control_rate_init(sta);
     700                 :          0 :                 netif_carrier_on(dev);
     701                 :          0 :                 break;
     702                 :          0 :         case NL80211_IFTYPE_P2P_DEVICE:
     703                 :          0 :                 rcu_assign_pointer(local->p2p_sdata, sdata);
     704                 :            :                 break;
     705                 :          0 :         case NL80211_IFTYPE_MONITOR:
     706         [ #  # ]:          0 :                 if (sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES)
     707                 :            :                         break;
     708                 :          0 :                 list_add_tail_rcu(&sdata->u.mntr.list, &local->mon_list);
     709                 :            :                 break;
     710                 :            :         default:
     711                 :            :                 break;
     712                 :            :         }
     713                 :            : 
     714                 :            :         /*
     715                 :            :          * set_multicast_list will be invoked by the networking core
     716                 :            :          * which will check whether any increments here were done in
     717                 :            :          * error and sync them down to the hardware as filter flags.
     718                 :            :          */
     719         [ #  # ]:          0 :         if (sdata->flags & IEEE80211_SDATA_ALLMULTI)
     720                 :          0 :                 atomic_inc(&local->iff_allmultis);
     721                 :            : 
     722         [ #  # ]:          0 :         if (coming_up)
     723                 :          0 :                 local->open_count++;
     724                 :            : 
     725         [ #  # ]:          0 :         if (hw_reconf_flags)
     726                 :          0 :                 ieee80211_hw_config(local, hw_reconf_flags);
     727                 :            : 
     728                 :          0 :         ieee80211_recalc_ps(local);
     729                 :            : 
     730         [ #  # ]:          0 :         if (sdata->vif.type == NL80211_IFTYPE_MONITOR ||
     731                 :          0 :             sdata->vif.type == NL80211_IFTYPE_AP_VLAN ||
     732         [ #  # ]:          0 :             local->ops->wake_tx_queue) {
     733                 :            :                 /* XXX: for AP_VLAN, actually track AP queues */
     734         [ #  # ]:          0 :                 if (dev)
     735                 :            :                         netif_tx_start_all_queues(dev);
     736         [ #  # ]:          0 :         } else if (dev) {
     737                 :          0 :                 unsigned long flags;
     738                 :          0 :                 int n_acs = IEEE80211_NUM_ACS;
     739                 :          0 :                 int ac;
     740                 :            : 
     741         [ #  # ]:          0 :                 if (local->hw.queues < IEEE80211_NUM_ACS)
     742                 :          0 :                         n_acs = 1;
     743                 :            : 
     744                 :          0 :                 spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
     745         [ #  # ]:          0 :                 if (sdata->vif.cab_queue == IEEE80211_INVAL_HW_QUEUE ||
     746   [ #  #  #  # ]:          0 :                     (local->queue_stop_reasons[sdata->vif.cab_queue] == 0 &&
     747         [ #  # ]:          0 :                      skb_queue_empty(&local->pending[sdata->vif.cab_queue]))) {
     748         [ #  # ]:          0 :                         for (ac = 0; ac < n_acs; ac++) {
     749                 :          0 :                                 int ac_queue = sdata->vif.hw_queue[ac];
     750                 :            : 
     751   [ #  #  #  # ]:          0 :                                 if (local->queue_stop_reasons[ac_queue] == 0 &&
     752         [ #  # ]:          0 :                                     skb_queue_empty(&local->pending[ac_queue]))
     753                 :          0 :                                         netif_start_subqueue(dev, ac);
     754                 :            :                         }
     755                 :            :                 }
     756                 :          0 :                 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
     757                 :            :         }
     758                 :            : 
     759                 :            :         return 0;
     760                 :          0 :  err_del_interface:
     761                 :          0 :         drv_remove_interface(local, sdata);
     762                 :          0 :  err_stop:
     763         [ #  # ]:          0 :         if (!local->open_count)
     764                 :          0 :                 drv_stop(local);
     765                 :          0 :  err_del_bss:
     766                 :          0 :         sdata->bss = NULL;
     767         [ #  # ]:          0 :         if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) {
     768                 :          0 :                 mutex_lock(&local->mtx);
     769                 :          0 :                 list_del(&sdata->u.vlan.list);
     770                 :          0 :                 mutex_unlock(&local->mtx);
     771                 :            :         }
     772                 :            :         /* might already be clear but that doesn't matter */
     773                 :          0 :         clear_bit(SDATA_STATE_RUNNING, &sdata->state);
     774                 :          0 :         return res;
     775                 :            : }
     776                 :            : 
     777                 :          0 : static int ieee80211_open(struct net_device *dev)
     778                 :            : {
     779         [ #  # ]:          0 :         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
     780                 :          0 :         int err;
     781                 :            : 
     782                 :            :         /* fail early if user set an invalid address */
     783   [ #  #  #  # ]:          0 :         if (!is_valid_ether_addr(dev->dev_addr))
     784                 :            :                 return -EADDRNOTAVAIL;
     785                 :            : 
     786                 :          0 :         err = ieee80211_check_concurrent_iface(sdata, sdata->vif.type);
     787         [ #  # ]:          0 :         if (err)
     788                 :            :                 return err;
     789                 :            : 
     790                 :          0 :         return ieee80211_do_open(&sdata->wdev, true);
     791                 :            : }
     792                 :            : 
     793                 :          0 : static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
     794                 :            :                               bool going_down)
     795                 :            : {
     796                 :          0 :         struct ieee80211_local *local = sdata->local;
     797                 :          0 :         unsigned long flags;
     798                 :          0 :         struct sk_buff *skb, *tmp;
     799                 :          0 :         u32 hw_reconf_flags = 0;
     800                 :          0 :         int i, flushed;
     801                 :          0 :         struct ps_data *ps;
     802                 :          0 :         struct cfg80211_chan_def chandef;
     803                 :          0 :         bool cancel_scan;
     804                 :          0 :         struct cfg80211_nan_func *func;
     805                 :            : 
     806                 :          0 :         clear_bit(SDATA_STATE_RUNNING, &sdata->state);
     807                 :            : 
     808         [ #  # ]:          0 :         cancel_scan = rcu_access_pointer(local->scan_sdata) == sdata;
     809         [ #  # ]:          0 :         if (cancel_scan)
     810                 :          0 :                 ieee80211_scan_cancel(local);
     811                 :            : 
     812                 :            :         /*
     813                 :            :          * Stop TX on this interface first.
     814                 :            :          */
     815         [ #  # ]:          0 :         if (sdata->dev)
     816                 :          0 :                 netif_tx_stop_all_queues(sdata->dev);
     817                 :            : 
     818                 :          0 :         ieee80211_roc_purge(local, sdata);
     819                 :            : 
     820   [ #  #  #  #  :          0 :         switch (sdata->vif.type) {
                      # ]
     821                 :          0 :         case NL80211_IFTYPE_STATION:
     822                 :          0 :                 ieee80211_mgd_stop(sdata);
     823                 :          0 :                 break;
     824                 :          0 :         case NL80211_IFTYPE_ADHOC:
     825                 :          0 :                 ieee80211_ibss_stop(sdata);
     826                 :          0 :                 break;
     827                 :          0 :         case NL80211_IFTYPE_AP:
     828                 :          0 :                 cancel_work_sync(&sdata->u.ap.request_smps_work);
     829                 :          0 :                 break;
     830                 :          0 :         case NL80211_IFTYPE_MONITOR:
     831         [ #  # ]:          0 :                 if (sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES)
     832                 :            :                         break;
     833                 :          0 :                 list_del_rcu(&sdata->u.mntr.list);
     834                 :            :                 break;
     835                 :            :         default:
     836                 :            :                 break;
     837                 :            :         }
     838                 :            : 
     839                 :            :         /*
     840                 :            :          * Remove all stations associated with this interface.
     841                 :            :          *
     842                 :            :          * This must be done before calling ops->remove_interface()
     843                 :            :          * because otherwise we can later invoke ops->sta_notify()
     844                 :            :          * whenever the STAs are removed, and that invalidates driver
     845                 :            :          * assumptions about always getting a vif pointer that is valid
     846                 :            :          * (because if we remove a STA after ops->remove_interface()
     847                 :            :          * the driver will have removed the vif info already!)
     848                 :            :          *
     849                 :            :          * In WDS mode a station must exist here and be flushed, for
     850                 :            :          * AP_VLANs stations may exist since there's nothing else that
     851                 :            :          * would have removed them, but in other modes there shouldn't
     852                 :            :          * be any stations.
     853                 :            :          */
     854                 :          0 :         flushed = sta_info_flush(sdata);
     855   [ #  #  #  #  :          0 :         WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
          #  #  #  #  #  
                #  #  # ]
     856                 :            :                      ((sdata->vif.type != NL80211_IFTYPE_WDS && flushed > 0) ||
     857                 :            :                       (sdata->vif.type == NL80211_IFTYPE_WDS && flushed != 1)));
     858                 :            : 
     859                 :            :         /* don't count this interface for allmulti while it is down */
     860         [ #  # ]:          0 :         if (sdata->flags & IEEE80211_SDATA_ALLMULTI)
     861                 :          0 :                 atomic_dec(&local->iff_allmultis);
     862                 :            : 
     863         [ #  # ]:          0 :         if (sdata->vif.type == NL80211_IFTYPE_AP) {
     864                 :          0 :                 local->fif_pspoll--;
     865                 :          0 :                 local->fif_probe_req--;
     866         [ #  # ]:          0 :         } else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) {
     867                 :          0 :                 local->fif_probe_req--;
     868                 :            :         }
     869                 :            : 
     870         [ #  # ]:          0 :         if (sdata->dev) {
     871                 :          0 :                 netif_addr_lock_bh(sdata->dev);
     872                 :          0 :                 spin_lock_bh(&local->filter_lock);
     873                 :          0 :                 __hw_addr_unsync(&local->mc_list, &sdata->dev->mc,
     874                 :          0 :                                  sdata->dev->addr_len);
     875                 :          0 :                 spin_unlock_bh(&local->filter_lock);
     876                 :          0 :                 netif_addr_unlock_bh(sdata->dev);
     877                 :            :         }
     878                 :            : 
     879                 :          0 :         del_timer_sync(&local->dynamic_ps_timer);
     880                 :          0 :         cancel_work_sync(&local->dynamic_ps_enable_work);
     881                 :            : 
     882                 :          0 :         cancel_work_sync(&sdata->recalc_smps);
     883                 :          0 :         sdata_lock(sdata);
     884                 :          0 :         mutex_lock(&local->mtx);
     885                 :          0 :         sdata->vif.csa_active = false;
     886         [ #  # ]:          0 :         if (sdata->vif.type == NL80211_IFTYPE_STATION)
     887                 :          0 :                 sdata->u.mgd.csa_waiting_bcn = false;
     888         [ #  # ]:          0 :         if (sdata->csa_block_tx) {
     889                 :          0 :                 ieee80211_wake_vif_queues(local, sdata,
     890                 :            :                                           IEEE80211_QUEUE_STOP_REASON_CSA);
     891                 :          0 :                 sdata->csa_block_tx = false;
     892                 :            :         }
     893                 :          0 :         mutex_unlock(&local->mtx);
     894                 :          0 :         sdata_unlock(sdata);
     895                 :            : 
     896                 :          0 :         cancel_work_sync(&sdata->csa_finalize_work);
     897                 :            : 
     898                 :          0 :         cancel_delayed_work_sync(&sdata->dfs_cac_timer_work);
     899                 :            : 
     900         [ #  # ]:          0 :         if (sdata->wdev.cac_started) {
     901                 :          0 :                 chandef = sdata->vif.bss_conf.chandef;
     902         [ #  # ]:          0 :                 WARN_ON(local->suspended);
     903                 :          0 :                 mutex_lock(&local->mtx);
     904                 :          0 :                 ieee80211_vif_release_channel(sdata);
     905                 :          0 :                 mutex_unlock(&local->mtx);
     906                 :          0 :                 cfg80211_cac_event(sdata->dev, &chandef,
     907                 :            :                                    NL80211_RADAR_CAC_ABORTED,
     908                 :            :                                    GFP_KERNEL);
     909                 :            :         }
     910                 :            : 
     911                 :            :         /* APs need special treatment */
     912         [ #  # ]:          0 :         if (sdata->vif.type == NL80211_IFTYPE_AP) {
     913                 :          0 :                 struct ieee80211_sub_if_data *vlan, *tmpsdata;
     914                 :            : 
     915                 :            :                 /* down all dependent devices, that is VLANs */
     916         [ #  # ]:          0 :                 list_for_each_entry_safe(vlan, tmpsdata, &sdata->u.ap.vlans,
     917                 :            :                                          u.vlan.list)
     918                 :          0 :                         dev_close(vlan->dev);
     919         [ #  # ]:          0 :                 WARN_ON(!list_empty(&sdata->u.ap.vlans));
     920         [ #  # ]:          0 :         } else if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) {
     921                 :            :                 /* remove all packets in parent bc_buf pointing to this dev */
     922                 :          0 :                 ps = &sdata->bss->ps;
     923                 :            : 
     924                 :          0 :                 spin_lock_irqsave(&ps->bc_buf.lock, flags);
     925         [ #  # ]:          0 :                 skb_queue_walk_safe(&ps->bc_buf, skb, tmp) {
     926         [ #  # ]:          0 :                         if (skb->dev == sdata->dev) {
     927                 :          0 :                                 __skb_unlink(skb, &ps->bc_buf);
     928                 :          0 :                                 local->total_ps_buffered--;
     929                 :          0 :                                 ieee80211_free_txskb(&local->hw, skb);
     930                 :            :                         }
     931                 :            :                 }
     932                 :          0 :                 spin_unlock_irqrestore(&ps->bc_buf.lock, flags);
     933                 :            :         }
     934                 :            : 
     935         [ #  # ]:          0 :         if (going_down)
     936                 :          0 :                 local->open_count--;
     937                 :            : 
     938   [ #  #  #  #  :          0 :         switch (sdata->vif.type) {
                      # ]
     939                 :          0 :         case NL80211_IFTYPE_AP_VLAN:
     940                 :          0 :                 mutex_lock(&local->mtx);
     941                 :          0 :                 list_del(&sdata->u.vlan.list);
     942                 :          0 :                 mutex_unlock(&local->mtx);
     943                 :          0 :                 RCU_INIT_POINTER(sdata->vif.chanctx_conf, NULL);
     944                 :            :                 /* see comment in the default case below */
     945                 :          0 :                 ieee80211_free_keys(sdata, true);
     946                 :            :                 /* no need to tell driver */
     947                 :          0 :                 break;
     948                 :          0 :         case NL80211_IFTYPE_MONITOR:
     949         [ #  # ]:          0 :                 if (sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES) {
     950                 :          0 :                         local->cooked_mntrs--;
     951                 :          0 :                         break;
     952                 :            :                 }
     953                 :            : 
     954                 :          0 :                 local->monitors--;
     955         [ #  # ]:          0 :                 if (local->monitors == 0) {
     956                 :          0 :                         local->hw.conf.flags &= ~IEEE80211_CONF_MONITOR;
     957                 :          0 :                         hw_reconf_flags |= IEEE80211_CONF_CHANGE_MONITOR;
     958                 :            :                 }
     959                 :            : 
     960                 :          0 :                 ieee80211_adjust_monitor_flags(sdata, -1);
     961                 :          0 :                 break;
     962                 :          0 :         case NL80211_IFTYPE_NAN:
     963                 :            :                 /* clean all the functions */
     964                 :          0 :                 spin_lock_bh(&sdata->u.nan.func_lock);
     965                 :            : 
     966         [ #  # ]:          0 :                 idr_for_each_entry(&sdata->u.nan.function_inst_ids, func, i) {
     967                 :          0 :                         idr_remove(&sdata->u.nan.function_inst_ids, i);
     968                 :          0 :                         cfg80211_free_nan_func(func);
     969                 :            :                 }
     970                 :          0 :                 idr_destroy(&sdata->u.nan.function_inst_ids);
     971                 :            : 
     972                 :          0 :                 spin_unlock_bh(&sdata->u.nan.func_lock);
     973                 :            :                 break;
     974                 :          0 :         case NL80211_IFTYPE_P2P_DEVICE:
     975                 :            :                 /* relies on synchronize_rcu() below */
     976                 :          0 :                 RCU_INIT_POINTER(local->p2p_sdata, NULL);
     977                 :            :                 /* fall through */
     978                 :          0 :         default:
     979                 :          0 :                 cancel_work_sync(&sdata->work);
     980                 :            :                 /*
     981                 :            :                  * When we get here, the interface is marked down.
     982                 :            :                  * Free the remaining keys, if there are any
     983                 :            :                  * (which can happen in AP mode if userspace sets
     984                 :            :                  * keys before the interface is operating, and maybe
     985                 :            :                  * also in WDS mode)
     986                 :            :                  *
     987                 :            :                  * Force the key freeing to always synchronize_net()
     988                 :            :                  * to wait for the RX path in case it is using this
     989                 :            :                  * interface enqueuing frames at this very time on
     990                 :            :                  * another CPU.
     991                 :            :                  */
     992                 :          0 :                 ieee80211_free_keys(sdata, true);
     993                 :          0 :                 skb_queue_purge(&sdata->skb_queue);
     994                 :            :         }
     995                 :            : 
     996                 :          0 :         spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
     997         [ #  # ]:          0 :         for (i = 0; i < IEEE80211_MAX_QUEUES; i++) {
     998         [ #  # ]:          0 :                 skb_queue_walk_safe(&local->pending[i], skb, tmp) {
     999         [ #  # ]:          0 :                         struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
    1000         [ #  # ]:          0 :                         if (info->control.vif == &sdata->vif) {
    1001                 :          0 :                                 __skb_unlink(skb, &local->pending[i]);
    1002                 :          0 :                                 ieee80211_free_txskb(&local->hw, skb);
    1003                 :            :                         }
    1004                 :            :                 }
    1005                 :            :         }
    1006                 :          0 :         spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
    1007                 :            : 
    1008         [ #  # ]:          0 :         if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
    1009                 :          0 :                 ieee80211_txq_remove_vlan(local, sdata);
    1010                 :            : 
    1011                 :          0 :         sdata->bss = NULL;
    1012                 :            : 
    1013         [ #  # ]:          0 :         if (local->open_count == 0)
    1014                 :          0 :                 ieee80211_clear_tx_pending(local);
    1015                 :            : 
    1016                 :          0 :         sdata->vif.bss_conf.beacon_int = 0;
    1017                 :            : 
    1018                 :            :         /*
    1019                 :            :          * If the interface goes down while suspended, presumably because
    1020                 :            :          * the device was unplugged and that happens before our resume,
    1021                 :            :          * then the driver is already unconfigured and the remainder of
    1022                 :            :          * this function isn't needed.
    1023                 :            :          * XXX: what about WoWLAN? If the device has software state, e.g.
    1024                 :            :          *      memory allocated, it might expect teardown commands from
    1025                 :            :          *      mac80211 here?
    1026                 :            :          */
    1027         [ #  # ]:          0 :         if (local->suspended) {
    1028         [ #  # ]:          0 :                 WARN_ON(local->wowlan);
    1029         [ #  # ]:          0 :                 WARN_ON(rtnl_dereference(local->monitor_sdata));
    1030                 :          0 :                 return;
    1031                 :            :         }
    1032                 :            : 
    1033      [ #  #  # ]:          0 :         switch (sdata->vif.type) {
    1034                 :            :         case NL80211_IFTYPE_AP_VLAN:
    1035                 :            :                 break;
    1036                 :          0 :         case NL80211_IFTYPE_MONITOR:
    1037         [ #  # ]:          0 :                 if (local->monitors == 0)
    1038                 :          0 :                         ieee80211_del_virtual_monitor(local);
    1039                 :            : 
    1040                 :          0 :                 mutex_lock(&local->mtx);
    1041                 :          0 :                 ieee80211_recalc_idle(local);
    1042                 :          0 :                 mutex_unlock(&local->mtx);
    1043                 :            : 
    1044         [ #  # ]:          0 :                 if (!(sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE))
    1045                 :            :                         break;
    1046                 :            : 
    1047                 :            :                 /* fall through */
    1048                 :            :         default:
    1049         [ #  # ]:          0 :                 if (going_down)
    1050                 :          0 :                         drv_remove_interface(local, sdata);
    1051                 :            :         }
    1052                 :            : 
    1053                 :          0 :         ieee80211_recalc_ps(local);
    1054                 :            : 
    1055         [ #  # ]:          0 :         if (cancel_scan)
    1056                 :          0 :                 flush_delayed_work(&local->scan_work);
    1057                 :            : 
    1058         [ #  # ]:          0 :         if (local->open_count == 0) {
    1059                 :          0 :                 ieee80211_stop_device(local);
    1060                 :            : 
    1061                 :            :                 /* no reconfiguring after stop! */
    1062                 :          0 :                 return;
    1063                 :            :         }
    1064                 :            : 
    1065                 :            :         /* do after stop to avoid reconfiguring when we stop anyway */
    1066                 :          0 :         ieee80211_configure_filter(local);
    1067                 :          0 :         ieee80211_hw_config(local, hw_reconf_flags);
    1068                 :            : 
    1069         [ #  # ]:          0 :         if (local->monitors == local->open_count)
    1070                 :          0 :                 ieee80211_add_virtual_monitor(local);
    1071                 :            : }
    1072                 :            : 
    1073                 :          0 : static int ieee80211_stop(struct net_device *dev)
    1074                 :            : {
    1075                 :          0 :         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
    1076                 :            : 
    1077                 :          0 :         ieee80211_do_stop(sdata, true);
    1078                 :            : 
    1079                 :          0 :         return 0;
    1080                 :            : }
    1081                 :            : 
    1082                 :          0 : static void ieee80211_set_multicast_list(struct net_device *dev)
    1083                 :            : {
    1084         [ #  # ]:          0 :         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
    1085                 :          0 :         struct ieee80211_local *local = sdata->local;
    1086                 :          0 :         int allmulti, sdata_allmulti;
    1087                 :            : 
    1088                 :          0 :         allmulti = !!(dev->flags & IFF_ALLMULTI);
    1089                 :          0 :         sdata_allmulti = !!(sdata->flags & IEEE80211_SDATA_ALLMULTI);
    1090                 :            : 
    1091         [ #  # ]:          0 :         if (allmulti != sdata_allmulti) {
    1092         [ #  # ]:          0 :                 if (dev->flags & IFF_ALLMULTI)
    1093                 :          0 :                         atomic_inc(&local->iff_allmultis);
    1094                 :            :                 else
    1095                 :          0 :                         atomic_dec(&local->iff_allmultis);
    1096                 :          0 :                 sdata->flags ^= IEEE80211_SDATA_ALLMULTI;
    1097                 :            :         }
    1098                 :            : 
    1099                 :          0 :         spin_lock_bh(&local->filter_lock);
    1100                 :          0 :         __hw_addr_sync(&local->mc_list, &dev->mc, dev->addr_len);
    1101                 :          0 :         spin_unlock_bh(&local->filter_lock);
    1102                 :          0 :         ieee80211_queue_work(&local->hw, &local->reconfig_filter);
    1103                 :          0 : }
    1104                 :            : 
    1105                 :            : /*
    1106                 :            :  * Called when the netdev is removed or, by the code below, before
    1107                 :            :  * the interface type changes.
    1108                 :            :  */
    1109                 :          0 : static void ieee80211_teardown_sdata(struct ieee80211_sub_if_data *sdata)
    1110                 :            : {
    1111                 :          0 :         int i;
    1112                 :            : 
    1113                 :            :         /* free extra data */
    1114                 :          0 :         ieee80211_free_keys(sdata, false);
    1115                 :            : 
    1116                 :          0 :         ieee80211_debugfs_remove_netdev(sdata);
    1117                 :            : 
    1118         [ #  # ]:          0 :         for (i = 0; i < IEEE80211_FRAGMENT_MAX; i++)
    1119                 :          0 :                 __skb_queue_purge(&sdata->fragments[i].skb_list);
    1120                 :          0 :         sdata->fragment_next = 0;
    1121                 :            : 
    1122                 :          0 :         if (ieee80211_vif_is_mesh(&sdata->vif))
    1123                 :            :                 ieee80211_mesh_teardown_sdata(sdata);
    1124                 :          0 : }
    1125                 :            : 
    1126                 :          0 : static void ieee80211_uninit(struct net_device *dev)
    1127                 :            : {
    1128                 :          0 :         ieee80211_teardown_sdata(IEEE80211_DEV_TO_SUB_IF(dev));
    1129                 :          0 : }
    1130                 :            : 
    1131                 :          0 : static u16 ieee80211_netdev_select_queue(struct net_device *dev,
    1132                 :            :                                          struct sk_buff *skb,
    1133                 :            :                                          struct net_device *sb_dev)
    1134                 :            : {
    1135                 :          0 :         return ieee80211_select_queue(IEEE80211_DEV_TO_SUB_IF(dev), skb);
    1136                 :            : }
    1137                 :            : 
    1138                 :            : static void
    1139                 :          0 : ieee80211_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats)
    1140                 :            : {
    1141                 :          0 :         int i;
    1142                 :            : 
    1143         [ #  # ]:          0 :         for_each_possible_cpu(i) {
    1144                 :          0 :                 const struct pcpu_sw_netstats *tstats;
    1145                 :          0 :                 u64 rx_packets, rx_bytes, tx_packets, tx_bytes;
    1146                 :          0 :                 unsigned int start;
    1147                 :            : 
    1148                 :          0 :                 tstats = per_cpu_ptr(dev->tstats, i);
    1149                 :            : 
    1150                 :          0 :                 do {
    1151                 :          0 :                         start = u64_stats_fetch_begin_irq(&tstats->syncp);
    1152                 :          0 :                         rx_packets = tstats->rx_packets;
    1153                 :          0 :                         tx_packets = tstats->tx_packets;
    1154                 :          0 :                         rx_bytes = tstats->rx_bytes;
    1155                 :          0 :                         tx_bytes = tstats->tx_bytes;
    1156                 :          0 :                 } while (u64_stats_fetch_retry_irq(&tstats->syncp, start));
    1157                 :            : 
    1158                 :          0 :                 stats->rx_packets += rx_packets;
    1159                 :          0 :                 stats->tx_packets += tx_packets;
    1160                 :          0 :                 stats->rx_bytes   += rx_bytes;
    1161                 :          0 :                 stats->tx_bytes   += tx_bytes;
    1162                 :            :         }
    1163                 :          0 : }
    1164                 :            : 
    1165                 :            : static const struct net_device_ops ieee80211_dataif_ops = {
    1166                 :            :         .ndo_open               = ieee80211_open,
    1167                 :            :         .ndo_stop               = ieee80211_stop,
    1168                 :            :         .ndo_uninit             = ieee80211_uninit,
    1169                 :            :         .ndo_start_xmit         = ieee80211_subif_start_xmit,
    1170                 :            :         .ndo_set_rx_mode        = ieee80211_set_multicast_list,
    1171                 :            :         .ndo_set_mac_address    = ieee80211_change_mac,
    1172                 :            :         .ndo_select_queue       = ieee80211_netdev_select_queue,
    1173                 :            :         .ndo_get_stats64        = ieee80211_get_stats64,
    1174                 :            : };
    1175                 :            : 
    1176                 :          0 : static u16 ieee80211_monitor_select_queue(struct net_device *dev,
    1177                 :            :                                           struct sk_buff *skb,
    1178                 :            :                                           struct net_device *sb_dev)
    1179                 :            : {
    1180         [ #  # ]:          0 :         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
    1181                 :          0 :         struct ieee80211_local *local = sdata->local;
    1182                 :          0 :         struct ieee80211_hdr *hdr;
    1183                 :          0 :         struct ieee80211_radiotap_header *rtap = (void *)skb->data;
    1184                 :            : 
    1185         [ #  # ]:          0 :         if (local->hw.queues < IEEE80211_NUM_ACS)
    1186                 :            :                 return 0;
    1187                 :            : 
    1188         [ #  # ]:          0 :         if (skb->len < 4 ||
    1189         [ #  # ]:          0 :             skb->len < le16_to_cpu(rtap->it_len) + 2 /* frame control */)
    1190                 :            :                 return 0; /* doesn't matter, frame will be dropped */
    1191                 :            : 
    1192                 :          0 :         hdr = (void *)((u8 *)skb->data + le16_to_cpu(rtap->it_len));
    1193                 :            : 
    1194                 :          0 :         return ieee80211_select_queue_80211(sdata, skb, hdr);
    1195                 :            : }
    1196                 :            : 
    1197                 :            : static const struct net_device_ops ieee80211_monitorif_ops = {
    1198                 :            :         .ndo_open               = ieee80211_open,
    1199                 :            :         .ndo_stop               = ieee80211_stop,
    1200                 :            :         .ndo_uninit             = ieee80211_uninit,
    1201                 :            :         .ndo_start_xmit         = ieee80211_monitor_start_xmit,
    1202                 :            :         .ndo_set_rx_mode        = ieee80211_set_multicast_list,
    1203                 :            :         .ndo_set_mac_address    = ieee80211_change_mac,
    1204                 :            :         .ndo_select_queue       = ieee80211_monitor_select_queue,
    1205                 :            :         .ndo_get_stats64        = ieee80211_get_stats64,
    1206                 :            : };
    1207                 :            : 
    1208                 :          0 : static void ieee80211_if_free(struct net_device *dev)
    1209                 :            : {
    1210                 :          0 :         free_percpu(dev->tstats);
    1211                 :          0 : }
    1212                 :            : 
    1213                 :          0 : static void ieee80211_if_setup(struct net_device *dev)
    1214                 :            : {
    1215                 :          0 :         ether_setup(dev);
    1216                 :          0 :         dev->priv_flags &= ~IFF_TX_SKB_SHARING;
    1217                 :          0 :         dev->netdev_ops = &ieee80211_dataif_ops;
    1218                 :          0 :         dev->needs_free_netdev = true;
    1219                 :          0 :         dev->priv_destructor = ieee80211_if_free;
    1220                 :          0 : }
    1221                 :            : 
    1222                 :          0 : static void ieee80211_if_setup_no_queue(struct net_device *dev)
    1223                 :            : {
    1224                 :          0 :         ieee80211_if_setup(dev);
    1225                 :          0 :         dev->priv_flags |= IFF_NO_QUEUE;
    1226                 :          0 : }
    1227                 :            : 
    1228                 :          0 : static void ieee80211_iface_work(struct work_struct *work)
    1229                 :            : {
    1230                 :          0 :         struct ieee80211_sub_if_data *sdata =
    1231                 :          0 :                 container_of(work, struct ieee80211_sub_if_data, work);
    1232                 :          0 :         struct ieee80211_local *local = sdata->local;
    1233                 :          0 :         struct sk_buff *skb;
    1234                 :          0 :         struct sta_info *sta;
    1235                 :            : 
    1236         [ #  # ]:          0 :         if (!ieee80211_sdata_running(sdata))
    1237                 :            :                 return;
    1238                 :            : 
    1239         [ #  # ]:          0 :         if (test_bit(SCAN_SW_SCANNING, &local->scanning))
    1240                 :            :                 return;
    1241                 :            : 
    1242         [ #  # ]:          0 :         if (!ieee80211_can_run_worker(local))
    1243                 :            :                 return;
    1244                 :            : 
    1245                 :            :         /* first process frames */
    1246         [ #  # ]:          0 :         while ((skb = skb_dequeue(&sdata->skb_queue))) {
    1247                 :          0 :                 struct ieee80211_mgmt *mgmt = (void *)skb->data;
    1248                 :            : 
    1249         [ #  # ]:          0 :                 if (ieee80211_is_action(mgmt->frame_control) &&
    1250         [ #  # ]:          0 :                     mgmt->u.action.category == WLAN_CATEGORY_BACK) {
    1251                 :          0 :                         int len = skb->len;
    1252                 :            : 
    1253                 :          0 :                         mutex_lock(&local->sta_mtx);
    1254                 :          0 :                         sta = sta_info_get_bss(sdata, mgmt->sa);
    1255         [ #  # ]:          0 :                         if (sta) {
    1256   [ #  #  #  # ]:          0 :                                 switch (mgmt->u.action.u.addba_req.action_code) {
    1257                 :          0 :                                 case WLAN_ACTION_ADDBA_REQ:
    1258                 :          0 :                                         ieee80211_process_addba_request(
    1259                 :            :                                                         local, sta, mgmt, len);
    1260                 :          0 :                                         break;
    1261                 :          0 :                                 case WLAN_ACTION_ADDBA_RESP:
    1262                 :          0 :                                         ieee80211_process_addba_resp(local, sta,
    1263                 :            :                                                                      mgmt, len);
    1264                 :          0 :                                         break;
    1265                 :          0 :                                 case WLAN_ACTION_DELBA:
    1266                 :          0 :                                         ieee80211_process_delba(sdata, sta,
    1267                 :            :                                                                 mgmt, len);
    1268                 :          0 :                                         break;
    1269                 :            :                                 default:
    1270                 :          0 :                                         WARN_ON(1);
    1271                 :          0 :                                         break;
    1272                 :            :                                 }
    1273                 :          0 :                         }
    1274                 :          0 :                         mutex_unlock(&local->sta_mtx);
    1275         [ #  # ]:          0 :                 } else if (ieee80211_is_action(mgmt->frame_control) &&
    1276         [ #  # ]:          0 :                            mgmt->u.action.category == WLAN_CATEGORY_VHT) {
    1277      [ #  #  # ]:          0 :                         switch (mgmt->u.action.u.vht_group_notif.action_code) {
    1278                 :            :                         case WLAN_VHT_ACTION_OPMODE_NOTIF: {
    1279                 :          0 :                                 struct ieee80211_rx_status *status;
    1280                 :          0 :                                 enum nl80211_band band;
    1281                 :          0 :                                 u8 opmode;
    1282                 :            : 
    1283                 :          0 :                                 status = IEEE80211_SKB_RXCB(skb);
    1284                 :          0 :                                 band = status->band;
    1285                 :          0 :                                 opmode = mgmt->u.action.u.vht_opmode_notif.operating_mode;
    1286                 :            : 
    1287                 :          0 :                                 mutex_lock(&local->sta_mtx);
    1288                 :          0 :                                 sta = sta_info_get_bss(sdata, mgmt->sa);
    1289                 :            : 
    1290         [ #  # ]:          0 :                                 if (sta)
    1291                 :          0 :                                         ieee80211_vht_handle_opmode(sdata, sta,
    1292                 :            :                                                                     opmode,
    1293                 :            :                                                                     band);
    1294                 :            : 
    1295                 :          0 :                                 mutex_unlock(&local->sta_mtx);
    1296                 :          0 :                                 break;
    1297                 :            :                         }
    1298                 :          0 :                         case WLAN_VHT_ACTION_GROUPID_MGMT:
    1299                 :          0 :                                 ieee80211_process_mu_groups(sdata, mgmt);
    1300                 :          0 :                                 break;
    1301                 :            :                         default:
    1302                 :          0 :                                 WARN_ON(1);
    1303                 :          0 :                                 break;
    1304                 :            :                         }
    1305         [ #  # ]:          0 :                 } else if (ieee80211_is_data_qos(mgmt->frame_control)) {
    1306                 :          0 :                         struct ieee80211_hdr *hdr = (void *)mgmt;
    1307                 :            :                         /*
    1308                 :            :                          * So the frame isn't mgmt, but frame_control
    1309                 :            :                          * is at the right place anyway, of course, so
    1310                 :            :                          * the if statement is correct.
    1311                 :            :                          *
    1312                 :            :                          * Warn if we have other data frame types here,
    1313                 :            :                          * they must not get here.
    1314                 :            :                          */
    1315         [ #  # ]:          0 :                         WARN_ON(hdr->frame_control &
    1316                 :            :                                         cpu_to_le16(IEEE80211_STYPE_NULLFUNC));
    1317         [ #  # ]:          0 :                         WARN_ON(!(hdr->seq_ctrl &
    1318                 :            :                                         cpu_to_le16(IEEE80211_SCTL_FRAG)));
    1319                 :            :                         /*
    1320                 :            :                          * This was a fragment of a frame, received while
    1321                 :            :                          * a block-ack session was active. That cannot be
    1322                 :            :                          * right, so terminate the session.
    1323                 :            :                          */
    1324                 :          0 :                         mutex_lock(&local->sta_mtx);
    1325                 :          0 :                         sta = sta_info_get_bss(sdata, mgmt->sa);
    1326         [ #  # ]:          0 :                         if (sta) {
    1327         [ #  # ]:          0 :                                 u16 tid = ieee80211_get_tid(hdr);
    1328                 :            : 
    1329                 :          0 :                                 __ieee80211_stop_rx_ba_session(
    1330                 :            :                                         sta, tid, WLAN_BACK_RECIPIENT,
    1331                 :            :                                         WLAN_REASON_QSTA_REQUIRE_SETUP,
    1332                 :            :                                         true);
    1333                 :            :                         }
    1334                 :          0 :                         mutex_unlock(&local->sta_mtx);
    1335   [ #  #  #  # ]:          0 :                 } else switch (sdata->vif.type) {
    1336                 :          0 :                 case NL80211_IFTYPE_STATION:
    1337                 :          0 :                         ieee80211_sta_rx_queued_mgmt(sdata, skb);
    1338                 :          0 :                         break;
    1339                 :          0 :                 case NL80211_IFTYPE_ADHOC:
    1340                 :          0 :                         ieee80211_ibss_rx_queued_mgmt(sdata, skb);
    1341                 :          0 :                         break;
    1342                 :            :                 case NL80211_IFTYPE_MESH_POINT:
    1343                 :            :                         if (!ieee80211_vif_is_mesh(&sdata->vif))
    1344                 :            :                                 break;
    1345                 :            :                         ieee80211_mesh_rx_queued_mgmt(sdata, skb);
    1346                 :            :                         break;
    1347                 :            :                 default:
    1348                 :          0 :                         WARN(1, "frame for unexpected interface type");
    1349                 :          0 :                         break;
    1350                 :            :                 }
    1351                 :            : 
    1352                 :          0 :                 kfree_skb(skb);
    1353                 :            :         }
    1354                 :            : 
    1355                 :            :         /* then other type-dependent work */
    1356   [ #  #  #  # ]:          0 :         switch (sdata->vif.type) {
    1357                 :          0 :         case NL80211_IFTYPE_STATION:
    1358                 :          0 :                 ieee80211_sta_work(sdata);
    1359                 :          0 :                 break;
    1360                 :          0 :         case NL80211_IFTYPE_ADHOC:
    1361                 :          0 :                 ieee80211_ibss_work(sdata);
    1362                 :          0 :                 break;
    1363                 :            :         case NL80211_IFTYPE_MESH_POINT:
    1364                 :            :                 if (!ieee80211_vif_is_mesh(&sdata->vif))
    1365                 :            :                         break;
    1366                 :            :                 ieee80211_mesh_work(sdata);
    1367                 :            :                 break;
    1368                 :          0 :         case NL80211_IFTYPE_OCB:
    1369                 :          0 :                 ieee80211_ocb_work(sdata);
    1370                 :          0 :                 break;
    1371                 :            :         default:
    1372                 :            :                 break;
    1373                 :            :         }
    1374                 :            : }
    1375                 :            : 
    1376                 :          0 : static void ieee80211_recalc_smps_work(struct work_struct *work)
    1377                 :            : {
    1378                 :          0 :         struct ieee80211_sub_if_data *sdata =
    1379                 :          0 :                 container_of(work, struct ieee80211_sub_if_data, recalc_smps);
    1380                 :            : 
    1381                 :          0 :         ieee80211_recalc_smps(sdata);
    1382                 :          0 : }
    1383                 :            : 
    1384                 :            : /*
    1385                 :            :  * Helper function to initialise an interface to a specific type.
    1386                 :            :  */
    1387                 :          0 : static void ieee80211_setup_sdata(struct ieee80211_sub_if_data *sdata,
    1388                 :            :                                   enum nl80211_iftype type)
    1389                 :            : {
    1390                 :          0 :         static const u8 bssid_wildcard[ETH_ALEN] = {0xff, 0xff, 0xff,
    1391                 :            :                                                     0xff, 0xff, 0xff};
    1392                 :            : 
    1393                 :            :         /* clear type-dependent union */
    1394                 :          0 :         memset(&sdata->u, 0, sizeof(sdata->u));
    1395                 :            : 
    1396                 :            :         /* and set some type-dependent values */
    1397                 :          0 :         sdata->vif.type = type;
    1398                 :          0 :         sdata->vif.p2p = false;
    1399                 :          0 :         sdata->wdev.iftype = type;
    1400                 :            : 
    1401                 :          0 :         sdata->control_port_protocol = cpu_to_be16(ETH_P_PAE);
    1402                 :          0 :         sdata->control_port_no_encrypt = false;
    1403                 :          0 :         sdata->encrypt_headroom = IEEE80211_ENCRYPT_HEADROOM;
    1404                 :          0 :         sdata->vif.bss_conf.idle = true;
    1405                 :            : 
    1406                 :          0 :         sdata->noack_map = 0;
    1407                 :            : 
    1408                 :            :         /* only monitor/p2p-device differ */
    1409         [ #  # ]:          0 :         if (sdata->dev) {
    1410                 :          0 :                 sdata->dev->netdev_ops = &ieee80211_dataif_ops;
    1411                 :          0 :                 sdata->dev->type = ARPHRD_ETHER;
    1412                 :            :         }
    1413                 :            : 
    1414   [ #  #  #  #  :          0 :         skb_queue_head_init(&sdata->skb_queue);
          #  #  #  #  #  
                #  #  # ]
    1415   [ #  #  #  #  :          0 :         INIT_WORK(&sdata->work, ieee80211_iface_work);
          #  #  #  #  #  
                #  #  # ]
    1416                 :          0 :         INIT_WORK(&sdata->recalc_smps, ieee80211_recalc_smps_work);
    1417                 :          0 :         INIT_WORK(&sdata->csa_finalize_work, ieee80211_csa_finalize_work);
    1418                 :          0 :         INIT_LIST_HEAD(&sdata->assigned_chanctx_list);
    1419                 :          0 :         INIT_LIST_HEAD(&sdata->reserved_chanctx_list);
    1420                 :            : 
    1421   [ #  #  #  #  :          0 :         switch (type) {
          #  #  #  #  #  
                #  #  # ]
    1422                 :          0 :         case NL80211_IFTYPE_P2P_GO:
    1423                 :          0 :                 type = NL80211_IFTYPE_AP;
    1424                 :          0 :                 sdata->vif.type = type;
    1425                 :          0 :                 sdata->vif.p2p = true;
    1426                 :            :                 /* fall through */
    1427                 :          0 :         case NL80211_IFTYPE_AP:
    1428                 :          0 :                 skb_queue_head_init(&sdata->u.ap.ps.bc_buf);
    1429                 :          0 :                 INIT_LIST_HEAD(&sdata->u.ap.vlans);
    1430                 :          0 :                 INIT_WORK(&sdata->u.ap.request_smps_work,
    1431                 :            :                           ieee80211_request_smps_ap_work);
    1432                 :          0 :                 sdata->vif.bss_conf.bssid = sdata->vif.addr;
    1433                 :          0 :                 sdata->u.ap.req_smps = IEEE80211_SMPS_OFF;
    1434                 :          0 :                 break;
    1435                 :          0 :         case NL80211_IFTYPE_P2P_CLIENT:
    1436                 :          0 :                 type = NL80211_IFTYPE_STATION;
    1437                 :          0 :                 sdata->vif.type = type;
    1438                 :          0 :                 sdata->vif.p2p = true;
    1439                 :            :                 /* fall through */
    1440                 :          0 :         case NL80211_IFTYPE_STATION:
    1441                 :          0 :                 sdata->vif.bss_conf.bssid = sdata->u.mgd.bssid;
    1442                 :          0 :                 ieee80211_sta_setup_sdata(sdata);
    1443                 :          0 :                 break;
    1444                 :          0 :         case NL80211_IFTYPE_OCB:
    1445                 :          0 :                 sdata->vif.bss_conf.bssid = bssid_wildcard;
    1446                 :          0 :                 ieee80211_ocb_setup_sdata(sdata);
    1447                 :          0 :                 break;
    1448                 :          0 :         case NL80211_IFTYPE_ADHOC:
    1449                 :          0 :                 sdata->vif.bss_conf.bssid = sdata->u.ibss.bssid;
    1450                 :          0 :                 ieee80211_ibss_setup_sdata(sdata);
    1451                 :          0 :                 break;
    1452                 :            :         case NL80211_IFTYPE_MESH_POINT:
    1453                 :            :                 if (ieee80211_vif_is_mesh(&sdata->vif))
    1454                 :            :                         ieee80211_mesh_init_sdata(sdata);
    1455                 :            :                 break;
    1456                 :          0 :         case NL80211_IFTYPE_MONITOR:
    1457                 :          0 :                 sdata->dev->type = ARPHRD_IEEE80211_RADIOTAP;
    1458                 :          0 :                 sdata->dev->netdev_ops = &ieee80211_monitorif_ops;
    1459                 :          0 :                 sdata->u.mntr.flags = MONITOR_FLAG_CONTROL |
    1460                 :            :                                       MONITOR_FLAG_OTHER_BSS;
    1461                 :          0 :                 break;
    1462                 :          0 :         case NL80211_IFTYPE_WDS:
    1463                 :          0 :                 sdata->vif.bss_conf.bssid = NULL;
    1464                 :          0 :                 break;
    1465                 :          0 :         case NL80211_IFTYPE_NAN:
    1466                 :          0 :                 idr_init(&sdata->u.nan.function_inst_ids);
    1467                 :          0 :                 spin_lock_init(&sdata->u.nan.func_lock);
    1468                 :          0 :                 sdata->vif.bss_conf.bssid = sdata->vif.addr;
    1469                 :          0 :                 break;
    1470                 :          0 :         case NL80211_IFTYPE_AP_VLAN:
    1471                 :            :         case NL80211_IFTYPE_P2P_DEVICE:
    1472                 :          0 :                 sdata->vif.bss_conf.bssid = sdata->vif.addr;
    1473                 :          0 :                 break;
    1474                 :            :         case NL80211_IFTYPE_UNSPECIFIED:
    1475                 :            :         case NUM_NL80211_IFTYPES:
    1476                 :          0 :                 WARN_ON(1);
    1477                 :          0 :                 break;
    1478                 :            :         }
    1479                 :            : 
    1480                 :          0 :         ieee80211_debugfs_add_netdev(sdata);
    1481                 :          0 : }
    1482                 :            : 
    1483                 :          0 : static int ieee80211_runtime_change_iftype(struct ieee80211_sub_if_data *sdata,
    1484                 :            :                                            enum nl80211_iftype type)
    1485                 :            : {
    1486                 :          0 :         struct ieee80211_local *local = sdata->local;
    1487                 :          0 :         int ret, err;
    1488                 :          0 :         enum nl80211_iftype internal_type = type;
    1489                 :          0 :         bool p2p = false;
    1490                 :            : 
    1491   [ #  #  #  # ]:          0 :         ASSERT_RTNL();
    1492                 :            : 
    1493         [ #  # ]:          0 :         if (!local->ops->change_interface)
    1494                 :            :                 return -EBUSY;
    1495                 :            : 
    1496         [ #  # ]:          0 :         switch (sdata->vif.type) {
    1497                 :            :         case NL80211_IFTYPE_AP:
    1498                 :            :         case NL80211_IFTYPE_STATION:
    1499                 :            :         case NL80211_IFTYPE_ADHOC:
    1500                 :            :         case NL80211_IFTYPE_OCB:
    1501                 :            :                 /*
    1502                 :            :                  * Could maybe also all others here?
    1503                 :            :                  * Just not sure how that interacts
    1504                 :            :                  * with the RX/config path e.g. for
    1505                 :            :                  * mesh.
    1506                 :            :                  */
    1507                 :          0 :                 break;
    1508                 :            :         default:
    1509                 :            :                 return -EBUSY;
    1510                 :            :         }
    1511                 :            : 
    1512   [ #  #  #  # ]:          0 :         switch (type) {
    1513                 :            :         case NL80211_IFTYPE_AP:
    1514                 :            :         case NL80211_IFTYPE_STATION:
    1515                 :            :         case NL80211_IFTYPE_ADHOC:
    1516                 :            :         case NL80211_IFTYPE_OCB:
    1517                 :            :                 /*
    1518                 :            :                  * Could probably support everything
    1519                 :            :                  * but WDS here (WDS do_open can fail
    1520                 :            :                  * under memory pressure, which this
    1521                 :            :                  * code isn't prepared to handle).
    1522                 :            :                  */
    1523                 :            :                 break;
    1524                 :          0 :         case NL80211_IFTYPE_P2P_CLIENT:
    1525                 :          0 :                 p2p = true;
    1526                 :          0 :                 internal_type = NL80211_IFTYPE_STATION;
    1527                 :          0 :                 break;
    1528                 :          0 :         case NL80211_IFTYPE_P2P_GO:
    1529                 :          0 :                 p2p = true;
    1530                 :          0 :                 internal_type = NL80211_IFTYPE_AP;
    1531                 :          0 :                 break;
    1532                 :            :         default:
    1533                 :            :                 return -EBUSY;
    1534                 :            :         }
    1535                 :            : 
    1536                 :          0 :         ret = ieee80211_check_concurrent_iface(sdata, internal_type);
    1537         [ #  # ]:          0 :         if (ret)
    1538                 :            :                 return ret;
    1539                 :            : 
    1540                 :          0 :         ieee80211_do_stop(sdata, false);
    1541                 :            : 
    1542                 :          0 :         ieee80211_teardown_sdata(sdata);
    1543                 :            : 
    1544                 :          0 :         ret = drv_change_interface(local, sdata, internal_type, p2p);
    1545         [ #  # ]:          0 :         if (ret)
    1546         [ #  # ]:          0 :                 type = ieee80211_vif_type_p2p(&sdata->vif);
    1547                 :            : 
    1548                 :            :         /*
    1549                 :            :          * Ignore return value here, there's not much we can do since
    1550                 :            :          * the driver changed the interface type internally already.
    1551                 :            :          * The warnings will hopefully make driver authors fix it :-)
    1552                 :            :          */
    1553                 :          0 :         ieee80211_check_queues(sdata, type);
    1554                 :            : 
    1555                 :          0 :         ieee80211_setup_sdata(sdata, type);
    1556                 :            : 
    1557                 :          0 :         err = ieee80211_do_open(&sdata->wdev, false);
    1558         [ #  # ]:          0 :         WARN(err, "type change: do_open returned %d", err);
    1559                 :            : 
    1560                 :            :         return ret;
    1561                 :            : }
    1562                 :            : 
    1563                 :          0 : int ieee80211_if_change_type(struct ieee80211_sub_if_data *sdata,
    1564                 :            :                              enum nl80211_iftype type)
    1565                 :            : {
    1566                 :          0 :         int ret;
    1567                 :            : 
    1568   [ #  #  #  # ]:          0 :         ASSERT_RTNL();
    1569                 :            : 
    1570   [ #  #  #  # ]:          0 :         if (type == ieee80211_vif_type_p2p(&sdata->vif))
    1571                 :            :                 return 0;
    1572                 :            : 
    1573         [ #  # ]:          0 :         if (ieee80211_sdata_running(sdata)) {
    1574                 :          0 :                 ret = ieee80211_runtime_change_iftype(sdata, type);
    1575         [ #  # ]:          0 :                 if (ret)
    1576                 :            :                         return ret;
    1577                 :            :         } else {
    1578                 :            :                 /* Purge and reset type-dependent state. */
    1579                 :          0 :                 ieee80211_teardown_sdata(sdata);
    1580                 :          0 :                 ieee80211_setup_sdata(sdata, type);
    1581                 :            :         }
    1582                 :            : 
    1583                 :            :         /* reset some values that shouldn't be kept across type changes */
    1584         [ #  # ]:          0 :         if (type == NL80211_IFTYPE_STATION)
    1585                 :          0 :                 sdata->u.mgd.use_4addr = false;
    1586                 :            : 
    1587                 :            :         return 0;
    1588                 :            : }
    1589                 :            : 
    1590                 :          0 : static void ieee80211_assign_perm_addr(struct ieee80211_local *local,
    1591                 :            :                                        u8 *perm_addr, enum nl80211_iftype type)
    1592                 :            : {
    1593                 :          0 :         struct ieee80211_sub_if_data *sdata;
    1594                 :          0 :         u64 mask, start, addr, val, inc;
    1595                 :          0 :         u8 *m;
    1596                 :          0 :         u8 tmp_addr[ETH_ALEN];
    1597                 :          0 :         int i;
    1598                 :            : 
    1599                 :            :         /* default ... something at least */
    1600                 :          0 :         memcpy(perm_addr, local->hw.wiphy->perm_addr, ETH_ALEN);
    1601                 :            : 
    1602         [ #  # ]:          0 :         if (is_zero_ether_addr(local->hw.wiphy->addr_mask) &&
    1603         [ #  # ]:          0 :             local->hw.wiphy->n_addresses <= 1)
    1604                 :          0 :                 return;
    1605                 :            : 
    1606                 :          0 :         mutex_lock(&local->iflist_mtx);
    1607                 :            : 
    1608   [ #  #  #  # ]:          0 :         switch (type) {
    1609                 :            :         case NL80211_IFTYPE_MONITOR:
    1610                 :            :                 /* doesn't matter */
    1611                 :            :                 break;
    1612                 :          0 :         case NL80211_IFTYPE_WDS:
    1613                 :            :         case NL80211_IFTYPE_AP_VLAN:
    1614                 :            :                 /* match up with an AP interface */
    1615         [ #  # ]:          0 :                 list_for_each_entry(sdata, &local->interfaces, list) {
    1616         [ #  # ]:          0 :                         if (sdata->vif.type != NL80211_IFTYPE_AP)
    1617                 :          0 :                                 continue;
    1618                 :          0 :                         memcpy(perm_addr, sdata->vif.addr, ETH_ALEN);
    1619                 :          0 :                         break;
    1620                 :            :                 }
    1621                 :            :                 /* keep default if no AP interface present */
    1622                 :            :                 break;
    1623                 :          0 :         case NL80211_IFTYPE_P2P_CLIENT:
    1624                 :            :         case NL80211_IFTYPE_P2P_GO:
    1625         [ #  # ]:          0 :                 if (ieee80211_hw_check(&local->hw, P2P_DEV_ADDR_FOR_INTF)) {
    1626         [ #  # ]:          0 :                         list_for_each_entry(sdata, &local->interfaces, list) {
    1627         [ #  # ]:          0 :                                 if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE)
    1628                 :          0 :                                         continue;
    1629         [ #  # ]:          0 :                                 if (!ieee80211_sdata_running(sdata))
    1630                 :          0 :                                         continue;
    1631                 :          0 :                                 memcpy(perm_addr, sdata->vif.addr, ETH_ALEN);
    1632                 :          0 :                                 goto out_unlock;
    1633                 :            :                         }
    1634                 :            :                 }
    1635                 :            :                 /* fall through */
    1636                 :            :         default:
    1637                 :            :                 /* assign a new address if possible -- try n_addresses first */
    1638         [ #  # ]:          0 :                 for (i = 0; i < local->hw.wiphy->n_addresses; i++) {
    1639                 :          0 :                         bool used = false;
    1640                 :            : 
    1641         [ #  # ]:          0 :                         list_for_each_entry(sdata, &local->interfaces, list) {
    1642         [ #  # ]:          0 :                                 if (ether_addr_equal(local->hw.wiphy->addresses[i].addr,
    1643                 :            :                                                      sdata->vif.addr)) {
    1644                 :            :                                         used = true;
    1645                 :            :                                         break;
    1646                 :            :                                 }
    1647                 :            :                         }
    1648                 :            : 
    1649         [ #  # ]:          0 :                         if (!used) {
    1650                 :          0 :                                 memcpy(perm_addr,
    1651                 :          0 :                                        local->hw.wiphy->addresses[i].addr,
    1652                 :            :                                        ETH_ALEN);
    1653                 :          0 :                                 break;
    1654                 :            :                         }
    1655                 :            :                 }
    1656                 :            : 
    1657                 :            :                 /* try mask if available */
    1658         [ #  # ]:          0 :                 if (is_zero_ether_addr(local->hw.wiphy->addr_mask))
    1659                 :            :                         break;
    1660                 :            : 
    1661                 :          0 :                 m = local->hw.wiphy->addr_mask;
    1662                 :          0 :                 mask =  ((u64)m[0] << 5*8) | ((u64)m[1] << 4*8) |
    1663                 :          0 :                         ((u64)m[2] << 3*8) | ((u64)m[3] << 2*8) |
    1664                 :          0 :                         ((u64)m[4] << 1*8) | ((u64)m[5] << 0*8);
    1665                 :            : 
    1666   [ #  #  #  # ]:          0 :                 if (__ffs64(mask) + hweight64(mask) != fls64(mask)) {
    1667                 :            :                         /* not a contiguous mask ... not handled now! */
    1668                 :          0 :                         pr_info("not contiguous\n");
    1669                 :          0 :                         break;
    1670                 :            :                 }
    1671                 :            : 
    1672                 :            :                 /*
    1673                 :            :                  * Pick address of existing interface in case user changed
    1674                 :            :                  * MAC address manually, default to perm_addr.
    1675                 :            :                  */
    1676                 :          0 :                 m = local->hw.wiphy->perm_addr;
    1677         [ #  # ]:          0 :                 list_for_each_entry(sdata, &local->interfaces, list) {
    1678         [ #  # ]:          0 :                         if (sdata->vif.type == NL80211_IFTYPE_MONITOR)
    1679                 :          0 :                                 continue;
    1680                 :          0 :                         m = sdata->vif.addr;
    1681                 :          0 :                         break;
    1682                 :            :                 }
    1683                 :          0 :                 start = ((u64)m[0] << 5*8) | ((u64)m[1] << 4*8) |
    1684                 :          0 :                         ((u64)m[2] << 3*8) | ((u64)m[3] << 2*8) |
    1685                 :          0 :                         ((u64)m[4] << 1*8) | ((u64)m[5] << 0*8);
    1686                 :            : 
    1687                 :          0 :                 inc = 1ULL<<__ffs64(mask);
    1688                 :          0 :                 val = (start & mask);
    1689                 :          0 :                 addr = (start & ~mask) | (val & mask);
    1690                 :          0 :                 do {
    1691                 :          0 :                         bool used = false;
    1692                 :            : 
    1693                 :          0 :                         tmp_addr[5] = addr >> 0*8;
    1694                 :          0 :                         tmp_addr[4] = addr >> 1*8;
    1695                 :          0 :                         tmp_addr[3] = addr >> 2*8;
    1696                 :          0 :                         tmp_addr[2] = addr >> 3*8;
    1697                 :          0 :                         tmp_addr[1] = addr >> 4*8;
    1698                 :          0 :                         tmp_addr[0] = addr >> 5*8;
    1699                 :            : 
    1700                 :          0 :                         val += inc;
    1701                 :            : 
    1702         [ #  # ]:          0 :                         list_for_each_entry(sdata, &local->interfaces, list) {
    1703         [ #  # ]:          0 :                                 if (ether_addr_equal(tmp_addr, sdata->vif.addr)) {
    1704                 :            :                                         used = true;
    1705                 :            :                                         break;
    1706                 :            :                                 }
    1707                 :            :                         }
    1708                 :            : 
    1709         [ #  # ]:          0 :                         if (!used) {
    1710                 :          0 :                                 memcpy(perm_addr, tmp_addr, ETH_ALEN);
    1711                 :          0 :                                 break;
    1712                 :            :                         }
    1713                 :          0 :                         addr = (start & ~mask) | (val & mask);
    1714         [ #  # ]:          0 :                 } while (addr != start);
    1715                 :            : 
    1716                 :            :                 break;
    1717                 :            :         }
    1718                 :            : 
    1719                 :          0 :  out_unlock:
    1720                 :          0 :         mutex_unlock(&local->iflist_mtx);
    1721                 :            : }
    1722                 :            : 
    1723                 :          0 : int ieee80211_if_add(struct ieee80211_local *local, const char *name,
    1724                 :            :                      unsigned char name_assign_type,
    1725                 :            :                      struct wireless_dev **new_wdev, enum nl80211_iftype type,
    1726                 :            :                      struct vif_params *params)
    1727                 :            : {
    1728                 :          0 :         struct net_device *ndev = NULL;
    1729                 :          0 :         struct ieee80211_sub_if_data *sdata = NULL;
    1730                 :          0 :         struct txq_info *txqi;
    1731                 :          0 :         void (*if_setup)(struct net_device *dev);
    1732                 :          0 :         int ret, i;
    1733                 :          0 :         int txqs = 1;
    1734                 :            : 
    1735   [ #  #  #  # ]:          0 :         ASSERT_RTNL();
    1736                 :            : 
    1737         [ #  # ]:          0 :         if (type == NL80211_IFTYPE_P2P_DEVICE || type == NL80211_IFTYPE_NAN) {
    1738                 :          0 :                 struct wireless_dev *wdev;
    1739                 :            : 
    1740                 :          0 :                 sdata = kzalloc(sizeof(*sdata) + local->hw.vif_data_size,
    1741                 :            :                                 GFP_KERNEL);
    1742         [ #  # ]:          0 :                 if (!sdata)
    1743                 :            :                         return -ENOMEM;
    1744                 :          0 :                 wdev = &sdata->wdev;
    1745                 :            : 
    1746                 :          0 :                 sdata->dev = NULL;
    1747                 :          0 :                 strlcpy(sdata->name, name, IFNAMSIZ);
    1748                 :          0 :                 ieee80211_assign_perm_addr(local, wdev->address, type);
    1749                 :          0 :                 memcpy(sdata->vif.addr, wdev->address, ETH_ALEN);
    1750                 :            :         } else {
    1751                 :          0 :                 int size = ALIGN(sizeof(*sdata) + local->hw.vif_data_size,
    1752                 :            :                                  sizeof(void *));
    1753                 :          0 :                 int txq_size = 0;
    1754                 :            : 
    1755   [ #  #  #  # ]:          0 :                 if (local->ops->wake_tx_queue &&
    1756         [ #  # ]:          0 :                     type != NL80211_IFTYPE_AP_VLAN &&
    1757                 :          0 :                     (type != NL80211_IFTYPE_MONITOR ||
    1758         [ #  # ]:          0 :                      (params->flags & MONITOR_FLAG_ACTIVE)))
    1759                 :          0 :                         txq_size += sizeof(struct txq_info) +
    1760                 :          0 :                                     local->hw.txq_data_size;
    1761                 :            : 
    1762         [ #  # ]:          0 :                 if (local->ops->wake_tx_queue) {
    1763                 :            :                         if_setup = ieee80211_if_setup_no_queue;
    1764                 :            :                 } else {
    1765                 :          0 :                         if_setup = ieee80211_if_setup;
    1766         [ #  # ]:          0 :                         if (local->hw.queues >= IEEE80211_NUM_ACS)
    1767                 :          0 :                                 txqs = IEEE80211_NUM_ACS;
    1768                 :            :                 }
    1769                 :            : 
    1770                 :          0 :                 ndev = alloc_netdev_mqs(size + txq_size,
    1771                 :            :                                         name, name_assign_type,
    1772                 :            :                                         if_setup, txqs, 1);
    1773         [ #  # ]:          0 :                 if (!ndev)
    1774                 :            :                         return -ENOMEM;
    1775                 :          0 :                 dev_net_set(ndev, wiphy_net(local->hw.wiphy));
    1776                 :            : 
    1777   [ #  #  #  # ]:          0 :                 ndev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
    1778         [ #  # ]:          0 :                 if (!ndev->tstats) {
    1779                 :          0 :                         free_netdev(ndev);
    1780                 :          0 :                         return -ENOMEM;
    1781                 :            :                 }
    1782                 :            : 
    1783                 :          0 :                 ndev->needed_headroom = local->tx_headroom +
    1784                 :            :                                         4*6 /* four MAC addresses */
    1785                 :            :                                         + 2 + 2 + 2 + 2 /* ctl, dur, seq, qos */
    1786                 :            :                                         + 6 /* mesh */
    1787                 :            :                                         + 8 /* rfc1042/bridge tunnel */
    1788                 :            :                                         - ETH_HLEN /* ethernet hard_header_len */
    1789                 :          0 :                                         + IEEE80211_ENCRYPT_HEADROOM;
    1790                 :          0 :                 ndev->needed_tailroom = IEEE80211_ENCRYPT_TAILROOM;
    1791                 :            : 
    1792                 :          0 :                 ret = dev_alloc_name(ndev, ndev->name);
    1793         [ #  # ]:          0 :                 if (ret < 0) {
    1794                 :          0 :                         ieee80211_if_free(ndev);
    1795                 :          0 :                         free_netdev(ndev);
    1796                 :          0 :                         return ret;
    1797                 :            :                 }
    1798                 :            : 
    1799                 :          0 :                 ieee80211_assign_perm_addr(local, ndev->perm_addr, type);
    1800   [ #  #  #  # ]:          0 :                 if (is_valid_ether_addr(params->macaddr))
    1801                 :          0 :                         memcpy(ndev->dev_addr, params->macaddr, ETH_ALEN);
    1802                 :            :                 else
    1803                 :          0 :                         memcpy(ndev->dev_addr, ndev->perm_addr, ETH_ALEN);
    1804         [ #  # ]:          0 :                 SET_NETDEV_DEV(ndev, wiphy_dev(local->hw.wiphy));
    1805                 :            : 
    1806                 :            :                 /* don't use IEEE80211_DEV_TO_SUB_IF -- it checks too much */
    1807         [ #  # ]:          0 :                 sdata = netdev_priv(ndev);
    1808                 :          0 :                 ndev->ieee80211_ptr = &sdata->wdev;
    1809                 :          0 :                 memcpy(sdata->vif.addr, ndev->dev_addr, ETH_ALEN);
    1810                 :          0 :                 memcpy(sdata->name, ndev->name, IFNAMSIZ);
    1811                 :            : 
    1812         [ #  # ]:          0 :                 if (txq_size) {
    1813                 :          0 :                         txqi = netdev_priv(ndev) + size;
    1814                 :          0 :                         ieee80211_txq_init(sdata, NULL, txqi, 0);
    1815                 :            :                 }
    1816                 :            : 
    1817                 :          0 :                 sdata->dev = ndev;
    1818                 :            :         }
    1819                 :            : 
    1820                 :            :         /* initialise type-independent data */
    1821                 :          0 :         sdata->wdev.wiphy = local->hw.wiphy;
    1822                 :          0 :         sdata->local = local;
    1823                 :            : 
    1824         [ #  # ]:          0 :         for (i = 0; i < IEEE80211_FRAGMENT_MAX; i++)
    1825                 :          0 :                 skb_queue_head_init(&sdata->fragments[i].skb_list);
    1826                 :            : 
    1827                 :          0 :         INIT_LIST_HEAD(&sdata->key_list);
    1828                 :            : 
    1829                 :          0 :         INIT_DELAYED_WORK(&sdata->dfs_cac_timer_work,
    1830                 :            :                           ieee80211_dfs_cac_timer_work);
    1831                 :          0 :         INIT_DELAYED_WORK(&sdata->dec_tailroom_needed_wk,
    1832                 :            :                           ieee80211_delayed_tailroom_dec);
    1833                 :            : 
    1834         [ #  # ]:          0 :         for (i = 0; i < NUM_NL80211_BANDS; i++) {
    1835                 :          0 :                 struct ieee80211_supported_band *sband;
    1836                 :          0 :                 sband = local->hw.wiphy->bands[i];
    1837                 :          0 :                 sdata->rc_rateidx_mask[i] =
    1838         [ #  # ]:          0 :                         sband ? (1 << sband->n_bitrates) - 1 : 0;
    1839         [ #  # ]:          0 :                 if (sband) {
    1840                 :          0 :                         __le16 cap;
    1841                 :          0 :                         u16 *vht_rate_mask;
    1842                 :            : 
    1843                 :          0 :                         memcpy(sdata->rc_rateidx_mcs_mask[i],
    1844                 :          0 :                                sband->ht_cap.mcs.rx_mask,
    1845                 :            :                                sizeof(sdata->rc_rateidx_mcs_mask[i]));
    1846                 :            : 
    1847                 :          0 :                         cap = sband->vht_cap.vht_mcs.rx_mcs_map;
    1848                 :          0 :                         vht_rate_mask = sdata->rc_rateidx_vht_mcs_mask[i];
    1849                 :          0 :                         ieee80211_get_vht_mask_from_cap(cap, vht_rate_mask);
    1850                 :            :                 } else {
    1851                 :          0 :                         memset(sdata->rc_rateidx_mcs_mask[i], 0,
    1852                 :            :                                sizeof(sdata->rc_rateidx_mcs_mask[i]));
    1853                 :          0 :                         memset(sdata->rc_rateidx_vht_mcs_mask[i], 0,
    1854                 :            :                                sizeof(sdata->rc_rateidx_vht_mcs_mask[i]));
    1855                 :            :                 }
    1856                 :            :         }
    1857                 :            : 
    1858                 :          0 :         ieee80211_set_default_queues(sdata);
    1859                 :            : 
    1860                 :          0 :         sdata->ap_power_level = IEEE80211_UNSET_POWER_LEVEL;
    1861                 :          0 :         sdata->user_power_level = local->user_power_level;
    1862                 :            : 
    1863                 :          0 :         sdata->encrypt_headroom = IEEE80211_ENCRYPT_HEADROOM;
    1864                 :            : 
    1865                 :            :         /* setup type-dependent data */
    1866                 :          0 :         ieee80211_setup_sdata(sdata, type);
    1867                 :            : 
    1868         [ #  # ]:          0 :         if (ndev) {
    1869                 :          0 :                 ndev->ieee80211_ptr->use_4addr = params->use_4addr;
    1870         [ #  # ]:          0 :                 if (type == NL80211_IFTYPE_STATION)
    1871                 :          0 :                         sdata->u.mgd.use_4addr = params->use_4addr;
    1872                 :            : 
    1873                 :          0 :                 ndev->features |= local->hw.netdev_features;
    1874                 :            : 
    1875                 :          0 :                 netdev_set_default_ethtool_ops(ndev, &ieee80211_ethtool_ops);
    1876                 :            : 
    1877                 :            :                 /* MTU range: 256 - 2304 */
    1878                 :          0 :                 ndev->min_mtu = 256;
    1879                 :          0 :                 ndev->max_mtu = local->hw.max_mtu;
    1880                 :            : 
    1881                 :          0 :                 ret = register_netdevice(ndev);
    1882         [ #  # ]:          0 :                 if (ret) {
    1883                 :          0 :                         free_netdev(ndev);
    1884                 :          0 :                         return ret;
    1885                 :            :                 }
    1886                 :            :         }
    1887                 :            : 
    1888                 :          0 :         mutex_lock(&local->iflist_mtx);
    1889                 :          0 :         list_add_tail_rcu(&sdata->list, &local->interfaces);
    1890                 :          0 :         mutex_unlock(&local->iflist_mtx);
    1891                 :            : 
    1892         [ #  # ]:          0 :         if (new_wdev)
    1893                 :          0 :                 *new_wdev = &sdata->wdev;
    1894                 :            : 
    1895                 :            :         return 0;
    1896                 :            : }
    1897                 :            : 
    1898                 :          0 : void ieee80211_if_remove(struct ieee80211_sub_if_data *sdata)
    1899                 :            : {
    1900   [ #  #  #  # ]:          0 :         ASSERT_RTNL();
    1901                 :            : 
    1902                 :          0 :         mutex_lock(&sdata->local->iflist_mtx);
    1903                 :          0 :         list_del_rcu(&sdata->list);
    1904                 :          0 :         mutex_unlock(&sdata->local->iflist_mtx);
    1905                 :            : 
    1906         [ #  # ]:          0 :         if (sdata->vif.txq)
    1907                 :          0 :                 ieee80211_txq_purge(sdata->local, to_txq_info(sdata->vif.txq));
    1908                 :            : 
    1909                 :          0 :         synchronize_rcu();
    1910                 :            : 
    1911         [ #  # ]:          0 :         if (sdata->dev) {
    1912                 :          0 :                 unregister_netdevice(sdata->dev);
    1913                 :            :         } else {
    1914                 :          0 :                 cfg80211_unregister_wdev(&sdata->wdev);
    1915                 :          0 :                 ieee80211_teardown_sdata(sdata);
    1916                 :          0 :                 kfree(sdata);
    1917                 :            :         }
    1918                 :          0 : }
    1919                 :            : 
    1920                 :          0 : void ieee80211_sdata_stop(struct ieee80211_sub_if_data *sdata)
    1921                 :            : {
    1922   [ #  #  #  # ]:          0 :         if (WARN_ON_ONCE(!test_bit(SDATA_STATE_RUNNING, &sdata->state)))
    1923                 :            :                 return;
    1924                 :          0 :         ieee80211_do_stop(sdata, true);
    1925                 :            : }
    1926                 :            : 
    1927                 :          0 : void ieee80211_remove_interfaces(struct ieee80211_local *local)
    1928                 :            : {
    1929                 :          0 :         struct ieee80211_sub_if_data *sdata, *tmp;
    1930                 :          0 :         LIST_HEAD(unreg_list);
    1931                 :          0 :         LIST_HEAD(wdev_list);
    1932                 :            : 
    1933   [ #  #  #  # ]:          0 :         ASSERT_RTNL();
    1934                 :            : 
    1935                 :            :         /* Before destroying the interfaces, make sure they're all stopped so
    1936                 :            :          * that the hardware is stopped. Otherwise, the driver might still be
    1937                 :            :          * iterating the interfaces during the shutdown, e.g. from a worker
    1938                 :            :          * or from RX processing or similar, and if it does so (using atomic
    1939                 :            :          * iteration) while we're manipulating the list, the iteration will
    1940                 :            :          * crash.
    1941                 :            :          *
    1942                 :            :          * After this, the hardware should be stopped and the driver should
    1943                 :            :          * have stopped all of its activities, so that we can do RCU-unaware
    1944                 :            :          * manipulations of the interface list below.
    1945                 :            :          */
    1946                 :          0 :         cfg80211_shutdown_all_interfaces(local->hw.wiphy);
    1947                 :            : 
    1948   [ #  #  #  # ]:          0 :         WARN(local->open_count, "%s: open count remains %d\n",
    1949                 :            :              wiphy_name(local->hw.wiphy), local->open_count);
    1950                 :            : 
    1951                 :          0 :         ieee80211_txq_teardown_flows(local);
    1952                 :            : 
    1953                 :          0 :         mutex_lock(&local->iflist_mtx);
    1954         [ #  # ]:          0 :         list_for_each_entry_safe(sdata, tmp, &local->interfaces, list) {
    1955         [ #  # ]:          0 :                 list_del(&sdata->list);
    1956                 :            : 
    1957         [ #  # ]:          0 :                 if (sdata->dev)
    1958                 :          0 :                         unregister_netdevice_queue(sdata->dev, &unreg_list);
    1959                 :            :                 else
    1960                 :          0 :                         list_add(&sdata->list, &wdev_list);
    1961                 :            :         }
    1962                 :          0 :         mutex_unlock(&local->iflist_mtx);
    1963                 :          0 :         unregister_netdevice_many(&unreg_list);
    1964                 :            : 
    1965         [ #  # ]:          0 :         list_for_each_entry_safe(sdata, tmp, &wdev_list, list) {
    1966                 :          0 :                 list_del(&sdata->list);
    1967                 :          0 :                 cfg80211_unregister_wdev(&sdata->wdev);
    1968                 :          0 :                 kfree(sdata);
    1969                 :            :         }
    1970                 :          0 : }
    1971                 :            : 
    1972                 :         65 : static int netdev_notify(struct notifier_block *nb,
    1973                 :            :                          unsigned long state, void *ptr)
    1974                 :            : {
    1975         [ -  + ]:         65 :         struct net_device *dev = netdev_notifier_info_to_dev(ptr);
    1976                 :         65 :         struct ieee80211_sub_if_data *sdata;
    1977                 :            : 
    1978         [ -  + ]:         65 :         if (state != NETDEV_CHANGENAME)
    1979                 :            :                 return NOTIFY_DONE;
    1980                 :            : 
    1981   [ #  #  #  # ]:          0 :         if (!dev->ieee80211_ptr || !dev->ieee80211_ptr->wiphy)
    1982                 :            :                 return NOTIFY_DONE;
    1983                 :            : 
    1984         [ #  # ]:          0 :         if (dev->ieee80211_ptr->wiphy->privid != mac80211_wiphy_privid)
    1985                 :            :                 return NOTIFY_DONE;
    1986                 :            : 
    1987                 :          0 :         sdata = IEEE80211_DEV_TO_SUB_IF(dev);
    1988                 :          0 :         memcpy(sdata->name, dev->name, IFNAMSIZ);
    1989                 :          0 :         ieee80211_debugfs_rename_netdev(sdata);
    1990                 :            : 
    1991                 :          0 :         return NOTIFY_OK;
    1992                 :            : }
    1993                 :            : 
    1994                 :            : static struct notifier_block mac80211_netdev_notifier = {
    1995                 :            :         .notifier_call = netdev_notify,
    1996                 :            : };
    1997                 :            : 
    1998                 :         13 : int ieee80211_iface_init(void)
    1999                 :            : {
    2000                 :         13 :         return register_netdevice_notifier(&mac80211_netdev_notifier);
    2001                 :            : }
    2002                 :            : 
    2003                 :          0 : void ieee80211_iface_exit(void)
    2004                 :            : {
    2005                 :          0 :         unregister_netdevice_notifier(&mac80211_netdev_notifier);
    2006                 :          0 : }
    2007                 :            : 
    2008                 :          0 : void ieee80211_vif_inc_num_mcast(struct ieee80211_sub_if_data *sdata)
    2009                 :            : {
    2010         [ #  # ]:          0 :         if (sdata->vif.type == NL80211_IFTYPE_AP)
    2011                 :          0 :                 atomic_inc(&sdata->u.ap.num_mcast_sta);
    2012         [ #  # ]:          0 :         else if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
    2013                 :          0 :                 atomic_inc(&sdata->u.vlan.num_mcast_sta);
    2014                 :          0 : }
    2015                 :            : 
    2016                 :          0 : void ieee80211_vif_dec_num_mcast(struct ieee80211_sub_if_data *sdata)
    2017                 :            : {
    2018         [ #  # ]:          0 :         if (sdata->vif.type == NL80211_IFTYPE_AP)
    2019                 :          0 :                 atomic_dec(&sdata->u.ap.num_mcast_sta);
    2020         [ #  # ]:          0 :         else if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
    2021                 :          0 :                 atomic_dec(&sdata->u.vlan.num_mcast_sta);
    2022                 :          0 : }

Generated by: LCOV version 1.14