[src/rtnl] Add retry mechanism when socket GIO channel fails 64/245564/5
authorNishant Chaprana <n.chaprana@samsung.com>
Mon, 12 Oct 2020 08:03:23 +0000 (13:33 +0530)
committerNishant Chaprana <n.chaprana@samsung.com>
Mon, 12 Oct 2020 12:02:53 +0000 (17:32 +0530)
Change-Id: I21f1d8c970f1053ce4337dc0d251d2fa20bbd509
Signed-off-by: Nishant Chaprana <n.chaprana@samsung.com>
packaging/connman.spec
src/connman.h
src/main.c
src/rtnl.c

index c62c806..e108c84 100644 (file)
@@ -5,7 +5,7 @@
 
 Name:           connman
 Version:        1.37
-Release:        46
+Release:        47
 License:        GPL-2.0+
 Summary:        Connection Manager
 Url:            http://connman.net
index 82e584e..14ddcc2 100755 (executable)
@@ -27,6 +27,7 @@
 #if defined TIZEN_EXT
 #define WIFI_COUNTRY_CODE_LEN 2
 #define WIFI_PHY_MODE_LEN 18
+#define GIO_SOCKET_RETRY_COUNT 3
 #endif
 
 #include <connman/dbus.h>
@@ -1014,7 +1015,11 @@ const char *__connman_notifier_get_state(void);
 
 #include <connman/rtnl.h>
 
+#if defined TIZEN_EXT
+int __connman_rtnl_init(int retry_count);
+#else
 int __connman_rtnl_init(void);
+#endif
 void __connman_rtnl_start(void);
 void __connman_rtnl_cleanup(void);
 
index 7938a06..0821c45 100755 (executable)
@@ -1406,7 +1406,11 @@ int main(int argc, char *argv[])
        __connman_clock_init();
 
        __connman_ipconfig_init();
+#if defined TIZEN_EXT
+       __connman_rtnl_init(GIO_SOCKET_RETRY_COUNT);
+#else /* TIZEN_EXT */
        __connman_rtnl_init();
+#endif /* TIZEN_EXT */
        __connman_task_init();
        __connman_proxy_init();
        __connman_detect_init();
index aa5c07c..7da55fa 100644 (file)
@@ -1586,8 +1586,15 @@ static gboolean netlink_event(GIOChannel *chan, GIOCondition cond, gpointer data
        ssize_t status;
        int fd;
 
+#if defined TIZEN_EXT
+       if (cond & (G_IO_NVAL | G_IO_HUP | G_IO_ERR)) {
+               __connman_rtnl_init(GIO_SOCKET_RETRY_COUNT);
+               return FALSE;
+       }
+#else /* TIZEN_EXT */
        if (cond & (G_IO_NVAL | G_IO_HUP | G_IO_ERR))
                return FALSE;
+#endif /* TIZEN_EXT */
 
        memset(buf, 0, sizeof(buf));
        memset(&nladdr, 0, sizeof(nladdr));
@@ -1600,11 +1607,21 @@ static gboolean netlink_event(GIOChannel *chan, GIOCondition cond, gpointer data
                if (errno == EINTR || errno == EAGAIN)
                        return TRUE;
 
+#if defined TIZEN_EXT
+               __connman_rtnl_init(GIO_SOCKET_RETRY_COUNT);
+#endif /* TIZEN_EXT */
                return FALSE;
        }
 
+#if defined TIZEN_EXT
+       if (status == 0) {
+               __connman_rtnl_init(GIO_SOCKET_RETRY_COUNT);
+               return FALSE;
+       }
+#else /* TIZEN_EXT */
        if (status == 0)
                return FALSE;
+#endif /* TIZEN_EXT */
 
        if (nladdr.nl_pid != 0) { /* not sent by kernel, ignore */
                DBG("Received msg from %u, ignoring it", nladdr.nl_pid);
@@ -1748,19 +1765,34 @@ int __connman_rtnl_request_update(void)
        return send_getlink();
 }
 
+#if defined TIZEN_EXT
+int __connman_rtnl_init(int retry_count)
+#else /* TIZEN_EXT */
 int __connman_rtnl_init(void)
+#endif /* TIZEN_EXT */
 {
        struct sockaddr_nl addr;
        int sk;
 
+#if defined TIZEN_EXT
+       if (retry_count < 0)
+               return -1;
+
+       DBG("retry_count %d", retry_count);
+#else /* TIZEN_EXT */
        DBG("");
+#endif /* TIZEN_EXT */
 
        interface_list = g_hash_table_new_full(g_direct_hash, g_direct_equal,
                                                        NULL, free_interface);
 
        sk = socket(PF_NETLINK, SOCK_DGRAM | SOCK_CLOEXEC, NETLINK_ROUTE);
        if (sk < 0)
+#if defined TIZEN_EXT
+               return __connman_rtnl_init(retry_count - 1);
+#else /* TIZEN_EXT */
                return -1;
+#endif /* TIZEN_EXT */
 
        memset(&addr, 0, sizeof(addr));
        addr.nl_family = AF_NETLINK;
@@ -1770,7 +1802,11 @@ int __connman_rtnl_init(void)
 
        if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
                close(sk);
+#if defined TIZEN_EXT
+               return __connman_rtnl_init(retry_count - 1);
+#else /* TIZEN_EXT */
                return -1;
+#endif /* TIZEN_EXT */
        }
 
        channel = g_io_channel_unix_new(sk);