sd-dhcp-lease: use shared default prefixlen function

Also change the default prefixlen function to only access the first octet of the in_addr.
This commit is contained in:
Tom Gundersen
2014-11-01 19:02:44 +01:00
parent bab4792961
commit 1caa12d0a8
3 changed files with 10 additions and 26 deletions
+1 -1
View File
@@ -35,7 +35,7 @@
struct sd_dhcp_route {
struct in_addr dst_addr;
struct in_addr gw_addr;
uint8_t dst_prefixlen;
unsigned char dst_prefixlen;
};
struct sd_dhcp_lease {
+3 -18
View File
@@ -310,23 +310,6 @@ static int lease_parse_in_addrs_pairs(const uint8_t *option, size_t len, struct
return lease_parse_in_addrs_aux(option, len, ret, ret_size, 2);
}
static int class_prefixlen(uint8_t msb_octet, uint8_t *ret) {
if (msb_octet < 128)
/* Class A */
*ret = 8;
else if (msb_octet < 192)
/* Class B */
*ret = 16;
else if (msb_octet < 224)
/* Class C */
*ret = 24;
else
/* Class D or E -- no subnet mask */
return -ERANGE;
return 0;
}
static int lease_parse_routes(const uint8_t *option, size_t len, struct sd_dhcp_route **routes,
size_t *routes_size, size_t *routes_allocated) {
@@ -348,8 +331,10 @@ static int lease_parse_routes(const uint8_t *option, size_t len, struct sd_dhcp_
while (len >= 8) {
struct sd_dhcp_route *route = *routes + *routes_size;
int r;
if (class_prefixlen(*option, &route->dst_prefixlen) < 0) {
r = in_addr_default_prefixlen((struct in_addr*) option, &route->dst_prefixlen);
if (r < 0) {
log_error("Failed to determine destination prefix length from class based IP, ignoring");
continue;
}
+6 -7
View File
@@ -250,21 +250,20 @@ unsigned in_addr_netmask_to_prefixlen(const struct in_addr *addr) {
}
int in_addr_default_prefixlen(const struct in_addr *addr, unsigned char *prefixlen) {
uint32_t address;
uint8_t msb_octet = *(uint8_t*) addr;
/* addr may not be aligned, so make sure we only access it byte-wise */
assert(addr);
assert(addr->s_addr != INADDR_ANY);
assert(prefixlen);
address = be32toh(addr->s_addr);
if ((address >> 31) == 0x0)
if (msb_octet < 128)
/* class A, leading bits: 0 */
*prefixlen = 8;
else if ((address >> 30) == 0x2)
else if (msb_octet < 192)
/* class B, leading bits 10 */
*prefixlen = 16;
else if ((address >> 29) == 0x6)
else if (msb_octet < 224)
/* class C, leading bits 110 */
*prefixlen = 24;
else