aboutsummaryrefslogtreecommitdiffstats
path: root/hicn-plugin/src/strategy_dpo_manager.c
diff options
context:
space:
mode:
Diffstat (limited to 'hicn-plugin/src/strategy_dpo_manager.c')
-rw-r--r--hicn-plugin/src/strategy_dpo_manager.c56
1 files changed, 35 insertions, 21 deletions
diff --git a/hicn-plugin/src/strategy_dpo_manager.c b/hicn-plugin/src/strategy_dpo_manager.c
index f8d41a372..1e136b47b 100644
--- a/hicn-plugin/src/strategy_dpo_manager.c
+++ b/hicn-plugin/src/strategy_dpo_manager.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017-2019 Cisco and/or its affiliates.
+ * Copyright (c) 2021 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:
@@ -19,6 +19,8 @@
#include "strategy_dpo_ctx.h"
#include "strategies/dpo_mw.h"
#include "strategies/dpo_rr.h"
+#include "strategies/dpo_rp.h"
+#include "strategies/dpo_lr.h"
#include "strategy.h"
#include "faces/face.h"
@@ -33,9 +35,9 @@ hicn_dpo_vft_t default_dpo;
dpo_type_t
hicn_dpo_register_new_type (const char *const *const *hicn_nodes,
- const hicn_dpo_vft_t * hicn_dpo_vft,
- const hicn_strategy_vft_t * hicn_strategy_vft,
- const dpo_vft_t * dpo_ctx_vft)
+ const hicn_dpo_vft_t *hicn_dpo_vft,
+ const hicn_strategy_vft_t *hicn_strategy_vft,
+ const dpo_vft_t *dpo_ctx_vft)
{
dpo_type_t dpo_type = dpo_register_new_type (dpo_ctx_vft, hicn_nodes);
vec_validate (hicn_dpo_vfts, dpo_type);
@@ -52,7 +54,7 @@ hicn_dpo_register_new_type (const char *const *const *hicn_nodes,
}
u32
-dpo_is_hicn (const dpo_id_t * dpo)
+dpo_is_hicn (const dpo_id_t *dpo)
{
for (int i = 0; i < hicn_strategies; i++)
{
@@ -63,7 +65,7 @@ dpo_is_hicn (const dpo_id_t * dpo)
}
dpo_type_t
-hicn_dpo_get_vft_id (const dpo_id_t * dpo)
+hicn_dpo_get_vft_id (const dpo_id_t *dpo)
{
return dpo->dpoi_type;
}
@@ -92,24 +94,35 @@ hicn_dpo_get_strategy_vft_from_id (u8 vfts_id)
return hicn_strategy_vfts[strategies_id[vfts_id]];
}
+u8 *
+hicn_strategy_dpo_format (u8 *s, va_list *ap)
+{
+ index_t index = va_arg (*ap, index_t);
+ hicn_dpo_ctx_t *dpo_ctx = NULL;
+ u32 indent = va_arg (*ap, u32);
+
+ dpo_ctx = hicn_strategy_dpo_ctx_get (index);
+ if (dpo_ctx == NULL)
+ return s;
+
+ return hicn_dpo_vfts[dpo_ctx->dpo_type]->hicn_dpo_format (s, dpo_ctx,
+ indent);
+}
+
void
hicn_dpos_init (void)
{
hicn_strategy_init_dpo_ctx_pool ();
hicn_dpo_strategy_mw_module_init ();
hicn_dpo_strategy_rr_module_init ();
+ hicn_dpo_strategy_rp_module_init ();
+ hicn_dpo_strategy_lr_module_init ();
- default_dpo.hicn_dpo_is_type = &hicn_dpo_is_type_strategy_mw;
- default_dpo.hicn_dpo_get_type = &hicn_dpo_strategy_mw_get_type;
- default_dpo.hicn_dpo_module_init = &hicn_dpo_strategy_mw_module_init;
- default_dpo.hicn_dpo_create = &hicn_strategy_mw_ctx_create;
- default_dpo.hicn_dpo_add_update_nh = &hicn_strategy_mw_ctx_add_nh;
- default_dpo.hicn_dpo_del_nh = &hicn_strategy_mw_ctx_del_nh;
- default_dpo.hicn_dpo_format = &hicn_strategy_mw_format_ctx;
+ default_dpo = *hicn_dpo_vfts[hicn_dpo_strategy_mw_get_type ()];
}
u8 *
-format_hicn_strategy_list (u8 * s, int n, ...)
+format_hicn_strategy_list (u8 *s, int n, ...)
{
va_list ap;
va_start (ap, n);
@@ -120,19 +133,20 @@ format_hicn_strategy_list (u8 * s, int n, ...)
indent += 4;
int i;
vec_foreach_index (i, strategies_id)
- {
- s = format (s, "%U (%d) ", format_white_space, indent, i);
- s = hicn_strategy_vfts[strategies_id[i]]->hicn_format_strategy (s, &ap);
- }
+ {
+ s = format (s, "%U (%d) ", format_white_space, indent, i);
+ s = hicn_strategy_vfts[strategies_id[i]]->hicn_format_strategy (s, &ap);
+ }
return (s);
}
-u8
+int
hicn_dpo_strategy_id_is_valid (int strategy_id)
{
return vec_len (strategies_id) > strategy_id ?
- HICN_ERROR_NONE : HICN_ERROR_DPO_MGR_ID_NOT_VALID;
+ HICN_ERROR_NONE :
+ HICN_ERROR_DPO_MGR_ID_NOT_VALID;
}
int
@@ -148,7 +162,7 @@ hicn_strategy_get_all_available (void)
* time.
*/
void
-hicn_dpo_register (const hicn_dpo_vft_t * hicn_dpo)
+hicn_dpo_register (const hicn_dpo_vft_t *hicn_dpo)
{
hicn_dpo->hicn_dpo_module_init ();
}