diff options
Diffstat (limited to 'hicn-plugin/src/strategy_dpo_manager.c')
-rw-r--r-- | hicn-plugin/src/strategy_dpo_manager.c | 56 |
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 (); } |