d1c46121d252caf419d83af8b9708fef427fb9c2
[vpp.git] / vnet / vnet / nsh / nsh.h
1 /*
2  * Copyright (c) 2015 Cisco and/or its affiliates.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at:
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #ifndef included_vnet_nsh_h
16 #define included_vnet_nsh_h
17
18 #include <vnet/vnet.h>
19 #include <vnet/nsh/nsh_packet.h>
20 #include <vnet/ip/ip4_packet.h>
21
22 typedef struct {
23
24   /** Key for nsh_header_t entry: 24bit NSP 8bit NSI */
25   u32 nsp_nsi;
26
27   /** Key for nsh_header_t entry to map to. : 24bit NSP 8bit NSI 
28    *  This may be ~0 if next action is to decap to NSH next protocol
29    *  Note the following heuristic:
30    *  if nsp_nsi == mapped_nsp_nsi then use-case is like SFC SFF
31    *  if nsp_nsi != mapped_nsp_nsi then use-case is like SFC SF
32    *  Note: these are heuristics. Rules about NSI decrement are out of scope
33    */
34   u32 mapped_nsp_nsi;
35
36   /* vnet intfc sw_if_index */
37   u32 sw_if_index;
38
39   u32 next_node;
40
41 } nsh_map_t;
42
43 typedef struct {
44   nsh_map_t map;
45   u32 is_add;
46 } vnet_nsh_add_del_map_args_t;
47
48 typedef struct {
49   u8 is_add;
50   nsh_header_t nsh;
51 } vnet_nsh_add_del_entry_args_t;
52
53 typedef struct {
54   /* vector of nsh_header entry instances */
55   nsh_header_t *nsh_entries;
56
57   /* hash lookup nsh header by key: {u32: nsp_nsi} */
58   uword * nsh_entry_by_key;
59
60   /* vector of nsh_mappings */
61   nsh_map_t *nsh_mappings;
62
63   /* hash lookup nsh mapping by key: {u32: nsp_nsi} */
64   uword * nsh_mapping_by_key;
65   uword * nsh_mapping_by_mapped_key; // for use in NSHSFC
66
67   /* convenience */
68   vlib_main_t * vlib_main;
69   vnet_main_t * vnet_main;
70 } nsh_main_t;
71
72 nsh_main_t nsh_main;
73
74 u8 * format_nsh_input_map_trace (u8 * s, va_list * args);
75 u8 * format_nsh_header_with_length (u8 * s, va_list * args);
76
77 /* Statistics (not really errors) */
78 #define foreach_nsh_input_error    \
79 _(MAPPED, "NSH header found and mapped") \
80 _(NO_MAPPING, "no mapping for nsh key") \
81 _(INVALID_NEXT_PROTOCOL, "invalid next protocol") \
82
83 typedef enum {
84 #define _(sym,str) NSH_INPUT_ERROR_##sym,
85     foreach_nsh_input_error
86 #undef _
87   NSH_INPUT_N_ERROR,
88
89 } nsh_input_error_t;
90
91 #define foreach_nsh_input_next        \
92   _(DROP, "error-drop")                 \
93   _(ENCAP_GRE, "gre-input" )            \
94   _(ENCAP_VXLANGPE, "vxlan-gpe-encap" ) \
95 /* /\* TODO once moved to Project:NSH_SFC *\/ */
96   /* _(ENCAP_ETHERNET, "*** TX TO ETHERNET ***")   \ */
97 /*   _(DECAP_ETHERNET_LOOKUP, "ethernet-input" )        \ */
98 /*   _(DECAP_IP4_INPUT,  "ip4-input") \ */
99 /*   _(DECAP_IP6_INPUT,  "ip6-input" ) \  */
100
101 typedef enum {
102 #define _(s,n) NSH_INPUT_NEXT_##s,
103   foreach_nsh_input_next
104 #undef _
105   NSH_INPUT_N_NEXT,
106 } nsh_input_next_t;
107
108 #endif /* included_vnet_nsh_h */