FD.io VPP  v21.10.1-2-g0a485f517
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;
41 
42  /* Ignoring the profile id as currently a single profile
43  * is supported */
44  error =
46  if (error)
47  {
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;
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  {
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;
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 
110  hm->has_pot_option,
111  hm->has_ppc_option, 0 /* is_ipv6 */ );
112 
113 
114  if (error)
115  {
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;
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  {
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 
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 
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  */
vxlan_gpe_ioam_main_::sw_interfaces
vxlan_gpe_ioam_sw_interface_t * sw_interfaces
Definition: vxlan_gpe_ioam.h:88
vl_api_vxlan_gpe_ioam_transit_disable_t_handler
static void vl_api_vxlan_gpe_ioam_transit_disable_t_handler(vl_api_vxlan_gpe_ioam_transit_disable_t *mp)
Definition: vxlan_gpe_api.c:190
vl_api_vxlan_gpe_ioam_vni_enable_t_handler
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
vl_api_vxlan_gpe_ioam_transit_enable_t::dst_addr
vl_api_address_t dst_addr
Definition: ioam_vxlan_gpe.api:93
api.h
vxlan_gpe_encap_node
vlib_node_registration_t vxlan_gpe_encap_node
(constructor) VLIB_REGISTER_NODE (vxlan_gpe_encap_node)
Definition: encap.c:403
vl_api_vxlan_gpe_ioam_enable_t
iOAM Over VxLAN-GPE - Set iOAM transport for VxLAN-GPE
Definition: ioam_vxlan_gpe.api:29
vlib_node_add_next
static uword vlib_node_add_next(vlib_main_t *vm, uword node, uword next_node)
Definition: node_funcs.h:1177
vec_new
#define vec_new(T, N)
Create new vector of given type and length (unspecified alignment, no header).
Definition: vec.h:365
clib_memcpy
#define clib_memcpy(d, s, n)
Definition: string.h:197
vxlan_gpe_ioam_main_::dst_by_ip6
uword * dst_by_ip6
Definition: vxlan_gpe_ioam.h:93
vl_api_vxlan_gpe_ioam_vni_disable_t::vni
u32 vni
Definition: ioam_vxlan_gpe.api:77
clib_error_get_code
#define clib_error_get_code(err)
Definition: error.h:77
pool_elt_at_index
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
Definition: pool.h:549
vl_api_vxlan_gpe_ioam_vni_disable_t_handler
static void vl_api_vxlan_gpe_ioam_vni_disable_t_handler(vl_api_vxlan_gpe_ioam_vni_disable_t *mp)
Definition: vxlan_gpe_api.c:125
vl_api_vxlan_gpe_ioam_enable_t::trace_enable
bool trace_enable
Definition: ioam_vxlan_gpe.api:35
vxlan_gpe_ioam_main_::has_trace_option
u8 has_trace_option
Definition: vxlan_gpe_ioam.h:51
vl_api_vxlan_gpe_ioam_disable_t_handler
static void vl_api_vxlan_gpe_ioam_disable_t_handler(vl_api_vxlan_gpe_ioam_disable_t *mp)
Definition: vxlan_gpe_api.c:56
vxlan_gpe_ioam_interface_init
void vxlan_gpe_ioam_interface_init(void)
Definition: vxlan_gpe_ioam.c:749
vxlan_gpe_ioam_main_::vlib_time_0
f64 vlib_time_0
Definition: vxlan_gpe_ioam.h:47
vxlan_gpe_ioam_main
vxlan_gpe_ioam_main_t vxlan_gpe_ioam_main
Definition: vxlan_gpe_ioam.c:23
vni
u32 vni
Definition: flow_types.api:160
vxlan_gpe_ioam_main_::has_ppc_option
u8 has_ppc_option
Definition: vxlan_gpe_ioam.h:59
vl_api_vxlan_gpe_ioam_transit_disable_t::outer_fib_index
u32 outer_fib_index
Definition: ioam_vxlan_gpe.api:106
vxlan_gpe_main_t
Struct for VXLAN GPE node state.
Definition: vxlan_gpe.h:197
vxlan_gpe_ioam_main_::vlib_main
vlib_main_t * vlib_main
State convenience vlib_main_t.
Definition: vxlan_gpe_ioam.h:100
vm
vlib_main_t * vm
X-connect all packets from the HOST to the PHY.
Definition: nat44_ei.c:3047
api.h
clib_error_report
#define clib_error_report(e)
Definition: error.h:113
vl_api_vxlan_gpe_ioam_vni_enable_t
Enable iOAM for a VNI (VXLAN-GPE)
Definition: ioam_vxlan_gpe.api:58
ADDRESS_IP6
@ ADDRESS_IP6
Definition: ip_types.api:23
vxlan_gpe_ioam_main_::unix_time_0
u32 unix_time_0
Definition: vxlan_gpe_ioam.h:46
vl_api_vxlan_gpe_ioam_vni_enable_t::remote
vl_api_address_t remote
Definition: ioam_vxlan_gpe.api:63
vxlan_gpe_ioam.h
vxlan_gpe_ioam_main_::vnet_main
vnet_main_t * vnet_main
State convenience vnet_main_t.
Definition: vxlan_gpe_ioam.h:102
vxlan_gpe_ioam_main_::has_pot_option
u8 has_pot_option
Definition: vxlan_gpe_ioam.h:54
error
Definition: cJSON.c:88
vxlan_gpe_ioam_disable_for_dest
int vxlan_gpe_ioam_disable_for_dest(vlib_main_t *vm, ip46_address_t dst_addr, u32 outer_fib_index, u8 ipv4_set)
Definition: vxlan_gpe_ioam.c:603
vl_api_vxlan_gpe_ioam_enable_t::pow_enable
bool pow_enable
Definition: ioam_vxlan_gpe.api:34
ip_address_decode
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:172
hash_create_mem
#define hash_create_mem(elts, key_bytes, value_bytes)
Definition: hash.h:660
vl_api_vxlan_gpe_ioam_transit_disable_t
Disable iOAM for VXLAN-GPE transit.
Definition: ioam_vxlan_gpe.api:103
vlib_node_t::index
u32 index
Definition: node.h:269
vxlan_gpe_ioam_clear
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)
Definition: vxlan_gpe_ioam.c:126
vxlan_gpe_main
vxlan_gpe_main_t vxlan_gpe_main
Definition: vxlan_gpe.c:47
vnet_get_main
vnet_main_t * vnet_get_main(void)
Definition: pnat_test_stubs.h:56
REPLY_MACRO
#define REPLY_MACRO(t)
Definition: api_helper_macros.h:30
setup_message_id_table
static void setup_message_id_table(api_main_t *am)
Definition: sr_mpls_api.c:174
vl_api_vxlan_gpe_ioam_vni_enable_t::local
vl_api_address_t local
Definition: ioam_vxlan_gpe.api:62
ioam_vxlan_gpe_init
static clib_error_t * ioam_vxlan_gpe_init(vlib_main_t *vm)
Definition: vxlan_gpe_api.c:207
uword
u64 uword
Definition: types.h:112
vxlan_gpe_ioam_main_::encap_v4_next_node
uword encap_v4_next_node
Definition: vxlan_gpe_ioam.h:84
vxlan_gpe_ioam_main_::msg_id_base
u16 msg_id_base
Definition: vxlan_gpe_ioam.h:77
dst_addr
vl_api_mac_address_t dst_addr
Definition: flow_types.api:65
vl_api_vxlan_gpe_ioam_vni_enable_t::vni
u32 vni
Definition: ioam_vxlan_gpe.api:61
vxlan_gpe_tunnel_t
Struct for VXLAN GPE tunnel.
Definition: vxlan_gpe.h:103
vl_api_vxlan_gpe_ioam_vni_disable_t::local
vl_api_address_t local
Definition: ioam_vxlan_gpe.api:78
vl_api_vxlan_gpe_ioam_transit_enable_t::outer_fib_index
u32 outer_fib_index
Definition: ioam_vxlan_gpe.api:92
vl_api_vxlan_gpe_ioam_enable_t::trace_ppc
u8 trace_ppc
Definition: ioam_vxlan_gpe.api:33
vxlan_gpe_sw_interface_
Definition: vxlan_gpe_ioam.h:24
gm
#define gm
Definition: dlmalloc.c:1219
plugin.h
vxlan_gpe_ioam_enable
clib_error_t * vxlan_gpe_ioam_enable(int has_trace_option, int has_pot_option, int has_ppc_option)
Definition: vxlan_gpe_ioam.c:522
vxlan_gpe_ioam_disable
clib_error_t * vxlan_gpe_ioam_disable(int has_trace_option, int has_pot_option, int has_ppc_option)
Definition: vxlan_gpe_ioam.c:538
is_ip6
bool is_ip6
Definition: ip.api:43
hash_get_mem
#define hash_get_mem(h, key)
Definition: hash.h:269
vlib_get_node_by_name
vlib_node_t * vlib_get_node_by_name(vlib_main_t *vm, u8 *name)
Definition: node.c:45
vxlan_gpe_encap_ioam_v4_node
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
format_fns.h
vxlan_gpe_ioam_main_
Definition: vxlan_gpe_ioam.h:38
vl_api_vxlan_gpe_ioam_enable_t_handler
static void vl_api_vxlan_gpe_ioam_enable_t_handler(vl_api_vxlan_gpe_ioam_enable_t *mp)
Definition: vxlan_gpe_api.c:36
vl_api_vxlan_gpe_ioam_transit_disable_t::dst_addr
vl_api_address_t dst_addr
Definition: ioam_vxlan_gpe.api:107
u32
unsigned int u32
Definition: types.h:88
vxlan_gpe_decap_ioam_v4_node
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
VLIB_INIT_FUNCTION
#define VLIB_INIT_FUNCTION(x)
Definition: init.h:172
vl_api_vxlan_gpe_ioam_transit_enable_t_handler
static void vl_api_vxlan_gpe_ioam_transit_enable_t_handler(vl_api_vxlan_gpe_ioam_transit_enable_t *mp)
Definition: vxlan_gpe_api.c:172
api_helper_macros.h
pool_elts
static uword pool_elts(void *v)
Number of active elements in a pool.
Definition: pool.h:127
vxlan_gpe_ioam_main_::dst_by_ip4
uword * dst_by_ip4
Definition: vxlan_gpe_ioam.h:92
vl_api_vxlan_gpe_ioam_disable_t
iOAM for VxLAN-GPE disable
Definition: ioam_vxlan_gpe.api:43
vlib_main_t
Definition: main.h:102
vlib_node_t
Definition: node.h:247
u8
unsigned char u8
Definition: types.h:56
clib_error_t
Definition: clib_error.h:21
vlib_init_function_t
clib_error_t *() vlib_init_function_t(struct vlib_main_t *vm)
Definition: init.h:51
vxlan_gpe_register_decap_protocol
void vxlan_gpe_register_decap_protocol(u8 protocol_id, uword next_node_index)
Definition: decap.c:687
rv
int __clib_unused rv
Definition: application.c:491
vxlan_gpe_ioam_set
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)
Definition: vxlan_gpe_ioam.c:148
vl_api_vxlan_gpe_ioam_transit_enable_t
Enable iOAM for a VXLAN-GPE transit.
Definition: ioam_vxlan_gpe.api:89
vlib_time_now
static f64 vlib_time_now(vlib_main_t *vm)
Definition: main.h:327
vxlan_gpe_enable_disable_ioam_for_dest
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)
Definition: vxlan_gpe_ioam.c:202
vnet.h
ADDRESS_IP4
@ ADDRESS_IP4
Definition: ip_types.api:22
ip_types_api.h
vl_api_vxlan_gpe_ioam_vni_disable_t
Disable iOAM for a VNI (VXLAN-GPE)
Definition: ioam_vxlan_gpe.api:74
fib_prefix_t_
Aggregate type for a prefix.
Definition: fib_types.h:202
vl_api_vxlan_gpe_ioam_vni_disable_t::remote
vl_api_address_t remote
Definition: ioam_vxlan_gpe.api:79