diff -uNr nm1/include/public/netmgr.h nm2/include/public/netmgr.h --- nm1/include/public/netmgr.h 2017-09-09 00:36:41.949701415 +0000 +++ nm2/include/public/netmgr.h 2017-09-09 00:37:35.775549798 +0000 @@ -42,6 +42,7 @@ #define NM_ERR_BAD_CONFIG_FILE (NM_BASE_ERROR + 9) #define NM_ERR_WRITE_FAILED (NM_BASE_ERROR + 10) #define NM_ERR_TIME_OUT (NM_BASE_ERROR + 11) +#define NM_ERR_DHCP_TIME_OUT (NM_BASE_ERROR + 12) #define NM_MAX_ERROR (NM_BASE_ERROR + 100) diff -uNr nm1/src/netmgr.c nm2/src/netmgr.c --- nm1/src/netmgr.c 2017-09-09 00:36:41.949701415 +0000 +++ nm2/src/netmgr.c 2017-09-09 00:37:35.779550037 +0000 @@ -106,6 +106,8 @@ return "write failed"; case NM_ERR_TIME_OUT: return "timed out"; + case NM_ERR_DHCP_TIME_OUT: + return "dhcp timed out"; default: return strerror(nmErrCode); } @@ -411,7 +413,7 @@ uint32_t err = 0; size_t ifNameLen, matchLen = 0; char fName[IFNAMSIZ+strlen(SYSTEMD_NET_PATH)+strlen("00-.network")+1]; - char *pszFilename = NULL; + char *pszFilename = NULL, *pszNewFilename = NULL, *pszCmd = NULL; // TODO: IS VALID_INTERFACE_NAME needs to check if device actually exists if (!IS_VALID_INTERFACE_NAME(pszIfName) || !ppszFilename) @@ -430,9 +432,6 @@ ifNameLen = strlen(pszIfName); if ((pszFilename == NULL) || (matchLen < ifNameLen)) { - netmgr_free(pszFilename); - pszFilename = NULL; - sprintf(fName, "%s00-%s.network", SYSTEMD_NET_PATH, pszIfName); if (access(fName, F_OK) == 0) { @@ -441,21 +440,40 @@ bail_on_error(err); } - err = netmgr_alloc_string(fName, &pszFilename); + err = netmgr_alloc_string(fName, &pszNewFilename); bail_on_error(err); - /* Create a conf file dedicated to the interface name */ - err = nm_set_key_value(pszFilename, + /* Create dedicated conf for interface based on best match conf file */ + if (pszFilename != NULL) + { + err = netmgr_alloc_string_printf(&pszCmd, + "/usr/bin/cp -f -p %s %s", + pszFilename, + pszNewFilename); + bail_on_error(err); + + err = nm_run_command(pszCmd); + bail_on_error(err); + } + + err = nm_set_key_value(pszNewFilename, SECTION_MATCH, KEY_NAME, pszIfName, F_CREATE_CFG_FILE); bail_on_error(err); } + else + { + err = netmgr_alloc_string(pszFilename, &pszNewFilename); + bail_on_error(err); + } - *ppszFilename = pszFilename; + *ppszFilename = pszNewFilename; cleanup: + netmgr_free(pszFilename); + netmgr_free(pszCmd); return err; error: @@ -463,7 +481,6 @@ { *ppszFilename = NULL; } - netmgr_free(pszFilename); goto cleanup; } @@ -661,6 +678,12 @@ * Interface configuration APIs */ static uint32_t +nm_update_link_state( + const char *pszInterfaceName, + NET_LINK_STATE linkState +); + +static uint32_t nm_update_mac_address( const char *pszInterfaceName, const char *pszMacAddress @@ -699,7 +722,7 @@ bail_on_error(err); } - err = nm_ifdown(pszInterfaceName); + err = nm_update_link_state(pszInterfaceName, LINK_DOWN); bail_on_error(err); err = ioctl(sockFd, SIOCSIFHWADDR, &ifr); @@ -709,7 +732,7 @@ bail_on_error(err); } - err = nm_ifup(pszInterfaceName); + err = nm_update_link_state(pszInterfaceName, LINK_UP); bail_on_error(err); cleanup: @@ -1033,6 +1056,7 @@ goto cleanup; } + static uint32_t nm_update_link_mtu( const char *pszInterfaceName, @@ -1068,7 +1092,7 @@ ifr.ifr_mtu = DEFAULT_MTU_VALUE; } - err = nm_ifdown(pszInterfaceName); + err = nm_update_link_state(pszInterfaceName, LINK_DOWN); bail_on_error(err); err = ioctl(sockFd, SIOCSIFMTU, &ifr); @@ -1078,7 +1102,7 @@ bail_on_error(err); } - err = nm_ifup(pszInterfaceName); + err = nm_update_link_state(pszInterfaceName, LINK_UP); bail_on_error(err); cleanup: @@ -2506,6 +2530,11 @@ bail_on_error(err); err = nm_get_ipv6_enable(pszInterfaceName, &v6enabled); + if ((err == ENOENT) || (err == NM_ERR_VALUE_NOT_FOUND)) + { + err = 0; + v6enabled = 0; + } bail_on_error(err); if (!v6enabled) @@ -2520,9 +2549,13 @@ bail_on_error(err); err = nm_get_sysctl_procfs_value(pszProcfsAutov6Path, &pszAutov6Value); + if ((err == ENOENT) || (err == NM_ERR_VALUE_NOT_FOUND)) + { + err = 0; + } bail_on_error(err); - if (!strcmp(pszAutov6Value, "1")) + if ((pszAutov6Value != NULL) && !strcmp(pszAutov6Value, "1")) { mode |= fAUTO_IPV6; } @@ -6124,7 +6157,14 @@ } else { - err = NM_ERR_TIME_OUT; + if (TEST_FLAG(addrTypes, DHCP_IPV4) || TEST_FLAG(addrTypes, DHCP_IPV6)) + { + err = NM_ERR_DHCP_TIME_OUT; + } + else + { + err = NM_ERR_TIME_OUT; + } } bail_on_error(err);