aboutsummaryrefslogtreecommitdiffstats
path: root/hicn-light/src/hicn/config/controlSetStrategy.c
diff options
context:
space:
mode:
Diffstat (limited to 'hicn-light/src/hicn/config/controlSetStrategy.c')
-rw-r--r--hicn-light/src/hicn/config/controlSetStrategy.c75
1 files changed, 47 insertions, 28 deletions
diff --git a/hicn-light/src/hicn/config/controlSetStrategy.c b/hicn-light/src/hicn/config/controlSetStrategy.c
index 10fec964b..3229c1864 100644
--- a/hicn-light/src/hicn/config/controlSetStrategy.c
+++ b/hicn-light/src/hicn/config/controlSetStrategy.c
@@ -34,10 +34,14 @@
static CommandReturn _controlSetStrategy_Execute(CommandParser *parser,
CommandOps *ops,
- PARCList *args);
+ PARCList *args,
+ char *output,
+ size_t output_size);
static CommandReturn _controlSetStrategy_HelpExecute(CommandParser *parser,
CommandOps *ops,
- PARCList *args);
+ PARCList *args,
+ char *output,
+ size_t output_size);
static const char *_commandSetStrategy = "set strategy";
static const char *_commandSetStrategyHelp = "help set strategy";
@@ -85,7 +89,11 @@ static void _getAddressAndLen(const char * prefixStr, char *addr, uint32_t *len)
}
static bool _checkAndSetIp(set_strategy_command * setStrategyCommand,
- int index, char * addr, uint32_t len){
+ int index,
+ char * addr,
+ uint32_t len,
+ char *output,
+ size_t output_size){
// check and set IP address
int res;
if(index == -1)
@@ -96,10 +104,10 @@ static bool _checkAndSetIp(set_strategy_command * setStrategyCommand,
if(res == 1) {
if (len == UINT32_MAX) {
- printf("Netmask not specified: set to 32 by default\n");
+ snprintf(output, output_size, "Netmask not specified: set to 32 by default\n");
len = 32;
} else if (len > 32) {
- printf("ERROR: exceeded INET mask length, max=32\n");
+ snprintf(output, output_size, "ERROR: exceeded INET mask length, max=32\n");
return false;
}
if(index == -1)
@@ -118,10 +126,10 @@ static bool _checkAndSetIp(set_strategy_command * setStrategyCommand,
if(res == 1) {
if (len == UINT32_MAX) {
- printf("Netmask not specified: set to 128 by default\n");
+ snprintf(output, output_size, "Netmask not specified: set to 128 by default\n");
len = 128;
} else if (len > 128) {
- printf("ERROR: exceeded INET6 mask length, max=128\n");
+ snprintf(output, output_size, "ERROR: exceeded INET6 mask length, max=128\n");
return false;
}
@@ -131,7 +139,8 @@ static bool _checkAndSetIp(set_strategy_command * setStrategyCommand,
setStrategyCommand->addresses_type[index] = ADDR_INET6;
} else {
- printf("Error: %s is not a valid network address \n", addr);
+ snprintf(output, output_size, "Error: %s is not a valid network address \n", addr);
+
return false;
}
}
@@ -140,36 +149,43 @@ static bool _checkAndSetIp(set_strategy_command * setStrategyCommand,
static CommandReturn _controlSetStrategy_HelpExecute(CommandParser *parser,
CommandOps *ops,
- PARCList *args) {
- printf("set strategy <prefix> <strategy> ");
- printf("[related_prefix1 related_preifx2 ...]\n");
- printf("prefix: ipv4/ipv6 address (ex: 1234::/64)\n");
- printf("strategy: strategy identifier\n");
- printf("optinal: list of related prefixes (max %u)\n",
- MAX_FWD_STRATEGY_RELATED_PREFIXES);
- printf("available strategies:\n");
- printf(" random\n");
- printf(" loadbalancer\n");
- printf(" low_latency\n");
- printf("\n");
+ PARCList *args,
+ char *output,
+ size_t output_size) {
+ snprintf(output, output_size,
+ "set strategy <prefix> <strategy> "
+ "[related_prefix1 related_preifx2 ...]\n"
+ "prefix: ipv4/ipv6 address (ex: 1234::/64)\n"
+ "strategy: strategy identifier\n"
+ "optinal: list of related prefixes (max %u)\n"
+ "available strategies:\n"
+ " random\n"
+ " loadbalancer\n"
+ " low_latency\n\n",
+ MAX_FWD_STRATEGY_RELATED_PREFIXES);
return CommandReturn_Success;
}
static CommandReturn _controlSetStrategy_Execute(CommandParser *parser,
CommandOps *ops,
- PARCList *args) {
+ PARCList *args,
+ char *output,
+ size_t output_size) {
+ if (output) {
+ output[0] = '\0';
+ }
ControlState *state = ops->closure;
if (parcList_Size(args) < 4 ||
parcList_Size(args) > (4 + MAX_FWD_STRATEGY_RELATED_PREFIXES)) {
- _controlSetStrategy_HelpExecute(parser, ops, args);
+ _controlSetStrategy_HelpExecute(parser, ops, args, output, output_size);
return CommandReturn_Failure;
}
if (((strcmp(parcList_GetAtIndex(args, 0), "set") != 0) ||
(strcmp(parcList_GetAtIndex(args, 1), "strategy") != 0))) {
- _controlSetStrategy_HelpExecute(parser, ops, args);
+ _controlSetStrategy_HelpExecute(parser, ops, args, output, output_size);
return CommandReturn_Failure;
}
@@ -182,7 +198,7 @@ static CommandReturn _controlSetStrategy_Execute(CommandParser *parser,
set_strategy_command *setStrategyCommand =
parcMemory_AllocateAndClear(sizeof(set_strategy_command));
- bool success = _checkAndSetIp(setStrategyCommand, -1, addr, len);
+ bool success = _checkAndSetIp(setStrategyCommand, -1, addr, len, output, output_size);
if(!success){
parcMemory_Deallocate(&setStrategyCommand);
free(addr);
@@ -193,9 +209,11 @@ static CommandReturn _controlSetStrategy_Execute(CommandParser *parser,
// check valid strategy
strategy_type strategy;
if ((strategy = _validStrategy(strategyStr)) == LAST_STRATEGY_VALUE) {
- printf("Error: invalid strategy \n");
+ size_t output_offset = strlen(output);
+ output_offset += snprintf(output + output_offset, output_size - output_offset, "Error: invalid strategy \n");
+
parcMemory_Deallocate(&setStrategyCommand);
- _controlSetStrategy_HelpExecute(parser, ops, args);
+ _controlSetStrategy_HelpExecute(parser, ops, args, output + output_offset, output_size - output_offset);
free(addr);
return CommandReturn_Failure;
}
@@ -205,7 +223,7 @@ static CommandReturn _controlSetStrategy_Execute(CommandParser *parser,
// Fill remaining payload fields
setStrategyCommand->len = len;
setStrategyCommand->strategyType = strategy;
-
+ size_t output_offset = strlen(output);
//check additional prefixes
if(parcList_Size(args) > 4){
uint32_t index = 4; //first realted prefix
@@ -217,12 +235,13 @@ static CommandReturn _controlSetStrategy_Execute(CommandParser *parser,
uint32_t rel_len = UINT32_MAX;
_getAddressAndLen(str, rel_addr, &rel_len);
bool success = _checkAndSetIp(setStrategyCommand, addr_index,
- rel_addr, rel_len);
+ rel_addr, rel_len, output + output_offset, output_size - output_offset);
if(!success){
parcMemory_Deallocate(&setStrategyCommand);
free(rel_addr);
return CommandReturn_Failure;
}
+ output_offset = strlen(output);
setStrategyCommand->lens[addr_index] = rel_len;
free(rel_addr);
index++;