Skip to content

Commit 294f129

Browse files
committed
network: configure non-dhcp configs earlier even DUID-UUID is used by DHCP clients
Previously, if DUID-UUID is used, all configurations are configured after networkd gets product uuid of machine. This makes only DHCP clients are delayed, and other configs are configured earlier.
1 parent 4e26a5b commit 294f129

12 files changed

+122
-126
lines changed

src/network/networkd-dhcp-common.c

Lines changed: 43 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -86,27 +86,49 @@ DUID* link_get_duid(Link *link, int family) {
8686
return duid;
8787
}
8888

89-
static int duid_set_uuid(DUID *duid, sd_id128_t uuid) {
90-
assert(duid);
89+
static int link_configure_and_start_dhcp_delayed(Link *link) {
90+
int r;
9191

92-
if (duid->raw_data_len > 0)
92+
assert(link);
93+
94+
if (!IN_SET(link->state, LINK_STATE_CONFIGURING, LINK_STATE_CONFIGURED))
9395
return 0;
9496

95-
if (duid->type != DUID_TYPE_UUID)
96-
return -EINVAL;
97+
if (!link->dhcp_client) {
98+
r = dhcp4_configure(link);
99+
if (r < 0)
100+
return r;
101+
}
102+
103+
if (!link->dhcp6_client) {
104+
r = dhcp6_configure(link);
105+
if (r < 0)
106+
return r;
107+
}
97108

98-
memcpy(&duid->raw_data, &uuid, sizeof(sd_id128_t));
99-
duid->raw_data_len = sizeof(sd_id128_t);
109+
if (!link_has_carrier(link))
110+
return 0;
100111

101-
return 1;
112+
r = dhcp4_start(link);
113+
if (r < 0)
114+
return log_link_warning_errno(link, r, "Failed to start DHCPv4 client: %m");
115+
116+
r = ndisc_start(link);
117+
if (r < 0)
118+
return log_link_warning_errno(link, r, "Failed to start IPv6 Router Discovery: %m");
119+
120+
r = dhcp6_start(link);
121+
if (r < 0)
122+
return log_link_warning_errno(link, r, "Failed to start DHCPv6 client: %m");
123+
124+
return 0;
102125
}
103126

104127
static int get_product_uuid_handler(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {
105128
Manager *manager = userdata;
106129
const sd_bus_error *e;
107130
const void *a;
108131
size_t sz;
109-
DUID *duid;
110132
Link *link;
111133
int r;
112134

@@ -133,26 +155,22 @@ static int get_product_uuid_handler(sd_bus_message *m, void *userdata, sd_bus_er
133155
}
134156

135157
memcpy(&manager->product_uuid, a, sz);
136-
while ((duid = set_steal_first(manager->duids_requesting_uuid)))
137-
(void) duid_set_uuid(duid, manager->product_uuid);
138-
139-
manager->duids_requesting_uuid = set_free(manager->duids_requesting_uuid);
140158

141159
configure:
142-
while ((link = set_steal_first(manager->links_requesting_uuid))) {
143-
link_unref(link);
160+
/* To avoid calling GetProductUUID() bus method so frequently, set the flag below
161+
* even if the method fails. */
162+
manager->has_product_uuid = true;
144163

145-
r = link_configure(link);
164+
while ((link = set_steal_first(manager->links_requesting_uuid))) {
165+
r = link_configure_and_start_dhcp_delayed(link);
146166
if (r < 0)
147167
link_enter_failed(link);
168+
169+
link_unref(link);
148170
}
149171

150172
manager->links_requesting_uuid = set_free(manager->links_requesting_uuid);
151173

152-
/* To avoid calling GetProductUUID() bus method so frequently, set the flag below
153-
* even if the method fails. */
154-
manager->has_product_uuid = true;
155-
156174
return 1;
157175
}
158176

@@ -190,66 +208,22 @@ int manager_request_product_uuid(Manager *m) {
190208
return 0;
191209
}
192210

193-
static bool dhcp4_requires_uuid(Link *link) {
194-
const DUID *duid;
195-
196-
assert(link);
197-
198-
if (!link_dhcp4_enabled(link))
199-
return false;
200-
201-
if (!IN_SET(link->network->dhcp_client_identifier, DHCP_CLIENT_ID_DUID, DHCP_CLIENT_ID_DUID_ONLY))
202-
return false;
203-
204-
duid = link_get_dhcp4_duid(link);
205-
if (duid->type != DUID_TYPE_UUID || duid->raw_data_len != 0)
206-
return false;
207-
208-
return true;
209-
}
210-
211-
static bool dhcp6_requires_uuid(Link *link) {
212-
const DUID *duid;
213-
214-
assert(link);
215-
216-
if (!link_dhcp6_enabled(link) && !link_ipv6_accept_ra_enabled(link))
217-
return false;
218-
219-
duid = link_get_dhcp6_duid(link);
220-
if (duid->type != DUID_TYPE_UUID || duid->raw_data_len != 0)
221-
return false;
222-
223-
return true;
224-
}
225-
226-
static bool link_requires_uuid(Link *link) {
227-
return dhcp4_requires_uuid(link) || dhcp6_requires_uuid(link);
228-
}
229-
230-
int link_configure_duid(Link *link) {
211+
int dhcp_configure_duid(Link *link, DUID *duid) {
231212
Manager *m;
232-
DUID *duid;
233213
int r;
234214

235215
assert(link);
236216
assert(link->manager);
237-
assert(link->network);
217+
assert(duid);
238218

239219
m = link->manager;
240220

241-
if (!link_requires_uuid(link))
221+
if (duid->type != DUID_TYPE_UUID || duid->raw_data_len != 0)
242222
return 1;
243223

244224
if (m->has_product_uuid) {
245-
if (dhcp4_requires_uuid(link)) {
246-
duid = link_get_dhcp4_duid(link);
247-
(void) duid_set_uuid(duid, m->product_uuid);
248-
}
249-
if (dhcp6_requires_uuid(link)) {
250-
duid = link_get_dhcp6_duid(link);
251-
(void) duid_set_uuid(duid, m->product_uuid);
252-
}
225+
memcpy(&duid->raw_data, &m->product_uuid, sizeof(sd_id128_t));
226+
duid->raw_data_len = sizeof(sd_id128_t);
253227
return 1;
254228
}
255229

@@ -266,20 +240,6 @@ int link_configure_duid(Link *link) {
266240
if (r > 0)
267241
link_ref(link);
268242

269-
if (dhcp4_requires_uuid(link)) {
270-
duid = link_get_dhcp4_duid(link);
271-
r = set_ensure_put(&m->duids_requesting_uuid, NULL, duid);
272-
if (r < 0)
273-
return log_oom();
274-
}
275-
276-
if (dhcp6_requires_uuid(link)) {
277-
duid = link_get_dhcp6_duid(link);
278-
r = set_ensure_put(&m->duids_requesting_uuid, NULL, duid);
279-
if (r < 0)
280-
return log_oom();
281-
}
282-
283243
return 0;
284244
}
285245

src/network/networkd-dhcp-common.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ static inline DUID *link_get_dhcp6_duid(Link *link) {
6060
return link_get_duid(link, AF_INET6);
6161
}
6262

63-
int link_configure_duid(Link *link);
63+
int dhcp_configure_duid(Link *link, DUID *duid);
6464
int manager_request_product_uuid(Manager *m);
6565

6666
const char* dhcp_use_domains_to_string(DHCPUseDomains p) _const_;

src/network/networkd-dhcp4.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1284,6 +1284,15 @@ static int dhcp4_set_client_identifier(Link *link) {
12841284
return 0;
12851285
}
12861286

1287+
static int dhcp4_configure_duid(Link *link) {
1288+
assert(link);
1289+
1290+
if (!IN_SET(link->network->dhcp_client_identifier, DHCP_CLIENT_ID_DUID, DHCP_CLIENT_ID_DUID_ONLY))
1291+
return 1;
1292+
1293+
return dhcp_configure_duid(link, link_get_dhcp4_duid(link));
1294+
}
1295+
12871296
static int dhcp4_set_request_address(Link *link) {
12881297
Address *a;
12891298

@@ -1323,6 +1332,10 @@ int dhcp4_configure(Link *link) {
13231332
if (link->dhcp_client)
13241333
return -EBUSY; /* Already configured. */
13251334

1335+
r = dhcp4_configure_duid(link);
1336+
if (r <= 0)
1337+
return r;
1338+
13261339
r = sd_dhcp_client_new(&link->dhcp_client, link->network->dhcp_anonymize);
13271340
if (r < 0)
13281341
return log_link_warning_errno(link, r, "DHCP4 CLIENT: Failed to allocate DHCP4 client: %m");
@@ -1505,6 +1518,20 @@ int dhcp4_update_mac(Link *link) {
15051518
return 0;
15061519
}
15071520

1521+
int dhcp4_start(Link *link) {
1522+
assert(link);
1523+
1524+
if (!link->dhcp_client)
1525+
return 0;
1526+
1527+
if (sd_dhcp_client_is_running(link->dhcp_client) > 0)
1528+
return 0;
1529+
1530+
log_link_debug(link, "Acquiring DHCPv4 lease");
1531+
1532+
return sd_dhcp_client_start(link->dhcp_client);
1533+
}
1534+
15081535
int config_parse_dhcp_max_attempts(
15091536
const char *unit,
15101537
const char *filename,

src/network/networkd-dhcp4.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ typedef enum DHCPClientIdentifier {
2020
void network_adjust_dhcp4(Network *network);
2121
int dhcp4_configure(Link *link);
2222
int dhcp4_update_mac(Link *link);
23+
int dhcp4_start(Link *link);
2324

2425
CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_client_identifier);
2526
CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_acl_ip_address);

src/network/networkd-dhcp6.c

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1290,6 +1290,31 @@ int dhcp6_request_address(Link *link, int ir) {
12901290
return 0;
12911291
}
12921292

1293+
int dhcp6_start(Link *link) {
1294+
assert(link);
1295+
1296+
if (!link->dhcp6_client)
1297+
return 0;
1298+
1299+
if (!link_dhcp6_enabled(link))
1300+
return 0;
1301+
1302+
if (link->network->dhcp6_without_ra == DHCP6_CLIENT_START_MODE_NO)
1303+
return 0;
1304+
1305+
if (!in6_addr_is_link_local(&link->ipv6ll_address)) {
1306+
log_link_debug(link, "IPv6 link-local address is not set, delaying to start DHCPv6 client.");
1307+
return 0;
1308+
}
1309+
1310+
if (sd_dhcp6_client_is_running(link->dhcp6_client) > 0)
1311+
return 0;
1312+
1313+
log_link_debug(link, "Acquiring DHCPv6 lease");
1314+
1315+
return dhcp6_request_address(link, link->network->dhcp6_without_ra == DHCP6_CLIENT_START_MODE_INFORMATION_REQUEST);
1316+
}
1317+
12931318
int dhcp6_request_prefix_delegation(Link *link) {
12941319
Link *l;
12951320

@@ -1460,6 +1485,10 @@ int dhcp6_configure(Link *link) {
14601485
if (link->dhcp6_client)
14611486
return -EBUSY;
14621487

1488+
r = dhcp_configure_duid(link, link_get_dhcp6_duid(link));
1489+
if (r <= 0)
1490+
return r;
1491+
14631492
r = sd_dhcp6_client_new(&client);
14641493
if (r == -ENOMEM)
14651494
return log_oom();

src/network/networkd-dhcp6.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ bool link_dhcp6_pd_is_enabled(Link *link);
3131
int dhcp6_pd_remove(Link *link);
3232
int dhcp6_configure(Link *link);
3333
int dhcp6_update_mac(Link *link);
34+
int dhcp6_start(Link *link);
3435
int dhcp6_request_address(Link *link, int ir);
3536
int dhcp6_request_prefix_delegation(Link *link);
3637

src/network/networkd-link.c

Lines changed: 8 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1177,14 +1177,6 @@ static int link_acquire_ipv6_conf(Link *link) {
11771177

11781178
assert(link);
11791179

1180-
if (link->ndisc) {
1181-
log_link_debug(link, "Discovering IPv6 routers");
1182-
1183-
r = sd_ndisc_start(link->ndisc);
1184-
if (r < 0 && r != -EBUSY)
1185-
return log_link_warning_errno(link, r, "Could not start IPv6 Router Discovery: %m");
1186-
}
1187-
11881180
if (link->radv) {
11891181
assert(link->radv);
11901182
assert(in6_addr_is_link_local(&link->ipv6ll_address));
@@ -1200,18 +1192,13 @@ static int link_acquire_ipv6_conf(Link *link) {
12001192
return log_link_warning_errno(link, r, "Could not start IPv6 Router Advertisement: %m");
12011193
}
12021194

1203-
if (link_dhcp6_enabled(link) && IN_SET(link->network->dhcp6_without_ra,
1204-
DHCP6_CLIENT_START_MODE_INFORMATION_REQUEST,
1205-
DHCP6_CLIENT_START_MODE_SOLICIT)) {
1206-
assert(link->dhcp6_client);
1207-
assert(in6_addr_is_link_local(&link->ipv6ll_address));
1195+
r = ndisc_start(link);
1196+
if (r < 0)
1197+
return log_link_warning_errno(link, r, "Failed to start IPv6 Router Discovery: %m");
12081198

1209-
r = dhcp6_request_address(link, link->network->dhcp6_without_ra == DHCP6_CLIENT_START_MODE_INFORMATION_REQUEST);
1210-
if (r < 0 && r != -EBUSY)
1211-
return log_link_warning_errno(link, r, "Could not acquire DHCPv6 lease: %m");
1212-
else
1213-
log_link_debug(link, "Acquiring DHCPv6 lease");
1214-
}
1199+
r = dhcp6_start(link);
1200+
if (r < 0)
1201+
return log_link_warning_errno(link, r, "Failed to start DHCPv6 client: %m");
12151202

12161203
r = dhcp6_request_prefix_delegation(link);
12171204
if (r < 0)
@@ -1228,11 +1215,9 @@ static int link_acquire_ipv4_conf(Link *link) {
12281215
assert(link->manager->event);
12291216

12301217
if (link->dhcp_client) {
1231-
log_link_debug(link, "Acquiring DHCPv4 lease");
1232-
1233-
r = sd_dhcp_client_start(link->dhcp_client);
1218+
r = dhcp4_start(link);
12341219
if (r < 0)
1235-
return log_link_warning_errno(link, r, "Could not acquire DHCPv4 lease: %m");
1220+
return log_link_warning_errno(link, r, "Failed to start DHCPv4 client: %m");
12361221

12371222
} else if (link->ipv4ll) {
12381223
log_link_debug(link, "Acquiring IPv4 link-local address");
@@ -2252,12 +2237,6 @@ static int link_reconfigure_internal(Link *link, sd_netlink_message *m, bool for
22522237
link_set_state(link, LINK_STATE_INITIALIZED);
22532238
link->activated = false;
22542239

2255-
/* link_configure_duid() returns 0 if it requests product UUID. In that case,
2256-
* link_configure() is called later asynchronously. */
2257-
r = link_configure_duid(link);
2258-
if (r <= 0)
2259-
return r;
2260-
22612240
r = link_configure(link);
22622241
if (r < 0)
22632242
return r;
@@ -2372,12 +2351,6 @@ static int link_initialized_and_synced(Link *link) {
23722351
if (r < 0)
23732352
return r;
23742353

2375-
/* link_configure_duid() returns 0 if it requests product UUID. In that case,
2376-
* link_configure() is called later asynchronously. */
2377-
r = link_configure_duid(link);
2378-
if (r <= 0)
2379-
return r;
2380-
23812354
r = link_configure(link);
23822355
if (r < 0)
23832356
return r;

src/network/networkd-manager.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,6 @@ Manager* manager_free(Manager *m) {
452452
m->links_requesting_uuid = set_free_with_destructor(m->links_requesting_uuid, link_unref);
453453
m->links = hashmap_free_with_destructor(m->links, link_unref);
454454

455-
m->duids_requesting_uuid = set_free(m->duids_requesting_uuid);
456455
m->networks = ordered_hashmap_free_with_destructor(m->networks, network_unref);
457456

458457
m->netdevs = hashmap_free_with_destructor(m->netdevs, netdev_unref);

src/network/networkd-manager.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ struct Manager {
5858
bool has_product_uuid;
5959
bool product_uuid_requested;
6060
Set *links_requesting_uuid;
61-
Set *duids_requesting_uuid;
6261

6362
char* dynamic_hostname;
6463
char* dynamic_timezone;

0 commit comments

Comments
 (0)