X-Git-Url: https://git.archive.openwrt.org/?a=blobdiff_plain;f=ubus.c;h=340a8e417110b2cabc4b388d7da1dad1d54009e9;hb=5e43781680f9f55e0ae7c1b681465d64882e3b8c;hp=d24554198897ef6bb713d529e640a76227e93b91;hpb=266d92dd83bd5bfe520f3e2838794bf9bb827c07;p=project%2Fnetifd.git diff --git a/ubus.c b/ubus.c index d245541..340a8e4 100644 --- a/ubus.c +++ b/ubus.c @@ -135,11 +135,11 @@ netifd_add_dynamic(struct ubus_context *ctx, struct ubus_object *obj, const char *name = blobmsg_get_string(tb[DI_NAME]); - iface = calloc(1, sizeof(*iface)); + iface = interface_alloc(name, msg); if (!iface) return UBUS_STATUS_UNKNOWN_ERROR; - interface_init(iface, name, msg, true); + interface_set_dynamic(iface); iface->device_config = true; config = blob_memdup(msg); @@ -441,6 +441,9 @@ interface_ip_dump_address_list(struct interface_ip_settings *ip, bool v6, if (addr->valid_until) blobmsg_add_u32(&b, "valid", addr->valid_until - now); + if (addr->pclass) + blobmsg_add_string(&b, "class", addr->pclass); + blobmsg_close_table(&b, a); } } @@ -488,6 +491,11 @@ interface_ip_dump_route_list(struct interface_ip_settings *ip, bool enabled) if (route->valid_until) blobmsg_add_u32(&b, "valid", route->valid_until - now); + buf = blobmsg_alloc_string_buffer(&b, "source", buflen); + inet_ntop(af, &route->source, buf, buflen); + snprintf(buf + strlen(buf), 4, "/%u", route->sourcemask); + blobmsg_add_string_buffer(&b); + blobmsg_close_table(&b, r); } } @@ -630,7 +638,6 @@ netifd_dump_status(struct interface *iface) struct device *dev; void *a, *inactive; - blobmsg_add_string(&b, "name", iface->name); blobmsg_add_u8(&b, "up", iface->state == IFS_UP); blobmsg_add_u8(&b, "pending", iface->state == IFS_SETUP); blobmsg_add_u8(&b, "available", iface->available); @@ -652,6 +659,7 @@ netifd_dump_status(struct interface *iface) if (iface->state == IFS_UP) { blobmsg_add_u32(&b, "metric", iface->metric); + blobmsg_add_u8(&b, "delegation", !iface->proto_ip.no_delegation); 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); @@ -728,6 +736,7 @@ netifd_handle_status(struct ubus_context *ctx, struct ubus_object *obj, return 0; } + static int netifd_handle_dump(struct ubus_context *ctx, struct ubus_object *obj, struct ubus_request_data *req, const char *method, @@ -739,6 +748,7 @@ netifd_handle_dump(struct ubus_context *ctx, struct ubus_object *obj, struct interface *iface; vlist_for_each_element(&interfaces, iface, node) { void *i = blobmsg_open_table(&b, NULL); + blobmsg_add_string(&b, "interface", iface->name); netifd_dump_status(iface); blobmsg_close_table(&b, i); } @@ -756,9 +766,7 @@ netifd_iface_handle_device(struct ubus_context *ctx, struct ubus_object *obj, { struct blob_attr *tb[__DEV_MAX]; struct interface *iface; - struct device *dev; bool add = !strncmp(method, "add", 3); - int ret; iface = container_of(obj, struct interface, ubus); @@ -767,29 +775,7 @@ netifd_iface_handle_device(struct ubus_context *ctx, struct ubus_object *obj, if (!tb[DEV_NAME]) return UBUS_STATUS_INVALID_ARGUMENT; - device_lock(); - - dev = device_get(blobmsg_data(tb[DEV_NAME]), add ? 2 : 0); - if (!dev) { - ret = UBUS_STATUS_NOT_FOUND; - goto out; - } - - if (add) { - device_set_present(dev, true); - if (iface->device_config) - device_set_config(dev, &simple_device_type, iface->config); - - system_if_apply_settings(dev, &dev->settings); - ret = interface_add_link(iface, dev); - } else { - ret = interface_remove_link(iface, dev); - } - -out: - device_unlock(); - - return ret; + return interface_handle_link(iface, blobmsg_data(tb[DEV_NAME]), add); } @@ -997,6 +983,17 @@ netifd_ubus_interface_event(struct interface *iface, bool up) } void +netifd_ubus_interface_notify(struct interface *iface, bool up) +{ + const char *event = (up) ? "update" : "down"; + blob_buf_init(&b, 0); + blobmsg_add_string(&b, "interface", iface->name); + netifd_dump_status(iface); + ubus_notify(ctx, &iface_object, event, b.head, -1); + ubus_notify(ctx, &iface->ubus, event, b.head, -1); +} + +void netifd_ubus_add_interface(struct interface *iface) { struct ubus_object *obj = &iface->ubus;