From patchwork Tue Nov 7 15:34:06 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Scheurich X-Patchwork-Id: 835344 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yWYQ33bglz9t2M for ; Wed, 8 Nov 2017 02:34:35 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id D20A3BF2; Tue, 7 Nov 2017 15:34:23 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id 60C1BC3A for ; Tue, 7 Nov 2017 15:34:22 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from sessmg23.ericsson.net (sessmg23.ericsson.net [193.180.251.45]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 56F2C50E for ; Tue, 7 Nov 2017 15:34:21 +0000 (UTC) X-AuditID: c1b4fb2d-fc3a89c00000268d-08-5a01d278be3d Received: from ESESSHC012.ericsson.se (Unknown_Domain [153.88.183.54]) by sessmg23.ericsson.net (Symantec Mail Security) with SMTP id 51.D7.09869.872D10A5; Tue, 7 Nov 2017 16:34:16 +0100 (CET) Received: from ESESSMB107.ericsson.se ([169.254.7.134]) by ESESSHC012.ericsson.se ([153.88.183.54]) with mapi id 14.03.0352.000; Tue, 7 Nov 2017 16:34:06 +0100 From: Jan Scheurich To: "'dev@openvswitch.org'" Thread-Topic: [PATCH v2 1/2] NSH: Minor bugfixes Thread-Index: AdNX2pVxSUh9H8ICS06fLvcynPKSnw== Date: Tue, 7 Nov 2017 15:34:06 +0000 Message-ID: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [153.88.183.19] MIME-Version: 1.0 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFupnkeLIzCtJLcpLzFFi42KZGbHdTLfiEmOUwfGlAhavJjcwWhw9vYfZ YsWm08wWv79uY3Jg8Vi85yWTx7Ob/xk9nl/rYfF4v+8qWwBLFJdNSmpOZllqkb5dAlfGmVtv WQseVlY0v1nE2sB4I72LkZNDQsBEomfmPKYuRi4OIYHDjBKPuhawQDiLGSVeLW9k7mLk4GAT MJCYvdsBpEFEwFDi0qSTrCA1zAJzGCVO/l3ICJIQFtCW6LyzkB2iyEDizMV5zBC2nsT79qdg NSwCKhKLer6ygdi8Ar4SLw7MAbMZBcQkvp9awwRiMwuIS9x6Mp8J4joBiSV7zjND2KISLx// Y4WwFSXanzYwgtzGLJAvsWqKB8RIQYmTM5+wTGAUmoVk0iyEqllIqiBKdCQW7P7EBmFrSyxb +JoZxj5z4DETsvgCRvZVjKLFqcXFuelGxnqpRZnJxcX5eXp5qSWbGIHRdHDLb90djKtfOx5i FOBgVOLh7T3HGCXEmlhWXJl7iFGCg1lJhHe7OkOUEG9KYmVValF+fFFpTmrxIUZpDhYlcV6H fRcihATSE0tSs1NTC1KLYLJMHJxSDYxTmxtO9cpE6c46cc9G2t2px3rHi2vXXr36kxxobnrC b8kVXt4pwum5Drab3n9Qu6zlpL57tUAVd3LGx8yqUBGNV2v+fdz9a98SiXN3JVSuRTM29VRe D7W9zb3PXX6jsNztXXHCljnv5U+7Tt2bPl0k4tnO/+aqJtymZ5Pi5hfpz9B00H3WOUGJpTgj 0VCLuag4EQDKEx/5ogIAAA== X-Spam-Status: No, score=-2.3 required=5.0 tests=HTML_MESSAGE, RCVD_IN_DNSWL_MED autolearn=disabled version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org X-Content-Filtered-By: Mailman/MimeDel 2.1.12 Cc: "Jiri Benc \(jbenc@redhat.com\)" Subject: [ovs-dev] [PATCH v2 1/2] NSH: Minor bugfixes X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org - Fix 2 incorrect length checks - Remove unnecessary limit of MD length to 16 bytes - Remove incorrect comments stating MD2 was not supported - Pad metadata in encap_nsh with zeroes if not multiple of 4 bytes Signed-off-by: Jan Scheurich --- datapath/linux/compat/include/linux/openvswitch.h | 6 +++--- lib/flow.c | 13 ++++++------- lib/odp-util.c | 9 +++++++-- lib/packets.c | 3 +-- 4 files changed, 17 insertions(+), 14 deletions(-) -- 1.9.1 diff --git a/datapath/linux/compat/include/linux/openvswitch.h b/datapath/linux/compat/include/linux/openvswitch.h index bc6c94b..561f895 100644 --- a/datapath/linux/compat/include/linux/openvswitch.h +++ b/datapath/linux/compat/include/linux/openvswitch.h @@ -793,15 +793,15 @@ struct ovs_action_push_eth { struct ovs_key_ethernet addresses; }; -#define OVS_ENCAP_NSH_MAX_MD_LEN 16 +#define OVS_ENCAP_NSH_MAX_MD_LEN 248 /* * struct ovs_action_encap_nsh - %OVS_ACTION_ATTR_ENCAP_NSH * @flags: NSH header flags. * @mdtype: NSH metadata type. - * @mdlen: Length of NSH metadata in bytes. + * @mdlen: Length of NSH metadata in bytes, including padding. * @np: NSH next_protocol: Inner packet type. * @path_hdr: NSH service path id and service index. - * @metadata: NSH metadata for MD type 1 or 2 + * @metadata: NSH context metadata, padded to 4-bytes */ struct ovs_action_encap_nsh { uint8_t flags; diff --git a/lib/flow.c b/lib/flow.c index 4d2b774..e30ca98 100644 --- a/lib/flow.c +++ b/lib/flow.c @@ -540,7 +540,7 @@ parse_nsh(const void **datap, size_t *sizep, struct flow_nsh *key) /* Check if it is long enough for NSH header, doesn't support * MD type 2 yet */ - if (OVS_UNLIKELY(*sizep < NSH_M_TYPE1_LEN)) { + if (OVS_UNLIKELY(*sizep < NSH_BASE_HDR_LEN)) { return false; } @@ -557,10 +557,6 @@ parse_nsh(const void **datap, size_t *sizep, struct flow_nsh *key) return false; } - if (length != NSH_M_TYPE1_LEN) { - return false; - } - key->flags = flags; key->mdtype = nsh->md_type; key->np = nsh->next_proto; @@ -571,14 +567,17 @@ parse_nsh(const void **datap, size_t *sizep, struct flow_nsh *key) switch (key->mdtype) { case NSH_M_TYPE1: + if (length != NSH_M_TYPE1_LEN) { + return false; + } for (size_t i = 0; i < 4; i++) { key->c[i] = get_16aligned_be32(&nsh->md1.c[i]); } break; case NSH_M_TYPE2: - /* Don't support MD type 2 yet, so return false */ default: - return false; + /* We don't parse other context headers yet. */ + break; } data_pull(datap, sizep, length); diff --git a/lib/odp-util.c b/lib/odp-util.c index 6304b3d..d8daede 100644 --- a/lib/odp-util.c +++ b/lib/odp-util.c @@ -1864,12 +1864,17 @@ parse_odp_encap_nsh_action(const char *s, struct ofpbuf *actions) else if (encap_nsh.mdtype == NSH_M_TYPE2) { struct ofpbuf b; char buf[512]; - size_t mdlen; + size_t mdlen, padding; if (ovs_scan_len(s, &n, "md2=0x%511[0-9a-fA-F]", buf)) { ofpbuf_use_stub(&b, encap_nsh.metadata, OVS_ENCAP_NSH_MAX_MD_LEN); ofpbuf_put_hex(&b, buf, &mdlen); - encap_nsh.mdlen = mdlen; + /* Pad metadata to 4 bytes. */ + padding = PAD_SIZE(mdlen, 4); + if (padding > 0) { + ofpbuf_push_zeros(&b, padding); + } + encap_nsh.mdlen = mdlen + padding; ofpbuf_uninit(&b); } continue; diff --git a/lib/packets.c b/lib/packets.c index 51044df..c991e9f 100644 --- a/lib/packets.c +++ b/lib/packets.c @@ -439,8 +439,7 @@ encap_nsh(struct dp_packet *packet, const struct ovs_action_encap_nsh *encap) break; case NSH_M_TYPE2: { /* The MD2 metadata in encap is already padded to 4 bytes. */ - size_t len = ROUND_UP(encap->mdlen, 4); - memcpy(&nsh->md2, encap->metadata, len); + memcpy(&nsh->md2, encap->metadata, encap->mdlen); break; } default: