X-Git-Url: http://git.openwrt.org/?a=blobdiff_plain;f=src%2Fconfig.c;h=8670efc316d943a74fe26b23e5422d8b94f44b06;hb=f4d38e0a853e933a4da54fde8ec2711b5dc5b741;hp=d6b4e81ab027e8cdbfa1d0784837f4f71afbcb88;hpb=9dd5316deae6402de68ddc8a08d1a6b496101828;p=project%2Fodhcpd.git diff --git a/src/config.c b/src/config.c index d6b4e81..8670efc 100644 --- a/src/config.c +++ b/src/config.c @@ -4,12 +4,14 @@ #include #include #include +#include #include #include #include #include #include +#include #include "odhcpd.h" @@ -50,6 +52,9 @@ enum { IFACE_ATTR_RA_MAXINTERVAL, IFACE_ATTR_RA_LIFETIME, IFACE_ATTR_RA_USELEASETIME, + IFACE_ATTR_RA_REACHABLETIME, + IFACE_ATTR_RA_RETRANSTIME, + IFACE_ATTR_RA_HOPLIMIT, IFACE_ATTR_RA_MTU, IFACE_ATTR_PD_MANAGER, IFACE_ATTR_PD_CER, @@ -89,6 +94,9 @@ static const struct blobmsg_policy iface_attrs[IFACE_ATTR_MAX] = { [IFACE_ATTR_RA_MAXINTERVAL] = { .name = "ra_maxinterval", .type = BLOBMSG_TYPE_INT32 }, [IFACE_ATTR_RA_LIFETIME] = { .name = "ra_lifetime", .type = BLOBMSG_TYPE_INT32 }, [IFACE_ATTR_RA_USELEASETIME] = { .name = "ra_useleasetime", .type = BLOBMSG_TYPE_BOOL }, + [IFACE_ATTR_RA_REACHABLETIME] = { .name = "ra_reachabletime", .type = BLOBMSG_TYPE_INT32 }, + [IFACE_ATTR_RA_RETRANSTIME] = { .name = "ra_retranstime", .type = BLOBMSG_TYPE_INT32 }, + [IFACE_ATTR_RA_HOPLIMIT] = { .name = "ra_hoplimit", .type = BLOBMSG_TYPE_INT32 }, [IFACE_ATTR_RA_MTU] = { .name = "ra_mtu", .type = BLOBMSG_TYPE_INT32 }, [IFACE_ATTR_NDPROXY_ROUTING] = { .name = "ndproxy_routing", .type = BLOBMSG_TYPE_BOOL }, [IFACE_ATTR_NDPROXY_SLAVE] = { .name = "ndproxy_slave", .type = BLOBMSG_TYPE_BOOL }, @@ -197,7 +205,7 @@ static struct interface* get_interface(const char *name) static void set_interface_defaults(struct interface *iface) { - iface->managed = 1; + iface->ra_managed = RA_MANAGED_MFLAG; iface->learn_routes = 1; iface->dhcpv4_leasetime = 43200; iface->ra_maxinterval = 600; @@ -229,6 +237,8 @@ static void close_interface(struct interface *iface) setup_dhcpv4_interface(iface, false); clean_interface(iface); + free(iface->ia_addr); + free(iface->ifname); free(iface); } @@ -378,6 +388,8 @@ err: int config_parse_interface(void *data, size_t len, const char *name, bool overwrite) { struct blob_attr *tb[IFACE_ATTR_MAX], *c; + bool get_addrs = false; + blobmsg_parse(iface_attrs, IFACE_ATTR_MAX, tb, data, len); if (tb[IFACE_ATTR_INTERFACE]) @@ -388,16 +400,18 @@ int config_parse_interface(void *data, size_t len, const char *name, bool overwr struct interface *iface = get_interface(name); if (!iface) { - iface = calloc(1, sizeof(*iface)); + char *iface_name; + + iface = calloc_a(sizeof(*iface), &iface_name, strlen(name) + 1); if (!iface) return -1; - strncpy(iface->name, name, sizeof(iface->name) - 1); + iface->name = strcpy(iface_name, name); set_interface_defaults(iface); list_add(&iface->head, &interfaces); - overwrite = true; + get_addrs = overwrite = true; } const char *ifname = NULL; @@ -409,19 +423,32 @@ int config_parse_interface(void *data, size_t len, const char *name, bool overwr } #ifdef WITH_UBUS - if (overwrite || !iface->ifname[0]) + if (overwrite || !iface->ifname) ifname = ubus_get_ifname(name); #endif - if (!iface->ifname[0] && !ifname) + if (!iface->ifname && !ifname) goto err; - if (ifname) - strncpy(iface->ifname, ifname, sizeof(iface->ifname) - 1); + if (ifname) { + free(iface->ifname); + iface->ifname = strdup(ifname); + + if (!iface->ifname) + goto err; + } if ((iface->ifindex = if_nametoindex(iface->ifname)) <= 0) goto err; + if (get_addrs) { + ssize_t len = odhcpd_get_interface_addresses(iface->ifindex, + true, &iface->ia_addr); + + if (len > 0) + iface->ia_addr_len = len; + } + iface->inuse = true; if ((c = tb[IFACE_ATTR_DYNAMICDHCP])) @@ -594,12 +621,38 @@ int config_parse_interface(void *data, size_t len, const char *name, bool overwr iface->default_router = blobmsg_get_u32(c); if ((c = tb[IFACE_ATTR_RA_MANAGEMENT])) - iface->managed = blobmsg_get_u32(c); + iface->ra_managed = blobmsg_get_u32(c); + + if ((c = tb[IFACE_ATTR_RA_REACHABLETIME])) { + uint32_t ra_reachabletime = blobmsg_get_u32(c); + if (ra_reachabletime > 3600000) + goto err; + + iface->ra_reachabletime = ra_reachabletime; + } + + if ((c = tb[IFACE_ATTR_RA_RETRANSTIME])) { + uint32_t ra_retranstime = blobmsg_get_u32(c); + if (ra_retranstime > 60000) + goto err; + + iface->ra_retranstime = ra_retranstime; + } + + if ((c = tb[IFACE_ATTR_RA_HOPLIMIT])) { + uint32_t ra_hoplimit = blobmsg_get_u32(c); + if (ra_hoplimit > 255) + goto err; + + iface->ra_hoplimit = ra_hoplimit; + } if ((c = tb[IFACE_ATTR_RA_MTU])) { - iface->ra_mtu = blobmsg_get_u32(c); - if (iface->ra_mtu < 1280) + uint32_t ra_mtu = blobmsg_get_u32(c); + if (ra_mtu < 1280 || ra_mtu > 65535) goto err; + + iface->ra_mtu = ra_mtu; } if ((c = tb[IFACE_ATTR_RA_OFFLINK])) @@ -780,7 +833,6 @@ void odhcpd_reload(void) close_interface(i); } - ndp_handle_addr6_dump(); uci_unload(uci, dhcp); uci_free_context(uci); }