All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/3] autotests: Add a stateless DHCPv6 test case
@ 2022-09-30 14:47 Andrew Zaborowski
  2022-09-30 14:48 ` [PATCH 2/3] station: Handle NETCONFIG_EVENT_FAILED Andrew Zaborowski
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Andrew Zaborowski @ 2022-09-30 14:47 UTC (permalink / raw)
  To: iwd

---
 autotests/testNetconfig/stateless_test.py | 162 ++++++++++++++++++++++
 1 file changed, 162 insertions(+)
 create mode 100644 autotests/testNetconfig/stateless_test.py

diff --git a/autotests/testNetconfig/stateless_test.py b/autotests/testNetconfig/stateless_test.py
new file mode 100644
index 00000000..7f01a12a
--- /dev/null
+++ b/autotests/testNetconfig/stateless_test.py
@@ -0,0 +1,162 @@
+#!/usr/bin/python3
+
+import unittest
+import sys
+
+sys.path.append('../util')
+import iwd
+from iwd import IWD
+from iwd import PSKAgent
+from iwd import NetworkType
+from hostapd import HostapdCLI
+import testutil
+from config import ctx
+import os
+import socket
+
+class Test(unittest.TestCase):
+
+    def test_connection_success(self):
+        def check_addr(device):
+            try:
+                testutil.test_ip_address_match(device.name, '3ffe:501:ffff:100::', 128, 64)
+            except:
+                return False
+
+            return True
+
+        def get_ll_addrs6(ns, ifname):
+            show_ip = ns.start_process(['ip', 'addr', 'show', ifname])
+            show_ip.wait()
+            for l in show_ip.out.split('\n'):
+                if 'inet6 fe80::' in l:
+                    return socket.inet_pton(socket.AF_INET6, l.split(None, 1)[1].split('/', 1)[0])
+            return None
+
+        IWD.copy_to_storage('auto.psk', name='ap-ns1.psk')
+        wd = IWD(True)
+
+        psk_agent = PSKAgent("secret123")
+        wd.register_psk_agent(psk_agent)
+
+        devices = wd.list_devices(1)
+        device = devices[0]
+
+        ordered_network = device.get_ordered_network('ap-ns1')
+
+        self.assertEqual(ordered_network.type, NetworkType.psk)
+
+        condition = 'not obj.connected'
+        wd.wait_for_object_condition(ordered_network.network_object, condition)
+
+        # Give the AP's interface time to set up addresses so that radvd can
+        # reply to our Router Solicitation immediately.
+        ctx.non_block_wait(lambda: False, 3, exception=False)
+
+        ordered_network.network_object.connect()
+
+        condition = 'obj.state == DeviceState.connected'
+        wd.wait_for_object_condition(device, condition)
+
+        testutil.test_iface_operstate()
+
+        ctx.non_block_wait(check_addr, 10, device,
+                            exception=Exception("IPv6 address was not set"))
+
+        # Cannot use test_ifaces_connected() across namespaces (implementation details)
+        testutil.test_ip_connected(('192.168.1.10', ctx), ('192.168.1.1', self.ns1))
+
+        ifname = str(device.name)
+        router_ll_addr = get_ll_addrs6(self.ns1, self.hapd.ifname)
+        expected_routes6 = {
+                # Default router
+                testutil.RouteInfo(gw=router_ll_addr, flags=3, ifname=ifname),
+                # On-link prefixes
+                testutil.RouteInfo(dst=socket.inet_pton(socket.AF_INET6, '3ffe:501:ffff:100::'), plen=64,
+                    flags=1, ifname=ifname),
+                testutil.RouteInfo(dst=socket.inet_pton(socket.AF_INET6, '3ffe:501:ffff:200::'), plen=64,
+                    flags=1, ifname=ifname),
+            }
+        self.maxDiff = None
+        self.assertEqual(expected_routes6, set(testutil.get_routes6(ifname)))
+
+        rclog = open('/tmp/resolvconf.log', 'r')
+        entries = rclog.readlines()
+        rclog.close()
+        expected_rclog = ['-a %s.dns\n' % (ifname,), 'nameserver 192.168.1.2\n',
+                'nameserver 3ffe:501:ffff:100::2\n',
+                '-a %s.domain\n' % (ifname,), 'search test1\n', 'search test2\n']
+        # Every resolvconf -a run overwrites the previous settings.  Check the last six lines
+        # of our log since we care about the end result here.
+        self.assertEqual(expected_rclog, entries[-6:])
+
+        device.disconnect()
+        condition = 'not obj.connected'
+        wd.wait_for_object_condition(ordered_network.network_object, condition)
+        wd.unregister_psk_agent(psk_agent)
+
+    @classmethod
+    def setUpClass(cls):
+        def remove_lease4():
+            try:
+                os.remove('/tmp/dhcpd.leases')
+                os.remove('/tmp/dhcpd.leases~')
+            except:
+                pass
+        def remove_lease6():
+            try:
+                os.remove('/tmp/dhcpd6.leases')
+                os.remove('/tmp/dhcpd6.leases~')
+            except:
+                pass
+
+        cls.ns1 = ctx.get_namespace('ns1')
+        cls.hapd = HostapdCLI('ap-ns1.conf')
+        cls.ns1.start_process(['ip', 'addr','add', '192.168.1.1/17',
+                            'dev', cls.hapd.ifname]).wait()
+        cls.ns1.start_process(['touch', '/tmp/dhcpd.leases']).wait()
+        cls.dhcpd_pid = cls.ns1.start_process(['dhcpd', '-f', '-d', '-cf', '/tmp/dhcpd.conf',
+                                                '-lf', '/tmp/dhcpd.leases',
+                                                cls.hapd.ifname], cleanup=remove_lease4)
+
+        cls.ns1.start_process(['ip', 'addr', 'add', '3ffe:501:ffff:100::1/72',
+                            'dev', cls.hapd.ifname]).wait()
+        cls.ns1.start_process(['touch', '/tmp/dhcpd6.leases']).wait()
+        cls.dhcpd6_pid = cls.ns1.start_process(['dhcpd', '-6', '-f', '-d',
+                                                '-cf', '/tmp/dhcpd-v6.conf',
+                                                '-lf', '/tmp/dhcpd6.leases',
+                                                cls.hapd.ifname], cleanup=remove_lease6)
+        cls.ns1.start_process(['sysctl',
+                                'net.ipv6.conf.' + cls.hapd.ifname + '.forwarding=1']).wait()
+        config = open('/tmp/radvd.conf', 'w')
+        config.write('interface ' + cls.hapd.ifname + ''' {
+            AdvSendAdvert on;
+            AdvManagedFlag off;
+            AdvOtherConfigFlag on;
+            # Test that the prefix with longer lifetime is selected.
+            prefix 3ffe:501:ffff:100::/64 { AdvAutonomous on; AdvPreferredLifetime 3605; };
+            prefix 3ffe:501:ffff:200::/64 { AdvAutonomous on; AdvPreferredLifetime 3600; };
+            DNSSL test1 test2 { AdvDNSSLLifetime 3600; };
+            };''')
+        config.close()
+        cls.radvd_pid = cls.ns1.start_process(['radvd', '-n', '-d5',
+                                                '-p', '/tmp/radvd.pid', '-C', '/tmp/radvd.conf'])
+
+        cls.orig_path = os.environ['PATH']
+        os.environ['PATH'] = '/tmp/test-bin:' + os.environ['PATH']
+        IWD.copy_to_storage('resolvconf', '/tmp/test-bin')
+
+    @classmethod
+    def tearDownClass(cls):
+        IWD.clear_storage()
+        cls.ns1.stop_process(cls.dhcpd_pid)
+        cls.dhcpd_pid = None
+        cls.ns1.stop_process(cls.dhcpd6_pid)
+        cls.dhcpd6_pid = None
+        cls.ns1.stop_process(cls.radvd_pid)
+        cls.radvd_pid = None
+        os.system('rm -rf /tmp/radvd.conf /tmp/test-bin')
+        os.environ['PATH'] = cls.orig_path
+
+if __name__ == '__main__':
+    unittest.main(exit=True)
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 2/3] station: Handle NETCONFIG_EVENT_FAILED
  2022-09-30 14:47 [PATCH 1/3] autotests: Add a stateless DHCPv6 test case Andrew Zaborowski
@ 2022-09-30 14:48 ` Andrew Zaborowski
  2022-10-03 15:33   ` Denis Kenzior
  2022-09-30 14:48 ` [PATCH 3/3] doc: Drop proposed and unimplemented API doc Andrew Zaborowski
  2022-10-04 17:45 ` [PATCH 1/3] autotests: Add a stateless DHCPv6 test case Denis Kenzior
  2 siblings, 1 reply; 6+ messages in thread
From: Andrew Zaborowski @ 2022-09-30 14:48 UTC (permalink / raw)
  To: iwd

If IPv4 setup fails and the netconfig logic gives up, continue as if the
connection had failed at earlier stages so that autoconnect can try the
next available network.
---
 src/station.c | 43 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 43 insertions(+)

diff --git a/src/station.c b/src/station.c
index 6bd66ffc..fdeab7c1 100644
--- a/src/station.c
+++ b/src/station.c
@@ -2101,6 +2101,30 @@ delayed_retry:
 	station_roam_retry(station);
 }
 
+static void station_disconnect_on_error_cb(struct netdev *netdev, bool success,
+					void *user_data)
+{
+	struct station *station = user_data;
+	bool continue_autoconnect;
+
+	station_enter_state(station, STATION_STATE_DISCONNECTED);
+
+	continue_autoconnect = station->state == STATION_STATE_CONNECTING_AUTO;
+
+	if (continue_autoconnect) {
+		if (station_autoconnect_next(station) < 0) {
+			l_debug("Nothing left on autoconnect list");
+			station_enter_state(station,
+					STATION_STATE_AUTOCONNECT_FULL);
+		}
+
+		return;
+	}
+
+	if (station->autoconnect)
+		station_enter_state(station, STATION_STATE_AUTOCONNECT_QUICK);
+}
+
 static void station_netconfig_event_handler(enum netconfig_event event,
 							void *user_data)
 {
@@ -2109,7 +2133,26 @@ static void station_netconfig_event_handler(enum netconfig_event event,
 	switch (event) {
 	case NETCONFIG_EVENT_CONNECTED:
 		station_enter_state(station, STATION_STATE_CONNECTED);
+		break;
+	case NETCONFIG_EVENT_FAILED:
+		if (station->connect_pending) {
+			struct l_dbus_message *reply = dbus_error_failed(
+						station->connect_pending);
+
+			dbus_pending_reply(&station->connect_pending, reply);
+		}
+
+		if (L_IN_SET(station->state, STATION_STATE_CONNECTING,
+				STATION_STATE_CONNECTING_AUTO))
+			network_connect_failed(station->connected_network,
+						false);
+
+		netdev_disconnect(station->netdev,
+					station_disconnect_on_error_cb,
+					station);
+		station_reset_connection_state(station);
 
+		station_enter_state(station, STATION_STATE_DISCONNECTING);
 		break;
 	default:
 		l_error("station: Unsupported netconfig event: %d.", event);
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 3/3] doc: Drop proposed and unimplemented API doc
  2022-09-30 14:47 [PATCH 1/3] autotests: Add a stateless DHCPv6 test case Andrew Zaborowski
  2022-09-30 14:48 ` [PATCH 2/3] station: Handle NETCONFIG_EVENT_FAILED Andrew Zaborowski
