mirror of
https://github.com/openvswitch/ovs
synced 2025-08-23 10:28:00 +00:00
136 lines
3.7 KiB
C
136 lines
3.7 KiB
C
|
#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
|