From nobody Tue May 09 20:39:42 2023 X-Original-To: dev-commits-src-branches@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4QG94v2KZyz49TLk; Tue, 9 May 2023 20:39:43 +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 4QG94v1Xq6z3Gjf; Tue, 9 May 2023 20:39:43 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1683664783; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=baDicdsrLWBdFjmh6ZHiABkwt+wsGWMxhR5b5Gl/3pc=; b=sLGeGCUqgkl1wiYZ3i9iocjJaAcGBAxCP6O86mK1QjDR/RQ2L4ch4VVW46R+XKiOgODieF hsKrzYllbrG/ED2Uw8i/aFGgWTvFWBlirtwYqKmirt7IwIVoMd6AMH4AQl6MUu7+cucm5J Ix39Xck2v7OYrPG6HCggjoSLeX+RmCaP1ZElh/eAgMUjK3yPMAzMXw8zIZrMAuTmQRZHtI /5g6NwwFadqfbdLbqmP+W8/iZgVyRg/8clg1v3BHF4/caXrBDsNJdJoQU6EaD+hMveeNvt 648pvs5OIkLxe2HiXMzES5XuTZ7N/k/OLQzkZkXJjp5o2DMvcY9jBnHrAOwlHg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1683664783; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=baDicdsrLWBdFjmh6ZHiABkwt+wsGWMxhR5b5Gl/3pc=; b=ARIY7LQY+8nXOj2epP8MfCk58EpLqI20twITQHRM0wnXLtUENkoijsZdHGp6AVNQxmgH6w 7Pl3iyHXJWaZZNtKIXZEVxqLXe1AGGQOvIGrAai+wX2lGcislbFjdIz699HCWJu6f05rat O7ZBjutuyC/h9ni/qijioK6O2j6sdSfuiCCPlvzWt4XU8mXLTG27TLTb4x7DQn1+xrK/ot qlS95PLF3rM02OTxIv9lwURIqgt1EVoFJ30zVcft4SJ+Frnf8kTdRCpoPWa7LRj+HUnWpH HzY3RYqgg0l82RiY/4fYBXFURqFYL37H7a89MgEOatVe7Vs34QiKaEkvecDW2Q== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1683664783; a=rsa-sha256; cv=none; b=AUb02qjjv/rXxbp8V1OCH5Zuo6mMgbREc8p5DWOQV4TlDq6LgUHs3USPnxzORkbr6NLNvO SsvPVj+UsixLQvuCL0zdZOXlXY9gAEMf6IQYDJ3rY3wQn7th9TDeAm5ombXdAJ4oe/zhw+ csswKsfjyA7KPZagOj690H9/Dos5Tu+XUojckO2LhgHDw2d+EIPGHMr2D3O8OWnF9JhsKQ iqm1Td5FzxK7cfGUwUkg+ANdLP/PMmdYqpKAZ1Gj/Yd2uPE8nuoYHZrgvigvNdWkeXQ32h YET57wgIyGD84ikISv0HfgQEOo8KhOMeHNuFwsrAuK/8qPU6I3q/lXdQbYEu2w== 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 4QG94v0XNHzhh2; Tue, 9 May 2023 20:39:43 +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 349Kdgji025735; Tue, 9 May 2023 20:39:42 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 349Kdgi2025734; Tue, 9 May 2023 20:39:42 GMT (envelope-from git) Date: Tue, 9 May 2023 20:39:42 GMT Message-Id: <202305092039.349Kdgi2025734@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: b4e9bfd51c2d - stable/13 - netmap: pkt-gen: sync with upstream List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-branches@freebsd.org X-BeenThere: dev-commits-src-branches@freebsd.org 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/13 X-Git-Reftype: branch X-Git-Commit: b4e9bfd51c2d6f66291c89c3e8f4c5809f1be447 Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by vmaffione: URL: https://cgit.FreeBSD.org/src/commit/?id=b4e9bfd51c2d6f66291c89c3e8f4c5809f1be447 commit b4e9bfd51c2d6f66291c89c3e8f4c5809f1be447 Author: Vincenzo Maffione AuthorDate: 2023-04-26 20:32:24 +0000 Commit: Vincenzo Maffione CommitDate: 2023-05-09 20:39:36 +0000 netmap: pkt-gen: sync with upstream Keep in sync with the recent upstream changes: Fix compilation on 32-bit architectures Update IP length, UDP length/checksum when size changes Man page fixes Submitted by: jlduran@gmail.com MFC after: 7 days Differential Revision: https://reviews.freebsd.org/D39760 (cherry picked from commit 8c3b8c838674239538682b914bc1d7059255f116) --- tools/tools/netmap/pkt-gen.8 | 7 ++-- tools/tools/netmap/pkt-gen.c | 86 ++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 88 insertions(+), 5 deletions(-) diff --git a/tools/tools/netmap/pkt-gen.8 b/tools/tools/netmap/pkt-gen.8 index c3f0330e46ba..2a80f160bb9d 100644 --- a/tools/tools/netmap/pkt-gen.8 +++ b/tools/tools/netmap/pkt-gen.8 @@ -25,7 +25,7 @@ .\" .\" $FreeBSD$ .\" -.Dd November 21, 2020 +.Dd April 21, 2023 .Dt PKT-GEN 8 .Os .Sh NAME @@ -150,7 +150,7 @@ mode), a single RX ring (in mode), or a TX/RX ring pair. The number of .Ar threads -must be less than or equal to the number of TX (or RX) ring available +must be less than or equal to the number of TX (or RX) rings available in the device specified by .Ar interface . .It Fl T Ar report_ms @@ -288,7 +288,8 @@ length of 128 bytes. You must set the destination MAC address for packets to be received by the target host. .Bd -literal -offset indent -pkt-gen -i netmap:ncxl0 -f tx -s 172.16.0.1:53 -d 172.16.1.3:53 -D 00:07:43:29:2a:e0 +pkt-gen -i netmap:ncxl0 -f tx -s 172.16.0.1:53 -d 172.16.1.3:53 \e +-D 00:07:43:29:2a:e0 .Ed .Sh SEE ALSO .Xr netmap 4 , diff --git a/tools/tools/netmap/pkt-gen.c b/tools/tools/netmap/pkt-gen.c index 296208018fd4..621e3e215118 100644 --- a/tools/tools/netmap/pkt-gen.c +++ b/tools/tools/netmap/pkt-gen.c @@ -283,6 +283,7 @@ struct glob_arg { #define OPT_RANDOM_SRC 512 #define OPT_RANDOM_DST 1024 #define OPT_PPS_STATS 2048 +#define OPT_UPDATE_CSUM 4096 int dev_type; #ifndef NO_PCAP pcap_t *p; @@ -1005,6 +1006,85 @@ update_addresses(struct pkt *pkt, struct targ *t) else update_ip6(pkt, t); } + +static void +update_ip_size(struct pkt *pkt, int size) +{ + struct ip ip; + struct udphdr udp; + uint16_t oiplen, niplen; + uint16_t nudplen; + uint16_t ip_sum = 0; + + memcpy(&ip, &pkt->ipv4.ip, sizeof(ip)); + memcpy(&udp, &pkt->ipv4.udp, sizeof(udp)); + + oiplen = ntohs(ip.ip_len); + niplen = size - sizeof(struct ether_header); + ip.ip_len = htons(niplen); + nudplen = niplen - sizeof(struct ip); + udp.uh_ulen = htons(nudplen); + ip_sum = new_udp_sum(ip_sum, oiplen, niplen); + + /* update checksums */ + if (ip_sum != 0) + ip.ip_sum = ~cksum_add(~ip.ip_sum, htons(ip_sum)); + + udp.uh_sum = 0; + /* Magic: taken from sbin/dhclient/packet.c */ + udp.uh_sum = wrapsum( + checksum(&udp, sizeof(udp), /* udp header */ + checksum(pkt->ipv4.body, /* udp payload */ + nudplen - sizeof(udp), + checksum(&ip.ip_src, /* pseudo header */ + 2 * sizeof(ip.ip_src), + IPPROTO_UDP + (u_int32_t)ntohs(udp.uh_ulen))))); + + memcpy(&pkt->ipv4.ip, &ip, sizeof(ip)); + memcpy(&pkt->ipv4.udp, &udp, sizeof(udp)); +} + +static void +update_ip6_size(struct pkt *pkt, int size) +{ + struct ip6_hdr ip6; + struct udphdr udp; + uint16_t niplen, nudplen; + uint32_t csum; + + memcpy(&ip6, &pkt->ipv6.ip, sizeof(ip6)); + memcpy(&udp, &pkt->ipv6.udp, sizeof(udp)); + + nudplen = niplen = size - sizeof(struct ether_header) - sizeof(ip6); + ip6.ip6_plen = htons(niplen); + udp.uh_ulen = htons(nudplen); + + /* Save part of pseudo header checksum into csum */ + udp.uh_sum = 0; + csum = IPPROTO_UDP << 24; + csum = checksum(&csum, sizeof(csum), nudplen); + udp.uh_sum = wrapsum( + checksum(&udp, sizeof(udp), /* udp header */ + checksum(pkt->ipv6.body, /* udp payload */ + nudplen - sizeof(udp), + checksum(&pkt->ipv6.ip.ip6_src, /* pseudo header */ + 2 * sizeof(pkt->ipv6.ip.ip6_src), csum)))); + + memcpy(&pkt->ipv6.ip, &ip6, sizeof(ip6)); + memcpy(&pkt->ipv6.udp, &udp, sizeof(udp)); +} + +static void +update_size(struct pkt *pkt, struct targ *t, int size) +{ + if (t->g->options & OPT_UPDATE_CSUM) { + if (t->g->af == AF_INET) + update_ip_size(pkt, size); + else + update_ip6_size(pkt, size); + } +} + /* * initialize one packet and prepare for the next one. * The copy could be done better instead of repeating it each time. @@ -1744,6 +1824,7 @@ sender_body(void *data) size = nrand48(targ->seed) % (targ->g->pkt_size - targ->g->pkt_min_size) + targ->g->pkt_min_size; + update_size(pkt, targ, size); } m = send_packets(txring, pkt, frame, size, targ, limit, options); @@ -2528,6 +2609,7 @@ usage(int errcode) " OPT_RANDOM_SRC 512\n" " OPT_RANDOM_DST 1024\n" " OPT_PPS_STATS 2048\n" +" OPT_UPDATE_CSUM 4096\n" "", cmd); exit(errcode); @@ -3284,8 +3366,8 @@ out: g.tx_period.tv_nsec = g.tx_period.tv_nsec % 1000000000; } if (g.td_type == TD_TYPE_SENDER) - D("Sending %d packets every %ld.%09ld s", - g.burst, g.tx_period.tv_sec, g.tx_period.tv_nsec); + D("Sending %d packets every %jd.%09ld s", + g.burst, (intmax_t)g.tx_period.tv_sec, g.tx_period.tv_nsec); /* Install ^C handler. */ global_nthreads = g.nthreads; sigemptyset(&ss);