summaryrefslogtreecommitdiffstats
path: root/src/plugins/ioam/encap
diff options
context:
space:
mode:
authorDave Barach <dave@barachs.net>2019-05-14 18:01:44 -0400
committerFlorin Coras <florin.coras@gmail.com>2019-05-16 16:11:23 +0000
commitf8d50682cd1245f6f5ce4c846ca6f1bdc11255a6 (patch)
tree8ecc60e4715db88bdbc8ea6bd0170fbae6f645eb /src/plugins/ioam/encap
parentc1f93067ed4b9954bbba82e2c9c104b22e2f7f33 (diff)
init / exit function ordering
The vlib init function subsystem now supports a mix of procedural and formally-specified ordering constraints. We should eliminate procedural knowledge wherever possible. The following schemes are *roughly* equivalent: static clib_error_t *init_runs_first (vlib_main_t *vm) { clib_error_t *error; ... do some stuff... if ((error = vlib_call_init_function (init_runs_next))) return error; ... } VLIB_INIT_FUNCTION (init_runs_first); and static clib_error_t *init_runs_first (vlib_main_t *vm) { ... do some stuff... } VLIB_INIT_FUNCTION (init_runs_first) = { .runs_before = VLIB_INITS("init_runs_next"), }; The first form will [most likely] call "init_runs_next" on the spot. The second form means that "init_runs_first" runs before "init_runs_next," possibly much earlier in the sequence. Please DO NOT construct sets of init functions where A before B actually means A *right before* B. It's not necessary - simply combine A and B - and it leads to hugely annoying debugging exercises when trying to switch from ad-hoc procedural ordering constraints to formal ordering constraints. Change-Id: I5e4353503bf43b4acb11a45fb33c79a5ade8426c Signed-off-by: Dave Barach <dave@barachs.net>
Diffstat (limited to 'src/plugins/ioam/encap')
-rw-r--r--src/plugins/ioam/encap/ip6_ioam_e2e.c16
-rw-r--r--src/plugins/ioam/encap/ip6_ioam_pot.c47
-rw-r--r--src/plugins/ioam/encap/ip6_ioam_trace.c21
3 files changed, 38 insertions, 46 deletions
diff --git a/src/plugins/ioam/encap/ip6_ioam_e2e.c b/src/plugins/ioam/encap/ip6_ioam_e2e.c
index cdaf740d251..58714083fe4 100644
--- a/src/plugins/ioam/encap/ip6_ioam_e2e.c
+++ b/src/plugins/ioam/encap/ip6_ioam_e2e.c
@@ -44,7 +44,7 @@ static u8 * ioam_e2e_trace_handler (u8 * s,
return s;
}
-int
+int
ioam_e2e_config_handler (void *data, u8 disable)
{
int *analyse = data;
@@ -171,13 +171,6 @@ VLIB_CLI_COMMAND (ioam_show_e2e_cmd, static) = {
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.
*/
@@ -213,4 +206,9 @@ ioam_e2e_init (vlib_main_t * vm)
* Init function for the E2E lib.
* ip6_hop_by_hop_ioam_e2e_init gets called during init.
*/
-VLIB_INIT_FUNCTION (ioam_e2e_init);
+/* *INDENT-OFF* */
+VLIB_INIT_FUNCTION (ioam_e2e_init) =
+{
+ .runs_after = VLIB_INITS("ip6_hop_by_hop_ioam_init"),
+};
+/* *INDENT-ON* */
diff --git a/src/plugins/ioam/encap/ip6_ioam_pot.c b/src/plugins/ioam/encap/ip6_ioam_pot.c
index 8dd06c144e3..71c0cc92709 100644
--- a/src/plugins/ioam/encap/ip6_ioam_pot.c
+++ b/src/plugins/ioam/encap/ip6_ioam_pot.c
@@ -29,7 +29,7 @@
_(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")
+ _(FAILED, "Pkts with POT out of Policy")
static char * ip6_hop_by_hop_ioam_pot_stats_strings[] = {
#define _(sym,string) string,
@@ -47,7 +47,7 @@ typedef enum {
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;
@@ -55,7 +55,7 @@ typedef struct {
ip6_hop_by_hop_ioam_pot_main_t ip6_hop_by_hop_ioam_pot_main;
-always_inline void
+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;
@@ -69,13 +69,13 @@ 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)
- {
+ 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",
+ s = format (s, "random = 0x%Lx, Cumulative = 0x%Lx, Index = 0x%x",
random, cumulative, pot0 ? pot0->reserved_profile_id : ~0);
return s;
}
@@ -117,22 +117,22 @@ ip6_hbh_ioam_proof_of_transit_handler (vlib_buffer_t *b,
pot0->reserved_profile_id =
pot_profile_index & PROFILE_ID_MASK;
pot_profile_incr_usage_stats(pot_profile);
- }
- else
+ }
+ else
{ /* Non encap node */
- if (PREDICT_FALSE(pot0->reserved_profile_id !=
- pot_profile_index || pot_profile == 0))
+ 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);
+ pot_profile_find(pot0->reserved_profile_id);
if (PREDICT_FALSE(new_profile == 0 ||
- new_profile->valid == 0))
+ new_profile->valid == 0))
{
ip6_ioam_stats_increment_counter (IP6_IOAM_POT_PROFILE_MISS, 1);
return(-1);
- }
- else
+ }
+ else
{
pot_profile_index = pot0->reserved_profile_id;
pot_profile = new_profile;
@@ -143,7 +143,7 @@ ip6_hbh_ioam_proof_of_transit_handler (vlib_buffer_t *b,
pot_profile_incr_usage_stats(pot_profile);
}
- if (pot0->random == 0)
+ if (pot0->random == 0)
{
pot0->random = clib_host_to_net_u64(pot_generate_random(pot_profile));
pot0->cumulative = 0;
@@ -196,7 +196,7 @@ int ip6_hop_by_hop_ioam_pot_rewrite_handler (u8 *rewrite_string, u8 *rewrite_siz
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) -
+ pot_option->hdr.length = sizeof (ioam_pot_option_t) -
sizeof (ip6_hop_by_hop_option_t);
return(0);
}
@@ -235,15 +235,11 @@ 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();
clib_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"));
@@ -260,6 +256,9 @@ ip6_hop_by_hop_ioam_pot_init (vlib_main_t * vm)
return (0);
}
-VLIB_INIT_FUNCTION (ip6_hop_by_hop_ioam_pot_init);
-
-
+/* *INDENT-OFF* */
+VLIB_INIT_FUNCTION (ip6_hop_by_hop_ioam_pot_init) =
+{
+ .runs_after = VLIB_INITS("ip6_hop_by_hop_ioam_init"),
+};
+/* *INDENT-OFF* */
diff --git a/src/plugins/ioam/encap/ip6_ioam_trace.c b/src/plugins/ioam/encap/ip6_ioam_trace.c
index ddd9ae99dd5..53fb63ea6fd 100644
--- a/src/plugins/ioam/encap/ip6_ioam_trace.c
+++ b/src/plugins/ioam/encap/ip6_ioam_trace.c
@@ -417,16 +417,6 @@ 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 ();
@@ -452,6 +442,14 @@ ip6_hop_by_hop_ioam_trace_init (vlib_main_t * vm)
return (0);
}
+/* *INDENT-OFF* */
+VLIB_INIT_FUNCTION (ip6_hop_by_hop_ioam_trace_init) =
+{
+ .runs_after = VLIB_INITS ("ip_main_init", "ip6_lookup_init",
+ "ip6_hop_by_hop_ioam_init"),
+};
+/* *INDENT-ON* */
+
int
ip6_trace_profile_cleanup (void)
{
@@ -490,9 +488,6 @@ ip6_trace_profile_setup (void)
return (0);
}
-
-VLIB_INIT_FUNCTION (ip6_hop_by_hop_ioam_trace_init);
-
/*
* fd.io coding-style-patch-verification: ON
*