long total_out;
long total_in;
FILE *reference;
+long mtu = 0;
char *reorder_data;
size_t reorder_len;
return result;
}
+static void set_mtu(struct utcp *u, int s) {
+ if(!mtu) {
+ socklen_t optlen = sizeof(mtu);
+ getsockopt(s, IPPROTO_IP, IP_MTU, &mtu, &optlen);
+ }
+
+ if(!mtu || mtu == 65535) {
+ mtu = 1500;
+ }
+
+ fprintf(stderr, "Using MTU %lu\n", mtu);
+
+ utcp_set_mtu(u, mtu ? mtu - 48 : 1300);
+}
+
int main(int argc, char *argv[]) {
srand(time(NULL));
srand48(time(NULL));
read_size = atoi(getenv("READ_SIZE"));
}
+ if(getenv("MTU")) {
+ mtu = atoi(getenv("MTU"));
+ }
+
char *reference_filename = getenv("REFERENCE");
if(reference_filename) {
getaddrinfo(server ? NULL : argv[1], server ? argv[1] : argv[2], &hint, &ai);
if(!ai) {
+ debug("Could not lookup address: %s\n", strerror(errno));
return 1;
}
int s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
if(s == -1) {
+ debug("Could not create socket: %s\n", strerror(errno));
return 1;
}
+ static const int one = 1;
+ setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof one);
+
if(server) {
if(bind(s, ai->ai_addr, ai->ai_addrlen)) {
+ debug("Could not bind: %s\n", strerror(errno));
return 1;
}
} else {
if(connect(s, ai->ai_addr, ai->ai_addrlen)) {
+ debug("Could not connect: %s\n", strerror(errno));
return 1;
}
struct utcp *u = utcp_init(server ? do_accept : NULL, NULL, do_send, &s);
if(!u) {
+ debug("Could not initialize UTCP\n");
return 1;
}
- utcp_set_mtu(u, 1300);
utcp_set_user_timeout(u, 10);
if(!server) {
+ set_mtu(u, s);
c = utcp_connect_ex(u, 1, do_recv, NULL, flags);
}
break;
}
- if(!connected)
+ if(!connected) {
if(!connect(s, (struct sockaddr *)&ss, sl)) {
connected = true;
+ set_mtu(u, s);
}
+ }
inpktno++;