From c580a00aac271a524e5a75b35f4b91c174ed227b Mon Sep 17 00:00:00 2001 From: michele papalini Date: Thu, 23 Feb 2017 17:01:34 +0100 Subject: Initial commit: sb-forwarder, metis. Change-Id: I65ee3c851a6901929ef4417ad80d34bca0dce445 Signed-off-by: michele papalini --- .../metis/config/metisControl_RemoveConnection.c | 224 +++++++++++++++++++++ 1 file changed, 224 insertions(+) create mode 100644 metis/ccnx/forwarder/metis/config/metisControl_RemoveConnection.c (limited to 'metis/ccnx/forwarder/metis/config/metisControl_RemoveConnection.c') diff --git a/metis/ccnx/forwarder/metis/config/metisControl_RemoveConnection.c b/metis/ccnx/forwarder/metis/config/metisControl_RemoveConnection.c new file mode 100644 index 00000000..12c796c1 --- /dev/null +++ b/metis/ccnx/forwarder/metis/config/metisControl_RemoveConnection.c @@ -0,0 +1,224 @@ +/* + * Copyright (c) 2017 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 + +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include + +#include + +static void _metisControlRemoveConnection_Init(MetisCommandParser *parser, MetisCommandOps *ops); +static MetisCommandReturn _metisControlRemoveConnection_Execute(MetisCommandParser *parser, MetisCommandOps *ops, PARCList *args); +static MetisCommandReturn _metisControlRemoveConnection_HelpExecute(MetisCommandParser *parser, MetisCommandOps *ops, PARCList *args); + +// =================================================== + +//TODO: implement this also for TCP and ethernet + +static MetisCommandReturn _metisControlRemoveConnection_UdpHelpExecute(MetisCommandParser *parser, MetisCommandOps *ops, PARCList *args); +static MetisCommandReturn _metisControlRemoveConnection_UdpExecute(MetisCommandParser *parser, MetisCommandOps *ops, PARCList *args); + +// =================================================== + + +static const char *_commandRemoveConnection = "remove connection"; +static const char *_commandRemoveConnectionUdp = "remove connection udp"; +static const char *_commandRemoveConnectionHelp = "help remove connection"; +static const char *_commandRemoveConnectionUdpHelp = "help remove connection udp"; + +// ==================================================== + +MetisCommandOps * +metisControlRemoveConnection_Create(MetisControlState *state) +{ + return metisCommandOps_Create(state, _commandRemoveConnection, _metisControlRemoveConnection_Init, _metisControlRemoveConnection_Execute, metisCommandOps_Destroy); +} + +MetisCommandOps * +metisControlRemoveConnection_HelpCreate(MetisControlState *state) +{ + return metisCommandOps_Create(state, _commandRemoveConnectionHelp, NULL, _metisControlRemoveConnection_HelpExecute, metisCommandOps_Destroy); +} + +// ==================================================== + +static MetisCommandOps * +_metisControlRemoveConnection_UdpCreate(MetisControlState *state) +{ + return metisCommandOps_Create(state, _commandRemoveConnectionUdp, NULL, + _metisControlRemoveConnection_UdpExecute, metisCommandOps_Destroy); +} + +static MetisCommandOps * +_metisControlRemoveConnection_UdpHelpCreate(MetisControlState *state) +{ + return metisCommandOps_Create(state, _commandRemoveConnectionUdpHelp, NULL, + _metisControlRemoveConnection_UdpHelpExecute, metisCommandOps_Destroy); +} + +// ==================================================== + +/** + * A symbolic name must be at least 1 character and must begin with an alpha. + * The remainder must be an alphanum. + */ +static bool +_validateSymbolicName(const char *symbolic) +{ + bool success = false; + size_t len = strlen(symbolic); + if (len > 0) { + if (isalpha(symbolic[0])) { + success = true; + for (size_t i = 1; i < len; i++) { + if (!isalnum(symbolic[i])) { + success = false; + break; + } + } + } + } + return success; +} + +// ==================================================== + +static MetisCommandReturn +_metisControlRemoveConnection_HelpExecute(MetisCommandParser *parser, MetisCommandOps *ops, PARCList *args) +{ + printf("Available commands:\n"); + printf(" %s\n", _commandRemoveConnectionUdp); + return MetisCommandReturn_Success; +} + +static void +_metisControlRemoveConnection_Init(MetisCommandParser *parser, MetisCommandOps *ops) +{ + MetisControlState *state = ops->closure; + metisControlState_RegisterCommand(state, _metisControlRemoveConnection_UdpHelpCreate(state)); + + metisControlState_RegisterCommand(state, _metisControlRemoveConnection_UdpCreate(state)); +} + + +static MetisCommandReturn +_metisControlRemoveConnection_Execute(MetisCommandParser *parser, MetisCommandOps *ops, PARCList *args) +{ + return _metisControlRemoveConnection_HelpExecute(parser, ops, args); +} + +// ================================================== + +static bool +_parseMessage(MetisCommandParser *parser, MetisCommandOps *ops, PARCList *args, char **symbolicPtr) +{ + if (parcList_Size(args) != 4) { + _metisControlRemoveConnection_UdpHelpExecute(parser, ops, args); + return false; + } + + if ((strcmp(parcList_GetAtIndex(args, 0), "remove") != 0) || + (strcmp(parcList_GetAtIndex(args, 1), "connection") != 0) || + (strcmp(parcList_GetAtIndex(args, 2), "udp") != 0)) { + _metisControlRemoveConnection_UdpHelpExecute(parser, ops, args); + return false; + } + + char *symbolic = parcList_GetAtIndex(args, 3); + if (_validateSymbolicName(symbolic)) { + *symbolicPtr = symbolic; + return true; + } + return false; +} + +static void +_removeUdpConnection(MetisCommandParser *parser, MetisCommandOps *ops, PARCList *args, char *symbolic) +{ + MetisControlState *state = ops->closure; + struct sockaddr_in *local = parcNetwork_SockInet4AddressAny(); //parcNetwork_SockInet4Address("192.168.56.27", 12346); + struct sockaddr_in *remote = parcNetwork_SockInet4AddressAny(); //parcNetwork_SockInet4Address("192.168.62.10", 19695); + CPIAddress *localAddress = cpiAddress_CreateFromInet(local); + CPIAddress *remoteAddress = cpiAddress_CreateFromInet(remote); + + CPIInterfaceIPTunnel *ipTunnel = cpiInterfaceIPTunnel_Create(0, localAddress, remoteAddress, IPTUN_UDP, symbolic); + + PARCJSON *cpiMessage = cpiLinks_RemoveIPTunnel(ipTunnel); + CCNxControl *controlMessage = ccnxControl_CreateCPIRequest(cpiMessage); + parcJSON_Release(&cpiMessage); + + CCNxMetaMessage *message = ccnxMetaMessage_CreateFromControl(controlMessage); + + if (metisControlState_GetDebug(state)) { + char *str = parcJSON_ToString(ccnxControl_GetJson(message)); + printf("request: %s\n", str); + parcMemory_Deallocate((void **) &str); + } + + + CCNxMetaMessage *rawResponse = metisControlState_WriteRead(state, message); + ccnxMetaMessage_Release(&message); + + CCNxControl *response = ccnxMetaMessage_GetControl(rawResponse); + + if (metisControlState_GetDebug(state)) { + char *str = parcJSON_ToString(ccnxControl_GetJson(response)); + printf("reponse:\n%s\n", str); + parcMemory_Deallocate((void **) &str); + } + + ccnxControl_Release(&controlMessage); + ccnxMetaMessage_Release(&rawResponse); + cpiInterfaceIPTunnel_Release(&ipTunnel); + parcMemory_Deallocate((void **) &remote); + parcMemory_Deallocate((void **) &local); +} + +static MetisCommandReturn +_metisControlRemoveConnection_UdpHelpExecute(MetisCommandParser *parser, MetisCommandOps *ops, PARCList *args) +{ + printf("command:\n"); + printf(" remove connection upd \n"); + return MetisCommandReturn_Success; +} + +static MetisCommandReturn +_metisControlRemoveConnection_UdpExecute(MetisCommandParser *parser, MetisCommandOps *ops, PARCList *args) +{ + char *symbolic = NULL; + if (!_parseMessage(parser, ops, args, &symbolic)) { + return MetisCommandReturn_Success; + } + + _removeUdpConnection(parser, ops, args, symbolic); + + return MetisCommandReturn_Success; +} + + -- cgit 1.2.3-korg