aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier Cochard <olivier@FreeBSD.org>2022-02-16 15:19:37 +0000
committerOlivier Cochard <olivier@FreeBSD.org>2022-02-16 15:21:56 +0000
commit435452d727cf1b30a673f5641387eef5c9c82257 (patch)
treead257c237a5d9bbbf63c079cbdc041930019d3d5
parent654cb5b91266e40ffe32db8234508b515422dbb4 (diff)
downloadports-435452d727cf1b30a673f5641387eef5c9c82257.tar.gz
ports-435452d727cf1b30a673f5641387eef5c9c82257.zip
net/pkt-gen: Take maintainership and update it to lastest version
-rw-r--r--net/pkt-gen/Makefile23
-rw-r--r--net/pkt-gen/distinfo6
-rw-r--r--net/pkt-gen/files/patch-apps_nmreplay_nmreplay.c11
-rw-r--r--net/pkt-gen/files/patch-include_ctrs.h36
-rw-r--r--net/pkt-gen/files/patch-pkt-gen_GNUmakefile13
-rw-r--r--net/pkt-gen/files/patch-pkt-gen_pkt-gen.c599
6 files changed, 28 insertions, 660 deletions
diff --git a/net/pkt-gen/Makefile b/net/pkt-gen/Makefile
index cf32dc895d50..8f356ac50910 100644
--- a/net/pkt-gen/Makefile
+++ b/net/pkt-gen/Makefile
@@ -1,9 +1,8 @@
PORTNAME= pkt-gen
-PORTVERSION= g2017.08.06
-PORTREVISION= 1
+PORTVERSION= g2022.02.10
CATEGORIES= net
-MAINTAINER= ports@FreeBSD.org
+MAINTAINER= olivier@FreeBSD.org
COMMENT= Packet sink/source using the netmap API
LICENSE= BSD2CLAUSE
@@ -12,20 +11,26 @@ USES= gmake
USE_GITHUB= yes
GH_ACCOUNT= luigirizzo
GH_PROJECT= netmap
-GH_TAGNAME= 3c3ab5faa2ab9c89db09cd8339d0e96a1a78c41a
+GH_TAGNAME= 278045b
MAKEFILE= GNUmakefile
-WRKSRC_SUBDIR= apps/pkt-gen
-PATCH_WRKSRC= ${WRKSRC}/..
OPTIONS_DEFINE= PCAP
PCAP_DESC= Support loading packets from pcap file
-OPTIONS_DEFAULT=PCAP
+OPTIONS_DEFAULT= PCAP
PCAP_MAKE_ARGS= WITH_PCAP=1
-PLIST_FILES= bin/pkt-gen
+PLIST_FILES= bin/pkt-gen \
+ bin/nmreplay
+
+do-build:
+ cd ${WRKSRC}/libnetmap && ${SETENV} ${MAKE_ENV} ${GMAKE} ${MAKE_ARGS} ${MAKE_FLAGS} ${MAKEFILE}
+ cd ${WRKSRC}/apps/pkt-gen && ${SETENV} ${MAKE_ENV} ${GMAKE} ${MAKE_ARGS} ${MAKE_FLAGS} ${MAKEFILE}
+ cd ${WRKSRC}/apps/nmreplay && ${SETENV} ${MAKE_ENV} ${GMAKE} ${MAKE_ARGS} ${MAKE_FLAGS} ${MAKEFILE}
do-install:
- ${INSTALL_PROGRAM} ${WRKSRC}/pkt-gen \
+ ${INSTALL_PROGRAM} ${WRKSRC}/apps/pkt-gen/pkt-gen \
+ ${STAGEDIR}${PREFIX}/bin
+ ${INSTALL_PROGRAM} ${WRKSRC}/apps/nmreplay/nmreplay \
${STAGEDIR}${PREFIX}/bin
.include <bsd.port.mk>
diff --git a/net/pkt-gen/distinfo b/net/pkt-gen/distinfo
index 8f640522cb56..289aa5851c44 100644
--- a/net/pkt-gen/distinfo
+++ b/net/pkt-gen/distinfo
@@ -1,3 +1,3 @@
-TIMESTAMP = 1503651090
-SHA256 (luigirizzo-netmap-g2017.08.06-3c3ab5faa2ab9c89db09cd8339d0e96a1a78c41a_GH0.tar.gz) = 755f0b7d195cfdd7148591ef01ae4da569cae3e323ffded74dfbaa571dc267f3
-SIZE (luigirizzo-netmap-g2017.08.06-3c3ab5faa2ab9c89db09cd8339d0e96a1a78c41a_GH0.tar.gz) = 544000
+TIMESTAMP = 1644949020
+SHA256 (luigirizzo-netmap-g2022.02.10-278045b_GH0.tar.gz) = 96715bf359ad49ef4ee1b70559e6e268af07d6ed605b0074ca885a55211f8cec
+SIZE (luigirizzo-netmap-g2022.02.10-278045b_GH0.tar.gz) = 746973
diff --git a/net/pkt-gen/files/patch-apps_nmreplay_nmreplay.c b/net/pkt-gen/files/patch-apps_nmreplay_nmreplay.c
new file mode 100644
index 000000000000..435de25f65a6
--- /dev/null
+++ b/net/pkt-gen/files/patch-apps_nmreplay_nmreplay.c
@@ -0,0 +1,11 @@
+--- apps/nmreplay/nmreplay.c.orig 2021-11-25 23:16:06 UTC
++++ apps/nmreplay/nmreplay.c
+@@ -1280,7 +1280,7 @@ main(int argc, char **argv)
+ D("exiting on abort");
+ sleep(1);
+
+- return (0);
++ return (err);
+ }
+
+ /* conversion factor for numbers.
diff --git a/net/pkt-gen/files/patch-include_ctrs.h b/net/pkt-gen/files/patch-include_ctrs.h
deleted file mode 100644
index c5e3e3f90194..000000000000
--- a/net/pkt-gen/files/patch-include_ctrs.h
+++ /dev/null
@@ -1,36 +0,0 @@
---- include/ctrs.h.orig 2017-08-06 18:26:36 UTC
-+++ include/ctrs.h
-@@ -16,21 +16,27 @@ struct my_ctrs {
- * Caller has to make sure that the buffer is large enough.
- */
- static const char *
--norm2(char *buf, double val, char *fmt)
-+norm2(char *buf, double val, char *fmt, int normalize)
- {
- char *units[] = { "", "K", "M", "G", "T" };
- u_int i;
--
-- for (i = 0; val >=1000 && i < sizeof(units)/sizeof(char *) - 1; i++)
-- val /= 1000;
-+ if (normalize)
-+ for (i = 0; val >=1000 && i < sizeof(units)/sizeof(char *) - 1; i++)
-+ val /= 1000;
-+ else
-+ i=0;
- sprintf(buf, fmt, val, units[i]);
- return buf;
- }
-
- static __inline const char *
--norm(char *buf, double val)
-+norm(char *buf, double val, int normalize)
- {
-- return norm2(buf, val, "%.3f %s");
-+
-+ if (normalize)
-+ return norm2(buf, val, "%.3f %s", normalize);
-+ else
-+ return norm2(buf, val, "%.0f %s", normalize);
- }
-
- static __inline int
diff --git a/net/pkt-gen/files/patch-pkt-gen_GNUmakefile b/net/pkt-gen/files/patch-pkt-gen_GNUmakefile
deleted file mode 100644
index 5237c3d4d3c7..000000000000
--- a/net/pkt-gen/files/patch-pkt-gen_GNUmakefile
+++ /dev/null
@@ -1,13 +0,0 @@
---- pkt-gen/GNUmakefile.orig 2018-08-15 02:22:27 UTC
-+++ pkt-gen/GNUmakefile
-@@ -10,9 +10,8 @@ VPATH = $(SRCDIR)/apps/pkt-gen
-
- NO_MAN=
- CFLAGS = -O2 -pipe
--CFLAGS += -Werror -Wall -Wunused-function
-+CFLAGS += -Wunused-function
- CFLAGS += -I $(SRCDIR)/sys -I $(SRCDIR)/apps/include
--CFLAGS += -Wextra
-
- LDLIBS += -lpthread -lm
- ifeq ($(shell uname),Linux)
diff --git a/net/pkt-gen/files/patch-pkt-gen_pkt-gen.c b/net/pkt-gen/files/patch-pkt-gen_pkt-gen.c
deleted file mode 100644
index 06dd47f7c288..000000000000
--- a/net/pkt-gen/files/patch-pkt-gen_pkt-gen.c
+++ /dev/null
@@ -1,599 +0,0 @@
---- pkt-gen/pkt-gen.c.orig 2017-08-06 18:26:36 UTC
-+++ pkt-gen/pkt-gen.c
-@@ -62,6 +62,7 @@
- #endif
- #include <assert.h>
- #include <math.h>
-+#include <inttypes.h>
-
- #include <pthread.h>
-
-@@ -186,6 +187,7 @@ const char *indirect_payload="netmap pkt
- "http://info.iet.unipi.it/~luigi/netmap/ ";
-
- int verbose = 0;
-+int normalize = 1;
-
- #define VIRT_HDR_1 10 /* length of a base vnet-hdr */
- #define VIRT_HDR_2 12 /* length of the extenede vnet-hdr */
-@@ -204,12 +206,12 @@ struct pkt {
- struct ip ip;
- struct udphdr udp;
- uint8_t body[MAX_BODYSIZE]; /* hardwired */
-- } ipv4;
-+ } __attribute__((__packed__)) ipv4;
- struct {
- struct ip6_hdr ip;
- struct udphdr udp;
- uint8_t body[MAX_BODYSIZE]; /* hardwired */
-- } ipv6;
-+ } __attribute__((__packed__)) ipv6;
- };
- } __attribute__((__packed__));
-
-@@ -752,39 +754,39 @@ dump_payload(const char *_p, int len, st
- static void
- update_ip(struct pkt *pkt, struct glob_arg *g)
- {
-- struct ip *ip;
-- struct udphdr *udp;
-+ struct ip ip;
-+ struct udphdr udp;
- uint32_t oaddr, naddr;
- uint16_t oport, nport;
- uint16_t ip_sum, udp_sum;
-
-- ip = &pkt->ipv4.ip;
-- udp = &pkt->ipv4.udp;
-+ memcpy(&ip, &pkt->ipv4.ip, sizeof(ip));
-+ memcpy(&udp, &pkt->ipv4.udp, sizeof(udp));
- do {
- ip_sum = udp_sum = 0;
-- naddr = oaddr = ntohl(ip->ip_src.s_addr);
-- nport = oport = ntohs(udp->uh_sport);
-+ naddr = oaddr = ntohl(ip.ip_src.s_addr);
-+ nport = oport = ntohs(udp.uh_sport);
- if (g->options & OPT_RANDOM_SRC) {
-- ip->ip_src.s_addr = random();
-- udp->uh_sport = random();
-- naddr = ntohl(ip->ip_src.s_addr);
-- nport = ntohs(udp->uh_sport);
-+ ip.ip_src.s_addr = random();
-+ udp.uh_sport = random();
-+ naddr = ntohl(ip.ip_src.s_addr);
-+ nport = ntohs(udp.uh_sport);
- break;
- }
- if (oport < g->src_ip.port1) {
- nport = oport + 1;
-- udp->uh_sport = htons(nport);
-+ udp.uh_sport = htons(nport);
- break;
- }
- nport = g->src_ip.port0;
-- udp->uh_sport = htons(nport);
-+ udp.uh_sport = htons(nport);
- if (oaddr < g->src_ip.ipv4.end) {
- naddr = oaddr + 1;
-- ip->ip_src.s_addr = htonl(naddr);
-+ ip.ip_src.s_addr = htonl(naddr);
- break;
- }
- naddr = g->src_ip.ipv4.start;
-- ip->ip_src.s_addr = htonl(naddr);
-+ ip.ip_src.s_addr = htonl(naddr);
- } while (0);
- /* update checksums if needed */
- if (oaddr != naddr) {
-@@ -798,29 +800,29 @@ update_ip(struct pkt *pkt, struct glob_a
- udp_sum = cksum_add(udp_sum, nport);
- }
- do {
-- naddr = oaddr = ntohl(ip->ip_dst.s_addr);
-- nport = oport = ntohs(udp->uh_dport);
-+ naddr = oaddr = ntohl(ip.ip_dst.s_addr);
-+ nport = oport = ntohs(udp.uh_dport);
- if (g->options & OPT_RANDOM_DST) {
-- ip->ip_dst.s_addr = random();
-- udp->uh_dport = random();
-- naddr = ntohl(ip->ip_dst.s_addr);
-- nport = ntohs(udp->uh_dport);
-+ ip.ip_dst.s_addr = random();
-+ udp.uh_dport = random();
-+ naddr = ntohl(ip.ip_dst.s_addr);
-+ nport = ntohs(udp.uh_dport);
- break;
- }
- if (oport < g->dst_ip.port1) {
- nport = oport + 1;
-- udp->uh_dport = htons(nport);
-+ udp.uh_dport = htons(nport);
- break;
- }
- nport = g->dst_ip.port0;
-- udp->uh_dport = htons(nport);
-+ udp.uh_dport = htons(nport);
- if (oaddr < g->dst_ip.ipv4.end) {
- naddr = oaddr + 1;
-- ip->ip_dst.s_addr = htonl(naddr);
-+ ip.ip_dst.s_addr = htonl(naddr);
- break;
- }
- naddr = g->dst_ip.ipv4.start;
-- ip->ip_dst.s_addr = htonl(naddr);
-+ ip.ip_dst.s_addr = htonl(naddr);
- } while (0);
- /* update checksums */
- if (oaddr != naddr) {
-@@ -834,11 +836,13 @@ update_ip(struct pkt *pkt, struct glob_a
- udp_sum = cksum_add(udp_sum, nport);
- }
- if (udp_sum != 0)
-- udp->uh_sum = ~cksum_add(~udp->uh_sum, htons(udp_sum));
-+ udp.uh_sum = ~cksum_add(~udp.uh_sum, htons(udp_sum));
- if (ip_sum != 0) {
-- ip->ip_sum = ~cksum_add(~ip->ip_sum, htons(ip_sum));
-- udp->uh_sum = ~cksum_add(~udp->uh_sum, htons(ip_sum));
-+ ip.ip_sum = ~cksum_add(~ip.ip_sum, htons(ip_sum));
-+ udp.uh_sum = ~cksum_add(~udp.uh_sum, htons(ip_sum));
- }
-+ memcpy(&pkt->ipv4.ip, &ip, sizeof(ip));
-+ memcpy(&pkt->ipv4.udp, &udp, sizeof(udp));
- }
-
- #ifndef s6_addr16
-@@ -847,41 +851,41 @@ update_ip(struct pkt *pkt, struct glob_a
- static void
- update_ip6(struct pkt *pkt, struct glob_arg *g)
- {
-- struct ip6_hdr *ip6;
-- struct udphdr *udp;
-+ struct ip6_hdr ip6;
-+ struct udphdr udp;
- uint16_t udp_sum;
- uint16_t oaddr, naddr;
- uint16_t oport, nport;
- uint8_t group;
-
-- ip6 = &pkt->ipv6.ip;
-- udp = &pkt->ipv6.udp;
-+ memcpy(&ip6, &pkt->ipv6.ip, sizeof(ip6));
-+ memcpy(&udp, &pkt->ipv6.udp, sizeof(udp));
- do {
- udp_sum = 0;
- group = g->src_ip.ipv6.sgroup;
-- naddr = oaddr = ntohs(ip6->ip6_src.s6_addr16[group]);
-- nport = oport = ntohs(udp->uh_sport);
-+ naddr = oaddr = ntohs(ip6.ip6_src.s6_addr16[group]);
-+ nport = oport = ntohs(udp.uh_sport);
- if (g->options & OPT_RANDOM_SRC) {
-- ip6->ip6_src.s6_addr16[group] = random();
-- udp->uh_sport = random();
-- naddr = ntohs(ip6->ip6_src.s6_addr16[group]);
-- nport = ntohs(udp->uh_sport);
-+ ip6.ip6_src.s6_addr16[group] = random();
-+ udp.uh_sport = random();
-+ naddr = ntohs(ip6.ip6_src.s6_addr16[group]);
-+ nport = ntohs(udp.uh_sport);
- break;
- }
- if (oport < g->src_ip.port1) {
- nport = oport + 1;
-- udp->uh_sport = htons(nport);
-+ udp.uh_sport = htons(nport);
- break;
- }
- nport = g->src_ip.port0;
-- udp->uh_sport = htons(nport);
-+ udp.uh_sport = htons(nport);
- if (oaddr < ntohs(g->src_ip.ipv6.end.s6_addr16[group])) {
- naddr = oaddr + 1;
-- ip6->ip6_src.s6_addr16[group] = htons(naddr);
-+ ip6.ip6_src.s6_addr16[group] = htons(naddr);
- break;
- }
- naddr = ntohs(g->src_ip.ipv6.start.s6_addr16[group]);
-- ip6->ip6_src.s6_addr16[group] = htons(naddr);
-+ ip6.ip6_src.s6_addr16[group] = htons(naddr);
- } while (0);
- /* update checksums if needed */
- if (oaddr != naddr)
-@@ -891,29 +895,29 @@ update_ip6(struct pkt *pkt, struct glob_
- cksum_add(~oport, nport));
- do {
- group = g->dst_ip.ipv6.egroup;
-- naddr = oaddr = ntohs(ip6->ip6_dst.s6_addr16[group]);
-- nport = oport = ntohs(udp->uh_dport);
-+ naddr = oaddr = ntohs(ip6.ip6_dst.s6_addr16[group]);
-+ nport = oport = ntohs(udp.uh_dport);
- if (g->options & OPT_RANDOM_DST) {
-- ip6->ip6_dst.s6_addr16[group] = random();
-- udp->uh_dport = random();
-- naddr = ntohs(ip6->ip6_dst.s6_addr16[group]);
-- nport = ntohs(udp->uh_dport);
-+ ip6.ip6_dst.s6_addr16[group] = random();
-+ udp.uh_dport = random();
-+ naddr = ntohs(ip6.ip6_dst.s6_addr16[group]);
-+ nport = ntohs(udp.uh_dport);
- break;
- }
- if (oport < g->dst_ip.port1) {
- nport = oport + 1;
-- udp->uh_dport = htons(nport);
-+ udp.uh_dport = htons(nport);
- break;
- }
- nport = g->dst_ip.port0;
-- udp->uh_dport = htons(nport);
-+ udp.uh_dport = htons(nport);
- if (oaddr < ntohs(g->dst_ip.ipv6.end.s6_addr16[group])) {
- naddr = oaddr + 1;
-- ip6->ip6_dst.s6_addr16[group] = htons(naddr);
-+ ip6.ip6_dst.s6_addr16[group] = htons(naddr);
- break;
- }
- naddr = ntohs(g->dst_ip.ipv6.start.s6_addr16[group]);
-- ip6->ip6_dst.s6_addr16[group] = htons(naddr);
-+ ip6.ip6_dst.s6_addr16[group] = htons(naddr);
- } while (0);
- /* update checksums */
- if (oaddr != naddr)
-@@ -923,7 +927,9 @@ update_ip6(struct pkt *pkt, struct glob_
- udp_sum = cksum_add(udp_sum,
- cksum_add(~oport, nport));
- if (udp_sum != 0)
-- udp->uh_sum = ~cksum_add(~udp->uh_sum, udp_sum);
-+ udp.uh_sum = ~cksum_add(~udp.uh_sum, udp_sum);
-+ memcpy(&pkt->ipv6.ip, &ip6, sizeof(ip6));
-+ memcpy(&pkt->ipv6.udp, &udp, sizeof(udp));
- }
-
- static void
-@@ -944,9 +950,10 @@ initialize_packet(struct targ *targ)
- {
- struct pkt *pkt = &targ->pkt;
- struct ether_header *eh;
-- struct ip6_hdr *ip6;
-- struct ip *ip;
-- struct udphdr *udp;
-+ struct ip6_hdr ip6;
-+ struct ip ip;
-+ struct udphdr udp;
-+ void *udp_ptr;
- uint16_t paylen;
- uint32_t csum;
- const char *payload = targ->g->options & OPT_INDIRECT ?
-@@ -978,7 +985,7 @@ initialize_packet(struct targ *targ)
- #endif
-
- paylen = targ->g->pkt_size - sizeof(*eh) -
-- (targ->g->af == AF_INET ? sizeof(*ip): sizeof(*ip6));
-+ (targ->g->af == AF_INET ? sizeof(ip): sizeof(ip6));
-
- /* create a nice NUL-terminated string */
- for (i = 0; i < paylen; i += l0) {
-@@ -995,56 +1002,61 @@ initialize_packet(struct targ *targ)
-
- if (targ->g->af == AF_INET) {
- eh->ether_type = htons(ETHERTYPE_IP);
-- ip = &pkt->ipv4.ip;
-- udp = &pkt->ipv4.udp;
-- ip->ip_v = IPVERSION;
-- ip->ip_hl = sizeof(*ip) >> 2;
-- ip->ip_id = 0;
-- ip->ip_tos = IPTOS_LOWDELAY;
-- ip->ip_len = htons(targ->g->pkt_size - sizeof(*eh));
-- ip->ip_id = 0;
-- ip->ip_off = htons(IP_DF); /* Don't fragment */
-- ip->ip_ttl = IPDEFTTL;
-- ip->ip_p = IPPROTO_UDP;
-- ip->ip_dst.s_addr = htonl(targ->g->dst_ip.ipv4.start);
-- ip->ip_src.s_addr = htonl(targ->g->src_ip.ipv4.start);
-- ip->ip_sum = wrapsum(checksum(ip, sizeof(*ip), 0));
-+ memcpy(&ip, &pkt->ipv4.ip, sizeof(ip));
-+ udp_ptr = &pkt->ipv4.udp;
-+ ip.ip_v = IPVERSION;
-+ ip.ip_hl = sizeof(ip) >> 2;
-+ ip.ip_id = 0;
-+ ip.ip_tos = IPTOS_LOWDELAY;
-+ ip.ip_len = htons(targ->g->pkt_size - sizeof(*eh));
-+ ip.ip_id = 0;
-+ ip.ip_off = htons(IP_DF); /* Don't fragment */
-+ ip.ip_ttl = IPDEFTTL;
-+ ip.ip_p = IPPROTO_UDP;
-+ ip.ip_dst.s_addr = htonl(targ->g->dst_ip.ipv4.start);
-+ ip.ip_src.s_addr = htonl(targ->g->src_ip.ipv4.start);
-+ ip.ip_sum = wrapsum(checksum(&ip, sizeof(ip), 0));
-+ memcpy(&pkt->ipv4.ip, &ip, sizeof(ip));
- } else {
- eh->ether_type = htons(ETHERTYPE_IPV6);
-- ip6 = &pkt->ipv6.ip;
-- udp = &pkt->ipv6.udp;
-- ip6->ip6_flow = 0;
-- ip6->ip6_plen = htons(paylen);
-- ip6->ip6_vfc = IPV6_VERSION;
-- ip6->ip6_nxt = IPPROTO_UDP;
-- ip6->ip6_hlim = IPV6_DEFHLIM;
-- ip6->ip6_src = targ->g->src_ip.ipv6.start;
-- ip6->ip6_dst = targ->g->dst_ip.ipv6.start;
-+ memcpy(&ip6, &pkt->ipv4.ip, sizeof(ip6));
-+ udp_ptr = &pkt->ipv6.udp;
-+ ip6.ip6_flow = 0;
-+ ip6.ip6_plen = htons(paylen);
-+ ip6.ip6_vfc = IPV6_VERSION;
-+ ip6.ip6_nxt = IPPROTO_UDP;
-+ ip6.ip6_hlim = IPV6_DEFHLIM;
-+ ip6.ip6_src = targ->g->src_ip.ipv6.start;
-+ ip6.ip6_dst = targ->g->dst_ip.ipv6.start;
- }
-+ memcpy(&udp, udp_ptr, sizeof(udp));
-
-- udp->uh_sport = htons(targ->g->src_ip.port0);
-- udp->uh_dport = htons(targ->g->dst_ip.port0);
-- udp->uh_ulen = htons(paylen);
-+ udp.uh_sport = htons(targ->g->src_ip.port0);
-+ udp.uh_dport = htons(targ->g->dst_ip.port0);
-+ udp.uh_ulen = htons(paylen);
- if (targ->g->af == AF_INET) {
- /* Magic: taken from sbin/dhclient/packet.c */
-- udp->uh_sum = wrapsum(
-- checksum(udp, sizeof(*udp), /* udp header */
-+ udp.uh_sum = wrapsum(
-+ checksum(&udp, sizeof(udp), /* udp header */
- checksum(pkt->ipv4.body, /* udp payload */
-- paylen - sizeof(*udp),
-+ paylen - sizeof(udp),
- checksum(&pkt->ipv4.ip.ip_src, /* pseudo header */
- 2 * sizeof(pkt->ipv4.ip.ip_src),
-- IPPROTO_UDP + (u_int32_t)ntohs(udp->uh_ulen)))));
-+ IPPROTO_UDP + (u_int32_t)ntohs(udp.uh_ulen)))));
-+ memcpy(&pkt->ipv4.ip, &ip, sizeof(ip));
- } else {
- /* Save part of pseudo header checksum into csum */
- csum = IPPROTO_UDP << 24;
- csum = checksum(&csum, sizeof(csum), paylen);
-- udp->uh_sum = wrapsum(
-- checksum(udp, sizeof(*udp), /* udp header */
-+ udp.uh_sum = wrapsum(
-+ checksum(udp_ptr, sizeof(udp), /* udp header */
- checksum(pkt->ipv6.body, /* udp payload */
-- paylen - sizeof(*udp),
-+ paylen - 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(udp_ptr, &udp, sizeof(udp));
-
- bzero(&pkt->vh, sizeof(pkt->vh));
- // dump_payload((void *)pkt, targ->g->pkt_size, NULL, 0);
-@@ -1324,7 +1336,7 @@ ping_body(void *data)
- ts.tv_nsec += 1000000000;
- ts.tv_sec--;
- }
-- if (0) D("seq %d/%lu delta %d.%09d", seq, sent,
-+ if (0) D("seq %d/%" PRIu64 " delta %d.%09d", seq, sent,
- (int)ts.tv_sec, (int)ts.tv_nsec);
- t_cur = ts.tv_sec * 1000000000UL + ts.tv_nsec;
- if (t_cur < t_min)
-@@ -1409,7 +1421,7 @@ pong_body(void *data)
- return NULL;
- }
- if (n > 0)
-- D("understood ponger %lu but don't know how to do it", n);
-+ D("understood ponger %" PRIu64 " but don't know how to do it", n);
- while (!targ->cancel && (n == 0 || sent < n)) {
- uint32_t txcur, txavail;
- //#define BUSYWAIT
-@@ -1864,6 +1876,7 @@ txseq_body(void *data)
- unsigned int space;
- unsigned int head;
- int fcnt;
-+ uint16_t sum;
-
- if (!rate_limit) {
- budget = targ->g->burst;
-@@ -1910,19 +1923,19 @@ txseq_body(void *data)
- sent < limit; sent++, sequence++) {
- struct netmap_slot *slot = &ring->slot[head];
- char *p = NETMAP_BUF(ring, slot->buf_idx);
-- uint16_t *w = (uint16_t *)PKT(pkt, body, targ->g->af), t,
-- *sum = (uint16_t *)(targ->g->af == AF_INET ?
-- &pkt->ipv4.udp.uh_sum : &pkt->ipv6.udp.uh_sum);
-+ uint16_t *w = (uint16_t *)PKT(pkt, body, targ->g->af), t;
-+
-+ memcpy(&sum, targ->g->af == AF_INET ? &pkt->ipv4.udp.uh_sum : &pkt->ipv6.udp.uh_sum, sizeof(sum));
-
- slot->flags = 0;
- t = *w;
- PKT(pkt, body, targ->g->af)[0] = sequence >> 24;
- PKT(pkt, body, targ->g->af)[1] = (sequence >> 16) & 0xff;
-- *sum = ~cksum_add(~*sum, cksum_add(~t, *w));
-+ sum = ~cksum_add(~sum, cksum_add(~t, *w));
- t = *++w;
- PKT(pkt, body, targ->g->af)[2] = (sequence >> 8) & 0xff;
- PKT(pkt, body, targ->g->af)[3] = sequence & 0xff;
-- *sum = ~cksum_add(~*sum, cksum_add(~t, *w));
-+ sum = ~cksum_add(~sum, cksum_add(~t, *w));
- nm_pkt_copy(frame, p, size);
- if (fcnt == frags) {
- update_addresses(pkt, targ->g);
-@@ -1952,6 +1965,7 @@ txseq_body(void *data)
- budget--;
- }
- }
-+ memcpy(targ->g->af == AF_INET ? &pkt->ipv4.udp.uh_sum : &pkt->ipv6.udp.uh_sum, &sum, sizeof(sum));
-
- ring->cur = ring->head = head;
-
-@@ -2209,7 +2223,7 @@ tx_output(struct my_ctrs *cur, double de
- abs = cur->pkts / (double)(cur->events);
-
- printf("Speed: %spps Bandwidth: %sbps (raw %sbps). Average batch: %.2f pkts\n",
-- norm(b1, pps), norm(b2, bw), norm(b3, raw_bw), abs);
-+ norm(b1, pps, normalize), norm(b2, bw, normalize), norm(b3, raw_bw, normalize), abs);
- }
-
- static void
-@@ -2219,38 +2233,72 @@ usage(void)
- fprintf(stderr,
- "Usage:\n"
- "%s arguments\n"
-- "\t-i interface interface name\n"
-- "\t-f function tx rx ping pong txseq rxseq\n"
-- "\t-n count number of iterations (can be 0)\n"
-- "\t-t pkts_to_send also forces tx mode\n"
-- "\t-r pkts_to_receive also forces rx mode\n"
-- "\t-l pkt_size in bytes excluding CRC\n"
-- "\t (if passed a second time, use random sizes\n"
-- "\t bigger than the second one and lower than\n"
-- "\t the first one)\n"
-- "\t-d dst_ip[:port[-dst_ip:port]] single or range\n"
-- "\t-s src_ip[:port[-src_ip:port]] single or range\n"
-- "\t-D dst-mac\n"
-- "\t-S src-mac\n"
-- "\t-a cpu_id use setaffinity\n"
-- "\t-b burst size testing, mostly\n"
-- "\t-c cores cores to use\n"
-- "\t-p threads processes/threads to use\n"
-- "\t-T report_ms milliseconds between reports\n"
-- "\t-w wait_for_link_time in seconds\n"
-- "\t-R rate in packets per second\n"
-- "\t-X dump payload\n"
-- "\t-H len add empty virtio-net-header with size 'len'\n"
-- "\t-E pipes allocate extra space for a number of pipes\n"
-- "\t-r do not touch the buffers (send rubbish)\n"
-- "\t-P file load packet from pcap file\n"
-- "\t-z use random IPv4 src address/port\n"
-- "\t-Z use random IPv4 dst address/port\n"
-- "\t-F num_frags send multi-slot packets\n"
-- "\t-A activate pps stats on receiver\n"
-- "",
-+ "\t-i interface interface name\n"
-+ "\t-f function tx rx ping pong txseq rxseq\n"
-+ "\t-n count number of iterations (can be 0)\n"
-+#ifdef notyet
-+ "\t-t pkts_to_send also forces tx mode\n"
-+ "\t-r pkts_to_receive also forces rx mode\n"
-+#endif
-+ "\t-l pkt_size in bytes excluding CRC\n"
-+ "\t (if passed a second time, use random sizes\n"
-+ "\t bigger than the second one and lower than\n"
-+ "\t the first one)\n"
-+ "\t-d dst_ip[:port[-dst_ip:port]] single or range\n"
-+ "\t-s src_ip[:port[-src_ip:port]] single or range\n"
-+ "\t-D dst-mac\n"
-+ "\t-S src-mac\n"
-+ "\t-a cpu_id use setaffinity\n"
-+ "\t-b burst size testing, mostly\n"
-+ "\t-c cores cores to use\n"
-+ "\t-p threads processes/threads to use\n"
-+ "\t-T report_ms milliseconds between reports\n"
-+ "\t-w wait_for_link_time in seconds\n"
-+ "\t-R rate in packets per second\n"
-+ "\t-X dump payload\n"
-+ "\t-H len add empty virtio-net-header with size 'len'\n"
-+ "\t-E pipes allocate extra space for a number of pipes\n"
-+ "\t-r do not touch the buffers (send rubbish)\n"
-+ "\t-P file load packet from pcap file\n"
-+ "\t-z use random IPv4 src address/port\n"
-+ "\t-Z use random IPv4 dst address/port\n"
-+ "\t-F num_frags send multi-slot packets\n"
-+ "\t-A activate pps stats on receiver\n"
-+ "\t-4 IPv4\n"
-+ "\t-6 IPv6\n"
-+ "\t-N don't normalize units (Kbps/Mbps/etc)\n"
-+ "\t-I use indirect buffers, tx only\n"
-+ "\t-o options data generation options (parsed using atoi)\n"
-+ "\t OPT_PREFETCH 1\n"
-+ "\t OPT_ACCESS 2\n"
-+ "\t OPT_COPY 4\n"
-+ "\t OPT_MEMCPY 8\n"
-+ "\t OPT_TS 16 (add a timestamp)\n"
-+ "\t OPT_INDIRECT 32 (use indirect buffers)\n"
-+ "\t OPT_DUMP 64 (dump rx/tx traffic)\n"
-+ "\t OPT_RUBBISH 256\n"
-+ "\t (send wathever the buffers contain)\n"
-+ "\t OPT_RANDOM_SRC 512\n"
-+ "\t OPT_RANDOM_DST 1024\n"
-+ "\t OPT_PPS_STATS 2048\n"
-+ "\t-W exit RX with no traffic\n"
-+ "\t-v verbose (more v = more verbose)\n"
-+ "\t-C vale-config specify a vale config\n"
-+#ifdef notyet
-+ "\t The configuration may consist of 0 to 4\n"
-+ "\t numbers separated by commas:\n"
-+ "\t #tx-slots,#rx-slots,#tx-rings,#rx-rings.\n"
-+ "\t Missing numbers or zeroes stand for default\n"
-+ "\t values. As an additional convenience, if\n"
-+ "\t exactly one number is specified, then this\n"
-+ "\t is assigned to both #tx-slots and #rx-slots.\n"
-+ "\t If there is no 4th number, then the 3rd is\n"
-+ "\t assigned to both #tx-rings and #rx-rings.\n"
-+#endif
-+ "\t-e extra-bufs extra_bufs - goes in nr_arg3\n"
-+ "\t-m ignored\n"
-+ "",
- cmd);
--
- exit(0);
- }
-
-@@ -2405,13 +2453,13 @@ main_thread(struct glob_arg *g)
- ppsdev = sqrt(ppsdev);
-
- snprintf(b4, sizeof(b4), "[avg/std %s/%s pps]",
-- norm(b1, ppsavg), norm(b2, ppsdev));
-+ norm(b1, ppsavg, normalize), norm(b2, ppsdev, normalize));
- }
-
- D("%spps %s(%spkts %sbps in %llu usec) %.2f avg_batch %d min_space",
-- norm(b1, pps), b4,
-- norm(b2, (double)x.pkts),
-- norm(b3, (double)x.bytes*8),
-+ norm(b1, pps, normalize), b4,
-+ norm(b2, (double)x.pkts, normalize),
-+ norm(b3, (double)x.bytes*8, normalize),
- (unsigned long long)usec,
- abs, (int)cur.min_space);
- prev = cur;
-@@ -2589,7 +2637,7 @@ main(int arc, char **argv)
- g.virt_header = 0;
- g.wait_link = 2;
-
-- while ((ch = getopt(arc, argv, "46a:f:F:n:i:Il:d:s:D:S:b:c:o:p:"
-+ while ((ch = getopt(arc, argv, "46a:f:F:Nn:i:Il:d:s:D:S:b:c:o:p:"
- "T:w:WvR:XC:H:e:E:m:rP:zZA")) != -1) {
-
- switch(ch) {
-@@ -2606,6 +2654,10 @@ main(int arc, char **argv)
- g.af = AF_INET6;
- break;
-
-+ case 'N':
-+ normalize = 0;
-+ break;
-+
- case 'n':
- g.npackets = strtoull(optarg, NULL, 10);
- break;
-@@ -2633,7 +2685,7 @@ main(int arc, char **argv)
- break;
-
- case 'o': /* data generation options */
-- g.options = atoi(optarg);
-+ g.options |= atoi(optarg);
- break;
-
- case 'a': /* force affinity */
-@@ -2973,8 +3025,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);