From patchwork Wed Nov 1 20:51:52 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Pfaff X-Patchwork-Id: 833116 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 3yS0lB2vxnz9t2V for ; Thu, 2 Nov 2017 07:52:06 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 01753D0E; Wed, 1 Nov 2017 20:52:03 +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 95BA4D0B for ; Wed, 1 Nov 2017 20:52:01 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from relay3-d.mail.gandi.net (relay3-d.mail.gandi.net [217.70.183.195]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 198611A0 for ; Wed, 1 Nov 2017 20:52:01 +0000 (UTC) X-Originating-IP: 208.91.3.26 Received: from sigabrt.benpfaff.org (unknown [208.91.3.26]) (Authenticated sender: blp@ovn.org) by relay3-d.mail.gandi.net (Postfix) with ESMTPSA id 05221A80C7; Wed, 1 Nov 2017 21:51:57 +0100 (CET) From: Ben Pfaff To: dev@openvswitch.org Date: Wed, 1 Nov 2017 13:51:52 -0700 Message-Id: <20171101205152.4827-1-blp@ovn.org> X-Mailer: git-send-email 2.10.2 X-Spam-Status: No, score=-0.7 required=5.0 tests=RCVD_IN_DNSWL_LOW autolearn=disabled version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Cc: Ben Pfaff Subject: [ovs-dev] [PATCH] nsh: Fix packet format to match IETF NSH draft. 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: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org The NSH draft added a TTL field. This adds basic support. CC: Yi Yang CC: Jan Scheurich Signed-off-by: Ben Pfaff --- include/openvswitch/nsh.h | 11 +++++++---- lib/flow.c | 2 +- lib/odp-execute.c | 10 +++++----- lib/packets.c | 4 +++- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/include/openvswitch/nsh.h b/include/openvswitch/nsh.h index a3611d0896b2..4d83bad1af81 100644 --- a/include/openvswitch/nsh.h +++ b/include/openvswitch/nsh.h @@ -62,7 +62,7 @@ struct nsh_md2_tlv { }; struct nsh_hdr { - ovs_be16 ver_flags_len; + ovs_be16 ver_flags_ttl_len; uint8_t md_type; uint8_t next_proto; ovs_16aligned_be32 path_hdr; @@ -75,8 +75,10 @@ struct nsh_hdr { /* Masking NSH header fields. */ #define NSH_VER_MASK 0xc000 #define NSH_VER_SHIFT 14 -#define NSH_FLAGS_MASK 0x3fc0 -#define NSH_FLAGS_SHIFT 6 +#define NSH_FLAGS_MASK 0x3000 +#define NSH_FLAGS_SHIFT 12 +#define NSH_TTL_MASK 0x0fc0 +#define NSH_TTL_SHIFT 6 #define NSH_LEN_MASK 0x003f #define NSH_LEN_SHIFT 0 @@ -113,7 +115,8 @@ struct nsh_hdr { static inline uint16_t nsh_hdr_len(const struct nsh_hdr *nsh) { - return ((ntohs(nsh->ver_flags_len) & NSH_LEN_MASK) >> NSH_LEN_SHIFT) << 2; + return ((ntohs(nsh->ver_flags_ttl_len) & NSH_LEN_MASK) + >> NSH_LEN_SHIFT) << 2; } static inline struct nsh_md1_ctx * diff --git a/lib/flow.c b/lib/flow.c index 4d2b7747a124..57b6c597d207 100644 --- a/lib/flow.c +++ b/lib/flow.c @@ -546,7 +546,7 @@ parse_nsh(const void **datap, size_t *sizep, struct flow_nsh *key) memset(key, 0, sizeof(struct flow_nsh)); - ver_flags_len = ntohs(nsh->ver_flags_len); + ver_flags_len = ntohs(nsh->ver_flags_ttl_len); version = (ver_flags_len & NSH_VER_MASK) >> NSH_VER_SHIFT; flags = (ver_flags_len & NSH_FLAGS_MASK) >> NSH_FLAGS_SHIFT; diff --git a/lib/odp-execute.c b/lib/odp-execute.c index 5f4d23a91a3e..d5542bde8b02 100644 --- a/lib/odp-execute.c +++ b/lib/odp-execute.c @@ -279,8 +279,8 @@ odp_set_nsh(struct dp_packet *packet, const struct ovs_key_nsh *key, struct nsh_hdr *nsh = dp_packet_l3(packet); if (!mask) { - nsh->ver_flags_len = htons(key->flags << NSH_FLAGS_SHIFT) | - (nsh->ver_flags_len & ~htons(NSH_FLAGS_MASK)); + nsh->ver_flags_ttl_len = htons(key->flags << NSH_FLAGS_SHIFT) | + (nsh->ver_flags_ttl_len & ~htons(NSH_FLAGS_MASK)); put_16aligned_be32(&nsh->path_hdr, key->path_hdr); switch (nsh->md_type) { case NSH_M_TYPE1: @@ -294,11 +294,11 @@ odp_set_nsh(struct dp_packet *packet, const struct ovs_key_nsh *key, break; } } else { - uint8_t flags = (ntohs(nsh->ver_flags_len) & NSH_FLAGS_MASK) >> + uint8_t flags = (ntohs(nsh->ver_flags_ttl_len) & NSH_FLAGS_MASK) >> NSH_FLAGS_SHIFT; flags = key->flags | (flags & ~mask->flags); - nsh->ver_flags_len = htons(flags << NSH_FLAGS_SHIFT) | - (nsh->ver_flags_len & ~htons(NSH_FLAGS_MASK)); + nsh->ver_flags_ttl_len = htons(flags << NSH_FLAGS_SHIFT) | + (nsh->ver_flags_ttl_len & ~htons(NSH_FLAGS_MASK)); ovs_be32 path_hdr = get_16aligned_be32(&nsh->path_hdr); path_hdr = key->path_hdr | (path_hdr & ~mask->path_hdr); diff --git a/lib/packets.c b/lib/packets.c index 74d87eda89e1..a26b6c33e41c 100644 --- a/lib/packets.c +++ b/lib/packets.c @@ -427,7 +427,9 @@ encap_nsh(struct dp_packet *packet, const struct ovs_action_encap_nsh *encap) } nsh = (struct nsh_hdr *) dp_packet_push_uninit(packet, length); - nsh->ver_flags_len = htons(encap->flags << NSH_FLAGS_SHIFT | length >> 2); + nsh->ver_flags_ttl_len = htons((encap->flags << NSH_FLAGS_SHIFT) + | (63 << NSH_TTL_SHIFT) + | ((length >> 2) << NSH_LEN_SHIFT)); nsh->next_proto = next_proto; put_16aligned_be32(&nsh->path_hdr, encap->path_hdr); nsh->md_type = encap->mdtype;