X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibsystemd-network%2Fsd-dhcp-lease.c;h=159bb502c87cac8975b510cc963313f55ae0e8ed;hb=7429b07f822348dc5a87208ce107f5f6bf02656d;hp=e6d80d4c665da578971aae46d1e9bf392f9b2875;hpb=0ea51a1129b9984a3c6d96cef1b0e33c99b5e9cf;p=elogind.git diff --git a/src/libsystemd-network/sd-dhcp-lease.c b/src/libsystemd-network/sd-dhcp-lease.c index e6d80d4c6..159bb502c 100644 --- a/src/libsystemd-network/sd-dhcp-lease.c +++ b/src/libsystemd-network/sd-dhcp-lease.c @@ -481,3 +481,29 @@ int dhcp_lease_load(const char *lease_file, sd_dhcp_lease **ret) { return 0; } + +int dhcp_lease_set_default_subnet_mask(sd_dhcp_lease *lease) { + uint32_t address; + + assert(lease); + assert(lease->address != INADDR_ANY); + + address = be32toh(lease->address); + + /* fall back to the default subnet masks based on address class */ + + if ((address >> 31) == 0x0) + /* class A, leading bits: 0 */ + lease->subnet_mask = htobe32(0xff000000); + else if ((address >> 30) == 0x2) + /* class B, leading bits 10 */ + lease->subnet_mask = htobe32(0xffff0000); + else if ((address >> 29) == 0x6) + /* class C, leading bits 110 */ + lease->subnet_mask = htobe32(0xffffff00); + else + /* class D or E, no default mask. give up */ + return -ERANGE; + + return 0; +}