2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-23 10:28:00 +00:00

136 lines
3.7 KiB
C
Raw Normal View History

#ifndef __OPENVSWITCH_NSH_H
#define __OPENVSWITCH_NSH_H 1
#include "openvswitch/types.h"
/*
* Network Service Header:
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* |Ver|O|C|R|R|R|R|R|R| Length | MD Type | Next Proto |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Service Path ID | Service Index |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | |
* ~ Mandatory/Optional Context Header ~
* | |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* Ver = The version field is used to ensure backward compatibility
* going forward with future NSH updates. It MUST be set to 0x0
* by the sender, in this first revision of NSH.
*
* O = OAM. when set to 0x1 indicates that this packet is an operations
* and management (OAM) packet. The receiving SFF and SFs nodes
* MUST examine the payload and take appropriate action.
*
* C = context. Indicates that a critical metadata TLV is present.
*
* Length : total length, in 4-byte words, of NSH including the Base
* Header, the Service Path Header and the optional variable
* TLVs.
* MD Type: indicates the format of NSH beyond the mandatory Base Header
* and the Service Path Header.
*
* Next Protocol: indicates the protocol type of the original packet. A
* new IANA registry will be created for protocol type.
*
* Service Path Identifier (SPI): identifies a service path.
* Participating nodes MUST use this identifier for Service
* Function Path selection.
*
* Service Index (SI): provides location within the SFP.
*
* [0] https://tools.ietf.org/html/draft-ietf-sfc-nsh-13
*/
#ifdef __cplusplus
extern "C" {
#endif
/**
* struct nsh_md1_ctx - Keeps track of NSH context data
* @nshc<1-4>: NSH Contexts.
*/
struct nsh_md1_ctx {
ovs_16aligned_be32 c[4];
};
struct nsh_md2_tlv {
ovs_be16 md_class;
uint8_t type;
uint8_t length;
uint8_t md_value[];
};
struct nsh_hdr {
ovs_be16 ver_flags_len;
uint8_t md_type;
uint8_t next_proto;
ovs_16aligned_be32 path_hdr;
union {
struct nsh_md1_ctx md1;
struct nsh_md2_tlv md2[0];
};
};
/* 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_LEN_MASK 0x003f
#define NSH_LEN_SHIFT 0
#define NSH_SPI_MASK 0xffffff00
#define NSH_SPI_SHIFT 8
#define NSH_SI_MASK 0x000000ff
#define NSH_SI_SHIFT 0
#define NSH_DST_PORT 4790 /* UDP Port for NSH on VXLAN. */
#define ETH_P_NSH 0x894F /* Ethertype for NSH. */
/* NSH Base Header Next Protocol. */
#define NSH_P_IPV4 0x01
#define NSH_P_IPV6 0x02
#define NSH_P_ETHERNET 0x03
#define NSH_P_NSH 0x04
#define NSH_P_MPLS 0x05
/* MD Type Registry. */
#define NSH_M_TYPE1 0x01
#define NSH_M_TYPE2 0x02
#define NSH_M_EXP1 0xFE
#define NSH_M_EXP2 0xFF
/* NSH Metadata Length. */
#define NSH_M_TYPE1_MDLEN 16
/* NSH Base Header Length */
#define NSH_BASE_HDR_LEN 8
/* NSH MD Type 1 header Length. */
#define NSH_M_TYPE1_LEN 24
static inline uint16_t
nsh_hdr_len(const struct nsh_hdr *nsh)
{
return 4 * (ntohs(nsh->ver_flags_len) & NSH_LEN_MASK) >> NSH_LEN_SHIFT;
}
static inline struct nsh_md1_ctx *
nsh_md1_ctx(struct nsh_hdr *nsh)
{
return &nsh->md1;
}
static inline struct nsh_md2_tlv *
nsh_md2_ctx(struct nsh_hdr *nsh)
{
return nsh->md2;
}
#ifdef __cplusplus
}
#endif
#endif