Annotation of elwix/patches/freebsd.pkt-gen.PR187149.patch, revision 1.1.2.1
1.1.2.1 ! misho 1: Index: tools/tools/netmap/pkt-gen.c
! 2: ===================================================================
! 3: --- tools/tools/netmap/pkt-gen.c (revision 283536)
! 4: +++ tools/tools/netmap/pkt-gen.c (working copy)
! 5: @@ -174,6 +174,7 @@
! 6: int nthreads;
! 7: int cpus;
! 8: int options; /* testing */
! 9: + int softchecksum; /* Software UDP checksum calculation */
! 10: #define OPT_PREFETCH 1
! 11: #define OPT_ACCESS 2
! 12: #define OPT_COPY 4
! 13: @@ -565,6 +566,7 @@
! 14: {
! 15: uint32_t a;
! 16: uint16_t p;
! 17: + struct ether_header *eh = &pkt->eh;
! 18: struct ip *ip = &pkt->ip;
! 19: struct udphdr *udp = &pkt->udp;
! 20:
! 21: @@ -611,6 +613,25 @@
! 22: ip->ip_dst.s_addr = htonl(g->dst_ip.start);
! 23: } while (0);
! 24: // update checksum
! 25: + /* Some NIC disable hardware CRC checksum in netmap mode
! 26: + * and don't allow to re-enable it */
! 27: +
! 28: + if (g->softchecksum) {
! 29: + ip->ip_sum = 0;
! 30: + ip->ip_sum = wrapsum(checksum(ip, sizeof(*ip), 0));
! 31: + /* UDP checksum */
! 32: + uint16_t paylen = g->pkt_size - sizeof(*eh) - sizeof(struct ip);
! 33: + udp->uh_sum = 0;
! 34: + udp->uh_sum = wrapsum(checksum(udp, sizeof(*udp),
! 35: + checksum(pkt->body,
! 36: + paylen - sizeof(*udp),
! 37: + checksum(&ip->ip_src, 2 * sizeof(ip->ip_src),
! 38: + IPPROTO_UDP + (u_int32_t)ntohs(udp->uh_ulen)
! 39: + )
! 40: + )
! 41: + ));
! 42: + }
! 43: +
! 44: }
! 45:
! 46: /*
! 47: @@ -1409,6 +1430,7 @@
! 48: "\t-X dump payload\n"
! 49: "\t-H len add empty virtio-net-header with size 'len'\n"
! 50: "\t-P file load packet from pcap file\n"
! 51: + "\t-U enable software UDP CRC chekcsum\n"
! 52: "\t-z use random IPv4 src address/port\n"
! 53: "\t-Z use random IPv4 dst address/port\n"
! 54: "",
! 55: @@ -1683,7 +1705,7 @@
! 56: g.virt_header = 0;
! 57:
! 58: while ( (ch = getopt(arc, argv,
! 59: - "a:f:F:n:i:Il:d:s:D:S:b:c:o:p:T:w:WvR:XC:H:e:m:P:zZ")) != -1) {
! 60: + "a:f:F:n:i:Il:d:s:D:S:b:c:o:p:T:Uw:WvR:XC:H:e:m:P:zZ")) != -1) {
! 61: struct sf *fn;
! 62:
! 63: switch(ch) {
! 64: @@ -1785,6 +1807,9 @@
! 65: case 'b': /* burst */
! 66: g.burst = atoi(optarg);
! 67: break;
! 68: + case 'U': /* software UDP checksum */
! 69: + g.softchecksum = 1;
! 70: + break;
! 71: case 'c':
! 72: g.cpus = atoi(optarg);
! 73: break;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>