From patchwork Sat Jan 13 04:00:05 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: 124409 Delivered-To: patch@linaro.org Received: by 10.46.64.148 with SMTP id r20csp30731lje; Fri, 12 Jan 2018 20:03:39 -0800 (PST) X-Google-Smtp-Source: ACJfBosL64nvzIqtdQWlNI4QJ4ddw1lxk1/sNlB99Em1xw1ah27bMl7X35teKX0pIPnsACVJab6n X-Received: by 10.200.34.251 with SMTP id g56mr38040058qta.302.1515816219374; Fri, 12 Jan 2018 20:03:39 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1515816219; cv=none; d=google.com; s=arc-20160816; b=KCjL4IXVpw94g7erGaQ145o2Ep/4AZpDC0Q8ADfoYdITVobHyKBP94yhpqkcElLCbG ccUTyrJXBeg7e520vWJoRiIccq00n/PbM0l+PXALOh5ej65ZB+mZ1KC4oNsJv1ox+7em 37ZQEWCnt5vJK5BEifngY8UPuHtWCkQ8Ymwzxdkyj3JuyHDmYe26oDmlWFmqq0wUQl4x DLZTDuhYCOxSYGhW30hfPuPQFHKVrTNwPkkXFEpzhcAOQ3+s6v/j1KKxjXJfDj+5qUKd NlBjsgN/JRwevg4v46aRZ2m9ezSKGUMCYhxb6Y+r00HTExrlNsF+9TNx0OzLHS7/G4Wd R9oA== 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=AU/NTYxZOMabwIJq/SNGI4p//EP6rBF4t7NCn/skyG0=; b=F+bs8ypOTa58cFmy6PJZ8QsSMnunYYvoRR6AplMIwO1AuI399iL39csmRyI/Cj+sxG ZrXfvtr04thQQQxLJM6Cei+01L/aw5GgWhyo671cpxZ5tlLngOhN7Vg1yzd+hetuJQFP MZDe1Cyi+XYS7UzbZXFdo+bPKROHFrarSucsxRmSZb4sewtgdqnimDzciG3jfU/2SxrL e7A2IH+ZrbANylEpb9Gj4JaZhLqMb+Othw4aSQ/3HuLOyUeQl27w/BxXakr3zCecuPoI XWEtYJCpHalkAJG9EAiwg+xP+HOYTSts6ot4mSa4MC440qP7Jqk6FGzy1bsgWQXvWZzt dVIQ== 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 q56si2488858qtj.44.2018.01.12.20.03.39; Fri, 12 Jan 2018 20:03:39 -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 06BEB6176A; Sat, 13 Jan 2018 04:03:39 +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_H3, RCVD_IN_MSPIKE_WL 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 3FB9361768; Sat, 13 Jan 2018 04:00:35 +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 8F73361719; Sat, 13 Jan 2018 04:00:18 +0000 (UTC) Received: from forward106o.mail.yandex.net (forward106o.mail.yandex.net [37.140.190.187]) by lists.linaro.org (Postfix) with ESMTPS id CE50B6087C for ; Sat, 13 Jan 2018 04:00:12 +0000 (UTC) Received: from mxback2g.mail.yandex.net (mxback2g.mail.yandex.net [IPv6:2a02:6b8:0:1472:2741:0:8b7:163]) by forward106o.mail.yandex.net (Yandex) with ESMTP id 9830A7826B5 for ; Sat, 13 Jan 2018 07:00:11 +0300 (MSK) Received: from smtp1p.mail.yandex.net (smtp1p.mail.yandex.net [2a02:6b8:0:1472:2741:0:8b6:6]) by mxback2g.mail.yandex.net (nwsmtp/Yandex) with ESMTP id sfsHzXRZM7-0BN0WNhm; Sat, 13 Jan 2018 07:00:11 +0300 Received: by smtp1p.mail.yandex.net (nwsmtp/Yandex) with ESMTPSA id GnJsmNomDX-0BGKvqs7; Sat, 13 Jan 2018 07:00:11 +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 07:00:05 +0300 Message-Id: <1515816008-7212-5-git-send-email-odpbot@yandex.ru> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1515816008-7212-1-git-send-email-odpbot@yandex.ru> References: <1515816008-7212-1-git-send-email-odpbot@yandex.ru> Github-pr-num: 389 Subject: [lng-odp] [PATCH v1] [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: ab214b82da2a920444a5e65d029f3f42a98ec314 **/ .../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;