diff options
author | Nishant Chaprana <n.chaprana@samsung.com> | 2020-10-12 13:33:23 +0530 |
---|---|---|
committer | Nishant Chaprana <n.chaprana@samsung.com> | 2020-10-12 17:32:53 +0530 |
commit | 2ff3cf0e89bbdc19bc261000526562f684b29554 (patch) | |
tree | 0652bd2f55d40eb42beb865ba9c17f6c8da5a54f | |
parent | 4e1d941e94590b2a41996b477f2563a9c860e1e5 (diff) | |
download | connman-2ff3cf0e89bbdc19bc261000526562f684b29554.tar.gz connman-2ff3cf0e89bbdc19bc261000526562f684b29554.tar.bz2 connman-2ff3cf0e89bbdc19bc261000526562f684b29554.zip |
[src/rtnl] Add retry mechanism when socket GIO channel fails
Change-Id: I21f1d8c970f1053ce4337dc0d251d2fa20bbd509
Signed-off-by: Nishant Chaprana <n.chaprana@samsung.com>
-rw-r--r-- | packaging/connman.spec | 2 | ||||
-rwxr-xr-x | src/connman.h | 5 | ||||
-rwxr-xr-x | src/main.c | 4 | ||||
-rw-r--r-- | src/rtnl.c | 36 |
4 files changed, 46 insertions, 1 deletions
diff --git a/packaging/connman.spec b/packaging/connman.spec index c62c806c..e108c84a 100644 --- a/packaging/connman.spec +++ b/packaging/connman.spec @@ -5,7 +5,7 @@ Name: connman Version: 1.37 -Release: 46 +Release: 47 License: GPL-2.0+ Summary: Connection Manager Url: http://connman.net diff --git a/src/connman.h b/src/connman.h index 82e584eb..14ddcc2d 100755 --- a/src/connman.h +++ b/src/connman.h @@ -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); @@ -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(); @@ -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); |