aboutsummaryrefslogtreecommitdiffstats
path: root/hicn-light/src/hicn/config/configuration.c
diff options
context:
space:
mode:
authorJordan Augé <jordan.auge+fdio@cisco.com>2019-05-09 11:26:31 +0200
committerJordan Augé <jordan.auge+fdio@cisco.com>2019-05-09 11:26:31 +0200
commit3e2cd52a6ae2345a44f39761beb5315a45832d95 (patch)
tree14f55c9fd58003faed83a3d47756a46d97c09322 /hicn-light/src/hicn/config/configuration.c
parentc8e6bdf4282c34fd3199cdeec42895cbbc05d9c1 (diff)
[HICN-192] Add interface to administratively set a connection up and down
Change-Id: I8d00262fd8601328a50d0e2a6bef952031246818 Signed-off-by: Jordan Augé <jordan.auge+fdio@cisco.com>
Diffstat (limited to 'hicn-light/src/hicn/config/configuration.c')
-rw-r--r--hicn-light/src/hicn/config/configuration.c60
1 files changed, 60 insertions, 0 deletions
diff --git a/hicn-light/src/hicn/config/configuration.c b/hicn-light/src/hicn/config/configuration.c
index 851e0a9a8..fa3a858c2 100644
--- a/hicn-light/src/hicn/config/configuration.c
+++ b/hicn-light/src/hicn/config/configuration.c
@@ -78,6 +78,44 @@ struct configuration {
// ========================================================================================
+Connection *
+getConnectionBySymbolicOrId(Configuration * config, const char * symbolicOrConnid)
+{
+ ConnectionTable *table = forwarder_GetConnectionTable(config->forwarder);
+ unsigned connid;
+ Connection *conn = NULL;
+
+ /* Try to resolve an eventual symbolic name as input */
+ if (utils_IsNumber(symbolicOrConnid)) {
+ connid = strtold(symbolicOrConnid, NULL);
+
+ } else {
+ connid = symbolicNameTable_Get(config->symbolicNameTable, symbolicOrConnid);
+ if (connid == UINT32_MAX) {
+ if (logger_IsLoggable(config->logger, LoggerFacility_Config,
+ PARCLogLevel_Warning)) {
+ logger_Log(config->logger, LoggerFacility_Config, PARCLogLevel_Error,
+ __func__, "Symbolic name '%s' could not be resolved",
+ symbolicOrConnid);
+ }
+ }
+ }
+
+ /* Get connection by ID */
+ conn = (Connection *)connectionTable_FindById( table, connid);
+ if (!conn) {
+ if (logger_IsLoggable(config->logger, LoggerFacility_Config,
+ PARCLogLevel_Warning)) {
+ logger_Log(config->logger, LoggerFacility_Config, PARCLogLevel_Error,
+ __func__, "ConnID not found, check list connections");
+ }
+ }
+
+ return conn;
+}
+
+// ========================================================================================
+
Configuration *configuration_Create(Forwarder *forwarder) {
parcAssertNotNull(forwarder, "Parameter hicn-fwd must be non-null");
Configuration *config = parcMemory_AllocateAndClear(sizeof(Configuration));
@@ -383,6 +421,8 @@ struct iovec *configuration_ProcessCreateTunnel(Configuration *config,
if (ops != NULL) {
Connection *conn = connection_Create(ops);
+ connection_SetAdminState(conn, control->admin_state);
+
connectionTable_Add(forwarder_GetConnectionTable(config->forwarder),
conn);
symbolicNameTable_Add(config->symbolicNameTable, symbolicName,
@@ -538,6 +578,8 @@ struct iovec *configuration_ProcessConnectionList(Configuration *config,
listConnectionsCommand->connectionData.connectionType =
ioOperations_GetConnectionType(connection_GetIoOperations(original));
+ listConnectionsCommand->connectionData.admin_state = connection_GetAdminState(original);
+
if (addressGetType(localAddress) == ADDR_INET &&
addressGetType(remoteAddress) == ADDR_INET) {
listConnectionsCommand->connectionData.ipType = ADDR_INET;
@@ -970,6 +1012,20 @@ struct iovec *configuration_MapMeRetx(Configuration *config,
return response;
}
+struct iovec *configuration_ConnectionSetAdminState(Configuration *config,
+ struct iovec *request) {
+ header_control_message *header = request[0].iov_base;
+ connection_set_admin_state_command *control = request[1].iov_base;
+
+ Connection * conn = getConnectionBySymbolicOrId(config, control->symbolicOrConnid);
+ if (!conn)
+ return utils_CreateNack(header, control, sizeof(connection_set_admin_state_command));
+
+ connection_SetAdminState(conn, control->admin_state);
+
+ return utils_CreateAck(header, control, sizeof(connection_set_admin_state_command));
+}
+
// ===========================
// Main functions that deal with receiving commands, executing them, and sending
// ACK/NACK
@@ -1054,6 +1110,10 @@ struct iovec *configuration_DispatchCommand(Configuration *config,
response = configuration_MapMeRetx(config, control);
break;
+ case CONNECTION_SET_ADMIN_STATE:
+ response = configuration_ConnectionSetAdminState(config, control);
+ break;
+
default:
break;
}