1 #include <linux/ieee80211.h> 2 #include <linux/export.h> 3 #include <net/cfg80211.h> 4 #include "nl80211.h" 5 #include "core.h" 6 #include "rdev-ops.h" 7 8 /* Default values, timeouts in ms */ 9 #define MESH_TTL 31 10 #define MESH_DEFAULT_ELEMENT_TTL 31 11 #define MESH_MAX_RETR 3 12 #define MESH_RET_T 100 13 #define MESH_CONF_T 100 14 #define MESH_HOLD_T 100 15 16 #define MESH_PATH_TIMEOUT 5000 17 #define MESH_RANN_INTERVAL 5000 18 #define MESH_PATH_TO_ROOT_TIMEOUT 6000 19 #define MESH_ROOT_INTERVAL 5000 20 #define MESH_ROOT_CONFIRMATION_INTERVAL 2000 21 22 /* 23 * Minimum interval between two consecutive PREQs originated by the same 24 * interface 25 */ 26 #define MESH_PREQ_MIN_INT 10 27 #define MESH_PERR_MIN_INT 100 28 #define MESH_DIAM_TRAVERSAL_TIME 50 29 30 #define MESH_RSSI_THRESHOLD 0 31 32 /* 33 * A path will be refreshed if it is used PATH_REFRESH_TIME milliseconds 34 * before timing out. This way it will remain ACTIVE and no data frames 35 * will be unnecessarily held in the pending queue. 36 */ 37 #define MESH_PATH_REFRESH_TIME 1000 38 #define MESH_MIN_DISCOVERY_TIMEOUT (2 * MESH_DIAM_TRAVERSAL_TIME) 39 40 /* Default maximum number of established plinks per interface */ 41 #define MESH_MAX_ESTAB_PLINKS 32 42 43 #define MESH_MAX_PREQ_RETRIES 4 44 45 #define MESH_SYNC_NEIGHBOR_OFFSET_MAX 50 46 47 const struct mesh_config default_mesh_config = { 48 .dot11MeshRetryTimeout = MESH_RET_T, 49 .dot11MeshConfirmTimeout = MESH_CONF_T, 50 .dot11MeshHoldingTimeout = MESH_HOLD_T, 51 .dot11MeshMaxRetries = MESH_MAX_RETR, 52 .dot11MeshTTL = MESH_TTL, 53 .element_ttl = MESH_DEFAULT_ELEMENT_TTL, 54 .auto_open_plinks = true, 55 .dot11MeshMaxPeerLinks = MESH_MAX_ESTAB_PLINKS, 56 .dot11MeshNbrOffsetMaxNeighbor = MESH_SYNC_NEIGHBOR_OFFSET_MAX, 57 .dot11MeshHWMPactivePathTimeout = MESH_PATH_TIMEOUT, 58 .dot11MeshHWMPpreqMinInterval = MESH_PREQ_MIN_INT, 59 .dot11MeshHWMPperrMinInterval = MESH_PERR_MIN_INT, 60 .dot11MeshHWMPnetDiameterTraversalTime = MESH_DIAM_TRAVERSAL_TIME, 61 .dot11MeshHWMPmaxPREQretries = MESH_MAX_PREQ_RETRIES, 62 .path_refresh_time = MESH_PATH_REFRESH_TIME, 63 .min_discovery_timeout = MESH_MIN_DISCOVERY_TIMEOUT, 64 .dot11MeshHWMPRannInterval = MESH_RANN_INTERVAL, 65 .dot11MeshGateAnnouncementProtocol = false, 66 .dot11MeshForwarding = true, 67 .rssi_threshold = MESH_RSSI_THRESHOLD, 68 .ht_opmode = IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED, 69 .dot11MeshHWMPactivePathToRootTimeout = MESH_PATH_TO_ROOT_TIMEOUT, 70 .dot11MeshHWMProotInterval = MESH_ROOT_INTERVAL, 71 .dot11MeshHWMPconfirmationInterval = MESH_ROOT_CONFIRMATION_INTERVAL, 72 }; 73 74 const struct mesh_setup default_mesh_setup = { 75 /* cfg80211_join_mesh() will pick a channel if needed */ 76 .sync_method = IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET, 77 .path_sel_proto = IEEE80211_PATH_PROTOCOL_HWMP, 78 .path_metric = IEEE80211_PATH_METRIC_AIRTIME, 79 .ie = NULL, 80 .ie_len = 0, 81 .is_secure = false, 82 }; 83 84 int __cfg80211_join_mesh(struct cfg80211_registered_device *rdev, 85 struct net_device *dev, 86 struct mesh_setup *setup, 87 const struct mesh_config *conf) 88 { 89 struct wireless_dev *wdev = dev->ieee80211_ptr; 90 int err; 91 92 BUILD_BUG_ON(IEEE80211_MAX_SSID_LEN != IEEE80211_MAX_MESH_ID_LEN); 93 94 ASSERT_WDEV_LOCK(wdev); 95 96 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 97 return -EOPNOTSUPP; 98 99 if (!(rdev->wiphy.flags & WIPHY_FLAG_MESH_AUTH) && 100 setup->is_secure) 101 return -EOPNOTSUPP; 102 103 if (wdev->mesh_id_len) 104 return -EALREADY; 105 106 if (!setup->mesh_id_len) 107 return -EINVAL; 108 109 if (!rdev->ops->join_mesh) 110 return -EOPNOTSUPP; 111 112 if (!setup->chandef.chan) { 113 /* if no channel explicitly given, use preset channel */ 114 setup->chandef = wdev->preset_chandef; 115 } 116 117 if (!setup->chandef.chan) { 118 /* if we don't have that either, use the first usable channel */ 119 enum ieee80211_band band; 120 121 for (band = 0; band < IEEE80211_NUM_BANDS; band++) { 122 struct ieee80211_supported_band *sband; 123 struct ieee80211_channel *chan; 124 int i; 125 126 sband = rdev->wiphy.bands[band]; 127 if (!sband) 128 continue; 129 130 for (i = 0; i < sband->n_channels; i++) { 131 chan = &sband->channels[i]; 132 if (chan->flags & (IEEE80211_CHAN_NO_IBSS | 133 IEEE80211_CHAN_PASSIVE_SCAN | 134 IEEE80211_CHAN_DISABLED | 135 IEEE80211_CHAN_RADAR)) 136 continue; 137 setup->chandef.chan = chan; 138 break; 139 } 140 141 if (setup->chandef.chan) 142 break; 143 } 144 145 /* no usable channel ... */ 146 if (!setup->chandef.chan) 147 return -EINVAL; 148 149 setup->chandef.width = NL80211_CHAN_WIDTH_20_NOHT; 150 setup->chandef.center_freq1 = setup->chandef.chan->center_freq; 151 } 152 153 if (!cfg80211_reg_can_beacon(&rdev->wiphy, &setup->chandef)) 154 return -EINVAL; 155 156 err = cfg80211_can_use_chan(rdev, wdev, setup->chandef.chan, 157 CHAN_MODE_SHARED); 158 if (err) 159 return err; 160 161 err = rdev_join_mesh(rdev, dev, conf, setup); 162 if (!err) { 163 memcpy(wdev->ssid, setup->mesh_id, setup->mesh_id_len); 164 wdev->mesh_id_len = setup->mesh_id_len; 165 wdev->channel = setup->chandef.chan; 166 } 167 168 return err; 169 } 170 171 int cfg80211_join_mesh(struct cfg80211_registered_device *rdev, 172 struct net_device *dev, 173 struct mesh_setup *setup, 174 const struct mesh_config *conf) 175 { 176 struct wireless_dev *wdev = dev->ieee80211_ptr; 177 int err; 178 179 mutex_lock(&rdev->devlist_mtx); 180 wdev_lock(wdev); 181 err = __cfg80211_join_mesh(rdev, dev, setup, conf); 182 wdev_unlock(wdev); 183 mutex_unlock(&rdev->devlist_mtx); 184 185 return err; 186 } 187 188 int cfg80211_set_mesh_channel(struct cfg80211_registered_device *rdev, 189 struct wireless_dev *wdev, 190 struct cfg80211_chan_def *chandef) 191 { 192 int err; 193 194 /* 195 * Workaround for libertas (only!), it puts the interface 196 * into mesh mode but doesn't implement join_mesh. Instead, 197 * it is configured via sysfs and then joins the mesh when 198 * you set the channel. Note that the libertas mesh isn't 199 * compatible with 802.11 mesh. 200 */ 201 if (rdev->ops->libertas_set_mesh_channel) { 202 if (chandef->width != NL80211_CHAN_WIDTH_20_NOHT) 203 return -EINVAL; 204 205 if (!netif_running(wdev->netdev)) 206 return -ENETDOWN; 207 208 err = cfg80211_can_use_chan(rdev, wdev, chandef->chan, 209 CHAN_MODE_SHARED); 210 if (err) 211 return err; 212 213 err = rdev_libertas_set_mesh_channel(rdev, wdev->netdev, 214 chandef->chan); 215 if (!err) 216 wdev->channel = chandef->chan; 217 218 return err; 219 } 220 221 if (wdev->mesh_id_len) 222 return -EBUSY; 223 224 wdev->preset_chandef = *chandef; 225 return 0; 226 } 227 228 void cfg80211_notify_new_peer_candidate(struct net_device *dev, 229 const u8 *macaddr, const u8* ie, u8 ie_len, gfp_t gfp) 230 { 231 struct wireless_dev *wdev = dev->ieee80211_ptr; 232 233 trace_cfg80211_notify_new_peer_candidate(dev, macaddr); 234 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_MESH_POINT)) 235 return; 236 237 nl80211_send_new_peer_candidate(wiphy_to_dev(wdev->wiphy), dev, 238 macaddr, ie, ie_len, gfp); 239 } 240 EXPORT_SYMBOL(cfg80211_notify_new_peer_candidate); 241 242 static int __cfg80211_leave_mesh(struct cfg80211_registered_device *rdev, 243 struct net_device *dev) 244 { 245 struct wireless_dev *wdev = dev->ieee80211_ptr; 246 int err; 247 248 ASSERT_WDEV_LOCK(wdev); 249 250 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 251 return -EOPNOTSUPP; 252 253 if (!rdev->ops->leave_mesh) 254 return -EOPNOTSUPP; 255 256 if (!wdev->mesh_id_len) 257 return -ENOTCONN; 258 259 err = rdev_leave_mesh(rdev, dev); 260 if (!err) { 261 wdev->mesh_id_len = 0; 262 wdev->channel = NULL; 263 } 264 265 return err; 266 } 267 268 int cfg80211_leave_mesh(struct cfg80211_registered_device *rdev, 269 struct net_device *dev) 270 { 271 struct wireless_dev *wdev = dev->ieee80211_ptr; 272 int err; 273 274 wdev_lock(wdev); 275 err = __cfg80211_leave_mesh(rdev, dev); 276 wdev_unlock(wdev); 277 278 return err; 279 } 280