From patchwork Fri Feb 28 12:27:22 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxim Uvarov X-Patchwork-Id: 25538 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-fa0-f72.google.com (mail-fa0-f72.google.com [209.85.161.72]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id C6DCF20543 for ; Fri, 28 Feb 2014 12:27:30 +0000 (UTC) Received: by mail-fa0-f72.google.com with SMTP id m10sf5257300fae.7 for ; Fri, 28 Feb 2014 04:27:29 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:from:to:subject:date:message-id :x-original-sender:x-original-authentication-results:precedence :mailing-list:list-id:list-post:list-help:list-archive :list-unsubscribe:content-type; bh=PEyX0ldUrzUEp0g7RIfZHzvI2xWBgf7rB4brsLyMsQI=; b=A45KiscbGHyw8mphd1Q32SHwGZdB4yIt+hiRrc18Bn1W5tyHHj93MRDGCDrhkX2aiw Hm4XTLdIg+umYreEhmKVWZiqkC+6nn2pFRGnwXuD8uzqu7eJLc9qhgxVxI6UPxGh+SEF gYdbR2cXNxU4R2FDvR7Ng8j9kdILwDIj0Pupxz+cRcom6H4BP+N3zNp7EY7FI8ShPFfb hgXP545V9BnMW8ZhwYWE3DQXL0fQVQFKApM7M2SkSZINXzMNyAaCDxK7DzhvAsDqUTi5 bbFmiWujbK6ovQa/ovVoluDbMLlXBjHPWJ4M8uhxVjdLfD3hqac9Z9bGJSHbWB3y2tyM uPzA== X-Gm-Message-State: ALoCoQky5x3A20Mas1+0rAGYyNzQNyFGa5GjSOGJ2q4AkmU4DbXIJuNPpD3DyjMgxV67lE985nSF X-Received: by 10.204.62.71 with SMTP id w7mr565922bkh.8.1393590449598; Fri, 28 Feb 2014 04:27:29 -0800 (PST) MIME-Version: 1.0 X-BeenThere: lng-odp@linaro.org Received: by 10.152.28.8 with SMTP id x8ls176305lag.74.gmail; Fri, 28 Feb 2014 04:27:29 -0800 (PST) X-Received: by 10.152.28.129 with SMTP id b1mr11264318lah.9.1393590449104; Fri, 28 Feb 2014 04:27:29 -0800 (PST) Received: from mail-la0-f53.google.com (mail-la0-f53.google.com [209.85.215.53]) by mx.google.com with ESMTPS id v4si2573844laj.118.2014.02.28.04.27.29 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 28 Feb 2014 04:27:29 -0800 (PST) Received-SPF: neutral (google.com: 209.85.215.53 is neither permitted nor denied by best guess record for domain of maxim.uvarov@linaro.org) client-ip=209.85.215.53; Received: by mail-la0-f53.google.com with SMTP id b8so2618939lan.40 for ; Fri, 28 Feb 2014 04:27:29 -0800 (PST) X-Received: by 10.152.43.103 with SMTP id v7mr6495560lal.46.1393590448936; Fri, 28 Feb 2014 04:27:28 -0800 (PST) Received: from maxim-lap.localhost.onion ([92.39.133.154]) by mx.google.com with ESMTPSA id q8sm3741353lbr.3.2014.02.28.04.27.26 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 28 Feb 2014 04:27:27 -0800 (PST) From: Maxim Uvarov To: lng-odp@linaro.org Subject: [lng-odp] [ODP/PATCH] implement ipv4 checksum functions Date: Fri, 28 Feb 2014 16:27:22 +0400 Message-Id: <1393590442-6091-1-git-send-email-maxim.uvarov@linaro.org> X-Mailer: git-send-email 1.8.5.1.163.gd7aced9 X-Original-Sender: maxim.uvarov@linaro.org X-Original-Authentication-Results: mx.google.com; spf=neutral (google.com: 209.85.215.53 is neither permitted nor denied by best guess record for domain of maxim.uvarov@linaro.org) smtp.mail=maxim.uvarov@linaro.org Precedence: list Mailing-list: list lng-odp@linaro.org; contact lng-odp+owners@linaro.org List-ID: X-Google-Group-Id: 474323889996 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , Implement ipv4 functions to validate and set ipv4 checksum. Signed-off-by: Maxim Uvarov --- include/helper/odp_ip.h | 57 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/include/helper/odp_ip.h b/include/helper/odp_ip.h index d37daca..4fef9e3 100644 --- a/include/helper/odp_ip.h +++ b/include/helper/odp_ip.h @@ -22,6 +22,8 @@ extern "C" { #include #include +#include + #define ODP_IPV4 4 /**< IP version 4 */ #define ODP_IPHDR_LEN 20 /**< Min length of IP header (no options) */ #define ODP_IPHDR_IHL_MIN 5 /**< Minimum IHL value*/ @@ -44,6 +46,61 @@ typedef struct ODP_PACKED { ODP_ASSERT(sizeof(odp_ipv4hdr_t) == ODP_IPHDR_LEN, ODP_IPV4HDR_T__SIZE_ERROR); +static inline int odp_ipv4_csum_valid(odp_packet_t pkt) +{ + int sum = 0; + uint16be_t res = 0; + uint16_t *w; + int nleft = sizeof(odp_ipv4hdr_t); + odp_ipv4hdr_t ip; + uint16be_t chksum; + + if (!odp_packet_l3_offset(pkt)) + return 0; + + memcpy(&ip, odp_packet_l3(pkt), sizeof(odp_ipv4hdr_t)); + w = (uint16_t *)(void *)&ip; + chksum = ip.chksum; + ip.chksum = 0x0; + + while (nleft > 1) { + sum += *w++; + nleft -= 2; + } + + sum = (sum >> 16) + (sum & 0xFFFF); + sum += sum >> 16; + res = ~sum; + return (res == chksum) ? 1 : 0; +} + +static inline uint16be_t odp_ipv4_csum_update(odp_packet_t pkt) +{ + int sum = 0; + uint16be_t res = 0; + uint16_t *w; + odp_ipv4hdr_t *ip; + int nleft = sizeof(odp_ipv4hdr_t); + + if (!odp_packet_l3_offset(pkt)) + return 0; + + ip = (odp_ipv4hdr_t *)odp_packet_l3(pkt); + w = (uint16_t *)(void *)ip; + ip->chksum = 0x0; + + while (nleft > 1) { + sum += *w++; + nleft -= 2; + } + + sum = (sum >> 16) + (sum & 0xFFFF); + sum += sum >> 16; + res = ~sum; + ip->chksum = res; + return res; +} + /* IP header protocol ('proto') field values, a selected few */ #define ODP_IPPROTO_ICMP 0x01 /**< Internet Control Message Protocol */ #define ODP_IPPROTO_TCP 0x06 /**< Transmission Control Protocol */