From: Tom Gundersen Date: Tue, 28 Jan 2014 22:23:31 +0000 (+0100) Subject: sd-dhcp-client/net-util: make netmask_to_prefixlen generic X-Git-Tag: v209~283 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=377a218f876507fb8be9c21ef4121fa2576ec317 sd-dhcp-client/net-util: make netmask_to_prefixlen generic This was originally included in the dhcp-client at my request, but it is not really dhcp-specific and useful outside of it, so let's pull it out. --- diff --git a/src/libsystemd-dhcp/sd-dhcp-client.c b/src/libsystemd-dhcp/sd-dhcp-client.c index 3b7b9f4cc..7e5c36a85 100644 --- a/src/libsystemd-dhcp/sd-dhcp-client.c +++ b/src/libsystemd-dhcp/sd-dhcp-client.c @@ -240,21 +240,6 @@ int sd_dhcp_client_get_hostname(sd_dhcp_client *client, const char **hostname) { return 0; } -int sd_dhcp_client_prefixlen(const struct in_addr *addr) { - int len = 0; - uint32_t mask; - - assert_return(addr, -EADDRNOTAVAIL); - - mask = be32toh(addr->s_addr); - while (mask) { - len++; - mask = mask << 1; - } - - return len; -} - int sd_dhcp_client_get_router(sd_dhcp_client *client, struct in_addr *addr) { assert_return(client, -EINVAL); assert_return(addr, -EINVAL); diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index dec33e88e..f02191831 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -26,6 +26,7 @@ #include "libudev-private.h" #include "util.h" #include "bus-util.h" +#include "net-util.h" int link_new(Manager *manager, struct udev_device *device, Link **ret) { _cleanup_link_free_ Link *link = NULL; @@ -422,7 +423,7 @@ static void dhcp_handler(sd_dhcp_client *client, int event, void *userdata) { struct in_addr address; struct in_addr netmask; struct in_addr gateway; - int prefixlen; + unsigned prefixlen; int r; assert(link); @@ -496,12 +497,7 @@ static void dhcp_handler(sd_dhcp_client *client, int event, void *userdata) { return; } - prefixlen = sd_dhcp_client_prefixlen(&netmask); - if (prefixlen < 0) { - log_warning_link(link, "DHCP error: no prefixlen"); - link_enter_failed(link); - return; - } + prefixlen = net_netmask_to_prefixlen(&netmask); r = sd_dhcp_client_get_router(client, &gateway); if (r < 0) { diff --git a/src/shared/net-util.c b/src/shared/net-util.c index 887dae512..630be18e5 100644 --- a/src/shared/net-util.c +++ b/src/shared/net-util.c @@ -58,6 +58,21 @@ bool net_match_config(const struct ether_addr *match_mac, return 1; } +unsigned net_netmask_to_prefixlen(const struct in_addr *addr) { + unsigned len = 0; + uint32_t mask; + + assert(addr); + + mask = be32toh(addr->s_addr); + while (mask) { + len++; + mask = mask << 1; + } + + return len; +} + int config_parse_ifname(const char *unit, const char *filename, unsigned line, diff --git a/src/shared/net-util.h b/src/shared/net-util.h index c7edfb96f..0ec04db87 100644 --- a/src/shared/net-util.h +++ b/src/shared/net-util.h @@ -22,6 +22,7 @@ #pragma once #include +#include #include bool net_match_config(const struct ether_addr *match_mac, @@ -35,6 +36,8 @@ bool net_match_config(const struct ether_addr *match_mac, const char *dev_type, const char *dev_name); +unsigned net_netmask_to_prefixlen(const struct in_addr *netmask); + int config_parse_hwaddr(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata); diff --git a/src/systemd/sd-dhcp-client.h b/src/systemd/sd-dhcp-client.h index 0f16e9961..e66361193 100644 --- a/src/systemd/sd-dhcp-client.h +++ b/src/systemd/sd-dhcp-client.h @@ -52,7 +52,6 @@ int sd_dhcp_client_set_mac(sd_dhcp_client *client, int sd_dhcp_client_get_address(sd_dhcp_client *client, struct in_addr *addr); int sd_dhcp_client_get_netmask(sd_dhcp_client *client, struct in_addr *addr); -int sd_dhcp_client_prefixlen(const struct in_addr *addr); int sd_dhcp_client_get_router(sd_dhcp_client *client, struct in_addr *addr); int sd_dhcp_client_get_dns(sd_dhcp_client *client, struct in_addr **addr, size_t *addr_size); int sd_dhcp_client_get_mtu(sd_dhcp_client *client, uint16_t *mtu);