diff options
| author | Lorenzo Colitti <lorenzo@google.com> | 2015-09-26 01:27:34 +0900 |
|---|---|---|
| committer | Steve Kondik <steve@cyngn.com> | 2016-06-08 21:15:23 -0700 |
| commit | bee83f8d7edb48a1d8b8f2333a1b259854c44b95 (patch) | |
| tree | 4b32117a26b25295f155ac185b3eca0ec26396c2 /clatd.c | |
| parent | 4f99df509e1e6626967aa8bb394045932e75576b (diff) | |
| download | android_external_android-clat-replicant-6.0-0003.tar.gz android_external_android-clat-replicant-6.0-0003.tar.bz2 android_external_android-clat-replicant-6.0-0003.zip | |
Process packets in bursts.HEADreplicant-6.0-0004-transitionreplicant-6.0-0004-rc6replicant-6.0-0004-rc5-transitionreplicant-6.0-0004-rc5replicant-6.0-0004-rc4replicant-6.0-0004-rc3replicant-6.0-0004-rc2replicant-6.0-0004-rc1replicant-6.0-0004replicant-6.0-0003replicant-6.0-0002replicant-6.0-0001stable/cm-13.0-ZNH5Ycm-13.0
Add a "packet_burst" config option that will cause clatd to read
(and write) in bursts of up to that number of packets, instead of
always only reading one packet at a time. This reduces poll
overhead and improves performance.
The variable is initially set to 10.
Bug: 24113287
Change-Id: I7feba4127538c5a89f92e0ebea1fb75971d6b901
Diffstat (limited to 'clatd.c')
| -rw-r--r-- | clatd.c | 55 |
1 files changed, 29 insertions, 26 deletions
@@ -333,39 +333,42 @@ void configure_interface(const char *uplink_interface, const char *plat_prefix, void read_packet(int read_fd, int write_fd, int to_ipv6) { ssize_t readlen; uint8_t buf[PACKETLEN], *packet; + int numread = 0; - readlen = read(read_fd, buf, PACKETLEN); + do { + readlen = read(read_fd, buf, PACKETLEN); - if(readlen < 0) { - if (errno != EAGAIN) { - logmsg(ANDROID_LOG_WARN,"read_packet/read error: %s", strerror(errno)); + if(readlen < 0) { + 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"); + running = 0; + return; } - return; - } else if(readlen == 0) { - logmsg(ANDROID_LOG_WARN,"read_packet/tun interface removed"); - running = 0; - return; - } - struct tun_pi *tun_header = (struct tun_pi *) buf; - if (readlen < (ssize_t) sizeof(*tun_header)) { - logmsg(ANDROID_LOG_WARN,"read_packet/short read: got %ld bytes", readlen); - return; - } + struct tun_pi *tun_header = (struct tun_pi *) buf; + if (readlen < (ssize_t) sizeof(*tun_header)) { + logmsg(ANDROID_LOG_WARN,"read_packet/short read: got %ld bytes", readlen); + return; + } - uint16_t proto = ntohs(tun_header->proto); - if (proto != ETH_P_IP) { - logmsg(ANDROID_LOG_WARN, "%s: unknown packet type = 0x%x", __func__, proto); - return; - } + uint16_t proto = ntohs(tun_header->proto); + if (proto != ETH_P_IP) { + logmsg(ANDROID_LOG_WARN, "%s: unknown packet type = 0x%x", __func__, proto); + return; + } - if(tun_header->flags != 0) { - logmsg(ANDROID_LOG_WARN, "%s: unexpected flags = %d", __func__, tun_header->flags); - } + if(tun_header->flags != 0) { + logmsg(ANDROID_LOG_WARN, "%s: unexpected flags = %d", __func__, tun_header->flags); + } - packet = (uint8_t *) (tun_header + 1); - readlen -= sizeof(*tun_header); - translate_packet(write_fd, to_ipv6, packet, readlen, TP_CSUM_NONE); + packet = (uint8_t *) (tun_header + 1); + readlen -= sizeof(*tun_header); + translate_packet(write_fd, to_ipv6, packet, readlen, TP_CSUM_NONE); + } while (++numread < Global_Clatd_Config.packet_burst); } /* function: recv_loop |
