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
This commit is contained in:
parent
2d7842d0bf
commit
8c3b8c8386
@ -25,7 +25,7 @@
|
|||||||
.\"
|
.\"
|
||||||
.\" $FreeBSD$
|
.\" $FreeBSD$
|
||||||
.\"
|
.\"
|
||||||
.Dd November 21, 2020
|
.Dd April 21, 2023
|
||||||
.Dt PKT-GEN 8
|
.Dt PKT-GEN 8
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
@ -150,7 +150,7 @@ mode), a single RX ring (in
|
|||||||
mode), or a TX/RX ring pair.
|
mode), or a TX/RX ring pair.
|
||||||
The number of
|
The number of
|
||||||
.Ar threads
|
.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
|
in the device specified by
|
||||||
.Ar interface .
|
.Ar interface .
|
||||||
.It Fl T Ar report_ms
|
.It Fl T Ar report_ms
|
||||||
@ -288,7 +288,8 @@ length of 128 bytes.
|
|||||||
You must set the destination MAC address for
|
You must set the destination MAC address for
|
||||||
packets to be received by the target host.
|
packets to be received by the target host.
|
||||||
.Bd -literal -offset indent
|
.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
|
.Ed
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr netmap 4 ,
|
.Xr netmap 4 ,
|
||||||
|
@ -283,6 +283,7 @@ struct glob_arg {
|
|||||||
#define OPT_RANDOM_SRC 512
|
#define OPT_RANDOM_SRC 512
|
||||||
#define OPT_RANDOM_DST 1024
|
#define OPT_RANDOM_DST 1024
|
||||||
#define OPT_PPS_STATS 2048
|
#define OPT_PPS_STATS 2048
|
||||||
|
#define OPT_UPDATE_CSUM 4096
|
||||||
int dev_type;
|
int dev_type;
|
||||||
#ifndef NO_PCAP
|
#ifndef NO_PCAP
|
||||||
pcap_t *p;
|
pcap_t *p;
|
||||||
@ -1005,6 +1006,85 @@ update_addresses(struct pkt *pkt, struct targ *t)
|
|||||||
else
|
else
|
||||||
update_ip6(pkt, t);
|
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.
|
* initialize one packet and prepare for the next one.
|
||||||
* The copy could be done better instead of repeating it each time.
|
* The copy could be done better instead of repeating it each time.
|
||||||
@ -1744,6 +1824,7 @@ sender_body(void *data)
|
|||||||
size = nrand48(targ->seed) %
|
size = nrand48(targ->seed) %
|
||||||
(targ->g->pkt_size - targ->g->pkt_min_size) +
|
(targ->g->pkt_size - targ->g->pkt_min_size) +
|
||||||
targ->g->pkt_min_size;
|
targ->g->pkt_min_size;
|
||||||
|
update_size(pkt, targ, size);
|
||||||
}
|
}
|
||||||
m = send_packets(txring, pkt, frame, size, targ,
|
m = send_packets(txring, pkt, frame, size, targ,
|
||||||
limit, options);
|
limit, options);
|
||||||
@ -2528,6 +2609,7 @@ usage(int errcode)
|
|||||||
" OPT_RANDOM_SRC 512\n"
|
" OPT_RANDOM_SRC 512\n"
|
||||||
" OPT_RANDOM_DST 1024\n"
|
" OPT_RANDOM_DST 1024\n"
|
||||||
" OPT_PPS_STATS 2048\n"
|
" OPT_PPS_STATS 2048\n"
|
||||||
|
" OPT_UPDATE_CSUM 4096\n"
|
||||||
"",
|
"",
|
||||||
cmd);
|
cmd);
|
||||||
exit(errcode);
|
exit(errcode);
|
||||||
@ -3284,8 +3366,8 @@ main(int arc, char **argv)
|
|||||||
g.tx_period.tv_nsec = g.tx_period.tv_nsec % 1000000000;
|
g.tx_period.tv_nsec = g.tx_period.tv_nsec % 1000000000;
|
||||||
}
|
}
|
||||||
if (g.td_type == TD_TYPE_SENDER)
|
if (g.td_type == TD_TYPE_SENDER)
|
||||||
D("Sending %d packets every %ld.%09ld s",
|
D("Sending %d packets every %jd.%09ld s",
|
||||||
g.burst, g.tx_period.tv_sec, g.tx_period.tv_nsec);
|
g.burst, (intmax_t)g.tx_period.tv_sec, g.tx_period.tv_nsec);
|
||||||
/* Install ^C handler. */
|
/* Install ^C handler. */
|
||||||
global_nthreads = g.nthreads;
|
global_nthreads = g.nthreads;
|
||||||
sigemptyset(&ss);
|
sigemptyset(&ss);
|
||||||
|
Loading…
Reference in New Issue
Block a user