The branch stable/12 has been updated by vmaffione:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=b5cf839053fef6da328d7b90d2475e8bb82bfa30

commit b5cf839053fef6da328d7b90d2475e8bb82bfa30
Author:     Vincenzo Maffione <vmaffi...@freebsd.org>
AuthorDate: 2021-03-30 06:13:07 +0000
Commit:     Vincenzo Maffione <vmaffi...@freebsd.org>
CommitDate: 2021-04-07 21:06:38 +0000

    netmap: pkt-gen: allow -Z and -z to be used together
    
    These options are used for generating random source/destination
    IP/ports within transmitted packets.
    
    MFC after:      1 week
---
 tools/tools/netmap/pkt-gen.c | 125 +++++++++++++++++++++++--------------------
 1 file changed, 66 insertions(+), 59 deletions(-)

diff --git a/tools/tools/netmap/pkt-gen.c b/tools/tools/netmap/pkt-gen.c
index 55504c09ae58..ebc0ac977219 100644
--- a/tools/tools/netmap/pkt-gen.c
+++ b/tools/tools/netmap/pkt-gen.c
@@ -802,6 +802,25 @@ dump_payload(const char *_p, int len, struct netmap_ring 
*ring, int cur)
 #define uh_sum check
 #endif /* linux */
 
+static uint16_t
+new_ip_sum(uint16_t ip_sum, uint32_t oaddr, uint32_t naddr)
+{
+       ip_sum = cksum_add(ip_sum, ~oaddr >> 16);
+       ip_sum = cksum_add(ip_sum, ~oaddr & 0xffff);
+       ip_sum = cksum_add(ip_sum, naddr >> 16);
+       ip_sum = cksum_add(ip_sum, naddr & 0xffff);
+       return ip_sum;
+}
+
+static uint16_t
+new_udp_sum(uint16_t udp_sum, uint16_t oport, uint16_t nport)
+{
+       udp_sum = cksum_add(udp_sum, ~oport);
+       udp_sum = cksum_add(udp_sum, nport);
+       return udp_sum;
+}
+
+
 static void
 update_ip(struct pkt *pkt, struct targ *t)
 {
@@ -810,7 +829,7 @@ update_ip(struct pkt *pkt, struct targ *t)
        struct udphdr udp;
        uint32_t oaddr, naddr;
        uint16_t oport, nport;
-       uint16_t ip_sum, udp_sum;
+       uint16_t ip_sum = 0, udp_sum = 0;
 
        memcpy(&ip, &pkt->ipv4.ip, sizeof(ip));
        memcpy(&udp, &pkt->ipv4.udp, sizeof(udp));
@@ -823,35 +842,28 @@ update_ip(struct pkt *pkt, struct targ *t)
                        udp.uh_sport = nrand48(t->seed);
                        naddr = ntohl(ip.ip_src.s_addr);
                        nport = ntohs(udp.uh_sport);
-                       break;
-               }
-               if (oport < g->src_ip.port1) {
-                       nport = oport + 1;
+                       ip_sum = new_ip_sum(ip_sum, oaddr, naddr);
+                       udp_sum = new_udp_sum(udp_sum, oport, nport);
+               } else {
+                       if (oport < g->src_ip.port1) {
+                               nport = oport + 1;
+                               udp.uh_sport = htons(nport);
+                               udp_sum = new_udp_sum(udp_sum, oport, nport);
+                               break;
+                       }
+                       nport = g->src_ip.port0;
                        udp.uh_sport = htons(nport);
-                       break;
-               }
-               nport = g->src_ip.port0;
-               udp.uh_sport = htons(nport);
-               if (oaddr < g->src_ip.ipv4.end) {
-                       naddr = oaddr + 1;
+                       if (oaddr < g->src_ip.ipv4.end) {
+                               naddr = oaddr + 1;
+                               ip.ip_src.s_addr = htonl(naddr);
+                               ip_sum = new_ip_sum(ip_sum, oaddr, naddr);
+                               break;
+                       }
+                       naddr = g->src_ip.ipv4.start;
                        ip.ip_src.s_addr = htonl(naddr);
-                       break;
+                       ip_sum = new_ip_sum(ip_sum, oaddr, naddr);
                }
