forked from AndDiSa/platform_manifest-Grouper-AOSP
-
Notifications
You must be signed in to change notification settings - Fork 0
/
external_android_clat.patch
39 lines (38 loc) · 1.67 KB
/
external_android_clat.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
diff --git a/clatd.c b/clatd.c
index d57ea59..fd89e0a 100644
--- a/clatd.c
+++ b/clatd.c
@@ -382,19 +382,28 @@ void event_loop(struct tun_data *tunnel) {
last_interface_poll = time(NULL);
while(running) {
- if(poll(wait_fd, 2, NO_TRAFFIC_INTERFACE_POLL_FREQUENCY*1000) == -1) {
- if(errno != EINTR) {
- logmsg(ANDROID_LOG_WARN,"event_loop/poll returned an error: %s",strerror(errno));
+ if (poll(wait_fd, ARRAY_SIZE(wait_fd),
+ NO_TRAFFIC_INTERFACE_POLL_FREQUENCY * 1000) == -1) {
+ if (errno != EINTR) {
+ logmsg(ANDROID_LOG_WARN,"event_loop/poll returned an error: %s", strerror(errno));
}
} else {
+ if (wait_fd[0].revents & POLLIN) {
+ ring_read(&tunnel->ring, tunnel->fd4, 0 /* to_ipv6 */);
+ }
+ // If any other bit is set, assume it's due to an error (i.e. POLLERR).
+ if (wait_fd[0].revents & ~POLLIN) {
+ // ring_read doesn't clear the error indication on the socket.
+ recv(tunnel->read_fd6, NULL, 0, MSG_PEEK);
+ logmsg(ANDROID_LOG_WARN, "event_loop: clearing error on read_fd6: %s",
+ strerror(errno));
+ }
+
// Call read_packet if the socket has data to be read, but also if an
// error is waiting. If we don't call read() after getting POLLERR, a
// subsequent poll() will return immediately with POLLERR again,
// causing this code to spin in a loop. Calling read() will clear the
// socket error flag instead.
- if (wait_fd[0].revents) {
- ring_read(&tunnel->ring, tunnel->fd4, 0 /* to_ipv6 */);
- }
if (wait_fd[1].revents) {
read_packet(tunnel->fd4, tunnel->write_fd6, 1 /* to_ipv6 */);
}