On 05/08/2015 17:21, Alexandru Badicioiu wrote:
I think we need to fix this (at least for IPv4) as it is likely to fail pktio validation suite. Packets with wrong checksums are likely to be discarded by ports configured for checksum validation. IPv6 support can be added later.

Alex

agree, ipv6 can be separate patch. If ipv6 also need fixing we need to create bug for it, not not forget about this issue.

Maxim.
On 8 May 2015 at 17:17, Bill Fischofer <bill.fischo...@linaro.org <mailto:bill.fischo...@linaro.org>> wrote:

    If we're going to fix this, it should be a complete fix.  This
    seems to be tied to IPv4 and it should support IPv6 as well.

    On Fri, May 8, 2015 at 9:02 AM, Alexandru Badicioiu
    <alexandru.badici...@linaro.org
    <mailto:alexandru.badici...@linaro.org>> wrote:

        Ping.

        ---------- Forwarded message ----------
        From: <alexandru.badici...@linaro.org
        <mailto:alexandru.badici...@linaro.org>>
        Date: 5 May 2015 at 15:07
        Subject: [lng-odp][PATCH 1/1 v1] helpers: fix udp checksum
        computation
        To: lng-odp@lists.linaro.org <mailto:lng-odp@lists.linaro.org>
        Cc: Alexandru Badicioiu <alexandru.badici...@linaro.org
        <mailto:alexandru.badici...@linaro.org>>


        From: Alexandru Badicioiu <alexandru.badici...@linaro.org
        <mailto:alexandru.badici...@linaro.org>>

        v1 - fixed compile error due to -Wcast-align

        Signed-off-by: Alexandru Badicioiu
        <alexandru.badici...@linaro.org
        <mailto:alexandru.badici...@linaro.org>>
        ---
         helper/include/odp/helper/udp.h |   37
        +++++++++++++------------------------
         1 files changed, 13 insertions(+), 24 deletions(-)

        diff --git a/helper/include/odp/helper/udp.h
        b/helper/include/odp/helper/udp.h
        index 99a96f2..d14cbef 100644
        --- a/helper/include/odp/helper/udp.h
        +++ b/helper/include/odp/helper/udp.h
        @@ -33,15 +33,6 @@ typedef struct ODP_PACKED {
                uint16be_t chksum;   /**< UDP header and data checksum
        (0 if not used)*/
         } odph_udphdr_t;

        -/** UDP pseudo header */
        -typedef struct ODPH_PACKET {
        -       uint32be_t src_addr; /**< Source addr */
        -       uint32be_t dst_addr; /**< Destination addr */
        -       uint8_t pad;         /**< pad byte */
        -       uint8_t proto;       /**< UDP protocol */
        -       uint16be_t length;   /**< data length */
        -} odph_udpphdr_t;
        -
         /**
          * UDP checksum
          *
        @@ -53,10 +44,10 @@ typedef struct ODPH_PACKET {
         static inline uint16_t odph_ipv4_udp_chksum(odp_packet_t pkt)
         {
                uint32_t sum = 0;
        -       odph_udpphdr_t phdr;
                odph_udphdr_t *udph;
                odph_ipv4hdr_t *iph;
                uint16_t udplen;
        +       uint8_t *buf;

                if (!odp_packet_l3_offset(pkt))
                        return 0;
        @@ -68,24 +59,22 @@ static inline uint16_t
        odph_ipv4_udp_chksum(odp_packet_t pkt)
                udph = (odph_udphdr_t *)odp_packet_l4_ptr(pkt, NULL);
                udplen = odp_be_to_cpu_16(udph->length);

        -       /* the source ip */
        -       phdr.src_addr = iph->src_addr;
        -       /* the dest ip */
        -       phdr.dst_addr = iph->dst_addr;
        -       /* proto */
        -       phdr.pad = 0;
        -       phdr.proto = ODPH_IPPROTO_UDP;
        -       /* the length */
        -       phdr.length = udph->length;
        -
        -       /* calc UDP pseudo header chksum */
        -       sum = (__odp_force uint32_t) odp_chksum(&phdr,
        sizeof(odph_udpphdr_t));
        -       /* calc udp header and data chksum */
        -       sum += (__odp_force uint32_t) odp_chksum(udph, udplen);
        +       /* 32-bit sum of all 16-bit words covered by UDP chksum */
        +       sum = (iph->src_addr & 0xFFFF) + (iph->src_addr >> 16) +
        +             (iph->dst_addr & 0xFFFF) + (iph->dst_addr >> 16) +
        +             (uint16_t) iph->proto + udplen;
        +       for (buf = (uint8_t *)udph; udplen > 1; udplen -= 2) {
        +               sum += ((*buf << 8) + *(buf + 1));
        +               buf += 2;
        +       }

                /* Fold sum to 16 bits: add carrier to result */
                while (sum >> 16)
                        sum = (sum & 0xFFFF) + (sum >> 16);
        +
        +       /* 1's complement */
        +       sum = ~sum;
        +
                /* set computation result */
                sum = (sum == 0x0) ? 0xFFFF : sum;

        --
        1.7.3.4



        _______________________________________________
        lng-odp mailing list
        lng-odp@lists.linaro.org <mailto:lng-odp@lists.linaro.org>
        https://lists.linaro.org/mailman/listinfo/lng-odp





_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/lng-odp

_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to