[ovs-dev] [PATCH] nsh: Fix packet format to match IETF NSH draft.
Yang, Yi
yi.y.yang at intel.com
Mon Nov 6 10:51:57 UTC 2017
On Thu, Nov 02, 2017 at 04:51:52AM +0800, Ben Pfaff wrote:
> The NSH draft added a TTL field. This adds basic support.
>
> CC: Yi Yang <yi.y.yang at intel.com>
> CC: Jan Scheurich <jan.scheurich at ericsson.com>
> Signed-off-by: Ben Pfaff <blp at ovn.org>
> ---
> 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);
Rename ver_flags_len to ver_flags_ttl_len.
Do we need to consider new ttl key in this patch?
> + 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;
> --
> 2.10.2
>
More information about the dev
mailing list