From owner-dev-commits-src-branches@freebsd.org Wed Apr 7 21:06:50 2021 Return-Path: Delivered-To: dev-commits-src-branches@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 31F945C5293; Wed, 7 Apr 2021 21:06:50 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4FFxlt0vWyz4nRW; Wed, 7 Apr 2021 21:06:50 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 1186D25C6B; Wed, 7 Apr 2021 21:06:50 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 137L6nRZ063132; Wed, 7 Apr 2021 21:06:49 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 137L6nuk063131; Wed, 7 Apr 2021 21:06:49 GMT (envelope-from git) Date: Wed, 7 Apr 2021 21:06:49 GMT Message-Id: <202104072106.137L6nuk063131@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Vincenzo Maffione Subject: git: b5cf839053fe - stable/12 - netmap: pkt-gen: allow -Z and -z to be used together MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: vmaffione X-Git-Repository: src X-Git-Refname: refs/heads/stable/12 X-Git-Reftype: branch X-Git-Commit: b5cf839053fef6da328d7b90d2475e8bb82bfa30 Auto-Submitted: auto-generated X-BeenThere: dev-commits-src-branches@freebsd.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Commits to the stable branches of the FreeBSD src repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 07 Apr 2021 21:06:50 -0000 The branch stable/12 has been updated by vmaffione: URL: https://cgit.FreeBSD.org/src/commit/?id=b5cf839053fef6da328d7b90d2475e8bb82bfa30 commit b5cf839053fef6da328d7b90d2475e8bb82bfa30 Author: Vincenzo Maffione AuthorDate: 2021-03-30 06:13:07 +0000 Commit: Vincenzo Maffione 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));