@@ -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
104127static 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
141159configure :
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
0 commit comments