@ 2022-09-30 14:48 ` Andrew Zaborowski
  2022-10-03 15:29   ` Denis Kenzior
  2022-10-04 17:45 ` [PATCH 1/3] autotests: Add a stateless DHCPv6 test case Denis Kenzior
  2 siblings, 1 reply; 6+ messages in thread
From: Andrew Zaborowski @ 2022-09-30 14:48 UTC (permalink / raw)
  To: iwd

---
 doc/ip-configuration-api.txt | 47 ------------------------------------
 1 file changed, 47 deletions(-)
 delete mode 100644 doc/ip-configuration-api.txt

diff --git a/doc/ip-configuration-api.txt b/doc/ip-configuration-api.txt
deleted file mode 100644
index 58a522de..00000000
--- a/doc/ip-configuration-api.txt
+++ /dev/null
@@ -1,47 +0,0 @@
-IP Configuration hierarchy
-===============================
-
-Service		net.connman.iwd
-Interface	net.connman.iwd.IPv4Configuration [Experimental]
-Interface	net.connman.iwd.IPv6Configuration [Experimental]
-Object path	/net/connman/iwd/{phy0,phy1,...}/{1,2,...}
-Object path	/net/connman/iwd/{phy0,phy1,...}/p2p_peers/{aa_bb_cc_dd_ee_ff}
-
-The interfaces net.connman.iwd.IPv4Configuration and
-net.connman.iwd.IPv6Configuration currently have the same sets of methods,
-signals and properties.  In station mode, when network configuration is
-enabled there may be one or both interfaces present on a device object in
-connected state depending on if IPv4 and IPv6 addresses have both been
-configured.  In P2P mode only net.connman.iwd.IPv4Configuration is used.
-
-Properties	string Method [readonly]
-
-			Indicates whether the local address was set
-			statically (value "static") or obtained automatically
-			such as through DHCP (value "auto").  Even when the
-			address was obtained from the remote end some
-			configuration bits, such as DNS addresses, may have
-			been overridden locally.
-
-		string Address [readonly]
-
-			Holds the local IP address.
-
-		byte PrefixLength [readonly]
-
-			Holds the prefix-length of the local subnet.  For
-			IPv4 this maps to the netmask.
-
-		string Gateway [readonly, optional]
-
-			Holds the gateway address for the subnet if one
-			exists.
-
-		array(string) DomainNameServers [readonly, optional]
-
-			Holds the list of domain name server addresses
-			configured if any.
-
-		array(string) DomainNames [readonly, optional]
-
-			Holds the network's local domain names if any exist.
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH 3/3] doc: Drop proposed and unimplemented API doc
  2022-09-30 14:48 ` [PATCH 3/3] doc: Drop proposed and unimplemented API doc Andrew Zaborowski
