1b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti/* 2b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti * Copyright 2014 The Android Open Source Project 3b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti * 4b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti * Licensed under the Apache License, Version 2.0 (the "License"); 5b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti * you may not use this file except in compliance with the License. 6b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti * You may obtain a copy of the License at 7b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti * 8b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti * http://www.apache.org/licenses/LICENSE-2.0 9b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti * 10b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti * Unless required by applicable law or agreed to in writing, software 11b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti * distributed under the License is distributed on an "AS IS" BASIS, 12b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti * See the License for the specific language governing permissions and 14b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti * limitations under the License. 15b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti * 16b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti * clatd_microbenchmark.c - micro-benchmark for clatd tun send path 17b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti * 18b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti * Run with: 19b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti * 20b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti * adb push {$ANDROID_PRODUCT_OUT,}/data/nativetest/clatd_microbenchmark/clatd_microbenchmark 21b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti * adb shell /data/nativetest/clatd_microbenchmark/clatd_microbenchmark 22b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti * 23b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti */ 24b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti#include <errno.h> 25b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti#include <fcntl.h> 26b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti#include <string.h> 27b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti#include <stdio.h> 28b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti#include <stdlib.h> 29b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti#include <time.h> 30b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti#include <unistd.h> 31b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti#include <sys/ioctl.h> 32b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti#include <sys/socket.h> 33b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti#include <sys/stat.h> 34b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti#include <sys/types.h> 35b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti#include <sys/uio.h> 36b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti#include <netinet/in.h> 37b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti#include <netinet/ip.h> 38b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti#include <netinet/ip6.h> 39b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti#include <netinet/udp.h> 40b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti#include <arpa/inet.h> 41b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti#include <linux/if.h> 42b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti#include <linux/if_tun.h> 43b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti 44b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti#include "checksum.h" 45b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti#include "tun.h" 46b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti 47b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti#define DEVICENAME "clat4" 48b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti 49b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti#define PORT 51339 50b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti#define PAYLOADSIZE (1280 - sizeof(struct iphdr) - sizeof(struct udphdr)) 51b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti#define NUMPACKETS 1000000 52b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti#define SEC_TO_NANOSEC (1000 * 1000 * 1000) 53b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti 54b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colittivoid init_sockaddr_in(struct sockaddr_in *sin, const char *addr) { 55b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti sin->sin_family = AF_INET; 56b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti sin->sin_port = 0; 57b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti sin->sin_addr.s_addr = inet_addr(addr); 58b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti} 59b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti 60b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colittivoid die(const char *str) { 61b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti perror(str); 62b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti exit(1); 63b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti} 64b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti 65b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colittiint setup_tun() { 66b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti int fd = tun_open(); 67b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti if (fd == -1) die("tun_open"); 68b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti 69b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti char dev[IFNAMSIZ] = DEVICENAME; 70b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti int ret = tun_alloc(dev, fd); 71b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti if (ret == -1) die("tun_alloc"); 72b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti struct ifreq ifr = { 73b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti .ifr_name = DEVICENAME, 74b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti }; 75b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti 76b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti int s = socket(AF_INET, SOCK_DGRAM, 0); 77b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti init_sockaddr_in((struct sockaddr_in *) &ifr.ifr_addr, "192.0.0.4"); 78b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti if (ioctl(s, SIOCSIFADDR, &ifr) < 0) die("SIOCSIFADDR"); 79b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti init_sockaddr_in((struct sockaddr_in *) &ifr.ifr_addr, "255.255.255.248"); 80b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti if (ioctl(s, SIOCSIFNETMASK, &ifr) < 0) die("SIOCSIFNETMASK"); 81b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti if (ioctl(s, SIOCGIFFLAGS, &ifr) < 0) die("SIOCGIFFLAGS"); 82b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti ifr.ifr_flags |= (IFF_UP | IFF_RUNNING); 83b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti if (ioctl(s, SIOCSIFFLAGS, &ifr) < 0) die("SIOCSIFFLAGS"); 84b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti return fd; 85b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti} 86b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti 87b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colittiint send_packet(int fd, uint8_t payload[], int len, uint32_t payload_checksum) { 88b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti struct tun_pi tun = { 0, htons(ETH_P_IP) }; 89b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti struct udphdr udp = { 90b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti .source = htons(1234), 91b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti .dest = htons(PORT), 92b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti .len = htons(len + sizeof(udp)), 93b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti .check = 0, 94b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti }; 95b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti struct iphdr ip = { 96b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti .version = 4, 97b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti .ihl = 5, 98b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti .tot_len = htons(len + sizeof(ip) + sizeof(udp)), 99b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti .frag_off = htons(IP_DF), 100b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti .ttl = 55, 101b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti .protocol = IPPROTO_UDP, 102b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti .saddr = htonl(0xc0000006), // 192.0.0.6 103b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti .daddr = htonl(0xc0000004), // 192.0.0.4 104b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti }; 105b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti clat_packet out = { 106b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti { &tun, sizeof(tun) }, // tun header 107b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti { &ip, sizeof(ip) }, // IP header 108b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti { NULL, 0 }, // Fragment header 109b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti { &udp, sizeof(udp) }, // Transport header 110b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti { NULL, 0 }, // ICMP error IP header 111b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti { NULL, 0 }, // ICMP error fragment header 112b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti { NULL, 0 }, // ICMP error transport header 113b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti { payload, len }, // Payload 114b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti }; 115b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti 116b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti ip.check = ip_checksum(&ip, sizeof(ip)); 117b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti 118b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti uint32_t sum; 119b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti sum = ipv4_pseudo_header_checksum(&ip, ntohs(udp.len)); 120b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti sum = ip_checksum_add(sum, &udp, sizeof(udp)); 121b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti sum += payload_checksum; 122b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti udp.check = ip_checksum_finish(sum); 123b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti 124b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti return send_tun(fd, out, sizeof(out) / sizeof(out[0])); 125b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti} 126b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti 127b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colittidouble timedelta(const struct timespec tv1, const struct timespec tv2) { 128b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti struct timespec end = tv2; 129b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti if (end.tv_nsec < tv1.tv_nsec) { 130b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti end.tv_sec -= 1; 131b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti end.tv_nsec += SEC_TO_NANOSEC; 132b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti } 133b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti double seconds = (end.tv_sec - tv1.tv_sec); 134b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti seconds += (((double) (end.tv_nsec - tv1.tv_nsec)) / SEC_TO_NANOSEC); 135b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti return seconds; 136b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti} 137b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti 138b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colittivoid benchmark(const char *name, int fd, int s, int num, int do_read, 139b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti uint8_t payload[], int len, uint32_t payload_sum) { 140b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti int i; 141b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti char buf[4096]; 142b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti struct timespec tv1, tv2; 143b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti int write_err = 0, read_err = 0; 144b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti clock_gettime(CLOCK_MONOTONIC, &tv1); 145b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti for (i = 0; i < num; i++) { 146b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti if (send_packet(fd, payload, len, payload_sum) == -1) write_err++; 147b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti if (do_read && recvfrom(s, buf, sizeof(buf), 0, NULL, NULL) == -1) { 148b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti read_err++; 149b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti if (errno == ETIMEDOUT) { 150b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti printf("Timed out after %d packets!\n", i); 151b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti break; 152b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti } 153b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti } 154b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti } 155b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti clock_gettime(CLOCK_MONOTONIC, &tv2); 156b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti double seconds = timedelta(tv1, tv2); 157b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti int pps = (int) (i / seconds); 158b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti double mbps = (i * PAYLOADSIZE / 1000000 * 8 / seconds); 159b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti printf("%s: %d packets in %.2fs (%d pps, %.2f Mbps), ", name, i, seconds, pps, mbps); 160b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti printf("read err %d (%.2f%%), write err %d (%.2f%%)\n", 161b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti read_err, (float) read_err / i * 100, 162b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti write_err, (float) write_err / i * 100); 163b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti} 164b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti 165b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colittiint open_socket() { 166b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti int sock = socket(AF_INET, SOCK_DGRAM | SOCK_NONBLOCK, IPPROTO_UDP); 167b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti 168b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti int on = 1; 169b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) == -1) die("SO_REUSEADDR"); 170b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti 171b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti struct timeval tv = { 1, 0 }; 172b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) == -1) die("SO_RCVTIMEO"); 173b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti 174b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti struct sockaddr_in addr = { 175b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti .sin_family = AF_INET, 176b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti .sin_port = ntohs(PORT), 177b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti .sin_addr = { INADDR_ANY } 178b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti }; 179b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti if (bind(sock, (struct sockaddr *) &addr, sizeof(addr)) == -1) die ("bind"); 180b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti 181b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti return sock; 182b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti} 183b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti 184b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colittiint main() { 185b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti int fd = setup_tun(); 186b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti int sock = open_socket(); 187b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti 188b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti int i; 189b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti uint8_t payload[PAYLOADSIZE]; 190b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti for (i = 0; i < (int) sizeof(payload); i++) { 191b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti payload[i] = (uint8_t) i; 192b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti } 193b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti uint32_t payload_sum = ip_checksum_add(0, payload, sizeof(payload)); 194b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti 195b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti // Check things are working. 196b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti char buf[4096]; 197b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti if (send_packet(fd, payload, sizeof(payload), payload_sum) == -1) die("send_packet"); 198b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti if (recvfrom(sock, buf, sizeof(buf), 0, NULL, NULL) == -1) die("recvfrom"); 199b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti 200b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti benchmark("Blocking", fd, sock, NUMPACKETS, 1, payload, sizeof(payload), payload_sum); 201b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti close(fd); 202b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti 203b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti fd = setup_tun(); 204b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti set_nonblocking(fd); 205b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti benchmark("No read", fd, sock, NUMPACKETS, 0, payload, sizeof(payload), payload_sum); 206b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti close(fd); 207b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti 208b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti fd = setup_tun(); 209b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti set_nonblocking(fd); 210b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti benchmark("Nonblocking", fd, sock, NUMPACKETS, 1, payload, sizeof(payload), payload_sum); 211b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti close(fd); 212b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti 213b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti return 0; 214b20719ebf403b16d36a231aeef96607f8c7aa252Lorenzo Colitti} 215