aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/ioam-plugin/ioam
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/ioam-plugin/ioam')
-rw-r--r--plugins/ioam-plugin/ioam/dir.dox18
-rw-r--r--plugins/ioam-plugin/ioam/encap/ip6_ioam_e2e.c232
-rw-r--r--plugins/ioam-plugin/ioam/encap/ip6_ioam_e2e.h47
-rw-r--r--plugins/ioam-plugin/ioam/encap/ip6_ioam_pot.c276
-rw-r--r--plugins/ioam-plugin/ioam/encap/ip6_ioam_seqno.c109
-rw-r--r--plugins/ioam-plugin/ioam/encap/ip6_ioam_seqno.h70
-rw-r--r--plugins/ioam-plugin/ioam/encap/ip6_ioam_seqno_analyse.c141
-rw-r--r--plugins/ioam-plugin/ioam/encap/ip6_ioam_trace.c438
-rw-r--r--plugins/ioam-plugin/ioam/export-common/ioam_export.h616
-rw-r--r--plugins/ioam-plugin/ioam/export-vxlan-gpe/vxlan_gpe_ioam_export.api42
-rw-r--r--plugins/ioam-plugin/ioam/export-vxlan-gpe/vxlan_gpe_ioam_export.c271
-rw-r--r--plugins/ioam-plugin/ioam/export-vxlan-gpe/vxlan_gpe_ioam_export_all_api_h.h16
-rw-r--r--plugins/ioam-plugin/ioam/export-vxlan-gpe/vxlan_gpe_ioam_export_msg_enum.h28
-rw-r--r--plugins/ioam-plugin/ioam/export-vxlan-gpe/vxlan_gpe_ioam_export_test.c215
-rw-r--r--plugins/ioam-plugin/ioam/export-vxlan-gpe/vxlan_gpe_ioam_export_thread.c49
-rw-r--r--plugins/ioam-plugin/ioam/export-vxlan-gpe/vxlan_gpe_node.c162
-rw-r--r--plugins/ioam-plugin/ioam/export/ioam_export.api42
-rw-r--r--plugins/ioam-plugin/ioam/export/ioam_export.c282
-rw-r--r--plugins/ioam-plugin/ioam/export/ioam_export_all_api_h.h16
-rw-r--r--plugins/ioam-plugin/ioam/export/ioam_export_msg_enum.h28
-rw-r--r--plugins/ioam-plugin/ioam/export/ioam_export_test.c206
-rw-r--r--plugins/ioam-plugin/ioam/export/ioam_export_thread.c38
-rw-r--r--plugins/ioam-plugin/ioam/export/jvpp_ioam_export.c124
-rw-r--r--plugins/ioam-plugin/ioam/export/jvpp_ioam_export.h45
-rw-r--r--plugins/ioam-plugin/ioam/export/node.c151
-rw-r--r--plugins/ioam-plugin/ioam/ioam_plugin_doc.md464
-rw-r--r--plugins/ioam-plugin/ioam/jvpp/io/fd/vpp/jvpp/ioamexport/test/IoamExportApiTest.java56
-rw-r--r--plugins/ioam-plugin/ioam/jvpp/io/fd/vpp/jvpp/ioamexport/test/Readme.txt1
-rw-r--r--plugins/ioam-plugin/ioam/jvpp/io/fd/vpp/jvpp/ioampot/test/IoamPotApiTest.java75
-rw-r--r--plugins/ioam-plugin/ioam/jvpp/io/fd/vpp/jvpp/ioampot/test/Readme.txt1
-rw-r--r--plugins/ioam-plugin/ioam/jvpp/io/fd/vpp/jvpp/ioamtrace/test/IoamTraceApiTest.java77
-rw-r--r--plugins/ioam-plugin/ioam/jvpp/io/fd/vpp/jvpp/ioamtrace/test/Readme.txt1
-rw-r--r--plugins/ioam-plugin/ioam/lib-pot/jvpp_ioam_pot.c124
-rw-r--r--plugins/ioam-plugin/ioam/lib-pot/jvpp_ioam_pot.h45
-rw-r--r--plugins/ioam-plugin/ioam/lib-pot/math64.h159
-rw-r--r--plugins/ioam-plugin/ioam/lib-pot/pot.api133
-rw-r--r--plugins/ioam-plugin/ioam/lib-pot/pot_all_api_h.h16
-rw-r--r--plugins/ioam-plugin/ioam/lib-pot/pot_api.c292
-rw-r--r--plugins/ioam-plugin/ioam/lib-pot/pot_msg_enum.h28
-rw-r--r--plugins/ioam-plugin/ioam/lib-pot/pot_test.c365
-rw-r--r--plugins/ioam-plugin/ioam/lib-pot/pot_util.c445
-rw-r--r--plugins/ioam-plugin/ioam/lib-pot/pot_util.h195
-rw-r--r--plugins/ioam-plugin/ioam/lib-trace/jvpp_ioam_trace.c124
-rw-r--r--plugins/ioam-plugin/ioam/lib-trace/jvpp_ioam_trace.h45
-rw-r--r--plugins/ioam-plugin/ioam/lib-trace/trace.api92
-rw-r--r--plugins/ioam-plugin/ioam/lib-trace/trace_all_api_h.h16
-rw-r--r--plugins/ioam-plugin/ioam/lib-trace/trace_api.c252
-rw-r--r--plugins/ioam-plugin/ioam/lib-trace/trace_msg_enum.h28
-rw-r--r--plugins/ioam-plugin/ioam/lib-trace/trace_test.c292
-rw-r--r--plugins/ioam-plugin/ioam/lib-trace/trace_util.c206
-rw-r--r--plugins/ioam-plugin/ioam/lib-trace/trace_util.h247
-rw-r--r--plugins/ioam-plugin/ioam/lib-vxlan-gpe/ioam_decap.c223
-rw-r--r--plugins/ioam-plugin/ioam/lib-vxlan-gpe/ioam_encap.c194
-rw-r--r--plugins/ioam-plugin/ioam/lib-vxlan-gpe/ioam_pop.c353
-rw-r--r--plugins/ioam-plugin/ioam/lib-vxlan-gpe/ioam_transit.c188
-rw-r--r--plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe.api181
-rw-r--r--plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe_all_api_h.h16
-rw-r--r--plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe_api.c378
-rw-r--r--plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe_ioam.c773
-rw-r--r--plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe_ioam.h183
-rw-r--r--plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe_ioam_packet.h61
-rw-r--r--plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe_ioam_trace.c552
-rw-r--r--plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe_ioam_util.h172
-rw-r--r--plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe_msg_enum.h28
-rw-r--r--plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe_test.c600
65 files changed, 0 insertions, 11343 deletions
diff --git a/plugins/ioam-plugin/ioam/dir.dox b/plugins/ioam-plugin/ioam/dir.dox
deleted file mode 100644
index f3389b52c3e..00000000000
--- a/plugins/ioam-plugin/ioam/dir.dox
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- @dir
- @brief Inband OAM (iOAM) implementation
-*/
diff --git a/plugins/ioam-plugin/ioam/encap/ip6_ioam_e2e.c b/plugins/ioam-plugin/ioam/encap/ip6_ioam_e2e.c
deleted file mode 100644
index 0839cdceca7..00000000000
--- a/plugins/ioam-plugin/ioam/encap/ip6_ioam_e2e.c
+++ /dev/null
@@ -1,232 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <vlib/vlib.h>
-#include <vnet/vnet.h>
-#include <vnet/pg/pg.h>
-#include <vppinfra/error.h>
-
-#include <vnet/ip/ip.h>
-
-#include <vppinfra/hash.h>
-#include <vppinfra/error.h>
-#include <vppinfra/elog.h>
-
-#include <vnet/ip/ip6_hop_by_hop.h>
-#include <vnet/plugin/plugin.h>
-
-#include "ip6_ioam_e2e.h"
-
-ioam_e2e_main_t ioam_e2e_main;
-
-static u8 * ioam_e2e_trace_handler (u8 * s,
- ip6_hop_by_hop_option_t *opt)
-{
- ioam_e2e_option_t * e2e = (ioam_e2e_option_t *)opt;
- u32 seqno = 0;
-
- if (e2e)
- {
- seqno = clib_net_to_host_u32 (e2e->e2e_data);
- }
-
- s = format (s, "SeqNo = 0x%Lx", seqno);
- return s;
-}
-
-int
-ioam_e2e_config_handler (void *data, u8 disable)
-{
- int *analyse = data;
-
- /* Register hanlders if enabled */
- if (!disable)
- {
- /* If encap node register for encap handler */
- if (0 == *analyse)
- {
- if (ip6_hbh_register_option(HBH_OPTION_TYPE_IOAM_EDGE_TO_EDGE,
- ioam_seqno_encap_handler,
- ioam_e2e_trace_handler) < 0)
- {
- return (-1);
- }
- }
- /* If analyze node then register for decap handler */
- else
- {
- if (ip6_hbh_pop_register_option(HBH_OPTION_TYPE_IOAM_EDGE_TO_EDGE,
- ioam_seqno_decap_handler) < 0)
- {
- return (-1);
- }
- }
- return 0;
- }
-
- /* UnRegister handlers */
- (void) ip6_hbh_unregister_option(HBH_OPTION_TYPE_IOAM_EDGE_TO_EDGE);
- (void) ip6_hbh_pop_unregister_option(HBH_OPTION_TYPE_IOAM_EDGE_TO_EDGE);
- return 0;
-}
-
-int
-ioam_e2e_rewrite_handler (u8 *rewrite_string,
- u8 *rewrite_size)
-{
- ioam_e2e_option_t *e2e_option;
-
- if (rewrite_string && *rewrite_size == sizeof(ioam_e2e_option_t))
- {
- e2e_option = (ioam_e2e_option_t *)rewrite_string;
- e2e_option->hdr.type = HBH_OPTION_TYPE_IOAM_EDGE_TO_EDGE
- | HBH_OPTION_TYPE_SKIP_UNKNOWN;
- e2e_option->hdr.length = sizeof (ioam_e2e_option_t) -
- sizeof (ip6_hop_by_hop_option_t);
- return(0);
- }
- return(-1);
-}
-
-u32
-ioam_e2e_flow_handler (u32 ctx, u8 add)
-{
- ioam_e2e_data_t *data;
- u16 i;
-
- if (add)
- {
- pool_get(ioam_e2e_main.e2e_data, data);
- data->flow_ctx = ctx;
- ioam_seqno_init_bitmap(&data->seqno_data);
- return ((u32) (data - ioam_e2e_main.e2e_data));
- }
-
- /* Delete case */
- for (i = 0; i < vec_len(ioam_e2e_main.e2e_data); i++)
- {
- if (pool_is_free_index(ioam_e2e_main.e2e_data, i))
- continue;
-
- data = pool_elt_at_index(ioam_e2e_main.e2e_data, i);
- if (data && (data->flow_ctx == ctx))
- {
- pool_put_index(ioam_e2e_main.e2e_data, i);
- return (0);
- }
- }
- return 0;
-}
-
-static clib_error_t *
-ioam_show_e2e_cmd_fn (vlib_main_t * vm,
- unformat_input_t * input,
- vlib_cli_command_t * cmd)
-{
- ioam_e2e_data_t *e2e_data;
- u8 *s = 0;
- int i;
-
- vec_reset_length(s);
-
- s = format(0, "IOAM E2E information: \n");
- for (i = 0; i < vec_len(ioam_e2e_main.e2e_data); i++)
- {
- if (pool_is_free_index(ioam_e2e_main.e2e_data, i))
- continue;
-
- e2e_data = pool_elt_at_index(ioam_e2e_main.e2e_data, i);
- s = format(s, "Flow name: %s\n", get_flow_name_from_flow_ctx(e2e_data->flow_ctx));
-
- s = show_ioam_seqno_cmd_fn(s,
- &e2e_data->seqno_data,
- !IOAM_DEAP_ENABLED(e2e_data->flow_ctx));
- }
-
- vlib_cli_output(vm, "%v", s);
- return 0;
-}
-
-
-VLIB_CLI_COMMAND (ioam_show_e2e_cmd, static) = {
- .path = "show ioam e2e ",
- .short_help = "show ioam e2e information",
- .function = ioam_show_e2e_cmd_fn,
-};
-
-/*
- * This routine exists to convince the vlib plugin framework that
- * we haven't accidentally copied a random .dll into the plugin directory.
- *
- * Also collects global variable pointers passed from the vpp engine
- */
-clib_error_t *
-vlib_plugin_register (vlib_main_t * vm, vnet_plugin_handoff_t * h,
- int from_early_init)
-{
- clib_error_t * error = 0;
-
- ioam_e2e_main.vlib_main = vm;
- ioam_e2e_main.vnet_main = h->vnet_main;
- return error;
-}
-
-/*
- * Init handler E2E headet handling.
- * Init hanlder registers encap, decap, trace and Rewrite handlers.
- */
-static clib_error_t *
-ioam_e2e_init (vlib_main_t * vm)
-{
- clib_error_t * error;
-
- if ((error = vlib_call_init_function (vm, ip6_hop_by_hop_ioam_init)))
- {
- return(error);
- }
-
- /*
- * As of now we have only PPC under E2E header.
- */
- if (ip6_hbh_config_handler_register(HBH_OPTION_TYPE_IOAM_EDGE_TO_EDGE,
- ioam_e2e_config_handler) < 0)
- {
- return (clib_error_create("Registration of "
- "HBH_OPTION_TYPE_IOAM_EDGE_TO_EDGE for rewrite failed"));
- }
-
- if (ip6_hbh_add_register_option(HBH_OPTION_TYPE_IOAM_EDGE_TO_EDGE,
- sizeof(ioam_e2e_option_t),
- ioam_e2e_rewrite_handler) < 0)
- {
- return (clib_error_create("Registration of "
- "HBH_OPTION_TYPE_IOAM_EDGE_TO_EDGE for rewrite failed"));
- }
-
- if (ip6_hbh_flow_handler_register(HBH_OPTION_TYPE_IOAM_EDGE_TO_EDGE,
- ioam_e2e_flow_handler) < 0)
- {
- return (clib_error_create("Registration of "
- "HBH_OPTION_TYPE_IOAM_EDGE_TO_EDGE Flow handler failed"));
- }
-
- return (0);
-}
-
-/*
- * Init function for the E2E lib.
- * ip6_hop_by_hop_ioam_e2e_init gets called during init.
- */
-VLIB_INIT_FUNCTION (ioam_e2e_init);
diff --git a/plugins/ioam-plugin/ioam/encap/ip6_ioam_e2e.h b/plugins/ioam-plugin/ioam/encap/ip6_ioam_e2e.h
deleted file mode 100644
index 18f35f80c60..00000000000
--- a/plugins/ioam-plugin/ioam/encap/ip6_ioam_e2e.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __included_ip6_ioam_e2e_h__
-#define __included_ip6_ioam_e2e_h__
-
-#include "ip6_ioam_seqno.h"
-
-typedef struct ioam_e2e_data_t_ {
- u32 flow_ctx;
- u32 pad;
- ioam_seqno_data seqno_data;
-} ioam_e2e_data_t;
-
-typedef struct {
- ioam_e2e_data_t *e2e_data;
- vlib_main_t *vlib_main;
- vnet_main_t *vnet_main;
-} ioam_e2e_main_t;
-
-extern ioam_e2e_main_t ioam_e2e_main;
-
-static inline ioam_seqno_data *
-ioam_e2ec_get_seqno_data_from_flow_ctx (u32 flow_ctx)
-{
- ioam_e2e_data_t *data = NULL;
- u32 index;
-
- index = get_flow_data_from_flow_ctx(flow_ctx,
- HBH_OPTION_TYPE_IOAM_EDGE_TO_EDGE);
- data = &ioam_e2e_main.e2e_data[index];
- return &(data->seqno_data);
-}
-
-#endif /* __included_ioam_e2e_h__ */
diff --git a/plugins/ioam-plugin/ioam/encap/ip6_ioam_pot.c b/plugins/ioam-plugin/ioam/encap/ip6_ioam_pot.c
deleted file mode 100644
index 05f42c91d0f..00000000000
--- a/plugins/ioam-plugin/ioam/encap/ip6_ioam_pot.c
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include <vlib/vlib.h>
-#include <vnet/vnet.h>
-#include <vnet/pg/pg.h>
-#include <vppinfra/error.h>
-
-#include <vnet/ip/ip6.h>
-#include <vnet/ip/ip6_hop_by_hop.h>
-#include <vnet/ip/ip6_hop_by_hop_packet.h>
-
-#include <vppinfra/hash.h>
-#include <vppinfra/error.h>
-#include <vppinfra/elog.h>
-
-#include <ioam/lib-pot/pot_util.h>
-
-typedef CLIB_PACKED(struct {
- ip6_hop_by_hop_option_t hdr;
- u8 pot_type;
-#define PROFILE_ID_MASK 0xF
- u8 reserved_profile_id; /* 4 bits reserved, 4 bits to carry profile id */
- u64 random;
- u64 cumulative;
-}) ioam_pot_option_t;
-
-#define foreach_ip6_hop_by_hop_ioam_pot_stats \
- _(PROCESSED, "Pkts with ip6 hop-by-hop pot options") \
- _(PROFILE_MISS, "Pkts with ip6 hop-by-hop pot options but no profile set") \
- _(PASSED, "Pkts with POT in Policy") \
- _(FAILED, "Pkts with POT out of Policy")
-
-static char * ip6_hop_by_hop_ioam_pot_stats_strings[] = {
-#define _(sym,string) string,
- foreach_ip6_hop_by_hop_ioam_pot_stats
-#undef _
-};
-
-typedef enum {
-#define _(sym,str) IP6_IOAM_POT_##sym,
- foreach_ip6_hop_by_hop_ioam_pot_stats
-#undef _
- IP6_IOAM_POT_N_STATS,
-} ip6_ioam_pot_stats_t;
-
-typedef struct {
- /* stats */
- u64 counters[ARRAY_LEN(ip6_hop_by_hop_ioam_pot_stats_strings)];
-
- /* convenience */
- vlib_main_t * vlib_main;
- vnet_main_t * vnet_main;
-} ip6_hop_by_hop_ioam_pot_main_t;
-
-ip6_hop_by_hop_ioam_pot_main_t ip6_hop_by_hop_ioam_pot_main;
-
-always_inline void
-ip6_ioam_stats_increment_counter (u32 counter_index, u64 increment)
-{
- ip6_hop_by_hop_ioam_pot_main_t *hm = &ip6_hop_by_hop_ioam_pot_main;
-
- hm->counters[counter_index] += increment;
-}
-
-
-static u8 * format_ioam_pot (u8 * s, va_list * args)
-{
- ioam_pot_option_t * pot0 = va_arg (*args, ioam_pot_option_t *);
- u64 random, cumulative;
- random = cumulative = 0;
- if (pot0)
- {
- random = clib_net_to_host_u64 (pot0->random);
- cumulative = clib_net_to_host_u64 (pot0->cumulative);
- }
-
- s = format (s, "random = 0x%Lx, Cumulative = 0x%Lx, Index = 0x%x",
- random, cumulative, pot0 ? pot0->reserved_profile_id : ~0);
- return s;
-}
-
-u8 *
-ip6_hbh_ioam_proof_of_transit_trace_handler (u8 *s, ip6_hop_by_hop_option_t *opt)
-{
- ioam_pot_option_t *pot;
-
- s = format (s, " POT opt present\n");
- pot = (ioam_pot_option_t *) opt;
- s = format (s, " %U\n", format_ioam_pot, pot);
- return (s);
-}
-
-int
-ip6_hbh_ioam_proof_of_transit_handler (vlib_buffer_t *b,
- ip6_header_t *ip,
- ip6_hop_by_hop_option_t *opt0)
-{
- ioam_pot_option_t * pot0;
- u64 random = 0, cumulative = 0;
- int rv = 0;
- u8 pot_profile_index;
- pot_profile *pot_profile = 0, *new_profile = 0;
- u8 pot_encap = 0;
-
- pot0 = (ioam_pot_option_t *) opt0;
- pot_encap = (pot0->random == 0);
- pot_profile_index = pot_profile_get_active_id();
- pot_profile = pot_profile_get_active();
- if (pot_encap && PREDICT_FALSE(!pot_profile))
- {
- ip6_ioam_stats_increment_counter (IP6_IOAM_POT_PROFILE_MISS, 1);
- return(-1);
- }
- if (pot_encap)
- {
- pot0->reserved_profile_id =
- pot_profile_index & PROFILE_ID_MASK;
- pot_profile_incr_usage_stats(pot_profile);
- }
- else
- { /* Non encap node */
- if (PREDICT_FALSE(pot0->reserved_profile_id !=
- pot_profile_index || pot_profile == 0))
- {
- /* New profile announced by encap node. */
- new_profile =
- pot_profile_find(pot0->reserved_profile_id);
- if (PREDICT_FALSE(new_profile == 0 ||
- new_profile->valid == 0))
- {
- ip6_ioam_stats_increment_counter (IP6_IOAM_POT_PROFILE_MISS, 1);
- return(-1);
- }
- else
- {
- pot_profile_index = pot0->reserved_profile_id;
- pot_profile = new_profile;
- pot_profile_set_active(pot_profile_index);
- pot_profile_reset_usage_stats(pot_profile);
- }
- }
- pot_profile_incr_usage_stats(pot_profile);
- }
-
- if (pot0->random == 0)
- {
- pot0->random = clib_host_to_net_u64(pot_generate_random(pot_profile));
- pot0->cumulative = 0;
- }
- random = clib_net_to_host_u64(pot0->random);
- cumulative = clib_net_to_host_u64(pot0->cumulative);
- pot0->cumulative = clib_host_to_net_u64(
- pot_update_cumulative(pot_profile,
- cumulative,
- random));
- ip6_ioam_stats_increment_counter (IP6_IOAM_POT_PROCESSED, 1);
-
- return (rv);
-}
-
-int
-ip6_hbh_ioam_proof_of_transit_pop_handler (vlib_buffer_t *b, ip6_header_t *ip,
- ip6_hop_by_hop_option_t *opt0)
-{
- ioam_pot_option_t * pot0;
- u64 random = 0;
- u64 cumulative = 0;
- int rv = 0;
- pot_profile *pot_profile = 0;
- u8 result = 0;
-
- pot0 = (ioam_pot_option_t *) opt0;
- random = clib_net_to_host_u64(pot0->random);
- cumulative = clib_net_to_host_u64(pot0->cumulative);
- pot_profile = pot_profile_get_active();
- result = pot_validate (pot_profile,
- cumulative, random);
-
- if (result == 1)
- {
- ip6_ioam_stats_increment_counter (IP6_IOAM_POT_PASSED, 1);
- }
- else
- {
- ip6_ioam_stats_increment_counter (IP6_IOAM_POT_FAILED, 1);
- }
- return (rv);
-}
-
-int ip6_hop_by_hop_ioam_pot_rewrite_handler (u8 *rewrite_string, u8 *rewrite_size)
-{
- ioam_pot_option_t * pot_option;
- if (rewrite_string && *rewrite_size == sizeof(ioam_pot_option_t))
- {
- pot_option = (ioam_pot_option_t *)rewrite_string;
- pot_option->hdr.type = HBH_OPTION_TYPE_IOAM_PROOF_OF_TRANSIT
- | HBH_OPTION_TYPE_DATA_CHANGE_ENROUTE;
- pot_option->hdr.length = sizeof (ioam_pot_option_t) -
- sizeof (ip6_hop_by_hop_option_t);
- return(0);
- }
- return(-1);
-}
-
-static clib_error_t *
-ip6_show_ioam_pot_cmd_fn (vlib_main_t * vm,
- unformat_input_t * input,
- vlib_cli_command_t * cmd)
-{
- ip6_hop_by_hop_ioam_pot_main_t *hm = &ip6_hop_by_hop_ioam_pot_main;
- u8 *s = 0;
- int i = 0;
-
- for ( i = 0; i < IP6_IOAM_POT_N_STATS; i++)
- {
- s = format(s, " %s - %lu\n", ip6_hop_by_hop_ioam_pot_stats_strings[i],
- hm->counters[i]);
- }
-
- vlib_cli_output(vm, "%v", s);
- vec_free(s);
- return 0;
-}
-
-
-VLIB_CLI_COMMAND (ip6_show_ioam_pot_cmd, static) = {
- .path = "show ioam pot",
- .short_help = "iOAM pot statistics",
- .function = ip6_show_ioam_pot_cmd_fn,
-};
-
-
-static clib_error_t *
-ip6_hop_by_hop_ioam_pot_init (vlib_main_t * vm)
-{
- ip6_hop_by_hop_ioam_pot_main_t * hm = &ip6_hop_by_hop_ioam_pot_main;
- clib_error_t * error;
-
- if ((error = vlib_call_init_function (vm, ip6_hop_by_hop_ioam_init)))
- return(error);
-
- hm->vlib_main = vm;
- hm->vnet_main = vnet_get_main();
- memset(hm->counters, 0, sizeof(hm->counters));
-
- if (ip6_hbh_register_option(HBH_OPTION_TYPE_IOAM_PROOF_OF_TRANSIT, ip6_hbh_ioam_proof_of_transit_handler,
- ip6_hbh_ioam_proof_of_transit_trace_handler) < 0)
- return (clib_error_create("registration of HBH_OPTION_TYPE_IOAM_PROOF_OF_TRANSIT failed"));
-
- if (ip6_hbh_add_register_option(HBH_OPTION_TYPE_IOAM_PROOF_OF_TRANSIT,
- sizeof(ioam_pot_option_t),
- ip6_hop_by_hop_ioam_pot_rewrite_handler) < 0)
- return (clib_error_create("registration of HBH_OPTION_TYPE_IOAM_PROOF_OF_TRANSIT for rewrite failed"));
-
- if (ip6_hbh_pop_register_option(HBH_OPTION_TYPE_IOAM_PROOF_OF_TRANSIT,
- ip6_hbh_ioam_proof_of_transit_pop_handler) < 0)
- return (clib_error_create("registration of HBH_OPTION_TYPE_IOAM_PROOF_OF_TRANSIT POP failed"));
-
- return (0);
-}
-
-VLIB_INIT_FUNCTION (ip6_hop_by_hop_ioam_pot_init);
-
-
diff --git a/plugins/ioam-plugin/ioam/encap/ip6_ioam_seqno.c b/plugins/ioam-plugin/ioam/encap/ip6_ioam_seqno.c
deleted file mode 100644
index 0b4d4192975..00000000000
--- a/plugins/ioam-plugin/ioam/encap/ip6_ioam_seqno.c
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-#include <vlib/vlib.h>
-#include <vnet/vnet.h>
-#include <vnet/pg/pg.h>
-#include <vppinfra/error.h>
-
-#include <vnet/ip/ip.h>
-
-#include <vppinfra/hash.h>
-#include <vppinfra/error.h>
-#include <vppinfra/elog.h>
-
-#include "ip6_ioam_seqno.h"
-#include "ip6_ioam_e2e.h"
-
-ioam_seqno_data_main_t ioam_seqno_main;
-
-void ioam_seqno_init_bitmap (ioam_seqno_data *data)
-{
- seqno_bitmap *bitmap = &data->seqno_rx.bitmap;
- bitmap->window_size = SEQNO_WINDOW_SIZE;
- bitmap->array_size = SEQNO_WINDOW_ARRAY_SIZE;
- bitmap->mask = 32 * SEQNO_WINDOW_ARRAY_SIZE - 1;
- bitmap->array[0] = 0x00000000;/* pretend we haven seen sequence numbers 0*/
- bitmap->highest = 0;
-
- data->seq_num = 0;
- return ;
-}
-
-/*
- * This Routine gets called from IPv6 hop-by-hop option handling.
- * Only if we are encap node, then add PPC data.
- * On a Transit(MID) node we dont do anything with E2E headers.
- * On decap node decap is handled by seperate function.
- */
-int
-ioam_seqno_encap_handler (vlib_buffer_t *b, ip6_header_t *ip,
- ip6_hop_by_hop_option_t *opt)
-{
- u32 opaque_index = vnet_buffer(b)->l2_classify.opaque_index;
- ioam_e2e_option_t * e2e;
- int rv = 0;
- ioam_seqno_data *data;
-
- data = ioam_e2ec_get_seqno_data_from_flow_ctx(opaque_index);
- e2e = (ioam_e2e_option_t *) opt;
- e2e->e2e_data = clib_host_to_net_u32(++data->seq_num);
-
- return (rv);
-}
-
-/*
- * This Routine gets called on POP/Decap node.
- */
-int
-ioam_seqno_decap_handler (vlib_buffer_t *b, ip6_header_t *ip,
- ip6_hop_by_hop_option_t *opt)
-{
- u32 opaque_index = vnet_buffer(b)->l2_classify.opaque_index;
- ioam_e2e_option_t * e2e;
- int rv = 0;
- ioam_seqno_data *data;
-
- data = ioam_e2ec_get_seqno_data_from_flow_ctx(opaque_index);
- e2e = (ioam_e2e_option_t *) opt;
- ioam_analyze_seqno(&data->seqno_rx, (u64) clib_net_to_host_u32(e2e->e2e_data));
-
- return (rv);
-}
-
-u8 *
-show_ioam_seqno_cmd_fn (u8 *s, ioam_seqno_data *seqno_data, u8 enc)
-{
- seqno_rx_info *rx;
-
- s = format(s, "SeqNo Data:\n");
- if (enc)
- {
- s = format(s, " Current Seq. Number : %llu\n", seqno_data->seq_num);
- }
- else
- {
- rx = &seqno_data->seqno_rx;
- s = format(s, " Highest Seq. Number : %llu\n", rx->bitmap.highest);
- s = format(s, " Packets received : %llu\n", rx->rx_packets);
- s = format(s, " Lost packets : %llu\n", rx->lost_packets);
- s = format(s, " Reordered packets : %llu\n", rx->reordered_packets);
- s = format(s, " Duplicate packets : %llu\n", rx->dup_packets);
- }
-
- format(s, "\n");
- return s;
-}
diff --git a/plugins/ioam-plugin/ioam/encap/ip6_ioam_seqno.h b/plugins/ioam-plugin/ioam/encap/ip6_ioam_seqno.h
deleted file mode 100644
index 13a84db0d71..00000000000
--- a/plugins/ioam-plugin/ioam/encap/ip6_ioam_seqno.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __included_ip6_ioam_seqno_h__
-#define __included_ip6_ioam_seqno_h__
-
-#include <vnet/ip/ip6_packet.h>
-#include <vnet/ip/ip6_hop_by_hop.h>
-
-#define SEQ_CHECK_VALUE 0x80000000 /* for seq number wraparound detection */
-
-#define SEQNO_WINDOW_SIZE 2048
-#define SEQNO_WINDOW_ARRAY_SIZE 64
-
-typedef struct seqno_bitmap_ {
- u32 window_size;
- u32 array_size;
- u32 mask;
- u32 pad;
- u64 highest;
- u64 array[SEQNO_WINDOW_ARRAY_SIZE]; /* Will be alloc to array_size */
-} seqno_bitmap;
-
-typedef struct seqno_rx_info_ {
- u64 rx_packets;
- u64 lost_packets;
- u64 reordered_packets;
- u64 dup_packets;
- seqno_bitmap bitmap;
-} seqno_rx_info;
-
-/* This structure is 64-byte aligned */
-typedef struct ioam_seqno_data_ {
- union {
- u32 seq_num; /* Useful only for encap node */
- seqno_rx_info seqno_rx;
- };
-} ioam_seqno_data;
-
-typedef struct ioam_seqno_data_main_t_ {
- ioam_seqno_data *seqno_data;
-} ioam_seqno_data_main_t;
-
-void ioam_seqno_init_bitmap(ioam_seqno_data *data);
-
-int ioam_seqno_encap_handler(vlib_buffer_t *b, ip6_header_t *ip,
- ip6_hop_by_hop_option_t *opt);
-
-int
-ioam_seqno_decap_handler(vlib_buffer_t *b, ip6_header_t *ip,
- ip6_hop_by_hop_option_t *opt);
-
-void ioam_analyze_seqno(seqno_rx_info *ppc_rx, u64 seqno);
-
-u8 *
-show_ioam_seqno_cmd_fn(u8 *s, ioam_seqno_data *seqno_data, u8 enc);
-
-#endif
diff --git a/plugins/ioam-plugin/ioam/encap/ip6_ioam_seqno_analyse.c b/plugins/ioam-plugin/ioam/encap/ip6_ioam_seqno_analyse.c
deleted file mode 100644
index 4638871c224..00000000000
--- a/plugins/ioam-plugin/ioam/encap/ip6_ioam_seqno_analyse.c
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <vnet/vnet.h>
-#include "ip6_ioam_seqno.h"
-
-static inline void BIT_SET (u64 *p, u32 n)
-{
- p[ n>>5 ] |= (1 << (n&31));
-}
-
-static inline int BIT_TEST (u64 *p, u32 n)
-{
- return p[ n>>5 ] & (1 << (n&31));
-}
-
-static void BIT_CLEAR (u64 *p, u64 start, int num_bits, u32 mask)
-{
- int n, t;
- int start_index = (start >> 5);
- int mask_index = (mask >> 5);
-
- start_index &= mask_index;
- if (start & 0x1f)
- {
- int start_bit = (start & 0x1f);
-
- n = (1 << start_bit)-1;
- t = start_bit + num_bits;
- if (t < 32)
- {
- n |= ~((1 << t)-1);
- p[ start_index ] &= n;
- return;
- }
- p[ start_index ] &= n;
- start_index = (start_index + 1) & mask_index;
- num_bits -= (32 - start_bit);
- }
- while (num_bits >= 32)
- {
- p[ start_index ] = 0;
- start_index = (start_index + 1) & mask_index;
- num_bits -= 32;
- }
- n = ~((1 << num_bits) - 1);
- p[ start_index ] &= n;
-}
-
-static inline u8 seqno_check_wraparound(u32 a, u32 b)
-{
- if ((a != b) && (a > b) && ((a - b) > SEQ_CHECK_VALUE))
- {
- return 1;
- }
- return 0;
-}
-
-/*
- * Function to analyze the PPC value recevied.
- * - Updates the bitmap with received sequence number
- * - counts the received/lost/duplicate/reordered packets
- */
-void ioam_analyze_seqno (seqno_rx_info *seqno_rx, u64 seqno)
-{
- int diff;
- static int peer_dead_count;
- seqno_bitmap *bitmap = &seqno_rx->bitmap;
-
- seqno_rx->rx_packets++;
-
- if (seqno > bitmap->highest)
- { /* new larger sequence number */
- peer_dead_count = 0;
- diff = seqno - bitmap->highest;
- if (diff < bitmap->window_size)
- {
- if (diff > 1)
- { /* diff==1 is *such* a common case it's a win to optimize it */
- BIT_CLEAR(bitmap->array, bitmap->highest+1, diff-1, bitmap->mask);
- seqno_rx->lost_packets += diff -1;
- }
- }
- else
- {
- seqno_rx->lost_packets += diff -1;
- memset( bitmap->array, 0, bitmap->array_size * sizeof(u64) );
- }
- BIT_SET(bitmap->array, seqno & bitmap->mask);
- bitmap->highest = seqno;
- return;
- }
-
- /* we've seen a bigger seq number before */
- diff = bitmap->highest - seqno;
- if (diff >= bitmap->window_size)
- {
- if (seqno_check_wraparound(bitmap->highest, seqno))
- {
- memset( bitmap->array, 0, bitmap->array_size * sizeof(u64));
- BIT_SET(bitmap->array, seqno & bitmap->mask);
- bitmap->highest = seqno;
- return;
- }
- else
- {
- peer_dead_count++;
- if (peer_dead_count > 25)
- {
- peer_dead_count = 0;
- memset( bitmap->array, 0, bitmap->array_size * sizeof(u64) );
- BIT_SET(bitmap->array, seqno & bitmap->mask);
- bitmap->highest = seqno;
- }
- //ppc_rx->reordered_packets++;
- }
- return;
- }
-
- if (BIT_TEST(bitmap->array, seqno & bitmap->mask))
- {
- seqno_rx->dup_packets++;
- return; /* Already seen */
- }
- seqno_rx->reordered_packets++;
- seqno_rx->lost_packets--;
- BIT_SET(bitmap->array, seqno & bitmap->mask);
- return;
-}
diff --git a/plugins/ioam-plugin/ioam/encap/ip6_ioam_trace.c b/plugins/ioam-plugin/ioam/encap/ip6_ioam_trace.c
deleted file mode 100644
index e63db6e4ec5..00000000000
--- a/plugins/ioam-plugin/ioam/encap/ip6_ioam_trace.c
+++ /dev/null
@@ -1,438 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include <vlib/vlib.h>
-#include <vnet/vnet.h>
-#include <vnet/pg/pg.h>
-#include <vppinfra/error.h>
-
-#include <vnet/ip/ip6.h>
-#include <vnet/ip/ip6_hop_by_hop.h>
-#include <vnet/ip/ip6_hop_by_hop_packet.h>
-
-#include <vppinfra/hash.h>
-#include <vppinfra/error.h>
-#include <vppinfra/elog.h>
-
-#include <ioam/lib-trace/trace_util.h>
-
-/* Timestamp precision multipliers for seconds, milliseconds, microseconds
- * and nanoseconds respectively.
- */
-static f64 trace_tsp_mul[4] = { 1, 1e3, 1e6, 1e9 };
-
-typedef union
-{
- u64 as_u64;
- u32 as_u32[2];
-} time_u64_t;
-
-/* *INDENT-OFF* */
-typedef CLIB_PACKED(struct {
- ip6_hop_by_hop_option_t hdr;
- u8 ioam_trace_type;
- u8 data_list_elts_left;
- u32 elts[0]; /* Variable type. So keep it generic */
-}) ioam_trace_option_t;
-/* *INDENT-ON* */
-
-
-extern ip6_hop_by_hop_ioam_main_t ip6_hop_by_hop_ioam_main;
-extern ip6_main_t ip6_main;
-
-#define foreach_ip6_hop_by_hop_ioam_trace_stats \
- _(PROCESSED, "Pkts with ip6 hop-by-hop trace options") \
- _(PROFILE_MISS, "Pkts with ip6 hop-by-hop trace options but no profile set") \
- _(UPDATED, "Pkts with trace updated") \
- _(FULL, "Pkts with trace options but no space")
-
-static char *ip6_hop_by_hop_ioam_trace_stats_strings[] = {
-#define _(sym,string) string,
- foreach_ip6_hop_by_hop_ioam_trace_stats
-#undef _
-};
-
-typedef enum
-{
-#define _(sym,str) IP6_IOAM_TRACE_##sym,
- foreach_ip6_hop_by_hop_ioam_trace_stats
-#undef _
- IP6_IOAM_TRACE_N_STATS,
-} ip6_ioam_trace_stats_t;
-
-
-typedef struct
-{
- /* stats */
- u64 counters[ARRAY_LEN (ip6_hop_by_hop_ioam_trace_stats_strings)];
-
- /* convenience */
- vlib_main_t *vlib_main;
- vnet_main_t *vnet_main;
-} ip6_hop_by_hop_ioam_trace_main_t;
-
-ip6_hop_by_hop_ioam_trace_main_t ip6_hop_by_hop_ioam_trace_main;
-
-always_inline void
-ip6_ioam_trace_stats_increment_counter (u32 counter_index, u64 increment)
-{
- ip6_hop_by_hop_ioam_trace_main_t *hm = &ip6_hop_by_hop_ioam_trace_main;
-
- hm->counters[counter_index] += increment;
-}
-
-
-static u8 *
-format_ioam_data_list_element (u8 * s, va_list * args)
-{
- u32 *elt = va_arg (*args, u32 *);
- u8 *trace_type_p = va_arg (*args, u8 *);
- u8 trace_type = *trace_type_p;
-
-
- if (trace_type & BIT_TTL_NODEID)
- {
- u32 ttl_node_id_host_byte_order = clib_net_to_host_u32 (*elt);
- s = format (s, "ttl 0x%x node id 0x%x ",
- ttl_node_id_host_byte_order >> 24,
- ttl_node_id_host_byte_order & 0x00FFFFFF);
-
- elt++;
- }
-
- if (trace_type & BIT_ING_INTERFACE && trace_type & BIT_ING_INTERFACE)
- {
- u32 ingress_host_byte_order = clib_net_to_host_u32 (*elt);
- s = format (s, "ingress 0x%x egress 0x%x ",
- ingress_host_byte_order >> 16,
- ingress_host_byte_order & 0xFFFF);
- elt++;
- }
-
- if (trace_type & BIT_TIMESTAMP)
- {
- u32 ts_in_host_byte_order = clib_net_to_host_u32 (*elt);
- s = format (s, "ts 0x%x \n", ts_in_host_byte_order);
- elt++;
- }
-
- if (trace_type & BIT_APPDATA)
- {
- u32 appdata_in_host_byte_order = clib_net_to_host_u32 (*elt);
- s = format (s, "app 0x%x ", appdata_in_host_byte_order);
- elt++;
- }
-
- return s;
-}
-
-
-int
-ip6_ioam_trace_get_sizeof_handler (u32 * result)
-{
- u16 size = 0;
- u8 trace_data_size = 0;
- trace_profile *profile = NULL;
-
- *result = 0;
-
- profile = trace_profile_find ();
-
- if (PREDICT_FALSE (!profile))
- {
- ip6_ioam_trace_stats_increment_counter (IP6_IOAM_TRACE_PROFILE_MISS, 1);
- return (-1);
- }
-
- trace_data_size = fetch_trace_data_size (profile->trace_type);
- if (PREDICT_FALSE (trace_data_size == 0))
- return VNET_API_ERROR_INVALID_VALUE;
-
- if (PREDICT_FALSE (profile->num_elts * trace_data_size > 254))
- return VNET_API_ERROR_INVALID_VALUE;
-
- size +=
- sizeof (ioam_trace_option_t) + (profile->num_elts * trace_data_size);
- *result = size;
-
- return 0;
-}
-
-
-
-int
-ip6_hop_by_hop_ioam_trace_rewrite_handler (u8 * rewrite_string,
- u8 * rewrite_size)
-{
- ioam_trace_option_t *trace_option = NULL;
- u8 trace_data_size = 0;
- u8 trace_option_elts = 0;
- trace_profile *profile = NULL;
-
-
- profile = trace_profile_find ();
-
- if (PREDICT_FALSE (!profile))
- {
- ip6_ioam_trace_stats_increment_counter (IP6_IOAM_TRACE_PROFILE_MISS, 1);
- return (-1);
- }
-
- if (PREDICT_FALSE (!rewrite_string))
- return -1;
-
- trace_option_elts = profile->num_elts;
- trace_data_size = fetch_trace_data_size (profile->trace_type);
- trace_option = (ioam_trace_option_t *) rewrite_string;
- trace_option->hdr.type = HBH_OPTION_TYPE_IOAM_TRACE_DATA_LIST |
- HBH_OPTION_TYPE_DATA_CHANGE_ENROUTE;
- trace_option->hdr.length = 2 /*ioam_trace_type,data_list_elts_left */ +
- trace_option_elts * trace_data_size;
- trace_option->ioam_trace_type = profile->trace_type & TRACE_TYPE_MASK;
- trace_option->data_list_elts_left = trace_option_elts;
- *rewrite_size =
- sizeof (ioam_trace_option_t) + (trace_option_elts * trace_data_size);
-
- return 0;
-}
-
-
-int
-ip6_hbh_ioam_trace_data_list_handler (vlib_buffer_t * b, ip6_header_t * ip,
- ip6_hop_by_hop_option_t * opt)
-{
- ip6_main_t *im = &ip6_main;
- ip_lookup_main_t *lm = &im->lookup_main;
- ip6_hop_by_hop_ioam_main_t *hm = &ip6_hop_by_hop_ioam_main;
- u8 elt_index = 0;
- ioam_trace_option_t *trace = (ioam_trace_option_t *) opt;
- u32 adj_index = vnet_buffer (b)->ip.adj_index[VLIB_TX];
- ip_adjacency_t *adj = ip_get_adjacency (lm, adj_index);
- time_u64_t time_u64;
- u32 *elt;
- int rv = 0;
- trace_profile *profile = NULL;
-
-
- profile = trace_profile_find ();
-
- if (PREDICT_FALSE (!profile))
- {
- ip6_ioam_trace_stats_increment_counter (IP6_IOAM_TRACE_PROFILE_MISS, 1);
- return (-1);
- }
-
-
- time_u64.as_u64 = 0;
-
- if (PREDICT_TRUE (trace->data_list_elts_left))
- {
- trace->data_list_elts_left--;
- /* fetch_trace_data_size returns in bytes. Convert it to 4-bytes
- * to skip to this node's location.
- */
- elt_index =
- trace->data_list_elts_left *
- fetch_trace_data_size (trace->ioam_trace_type) / 4;
- elt = &trace->elts[elt_index];
- if (trace->ioam_trace_type & BIT_TTL_NODEID)
- {
- *elt =
- clib_host_to_net_u32 ((ip->hop_limit << 24) | profile->node_id);
- elt++;
- }
-
- if (trace->ioam_trace_type & BIT_ING_INTERFACE)
- {
- *elt =
- (vnet_buffer (b)->sw_if_index[VLIB_RX] & 0xFFFF) << 16 |
- (adj->rewrite_header.sw_if_index & 0xFFFF);
- *elt = clib_host_to_net_u32 (*elt);
- elt++;
- }
-
- if (trace->ioam_trace_type & BIT_TIMESTAMP)
- {
- /* Send least significant 32 bits */
- f64 time_f64 =
- (f64) (((f64) hm->unix_time_0) +
- (vlib_time_now (hm->vlib_main) - hm->vlib_time_0));
-
- time_u64.as_u64 = time_f64 * trace_tsp_mul[profile->trace_tsp];
- *elt = clib_host_to_net_u32 (time_u64.as_u32[0]);
- elt++;
- }
-
- if (trace->ioam_trace_type & BIT_APPDATA)
- {
- /* $$$ set elt0->app_data */
- *elt = clib_host_to_net_u32 (profile->app_data);
- elt++;
- }
- ip6_ioam_trace_stats_increment_counter (IP6_IOAM_TRACE_UPDATED, 1);
- }
- else
- {
- ip6_ioam_trace_stats_increment_counter (IP6_IOAM_TRACE_FULL, 1);
- }
- return (rv);
-}
-
-u8 *
-ip6_hbh_ioam_trace_data_list_trace_handler (u8 * s,
- ip6_hop_by_hop_option_t * opt)
-{
- ioam_trace_option_t *trace;
- u8 trace_data_size_in_words = 0;
- u32 *elt;
- int elt_index = 0;
-
- trace = (ioam_trace_option_t *) opt;
- s =
- format (s, " Trace Type 0x%x , %d elts left\n", trace->ioam_trace_type,
- trace->data_list_elts_left);
- trace_data_size_in_words =
- fetch_trace_data_size (trace->ioam_trace_type) / 4;
- elt = &trace->elts[0];
- while ((u8 *) elt < ((u8 *) (&trace->elts[0]) + trace->hdr.length - 2
- /* -2 accounts for ioam_trace_type,elts_left */ ))
- {
- s = format (s, " [%d] %U\n", elt_index,
- format_ioam_data_list_element,
- elt, &trace->ioam_trace_type);
- elt_index++;
- elt += trace_data_size_in_words;
- }
- return (s);
-}
-
-
-static clib_error_t *
-ip6_show_ioam_trace_cmd_fn (vlib_main_t * vm,
- unformat_input_t * input,
- vlib_cli_command_t * cmd)
-{
- ip6_hop_by_hop_ioam_trace_main_t *hm = &ip6_hop_by_hop_ioam_trace_main;
- u8 *s = 0;
- int i = 0;
-
- for (i = 0; i < IP6_IOAM_TRACE_N_STATS; i++)
- {
- s =
- format (s, " %s - %lu\n", ip6_hop_by_hop_ioam_trace_stats_strings[i],
- hm->counters[i]);
- }
-
- vlib_cli_output (vm, "%v", s);
- vec_free (s);
- return 0;
-}
-
-
-/* *INDENT-OFF* */
-VLIB_CLI_COMMAND (ip6_show_ioam_trace_cmd, static) = {
- .path = "show ioam trace",
- .short_help = "iOAM trace statistics",
- .function = ip6_show_ioam_trace_cmd_fn,
-};
-/* *INDENT-ON* */
-
-
-static clib_error_t *
-ip6_hop_by_hop_ioam_trace_init (vlib_main_t * vm)
-{
- ip6_hop_by_hop_ioam_trace_main_t *hm = &ip6_hop_by_hop_ioam_trace_main;
- clib_error_t *error;
-
- if ((error = vlib_call_init_function (vm, ip_main_init)))
- return (error);
-
- if ((error = vlib_call_init_function (vm, ip6_lookup_init)))
- return error;
-
- if ((error = vlib_call_init_function (vm, ip6_hop_by_hop_ioam_init)))
- return (error);
-
- hm->vlib_main = vm;
- hm->vnet_main = vnet_get_main ();
- memset (hm->counters, 0, sizeof (hm->counters));
-
-
- if (ip6_hbh_register_option
- (HBH_OPTION_TYPE_IOAM_TRACE_DATA_LIST,
- ip6_hbh_ioam_trace_data_list_handler,
- ip6_hbh_ioam_trace_data_list_trace_handler) < 0)
- return (clib_error_create
- ("registration of HBH_OPTION_TYPE_IOAM_TRACE_DATA_LIST failed"));
-
-
- if (ip6_hbh_add_register_option (HBH_OPTION_TYPE_IOAM_TRACE_DATA_LIST,
- sizeof (ioam_trace_option_t),
- ip6_hop_by_hop_ioam_trace_rewrite_handler)
- < 0)
- return (clib_error_create
- ("registration of HBH_OPTION_TYPE_IOAM_TRACE_DATA_LIST for rewrite failed"));
-
-
- return (0);
-}
-
-int
-ip6_trace_profile_cleanup (void)
-{
- ip6_hop_by_hop_ioam_main_t *hm = &ip6_hop_by_hop_ioam_main;
-
- hm->options_size[HBH_OPTION_TYPE_IOAM_TRACE_DATA_LIST] = 0;
-
- return 0;
-
-}
-
-
-int
-ip6_trace_profile_setup (void)
-{
- u32 trace_size = 0;
- ip6_hop_by_hop_ioam_main_t *hm = &ip6_hop_by_hop_ioam_main;
-
- trace_profile *profile = NULL;
-
-
- profile = trace_profile_find ();
-
- if (PREDICT_FALSE (!profile))
- {
- ip6_ioam_trace_stats_increment_counter (IP6_IOAM_TRACE_PROFILE_MISS, 1);
- return (-1);
- }
-
-
- if (ip6_ioam_trace_get_sizeof_handler (&trace_size) < 0)
- return (-1);
-
- hm->options_size[HBH_OPTION_TYPE_IOAM_TRACE_DATA_LIST] = trace_size;
-
- return (0);
-}
-
-
-VLIB_INIT_FUNCTION (ip6_hop_by_hop_ioam_trace_init);
-
-/*
- * fd.io coding-style-patch-verification: ON
- *
- * Local Variables:
- * eval: (c-set-style "gnu")
- * End:
- */
diff --git a/plugins/ioam-plugin/ioam/export-common/ioam_export.h b/plugins/ioam-plugin/ioam/export-common/ioam_export.h
deleted file mode 100644
index a9ec8d00677..00000000000
--- a/plugins/ioam-plugin/ioam/export-common/ioam_export.h
+++ /dev/null
@@ -1,616 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef __included_ioam_export_h__
-#define __included_ioam_export_h__
-
-#include <vnet/vnet.h>
-#include <vnet/ip/ip.h>
-#include <vnet/ip/ip_packet.h>
-#include <vnet/ip/ip4_packet.h>
-#include <vnet/ip/ip6_packet.h>
-#include <vnet/ip/udp.h>
-#include <vnet/flow/ipfix_packet.h>
-
-#include <vppinfra/pool.h>
-#include <vppinfra/hash.h>
-#include <vppinfra/error.h>
-#include <vppinfra/elog.h>
-
-#include <vlib/threads.h>
-
-typedef struct ioam_export_buffer
-{
- /* Allocated buffer */
- u32 buffer_index;
- u64 touched_at;
- u8 records_in_this_buffer;
-} ioam_export_buffer_t;
-
-
-typedef struct
-{
- /* API message ID base */
- u16 msg_id_base;
-
- /* TODO: to support multiple collectors all this has to be grouped and create a vector here */
- u8 *record_header;
- u32 sequence_number;
- u32 domain_id;
-
- /* ipfix collector, our ip address */
- ip4_address_t ipfix_collector;
- ip4_address_t src_address;
-
- /* Pool of ioam_export_buffer_t */
- ioam_export_buffer_t *buffer_pool;
- /* Vector of per thread ioam_export_buffer_t to buffer pool index */
- u32 *buffer_per_thread;
- /* Lock per thread to swap buffers between worker and timer process */
- volatile u32 **lockp;
-
- /* time scale transform */
- u32 unix_time_0;
- f64 vlib_time_0;
-
- /* convenience */
- vlib_main_t *vlib_main;
- vnet_main_t *vnet_main;
- u32 ip4_lookup_node_index;
-
- uword my_hbh_slot;
- u32 export_process_node_index;
-} ioam_export_main_t;
-
-ioam_export_main_t ioam_export_main;
-ioam_export_main_t vxlan_gpe_ioam_export_main;
-
-vlib_node_registration_t export_node;
-
-#define DEFAULT_EXPORT_SIZE (3 * CLIB_CACHE_LINE_BYTES)
-/*
- * Number of records in a buffer
- * ~(MTU (1500) - [ip hdr(40) + UDP(8) + ipfix (24)]) / DEFAULT_EXPORT_SIZE
- */
-#define DEFAULT_EXPORT_RECORDS 7
-
-always_inline ioam_export_buffer_t *
-ioam_export_get_my_buffer (ioam_export_main_t * em, u32 thread_id)
-{
-
- if (vec_len (em->buffer_per_thread) > thread_id)
- return (pool_elt_at_index
- (em->buffer_pool, em->buffer_per_thread[thread_id]));
- return (0);
-}
-
-inline static int
-ioam_export_buffer_add_header (ioam_export_main_t * em, vlib_buffer_t * b0)
-{
- clib_memcpy (b0->data, em->record_header, vec_len (em->record_header));
- b0->current_data = 0;
- b0->current_length = vec_len (em->record_header);
- b0->flags |= VLIB_BUFFER_TOTAL_LENGTH_VALID;
- return (1);
-}
-
-inline static int
-ioam_export_init_buffer (ioam_export_main_t * em, vlib_main_t * vm,
- ioam_export_buffer_t * eb)
-{
- vlib_buffer_t *b = 0;
-
- if (!eb)
- return (-1);
- /* TODO: Perhaps buffer init from template here */
- if (vlib_buffer_alloc (vm, &(eb->buffer_index), 1) != 1)
- return (-2);
- eb->records_in_this_buffer = 0;
- eb->touched_at = vlib_time_now (vm);
- b = vlib_get_buffer (vm, eb->buffer_index);
- (void) ioam_export_buffer_add_header (em, b);
- vnet_buffer (b)->sw_if_index[VLIB_RX] = 0;
- vnet_buffer (b)->sw_if_index[VLIB_TX] = ~0;
- return (1);
-}
-
-inline static void
-ioam_export_thread_buffer_free (ioam_export_main_t * em)
-{
- vlib_main_t *vm = em->vlib_main;
- ioam_export_buffer_t *eb = 0;
- int i;
- for (i = 0; i < vec_len (em->buffer_per_thread); i++)
- {
- eb = pool_elt_at_index (em->buffer_pool, em->buffer_per_thread[i]);
- if (eb)
- vlib_buffer_free (vm, &(eb->buffer_index), 1);
- }
- for (i = 0; i < vec_len (em->lockp); i++)
- clib_mem_free ((void *) em->lockp[i]);
- vec_free (em->buffer_per_thread);
- pool_free (em->buffer_pool);
- vec_free (em->lockp);
- em->buffer_per_thread = 0;
- em->buffer_pool = 0;
- em->lockp = 0;
-}
-
-inline static int
-ioam_export_thread_buffer_init (ioam_export_main_t * em, vlib_main_t * vm)
-{
- int no_of_threads = vec_len (vlib_worker_threads);
- int i;
- ioam_export_buffer_t *eb = 0;
- vlib_node_t *ip4_lookup_node;
-
- pool_alloc_aligned (em->buffer_pool,
- no_of_threads - 1, CLIB_CACHE_LINE_BYTES);
- vec_validate_aligned (em->buffer_per_thread,
- no_of_threads - 1, CLIB_CACHE_LINE_BYTES);
- vec_validate_aligned (em->lockp, no_of_threads - 1, CLIB_CACHE_LINE_BYTES);
- ip4_lookup_node = vlib_get_node_by_name (vm, (u8 *) "ip4-lookup");
- em->ip4_lookup_node_index = ip4_lookup_node->index;
- if (!em->buffer_per_thread || !em->buffer_pool || !em->lockp)
- {
- return (-1);
- }
- for (i = 0; i < no_of_threads; i++)
- {
- eb = 0;
- pool_get_aligned (em->buffer_pool, eb, CLIB_CACHE_LINE_BYTES);
- memset (eb, 0, sizeof (*eb));
- em->buffer_per_thread[i] = eb - em->buffer_pool;
- if (ioam_export_init_buffer (em, vm, eb) != 1)
- {
- ioam_export_thread_buffer_free (em);
- return (-2);
- }
- em->lockp[i] = clib_mem_alloc_aligned (CLIB_CACHE_LINE_BYTES,
- CLIB_CACHE_LINE_BYTES);
- memset ((void *) em->lockp[i], 0, CLIB_CACHE_LINE_BYTES);
- }
- return (1);
-}
-
-#define IPFIX_IOAM_EXPORT_ID 272
-
-/* Used to build the rewrite */
-/* data set packet */
-typedef struct
-{
- ipfix_message_header_t h;
- ipfix_set_header_t s;
-} ipfix_data_packet_t;
-
-typedef struct
-{
- ip4_header_t ip4;
- udp_header_t udp;
- ipfix_data_packet_t ipfix;
-} ip4_ipfix_data_packet_t;
-
-
-inline static void
-ioam_export_header_cleanup (ioam_export_main_t * em,
- ip4_address_t * collector_address,
- ip4_address_t * src_address)
-{
- vec_free (em->record_header);
- em->record_header = 0;
-}
-
-inline static int
-ioam_export_header_create (ioam_export_main_t * em,
- ip4_address_t * collector_address,
- ip4_address_t * src_address)
-{
- ip4_header_t *ip;
- udp_header_t *udp;
- ipfix_message_header_t *h;
- ipfix_set_header_t *s;
- u8 *rewrite = 0;
- ip4_ipfix_data_packet_t *tp;
-
-
- /* allocate rewrite space */
- vec_validate_aligned (rewrite,
- sizeof (ip4_ipfix_data_packet_t) - 1,
- CLIB_CACHE_LINE_BYTES);
-
- tp = (ip4_ipfix_data_packet_t *) rewrite;
- ip = (ip4_header_t *) & tp->ip4;
- udp = (udp_header_t *) (ip + 1);
- h = (ipfix_message_header_t *) (udp + 1);
- s = (ipfix_set_header_t *) (h + 1);
-
- ip->ip_version_and_header_length = 0x45;
- ip->ttl = 254;
- ip->protocol = IP_PROTOCOL_UDP;
- ip->src_address.as_u32 = src_address->as_u32;
- ip->dst_address.as_u32 = collector_address->as_u32;
- udp->src_port = clib_host_to_net_u16 (4939 /* $$FIXME */ );
- udp->dst_port = clib_host_to_net_u16 (4939);
- /* FIXUP: UDP length */
- udp->length = clib_host_to_net_u16 (vec_len (rewrite) +
- (DEFAULT_EXPORT_RECORDS *
- DEFAULT_EXPORT_SIZE) - sizeof (*ip));
-
- /* FIXUP: message header export_time */
- /* FIXUP: message header sequence_number */
- h->domain_id = clib_host_to_net_u32 (em->domain_id);
-
- /*FIXUP: Setid length in octets if records exported are not default */
- s->set_id_length = ipfix_set_id_length (IPFIX_IOAM_EXPORT_ID,
- (sizeof (*s) +
- (DEFAULT_EXPORT_RECORDS *
- DEFAULT_EXPORT_SIZE)));
-
- /* FIXUP: h version and length length in octets if records exported are not default */
- h->version_length = version_length (sizeof (*h) +
- (sizeof (*s) +
- (DEFAULT_EXPORT_RECORDS *
- DEFAULT_EXPORT_SIZE)));
-
- /* FIXUP: ip length if records exported are not default */
- /* FIXUP: ip checksum if records exported are not default */
- ip->length = clib_host_to_net_u16 (vec_len (rewrite) +
- (DEFAULT_EXPORT_RECORDS *
- DEFAULT_EXPORT_SIZE));
- ip->checksum = ip4_header_checksum (ip);
- _vec_len (rewrite) = sizeof (ip4_ipfix_data_packet_t);
- em->record_header = rewrite;
- return (1);
-}
-
-inline static int
-ioam_export_send_buffer (ioam_export_main_t * em, vlib_main_t * vm,
- ioam_export_buffer_t * eb)
-{
- ip4_header_t *ip;
- udp_header_t *udp;
- ipfix_message_header_t *h;
- ipfix_set_header_t *s;
- ip4_ipfix_data_packet_t *tp;
- vlib_buffer_t *b0;
- u16 new_l0, old_l0;
- ip_csum_t sum0;
- vlib_frame_t *nf = 0;
- u32 *to_next;
-
- b0 = vlib_get_buffer (vm, eb->buffer_index);
- tp = vlib_buffer_get_current (b0);
- ip = (ip4_header_t *) & tp->ip4;
- udp = (udp_header_t *) (ip + 1);
- h = (ipfix_message_header_t *) (udp + 1);
- s = (ipfix_set_header_t *) (h + 1);
-
- /* FIXUP: message header export_time */
- h->export_time = clib_host_to_net_u32 ((u32)
- (((f64) em->unix_time_0) +
- (vlib_time_now (em->vlib_main) -
- em->vlib_time_0)));
-
- /* FIXUP: message header sequence_number */
- h->sequence_number = clib_host_to_net_u32 (em->sequence_number++);
-
- /* FIXUP: lengths if different from default */
- if (PREDICT_FALSE (eb->records_in_this_buffer != DEFAULT_EXPORT_RECORDS))
- {
- s->set_id_length =
- ipfix_set_id_length (IPFIX_IOAM_EXPORT_ID /* set_id */ ,
- b0->current_length - (sizeof (*ip) +
- sizeof (*udp) +
- sizeof (*h)));
- h->version_length =
- version_length (b0->current_length - (sizeof (*ip) + sizeof (*udp)));
- sum0 = ip->checksum;
- old_l0 = ip->length;
- new_l0 = clib_host_to_net_u16 ((u16) b0->current_length);
- sum0 = ip_csum_update (sum0, old_l0, new_l0, ip4_header_t,
- length /* changed member */ );
- ip->checksum = ip_csum_fold (sum0);
- ip->length = new_l0;
- udp->length = clib_host_to_net_u16 (b0->current_length - sizeof (*ip));
- }
-
- /* Enqueue pkts to ip4-lookup */
-
- nf = vlib_get_frame_to_node (vm, em->ip4_lookup_node_index);
- nf->n_vectors = 0;
- to_next = vlib_frame_vector_args (nf);
- nf->n_vectors = 1;
- to_next[0] = eb->buffer_index;
- vlib_put_frame_to_node (vm, em->ip4_lookup_node_index, nf);
- return (1);
-
-}
-
-#define EXPORT_TIMEOUT (20.0)
-#define THREAD_PERIOD (30.0)
-inline static uword
-ioam_export_process_common (ioam_export_main_t * em, vlib_main_t * vm,
- vlib_node_runtime_t * rt, vlib_frame_t * f,
- u32 index)
-{
- f64 now;
- f64 timeout = 30.0;
- uword event_type;
- uword *event_data = 0;
- int i;
- ioam_export_buffer_t *eb = 0, *new_eb = 0;
- u32 *vec_buffer_indices = 0;
- u32 *vec_buffer_to_be_sent = 0;
- u32 *thread_index = 0;
- u32 new_pool_index = 0;
-
- em->export_process_node_index = index;
- /* Wait for Godot... */
- vlib_process_wait_for_event_or_clock (vm, 1e9);
- event_type = vlib_process_get_events (vm, &event_data);
- if (event_type != 1)
- clib_warning ("bogus kickoff event received, %d", event_type);
- vec_reset_length (event_data);
-
- while (1)
- {
- vlib_process_wait_for_event_or_clock (vm, timeout);
- event_type = vlib_process_get_events (vm, &event_data);
- switch (event_type)
- {
- case 2: /* Stop and Wait for kickoff again */
- timeout = 1e9;
- break;
- case 1: /* kickoff : Check for unsent buffers */
- timeout = THREAD_PERIOD;
- break;
- case ~0: /* timeout */
- break;
- }
- vec_reset_length (event_data);
- now = vlib_time_now (vm);
- /*
- * Create buffers for threads that are not active enough
- * to send out the export records
- */
- for (i = 0; i < vec_len (em->buffer_per_thread); i++)
- {
- /* If the worker thread is processing export records ignore further checks */
- if (*em->lockp[i] == 1)
- continue;
- eb = pool_elt_at_index (em->buffer_pool, em->buffer_per_thread[i]);
- if (eb->records_in_this_buffer > 0
- && now > (eb->touched_at + EXPORT_TIMEOUT))
- {
- pool_get_aligned (em->buffer_pool, new_eb,
- CLIB_CACHE_LINE_BYTES);
- memset (new_eb, 0, sizeof (*new_eb));
- if (ioam_export_init_buffer (em, vm, new_eb) == 1)
- {
- new_pool_index = new_eb - em->buffer_pool;
- vec_add (vec_buffer_indices, &new_pool_index, 1);
- vec_add (vec_buffer_to_be_sent, &em->buffer_per_thread[i],
- 1);
- vec_add (thread_index, &i, 1);
- }
- else
- {
- pool_put (em->buffer_pool, new_eb);
- /*Give up */
- goto CLEANUP;
- }
- }
- }
- if (vec_len (thread_index) != 0)
- {
- /*
- * Now swap the buffers out
- */
- for (i = 0; i < vec_len (thread_index); i++)
- {
- while (__sync_lock_test_and_set (em->lockp[thread_index[i]], 1))
- ;
- em->buffer_per_thread[thread_index[i]] =
- vec_pop (vec_buffer_indices);
- *em->lockp[thread_index[i]] = 0;
- }
-
- /* Send the buffers */
- for (i = 0; i < vec_len (vec_buffer_to_be_sent); i++)
- {
- eb =
- pool_elt_at_index (em->buffer_pool, vec_buffer_to_be_sent[i]);
- ioam_export_send_buffer (em, vm, eb);
- pool_put (em->buffer_pool, eb);
- }
- }
-
- CLEANUP:
- /* Free any leftover/unused buffers and everything that was allocated */
- for (i = 0; i < vec_len (vec_buffer_indices); i++)
- {
- new_eb = pool_elt_at_index (em->buffer_pool, vec_buffer_indices[i]);
- vlib_buffer_free (vm, &new_eb->buffer_index, 1);
- pool_put (em->buffer_pool, new_eb);
- }
- vec_free (vec_buffer_indices);
- vec_free (vec_buffer_to_be_sent);
- vec_free (thread_index);
- }
- return 0; /* not so much */
-}
-
-#define ioam_export_node_common(EM, VM, N, F, HTYPE, L, V, NEXT) \
-do { \
- u32 n_left_from, *from, *to_next; \
- export_next_t next_index; \
- u32 pkts_recorded = 0; \
- ioam_export_buffer_t *my_buf = 0; \
- vlib_buffer_t *eb0 = 0; \
- u32 ebi0 = 0; \
- from = vlib_frame_vector_args (F); \
- n_left_from = (F)->n_vectors; \
- next_index = (N)->cached_next_index; \
- while (__sync_lock_test_and_set ((EM)->lockp[(VM)->cpu_index], 1)); \
- my_buf = ioam_export_get_my_buffer (EM, (VM)->cpu_index); \
- my_buf->touched_at = vlib_time_now (VM); \
- while (n_left_from > 0) \
- { \
- u32 n_left_to_next; \
- vlib_get_next_frame (VM, N, next_index, to_next, n_left_to_next); \
- while (n_left_from >= 4 && n_left_to_next >= 2) \
- { \
- u32 next0 = NEXT; \
- u32 next1 = NEXT; \
- u32 bi0, bi1; \
- HTYPE *ip0, *ip1; \
- vlib_buffer_t *p0, *p1; \
- u32 ip_len0, ip_len1; \
- { \
- vlib_buffer_t *p2, *p3; \
- p2 = vlib_get_buffer (VM, from[2]); \
- p3 = vlib_get_buffer (VM, from[3]); \
- vlib_prefetch_buffer_header (p2, LOAD); \
- vlib_prefetch_buffer_header (p3, LOAD); \
- CLIB_PREFETCH (p2->data, 3 * CLIB_CACHE_LINE_BYTES, LOAD); \
- CLIB_PREFETCH (p3->data, 3 * CLIB_CACHE_LINE_BYTES, LOAD); \
- } \
- to_next[0] = bi0 = from[0]; \
- to_next[1] = bi1 = from[1]; \
- from += 2; \
- to_next += 2; \
- n_left_from -= 2; \
- n_left_to_next -= 2; \
- p0 = vlib_get_buffer (VM, bi0); \
- p1 = vlib_get_buffer (VM, bi1); \
- ip0 = vlib_buffer_get_current (p0); \
- ip1 = vlib_buffer_get_current (p1); \
- ip_len0 = \
- clib_net_to_host_u16 (ip0->L) + sizeof (HTYPE); \
- ip_len1 = \
- clib_net_to_host_u16 (ip1->L) + sizeof (HTYPE); \
- ebi0 = my_buf->buffer_index; \
- eb0 = vlib_get_buffer (VM, ebi0); \
- if (PREDICT_FALSE (eb0 == 0)) \
- goto NO_BUFFER1; \
- ip_len0 = \
- ip_len0 > DEFAULT_EXPORT_SIZE ? DEFAULT_EXPORT_SIZE : ip_len0; \
- ip_len1 = \
- ip_len1 > DEFAULT_EXPORT_SIZE ? DEFAULT_EXPORT_SIZE : ip_len1; \
- copy3cachelines (eb0->data + eb0->current_length, ip0, ip_len0); \
- eb0->current_length += DEFAULT_EXPORT_SIZE; \
- my_buf->records_in_this_buffer++; \
- if (my_buf->records_in_this_buffer >= DEFAULT_EXPORT_RECORDS) \
- { \
- ioam_export_send_buffer (EM, VM, my_buf); \
- ioam_export_init_buffer (EM, VM, my_buf); \
- } \
- ebi0 = my_buf->buffer_index; \
- eb0 = vlib_get_buffer (VM, ebi0); \
- if (PREDICT_FALSE (eb0 == 0)) \
- goto NO_BUFFER1; \
- copy3cachelines (eb0->data + eb0->current_length, ip1, ip_len1); \
- eb0->current_length += DEFAULT_EXPORT_SIZE; \
- my_buf->records_in_this_buffer++; \
- if (my_buf->records_in_this_buffer >= DEFAULT_EXPORT_RECORDS) \
- { \
- ioam_export_send_buffer (EM, VM, my_buf); \
- ioam_export_init_buffer (EM, VM, my_buf); \
- } \
- pkts_recorded += 2; \
- if (PREDICT_FALSE (((node)->flags & VLIB_NODE_FLAG_TRACE))) \
- { \
- if (p0->flags & VLIB_BUFFER_IS_TRACED) \
- { \
- export_trace_t *t = \
- vlib_add_trace (VM, node, p0, sizeof (*t)); \
- t->flow_label = \
- clib_net_to_host_u32 (ip0->V); \
- t->next_index = next0; \
- } \
- if (p1->flags & VLIB_BUFFER_IS_TRACED) \
- { \
- export_trace_t *t = \
- vlib_add_trace (VM, N, p1, sizeof (*t)); \
- t->flow_label = \
- clib_net_to_host_u32 (ip1->V); \
- t->next_index = next1; \
- } \
- } \
- NO_BUFFER1: \
- vlib_validate_buffer_enqueue_x2 (VM, N, next_index, \
- to_next, n_left_to_next, \
- bi0, bi1, next0, next1); \
- } \
- while (n_left_from > 0 && n_left_to_next > 0) \
- { \
- u32 bi0; \
- vlib_buffer_t *p0; \
- u32 next0 = NEXT; \
- HTYPE *ip0; \
- u32 ip_len0; \
- bi0 = from[0]; \
- to_next[0] = bi0; \
- from += 1; \
- to_next += 1; \
- n_left_from -= 1; \
- n_left_to_next -= 1; \
- p0 = vlib_get_buffer (VM, bi0); \
- ip0 = vlib_buffer_get_current (p0); \
- ip_len0 = \
- clib_net_to_host_u16 (ip0->L) + sizeof (HTYPE); \
- ebi0 = my_buf->buffer_index; \
- eb0 = vlib_get_buffer (VM, ebi0); \
- if (PREDICT_FALSE (eb0 == 0)) \
- goto NO_BUFFER; \
- ip_len0 = \
- ip_len0 > DEFAULT_EXPORT_SIZE ? DEFAULT_EXPORT_SIZE : ip_len0; \
- copy3cachelines (eb0->data + eb0->current_length, ip0, ip_len0); \
- eb0->current_length += DEFAULT_EXPORT_SIZE; \
- my_buf->records_in_this_buffer++; \
- if (my_buf->records_in_this_buffer >= DEFAULT_EXPORT_RECORDS) \
- { \
- ioam_export_send_buffer (EM, VM, my_buf); \
- ioam_export_init_buffer (EM, VM, my_buf); \
- } \
- if (PREDICT_FALSE (((N)->flags & VLIB_NODE_FLAG_TRACE) \
- && (p0->flags & VLIB_BUFFER_IS_TRACED))) \
- { \
- export_trace_t *t = vlib_add_trace (VM, (N), p0, sizeof (*t)); \
- t->flow_label = \
- clib_net_to_host_u32 (ip0->V); \
- t->next_index = next0; \
- } \
- pkts_recorded += 1; \
- NO_BUFFER: \
- vlib_validate_buffer_enqueue_x1 (VM, N, next_index, \
- to_next, n_left_to_next, \
- bi0, next0); \
- } \
- vlib_put_next_frame (VM, N, next_index, n_left_to_next); \
- } \
- vlib_node_increment_counter (VM, export_node.index, \
- EXPORT_ERROR_RECORDED, pkts_recorded); \
- *(EM)->lockp[(VM)->cpu_index] = 0; \
-} while(0)
-
-#endif /* __included_ioam_export_h__ */
-
-/*
- * fd.io coding-style-patch-verification: ON
- *
- * Local Variables:
- * eval: (c-set-style "gnu")
- * End:
- */
diff --git a/plugins/ioam-plugin/ioam/export-vxlan-gpe/vxlan_gpe_ioam_export.api b/plugins/ioam-plugin/ioam/export-vxlan-gpe/vxlan_gpe_ioam_export.api
deleted file mode 100644
index 7b17c3f7a32..00000000000
--- a/plugins/ioam-plugin/ioam/export-vxlan-gpe/vxlan_gpe_ioam_export.api
+++ /dev/null
@@ -1,42 +0,0 @@
-/* Hey Emacs use -*- mode: C -*- */
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/* Define a simple binary API to control the feature */
-
-define vxlan_gpe_ioam_export_enable_disable {
- /* Client identifier, set from api_main.my_client_index */
- u32 client_index;
-
- /* Arbitrary context, so client can match reply to request */
- u32 context;
-
- /* Enable / disable the feature */
- u8 is_disable;
-
- /* Collector ip address */
- u8 collector_address[4];
- u8 src_address[4];
-
- /* Src ip address */
-};
-
-define vxlan_gpe_ioam_export_enable_disable_reply {
- /* From the request */
- u32 context;
-
- /* Return value, zero means all OK */
- i32 retval;
-}; \ No newline at end of file
diff --git a/plugins/ioam-plugin/ioam/export-vxlan-gpe/vxlan_gpe_ioam_export.c b/plugins/ioam-plugin/ioam/export-vxlan-gpe/vxlan_gpe_ioam_export.c
deleted file mode 100644
index bab8d977062..00000000000
--- a/plugins/ioam-plugin/ioam/export-vxlan-gpe/vxlan_gpe_ioam_export.c
+++ /dev/null
@@ -1,271 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- *------------------------------------------------------------------
- * vxlan_gpe_ioam_export.c - ioam export API / debug CLI handling
- *------------------------------------------------------------------
- */
-
-#include <vnet/vnet.h>
-#include <vnet/plugin/plugin.h>
-#include <ioam/export-common/ioam_export.h>
-#include <vnet/vxlan-gpe/vxlan_gpe.h>
-
-#include <vlibapi/api.h>
-#include <vlibmemory/api.h>
-#include <vlibsocket/api.h>
-
-#include <ioam/lib-vxlan-gpe/vxlan_gpe_ioam.h>
-
-/* define message IDs */
-#include <ioam/export-vxlan-gpe/vxlan_gpe_ioam_export_msg_enum.h>
-
-/* define message structures */
-#define vl_typedefs
-#include <ioam/export-vxlan-gpe/vxlan_gpe_ioam_export_all_api_h.h>
-#undef vl_typedefs
-
-/* define generated endian-swappers */
-#define vl_endianfun
-#include <ioam/export-vxlan-gpe/vxlan_gpe_ioam_export_all_api_h.h>
-#undef vl_endianfun
-
-/* instantiate all the print functions we know about */
-#define vl_print(handle, ...) vlib_cli_output (handle, __VA_ARGS__)
-#define vl_printfun
-#include <ioam/export-vxlan-gpe/vxlan_gpe_ioam_export_all_api_h.h>
-#undef vl_printfun
-
-/* Get the API version number */
-#define vl_api_version(n,v) static u32 api_version=(v);
-#include <ioam/export-vxlan-gpe/vxlan_gpe_ioam_export_all_api_h.h>
-#undef vl_api_version
-
-/*
- * A handy macro to set up a message reply.
- * Assumes that the following variables are available:
- * mp - pointer to request message
- * rmp - pointer to reply message type
- * rv - return value
- */
-
-#define REPLY_MACRO(t) \
-do { \
- unix_shared_memory_queue_t * q = \
- vl_api_client_index_to_input_queue (mp->client_index); \
- if (!q) \
- return; \
- \
- rmp = vl_msg_api_alloc (sizeof (*rmp)); \
- rmp->_vl_msg_id = ntohs((t)+sm->msg_id_base); \
- rmp->context = mp->context; \
- rmp->retval = ntohl(rv); \
- \
- vl_msg_api_send_shmem (q, (u8 *)&rmp); \
-} while(0);
-
-
-/* List of message types that this plugin understands */
-
-
-#define foreach_vxlan_gpe_ioam_export_plugin_api_msg \
-_(VXLAN_GPE_IOAM_EXPORT_ENABLE_DISABLE, vxlan_gpe_ioam_export_enable_disable)
-
-extern void vxlan_gpe_set_next_override (uword next);
-/* Action function shared between message handler and debug CLI */
-int
-vxlan_gpe_ioam_export_enable_disable (ioam_export_main_t * em,
- u8 is_disable,
- ip4_address_t * collector_address,
- ip4_address_t * src_address)
-{
- vlib_main_t *vm = em->vlib_main;
- u32 node_index = export_node.index;
- vlib_node_t *vxlan_gpe_decap_ioam_node = NULL;
-
- if (is_disable == 0)
- {
- if (em->my_hbh_slot == ~0)
- {
- /* Hook this export node to vxlan-gpe-decap-ioam-v4 */
- vxlan_gpe_decap_ioam_node =
- vlib_get_node_by_name (vm, (u8 *) "vxlan-gpe-decap-ioam-v4");
- if (!vxlan_gpe_decap_ioam_node)
- {
- /* node does not exist give up */
- return (-1);
- }
- em->my_hbh_slot =
- vlib_node_add_next (vm, vxlan_gpe_decap_ioam_node->index,
- node_index);
- }
- if (1 == ioam_export_header_create (em, collector_address, src_address))
- {
- ioam_export_thread_buffer_init (em, vm);
- vxlan_gpe_set_next_override (em->my_hbh_slot);
- /* Turn on the export buffer check process */
- vlib_process_signal_event (vm, em->export_process_node_index, 1, 0);
-
- }
- else
- {
- return (-2);
- }
- }
- else
- {
- vxlan_gpe_set_next_override (VXLAN_GPE_DECAP_IOAM_V4_NEXT_POP);
- ioam_export_header_cleanup (em, collector_address, src_address);
- ioam_export_thread_buffer_free (em);
- /* Turn off the export buffer check process */
- vlib_process_signal_event (vm, em->export_process_node_index, 2, 0);
-
- }
-
- return 0;
-}
-
-/* API message handler */
-static void vl_api_vxlan_gpe_ioam_export_enable_disable_t_handler
- (vl_api_vxlan_gpe_ioam_export_enable_disable_t * mp)
-{
- vl_api_vxlan_gpe_ioam_export_enable_disable_reply_t *rmp;
- ioam_export_main_t *sm = &vxlan_gpe_ioam_export_main;
- int rv;
-
- rv = vxlan_gpe_ioam_export_enable_disable (sm, (int) (mp->is_disable),
- (ip4_address_t *)
- mp->collector_address,
- (ip4_address_t *)
- mp->src_address);
-
- REPLY_MACRO (VL_API_VXLAN_GPE_IOAM_EXPORT_ENABLE_DISABLE_REPLY);
-} /* API message handler */
-
-
-
-/* Set up the API message handling tables */
-static clib_error_t *
-vxlan_gpe_ioam_export_plugin_api_hookup (vlib_main_t * vm)
-{
- ioam_export_main_t *sm = &vxlan_gpe_ioam_export_main;
-#define _(N,n) \
- vl_msg_api_set_handlers((VL_API_##N + sm->msg_id_base), \
- #n, \
- vl_api_##n##_t_handler, \
- vl_noop_handler, \
- vl_api_##n##_t_endian, \
- vl_api_##n##_t_print, \
- sizeof(vl_api_##n##_t), 1);
- foreach_vxlan_gpe_ioam_export_plugin_api_msg;
-#undef _
-
- return 0;
-}
-
-
-static clib_error_t *
-set_vxlan_gpe_ioam_export_ipfix_command_fn (vlib_main_t * vm,
- unformat_input_t * input,
- vlib_cli_command_t * cmd)
-{
- ioam_export_main_t *em = &vxlan_gpe_ioam_export_main;
- ip4_address_t collector, src;
- u8 is_disable = 0;
-
- collector.as_u32 = 0;
- src.as_u32 = 0;
-
- while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
- {
- if (unformat (input, "collector %U", unformat_ip4_address, &collector))
- ;
- else if (unformat (input, "src %U", unformat_ip4_address, &src))
- ;
- else if (unformat (input, "disable"))
- is_disable = 1;
- else
- break;
- }
-
- if (collector.as_u32 == 0)
- return clib_error_return (0, "collector address required");
-
- if (src.as_u32 == 0)
- return clib_error_return (0, "src address required");
-
- em->ipfix_collector.as_u32 = collector.as_u32;
- em->src_address.as_u32 = src.as_u32;
-
- vlib_cli_output (vm, "Collector %U, src address %U",
- format_ip4_address, &em->ipfix_collector,
- format_ip4_address, &em->src_address);
-
- /* Turn on the export timer process */
- // vlib_process_signal_event (vm, flow_report_process_node.index,
- //1, 0);
- if (0 !=
- vxlan_gpe_ioam_export_enable_disable (em, is_disable, &collector, &src))
- {
- return clib_error_return (0, "Unable to set ioam vxlan-gpe export");
- }
-
- return 0;
-}
-
-/* *INDENT-OFF* */
-VLIB_CLI_COMMAND (set_vxlan_gpe_ioam_ipfix_command, static) =
-{
-.path = "set vxlan-gpe-ioam export ipfix",
-.short_help = "set vxlan-gpe-ioam export ipfix collector <ip4-address> src <ip4-address>",
-.function = set_vxlan_gpe_ioam_export_ipfix_command_fn,
-};
-/* *INDENT-ON* */
-
-
-static clib_error_t *
-vxlan_gpe_ioam_export_init (vlib_main_t * vm)
-{
- ioam_export_main_t *em = &vxlan_gpe_ioam_export_main;
- clib_error_t *error = 0;
- u8 *name;
-
- name = format (0, "vxlan_gpe_ioam_export_%08x%c", api_version, 0);
-
- /* Ask for a correctly-sized block of API message decode slots */
- em->msg_id_base = vl_msg_api_get_msg_ids
- ((char *) name, VL_MSG_FIRST_AVAILABLE);
- em->unix_time_0 = (u32) time (0); /* Store starting time */
- em->vlib_time_0 = vlib_time_now (vm);
-
- error = vxlan_gpe_ioam_export_plugin_api_hookup (vm);
- em->my_hbh_slot = ~0;
- em->vlib_main = vm;
- em->vnet_main = vnet_get_main ();
- vec_free (name);
-
- return error;
-}
-
-VLIB_INIT_FUNCTION (vxlan_gpe_ioam_export_init);
-
-
-/*
- * fd.io coding-style-patch-verification: ON
- *
- * Local Variables:
- * eval: (c-set-style "gnu")
- * End:
- */
diff --git a/plugins/ioam-plugin/ioam/export-vxlan-gpe/vxlan_gpe_ioam_export_all_api_h.h b/plugins/ioam-plugin/ioam/export-vxlan-gpe/vxlan_gpe_ioam_export_all_api_h.h
deleted file mode 100644
index 6d93f09341a..00000000000
--- a/plugins/ioam-plugin/ioam/export-vxlan-gpe/vxlan_gpe_ioam_export_all_api_h.h
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/* Include the generated file, see BUILT_SOURCES in Makefile.am */
-#include <ioam/export-vxlan-gpe/vxlan_gpe_ioam_export.api.h>
diff --git a/plugins/ioam-plugin/ioam/export-vxlan-gpe/vxlan_gpe_ioam_export_msg_enum.h b/plugins/ioam-plugin/ioam/export-vxlan-gpe/vxlan_gpe_ioam_export_msg_enum.h
deleted file mode 100644
index cc5698de334..00000000000
--- a/plugins/ioam-plugin/ioam/export-vxlan-gpe/vxlan_gpe_ioam_export_msg_enum.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef included_vxlan_gpe_ioam_export_msg_enum_h
-#define included_vxlan_gpe_ioam_export_msg_enum_h
-
-#include <vppinfra/byte_order.h>
-
-#define vl_msg_id(n,h) n,
-typedef enum {
-#include <ioam/export-vxlan-gpe/vxlan_gpe_ioam_export_all_api_h.h>
- /* We'll want to know how many messages IDs we need... */
- VL_MSG_FIRST_AVAILABLE,
-} vl_msg_id_t;
-#undef vl_msg_id
-
-#endif /* included_vxlan_gpe_ioam_export_msg_enum_h */
diff --git a/plugins/ioam-plugin/ioam/export-vxlan-gpe/vxlan_gpe_ioam_export_test.c b/plugins/ioam-plugin/ioam/export-vxlan-gpe/vxlan_gpe_ioam_export_test.c
deleted file mode 100644
index 494263d9a1a..00000000000
--- a/plugins/ioam-plugin/ioam/export-vxlan-gpe/vxlan_gpe_ioam_export_test.c
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- *------------------------------------------------------------------
- * vxlan_gpe_ioam_export_test.c - test harness plugin
- *------------------------------------------------------------------
- */
-
-#include <vat/vat.h>
-#include <vlibapi/api.h>
-#include <vlibmemory/api.h>
-#include <vlibsocket/api.h>
-#include <vppinfra/error.h>
-
-
-/* Declare message IDs */
-#include <ioam/export-vxlan-gpe/vxlan_gpe_ioam_export_msg_enum.h>
-
-/* define message structures */
-#define vl_typedefs
-#include <ioam/export-vxlan-gpe/vxlan_gpe_ioam_export_all_api_h.h>
-#undef vl_typedefs
-
-/* declare message handlers for each api */
-
-#define vl_endianfun /* define message structures */
-#include <ioam/export-vxlan-gpe/vxlan_gpe_ioam_export_all_api_h.h>
-#undef vl_endianfun
-
-/* instantiate all the print functions we know about */
-#define vl_print(handle, ...)
-#define vl_printfun
-#include <ioam/export-vxlan-gpe/vxlan_gpe_ioam_export_all_api_h.h>
-#undef vl_printfun
-
-/* Get the API version number. */
-#define vl_api_version(n,v) static u32 api_version=(v);
-#include <ioam/export-vxlan-gpe/vxlan_gpe_ioam_export_all_api_h.h>
-#undef vl_api_version
-
-
-typedef struct
-{
- /* API message ID base */
- u16 msg_id_base;
- vat_main_t *vat_main;
-} export_test_main_t;
-
-export_test_main_t export_test_main;
-
-#define foreach_standard_reply_retval_handler \
-_(vxlan_gpe_ioam_export_enable_disable_reply)
-
-#define _(n) \
- static void vl_api_##n##_t_handler \
- (vl_api_##n##_t * mp) \
- { \
- vat_main_t * vam = export_test_main.vat_main; \
- i32 retval = ntohl(mp->retval); \
- if (vam->async_mode) { \
- vam->async_errors += (retval < 0); \
- } else { \
- vam->retval = retval; \
- vam->result_ready = 1; \
- } \
- }
-foreach_standard_reply_retval_handler;
-#undef _
-
-/*
- * Table of message reply handlers, must include boilerplate handlers
- * we just generated
- */
-#define foreach_vpe_api_reply_msg \
-_(VXLAN_GPE_IOAM_EXPORT_ENABLE_DISABLE_REPLY, vxlan_gpe_ioam_export_enable_disable_reply)
-
-
-/* M: construct, but don't yet send a message */
-
-#define M(T,t) \
-do { \
- vam->result_ready = 0; \
- mp = vl_msg_api_alloc(sizeof(*mp)); \
- memset (mp, 0, sizeof (*mp)); \
- mp->_vl_msg_id = ntohs (VL_API_##T + sm->msg_id_base); \
- mp->client_index = vam->my_client_index; \
-} while(0);
-
-#define M2(T,t,n) \
-do { \
- vam->result_ready = 0; \
- mp = vl_msg_api_alloc(sizeof(*mp)+(n)); \
- memset (mp, 0, sizeof (*mp)); \
- mp->_vl_msg_id = ntohs (VL_API_##T + sm->msg_id_base); \
- mp->client_index = vam->my_client_index; \
-} while(0);
-
-/* S: send a message */
-#define S (vl_msg_api_send_shmem (vam->vl_input_queue, (u8 *)&mp))
-
-/* W: wait for results, with timeout */
-#define W \
-do { \
- timeout = vat_time_now (vam) + 1.0; \
- \
- while (vat_time_now (vam) < timeout) { \
- if (vam->result_ready == 1) { \
- return (vam->retval); \
- } \
- } \
- return -99; \
-} while(0);
-
-static int
-api_vxlan_gpe_ioam_export_enable_disable (vat_main_t * vam)
-{
- export_test_main_t *sm = &export_test_main;
- unformat_input_t *i = vam->input;
- f64 timeout;
- int is_disable = 0;
- vl_api_vxlan_gpe_ioam_export_enable_disable_t *mp;
-
- /* Parse args required to build the message */
- while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
- {
- if (unformat (i, "disable"))
- is_disable = 1;
- else
- break;
- }
-
- /* Construct the API message */
- M (VXLAN_GPE_IOAM_EXPORT_ENABLE_DISABLE,
- vxlan_gpe_ioam_export_enable_disable);
- mp->is_disable = is_disable;
-
- /* send it... */
- S;
-
- /* Wait for a reply... */
- W;
-}
-
-/*
- * List of messages that the api test plugin sends,
- * and that the data plane plugin processes
- */
-#define foreach_vpe_api_msg \
-_(vxlan_gpe_ioam_export_enable_disable, "<intfc> [disable]")
-
-void
-vat_api_hookup (vat_main_t * vam)
-{
- export_test_main_t *sm = &export_test_main;
- /* Hook up handlers for replies from the data plane plug-in */
-#define _(N,n) \
- vl_msg_api_set_handlers((VL_API_##N + sm->msg_id_base), \
- #n, \
- vl_api_##n##_t_handler, \
- vl_noop_handler, \
- vl_api_##n##_t_endian, \
- vl_api_##n##_t_print, \
- sizeof(vl_api_##n##_t), 1);
- foreach_vpe_api_reply_msg;
-#undef _
-
- /* API messages we can send */
-#define _(n,h) hash_set_mem (vam->function_by_name, #n, api_##n);
- foreach_vpe_api_msg;
-#undef _
-
- /* Help strings */
-#define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
- foreach_vpe_api_msg;
-#undef _
-}
-
-clib_error_t *
-vat_plugin_register (vat_main_t * vam)
-{
- export_test_main_t *sm = &export_test_main;
- u8 *name;
-
- sm->vat_main = vam;
-
- name = format (0, "vxlan_gpe_ioam_export_%08x%c", api_version, 0);
- sm->msg_id_base = vl_client_get_first_plugin_msg_id ((char *) name);
-
- if (sm->msg_id_base != (u16) ~ 0)
- vat_api_hookup (vam);
-
- vec_free (name);
-
- return 0;
-}
-
-/*
- * fd.io coding-style-patch-verification: ON
- *
- * Local Variables:
- * eval: (c-set-style "gnu")
- * End:
- */
diff --git a/plugins/ioam-plugin/ioam/export-vxlan-gpe/vxlan_gpe_ioam_export_thread.c b/plugins/ioam-plugin/ioam/export-vxlan-gpe/vxlan_gpe_ioam_export_thread.c
deleted file mode 100644
index 58508ebf10e..00000000000
--- a/plugins/ioam-plugin/ioam/export-vxlan-gpe/vxlan_gpe_ioam_export_thread.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * ioam_export_thread.c
- */
-#include <vnet/api_errno.h>
-#include <vppinfra/pool.h>
-#include <ioam/export-common/ioam_export.h>
-
-static vlib_node_registration_t vxlan_gpe_ioam_export_process_node;
-
-static uword
-vxlan_gpe_ioam_export_process (vlib_main_t * vm,
- vlib_node_runtime_t * rt, vlib_frame_t * f)
-{
- return (ioam_export_process_common (&vxlan_gpe_ioam_export_main,
- vm, rt, f,
- vxlan_gpe_ioam_export_process_node.index));
-}
-
-
-/* *INDENT-OFF* */
-VLIB_REGISTER_NODE (vxlan_gpe_ioam_export_process_node, static) =
-{
- .function = vxlan_gpe_ioam_export_process,
- .type = VLIB_NODE_TYPE_PROCESS,
- .name = "vxlan-gpe-ioam-export-process",
-};
-/* *INDENT-ON* */
-
-/*
- * fd.io coding-style-patch-verification: ON
- *
- * Local Variables:
- * eval: (c-set-style "gnu")
- * End:
- */
diff --git a/plugins/ioam-plugin/ioam/export-vxlan-gpe/vxlan_gpe_node.c b/plugins/ioam-plugin/ioam/export-vxlan-gpe/vxlan_gpe_node.c
deleted file mode 100644
index 722c2b061c0..00000000000
--- a/plugins/ioam-plugin/ioam/export-vxlan-gpe/vxlan_gpe_node.c
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include <vlib/vlib.h>
-#include <vnet/vnet.h>
-#include <vnet/pg/pg.h>
-#include <vppinfra/error.h>
-#include <vnet/ip/ip.h>
-#include <ioam/export-common/ioam_export.h>
-#include <vnet/vxlan-gpe/vxlan_gpe.h>
-#include <vnet/vxlan-gpe/vxlan_gpe_packet.h>
-
-typedef struct
-{
- u32 next_index;
- u32 flow_label;
-} export_trace_t;
-
-/* packet trace format function */
-static u8 *
-format_export_trace (u8 * s, va_list * args)
-{
- CLIB_UNUSED (vlib_main_t * vm) = va_arg (*args, vlib_main_t *);
- CLIB_UNUSED (vlib_node_t * node) = va_arg (*args, vlib_node_t *);
- export_trace_t *t = va_arg (*args, export_trace_t *);
-
- s = format (s, "EXPORT: flow_label %d, next index %d",
- t->flow_label, t->next_index);
- return s;
-}
-
-vlib_node_registration_t export_node;
-
-#define foreach_export_error \
-_(RECORDED, "Packets recorded for export")
-
-typedef enum
-{
-#define _(sym,str) EXPORT_ERROR_##sym,
- foreach_export_error
-#undef _
- EXPORT_N_ERROR,
-} export_error_t;
-
-static char *export_error_strings[] = {
-#define _(sym,string) string,
- foreach_export_error
-#undef _
-};
-
-typedef enum
-{
- EXPORT_NEXT_VXLAN_GPE_INPUT,
- EXPORT_N_NEXT,
-} export_next_t;
-
-always_inline void
-copy3cachelines (void *dst, const void *src, size_t n)
-{
-#if 0
- if (PREDICT_FALSE (n < DEFAULT_EXPORT_SIZE))
- {
- /* Copy only the first 1/2 cache lines whatever is available */
- if (n >= 64)
- clib_mov64 ((u8 *) dst, (const u8 *) src);
- if (n >= 128)
- clib_mov64 ((u8 *) dst + 64, (const u8 *) src + 64);
- return;
- }
- clib_mov64 ((u8 *) dst, (const u8 *) src);
- clib_mov64 ((u8 *) dst + 64, (const u8 *) src + 64);
- clib_mov64 ((u8 *) dst + 128, (const u8 *) src + 128);
-#endif
-#if 1
-
- u64 *copy_dst, *copy_src;
- int i;
- copy_dst = (u64 *) dst;
- copy_src = (u64 *) src;
- if (PREDICT_FALSE (n < DEFAULT_EXPORT_SIZE))
- {
- for (i = 0; i < n / 64; i++)
- {
- copy_dst[0] = copy_src[0];
- copy_dst[1] = copy_src[1];
- copy_dst[2] = copy_src[2];
- copy_dst[3] = copy_src[3];
- copy_dst[4] = copy_src[4];
- copy_dst[5] = copy_src[5];
- copy_dst[6] = copy_src[6];
- copy_dst[7] = copy_src[7];
- copy_dst += 8;
- copy_src += 8;
- }
- return;
- }
- for (i = 0; i < 3; i++)
- {
- copy_dst[0] = copy_src[0];
- copy_dst[1] = copy_src[1];
- copy_dst[2] = copy_src[2];
- copy_dst[3] = copy_src[3];
- copy_dst[4] = copy_src[4];
- copy_dst[5] = copy_src[5];
- copy_dst[6] = copy_src[6];
- copy_dst[7] = copy_src[7];
- copy_dst += 8;
- copy_src += 8;
- }
-#endif
-}
-
-
-static uword
-vxlan_gpe_export_node_fn (vlib_main_t * vm,
- vlib_node_runtime_t * node, vlib_frame_t * frame)
-{
- ioam_export_main_t *em = &vxlan_gpe_ioam_export_main;
- ioam_export_node_common (em, vm, node, frame, ip4_header_t, length,
- ip_version_and_header_length,
- EXPORT_NEXT_VXLAN_GPE_INPUT);
- return frame->n_vectors;
-}
-
-/*
- * Node for VXLAN-GPE export
- */
-/* *INDENT-OFF* */
-VLIB_REGISTER_NODE (export_node) =
-{
- .function = vxlan_gpe_export_node_fn,
- .name = "vxlan-gpe-ioam-export",
- .vector_size = sizeof (u32),
- .format_trace = format_export_trace,
- .type = VLIB_NODE_TYPE_INTERNAL,
- .n_errors = ARRAY_LEN (export_error_strings),
- .error_strings = export_error_strings,
- .n_next_nodes = EXPORT_N_NEXT,
- /* edit / add dispositions here */
- .next_nodes =
- {[EXPORT_NEXT_VXLAN_GPE_INPUT] = "vxlan-gpe-pop-ioam-v4"},
-};
-/* *INDENT-ON* */
-
-/*
- * fd.io coding-style-patch-verification: ON
- *
- * Local Variables:
- * eval: (c-set-style "gnu")
- * End:
- */
diff --git a/plugins/ioam-plugin/ioam/export/ioam_export.api b/plugins/ioam-plugin/ioam/export/ioam_export.api
deleted file mode 100644
index f22d9fc8ebe..00000000000
--- a/plugins/ioam-plugin/ioam/export/ioam_export.api
+++ /dev/null
@@ -1,42 +0,0 @@
-/* Hey Emacs use -*- mode: C -*- */
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/* Define a simple binary API to control the feature */
-
-define ioam_export_ip6_enable_disable {
- /* Client identifier, set from api_main.my_client_index */
- u32 client_index;
-
- /* Arbitrary context, so client can match reply to request */
- u32 context;
-
- /* Enable / disable the feature */
- u8 is_disable;
-
- /* Collector ip address */
- u8 collector_address[4];
- u8 src_address[4];
-
- /* Src ip address */
-};
-
-define ioam_export_ip6_enable_disable_reply {
- /* From the request */
- u32 context;
-
- /* Return value, zero means all OK */
- i32 retval;
-};
diff --git a/plugins/ioam-plugin/ioam/export/ioam_export.c b/plugins/ioam-plugin/ioam/export/ioam_export.c
deleted file mode 100644
index b122e445b28..00000000000
--- a/plugins/ioam-plugin/ioam/export/ioam_export.c
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- *------------------------------------------------------------------
- * ioam_export.c - ioam export API / debug CLI handling
- *------------------------------------------------------------------
- */
-
-#include <vnet/vnet.h>
-#include <vnet/plugin/plugin.h>
-#include <ioam/export-common/ioam_export.h>
-
-#include <vlibapi/api.h>
-#include <vlibmemory/api.h>
-#include <vlibsocket/api.h>
-#include <vnet/ip/ip6_hop_by_hop.h>
-
-
-/* define message IDs */
-#include <ioam/export/ioam_export_msg_enum.h>
-
-/* define message structures */
-#define vl_typedefs
-#include <ioam/export/ioam_export_all_api_h.h>
-#undef vl_typedefs
-
-/* define generated endian-swappers */
-#define vl_endianfun
-#include <ioam/export/ioam_export_all_api_h.h>
-#undef vl_endianfun
-
-/* instantiate all the print functions we know about */
-#define vl_print(handle, ...) vlib_cli_output (handle, __VA_ARGS__)
-#define vl_printfun
-#include <ioam/export/ioam_export_all_api_h.h>
-#undef vl_printfun
-
-/* Get the API version number */
-#define vl_api_version(n,v) static u32 api_version=(v);
-#include <ioam/export/ioam_export_all_api_h.h>
-#undef vl_api_version
-
-/*
- * A handy macro to set up a message reply.
- * Assumes that the following variables are available:
- * mp - pointer to request message
- * rmp - pointer to reply message type
- * rv - return value
- */
-
-#define REPLY_MACRO(t) \
-do { \
- unix_shared_memory_queue_t * q = \
- vl_api_client_index_to_input_queue (mp->client_index); \
- if (!q) \
- return; \
- \
- rmp = vl_msg_api_alloc (sizeof (*rmp)); \
- rmp->_vl_msg_id = ntohs((t)+sm->msg_id_base); \
- rmp->context = mp->context; \
- rmp->retval = ntohl(rv); \
- \
- vl_msg_api_send_shmem (q, (u8 *)&rmp); \
-} while(0);
-
-
-/* List of message types that this plugin understands */
-
-#define foreach_ioam_export_plugin_api_msg \
-_(IOAM_EXPORT_IP6_ENABLE_DISABLE, ioam_export_ip6_enable_disable)
-
-/*
- * This routine exists to convince the vlib plugin framework that
- * we haven't accidentally copied a random .dll into the plugin directory.
- *
- * Also collects global variable pointers passed from the vpp engine
- */
-
-clib_error_t *
-vlib_plugin_register (vlib_main_t * vm, vnet_plugin_handoff_t * h,
- int from_early_init)
-{
- ioam_export_main_t *em = &ioam_export_main;
- clib_error_t *error = 0;
-
- em->vlib_main = vm;
- em->vnet_main = h->vnet_main;
-
- return error;
-}
-
-/* Action function shared between message handler and debug CLI */
-
-int
-ioam_export_ip6_enable_disable (ioam_export_main_t * em,
- u8 is_disable,
- ip4_address_t * collector_address,
- ip4_address_t * src_address)
-{
- vlib_main_t *vm = em->vlib_main;
-
- if (is_disable == 0)
- {
- if (1 == ioam_export_header_create (em, collector_address, src_address))
- {
- ioam_export_thread_buffer_init (em, vm);
- ip6_hbh_set_next_override (em->my_hbh_slot);
- /* Turn on the export buffer check process */
- vlib_process_signal_event (vm, em->export_process_node_index, 1, 0);
-
- }
- else
- {
- return (-2);
- }
- }
- else
- {
- ip6_hbh_set_next_override (IP6_LOOKUP_NEXT_POP_HOP_BY_HOP);
- ioam_export_header_cleanup (em, collector_address, src_address);
- ioam_export_thread_buffer_free (em);
- /* Turn off the export buffer check process */
- vlib_process_signal_event (vm, em->export_process_node_index, 2, 0);
-
- }
-
- return 0;
-}
-
-/* API message handler */
-static void vl_api_ioam_export_ip6_enable_disable_t_handler
- (vl_api_ioam_export_ip6_enable_disable_t * mp)
-{
- vl_api_ioam_export_ip6_enable_disable_reply_t *rmp;
- ioam_export_main_t *sm = &ioam_export_main;
- int rv;
-
- rv = ioam_export_ip6_enable_disable (sm, (int) (mp->is_disable),
- (ip4_address_t *)
- mp->collector_address,
- (ip4_address_t *) mp->src_address);
-
- REPLY_MACRO (VL_API_IOAM_EXPORT_IP6_ENABLE_DISABLE_REPLY);
-}
-
-/* Set up the API message handling tables */
-static clib_error_t *
-ioam_export_plugin_api_hookup (vlib_main_t * vm)
-{
- ioam_export_main_t *sm = &ioam_export_main;
-#define _(N,n) \
- vl_msg_api_set_handlers((VL_API_##N + sm->msg_id_base), \
- #n, \
- vl_api_##n##_t_handler, \
- vl_noop_handler, \
- vl_api_##n##_t_endian, \
- vl_api_##n##_t_print, \
- sizeof(vl_api_##n##_t), 1);
- foreach_ioam_export_plugin_api_msg;
-#undef _
-
- return 0;
-}
-
-#define vl_msg_name_crc_list
-#include <ioam/export/ioam_export_all_api_h.h>
-#undef vl_msg_name_crc_list
-
-static void
-setup_message_id_table (ioam_export_main_t * sm, api_main_t * am)
-{
-#define _(id,n,crc) \
- vl_msg_api_add_msg_name_crc (am, #n "_" #crc, id + sm->msg_id_base);
- foreach_vl_msg_name_crc_ioam_export;
-#undef _
-}
-
-static clib_error_t *
-set_ioam_export_ipfix_command_fn (vlib_main_t * vm,
- unformat_input_t * input,
- vlib_cli_command_t * cmd)
-{
- ioam_export_main_t *em = &ioam_export_main;
- ip4_address_t collector, src;
- u8 is_disable = 0;
-
- collector.as_u32 = 0;
- src.as_u32 = 0;
-
- while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
- {
- if (unformat (input, "collector %U", unformat_ip4_address, &collector))
- ;
- else if (unformat (input, "src %U", unformat_ip4_address, &src))
- ;
- else if (unformat (input, "disable"))
- is_disable = 1;
- else
- break;
- }
-
- if (collector.as_u32 == 0)
- return clib_error_return (0, "collector address required");
-
- if (src.as_u32 == 0)
- return clib_error_return (0, "src address required");
-
- em->ipfix_collector.as_u32 = collector.as_u32;
- em->src_address.as_u32 = src.as_u32;
-
- vlib_cli_output (vm, "Collector %U, src address %U",
- format_ip4_address, &em->ipfix_collector,
- format_ip4_address, &em->src_address);
-
- /* Turn on the export timer process */
- // vlib_process_signal_event (vm, flow_report_process_node.index,
- //1, 0);
- ioam_export_ip6_enable_disable (em, is_disable, &collector, &src);
-
- return 0;
-}
-
-/* *INDENT-OFF* */
-VLIB_CLI_COMMAND (set_ipfix_command, static) =
-{
-.path = "set ioam export ipfix",.short_help =
- "set ioam export ipfix collector <ip4-address> src <ip4-address>",.
- function = set_ioam_export_ipfix_command_fn,};
-/* *INDENT-ON* */
-
-
-static clib_error_t *
-ioam_export_init (vlib_main_t * vm)
-{
- ioam_export_main_t *em = &ioam_export_main;
- clib_error_t *error = 0;
- u8 *name;
- u32 node_index = export_node.index;
- vlib_node_t *ip6_hbyh_node = NULL;
-
- name = format (0, "ioam_export_%08x%c", api_version, 0);
-
- /* Ask for a correctly-sized block of API message decode slots */
- em->msg_id_base = vl_msg_api_get_msg_ids
- ((char *) name, VL_MSG_FIRST_AVAILABLE);
- em->unix_time_0 = (u32) time (0); /* Store starting time */
- em->vlib_time_0 = vlib_time_now (vm);
-
- error = ioam_export_plugin_api_hookup (vm);
-
- /* Add our API messages to the global name_crc hash table */
- setup_message_id_table (em, &api_main);
-
- /* Hook this export node to ip6-hop-by-hop */
- ip6_hbyh_node = vlib_get_node_by_name (vm, (u8 *) "ip6-hop-by-hop");
- em->my_hbh_slot = vlib_node_add_next (vm, ip6_hbyh_node->index, node_index);
- vec_free (name);
-
- return error;
-}
-
-VLIB_INIT_FUNCTION (ioam_export_init);
-
-/*
- * fd.io coding-style-patch-verification: ON
- *
- * Local Variables:
- * eval: (c-set-style "gnu")
- * End:
- */
diff --git a/plugins/ioam-plugin/ioam/export/ioam_export_all_api_h.h b/plugins/ioam-plugin/ioam/export/ioam_export_all_api_h.h
deleted file mode 100644
index bc4368f2acb..00000000000
--- a/plugins/ioam-plugin/ioam/export/ioam_export_all_api_h.h
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/* Include the generated file, see BUILT_SOURCES in Makefile.am */
-#include <ioam/export/ioam_export.api.h>
diff --git a/plugins/ioam-plugin/ioam/export/ioam_export_msg_enum.h b/plugins/ioam-plugin/ioam/export/ioam_export_msg_enum.h
deleted file mode 100644
index c2de798893c..00000000000
--- a/plugins/ioam-plugin/ioam/export/ioam_export_msg_enum.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef included_ioam_export_msg_enum_h
-#define included_ioam_export_msg_enum_h
-
-#include <vppinfra/byte_order.h>
-
-#define vl_msg_id(n,h) n,
-typedef enum {
-#include <ioam/export/ioam_export_all_api_h.h>
- /* We'll want to know how many messages IDs we need... */
- VL_MSG_FIRST_AVAILABLE,
-} vl_msg_id_t;
-#undef vl_msg_id
-
-#endif /* included_ioam_export_msg_enum_h */
diff --git a/plugins/ioam-plugin/ioam/export/ioam_export_test.c b/plugins/ioam-plugin/ioam/export/ioam_export_test.c
deleted file mode 100644
index f991fc0c795..00000000000
--- a/plugins/ioam-plugin/ioam/export/ioam_export_test.c
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- *------------------------------------------------------------------
- * ioam_export_test.c - test harness plugin
- *------------------------------------------------------------------
- */
-
-#include <vat/vat.h>
-#include <vlibapi/api.h>
-#include <vlibmemory/api.h>
-#include <vlibsocket/api.h>
-#include <vppinfra/error.h>
-
-
-/* Declare message IDs */
-#include <ioam/export/ioam_export_msg_enum.h>
-
-/* define message structures */
-#define vl_typedefs
-#include <ioam/export/ioam_export_all_api_h.h>
-#undef vl_typedefs
-
-/* declare message handlers for each api */
-
-#define vl_endianfun /* define message structures */
-#include <ioam/export/ioam_export_all_api_h.h>
-#undef vl_endianfun
-
-/* instantiate all the print functions we know about */
-#define vl_print(handle, ...)
-#define vl_printfun
-#include <ioam/export/ioam_export_all_api_h.h>
-#undef vl_printfun
-
-/* Get the API version number. */
-#define vl_api_version(n,v) static u32 api_version=(v);
-#include <ioam/export/ioam_export_all_api_h.h>
-#undef vl_api_version
-
-
-typedef struct
-{
- /* API message ID base */
- u16 msg_id_base;
- vat_main_t *vat_main;
-} export_test_main_t;
-
-export_test_main_t export_test_main;
-
-#define foreach_standard_reply_retval_handler \
-_(ioam_export_ip6_enable_disable_reply)
-
-#define _(n) \
- static void vl_api_##n##_t_handler \
- (vl_api_##n##_t * mp) \
- { \
- vat_main_t * vam = export_test_main.vat_main; \
- i32 retval = ntohl(mp->retval); \
- if (vam->async_mode) { \
- vam->async_errors += (retval < 0); \
- } else { \
- vam->retval = retval; \
- vam->result_ready = 1; \
- } \
- }
-foreach_standard_reply_retval_handler;
-#undef _
-
-/*
- * Table of message reply handlers, must include boilerplate handlers
- * we just generated
- */
-#define foreach_vpe_api_reply_msg \
-_(IOAM_EXPORT_IP6_ENABLE_DISABLE_REPLY, ioam_export_ip6_enable_disable_reply)
-
-
-/* M: construct, but don't yet send a message */
-
-#define M(T,t) \
-do { \
- vam->result_ready = 0; \
- mp = vl_msg_api_alloc(sizeof(*mp)); \
- memset (mp, 0, sizeof (*mp)); \
- mp->_vl_msg_id = ntohs (VL_API_##T + sm->msg_id_base); \
- mp->client_index = vam->my_client_index; \
-} while(0);
-
-#define M2(T,t,n) \
-do { \
- vam->result_ready = 0; \
- mp = vl_msg_api_alloc(sizeof(*mp)+(n)); \
- memset (mp, 0, sizeof (*mp)); \
- mp->_vl_msg_id = ntohs (VL_API_##T + sm->msg_id_base); \
- mp->client_index = vam->my_client_index; \
-} while(0);
-
-/* S: send a message */
-#define S (vl_msg_api_send_shmem (vam->vl_input_queue, (u8 *)&mp))
-
-/* W: wait for results, with timeout */
-#define W \
-do { \
- timeout = vat_time_now (vam) + 1.0; \
- \
- while (vat_time_now (vam) < timeout) { \
- if (vam->result_ready == 1) { \
- return (vam->retval); \
- } \
- } \
- return -99; \
-} while(0);
-
-static int
-api_ioam_export_ip6_enable_disable (vat_main_t * vam)
-{
- export_test_main_t *sm = &export_test_main;
- unformat_input_t *i = vam->input;
- f64 timeout;
- int is_disable = 0;
- vl_api_ioam_export_ip6_enable_disable_t *mp;
-
- /* Parse args required to build the message */
- while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
- {
- if (unformat (i, "disable"))
- is_disable = 1;
- else
- break;
- }
-
- /* Construct the API message */
- M (IOAM_EXPORT_IP6_ENABLE_DISABLE, ioam_export_ip6_enable_disable);
- mp->is_disable = is_disable;
-
- /* send it... */
- S;
-
- /* Wait for a reply... */
- W;
-}
-
-/*
- * List of messages that the api test plugin sends,
- * and that the data plane plugin processes
- */
-#define foreach_vpe_api_msg \
-_(ioam_export_ip6_enable_disable, "<intfc> [disable]")
-
-void
-vat_api_hookup (vat_main_t * vam)
-{
- export_test_main_t *sm = &export_test_main;
- /* Hook up handlers for replies from the data plane plug-in */
-#define _(N,n) \
- vl_msg_api_set_handlers((VL_API_##N + sm->msg_id_base), \
- #n, \
- vl_api_##n##_t_handler, \
- vl_noop_handler, \
- vl_api_##n##_t_endian, \
- vl_api_##n##_t_print, \
- sizeof(vl_api_##n##_t), 1);
- foreach_vpe_api_reply_msg;
-#undef _
-
- /* API messages we can send */
-#define _(n,h) hash_set_mem (vam->function_by_name, #n, api_##n);
- foreach_vpe_api_msg;
-#undef _
-
- /* Help strings */
-#define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
- foreach_vpe_api_msg;
-#undef _
-}
-
-clib_error_t *
-vat_plugin_register (vat_main_t * vam)
-{
- export_test_main_t *sm = &export_test_main;
- u8 *name;
-
- sm->vat_main = vam;
-
- name = format (0, "ioam_export_%08x%c", api_version, 0);
- sm->msg_id_base = vl_client_get_first_plugin_msg_id ((char *) name);
-
- if (sm->msg_id_base != (u16) ~ 0)
- vat_api_hookup (vam);
-
- vec_free (name);
-
- return 0;
-}
diff --git a/plugins/ioam-plugin/ioam/export/ioam_export_thread.c b/plugins/ioam-plugin/ioam/export/ioam_export_thread.c
deleted file mode 100644
index d2eb200936a..00000000000
--- a/plugins/ioam-plugin/ioam/export/ioam_export_thread.c
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * ioam_export_thread.c
- */
-#include <vnet/api_errno.h>
-#include <vppinfra/pool.h>
-#include <ioam/export-common/ioam_export.h>
-
-static vlib_node_registration_t ioam_export_process_node;
-
-static uword
-ioam_export_process (vlib_main_t * vm,
- vlib_node_runtime_t * rt, vlib_frame_t * f)
-{
- return (ioam_export_process_common(&ioam_export_main,
- vm, rt, f,
- ioam_export_process_node.index));
-}
-
-VLIB_REGISTER_NODE (ioam_export_process_node, static) =
-{
- .function = ioam_export_process,
- .type = VLIB_NODE_TYPE_PROCESS,
- .name = "ioam-export-process",
-};
diff --git a/plugins/ioam-plugin/ioam/export/jvpp_ioam_export.c b/plugins/ioam-plugin/ioam/export/jvpp_ioam_export.c
deleted file mode 100644
index 27d3e2148b7..00000000000
--- a/plugins/ioam-plugin/ioam/export/jvpp_ioam_export.c
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <vnet/vnet.h>
-
-#include <ioam/export/ioam_export_msg_enum.h>
-#define vl_typedefs /* define message structures */
-#include <ioam/export/ioam_export_all_api_h.h>
-#undef vl_typedefs
-
-#define vl_endianfun
-#include <ioam/export/ioam_export_all_api_h.h>
-#undef vl_endianfun
-
-#define vl_print(handle, ...)
-#define vl_printfun
-#include <ioam/export/ioam_export_all_api_h.h>
-#undef vl_printfun
-
-/* Get the API version number */
-#define vl_api_version(n,v) static u32 api_version=(v);
-#include <ioam/export/ioam_export_all_api_h.h>
-#undef vl_api_version
-
-#include <vnet/api_errno.h>
-#include <vlibapi/api.h>
-#include <vlibmemory/api.h>
-
-#if VPPJNI_DEBUG == 1
- #define DEBUG_LOG(...) clib_warning(__VA_ARGS__)
-#else
- #define DEBUG_LOG(...)
-#endif
-
-#include <jvpp-common/jvpp_common.h>
-
-#include "ioam/jvpp/io_fd_vpp_jvpp_ioamexport_JVppIoamexportImpl.h"
-#include "jvpp_ioam_export.h"
-#include "ioam/jvpp/jvpp_ioam_export_gen.h"
-
-/*
- * Class: io_fd_vpp_jvpp_ioamexport_JVppIoamexportImpl
- * Method: init0
- * Signature: (JI)V
- */
-JNIEXPORT void JNICALL Java_io_fd_vpp_jvpp_ioamexport_JVppIoamexportImpl_init0
- (JNIEnv *env, jclass clazz, jobject callback, jlong queue_address, jint my_client_index) {
- ioamexport_main_t * plugin_main = &ioamexport_main;
- u8 * name;
- clib_warning ("Java_io_fd_vpp_jvpp_ioamexport_JVppIoamexportImpl_init0");
-
- plugin_main->my_client_index = my_client_index;
- plugin_main->vl_input_queue = (unix_shared_memory_queue_t *)queue_address;
-
- name = format (0, "ioam_export_%08x%c", api_version, 0);
- plugin_main->msg_id_base = vl_client_get_first_plugin_msg_id ((char *) name);
-
- if (plugin_main->msg_id_base == (u16) ~0) {
- jclass exClass = (*env)->FindClass(env, "java/lang/IllegalStateException");
- (*env)->ThrowNew(env, exClass, "ioam_export plugin is not loaded in VPP");
- } else {
- plugin_main->callbackObject = (*env)->NewGlobalRef(env, callback);
- plugin_main->callbackClass = (jclass)(*env)->NewGlobalRef(env, (*env)->GetObjectClass(env, callback));
-
- #define _(N,n) \
- vl_msg_api_set_handlers(VL_API_##N + plugin_main->msg_id_base, #n, \
- vl_api_##n##_t_handler, \
- vl_noop_handler, \
- vl_api_##n##_t_endian, \
- vl_api_##n##_t_print, \
- sizeof(vl_api_##n##_t), 1);
- foreach_api_reply_handler;
- #undef _
- }
-}
-
-JNIEXPORT void JNICALL Java_io_fd_vpp_jvpp_ioamexport_JVppIoamexportImpl_close0
-(JNIEnv *env, jclass clazz) {
- ioamexport_main_t * plugin_main = &ioamexport_main;
-
- // cleanup:
- (*env)->DeleteGlobalRef(env, plugin_main->callbackClass);
- (*env)->DeleteGlobalRef(env, plugin_main->callbackObject);
-
- plugin_main->callbackClass = NULL;
- plugin_main->callbackObject = NULL;
-}
-
-/* Attach thread to JVM and cache class references when initiating JVPP iOAM EXPORT */
-jint JNI_OnLoad(JavaVM *vm, void *reserved) {
- JNIEnv* env;
-
- if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_8) != JNI_OK) {
- return JNI_EVERSION;
- }
-
- if (cache_class_references(env) != 0) {
- clib_warning ("Failed to cache class references\n");
- return JNI_ERR;
- }
-
- return JNI_VERSION_1_8;
-}
-
-/* Clean up cached references when disposing JVPP iOAM EXPORT */
-void JNI_OnUnload(JavaVM *vm, void *reserved) {
- JNIEnv* env;
- if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_8) != JNI_OK) {
- return;
- }
- delete_class_references(env);
-}
diff --git a/plugins/ioam-plugin/ioam/export/jvpp_ioam_export.h b/plugins/ioam-plugin/ioam/export/jvpp_ioam_export.h
deleted file mode 100644
index b6c0c16e8fa..00000000000
--- a/plugins/ioam-plugin/ioam/export/jvpp_ioam_export.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef __included_jvpp_ioam_export_h__
-#define __included_jvpp_ioam_export_h__
-
-#include <vnet/vnet.h>
-#include <vnet/ip/ip.h>
-#include <vnet/api_errno.h>
-#include <vlibapi/api.h>
-#include <vlibmemory/api.h>
-#include <jni.h>
-
-/* Global state for JVPP-IOAM-EXPORT */
-typedef struct {
- /* Base message index for the export plugin */
- u16 msg_id_base;
-
- /* Pointer to shared memory queue */
- unix_shared_memory_queue_t * vl_input_queue;
-
- /* VPP api client index */
- u32 my_client_index;
-
- /* Callback object and class references enabling asynchronous Java calls */
- jobject callbackObject;
- jclass callbackClass;
-
-} ioamexport_main_t;
-
-ioamexport_main_t ioamexport_main __attribute__((aligned (64)));
-
-
-#endif /* __included_jvpp_ioam_export_h__ */
diff --git a/plugins/ioam-plugin/ioam/export/node.c b/plugins/ioam-plugin/ioam/export/node.c
deleted file mode 100644
index 19f143dfbf3..00000000000
--- a/plugins/ioam-plugin/ioam/export/node.c
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include <vlib/vlib.h>
-#include <vnet/vnet.h>
-#include <vnet/pg/pg.h>
-#include <vppinfra/error.h>
-#include <vnet/ip/ip.h>
-#include <ioam/export-common/ioam_export.h>
-
-typedef struct
-{
- u32 next_index;
- u32 flow_label;
-} export_trace_t;
-
-/* packet trace format function */
-static u8 *
-format_export_trace (u8 * s, va_list * args)
-{
- CLIB_UNUSED (vlib_main_t * vm) = va_arg (*args, vlib_main_t *);
- CLIB_UNUSED (vlib_node_t * node) = va_arg (*args, vlib_node_t *);
- export_trace_t *t = va_arg (*args, export_trace_t *);
-
- s = format (s, "EXPORT: flow_label %d, next index %d",
- t->flow_label, t->next_index);
- return s;
-}
-
-vlib_node_registration_t export_node;
-
-#define foreach_export_error \
-_(RECORDED, "Packets recorded for export")
-
-typedef enum
-{
-#define _(sym,str) EXPORT_ERROR_##sym,
- foreach_export_error
-#undef _
- EXPORT_N_ERROR,
-} export_error_t;
-
-static char *export_error_strings[] = {
-#define _(sym,string) string,
- foreach_export_error
-#undef _
-};
-
-typedef enum
-{
- EXPORT_NEXT_POP_HBYH,
- EXPORT_N_NEXT,
-} export_next_t;
-
-always_inline void
-copy3cachelines (void *dst, const void *src, size_t n)
-{
-#if 0
- if (PREDICT_FALSE (n < DEFAULT_EXPORT_SIZE))
- {
- /* Copy only the first 1/2 cache lines whatever is available */
- if (n >= 64)
- clib_mov64 ((u8 *) dst, (const u8 *) src);
- if (n >= 128)
- clib_mov64 ((u8 *) dst + 64, (const u8 *) src + 64);
- return;
- }
- clib_mov64 ((u8 *) dst, (const u8 *) src);
- clib_mov64 ((u8 *) dst + 64, (const u8 *) src + 64);
- clib_mov64 ((u8 *) dst + 128, (const u8 *) src + 128);
-#endif
-#if 1
-
- u64 *copy_dst, *copy_src;
- int i;
- copy_dst = (u64 *) dst;
- copy_src = (u64 *) src;
- if (PREDICT_FALSE (n < DEFAULT_EXPORT_SIZE))
- {
- for (i = 0; i < n / 64; i++)
- {
- copy_dst[0] = copy_src[0];
- copy_dst[1] = copy_src[1];
- copy_dst[2] = copy_src[2];
- copy_dst[3] = copy_src[3];
- copy_dst[4] = copy_src[4];
- copy_dst[5] = copy_src[5];
- copy_dst[6] = copy_src[6];
- copy_dst[7] = copy_src[7];
- copy_dst += 8;
- copy_src += 8;
- }
- return;
- }
- for (i = 0; i < 3; i++)
- {
- copy_dst[0] = copy_src[0];
- copy_dst[1] = copy_src[1];
- copy_dst[2] = copy_src[2];
- copy_dst[3] = copy_src[3];
- copy_dst[4] = copy_src[4];
- copy_dst[5] = copy_src[5];
- copy_dst[6] = copy_src[6];
- copy_dst[7] = copy_src[7];
- copy_dst += 8;
- copy_src += 8;
- }
-#endif
-}
-
-static uword
-ip6_export_node_fn (vlib_main_t * vm,
- vlib_node_runtime_t * node, vlib_frame_t * frame)
-{
- ioam_export_main_t *em = &ioam_export_main;
- ioam_export_node_common(em, vm, node, frame, ip6_header_t, payload_length,
- ip_version_traffic_class_and_flow_label,
- EXPORT_NEXT_POP_HBYH);
- return frame->n_vectors;
-}
-
-/*
- * Node for IP6 export
- */
-VLIB_REGISTER_NODE (export_node) =
-{
- .function = ip6_export_node_fn,
- .name = "ip6-export",
- .vector_size = sizeof (u32),
- .format_trace = format_export_trace,
- .type = VLIB_NODE_TYPE_INTERNAL,
- .n_errors = ARRAY_LEN (export_error_strings),
- .error_strings = export_error_strings,
- .n_next_nodes = EXPORT_N_NEXT,
- /* edit / add dispositions here */
- .next_nodes =
- {
- [EXPORT_NEXT_POP_HBYH] = "ip6-pop-hop-by-hop"
- },
-};
diff --git a/plugins/ioam-plugin/ioam/ioam_plugin_doc.md b/plugins/ioam-plugin/ioam/ioam_plugin_doc.md
deleted file mode 100644
index 343abcf73d8..00000000000
--- a/plugins/ioam-plugin/ioam/ioam_plugin_doc.md
+++ /dev/null
@@ -1,464 +0,0 @@
-## VPP Inband OAM (iOAM) {#ioam_plugin_doc}
-
-In-band OAM (iOAM) is an implementation study to record operational
-information in the packet while the packet traverses a path between
-two points in the network.
-
-Overview of iOAM can be found in [iOAM-Devnet] page.
-The following IETF drafts detail the motivation and mechanism for
-recording operational information:
- - [iOAM-ietf-requirements] - Describes motivation and usecases for iOAM
- - [iOAM-ietf-data] - Describes data records that can be collected using iOAM
- - [iOAM-ietf-transport] - Lists out the transport protocols
- and mechanism to carry iOAM data records
- - [iOAM-ietf-proof-of-transit] - Describes the idea of Proof of Transit (POT)
- and mechanisms to operationalize the idea
-
-## Terminology
-In-band OAM is expected to be deployed in a specific domain rather
-than on the overall Internet. The part of the network which employs in-band OAM
-is referred to as **"in-band OAM-domain"**.
-
-In-band OAM data is added to a packet on entering the in-band OAM-domain
-and is removed from the packet when exiting the domain.
-Within the in-band OAM-domain, network nodes that the packet traverses
-may update the in-band OAM data records.
-
-- The node which adds in-band OAM data to the packet is called the
-**"in-band OAM encapsulating node"**.
-
-- The node which removes the in-band OAM data is referred to as the
-**"in-band OAM decapsulating node"**.
-
-- Nodes within the domain which are aware of in-band OAM data and read
-and/or write or process the in-band OAM data are called
-**"in-band OAM transit nodes"**.
-
-## Features supported in the current release
-VPP can function as in-band OAM encapsulating, transit and decapsulating node.
-In this version of VPP in-band OAM data is transported as options in an
-IPv6 hop-by-hop extension header. Hence in-band OAM can be enabled
-for IPv6 traffic.
-
-The following iOAM features are supported:
-
-- **In-band OAM Tracing** : In-band OAM supports multiple data records to be
-recorded in the packet as the packet traverses the network.
-These data records offer insights into the operational behavior of the network.
-The following information can be collected in the tracing
-data from the nodes a packet traverses:
- - Node ID
- - Ingress interface ID
- - Egress interface ID
- - Timestamp
- - Pre-configured application data
-
-- **In-band OAM Proof of Transit (POT)**: Proof of transit iOAM data is
-added to every packet for verifying that a packet traverses a specific
-set of nodes.
-In-band OAM data is updated at every node that is enabled with iOAM
-proof of transit and is used to verify whether a packet traversed
-all the specified nodes. When the verifier receives each packet,
-it can validate whether the packet traversed the specified nodes.
-
-
-## Configuration
-Configuring iOAM involves:
-- Selecting the packets for which iOAM data must be inserted, updated or removed
- - Selection of packets for iOAM data insertion on iOAM encapsulating node.
- Selection of packets is done by 5-tuple based classification
- - Selection of packets for updating iOAM data is implicitly done on the
- presence of iOAM options in the packet
- - Selection of packets for removing the iOAM data is done on 5-tuple
- based classification
-- The kind of data to be collected
- - Tracing data
- - Proof of transit
-- Additional details for processing iOAM data to be collected
- - For trace data - trace type, number of nodes to be recorded in the trace,
- time stamp precision, etc.
- - For POT data - configuration of POT profile required to process the POT data
-
-The CLI for configuring iOAM is explained here followed by detailed steps
-and examples to deploy iOAM on VPP as an encapsulating, transit or
-decapsulating iOAM node in the subsequent sub-sections.
-
-VPP iOAM configuration for enabling trace and POT is as follows:
-
- set ioam rewrite trace-type <0x1f|0x7|0x9|0x11|0x19>
- trace-elts <number of trace elements> trace-tsp <0|1|2|3>
- node-id <node ID in hex> app-data <application data in hex> [pot]
-
-A description of each of the options of the CLI follows:
-- trace-type : An entry in the "Node data List" array of the trace option
-can have different formats, following the needs of the a deployment.
-For example: Some deployments might only be interested
-in recording the node identifiers, whereas others might be interested
-in recording node identifier and timestamp.
-The following types are currently supported:
- - 0x1f : Node data to include hop limit (8 bits), node ID (24 bits),
- ingress and egress interface IDs (16 bits each), timestamp (32 bits),
- application data (32 bits)
- - 0x7 : Node data to include hop limit (8 bits), node ID (24 bits),
- ingress and egress interface IDs (16 bits each)
- - 0x9 : Node data to include hop limit (8 bits), node ID (24 bits),
- timestamp (32 bits)
- - 0x11: Node data to include hop limit (8 bits), node ID (24 bits),
- application data (32 bits)
- - 0x19: Node data to include hop limit (8 bits), node ID (24 bits),
- timestamp (32 bits), application data (32 bits)
-- trace-elts : Defines the length of the node data array in the trace option.
-- trace-tsp : Defines the timestamp precision to use with the enumerated value
- for precision as follows:
- - 0 : 32bits timestamp in seconds
- - 1 : 32bits timestamp in milliseconds
- - 2 : 32bits timestamp in microseconds
- - 3 : 32bits timestamp in nanoseconds
-- node-id : Unique identifier for the node, included in the node ID
- field of the node data in trace option.
-- app-data : The value configured here is included as is in
-application data field of node data in trace option.
-- pot : Enables POT option to be included in the iOAM options.
-
-### Trace configuration
-
-#### On in-band OAM encapsulating node
- - **Configure classifier and apply ACL** to select packets for
- iOAM data insertion
- - Example to enable iOAM data insertion for all the packets
- towards IPv6 address db06::06:
-
- vpp# classify table miss-next node ip6-lookup mask l3 ip6 dst
-
- vpp# classify session acl-hit-next node ip6-add-hop-by-hop
- table-index 0 match l3 ip6 dst db06::06
-
- vpp# set int input acl intfc GigabitEthernet0/0/0 ip6-table 0
-
- - **Enable tracing** : Specify node ID, maximum number of nodes for which
- trace data should be recorded, type of data to be included for recording,
- optionally application data to be included
- - Example to enable tracing with a maximum of 4 nodes recorded
- and the data to be recorded to include - hop limit, node id,
- ingress and egress interface IDs, timestamp (millisecond precision),
- application data (0x1234):
-
-
- vpp# set ioam rewrite trace-type 0x1f trace-elts 4 trace-tsp 1
- node-id 0x1 app-data 0x1234
-
-
-
-#### On in-band OAM transit node
-- The transit node requires trace type, timestamp precision, node ID and
-optionally application data to be configured,
-to update its node data in the trace option.
-
-Example:
-
- vpp# set ioam rewrite trace-type 0x1f trace-elts 4 trace-tsp 1
- node-id 0x2 app-data 0x1234
-
-#### On the In-band OAM decapsulating node
-- The decapsulating node similar to encapsulating node requires
-**classification** of the packets to remove iOAM data from.
- - Example to decapsulate iOAM data for packets towards
- db06::06, configure classifier and enable it as an ACL as follows:
-
-
- vpp# classify table miss-next node ip6-lookup mask l3 ip6 dst
-
- vpp# classify session acl-hit-next node ip6-lookup table-index 0
- match l3 ip6 dst db06::06 opaque-index 100
-
- vpp# set int input acl intfc GigabitEthernet0/0/0 ip6-table 0
-
-
-- Decapsulating node requires trace type, timestamp precision,
-node ID and optionally application data to be configured,
-to update its node data in the trace option before it is decapsulated.
-
-Example:
-
- vpp# set ioam rewrite trace-type 0x1f trace-elts 4
- trace-tsp 1 node-id 0x3 app-data 0x1234
-
-
-### Proof of Transit configuration
-
-For details on proof-of-transit,
-see the IETF draft [iOAM-ietf-proof-of-transit].
-To enable Proof of Transit all the nodes that participate
-and hence are verified for transit need a proof of transit profile.
-A script to generate a proof of transit profile as per the mechanism
-described in [iOAM-ietf-proof-of-transit] will be available at [iOAM-Devnet].
-
-The Proof of transit mechanism implemented here is based on
-Shamir's Secret Sharing algorithm.
-The overall algorithm uses two polynomials
-POLY-1 and POLY-2. The degree of polynomials depends on number of nodes
-to be verified for transit.
-POLY-1 is secret and constant. Each node gets a point on POLY-1
-at setup-time and keeps it secret.
-POLY-2 is public, random and per packet.
-Each node is assigned a point on POLY-1 and POLY-2 with the same x index.
-Each node derives its point on POLY-2 each time a packet arrives at it.
-A node then contributes its points on POLY-1 and POLY-2 to construct
-POLY-3 (POLY-3 = POLY-1 + POLY-2) using lagrange extrapolation and
-forwards it towards the verifier by updating POT data in the packet.
-The verifier constructs POLY-3 from the accumulated value from all the nodes
-and its own points on POLY-1 and POLY-2 and verifies whether
-POLY-3 = POLY-1 + POLY-2. Only the verifier knows POLY-1.
-The solution leverages finite field arithmetic in a field of size "prime number"
-for reasons explained in description of Shamir's secret sharing algorithm.
-
-Here is an explanation of POT profile list and profile configuration CLI to
-realize the above mechanism.
-It is best to use the script provided at [iOAM-Devnet] to generate
-this configuration.
-- **Create POT profile** : set pot profile name <string> id [0-1]
-[validator-key 0xu64] prime-number 0xu64 secret_share 0xu64
-lpc 0xu64 polynomial2 0xu64 bits-in-random [0-64]
- - name : Profile list name.
- - id : Profile id, it can be 0 or 1.
- A maximum of two profiles can be configured per profile list.
- - validator-key : Secret key configured only on the
- verifier/decapsulating node used to compare and verify proof of transit.
- - prime-number : Prime number for finite field arithmetic as required by the
- proof of transit mechanism.
- - secret_share : Unique point for each node on the secret polynomial POLY-1.
- - lpc : Lagrange Polynomial Constant(LPC) calculated per node based on
- its point (x value used for evaluating the points on the polynomial)
- on the polynomial used in lagrange extrapolation
- for reconstructing polynomial (POLY-3).
- - polynomial2 : Is the pre-evaluated value of the point on
- 2nd polynomial(POLY-2). This is unique for each node.
- It is pre-evaluated for all the coefficients of POLY-2 except
- for the constant part of the polynomial that changes per packet
- and is received as part of the POT data in the packet.
- - bits-in-random : To control the size of the random number to be
- generated. This number has to match the other numbers generated and used
- in the profile as per the algorithm.
-
-- **Set a configured profile as active/in-use** :
-set pot profile-active name <string> ID [0-1]
- - name : Name of the profile list to be used for computing
- POT data per packet.
- - ID : Identifier of the profile within the list to be used.
-
-#### On In-band OAM encapsulating node
- - Configure the classifier and apply ACL to select packets for iOAM data insertion.
- - Example to enable iOAM data insertion for all the packet towards
- IPv6 address db06::06 -
-
-
- vpp# classify table miss-next node ip6-lookup mask l3 ip6 dst
-
- vpp# classify session acl-hit-next node
- ip6-add-hop-by-hop table-index 0 match l3 ip6 dst db06::06
-
- vpp# set int input acl intfc GigabitEthernet0/0/0 ip6-table 0
-
-
- - Configure the proof of transit profile list with profiles.
-Each profile list referred to by a name can contain 2 profiles,
-only one is in use for updating proof of transit data at any time.
- - Example profile list example with a profile generated from the
- script to verify transit through 3 nodes is:
-
-
- vpp# set pot profile name example id 0 prime-number 0x7fff0000fa884685
- secret_share 0x6c22eff0f45ec56d lpc 0x7fff0000fa884682
- polynomial2 0xffb543d4a9c bits-in-random 63
-
- - Enable one of the profiles from the configured profile list as active
- so that is will be used for calculating proof of transit
-
-Example enable profile ID 0 from profile list example configured above:
-
-
- vpp# set pot profile-active name example ID 0
-
-
- - Enable POT option to be inserted
-
-
- vpp# set ioam rewrite pot
-
-
-#### On in-band OAM transit node
- - Configure the proof of transit profile list with profiles for transit node.
-Example:
-
-
- vpp# set pot profile name example id 0 prime-number 0x7fff0000fa884685
- secret_share 0x564cdbdec4eb625d lpc 0x1
- polynomial2 0x23f3a227186a bits-in-random 63
-
-#### On in-band OAM decapsulating node / verifier
-- The decapsulating node, similar to the encapsulating node requires
-classification of the packets to remove iOAM data from.
- - Example to decapsulate iOAM data for packets towards db06::06
- configure classifier and enable it as an ACL as follows:
-
-
- vpp# classify table miss-next node ip6-lookup mask l3 ip6 dst
-
- vpp# classify session acl-hit-next node ip6-lookup table-index 0
- match l3 ip6 dst db06::06 opaque-index 100
-
- vpp# set int input acl intfc GigabitEthernet0/0/0 ip6-table 0
-
-- To update and verify the proof of transit, POT profile list should be configured.
- - Example POT profile list configured as follows:
-
- vpp# set pot profile name example id 0 validate-key 0x7fff0000fa88465d
- prime-number 0x7fff0000fa884685 secret_share 0x7a08fbfc5b93116d lpc 0x3
- polynomial2 0x3ff738597ce bits-in-random 63
-
-## Operational data
-
-Following CLIs are available to check iOAM operation:
-- To check iOAM configuration that are effective use "show ioam summary"
-
-Example:
-
- vpp# show ioam summary
- REWRITE FLOW CONFIGS - Not configured
- HOP BY HOP OPTIONS - TRACE CONFIG -
- Trace Type : 0x1f (31)
- Trace timestamp precision : 1 (Milliseconds)
- Num of trace nodes : 4
- Node-id : 0x2 (2)
- App Data : 0x1234 (4660)
- POT OPTION - 1 (Enabled)
- Try 'show ioam pot and show pot profile' for more information
-
-- To find statistics about packets for which iOAM options were
-added (encapsulating node) and removed (decapsulating node) execute
-*show errors*
-
-Example on encapsulating node:
-
-
- vpp# show error
- Count Node Reason
- 1208804706 ip6-inacl input ACL hits
- 1208804706 ip6-add-hop-by-hop Pkts w/ added ip6 hop-by-hop options
-
-Example on decapsulating node:
-
- vpp# show error
- Count Node Reason
- 69508569 ip6-inacl input ACL hits
- 69508569 ip6-pop-hop-by-hop Pkts w/ removed ip6 hop-by-hop options
-
-- To check the POT profiles use "show pot profile"
-
-Example:
-
- vpp# show pot profile
- Profile list in use : example
- POT Profile at index: 0
- ID : 0
- Validator : False (0)
- Secret share : 0x564cdbdec4eb625d (6218586935324795485)
- Prime number : 0x7fff0000fa884685 (9223090566081300101)
- 2nd polynomial(eval) : 0x23f3a227186a (39529304496234)
- LPC : 0x1 (1)
- Bit mask : 0x7fffffffffffffff (9223372036854775807)
- Profile index in use: 0
- Pkts passed : 0x36 (54)
-
-- To get statistics of POT for packets use "show ioam pot"
-
-Example at encapsulating or transit node:
-
- vpp# show ioam pot
- Pkts with ip6 hop-by-hop POT options - 54
- Pkts with ip6 hop-by-hop POT options but no profile set - 0
- Pkts with POT in Policy - 0
- Pkts with POT out of Policy - 0
-
-
-Example at decapsulating/verification node:
-
-
- vpp# show ioam pot
- Pkts with ip6 hop-by-hop POT options - 54
- Pkts with ip6 hop-by-hop POT options but no profile set - 0
- Pkts with POT in Policy - 54
- Pkts with POT out of Policy - 0
-
-- Tracing - enable trace of IPv6 packets to view the data inserted and
-collected.
-
-Example when the nodes are receiving data over a DPDK interface:
-Enable tracing using "trace add dpdk-input 20" and
-execute "show trace" to view the iOAM data collected:
-
-
- vpp# trace add dpdk-input 20
-
- vpp# show trace
-
- ------------------- Start of thread 0 vpp_main -------------------
-
- Packet 1
-
- 00:00:19:294697: dpdk-input
- GigabitEthernetb/0/0 rx queue 0
- buffer 0x10e6b: current data 0, length 214, free-list 0, totlen-nifb 0, trace 0x0
- PKT MBUF: port 0, nb_segs 1, pkt_len 214
- buf_len 2176, data_len 214, ol_flags 0x0, data_off 128, phys_addr 0xe9a35a00
- packet_type 0x0
- IP6: 00:50:56:9c:df:72 -> 00:50:56:9c:be:55
- IP6_HOP_BY_HOP_OPTIONS: db05::2 -> db06::6
- tos 0x00, flow label 0x0, hop limit 63, payload length 160
- 00:00:19:294737: ethernet-input
- IP6: 00:50:56:9c:df:72 -> 00:50:56:9c:be:55
- 00:00:19:294753: ip6-input
- IP6_HOP_BY_HOP_OPTIONS: db05::2 -> db06::6
- tos 0x00, flow label 0x0, hop limit 63, payload length 160
- 00:00:19:294757: ip6-lookup
- fib 0 adj-idx 15 : indirect via db05::2 flow hash: 0x00000000
- IP6_HOP_BY_HOP_OPTIONS: db05::2 -> db06::6
- tos 0x00, flow label 0x0, hop limit 63, payload length 160
- 00:00:19:294802: ip6-hop-by-hop
- IP6_HOP_BY_HOP: next index 5 len 96 traced 96 Trace Type 0x1f , 1 elts left
- [0] ttl 0x0 node ID 0x0 ingress 0x0 egress 0x0 ts 0x0
- app 0x0
- [1] ttl 0x3e node ID 0x3 ingress 0x1 egress 0x2 ts 0xb68c2213
- app 0x1234
- [2] ttl 0x3f node ID 0x2 ingress 0x1 egress 0x2 ts 0xb68c2204
- app 0x1234
- [3] ttl 0x40 node ID 0x1 ingress 0x5 egress 0x6 ts 0xb68c2200
- app 0x1234
- POT opt present
- random = 0x577a916946071950, Cumulative = 0x10b46e78a35a392d, Index = 0x0
- 00:00:19:294810: ip6-rewrite
- tx_sw_if_index 1 adj-idx 14 : GigabitEthernetb/0/0
- IP6: 00:50:56:9c:be:55 -> 00:50:56:9c:df:72 flow hash: 0x00000000
- IP6: 00:50:56:9c:be:55 -> 00:50:56:9c:df:72
- IP6_HOP_BY_HOP_OPTIONS: db05::2 -> db06::6
- tos 0x00, flow label 0x0, hop limit 62, payload length 160
- 00:00:19:294814: GigabitEthernetb/0/0-output
- GigabitEthernetb/0/0
- IP6: 00:50:56:9c:be:55 -> 00:50:56:9c:df:72
- IP6_HOP_BY_HOP_OPTIONS: db05::2 -> db06::6
- tos 0x00, flow label 0x0, hop limit 62, payload length 160
- 00:00:19:294820: GigabitEthernetb/0/0-tx
- GigabitEthernetb/0/0 tx queue 0
- buffer 0x10e6b: current data 0, length 214, free-list 0, totlen-nifb 0, trace 0x0
- IP6: 00:50:56:9c:be:55 -> 00:50:56:9c:df:72
-
- IP6_HOP_BY_HOP_OPTIONS: db05::2 -> db06::6
-
- tos 0x00, flow label 0x0, hop limit 62, payload length 160
-
-
-[iOAM-Devnet]: <https://github.com/ciscodevnet/iOAM>
-[iOAM-ietf-requirements]:<https://tools.ietf.org/html/draft-brockners-inband-oam-requirements-01>
-[iOAM-ietf-transport]:<https://tools.ietf.org/html/draft-brockners-inband-oam-transport-01>
-[iOAM-ietf-data]:<https://tools.ietf.org/html/draft-brockners-inband-oam-data-01>
-[iOAM-ietf-proof-of-transit]:<https://tools.ietf.org/html/draft-brockners-proof-of-transit-01>
diff --git a/plugins/ioam-plugin/ioam/jvpp/io/fd/vpp/jvpp/ioamexport/test/IoamExportApiTest.java b/plugins/ioam-plugin/ioam/jvpp/io/fd/vpp/jvpp/ioamexport/test/IoamExportApiTest.java
deleted file mode 100644
index cb85f005ff5..00000000000
--- a/plugins/ioam-plugin/ioam/jvpp/io/fd/vpp/jvpp/ioamexport/test/IoamExportApiTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.fd.vpp.jvpp.ioamexport.test;
-
-import java.net.InetAddress;
-
-import io.fd.vpp.jvpp.JVpp;
-import io.fd.vpp.jvpp.JVppRegistry;
-import io.fd.vpp.jvpp.JVppRegistryImpl;
-import io.fd.vpp.jvpp.VppCallbackException;
-import io.fd.vpp.jvpp.ioamexport.JVppIoamexportImpl;
-import io.fd.vpp.jvpp.ioamexport.future.FutureJVppIoamexportFacade;
-import io.fd.vpp.jvpp.ioamexport.dto.IoamExportIp6EnableDisable;
-import io.fd.vpp.jvpp.ioamexport.dto.IoamExportIp6EnableDisableReply;
-
-public class IoamExportApiTest {
-
- public static void main(String[] args) throws Exception {
- ioamExportTestApi();
- }
-
- private static void ioamExportTestApi() throws Exception {
- System.out.println("Testing Java API for ioam export plugin");
- try (final JVppRegistry registry = new JVppRegistryImpl("ioamExportApiTest");
- final JVpp jvpp = new JVppIoamexportImpl()) {
- FutureJVppIoamexportFacade ioamexportJvpp = new FutureJVppIoamexportFacade(registry,jvpp);
- System.out.println("Sending ioam export request...");
- IoamExportIp6EnableDisable request = new IoamExportIp6EnableDisable();
- request.isDisable = 0;
- InetAddress collectorAddress = InetAddress.getByName("2001:0DB8:AC10:FE01:0000:0000:0000:0000");
- InetAddress srcAddress = InetAddress.getByName("2001:0DB8:AC10:FE01:0000:0000:0000:0001");
- request.collectorAddress = collectorAddress.getAddress();
- request.srcAddress = srcAddress.getAddress();
- IoamExportIp6EnableDisableReply reply = ioamexportJvpp.ioamExportIp6EnableDisable(request).toCompletableFuture().get();
- System.out.printf("IoamExportIp6EnableDisableReply = "+reply.toString()+"%n");
-
- Thread.sleep(1000);
-
- System.out.println("Disconnecting...");
- }
- }
-}
diff --git a/plugins/ioam-plugin/ioam/jvpp/io/fd/vpp/jvpp/ioamexport/test/Readme.txt b/plugins/ioam-plugin/ioam/jvpp/io/fd/vpp/jvpp/ioamexport/test/Readme.txt
deleted file mode 100644
index 1b38c285120..00000000000
--- a/plugins/ioam-plugin/ioam/jvpp/io/fd/vpp/jvpp/ioamexport/test/Readme.txt
+++ /dev/null
@@ -1 +0,0 @@
-sudo java -cp build-vpp_debug-native/vpp-api/java/jvpp-registry-17.01.jar:build-vpp_debug-native/plugins/ioam-plugin/jvpp-ioam-export-1.0.jar io.fd.vpp.jvpp.ioamexport.test.IoamExportApiTest
diff --git a/plugins/ioam-plugin/ioam/jvpp/io/fd/vpp/jvpp/ioampot/test/IoamPotApiTest.java b/plugins/ioam-plugin/ioam/jvpp/io/fd/vpp/jvpp/ioampot/test/IoamPotApiTest.java
deleted file mode 100644
index 74eb86a1873..00000000000
--- a/plugins/ioam-plugin/ioam/jvpp/io/fd/vpp/jvpp/ioampot/test/IoamPotApiTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.fd.vpp.jvpp.ioampot.test;
-
-import io.fd.vpp.jvpp.JVpp;
-import io.fd.vpp.jvpp.JVppRegistry;
-import io.fd.vpp.jvpp.JVppRegistryImpl;
-import io.fd.vpp.jvpp.VppCallbackException;
-import io.fd.vpp.jvpp.ioampot.JVppIoampotImpl;
-import io.fd.vpp.jvpp.ioampot.callback.PotProfileAddCallback;
-import io.fd.vpp.jvpp.ioampot.dto.PotProfileAdd;
-import io.fd.vpp.jvpp.ioampot.dto.PotProfileAddReply;
-
-public class IoamPotApiTest {
-
- static class IoamPotTestCallback implements PotProfileAddCallback {
-
- @Override
- public void onPotProfileAddReply(final PotProfileAddReply reply) {
- System.out.printf("Received PotProfileAddReply reply: context=%d%n",
- reply.context);
- }
-
- @Override
- public void onError(VppCallbackException ex) {
- System.out.printf("Received onError exception: call=%s, context=%d, retval=%d%n", ex.getMethodName(),
- ex.getCtxId(), ex.getErrorCode());
- }
- }
-
- public static void main(String[] args) throws Exception {
- ioamPotTestApi();
- }
-
- private static void ioamPotTestApi() throws Exception {
- System.out.println("Testing Java API for ioam pot plugin");
- try (final JVppRegistry registry = new JVppRegistryImpl("ioamPotApiTest");
- final JVpp jvpp = new JVppIoampotImpl()) {
- registry.register(jvpp, new IoamPotTestCallback());
-
- System.out.println("Sending ioam pot profile add request...");
- PotProfileAdd request = new PotProfileAdd();
- request.id = 0;
- request.validator = 4;
- request.secretKey = 1;
- request.secretShare = 2;
- request.prime = 1234;
- request.maxBits = 53;
- request.lpc = 1234;
- request.polynomialPublic = 1234;
- request.listNameLen = (byte)"test pot profile".getBytes().length;
- request.listName = "test pot profile".getBytes();
- final int result = jvpp.send(request);
- System.out.printf("PotProfileAdd send result = %d%n", result);
-
- Thread.sleep(1000);
-
- System.out.println("Disconnecting...");
- }
- }
-}
diff --git a/plugins/ioam-plugin/ioam/jvpp/io/fd/vpp/jvpp/ioampot/test/Readme.txt b/plugins/ioam-plugin/ioam/jvpp/io/fd/vpp/jvpp/ioampot/test/Readme.txt
deleted file mode 100644
index 2323494d31a..00000000000
--- a/plugins/ioam-plugin/ioam/jvpp/io/fd/vpp/jvpp/ioampot/test/Readme.txt
+++ /dev/null
@@ -1 +0,0 @@
-sudo java -cp build-vpp_debug-native/vpp-api/java/jvpp-registry-16.12.jar:build-vpp_debug-native/plugins/ioam-plugin/jvpp-ioam-pot-1.0.jar io.fd.vpp.jvpp.ioampot.test.IoamPotApiTest
diff --git a/plugins/ioam-plugin/ioam/jvpp/io/fd/vpp/jvpp/ioamtrace/test/IoamTraceApiTest.java b/plugins/ioam-plugin/ioam/jvpp/io/fd/vpp/jvpp/ioamtrace/test/IoamTraceApiTest.java
deleted file mode 100644
index bc8c1c3a51c..00000000000
--- a/plugins/ioam-plugin/ioam/jvpp/io/fd/vpp/jvpp/ioamtrace/test/IoamTraceApiTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.fd.vpp.jvpp.ioamtrace.test;
-
-import io.fd.vpp.jvpp.JVpp;
-import io.fd.vpp.jvpp.JVppRegistry;
-import io.fd.vpp.jvpp.JVppRegistryImpl;
-import io.fd.vpp.jvpp.VppCallbackException;
-import io.fd.vpp.jvpp.ioamtrace.future.FutureJVppIoamtraceFacade;
-import io.fd.vpp.jvpp.ioamtrace.JVppIoamtraceImpl;
-import io.fd.vpp.jvpp.ioamtrace.callback.TraceProfileAddCallback;
-import io.fd.vpp.jvpp.ioamtrace.dto.TraceProfileAdd;
-import io.fd.vpp.jvpp.ioamtrace.dto.TraceProfileAddReply;
-import io.fd.vpp.jvpp.ioamtrace.dto.TraceProfileShowConfig;
-import io.fd.vpp.jvpp.ioamtrace.dto.TraceProfileShowConfigReply;
-
-public class IoamTraceApiTest {
-
- static class IoamTraceTestCallback implements TraceProfileAddCallback {
-
- @Override
- public void onTraceProfileAddReply(final TraceProfileAddReply reply) {
- System.out.printf("Received TraceProfileAddReply reply: context=%d%n",
- reply.context);
- }
-
- @Override
- public void onError(VppCallbackException ex) {
- System.out.printf("Received onError exception: call=%s, context=%d, retval=%d%n", ex.getMethodName(),
- ex.getCtxId(), ex.getErrorCode());
- }
- }
-
- public static void main(String[] args) throws Exception {
- ioamTraceTestApi();
- }
-
- private static void ioamTraceTestApi() throws Exception {
- System.out.println("Testing Java API for ioam trace plugin");
- try (final JVppRegistry registry = new JVppRegistryImpl("ioamTraceApiTest");
- final JVpp jvpp = new JVppIoamtraceImpl()) {
- FutureJVppIoamtraceFacade ioamtraceJvpp = new FutureJVppIoamtraceFacade(registry,jvpp);
-
- System.out.println("Sending ioam trace profile add request...");
- TraceProfileAdd request = new TraceProfileAdd();
- request.traceType = 0x1f;
- request.numElts = 4;
- request.nodeId = 1;
- request.traceTsp = 2;
- request.appData = 1234;
- final int result = jvpp.send(request);
- System.out.printf("TraceProfileAdd send result = %d%n", result);
-
- Thread.sleep(1000);
-
- TraceProfileShowConfig showRequest = new TraceProfileShowConfig();
- TraceProfileShowConfigReply reply = ioamtraceJvpp.traceProfileShowConfig(showRequest).toCompletableFuture().get();
- System.out.printf("TraceProfileShowConfig result = "+ reply.toString());
-
- System.out.println("Disconnecting...");
- }
- }
-}
diff --git a/plugins/ioam-plugin/ioam/jvpp/io/fd/vpp/jvpp/ioamtrace/test/Readme.txt b/plugins/ioam-plugin/ioam/jvpp/io/fd/vpp/jvpp/ioamtrace/test/Readme.txt
deleted file mode 100644
index 17e45a81e66..00000000000
--- a/plugins/ioam-plugin/ioam/jvpp/io/fd/vpp/jvpp/ioamtrace/test/Readme.txt
+++ /dev/null
@@ -1 +0,0 @@
-sudo java -cp build-vpp-native/vpp-api/java/jvpp-registry-17.01.jar:build-vpp-native/plugins/ioam-plugin/jvpp-ioam-trace-1.0.jar io.fd.vpp.jvpp.ioamtrace.test.IoamTraceApiTest
diff --git a/plugins/ioam-plugin/ioam/lib-pot/jvpp_ioam_pot.c b/plugins/ioam-plugin/ioam/lib-pot/jvpp_ioam_pot.c
deleted file mode 100644
index a60ae60f4fa..00000000000
--- a/plugins/ioam-plugin/ioam/lib-pot/jvpp_ioam_pot.c
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <vnet/vnet.h>
-
-#include <ioam/lib-pot/pot_msg_enum.h>
-#define vl_typedefs /* define message structures */
-#include <ioam/lib-pot/pot_all_api_h.h>
-#undef vl_typedefs
-
-#define vl_endianfun
-#include <ioam/lib-pot/pot_all_api_h.h>
-#undef vl_endianfun
-
-#define vl_print(handle, ...)
-#define vl_printfun
-#include <ioam/lib-pot/pot_all_api_h.h>
-#undef vl_printfun
-
-/* Get the API version number */
-#define vl_api_version(n,v) static u32 api_version=(v);
-#include <ioam/lib-pot/pot_all_api_h.h>
-#undef vl_api_version
-
-#include <vnet/api_errno.h>
-#include <vlibapi/api.h>
-#include <vlibmemory/api.h>
-
-#if VPPJNI_DEBUG == 1
- #define DEBUG_LOG(...) clib_warning(__VA_ARGS__)
-#else
- #define DEBUG_LOG(...)
-#endif
-
-#include <jvpp-common/jvpp_common.h>
-
-#include "ioam/jvpp/io_fd_vpp_jvpp_ioampot_JVppIoampotImpl.h"
-#include "jvpp_ioam_pot.h"
-#include "ioam/jvpp/jvpp_ioam_pot_gen.h"
-
-/*
- * Class: io_fd_vpp_jvpp_ioampot_JVppIoampotImpl
- * Method: init0
- * Signature: (JI)V
- */
-JNIEXPORT void JNICALL Java_io_fd_vpp_jvpp_ioampot_JVppIoampotImpl_init0
- (JNIEnv *env, jclass clazz, jobject callback, jlong queue_address, jint my_client_index) {
- ioampot_main_t * plugin_main = &ioampot_main;
- u8 * name;
- clib_warning ("Java_io_fd_vpp_jvpp_ioampot_JVppIoampotImpl_init0");
-
- plugin_main->my_client_index = my_client_index;
- plugin_main->vl_input_queue = (unix_shared_memory_queue_t *)queue_address;
-
- name = format (0, "ioam_pot_%08x%c", api_version, 0);
- plugin_main->msg_id_base = vl_client_get_first_plugin_msg_id ((char *) name);
-
- if (plugin_main->msg_id_base == (u16) ~0) {
- jclass exClass = (*env)->FindClass(env, "java/lang/IllegalStateException");
- (*env)->ThrowNew(env, exClass, "ioam_pot plugin is not loaded in VPP");
- } else {
- plugin_main->callbackObject = (*env)->NewGlobalRef(env, callback);
- plugin_main->callbackClass = (jclass)(*env)->NewGlobalRef(env, (*env)->GetObjectClass(env, callback));
-
- #define _(N,n) \
- vl_msg_api_set_handlers(VL_API_##N + plugin_main->msg_id_base, #n, \
- vl_api_##n##_t_handler, \
- vl_noop_handler, \
- vl_api_##n##_t_endian, \
- vl_api_##n##_t_print, \
- sizeof(vl_api_##n##_t), 1);
- foreach_api_reply_handler;
- #undef _
- }
-}
-
-JNIEXPORT void JNICALL Java_io_fd_vpp_jvpp_ioampot_JVppIoampotImpl_close0
-(JNIEnv *env, jclass clazz) {
- ioampot_main_t * plugin_main = &ioampot_main;
-
- // cleanup:
- (*env)->DeleteGlobalRef(env, plugin_main->callbackClass);
- (*env)->DeleteGlobalRef(env, plugin_main->callbackObject);
-
- plugin_main->callbackClass = NULL;
- plugin_main->callbackObject = NULL;
-}
-
-/* Attach thread to JVM and cache class references when initiating JVPP iOAM POT */
-jint JNI_OnLoad(JavaVM *vm, void *reserved) {
- JNIEnv* env;
-
- if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_8) != JNI_OK) {
- return JNI_EVERSION;
- }
-
- if (cache_class_references(env) != 0) {
- clib_warning ("Failed to cache class references\n");
- return JNI_ERR;
- }
-
- return JNI_VERSION_1_8;
-}
-
-/* Clean up cached references when disposing JVPP iOAM POT */
-void JNI_OnUnload(JavaVM *vm, void *reserved) {
- JNIEnv* env;
- if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_8) != JNI_OK) {
- return;
- }
- delete_class_references(env);
-}
diff --git a/plugins/ioam-plugin/ioam/lib-pot/jvpp_ioam_pot.h b/plugins/ioam-plugin/ioam/lib-pot/jvpp_ioam_pot.h
deleted file mode 100644
index 00aa51db5ad..00000000000
--- a/plugins/ioam-plugin/ioam/lib-pot/jvpp_ioam_pot.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef __included_jvpp_ioam_pot_h__
-#define __included_jvpp_ioam_pot_h__
-
-#include <vnet/vnet.h>
-#include <vnet/ip/ip.h>
-#include <vnet/api_errno.h>
-#include <vlibapi/api.h>
-#include <vlibmemory/api.h>
-#include <jni.h>
-
-/* Global state for JVPP-IOAM-POT */
-typedef struct {
- /* Base message index for the pot plugin */
- u16 msg_id_base;
-
- /* Pointer to shared memory queue */
- unix_shared_memory_queue_t * vl_input_queue;
-
- /* VPP api client index */
- u32 my_client_index;
-
- /* Callback object and class references enabling asynchronous Java calls */
- jobject callbackObject;
- jclass callbackClass;
-
-} ioampot_main_t;
-
-ioampot_main_t ioampot_main __attribute__((aligned (64)));
-
-
-#endif /* __included_jvpp_ioam_pot_h__ */
diff --git a/plugins/ioam-plugin/ioam/lib-pot/math64.h b/plugins/ioam-plugin/ioam/lib-pot/math64.h
deleted file mode 100644
index 4c608a37de4..00000000000
--- a/plugins/ioam-plugin/ioam/lib-pot/math64.h
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * math64.h provides the 64 bit unsigned integer add, multiply followed by modulo operation
- * The linux/math64.h provides divide and multiply 64 bit integers but:
- * 1. multiply: mul_u64_u64_shr - only returns 64 bits of the result and has to be called
- * twice to get the complete 128 bits of the result.
- * 2. Modulo operation of the result of addition and multiplication of u64 that may result
- * in integers > 64 bits is not supported
- * Hence this header to combine add/multiply followed by modulo of u64 integrers
- * always resulting in u64.
- *
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef include_vnet_math64_h
-#define include_vnet_math64_h
-#include <stdint.h>
-
-/*
- * multiplies and returns result in hi and lo
- */
-static inline void mul64by64(u64 a, u64 b, u64 * hi, u64 * lo)
-{
- u64 a_lo = (u64) (uint32_t) a;
- u64 a_hi = a >> 32;
- u64 b_lo = (u64) (u32) b;
- u64 b_hi = b >> 32;
-
- u64 p0 = a_lo * b_lo;
- u64 p1 = a_lo * b_hi;
- u64 p2 = a_hi * b_lo;
- u64 p3 = a_hi * b_hi;
-
- u32 cy = (u32) (((p0 >> 32) + (u32) p1 + (u32) p2) >> 32);
-
- *lo = p0 + (p1 << 32) + (p2 << 32);
- *hi = p3 + (p1 >> 32) + (p2 >> 32) + cy;
- return;
-}
-
-#define TWO64 18446744073709551616.0
-
-static inline u64 mod128by64(u64 x, u64 y, u64 m, double di)
-{
- u64 q1, q2, q;
- u64 p1, p0;
- double dq;
-
- /* calculate quotient first pass 53 bits */
- dq = (TWO64 * (double)x + (double)y) * di;
-
- if (dq >= TWO64)
- q1 = 0xfffffffffffff800L;
- else
- q1 = dq;
-
- /* q1 * m to compare the product to the dividend. */
- mul64by64(q1, m, &p1, &p0);
-
- /* Adjust quotient. is it > actual result: */
- if (x < p1 || (x == p1 && y < p0))
- {
- /* q1 > quotient. calculate abs remainder */
- x = p1 - (x + (p0 < y));
- y = p0 - y;
-
- /* use the remainder as new dividend to adjust quotient */
- q2 = (u64) ((TWO64 * (double)x + (double)y) * di);
- mul64by64(q2, m, &p1, &p0);
-
- q = q1 - q2;
- if (x < p1 || (x == p1 && y <= p0))
- {
- y = p0 - y;
- }
- else
- {
- y = p0 - y;
- y += m;
- q--;
- }
- }
- else
- {
- x = x - (p1 + (y < p0));
- y = y - p0;
-
- q2 = (u64) ((TWO64 * (double)x + (double)y) * di);
- mul64by64(q2, m, &p1, &p0);
-
- q = q1 + q2;
- if (x < p1 || (x == p1 && y < p0))
- {
- y = y - p0;
- y += m;
- q--;
- }
- else
- {
- y = y - p0;
- if (y >= m)
- {
- y -= m;
- q++;
- }
- }
- }
-
- return y;
-}
-
-/*
- * returns a % p
- */
-static inline u64 mod64by64(u64 a, u64 p, u64 primeinv)
-{
- return (mod128by64(0, a, p, primeinv));
-}
-
-static inline void add64(u64 a, u64 b, u64 * whi, u64 * wlo)
-{
- *wlo = a + b;
- if (*wlo < a)
- *whi = 1;
-
-}
-
-/*
- * returns (a + b)%p
- */
-static inline u64 add64_mod(u64 a, u64 b, u64 p, double pi)
-{
- u64 shi = 0, slo = 0;
-
- add64(a, b, &shi, &slo);
- return (mod128by64(shi, slo, p, pi));
-}
-
-/*
- * returns (ab) % p
- */
-static inline u64 mul64_mod(u64 a, u64 b, u64 p, double pi)
-{
- u64 phi = 0, plo = 0;
-
- mul64by64(a, b, &phi, &plo);
- return (mod128by64(phi, plo, p, pi));
-}
-
-#endif
diff --git a/plugins/ioam-plugin/ioam/lib-pot/pot.api b/plugins/ioam-plugin/ioam/lib-pot/pot.api
deleted file mode 100644
index fa2fc126b7e..00000000000
--- a/plugins/ioam-plugin/ioam/lib-pot/pot.api
+++ /dev/null
@@ -1,133 +0,0 @@
-/* Hey Emacs use -*- mode: C -*- */
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-/** \brief Proof of Transit(POT): Set POT profile
- @param id - id of the profile
- @param validator - True/False to indicate if this is verifier
- @param secret_key - Verification key
- @param secret_share - Share of the 1st polynomial
- @param prime - Prime number used for modulo operation
- @param max_bits - Max bits to be used for Random number generation
- @param lpc - Lagrange basis polynomial
- @param polynomial_public - pre-evaluated public polynomial
- @param list_name_len - length of the name of this profile list
- @param list_name - name of this profile list
-*/
-define pot_profile_add {
- u32 client_index;
- u32 context;
- u8 id;
- u8 validator;
- u64 secret_key;
- u64 secret_share;
- u64 prime;
- u8 max_bits;
- u64 lpc;
- u64 polynomial_public;
- u8 list_name_len;
- u8 list_name[0];
-};
-
-/** \brief Proof of Transit profile add / del response
- @param context - sender context, to match reply w/ request
- @param retval - return value for request
-*/
-define pot_profile_add_reply {
- u32 context;
- i32 retval;
-};
-
-
-/** \brief Proof of Transit(POT): Activate POT profile in the list
- @param id - id of the profile
- @param list_name_len - length of the name of this profile list
- @param list_name - name of this profile list
-*/
-define pot_profile_activate {
- u32 client_index;
- u32 context;
- u8 id;
- u8 list_name_len;
- u8 list_name[0];
-};
-
-/** \brief Proof of Transit profile activate response
- @param context - sender context, to match reply w/ request
- @param retval - return value for request
-*/
-define pot_profile_activate_reply {
- u32 context;
- i32 retval;
-};
-
-/** \brief Delete POT Profile
- @param client_index - opaque cookie to identify the sender
- @param context - sender context, to match reply w/ request
- @param list_name_len - length of the name of the profile list
- @param list_name - name of profile list to delete
-*/
-define pot_profile_del {
- u32 client_index;
- u32 context;
- u8 list_name_len;
- u8 list_name[0];
-};
-
-/** \brief Proof of Transit profile add / del response
- @param context - sender context, to match reply w/ request
- @param retval - return value for request
-*/
-define pot_profile_del_reply {
- u32 context;
- i32 retval;
-};
-
-/** \brief Show POT Profiles
- @param client_index - opaque cookie to identify the sender
- @param context - sender context, to match reply w/ request
- @param id - id of the profile
-*/
-define pot_profile_show_config_dump {
- u32 client_index;
- u32 context;
- u8 id;
-};
-
-/** \brief Show POT profile reply
- @param id - id of the profile
- @param validator - True/False to indicate if this is verifier
- @param secret_key - Verification key
- @param secret_share - Share of the 1st polynomial
- @param prime - Prime number used for modulo operation
- @param max_bits - Max bits to be used for Random number generation
- @param lpc - Lagrange basis polynomial
- @param polynomial_public - pre-evaluated public polynomial
- @param list_name_len - length of the name of this profile list
- @param list_name - name of this profile list
-*/
-define pot_profile_show_config_details {
- u32 context;
- i32 retval;
- u8 id;
- u8 validator;
- u64 secret_key;
- u64 secret_share;
- u64 prime;
- u64 bit_mask;
- u64 lpc;
- u64 polynomial_public;
-};
diff --git a/plugins/ioam-plugin/ioam/lib-pot/pot_all_api_h.h b/plugins/ioam-plugin/ioam/lib-pot/pot_all_api_h.h
deleted file mode 100644
index 63967c45444..00000000000
--- a/plugins/ioam-plugin/ioam/lib-pot/pot_all_api_h.h
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/* Include the generated file, see BUILT_SOURCES in Makefile.am */
-#include <ioam/lib-pot/pot.api.h>
diff --git a/plugins/ioam-plugin/ioam/lib-pot/pot_api.c b/plugins/ioam-plugin/ioam/lib-pot/pot_api.c
deleted file mode 100644
index d3af7b4036a..00000000000
--- a/plugins/ioam-plugin/ioam/lib-pot/pot_api.c
+++ /dev/null
@@ -1,292 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- *------------------------------------------------------------------
- * pot_api.c - Proof of Transit related APIs to create
- * and maintain profiles
- *------------------------------------------------------------------
- */
-
-#include <vnet/vnet.h>
-#include <vnet/plugin/plugin.h>
-#include <ioam/lib-pot/pot_util.h>
-
-#include <vlibapi/api.h>
-#include <vlibmemory/api.h>
-#include <vlibsocket/api.h>
-
-/* define message IDs */
-#include <ioam/lib-pot/pot_msg_enum.h>
-
-/* define message structures */
-#define vl_typedefs
-#include <ioam/lib-pot/pot_all_api_h.h>
-#undef vl_typedefs
-
-/* define generated endian-swappers */
-#define vl_endianfun
-#include <ioam/lib-pot/pot_all_api_h.h>
-#undef vl_endianfun
-
-/* instantiate all the print functions we know about */
-#define vl_print(handle, ...) vlib_cli_output (handle, __VA_ARGS__)
-#define vl_printfun
-#include <ioam/lib-pot/pot_all_api_h.h>
-#undef vl_printfun
-
-/* Get the API version number */
-#define vl_api_version(n,v) static u32 api_version=(v);
-#include <ioam/lib-pot/pot_all_api_h.h>
-#undef vl_api_version
-
-/*
- * A handy macro to set up a message reply.
- * Assumes that the following variables are available:
- * mp - pointer to request message
- * rmp - pointer to reply message type
- * rv - return value
- */
-
-#define REPLY_MACRO(t) \
-do { \
- unix_shared_memory_queue_t * q = \
- vl_api_client_index_to_input_queue (mp->client_index); \
- if (!q) \
- return; \
- \
- rmp = vl_msg_api_alloc (sizeof (*rmp)); \
- rmp->_vl_msg_id = ntohs((t)+sm->msg_id_base); \
- rmp->context = mp->context; \
- rmp->retval = ntohl(rv); \
- \
- vl_msg_api_send_shmem (q, (u8 *)&rmp); \
-} while(0);
-
-#define REPLY_MACRO2(t, body) \
-do { \
- unix_shared_memory_queue_t * q; \
- rv = vl_msg_api_pd_handler (mp, rv); \
- q = vl_api_client_index_to_input_queue (mp->client_index); \
- if (!q) \
- return; \
- \
- rmp = vl_msg_api_alloc (sizeof (*rmp)); \
- rmp->_vl_msg_id = ntohs((t)+sm->msg_id_base); \
- rmp->context = mp->context; \
- rmp->retval = ntohl(rv); \
- do {body;} while (0); \
- vl_msg_api_send_shmem (q, (u8 *)&rmp); \
-} while(0);
-
-/* List of message types that this plugin understands */
-
-#define foreach_pot_plugin_api_msg \
-_(POT_PROFILE_ADD, pot_profile_add) \
-_(POT_PROFILE_ACTIVATE, pot_profile_activate) \
-_(POT_PROFILE_DEL, pot_profile_del) \
-_(POT_PROFILE_SHOW_CONFIG_DUMP, pot_profile_show_config_dump) \
-
-static void vl_api_pot_profile_add_t_handler
-(vl_api_pot_profile_add_t *mp)
-{
- pot_main_t * sm = &pot_main;
- int rv = 0;
- vl_api_pot_profile_add_reply_t * rmp;
- u8 id;
- pot_profile *profile = NULL;
- u8 *name = 0;
-
- if (mp->list_name_len)
- name = format(0, "%s", mp->list_name);
-
- pot_profile_list_init(name);
- id = mp->id;
- profile = pot_profile_find(id);
- if (profile) {
- rv = pot_profile_create(profile,
- clib_net_to_host_u64(mp->prime),
- clib_net_to_host_u64(mp->polynomial_public),
- clib_net_to_host_u64(mp->lpc),
- clib_net_to_host_u64(mp->secret_share));
- if (rv != 0)
- goto ERROROUT;
- if (1 == mp->validator)
- (void)pot_set_validator(profile, clib_net_to_host_u64(mp->secret_key));
- (void)pot_profile_set_bit_mask(profile, mp->max_bits);
- } else {
- rv = -3;
- }
- ERROROUT:
- vec_free(name);
- REPLY_MACRO(VL_API_POT_PROFILE_ADD_REPLY);
-}
-
-static void send_pot_profile_details(vl_api_pot_profile_show_config_dump_t *mp, u8 id)
-{
- vl_api_pot_profile_show_config_details_t * rmp;
- pot_main_t * sm = &pot_main;
- pot_profile *profile = pot_profile_find(id);
- int rv = 0;
- if(profile){
- REPLY_MACRO2(VL_API_POT_PROFILE_SHOW_CONFIG_DETAILS,
- rmp->id=id;
- rmp->validator=profile->validator;
- rmp->secret_key=clib_host_to_net_u64(profile->secret_key);
- rmp->secret_share=clib_host_to_net_u64(profile->secret_share);
- rmp->prime=clib_host_to_net_u64(profile->prime);
- rmp->bit_mask=clib_host_to_net_u64(profile->bit_mask);
- rmp->lpc=clib_host_to_net_u64(profile->lpc);
- rmp->polynomial_public=clib_host_to_net_u64(profile->poly_pre_eval);
- );
- }
- else{
- REPLY_MACRO2(VL_API_POT_PROFILE_SHOW_CONFIG_DETAILS,
- rmp->id=id;
- rmp->validator=0;
- rmp->secret_key=0;
- rmp->secret_share=0;
- rmp->prime=0;
- rmp->bit_mask=0;
- rmp->lpc=0;
- rmp->polynomial_public=0;
- );
- }
-}
-
-static void vl_api_pot_profile_show_config_dump_t_handler
-(vl_api_pot_profile_show_config_dump_t *mp)
-{
- u8 id = mp->id;
- u8 dump_call_id = ~0;
- if(dump_call_id==id){
- for(id=0;id<MAX_POT_PROFILES;id++)
- send_pot_profile_details(mp,id);
- }
- else
- send_pot_profile_details(mp,id);
-}
-
-static void vl_api_pot_profile_activate_t_handler
-(vl_api_pot_profile_activate_t *mp)
-{
- pot_main_t * sm = &pot_main;
- int rv = 0;
- vl_api_pot_profile_add_reply_t * rmp;
- u8 id;
- u8 *name = NULL;
-
- if (mp->list_name_len)
- name = format(0, "%s", mp->list_name);
- if (!pot_profile_list_is_enabled(name)) {
- rv = -1;
- } else {
- id = mp->id;
- rv = pot_profile_set_active(id);
- }
-
- vec_free(name);
- REPLY_MACRO(VL_API_POT_PROFILE_ACTIVATE_REPLY);
-}
-
-
-static void vl_api_pot_profile_del_t_handler
-(vl_api_pot_profile_del_t *mp)
-{
- pot_main_t * sm = &pot_main;
- int rv = 0;
- vl_api_pot_profile_del_reply_t * rmp;
-
- clear_pot_profiles();
-
- REPLY_MACRO(VL_API_POT_PROFILE_DEL_REPLY);
-}
-
-
-/*
- * This routine exists to convince the vlib plugin framework that
- * we haven't accidentally copied a random .dll into the plugin directory.
- *
- * Also collects global variable pointers passed from the vpp engine
- */
-
-clib_error_t *
-vlib_plugin_register (vlib_main_t * vm, vnet_plugin_handoff_t * h,
- int from_early_init)
-{
- pot_main_t * sm = &pot_main;
- clib_error_t * error = 0;
-
- sm->vlib_main = vm;
- sm->vnet_main = h->vnet_main;
- return error;
-}
-
-/* Set up the API message handling tables */
-static clib_error_t *
-pot_plugin_api_hookup (vlib_main_t *vm)
-{
- pot_main_t * sm = &pot_main;
-#define _(N,n) \
- vl_msg_api_set_handlers((VL_API_##N + sm->msg_id_base), \
- #n, \
- vl_api_##n##_t_handler, \
- vl_noop_handler, \
- vl_api_##n##_t_endian, \
- vl_api_##n##_t_print, \
- sizeof(vl_api_##n##_t), 1);
- foreach_pot_plugin_api_msg;
-#undef _
-
- return 0;
-}
-
-#define vl_msg_name_crc_list
-#include <ioam/lib-pot/pot_all_api_h.h>
-#undef vl_msg_name_crc_list
-
-static void
-setup_message_id_table (pot_main_t * sm, api_main_t * am)
-{
-#define _(id,n,crc) \
- vl_msg_api_add_msg_name_crc (am, #n "_" #crc, id + sm->msg_id_base);
- foreach_vl_msg_name_crc_pot;
-#undef _
-}
-
-static clib_error_t * pot_init (vlib_main_t * vm)
-{
- pot_main_t * sm = &pot_main;
- clib_error_t * error = 0;
- u8 * name;
-
- bzero(sm, sizeof(pot_main));
- (void)pot_util_init();
- name = format (0, "ioam_pot_%08x%c", api_version, 0);
-
- /* Ask for a correctly-sized block of API message decode slots */
- sm->msg_id_base = vl_msg_api_get_msg_ids
- ((char *) name, VL_MSG_FIRST_AVAILABLE);
-
- error = pot_plugin_api_hookup (vm);
-
- /* Add our API messages to the global name_crc hash table */
- setup_message_id_table (sm, &api_main);
-
- vec_free(name);
-
- return error;
-}
-
-VLIB_INIT_FUNCTION (pot_init);
diff --git a/plugins/ioam-plugin/ioam/lib-pot/pot_msg_enum.h b/plugins/ioam-plugin/ioam/lib-pot/pot_msg_enum.h
deleted file mode 100644
index a4a88bed20f..00000000000
--- a/plugins/ioam-plugin/ioam/lib-pot/pot_msg_enum.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef included_pot_msg_enum_h
-#define included_pot_msg_enum_h
-
-#include <vppinfra/byte_order.h>
-
-#define vl_msg_id(n,h) n,
-typedef enum {
-#include <ioam/lib-pot/pot_all_api_h.h>
- /* We'll want to know how many messages IDs we need... */
- VL_MSG_FIRST_AVAILABLE,
-} vl_msg_id_t;
-#undef vl_msg_id
-
-#endif /* included_pot_msg_enum_h */
diff --git a/plugins/ioam-plugin/ioam/lib-pot/pot_test.c b/plugins/ioam-plugin/ioam/lib-pot/pot_test.c
deleted file mode 100644
index 2e87023896e..00000000000
--- a/plugins/ioam-plugin/ioam/lib-pot/pot_test.c
+++ /dev/null
@@ -1,365 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- *------------------------------------------------------------------
- * pot_test.c - test harness for pot plugin
- *------------------------------------------------------------------
- */
-
-#include <vat/vat.h>
-#include <vlibapi/api.h>
-#include <vlibmemory/api.h>
-#include <vlibsocket/api.h>
-#include <vppinfra/error.h>
-
-/* Declare message IDs */
-#include <ioam/lib-pot/pot_msg_enum.h>
-
-/* define message structures */
-#define vl_typedefs
-#include <ioam/lib-pot/pot_all_api_h.h>
-#undef vl_typedefs
-
-/* declare message handlers for each api */
-
-#define vl_endianfun /* define message structures */
-#include <ioam/lib-pot/pot_all_api_h.h>
-#undef vl_endianfun
-
-/* instantiate all the print functions we know about */
-#define vl_print(handle, ...)
-#define vl_printfun
-#include <ioam/lib-pot/pot_all_api_h.h>
-#undef vl_printfun
-
-/* Get the API version number. */
-#define vl_api_version(n,v) static u32 api_version=(v);
-#include <ioam/lib-pot/pot_all_api_h.h>
-#undef vl_api_version
-
-
-typedef struct {
- /* API message ID base */
- u16 msg_id_base;
- vat_main_t *vat_main;
-} pot_test_main_t;
-
-pot_test_main_t pot_test_main;
-
-#define foreach_standard_reply_retval_handler \
-_(pot_profile_add_reply) \
-_(pot_profile_activate_reply) \
-_(pot_profile_del_reply)
-
-#define foreach_custom_reply_retval_handler \
-_(pot_profile_show_config_details, \
- errmsg(" ID:%d\n",mp->id); \
- errmsg(" Validator:%d\n",mp->validator); \
- errmsg(" secret_key:%Lx\n",clib_net_to_host_u64(mp->secret_key)); \
- errmsg(" secret_share:%Lx\n",clib_net_to_host_u64(mp->secret_share)); \
- errmsg(" prime:%Lx\n",clib_net_to_host_u64(mp->prime)); \
- errmsg(" bitmask:%Lx\n",clib_net_to_host_u64(mp->bit_mask)); \
- errmsg(" lpc:%Lx\n",clib_net_to_host_u64(mp->lpc)); \
- errmsg(" public poly:%Lx\n",clib_net_to_host_u64(mp->polynomial_public)); \
- )
-
-#define _(n) \
- static void vl_api_##n##_t_handler \
- (vl_api_##n##_t * mp) \
- { \
- vat_main_t * vam = pot_test_main.vat_main; \
- i32 retval = ntohl(mp->retval); \
- if (vam->async_mode) { \
- vam->async_errors += (retval < 0); \
- } else { \
- vam->retval = retval; \
- vam->result_ready = 1; \
- } \
- }
-foreach_standard_reply_retval_handler;
-#undef _
-
-#define _(n,body) \
- static void vl_api_##n##_t_handler \
- (vl_api_##n##_t * mp) \
- { \
- vat_main_t * vam = pot_test_main.vat_main; \
- i32 retval = ntohl(mp->retval); \
- if (vam->async_mode) { \
- vam->async_errors += (retval < 0); \
- } else { \
- vam->retval = retval; \
- vam->result_ready = 1; \
- } \
- do{body;}while(0); \
- }
-foreach_custom_reply_retval_handler;
-#undef _
-
-/*
- * Table of message reply handlers, must include boilerplate handlers
- * we just generated
- */
-#define foreach_vpe_api_reply_msg \
-_(POT_PROFILE_ADD_REPLY, pot_profile_add_reply) \
-_(POT_PROFILE_ACTIVATE_REPLY, pot_profile_activate_reply) \
-_(POT_PROFILE_DEL_REPLY, pot_profile_del_reply) \
-_(POT_PROFILE_SHOW_CONFIG_DETAILS, pot_profile_show_config_details)
-
-
-/* M: construct, but don't yet send a message */
-
-#define M(T,t) \
-do { \
- vam->result_ready = 0; \
- mp = vl_msg_api_alloc(sizeof(*mp)); \
- memset (mp, 0, sizeof (*mp)); \
- mp->_vl_msg_id = ntohs (VL_API_##T + sm->msg_id_base); \
- mp->client_index = vam->my_client_index; \
-} while(0);
-
-#define M2(T,t,n) \
-do { \
- vam->result_ready = 0; \
- mp = vl_msg_api_alloc(sizeof(*mp)+(n)); \
- memset (mp, 0, sizeof (*mp)); \
- mp->_vl_msg_id = ntohs (VL_API_##T + sm->msg_id_base); \
- mp->client_index = vam->my_client_index; \
-} while(0);
-
-/* S: send a message */
-#define S (vl_msg_api_send_shmem (vam->vl_input_queue, (u8 *)&mp))
-
-/* W: wait for results, with timeout */
-#define W \
-do { \
- timeout = vat_time_now (vam) + 1.0; \
- \
- while (vat_time_now (vam) < timeout) { \
- if (vam->result_ready == 1) { \
- return (vam->retval); \
- } \
- } \
- return -99; \
-} while(0);
-
-
-static int api_pot_profile_add (vat_main_t *vam)
-{
-#define MAX_BITS 64
- pot_test_main_t * sm = &pot_test_main;
- unformat_input_t *input = vam->input;
- vl_api_pot_profile_add_t *mp;
- u8 *name = NULL;
- u64 prime = 0;
- u64 secret_share = 0;
- u64 secret_key = 0;
- u32 bits = MAX_BITS;
- u64 lpc = 0, poly2 = 0;
- f64 timeout;
- u8 id = 0;
- int rv = 0;
-
- while (unformat_check_input(input) != UNFORMAT_END_OF_INPUT)
- {
- if (unformat(input, "name %s", &name))
- ;
- else if(unformat(input, "id %d", &id))
- ;
- else if (unformat(input, "validator-key 0x%Lx", &secret_key))
- ;
- else if (unformat(input, "prime-number 0x%Lx", &prime))
- ;
- else if (unformat(input, "secret-share 0x%Lx", &secret_share))
- ;
- else if (unformat(input, "polynomial-public 0x%Lx", &poly2))
- ;
- else if (unformat(input, "lpc 0x%Lx", &lpc))
- ;
- else if (unformat(input, "bits-in-random %u", &bits))
- {
- if (bits > MAX_BITS)
- bits = MAX_BITS;
- }
- else
- break;
- }
-
- if (!name)
- {
- errmsg ("name required\n");
- rv = -99;
- goto OUT;
- }
-
- M2(POT_PROFILE_ADD, pot_profile_add, vec_len(name));
-
- mp->list_name_len = vec_len(name);
- clib_memcpy(mp->list_name, name, mp->list_name_len);
- mp->secret_share = clib_host_to_net_u64(secret_share);
- mp->polynomial_public = clib_host_to_net_u64(poly2);
- mp->lpc = clib_host_to_net_u64(lpc);
- mp->prime = clib_host_to_net_u64(prime);
- if (secret_key != 0)
- {
- mp->secret_key = clib_host_to_net_u64(secret_key);
- mp->validator = 1;
- }
- else
- {
- mp->validator = 0;
- }
- mp->id = id;
- mp->max_bits = bits;
-
- S; W;
-
-OUT:
- vec_free(name);
- return(rv);
-}
-
-static int api_pot_profile_activate (vat_main_t *vam)
-{
-#define MAX_BITS 64
- pot_test_main_t * sm = &pot_test_main;
- unformat_input_t *input = vam->input;
- vl_api_pot_profile_activate_t *mp;
- u8 *name = NULL;
- u8 id = 0;
- int rv = 0;
- f64 timeout;
-
- while (unformat_check_input(input) != UNFORMAT_END_OF_INPUT)
- {
- if (unformat(input, "name %s", &name))
- ;
- else if(unformat(input, "id %d", &id))
- ;
- else
- break;
- }
-
- if (!name)
- {
- errmsg ("name required\n");
- rv = -99;
- goto OUT;
- }
-
- M2(POT_PROFILE_ACTIVATE, pot_profile_activate, vec_len(name));
-
- mp->list_name_len = vec_len(name);
- clib_memcpy(mp->list_name, name, mp->list_name_len);
- mp->id = id;
-
- S; W;
-
-OUT:
- vec_free(name);
- return(rv);
-}
-
-
-static int api_pot_profile_del (vat_main_t *vam)
-{
- pot_test_main_t * sm = &pot_test_main;
- vl_api_pot_profile_del_t *mp;
- f64 timeout;
-
- M(POT_PROFILE_DEL, pot_profile_del);
- mp->list_name_len = 0;
- S; W;
- return 0;
-}
-
-static int api_pot_profile_show_config_dump (vat_main_t *vam)
-{
- pot_test_main_t * sm = &pot_test_main;
- unformat_input_t *input = vam->input;
- vl_api_pot_profile_show_config_dump_t *mp;
- f64 timeout;
- u8 id = 0;
-
- while(unformat_check_input(input) != UNFORMAT_END_OF_INPUT)
- {
- if(unformat(input,"id %d",&id));
- else
- break;
- }
- M(POT_PROFILE_SHOW_CONFIG_DUMP, pot_profile_show_config_dump);
-
- mp->id = id;
-
- S; W;
- return 0;
-}
-
-/*
- * List of messages that the api test plugin sends,
- * and that the data plane plugin processes
- */
-#define foreach_vpe_api_msg \
-_(pot_profile_add, "name <name> id [0-1] " \
- "prime-number <0xu64> bits-in-random [0-64] " \
- "secret-share <0xu64> lpc <0xu64> polynomial-public <0xu64> " \
- "[validator-key <0xu64>] [validity <0xu64>]") \
-_(pot_profile_activate, "name <name> id [0-1] ") \
-_(pot_profile_del, "[id <nn>]") \
-_(pot_profile_show_config_dump, "id [0-1]")
-
-void vat_api_hookup (vat_main_t *vam)
-{
- pot_test_main_t * sm = &pot_test_main;
- /* Hook up handlers for replies from the data plane plug-in */
-#define _(N,n) \
- vl_msg_api_set_handlers((VL_API_##N + sm->msg_id_base), \
- #n, \
- vl_api_##n##_t_handler, \
- vl_noop_handler, \
- vl_api_##n##_t_endian, \
- vl_api_##n##_t_print, \
- sizeof(vl_api_##n##_t), 1);
- foreach_vpe_api_reply_msg;
-#undef _
-
- /* API messages we can send */
-#define _(n,h) hash_set_mem (vam->function_by_name, #n, api_##n);
- foreach_vpe_api_msg;
-#undef _
-
- /* Help strings */
-#define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
- foreach_vpe_api_msg;
-#undef _
-}
-
-clib_error_t * vat_plugin_register (vat_main_t *vam)
-{
- pot_test_main_t * sm = &pot_test_main;
- u8 * name;
-
- sm->vat_main = vam;
-
- name = format (0, "ioam_pot_%08x%c", api_version, 0);
- sm->msg_id_base = vl_client_get_first_plugin_msg_id ((char *) name);
-
- if (sm->msg_id_base != (u16) ~0)
- vat_api_hookup (vam);
-
- vec_free(name);
-
- return 0;
-}
diff --git a/plugins/ioam-plugin/ioam/lib-pot/pot_util.c b/plugins/ioam-plugin/ioam/lib-pot/pot_util.c
deleted file mode 100644
index a253ad4130f..00000000000
--- a/plugins/ioam-plugin/ioam/lib-pot/pot_util.c
+++ /dev/null
@@ -1,445 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include <vnet/vnet.h>
-#include <stdint.h>
-#include <time.h>
-#include <string.h>
-#include <vppinfra/mem.h>
-#include "math64.h"
-#include "pot_util.h"
-
-pot_main_t pot_main;
-
-static void pot_profile_cleanup(pot_profile *profile);
-
-static void pot_main_profiles_reset (void)
-{
- pot_main_t *sm = &pot_main;
- int i = 0;
-
- for (i = 0; i < MAX_POT_PROFILES; i++)
- {
- pot_profile_cleanup(&(sm->profile_list[i]));
- }
- sm->active_profile_id = 0;
- if (sm->profile_list_name)
- vec_free(sm->profile_list_name);
- sm->profile_list_name = NULL;
-}
-
-int pot_util_init (void)
-{
- pot_main_profiles_reset();
-
- return(0);
-}
-
-static void pot_profile_init(pot_profile * new, u8 id)
-{
- if (new)
- {
- memset(new, 0, sizeof(pot_profile));
- new->id = id;
- }
-}
-
-pot_profile *pot_profile_find(u8 id)
-{
- pot_main_t *sm = &pot_main;
-
- if (id < MAX_POT_PROFILES)
- {
- return (&(sm->profile_list[id]));
- }
- return (NULL);
-}
-static int pot_profile_name_equal (u8 *name0, u8 *name1)
-{
- int len0, len1;
-
- len0 = vec_len (name0);
- len1 = vec_len (name1);
- if (len0 != len1)
- return(0);
- return (0==strncmp ((char *) name0, (char *)name1, len0));
-}
-
-int pot_profile_list_is_enabled (u8 *name)
-{
- pot_main_t *sm = &pot_main;
- return (pot_profile_name_equal(sm->profile_list_name, name));
-}
-
-void pot_profile_list_init(u8 * profile_list_name)
-{
- pot_main_t *sm = &pot_main;
- int i = 0;
-
- /* If it is the same profile list skip reset */
- if (pot_profile_name_equal(sm->profile_list_name, profile_list_name))
- {
- return;
- }
-
- pot_main_profiles_reset();
- if (vec_len(profile_list_name))
- sm->profile_list_name = (u8 *)vec_dup(profile_list_name);
- else
- sm->profile_list_name = 0;
- sm->active_profile_id = 0;
-
- for (i = 0; i < MAX_POT_PROFILES; i++)
- {
- pot_profile_init(&(sm->profile_list[i]), i);
- }
-}
-
-static void pot_profile_cleanup(pot_profile * profile)
-{
- u16 id = profile->id;
-
- memset(profile, 0, sizeof(pot_profile));
- profile->id = id; /* Restore id alone */
-}
-
-int pot_profile_create(pot_profile * profile, u64 prime,
- u64 poly2, u64 lpc, u64 secret_share)
-{
- if (profile && !profile->in_use)
- {
- pot_profile_cleanup(profile);
- profile->prime = prime;
- profile->primeinv = 1.0 / prime;
- profile->lpc = lpc;
- profile->poly_pre_eval = poly2;
- profile->secret_share = secret_share;
- profile->total_pkts_using_this_profile = 0;
- profile->valid = 1;
- return(0);
- }
-
- return(-1);
-}
-
-int pot_set_validator(pot_profile * profile, u64 key)
-{
- if (profile && !profile->in_use)
- {
- profile->validator = 1;
- profile->secret_key = key;
- return(0);
- }
- return(-1);
-}
-
-always_inline u64 pot_update_cumulative_inline(u64 cumulative, u64 random,
- u64 secret_share, u64 prime, u64 lpc, u64 pre_split, double prime_inv)
-{
- u64 share_random = 0;
- u64 cumulative_new = 0;
-
- /*
- * calculate split share for random
- */
- share_random = add64_mod(pre_split, random, prime, prime_inv);
-
- /*
- * lpc * (share_secret + share_random)
- */
- share_random = add64_mod(share_random, secret_share, prime, prime_inv);
- share_random = mul64_mod(share_random, lpc, prime, prime_inv);
-
- cumulative_new = add64_mod(cumulative, share_random, prime, prime_inv);
-
- return (cumulative_new);
-}
-
-u64 pot_update_cumulative(pot_profile * profile, u64 cumulative, u64 random)
-{
- if (profile && profile->valid != 0)
- {
- return (pot_update_cumulative_inline(cumulative, random, profile->secret_share,
- profile->prime, profile->lpc, profile->poly_pre_eval,
- profile->primeinv));
- }
- return (0);
-}
-
-always_inline u8 pot_validate_inline(u64 secret, u64 prime, double prime_inv,
- u64 cumulative, u64 random)
-{
- if (cumulative == (random + secret))
- {
- return (1);
- }
- else if (cumulative == add64_mod(random, secret, prime, prime_inv))
- {
- return (1);
- }
- return (0);
-}
-
-/*
- * return True if the cumulative matches secret from a profile
- */
-u8 pot_validate(pot_profile * profile, u64 cumulative, u64 random)
-{
- if (profile && profile->validator)
- {
- return (pot_validate_inline(profile->secret_key, profile->prime,
- profile->primeinv, cumulative, random));
- }
- return (0);
-}
-
-/*
- * Utility function to get random number per pack
- */
-u64 pot_generate_random(pot_profile * profile)
-{
- u64 random = 0;
- int32_t second_half;
- static u32 seed = 0;
-
- if (PREDICT_FALSE(!seed))
- seed = random_default_seed();
-
- /*
- * Upper 4 bytes seconds
- */
- random = (u64) time(NULL);
-
- random &= 0xffffffff;
- random = random << 32;
- /*
- * Lower 4 bytes random number
- */
- second_half = random_u32(&seed);
-
- random |= second_half;
-
- if (PREDICT_TRUE(profile != NULL))
- {
- random &= profile->bit_mask;
- }
- return (random);
-}
-
-int pot_profile_set_bit_mask(pot_profile * profile, u16 bits)
-{
- int sizeInBits;
-
- if (profile && !profile->in_use)
- {
- sizeInBits = sizeof(profile->bit_mask) * 8;
- profile->bit_mask =
- (bits >=
- sizeInBits ? (u64) - 1 : (u64) ((u64) 1 << (u64) bits) - 1);
- return(0);
- }
- return(-1);
-}
-
-clib_error_t *clear_pot_profile_command_fn(vlib_main_t * vm,
- unformat_input_t * input, vlib_cli_command_t * cmd)
-{
-
- pot_main_profiles_reset();
-
- return 0;
-}
-
-void clear_pot_profiles()
-{
- clear_pot_profile_command_fn(0, 0, 0);
-}
-
-VLIB_CLI_COMMAND(clear_pot_profile_command) =
-{
-.path = "clear pot profile",
-.short_help = "clear pot profile [<index>|all]",
-.function = clear_pot_profile_command_fn,
-};
-
-static clib_error_t *set_pot_profile_command_fn(vlib_main_t * vm,
- unformat_input_t * input, vlib_cli_command_t * cmd)
-{
- u64 prime;
- u64 secret_share;
- u64 secret_key;
- u8 validator = 0;
- u32 profile_id = ~0;
- u32 bits;
- u64 lpc = 0, poly2 = 0;
- pot_profile *profile = NULL;
- u8 *profile_list_name = NULL;
-
- bits = MAX_BITS;
-
- while (unformat_check_input(input) != UNFORMAT_END_OF_INPUT)
- {
- if (unformat(input, "name %s",
- &profile_list_name));
- else if (unformat(input, "id %d", &profile_id))
- ;
- else if (unformat(input, "validate-key 0x%Lx", &secret_key))
- validator = 1;
- else if (unformat(input, "prime-number 0x%Lx", &prime))
- ;
- else if (unformat(input, "secret_share 0x%Lx", &secret_share))
- ;
- else if (unformat(input, "polynomial2 0x%Lx", &poly2))
- ;
- else if (unformat(input, "lpc 0x%Lx", &lpc))
- ;
- else if (unformat(input, "bits-in-random %d", &bits))
- {
- if (bits > MAX_BITS)
- bits = MAX_BITS;
- }
- else
- break;
- }
- if (profile_list_name == 0)
- {
- return clib_error_return(0, "Name cannot be null");
- }
- pot_profile_list_init(profile_list_name);
- profile = pot_profile_find(profile_id);
-
- if (profile)
- {
- pot_profile_create(profile, prime, poly2, lpc, secret_share);
- if (validator)
- pot_set_validator(profile, secret_key);
- pot_profile_set_bit_mask(profile, bits);
- }
- vec_free(profile_list_name);
- return 0;
-}
-
-VLIB_CLI_COMMAND(set_pot_profile_command) =
-{
-.path = "set pot profile",
-.short_help = "set pot profile name <string> id [0-1] [validator-key 0xu64] \
- prime-number 0xu64 secret_share 0xu64 lpc 0xu64 \
- polynomial2 0xu64 bits-in-random [0-64] ",
-.function = set_pot_profile_command_fn,
-};
-
-static clib_error_t *set_pot_profile_activate_command_fn(vlib_main_t * vm,
- unformat_input_t * input, vlib_cli_command_t * cmd)
-{
- pot_main_t *sm = &pot_main;
- u8 *profile_list_name = NULL;
- u32 id = 0;
- clib_error_t *result = NULL;
-
- while (unformat_check_input(input) != UNFORMAT_END_OF_INPUT)
- {
- if (unformat(input, "name %s",
- &profile_list_name));
- else if (unformat(input, "id %d", &id))
- ;
- else
- return clib_error_return(0, "unknown input `%U'",
- format_unformat_error, input);
- }
- if (profile_list_name == 0)
- {
- return clib_error_return(0, "Name cannot be null");
- }
-
- if (!pot_profile_list_is_enabled(profile_list_name)) {
- result = clib_error_return(0, "%s list is not enabled, profile in use %s",
- profile_list_name, sm->profile_list_name);
- } else if (0 != pot_profile_set_active((u8)id)) {
- result = clib_error_return(0, "Profile %d not defined in %s",
- id, sm->profile_list_name);
- }
- vec_free(profile_list_name);
- return result;
-}
-
-VLIB_CLI_COMMAND(set_pot_profile_activate_command) =
-{
-.path = "set pot profile-active",
-.short_help = "set pot profile-active name <string> id [0-1]",
-.function = set_pot_profile_activate_command_fn,
-};
-
-static clib_error_t *show_pot_profile_command_fn(vlib_main_t * vm,
- unformat_input_t * input, vlib_cli_command_t * cmd)
-{
- pot_main_t *sm = &pot_main;
- pot_profile *p = NULL;
- u16 i;
- u8 *s = 0;
-
- if (vec_len(sm->profile_list_name) == 0)
- {
- s = format(s, "POT Profiles not configured\n");
- vlib_cli_output(vm, "%v", s);
- return 0;
- }
- s = format(s, "Profile list in use : %s\n",sm->profile_list_name);
- for (i = 0; i < MAX_POT_PROFILES; i++)
- {
- p = pot_profile_find(i);
- if (p->valid == 0)
- continue;
- s = format(s, "POT Profile at index: %d\n", i);
- s = format(s, " Id : %d\n", p->id);
- s = format(s, " Validator : %s (%d)\n",
- (p->validator) ? "True" : "False", p->validator);
- if (p->validator == 1)
- s = format(s, " Secret key : 0x%Lx (%Ld)\n",
- p->secret_key, p->secret_key);
- s = format(s, " Secret share : 0x%Lx (%Ld)\n",
- p->secret_share, p->secret_share);
- s = format(s, " Prime number : 0x%Lx (%Ld)\n",
- p->prime, p->prime);
- s = format(s, "2nd polynomial(eval) : 0x%Lx (%Ld)\n",
- p->poly_pre_eval, p->poly_pre_eval);
- s = format(s, " LPC : 0x%Lx (%Ld)\n", p->lpc, p->lpc);
-
- s = format(s, " Bit mask : 0x%Lx (%Ld)\n",
- p->bit_mask, p->bit_mask);
- }
-
- p = pot_profile_find(sm->active_profile_id);
-
- if (p && p->valid && p->in_use) {
- s = format(s, "\nProfile index in use: %d\n", sm->active_profile_id);
- s = format(s, "Pkts passed : 0x%Lx (%Ld)\n",
- p->total_pkts_using_this_profile,
- p->total_pkts_using_this_profile);
- if (pot_is_decap(p))
- s = format(s, " This is Decap node. \n");
- } else {
- s = format(s, "\nProfile index in use: None\n");
- }
- vlib_cli_output(vm, "%v", s);
- vec_free(s);
-
- return 0;
-}
-
-VLIB_CLI_COMMAND(show_pot_profile_command) =
-{
-.path = "show pot profile",
-.short_help = "show pot profile",
-.function = show_pot_profile_command_fn,
-};
diff --git a/plugins/ioam-plugin/ioam/lib-pot/pot_util.h b/plugins/ioam-plugin/ioam/lib-pot/pot_util.h
deleted file mode 100644
index 9df31fae0df..00000000000
--- a/plugins/ioam-plugin/ioam/lib-pot/pot_util.h
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * pot_util.h -- Proof Of Transit Utility Header
- *
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef include_vnet_pot_util_h
-#define include_vnet_pot_util_h
-
-#include <vnet/ip/ip6_hop_by_hop.h>
-#define debug_ioam debug_ioam_fn
-/* Dont change this size 256. This is there across multiple components */
-#define PATH_NAME_SIZE 256
-
-/* Ring size. this should be same as the one in ODL. Do not change this
- without change in ODL. */
-#define MAX_POT_PROFILES 2
-
-/**
- * Usage:
- *
- * On any node that participates in Proof of Transit:
- *
- * Step 1: Initialize this library by calling pot_init()
- * Step 2: Setup a proof of transit profile that contains all the parameters needed to compute cumulative:
- * Call these functions:
- * pot_profile_find
- * pot_profile_create
- * pot_profile_set_bit_mask - To setup how large we want the numbers used in the computation and random number <= 64 bits
- * Step 2a: For validator do this:
- * pot_set_validator
- * Step 2b: On initial node enable the profile to be used:
- * pot_profile_set_active / pot_profile_get_active will return the profile
- * Step 3a: At the initial node to generate Random number that will be read by all other nodes:
- * pot_generate_random
- * Step 3b: At all nodes including initial and verifier call this to compute cumulative:
- * pot_update_cumulative
- * Step 4: At the verifier:
- * pot_validate
- *
- */
-
-typedef struct pot_profile_
-{
- u8 id : 1;
- u8 valid : 1;
- u8 in_use : 1;
- u64 random;
- u8 validator;
- u64 secret_key;
- u64 secret_share;
- u64 prime;
- u64 lpc;
- u64 poly_pre_eval;
- u64 bit_mask;
- u64 limit;
- double primeinv;
- u64 total_pkts_using_this_profile;
-} pot_profile;
-
-typedef struct {
- /* Name of the default profile list in use*/
- u8 *profile_list_name;
- pot_profile profile_list[MAX_POT_PROFILES];
- /* number of profiles in the list */
- u8 active_profile_id : 1;
-
- /* API message ID base */
- u16 msg_id_base;
-
- /* convenience */
- vlib_main_t * vlib_main;
- vnet_main_t * vnet_main;
-} pot_main_t;
-
-extern pot_main_t pot_main;
-
-/*
- * Initialize proof of transit
- */
-int pot_util_init(void);
-void pot_profile_list_init(u8 * name);
-
-
-/*
- * Find a pot profile by ID
- */
-pot_profile *pot_profile_find(u8 id);
-
-static inline u16 pot_profile_get_id(pot_profile * profile)
-{
- if (profile)
- {
- return (profile->id);
- }
- return (0);
-}
-
-/* setup and clean up profile */
-int pot_profile_create(pot_profile * profile, u64 prime,
- u64 poly2, u64 lpc, u64 secret_share);
-/*
- * Setup profile as a validator
- */
-int pot_set_validator(pot_profile * profile, u64 key);
-
-/*
- * Setup max bits to be used for random number generation
- */
-#define MAX_BITS 64
-int pot_profile_set_bit_mask(pot_profile * profile, u16 bits);
-
-/*
- * Given a random and cumulative compute the new cumulative for a given profile
- */
-u64 pot_update_cumulative(pot_profile * profile, u64 cumulative, u64 random);
-
-/*
- * return True if the cumulative matches secret from a profile
- */
-u8 pot_validate(pot_profile * profile, u64 cumulative, u64 random);
-
-/*
- * Utility function to get random number per pack
- */
-u64 pot_generate_random(pot_profile * profile);
-
-
-extern void clear_pot_profiles();
-extern int pot_profile_list_is_enabled(u8 *name);
-
-static inline u8 pot_is_decap(pot_profile * p)
-{
- return (p->validator == 1);
-}
-
-static inline int pot_profile_set_active (u8 id)
-{
- pot_main_t *sm = &pot_main;
- pot_profile *profile = NULL;
- pot_profile *current_active_prof = NULL;
-
- current_active_prof = pot_profile_find(sm->active_profile_id);
- profile = pot_profile_find(id);
- if (profile && profile->valid) {
- sm->active_profile_id = id;
- current_active_prof->in_use = 0;
- profile->in_use = 1;
- return(0);
- }
- return(-1);
-}
-static inline u8 pot_profile_get_active_id (void)
-{
- pot_main_t *sm = &pot_main;
- return (sm->active_profile_id);
-}
-
-static inline pot_profile * pot_profile_get_active (void)
-{
- pot_main_t *sm = &pot_main;
- pot_profile *profile = NULL;
- profile = pot_profile_find(sm->active_profile_id);
- if (profile && profile->in_use)
- return(profile);
- return (NULL);
-}
-
-static inline void pot_profile_reset_usage_stats (pot_profile *pow)
-{
- if (pow) {
- pow->total_pkts_using_this_profile = 0;
- }
-}
-
-static inline void pot_profile_incr_usage_stats (pot_profile *pow)
-{
- if (pow) {
- pow->total_pkts_using_this_profile++;
- }
-}
-
-
-#endif
diff --git a/plugins/ioam-plugin/ioam/lib-trace/jvpp_ioam_trace.c b/plugins/ioam-plugin/ioam/lib-trace/jvpp_ioam_trace.c
deleted file mode 100644
index 1d878ea3e24..00000000000
--- a/plugins/ioam-plugin/ioam/lib-trace/jvpp_ioam_trace.c
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <vnet/vnet.h>
-
-#include <ioam/lib-trace/trace_msg_enum.h>
-#define vl_typedefs /* define message structures */
-#include <ioam/lib-trace/trace_all_api_h.h>
-#undef vl_typedefs
-
-#define vl_endianfun
-#include <ioam/lib-trace/trace_all_api_h.h>
-#undef vl_endianfun
-
-#define vl_print(handle, ...)
-#define vl_printfun
-#include <ioam/lib-trace/trace_all_api_h.h>
-#undef vl_printfun
-
-/* Get the API version number */
-#define vl_api_version(n,v) static u32 api_version=(v);
-#include <ioam/lib-trace/trace_all_api_h.h>
-#undef vl_api_version
-
-#include <vnet/api_errno.h>
-#include <vlibapi/api.h>
-#include <vlibmemory/api.h>
-
-#if VPPJNI_DEBUG == 1
- #define DEBUG_LOG(...) clib_warning(__VA_ARGS__)
-#else
- #define DEBUG_LOG(...)
-#endif
-
-#include <jvpp-common/jvpp_common.h>
-
-#include "ioam/jvpp/io_fd_vpp_jvpp_ioamtrace_JVppIoamtraceImpl.h"
-#include "jvpp_ioam_trace.h"
-#include "ioam/jvpp/jvpp_ioam_trace_gen.h"
-
-/*
- * Class: io_fd_vpp_jvpp_ioamtrace_JVppIoamtraceImpl
- * Method: init0
- * Signature: (JI)V
- */
-JNIEXPORT void JNICALL Java_io_fd_vpp_jvpp_ioamtrace_JVppIoamtraceImpl_init0
- (JNIEnv *env, jclass clazz, jobject callback, jlong queue_address, jint my_client_index) {
- ioamtrace_main_t * plugin_main = &ioamtrace_main;
- u8 * name;
- clib_warning ("Java_io_fd_vpp_jvpp_ioamtrace_JVppIoamtraceImpl_init0");
-
- plugin_main->my_client_index = my_client_index;
- plugin_main->vl_input_queue = (unix_shared_memory_queue_t *)queue_address;
-
- name = format (0, "ioam_trace_%08x%c", api_version, 0);
- plugin_main->msg_id_base = vl_client_get_first_plugin_msg_id ((char *) name);
-
- if (plugin_main->msg_id_base == (u16) ~0) {
- jclass exClass = (*env)->FindClass(env, "java/lang/IllegalStateException");
- (*env)->ThrowNew(env, exClass, "ioam_trace plugin is not loaded in VPP");
- } else {
- plugin_main->callbackObject = (*env)->NewGlobalRef(env, callback);
- plugin_main->callbackClass = (jclass)(*env)->NewGlobalRef(env, (*env)->GetObjectClass(env, callback));
-
- #define _(N,n) \
- vl_msg_api_set_handlers(VL_API_##N + plugin_main->msg_id_base, #n, \
- vl_api_##n##_t_handler, \
- vl_noop_handler, \
- vl_api_##n##_t_endian, \
- vl_api_##n##_t_print, \
- sizeof(vl_api_##n##_t), 1);
- foreach_api_reply_handler;
- #undef _
- }
-}
-
-JNIEXPORT void JNICALL Java_io_fd_vpp_jvpp_ioamtrace_JVppIoamtraceImpl_close0
-(JNIEnv *env, jclass clazz) {
- ioamtrace_main_t * plugin_main = &ioamtrace_main;
-
- // cleanup:
- (*env)->DeleteGlobalRef(env, plugin_main->callbackClass);
- (*env)->DeleteGlobalRef(env, plugin_main->callbackObject);
-
- plugin_main->callbackClass = NULL;
- plugin_main->callbackObject = NULL;
-}
-
-/* Attach thread to JVM and cache class references when initiating JVPP iOAM Trace */
-jint JNI_OnLoad(JavaVM *vm, void *reserved) {
- JNIEnv* env;
-
- if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_8) != JNI_OK) {
- return JNI_EVERSION;
- }
-
- if (cache_class_references(env) != 0) {
- clib_warning ("Failed to cache class references\n");
- return JNI_ERR;
- }
-
- return JNI_VERSION_1_8;
-}
-
-/* Clean up cached references when disposing JVPP iOAM Trace */
-void JNI_OnUnload(JavaVM *vm, void *reserved) {
- JNIEnv* env;
- if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_8) != JNI_OK) {
- return;
- }
- delete_class_references(env);
-}
diff --git a/plugins/ioam-plugin/ioam/lib-trace/jvpp_ioam_trace.h b/plugins/ioam-plugin/ioam/lib-trace/jvpp_ioam_trace.h
deleted file mode 100644
index 9fc16c15853..00000000000
--- a/plugins/ioam-plugin/ioam/lib-trace/jvpp_ioam_trace.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef __included_jvpp_ioam_trace_h__
-#define __included_jvpp_ioam_trace_h__
-
-#include <vnet/vnet.h>
-#include <vnet/ip/ip.h>
-#include <vnet/api_errno.h>
-#include <vlibapi/api.h>
-#include <vlibmemory/api.h>
-#include <jni.h>
-
-/* Global state for JVPP-IOAM-TRACE */
-typedef struct {
- /* Base message index for the trace plugin */
- u16 msg_id_base;
-
- /* Pointer to shared memory queue */
- unix_shared_memory_queue_t * vl_input_queue;
-
- /* VPP api client index */
- u32 my_client_index;
-
- /* Callback object and class references enabling asynchronous Java calls */
- jobject callbackObject;
- jclass callbackClass;
-
-} ioamtrace_main_t;
-
-ioamtrace_main_t ioamtrace_main __attribute__((aligned (64)));
-
-
-#endif /* __included_jvpp_ioam_trace_h__ */
diff --git a/plugins/ioam-plugin/ioam/lib-trace/trace.api b/plugins/ioam-plugin/ioam/lib-trace/trace.api
deleted file mode 100644
index cb9583256f6..00000000000
--- a/plugins/ioam-plugin/ioam/lib-trace/trace.api
+++ /dev/null
@@ -1,92 +0,0 @@
-/* Hey Emacs use -*- mode: C -*- */
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-/** \brief iOAM6 Trace - Set the iOAM6 trace profile
- @param trace_type - Type of trace requested
- @param num_elts - Number of trace elements to be inserted
- @param node_id - Trace Node ID
- @param trace_tsp- Timestamp resolution
- @param app_data - Application specific opaque
-*/
-define trace_profile_add {
- u32 client_index;
- u32 context;
- u8 trace_type;
- u8 num_elts;
- u8 trace_tsp;
- u32 node_id;
- u32 app_data;
-};
-
-/** \brief Trace profile add / del response
- @param context - sender context, to match reply w/ request
- @param retval - return value for request
-*/
-define trace_profile_add_reply {
- u32 context;
- i32 retval;
-};
-
-
-
-/** \brief Delete trace Profile
- @param client_index - opaque cookie to identify the sender
- @param context - sender context, to match reply w/ request
-*/
-define trace_profile_del {
- u32 client_index;
- u32 context;
-};
-
-/** \brief Trace profile add / del response
- @param context - sender context, to match reply w/ request
- @param retval - return value for request
-*/
-define trace_profile_del_reply {
- u32 context;
- i32 retval;
-};
-
-
-
-/** \brief Show trace Profile
- @param client_index - opaque cookie to identify the sender
- @param context - sender context, to match reply w/ request
-*/
-define trace_profile_show_config {
- u32 client_index;
- u32 context;
-};
-
-/** \brief Show trace config response
- @param context - sender context, to match reply w/ request
- @param retval - return value for request
- @param trace_type - Type of trace requested
- @param num_elts - Number of trace elements to be inserted
- @param node_id - Trace Node ID
- @param trace_tsp- Timestamp resolution
- @param app_data - Application specific opaque
-*/
-define trace_profile_show_config_reply {
- u32 context;
- i32 retval;
- u8 trace_type;
- u8 num_elts;
- u8 trace_tsp;
- u32 node_id;
- u32 app_data;
-};
diff --git a/plugins/ioam-plugin/ioam/lib-trace/trace_all_api_h.h b/plugins/ioam-plugin/ioam/lib-trace/trace_all_api_h.h
deleted file mode 100644
index 223f95450aa..00000000000
--- a/plugins/ioam-plugin/ioam/lib-trace/trace_all_api_h.h
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/* Include the generated file, see BUILT_SOURCES in Makefile.am */
-#include <ioam/lib-trace/trace.api.h>
diff --git a/plugins/ioam-plugin/ioam/lib-trace/trace_api.c b/plugins/ioam-plugin/ioam/lib-trace/trace_api.c
deleted file mode 100644
index 7e0d708e155..00000000000
--- a/plugins/ioam-plugin/ioam/lib-trace/trace_api.c
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- *------------------------------------------------------------------
- * trace_api.c - iOAM Trace related APIs to create
- * and maintain profiles
- *------------------------------------------------------------------
- */
-
-#include <vnet/vnet.h>
-#include <vnet/plugin/plugin.h>
-#include <ioam/lib-trace/trace_util.h>
-
-#include <vlibapi/api.h>
-#include <vlibmemory/api.h>
-#include <vlibsocket/api.h>
-
-/* define message IDs */
-#include <ioam/lib-trace/trace_msg_enum.h>
-
-/* define message structures */
-#define vl_typedefs
-#include <ioam/lib-trace/trace_all_api_h.h>
-#undef vl_typedefs
-
-/* define generated endian-swappers */
-#define vl_endianfun
-#include <ioam/lib-trace/trace_all_api_h.h>
-#undef vl_endianfun
-
-/* instantiate all the print functions we know about */
-#define vl_print(handle, ...) vlib_cli_output (handle, __VA_ARGS__)
-#define vl_printfun
-#include <ioam/lib-trace/trace_all_api_h.h>
-#undef vl_printfun
-
-/* Get the API version number */
-#define vl_api_version(n,v) static u32 api_version=(v);
-#include <ioam/lib-trace/trace_all_api_h.h>
-#undef vl_api_version
-
-/*
- * A handy macro to set up a message reply.
- * Assumes that the following variables are available:
- * mp - pointer to request message
- * rmp - pointer to reply message type
- * rv - return value
- */
-
-#define TRACE_REPLY_MACRO(t) \
-do { \
- unix_shared_memory_queue_t * q = \
- vl_api_client_index_to_input_queue (mp->client_index); \
- if (!q) \
- return; \
- \
- rmp = vl_msg_api_alloc (sizeof (*rmp)); \
- rmp->_vl_msg_id = ntohs((t)+sm->msg_id_base); \
- rmp->context = mp->context; \
- rmp->retval = ntohl(rv); \
- \
- vl_msg_api_send_shmem (q, (u8 *)&rmp); \
-} while(0);
-
-/* *INDENT-OFF* */
-#define TRACE_REPLY_MACRO2(t, body) \
-do { \
- unix_shared_memory_queue_t * q; \
- rv = vl_msg_api_pd_handler (mp, rv); \
- q = vl_api_client_index_to_input_queue (mp->client_index); \
- if (!q) \
- return; \
- \
- rmp = vl_msg_api_alloc (sizeof (*rmp)); \
- rmp->_vl_msg_id = ntohs((t)+sm->msg_id_base); \
- rmp->context = mp->context; \
- rmp->retval = ntohl(rv); \
- do {body;} while (0); \
- vl_msg_api_send_shmem (q, (u8 *)&rmp); \
-} while(0);
-/* *INDENT-ON* */
-
-/* List of message types that this plugin understands */
-
-#define foreach_trace_plugin_api_msg \
-_(TRACE_PROFILE_ADD, trace_profile_add) \
-_(TRACE_PROFILE_DEL, trace_profile_del) \
-_(TRACE_PROFILE_SHOW_CONFIG, trace_profile_show_config)
-
-static void vl_api_trace_profile_add_t_handler
- (vl_api_trace_profile_add_t * mp)
-{
- trace_main_t *sm = &trace_main;
- int rv = 0;
- vl_api_trace_profile_add_reply_t *rmp;
- trace_profile *profile = NULL;
-
- profile = trace_profile_find ();
- if (profile)
- {
- rv =
- trace_profile_create (profile, mp->trace_type, mp->num_elts,
- mp->trace_tsp, ntohl (mp->node_id),
- ntohl (mp->app_data));
- if (rv != 0)
- goto ERROROUT;
- }
- else
- {
- rv = -3;
- }
-ERROROUT:
- TRACE_REPLY_MACRO (VL_API_TRACE_PROFILE_ADD_REPLY);
-}
-
-
-static void vl_api_trace_profile_del_t_handler
- (vl_api_trace_profile_del_t * mp)
-{
- trace_main_t *sm = &trace_main;
- int rv = 0;
- vl_api_trace_profile_del_reply_t *rmp;
-
- clear_trace_profiles ();
-
- TRACE_REPLY_MACRO (VL_API_TRACE_PROFILE_DEL_REPLY);
-}
-
-static void vl_api_trace_profile_show_config_t_handler
- (vl_api_trace_profile_show_config_t * mp)
-{
- trace_main_t *sm = &trace_main;
- vl_api_trace_profile_show_config_reply_t *rmp;
- int rv = 0;
- trace_profile *profile = trace_profile_find ();
- if (profile->valid)
- {
- TRACE_REPLY_MACRO2 (VL_API_TRACE_PROFILE_SHOW_CONFIG_REPLY,
- rmp->trace_type = profile->trace_type;
- rmp->num_elts = profile->num_elts;
- rmp->trace_tsp = profile->trace_tsp;
- rmp->node_id = htonl (profile->node_id);
- rmp->app_data = htonl (profile->app_data);
- );
- }
- else
- {
- TRACE_REPLY_MACRO2 (VL_API_TRACE_PROFILE_SHOW_CONFIG_REPLY,
- rmp->trace_type = 0;
- rmp->num_elts = 0; rmp->trace_tsp = 0;
- rmp->node_id = 0; rmp->app_data = 0;
- );
- }
-}
-
-/*
- * This routine exists to convince the vlib plugin framework that
- * we haven't accidentally copied a random .dll into the plugin directory.
- *
- * Also collects global variable pointers passed from the vpp engine
- */
-
-clib_error_t *
-vlib_plugin_register (vlib_main_t * vm, vnet_plugin_handoff_t * h,
- int from_early_init)
-{
- trace_main_t *sm = &trace_main;
- clib_error_t *error = 0;
-
- sm->vlib_main = vm;
- sm->vnet_main = h->vnet_main;
- return error;
-}
-
-/* Set up the API message handling tables */
-static clib_error_t *
-trace_plugin_api_hookup (vlib_main_t * vm)
-{
- trace_main_t *sm = &trace_main;
-#define _(N,n) \
- vl_msg_api_set_handlers((VL_API_##N + sm->msg_id_base), \
- #n, \
- vl_api_##n##_t_handler, \
- vl_noop_handler, \
- vl_api_##n##_t_endian, \
- vl_api_##n##_t_print, \
- sizeof(vl_api_##n##_t), 1);
- foreach_trace_plugin_api_msg;
-#undef _
-
- return 0;
-}
-
-#define vl_msg_name_crc_list
-#include <ioam/lib-trace/trace_all_api_h.h>
-#undef vl_msg_name_crc_list
-
-static void
-setup_message_id_table (trace_main_t * sm, api_main_t * am)
-{
-#define _(id,n,crc) \
- vl_msg_api_add_msg_name_crc (am, #n "_" #crc, id + sm->msg_id_base);
- foreach_vl_msg_name_crc_trace;
-#undef _
-}
-
-static clib_error_t *
-trace_init (vlib_main_t * vm)
-{
- trace_main_t *sm = &trace_main;
- clib_error_t *error = 0;
- u8 *name;
-
- bzero (sm, sizeof (trace_main));
- (void) trace_util_init ();
- name = format (0, "ioam_trace_%08x%c", api_version, 0);
-
- /* Ask for a correctly-sized block of API message decode slots */
- sm->msg_id_base = vl_msg_api_get_msg_ids
- ((char *) name, VL_MSG_FIRST_AVAILABLE);
-
- error = trace_plugin_api_hookup (vm);
-
- /* Add our API messages to the global name_crc hash table */
- setup_message_id_table (sm, &api_main);
-
- vec_free (name);
-
- return error;
-}
-
-VLIB_INIT_FUNCTION (trace_init);
-
-/*
- * fd.io coding-style-patch-verification: ON
- *
- * Local Variables:
- * eval: (c-set-style "gnu")
- * End:
- */
diff --git a/plugins/ioam-plugin/ioam/lib-trace/trace_msg_enum.h b/plugins/ioam-plugin/ioam/lib-trace/trace_msg_enum.h
deleted file mode 100644
index 78c35665f3c..00000000000
--- a/plugins/ioam-plugin/ioam/lib-trace/trace_msg_enum.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef included_trace_msg_enum_h
-#define included_trace_msg_enum_h
-
-#include <vppinfra/byte_order.h>
-
-#define vl_msg_id(n,h) n,
-typedef enum {
-#include <ioam/lib-trace/trace_all_api_h.h>
- /* We'll want to know how many messages IDs we need... */
- VL_MSG_FIRST_AVAILABLE,
-} vl_msg_id_t;
-#undef vl_msg_id
-
-#endif /* included_trace_msg_enum_h */
diff --git a/plugins/ioam-plugin/ioam/lib-trace/trace_test.c b/plugins/ioam-plugin/ioam/lib-trace/trace_test.c
deleted file mode 100644
index 111dd461b5b..00000000000
--- a/plugins/ioam-plugin/ioam/lib-trace/trace_test.c
+++ /dev/null
@@ -1,292 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- *------------------------------------------------------------------
- * trace_test.c - test harness for trace plugin
- *------------------------------------------------------------------
- */
-
-#include <vat/vat.h>
-#include <vlibapi/api.h>
-#include <vlibmemory/api.h>
-#include <vlibsocket/api.h>
-#include <vppinfra/error.h>
-
-/* Declare message IDs */
-#include <ioam/lib-trace/trace_msg_enum.h>
-
-/* define message structures */
-#define vl_typedefs
-#include <ioam/lib-trace/trace_all_api_h.h>
-#undef vl_typedefs
-
-/* declare message handlers for each api */
-
-#define vl_endianfun /* define message structures */
-#include <ioam/lib-trace/trace_all_api_h.h>
-#undef vl_endianfun
-
-/* instantiate all the print functions we know about */
-#define vl_print(handle, ...)
-#define vl_printfun
-#include <ioam/lib-trace/trace_all_api_h.h>
-#undef vl_printfun
-
-/* Get the API version number. */
-#define vl_api_version(n,v) static u32 api_version=(v);
-#include <ioam/lib-trace/trace_all_api_h.h>
-#undef vl_api_version
-
-
-typedef struct
-{
- /* API message ID base */
- u16 msg_id_base;
- vat_main_t *vat_main;
-} trace_test_main_t;
-
-trace_test_main_t trace_test_main;
-
-#define foreach_standard_reply_retval_handler \
-_(trace_profile_add_reply) \
-_(trace_profile_del_reply)
-
-#define foreach_custom_reply_handler \
-_(trace_profile_show_config_reply, \
- if(mp->trace_type) \
- { \
- errmsg(" Trace Type : 0x%x (%d)\n",mp->trace_type, mp->trace_type); \
- errmsg(" Trace timestamp precision : %d \n",mp->trace_tsp); \
- errmsg(" Node Id : 0x%x (%d)\n",htonl(mp->node_id), htonl(mp->node_id)); \
- errmsg(" App Data : 0x%x (%d)\n",htonl(mp->app_data), htonl(mp->app_data)); \
- } \
- else errmsg("No valid trace profile configuration found\n");)
-#define _(n) \
- static void vl_api_##n##_t_handler \
- (vl_api_##n##_t * mp) \
- { \
- vat_main_t * vam = trace_test_main.vat_main; \
- i32 retval = ntohl(mp->retval); \
- if (vam->async_mode) { \
- vam->async_errors += (retval < 0); \
- } else { \
- vam->retval = retval; \
- vam->result_ready = 1; \
- } \
- }
-foreach_standard_reply_retval_handler;
-#undef _
-
-#define _(n,body) \
- static void vl_api_##n##_t_handler \
- (vl_api_##n##_t * mp) \
- { \
- vat_main_t * vam = trace_test_main.vat_main; \
- i32 retval = ntohl(mp->retval); \
- if (vam->async_mode) { \
- vam->async_errors += (retval < 0); \
- } else { \
- vam->retval = retval; \
- vam->result_ready = 1; \
- } \
- if(retval>=0)do{body;} while(0); \
- else errmsg("Error, retval: %d",retval); \
- }
-foreach_custom_reply_handler;
-#undef _
-/*
- * Table of message reply handlers, must include boilerplate handlers
- * we just generated
- */
-#define foreach_vpe_api_reply_msg \
-_(TRACE_PROFILE_ADD_REPLY, trace_profile_add_reply) \
-_(TRACE_PROFILE_DEL_REPLY, trace_profile_del_reply) \
-_(TRACE_PROFILE_SHOW_CONFIG_REPLY, trace_profile_show_config_reply)
-
-
-/* M: construct, but don't yet send a message */
-
-#define M(T,t) \
-do { \
- vam->result_ready = 0; \
- mp = vl_msg_api_alloc(sizeof(*mp)); \
- memset (mp, 0, sizeof (*mp)); \
- mp->_vl_msg_id = ntohs (VL_API_##T + sm->msg_id_base); \
- mp->client_index = vam->my_client_index; \
-} while(0);
-
-#define M2(T,t,n) \
-do { \
- vam->result_ready = 0; \
- mp = vl_msg_api_alloc(sizeof(*mp)+(n)); \
- memset (mp, 0, sizeof (*mp)); \
- mp->_vl_msg_id = ntohs (VL_API_##T + sm->msg_id_base); \
- mp->client_index = vam->my_client_index; \
-} while(0);
-
-/* S: send a message */
-#define S (vl_msg_api_send_shmem (vam->vl_input_queue, (u8 *)&mp))
-
-/* W: wait for results, with timeout */
-#define W \
-do { \
- timeout = vat_time_now (vam) + 1.0; \
- \
- while (vat_time_now (vam) < timeout) { \
- if (vam->result_ready == 1) { \
- return (vam->retval); \
- } \
- } \
- return -99; \
-} while(0);
-
-
-static int
-api_trace_profile_add (vat_main_t * vam)
-{
- trace_test_main_t *sm = &trace_test_main;
- unformat_input_t *input = vam->input;
- vl_api_trace_profile_add_t *mp;
- u8 trace_type = 0;
- u8 num_elts = 0;
- int rv = 0;
- u32 node_id = 0;
- u32 app_data = 0;
- u8 trace_tsp = 0;
- f64 timeout;
-
- while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
- {
- if (unformat (input, "trace-type 0x%x", &trace_type))
- ;
- else if (unformat (input, "trace-elts %d", &num_elts))
- ;
- else if (unformat (input, "trace-tsp %d", &trace_tsp))
- ;
- else if (unformat (input, "node-id 0x%x", &node_id))
- ;
- else if (unformat (input, "app-data 0x%x", &app_data))
- ;
-
- else
- break;
- }
-
-
- M (TRACE_PROFILE_ADD, trace_profile_add);
-
- mp->trace_type = trace_type;
- mp->trace_tsp = trace_tsp;
- mp->node_id = htonl (node_id);
- mp->app_data = htonl (app_data);
- mp->num_elts = num_elts;
-
- S;
- W;
-
- return (rv);
-}
-
-
-
-static int
-api_trace_profile_del (vat_main_t * vam)
-{
- trace_test_main_t *sm = &trace_test_main;
- vl_api_trace_profile_del_t *mp;
- f64 timeout;
-
- M (TRACE_PROFILE_DEL, trace_profile_del);
- S;
- W;
- return 0;
-}
-
-static int
-api_trace_profile_show_config (vat_main_t * vam)
-{
- trace_test_main_t *sm = &trace_test_main;
- vl_api_trace_profile_show_config_t *mp;
- f64 timeout;
- M (TRACE_PROFILE_SHOW_CONFIG, trace_profile_show_config);
- S;
- W;
- return 0;
-}
-
-/*
- * List of messages that the api test plugin sends,
- * and that the data plane plugin processes
- */
-#define foreach_vpe_api_msg \
-_(trace_profile_add, ""\
- "trace-type <0x1f|0x3|0x9|0x11|0x19> trace-elts <nn> trace-tsp <0|1|2|3> node-id <node id in hex> app-data <app_data in hex>") \
-_(trace_profile_del, "[id <nn>]") \
-_(trace_profile_show_config, "[id <nn>]")
-
-
-void
-vat_api_hookup (vat_main_t * vam)
-{
- trace_test_main_t *sm = &trace_test_main;
- /* Hook up handlers for replies from the data plane plug-in */
-#define _(N,n) \
- vl_msg_api_set_handlers((VL_API_##N + sm->msg_id_base), \
- #n, \
- vl_api_##n##_t_handler, \
- vl_noop_handler, \
- vl_api_##n##_t_endian, \
- vl_api_##n##_t_print, \
- sizeof(vl_api_##n##_t), 1);
- foreach_vpe_api_reply_msg;
-#undef _
-
- /* API messages we can send */
-#define _(n,h) hash_set_mem (vam->function_by_name, #n, api_##n);
- foreach_vpe_api_msg;
-#undef _
-
- /* Help strings */
-#define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
- foreach_vpe_api_msg;
-#undef _
-}
-
-clib_error_t *
-vat_plugin_register (vat_main_t * vam)
-{
- trace_test_main_t *sm = &trace_test_main;
- u8 *name;
-
- sm->vat_main = vam;
-
- name = format (0, "ioam_trace_%08x%c", api_version, 0);
- sm->msg_id_base = vl_client_get_first_plugin_msg_id ((char *) name);
-
- if (sm->msg_id_base != (u16) ~ 0)
- vat_api_hookup (vam);
-
- vec_free (name);
-
- return 0;
-}
-
-/*
- * fd.io coding-style-patch-verification: ON
- *
- * Local Variables:
- * eval: (c-set-style "gnu")
- * End:
- */
diff --git a/plugins/ioam-plugin/ioam/lib-trace/trace_util.c b/plugins/ioam-plugin/ioam/lib-trace/trace_util.c
deleted file mode 100644
index 5c7f1eefd9c..00000000000
--- a/plugins/ioam-plugin/ioam/lib-trace/trace_util.c
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include <vnet/vnet.h>
-#include <stdint.h>
-#include <time.h>
-#include <string.h>
-#include <vppinfra/mem.h>
-#include "trace_util.h"
-
-trace_main_t trace_main;
-
-static int
-trace_profile_cleanup (trace_profile * profile)
-{
-
- memset (profile, 0, sizeof (trace_profile));
- profile->trace_tsp = TSP_MICROSECONDS; /* Micro seconds */
- ip6_trace_profile_cleanup (); /* lib-trace_TODO: Remove this once IOAM-IPv6 transport is a plugin */
- return 0;
-
-}
-
-static int
-trace_main_profiles_reset (void)
-{
- int rv;
-
- trace_main_t *sm = &trace_main;
- rv = trace_profile_cleanup (&(sm->profile));
- return (rv);
-}
-
-int
-trace_util_init (void)
-{
- int rv;
-
- rv = trace_main_profiles_reset ();
- return (rv);
-}
-
-
-int
-trace_profile_create (trace_profile * profile, u8 trace_type, u8 num_elts,
- u32 trace_tsp, u32 node_id, u32 app_data)
-{
-
- if (!trace_type || !num_elts || !(node_id))
- {
- return (-1);
- }
- if (profile && !profile->valid)
- {
- //rv = trace_profile_cleanup (profile);
- profile->trace_type = trace_type;
- profile->num_elts = num_elts;
- profile->trace_tsp = trace_tsp;
- profile->node_id = node_id;
- profile->app_data = app_data;
- profile->valid = 1;
-
- /* lib-trace_TODO: Remove this once IOAM-IPv6 transport is a plugin */
- ip6_trace_profile_setup ();
- return (0);
- }
-
- return (-1);
-}
-
-
-
-clib_error_t *
-clear_trace_profile_command_fn (vlib_main_t * vm,
- unformat_input_t * input,
- vlib_cli_command_t * cmd)
-{
-
- trace_main_profiles_reset ();
- return 0;
-}
-
-void
-clear_trace_profiles (void)
-{
- clear_trace_profile_command_fn (0, 0, 0);
-}
-
-/* *INDENT-OFF* */
-VLIB_CLI_COMMAND(clear_trace_profile_command) =
-{
-.path = "clear ioam-trace profile",
-.short_help = "clear ioam-trace profile [<index>|all]",
-.function = clear_trace_profile_command_fn,
-};
-/* *INDENT-ON* */
-
-static clib_error_t *
-set_trace_profile_command_fn (vlib_main_t * vm,
- unformat_input_t * input,
- vlib_cli_command_t * cmd)
-{
- u8 trace_type = 0;
- u8 num_elts = 0;
- u32 node_id = 0;
- u32 app_data = 0;
- u32 trace_tsp = 0;
- trace_profile *profile = NULL;
- while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
- {
- if (unformat (input, "trace-type 0x%x", &trace_type));
- else if (unformat (input, "trace-elts %d", &num_elts));
- else if (unformat (input, "trace-tsp %d", &trace_tsp));
- else if (unformat (input, "node-id 0x%x", &node_id));
- else if (unformat (input, "app-data 0x%x", &app_data));
- else
- break;
- }
- profile = trace_profile_find ();
- if (profile)
- {
- trace_profile_create (profile, trace_type, num_elts, trace_tsp,
- node_id, app_data);
- }
- return 0;
-}
-
-/* *INDENT-OFF* */
-VLIB_CLI_COMMAND (set_trace_profile_command, static) =
-{
-.path = "set ioam-trace profile",
-.short_help = "set ioam-trace \
- trace-type <0x1f|0x3|0x9|0x11|0x19> trace-elts <nn> trace-tsp <0|1|2|3> \
- node-id <node id in hex> app-data <app_data in hex>",
-.function = set_trace_profile_command_fn,
-};
-/* *INDENT-ON* */
-
-static clib_error_t *
-show_trace_profile_command_fn (vlib_main_t * vm,
- unformat_input_t * input,
- vlib_cli_command_t * cmd)
-{
- trace_profile *p = NULL;
- u8 *s = 0;
- p = trace_profile_find ();
- if (!(p && p->valid))
- {
- s = format (s, "\nTrace configuration not valid\n");
- vlib_cli_output (vm, "%v", s);
- vec_free (s);
- return 0;
- }
- s = format (s, " HOP BY HOP OPTIONS - TRACE CONFIG - \n");
- s = format (s, " Trace Type : 0x%x (%d)\n",
- p->trace_type, p->trace_type);
- s =
- format (s, " Trace timestamp precision : %d (%s)\n",
- p->trace_tsp,
- (p->trace_tsp ==
- TSP_SECONDS) ? "Seconds" : ((p->trace_tsp ==
- TSP_MILLISECONDS) ?
- "Milliseconds"
- : (((p->trace_tsp ==
- TSP_MICROSECONDS) ?
- "Microseconds" :
- "Nanoseconds"))));
- s = format (s, " Num of trace nodes : %d\n", p->num_elts);
- s =
- format (s, " Node-id : 0x%x (%d)\n",
- p->node_id, p->node_id);
- s =
- format (s, " App Data : 0x%x (%d)\n",
- p->app_data, p->app_data);
- vlib_cli_output (vm, "%v", s);
- vec_free (s);
- return 0;
-}
-
-/* *INDENT-OFF* */
-VLIB_CLI_COMMAND (show_trace_profile_command, static) =
-{
-.path = "show ioam-trace profile",
-.short_help = "show ioam-trace profile",
-.function = show_trace_profile_command_fn,
-};
-/* *INDENT-ON* */
-
-/*
- * fd.io coding-style-patch-verification: ON
- *
- * Local Variables:
- * eval: (c-set-style "gnu")
- * End:
- */
diff --git a/plugins/ioam-plugin/ioam/lib-trace/trace_util.h b/plugins/ioam-plugin/ioam/lib-trace/trace_util.h
deleted file mode 100644
index 556f07ee3f1..00000000000
--- a/plugins/ioam-plugin/ioam/lib-trace/trace_util.h
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
- * trace_util.h -- Trace Profile Utility header
- *
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef include_vnet_trace_util_h
-#define include_vnet_trace_util_h
-
-#define debug_ioam debug_ioam_fn
-
-
-/**
- * Usage:
- *
- * On any node that participates in iOAM Trace.
- *
- * Step 1: Initialize this library by calling trace_init()
- * Step 2: Setup a trace profile that contains all the parameters needed to compute cumulative:
- * Call these functions:
- * trace_profile_find
- * trace_profile_create
- * Step 2a: On initial node enable the profile to be used:
- * trace_profile_set_active / trace_profile_get_active will return the profile
- * Step 4: TBD
- * trace_validate
- *
- */
-
-typedef struct trace_profile_
-{
- u8 valid:1;
- u8 trace_type;
- u8 num_elts;
- /* Configured node-id */
- u32 node_id;
- u32 app_data;
- u32 trace_tsp;
-} trace_profile;
-
-typedef struct
-{
- /* Name of the default profile list in use */
- trace_profile profile;
-
- /* API message ID base */
- u16 msg_id_base;
-
- /* convenience */
- vlib_main_t *vlib_main;
- vnet_main_t *vnet_main;
-} trace_main_t;
-
-extern trace_main_t trace_main;
-
-/*
- * Initialize Trace profile
- */
-int trace_util_init (void);
-
-
-/*
- * Find a trace profile
- */
-
-always_inline trace_profile *
-trace_profile_find (void)
-{
- trace_main_t *sm = &trace_main;
-
- return (&(sm->profile));
-}
-
-
-/* setup and clean up profile */
-int trace_profile_create (trace_profile * profile, u8 trace_type, u8 num_elts,
- u32 trace_tsp, u32 node_id, u32 app_data);
-
-void clear_trace_profiles (void);
-
-
-
-#define BIT_TTL_NODEID (1<<0)
-#define BIT_ING_INTERFACE (1<<1)
-#define BIT_EGR_INTERFACE (1<<2)
-#define BIT_TIMESTAMP (1<<3)
-#define BIT_APPDATA (1<<4)
-#define TRACE_TYPE_MASK 0x1F /* Mask of all above bits */
-
-/*
- 0x00011111 iOAM-trace-type is 0x00011111 then the format of node
- data is:
-
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Hop_Lim | node_id |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | ingress_if_id | egress_if_id |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- + timestamp +
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | app_data |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-*/
-#define TRACE_TYPE_IF_TS_APP 0x1f
-typedef struct
-{
- u32 ttl_node_id;
- u16 ingress_if;
- u16 egress_if;
- u32 timestamp;
- u32 app_data;
-} ioam_trace_if_ts_app_t;
-
-/*
- 0x00000111 iOAM-trace-type is 0x00000111 then the format is:
-
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Hop_Lim | node_id |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | ingress_if_id | egress_if_id |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-*/
-
-#define TRACE_TYPE_IF 0x03
-typedef struct
-{
- u32 ttl_node_id;
- u16 ingress_if;
- u16 egress_if;
-} ioam_trace_if_t;
-
-/*
- 0x00001001 iOAM-trace-type is 0x00001001 then the format is:
-
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Hop_Lim | node_id |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- + timestamp +
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-*/
-
-#define TRACE_TYPE_TS 0x09
-typedef struct
-{
- u32 ttl_node_id;
- u32 timestamp;
-} ioam_trace_ts_t;
-
-/*
- 0x00010001 iOAM-trace-type is 0x00010001 then the format is:
-
-
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Hop_Lim | node_id |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | app_data |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-*/
-
-
-#define TRACE_TYPE_APP 0x11
-typedef struct
-{
- u32 ttl_node_id;
- u32 app_data;
-} ioam_trace_app_t;
-
-/*
-
- 0x00011001 iOAM-trace-type is 0x00011001 then the format is:
-
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Hop_Lim | node_id |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- + timestamp +
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | app_data |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-*/
-
-#define TRACE_TYPE_TS_APP 0x19
-typedef struct
-{
- u32 ttl_node_id;
- u32 timestamp;
- u32 app_data;
-} ioam_trace_ts_app_t;
-
-
-
-static inline u8
-fetch_trace_data_size (u8 trace_type)
-{
- u8 trace_data_size = 0;
-
- if (trace_type == TRACE_TYPE_IF_TS_APP)
- trace_data_size = sizeof (ioam_trace_if_ts_app_t);
- else if (trace_type == TRACE_TYPE_IF)
- trace_data_size = sizeof (ioam_trace_if_t);
- else if (trace_type == TRACE_TYPE_TS)
- trace_data_size = sizeof (ioam_trace_ts_t);
- else if (trace_type == TRACE_TYPE_APP)
- trace_data_size = sizeof (ioam_trace_app_t);
- else if (trace_type == TRACE_TYPE_TS_APP)
- trace_data_size = sizeof (ioam_trace_ts_app_t);
-
- return trace_data_size;
-}
-
-int ioam_trace_get_sizeof_handler (u32 * result);
-int ip6_trace_profile_setup (void);
-int ip6_trace_profile_cleanup (void);
-
-#define TSP_SECONDS 0
-#define TSP_MILLISECONDS 1
-#define TSP_MICROSECONDS 2
-#define TSP_NANOSECONDS 3
-
-#endif
-
-/*
- * fd.io coding-style-patch-verification: ON
- *
- * Local Variables:
- * eval: (c-set-style "gnu")
- * End:
- */
diff --git a/plugins/ioam-plugin/ioam/lib-vxlan-gpe/ioam_decap.c b/plugins/ioam-plugin/ioam/lib-vxlan-gpe/ioam_decap.c
deleted file mode 100644
index fd3086571eb..00000000000
--- a/plugins/ioam-plugin/ioam/lib-vxlan-gpe/ioam_decap.c
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- * Copyright (c) 2015 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include <vppinfra/error.h>
-#include <vppinfra/hash.h>
-#include <vnet/vnet.h>
-#include <vnet/ip/ip.h>
-#include <vnet/ethernet/ethernet.h>
-#include <vnet/vxlan-gpe/vxlan_gpe.h>
-#include <vnet/vxlan-gpe/vxlan_gpe.h>
-#include <ioam/lib-vxlan-gpe/vxlan_gpe_ioam_packet.h>
-#include <ioam/lib-vxlan-gpe/vxlan_gpe_ioam.h>
-#include <ioam/lib-vxlan-gpe/vxlan_gpe_ioam_util.h>
-
-/* Statistics (not really errors) */
-#define foreach_vxlan_gpe_decap_ioam_v4_error \
-_(DECAPSULATED, "good packets decapsulated")
-
-static char *vxlan_gpe_decap_ioam_v4_error_strings[] = {
-#define _(sym,string) string,
- foreach_vxlan_gpe_decap_ioam_v4_error
-#undef _
-};
-
-typedef enum
-{
-#define _(sym,str) VXLAN_GPE_DECAP_IOAM_V4_ERROR_##sym,
- foreach_vxlan_gpe_decap_ioam_v4_error
-#undef _
- VXLAN_GPE_DECAP_IOAM_V4_N_ERROR,
-} vxlan_gpe_decap_ioam_v4_error_t;
-
-
-always_inline void
-vxlan_gpe_decap_ioam_v4_two_inline (vlib_main_t * vm,
- vlib_node_runtime_t * node,
- vxlan_gpe_main_t * ngm,
- vlib_buffer_t * b0, vlib_buffer_t * b1,
- u32 * next0, u32 * next1)
-{
- vxlan_gpe_ioam_main_t *hm = &vxlan_gpe_ioam_main;
-
- next0[0] = next1[0] = hm->decap_v4_next_override;
- vxlan_gpe_encap_decap_ioam_v4_one_inline (vm, node, b0, &next0[0],
- VXLAN_GPE_DECAP_IOAM_V4_NEXT_DROP,
- 0 /* use_adj */ );
- vxlan_gpe_encap_decap_ioam_v4_one_inline (vm, node, b1, &next0[1],
- VXLAN_GPE_DECAP_IOAM_V4_NEXT_DROP,
- 0 /* use_adj */ );
-}
-
-
-
-static uword
-vxlan_gpe_decap_ioam (vlib_main_t * vm,
- vlib_node_runtime_t * node,
- vlib_frame_t * from_frame, u8 is_ipv6)
-{
- u32 n_left_from, next_index, *from, *to_next;
- vxlan_gpe_main_t *ngm = &vxlan_gpe_main;
- vxlan_gpe_ioam_main_t *hm = &vxlan_gpe_ioam_main;
-
- from = vlib_frame_vector_args (from_frame);
- n_left_from = from_frame->n_vectors;
-
- next_index = node->cached_next_index;
-
- while (n_left_from > 0)
- {
- u32 n_left_to_next;
-
- vlib_get_next_frame (vm, node, next_index, to_next, n_left_to_next);
-
- while (n_left_from >= 4 && n_left_to_next >= 2)
- {
- u32 bi0, bi1;
- vlib_buffer_t *b0, *b1;
- u32 next0, next1;
-
- next0 = next1 = hm->decap_v4_next_override;
-
- /* Prefetch next iteration. */
- {
- vlib_buffer_t *p2, *p3;
-
- p2 = vlib_get_buffer (vm, from[2]);
- p3 = vlib_get_buffer (vm, from[3]);
-
- vlib_prefetch_buffer_header (p2, LOAD);
- vlib_prefetch_buffer_header (p3, LOAD);
-
- CLIB_PREFETCH (p2->data, 2 * CLIB_CACHE_LINE_BYTES, LOAD);
- CLIB_PREFETCH (p3->data, 2 * CLIB_CACHE_LINE_BYTES, LOAD);
- }
-
- bi0 = from[0];
- bi1 = from[1];
- to_next[0] = bi0;
- to_next[1] = bi1;
- from += 2;
- to_next += 2;
- n_left_to_next -= 2;
- n_left_from -= 2;
-
- b0 = vlib_get_buffer (vm, bi0);
- b1 = vlib_get_buffer (vm, bi1);
-
-
- vlib_buffer_advance (b0,
- -(word) (sizeof (udp_header_t) +
- sizeof (ip4_header_t) +
- sizeof (vxlan_gpe_header_t)));
- vlib_buffer_advance (b1,
- -(word) (sizeof (udp_header_t) +
- sizeof (ip4_header_t) +
- sizeof (vxlan_gpe_header_t)));
-
- vxlan_gpe_decap_ioam_v4_two_inline (vm, node, ngm, b0, b1,
- &next0, &next1);
-
-
- vlib_validate_buffer_enqueue_x2 (vm, node, next_index, to_next,
- n_left_to_next, bi0, bi1, next0,
- next1);
-
- if (PREDICT_FALSE (b0->flags & VLIB_BUFFER_IS_TRACED))
- {
- vxlan_gpe_ioam_v4_trace_t *tr = vlib_add_trace (vm, node, b0,
- sizeof (*tr));
- }
- }
-
- while (n_left_from > 0 && n_left_to_next > 0)
- {
- u32 bi0;
- vlib_buffer_t *b0;
- u32 next0 = hm->decap_v4_next_override;
-
- bi0 = from[0];
- to_next[0] = bi0;
- from += 1;
- to_next += 1;
- n_left_from -= 1;
- n_left_to_next -= 1;
-
- b0 = vlib_get_buffer (vm, bi0);
-
-
- vlib_buffer_advance (b0,
- -(word) (sizeof (udp_header_t) +
- sizeof (ip4_header_t) +
- sizeof (vxlan_gpe_header_t)));
-
- next0 = hm->decap_v4_next_override;
- vxlan_gpe_encap_decap_ioam_v4_one_inline (vm, node, b0,
- &next0,
- VXLAN_GPE_DECAP_IOAM_V4_NEXT_DROP,
- 0 /* use_adj */ );
-
- if (PREDICT_FALSE (b0->flags & VLIB_BUFFER_IS_TRACED))
- {
- vxlan_gpe_ioam_v4_trace_t *tr = vlib_add_trace (vm, node, b0,
- sizeof (*tr));
- }
- vlib_validate_buffer_enqueue_x1 (vm, node, next_index, to_next,
- n_left_to_next, bi0, next0);
- }
-
- vlib_put_next_frame (vm, node, next_index, n_left_to_next);
- }
-
- return from_frame->n_vectors;
-}
-
-
-static uword
-vxlan_gpe_decap_ioam_v4 (vlib_main_t * vm,
- vlib_node_runtime_t * node,
- vlib_frame_t * from_frame)
-{
- return vxlan_gpe_decap_ioam (vm, node, from_frame, 0);
-}
-
-
-/* *INDENT-OFF* */
-VLIB_REGISTER_NODE (vxlan_gpe_decap_ioam_v4_node) = {
- .function = vxlan_gpe_decap_ioam_v4,
- .name = "vxlan-gpe-decap-ioam-v4",
- .vector_size = sizeof (u32),
- .format_trace = format_vxlan_gpe_ioam_v4_trace,
- .type = VLIB_NODE_TYPE_INTERNAL,
-
- .n_errors = ARRAY_LEN(vxlan_gpe_decap_ioam_v4_error_strings),
- .error_strings = vxlan_gpe_decap_ioam_v4_error_strings,
-
- .n_next_nodes = VXLAN_GPE_DECAP_IOAM_V4_N_NEXT,
-
- .next_nodes = {
- [VXLAN_GPE_DECAP_IOAM_V4_NEXT_POP] = "vxlan-gpe-pop-ioam-v4",
- [VXLAN_GPE_DECAP_IOAM_V4_NEXT_DROP] = "error-drop",
- },
-};
-/* *INDENT-ON* */
-
-
-/*
- * fd.io coding-style-patch-verification: ON
- *
- * Local Variables:
- * eval: (c-set-style "gnu")
- * End:
- */
diff --git a/plugins/ioam-plugin/ioam/lib-vxlan-gpe/ioam_encap.c b/plugins/ioam-plugin/ioam/lib-vxlan-gpe/ioam_encap.c
deleted file mode 100644
index 4b18bfea533..00000000000
--- a/plugins/ioam-plugin/ioam/lib-vxlan-gpe/ioam_encap.c
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * Copyright (c) 2015 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include <vppinfra/error.h>
-#include <vppinfra/hash.h>
-#include <vnet/vnet.h>
-#include <vnet/ip/ip.h>
-#include <vnet/ethernet/ethernet.h>
-#include <vnet/vxlan-gpe/vxlan_gpe.h>
-#include <ioam/lib-vxlan-gpe/vxlan_gpe_ioam_packet.h>
-#include <ioam/lib-vxlan-gpe/vxlan_gpe_ioam.h>
-#include <ioam/lib-vxlan-gpe/vxlan_gpe_ioam_util.h>
-
-/* Statistics (not really errors) */
-#define foreach_vxlan_gpe_encap_ioam_v4_error \
-_(ENCAPSULATED, "good packets encapsulated")
-
-static char *vxlan_gpe_encap_ioam_v4_error_strings[] = {
-#define _(sym,string) string,
- foreach_vxlan_gpe_encap_ioam_v4_error
-#undef _
-};
-
-typedef enum
-{
-#define _(sym,str) VXLAN_GPE_ENCAP_IOAM_V4_ERROR_##sym,
- foreach_vxlan_gpe_encap_ioam_v4_error
-#undef _
- VXLAN_GPE_ENCAP_IOAM_V4_N_ERROR,
-} vxlan_gpe_encap_ioam_v4_error_t;
-
-typedef enum
-{
- VXLAN_GPE_ENCAP_IOAM_V4_NEXT_IP4_LOOKUP,
- VXLAN_GPE_ENCAP_IOAM_V4_NEXT_DROP,
- VXLAN_GPE_ENCAP_IOAM_V4_N_NEXT
-} vxlan_gpe_encap_ioam_v4_next_t;
-
-
-always_inline void
-vxlan_gpe_encap_ioam_v4_two_inline (vlib_main_t * vm,
- vlib_node_runtime_t * node,
- vxlan_gpe_main_t * ngm,
- vlib_buffer_t * b0, vlib_buffer_t * b1,
- u32 * next0, u32 * next1)
-{
- next0[0] = next1[0] = VXLAN_GPE_ENCAP_IOAM_V4_NEXT_IP4_LOOKUP;
- vxlan_gpe_encap_decap_ioam_v4_one_inline (vm, node, b0, next0,
- VXLAN_GPE_ENCAP_IOAM_V4_NEXT_DROP,
- 0 /* use_adj */ );
- vxlan_gpe_encap_decap_ioam_v4_one_inline (vm, node, b1, next1,
- VXLAN_GPE_ENCAP_IOAM_V4_NEXT_DROP,
- 0 /* use_adj */ );
-}
-
-
-static uword
-vxlan_gpe_encap_ioam_v4 (vlib_main_t * vm,
- vlib_node_runtime_t * node,
- vlib_frame_t * from_frame)
-{
- u32 n_left_from, next_index, *from, *to_next;
- vxlan_gpe_main_t *ngm = &vxlan_gpe_main;
-
- from = vlib_frame_vector_args (from_frame);
- n_left_from = from_frame->n_vectors;
-
- next_index = node->cached_next_index;
-
- while (n_left_from > 0)
- {
- u32 n_left_to_next;
-
- vlib_get_next_frame (vm, node, next_index, to_next, n_left_to_next);
-
- while (n_left_from >= 4 && n_left_to_next >= 2)
- {
- u32 bi0, bi1;
- vlib_buffer_t *b0, *b1;
- u32 next0, next1;
-
- next0 = next1 = VXLAN_GPE_ENCAP_IOAM_V4_NEXT_IP4_LOOKUP;
-
- /* Prefetch next iteration. */
- {
- vlib_buffer_t *p2, *p3;
-
- p2 = vlib_get_buffer (vm, from[2]);
- p3 = vlib_get_buffer (vm, from[3]);
-
- vlib_prefetch_buffer_header (p2, LOAD);
- vlib_prefetch_buffer_header (p3, LOAD);
-
- CLIB_PREFETCH (p2->data, 2 * CLIB_CACHE_LINE_BYTES, LOAD);
- CLIB_PREFETCH (p3->data, 2 * CLIB_CACHE_LINE_BYTES, LOAD);
- }
-
- bi0 = from[0];
- bi1 = from[1];
- to_next[0] = bi0;
- to_next[1] = bi1;
- from += 2;
- to_next += 2;
- n_left_to_next -= 2;
- n_left_from -= 2;
-
- b0 = vlib_get_buffer (vm, bi0);
- b1 = vlib_get_buffer (vm, bi1);
-
- vxlan_gpe_encap_ioam_v4_two_inline (vm, node, ngm, b0, b1,
- &next0, &next1);
-
-
- vlib_validate_buffer_enqueue_x2 (vm, node, next_index, to_next,
- n_left_to_next, bi0, bi1, next0,
- next1);
- }
-
- while (n_left_from > 0 && n_left_to_next > 0)
- {
- u32 bi0;
- vlib_buffer_t *b0;
- u32 next0 = VXLAN_GPE_ENCAP_IOAM_V4_NEXT_IP4_LOOKUP;
-
- bi0 = from[0];
- to_next[0] = bi0;
- from += 1;
- to_next += 1;
- n_left_from -= 1;
- n_left_to_next -= 1;
-
- b0 = vlib_get_buffer (vm, bi0);
-
- vxlan_gpe_encap_decap_ioam_v4_one_inline (vm, node, b0,
- &next0,
- VXLAN_GPE_ENCAP_IOAM_V4_NEXT_DROP,
- 0 /* use_adj */ );
-
- if (PREDICT_FALSE (b0->flags & VLIB_BUFFER_IS_TRACED))
- {
- vxlan_gpe_ioam_v4_trace_t *tr = vlib_add_trace (vm, node, b0,
- sizeof (*tr));
- }
- vlib_validate_buffer_enqueue_x1 (vm, node, next_index, to_next,
- n_left_to_next, bi0, next0);
- }
-
- vlib_put_next_frame (vm, node, next_index, n_left_to_next);
- }
-
- return from_frame->n_vectors;
-}
-
-
-
-/* *INDENT-OFF* */
-VLIB_REGISTER_NODE (vxlan_gpe_encap_ioam_v4_node) = {
- .function = vxlan_gpe_encap_ioam_v4,
- .name = "vxlan-gpe-encap-ioam-v4",
- .vector_size = sizeof (u32),
- .format_trace = format_vxlan_gpe_ioam_v4_trace,
- .type = VLIB_NODE_TYPE_INTERNAL,
-
- .n_errors = ARRAY_LEN(vxlan_gpe_encap_ioam_v4_error_strings),
- .error_strings = vxlan_gpe_encap_ioam_v4_error_strings,
-
- .n_next_nodes = VXLAN_GPE_ENCAP_IOAM_V4_N_NEXT,
-
- .next_nodes = {
- [VXLAN_GPE_ENCAP_IOAM_V4_NEXT_IP4_LOOKUP] = "ip4-lookup",
- [VXLAN_GPE_ENCAP_IOAM_V4_NEXT_DROP] = "error-drop",
- },
-};
-/* *INDENT-ON* */
-
-
-/*
- * fd.io coding-style-patch-verification: ON
- *
- * Local Variables:
- * eval: (c-set-style "gnu")
- * End:
- */
diff --git a/plugins/ioam-plugin/ioam/lib-vxlan-gpe/ioam_pop.c b/plugins/ioam-plugin/ioam/lib-vxlan-gpe/ioam_pop.c
deleted file mode 100644
index 55c33b144a1..00000000000
--- a/plugins/ioam-plugin/ioam/lib-vxlan-gpe/ioam_pop.c
+++ /dev/null
@@ -1,353 +0,0 @@
-/*
- * Copyright (c) 2015 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include <vppinfra/error.h>
-#include <vppinfra/hash.h>
-#include <vnet/vnet.h>
-#include <vnet/ip/ip.h>
-#include <vnet/ethernet/ethernet.h>
-#include <vnet/vxlan-gpe/vxlan_gpe.h>
-#include <ioam/lib-vxlan-gpe/vxlan_gpe_ioam.h>
-
-/* Statistics (not really errors) */
-#define foreach_vxlan_gpe_pop_ioam_v4_error \
-_(POPPED, "good packets popped")
-
-static char *vxlan_gpe_pop_ioam_v4_error_strings[] = {
-#define _(sym,string) string,
- foreach_vxlan_gpe_pop_ioam_v4_error
-#undef _
-};
-
-typedef enum
-{
-#define _(sym,str) VXLAN_GPE_POP_IOAM_V4_ERROR_##sym,
- foreach_vxlan_gpe_pop_ioam_v4_error
-#undef _
- VXLAN_GPE_POP_IOAM_V4_N_ERROR,
-} vxlan_gpe_pop_ioam_v4_error_t;
-
-typedef struct
-{
- ioam_trace_t fmt_trace;
-} vxlan_gpe_pop_ioam_v4_trace_t;
-
-
-u8 *
-format_vxlan_gpe_pop_ioam_v4_trace (u8 * s, va_list * args)
-{
- CLIB_UNUSED (vlib_main_t * vm) = va_arg (*args, vlib_main_t *);
- CLIB_UNUSED (vlib_node_t * node) = va_arg (*args, vlib_node_t *);
- vxlan_gpe_pop_ioam_v4_trace_t *t1
- = va_arg (*args, vxlan_gpe_pop_ioam_v4_trace_t *);
- ioam_trace_t *t = &(t1->fmt_trace);
- vxlan_gpe_ioam_option_t *fmt_trace0;
- vxlan_gpe_ioam_option_t *opt0, *limit0;
- vxlan_gpe_ioam_main_t *hm = &vxlan_gpe_ioam_main;
-
- u8 type0;
-
- fmt_trace0 = (vxlan_gpe_ioam_option_t *) t->option_data;
-
- s = format (s, "VXLAN_GPE_IOAM_POP: next_index %d len %d traced %d",
- t->next_index, fmt_trace0->length, t->trace_len);
-
- opt0 = (vxlan_gpe_ioam_option_t *) (fmt_trace0 + 1);
- limit0 = (vxlan_gpe_ioam_option_t *) ((u8 *) fmt_trace0) + t->trace_len;
-
- while (opt0 < limit0)
- {
- type0 = opt0->type;
- switch (type0)
- {
- case 0: /* Pad, just stop */
- opt0 = (vxlan_gpe_ioam_option_t *) ((u8 *) opt0) + 1;
- break;
-
- default:
- if (hm->trace[type0])
- {
- s = (*hm->trace[type0]) (s, opt0);
- }
- else
- {
- s =
- format (s, "\n unrecognized option %d length %d", type0,
- opt0->length);
- }
- opt0 =
- (vxlan_gpe_ioam_option_t *) (((u8 *) opt0) + opt0->length +
- sizeof (vxlan_gpe_ioam_option_t));
- break;
- }
- }
-
- return s;
-}
-
-always_inline void
-vxlan_gpe_ioam_pop_v4 (vlib_main_t * vm, vlib_node_runtime_t * node,
- vlib_buffer_t * b0)
-{
- ip4_header_t *ip0;
- udp_header_t *udp_hdr0;
- vxlan_gpe_header_t *gpe_hdr0;
- vxlan_gpe_ioam_hdr_t *gpe_ioam0;
-
- ip0 = vlib_buffer_get_current (b0);
-
- udp_hdr0 = (udp_header_t *) (ip0 + 1);
- gpe_hdr0 = (vxlan_gpe_header_t *) (udp_hdr0 + 1);
- gpe_ioam0 = (vxlan_gpe_ioam_hdr_t *) (gpe_hdr0 + 1);
-
- /* Pop the iOAM data */
- vlib_buffer_advance (b0,
- (word) (sizeof (udp_header_t) +
- sizeof (ip4_header_t) +
- sizeof (vxlan_gpe_header_t) +
- gpe_ioam0->length));
-
- return;
-}
-
-
-
-always_inline void
-vxlan_gpe_pop_ioam_v4_one_inline (vlib_main_t * vm,
- vlib_node_runtime_t * node,
- vxlan_gpe_main_t * ngm,
- vlib_buffer_t * b0, u32 * next0)
-{
- CLIB_UNUSED (ip4_header_t * ip0);
- CLIB_UNUSED (udp_header_t * udp_hdr0);
- CLIB_UNUSED (vxlan_gpe_header_t * gpe_hdr0);
- CLIB_UNUSED (vxlan_gpe_ioam_hdr_t * gpe_ioam0);
- CLIB_UNUSED (vxlan_gpe_ioam_option_t * opt0);
- CLIB_UNUSED (vxlan_gpe_ioam_option_t * limit0);
- vxlan_gpe_ioam_main_t *hm = &vxlan_gpe_ioam_main;
-
-
- /* Pop the iOAM header */
- ip0 = vlib_buffer_get_current (b0);
- udp_hdr0 = (udp_header_t *) (ip0 + 1);
- gpe_hdr0 = (vxlan_gpe_header_t *) (udp_hdr0 + 1);
- gpe_ioam0 = (vxlan_gpe_ioam_hdr_t *) (gpe_hdr0 + 1);
- opt0 = (vxlan_gpe_ioam_option_t *) (gpe_ioam0 + 1);
- limit0 = (vxlan_gpe_ioam_option_t *) ((u8 *) gpe_ioam0 + gpe_ioam0->length);
-
- /*
- * Basic validity checks
- */
- if (gpe_ioam0->length > clib_net_to_host_u16 (ip0->length))
- {
- next0[0] = VXLAN_GPE_INPUT_NEXT_DROP;
- goto trace00;
- }
-
- /* Scan the set of h-b-h options, process ones that we understand */
- while (opt0 < limit0)
- {
- u8 type0;
- type0 = opt0->type;
- switch (type0)
- {
- case 0: /* Pad1 */
- opt0 = (vxlan_gpe_ioam_option_t *) ((u8 *) opt0) + 1;
- continue;
- case 1: /* PadN */
- break;
- default:
- if (hm->pop_options[type0])
- {
- if ((*hm->pop_options[type0]) (ip0, opt0) < 0)
- {
- next0[0] = VXLAN_GPE_INPUT_NEXT_DROP;
- goto trace00;
- }
- }
- break;
- }
- opt0 =
- (vxlan_gpe_ioam_option_t *) (((u8 *) opt0) + opt0->length +
- sizeof (vxlan_gpe_ioam_hdr_t));
- }
-
-
- next0[0] =
- (gpe_ioam0->protocol < VXLAN_GPE_PROTOCOL_MAX) ?
- ngm->
- decap_next_node_list[gpe_ioam0->protocol] : VXLAN_GPE_INPUT_NEXT_DROP;
-
-trace00:
- if (PREDICT_FALSE (b0->flags & VLIB_BUFFER_IS_TRACED))
- {
- vxlan_gpe_pop_ioam_v4_trace_t *t =
- vlib_add_trace (vm, node, b0, sizeof (*t));
- u32 trace_len = gpe_ioam0->length;
- t->fmt_trace.next_index = next0[0];
- /* Capture the h-b-h option verbatim */
- trace_len =
- trace_len <
- ARRAY_LEN (t->fmt_trace.
- option_data) ? trace_len : ARRAY_LEN (t->fmt_trace.
- option_data);
- t->fmt_trace.trace_len = trace_len;
- clib_memcpy (&(t->fmt_trace.option_data), gpe_ioam0, trace_len);
- }
-
- /* Remove the iOAM header inside the VxLAN-GPE header */
- vxlan_gpe_ioam_pop_v4 (vm, node, b0);
- return;
-}
-
-always_inline void
-vxlan_gpe_pop_ioam_v4_two_inline (vlib_main_t * vm,
- vlib_node_runtime_t * node,
- vxlan_gpe_main_t * ngm,
- vlib_buffer_t * b0, vlib_buffer_t * b1,
- u32 * next0, u32 * next1)
-{
-
- vxlan_gpe_pop_ioam_v4_one_inline (vm, node, ngm, b0, next0);
- vxlan_gpe_pop_ioam_v4_one_inline (vm, node, ngm, b1, next1);
-}
-
-
-
-static uword
-vxlan_gpe_pop_ioam (vlib_main_t * vm,
- vlib_node_runtime_t * node,
- vlib_frame_t * from_frame, u8 is_ipv6)
-{
- u32 n_left_from, next_index, *from, *to_next;
- vxlan_gpe_main_t *ngm = &vxlan_gpe_main;
-
- from = vlib_frame_vector_args (from_frame);
- n_left_from = from_frame->n_vectors;
-
- next_index = node->cached_next_index;
-
- while (n_left_from > 0)
- {
- u32 n_left_to_next;
-
- vlib_get_next_frame (vm, node, next_index, to_next, n_left_to_next);
-
- while (n_left_from >= 4 && n_left_to_next >= 2)
- {
- u32 bi0, bi1;
- vlib_buffer_t *b0, *b1;
- u32 next0, next1;
-
- /* Prefetch next iteration. */
- {
- vlib_buffer_t *p2, *p3;
-
- p2 = vlib_get_buffer (vm, from[2]);
- p3 = vlib_get_buffer (vm, from[3]);
-
- vlib_prefetch_buffer_header (p2, LOAD);
- vlib_prefetch_buffer_header (p3, LOAD);
-
- CLIB_PREFETCH (p2->data, 2 * CLIB_CACHE_LINE_BYTES, LOAD);
- CLIB_PREFETCH (p3->data, 2 * CLIB_CACHE_LINE_BYTES, LOAD);
- }
-
- bi0 = from[0];
- bi1 = from[1];
- to_next[0] = bi0;
- to_next[1] = bi1;
- from += 2;
- to_next += 2;
- n_left_to_next -= 2;
- n_left_from -= 2;
-
- b0 = vlib_get_buffer (vm, bi0);
- b1 = vlib_get_buffer (vm, bi1);
-
- vxlan_gpe_pop_ioam_v4_two_inline (vm, node, ngm, b0, b1, &next0,
- &next1);
-
-
- vlib_validate_buffer_enqueue_x2 (vm, node, next_index, to_next,
- n_left_to_next, bi0, bi1, next0,
- next1);
- }
-
- while (n_left_from > 0 && n_left_to_next > 0)
- {
- u32 bi0;
- vlib_buffer_t *b0;
- u32 next0;
-
- bi0 = from[0];
- to_next[0] = bi0;
- from += 1;
- to_next += 1;
- n_left_from -= 1;
- n_left_to_next -= 1;
-
- b0 = vlib_get_buffer (vm, bi0);
-
- vxlan_gpe_pop_ioam_v4_one_inline (vm, node, ngm, b0, &next0);
-
-
- vlib_validate_buffer_enqueue_x1 (vm, node, next_index, to_next,
- n_left_to_next, bi0, next0);
- }
-
- vlib_put_next_frame (vm, node, next_index, n_left_to_next);
- }
-
- return from_frame->n_vectors;
-}
-
-
-static uword
-vxlan_gpe_pop_ioam_v4 (vlib_main_t * vm,
- vlib_node_runtime_t * node, vlib_frame_t * from_frame)
-{
- return vxlan_gpe_pop_ioam (vm, node, from_frame, 0);
-}
-
-/* *INDENT-OFF* */
-VLIB_REGISTER_NODE (vxlan_gpe_pop_ioam_v4_node) = {
- .function = vxlan_gpe_pop_ioam_v4,
- .name = "vxlan-gpe-pop-ioam-v4",
- .vector_size = sizeof (u32),
- .format_trace = format_vxlan_gpe_pop_ioam_v4_trace,
- .type = VLIB_NODE_TYPE_INTERNAL,
-
- .n_errors = ARRAY_LEN(vxlan_gpe_pop_ioam_v4_error_strings),
- .error_strings = vxlan_gpe_pop_ioam_v4_error_strings,
-
- .n_next_nodes = VXLAN_GPE_INPUT_N_NEXT,
-
- .next_nodes = {
-#define _(s,n) [VXLAN_GPE_INPUT_NEXT_##s] = n,
- foreach_vxlan_gpe_input_next
-#undef _
- },
-};
-/* *INDENT-ON* */
-
-
-
-/*
- * fd.io coding-style-patch-verification: ON
- *
- * Local Variables:
- * eval: (c-set-style "gnu")
- * End:
- */
diff --git a/plugins/ioam-plugin/ioam/lib-vxlan-gpe/ioam_transit.c b/plugins/ioam-plugin/ioam/lib-vxlan-gpe/ioam_transit.c
deleted file mode 100644
index b42c357c79b..00000000000
--- a/plugins/ioam-plugin/ioam/lib-vxlan-gpe/ioam_transit.c
+++ /dev/null
@@ -1,188 +0,0 @@
- /*
- * Copyright (c) 2015 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include <vppinfra/error.h>
-#include <vppinfra/hash.h>
-#include <vnet/vnet.h>
-#include <vnet/ip/ip.h>
-#include <vnet/ip/udp.h>
-#include <vnet/ethernet/ethernet.h>
-#include <vnet/vxlan-gpe/vxlan_gpe.h>
-#include <ioam/lib-vxlan-gpe/vxlan_gpe_ioam_packet.h>
-#include <ioam/lib-vxlan-gpe/vxlan_gpe_ioam.h>
-#include <ioam/lib-vxlan-gpe/vxlan_gpe_ioam_util.h>
-#include <vnet/fib/ip6_fib.h>
-#include <vnet/fib/ip4_fib.h>
-#include <vnet/fib/fib_entry.h>
-
-/* Statistics (not really errors) */
-#define foreach_vxlan_gpe_transit_ioam_error \
-_(ENCAPSULATED, "good packets encapsulated")
-
-static char *vxlan_gpe_transit_ioam_error_strings[] = {
-#define _(sym,string) string,
- foreach_vxlan_gpe_transit_ioam_error
-#undef _
-};
-
-typedef enum
-{
-#define _(sym,str) VXLAN_GPE_TRANSIT_IOAM_ERROR_##sym,
- foreach_vxlan_gpe_transit_ioam_error
-#undef _
- VXLAN_GPE_TRANSIT_IOAM_N_ERROR,
-} vxlan_gpe_transit_ioam_error_t;
-
-typedef enum
-{
- VXLAN_GPE_TRANSIT_IOAM_NEXT_OUTPUT,
- VXLAN_GPE_TRANSIT_IOAM_NEXT_DROP,
- VXLAN_GPE_TRANSIT_IOAM_N_NEXT
-} vxlan_gpe_transit_ioam_next_t;
-
-
-/* *INDENT-OFF* */
-VNET_FEATURE_INIT (vxlan_gpe_transit_ioam, static) =
-{
- .arc_name = "ip4-output",
- .node_name = "vxlan-gpe-transit-ioam",
- .runs_before = VNET_FEATURES ("interface-output"),
-};
-/* *INDENT-ON* */
-
-static uword
-vxlan_gpe_transit_ioam (vlib_main_t * vm,
- vlib_node_runtime_t * node, vlib_frame_t * from_frame)
-{
- u32 n_left_from, next_index, *from, *to_next;
-
- from = vlib_frame_vector_args (from_frame);
- n_left_from = from_frame->n_vectors;
-
- next_index = node->cached_next_index;
-
- while (n_left_from > 0)
- {
- u32 n_left_to_next;
-
- vlib_get_next_frame (vm, node, next_index, to_next, n_left_to_next);
-
-
- while (n_left_from > 0 && n_left_to_next > 0)
- {
- u32 bi0;
- vlib_buffer_t *b0;
- u32 next0 = VXLAN_GPE_TRANSIT_IOAM_NEXT_OUTPUT;
-
- bi0 = from[0];
- to_next[0] = bi0;
- from += 1;
- to_next += 1;
- n_left_from -= 1;
- n_left_to_next -= 1;
- ip4_header_t *ip0;
- u32 iph_offset = 0;
-
- b0 = vlib_get_buffer (vm, bi0);
- iph_offset = vnet_buffer (b0)->ip.save_rewrite_length;
- ip0 = (ip4_header_t *) ((u8 *) vlib_buffer_get_current (b0)
- + iph_offset);
-
- /* just forward non ipv4 packets */
- if (PREDICT_FALSE
- ((ip0->ip_version_and_header_length & 0xF0) == 0x40))
- {
- /* ipv4 packets */
- udp_header_t *udp_hdr0 = (udp_header_t *) (ip0 + 1);
- if (PREDICT_FALSE
- ((ip0->protocol == IP_PROTOCOL_UDP) &&
- (clib_net_to_host_u16 (udp_hdr0->dst_port) ==
- UDP_DST_PORT_vxlan_gpe)))
- {
-
- /* Check the iOAM header */
- vxlan_gpe_header_t *gpe_hdr0 =
- (vxlan_gpe_header_t *) (udp_hdr0 + 1);
-
- if (PREDICT_FALSE
- (gpe_hdr0->protocol == VXLAN_GPE_PROTOCOL_IOAM))
- {
- uword *t = NULL;
- vxlan_gpe_ioam_main_t *hm = &vxlan_gpe_ioam_main;
- fib_prefix_t key4;
- memset (&key4, 0, sizeof (key4));
- key4.fp_proto = FIB_PROTOCOL_IP4;
- key4.fp_addr.ip4.as_u32 = ip0->dst_address.as_u32;
- t = hash_get_mem (hm->dst_by_ip4, &key4);
- if (t)
- {
-
-
- vlib_buffer_advance (b0,
- (word) (sizeof
- (ethernet_header_t)));
- vxlan_gpe_encap_decap_ioam_v4_one_inline (vm, node,
- b0,
- &next0,
- VXLAN_GPE_TRANSIT_IOAM_NEXT_DROP,
- 1
- /* use_adj */
- );
- vlib_buffer_advance (b0,
- -(word) (sizeof
- (ethernet_header_t)));
- }
- }
- }
- }
-
- vlib_validate_buffer_enqueue_x1 (vm, node, next_index, to_next,
- n_left_to_next, bi0, next0);
- }
-
- vlib_put_next_frame (vm, node, next_index, n_left_to_next);
- }
-
- return from_frame->n_vectors;
-}
-
-/* *INDENT-OFF* */
-VLIB_REGISTER_NODE (vxlan_gpe_transit_ioam_node) = {
- .function = vxlan_gpe_transit_ioam,
- .name = "vxlan-gpe-transit-ioam",
- .vector_size = sizeof (u32),
- .format_trace = format_vxlan_gpe_ioam_v4_trace,
- .type = VLIB_NODE_TYPE_INTERNAL,
-
- .n_errors = ARRAY_LEN(vxlan_gpe_transit_ioam_error_strings),
- .error_strings = vxlan_gpe_transit_ioam_error_strings,
-
- .n_next_nodes = VXLAN_GPE_TRANSIT_IOAM_N_NEXT,
-
- .next_nodes = {
- [VXLAN_GPE_TRANSIT_IOAM_NEXT_OUTPUT] = "interface-output",
- [VXLAN_GPE_TRANSIT_IOAM_NEXT_DROP] = "error-drop",
- },
-
-};
-/* *INDENT-ON* */
-
-
-/*
- * fd.io coding-style-patch-verification: ON
- *
- * Local Variables:
- * eval: (c-set-style "gnu")
- * End:
- */
diff --git a/plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe.api b/plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe.api
deleted file mode 100644
index 056529a4e8a..00000000000
--- a/plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe.api
+++ /dev/null
@@ -1,181 +0,0 @@
-/* Hey Emacs use -*- mode: C -*- */
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-/** \brief iOAM Over VxLAN-GPE - Set iOAM transport for VxLAN-GPE
- @param client_index - opaque cookie to identify the sender
- @param context - sender context, to match reply w/ request
- @param id - profile id
- @param trace_ppc - Trace PPC (none/encap/decap)
- @param pow_enable - Proof of Work enabled or not flag
- @param trace_enable - iOAM Trace enabled or not flag
-
-*/
-define vxlan_gpe_ioam_enable {
- u32 client_index;
- u32 context;
- u16 id;
- u8 trace_ppc;
- u8 pow_enable;
- u8 trace_enable;
-};
-
-/** \brief iOAM Over VxLAN-GPE - Set iOAM transport for VXLAN-GPE reply
- @param context - sender context, to match reply w/ request
- @param retval - return value for request
-*/
-define vxlan_gpe_ioam_enable_reply {
- u32 context;
- i32 retval;
-};
-
-
-/** \brief iOAM for VxLAN-GPE disable
- @param client_index - opaque cookie to identify the sender
- @param context - sender context, to match reply w/ request
- @param id - profile id
-*/
-define vxlan_gpe_ioam_disable
-{
- u32 client_index;
- u32 context;
- u16 id;
-};
-
-/** \brief vxlan_gpe_ioam disable response
- @param context - sender context, to match reply w/ request
- @param retval - return value for request
-*/
-define vxlan_gpe_ioam_disable_reply
-{
- u32 context;
- i32 retval;
-};
-
-/** \brief Enable iOAM for a VNI (VXLAN-GPE)
- @param client_index - opaque cookie to identify the sender
- @param context - sender context, to match reply w/ request
- @param vni - VXLAN-GPE VNI
- @param local - IPv4/6 Address of the local VTEP
- @param remote - IPv4/6 Address of the remote VTEP
-
-*/
-define vxlan_gpe_ioam_vni_enable {
- u32 client_index;
- u32 context;
- u32 vni;
- u8 local[16];
- u8 remote[16];
- u8 is_ipv6;
-};
-
-/** \brief Reply to enable iOAM for a VNI (VXLAN-GPE)
- @param client_index - opaque cookie to identify the sender
- @param context - sender context, to match reply w/ request
- @param retval - return value for request
-
-*/
-define vxlan_gpe_ioam_vni_enable_reply {
- u32 client_index;
- u32 context;
- i32 retval;
-};
-
-/** \brief Disable iOAM for a VNI (VXLAN-GPE)
- @param client_index - opaque cookie to identify the sender
- @param context - sender context, to match reply w/ request
- @param vni - VXLAN-GPE VNI
- @param local - IPv4/6 Address of the local VTEP
- @param remote - IPv4/6 Address of the remote VTEP
-
-*/
-define vxlan_gpe_ioam_vni_disable {
- u32 client_index;
- u32 context;
- u32 vni;
- u8 local[16];
- u8 remote[16];
- u8 is_ipv6;
-};
-
-/** \brief Reply to disable iOAM for a VNI (VXLAN-GPE)
- @param client_index - opaque cookie to identify the sender
- @param context - sender context, to match reply w/ request
- @param retval - return value for request
-
-*/
-define vxlan_gpe_ioam_vni_disable_reply {
- u32 client_index;
- u32 context;
- i32 retval;
-};
-
-
-/** \brief Enable iOAM for a VXLAN-GPE transit
- @param client_index - opaque cookie to identify the sender
- @param context - sender context, to match reply w/ request
- @param dst_addr - IPv4/6 Address of the local VTEP
- @param outer_fib_index- FIB index
-
-*/
-define vxlan_gpe_ioam_transit_enable {
- u32 client_index;
- u32 context;
- u32 outer_fib_index;
- u8 dst_addr[16];
- u8 is_ipv6;
-};
-
-/** \brief Reply to enable iOAM for VXLAN-GPE transit
- @param client_index - opaque cookie to identify the sender
- @param context - sender context, to match reply w/ request
- @param retval - return value for request
-
-*/
-define vxlan_gpe_ioam_transit_enable_reply {
- u32 client_index;
- u32 context;
- i32 retval;
-};
-
-/** \brief Disable iOAM for VXLAN-GPE transit
- @param client_index - opaque cookie to identify the sender
- @param context - sender context, to match reply w/ request
- @param dst_addr - IPv4/6 Address of the local VTEP
- @param outer_fib_index- FIB index
-
-*/
-define vxlan_gpe_ioam_transit_disable {
- u32 client_index;
- u32 context;
- u32 outer_fib_index;
- u8 dst_addr[16];
- u8 is_ipv6;
-};
-
-/** \brief Reply to disable iOAM for VXLAN-GPE transit
- @param client_index - opaque cookie to identify the sender
- @param context - sender context, to match reply w/ request
- @param retval - return value for request
-
-*/
-define vxlan_gpe_ioam_transit_disable_reply {
- u32 client_index;
- u32 context;
- i32 retval;
-};
-
-
diff --git a/plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe_all_api_h.h b/plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe_all_api_h.h
deleted file mode 100644
index bbf2c101f43..00000000000
--- a/plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe_all_api_h.h
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/* Include the generated file, see BUILT_SOURCES in Makefile.am */
-#include <ioam/lib-vxlan-gpe/vxlan_gpe.api.h>
diff --git a/plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe_api.c b/plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe_api.c
deleted file mode 100644
index 68752365f82..00000000000
--- a/plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe_api.c
+++ /dev/null
@@ -1,378 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- *------------------------------------------------------------------
- * vxlan_gpe_api.c - iOAM VxLAN-GPE related APIs to create
- * and maintain profiles
- *------------------------------------------------------------------
- */
-
-#include <vnet/vnet.h>
-#include <vnet/plugin/plugin.h>
-#include <ioam/lib-vxlan-gpe/vxlan_gpe_ioam.h>
-
-#include <vlibapi/api.h>
-#include <vlibmemory/api.h>
-#include <vlibsocket/api.h>
-
-/* define message IDs */
-#include <ioam/lib-vxlan-gpe/vxlan_gpe_msg_enum.h>
-
-/* define message structures */
-#define vl_typedefs
-#include <ioam/lib-vxlan-gpe/vxlan_gpe_all_api_h.h>
-#undef vl_typedefs
-
-/* define generated endian-swappers */
-#define vl_endianfun
-#include <ioam/lib-vxlan-gpe/vxlan_gpe_all_api_h.h>
-#undef vl_endianfun
-
-/* instantiate all the print functions we know about */
-#define vl_print(handle, ...) vlib_cli_output (handle, __VA_ARGS__)
-#define vl_printfun
-#include <ioam/lib-vxlan-gpe/vxlan_gpe_all_api_h.h>
-#undef vl_printfun
-
-/* Get the API version number */
-#define vl_api_version(n,v) static u32 api_version=(v);
-#include <ioam/lib-vxlan-gpe/vxlan_gpe_all_api_h.h>
-#undef vl_api_version
-
-/*
- * A handy macro to set up a message reply.
- * Assumes that the following variables are available:
- * mp - pointer to request message
- * rmp - pointer to reply message type
- * rv - return value
- */
-
-#define VXLAN_GPE_REPLY_MACRO(t) \
-do { \
- unix_shared_memory_queue_t * q = \
- vl_api_client_index_to_input_queue (mp->client_index); \
- if (!q) \
- return; \
- \
- rmp = vl_msg_api_alloc (sizeof (*rmp)); \
- rmp->_vl_msg_id = ntohs((t)+sm->msg_id_base); \
- rmp->context = mp->context; \
- rmp->retval = ntohl(rv); \
- \
- vl_msg_api_send_shmem (q, (u8 *)&rmp); \
-} while(0);
-
-/* *INDENT-OFF* */
-#define VXLAN_GPE_REPLY_MACRO2(t, body) \
-do { \
- unix_shared_memory_queue_t * q; \
- rv = vl_msg_api_pd_handler (mp, rv); \
- q = vl_api_client_index_to_input_queue (mp->client_index); \
- if (!q) \
- return; \
- \
- rmp = vl_msg_api_alloc (sizeof (*rmp)); \
- rmp->_vl_msg_id = ntohs((t)); \
- rmp->context = mp->context; \
- rmp->retval = ntohl(rv); \
- do {body;} while (0); \
- vl_msg_api_send_shmem (q, (u8 *)&rmp); \
-} while(0);
-/* *INDENT-ON* */
-
-/* List of message types that this plugin understands */
-
-#define foreach_vxlan_gpe_plugin_api_msg \
-_(VXLAN_GPE_IOAM_ENABLE, vxlan_gpe_ioam_enable) \
-_(VXLAN_GPE_IOAM_DISABLE, vxlan_gpe_ioam_disable) \
-_(VXLAN_GPE_IOAM_VNI_ENABLE, vxlan_gpe_ioam_vni_enable) \
-_(VXLAN_GPE_IOAM_VNI_DISABLE, vxlan_gpe_ioam_vni_disable) \
-_(VXLAN_GPE_IOAM_TRANSIT_ENABLE, vxlan_gpe_ioam_transit_enable) \
-_(VXLAN_GPE_IOAM_TRANSIT_DISABLE, vxlan_gpe_ioam_transit_disable) \
-
-
-static void vl_api_vxlan_gpe_ioam_enable_t_handler
- (vl_api_vxlan_gpe_ioam_enable_t * mp)
-{
- int rv = 0;
- vl_api_vxlan_gpe_ioam_enable_reply_t *rmp;
- clib_error_t *error;
- vxlan_gpe_ioam_main_t *sm = &vxlan_gpe_ioam_main;
-
- /* Ignoring the profile id as currently a single profile
- * is supported */
- error =
- vxlan_gpe_ioam_enable (mp->trace_enable, mp->pow_enable, mp->trace_ppc);
- if (error)
- {
- clib_error_report (error);
- rv = clib_error_get_code (error);
- }
-
- VXLAN_GPE_REPLY_MACRO (VL_API_VXLAN_GPE_IOAM_ENABLE_REPLY);
-}
-
-static void vl_api_vxlan_gpe_ioam_disable_t_handler
- (vl_api_vxlan_gpe_ioam_disable_t * mp)
-{
- int rv = 0;
- vl_api_vxlan_gpe_ioam_disable_reply_t *rmp;
- clib_error_t *error;
- vxlan_gpe_ioam_main_t *sm = &vxlan_gpe_ioam_main;
-
- /* Ignoring the profile id as currently a single profile
- * is supported */
- error = vxlan_gpe_ioam_disable (0, 0, 0);
- if (error)
- {
- clib_error_report (error);
- rv = clib_error_get_code (error);
- }
-
- VXLAN_GPE_REPLY_MACRO (VL_API_VXLAN_GPE_IOAM_DISABLE_REPLY);
-}
-
-static void vl_api_vxlan_gpe_ioam_vni_enable_t_handler
- (vl_api_vxlan_gpe_ioam_vni_enable_t * mp)
-{
- int rv = 0;
- vl_api_vxlan_gpe_ioam_vni_enable_reply_t *rmp;
- clib_error_t *error;
- vxlan_gpe_ioam_main_t *sm = &vxlan_gpe_ioam_main;
- vxlan4_gpe_tunnel_key_t key4;
- uword *p = NULL;
- vxlan_gpe_main_t *gm = &vxlan_gpe_main;
- vxlan_gpe_tunnel_t *t = 0;
- vxlan_gpe_ioam_main_t *hm = &vxlan_gpe_ioam_main;
- u32 vni;
-
-
- if (!mp->is_ipv6)
- {
- clib_memcpy (&key4.local, &mp->local, sizeof (key4.local));
- clib_memcpy (&key4.remote, &mp->remote, sizeof (key4.remote));
- vni = clib_net_to_host_u32 (mp->vni);
- key4.vni = clib_host_to_net_u32 (vni << 8);
- key4.pad = 0;
-
- p = hash_get_mem (gm->vxlan4_gpe_tunnel_by_key, &key4);
- }
- else
- {
- return;
- }
-
- if (!p)
- return;
-
- t = pool_elt_at_index (gm->tunnels, p[0]);
-
- error = vxlan_gpe_ioam_set (t, hm->has_trace_option,
- hm->has_pot_option,
- hm->has_ppc_option, mp->is_ipv6);
-
-
- if (error)
- {
- clib_error_report (error);
- rv = clib_error_get_code (error);
- }
-
- VXLAN_GPE_REPLY_MACRO (VL_API_VXLAN_GPE_IOAM_VNI_ENABLE_REPLY);
-}
-
-
-static void vl_api_vxlan_gpe_ioam_vni_disable_t_handler
- (vl_api_vxlan_gpe_ioam_vni_disable_t * mp)
-{
- int rv = 0;
- vl_api_vxlan_gpe_ioam_vni_enable_reply_t *rmp;
- clib_error_t *error;
- vxlan_gpe_ioam_main_t *sm = &vxlan_gpe_ioam_main;
- vxlan4_gpe_tunnel_key_t key4;
- uword *p = NULL;
- vxlan_gpe_main_t *gm = &vxlan_gpe_main;
- vxlan_gpe_tunnel_t *t = 0;
- u32 vni;
-
-
- if (!mp->is_ipv6)
- {
- clib_memcpy (&key4.local, &mp->local, sizeof (key4.local));
- clib_memcpy (&key4.remote, &mp->remote, sizeof (key4.remote));
- vni = clib_net_to_host_u32 (mp->vni);
- key4.vni = clib_host_to_net_u32 (vni << 8);
- key4.pad = 0;
-
- p = hash_get_mem (gm->vxlan4_gpe_tunnel_by_key, &key4);
- }
- else
- {
- return;
- }
-
- if (!p)
- return;
-
- t = pool_elt_at_index (gm->tunnels, p[0]);
-
- error = vxlan_gpe_ioam_clear (t, 0, 0, 0, 0);
-
-
- if (error)
- {
- clib_error_report (error);
- rv = clib_error_get_code (error);
- }
-
-
- VXLAN_GPE_REPLY_MACRO (VL_API_VXLAN_GPE_IOAM_VNI_DISABLE_REPLY);
-}
-
-static void vl_api_vxlan_gpe_ioam_transit_enable_t_handler
- (vl_api_vxlan_gpe_ioam_transit_enable_t * mp)
-{
- int rv = 0;
- vl_api_vxlan_gpe_ioam_transit_enable_reply_t *rmp;
- vxlan_gpe_ioam_main_t *sm = &vxlan_gpe_ioam_main;
- ip46_address_t dst_addr;
-
- memset (&dst_addr.ip4, 0, sizeof (dst_addr.ip4));
- if (!mp->is_ipv6)
- {
- clib_memcpy (&dst_addr.ip4, &mp->dst_addr, sizeof (dst_addr.ip4));
- }
- rv = vxlan_gpe_enable_disable_ioam_for_dest (sm->vlib_main,
- dst_addr,
- ntohl (mp->outer_fib_index),
- mp->is_ipv6 ? 0 : 1,
- 1 /* is_add */ );
-
- VXLAN_GPE_REPLY_MACRO (VL_API_VXLAN_GPE_IOAM_TRANSIT_ENABLE_REPLY);
-}
-
-static void vl_api_vxlan_gpe_ioam_transit_disable_t_handler
- (vl_api_vxlan_gpe_ioam_transit_disable_t * mp)
-{
- int rv = 0;
- vl_api_vxlan_gpe_ioam_transit_disable_reply_t *rmp;
- vxlan_gpe_ioam_main_t *sm = &vxlan_gpe_ioam_main;
- ip46_address_t dst_addr;
-
- memset (&dst_addr.ip4, 0, sizeof (dst_addr.ip4));
- if (!mp->is_ipv6)
- {
- clib_memcpy (&dst_addr.ip4, &mp->dst_addr, sizeof (dst_addr.ip4));
- }
-
- rv = vxlan_gpe_ioam_disable_for_dest (sm->vlib_main,
- dst_addr,
- ntohl (mp->outer_fib_index),
- mp->is_ipv6 ? 0 : 1);
- VXLAN_GPE_REPLY_MACRO (VL_API_VXLAN_GPE_IOAM_TRANSIT_DISABLE_REPLY);
-}
-
-
-/*
- * This routine exists to convince the vlib plugin framework that
- * we haven't accidentally copied a random .dll into the plugin directory.
- *
- * Also collects global variable pointers passed from the vpp engine
- */
-
-clib_error_t *
-vlib_plugin_register (vlib_main_t * vm, vnet_plugin_handoff_t * h,
- int from_early_init)
-{
- vxlan_gpe_ioam_main_t *sm = &vxlan_gpe_ioam_main;
- clib_error_t *error = 0;
-
- sm->vlib_main = vm;
- sm->vnet_main = h->vnet_main;
- sm->unix_time_0 = (u32) time (0); /* Store starting time */
- sm->vlib_time_0 = vlib_time_now (vm);
- return error;
-}
-
-/* Set up the API message handling tables */
-static clib_error_t *
-vxlan_gpe_plugin_api_hookup (vlib_main_t * vm)
-{
- vxlan_gpe_ioam_main_t *sm = &vxlan_gpe_ioam_main;
-#define _(N,n) \
- vl_msg_api_set_handlers((VL_API_##N + sm->msg_id_base), \
- #n, \
- vl_api_##n##_t_handler, \
- vl_noop_handler, \
- vl_api_##n##_t_endian, \
- vl_api_##n##_t_print, \
- sizeof(vl_api_##n##_t), 1);
- foreach_vxlan_gpe_plugin_api_msg;
-#undef _
-
- return 0;
-}
-
-static clib_error_t *
-vxlan_gpe_init (vlib_main_t * vm)
-{
- vxlan_gpe_ioam_main_t *sm = &vxlan_gpe_ioam_main;
- clib_error_t *error = 0;
- u8 *name;
- u32 encap_node_index = vxlan_gpe_encap_ioam_v4_node.index;
- u32 decap_node_index = vxlan_gpe_decap_ioam_v4_node.index;
- vlib_node_t *vxlan_gpe_encap_node = NULL;
- vlib_node_t *vxlan_gpe_decap_node = NULL;
- uword next_node = 0;
-
- name = format (0, "ioam_vxlan_gpe_%08x%c", api_version, 0);
-
- /* Ask for a correctly-sized block of API message decode slots */
- sm->msg_id_base = vl_msg_api_get_msg_ids
- ((char *) name, VL_MSG_FIRST_AVAILABLE);
-
- error = vxlan_gpe_plugin_api_hookup (vm);
-
- /* Hook the ioam-encap node to vxlan-gpe-encap */
- vxlan_gpe_encap_node = vlib_get_node_by_name (vm, (u8 *) "vxlan-gpe-encap");
- sm->encap_v4_next_node =
- vlib_node_add_next (vm, vxlan_gpe_encap_node->index, encap_node_index);
-
- vxlan_gpe_decap_node =
- vlib_get_node_by_name (vm, (u8 *) "vxlan4-gpe-input");
- next_node =
- vlib_node_add_next (vm, vxlan_gpe_decap_node->index, decap_node_index);
- vxlan_gpe_register_decap_protocol (VXLAN_GPE_PROTOCOL_IOAM, next_node);
-
- vec_new (vxlan_gpe_ioam_sw_interface_t, pool_elts (sm->sw_interfaces));
- sm->dst_by_ip4 = hash_create_mem (0, sizeof (fib_prefix_t), sizeof (uword));
-
- sm->dst_by_ip6 = hash_create_mem (0, sizeof (fib_prefix_t), sizeof (uword));
-
- vxlan_gpe_ioam_interface_init ();
- vec_free (name);
-
- return error;
-}
-
-VLIB_INIT_FUNCTION (vxlan_gpe_init);
-
-/*
- * fd.io coding-style-patch-verification: ON
- *
- * Local Variables:
- * eval: (c-set-style "gnu")
- * End:
- */
diff --git a/plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe_ioam.c b/plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe_ioam.c
deleted file mode 100644
index 6c04d9af210..00000000000
--- a/plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe_ioam.c
+++ /dev/null
@@ -1,773 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include <vnet/vxlan-gpe/vxlan_gpe.h>
-#include <vnet/vxlan-gpe/vxlan_gpe_packet.h>
-#include <vnet/ip/format.h>
-#include <ioam/lib-vxlan-gpe/vxlan_gpe_ioam.h>
-#include <vnet/fib/ip6_fib.h>
-#include <vnet/fib/ip4_fib.h>
-#include <vnet/fib/fib_entry.h>
-
-vxlan_gpe_ioam_main_t vxlan_gpe_ioam_main;
-
-int
-vxlan_gpe_ioam_set_rewrite (vxlan_gpe_tunnel_t * t, int has_trace_option,
- int has_pot_option, int has_ppc_option,
- u8 ipv6_set)
-{
- vxlan_gpe_ioam_main_t *hm = &vxlan_gpe_ioam_main;
- u32 size;
- vxlan_gpe_ioam_hdr_t *vxlan_gpe_ioam_hdr;
- u8 *current;
- u8 trace_data_size = 0;
- u8 pot_data_size = 0;
-
- if (has_trace_option == 0 && has_pot_option == 0)
- return -1;
-
- /* Work out how much space we need */
- size = sizeof (vxlan_gpe_ioam_hdr_t);
-
- if (has_trace_option
- && hm->add_options[VXLAN_GPE_OPTION_TYPE_IOAM_TRACE] != 0)
- {
- size += sizeof (vxlan_gpe_ioam_option_t);
- size += hm->options_size[VXLAN_GPE_OPTION_TYPE_IOAM_TRACE];
- }
- if (has_pot_option
- && hm->add_options[VXLAN_GPE_OPTION_TYPE_IOAM_PROOF_OF_TRANSIT] != 0)
- {
- size += sizeof (vxlan_gpe_ioam_option_t);
- size += hm->options_size[VXLAN_GPE_OPTION_TYPE_IOAM_PROOF_OF_TRANSIT];
- }
-
- t->rewrite_size = size;
-
- if (!ipv6_set)
- {
- vxlan4_gpe_rewrite (t, size, VXLAN_GPE_PROTOCOL_IOAM,
- hm->encap_v4_next_node);
- vxlan_gpe_ioam_hdr =
- (vxlan_gpe_ioam_hdr_t *) (t->rewrite +
- sizeof (ip4_vxlan_gpe_header_t));
- }
- else
- {
- vxlan6_gpe_rewrite (t, size, VXLAN_GPE_PROTOCOL_IOAM,
- VXLAN_GPE_ENCAP_NEXT_IP6_LOOKUP);
- vxlan_gpe_ioam_hdr =
- (vxlan_gpe_ioam_hdr_t *) (t->rewrite +
- sizeof (ip6_vxlan_gpe_header_t));
- }
-
-
- vxlan_gpe_ioam_hdr->type = VXLAN_GPE_PROTOCOL_IOAM;
- /* Length of the header in octets */
- vxlan_gpe_ioam_hdr->length = size;
- vxlan_gpe_ioam_hdr->protocol = t->protocol;
- current = (u8 *) vxlan_gpe_ioam_hdr + sizeof (vxlan_gpe_ioam_hdr_t);
-
- if (has_trace_option
- && hm->add_options[VXLAN_GPE_OPTION_TYPE_IOAM_TRACE] != 0)
- {
- if (0 != hm->add_options[VXLAN_GPE_OPTION_TYPE_IOAM_TRACE] (current,
- &trace_data_size))
- return -1;
- current += trace_data_size;
- }
- if (has_pot_option
- && hm->add_options[VXLAN_GPE_OPTION_TYPE_IOAM_PROOF_OF_TRANSIT] != 0)
- {
- pot_data_size =
- hm->options_size[VXLAN_GPE_OPTION_TYPE_IOAM_PROOF_OF_TRANSIT];
- if (0 ==
- hm->add_options[VXLAN_GPE_OPTION_TYPE_IOAM_PROOF_OF_TRANSIT]
- (current, &pot_data_size))
- current += pot_data_size;
- }
-
- return 0;
-}
-
-int
-vxlan_gpe_ioam_clear_rewrite (vxlan_gpe_tunnel_t * t, int has_trace_option,
- int has_pot_option, int has_ppc_option,
- u8 ipv6_set)
-{
-
- t->rewrite_size = 0;
-
- if (!ipv6_set)
- {
- vxlan4_gpe_rewrite (t, 0, 0, VXLAN_GPE_ENCAP_NEXT_IP4_LOOKUP);
- }
- else
- {
- vxlan6_gpe_rewrite (t, 0, 0, VXLAN_GPE_ENCAP_NEXT_IP6_LOOKUP);
- }
-
-
- return 0;
-}
-
-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)
-{
- int rv;
- rv = vxlan_gpe_ioam_clear_rewrite (t, 0, 0, 0, 0);
-
- if (rv == 0)
- {
- return (0);
- }
- else
- {
- return clib_error_return_code (0, rv, 0,
- "vxlan_gpe_ioam_clear_rewrite returned %d",
- rv);
- }
-
-}
-
-
-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)
-{
- int rv;
- rv = vxlan_gpe_ioam_set_rewrite (t, has_trace_option,
- has_pot_option, has_ppc_option, ipv6_set);
-
- if (rv == 0)
- {
- return (0);
- }
- else
- {
- return clib_error_return_code (0, rv, 0,
- "vxlan_gpe_ioam_set_rewrite returned %d",
- rv);
- }
-
-}
-
-static void
-vxlan_gpe_set_clear_output_feature_on_intf (vlib_main_t * vm,
- u32 sw_if_index0, u8 is_add)
-{
-
-
-
- vnet_feature_enable_disable ("ip4-output", "vxlan-gpe-transit-ioam",
- sw_if_index0, is_add,
- 0 /* void *feature_config */ ,
- 0 /* u32 n_feature_config_bytes */ );
- return;
-}
-
-void
-vxlan_gpe_clear_output_feature_on_all_intfs (vlib_main_t * vm)
-{
- vnet_sw_interface_t *si = 0;
- vnet_main_t *vnm = vnet_get_main ();
- vnet_interface_main_t *im = &vnm->interface_main;
-
- pool_foreach (si, im->sw_interfaces, (
- {
- vxlan_gpe_set_clear_output_feature_on_intf
- (vm, si->sw_if_index, 0);
- }));
- return;
-}
-
-
-extern fib_forward_chain_type_t
-fib_entry_get_default_chain_type (const fib_entry_t * fib_entry);
-
-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_main_t *hm = &vxlan_gpe_ioam_main;
- u32 fib_index0 = 0;
- u32 sw_if_index0 = ~0;
-
- fib_node_index_t fei = ~0;
- fib_entry_t *fib_entry;
- u32 adj_index0;
- ip_adjacency_t *adj0;
- fib_prefix_t fib_prefix;
- //fib_forward_chain_type_t fct;
- load_balance_t *lb_m, *lb_b;
- const dpo_id_t *dpo0, *dpo1;
- u32 i, j;
- //vnet_hw_interface_t *hw;
-
- if (is_ipv4)
- {
- memset (&fib_prefix, 0, sizeof (fib_prefix_t));
- fib_prefix.fp_len = 32;
- fib_prefix.fp_proto = FIB_PROTOCOL_IP4;
- fib_prefix.fp_addr = dst_addr;
- }
- else
- {
- return 0;
- }
-
- fei = fib_table_lookup (fib_index0, &fib_prefix);
- fib_entry = fib_entry_get (fei);
-
- //fct = fib_entry_get_default_chain_type (fib_entry);
-
- if (!dpo_id_is_valid (&fib_entry->fe_lb /*[fct] */ ))
- {
- return (-1);
- }
-
- lb_m = load_balance_get (fib_entry->fe_lb /*[fct] */ .dpoi_index);
-
- for (i = 0; i < lb_m->lb_n_buckets; i++)
- {
- dpo0 = load_balance_get_bucket_i (lb_m, i);
-
- if (dpo0->dpoi_type == DPO_LOAD_BALANCE)
- {
- lb_b = load_balance_get (dpo0->dpoi_index);
-
- for (j = 0; j < lb_b->lb_n_buckets; j++)
- {
- dpo1 = load_balance_get_bucket_i (lb_b, j);
-
- if (dpo1->dpoi_type == DPO_ADJACENCY)
- {
- adj_index0 = dpo1->dpoi_index;
-
- if (ADJ_INDEX_INVALID == adj_index0)
- {
- continue;
- }
-
- adj0 =
- ip_get_adjacency (&(ip4_main.lookup_main), adj_index0);
- sw_if_index0 = adj0->rewrite_header.sw_if_index;
-
- if (~0 == sw_if_index0)
- {
- continue;
- }
-
-
- if (is_add)
- {
- vnet_feature_enable_disable ("ip4-output",
- "vxlan-gpe-transit-ioam",
- sw_if_index0, is_add, 0
- /* void *feature_config */
- , 0 /* u32 n_feature_config_bytes */
- );
-
- vec_validate_init_empty (hm->bool_ref_by_sw_if_index,
- sw_if_index0, ~0);
- hm->bool_ref_by_sw_if_index[sw_if_index0] = 1;
- }
- else
- {
- hm->bool_ref_by_sw_if_index[sw_if_index0] = ~0;
- }
- }
- }
- }
- }
-
- if (is_ipv4)
- {
-
- uword *t = NULL;
- vxlan_gpe_ioam_dest_tunnels_t *t1;
- fib_prefix_t key4, *key4_copy;
- hash_pair_t *hp;
- memset (&key4, 0, sizeof (key4));
- key4.fp_proto = FIB_PROTOCOL_IP4;
- key4.fp_addr.ip4.as_u32 = fib_prefix.fp_addr.ip4.as_u32;
- t = hash_get_mem (hm->dst_by_ip4, &key4);
- if (is_add)
- {
- if (t)
- {
- return 0;
- }
- pool_get_aligned (hm->dst_tunnels, t1, CLIB_CACHE_LINE_BYTES);
- memset (t1, 0, sizeof (*t1));
- t1->fp_proto = FIB_PROTOCOL_IP4;
- t1->dst_addr.ip4.as_u32 = fib_prefix.fp_addr.ip4.as_u32;
- key4_copy = clib_mem_alloc (sizeof (*key4_copy));
- clib_memcpy (key4_copy, &key4, sizeof (*key4_copy));
- hash_set_mem (hm->dst_by_ip4, key4_copy, t1 - hm->dst_tunnels);
- /*
- * Attach to the FIB entry for the VxLAN-GPE destination
- * and become its child. The dest route will invoke a callback
- * when the fib entry changes, it can be used to
- * re-program the output feature on the egress interface.
- */
-
- const fib_prefix_t tun_dst_pfx = {
- .fp_len = 32,
- .fp_proto = FIB_PROTOCOL_IP4,
- .fp_addr = {.ip4 = t1->dst_addr.ip4,}
- };
-
- t1->fib_entry_index =
- fib_table_entry_special_add (outer_fib_index,
- &tun_dst_pfx,
- FIB_SOURCE_RR,
- FIB_ENTRY_FLAG_NONE,
- ADJ_INDEX_INVALID);
- t1->sibling_index =
- fib_entry_child_add (t1->fib_entry_index,
- hm->fib_entry_type, t1 - hm->dst_tunnels);
- t1->outer_fib_index = outer_fib_index;
-
- }
- else
- {
- if (!t)
- {
- return 0;
- }
- t1 = pool_elt_at_index (hm->dst_tunnels, t[0]);
- hp = hash_get_pair (hm->dst_by_ip4, &key4);
- key4_copy = (void *) (hp->key);
- hash_unset_mem (hm->dst_by_ip4, &key4);
- clib_mem_free (key4_copy);
- pool_put (hm->dst_tunnels, t1);
- }
- }
- else
- {
- // TBD for IPv6
- }
-
- return 0;
-}
-
-void
-vxlan_gpe_refresh_output_feature_on_all_dest (void)
-{
- vxlan_gpe_ioam_main_t *hm = &vxlan_gpe_ioam_main;
- vxlan_gpe_ioam_dest_tunnels_t *t;
- u32 i;
- if (pool_elts (hm->dst_tunnels) == 0)
- return;
- vxlan_gpe_clear_output_feature_on_all_intfs (hm->vlib_main);
- i = vec_len (hm->bool_ref_by_sw_if_index);
- vec_free (hm->bool_ref_by_sw_if_index);
- vec_validate_init_empty (hm->bool_ref_by_sw_if_index, i, ~0);
- pool_foreach (t, hm->dst_tunnels, (
- {
- vxlan_gpe_enable_disable_ioam_for_dest
- (hm->vlib_main,
- t->dst_addr,
- t->outer_fib_index,
- (t->fp_proto == FIB_PROTOCOL_IP4), 1
- /* is_add */
- );
- }
- ));
- return;
-}
-
-void
-vxlan_gpe_clear_output_feature_on_select_intfs (void)
-{
- vxlan_gpe_ioam_main_t *hm = &vxlan_gpe_ioam_main;
- u32 sw_if_index0 = 0;
- for (sw_if_index0 = 0;
- sw_if_index0 < vec_len (hm->bool_ref_by_sw_if_index); sw_if_index0++)
- {
- if (hm->bool_ref_by_sw_if_index[sw_if_index0] == 0xFF)
- {
- vxlan_gpe_set_clear_output_feature_on_intf
- (hm->vlib_main, sw_if_index0, 0);
- }
- }
-
- return;
-}
-
-static clib_error_t *
-vxlan_gpe_set_ioam_rewrite_command_fn (vlib_main_t *
- vm,
- unformat_input_t
- * input, vlib_cli_command_t * cmd)
-{
- vxlan_gpe_ioam_main_t *hm = &vxlan_gpe_ioam_main;
- ip46_address_t local, remote;
- u8 local_set = 0;
- u8 remote_set = 0;
- u8 ipv4_set = 0;
- u8 ipv6_set = 0;
- u32 vni;
- u8 vni_set = 0;
- u8 disable = 0;
- clib_error_t *rv = 0;
- vxlan4_gpe_tunnel_key_t key4;
- vxlan6_gpe_tunnel_key_t key6;
- uword *p;
- vxlan_gpe_main_t *gm = &vxlan_gpe_main;
- vxlan_gpe_tunnel_t *t = 0;
- while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
- {
- if (unformat (input, "local %U", unformat_ip4_address, &local.ip4))
- {
- local_set = 1;
- ipv4_set = 1;
- }
- else
- if (unformat (input, "remote %U", unformat_ip4_address, &remote.ip4))
- {
- remote_set = 1;
- ipv4_set = 1;
- }
- else if (unformat (input, "local %U", unformat_ip6_address, &local.ip6))
- {
- local_set = 1;
- ipv6_set = 1;
- }
- else
- if (unformat (input, "remote %U", unformat_ip6_address, &remote.ip6))
- {
- remote_set = 1;
- ipv6_set = 1;
- }
- else if (unformat (input, "vni %d", &vni))
- vni_set = 1;
- else if (unformat (input, "disable"))
- disable = 1;
- else
- break;
- }
-
- if (local_set == 0)
- return clib_error_return (0, "tunnel local address not specified");
- if (remote_set == 0)
- return clib_error_return (0, "tunnel remote address not specified");
- if (ipv4_set && ipv6_set)
- return clib_error_return (0, "both IPv4 and IPv6 addresses specified");
- if ((ipv4_set
- && memcmp (&local.ip4, &remote.ip4,
- sizeof (local.ip4)) == 0) || (ipv6_set
- &&
- memcmp
- (&local.ip6,
- &remote.ip6,
- sizeof (local.ip6)) == 0))
- return clib_error_return (0, "src and dst addresses are identical");
- if (vni_set == 0)
- return clib_error_return (0, "vni not specified");
- if (!ipv6_set)
- {
- key4.local = local.ip4.as_u32;
- key4.remote = remote.ip4.as_u32;
- key4.vni = clib_host_to_net_u32 (vni << 8);
- key4.pad = 0;
- p = hash_get_mem (gm->vxlan4_gpe_tunnel_by_key, &key4);
- }
- else
- {
- key6.local.as_u64[0] = local.ip6.as_u64[0];
- key6.local.as_u64[1] = local.ip6.as_u64[1];
- key6.remote.as_u64[0] = remote.ip6.as_u64[0];
- key6.remote.as_u64[1] = remote.ip6.as_u64[1];
- key6.vni = clib_host_to_net_u32 (vni << 8);
- p = hash_get_mem (gm->vxlan6_gpe_tunnel_by_key, &key6);
- }
-
- if (!p)
- return clib_error_return (0, "VxLAN Tunnel not found");
- t = pool_elt_at_index (gm->tunnels, p[0]);
- if (!disable)
- {
- rv =
- vxlan_gpe_ioam_set (t, hm->has_trace_option,
- hm->has_pot_option, hm->has_ppc_option, ipv6_set);
- }
- else
- {
- rv = vxlan_gpe_ioam_clear (t, 0, 0, 0, 0);
- }
- return rv;
-}
-
-
-/* *INDENT-OFF* */
-VLIB_CLI_COMMAND (vxlan_gpe_set_ioam_rewrite_cmd, static) = {
- .path = "set vxlan-gpe-ioam",
- .short_help = "set vxlan-gpe-ioam vxlan <src-ip> <dst_ip> <vnid> [disable]",
- .function = vxlan_gpe_set_ioam_rewrite_command_fn,
-};
-/* *INDENT-ON* */
-
-
-
-clib_error_t *
-vxlan_gpe_ioam_enable (int has_trace_option,
- int has_pot_option, int has_ppc_option)
-{
- vxlan_gpe_ioam_main_t *hm = &vxlan_gpe_ioam_main;
- hm->has_trace_option = has_trace_option;
- hm->has_pot_option = has_pot_option;
- hm->has_ppc_option = has_ppc_option;
- if (hm->has_trace_option)
- {
- vxlan_gpe_trace_profile_setup ();
- }
-
- return 0;
-}
-
-clib_error_t *
-vxlan_gpe_ioam_disable (int
- has_trace_option,
- int has_pot_option, int has_ppc_option)
-{
- vxlan_gpe_ioam_main_t *hm = &vxlan_gpe_ioam_main;
- hm->has_trace_option = has_trace_option;
- hm->has_pot_option = has_pot_option;
- hm->has_ppc_option = has_ppc_option;
- if (!hm->has_trace_option)
- {
- vxlan_gpe_trace_profile_cleanup ();
- }
-
- return 0;
-}
-
-void
-vxlan_gpe_set_next_override (uword next)
-{
- vxlan_gpe_ioam_main_t *hm = &vxlan_gpe_ioam_main;
- hm->decap_v4_next_override = next;
- return;
-}
-
-static clib_error_t *
-vxlan_gpe_set_ioam_flags_command_fn (vlib_main_t * vm,
- unformat_input_t
- * input, vlib_cli_command_t * cmd)
-{
- int has_trace_option = 0;
- int has_pot_option = 0;
- int has_ppc_option = 0;
- clib_error_t *rv = 0;
- while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
- {
- if (unformat (input, "trace"))
- has_trace_option = 1;
- else if (unformat (input, "pot"))
- has_pot_option = 1;
- else if (unformat (input, "ppc encap"))
- has_ppc_option = PPC_ENCAP;
- else if (unformat (input, "ppc decap"))
- has_ppc_option = PPC_DECAP;
- else if (unformat (input, "ppc none"))
- has_ppc_option = PPC_NONE;
- else
- break;
- }
-
-
- rv =
- vxlan_gpe_ioam_enable (has_trace_option, has_pot_option, has_ppc_option);
- return rv;
-}
-
-/* *INDENT-OFF* */
-VLIB_CLI_COMMAND (vxlan_gpe_set_ioam_flags_cmd, static) =
-{
-.path = "set vxlan-gpe-ioam rewrite",
-.short_help = "set vxlan-gpe-ioam [trace] [pot] [ppc <encap|decap>]",
-.function = vxlan_gpe_set_ioam_flags_command_fn,};
-/* *INDENT-ON* */
-
-
-int vxlan_gpe_ioam_disable_for_dest
- (vlib_main_t * vm, ip46_address_t dst_addr, u32 outer_fib_index,
- u8 ipv4_set)
-{
- vxlan_gpe_ioam_dest_tunnels_t *t;
- vxlan_gpe_ioam_main_t *hm = &vxlan_gpe_ioam_main;
-
- vxlan_gpe_enable_disable_ioam_for_dest (hm->vlib_main,
- dst_addr, outer_fib_index, ipv4_set,
- 0);
- if (pool_elts (hm->dst_tunnels) == 0)
- {
- vxlan_gpe_clear_output_feature_on_select_intfs ();
- return 0;
- }
-
- pool_foreach (t, hm->dst_tunnels, (
- {
- vxlan_gpe_enable_disable_ioam_for_dest
- (hm->vlib_main,
- t->dst_addr,
- t->outer_fib_index,
- (t->fp_proto ==
- FIB_PROTOCOL_IP4), 1 /* is_add */ );
- }
- ));
- vxlan_gpe_clear_output_feature_on_select_intfs ();
- return (0);
-
-}
-
-static clib_error_t *vxlan_gpe_set_ioam_transit_rewrite_command_fn
- (vlib_main_t * vm, unformat_input_t * input, vlib_cli_command_t * cmd)
-{
- vxlan_gpe_ioam_main_t *hm = &vxlan_gpe_ioam_main;
- ip46_address_t dst_addr;
- u8 dst_addr_set = 0;
- u8 ipv4_set = 0;
- u8 ipv6_set = 0;
- u8 disable = 0;
- clib_error_t *rv = 0;
- u32 outer_fib_index = 0;
- while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
- {
- if (unformat (input, "dst-ip %U", unformat_ip4_address, &dst_addr.ip4))
- {
- dst_addr_set = 1;
- ipv4_set = 1;
- }
- else
- if (unformat
- (input, "dst-ip %U", unformat_ip6_address, &dst_addr.ip6))
- {
- dst_addr_set = 1;
- ipv6_set = 1;
- }
- else if (unformat (input, "outer-fib-index %d", &outer_fib_index))
- {
- }
-
- else if (unformat (input, "disable"))
- disable = 1;
- else
- break;
- }
-
- if (dst_addr_set == 0)
- return clib_error_return (0, "tunnel destination address not specified");
- if (ipv4_set && ipv6_set)
- return clib_error_return (0, "both IPv4 and IPv6 addresses specified");
- if (!disable)
- {
- vxlan_gpe_enable_disable_ioam_for_dest (hm->vlib_main,
- dst_addr, outer_fib_index,
- ipv4_set, 1);
- }
- else
- {
- vxlan_gpe_ioam_disable_for_dest
- (vm, dst_addr, outer_fib_index, ipv4_set);
- }
- return rv;
-}
-
- /* *INDENT-OFF* */
-VLIB_CLI_COMMAND (vxlan_gpe_set_ioam_transit_rewrite_cmd, static) = {
- .path = "set vxlan-gpe-ioam-transit",
- .short_help = "set vxlan-gpe-ioam-transit dst-ip <dst_ip> [outer-fib-index <outer_fib_index>] [disable]",
- .function = vxlan_gpe_set_ioam_transit_rewrite_command_fn,
-};
-/* *INDENT-ON* */
-
-clib_error_t *clear_vxlan_gpe_ioam_rewrite_command_fn
- (vlib_main_t * vm, unformat_input_t * input, vlib_cli_command_t * cmd)
-{
- return (vxlan_gpe_ioam_disable (0, 0, 0));
-}
-
-/* *INDENT-OFF* */
-VLIB_CLI_COMMAND (vxlan_gpe_clear_ioam_flags_cmd, static) =
-{
-.path = "clear vxlan-gpe-ioam rewrite",
-.short_help = "clear vxlan-gpe-ioam rewrite",
-.function = clear_vxlan_gpe_ioam_rewrite_command_fn,
-};
-/* *INDENT-ON* */
-
-
-/**
- * Function definition to backwalk a FIB node
- */
-static fib_node_back_walk_rc_t
-vxlan_gpe_ioam_back_walk (fib_node_t * node, fib_node_back_walk_ctx_t * ctx)
-{
- vxlan_gpe_refresh_output_feature_on_all_dest ();
- return (FIB_NODE_BACK_WALK_CONTINUE);
-}
-
-/**
- * Function definition to get a FIB node from its index
- */
-static fib_node_t *
-vxlan_gpe_ioam_fib_node_get (fib_node_index_t index)
-{
- vxlan_gpe_ioam_main_t *hm = &vxlan_gpe_ioam_main;
- return (&hm->node);
-}
-
-/**
- * Function definition to inform the FIB node that its last lock has gone.
- */
-static void
-vxlan_gpe_ioam_last_lock_gone (fib_node_t * node)
-{
- ASSERT (0);
-}
-
-
-/*
- * Virtual function table registered by MPLS GRE tunnels
- * for participation in the FIB object graph.
- */
-const static fib_node_vft_t vxlan_gpe_ioam_vft = {
- .fnv_get = vxlan_gpe_ioam_fib_node_get,
- .fnv_last_lock = vxlan_gpe_ioam_last_lock_gone,
- .fnv_back_walk = vxlan_gpe_ioam_back_walk,
-};
-
-void
-vxlan_gpe_ioam_interface_init (void)
-{
- vxlan_gpe_ioam_main_t *hm = &vxlan_gpe_ioam_main;
- hm->fib_entry_type = fib_node_register_new_type (&vxlan_gpe_ioam_vft);
- return;
-}
-
-/*
- * fd.io coding-style-patch-verification: ON
- *
- * Local Variables:
- * eval: (c-set-style "gnu")
- * End:
- */
diff --git a/plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe_ioam.h b/plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe_ioam.h
deleted file mode 100644
index 3b7d72cf0c4..00000000000
--- a/plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe_ioam.h
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Copyright (c) 2015 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef __included_vxlan_gpe_ioam_h__
-#define __included_vxlan_gpe_ioam_h__
-
-#include <vnet/vxlan-gpe/vxlan_gpe.h>
-#include <vnet/vxlan-gpe/vxlan_gpe_packet.h>
-#include <ioam/lib-vxlan-gpe/vxlan_gpe_ioam_packet.h>
-#include <vnet/ip/ip.h>
-
-
-typedef struct vxlan_gpe_sw_interface_
-{
- u32 sw_if_index;
-} vxlan_gpe_ioam_sw_interface_t;
-
-typedef struct vxlan_gpe_dest_tunnels_
-{
- ip46_address_t dst_addr;
- u32 fp_proto;
- u32 sibling_index;
- fib_node_index_t fib_entry_index;
- u32 outer_fib_index;
-} vxlan_gpe_ioam_dest_tunnels_t;
-
-typedef struct vxlan_gpe_ioam_main_
-{
- /**
- * Linkage into the FIB object graph
- */
- fib_node_t node;
-
- /* time scale transform. Joy. */
- u32 unix_time_0;
- f64 vlib_time_0;
-
-
- /* Trace option */
- u8 has_trace_option;
-
- /* Pot option */
- u8 has_pot_option;
-
-#define PPC_NONE 0
-#define PPC_ENCAP 1
-#define PPC_DECAP 2
- u8 has_ppc_option;
-
-#define TSP_SECONDS 0
-#define TSP_MILLISECONDS 1
-#define TSP_MICROSECONDS 2
-#define TSP_NANOSECONDS 3
-
- /* Array of function pointers to ADD and POP VxLAN-GPE iOAM option handling routines */
- u8 options_size[256];
- int (*add_options[256]) (u8 * rewrite_string, u8 * rewrite_size);
- int (*pop_options[256]) (ip4_header_t * ip, vxlan_gpe_ioam_option_t * opt);
-
- /* Array of function pointers to iOAM option handling routines */
- int (*options[256]) (vlib_buffer_t * b, vxlan_gpe_ioam_option_t * opt,
- u8 is_ipv4, u8 use_adj);
- u8 *(*trace[256]) (u8 * s, vxlan_gpe_ioam_option_t * opt);
-
- /* API message ID base */
- u16 msg_id_base;
-
- /* Override to export for iOAM */
- uword decap_v4_next_override;
- uword decap_v6_next_override;
-
- /* sequence of node graph for encap */
- uword encap_v4_next_node;
- uword encap_v6_next_node;
-
- /* Software interfaces. */
- vxlan_gpe_ioam_sw_interface_t *sw_interfaces;
-
- /* hash ip4/ip6 -> list of destinations for doing transit iOAM operation */
- vxlan_gpe_ioam_dest_tunnels_t *dst_tunnels;
- uword *dst_by_ip4;
- uword *dst_by_ip6;
-
- /** per sw_if_index, to maintain bitmap */
- u8 *bool_ref_by_sw_if_index;
- fib_node_type_t fib_entry_type;
-
- /** State convenience vlib_main_t */
- vlib_main_t *vlib_main;
- /** State convenience vnet_main_t */
- vnet_main_t *vnet_main;
-
-
-} vxlan_gpe_ioam_main_t;
-extern vxlan_gpe_ioam_main_t vxlan_gpe_ioam_main;
-
-/*
- * Primary h-b-h handler trace support
- */
-typedef struct
-{
- u32 next_index;
- u32 trace_len;
- u8 option_data[256];
-} ioam_trace_t;
-
-
-vlib_node_registration_t vxlan_gpe_encap_ioam_v4_node;
-vlib_node_registration_t vxlan_gpe_decap_ioam_v4_node;
-vlib_node_registration_t vxlan_gpe_transit_ioam_v4_node;
-
-clib_error_t *vxlan_gpe_ioam_enable (int has_trace_option, int has_pot_option,
- int has_ppc_option);
-
-clib_error_t *vxlan_gpe_ioam_disable (int has_trace_option,
- int has_pot_option, int has_ppc_option);
-
-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);
-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);
-
-int vxlan_gpe_ioam_add_register_option (u8 option,
- u8 size,
- int rewrite_options (u8 *
- rewrite_string,
- u8 *
- rewrite_size));
-
-int vxlan_gpe_add_unregister_option (u8 option);
-
-int vxlan_gpe_ioam_register_option (u8 option,
- int options (vlib_buffer_t * b,
- vxlan_gpe_ioam_option_t *
- opt, u8 is_ipv4, u8 use_adj),
- u8 * trace (u8 * s,
- vxlan_gpe_ioam_option_t *
- opt));
-int vxlan_gpe_ioam_unregister_option (u8 option);
-
-int vxlan_gpe_trace_profile_setup (void);
-
-int vxlan_gpe_trace_profile_cleanup (void);
-extern void vxlan_gpe_ioam_interface_init (void);
-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);
-int vxlan_gpe_ioam_disable_for_dest
- (vlib_main_t * vm, ip46_address_t dst_addr, u32 outer_fib_index,
- u8 ipv4_set);
-
-typedef enum
-{
- VXLAN_GPE_DECAP_IOAM_V4_NEXT_POP,
- VXLAN_GPE_DECAP_IOAM_V4_NEXT_DROP,
- VXLAN_GPE_DECAP_IOAM_V4_N_NEXT
-} vxlan_gpe_decap_ioam_v4_next_t;
-
-#endif
-
-/*
- * fd.io coding-style-patch-verification: ON
- *
- * Local Variables:
- * eval: (c-set-style "gnu")
- * End:
- */
diff --git a/plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe_ioam_packet.h b/plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe_ioam_packet.h
deleted file mode 100644
index a7ef859ec58..00000000000
--- a/plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe_ioam_packet.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (c) 2015 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef __included_vxlan_gpe_ioam_packet_h__
-#define __included_vxlan_gpe_ioam_packet_h__
-
-#include <vnet/vxlan-gpe/vxlan_gpe.h>
-#include <vnet/vxlan-gpe/vxlan_gpe_packet.h>
-#include <vnet/ip/ip.h>
-
-
-
-#define VXLAN_GPE_OPTION_TYPE_IOAM_TRACE 59
-#define VXLAN_GPE_OPTION_TYPE_IOAM_PROOF_OF_TRANSIT 60
-
-/**
- * @brief VXLAN GPE Extension (iOAM) Header definition
- */
-typedef struct
-{
- u8 type;
- u8 length;
- /** Reserved */
- u8 reserved;
- /** see vxlan_gpe_protocol_t */
- u8 protocol;
-} vxlan_gpe_ioam_hdr_t;
-
-/*
- * @brief VxLAN GPE iOAM Option definition
- */
-typedef struct
-{
- /* Option Type */
- u8 type;
- /* Length in octets of the option data field */
- u8 length;
-} vxlan_gpe_ioam_option_t;
-
-
-#endif
-
-
-/*
- * fd.io coding-style-patch-verification: ON
- *
- * Local Variables:
- * eval: (c-set-style "gnu")
- * End:
- */
diff --git a/plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe_ioam_trace.c b/plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe_ioam_trace.c
deleted file mode 100644
index e37b1642d96..00000000000
--- a/plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe_ioam_trace.c
+++ /dev/null
@@ -1,552 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include <vlib/vlib.h>
-#include <vnet/vnet.h>
-#include <vnet/pg/pg.h>
-#include <vppinfra/error.h>
-
-#include <vnet/vxlan-gpe/vxlan_gpe.h>
-#include <vnet/vxlan-gpe/vxlan_gpe_packet.h>
-
-#include <vppinfra/hash.h>
-#include <vppinfra/error.h>
-#include <vppinfra/elog.h>
-
-#include <ioam/lib-trace/trace_util.h>
-#include <ioam/lib-vxlan-gpe/vxlan_gpe_ioam.h>
-
-/* Timestamp precision multipliers for seconds, milliseconds, microseconds
- * and nanoseconds respectively.
- */
-static f64 trace_tsp_mul[4] = { 1, 1e3, 1e6, 1e9 };
-
-typedef union
-{
- u64 as_u64;
- u32 as_u32[2];
-} time_u64_t;
-
-
-/* *INDENT-OFF* */
-typedef CLIB_PACKED(struct {
- vxlan_gpe_ioam_option_t hdr;
- u8 ioam_trace_type;
- u8 data_list_elts_left;
- u32 elts[0]; /* Variable type. So keep it generic */
-}) vxlan_gpe_ioam_trace_option_t;
-/* *INDENT-ON* */
-
-
-#define foreach_vxlan_gpe_ioam_trace_stats \
- _(SUCCESS, "Pkts updated with TRACE records") \
- _(FAILED, "Errors in TRACE due to lack of TRACE records")
-
-static char *vxlan_gpe_ioam_trace_stats_strings[] = {
-#define _(sym,string) string,
- foreach_vxlan_gpe_ioam_trace_stats
-#undef _
-};
-
-typedef enum
-{
-#define _(sym,str) VXLAN_GPE_IOAM_TRACE_##sym,
- foreach_vxlan_gpe_ioam_trace_stats
-#undef _
- VXLAN_GPE_IOAM_TRACE_N_STATS,
-} vxlan_gpe_ioam_trace_stats_t;
-
-
-typedef struct
-{
- /* stats */
- u64 counters[ARRAY_LEN (vxlan_gpe_ioam_trace_stats_strings)];
-
- /* convenience */
- vlib_main_t *vlib_main;
- vnet_main_t *vnet_main;
-} vxlan_gpe_ioam_trace_main_t;
-
-vxlan_gpe_ioam_trace_main_t vxlan_gpe_ioam_trace_main;
-
-int
-vxlan_gpe_ioam_add_register_option (u8 option,
- u8 size,
- int rewrite_options (u8 * rewrite_string,
- u8 * rewrite_size))
-{
- vxlan_gpe_ioam_main_t *hm = &vxlan_gpe_ioam_main;
-
- ASSERT (option < ARRAY_LEN (hm->add_options));
-
- /* Already registered */
- if (hm->add_options[option])
- return (-1);
-
- hm->add_options[option] = rewrite_options;
- hm->options_size[option] = size;
-
- return (0);
-}
-
-int
-vxlan_gpe_add_unregister_option (u8 option)
-{
- vxlan_gpe_ioam_main_t *hm = &vxlan_gpe_ioam_main;
-
- ASSERT (option < ARRAY_LEN (hm->add_options));
-
- /* Not registered */
- if (!hm->add_options[option])
- return (-1);
-
- hm->add_options[option] = NULL;
- hm->options_size[option] = 0;
- return (0);
-}
-
-
-int
-vxlan_gpe_ioam_register_option (u8 option,
- int options (vlib_buffer_t * b,
- vxlan_gpe_ioam_option_t * opt,
- u8 is_ipv4, u8 use_adj),
- u8 * trace (u8 * s,
- vxlan_gpe_ioam_option_t * opt))
-{
- vxlan_gpe_ioam_main_t *im = &vxlan_gpe_ioam_main;
-
- ASSERT (option < ARRAY_LEN (im->options));
-
- /* Already registered */
- if (im->options[option])
- return (-1);
-
- im->options[option] = options;
- im->trace[option] = trace;
-
- return (0);
-}
-
-int
-vxlan_gpe_ioam_unregister_option (u8 option)
-{
- vxlan_gpe_ioam_main_t *hm = &vxlan_gpe_ioam_main;
-
- ASSERT (option < ARRAY_LEN (hm->options));
-
- /* Not registered */
- if (!hm->options[option])
- return (-1);
-
- hm->options[option] = NULL;
- hm->trace[option] = NULL;
-
- return (0);
-}
-
-
-always_inline void
-vxlan_gpe_ioam_trace_stats_increment_counter (u32 counter_index,
- u64 increment)
-{
- vxlan_gpe_ioam_trace_main_t *hm = &vxlan_gpe_ioam_trace_main;
-
- hm->counters[counter_index] += increment;
-}
-
-
-static u8 *
-format_ioam_data_list_element (u8 * s, va_list * args)
-{
- u32 *elt = va_arg (*args, u32 *);
- u8 *trace_type_p = va_arg (*args, u8 *);
- u8 trace_type = *trace_type_p;
-
-
- if (trace_type & BIT_TTL_NODEID)
- {
- u32 ttl_node_id_host_byte_order = clib_net_to_host_u32 (*elt);
- s = format (s, "ttl 0x%x node id 0x%x ",
- ttl_node_id_host_byte_order >> 24,
- ttl_node_id_host_byte_order & 0x00FFFFFF);
-
- elt++;
- }
-
- if (trace_type & BIT_ING_INTERFACE && trace_type & BIT_ING_INTERFACE)
- {
- u32 ingress_host_byte_order = clib_net_to_host_u32 (*elt);
- s = format (s, "ingress 0x%x egress 0x%x ",
- ingress_host_byte_order >> 16,
- ingress_host_byte_order & 0xFFFF);
- elt++;
- }
-
- if (trace_type & BIT_TIMESTAMP)
- {
- u32 ts_in_host_byte_order = clib_net_to_host_u32 (*elt);
- s = format (s, "ts 0x%x \n", ts_in_host_byte_order);
- elt++;
- }
-
- if (trace_type & BIT_APPDATA)
- {
- u32 appdata_in_host_byte_order = clib_net_to_host_u32 (*elt);
- s = format (s, "app 0x%x ", appdata_in_host_byte_order);
- elt++;
- }
-
- return s;
-}
-
-
-
-int
-vxlan_gpe_ioam_trace_rewrite_handler (u8 * rewrite_string, u8 * rewrite_size)
-{
- vxlan_gpe_ioam_trace_option_t *trace_option = NULL;
- u8 trace_data_size = 0;
- u8 trace_option_elts = 0;
- trace_profile *profile = NULL;
-
-
- profile = trace_profile_find ();
-
- if (PREDICT_FALSE (!profile))
- {
- return (-1);
- }
-
- if (PREDICT_FALSE (!rewrite_string))
- return -1;
-
- trace_option_elts = profile->num_elts;
- trace_data_size = fetch_trace_data_size (profile->trace_type);
- trace_option = (vxlan_gpe_ioam_trace_option_t *) rewrite_string;
- trace_option->hdr.type = VXLAN_GPE_OPTION_TYPE_IOAM_TRACE;
- trace_option->hdr.length = 2 /*ioam_trace_type,data_list_elts_left */ +
- trace_option_elts * trace_data_size;
- trace_option->ioam_trace_type = profile->trace_type & TRACE_TYPE_MASK;
- trace_option->data_list_elts_left = trace_option_elts;
- *rewrite_size =
- sizeof (vxlan_gpe_ioam_trace_option_t) +
- (trace_option_elts * trace_data_size);
-
- return 0;
-}
-
-
-int
-vxlan_gpe_ioam_trace_data_list_handler (vlib_buffer_t * b,
- vxlan_gpe_ioam_option_t * opt,
- u8 is_ipv4, u8 use_adj)
-{
- u8 elt_index = 0;
- vxlan_gpe_ioam_trace_option_t *trace =
- (vxlan_gpe_ioam_trace_option_t *) opt;
- time_u64_t time_u64;
- u32 *elt;
- int rv = 0;
- trace_profile *profile = NULL;
- vxlan_gpe_ioam_main_t *hm = &vxlan_gpe_ioam_main;
-
-
- profile = trace_profile_find ();
-
- if (PREDICT_FALSE (!profile))
- {
- return (-1);
- }
-
-
- time_u64.as_u64 = 0;
-
- if (PREDICT_TRUE (trace->data_list_elts_left))
- {
- trace->data_list_elts_left--;
- /* fetch_trace_data_size returns in bytes. Convert it to 4-bytes
- * to skip to this node's location.
- */
- elt_index =
- trace->data_list_elts_left *
- fetch_trace_data_size (trace->ioam_trace_type) / 4;
- elt = &trace->elts[elt_index];
- if (is_ipv4)
- {
- if (trace->ioam_trace_type & BIT_TTL_NODEID)
- {
- ip4_header_t *ip0 = vlib_buffer_get_current (b);
- /* The transit case is the only case where the TTL decrement happens
- * before iOAM processing. For now, use the use_adj flag as an overload.
- * We can probably use a separate flag instead of overloading the use_adj flag.
- */
- *elt = clib_host_to_net_u32 (((ip0->ttl - 1 + use_adj) << 24) |
- profile->node_id);
- elt++;
- }
-
- if (trace->ioam_trace_type & BIT_ING_INTERFACE)
- {
- u16 tx_if = 0;
- u32 adj_index = vnet_buffer (b)->ip.adj_index[VLIB_TX];
- ip4_main_t *im4 = &ip4_main;
- ip_lookup_main_t *lm = &im4->lookup_main;
- if (use_adj)
- {
- ip_adjacency_t *adj = ip_get_adjacency (lm, adj_index);
- tx_if = adj->rewrite_header.sw_if_index & 0xFFFF;
- }
-
- *elt =
- (vnet_buffer (b)->sw_if_index[VLIB_RX] & 0xFFFF) << 16 |
- tx_if;
- *elt = clib_host_to_net_u32 (*elt);
- elt++;
- }
- }
- else
- {
- if (trace->ioam_trace_type & BIT_TTL_NODEID)
- {
- ip6_header_t *ip0 = vlib_buffer_get_current (b);
- *elt = clib_host_to_net_u32 ((ip0->hop_limit << 24) |
- profile->node_id);
- elt++;
- }
- if (trace->ioam_trace_type & BIT_ING_INTERFACE)
- {
- u16 tx_if = 0;
- u32 adj_index = vnet_buffer (b)->ip.adj_index[VLIB_TX];
- ip6_main_t *im6 = &ip6_main;
- ip_lookup_main_t *lm = &im6->lookup_main;
- if (use_adj)
- {
- ip_adjacency_t *adj = ip_get_adjacency (lm, adj_index);
- tx_if = adj->rewrite_header.sw_if_index & 0xFFFF;
- }
-
- *elt =
- (vnet_buffer (b)->sw_if_index[VLIB_RX] & 0xFFFF) << 16 |
- tx_if;
- *elt = clib_host_to_net_u32 (*elt);
- elt++;
- }
- }
-
- if (trace->ioam_trace_type & BIT_TIMESTAMP)
- {
- /* Send least significant 32 bits */
- f64 time_f64 =
- (f64) (((f64) hm->unix_time_0) +
- (vlib_time_now (hm->vlib_main) - hm->vlib_time_0));
-
- time_u64.as_u64 = time_f64 * trace_tsp_mul[profile->trace_tsp];
- *elt = clib_host_to_net_u32 (time_u64.as_u32[0]);
- elt++;
- }
-
- if (trace->ioam_trace_type & BIT_APPDATA)
- {
- /* $$$ set elt0->app_data */
- *elt = clib_host_to_net_u32 (profile->app_data);
- elt++;
- }
- vxlan_gpe_ioam_trace_stats_increment_counter
- (VXLAN_GPE_IOAM_TRACE_SUCCESS, 1);
- }
- else
- {
- vxlan_gpe_ioam_trace_stats_increment_counter
- (VXLAN_GPE_IOAM_TRACE_FAILED, 1);
- }
- return (rv);
-}
-
-u8 *
-vxlan_gpe_ioam_trace_data_list_trace_handler (u8 * s,
- vxlan_gpe_ioam_option_t * opt)
-{
- vxlan_gpe_ioam_trace_option_t *trace;
- u8 trace_data_size_in_words = 0;
- u32 *elt;
- int elt_index = 0;
-
- trace = (vxlan_gpe_ioam_trace_option_t *) opt;
- s =
- format (s, " Trace Type 0x%x , %d elts left\n", trace->ioam_trace_type,
- trace->data_list_elts_left);
- trace_data_size_in_words =
- fetch_trace_data_size (trace->ioam_trace_type) / 4;
- elt = &trace->elts[0];
- while ((u8 *) elt < ((u8 *) (&trace->elts[0]) + trace->hdr.length - 2
- /* -2 accounts for ioam_trace_type,elts_left */ ))
- {
- s = format (s, " [%d] %U\n", elt_index,
- format_ioam_data_list_element,
- elt, &trace->ioam_trace_type);
- elt_index++;
- elt += trace_data_size_in_words;
- }
- return (s);
-}
-
-
-static clib_error_t *
-vxlan_gpe_show_ioam_trace_cmd_fn (vlib_main_t * vm,
- unformat_input_t * input,
- vlib_cli_command_t * cmd)
-{
- vxlan_gpe_ioam_trace_main_t *hm = &vxlan_gpe_ioam_trace_main;
- u8 *s = 0;
- int i = 0;
-
- for (i = 0; i < VXLAN_GPE_IOAM_TRACE_N_STATS; i++)
- {
- s = format (s, " %s - %lu\n", vxlan_gpe_ioam_trace_stats_strings[i],
- hm->counters[i]);
- }
-
- vlib_cli_output (vm, "%v", s);
- vec_free (s);
- return 0;
-}
-
-
-/* *INDENT-OFF* */
-VLIB_CLI_COMMAND (vxlan_gpe_show_ioam_trace_cmd, static) = {
- .path = "show ioam vxlan-gpe trace",
- .short_help = "iOAM trace statistics",
- .function = vxlan_gpe_show_ioam_trace_cmd_fn,
-};
-/* *INDENT-ON* */
-
-
-static clib_error_t *
-vxlan_gpe_ioam_trace_init (vlib_main_t * vm)
-{
- vxlan_gpe_ioam_trace_main_t *hm = &vxlan_gpe_ioam_trace_main;
- clib_error_t *error;
-
- if ((error = vlib_call_init_function (vm, ip_main_init)))
- return (error);
-
- if ((error = vlib_call_init_function (vm, ip6_lookup_init)))
- return error;
-
- if ((error = vlib_call_init_function (vm, vxlan_gpe_init)))
- return (error);
-
- hm->vlib_main = vm;
- hm->vnet_main = vnet_get_main ();
- memset (hm->counters, 0, sizeof (hm->counters));
-
- if (vxlan_gpe_ioam_register_option
- (VXLAN_GPE_OPTION_TYPE_IOAM_TRACE,
- vxlan_gpe_ioam_trace_data_list_handler,
- vxlan_gpe_ioam_trace_data_list_trace_handler) < 0)
- return (clib_error_create
- ("registration of VXLAN_GPE_OPTION_TYPE_IOAM_TRACE failed"));
-
-
- if (vxlan_gpe_ioam_add_register_option
- (VXLAN_GPE_OPTION_TYPE_IOAM_TRACE,
- sizeof (vxlan_gpe_ioam_trace_option_t),
- vxlan_gpe_ioam_trace_rewrite_handler) < 0)
- return (clib_error_create
- ("registration of VXLAN_GPE_OPTION_TYPE_IOAM_TRACE for rewrite failed"));
-
-
- return (0);
-}
-
-VLIB_INIT_FUNCTION (vxlan_gpe_ioam_trace_init);
-
-int
-vxlan_gpe_trace_profile_cleanup (void)
-{
- vxlan_gpe_ioam_main_t *hm = &vxlan_gpe_ioam_main;
-
- hm->options_size[VXLAN_GPE_OPTION_TYPE_IOAM_TRACE] = 0;
-
- return 0;
-
-}
-
-static int
-vxlan_gpe_ioam_trace_get_sizeof_handler (u32 * result)
-{
- u16 size = 0;
- u8 trace_data_size = 0;
- trace_profile *profile = NULL;
-
- *result = 0;
-
- profile = trace_profile_find ();
-
- if (PREDICT_FALSE (!profile))
- {
- return (-1);
- }
-
- trace_data_size = fetch_trace_data_size (profile->trace_type);
- if (PREDICT_FALSE (trace_data_size == 0))
- return VNET_API_ERROR_INVALID_VALUE;
-
- if (PREDICT_FALSE (profile->num_elts * trace_data_size > 254))
- return VNET_API_ERROR_INVALID_VALUE;
-
- size +=
- sizeof (vxlan_gpe_ioam_trace_option_t) +
- profile->num_elts * trace_data_size;
- *result = size;
-
- return 0;
-}
-
-
-int
-vxlan_gpe_trace_profile_setup (void)
-{
- u32 trace_size = 0;
- vxlan_gpe_ioam_main_t *hm = &vxlan_gpe_ioam_main;
-
- trace_profile *profile = NULL;
-
-
- profile = trace_profile_find ();
-
- if (PREDICT_FALSE (!profile))
- {
- return (-1);
- }
-
-
- if (vxlan_gpe_ioam_trace_get_sizeof_handler (&trace_size) < 0)
- return (-1);
-
- hm->options_size[VXLAN_GPE_OPTION_TYPE_IOAM_TRACE] = trace_size;
-
- return (0);
-}
-
-
-
-/*
- * fd.io coding-style-patch-verification: ON
- *
- * Local Variables:
- * eval: (c-set-style "gnu")
- * End:
- */
diff --git a/plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe_ioam_util.h b/plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe_ioam_util.h
deleted file mode 100644
index c0ad8d9d03a..00000000000
--- a/plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe_ioam_util.h
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Copyright (c) 2015 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef __included_vxlan_gpe_ioam_util_h__
-#define __included_vxlan_gpe_ioam_util_h__
-
-#include <vnet/vxlan-gpe/vxlan_gpe.h>
-#include <vnet/vxlan-gpe/vxlan_gpe_packet.h>
-#include <vnet/ip/ip.h>
-
-
-typedef struct
-{
- u32 tunnel_index;
- ioam_trace_t fmt_trace;
-} vxlan_gpe_ioam_v4_trace_t;
-
-
-static u8 *
-format_vxlan_gpe_ioam_v4_trace (u8 * s, va_list * args)
-{
- CLIB_UNUSED (vlib_main_t * vm) = va_arg (*args, vlib_main_t *);
- CLIB_UNUSED (vlib_node_t * node) = va_arg (*args, vlib_node_t *);
- vxlan_gpe_ioam_v4_trace_t *t1 = va_arg (*args, vxlan_gpe_ioam_v4_trace_t *);
- ioam_trace_t *t = &(t1->fmt_trace);
- vxlan_gpe_ioam_option_t *fmt_trace0;
- vxlan_gpe_ioam_option_t *opt0, *limit0;
- vxlan_gpe_ioam_main_t *hm = &vxlan_gpe_ioam_main;
-
- u8 type0;
-
- fmt_trace0 = (vxlan_gpe_ioam_option_t *) t->option_data;
-
- s = format (s, "VXLAN-GPE-IOAM: next_index %d len %d traced %d",
- t->next_index, fmt_trace0->length, t->trace_len);
-
- opt0 = (vxlan_gpe_ioam_option_t *) (fmt_trace0 + 1);
- limit0 = (vxlan_gpe_ioam_option_t *) ((u8 *) fmt_trace0) + t->trace_len;
-
- while (opt0 < limit0)
- {
- type0 = opt0->type;
- switch (type0)
- {
- case 0: /* Pad, just stop */
- opt0 = (vxlan_gpe_ioam_option_t *) ((u8 *) opt0) + 1;
- break;
-
- default:
- if (hm->trace[type0])
- {
- s = (*hm->trace[type0]) (s, opt0);
- }
- else
- {
- s =
- format (s, "\n unrecognized option %d length %d", type0,
- opt0->length);
- }
- opt0 =
- (vxlan_gpe_ioam_option_t *) (((u8 *) opt0) + opt0->length +
- sizeof (vxlan_gpe_ioam_option_t));
- break;
- }
- }
-
- s = format (s, "VXLAN-GPE-IOAM: tunnel %d", t1->tunnel_index);
- return s;
-}
-
-
-always_inline void
-vxlan_gpe_encap_decap_ioam_v4_one_inline (vlib_main_t * vm,
- vlib_node_runtime_t * node,
- vlib_buffer_t * b0,
- u32 * next0, u32 drop_node_val,
- u8 use_adj)
-{
- ip4_header_t *ip0;
- udp_header_t *udp_hdr0;
- vxlan_gpe_header_t *gpe_hdr0;
- vxlan_gpe_ioam_hdr_t *gpe_ioam0;
- vxlan_gpe_ioam_option_t *opt0;
- vxlan_gpe_ioam_option_t *limit0;
- vxlan_gpe_ioam_main_t *hm = &vxlan_gpe_ioam_main;
-
- /* Populate the iOAM header */
- ip0 = vlib_buffer_get_current (b0);
- udp_hdr0 = (udp_header_t *) (ip0 + 1);
- gpe_hdr0 = (vxlan_gpe_header_t *) (udp_hdr0 + 1);
- gpe_ioam0 = (vxlan_gpe_ioam_hdr_t *) (gpe_hdr0 + 1);
- opt0 = (vxlan_gpe_ioam_option_t *) (gpe_ioam0 + 1);
- limit0 = (vxlan_gpe_ioam_option_t *) ((u8 *) gpe_ioam0 + gpe_ioam0->length);
-
- /*
- * Basic validity checks
- */
- if (gpe_ioam0->length > clib_net_to_host_u16 (ip0->length))
- {
- *next0 = drop_node_val;
- return;
- }
-
- /* Scan the set of h-b-h options, process ones that we understand */
- while (opt0 < limit0)
- {
- u8 type0;
- type0 = opt0->type;
- switch (type0)
- {
- case 0: /* Pad1 */
- opt0 = (vxlan_gpe_ioam_option_t *) ((u8 *) opt0) + 1;
- continue;
- case 1: /* PadN */
- break;
- default:
- if (hm->options[type0])
- {
- if ((*hm->options[type0]) (b0, opt0, 1 /* is_ipv4 */ ,
- use_adj) < 0)
- {
- *next0 = drop_node_val;
- return;
- }
- }
- break;
- }
- opt0 =
- (vxlan_gpe_ioam_option_t *) (((u8 *) opt0) + opt0->length +
- sizeof (vxlan_gpe_ioam_hdr_t));
- }
-
-
- if (PREDICT_FALSE (b0->flags & VLIB_BUFFER_IS_TRACED))
- {
- vxlan_gpe_ioam_v4_trace_t *t =
- vlib_add_trace (vm, node, b0, sizeof (*t));
- u32 trace_len = gpe_ioam0->length;
- t->fmt_trace.next_index = *next0;
- /* Capture the ioam option verbatim */
- trace_len =
- trace_len <
- ARRAY_LEN (t->fmt_trace.
- option_data) ? trace_len : ARRAY_LEN (t->fmt_trace.
- option_data);
- t->fmt_trace.trace_len = trace_len;
- clib_memcpy (&(t->fmt_trace.option_data), gpe_ioam0, trace_len);
- }
- return;
-}
-
-
-#endif
-
-/*
- * fd.io coding-style-patch-verification: ON
- *
- * Local Variables:
- * eval: (c-set-style "gnu")
- * End:
- */
diff --git a/plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe_msg_enum.h b/plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe_msg_enum.h
deleted file mode 100644
index cc0a10a3fec..00000000000
--- a/plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe_msg_enum.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef included_vxlan_gpe_msg_enum_h
-#define included_vxlan_gpe_msg_enum_h
-
-#include <vppinfra/byte_order.h>
-
-#define vl_msg_id(n,h) n,
-typedef enum {
-#include <ioam/lib-vxlan-gpe/vxlan_gpe_all_api_h.h>
- /* We'll want to know how many messages IDs we need... */
- VL_MSG_FIRST_AVAILABLE,
-} vl_msg_id_t;
-#undef vl_msg_id
-
-#endif /* included_vxlan_gpe_msg_enum_h */
diff --git a/plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe_test.c b/plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe_test.c
deleted file mode 100644
index 47253eb67ab..00000000000
--- a/plugins/ioam-plugin/ioam/lib-vxlan-gpe/vxlan_gpe_test.c
+++ /dev/null
@@ -1,600 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- *------------------------------------------------------------------
- * vxlan_gpe_test.c - test harness for vxlan_gpe plugin
- *------------------------------------------------------------------
- */
-
-#include <vat/vat.h>
-#include <vlibapi/api.h>
-#include <vlibmemory/api.h>
-#include <vlibsocket/api.h>
-#include <vppinfra/error.h>
-
-/* Declare message IDs */
-#include <ioam/lib-vxlan-gpe/vxlan_gpe_msg_enum.h>
-
-/* define message structures */
-#define vl_typedefs
-#include <ioam/lib-vxlan-gpe/vxlan_gpe_all_api_h.h>
-#undef vl_typedefs
-
-/* declare message handlers for each api */
-
-#define vl_endianfun /* define message structures */
-#include <ioam/lib-vxlan-gpe/vxlan_gpe_all_api_h.h>
-#undef vl_endianfun
-
-/* instantiate all the print functions we know about */
-#define vl_print(handle, ...)
-#define vl_printfun
-#include <ioam/lib-vxlan-gpe/vxlan_gpe_all_api_h.h>
-#undef vl_printfun
-
-/* Get the API version number. */
-#define vl_api_version(n,v) static u32 api_version=(v);
-#include <ioam/lib-vxlan-gpe/vxlan_gpe_all_api_h.h>
-#undef vl_api_version
-#include <ioam/lib-vxlan-gpe/vxlan_gpe_ioam_packet.h>
-#include <ioam/lib-vxlan-gpe/vxlan_gpe_ioam.h>
-
-typedef struct
-{
- /* API message ID base */
- u16 msg_id_base;
- vat_main_t *vat_main;
-} vxlan_gpe_test_main_t;
-
-vxlan_gpe_test_main_t vxlan_gpe_test_main;
-
-#define foreach_standard_reply_retval_handler \
-_(vxlan_gpe_ioam_enable_reply) \
-_(vxlan_gpe_ioam_disable_reply) \
-_(vxlan_gpe_ioam_vni_enable_reply) \
-_(vxlan_gpe_ioam_vni_disable_reply) \
-_(vxlan_gpe_ioam_transit_enable_reply) \
-_(vxlan_gpe_ioam_transit_disable_reply)
-
-#define _(n) \
- static void vl_api_##n##_t_handler \
- (vl_api_##n##_t * mp) \
- { \
- vat_main_t * vam = vxlan_gpe_test_main.vat_main; \
- i32 retval = ntohl(mp->retval); \
- if (vam->async_mode) { \
- vam->async_errors += (retval < 0); \
- } else { \
- vam->retval = retval; \
- vam->result_ready = 1; \
- } \
- }
-foreach_standard_reply_retval_handler;
-#undef _
-
-/*
- * Table of message reply handlers, must include boilerplate handlers
- * we just generated
- */
-#define foreach_vpe_api_reply_msg \
-_(VXLAN_GPE_IOAM_ENABLE_REPLY, vxlan_gpe_ioam_enable_reply) \
-_(VXLAN_GPE_IOAM_DISABLE_REPLY, vxlan_gpe_ioam_disable_reply) \
-_(VXLAN_GPE_IOAM_VNI_ENABLE_REPLY, vxlan_gpe_ioam_vni_enable_reply) \
-_(VXLAN_GPE_IOAM_VNI_DISABLE_REPLY, vxlan_gpe_ioam_vni_disable_reply) \
-_(VXLAN_GPE_IOAM_TRANSIT_ENABLE_REPLY, vxlan_gpe_ioam_transit_enable_reply) \
-_(VXLAN_GPE_IOAM_TRANSIT_DISABLE_REPLY, vxlan_gpe_ioam_transit_disable_reply) \
-
-
-/* M: construct, but don't yet send a message */
-
-#define M(T,t) \
-do { \
- vam->result_ready = 0; \
- mp = vl_msg_api_alloc(sizeof(*mp)); \
- memset (mp, 0, sizeof (*mp)); \
- mp->_vl_msg_id = ntohs (VL_API_##T + sm->msg_id_base); \
- mp->client_index = vam->my_client_index; \
-} while(0);
-
-#define M2(T,t,n) \
-do { \
- vam->result_ready = 0; \
- mp = vl_msg_api_alloc(sizeof(*mp)+(n)); \
- memset (mp, 0, sizeof (*mp)); \
- mp->_vl_msg_id = ntohs (VL_API_##T + sm->msg_id_base); \
- mp->client_index = vam->my_client_index; \
-} while(0);
-
-/* S: send a message */
-#define S (vl_msg_api_send_shmem (vam->vl_input_queue, (u8 *)&mp))
-
-/* W: wait for results, with timeout */
-#define W \
-do { \
- timeout = vat_time_now (vam) + 1.0; \
- \
- while (vat_time_now (vam) < timeout) { \
- if (vam->result_ready == 1) { \
- return (vam->retval); \
- } \
- } \
- return -99; \
-} while(0);
-
-
-static int
-api_vxlan_gpe_ioam_enable (vat_main_t * vam)
-{
- vxlan_gpe_test_main_t *sm = &vxlan_gpe_test_main;
-
- unformat_input_t *input = vam->input;
- vl_api_vxlan_gpe_ioam_enable_t *mp;
- f64 timeout;
- u32 id = 0;
- int has_trace_option = 0;
- int has_pow_option = 0;
- int has_ppc_option = 0;
-
- while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
- {
- if (unformat (input, "trace"))
- has_trace_option = 1;
- else if (unformat (input, "pow"))
- has_pow_option = 1;
- else if (unformat (input, "ppc encap"))
- has_ppc_option = PPC_ENCAP;
- else if (unformat (input, "ppc decap"))
- has_ppc_option = PPC_DECAP;
- else if (unformat (input, "ppc none"))
- has_ppc_option = PPC_NONE;
- else
- break;
- }
- M (VXLAN_GPE_IOAM_ENABLE, vxlan_gpe_ioam_enable);
- mp->id = htons (id);
- mp->trace_ppc = has_ppc_option;
- mp->pow_enable = has_pow_option;
- mp->trace_enable = has_trace_option;
-
-
- S;
- W;
-
- return (0);
-}
-
-
-static int
-api_vxlan_gpe_ioam_disable (vat_main_t * vam)
-{
- vxlan_gpe_test_main_t *sm = &vxlan_gpe_test_main;
- vl_api_vxlan_gpe_ioam_disable_t *mp;
- f64 timeout;
-
- M (VXLAN_GPE_IOAM_DISABLE, vxlan_gpe_ioam_disable);
- S;
- W;
- return 0;
-}
-
-static int
-api_vxlan_gpe_ioam_vni_enable (vat_main_t * vam)
-{
- vxlan_gpe_test_main_t *sm = &vxlan_gpe_test_main;
-
- unformat_input_t *line_input = vam->input;
- vl_api_vxlan_gpe_ioam_vni_enable_t *mp;
- ip4_address_t local4, remote4;
- ip6_address_t local6, remote6;
- u8 ipv4_set = 0, ipv6_set = 0;
- u8 local_set = 0;
- u8 remote_set = 0;
- u32 vni;
- u8 vni_set = 0;
- f64 timeout;
-
-
- while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
- {
- if (unformat (line_input, "local %U", unformat_ip4_address, &local4))
- {
- local_set = 1;
- ipv4_set = 1;
- }
- else if (unformat (line_input, "remote %U",
- unformat_ip4_address, &remote4))
- {
- remote_set = 1;
- ipv4_set = 1;
- }
- else if (unformat (line_input, "local %U",
- unformat_ip6_address, &local6))
- {
- local_set = 1;
- ipv6_set = 1;
- }
- else if (unformat (line_input, "remote %U",
- unformat_ip6_address, &remote6))
- {
- remote_set = 1;
- ipv6_set = 1;
- }
-
- else if (unformat (line_input, "vni %d", &vni))
- vni_set = 1;
- else
- {
- errmsg ("parse error '%U'\n", format_unformat_error, line_input);
- return -99;
- }
- }
-
- if (local_set == 0)
- {
- errmsg ("tunnel local address not specified\n");
- return -99;
- }
- if (remote_set == 0)
- {
- errmsg ("tunnel remote address not specified\n");
- return -99;
- }
- if (ipv4_set && ipv6_set)
- {
- errmsg ("both IPv4 and IPv6 addresses specified");
- return -99;
- }
-
- if (vni_set == 0)
- {
- errmsg ("vni not specified\n");
- return -99;
- }
-
- M (VXLAN_GPE_IOAM_VNI_ENABLE, vxlan_gpe_ioam_vni_enable);
-
-
- if (ipv6_set)
- {
- clib_memcpy (&mp->local, &local6, sizeof (local6));
- clib_memcpy (&mp->remote, &remote6, sizeof (remote6));
- }
- else
- {
- clib_memcpy (&mp->local, &local4, sizeof (local4));
- clib_memcpy (&mp->remote, &remote4, sizeof (remote4));
- }
-
- mp->vni = ntohl (vni);
- mp->is_ipv6 = ipv6_set;
-
- S;
- W;
-
- return (0);
-}
-
-static int
-api_vxlan_gpe_ioam_vni_disable (vat_main_t * vam)
-{
- vxlan_gpe_test_main_t *sm = &vxlan_gpe_test_main;
-
- unformat_input_t *line_input = vam->input;
- vl_api_vxlan_gpe_ioam_vni_disable_t *mp;
- ip4_address_t local4, remote4;
- ip6_address_t local6, remote6;
- u8 ipv4_set = 0, ipv6_set = 0;
- u8 local_set = 0;
- u8 remote_set = 0;
- u32 vni;
- u8 vni_set = 0;
- f64 timeout;
-
-
- while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
- {
- if (unformat (line_input, "local %U", unformat_ip4_address, &local4))
- {
- local_set = 1;
- ipv4_set = 1;
- }
- else if (unformat (line_input, "remote %U",
- unformat_ip4_address, &remote4))
- {
- remote_set = 1;
- ipv4_set = 1;
- }
- else if (unformat (line_input, "local %U",
- unformat_ip6_address, &local6))
- {
- local_set = 1;
- ipv6_set = 1;
- }
- else if (unformat (line_input, "remote %U",
- unformat_ip6_address, &remote6))
- {
- remote_set = 1;
- ipv6_set = 1;
- }
-
- else if (unformat (line_input, "vni %d", &vni))
- vni_set = 1;
- else
- {
- errmsg ("parse error '%U'\n", format_unformat_error, line_input);
- return -99;
- }
- }
-
- if (local_set == 0)
- {
- errmsg ("tunnel local address not specified\n");
- return -99;
- }
- if (remote_set == 0)
- {
- errmsg ("tunnel remote address not specified\n");
- return -99;
- }
- if (ipv4_set && ipv6_set)
- {
- errmsg ("both IPv4 and IPv6 addresses specified");
- return -99;
- }
-
- if (vni_set == 0)
- {
- errmsg ("vni not specified\n");
- return -99;
- }
-
- M (VXLAN_GPE_IOAM_VNI_DISABLE, vxlan_gpe_ioam_vni_disable);
-
-
- if (ipv6_set)
- {
- clib_memcpy (&mp->local, &local6, sizeof (local6));
- clib_memcpy (&mp->remote, &remote6, sizeof (remote6));
- }
- else
- {
- clib_memcpy (&mp->local, &local4, sizeof (local4));
- clib_memcpy (&mp->remote, &remote4, sizeof (remote4));
- }
-
- mp->vni = ntohl (vni);
- mp->is_ipv6 = ipv6_set;
-
- S;
- W;
-
- return 0;
-}
-
-static int
-api_vxlan_gpe_ioam_transit_enable (vat_main_t * vam)
-{
- vxlan_gpe_test_main_t *sm = &vxlan_gpe_test_main;
-
- unformat_input_t *line_input = vam->input;
- vl_api_vxlan_gpe_ioam_transit_enable_t *mp;
- ip4_address_t local4;
- ip6_address_t local6;
- u8 ipv4_set = 0, ipv6_set = 0;
- u8 local_set = 0;
- u32 outer_fib_index = 0;
- f64 timeout;
-
-
- while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
- {
- if (unformat (line_input, "dst-ip %U", unformat_ip4_address, &local4))
- {
- local_set = 1;
- ipv4_set = 1;
- }
- else if (unformat (line_input, "dst-ip %U",
- unformat_ip6_address, &local6))
- {
- local_set = 1;
- ipv6_set = 1;
- }
-
- else if (unformat (line_input, "outer-fib-index %d", &outer_fib_index))
- ;
- else
- {
- errmsg ("parse error '%U'\n", format_unformat_error, line_input);
- return -99;
- }
- }
-
- if (local_set == 0)
- {
- errmsg ("destination address not specified\n");
- return -99;
- }
- if (ipv4_set && ipv6_set)
- {
- errmsg ("both IPv4 and IPv6 addresses specified");
- return -99;
- }
-
-
- M (VXLAN_GPE_IOAM_TRANSIT_ENABLE, vxlan_gpe_ioam_transit_enable);
-
-
- if (ipv6_set)
- {
- errmsg ("IPv6 currently unsupported");
- return -1;
- }
- else
- {
- clib_memcpy (&mp->dst_addr, &local4, sizeof (local4));
- }
-
- mp->outer_fib_index = htonl (outer_fib_index);
- mp->is_ipv6 = ipv6_set;
-
- S;
- W;
-
- return (0);
-}
-
-static int
-api_vxlan_gpe_ioam_transit_disable (vat_main_t * vam)
-{
- vxlan_gpe_test_main_t *sm = &vxlan_gpe_test_main;
-
- unformat_input_t *line_input = vam->input;
- vl_api_vxlan_gpe_ioam_transit_disable_t *mp;
- ip4_address_t local4;
- ip6_address_t local6;
- u8 ipv4_set = 0, ipv6_set = 0;
- u8 local_set = 0;
- u32 outer_fib_index;
- f64 timeout;
-
-
- while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
- {
- if (unformat (line_input, "dst-ip %U", unformat_ip4_address, &local4))
- {
- local_set = 1;
- ipv4_set = 1;
- }
- else if (unformat (line_input, "dst-ip %U",
- unformat_ip6_address, &local6))
- {
- local_set = 1;
- ipv6_set = 1;
- }
-
- else if (unformat (line_input, "outer-fib-index %d", &outer_fib_index))
- ;
- else
- {
- errmsg ("parse error '%U'\n", format_unformat_error, line_input);
- return -99;
- }
- }
-
- if (local_set == 0)
- {
- errmsg ("destination address not specified\n");
- return -99;
- }
- if (ipv4_set && ipv6_set)
- {
- errmsg ("both IPv4 and IPv6 addresses specified");
- return -99;
- }
-
-
- M (VXLAN_GPE_IOAM_TRANSIT_DISABLE, vxlan_gpe_ioam_transit_disable);
-
-
- if (ipv6_set)
- {
- return -1;
- }
- else
- {
- clib_memcpy (&mp->dst_addr, &local4, sizeof (local4));
- }
-
- mp->outer_fib_index = htonl (outer_fib_index);
- mp->is_ipv6 = ipv6_set;
-
- S;
- W;
-
-
- return (0);
-}
-
-/*
- * List of messages that the api test plugin sends,
- * and that the data plane plugin processes
- */
-#define foreach_vpe_api_msg \
-_(vxlan_gpe_ioam_enable, ""\
- "[trace] [pow] [ppc <encap|ppc decap>]") \
-_(vxlan_gpe_ioam_disable, "") \
-_(vxlan_gpe_ioam_vni_enable, ""\
- "local <local_vtep_ip> remote <remote_vtep_ip> vni <vnid>") \
-_(vxlan_gpe_ioam_vni_disable, ""\
- "local <local_vtep_ip> remote <remote_vtep_ip> vni <vnid>") \
-_(vxlan_gpe_ioam_transit_enable, ""\
- "dst-ip <dst_ip> [outer-fib-index <outer_fib_index>]") \
-_(vxlan_gpe_ioam_transit_disable, ""\
- "dst-ip <dst_ip> [outer-fib-index <outer_fib_index>]") \
-
-
-void
-vat_api_hookup (vat_main_t * vam)
-{
- vxlan_gpe_test_main_t *sm = &vxlan_gpe_test_main;
- /* Hook up handlers for replies from the data plane plug-in */
-#define _(N,n) \
- vl_msg_api_set_handlers((VL_API_##N + sm->msg_id_base), \
- #n, \
- vl_api_##n##_t_handler, \
- vl_noop_handler, \
- vl_api_##n##_t_endian, \
- vl_api_##n##_t_print, \
- sizeof(vl_api_##n##_t), 1);
- foreach_vpe_api_reply_msg;
-#undef _
-
- /* API messages we can send */
-#define _(n,h) hash_set_mem (vam->function_by_name, #n, api_##n);
- foreach_vpe_api_msg;
-#undef _
-
- /* Help strings */
-#define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
- foreach_vpe_api_msg;
-#undef _
-}
-
-clib_error_t *
-vat_plugin_register (vat_main_t * vam)
-{
- vxlan_gpe_test_main_t *sm = &vxlan_gpe_test_main;
- u8 *name;
-
- sm->vat_main = vam;
-
- name = format (0, "ioam_vxlan_gpe_%08x%c", api_version, 0);
- sm->msg_id_base = vl_client_get_first_plugin_msg_id ((char *) name);
-
- if (sm->msg_id_base != (u16) ~ 0)
- vat_api_hookup (vam);
-
- vec_free (name);
-
- return 0;
-}
-
-/*
- * fd.io coding-style-patch-verification: ON
- *
- * Local Variables:
- * eval: (c-set-style "gnu")
- * End:
- */