summaryrefslogtreecommitdiff
path: root/ubus.c
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2012-05-29 02:33:13 +0200
committerFelix Fietkau <nbd@openwrt.org>2012-05-29 02:33:13 +0200
commit3682cabde8ba2e57e700d01ec2db0356edcc9019 (patch)
treeb832e427d2e1d8590b884bd98d72591ffeb026d4 /ubus.c
parent478d49f227dfed9c1b2178107bcb06221956e8f8 (diff)
downloadnetifd-3682cabde8ba2e57e700d01ec2db0356edcc9019.tar.gz
netifd: reconnect to ubus if the connection is lost
Diffstat (limited to 'ubus.c')
-rw-r--r--ubus.c43
1 files changed, 39 insertions, 4 deletions
diff --git a/ubus.c b/ubus.c
index 5e51d3e..b31bc25 100644
--- a/ubus.c
+++ b/ubus.c
@@ -26,6 +26,7 @@
static struct ubus_context *ctx = NULL;
static struct blob_buf b;
static struct netifd_fd ubus_fd;
+static const char *ubus_path;
/* global object */
@@ -202,20 +203,54 @@ static struct ubus_object dev_object = {
.n_methods = ARRAY_SIZE(dev_object_methods),
};
+static void
+netifd_ubus_add_fd(void)
+{
+ ubus_add_uloop(ctx);
+ ubus_fd.fd = ctx->sock.fd;
+ netifd_fd_add(&ubus_fd);
+}
+
+static void
+netifd_ubus_reconnect_timer(struct uloop_timeout *timeout)
+{
+ static struct uloop_timeout retry = {
+ .cb = netifd_ubus_reconnect_timer,
+ };
+ int t = 2;
+
+ if (ubus_reconnect(ctx, ubus_path) != 0) {
+ DPRINTF("failed to reconnect, trying again in %d seconds\n", t);
+ uloop_timeout_set(&retry, t * 1000);
+ return;
+ }
+
+ DPRINTF("reconnected to ubus, new id: %08x\n", ctx->local_id);
+ netifd_ubus_add_fd();
+}
+
+static void
+netifd_ubus_connection_lost(struct ubus_context *ctx)
+{
+ netifd_fd_delete(&ubus_fd);
+ netifd_ubus_reconnect_timer(NULL);
+}
+
int
netifd_ubus_init(const char *path)
{
int ret;
+ uloop_init();
+ ubus_path = path;
+
ctx = ubus_connect(path);
if (!ctx)
return -EIO;
DPRINTF("connected as %08x\n", ctx->local_id);
- uloop_init();
- ubus_add_uloop(ctx);
- ubus_fd.fd = ctx->sock.fd;
- netifd_fd_add(&ubus_fd);
+ ctx->connection_lost = netifd_ubus_connection_lost;
+ netifd_ubus_add_fd();
ret = ubus_add_object(ctx, &main_object);
if (ret)