From 9975d198a2c02e32c31c3e0f43d2aa79dfa7f508 Mon Sep 17 00:00:00 2001 From: Pavel Zhukov Date: Thu, 28 Feb 2019 15:30:21 +0100 Subject: [PATCH 22/26] dhclient: make sure link-local address is ready in stateless mode Cc: pzhukov@redhat.com Bug-url: https://bugzilla.redhat.com/1263466 --- client/dhclient.c | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/client/dhclient.c b/client/dhclient.c index 4e5546a..9b65438 100644 --- a/client/dhclient.c +++ b/client/dhclient.c @@ -937,6 +937,12 @@ main(int argc, char **argv) { inaddr_any.s_addr = INADDR_ANY; + /* Discover all the network interfaces. */ + discover_interfaces(DISCOVER_UNCONFIGURED); + + /* Parse the dhclient.conf file. */ + read_client_conf(); + /* Stateless special case. */ if (stateless) { if (release_mode || (wanted_ia_na > 0) || @@ -953,12 +959,6 @@ main(int argc, char **argv) { finish(0); } - /* Discover all the network interfaces. */ - discover_interfaces(DISCOVER_UNCONFIGURED); - - /* Parse the dhclient.conf file. */ - read_client_conf(); - /* Parse any extra command line configuration arguments: */ if ((dhcp_client_identifier_arg != NULL) && (*dhcp_client_identifier_arg != '\0')) { arg_conf_len = asprintf(&arg_conf, "send dhcp-client-identifier \"%s\";", dhcp_client_identifier_arg); @@ -1413,20 +1413,30 @@ void run_stateless(int exit_mode, u_int16_t port) IGNORE_UNUSED(port); #endif - /* Discover the network interface. */ - discover_interfaces(DISCOVER_REQUESTED); + struct interface_info *ip; if (!interfaces) usage("No interfaces available for stateless command: %s", "-S"); - /* Parse the dhclient.conf file. */ #ifdef DHCP4o6 if (dhcpv4_over_dhcpv6) { /* Mark we want to request IRT too! */ dhcpv4_over_dhcpv6++; } #endif - read_client_conf(); + + for (ip = interfaces; ip; ip = ip->next) { + if ((interfaces_requested > 0) && + ((ip->flags & (INTERFACE_REQUESTED | + INTERFACE_AUTOMATIC)) != + INTERFACE_REQUESTED)) + continue; + script_init(ip->client, "PREINIT6", NULL); + script_go(ip->client); + } + + /* Discover the network interface. */ + discover_interfaces(DISCOVER_REQUESTED); /* Parse the lease database. */ read_client_leases(); -- 2.14.5