diff options
-rw-r--r-- | src/dhcpv4.c | 18 | ||||
-rw-r--r-- | src/odhcpd.h | 4 | ||||
-rw-r--r-- | src/ubus.c | 33 |
3 files changed, 32 insertions, 23 deletions
diff --git a/src/dhcpv4.c b/src/dhcpv4.c index 99ad658..07ad3ff 100644 --- a/src/dhcpv4.c +++ b/src/dhcpv4.c @@ -118,14 +118,22 @@ int setup_dhcpv4_interface(struct interface *iface, bool enable) return -1; } + const char* saddr = ubus_get_address4(iface->name); + struct in_addr addr; + inet_pton(AF_INET,saddr, &addr); + int bits = ubus_get_mask4(iface->name); + struct in_addr mask; + if (!(bits < -32 || bits > 32)) { + mask.s_addr = bits ? htonl(~((1 << (32 - abs(bits))) - 1)) : 0; + if (bits < 0) + mask.s_addr = ~mask.s_addr; + } + + // Create a range if not specified if (!(iface->dhcpv4_start.s_addr & htonl(0xffff0000)) && !(iface->dhcpv4_end.s_addr & htonl(0xffff0000))) { - struct in_addr *saddr = ubus_get_address4(iface->name); - struct in_addr addr = { .s_addr = saddr->s_addr } ; - struct in_addr *smask = ubus_get_mask4(iface->name); - struct in_addr mask = { .s_addr = smask->s_addr } ; uint32_t start = ntohl(iface->dhcpv4_start.s_addr); uint32_t end = ntohl(iface->dhcpv4_end.s_addr); @@ -197,8 +205,6 @@ int setup_dhcpv4_interface(struct interface *iface, bool enable) // Clean invalid assignments struct dhcpv4_assignment *a, *n; - struct in_addr *smask = ubus_get_mask4(iface->name); - struct in_addr mask = { .s_addr = smask->s_addr } ; list_for_each_entry_safe(a, n, &iface->dhcpv4_assignments, head) { if ((htonl(a->addr) & mask.s_addr) != (iface->dhcpv4_start.s_addr & mask.s_addr)) { diff --git a/src/odhcpd.h b/src/odhcpd.h index 82ba46b..b8cbeb2 100644 --- a/src/odhcpd.h +++ b/src/odhcpd.h @@ -209,8 +209,8 @@ int init_ubus(void); const char* ubus_get_ifname(const char *name); void ubus_apply_network(void); bool ubus_has_prefix(const char *name, const char *ifname); -struct in_addr* ubus_get_address4(const char *name); -struct in_addr* ubus_get_mask4(const char *name); +const char* ubus_get_address4(const char *name); +int ubus_get_mask4(const char *name); #endif @@ -372,7 +372,7 @@ bool ubus_has_prefix(const char *name, const char *ifname) return false; } -struct in_addr* ubus_get_address4(const char *name) +const char* ubus_get_address4(const char *name) { struct blob_attr *c, *cur; unsigned rem; @@ -395,11 +395,13 @@ struct in_addr* ubus_get_address4(const char *name) struct blob_attr *d; unsigned drem; blobmsg_for_each_attr(d, cur, drem) { - struct blob_attr *addr[ADDR_ATTR_MAX]; - blobmsg_parse(addr_attrs, ADDR_ATTR_MAX, addr, blobmsg_data(d), blobmsg_data_len(d)); - struct in_addr *addr4; - if (inet_pton(AF_INET, blobmsg_get_string(addr[ADDR_ATTR_ADDRESS]), &addr4) == 1) - return addr4; + struct blob_attr *ccur; + unsigned ddrem; + struct blob_attr *dict = blobmsg_data(cur); + blobmsg_for_each_attr(ccur, dict, ddrem) { + if (!strcmp(blobmsg_name(ccur), "address")) + return blobmsg_get_string(ccur); + } } } } @@ -407,13 +409,12 @@ struct in_addr* ubus_get_address4(const char *name) return NULL; } -struct in_addr* ubus_get_mask4(const char *name) +int ubus_get_mask4(const char *name) { struct blob_attr *c, *cur; unsigned rem; - if (!dump) - return NULL; + return 0; blobmsg_for_each_attr(c, dump, rem) { struct blob_attr *tb[IFACE_ATTR_MAX]; @@ -430,16 +431,18 @@ struct in_addr* ubus_get_mask4(const char *name) struct blob_attr *d; unsigned drem; blobmsg_for_each_attr(d, cur, drem) { - struct blob_attr *addr[ADDR_ATTR_MAX]; - blobmsg_parse(addr_attrs, ADDR_ATTR_MAX, addr, blobmsg_data(d), blobmsg_data_len(d)); - struct in_addr *addr4; - if (inet_pton(AF_INET, blobmsg_get_string(addr[ADDR_ATTR_MASK]), &addr4) == 1) - return addr4; + struct blob_attr *ccur; + unsigned ddrem; + struct blob_attr *dict = blobmsg_data(cur); + blobmsg_for_each_attr(ccur, dict, ddrem) { + if (!strcmp(blobmsg_name(ccur), "mask")) + return blobmsg_get_u32(ccur); + } } } } - return NULL; + return 0; } int init_ubus(void) |