def clean_up(self): if self.io_watch is not None: GLib.source_remove(self.io_watch) self.io_watch = None if self.wpa_supplicant is not None: ctx.stop_process(self.wpa_supplicant) self.wpa_supplicant = None
def clean_up(self): if self.io_watch is not None: GLib.source_remove(self.io_watch) self.io_watch = None if self.wpa_supplicant is not None: ctx.stop_process(self.wpa_supplicant) self.wpa_supplicant = None for path in self.cleanup_paths: if os.path.exists(path): os.remove(path) self.cleanup_paths = []
def _del_hostapd(self, force=False): if not self.ctrl_sock: return self.ctrl_sock.close() os.remove(self.local_ctrl) if self._hostapd_restarted: ctx.stop_process(ctx.hostapd.process, force) self.interface.set_interface_state('down') self.interface.set_interface_state('up')
def test_connection_success(self): env = os.environ.copy() env['STATE_DIRECTORY'] = '/tmp/ead' p = ctx.start_process(['ead', '-i', 'eth1', '-d'], env=env) ead = EAD() adapter = ead.list_adapters(1)[0] condition = 'obj.connected == True' ead.wait_for_object_condition(adapter, condition) condition = 'obj.authenticated == True' ead.wait_for_object_condition(adapter, condition) ctx.stop_process(p)
def p2p_client_test(self, preauthorize): wpas = Wpas(p2p=True) wd = IWD() # Not strictly necessary but prevents the station interface from queuing its scans # in the wiphy radio work queue and delaying P2P scans. wd.list_devices(1)[0].disconnect() devices = wd.list_p2p_devices(1) p2p = devices[0] p2p.enabled = True p2p.name = 'testdev1' wpas.p2p_find() p2p.discovery_request = True wd.wait(5) wd.wait_for_object_condition(wpas, 'len(obj.p2p_peers) == 1', max_wait=20) p2p.discovery_request = False wpas.p2p_listen() peers = p2p.get_peers() self.assertEqual(len(peers), 1) peer = next(iter(peers.values())) self.assertEqual(peer.name, wpas.config['device_name']) self.assertEqual(peer.category, 'display') self.assertEqual(peer.subcategory, 'monitor') wpas_peer = next(iter(wpas.p2p_peers.values())) self.assertEqual(wpas_peer['name'], p2p.name) self.assertEqual(wpas_peer['pri_dev_type'], '1-0050F204-6') # 1 == Computer, 6 == Desktop self.assertEqual(wpas_peer['config_methods'], '0x1080') if preauthorize: wpas.p2p_authorize(wpas_peer) peer.connect(wait=False) self.assertEqual(len(wpas.p2p_go_neg_requests), 0) self.assertEqual(len(wpas.p2p_clients), 0) wd.wait_for_object_condition(wpas, 'len(obj.p2p_go_neg_requests) == 1', max_wait=3) request = wpas.p2p_go_neg_requests[wpas_peer['p2p_dev_addr']] if not preauthorize: self.assertEqual(request['dev_passwd_id'], '4') self.assertEqual(request['go_intent'], '2') # Hardcoded in src/p2p.c wpas.p2p_accept_go_neg_request(request) wd.wait_for_object_condition(request, '\'success\' in obj', max_wait=3) self.assertEqual(request['success'], True) self.assertEqual(request['role'], 'GO') self.assertEqual(request['wps_method'], 'PBC') self.assertEqual(request['p2p_dev_addr'], wpas_peer['p2p_dev_addr']) wd.wait_for_object_condition(wpas, 'obj.p2p_group is not None', max_wait=3) go_ifname = wpas.p2p_group['ifname'] ctx.start_process([ 'ifconfig', go_ifname, '192.168.1.20', 'netmask', '255.255.255.0' ], wait=True) os.system('> /tmp/dhcpd.leases') dhcpd = ctx.start_process([ 'dhcpd', '-f', '-cf', '/tmp/dhcpd.conf', '-lf', '/tmp/dhcpd.leases', go_ifname ]) wd.wait_for_object_condition(wpas, 'len(obj.p2p_clients) == 1', max_wait=3) client = wpas.p2p_clients[request['peer_iface']] self.assertEqual(client['p2p_dev_addr'], wpas_peer['p2p_dev_addr']) wd.wait_for_object_condition(peer, 'obj.connected', max_wait=15) our_ip = netifaces.ifaddresses( peer.connected_interface)[netifaces.AF_INET][0]['addr'] self.assertEqual(peer.connected_ip, '192.168.1.20') self.assertEqual(our_ip, '192.168.1.30') testutil.test_iface_operstate(peer.connected_interface) testutil.test_ifaces_connected(peer.connected_interface, go_ifname) peer.disconnect() wd.wait_for_object_condition(wpas, 'len(obj.p2p_clients) == 0', max_wait=3) self.assertEqual(peer.connected, False) p2p.enabled = False ctx.stop_process(dhcpd) wpas.clean_up()
def tearDownClass(cls): IWD.clear_storage() ctx.stop_process(cls.dhcpd_pid) cls.dhcpd_pid = None os.remove('/tmp/dhcpd.leases')
def p2p_connect_test(self, preauthorize, go): wd = IWD() wpas = Wpas(p2p=True) wpas_go_intent = 10 if not go else 1 # Not strictly necessary but prevents the station interface from queuing its scans # in the wiphy radio work queue and delaying P2P scans. wd.list_devices(1)[0].disconnect() devices = wd.list_p2p_devices(1) p2p = devices[0] p2p.enabled = True p2p.name = 'testdev1' wpas.p2p_find() p2p.discovery_request = True wd.wait(5) wd.wait_for_object_condition(wpas, 'len(obj.p2p_peers) == 1', max_wait=20) p2p.discovery_request = False wpas.p2p_listen() peers = p2p.get_peers() self.assertEqual(len(peers), 1) peer = next(iter(peers.values())) self.assertEqual(peer.name, wpas.config['device_name']) self.assertEqual(peer.category, 'display') self.assertEqual(peer.subcategory, 'monitor') wpas_peer = next(iter(wpas.p2p_peers.values())) self.assertEqual(wpas_peer['name'], p2p.name) self.assertEqual(wpas_peer['pri_dev_type'], '1-0050F204-6') # 1 == Computer, 6 == Desktop self.assertEqual(wpas_peer['config_methods'], '0x1080') if preauthorize: wpas.p2p_authorize(wpas_peer, go_intent=wpas_go_intent) peer.connect(wait=False) self.assertEqual(len(wpas.p2p_go_neg_requests), 0) self.assertEqual(len(wpas.p2p_clients), 0) wd.wait_for_object_condition(wpas, 'len(obj.p2p_go_neg_requests) == 1', max_wait=3) request = wpas.p2p_go_neg_requests[wpas_peer['p2p_dev_addr']] if not preauthorize: self.assertEqual(request['dev_passwd_id'], '4') self.assertEqual(request['go_intent'], '2') # Hardcoded in src/p2p.c wpas.p2p_accept_go_neg_request(request, go_intent=wpas_go_intent) wd.wait_for_object_condition(request, '\'success\' in obj', max_wait=3) self.assertEqual(request['success'], True) self.assertEqual(request['role'], 'GO' if not go else 'client') self.assertEqual(request['wps_method'], 'PBC') self.assertEqual(request['p2p_dev_addr'], wpas_peer['p2p_dev_addr']) if go: # For some reason wpa_supplicant's newly created P2P-client interface doesn't inherit # the settings from the main interface which were loaded from the config file # (P2P-device and P2P-GO interfaces do), we need to set config_methods again. peer_ifname = 'p2p-' + wpas.interface.name + '-0' wpas.set('config_methods', wpas.config['config_methods'], ifname=peer_ifname) wpas.set('device_name', wpas.config['device_name'], ifname=peer_ifname) wpas.set('device_type', wpas.config['device_type'], ifname=peer_ifname) wd.wait_for_object_condition(wpas, 'obj.p2p_group is not None', max_wait=3) peer_ifname = wpas.p2p_group['ifname'] if not go: ctx.start_process([ 'ifconfig', peer_ifname, '192.168.1.20', 'netmask', '255.255.255.0' ], wait=True) os.system('> /tmp/dhcpd.leases') dhcp = ctx.start_process([ 'dhcpd', '-f', '-cf', '/tmp/dhcpd.conf', '-lf', '/tmp/dhcpd.leases', peer_ifname ]) wd.wait_for_object_condition(wpas, 'len(obj.p2p_clients) == 1', max_wait=3) client = wpas.p2p_clients[request['peer_iface']] self.assertEqual(client['p2p_dev_addr'], wpas_peer['p2p_dev_addr']) else: dhcp = ctx.start_process([ 'dhclient', '-v', '-d', '--no-pid', '-cf', '/dev/null', '-lf', '/tmp/dhcpd.leases', '-sf', '/tmp/dhclient-script', peer_ifname ]) wd.wait_for_object_condition(peer, 'obj.connected', max_wait=15) time.sleep(1) # Give the client time to set the IP our_ip = netifaces.ifaddresses( peer.connected_interface)[netifaces.AF_INET][0]['addr'] peer_ip = netifaces.ifaddresses(peer_ifname)[ netifaces.AF_INET][0]['addr'] self.assertEqual(peer.connected_ip, peer_ip) if not go: self.assertEqual(our_ip, '192.168.1.30') self.assertEqual(peer_ip, '192.168.1.20') else: self.assertEqual(our_ip, '192.168.1.1') self.assertEqual(peer_ip, '192.168.1.2') testutil.test_iface_operstate(peer.connected_interface) testutil.test_ifaces_connected(peer.connected_interface, peer_ifname) peer.disconnect() if not go: wd.wait_for_object_condition(wpas, 'len(obj.p2p_clients) == 0', max_wait=3) else: wd.wait_for_object_condition(wpas, 'obj.p2p_group is None', max_wait=3) self.assertEqual(peer.connected, False) p2p.enabled = False ctx.stop_process(dhcp) wpas.clean_up()