@ 2022-10-03 15:29   ` Denis Kenzior
  0 siblings, 0 replies; 6+ messages in thread
From: Denis Kenzior @ 2022-10-03 15:29 UTC (permalink / raw)
  To: Andrew Zaborowski, iwd

Hi Andrew,

On 9/30/22 09:48, Andrew Zaborowski wrote:
> ---
>   doc/ip-configuration-api.txt | 47 ------------------------------------
>   1 file changed, 47 deletions(-)
>   delete mode 100644 doc/ip-configuration-api.txt
> 

Applied, thanks.

Regards,
-Denis


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 2/3] station: Handle NETCONFIG_EVENT_FAILED
  2022-09-30 14:48 ` [PATCH 2/3] station: Handle NETCONFIG_EVENT_FAILED Andrew Zaborowski
@ 2022-10-03 15:33   ` Denis Kenzior
  0 siblings, 0 replies; 6+ messages in thread
From: Denis Kenzior @ 2022-10-03 15:33 UTC (permalink / raw)
  To: Andrew Zaborowski, iwd

Hi Andrew,

On 9/30/22 09:48, Andrew Zaborowski wrote:
> If IPv4 setup fails and the netconfig logic gives up, continue as if the
> connection had failed at earlier stages so that autoconnect can try the
> next available network.
> ---
>   src/station.c | 43 +++++++++++++++++++++++++++++++++++++++++++
>   1 file changed, 43 insertions(+)
> 

Applied, thanks.

Regards,
-Denis


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/3] autotests: Add a stateless DHCPv6 test case
  2022-09-30 14:47 [PATCH 1/3] autotests: Add a stateless DHCPv6 test case Andrew Zaborowski
  2022-09-30 14:48 ` [PATCH 2/3] station: Handle NETCONFIG_EVENT_FAILED Andrew Zaborowski
  2022-09-30 14:48 ` [PATCH 3/3] doc: Drop proposed and unimplemented API doc Andrew Zaborowski
@ 2022-10-04 17:45 ` Denis Kenzior
  2 siblings, 0 replies; 6+ messages in thread
From: Denis Kenzior @ 2022-10-04 17:45 UTC (permalink / raw)
  To: Andrew Zaborowski, iwd

Hi Andrew,

On 9/30/22 09:47, Andrew Zaborowski wrote:
> ---
>   autotests/testNetconfig/stateless_test.py | 162 ++++++++++++++++++++++
>   1 file changed, 162 insertions(+)
>   create mode 100644 autotests/testNetconfig/stateless_test.py
> 

Applied, thanks.

Regards,
-Denis


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2022-10-04 17:45 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-30 14:47 [PATCH 1/3] autotests: Add a stateless DHCPv6 test case Andrew Zaborowski
2022-09-30 14:48 ` [PATCH 2/3] station: Handle NETCONFIG_EVENT_FAILED Andrew Zaborowski
2022-10-03 15:33   ` Denis Kenzior
2022-09-30 14:48 ` [PATCH 3/3] doc: Drop proposed and unimplemented API doc Andrew Zaborowski
2022-10-03 15:29   ` Denis Kenzior
2022-10-04 17:45 ` [PATCH 1/3] autotests: Add a stateless DHCPv6 test case Denis Kenzior

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.