-               naddr = g->src_ip.ipv4.start;
-               ip.ip_src.s_addr = htonl(naddr);
-       } while (0);
-       /* update checksums if needed */
-       if (oaddr != naddr) {
-               ip_sum = cksum_add(ip_sum, ~oaddr >> 16);
-               ip_sum = cksum_add(ip_sum, ~oaddr & 0xffff);
-               ip_sum = cksum_add(ip_sum, naddr >> 16);
-               ip_sum = cksum_add(ip_sum, naddr & 0xffff);
-       }
-       if (oport != nport) {
-               udp_sum = cksum_add(udp_sum, ~oport);
-               udp_sum = cksum_add(udp_sum, nport);
-       }
-       do {
+
                naddr = oaddr = ntohl(ip.ip_dst.s_addr);
                nport = oport = ntohs(udp.uh_dport);
                if (g->options & OPT_RANDOM_DST) {
@@ -859,34 +871,29 @@ update_ip(struct pkt *pkt, struct targ *t)
                        udp.uh_dport = nrand48(t->seed);
                        naddr = ntohl(ip.ip_dst.s_addr);
                        nport = ntohs(udp.uh_dport);
-                       break;
-               }
-               if (oport < g->dst_ip.port1) {
-                       nport = oport + 1;
+                       ip_sum = new_ip_sum(ip_sum, oaddr, naddr);
+                       udp_sum = new_udp_sum(udp_sum, oport, nport);
+               } else {
+                       if (oport < g->dst_ip.port1) {
+                               nport = oport + 1;
+                               udp.uh_dport = htons(nport);
+                               udp_sum = new_udp_sum(udp_sum, oport, nport);
+                               break;
+                       }
+                       nport = g->dst_ip.port0;
                        udp.uh_dport = htons(nport);
-                       break;
-               }
-               nport = g->dst_ip.port0;
-               udp.uh_dport = htons(nport);
-               if (oaddr < g->dst_ip.ipv4.end) {
-                       naddr = oaddr + 1;
+                       if (oaddr < g->dst_ip.ipv4.end) {
+                               naddr = oaddr + 1;
+                               ip.ip_dst.s_addr = htonl(naddr);
+                               ip_sum = new_ip_sum(ip_sum, oaddr, naddr);
+                               break;
+                       }
+                       naddr = g->dst_ip.ipv4.start;
                        ip.ip_dst.s_addr = htonl(naddr);
-                       break;
+                       ip_sum = new_ip_sum(ip_sum, oaddr, naddr);
                }
-               naddr = g->dst_ip.ipv4.start;
-               ip.ip_dst.s_addr = htonl(naddr);
        } while (0);
        /* update checksums */
-       if (oaddr != naddr) {
-               ip_sum = cksum_add(ip_sum, ~oaddr >> 16);
-               ip_sum = cksum_add(ip_sum, ~oaddr & 0xffff);
-               ip_sum = cksum_add(ip_sum, naddr >> 16);
-               ip_sum = cksum_add(ip_sum, naddr & 0xffff);
-       }
-       if (oport != nport) {
-               udp_sum = cksum_add(udp_sum, ~oport);
-               udp_sum = cksum_add(udp_sum, nport);
-       }
        if (udp_sum != 0)
                udp.uh_sum = ~cksum_add(~udp.uh_sum, htons(udp_sum));
        if (ip_sum != 0) {
@@ -939,14 +946,14 @@ update_ip6(struct pkt *pkt, struct targ *t)
                }
                naddr = ntohs(g->src_ip.ipv6.start.s6_addr16[group]);
                ip6.ip6_src.s6_addr16[group] = htons(naddr);
-       } while (0);
-       /* update checksums if needed */
-       if (oaddr != naddr)
-               udp_sum = cksum_add(~oaddr, naddr);
-       if (oport != nport)
-               udp_sum = cksum_add(udp_sum,
-                   cksum_add(~oport, nport));
-       do {
+
+               /* update checksums if needed */
+               if (oaddr != naddr)
+                       udp_sum = cksum_add(~oaddr, naddr);
+               if (oport != nport)
+                       udp_sum = cksum_add(udp_sum,
+                           cksum_add(~oport, nport));
+
                group = g->dst_ip.ipv6.egroup;
                naddr = oaddr = ntohs(ip6.ip6_dst.s6_addr16[group]);
                nport = oport = ntohs(udp.uh_dport);
@@ -2504,7 +2511,7 @@ start_threads(struct glob_arg *g) {
         * using a single descriptor.
         */
        for (i = 0; i < g->nthreads; i++) {
-               uint64_t seed = time(0) | (time(0) << 32);
+               uint64_t seed = (uint64_t)time(0) | ((uint64_t)time(0) << 32);
                t = &targs[i];
 
                bzero(t, sizeof(*t));
_______________________________________________
dev-commits-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/dev-commits-src-all
To unsubscribe, send any mail to "dev-commits-src-all-unsubscr...@freebsd.org"

Reply via email to