def _handle_probe_request(self, wtp, request): """Handle an incoming PROBE_REQUEST message. Args: request, a PROBE_REQUEST message Returns: None """ if not wtp.connection: LOG.info("Probe request from disconnected WTP %s", wtp.addr) self.stream.close() return if not wtp.port(): LOG.info("WTP %s not ready", wtp.addr) return sta = EtherAddress(request.sta) if sta in RUNTIME.lvaps: return if not RUNTIME.is_allowed(sta): return if RUNTIME.is_denied(sta): return ssid = SSID(request.ssid) if request.ssid == b'': LOG.info("Probe request from %s ssid %s", sta, "Broadcast") else: LOG.info("Probe request from %s ssid %s", sta, ssid) # generate list of available SSIDs ssids = set() for tenant in RUNTIME.tenants.values(): if tenant.bssid_type == T_TYPE_SHARED: continue for wtp_in_tenant in tenant.wtps.values(): if wtp.addr == wtp_in_tenant.addr: ssids.add(tenant.tenant_name) if not ssids: LOG.info("No SSIDs available at this WTP") return # spawn new LVAP LOG.info("Spawning new LVAP %s on %s", sta, wtp.addr) net_bssid = generate_bssid(BASE_MAC, sta) lvap = LVAP(sta, net_bssid, net_bssid) lvap.set_ssids(list(ssids)) # set supported band lvap.supported_band = request.supported_band # Check if block is valid incoming = ResourceBlock(wtp, EtherAddress(request.hwaddr), request.channel, request.band) valid = [block for block in wtp.supports if block == incoming] if not valid: LOG.warning("No valid intersection found. Ignoring request.") return # This will trigger an LVAP ADD message (and REMOVE if necessary) lvap.blocks = valid[0] # save LVAP in the runtime RUNTIME.lvaps[sta] = lvap LOG.info("Sending probe response to %s", lvap.addr) self.send_probe_response(lvap, ssid)
def _handle_probe_request(self, wtp, request): """Handle an incoming PROBE_REQUEST message. Args: request, a PROBE_REQUEST message Returns: None """ # Check if block is valid valid = wtp.get_block(request.hwaddr, request.channel, request.band) if not valid: self.log.warning("No valid intersection found. Ignoring request.") return # check is station is in ACL sta = EtherAddress(request.sta) if not RUNTIME.is_allowed(sta): return # Requested BSSID incoming_ssid = SSID(request.ssid) if incoming_ssid == b'': self.log.info("Probe request from %s ssid %s", sta, "Broadcast") else: self.log.info("Probe request from %s ssid %s", sta, incoming_ssid) # generate list of available networks networks = list() for tenant in RUNTIME.tenants.values(): if tenant.bssid_type == T_TYPE_SHARED: continue for wtp_in_tenant in tenant.wtps.values(): if wtp.addr == wtp_in_tenant.addr: bssid = tenant.generate_bssid(sta) ssid = tenant.tenant_name networks.append((bssid, ssid)) if not networks: self.log.info("No Networks available at this WTP") return # If lvap does not exist then create it. Otherwise just refresh list # of networks if sta not in RUNTIME.lvaps: # spawn new LVAP self.log.info("Spawning new LVAP %s on %s", sta, wtp.addr) assoc_id = RUNTIME.assoc_id() lvap = LVAP(sta, assoc_id=assoc_id) lvap.networks = networks lvap.supported_band = request.supported_band # this will trigger an LVAP ADD message lvap.blocks = valid[0] # save LVAP in the runtime RUNTIME.lvaps[sta] = lvap # Send probe response self.send_probe_response(lvap, incoming_ssid) return # Update networks lvap = RUNTIME.lvaps[sta] lvap.networks = networks lvap.commit() # Send probe response if lvap.wtp == wtp: self.send_probe_response(lvap, incoming_ssid)
def _handle_probe_request(self, request): """Handle an incoming PROBE_REQUEST message.""" # Get station sta = EtherAddress(request.sta) # Incoming incoming_ssid = SSID(request.ssid) iface_id = request.iface_id ht_caps = request.flags.ht_caps ht_caps_info = dict(request.ht_caps_info) del ht_caps_info['_io'] msg = "Probe request from %s ssid %s iface_id %u ht_caps %u" if not incoming_ssid: self.log.debug(msg, sta, "Broadcast", iface_id, ht_caps) else: self.log.debug(msg, sta, incoming_ssid, iface_id, ht_caps) # Check is station is in ACL of any networks networks = self.manager.projects_manager.get_available_ssids(sta) if not networks: self.log.debug("No SSID available at this device") return # If lvap does not exist then create it. Otherwise just refresh the # list of available networks if sta not in self.manager.lvaps: # spawn new LVAP self.log.info("Spawning new LVAP %s on %s", sta, self.device.addr) assoc_id = randint(1, 2007) lvap = LVAP(sta, assoc_id=assoc_id) lvap.networks = networks lvap.ht_caps = ht_caps lvap.ht_caps_info = ht_caps_info # this will trigger an LVAP ADD message lvap.blocks = self.device.blocks[request.iface_id] # save LVAP in the runtime self.manager.lvaps[sta] = lvap # Send probe response self.send_probe_response(lvap, incoming_ssid) return lvap = self.manager.lvaps[sta] # If this probe request is not coming from the same interface on which # this LVAP is currenly running then ignore the probe if lvap.blocks[0].block_id != iface_id: return # If LVAP is not running then ignore if not lvap.is_running(): return # Update list of available networks lvap.networks = networks lvap.commit() # Send probe response self.send_probe_response(lvap, incoming_ssid)