]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: dev/udp: Apply the corruption to both directions
authorFrédéric Lécaille <flecaille@haproxy.com>
Thu, 8 Sep 2022 18:38:59 +0000 (20:38 +0200)
committerFrédéric Lécaille <flecaille@haproxy.com>
Thu, 8 Sep 2022 18:38:59 +0000 (20:38 +0200)
Harden the UDP datagram corruption applying it on both sides. This approaches
the conditions of some tests run by the QUIC interop runner developed by
Marten Seeman.

dev/udp/udp-perturb.c

index ca8c0dcd8450ba58a434259da754ee13e4532820..8a851fc49c344e3158f184f783dfd900291f657a 100644 (file)
@@ -275,6 +275,18 @@ int add_connection(struct sockaddr_storage *ss)
        return -1;
 }
 
+/* Corrupt <buf> buffer with <buflen> as length if required */
+static void pktbuf_apply_corruption(char *buf, size_t buflen)
+{
+       if (corr_rate > 0 && prng(100) < corr_rate) {
+               unsigned int rnd = prng(corr_span * 256); // pos and value
+               unsigned int pos = corr_base + (rnd >> 8);
+
+               if (pos < buflen)
+                       buf[pos] ^= rnd;
+       }
+}
+
 /* Handle a read operation on an front FD. Will either reuse the existing
  * connection if the source is found, or will allocate a new one, possibly
  * replacing the oldest one. Returns <0 on error or the number of bytes
@@ -323,13 +335,7 @@ int handle_frt(int fd, struct pollfd *pfd, struct conn *conns, int nbconn)
        if (ret < 0)
                return errno == EAGAIN ? 0 : -1;
 
-       if (corr_rate > 0 && prng(100) < corr_rate) {
-               unsigned int rnd = prng(corr_span * 256); // pos and value
-               unsigned int pos = corr_base + (rnd >> 8);
-
-               if (pos < ret)
-                       pktbuf[pos] ^= rnd;
-       }
+       pktbuf_apply_corruption(pktbuf, ret);
 
        conn = NULL;
        for (i = 0; i < nbconn; i++) {
@@ -411,6 +417,8 @@ int handle_bck(int fd, struct pollfd *pfd, struct conn *conns, int nbconn)
        if (ret < 0)
                return errno == EAGAIN ? 0 : -1;
 
+       pktbuf_apply_corruption(pktbuf, ret);
+
        conn = conn_bck_lookup(conns, nbconn, fd);
        if (!conn)
                return 0;