X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=ubus.c;h=9a573c6019bfcf15fad4158ea7460c1a813f7a5b;hp=d8c6a4fe411c334a6ddf6d92ac8ca368d3d641a3;hb=07e9b542017c692ee2abe7a8689517b466150944;hpb=fbb4a83633fd935748dd3c26d4fc28821db71cdd diff --git a/ubus.c b/ubus.c index d8c6a4f..9a573c6 100644 --- a/ubus.c +++ b/ubus.c @@ -140,7 +140,6 @@ netifd_add_dynamic(struct ubus_context *ctx, struct ubus_object *obj, if (!iface) return UBUS_STATUS_UNKNOWN_ERROR; - interface_set_dynamic(iface); iface->device_config = true; config = blob_memdup(msg); @@ -149,11 +148,15 @@ netifd_add_dynamic(struct ubus_context *ctx, struct ubus_object *obj, interface_add(iface, config); - // need to look up the interface name again, in case of config update, + // need to look up the interface name again, in case of config update + // the pointer will have changed iface = vlist_find(&interfaces, name, iface, node); if (!iface) return UBUS_STATUS_UNKNOWN_ERROR; + // Set interface as dynamic + interface_set_dynamic(iface); + dev = iface->main_dev.dev; if (!dev || !dev->default_config) return UBUS_STATUS_UNKNOWN_ERROR; @@ -463,6 +466,9 @@ interface_ip_dump_route_list(struct interface_ip_settings *ip, bool enabled) if (route->enabled != enabled) continue; + if ((ip->no_defaultroute == enabled) && !route->mask) + continue; + if ((route->flags & DEVADDR_FAMILY) == DEVADDR_INET4) af = AF_INET; else @@ -480,6 +486,9 @@ interface_ip_dump_route_list(struct interface_ip_settings *ip, bool enabled) inet_ntop(af, &route->nexthop, buf, buflen); blobmsg_add_string_buffer(&b); + if (route->flags & DEVROUTE_TYPE) + blobmsg_add_u32(&b, "type", route->type); + if (route->flags & DEVROUTE_MTU) blobmsg_add_u32(&b, "mtu", route->mtu); @@ -494,7 +503,7 @@ interface_ip_dump_route_list(struct interface_ip_settings *ip, bool enabled) buf = blobmsg_alloc_string_buffer(&b, "source", buflen); inet_ntop(af, &route->source, buf, buflen); - snprintf(buf + strlen(buf), 4, "/%u", route->sourcemask); + snprintf(buf + strlen(buf), buflen - strlen(buf), "/%u", route->sourcemask); blobmsg_add_string_buffer(&b); blobmsg_close_table(&b, r); @@ -647,7 +656,8 @@ netifd_dump_status(struct interface *iface) if (iface->state == IFS_UP) { time_t cur = system_get_rtime(); blobmsg_add_u32(&b, "uptime", cur - iface->start_time); - blobmsg_add_string(&b, "l3_device", iface->l3_dev.dev->ifname); + if (iface->l3_dev.dev) + blobmsg_add_string(&b, "l3_device", iface->l3_dev.dev->ifname); } if (iface->proto_handler) @@ -659,6 +669,25 @@ netifd_dump_status(struct interface *iface) blobmsg_add_string(&b, "device", dev->ifname); if (iface->state == IFS_UP) { + if (iface->updated) { + a = blobmsg_open_array(&b, "updated"); + + if (iface->updated & IUF_ADDRESS) + blobmsg_add_string(&b, NULL, "addresses"); + if (iface->updated & IUF_ROUTE) + blobmsg_add_string(&b, NULL, "routes"); + if (iface->updated & IUF_PREFIX) + blobmsg_add_string(&b, NULL, "prefixes"); + if (iface->updated & IUF_DATA) + blobmsg_add_string(&b, NULL, "data"); + + blobmsg_close_array(&b, a); + } + + if (iface->ip4table) + blobmsg_add_u32(&b, "ip4table", iface->ip4table); + if (iface->ip6table) + blobmsg_add_u32(&b, "ip6table", iface->ip6table); blobmsg_add_u32(&b, "metric", iface->metric); blobmsg_add_u8(&b, "delegation", !iface->proto_ip.no_delegation); a = blobmsg_open_array(&b, "ipv4-address"); @@ -715,11 +744,11 @@ netifd_dump_status(struct interface *iface) a = blobmsg_open_table(&b, "data"); avl_for_each_element(&iface->data, data, node) - blob_put(&b, blob_id(data->data), blob_data(data->data), blob_len(data->data)); + blobmsg_add_blob(&b, data->data); blobmsg_close_table(&b, a); - if (!list_is_empty(&iface->errors)) + if (!list_empty(&iface->errors)) netifd_add_interface_errors(&b, iface); } @@ -983,10 +1012,16 @@ netifd_handle_wdev_up(struct ubus_context *ctx, struct ubus_object *obj, int ret; wdev = get_wdev(msg, &ret); - if (!wdev) + if (ret == UBUS_STATUS_NOT_FOUND) return ret; - wireless_device_set_up(wdev); + if (wdev) { + wireless_device_set_up(wdev); + } else { + vlist_for_each_element(&wireless_devices, wdev, node) + wireless_device_set_up(wdev); + } + return 0; } @@ -999,10 +1034,16 @@ netifd_handle_wdev_down(struct ubus_context *ctx, struct ubus_object *obj, int ret; wdev = get_wdev(msg, &ret); - if (!wdev) + if (ret == UBUS_STATUS_NOT_FOUND) return ret; - wireless_device_set_down(wdev); + if (wdev) { + wireless_device_set_down(wdev); + } else { + vlist_for_each_element(&wireless_devices, wdev, node) + wireless_device_set_down(wdev); + } + return 0; } @@ -1030,6 +1071,29 @@ netifd_handle_wdev_status(struct ubus_context *ctx, struct ubus_object *obj, } static int +netifd_handle_wdev_get_validate(struct ubus_context *ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) +{ + struct wireless_device *wdev; + int ret; + + wdev = get_wdev(msg, &ret); + if (ret == UBUS_STATUS_NOT_FOUND) + return ret; + + blob_buf_init(&b, 0); + if (wdev) { + wireless_device_get_validate(wdev, &b); + } else { + vlist_for_each_element(&wireless_devices, wdev, node) + wireless_device_get_validate(wdev, &b); + } + ubus_send_reply(ctx, req, b.head); + return 0; +} + +static int netifd_handle_wdev_notify(struct ubus_context *ctx, struct ubus_object *obj, struct ubus_request_data *req, const char *method, struct blob_attr *msg) @@ -1049,6 +1113,7 @@ static struct ubus_method wireless_object_methods[] = { { .name = "down", .handler = netifd_handle_wdev_down }, { .name = "status", .handler = netifd_handle_wdev_status }, { .name = "notify", .handler = netifd_handle_wdev_notify }, + { .name = "get_validate", .handler = netifd_handle_wdev_get_validate }, }; static struct ubus_object_type wireless_object_type = @@ -1102,7 +1167,7 @@ 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"; + const char *event = (up) ? "interface.update" : "interface.down"; blob_buf_init(&b, 0); blobmsg_add_string(&b, "interface", iface->name); netifd_dump_status(iface);