From patchwork Sat Jan 13 08:00:04 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Github ODP bot X-Patchwork-Id: 124416 Delivered-To: patch@linaro.org Received: by 10.46.64.148 with SMTP id r20csp65214lje; Sat, 13 Jan 2018 00:04:01 -0800 (PST) X-Google-Smtp-Source: ACJfBosTtkHNAW4dTP1meKN8WrbzenRmbk0FXsjBWbRZ2Rdixn4dGEYxiMFLdIcB9xANmerx1BWT X-Received: by 10.55.105.194 with SMTP id e185mr41244590qkc.192.1515830641449; Sat, 13 Jan 2018 00:04:01 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1515830641; cv=none; d=google.com; s=arc-20160816; b=Pb+ePJ64CrpX83QfH2z4BoSyaJ81gkZe1Sp0aenJzfg7cD6mpFQvkP0rVetjML12wh eoXAH3Mwa2n9WT+C6GAqXij7cejbkFeY3WvHVu+KFtjAt0oa+CumSFtcajPB+acvg2Li fCiaIdb2Fte5ZAhmEcP8O4rx5j+4Fi2RjZwxE/aUA9DYuBkZtMVOZLUOn/q0pRz7ak7O e6oeLDyNzAe4QJAk8FliOZDNEh8KTuM3kNdEDkXDUj9+DjDlhgb03oYr72Y0fBAXr+n0 XWN+bWGO6vjxRAApi7BOGb6chRZqlr4QwVysNV1c5y5kLPRn21s4UhcylJnUKs+L8UcB 9Sqg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject:github-pr-num :references:in-reply-to:message-id:date:to:from:delivered-to :arc-authentication-results; bh=zP3swCdfjT9wRx36Y7RyCJGAtzOWGKzJ7rQc9UnK/FQ=; b=MBU4qRBXtDlR1IH4sAasXGAvXZwhvxZ9ekkMO7zSzGNcv/Fija1JX9Wb5p+wtC6dOC gQVM6bM/DaXapAm5ijRPin7BlD0VImo8aGdooCnzOR7WB/+jWf83Kyk4heXHN3WLKdrj 1Nu4gwmDDA2i7VY40kNvKDkrXbNWGRiXStU7pZkAhVtEcrDNxCsGLYhInI70wDlHBaZe cewkquSzeCz/00f5iduQegP166Aq7MKpXjjyb9KuP0igFTzy9GLp9aO9JSt//xkXiAqO JWE5H/ZLkJuJ/NIF3fsJ4ek1qIlGlzxiIYuDCp5qIjgNtAZgIJbUUsml+q3X/I0uOXBv 77mg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.197.127.237 as permitted sender) smtp.mailfrom=lng-odp-bounces@lists.linaro.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=yandex.ru Return-Path: Received: from lists.linaro.org (ec2-54-197-127-237.compute-1.amazonaws.com. [54.197.127.237]) by mx.google.com with ESMTP id e64si10216468qtd.147.2018.01.13.00.04.01; Sat, 13 Jan 2018 00:04:01 -0800 (PST) Received-SPF: pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.197.127.237 as permitted sender) client-ip=54.197.127.237; Authentication-Results: mx.google.com; spf=pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.197.127.237 as permitted sender) smtp.mailfrom=lng-odp-bounces@lists.linaro.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=yandex.ru Received: by lists.linaro.org (Postfix, from userid 109) id 20D4A61751; Sat, 13 Jan 2018 08:04:01 +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,FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2 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 E76796176A; Sat, 13 Jan 2018 08:00:42 +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 88C046175C; Sat, 13 Jan 2018 08:00:28 +0000 (UTC) Received: from forward103p.mail.yandex.net (forward103p.mail.yandex.net [77.88.28.106]) by lists.linaro.org (Postfix) with ESMTPS id 8E5836150E for ; Sat, 13 Jan 2018 08:00:12 +0000 (UTC) Received: from mxback12j.mail.yandex.net (mxback12j.mail.yandex.net [IPv6:2a02:6b8:0:1619::87]) by forward103p.mail.yandex.net (Yandex) with ESMTP id 47A412183A24 for ; Sat, 13 Jan 2018 11:00:11 +0300 (MSK) Received: from smtp4j.mail.yandex.net (smtp4j.mail.yandex.net [2a02:6b8:0:1619::15:6]) by mxback12j.mail.yandex.net (nwsmtp/Yandex) with ESMTP id DL6jatJdnZ-0Br0svPg; Sat, 13 Jan 2018 11:00:11 +0300 Received: by smtp4j.mail.yandex.net (nwsmtp/Yandex) with ESMTPSA id 8Hzdfi2ypg-0AYaeiwa; Sat, 13 Jan 2018 11:00:10 +0300 (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (Client certificate not present) From: Github ODP bot To: lng-odp@lists.linaro.org Date: Sat, 13 Jan 2018 11:00:04 +0300 Message-Id: <1515830407-13301-5-git-send-email-odpbot@yandex.ru> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1515830407-13301-1-git-send-email-odpbot@yandex.ru> References: <1515830407-13301-1-git-send-email-odpbot@yandex.ru> Github-pr-num: 389 Subject: [lng-odp] [PATCH v2][WIP 4/7] linux-gen: packet: add IPv4 checksum validation 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: , Errors-To: lng-odp-bounces@lists.linaro.org Sender: "lng-odp" From: Dmitry Eremin-Solenikov If configured, check IPv4 header checksum. Signed-off-by: Dmitry Eremin-Solenikov --- /** Email created from pull request 389 (lumag:parse-checksums) ** https://github.com/Linaro/odp/pull/389 ** Patch: https://github.com/Linaro/odp/pull/389.patch ** Base sha: 49ebafae0edebbc750742d8874ad0a7588286dea ** Merge commit sha: 29d9c9fa8235c01897c72e823b57525e37f896d3 **/ .../linux-generic/include/odp_packet_internal.h | 6 ++-- platform/linux-generic/odp_classification.c | 3 +- platform/linux-generic/odp_packet.c | 32 ++++++++++++++++------ platform/linux-generic/pktio/loop.c | 3 +- platform/linux-generic/pktio/pcap.c | 3 +- platform/linux-generic/pktio/socket.c | 3 +- platform/linux-generic/pktio/socket_mmap.c | 3 +- platform/linux-generic/pktio/tap.c | 3 +- 8 files changed, 39 insertions(+), 17 deletions(-) diff --git a/platform/linux-generic/include/odp_packet_internal.h b/platform/linux-generic/include/odp_packet_internal.h index 43c8da5cb..86f0d80a5 100644 --- a/platform/linux-generic/include/odp_packet_internal.h +++ b/platform/linux-generic/include/odp_packet_internal.h @@ -296,7 +296,8 @@ int packet_alloc_multi(odp_pool_t pool_hdl, uint32_t len, /* Perform packet parse up to a given protocol layer */ int packet_parse_layer(odp_packet_hdr_t *pkt_hdr, - odp_proto_layer_t layer); + odp_proto_layer_t layer, + odp_proto_chksums_t chksums); /* Reset parser metadata for a new parse */ void packet_parse_reset(odp_packet_hdr_t *pkt_hdr); @@ -333,7 +334,8 @@ static inline void packet_set_ts(odp_packet_hdr_t *pkt_hdr, odp_time_t *ts) } int packet_parse_common(packet_parser_t *pkt_hdr, const uint8_t *ptr, - uint32_t pkt_len, uint32_t seg_len, int layer); + uint32_t pkt_len, uint32_t seg_len, int layer, + odp_proto_chksums_t chksums); int _odp_cls_parse(odp_packet_hdr_t *pkt_hdr, const uint8_t *parseptr); diff --git a/platform/linux-generic/odp_classification.c b/platform/linux-generic/odp_classification.c index 276430923..4d3df49e2 100644 --- a/platform/linux-generic/odp_classification.c +++ b/platform/linux-generic/odp_classification.c @@ -973,7 +973,8 @@ int cls_classify_packet(pktio_entry_t *entry, const uint8_t *base, packet_set_len(pkt_hdr, pkt_len); packet_parse_common(&pkt_hdr->p, base, pkt_len, seg_len, - ODP_PROTO_LAYER_ALL); + ODP_PROTO_LAYER_ALL, + entry->s.in_chksums); cos = cls_select_cos(entry, base, pkt_hdr); if (cos == NULL) diff --git a/platform/linux-generic/odp_packet.c b/platform/linux-generic/odp_packet.c index a0bc8911a..d3c608ab0 100644 --- a/platform/linux-generic/odp_packet.c +++ b/platform/linux-generic/odp_packet.c @@ -2024,7 +2024,8 @@ static inline uint16_t parse_eth(packet_parser_t *prs, const uint8_t **parseptr, * Parser helper function for IPv4 */ static inline uint8_t parse_ipv4(packet_parser_t *prs, const uint8_t **parseptr, - uint32_t *offset, uint32_t frame_len) + uint32_t *offset, uint32_t frame_len, + odp_proto_chksums_t chksums) { const _odp_ipv4hdr_t *ipv4 = (const _odp_ipv4hdr_t *)*parseptr; uint8_t ver = _ODP_IPV4HDR_VER(ipv4->ver_ihl); @@ -2040,6 +2041,14 @@ static inline uint8_t parse_ipv4(packet_parser_t *prs, const uint8_t **parseptr, return 0; } + if (chksums.chksum.ipv4) { + prs->input_flags.l3_chksum_done = 1; + if (odp_chksum_ones_comp16(ipv4, ihl * 4) != 0xffff) { + prs->error_flags.l3_chksum = 1; + return 0; + } + } + *offset += ihl * 4; *parseptr += ihl * 4; @@ -2175,7 +2184,8 @@ static inline int packet_parse_common_l3_l4(packet_parser_t *prs, const uint8_t *parseptr, uint32_t offset, uint32_t frame_len, uint32_t seg_len, - int layer, uint16_t ethtype) + int layer, uint16_t ethtype, + odp_proto_chksums_t chksums) { uint8_t ip_proto; @@ -2191,7 +2201,7 @@ int packet_parse_common_l3_l4(packet_parser_t *prs, const uint8_t *parseptr, switch (ethtype) { case _ODP_ETHTYPE_IPV4: prs->input_flags.ipv4 = 1; - ip_proto = parse_ipv4(prs, &parseptr, &offset, frame_len); + ip_proto = parse_ipv4(prs, &parseptr, &offset, frame_len, chksums); prs->l4_offset = offset; break; @@ -2275,7 +2285,7 @@ int packet_parse_common_l3_l4(packet_parser_t *prs, const uint8_t *parseptr, */ int packet_parse_common(packet_parser_t *prs, const uint8_t *ptr, uint32_t frame_len, uint32_t seg_len, - int layer) + int layer, odp_proto_chksums_t chksums) { uint32_t offset; uint16_t ethtype; @@ -2296,20 +2306,21 @@ int packet_parse_common(packet_parser_t *prs, const uint8_t *ptr, ethtype = parse_eth(prs, &parseptr, &offset, frame_len); return packet_parse_common_l3_l4(prs, parseptr, offset, frame_len, - seg_len, layer, ethtype); + seg_len, layer, ethtype, chksums); } /** * Simple packet parser */ int packet_parse_layer(odp_packet_hdr_t *pkt_hdr, - odp_proto_layer_t layer) + odp_proto_layer_t layer, + odp_proto_chksums_t chksums) { uint32_t seg_len = packet_first_seg_len(pkt_hdr); void *base = packet_data(pkt_hdr); return packet_parse_common(&pkt_hdr->p, base, pkt_hdr->frame_len, - seg_len, layer); + seg_len, layer, chksums); } int odp_packet_parse(odp_packet_t pkt, uint32_t offset, @@ -2336,7 +2347,8 @@ int odp_packet_parse(odp_packet_t pkt, uint32_t offset, if (proto == ODP_PROTO_ETH) { ret = packet_parse_common(&pkt_hdr->p, data, packet_len, - seg_len, layer); + seg_len, layer, + param->chksums); if (ret) return -1; @@ -2348,7 +2360,9 @@ int odp_packet_parse(odp_packet_t pkt, uint32_t offset, ret = packet_parse_common_l3_l4(&pkt_hdr->p, data, offset, packet_len, seg_len, - layer, ethtype); + layer, ethtype, + param->chksums); + if (ret) return -1; diff --git a/platform/linux-generic/pktio/loop.c b/platform/linux-generic/pktio/loop.c index ad2cb39f8..bf6365e94 100644 --- a/platform/linux-generic/pktio/loop.c +++ b/platform/linux-generic/pktio/loop.c @@ -146,7 +146,8 @@ static int loopback_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, } } else { packet_parse_layer(pkt_hdr, - pktio_entry->s.config.parser.layer); + pktio_entry->s.config.parser.layer, + pktio_entry->s.in_chksums); } packet_set_ts(pkt_hdr, ts); diff --git a/platform/linux-generic/pktio/pcap.c b/platform/linux-generic/pktio/pcap.c index 596bf6f28..573c31744 100644 --- a/platform/linux-generic/pktio/pcap.c +++ b/platform/linux-generic/pktio/pcap.c @@ -255,7 +255,8 @@ static int pcapif_recv_pkt(pktio_entry_t *pktio_entry, int index ODP_UNUSED, } packet_parse_layer(pkt_hdr, - pktio_entry->s.config.parser.layer); + pktio_entry->s.config.parser.layer, + pktio_entry->s.in_chksums); pktio_entry->s.stats.in_octets += pkt_hdr->frame_len; packet_set_ts(pkt_hdr, ts); diff --git a/platform/linux-generic/pktio/socket.c b/platform/linux-generic/pktio/socket.c index 0a80035f5..d0a55effe 100644 --- a/platform/linux-generic/pktio/socket.c +++ b/platform/linux-generic/pktio/socket.c @@ -676,7 +676,8 @@ static int sock_mmsg_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, if (!pktio_cls_enabled(pktio_entry)) packet_parse_layer(pkt_hdr, - pktio_entry->s.config.parser.layer); + pktio_entry->s.config.parser.layer, + pktio_entry->s.in_chksums); pkt_hdr->input = pktio_entry->s.handle; packet_set_ts(pkt_hdr, ts); diff --git a/platform/linux-generic/pktio/socket_mmap.c b/platform/linux-generic/pktio/socket_mmap.c index c63a25398..f31d34dca 100644 --- a/platform/linux-generic/pktio/socket_mmap.c +++ b/platform/linux-generic/pktio/socket_mmap.c @@ -234,7 +234,8 @@ static inline unsigned pkt_mmap_v2_rx(pktio_entry_t *pktio_entry, copy_packet_cls_metadata(&parsed_hdr, hdr); else packet_parse_layer(hdr, - pktio_entry->s.config.parser.layer); + pktio_entry->s.config.parser.layer, + pktio_entry->s.in_chksums); packet_set_ts(hdr, ts); diff --git a/platform/linux-generic/pktio/tap.c b/platform/linux-generic/pktio/tap.c index d8b78f3f8..da7a7b3a2 100644 --- a/platform/linux-generic/pktio/tap.c +++ b/platform/linux-generic/pktio/tap.c @@ -285,7 +285,8 @@ static odp_packet_t pack_odp_pkt(pktio_entry_t *pktio_entry, const void *data, copy_packet_cls_metadata(&parsed_hdr, pkt_hdr); else packet_parse_layer(pkt_hdr, - pktio_entry->s.config.parser.layer); + pktio_entry->s.config.parser.layer, + pktio_entry->s.in_chksums); packet_set_ts(pkt_hdr, ts); pkt_hdr->input = pktio_entry->s.handle;