diff options
Diffstat (limited to 'hicn-plugin/src/strategies')
-rw-r--r-- | hicn-plugin/src/strategies/dpo_lr.c | 139 | ||||
-rw-r--r-- | hicn-plugin/src/strategies/dpo_lr.h | 122 | ||||
-rw-r--r-- | hicn-plugin/src/strategies/dpo_mw.c | 74 | ||||
-rw-r--r-- | hicn-plugin/src/strategies/dpo_mw.h | 50 | ||||
-rw-r--r-- | hicn-plugin/src/strategies/dpo_rp.c | 145 | ||||
-rw-r--r-- | hicn-plugin/src/strategies/dpo_rp.h | 130 | ||||
-rw-r--r-- | hicn-plugin/src/strategies/dpo_rr.c | 74 | ||||
-rw-r--r-- | hicn-plugin/src/strategies/dpo_rr.h | 51 | ||||
-rw-r--r-- | hicn-plugin/src/strategies/strategy_lr.c | 136 | ||||
-rw-r--r-- | hicn-plugin/src/strategies/strategy_lr.h | 35 | ||||
-rw-r--r-- | hicn-plugin/src/strategies/strategy_mw.c | 64 | ||||
-rw-r--r-- | hicn-plugin/src/strategies/strategy_mw.h | 2 | ||||
-rw-r--r-- | hicn-plugin/src/strategies/strategy_mw_cli.c | 49 | ||||
-rw-r--r-- | hicn-plugin/src/strategies/strategy_rp.c | 124 | ||||
-rw-r--r-- | hicn-plugin/src/strategies/strategy_rp.h | 41 | ||||
-rw-r--r-- | hicn-plugin/src/strategies/strategy_rr.c | 56 | ||||
-rw-r--r-- | hicn-plugin/src/strategies/strategy_rr.h | 2 |
17 files changed, 1067 insertions, 227 deletions
diff --git a/hicn-plugin/src/strategies/dpo_lr.c b/hicn-plugin/src/strategies/dpo_lr.c new file mode 100644 index 000000000..59409e25e --- /dev/null +++ b/hicn-plugin/src/strategies/dpo_lr.c @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2023 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 "dpo_lr.h" +#include "strategy_lr.h" +#include "../strategy_dpo_manager.h" +#include "../strategy_dpo_ctx.h" + +/** + * @brief DPO type value for the lr_strategy + */ +static dpo_type_t hicn_dpo_type_lr; + +static const hicn_dpo_vft_t hicn_dpo_lr_vft = { + .hicn_dpo_is_type = &hicn_dpo_is_type_strategy_lr, + .hicn_dpo_get_type = &hicn_dpo_strategy_lr_get_type, + .hicn_dpo_module_init = &hicn_dpo_strategy_lr_module_init, + .hicn_dpo_create = &hicn_strategy_lr_ctx_create, + .hicn_dpo_update_type = &hicn_strategy_lr_update_ctx_type, + .hicn_dpo_add_update_nh = &hicn_strategy_lr_ctx_add_nh, + .hicn_dpo_del_nh = &hicn_strategy_lr_ctx_del_nh, + .hicn_dpo_format = &hicn_dpo_strategy_lr_format +}; + +const static dpo_vft_t dpo_strategy_lr_ctx_vft = { + .dv_lock = hicn_strategy_dpo_ctx_lock, + .dv_unlock = hicn_strategy_dpo_ctx_unlock, + .dv_format = hicn_strategy_dpo_format, +}; + +int +hicn_dpo_is_type_strategy_lr (const dpo_id_t *dpo) +{ + return dpo->dpoi_type == hicn_dpo_type_lr; +} + +void +hicn_dpo_strategy_lr_module_init (void) +{ + /* + * Register our type of dpo + */ + hicn_dpo_type_lr = hicn_dpo_register_new_type ( + hicn_nodes_strategy, &hicn_dpo_lr_vft, hicn_lr_strategy_get_vft (), + &dpo_strategy_lr_ctx_vft); +} + +dpo_type_t +hicn_dpo_strategy_lr_get_type (void) +{ + return hicn_dpo_type_lr; +} + +////////////////////////////////////////////////////////////////////////////////////////////////// + +u8 * +hicn_dpo_strategy_lr_format (u8 *s, hicn_dpo_ctx_t *dpo_ctx, u32 indent) +{ + int i = 0; + + s = format (s, "hicn-lr"); + + for (i = 0; i < HICN_PARAM_FIB_ENTRY_NHOPS_MAX; i++) + { + u8 *buf = NULL; + if (i < dpo_ctx->entry_count) + buf = format (NULL, "FIB"); + else if (i >= HICN_PARAM_FIB_ENTRY_NHOPS_MAX - dpo_ctx->tfib_entry_count) + buf = format (NULL, "TFIB"); + else + continue; + + s = format (s, "\n"); + s = format (s, "%U ", format_hicn_face, dpo_ctx->next_hops[i], indent); + s = format (s, " %s", buf); + } + + return (s); +} + +void +hicn_strategy_lr_ctx_create (fib_protocol_t proto, + const hicn_face_id_t *next_hop, int nh_len, + index_t *dpo_idx) +{ + hicn_dpo_ctx_t *hicn_strategy_ctx; + + /* Allocate a hicn_dpo_ctx on the vpp pool and initialize it */ + hicn_strategy_ctx = hicn_strategy_dpo_ctx_alloc (); + + *dpo_idx = hicn_strategy_dpo_ctx_get_index (hicn_strategy_ctx); + + init_dpo_ctx (hicn_strategy_ctx, next_hop, nh_len, hicn_dpo_type_lr, + (dpo_proto_t) proto); +} + +void +hicn_strategy_lr_update_ctx_type (hicn_dpo_ctx_t *hicn_strategy_ctx) +{ + hicn_strategy_ctx->dpo_type = hicn_dpo_type_lr; + // don't care to reset data, it is not used +} + +int +hicn_strategy_lr_ctx_add_nh (hicn_face_id_t nh, index_t dpo_idx) +{ + hicn_dpo_ctx_t *hicn_strategy_dpo_ctx = hicn_strategy_dpo_ctx_get (dpo_idx); + u8 pos = 0; + + if (hicn_strategy_dpo_ctx == NULL) + { + return HICN_ERROR_STRATEGY_NOT_FOUND; + } + + hicn_strategy_dpo_ctx_add_nh (nh, hicn_strategy_dpo_ctx, &pos); + // nothing else to initialize in this strategy + return HICN_ERROR_NONE; +} + +int +hicn_strategy_lr_ctx_del_nh (hicn_face_id_t face_id, index_t dpo_idx) +{ + hicn_dpo_ctx_t *hicn_strategy_dpo_ctx = hicn_strategy_dpo_ctx_get (dpo_idx); + // No need to change the current_nhop. It will be updated at the next + // selection. + return hicn_strategy_dpo_ctx_del_nh (face_id, hicn_strategy_dpo_ctx); +} diff --git a/hicn-plugin/src/strategies/dpo_lr.h b/hicn-plugin/src/strategies/dpo_lr.h new file mode 100644 index 000000000..757b96db6 --- /dev/null +++ b/hicn-plugin/src/strategies/dpo_lr.h @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2023 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 __HICN_DPO_LR_H__ +#define __HICN_DPO_LR_H__ + +#include <vnet/dpo/dpo.h> +#include "../strategy_dpo_ctx.h" + +/** + * @file dpo_lr.h + * + * This file implements the strategy vtf (see strategy.h) and + * the dpo vft (see strategy_dpo_manager.h) for the strategy + * local-remote. + */ + +typedef struct hicn_strategy_lr_ctx_s +{ +} hicn_strategy_lr_ctx_t; + +/** + * @brief Format the dpo ctx for a human-readable string + * + * @param s String to which to append the formatted dpo ctx + * @param dpo_ctx DPO context + * @param indent Indentation + * + * @result The string with the formatted dpo ctx + */ +u8 *hicn_dpo_strategy_lr_format (u8 *s, hicn_dpo_ctx_t *dpo_ctx, u32 indent); + +/** + * @brief Retrieve an hicn_strategy_lr_ctx object + * + * @param indext Index of the hicn_dpo_ctx to retrieve + * @return The hicn_dpo_ctx object or NULL + */ +hicn_dpo_ctx_t *hicn_strategy_lr_ctx_get (index_t index); + +/** + * @brief Create a new local-remote ctx + * + * @param proto The protocol to which the dpo is meant for (see vpp docs) + * @param next_hop A list of next hops to be inserted in the dpo ctx + * @param nh_len Size of the list + * @param dpo_idx index_t that will hold the index of the created dpo ctx + * @return HICN_ERROR_NONE if the creation was fine, otherwise EINVAL + */ +void hicn_strategy_lr_ctx_create (fib_protocol_t proto, + const hicn_face_id_t *next_hop, int nh_len, + index_t *dpo_idx); + +/** + * @brief Update existing ctx setting it to local-remote + * + * @param hicn_strategy_ctx pointer to the ctx to update + */ +void hicn_strategy_lr_update_ctx_type (hicn_dpo_ctx_t *hicn_strategy_ctx); + +/** + * @brief Add or update a next hop in the dpo ctx. + * + * This function is meant to be used in the control plane and not in the data + * plane, as it is not optimized for the latter. + * + * @param nh Next hop to insert in the dpo ctx + * @param dpo_idx Index of the dpo ctx to update with the new or updated next + * hop + * @return HICN_ERROR_NONE if the update or insert was fine, + * otherwise HICN_ERROR_DPO_CTX_NOT_FOUND + */ +int hicn_strategy_lr_ctx_add_nh (hicn_face_id_t nh, index_t dpo_idx); + +/** + * @brief Delete a next hop in the dpo ctx. + * + * @param face_id Face identifier of the next hop + * @param dpo_idx Index of the dpo ctx to update with the new or updated next + * hop + * @return HICN_ERROR_NONE if the update or insert was fine, + * otherwise HICN_ERROR_DPO_CTS_NOT_FOUND + */ +int hicn_strategy_lr_ctx_del_nh (hicn_face_id_t face_id, index_t dpo_idx); + +/** + * @brief Prefetch a dpo + * + * @param dpo_idx Index of the dpo ctx to prefetch + */ +void hicn_strategy_lr_ctx_prefetch (index_t dpo_idx); + +/** + * @brief Return true if the dpo is of type strategy local-remote + * + * @param dpo Dpo to check the type + */ +int hicn_dpo_is_type_strategy_lr (const dpo_id_t *dpo); + +/** + * @brief Initialize the local-remote strategy + */ +void hicn_dpo_strategy_lr_module_init (void); + +/** + * @brief Return the dpo type for the local-remote strategy + */ +dpo_type_t hicn_dpo_strategy_lr_get_type (void); + +#endif // __HICN_DPO_LR_H__ diff --git a/hicn-plugin/src/strategies/dpo_mw.c b/hicn-plugin/src/strategies/dpo_mw.c index 12c77bce8..9283f6a43 100644 --- a/hicn-plugin/src/strategies/dpo_mw.c +++ b/hicn-plugin/src/strategies/dpo_mw.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2020 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: @@ -28,13 +28,20 @@ static const hicn_dpo_vft_t hicn_dpo_mw_vft = { .hicn_dpo_get_type = &hicn_dpo_strategy_mw_get_type, .hicn_dpo_module_init = &hicn_dpo_strategy_mw_module_init, .hicn_dpo_create = &hicn_strategy_mw_ctx_create, + .hicn_dpo_update_type = &hicn_strategy_mw_update_ctx_type, .hicn_dpo_add_update_nh = &hicn_strategy_mw_ctx_add_nh, .hicn_dpo_del_nh = &hicn_strategy_mw_ctx_del_nh, - .hicn_dpo_format = &hicn_strategy_mw_format_ctx + .hicn_dpo_format = &hicn_dpo_strategy_mw_format +}; + +const static dpo_vft_t dpo_strategy_mw_ctx_vft = { + .dv_lock = &hicn_strategy_dpo_ctx_lock, + .dv_unlock = &hicn_strategy_dpo_ctx_unlock, + .dv_format = &hicn_strategy_dpo_format }; int -hicn_dpo_is_type_strategy_mw (const dpo_id_t * dpo) +hicn_dpo_is_type_strategy_mw (const dpo_id_t *dpo) { return dpo->dpoi_type == hicn_dpo_type_mw; } @@ -45,10 +52,9 @@ hicn_dpo_strategy_mw_module_init (void) /* * Register our type of dpo */ - hicn_dpo_type_mw = - hicn_dpo_register_new_type (hicn_nodes_strategy, &hicn_dpo_mw_vft, - hicn_mw_strategy_get_vft (), - &dpo_strategy_mw_ctx_vft); + hicn_dpo_type_mw = hicn_dpo_register_new_type ( + hicn_nodes_strategy, &hicn_dpo_mw_vft, hicn_mw_strategy_get_vft (), + &dpo_strategy_mw_ctx_vft); } dpo_type_t @@ -59,28 +65,11 @@ hicn_dpo_strategy_mw_get_type (void) ////////////////////////////////////////////////////////////////////////////////////////////////// - -u8 * -hicn_strategy_mw_format_ctx (u8 * s, int n, ...) -{ - va_list args; - va_start (args, n); - s = format_hicn_strategy_mw_ctx (s, &args); - return s; -} - u8 * -format_hicn_strategy_mw_ctx (u8 * s, va_list * ap) +hicn_dpo_strategy_mw_format (u8 *s, hicn_dpo_ctx_t *dpo_ctx, u32 indent) { - int i = 0; - index_t index = va_arg (*ap, index_t); - hicn_dpo_ctx_t *dpo_ctx = NULL; hicn_strategy_mw_ctx_t *mw_dpo_ctx = NULL; - u32 indent = va_arg (*ap, u32);; - - dpo_ctx = hicn_strategy_dpo_ctx_get (index); - if (dpo_ctx == NULL) - return s; + int i = 0; mw_dpo_ctx = (hicn_strategy_mw_ctx_t *) dpo_ctx->data; @@ -90,16 +79,13 @@ format_hicn_strategy_mw_ctx (u8 * s, va_list * ap) u8 *buf = NULL; if (i < dpo_ctx->entry_count) buf = format (NULL, "FIB"); - else if (i >= - HICN_PARAM_FIB_ENTRY_NHOPS_MAX - dpo_ctx->tfib_entry_count) + else if (i >= HICN_PARAM_FIB_ENTRY_NHOPS_MAX - dpo_ctx->tfib_entry_count) buf = format (NULL, "TFIB"); else continue; s = format (s, "\n"); - s = - format (s, "%U ", format_hicn_face, dpo_ctx->next_hops[i], - indent); + s = format (s, "%U ", format_hicn_face, dpo_ctx->next_hops[i], indent); s = format (s, "weight %u", mw_dpo_ctx->weight[i]); s = format (s, " %s", buf); } @@ -108,8 +94,9 @@ format_hicn_strategy_mw_ctx (u8 * s, va_list * ap) } void -hicn_strategy_mw_ctx_create (fib_protocol_t proto, const hicn_face_id_t * next_hop, - int nh_len, index_t * dpo_idx) +hicn_strategy_mw_ctx_create (fib_protocol_t proto, + const hicn_face_id_t *next_hop, int nh_len, + index_t *dpo_idx) { hicn_strategy_mw_ctx_t *hicn_strategy_mw_ctx; hicn_dpo_ctx_t *hicn_strategy_ctx; @@ -120,8 +107,22 @@ hicn_strategy_mw_ctx_create (fib_protocol_t proto, const hicn_face_id_t * next_h *dpo_idx = hicn_strategy_dpo_ctx_get_index (hicn_strategy_ctx); - init_dpo_ctx (hicn_strategy_ctx, next_hop, nh_len, hicn_dpo_type_mw, proto); + HICN_DEBUG ("Successful hicn_strategy_dpo_ctx_alloc with index %d", + *dpo_idx); + + init_dpo_ctx (hicn_strategy_ctx, next_hop, nh_len, hicn_dpo_type_mw, + (dpo_proto_t) proto); + + memset (hicn_strategy_mw_ctx->weight, 0, HICN_PARAM_FIB_ENTRY_NHOPS_MAX); +} + +void +hicn_strategy_mw_update_ctx_type (hicn_dpo_ctx_t *hicn_strategy_ctx) +{ + hicn_strategy_mw_ctx_t *hicn_strategy_mw_ctx; + hicn_strategy_mw_ctx = (hicn_strategy_mw_ctx_t *) hicn_strategy_ctx->data; + hicn_strategy_ctx->dpo_type = hicn_dpo_type_mw; memset (hicn_strategy_mw_ctx->weight, 0, HICN_PARAM_FIB_ENTRY_NHOPS_MAX); } @@ -138,7 +139,7 @@ hicn_strategy_mw_ctx_add_nh (hicn_face_id_t nh, index_t dpo_idx) hicn_strategy_dpo_ctx_add_nh (nh, hicn_strategy_dpo_ctx, &pos); hicn_strategy_mw_ctx_t *hicn_strategy_mw_ctx = - (hicn_strategy_mw_ctx_t *) & hicn_strategy_dpo_ctx->data; + (hicn_strategy_mw_ctx_t *) &hicn_strategy_dpo_ctx->data; hicn_strategy_mw_ctx->weight[pos] = DEFAULT_WEIGHT; return HICN_ERROR_NONE; @@ -148,7 +149,8 @@ int hicn_strategy_mw_ctx_del_nh (hicn_face_id_t face_id, index_t dpo_idx) { hicn_dpo_ctx_t *hicn_strategy_dpo_ctx = hicn_strategy_dpo_ctx_get (dpo_idx); - //No need to flush the weights, they are initialized when a dpo_ctx is created; + // No need to flush the weights, they are initialized when a dpo_ctx is + // created; return hicn_strategy_dpo_ctx_del_nh (face_id, hicn_strategy_dpo_ctx); } diff --git a/hicn-plugin/src/strategies/dpo_mw.h b/hicn-plugin/src/strategies/dpo_mw.h index 433c415fb..f3ccf7e30 100644 --- a/hicn-plugin/src/strategies/dpo_mw.h +++ b/hicn-plugin/src/strategies/dpo_mw.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2020 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: @@ -38,17 +38,12 @@ typedef struct hicn_strategy_mw_ctx_s * @brief Format the dpo ctx for a human-readable string * * @param s String to which to append the formatted dpo ctx - * @param ap List of parameters for the formatting + * @param dpo_ctx DPO context + * @param indent Indentation * * @result The string with the formatted dpo ctx */ -u8 *format_hicn_strategy_mw_ctx (u8 * s, va_list * ap); - -const static dpo_vft_t dpo_strategy_mw_ctx_vft = { - .dv_lock = hicn_strategy_dpo_ctx_lock, - .dv_unlock = hicn_strategy_dpo_ctx_unlock, - .dv_format = format_hicn_strategy_mw_ctx, -}; +u8 *hicn_dpo_strategy_mw_format (u8 *s, hicn_dpo_ctx_t *dpo_ctx, u32 indent); /** * @brief Retrieve an hicn_strategy_mw_ctx object @@ -67,15 +62,22 @@ hicn_dpo_ctx_t *hicn_strategy_mw_ctx_get (index_t index); * @param dpo_idx index_t that will hold the index of the created dpo ctx * @return HICN_ERROR_NONE if the creation was fine, otherwise EINVAL */ -void -hicn_strategy_mw_ctx_create (fib_protocol_t proto, const hicn_face_id_t * next_hop, - int nh_len, index_t * dpo_idx); +void hicn_strategy_mw_ctx_create (fib_protocol_t proto, + const hicn_face_id_t *next_hop, int nh_len, + index_t *dpo_idx); + +/** + * @brief Update existing ctx setting it to mw + * + * @param hicn_strategy_ctx pointer to the ctx to update + */ +void hicn_strategy_mw_update_ctx_type (hicn_dpo_ctx_t *hicn_strategy_ctx); /** * @brief Add or update a next hop in the dpo ctx. * - * This function is meant to be used in the control plane and not in the data plane, - * as it is not optimized for the latter. + * This function is meant to be used in the control plane and not in the data + * plane, as it is not optimized for the latter. * * @param nh Next hop to insert in the dpo ctx * @param dpo_idx Index of the dpo ctx to update with the new or updated next @@ -108,7 +110,7 @@ void hicn_strategy_mw_ctx_prefetch (index_t dpo_idx); * * @param dpo Dpo to check the type */ -int hicn_dpo_is_type_strategy_mw (const dpo_id_t * dpo); +int hicn_dpo_is_type_strategy_mw (const dpo_id_t *dpo); /** * @brief Initialize the Maximum Weight strategy @@ -120,24 +122,6 @@ void hicn_dpo_strategy_mw_module_init (void); */ dpo_type_t hicn_dpo_strategy_mw_get_type (void); -/** - * @brief Format the dpo ctx for the strategy Maximum Weight - * - * @param s String to append the formatted dpo ctx - * @param ap List of arguments to format - */ -u8 *format_hicn_dpo_strategy_mw (u8 * s, va_list * ap); - -/** - * @brief Format the dpo ctx for the strategy Maximum Weight. To - * call from other functions - * - * @param s String to append the formatted dpo ctx - * @param ... List of arguments to format - */ -u8 *hicn_strategy_mw_format_ctx (u8 * s, int n, ...); - - #endif // __HICN_DPO_MW_H__ /* diff --git a/hicn-plugin/src/strategies/dpo_rp.c b/hicn-plugin/src/strategies/dpo_rp.c new file mode 100644 index 000000000..eb32083b9 --- /dev/null +++ b/hicn-plugin/src/strategies/dpo_rp.c @@ -0,0 +1,145 @@ +/* + * 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: + * + * 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 "dpo_rp.h" +#include "strategy_rp.h" +#include "../strategy_dpo_manager.h" +#include "../strategy_dpo_ctx.h" + +/** + * @brief DPO type value for the rp_strategy + */ +static dpo_type_t hicn_dpo_type_rp; + +static const hicn_dpo_vft_t hicn_dpo_rp_vft = { + .hicn_dpo_is_type = &hicn_dpo_is_type_strategy_rp, + .hicn_dpo_get_type = &hicn_dpo_strategy_rp_get_type, + .hicn_dpo_module_init = &hicn_dpo_strategy_rp_module_init, + .hicn_dpo_create = &hicn_strategy_rp_ctx_create, + .hicn_dpo_update_type = &hicn_strategy_rp_update_ctx_type, + .hicn_dpo_add_update_nh = &hicn_strategy_rp_ctx_add_nh, + .hicn_dpo_del_nh = &hicn_strategy_rp_ctx_del_nh, + .hicn_dpo_format = &hicn_dpo_strategy_rp_format +}; + +const static dpo_vft_t dpo_strategy_rp_ctx_vft = { + .dv_lock = hicn_strategy_dpo_ctx_lock, + .dv_unlock = hicn_strategy_dpo_ctx_unlock, + .dv_format = hicn_strategy_dpo_format, +}; + +int +hicn_dpo_is_type_strategy_rp (const dpo_id_t *dpo) +{ + return dpo->dpoi_type == hicn_dpo_type_rp; +} + +void +hicn_dpo_strategy_rp_module_init (void) +{ + /* + * Register our type of dpo + */ + hicn_dpo_type_rp = hicn_dpo_register_new_type ( + hicn_nodes_strategy, &hicn_dpo_rp_vft, hicn_rp_strategy_get_vft (), + &dpo_strategy_rp_ctx_vft); +} + +dpo_type_t +hicn_dpo_strategy_rp_get_type (void) +{ + return hicn_dpo_type_rp; +} + +////////////////////////////////////////////////////////////////////////////////////////////////// + +u8 * +hicn_dpo_strategy_rp_format (u8 *s, hicn_dpo_ctx_t *dpo_ctx, u32 indent) +{ + int i = 0; + + for (i = 0; i < HICN_PARAM_FIB_ENTRY_NHOPS_MAX; i++) + { + u8 *buf = NULL; + if (i < dpo_ctx->entry_count) + buf = format (NULL, "FIB"); + else if (i >= HICN_PARAM_FIB_ENTRY_NHOPS_MAX - dpo_ctx->tfib_entry_count) + buf = format (NULL, "TFIB"); + else + continue; + + s = format (s, "\n"); + s = format (s, "%U ", format_hicn_face, dpo_ctx->next_hops[i], indent); + s = format (s, " %s", buf); + } + + return (s); +} + +void +hicn_strategy_rp_ctx_create (fib_protocol_t proto, + const hicn_face_id_t *next_hop, int nh_len, + index_t *dpo_idx) +{ + hicn_dpo_ctx_t *hicn_strategy_ctx; + + /* Allocate a hicn_dpo_ctx on the vpp pool and initialize it */ + hicn_strategy_ctx = hicn_strategy_dpo_ctx_alloc (); + + *dpo_idx = hicn_strategy_dpo_ctx_get_index (hicn_strategy_ctx); + + init_dpo_ctx (hicn_strategy_ctx, next_hop, nh_len, hicn_dpo_type_rp, + (dpo_proto_t) proto); +} + +void +hicn_strategy_rp_update_ctx_type (hicn_dpo_ctx_t *hicn_strategy_ctx) +{ + hicn_strategy_ctx->dpo_type = hicn_dpo_type_rp; + // don't care to reset data, it is not used +} + +int +hicn_strategy_rp_ctx_add_nh (hicn_face_id_t nh, index_t dpo_idx) +{ + hicn_dpo_ctx_t *hicn_strategy_dpo_ctx = hicn_strategy_dpo_ctx_get (dpo_idx); + u8 pos = 0; + + if (hicn_strategy_dpo_ctx == NULL) + { + return HICN_ERROR_STRATEGY_NOT_FOUND; + } + + hicn_strategy_dpo_ctx_add_nh (nh, hicn_strategy_dpo_ctx, &pos); + // nothing else to initialize in this strategy + return HICN_ERROR_NONE; +} + +int +hicn_strategy_rp_ctx_del_nh (hicn_face_id_t face_id, index_t dpo_idx) +{ + hicn_dpo_ctx_t *hicn_strategy_dpo_ctx = hicn_strategy_dpo_ctx_get (dpo_idx); + // No need to change the current_nhop. It will be updated at the next + // selection. + return hicn_strategy_dpo_ctx_del_nh (face_id, hicn_strategy_dpo_ctx); +} + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/hicn-plugin/src/strategies/dpo_rp.h b/hicn-plugin/src/strategies/dpo_rp.h new file mode 100644 index 000000000..bc3384b63 --- /dev/null +++ b/hicn-plugin/src/strategies/dpo_rp.h @@ -0,0 +1,130 @@ +/* + * 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: + * + * 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 __HICN_DPO_RP_H__ +#define __HICN_DPO_RP_H__ + +#include <vnet/dpo/dpo.h> +#include "../strategy_dpo_ctx.h" + +/** + * @file dpo_rp.h + * + * This file implements the strategy vtf (see strategy.h) and + * the dpo vft (see strategy_dpo_manager.h) for the strategy + * replication. + */ + +typedef struct hicn_strategy_rp_ctx_s +{ +} hicn_strategy_rp_ctx_t; + +/** + * @brief Format the dpo ctx for a human-readable string + * + * @param s String to which to append the formatted dpo ctx + * @param dpo_ctx DPO context + * @param indent Indentation + * + * @result The string with the formatted dpo ctx + */ +u8 *hicn_dpo_strategy_rp_format (u8 *s, hicn_dpo_ctx_t *dpo_ctx, u32 indent); + +/** + * @brief Retrieve an hicn_strategy_rp_ctx object + * + * @param indext Index of the hicn_dpo_ctx to retrieve + * @return The hicn_dpo_ctx object or NULL + */ +hicn_dpo_ctx_t *hicn_strategy_rp_ctx_get (index_t index); + +/** + * @brief Create a new replication ctx + * + * @param proto The protocol to which the dpo is meant for (see vpp docs) + * @param next_hop A list of next hops to be inserted in the dpo ctx + * @param nh_len Size of the list + * @param dpo_idx index_t that will hold the index of the created dpo ctx + * @return HICN_ERROR_NONE if the creation was fine, otherwise EINVAL + */ +void hicn_strategy_rp_ctx_create (fib_protocol_t proto, + const hicn_face_id_t *next_hop, int nh_len, + index_t *dpo_idx); + +/** + * @brief Update existing ctx setting it to rp + * + * @param hicn_strategy_ctx pointer to the ctx to update + */ +void hicn_strategy_rp_update_ctx_type (hicn_dpo_ctx_t *hicn_strategy_ctx); + +/** + * @brief Add or update a next hop in the dpo ctx. + * + * This function is meant to be used in the control plane and not in the data + * plane, as it is not optimized for the latter. + * + * @param nh Next hop to insert in the dpo ctx + * @param dpo_idx Index of the dpo ctx to update with the new or updated next + * hop + * @return HICN_ERROR_NONE if the update or insert was fine, + * otherwise HICN_ERROR_DPO_CTX_NOT_FOUND + */ +int hicn_strategy_rp_ctx_add_nh (hicn_face_id_t nh, index_t dpo_idx); + +/** + * @brief Delete a next hop in the dpo ctx. + * + * @param face_id Face identifier of the next hop + * @param dpo_idx Index of the dpo ctx to update with the new or updated next + * hop + * @return HICN_ERROR_NONE if the update or insert was fine, + * otherwise HICN_ERROR_DPO_CTS_NOT_FOUND + */ +int hicn_strategy_rp_ctx_del_nh (hicn_face_id_t face_id, index_t dpo_idx); + +/** + * @brief Prefetch a dpo + * + * @param dpo_idx Index of the dpo ctx to prefetch + */ +void hicn_strategy_rp_ctx_prefetch (index_t dpo_idx); + +/** + * @brief Return true if the dpo is of type strategy rp + * + * @param dpo Dpo to check the type + */ +int hicn_dpo_is_type_strategy_rp (const dpo_id_t *dpo); + +/** + * @brief Initialize the Replication strategy + */ +void hicn_dpo_strategy_rp_module_init (void); + +/** + * @brief Return the dpo type for the Replication strategy + */ +dpo_type_t hicn_dpo_strategy_rp_get_type (void); + +#endif // __HICN_DPO_RP_H__ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/hicn-plugin/src/strategies/dpo_rr.c b/hicn-plugin/src/strategies/dpo_rr.c index adb7e1025..1fb72b953 100644 --- a/hicn-plugin/src/strategies/dpo_rr.c +++ b/hicn-plugin/src/strategies/dpo_rr.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2020 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: @@ -28,13 +28,20 @@ static const hicn_dpo_vft_t hicn_dpo_rr_vft = { .hicn_dpo_get_type = &hicn_dpo_strategy_rr_get_type, .hicn_dpo_module_init = &hicn_dpo_strategy_rr_module_init, .hicn_dpo_create = &hicn_strategy_rr_ctx_create, + .hicn_dpo_update_type = &hicn_strategy_rr_update_ctx_type, .hicn_dpo_add_update_nh = &hicn_strategy_rr_ctx_add_nh, .hicn_dpo_del_nh = &hicn_strategy_rr_ctx_del_nh, - .hicn_dpo_format = &hicn_strategy_rr_format_ctx + .hicn_dpo_format = &hicn_dpo_strategy_rr_format +}; + +const static dpo_vft_t dpo_strategy_rr_ctx_vft = { + .dv_lock = hicn_strategy_dpo_ctx_lock, + .dv_unlock = hicn_strategy_dpo_ctx_unlock, + .dv_format = hicn_strategy_dpo_format, }; int -hicn_dpo_is_type_strategy_rr (const dpo_id_t * dpo) +hicn_dpo_is_type_strategy_rr (const dpo_id_t *dpo) { return dpo->dpoi_type == hicn_dpo_type_rr; } @@ -45,10 +52,9 @@ hicn_dpo_strategy_rr_module_init (void) /* * Register our type of dpo */ - hicn_dpo_type_rr = - hicn_dpo_register_new_type (hicn_nodes_strategy, &hicn_dpo_rr_vft, - hicn_rr_strategy_get_vft (), - &dpo_strategy_rr_ctx_vft); + hicn_dpo_type_rr = hicn_dpo_register_new_type ( + hicn_nodes_strategy, &hicn_dpo_rr_vft, hicn_rr_strategy_get_vft (), + &dpo_strategy_rr_ctx_vft); } dpo_type_t @@ -59,50 +65,29 @@ hicn_dpo_strategy_rr_get_type (void) ////////////////////////////////////////////////////////////////////////////////////////////////// - -u8 * -hicn_strategy_rr_format_ctx (u8 * s, int n, ...) -{ - va_list args; - va_start (args, n); - s = format_hicn_strategy_rr_ctx (s, &args); - return s; -} - u8 * -format_hicn_strategy_rr_ctx (u8 * s, va_list * ap) +hicn_dpo_strategy_rr_format (u8 *s, hicn_dpo_ctx_t *dpo_ctx, u32 indent) { int i = 0; - index_t index = va_arg (*ap, index_t); - hicn_dpo_ctx_t *dpo_ctx = NULL; hicn_strategy_rr_ctx_t *rr_dpo_ctx = NULL; - u32 indent = va_arg (*ap, u32); - - dpo_ctx = hicn_strategy_dpo_ctx_get (index); - if (dpo_ctx == NULL) - return s; rr_dpo_ctx = (hicn_strategy_rr_ctx_t *) dpo_ctx->data; - s = - format (s, "hicn-rr, next hop Face %d", - dpo_ctx->next_hops[rr_dpo_ctx->current_nhop]); + s = format (s, "hicn-rr, next hop Face %d", + dpo_ctx->next_hops[rr_dpo_ctx->current_nhop]); for (i = 0; i < HICN_PARAM_FIB_ENTRY_NHOPS_MAX; i++) { u8 *buf = NULL; if (i < dpo_ctx->entry_count) buf = format (NULL, "FIB"); - else if (i >= - HICN_PARAM_FIB_ENTRY_NHOPS_MAX - dpo_ctx->tfib_entry_count) + else if (i >= HICN_PARAM_FIB_ENTRY_NHOPS_MAX - dpo_ctx->tfib_entry_count) buf = format (NULL, "TFIB"); else continue; s = format (s, "\n"); - s = - format (s, "%U ", format_hicn_face, dpo_ctx->next_hops[i], - indent); + s = format (s, "%U ", format_hicn_face, dpo_ctx->next_hops[i], indent); s = format (s, " %s", buf); } @@ -110,8 +95,9 @@ format_hicn_strategy_rr_ctx (u8 * s, va_list * ap) } void -hicn_strategy_rr_ctx_create (fib_protocol_t proto, const hicn_face_id_t * next_hop, - int nh_len, index_t * dpo_idx) +hicn_strategy_rr_ctx_create (fib_protocol_t proto, + const hicn_face_id_t *next_hop, int nh_len, + index_t *dpo_idx) { hicn_strategy_rr_ctx_t *hicn_strategy_rr_ctx; hicn_dpo_ctx_t *hicn_strategy_ctx; @@ -122,8 +108,19 @@ hicn_strategy_rr_ctx_create (fib_protocol_t proto, const hicn_face_id_t * next_h *dpo_idx = hicn_strategy_dpo_ctx_get_index (hicn_strategy_ctx); - init_dpo_ctx (hicn_strategy_ctx, next_hop, nh_len, hicn_dpo_type_rr, proto); + init_dpo_ctx (hicn_strategy_ctx, next_hop, nh_len, hicn_dpo_type_rr, + (dpo_proto_t) proto); + + hicn_strategy_rr_ctx->current_nhop = 0; +} + +void +hicn_strategy_rr_update_ctx_type (hicn_dpo_ctx_t *hicn_strategy_ctx) +{ + hicn_strategy_rr_ctx_t *hicn_strategy_rr_ctx; + hicn_strategy_rr_ctx = (hicn_strategy_rr_ctx_t *) hicn_strategy_ctx->data; + hicn_strategy_ctx->dpo_type = hicn_dpo_type_rr; hicn_strategy_rr_ctx->current_nhop = 0; } @@ -139,7 +136,7 @@ hicn_strategy_rr_ctx_add_nh (hicn_face_id_t nh, index_t dpo_idx) } hicn_strategy_dpo_ctx_add_nh (nh, hicn_strategy_dpo_ctx, &pos); - //nothing else to initialize in this strategy + // nothing else to initialize in this strategy return HICN_ERROR_NONE; } @@ -147,7 +144,8 @@ int hicn_strategy_rr_ctx_del_nh (hicn_face_id_t face_id, index_t dpo_idx) { hicn_dpo_ctx_t *hicn_strategy_dpo_ctx = hicn_strategy_dpo_ctx_get (dpo_idx); - //No need to change the current_nhop. It will be updated at the next selection. + // No need to change the current_nhop. It will be updated at the next + // selection. return hicn_strategy_dpo_ctx_del_nh (face_id, hicn_strategy_dpo_ctx); } diff --git a/hicn-plugin/src/strategies/dpo_rr.h b/hicn-plugin/src/strategies/dpo_rr.h index e4e5b5372..363174bb2 100644 --- a/hicn-plugin/src/strategies/dpo_rr.h +++ b/hicn-plugin/src/strategies/dpo_rr.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2020 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: @@ -27,7 +27,6 @@ * round robin. */ - /** * Context for the Round Robin strategy */ @@ -41,17 +40,12 @@ typedef struct hicn_strategy_rr_ctx_s * @brief Format the dpo ctx for a human-readable string * * @param s String to which to append the formatted dpo ctx - * @param ap List of parameters for the formatting + * @param dpo_ctx DPO context + * @param indent Indentation * * @result The string with the formatted dpo ctx */ -u8 *format_hicn_strategy_rr_ctx (u8 * s, va_list * ap); - -const static dpo_vft_t dpo_strategy_rr_ctx_vft = { - .dv_lock = hicn_strategy_dpo_ctx_lock, - .dv_unlock = hicn_strategy_dpo_ctx_unlock, - .dv_format = format_hicn_strategy_rr_ctx, -}; +u8 *hicn_dpo_strategy_rr_format (u8 *s, hicn_dpo_ctx_t *dpo_ctx, u32 indent); /** * @brief Retrieve an hicn_strategy_rr_ctx object @@ -70,15 +64,22 @@ hicn_dpo_ctx_t *hicn_strategy_rr_ctx_get (index_t index); * @param dpo_idx index_t that will hold the index of the created dpo ctx * @return HICN_ERROR_NONE if the creation was fine, otherwise EINVAL */ -void -hicn_strategy_rr_ctx_create (fib_protocol_t proto, const hicn_face_id_t * next_hop, - int nh_len, index_t * dpo_idx); +void hicn_strategy_rr_ctx_create (fib_protocol_t proto, + const hicn_face_id_t *next_hop, int nh_len, + index_t *dpo_idx); + +/** + * @brief Update existing ctx setting it to rr + * + * @param hicn_strategy_ctx pointer to the ctx to update + */ +void hicn_strategy_rr_update_ctx_type (hicn_dpo_ctx_t *hicn_strategy_ctx); /** * @brief Add or update a next hop in the dpo ctx. * - * This function is meant to be used in the control plane and not in the data plane, - * as it is not optimized for the latter. + * This function is meant to be used in the control plane and not in the data + * plane, as it is not optimized for the latter. * * @param nh Next hop to insert in the dpo ctx * @param dpo_idx Index of the dpo ctx to update with the new or updated next @@ -111,7 +112,7 @@ void hicn_strategy_rr_ctx_prefetch (index_t dpo_idx); * * @param dpo Dpo to check the type */ -int hicn_dpo_is_type_strategy_rr (const dpo_id_t * dpo); +int hicn_dpo_is_type_strategy_rr (const dpo_id_t *dpo); /** * @brief Initialize the Round Robin strategy @@ -123,24 +124,6 @@ void hicn_dpo_strategy_rr_module_init (void); */ dpo_type_t hicn_dpo_strategy_rr_get_type (void); -/** - * @brief Format the dpo ctx for the strategy Round Robin - * - * @param s String to append the formatted dpo ctx - * @param ap List of arguments to format - */ -u8 *format_hicn_dpo_strategy_rr (u8 * s, va_list * ap); - -/** - * @brief Format the dpo ctx for the strategy Round Robin. To - * call from other functions - * - * @param s String to append the formatted dpo ctx - * @param ... List of arguments to format - */ -u8 *hicn_strategy_rr_format_ctx (u8 * s, int n, ...); - - #endif // __HICN_DPO_RR_H__ /* diff --git a/hicn-plugin/src/strategies/strategy_lr.c b/hicn-plugin/src/strategies/strategy_lr.c new file mode 100644 index 000000000..6bb4097ec --- /dev/null +++ b/hicn-plugin/src/strategies/strategy_lr.c @@ -0,0 +1,136 @@ +/* + * 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: + * + * 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 "dpo_lr.h" +#include "../strategy.h" +#include "../strategy_dpo_ctx.h" +#include "../faces/face.h" +#include "../strategy_dpo_manager.h" + +/* Simple strategy that forwards intertests to all next hops */ +/* It does not require to exend the hicn_dpo */ +void hicn_receive_data_lr (index_t dpo_idx, int nh_idx); +void hicn_add_interest_lr (index_t dpo_idx); +int hicn_send_after_aggregation_lr (index_t dpo_idx, hicn_face_id_t in_face); +void hicn_on_interest_timeout_lr (index_t dpo_idx); +u32 hicn_select_next_hop_lr (index_t dpo_idx, hicn_face_id_t in_face, + hicn_face_id_t *outfaces, u16 *len); +u8 *hicn_strategy_format_trace_lr (u8 *s, hicn_strategy_trace_t *t); +u8 *hicn_strategy_format_lr (u8 *s, va_list *ap); + +static hicn_strategy_vft_t hicn_strategy_lr_vft = { + .hicn_receive_data = &hicn_receive_data_lr, + .hicn_add_interest = &hicn_add_interest_lr, + .hicn_send_after_aggregation = &hicn_send_after_aggregation_lr, + .hicn_on_interest_timeout = &hicn_on_interest_timeout_lr, + .hicn_select_next_hop = &hicn_select_next_hop_lr, + .hicn_format_strategy_trace = &hicn_strategy_format_trace_lr, + .hicn_format_strategy = &hicn_strategy_format_lr +}; + +/* + * Return the vft of the strategy. + */ +hicn_strategy_vft_t * +hicn_lr_strategy_get_vft (void) +{ + return &hicn_strategy_lr_vft; +} + +/* DPO should be given in input as it containes all the information to + * calculate the next hops*/ +u32 +hicn_select_next_hop_lr (index_t dpo_idx, hicn_face_id_t in_face, + hicn_face_id_t *outfaces, u16 *len) +{ + hicn_dpo_ctx_t *dpo_ctx = hicn_strategy_dpo_ctx_get (dpo_idx); + + *len = 0; + + if (dpo_ctx == NULL || dpo_ctx->entry_count == 0) + { + return HICN_ERROR_STRATEGY_NOT_FOUND; + } + + // Check if input face is local face + int in_is_local = hicn_face_is_local (in_face); + + int i = 0; + while (i < MAX_OUT_FACES && i < dpo_ctx->entry_count) + { + if (hicn_face_is_local (dpo_ctx->next_hops[i]) != in_is_local) + { + outfaces[0] = dpo_ctx->next_hops[i]; + *len = 1; + break; + } + + i++; + } + + return HICN_ERROR_NONE; +} + +void +hicn_add_interest_lr (index_t dpo_ctx_idx) +{ + /* Nothing to do */ +} + +int +hicn_send_after_aggregation_lr (index_t dpo_idx, hicn_face_id_t in_face) +{ + if (hicn_face_is_local (in_face)) + { + return true; + } + + return false; +} + +void +hicn_on_interest_timeout_lr (index_t dpo_idx) +{ + /* Nothing to do in the lr strategy when we receive an interest */ +} + +void +hicn_receive_data_lr (index_t dpo_idx, int nh_idx) +{ + /* nothing to do */ +} + +/* packet trace format function */ +u8 * +hicn_strategy_format_trace_lr (u8 *s, hicn_strategy_trace_t *t) +{ + s = format (s, + "Strategy_lr: pkt: %d, sw_if_index %d, next index %d, dpo_type " + "%d, out_face %d", + (int) t->pkt_type, t->sw_if_index, t->next_index, t->dpo_type, + t->out_face); + return (s); +} + +u8 * +hicn_strategy_format_lr (u8 *s, va_list *ap) +{ + + u32 indent = va_arg (*ap, u32); + s = format ( + s, "Local-Remote: send from local face to remote only and viceversa \n", + indent); + return (s); +} diff --git a/hicn-plugin/src/strategies/strategy_lr.h b/hicn-plugin/src/strategies/strategy_lr.h new file mode 100644 index 000000000..826eb89a0 --- /dev/null +++ b/hicn-plugin/src/strategies/strategy_lr.h @@ -0,0 +1,35 @@ +/* + * 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: + * + * 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 __HICN_STRATEGY_LR_H__ +#define __HICN_STRATEGY_LR_H__ + +#include "../strategy.h" + +/** + * @file strategy_lr.h + * + * This file implements the local-remote strategy. In this + * strategy, if the interest is received from an application (local) + * face, it is then sent to a remote next hop. Viceversa, when an interest + * is received from a remote face, it is then sent to a local face. + */ + +/** + * @brief Return the vft for the local-remote strategy + */ +hicn_strategy_vft_t *hicn_lr_strategy_get_vft (void); + +#endif // __HICN_STRATEGY_LR_H__ diff --git a/hicn-plugin/src/strategies/strategy_mw.c b/hicn-plugin/src/strategies/strategy_mw.c index fe4d5896a..1f0210fbe 100644 --- a/hicn-plugin/src/strategies/strategy_mw.c +++ b/hicn-plugin/src/strategies/strategy_mw.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2020 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: @@ -16,24 +16,24 @@ #include "../strategy.h" #include "../strategy_dpo_ctx.h" #include "../faces/face.h" -#include "../hashtb.h" #include "../strategy_dpo_manager.h" /* Simple strategy that chooses the next hop with the maximum weight */ /* It does not require to exend the hicn_dpo */ void hicn_receive_data_mw (index_t dpo_idx, int nh_idx); -void hicn_add_interest_mw (index_t dpo_idx, hicn_hash_entry_t * pit_entry); +void hicn_add_interest_mw (index_t dpo_idx); +int hicn_send_after_aggregation_mw (index_t dpo_idx, hicn_face_id_t in_face); void hicn_on_interest_timeout_mw (index_t dpo_idx); -u32 hicn_select_next_hop_mw (index_t dpo_idx, int *nh_idx, - hicn_face_id_t* outface); +u32 hicn_select_next_hop_mw (index_t dpo_idx, hicn_face_id_t in_face, + hicn_face_id_t *outfaces, u16 *len); u32 get_strategy_node_index_mw (void); -u8 *hicn_strategy_format_trace_mw (u8 * s, hicn_strategy_trace_t * t); -u8 *hicn_strategy_format_mw (u8 * s, va_list * ap); - +u8 *hicn_strategy_format_trace_mw (u8 *s, hicn_strategy_trace_t *t); +u8 *hicn_strategy_format_mw (u8 *s, va_list *ap); static hicn_strategy_vft_t hicn_strategy_mw_vft = { .hicn_receive_data = &hicn_receive_data_mw, .hicn_add_interest = &hicn_add_interest_mw, + .hicn_send_after_aggregation = &hicn_send_after_aggregation_mw, .hicn_on_interest_timeout = &hicn_on_interest_timeout_mw, .hicn_select_next_hop = &hicn_select_next_hop_mw, .hicn_format_strategy_trace = hicn_strategy_format_trace_mw, @@ -49,14 +49,19 @@ hicn_mw_strategy_get_vft (void) return &hicn_strategy_mw_vft; } -/* DPO should be give in input as it containes all the information to calculate the next hops*/ +/* DPO should be give in input as it containes all the information to calculate + * the next hops*/ u32 -hicn_select_next_hop_mw (index_t dpo_idx, int *nh_idx, hicn_face_id_t* outface) +hicn_select_next_hop_mw (index_t dpo_idx, hicn_face_id_t in_face, + hicn_face_id_t *outfaces, u16 *len) { hicn_dpo_ctx_t *dpo_ctx = hicn_strategy_dpo_ctx_get (dpo_idx); if (dpo_ctx == NULL) - return HICN_ERROR_STRATEGY_NOT_FOUND; + { + *len = 0; + return HICN_ERROR_STRATEGY_NOT_FOUND; + } hicn_strategy_mw_ctx_t *hicn_strategy_mw_ctx = (hicn_strategy_mw_ctx_t *) dpo_ctx->data; @@ -65,25 +70,27 @@ hicn_select_next_hop_mw (index_t dpo_idx, int *nh_idx, hicn_face_id_t* outface) for (int i = 0; i < dpo_ctx->entry_count; i++) { if (hicn_strategy_mw_ctx->weight[next_hop_index] < - hicn_strategy_mw_ctx->weight[i]) - { - next_hop_index = i; - } + hicn_strategy_mw_ctx->weight[i]) + { + next_hop_index = i; + } } - *outface = dpo_ctx->next_hops[next_hop_index]; + outfaces[0] = dpo_ctx->next_hops[next_hop_index]; + *len = 1; return HICN_ERROR_NONE; } void -hicn_add_interest_mw (index_t dpo_ctx_idx, hicn_hash_entry_t * hash_entry) +hicn_add_interest_mw (index_t dpo_ctx_idx) { - hash_entry->dpo_ctx_id = dpo_ctx_idx; - dpo_id_t hicn_dpo_id = - { hicn_dpo_strategy_mw_get_type (), 0, 0, dpo_ctx_idx }; - hicn_strategy_dpo_ctx_lock (&hicn_dpo_id); - hash_entry->vft_id = hicn_dpo_get_vft_id (&hicn_dpo_id); +} + +int +hicn_send_after_aggregation_mw (index_t dpo_idx, hicn_face_id_t in_face) +{ + return false; } void @@ -97,10 +104,9 @@ hicn_receive_data_mw (index_t dpo_idx, int nh_idx) { } - /* packet trace format function */ u8 * -hicn_strategy_format_trace_mw (u8 * s, hicn_strategy_trace_t * t) +hicn_strategy_format_trace_mw (u8 *s, hicn_strategy_trace_t *t) { s = format (s, "Strategy_mw: pkt: %d, sw_if_index %d, next index %d", (int) t->pkt_type, t->sw_if_index, t->next_index); @@ -108,14 +114,14 @@ hicn_strategy_format_trace_mw (u8 * s, hicn_strategy_trace_t * t) } u8 * -hicn_strategy_format_mw (u8 * s, va_list * ap) +hicn_strategy_format_mw (u8 *s, va_list *ap) { u32 indent = va_arg (*ap, u32); - s = - format (s, - "Static Weights: weights are updated by the control plane, next hop is the one with the maximum weight.\n", - indent); + s = format (s, + "Static Weights: weights are updated by the control plane, next " + "hop is the one with the maximum weight.\n", + indent); return (s); } diff --git a/hicn-plugin/src/strategies/strategy_mw.h b/hicn-plugin/src/strategies/strategy_mw.h index 9e0078b23..186e8c5ab 100644 --- a/hicn-plugin/src/strategies/strategy_mw.h +++ b/hicn-plugin/src/strategies/strategy_mw.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2020 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: diff --git a/hicn-plugin/src/strategies/strategy_mw_cli.c b/hicn-plugin/src/strategies/strategy_mw_cli.c index 636d7effa..4ace68423 100644 --- a/hicn-plugin/src/strategies/strategy_mw_cli.c +++ b/hicn-plugin/src/strategies/strategy_mw_cli.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2020 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: @@ -26,9 +26,9 @@ #include "dpo_mw.h" static clib_error_t * -hicn_mw_strategy_cli_set_weight_command_fn (vlib_main_t * vm, - unformat_input_t * main_input, - vlib_cli_command_t * cmd) +hicn_mw_strategy_cli_set_weight_command_fn (vlib_main_t *vm, + unformat_input_t *main_input, + vlib_cli_command_t *cmd) { clib_error_t *cl_err = 0; int ret = HICN_ERROR_NONE; @@ -54,19 +54,17 @@ hicn_mw_strategy_cli_set_weight_command_fn (vlib_main_t * vm, ; else { - return clib_error_return (0, "%s", - get_error_string - (HICN_ERROR_CLI_INVAL)); + return clib_error_return ( + 0, "%s", get_error_string (HICN_ERROR_CLI_INVAL)); } - } } if (((weight < 0) || (weight > HICN_PARAM_FIB_ENTRY_NHOP_WGHT_MAX))) { - cl_err = clib_error_return (0, - "Next-hop weight must be between 0 and %d", - (int) HICN_PARAM_FIB_ENTRY_NHOP_WGHT_MAX); + cl_err = + clib_error_return (0, "Next-hop weight must be between 0 and %d", + (int) HICN_PARAM_FIB_ENTRY_NHOP_WGHT_MAX); goto done; } @@ -77,24 +75,22 @@ hicn_mw_strategy_cli_set_weight_command_fn (vlib_main_t * vm, goto done; } - prefix.fp_proto = - ip46_address_is_ip4 (&prefix. - fp_addr) ? FIB_PROTOCOL_IP4 : FIB_PROTOCOL_IP6; + prefix.fp_proto = ip46_address_is_ip4 (&prefix.fp_addr) ? FIB_PROTOCOL_IP4 : + FIB_PROTOCOL_IP6; ret = hicn_route_get_dpo (&prefix, &hicn_dpo_id, &fib_index); if (ret == HICN_ERROR_NONE) { hicn_dpo_ctx = hicn_strategy_dpo_ctx_get (hicn_dpo_id->dpoi_index); - if (hicn_dpo_ctx == NULL - || hicn_dpo_id->dpoi_type != hicn_dpo_strategy_mw_get_type ()) + if (hicn_dpo_ctx == NULL || + hicn_dpo_id->dpoi_type != hicn_dpo_strategy_mw_get_type ()) { cl_err = clib_error_return (0, get_error_string (ret)); goto done; } - hicn_strategy_mw_ctx_t *mw_dpo = - (hicn_strategy_mw_ctx_t *) hicn_dpo_ctx; + hicn_strategy_mw_ctx_t *mw_dpo = (hicn_strategy_mw_ctx_t *) hicn_dpo_ctx; int idx = ~0; for (int i = 0; i < hicn_dpo_ctx->entry_count; i++) if (hicn_dpo_ctx->next_hops[i] == faceid) @@ -102,10 +98,8 @@ hicn_mw_strategy_cli_set_weight_command_fn (vlib_main_t * vm, if (idx == ~0) { - cl_err = - clib_error_return (0, - get_error_string - (HICN_ERROR_STRATEGY_NH_NOT_FOUND)); + cl_err = clib_error_return ( + 0, get_error_string (HICN_ERROR_STRATEGY_NH_NOT_FOUND)); goto done; } @@ -114,24 +108,21 @@ hicn_mw_strategy_cli_set_weight_command_fn (vlib_main_t * vm, else { cl_err = clib_error_return (0, get_error_string (ret)); - } done: return (cl_err); - } /* cli declaration for 'strategy mw' */ -/* *INDENT-OFF* */ -VLIB_CLI_COMMAND(hicn_mw_strategy_cli_set_weight_command, static)= -{ + +VLIB_CLI_COMMAND (hicn_mw_strategy_cli_set_weight_command, static) = { .path = "hicn strategy mw set", - .short_help = "hicn strategy mw set prefix <prefix> face <face_id> weight <weight>", + .short_help = + "hicn strategy mw set prefix <prefix> face <face_id> weight <weight>", .function = hicn_mw_strategy_cli_set_weight_command_fn, }; -/* *INDENT-ON* */ /* * fd.io coding-style-patch-verification: ON diff --git a/hicn-plugin/src/strategies/strategy_rp.c b/hicn-plugin/src/strategies/strategy_rp.c new file mode 100644 index 000000000..a44da1323 --- /dev/null +++ b/hicn-plugin/src/strategies/strategy_rp.c @@ -0,0 +1,124 @@ +/* + * 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: + * + * 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 "dpo_rp.h" +#include "../strategy.h" +#include "../strategy_dpo_ctx.h" +#include "../faces/face.h" +#include "../strategy_dpo_manager.h" + +/* Simple strategy that forwards intertests to all next hops */ +/* It does not require to exend the hicn_dpo */ +void hicn_receive_data_rp (index_t dpo_idx, int nh_idx); +void hicn_add_interest_rp (index_t dpo_idx); +int hicn_send_after_aggregation_rp (index_t dpo_idx, hicn_face_id_t in_face); +void hicn_on_interest_timeout_rp (index_t dpo_idx); +u32 hicn_select_next_hop_rp (index_t dpo_idx, hicn_face_id_t in_face, + hicn_face_id_t *outfaces, u16 *len); +u8 *hicn_strategy_format_trace_rp (u8 *s, hicn_strategy_trace_t *t); +u8 *hicn_strategy_format_rp (u8 *s, va_list *ap); + +static hicn_strategy_vft_t hicn_strategy_rp_vft = { + .hicn_receive_data = &hicn_receive_data_rp, + .hicn_add_interest = &hicn_add_interest_rp, + .hicn_on_interest_timeout = &hicn_on_interest_timeout_rp, + .hicn_select_next_hop = &hicn_select_next_hop_rp, + .hicn_format_strategy_trace = &hicn_strategy_format_trace_rp, + .hicn_format_strategy = &hicn_strategy_format_rp +}; + +/* + * Return the vft of the strategy. + */ +hicn_strategy_vft_t * +hicn_rp_strategy_get_vft (void) +{ + return &hicn_strategy_rp_vft; +} + +/* DPO should be give in input as it containes all the information to calculate + * the next hops*/ +u32 +hicn_select_next_hop_rp (index_t dpo_idx, hicn_face_id_t in_face, + hicn_face_id_t *outfaces, u16 *len) +{ + hicn_dpo_ctx_t *dpo_ctx = hicn_strategy_dpo_ctx_get (dpo_idx); + + if (dpo_ctx == NULL || dpo_ctx->entry_count == 0) + { + *len = 0; + return HICN_ERROR_STRATEGY_NOT_FOUND; + } + + int i = 0; + while (i < MAX_OUT_FACES && i < dpo_ctx->entry_count) + { + outfaces[i] = dpo_ctx->next_hops[i]; + i++; + } + *len = i; + + return HICN_ERROR_NONE; +} + +void +hicn_add_interest_rp (index_t dpo_ctx_idx) +{ + /* Nothing to do */ +} + +int +hicn_send_after_aggregation_rp (index_t dpo_idx, hicn_face_id_t in_face) +{ + return false; +} + +void +hicn_on_interest_timeout_rp (index_t dpo_idx) +{ + /* Nothing to do in the rp strategy when we receive an interest */ +} + +void +hicn_receive_data_rp (index_t dpo_idx, int nh_idx) +{ + /* nothing to do */ +} + +/* packet trace format function */ +u8 * +hicn_strategy_format_trace_rp (u8 *s, hicn_strategy_trace_t *t) +{ + s = format (s, "Strategy_rp: pkt: %d, sw_if_index %d, next index %d", + (int) t->pkt_type, t->sw_if_index, t->next_index); + return (s); +} + +u8 * +hicn_strategy_format_rp (u8 *s, va_list *ap) +{ + + u32 indent = va_arg (*ap, u32); + s = format (s, "Replication: send to all the next hops \n", indent); + return (s); +} + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/hicn-plugin/src/strategies/strategy_rp.h b/hicn-plugin/src/strategies/strategy_rp.h new file mode 100644 index 000000000..c308497cc --- /dev/null +++ b/hicn-plugin/src/strategies/strategy_rp.h @@ -0,0 +1,41 @@ +/* + * 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: + * + * 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 __HICN_STRATEGY_RP_H__ +#define __HICN_STRATEGY_RP_H__ + +#include "../strategy.h" + +/** + * @file strategy_rp.h + * + * This file implements the replication strategy. In this + * strategy all the next hops are used to send an intertest. + */ + +/** + * @brief Return the vft for the Replication strategy + */ +hicn_strategy_vft_t *hicn_rp_strategy_get_vft (void); + +#endif // __HICN_STRATEGY_RP_H__ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/hicn-plugin/src/strategies/strategy_rr.c b/hicn-plugin/src/strategies/strategy_rr.c index 4c65ce52a..af3cb320a 100644 --- a/hicn-plugin/src/strategies/strategy_rr.c +++ b/hicn-plugin/src/strategies/strategy_rr.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2020 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: @@ -17,19 +17,18 @@ #include "../strategy.h" #include "../strategy_dpo_ctx.h" #include "../faces/face.h" -#include "../hashtb.h" #include "../strategy_dpo_manager.h" /* Simple strategy that chooses the next hop with the maximum weight */ /* It does not require to exend the hicn_dpo */ void hicn_receive_data_rr (index_t dpo_idx, int nh_idx); -void hicn_add_interest_rr (index_t dpo_idx, hicn_hash_entry_t * pit_entry); +void hicn_add_interest_rr (index_t dpo_idx); +int hicn_send_after_aggregation_rr (index_t dpo_idx, hicn_face_id_t in_face); void hicn_on_interest_timeout_rr (index_t dpo_idx); -u32 hicn_select_next_hop_rr (index_t dpo_idx, int *nh_idx, - hicn_face_id_t* outface); -u8 *hicn_strategy_format_trace_rr (u8 * s, hicn_strategy_trace_t * t); -u8 *hicn_strategy_format_rr (u8 * s, va_list * ap); - +u32 hicn_select_next_hop_rr (index_t dpo_idx, hicn_face_id_t in_face, + hicn_face_id_t *outfaces, u16 *len); +u8 *hicn_strategy_format_trace_rr (u8 *s, hicn_strategy_trace_t *t); +u8 *hicn_strategy_format_rr (u8 *s, va_list *ap); static hicn_strategy_vft_t hicn_strategy_rr_vft = { .hicn_receive_data = &hicn_receive_data_rr, @@ -49,20 +48,25 @@ hicn_rr_strategy_get_vft (void) return &hicn_strategy_rr_vft; } -/* DPO should be give in input as it containes all the information to calculate the next hops*/ +/* DPO should be give in input as it containes all the information to calculate + * the next hops*/ u32 -hicn_select_next_hop_rr (index_t dpo_idx, int *nh_idx, hicn_face_id_t* outface) +hicn_select_next_hop_rr (index_t dpo_idx, hicn_face_id_t in_face, + hicn_face_id_t *outfaces, u16 *len) { hicn_dpo_ctx_t *dpo_ctx = hicn_strategy_dpo_ctx_get (dpo_idx); if (dpo_ctx == NULL) - return HICN_ERROR_STRATEGY_NOT_FOUND; + { + *len = 0; + return HICN_ERROR_STRATEGY_NOT_FOUND; + } hicn_strategy_rr_ctx_t *hicn_strategy_rr_ctx = (hicn_strategy_rr_ctx_t *) dpo_ctx->data; - *outface = - dpo_ctx->next_hops[hicn_strategy_rr_ctx->current_nhop]; + outfaces[0] = dpo_ctx->next_hops[hicn_strategy_rr_ctx->current_nhop]; + *len = 1; hicn_strategy_rr_ctx->current_nhop = (hicn_strategy_rr_ctx->current_nhop + 1) % dpo_ctx->entry_count; @@ -71,13 +75,14 @@ hicn_select_next_hop_rr (index_t dpo_idx, int *nh_idx, hicn_face_id_t* outface) } void -hicn_add_interest_rr (index_t dpo_ctx_idx, hicn_hash_entry_t * hash_entry) +hicn_add_interest_rr (index_t dpo_ctx_idx) { - hash_entry->dpo_ctx_id = dpo_ctx_idx; - dpo_id_t hicn_dpo_id = - { hicn_dpo_strategy_rr_get_type (), 0, 0, dpo_ctx_idx }; - hicn_strategy_dpo_ctx_lock (&hicn_dpo_id); - hash_entry->vft_id = hicn_dpo_get_vft_id (&hicn_dpo_id); +} + +int +hicn_send_after_aggregation_rr (index_t dpo_idx, hicn_face_id_t in_face) +{ + return false; } void @@ -91,10 +96,9 @@ hicn_receive_data_rr (index_t dpo_idx, int nh_idx) { } - /* packet trace format function */ u8 * -hicn_strategy_format_trace_rr (u8 * s, hicn_strategy_trace_t * t) +hicn_strategy_format_trace_rr (u8 *s, hicn_strategy_trace_t *t) { s = format (s, "Strategy_rr: pkt: %d, sw_if_index %d, next index %d", (int) t->pkt_type, t->sw_if_index, t->next_index); @@ -102,14 +106,14 @@ hicn_strategy_format_trace_rr (u8 * s, hicn_strategy_trace_t * t) } u8 * -hicn_strategy_format_rr (u8 * s, va_list * ap) +hicn_strategy_format_rr (u8 *s, va_list *ap) { u32 indent = va_arg (*ap, u32); - s = - format (s, - "Round Robin: next hop is chosen ciclying between all the available next hops, one after the other.\n", - indent); + s = format (s, + "Round Robin: next hop is chosen ciclying between all the " + "available next hops, one after the other.\n", + indent); return (s); } diff --git a/hicn-plugin/src/strategies/strategy_rr.h b/hicn-plugin/src/strategies/strategy_rr.h index 4dfe76b43..fb7520180 100644 --- a/hicn-plugin/src/strategies/strategy_rr.h +++ b/hicn-plugin/src/strategies/strategy_rr.h @@ -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: |