netconfig: Clean up netconfig_get_static{4,6}_address

* make the error handling simpler,
 * make error messages more consistent,
 * validate address families,
 * for IPv4 skip l_rtnl_address_set_noprefixroute()
   as l_netconfig will do this internally as needed.
 * for IPv6 set the default prefix length to 64 as that's going to be
   used for the local prefix route's prefix length and is a more
   practical value.
This commit is contained in:
Andrew Zaborowski 2022-08-29 19:35:55 +02:00 committed by Denis Kenzior
parent b0b1a46779
commit 98ba09562e
1 changed files with 27 additions and 16 deletions

View File

@ -145,7 +145,7 @@ static void netconfig_set_neighbor_entry_cb(int error,
static struct l_rtnl_address *netconfig_get_static4_address(
const struct l_settings *active_settings)
{
struct l_rtnl_address *ifaddr = NULL;
_auto_(l_rtnl_address_free) struct l_rtnl_address *ifaddr = NULL;
L_AUTO_FREE_VAR(char *, ip) = NULL;
L_AUTO_FREE_VAR(char *, netmask) = NULL;
struct in_addr in_addr;
@ -153,13 +153,22 @@ static struct l_rtnl_address *netconfig_get_static4_address(
uint32_t prefix_len;
ip = l_settings_get_string(active_settings, "IPv4", "Address");
if (!ip)
if (unlikely(!ip)) {
l_error("netconfig: Can't load IPv4.Address");
return NULL;
}
if (l_settings_has_key(active_settings, "IPv4", "Netmask") &&
!(netmask = l_settings_get_string(active_settings,
"IPv4",
"Netmask"))) {
l_error("netconfig: Can't load IPv4.Netmask");
return NULL;
}
netmask = l_settings_get_string(active_settings, "IPv4", "Netmask");
if (netmask) {
if (inet_pton(AF_INET, netmask, &in_addr) != 1) {
l_error("netconfig: Can't parse IPv4 Netmask");
l_error("netconfig: Can't parse IPv4.Netmask");
return NULL;
}
@ -167,14 +176,14 @@ static struct l_rtnl_address *netconfig_get_static4_address(
if (ntohl(in_addr.s_addr) !=
util_netmask_from_prefix(prefix_len)) {
l_error("netconfig: Invalid IPv4 Netmask");
l_error("netconfig: Invalid IPv4.Netmask");
return NULL;
}
} else
prefix_len = 24;
ifaddr = l_rtnl_address_new(ip, prefix_len);
if (!ifaddr) {
if (!ifaddr || l_rtnl_address_get_family(ifaddr) != AF_INET) {
l_error("netconfig: Unable to parse IPv4.Address");
return NULL;
}
@ -182,12 +191,10 @@ static struct l_rtnl_address *netconfig_get_static4_address(
broadcast = l_settings_get_string(active_settings, "IPv4", "Broadcast");
if (broadcast && !l_rtnl_address_set_broadcast(ifaddr, broadcast)) {
l_error("netconfig: Unable to parse IPv4.Broadcast");
l_rtnl_address_free(ifaddr);
return NULL;
}
l_rtnl_address_set_noprefixroute(ifaddr, true);
return ifaddr;
return l_steal_ptr(ifaddr);
}
static struct l_rtnl_address *netconfig_get_static6_address(
@ -196,12 +203,14 @@ static struct l_rtnl_address *netconfig_get_static6_address(
L_AUTO_FREE_VAR(char *, ip);
char *p;
char *endp;
struct l_rtnl_address *ret;
uint32_t prefix_len = 128;
_auto_(l_rtnl_address_free) struct l_rtnl_address *ret = NULL;
uint32_t prefix_len = 64;
ip = l_settings_get_string(active_settings, "IPv6", "Address");
if (!ip)
if (unlikely(!ip)) {
l_error("netconfig: Can't load IPv6.Address");
return NULL;
}
p = strrchr(ip, '/');
if (!p)
@ -222,11 +231,13 @@ static struct l_rtnl_address *netconfig_get_static6_address(
no_prefix_len:
ret = l_rtnl_address_new(ip, prefix_len);
if (!ret)
l_error("netconfig: Invalid IPv6 address %s is "
"provided in network configuration file.", ip);
if (!ret || l_rtnl_address_get_family(ret) != AF_INET6) {
l_error("netconfig: Invalid IPv6 address %s provided in "
"network configuration file.", ip);
return NULL;
}
return ret;
return l_steal_ptr(ret);
}
static void netconfig_gateway_to_arp(struct netconfig *netconfig)