X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=ubus.c;h=6f7c3e11022a5c5c3390b54a4991398cf1e2cd1d;hp=6c42aa133b34d89bf9982615b65625a15749f31d;hb=6b9c2673173f9636647e021a84d560c0863b1b99;hpb=e46cbd2f89f0be8e4a2423c065cf6b2e6ebcfea3 diff --git a/ubus.c b/ubus.c index 6c42aa1..6f7c3e1 100644 --- a/ubus.c +++ b/ubus.c @@ -44,8 +44,10 @@ netifd_handle_reload(struct ubus_context *ctx, struct ubus_object *obj, struct ubus_request_data *req, const char *method, struct blob_attr *msg) { - netifd_reload(); - return 0; + if (netifd_reload()) + return UBUS_STATUS_UNKNOWN_ERROR; + + return UBUS_STATUS_OK; } enum { @@ -140,8 +142,6 @@ netifd_add_dynamic(struct ubus_context *ctx, struct ubus_object *obj, if (!iface) return UBUS_STATUS_UNKNOWN_ERROR; - iface->device_config = true; - config = blob_memdup(msg); if (!config) goto error; @@ -161,11 +161,6 @@ netifd_add_dynamic(struct ubus_context *ctx, struct ubus_object *obj, if (!dev || !dev->default_config) return UBUS_STATUS_UNKNOWN_ERROR; - device_set_config(dev, dev->type, msg); - - if (iface->state != IFS_SETUP && iface->state != IFS_UP) - vlist_delete(&interfaces, &iface->node); - return UBUS_STATUS_OK; error: @@ -211,7 +206,7 @@ netifd_dev_status(struct ubus_context *ctx, struct ubus_object *obj, blobmsg_parse(dev_policy, __DEV_MAX, tb, blob_data(msg), blob_len(msg)); if (tb[DEV_NAME]) { - dev = device_get(blobmsg_data(tb[DEV_NAME]), false); + dev = device_find(blobmsg_data(tb[DEV_NAME])); if (!dev) return UBUS_STATUS_INVALID_ARGUMENT; } @@ -297,7 +292,7 @@ netifd_handle_set_state(struct ubus_context *ctx, struct ubus_object *obj, if (!cur) return UBUS_STATUS_INVALID_ARGUMENT; - dev = device_get(blobmsg_data(cur), false); + dev = device_find(blobmsg_data(cur)); if (!dev) return UBUS_STATUS_NOT_FOUND; @@ -383,6 +378,19 @@ netifd_handle_down(struct ubus_context *ctx, struct ubus_object *obj, return 0; } +static int +netifd_handle_renew(struct ubus_context *ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) +{ + struct interface *iface; + + iface = container_of(obj, struct interface, ubus); + interface_renew(iface); + + return 0; +} + static void netifd_add_interface_errors(struct blob_buf *b, struct interface *iface) { @@ -409,8 +417,7 @@ netifd_add_interface_errors(struct blob_buf *b, struct interface *iface) } static void -interface_ip_dump_address_list(struct interface_ip_settings *ip, bool v6, - bool enabled) +interface_ip_dump_address_list(struct interface_ip_settings *ip, bool v6, bool enabled) { struct device_addr *addr; char *buf; @@ -493,6 +500,9 @@ interface_ip_dump_route_list(struct interface_ip_settings *ip, bool enabled) if (route->flags & DEVROUTE_TYPE) blobmsg_add_u32(&b, "type", route->type); + if (route->flags & DEVROUTE_PROTO) + blobmsg_add_u32(&b, "proto", route->proto); + if (route->flags & DEVROUTE_MTU) blobmsg_add_u32(&b, "mtu", route->mtu); @@ -607,15 +617,23 @@ interface_ip_dump_prefix_assignment_list(struct interface *iface) if (prefix->valid_until) blobmsg_add_u32(&b, "valid", prefix->valid_until - now); + void *c = blobmsg_open_table(&b, "local-address"); + if (assign->enabled) { + buf = blobmsg_alloc_string_buffer(&b, "address", buflen); + inet_ntop(AF_INET6, &assign->addr, buf, buflen); + blobmsg_add_string_buffer(&b); + + blobmsg_add_u32(&b, "mask", assign->length < 64 ? 64 : assign->length); + } + blobmsg_close_table(&b, c); + blobmsg_close_table(&b, a); } } } - static void -interface_ip_dump_dns_server_list(struct interface_ip_settings *ip, - bool enabled) +interface_ip_dump_dns_server_list(struct interface_ip_settings *ip, bool enabled) { struct dns_server *dns; int buflen = 128; @@ -632,8 +650,7 @@ interface_ip_dump_dns_server_list(struct interface_ip_settings *ip, } static void -interface_ip_dump_dns_search_list(struct interface_ip_settings *ip, - bool enabled) +interface_ip_dump_dns_search_list(struct interface_ip_settings *ip, bool enabled) { struct dns_search_domain *dns; @@ -656,6 +673,7 @@ netifd_dump_status(struct interface *iface) blobmsg_add_u8(&b, "pending", iface->state == IFS_SETUP); blobmsg_add_u8(&b, "available", iface->available); blobmsg_add_u8(&b, "autostart", iface->autostart); + blobmsg_add_u8(&b, "dynamic", iface->dynamic); if (iface->state == IFS_UP) { time_t cur = system_get_rtime(); @@ -668,7 +686,7 @@ netifd_dump_status(struct interface *iface) blobmsg_add_string(&b, "proto", iface->proto_handler->name); dev = iface->main_dev.dev; - if (dev && !dev->hidden && + if (dev && !dev->hidden && iface->proto_handler && !(iface->proto_handler->flags & PROTO_FLAG_NODEV)) blobmsg_add_string(&b, "device", dev->ifname); @@ -691,9 +709,12 @@ netifd_dump_status(struct interface *iface) if (iface->ip4table) blobmsg_add_u32(&b, "ip4table", iface->ip4table); if (iface->ip6table) - blobmsg_add_u32(&b, "ip6table", iface->ip6table); + blobmsg_add_u32(&b, "ip6table", iface->ip6table); blobmsg_add_u32(&b, "metric", iface->metric); + blobmsg_add_u32(&b, "dns_metric", iface->dns_metric); blobmsg_add_u8(&b, "delegation", !iface->proto_ip.no_delegation); + if (iface->assignment_weight) + blobmsg_add_u32(&b, "ip6weight", iface->assignment_weight); a = blobmsg_open_array(&b, "ipv4-address"); interface_ip_dump_address_list(&iface->config_ip, false, true); interface_ip_dump_address_list(&iface->proto_ip, false, true); @@ -793,23 +814,40 @@ netifd_handle_dump(struct ubus_context *ctx, struct ubus_object *obj, return 0; } +enum { + DEV_LINK_NAME, + DEV_LINK_EXT, + __DEV_LINK_MAX, +}; + +static const struct blobmsg_policy dev_link_policy[__DEV_LINK_MAX] = { + [DEV_LINK_NAME] = { .name = "name", .type = BLOBMSG_TYPE_STRING }, + [DEV_LINK_EXT] = { .name = "link-ext", .type = BLOBMSG_TYPE_BOOL }, +}; + static int netifd_iface_handle_device(struct ubus_context *ctx, struct ubus_object *obj, struct ubus_request_data *req, const char *method, struct blob_attr *msg) { - struct blob_attr *tb[__DEV_MAX]; + struct blob_attr *tb[__DEV_LINK_MAX]; + struct blob_attr *cur; struct interface *iface; bool add = !strncmp(method, "add", 3); + bool link_ext = true; iface = container_of(obj, struct interface, ubus); - blobmsg_parse(dev_policy, __DEV_MAX, tb, blob_data(msg), blob_len(msg)); + blobmsg_parse(dev_link_policy, __DEV_LINK_MAX, tb, blob_data(msg), blob_len(msg)); - if (!tb[DEV_NAME]) + if (!tb[DEV_LINK_NAME]) return UBUS_STATUS_INVALID_ARGUMENT; - return interface_handle_link(iface, blobmsg_data(tb[DEV_NAME]), add); + cur = tb[DEV_LINK_EXT]; + if (cur) + link_ext = blobmsg_get_bool(cur); + + return interface_handle_link(iface, blobmsg_data(tb[DEV_LINK_NAME]), add, link_ext); } @@ -880,28 +918,21 @@ netifd_handle_set_data(struct ubus_context *ctx, struct ubus_object *obj, struct blob_attr *msg) { struct interface *iface; - struct blob_attr *cur; - int rem, ret; iface = container_of(obj, struct interface, ubus); - blob_for_each_attr(cur, msg, rem) { - ret = interface_add_data(iface, cur); - if (ret) - return ret; - } - - return 0; + return interface_parse_data(iface, msg); } static struct ubus_method iface_object_methods[] = { { .name = "up", .handler = netifd_handle_up }, { .name = "down", .handler = netifd_handle_down }, + { .name = "renew", .handler = netifd_handle_renew }, { .name = "status", .handler = netifd_handle_status }, { .name = "prepare", .handler = netifd_handle_iface_prepare }, { .name = "dump", .handler = netifd_handle_dump }, - UBUS_METHOD("add_device", netifd_iface_handle_device, dev_policy ), - UBUS_METHOD("remove_device", netifd_iface_handle_device, dev_policy ), + UBUS_METHOD("add_device", netifd_iface_handle_device, dev_link_policy ), + UBUS_METHOD("remove_device", netifd_iface_handle_device, dev_link_policy ), { .name = "notify_proto", .handler = netifd_iface_notify_proto }, { .name = "remove", .handler = netifd_iface_remove }, { .name = "set_data", .handler = netifd_handle_set_data }, @@ -966,6 +997,9 @@ static void netifd_add_iface_object(void) int i; methods = calloc(1, sizeof(iface_object_methods)); + if (!methods) + return; + memcpy(methods, iface_object_methods, sizeof(iface_object_methods)); iface_object.methods = methods;