FD.io VPP  v20.05.1-6-gf53edbc3b
Vector Packet Processing
vxlan_gpe_api.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2016 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 /*
16  *------------------------------------------------------------------
17  * vxlan_gpe_api.c - iOAM VxLAN-GPE related APIs to create
18  * and maintain profiles
19  *------------------------------------------------------------------
20  */
21 
22 #include <vnet/vnet.h>
23 #include <vnet/plugin/plugin.h>
26 #include <vlibapi/api.h>
27 #include <vlibmemory/api.h>
28 #include <vnet/format_fns.h>
29 #include <vnet/ip/ip_types_api.h>
30 
31 /* define message IDs */
32 #include <ioam/lib-vxlan-gpe/ioam_vxlan_gpe.api_enum.h>
33 #include <ioam/lib-vxlan-gpe/ioam_vxlan_gpe.api_types.h>
34 
37 {
38  int rv = 0;
39  vl_api_vxlan_gpe_ioam_enable_reply_t *rmp;
40  clib_error_t *error;
41 
42  /* Ignoring the profile id as currently a single profile
43  * is supported */
44  error =
46  if (error)
47  {
48  clib_error_report (error);
49  rv = clib_error_get_code (error);
50  }
51 
52  REPLY_MACRO (VL_API_VXLAN_GPE_IOAM_ENABLE_REPLY);
53 }
54 
57 {
58  int rv = 0;
59  vl_api_vxlan_gpe_ioam_disable_reply_t *rmp;
60  clib_error_t *error;
61 
62  /* Ignoring the profile id as currently a single profile
63  * is supported */
64  error = vxlan_gpe_ioam_disable (0, 0, 0);
65  if (error)
66  {
67  clib_error_report (error);
68  rv = clib_error_get_code (error);
69  }
70 
71  REPLY_MACRO (VL_API_VXLAN_GPE_IOAM_DISABLE_REPLY);
72 }
73 
76 {
77  int rv = 0;
78  vl_api_vxlan_gpe_ioam_vni_enable_reply_t *rmp;
79  clib_error_t *error;
80  vxlan4_gpe_tunnel_key_t key4;
81  uword *p = NULL;
83  vxlan_gpe_tunnel_t *t = 0;
85  u32 vni;
86 
87 
88  if (clib_net_to_host_u32 (mp->local.af) == ADDRESS_IP4 &&
89  clib_net_to_host_u32 (mp->remote.af) == ADDRESS_IP4)
90  {
91  clib_memcpy (&key4.local, &mp->local.un.ip4, sizeof (key4.local));
92  clib_memcpy (&key4.remote, &mp->remote.un.ip4, sizeof (key4.remote));
93  vni = clib_net_to_host_u32 (mp->vni);
94  key4.vni = clib_host_to_net_u32 (vni << 8);
95  key4.pad = 0;
96 
97  p = hash_get_mem (gm->vxlan4_gpe_tunnel_by_key, &key4);
98  }
99  else
100  {
101  return;
102  }
103 
104  if (!p)
105  return;
106 
107  t = pool_elt_at_index (gm->tunnels, p[0]);
108 
109  error = vxlan_gpe_ioam_set (t, hm->has_trace_option,
110  hm->has_pot_option,
111  hm->has_ppc_option, 0 /* is_ipv6 */ );
112 
113 
114  if (error)
115  {
116  clib_error_report (error);
117  rv = clib_error_get_code (error);
118  }
119 
120  REPLY_MACRO (VL_API_VXLAN_GPE_IOAM_VNI_ENABLE_REPLY);
121 }
122 
123 
126 {
127  int rv = 0;
128  vl_api_vxlan_gpe_ioam_vni_enable_reply_t *rmp;
129  clib_error_t *error;
130  vxlan4_gpe_tunnel_key_t key4;
131  uword *p = NULL;
133  vxlan_gpe_tunnel_t *t = 0;
134  u32 vni;
135 
136 
137  if (clib_net_to_host_u32 (mp->local.af) == ADDRESS_IP4 &&
138  clib_net_to_host_u32 (mp->remote.af) == ADDRESS_IP4)
139  {
140  clib_memcpy (&key4.local, &mp->local, sizeof (key4.local));
141  clib_memcpy (&key4.remote, &mp->remote, sizeof (key4.remote));
142  vni = clib_net_to_host_u32 (mp->vni);
143  key4.vni = clib_host_to_net_u32 (vni << 8);
144  key4.pad = 0;
145 
146  p = hash_get_mem (gm->vxlan4_gpe_tunnel_by_key, &key4);
147  }
148  else
149  {
150  return;
151  }
152 
153  if (!p)
154  return;
155 
156  t = pool_elt_at_index (gm->tunnels, p[0]);
157 
158  error = vxlan_gpe_ioam_clear (t, 0, 0, 0, 0);
159 
160 
161  if (error)
162  {
163  clib_error_report (error);
164  rv = clib_error_get_code (error);
165  }
166 
167 
168  REPLY_MACRO (VL_API_VXLAN_GPE_IOAM_VNI_DISABLE_REPLY);
169 }
170 
173 {
174  int rv = 0;
175  vl_api_vxlan_gpe_ioam_transit_enable_reply_t *rmp;
177  ip46_address_t dst_addr;
178 
179  ip_address_decode (&mp->dst_addr, &dst_addr);
180  bool is_ip6 = clib_net_to_host_u32 (mp->dst_addr.af) == ADDRESS_IP6;
182  dst_addr,
183  ntohl (mp->outer_fib_index),
184  is_ip6, 1 /* is_add */ );
185 
186  REPLY_MACRO (VL_API_VXLAN_GPE_IOAM_TRANSIT_ENABLE_REPLY);
187 }
188 
191 {
192  int rv = 0;
193  vl_api_vxlan_gpe_ioam_transit_disable_reply_t *rmp;
195  ip46_address_t dst_addr;
196 
197  ip_address_decode (&mp->dst_addr, &dst_addr);
198  bool is_ip6 = clib_net_to_host_u32 (mp->dst_addr.af) == ADDRESS_IP6;
200  dst_addr,
201  ntohl (mp->outer_fib_index), is_ip6);
202  REPLY_MACRO (VL_API_VXLAN_GPE_IOAM_TRANSIT_DISABLE_REPLY);
203 }
204 
205 #include <ioam/lib-vxlan-gpe/ioam_vxlan_gpe.api.c>
206 static clib_error_t *
208 {
210  u32 encap_node_index = vxlan_gpe_encap_ioam_v4_node.index;
211  u32 decap_node_index = vxlan_gpe_decap_ioam_v4_node.index;
213  vlib_node_t *vxlan_gpe_decap_node = NULL;
214  uword next_node = 0;
215 
216  sm->vlib_main = vm;
217  sm->vnet_main = vnet_get_main ();
218  sm->unix_time_0 = (u32) time (0); /* Store starting time */
219  sm->vlib_time_0 = vlib_time_now (vm);
220 
221  /* Ask for a correctly-sized block of API message decode slots */
223 
224  /* Hook the ioam-encap node to vxlan-gpe-encap */
225  vxlan_gpe_encap_node = vlib_get_node_by_name (vm, (u8 *) "vxlan-gpe-encap");
226  sm->encap_v4_next_node =
227  vlib_node_add_next (vm, vxlan_gpe_encap_node->index, encap_node_index);
228 
229  vxlan_gpe_decap_node =
230  vlib_get_node_by_name (vm, (u8 *) "vxlan4-gpe-input");
231  next_node =
232  vlib_node_add_next (vm, vxlan_gpe_decap_node->index, decap_node_index);
233  vxlan_gpe_register_decap_protocol (VXLAN_GPE_PROTOCOL_IOAM, next_node);
234 
236  sm->dst_by_ip4 = hash_create_mem (0, sizeof (fib_prefix_t), sizeof (uword));
237 
238  sm->dst_by_ip6 = hash_create_mem (0, sizeof (fib_prefix_t), sizeof (uword));
239 
241 
242  return 0;
243 }
244 
246 
247 /*
248  * fd.io coding-style-patch-verification: ON
249  *
250  * Local Variables:
251  * eval: (c-set-style "gnu")
252  * End:
253  */
clib_error_t * vxlan_gpe_ioam_enable(int has_trace_option, int has_pot_option, int has_ppc_option)
static void vl_api_vxlan_gpe_ioam_transit_disable_t_handler(vl_api_vxlan_gpe_ioam_transit_disable_t *mp)
Disable iOAM for VXLAN-GPE transit.
vnet_main_t * vnet_get_main(void)
Definition: misc.c:46
vlib_main_t * vlib_main
State convenience vlib_main_t.
vlib_node_registration_t vxlan_gpe_decap_ioam_v4_node
(constructor) VLIB_REGISTER_NODE (vxlan_gpe_decap_ioam_v4_node)
Definition: ioam_decap.c:197
iOAM for VxLAN-GPE disable
u32 index
Definition: node.h:282
static f64 vlib_time_now(vlib_main_t *vm)
Definition: main.h:291
int vxlan_gpe_enable_disable_ioam_for_dest(vlib_main_t *vm, ip46_address_t dst_addr, u32 outer_fib_index, u8 is_ipv4, u8 is_add)
vxlan_gpe_ioam_sw_interface_t * sw_interfaces
clib_error_t * vxlan_gpe_ioam_clear(vxlan_gpe_tunnel_t *t, int has_trace_option, int has_pot_option, int has_ppc_option, u8 ipv6_set)
void vxlan_gpe_ioam_interface_init(void)
static uword vlib_node_add_next(vlib_main_t *vm, uword node, uword next_node)
Definition: node_funcs.h:1092
unsigned char u8
Definition: types.h:56
iOAM Over VxLAN-GPE - Set iOAM transport for VxLAN-GPE
vlib_node_registration_t vxlan_gpe_encap_ioam_v4_node
(constructor) VLIB_REGISTER_NODE (vxlan_gpe_encap_ioam_v4_node)
Definition: ioam_encap.c:168
#define clib_memcpy(d, s, n)
Definition: string.h:180
clib_error_t * vxlan_gpe_ioam_disable(int has_trace_option, int has_pot_option, int has_ppc_option)
#define VLIB_INIT_FUNCTION(x)
Definition: init.h:173
#define vec_new(T, N)
Create new vector of given type and length (unspecified alignment, no header).
Definition: vec.h:350
int vxlan_gpe_ioam_disable_for_dest(vlib_main_t *vm, ip46_address_t dst_addr, u32 outer_fib_index, u8 ipv4_set)
static void vl_api_vxlan_gpe_ioam_vni_disable_t_handler(vl_api_vxlan_gpe_ioam_vni_disable_t *mp)
vxlan_gpe_ioam_main_t vxlan_gpe_ioam_main
Aggregate type for a prefix.
Definition: fib_types.h:203
unsigned int u32
Definition: types.h:88
void vxlan_gpe_register_decap_protocol(u8 protocol_id, uword next_node_index)
Definition: decap.c:687
ip46_type_t ip_address_decode(const vl_api_address_t *in, ip46_address_t *out)
Decode/Encode for struct/union types.
Definition: ip_types_api.c:160
bool is_ip6
Definition: ip.api:43
Disable iOAM for a VNI (VXLAN-GPE)
Enable iOAM for a VXLAN-GPE transit.
#define hash_create_mem(elts, key_bytes, value_bytes)
Definition: hash.h:661
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
Definition: pool.h:534
vlib_node_t * vlib_get_node_by_name(vlib_main_t *vm, u8 *name)
Definition: node.c:45
static void vl_api_vxlan_gpe_ioam_enable_t_handler(vl_api_vxlan_gpe_ioam_enable_t *mp)
Definition: vxlan_gpe_api.c:36
#define gm
Definition: dlmalloc.c:1219
Struct for VXLAN GPE tunnel.
Definition: vxlan_gpe.h:103
u32 vni
Definition: lisp_gpe.api:119
vxlan_gpe_main_t vxlan_gpe_main
Definition: vxlan_gpe.c:46
#define REPLY_MACRO(t)
static void vl_api_vxlan_gpe_ioam_disable_t_handler(vl_api_vxlan_gpe_ioam_disable_t *mp)
Definition: vxlan_gpe_api.c:56
vlib_main_t * vm
Definition: in2out_ed.c:1599
clib_error_t * vxlan_gpe_ioam_set(vxlan_gpe_tunnel_t *t, int has_trace_option, int has_pot_option, int has_ppc_option, u8 ipv6_set)
static void setup_message_id_table(api_main_t *am)
Struct for VXLAN GPE node state.
Definition: vxlan_gpe.h:197
#define clib_error_report(e)
Definition: error.h:113
vxlan_gpe_tunnel_t * tunnels
vector of encap tunnel instances
Definition: vxlan_gpe.h:200
Enable iOAM for a VNI (VXLAN-GPE)
static clib_error_t * ioam_vxlan_gpe_init(vlib_main_t *vm)
uword * vxlan4_gpe_tunnel_by_key
lookup IPv4 VXLAN GPE tunnel by key
Definition: vxlan_gpe.h:203
u64 uword
Definition: types.h:112
#define clib_error_get_code(err)
Definition: error.h:77
static void vl_api_vxlan_gpe_ioam_vni_enable_t_handler(vl_api_vxlan_gpe_ioam_vni_enable_t *mp)
Definition: vxlan_gpe_api.c:75
#define hash_get_mem(h, key)
Definition: hash.h:269
vlib_node_registration_t vxlan_gpe_encap_node
(constructor) VLIB_REGISTER_NODE (vxlan_gpe_encap_node)
Definition: encap.c:402
vnet_main_t * vnet_main
State convenience vnet_main_t.
static void vl_api_vxlan_gpe_ioam_transit_enable_t_handler(vl_api_vxlan_gpe_ioam_transit_enable_t *mp)
static uword pool_elts(void *v)
Number of active elements in a pool.
Definition: pool.h:128