@@ -1344,12 +1344,43 @@ static bool dhcp6_enable_prefix_delegation(Link *dhcp6_link) {
13441344 return false;
13451345}
13461346
1347+ static int dhcp6_set_identifier (Link * link , sd_dhcp6_client * client ) {
1348+ const DUID * duid ;
1349+ int r ;
1350+
1351+ assert (link );
1352+ assert (link -> network );
1353+ assert (client );
1354+
1355+ r = sd_dhcp6_client_set_mac (client , (const uint8_t * ) & link -> mac , sizeof (link -> mac ), ARPHRD_ETHER );
1356+ if (r < 0 )
1357+ return r ;
1358+
1359+ if (link -> network -> iaid_set ) {
1360+ r = sd_dhcp6_client_set_iaid (client , link -> network -> iaid );
1361+ if (r < 0 )
1362+ return r ;
1363+ }
1364+
1365+ duid = link_get_duid (link );
1366+ if (duid -> type == DUID_TYPE_LLT && duid -> raw_data_len == 0 )
1367+ r = sd_dhcp6_client_set_duid_llt (client , duid -> llt_time );
1368+ else
1369+ r = sd_dhcp6_client_set_duid (client ,
1370+ duid -> type ,
1371+ duid -> raw_data_len > 0 ? duid -> raw_data : NULL ,
1372+ duid -> raw_data_len );
1373+ if (r < 0 )
1374+ return r ;
1375+
1376+ return 0 ;
1377+ }
1378+
13471379int dhcp6_configure (Link * link ) {
13481380 _cleanup_ (sd_dhcp6_client_unrefp ) sd_dhcp6_client * client = NULL ;
13491381 sd_dhcp6_option * vendor_option ;
13501382 sd_dhcp6_option * send_option ;
13511383 void * request_options ;
1352- const DUID * duid ;
13531384 int r ;
13541385
13551386 assert (link );
@@ -1368,28 +1399,9 @@ int dhcp6_configure(Link *link) {
13681399 if (r < 0 )
13691400 return log_link_error_errno (link , r , "DHCP6 CLIENT: Failed to attach event: %m" );
13701401
1371- r = sd_dhcp6_client_set_mac (client ,
1372- (const uint8_t * ) & link -> mac ,
1373- sizeof (link -> mac ), ARPHRD_ETHER );
1402+ r = dhcp6_set_identifier (link , client );
13741403 if (r < 0 )
1375- return log_link_error_errno (link , r , "DHCP6 CLIENT: Failed to set MAC address: %m" );
1376-
1377- if (link -> network -> iaid_set ) {
1378- r = sd_dhcp6_client_set_iaid (client , link -> network -> iaid );
1379- if (r < 0 )
1380- return log_link_error_errno (link , r , "DHCP6 CLIENT: Failed to set IAID: %m" );
1381- }
1382-
1383- duid = link_get_duid (link );
1384- if (duid -> type == DUID_TYPE_LLT && duid -> raw_data_len == 0 )
1385- r = sd_dhcp6_client_set_duid_llt (client , duid -> llt_time );
1386- else
1387- r = sd_dhcp6_client_set_duid (client ,
1388- duid -> type ,
1389- duid -> raw_data_len > 0 ? duid -> raw_data : NULL ,
1390- duid -> raw_data_len );
1391- if (r < 0 )
1392- return log_link_error_errno (link , r , "DHCP6 CLIENT: Failed to set DUID: %m" );
1404+ return log_link_error_errno (link , r , "DHCP6 CLIENT: Failed to set identifier: %m" );
13931405
13941406 ORDERED_HASHMAP_FOREACH (send_option , link -> network -> dhcp6_client_send_options ) {
13951407 r = sd_dhcp6_client_add_option (client , send_option );
@@ -1472,6 +1484,36 @@ int dhcp6_configure(Link *link) {
14721484 return 0 ;
14731485}
14741486
1487+ int dhcp6_update_mac (Link * link ) {
1488+ bool restart ;
1489+ int r ;
1490+
1491+ assert (link );
1492+
1493+ if (!link -> dhcp6_client )
1494+ return 0 ;
1495+
1496+ restart = sd_dhcp6_client_is_running (link -> dhcp6_client ) > 0 ;
1497+
1498+ if (restart ) {
1499+ r = sd_dhcp6_client_stop (link -> dhcp6_client );
1500+ if (r < 0 )
1501+ return r ;
1502+ }
1503+
1504+ r = dhcp6_set_identifier (link , link -> dhcp6_client );
1505+ if (r < 0 )
1506+ return r ;
1507+
1508+ if (restart ) {
1509+ r = sd_dhcp6_client_start (link -> dhcp6_client );
1510+ if (r < 0 )
1511+ return log_link_warning_errno (link , r , "Could not restart DHCPv6 client: %m" );
1512+ }
1513+
1514+ return 0 ;
1515+ }
1516+
14751517int link_serialize_dhcp6_client (Link * link , FILE * f ) {
14761518 _cleanup_free_ char * duid = NULL ;
14771519 uint32_t iaid ;
0 commit comments