X-Git-Url: http://git.openwrt.org/?a=blobdiff_plain;f=ubus.c;h=b0b7c9a487af5e1d751aa636cad509b1bc90fdf6;hb=HEAD;hp=6166254a9af8cba5a2438a907c0d776f6b5987fe;hpb=916f95cb58604038695347ee41a430d8ca1f0556;p=project%2Fprocd.git diff --git a/ubus.c b/ubus.c index 6166254..b0b7c9a 100644 --- a/ubus.c +++ b/ubus.c @@ -22,21 +22,45 @@ char *ubus_socket = NULL; static struct ubus_context *ctx; static struct uloop_timeout ubus_timer; +static int timeout; +static struct udebug_ubus udebug; + +static void +procd_udebug_cb(struct udebug_ubus *ctx, struct blob_attr *data, bool enabled) +{ + procd_udebug_set_enabled(enabled); +} + +static void reset_timeout(void) +{ + timeout = 50; +} + +static void timeout_retry(void) +{ + uloop_timeout_set(&ubus_timer, timeout); + timeout *= 2; + if (timeout > 1000) + timeout = 1000; +} static void ubus_reconnect_cb(struct uloop_timeout *timeout) { - if (!ubus_reconnect(ctx, ubus_socket)) + if (!ubus_reconnect(ctx, ubus_socket)) { ubus_add_uloop(ctx); - else - uloop_timeout_set(timeout, 2000); + return; + } + + timeout_retry(); } static void ubus_disconnect_cb(struct ubus_context *ctx) { ubus_timer.cb = ubus_reconnect_cb; - uloop_timeout_set(&ubus_timer, 2000); + reset_timeout(); + timeout_retry(); } static void @@ -46,21 +70,27 @@ ubus_connect_cb(struct uloop_timeout *timeout) if (!ctx) { DEBUG(4, "Connection to ubus failed\n"); - uloop_timeout_set(&ubus_timer, 1000); + timeout_retry(); return; } + udebug_ubus_init(&udebug, ctx, "procd", procd_udebug_cb); ctx->connection_lost = ubus_disconnect_cb; + ubus_init_hotplug(ctx); ubus_init_service(ctx); ubus_init_system(ctx); + watch_ubus(ctx); DEBUG(2, "Connected to ubus, id=%08x\n", ctx->local_id); + reset_timeout(); ubus_add_uloop(ctx); + procd_state_ubus_connect(); } void procd_connect_ubus(void) { ubus_timer.cb = ubus_connect_cb; - uloop_timeout_set(&ubus_timer, 1000); + reset_timeout(); + timeout_retry(); }