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.
This commit is contained in:
Tom Gundersen 2014-01-28 23:23:31 +01:00
parent eb0ea358b6
commit 377a218f87
5 changed files with 21 additions and 23 deletions

View file

@ -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);

View file

@ -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) {

View file

@ -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,

View file

@ -22,6 +22,7 @@
#pragma once
#include <netinet/ether.h>
#include <netinet/in.h>
#include <stdbool.h>
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);

View file

@ -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);