From patchwork Fri Mar 28 17:23:54 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ciprian Barbu X-Patchwork-Id: 27366 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-bk0-f72.google.com (mail-bk0-f72.google.com [209.85.214.72]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 0D0AF20062 for ; Fri, 28 Mar 2014 17:24:01 +0000 (UTC) Received: by mail-bk0-f72.google.com with SMTP id w10sf10163561bkz.11 for ; Fri, 28 Mar 2014 10:24:00 -0700 (PDT) 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:cc: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=yGfFkF9eGkKxowyj5HDRIh9lE5uewJcxvgzk2V5hB6Y=; b=DCWfYs+mGwTQL4XoUoivvQPHxvhsK2JVBmZEICdasIeOECVaUF/F2IM9Nt3NP3MGcE AOekYJQPPHHempfYLqpkemPjR95VKQu15r8NeKkp9N2bvbng2Ncsrm+5qfE5k3ySuyEc 24KoJDocsqJEeS6MHRTIPd+nNDRyoXGfnhFB8cnSmvOPY5Px8icU3o2VrQScyvZOKjuK Fldwj0d7H2V1OTRbYhJ2dRda83Jbvt1YzVWG2Cl+osDOCQ/wjOGFfeMWCVLmlYXZ/BzI XVeM0Lb3Np7DCQaYaetU0wRz8csJEYDDZCZj8rGrAkPyFH3okskoehPUjX9RKLrA9N62 DG5g== X-Gm-Message-State: ALoCoQndjgE466w9JLkY+U7ydcFVTGYYGo506k3Tzx4tz909Wvg6M96FpxE0j5bStUhV+Br00VmB X-Received: by 10.205.32.197 with SMTP id sl5mr668131bkb.8.1396027440487; Fri, 28 Mar 2014 10:24:00 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: lng-odp@linaro.org Received: by 10.152.3.136 with SMTP id c8ls200134lac.67.gmail; Fri, 28 Mar 2014 10:24:00 -0700 (PDT) X-Received: by 10.112.35.130 with SMTP id h2mr5962612lbj.15.1396027439978; Fri, 28 Mar 2014 10:23:59 -0700 (PDT) Received: from mail-lb0-f170.google.com (mail-lb0-f170.google.com [209.85.217.170]) by mx.google.com with ESMTPS id e6si3727731lah.205.2014.03.28.10.23.59 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 28 Mar 2014 10:23:59 -0700 (PDT) Received-SPF: neutral (google.com: 209.85.217.170 is neither permitted nor denied by best guess record for domain of ciprian.barbu@linaro.org) client-ip=209.85.217.170; Received: by mail-lb0-f170.google.com with SMTP id s7so3941262lbd.15 for ; Fri, 28 Mar 2014 10:23:59 -0700 (PDT) X-Received: by 10.112.52.225 with SMTP id w1mr6070904lbo.22.1396027439865; Fri, 28 Mar 2014 10:23:59 -0700 (PDT) Received: from sestofb10.enea.se (sestofw01.enea.se. [192.36.1.252]) by mx.google.com with ESMTPSA id n9sm4091575lbg.6.2014.03.28.10.23.58 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 28 Mar 2014 10:23:59 -0700 (PDT) From: Ciprian Barbu To: lng-odp@linaro.org Cc: ciprian.barbu@linaro.org Subject: [lng-odp][PATCH v3] packet parsing modifications Date: Fri, 28 Mar 2014 18:23:54 +0100 Message-Id: <1396027434-23054-1-git-send-email-ciprian.barbu@linaro.org> X-Mailer: git-send-email 1.7.10.4 X-Original-Sender: ciprian.barbu@linaro.org X-Original-Authentication-Results: mx.google.com; spf=neutral (google.com: 209.85.217.170 is neither permitted nor denied by best guess record for domain of ciprian.barbu@linaro.org) smtp.mail=ciprian.barbu@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: , This patch version makes sure the header length is big enough to hold known protocol headers. I also corrected a problem with ethertype for vlan packets. Signed-off-by: Ciprian Barbu --- platform/linux-generic/source/odp_packet.c | 22 +++++++++++++++++++--- platform/linux-generic/source/odp_packet_netmap.c | 2 +- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/platform/linux-generic/source/odp_packet.c b/platform/linux-generic/source/odp_packet.c index e60f96c..0e29746 100644 --- a/platform/linux-generic/source/odp_packet.c +++ b/platform/linux-generic/source/odp_packet.c @@ -154,7 +154,7 @@ void odp_packet_parse(odp_packet_t pkt, size_t len, size_t frame_offset) pkt_hdr->frame_offset = frame_offset; pkt_hdr->frame_len = len; - if (odp_unlikely(len < ODP_ETH_LEN_MIN)) { + if (odp_unlikely(len < ODP_ETHHDR_LEN)) { pkt_hdr->error_flags.frame_len = 1; return; } else if (len > ODP_ETH_LEN_MAX) { @@ -171,20 +171,32 @@ void odp_packet_parse(odp_packet_t pkt, size_t len, size_t frame_offset) if (ethtype == ODP_ETHTYPE_VLAN_OUTER) { pkt_hdr->input_flags.vlan_qinq = 1; - ethtype = odp_be_to_cpu_16(vlan->tpid); + ethtype = odp_be_to_cpu_16(vlan[1].tpid); + if (len < ODP_ETHHDR_LEN + ODP_VLANHDR_LEN) { + pkt_hdr->error_flags.frame_len = 1; + return; + } offset += sizeof(odp_vlanhdr_t); vlan = &vlan[1]; } if (ethtype == ODP_ETHTYPE_VLAN) { pkt_hdr->input_flags.vlan = 1; - ethtype = odp_be_to_cpu_16(vlan->tpid); + ethtype = odp_be_to_cpu_16(vlan[1].tpid); + if (len < ODP_ETHHDR_LEN + ODP_VLANHDR_LEN) { + pkt_hdr->error_flags.frame_len = 1; + return; + } offset += sizeof(odp_vlanhdr_t); } /* Set l3_offset+flag only for known ethtypes */ switch (ethtype) { case ODP_ETHTYPE_IPV4: + if (len < ODP_ETHHDR_LEN + offset + sizeof(odp_ipv4hdr_t*)) { + pkt_hdr->error_flags.frame_len = 1; + return; + } pkt_hdr->input_flags.ipv4 = 1; pkt_hdr->input_flags.l3 = 1; pkt_hdr->l3_offset = frame_offset + ODP_ETHHDR_LEN + offset; @@ -192,6 +204,10 @@ void odp_packet_parse(odp_packet_t pkt, size_t len, size_t frame_offset) ip_proto = parse_ipv4(pkt_hdr, ipv4, &offset); break; case ODP_ETHTYPE_IPV6: + if (len < ODP_ETHHDR_LEN + offset + sizeof(odp_ipv6hdr_t*)) { + pkt_hdr->error_flags.frame_len = 1; + return; + } pkt_hdr->input_flags.ipv6 = 1; pkt_hdr->input_flags.l3 = 1; pkt_hdr->l3_offset = frame_offset + ODP_ETHHDR_LEN + offset; diff --git a/platform/linux-generic/source/odp_packet_netmap.c b/platform/linux-generic/source/odp_packet_netmap.c index 1cbd84c..a6b75f5 100644 --- a/platform/linux-generic/source/odp_packet_netmap.c +++ b/platform/linux-generic/source/odp_packet_netmap.c @@ -361,7 +361,7 @@ int send_pkt_netmap(pkt_netmap_t * const pkt_nm, odp_packet_t pkt_table[], txbuf = NETMAP_BUF(txring, slot->buf_idx); pkt = pkt_table[i]; - frame = odp_packet_l2(pkt); + frame = odp_packet_start(pkt); frame_len = odp_packet_get_len(pkt); memcpy(txbuf, frame, frame_len);