]> git.meshlink.io Git - utcp/blobdiff - test.c
Fix buffer resizing logic in buffer_put_at().
[utcp] / test.c
diff --git a/test.c b/test.c
index 1df172efa56556443bfa5c6ec913f9e9014b0035..81244f90027819f5a456027c390f5a48ecd5a1ac 100644 (file)
--- a/test.c
+++ b/test.c
@@ -24,12 +24,18 @@ long inpktno;
 long outpktno;
 long dropfrom;
 long dropto;
+double reorder;
+long reorder_dist = 10;
 double dropin;
 double dropout;
 long total_out;
 long total_in;
 
+char *reorder_data;
+size_t reorder_len;
+int reorder_countdown;
 
+#if UTCP_DEBUG
 void debug(const char *format, ...) {
        struct timeval now;
        gettimeofday(&now, NULL);
@@ -39,6 +45,9 @@ void debug(const char *format, ...) {
        vfprintf(stderr, format, ap);
        va_end(ap);
 }
+#else
+#define debug(...)
+#endif
 
 ssize_t do_recv(struct utcp_connection *c, const void *data, size_t len) {
        if(!data || !len) {
@@ -63,8 +72,32 @@ void do_accept(struct utcp_connection *nc, uint16_t port) {
 ssize_t do_send(struct utcp *utcp, const void *data, size_t len) {
        int s = *(int *)utcp->priv;
        outpktno++;
-       if(outpktno < dropto && outpktno >= dropfrom && drand48() < dropout)
-               return len;
+       if(outpktno >= dropfrom && outpktno < dropto) {
+               if(drand48() < dropout) {
+                       debug("Dropped outgoing packet\n");
+                       return len;
+               }
+               if(!reorder_data && drand48() < reorder) {
+                       reorder_data = malloc(len);
+                       if(!reorder_data) {
+                               debug("Out of memory\n");
+                               return len;
+                       }
+                       reorder_len = len;
+                       memcpy(reorder_data, data, len);
+                       reorder_countdown = 1 + drand48() * reorder_dist;
+                       return len;
+               }
+       }
+
+       if(reorder_data) {
+               if(--reorder_countdown < 0) {
+                       total_out += reorder_len;
+                       send(s, reorder_data, reorder_len, MSG_DONTWAIT);
+                       free(reorder_data);
+                       reorder_data = NULL;
+               }
+       }
 
        total_out += len;
        ssize_t result = send(s, data, len, MSG_DONTWAIT);
@@ -83,10 +116,15 @@ int main(int argc, char *argv[]) {
        bool server = argc == 2;
        bool connected = false;
 
-       dropin = atof(getenv("DROPIN") ?: "0");
-       dropout = atof(getenv("DROPOUT") ?: "0");
-       dropfrom = atoi(getenv("DROPFROM") ?: "0");
-       dropto = atoi(getenv("DROPTO") ?: "0");
+       if(getenv("DROPIN")) dropin = atof(getenv("DROPIN"));
+       if(getenv("DROPOUT")) dropout = atof(getenv("DROPOUT"));
+       if(getenv("DROPFROM")) dropfrom = atoi(getenv("DROPFROM"));
+       if(getenv("DROPTO")) dropto = atoi(getenv("DROPTO"));
+       if(getenv("REORDER")) reorder = atof(getenv("REORDER"));
+       if(getenv("REORDER_DIST")) reorder_dist = atoi(getenv("REORDER_DIST"));
+
+       if(dropto < dropfrom)
+               dropto = 1 << 30;
 
        struct addrinfo *ai;
        struct addrinfo hint = {
@@ -181,7 +219,10 @@ int main(int argc, char *argv[]) {
                        inpktno++;
                        if(inpktno >= dropto || inpktno < dropfrom || drand48() >= dropin) {
                                total_in += len;
-                               utcp_recv(u, buf, len);
+                               if(utcp_recv(u, buf, len) == -1)
+                                       debug("Error receiving UTCP packet: %s\n", strerror(errno));
+                       } else {
+                               debug("Dropped incoming packet\n");
                        }
                }
 
@@ -190,6 +231,7 @@ int main(int argc, char *argv[]) {
 
        utcp_close(c);
        utcp_exit(u);
+       free(reorder_data);
 
        debug("Total bytes in: %ld, out: %ld\n", total_in, total_out);