From patchwork Mon Apr 25 01:13:17 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bill Fischofer X-Patchwork-Id: 66552 Delivered-To: patch@linaro.org Received: by 10.140.93.198 with SMTP id d64csp785214qge; Sun, 24 Apr 2016 18:14:49 -0700 (PDT) X-Received: by 10.50.6.38 with SMTP id x6mr10276465igx.54.1461546889658; Sun, 24 Apr 2016 18:14:49 -0700 (PDT) Return-Path: Received: from lists.linaro.org (lists.linaro.org. [54.225.227.206]) by mx.google.com with ESMTP id h22si20717942ioi.65.2016.04.24.18.14.49; Sun, 24 Apr 2016 18:14:49 -0700 (PDT) Received-SPF: pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.225.227.206 as permitted sender) client-ip=54.225.227.206; Authentication-Results: mx.google.com; spf=pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.225.227.206 as permitted sender) smtp.mailfrom=lng-odp-bounces@lists.linaro.org; dmarc=pass (p=NONE dis=NONE) header.from=linaro.org Received: by lists.linaro.org (Postfix, from userid 109) id 2B38F61A3D; Mon, 25 Apr 2016 01:14:49 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on ip-10-142-244-252 X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, URIBL_BLOCKED autolearn=disabled version=3.4.0 Received: from [127.0.0.1] (localhost [127.0.0.1]) by lists.linaro.org (Postfix) with ESMTP id 1607061A4D; Mon, 25 Apr 2016 01:13:37 +0000 (UTC) X-Original-To: lng-odp@lists.linaro.org Delivered-To: lng-odp@lists.linaro.org Received: by lists.linaro.org (Postfix, from userid 109) id 6932961A3D; Mon, 25 Apr 2016 01:13:28 +0000 (UTC) Received: from mail-oi0-f42.google.com (mail-oi0-f42.google.com [209.85.218.42]) by lists.linaro.org (Postfix) with ESMTPS id EA37B619B3 for ; Mon, 25 Apr 2016 01:13:24 +0000 (UTC) Received: by mail-oi0-f42.google.com with SMTP id k142so163442920oib.1 for ; Sun, 24 Apr 2016 18:13:24 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=Y59aq5zgaAsgrbzbrLWVUmGA4JSk6zRc/kJd5wduPTc=; b=iIhHO3K34Q1TfGBgX0L4u/nt04ITfa5fBUcYBw+C+j7f4lvxltSUofaOFKt9ribBcR HM2I0ap3LT4NMPhXrt4wu5vGeVM0Mb7J1a61kqpaBwXgsmZrWWFgbaDhHQ4YyhjmZ5wN 4ECNkNb/EBgu74wg/heW0Xg2UR3sdr+RYRtmT5+WKWe36c0QTCyV+TxX7Qc0vGzH5Uj4 9iueAA94RnbCjs8IcTr6QBkYxdvNdLo3yA8p4fLrXNOD2wVyuxnMTwlFD2qzCC1ziioC xWRn1Ol1wJUkWRmdQOmy0+t6hzbJv3olidnhiEz78nrWzW1V3NxlZUOINnXNmUEESaGa dARQ== X-Gm-Message-State: AOPr4FVGBYnyrJygDZPJEBgjp/7qRMrcyTbkytSSHi3gFYNMDG99SCGtPTMgAPnzpha0GrGCMUA= X-Received: by 10.202.53.198 with SMTP id c189mr12950680oia.129.1461546804460; Sun, 24 Apr 2016 18:13:24 -0700 (PDT) Received: from Ubuntu15.localdomain (cpe-66-68-129-43.austin.res.rr.com. [66.68.129.43]) by smtp.gmail.com with ESMTPSA id t5sm2216138oie.18.2016.04.24.18.13.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 24 Apr 2016 18:13:23 -0700 (PDT) From: Bill Fischofer To: lng-odp@lists.linaro.org Date: Sun, 24 Apr 2016 20:13:17 -0500 Message-Id: <1461546799-18112-4-git-send-email-bill.fischofer@linaro.org> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1461546799-18112-1-git-send-email-bill.fischofer@linaro.org> References: <1461546799-18112-1-git-send-email-bill.fischofer@linaro.org> X-Topics: patch Subject: [lng-odp] [API-NEXT PATCH 3/5] linux-generic: packet: implement odp_packet_copy_from_pkt api X-BeenThere: lng-odp@lists.linaro.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: "The OpenDataPlane \(ODP\) List" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: lng-odp-bounces@lists.linaro.org Sender: "lng-odp" Remove the previous _odp_packet_copy_to_packet() internal API and replace with the official odp_packet_copy_from_pkt() API. Signed-off-by: Bill Fischofer --- .../linux-generic/include/odp_packet_internal.h | 4 - platform/linux-generic/odp_crypto.c | 10 +- platform/linux-generic/odp_packet.c | 105 ++++++++++++--------- 3 files changed, 66 insertions(+), 53 deletions(-) diff --git a/platform/linux-generic/include/odp_packet_internal.h b/platform/linux-generic/include/odp_packet_internal.h index 9ea95c3..93a92a0 100644 --- a/platform/linux-generic/include/odp_packet_internal.h +++ b/platform/linux-generic/include/odp_packet_internal.h @@ -290,10 +290,6 @@ static inline int packet_parse_not_complete(odp_packet_hdr_t *pkt_hdr) } /* Forward declarations */ -int _odp_packet_copy_to_packet(odp_packet_t srcpkt, uint32_t srcoffset, - odp_packet_t dstpkt, uint32_t dstoffset, - uint32_t len); - void _odp_packet_copy_md_to_packet(odp_packet_t srcpkt, odp_packet_t dstpkt); odp_packet_t packet_alloc(odp_pool_t pool_hdl, uint32_t len, int parse); diff --git a/platform/linux-generic/odp_crypto.c b/platform/linux-generic/odp_crypto.c index 7448575..f603bcd 100644 --- a/platform/linux-generic/odp_crypto.c +++ b/platform/linux-generic/odp_crypto.c @@ -731,11 +731,11 @@ odp_crypto_operation(odp_crypto_op_params_t *params, if (params->pkt != params->out_pkt) { if (odp_unlikely(ODP_PACKET_INVALID == params->out_pkt)) ODP_ABORT(); - (void)_odp_packet_copy_to_packet(params->pkt, - 0, - params->out_pkt, - 0, - odp_packet_len(params->pkt)); + (void)odp_packet_copy_from_pkt(params->out_pkt, + 0, + params->pkt, + 0, + odp_packet_len(params->pkt)); _odp_packet_copy_md_to_packet(params->pkt, params->out_pkt); odp_packet_free(params->pkt); params->pkt = ODP_PACKET_INVALID; diff --git a/platform/linux-generic/odp_packet.c b/platform/linux-generic/odp_packet.c index 7ec2c83..a314942 100644 --- a/platform/linux-generic/odp_packet.c +++ b/platform/linux-generic/odp_packet.c @@ -628,11 +628,9 @@ int odp_packet_add_data(odp_packet_t *pkt_ptr, uint32_t offset, uint32_t len) if (newpkt == ODP_PACKET_INVALID) return -1; - if (_odp_packet_copy_to_packet(pkt, 0, - newpkt, 0, offset) != 0 || - _odp_packet_copy_to_packet(pkt, offset, newpkt, - offset + len, - pktlen - offset) != 0) { + if (odp_packet_copy_from_pkt(newpkt, 0, pkt, 0, offset) != 0 || + odp_packet_copy_from_pkt(newpkt, offset + len, pkt, offset, + pktlen - offset) != 0) { odp_packet_free(newpkt); return -1; } @@ -659,11 +657,9 @@ int odp_packet_rem_data(odp_packet_t *pkt_ptr, uint32_t offset, uint32_t len) if (newpkt == ODP_PACKET_INVALID) return -1; - if (_odp_packet_copy_to_packet(pkt, 0, - newpkt, 0, offset) != 0 || - _odp_packet_copy_to_packet(pkt, offset + len, - newpkt, offset, - pktlen - offset - len) != 0) { + if (odp_packet_copy_from_pkt(newpkt, 0, pkt, 0, offset) != 0 || + odp_packet_copy_from_pkt(newpkt, offset, pkt, offset + len, + pktlen - offset - len) != 0) { odp_packet_free(newpkt); return -1; } @@ -700,8 +696,8 @@ odp_packet_t odp_packet_copy(odp_packet_t pkt, odp_pool_t pool) memcpy(newstart, srcstart, sizeof(odp_packet_hdr_t) - meta_offset); - if (_odp_packet_copy_to_packet(pkt, 0, - newpkt, 0, pktlen) != 0) { + if (odp_packet_copy_from_pkt(newpkt, 0, pkt, 0, + pktlen) != 0) { odp_packet_free(newpkt); newpkt = ODP_PACKET_INVALID; } @@ -758,6 +754,59 @@ int odp_packet_copy_from_mem(odp_packet_t pkt, uint32_t offset, return 0; } +int odp_packet_copy_from_pkt(odp_packet_t dst, uint32_t dst_offset, + odp_packet_t src, uint32_t src_offset, + uint32_t len) +{ + odp_packet_hdr_t *dst_hdr = odp_packet_hdr(dst); + odp_packet_hdr_t *src_hdr = odp_packet_hdr(src); + void *dst_map; + void *src_map; + uint32_t cpylen, minseg; + uint32_t dst_seglen = 0; /* GCC */ + uint32_t src_seglen = 0; /* GCC */ + int overlap; + + if (dst_offset + len > dst_hdr->frame_len || + src_offset + len > src_hdr->frame_len) + return -1; + + overlap = (dst_hdr == src_hdr && + ((dst_offset <= src_offset && + dst_offset + len >= src_offset) || + (src_offset <= dst_offset && + src_offset + len >= dst_offset))); + + if (overlap && src_offset < dst_offset) { + odp_packet_t temp = + odp_packet_copy_part(src, src_offset, len, + odp_packet_pool(src)); + if (temp == ODP_PACKET_INVALID) + return -1; + odp_packet_copy_from_pkt(dst, dst_offset, temp, 0, len); + odp_packet_free(temp); + return 0; + } + + while (len > 0) { + dst_map = packet_map(dst_hdr, dst_offset, &dst_seglen); + src_map = packet_map(src_hdr, src_offset, &src_seglen); + + minseg = dst_seglen > src_seglen ? src_seglen : dst_seglen; + cpylen = len > minseg ? minseg : len; + + if (overlap) + memmove(dst_map, src_map, cpylen); + else + memcpy(dst_map, src_map, cpylen); + + dst_offset += cpylen; + src_offset += cpylen; + len -= cpylen; + } + + return 0; +} /* * * Debugging @@ -833,38 +882,6 @@ void _odp_packet_copy_md_to_packet(odp_packet_t srcpkt, odp_packet_t dstpkt) copy_packet_parser_metadata(srchdr, dsthdr); } -int _odp_packet_copy_to_packet(odp_packet_t srcpkt, uint32_t srcoffset, - odp_packet_t dstpkt, uint32_t dstoffset, - uint32_t len) -{ - odp_packet_hdr_t *srchdr = odp_packet_hdr(srcpkt); - odp_packet_hdr_t *dsthdr = odp_packet_hdr(dstpkt); - void *srcmap; - void *dstmap; - uint32_t cpylen, minseg; - uint32_t srcseglen = 0; /* GCC */ - uint32_t dstseglen = 0; /* GCC */ - - if (srcoffset + len > srchdr->frame_len || - dstoffset + len > dsthdr->frame_len) - return -1; - - while (len > 0) { - srcmap = packet_map(srchdr, srcoffset, &srcseglen); - dstmap = packet_map(dsthdr, dstoffset, &dstseglen); - - minseg = dstseglen > srcseglen ? srcseglen : dstseglen; - cpylen = len > minseg ? minseg : len; - memcpy(dstmap, srcmap, cpylen); - - srcoffset += cpylen; - dstoffset += cpylen; - len -= cpylen; - } - - return 0; -} - /** * Parser helper function for IPv4 */