Diff for /elwix/patches/freebsd.pkt-gen.PR187149.patch between versions 1.1 and 1.2

version 1.1, 2017/06/13 17:57:53 version 1.2, 2021/03/11 13:59:52
Line 0 Line 1
   Index: tools/tools/netmap/pkt-gen.c
   ===================================================================
   --- tools/tools/netmap/pkt-gen.c        (revision 283536)
   +++ tools/tools/netmap/pkt-gen.c        (working copy)
   @@ -174,6 +174,7 @@
           int nthreads;
           int cpus;
           int options;    /* testing */
   +       int softchecksum;       /* Software UDP checksum calculation */
    #define OPT_PREFETCH   1
    #define OPT_ACCESS     2
    #define OPT_COPY       4
   @@ -565,6 +566,7 @@
    {
           uint32_t a;
           uint16_t p;
   +       struct ether_header *eh = &pkt->eh;
           struct ip *ip = &pkt->ip;
           struct udphdr *udp = &pkt->udp;
    
   @@ -611,6 +613,25 @@
           ip->ip_dst.s_addr = htonl(g->dst_ip.start);
        } while (0);
        // update checksum
   +       /* Some NIC disable hardware CRC checksum in netmap mode
   +        * and don't allow to re-enable it */
   +
   +       if (g->softchecksum) {
   +               ip->ip_sum = 0;
   +               ip->ip_sum = wrapsum(checksum(ip, sizeof(*ip), 0));
   +               /* UDP checksum */
   +               uint16_t paylen = g->pkt_size - sizeof(*eh) - sizeof(struct ip);
   +               udp->uh_sum = 0;
   +               udp->uh_sum = wrapsum(checksum(udp, sizeof(*udp),
   +                       checksum(pkt->body,
   +                               paylen - sizeof(*udp),
   +                               checksum(&ip->ip_src, 2 * sizeof(ip->ip_src),
   +                                       IPPROTO_UDP + (u_int32_t)ntohs(udp->uh_ulen)
   +                               )
   +                       )
   +               ));
   +       }
   +
    }
    
    /*
   @@ -1409,6 +1430,7 @@
                   "\t-X                   dump payload\n"
                   "\t-H len               add empty virtio-net-header with size 'len'\n"
                   "\t-P file              load packet from pcap file\n"
   +               "\t-U                   enable software UDP CRC chekcsum\n"
                   "\t-z                   use random IPv4 src address/port\n"
                   "\t-Z                   use random IPv4 dst address/port\n"
                   "",
   @@ -1683,7 +1705,7 @@
           g.virt_header = 0;
    
           while ( (ch = getopt(arc, argv,
   -                       "a:f:F:n:i:Il:d:s:D:S:b:c:o:p:T:w:WvR:XC:H:e:m:P:zZ")) != -1) {
   +                       "a:f:F:n:i:Il:d:s:D:S:b:c:o:p:T:Uw:WvR:XC:H:e:m:P:zZ")) != -1) {
                   struct sf *fn;
    
                   switch(ch) {
   @@ -1785,6 +1807,9 @@
                   case 'b':       /* burst */
                           g.burst = atoi(optarg);
                           break;
   +               case 'U':       /* software UDP checksum */
   +                       g.softchecksum = 1;
   +                       break;
                   case 'c':
                           g.cpus = atoi(optarg);
                           break;

Removed from v.1.1  
changed lines
  Added in v.1.2


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>