ubus: add interface method to trigger renew event
authorMatthias Schiffer <mschiffer@universe-factory.net>
Wed, 12 Apr 2017 17:53:20 +0000 (19:53 +0200)
committerMatthias Schiffer <mschiffer@universe-factory.net>
Sat, 22 Apr 2017 21:37:36 +0000 (23:37 +0200)
Not all topology or connectivity changes may be detected by netifd,
depending on the underlying technology (e.g. VPN software); this adds a way
to explicitly trigger a renew.

Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
Acked-by: Hans Dedecker <dedeckeh@gmail.com>
interface.c
interface.h
ubus.c

index f150f7d877ca210667f27f56eb6127b9f62fc805..593b0490c85d8cc30dd338979aaea6b560e50866 100644 (file)
@@ -1076,6 +1076,15 @@ interface_set_down(struct interface *iface)
        return 0;
 }
 
+int
+interface_renew(struct interface *iface)
+{
+       if (iface->state == IFS_TEARDOWN || iface->state == IFS_DOWN)
+               return -1;
+
+       return interface_proto_event(iface->proto, PROTO_CMD_RENEW, false);
+}
+
 void
 interface_start_pending(void)
 {
index 147232436a8ead3aeecbda3ab87b1fb20bc42d4a..d35fd98a971630d94f231f0364e90d6f617c502b 100644 (file)
@@ -184,6 +184,7 @@ void interface_set_available(struct interface *iface, bool new_state);
 int interface_set_up(struct interface *iface);
 int interface_set_down(struct interface *iface);
 void __interface_set_down(struct interface *iface, bool force);
+int interface_renew(struct interface *iface);
 
 void interface_set_main_dev(struct interface *iface, struct device *dev);
 void interface_set_l3_dev(struct interface *iface, struct device *dev);
diff --git a/ubus.c b/ubus.c
index 945eca17b0d6243953589268ab6a7c6552b5f1bc..6f7c3e11022a5c5c3390b54a4991398cf1e2cd1d 100644 (file)
--- a/ubus.c
+++ b/ubus.c
@@ -378,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)
 {
@@ -914,6 +927,7 @@ netifd_handle_set_data(struct ubus_context *ctx, struct ubus_object *obj,
 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 },