From d432b4f6bfb23b6fbf921a620d2661b2acb108fe Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Sat, 31 Jan 2015 19:18:47 +0900 Subject: Make the raw socket and the tun fd nonblocking. (cherry picked from commit 49454814a0a714189916cb2aea1922bc8784b13b) Change-Id: I6c0e0fba64e9a785cd225e8c543df06e864db8e7 --- clatd.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/clatd.c b/clatd.c index 94cb3b5..faeb679 100644 --- a/clatd.c +++ b/clatd.c @@ -198,7 +198,7 @@ void drop_root() { * mark - the socket mark to use for the sending raw socket */ void open_sockets(struct tun_data *tunnel, uint32_t mark) { - int rawsock = socket(AF_INET6, SOCK_RAW, IPPROTO_RAW); + int rawsock = socket(AF_INET6, SOCK_RAW | SOCK_NONBLOCK, IPPROTO_RAW); if (rawsock < 0) { logmsg(ANDROID_LOG_FATAL, "raw socket failed: %s", strerror(errno)); exit(1); @@ -314,6 +314,12 @@ void configure_interface(const char *uplink_interface, const char *plat_prefix, exit(1); } + error = set_nonblocking(tunnel->fd4); + if (error < 0) { + logmsg(ANDROID_LOG_FATAL, "set_nonblocking failed: %s", strerror(errno)); + exit(1); + } + configure_tun_ip(tunnel); } @@ -330,7 +336,9 @@ void read_packet(int read_fd, int write_fd, int to_ipv6) { readlen = read(read_fd, buf, PACKETLEN); if(readlen < 0) { - logmsg(ANDROID_LOG_WARN,"read_packet/read error: %s", strerror(errno)); + if (errno != EAGAIN) { + logmsg(ANDROID_LOG_WARN,"read_packet/read error: %s", strerror(errno)); + } return; } else if(readlen == 0) { logmsg(ANDROID_LOG_WARN,"read_packet/tun interface removed"); -- cgit v1.2.3