summaryrefslogtreecommitdiffstats
path: root/cnd/src/cnd_iproute2.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cnd/src/cnd_iproute2.cpp')
-rw-r--r--cnd/src/cnd_iproute2.cpp1802
1 files changed, 0 insertions, 1802 deletions
diff --git a/cnd/src/cnd_iproute2.cpp b/cnd/src/cnd_iproute2.cpp
deleted file mode 100644
index 311f682..0000000
--- a/cnd/src/cnd_iproute2.cpp
+++ /dev/null
@@ -1,1802 +0,0 @@
-/* Copyright (c) 2010, Code Aurora Forum. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * * Neither the name of Code Aurora nor
- * the names of its contributors may be used to endorse or promote
- * products derived from this software without specific prior written
- * permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- */
-
-/*============================================================================
- FILE: cnd_iproute2.cpp
-
- OVERVIEW: This program is an interface to make the necessary calls to
- iproute2 in order to set up and take down routing tables.
- These calls are made indirectly over the command line by using
- a call to the C++ system() function. For each routing device
- visible to the kernel, cnd_iproute2 allows one table. Each
- table contains one entry, a default path to the inputted
- routing device. A source address or network prefix is also
- required in order to instantiate a table, so that packets from
- that ip address are routed through the device. A gateway
- address can also be inputted optionally for a newly added
- routing table.
-
- DEPENDENCIES: None
-============================================================================*/
-
-/*----------------------------------------------------------------------------
- * Include Files
- * -------------------------------------------------------------------------*/
-#include "cnd_iproute2.h"
-#include <utils/Log.h>
-#include <sys/types.h>
-#include <cstdarg>
-#include <map>
-#include <set>
-#include <cnd.h>
-
-using namespace std;
-
-/*----------------------------------------------------------------------------
- * Preprocessor Definitions and Constants
- * -------------------------------------------------------------------------*/
-#undef LOG_TAG
-#define LOG_TAG "CND_IPROUTE2"
-#define LOCAL_TAG "CND_IPROUTE2_DEBUG"
-
-/*----------------------------------------------------------------------------
- * Type Declarations
- * -------------------------------------------------------------------------*/
-// List of all actions supported from iproute2. Should match defintions
-// defined below prefixed with ACTIONS
-enum Cmd_line_actions
-{
- ACTIONS_ADD_ENUM,
- ACTIONS_DELETE_ENUM,
- ACTIONS_FLUSH_ENUM,
- ACTIONS_REPLACE_ENUM,
- ACTIONS_SHOW_ENUM
-};
-
-// Comparator function for use in the map of active interfaces.
-struct routingTableMapComparator {
- bool operator() (const uint8_t *string1, const uint8_t *string2) const
- {
- if (string1 && string2) {
- return (strcmp((char *)string1, (char *)string2) < 0);
- }
- return false;
- }
-};
-
-class CustomRouteInfo;
-class RoutingTableInfo;
-
-/*----------------------------------------------------------------------------
- * Static Variable Definitions
- * -------------------------------------------------------------------------*/
-// Commands to begin the command line string
-static const uint8_t *ROUTING_CMD = (uint8_t *)"ip route";
-static const uint8_t *RULE_CMD = (uint8_t *)"ip rule";
-
-// List of all actions supported from iproute2. These should match values in
-// above enumeration 'Cmd_line_actions'
-static const uint8_t *ACTIONS_ADD_STR = (uint8_t *)"add";
-static const uint8_t *ACTIONS_DELETE_STR = (uint8_t *)"delete";
-static const uint8_t *ACTIONS_FLUSH_STR = (uint8_t *)"flush";
-static const uint8_t *ACTIONS_REPLACE_STR = (uint8_t *)"replace";
-static const uint8_t *ACTIONS_SHOW_STR = (uint8_t *)"show";
-
-// Keywords used to refine calls to iproute2
-static const uint8_t *CMD_LINE_DEVICE_NAME = (uint8_t *)"dev";
-static const uint8_t *CMD_LINE_GATEWAY_ADDRESS = (uint8_t *)"via";
-static const uint8_t *CMD_LINE_PRIORITY_NUMBER = (uint8_t *)"priority";
-static const uint8_t *CMD_LINE_SOURCE_PREFIX = (uint8_t *)"from";
-static const uint8_t *CMD_LINE_TABLE_NUMBER = (uint8_t *)"table";
-
-// Keywords that refer to specific routes or tables
-static const uint8_t *ALL_TABLES = (uint8_t *)"all";
-static const uint8_t *CACHED_ENTRIES = (uint8_t *)"cache";
-static const uint8_t *DEFAULT_ADDRESS = (uint8_t *)"default";
-static const uint8_t *SCOPE_GLOBAL = (uint8_t *)"global";
-static const uint8_t *SCOPE_KEYWORD = (uint8_t *)"scope";
-static const uint8_t *SCOPE_LINK = (uint8_t *)"link";
-
-// Table #1 is the first usable routing table
-static const int32_t MIN_TABLE_NUMBER = 1;
-
-// Table #253 is the 'defined' default routing table, which should not
-// be overwritten
-static const int32_t MAX_TABLE_NUMBER = 252;
-
-// Priority number 32766 diverts packets to the main table (Table #254)
-static const int32_t MAX_PRIORITY_NUMBER = 32765;
-
-// Max number of digits in a table number is 3
-static const int32_t MAX_DIGITS_TABLE_NUMBER = 3;
-
-// Max number of digits in a priority number is 5
-static const int32_t MAX_DIGITS_PRIORITY_NUMBER = 5;
-
-cnd_iproute2* cnd_iproute2::instancePtr = NULL;
-
-/*----------------------------------------------------------------------------
- * Global Data Definitions
- * -------------------------------------------------------------------------*/
-// Set of all table numbers currently being used. Cannot contain more than
-// MAX_TABLE_NUMBER - MIN_TABLE_NUMBER elements
-set<int32_t> tableNumberSet;
-
-// Maps the name of a device to its corresponding routing characteristics
-map<uint8_t*, RoutingTableInfo*, routingTableMapComparator> routingTableMap;
-
-// Maps destination address of any custom entries created in the main table with
-// its corresponding routing table characteristics.
-map<uint8_t*, CustomRouteInfo*, routingTableMapComparator> customRouteMap;
-
-// If a packet does not have an associated rule, it will go to the main
-// routing table and be routed to the following device by default
-uint8_t *defaultDevice;
-
-/*-------------------------------------------------------------------------
- * Declaration for a non-member method.
- *-----------------------------------------------------------------------*/
-void flushCache
-(
- void
-);
-
-uint8_t *cmdLineActionEnumToString
-(
- Cmd_line_actions commandAction
-);
-
-uint8_t *storeRoutingInformation
-(
- uint8_t *parameterPtr
-);
-
-bool modifyCustomRouteInMainTable
-(
- uint8_t *destinationAddress,
- uint8_t *deviceName,
- uint8_t *gatewayAddress,
- Cmd_line_actions commandAction
-);
-
-bool modifyDefaultRoute
-(
- uint8_t *deviceName,
- uint8_t *gatewayAddress,
- Cmd_line_actions commandAction
-);
-
-bool modifyRoutingTable
-(
- uint8_t *deviceName,
- uint8_t *sourcePrefix,
- uint8_t *gatewayAddress,
- Cmd_line_actions commandAction
-);
-
-bool modifyRule
-(
- RoutingTableInfo *currentDevice,
- Cmd_line_actions commandAction
-);
-
-bool cmdLineCaller
-(
- const uint8_t* cmdLineFirstWord,
- ...
-);
-
-/*-------------------------------------------------------------------------
- * Class Definitions
- *-----------------------------------------------------------------------*/
-/** Stores information needed to create a custom entry in the
- * main table. This allows the calling class to delete that
- * entry without needing to keep track of any characteristics
- * of the device other than its name.
- */
-class CustomRouteInfo
-{
- private:
- uint8_t *deviceName;
- uint8_t *gatewayAddress;
- uint8_t *destinationAddress;
-
- public:
- CustomRouteInfo
- (
- uint8_t *deviceName,
- uint8_t *gatewayAddress,
- uint8_t *destinationAddress
- )
- {
- CustomRouteInfo::deviceName = storeRoutingInformation(deviceName);
-
- if (NULL != gatewayAddress)
- {
- CustomRouteInfo::gatewayAddress =
- storeRoutingInformation(gatewayAddress);
- }
-
- else
- {
- CustomRouteInfo::gatewayAddress = NULL;
- }
-
- CustomRouteInfo::destinationAddress =
- storeRoutingInformation(destinationAddress);
- }
-
- ~CustomRouteInfo()
- {
- delete [] CustomRouteInfo::deviceName;
- if (NULL != CustomRouteInfo::gatewayAddress)
- {
- delete [] CustomRouteInfo::gatewayAddress;
- }
- if (NULL != CustomRouteInfo::destinationAddress)
- {
- delete [] CustomRouteInfo::destinationAddress;
- }
- }
-
- uint8_t* getDestinationAddress(void)
- {
- return destinationAddress;
- }
-
- uint8_t* getDeviceName(void)
- {
- return deviceName;
- }
-
- uint8_t* getGatewayAddress(void)
- {
- return gatewayAddress;
- }
-
- void setDeviceName(uint8_t *deviceName)
- {
- if (NULL != CustomRouteInfo::deviceName)
- {
- delete [] CustomRouteInfo::deviceName;
- }
-
- CustomRouteInfo::deviceName = storeRoutingInformation(deviceName);
- }
-
- void setGatewayAddress(uint8_t *gatewayAddress)
- {
- if (NULL != CustomRouteInfo::gatewayAddress)
- {
- delete [] CustomRouteInfo::gatewayAddress;
- }
-
- CustomRouteInfo::gatewayAddress = storeRoutingInformation(gatewayAddress);
- }
-};
-
-/** Stores information needed to create a routing table and a rule. This
- * allows the calling class to delete that table without needing to
- * keep track of any characteristics of the device other than its name.
- * Assumes that there can only be 1 rule associated with any defined
- * table.
- */
-class RoutingTableInfo
-{
- private:
- // Variables relating to the routing table
- int32_t tableNumber;
- uint8_t *deviceName;
- uint8_t *gatewayAddress;
-
- // Variables relating to the corresponding rule.
- uint8_t *sourcePrefix;
- int32_t priorityNumber;
-
- public:
- RoutingTableInfo
- (
- uint8_t *deviceName,
- int32_t tableNumber,
- uint8_t *gatewayAddress,
- uint8_t *sourcePrefix,
- int32_t priorityNumber
- )
- {
- RoutingTableInfo::deviceName = storeRoutingInformation(deviceName);
- RoutingTableInfo::tableNumber = tableNumber;
- if (NULL != gatewayAddress)
- {
- RoutingTableInfo::gatewayAddress = storeRoutingInformation(gatewayAddress);
- }
-
- else
- {
- RoutingTableInfo::gatewayAddress = NULL;
- }
-
- RoutingTableInfo::sourcePrefix = storeRoutingInformation(sourcePrefix);
- RoutingTableInfo::priorityNumber = priorityNumber;
- }
-
- ~RoutingTableInfo()
- {
- delete [] RoutingTableInfo::deviceName;
- delete [] RoutingTableInfo::sourcePrefix;
- if (NULL != RoutingTableInfo::gatewayAddress)
- {
- delete [] RoutingTableInfo::gatewayAddress;
- }
- }
-
- uint8_t* getDeviceName(void)
- {
- return deviceName;
- }
-
- uint8_t* getGatewayAddress(void)
- {
- return gatewayAddress;
- }
-
- int32_t getPriorityNumber(void)
- {
- return priorityNumber;
- }
-
- uint8_t* getSourcePrefix(void)
- {
- return sourcePrefix;
- }
-
- int32_t getTableNumber(void)
- {
- return tableNumber;
- }
-
- void setGatewayAddress(uint8_t *gatewayAddress)
- {
- if (NULL != RoutingTableInfo::gatewayAddress)
- {
- delete [] RoutingTableInfo::gatewayAddress;
- }
-
- RoutingTableInfo::gatewayAddress = storeRoutingInformation(gatewayAddress);
- }
-
- void setSourcePrefix(uint8_t *sourcePrefix)
- {
- delete [] RoutingTableInfo::sourcePrefix;
- RoutingTableInfo::sourcePrefix = storeRoutingInformation(sourcePrefix);
- }
-};
-
-/*----------------------------------------------------------------------------
- * FUNCTION getInstance
-
- DESCRIPTION Returns a pointer to an instance of the cnd_iproute2 such
- that only 1 instance can be open at a time.
-
- * DEPENDENCIES None
-
- * RETURN VALUE cnd_iproute2*
-
- * SIDE EFFECTS None
- *--------------------------------------------------------------------------*/
-cnd_iproute2* cnd_iproute2::getInstance
-(
- void
-)
-{
- if(NULL == instancePtr)
- {
- instancePtr = new cnd_iproute2;
- }
-
- return instancePtr;
-}
-
-/*----------------------------------------------------------------------------
- * FUNCTION cmdLineActionEnumToString
-
- * DESCRIPTION Helper function to converts values of Cmd_line_actions enum
- to a string.
-
- * DEPENDENCIES None
-
- * RETURN VALUE uint8_t*
-
- * SIDE EFFECTS None
- *--------------------------------------------------------------------------*/
-uint8_t *cmdLineActionEnumToString
-(
- Cmd_line_actions commandAction
-)
-{
- switch(commandAction)
- {
- case ACTIONS_ADD_ENUM:
- return (uint8_t *)ACTIONS_ADD_STR;
- break;
- case ACTIONS_DELETE_ENUM:
- return (uint8_t *)ACTIONS_DELETE_STR;
- break;
- case ACTIONS_FLUSH_ENUM:
- return (uint8_t *)ACTIONS_FLUSH_STR;
- break;
- case ACTIONS_REPLACE_ENUM:
- return (uint8_t *)ACTIONS_REPLACE_STR;
- break;
- case ACTIONS_SHOW_ENUM:
- return (uint8_t *)ACTIONS_SHOW_STR;
- break;
- default:
- CNE_LOGD("Unsupported conversion of command action to string");
- return NULL;
- }
-}
-/*----------------------------------------------------------------------------
- * FUNCTION flushCache
-
- * DESCRIPTION Flushes the cache after routing table entries are changed
-
- * DEPENDENCIES None
-
- * RETURN VALUE None
-
- * SIDE EFFECTS None
- *--------------------------------------------------------------------------*/
-void flushCache
-(
- void
-)
-{
- if (!cmdLineCaller(ROUTING_CMD,
- cmdLineActionEnumToString(ACTIONS_FLUSH_ENUM),
- CACHED_ENTRIES,
- NULL))
- {
- CNE_LOGD("Attempt to flush the routing cache failed.");
- }
-}
-
-/*----------------------------------------------------------------------------
- * FUNCTION storeRoutingInformation
-
- * DESCRIPTION Copies inputted pointer to permanent storage, returning a
- pointer to the newly allocated space.
-
- * DEPENDENCIES None
-
- * RETURN VALUE Returns pointer to newly allocated memory in heap.
-
- * SIDE EFFECTS None
- *--------------------------------------------------------------------------*/
-uint8_t *storeRoutingInformation
-(
- uint8_t *parameterPtr
-)
-{
- if(NULL == parameterPtr)
- {
- CNE_LOGD("storeRoutingInformation: Parameter is null.");
- return NULL;
- }
-
- uint8_t *memCopyPtr = new (nothrow) uint8_t[strlen((char*)parameterPtr) + 1];
-
- if (NULL == memCopyPtr)
- {
- CNE_LOGW("storeRoutingInformation: unable to allocate memory");
- return NULL;
- }
-
- int newByteLength = strlen((char *)parameterPtr) * sizeof(uint8_t);
-
- memcpy(memCopyPtr, parameterPtr, newByteLength + 1);
- memCopyPtr[newByteLength] = '\0';
-
- return memCopyPtr;
-}
-
-/*----------------------------------------------------------------------------
- * FUNCTION modifyCustomRouteInMainTable
-
- * DESCRIPTION Adds or deletes a custom route in the main table given the name
- of the device associated with this route. This custom route
- will route all packets to an inputted destination address of a
- host through the inputted device name, possibly using an
- optional gateway address.
-
- * DEPENDENCIES commandAction should be either ADD OR DELETE
-
- * RETURN VALUE bool - True if function is successful. False otherwise.
-
- * SIDE EFFECTS None
- *--------------------------------------------------------------------------*/
-bool modifyCustomRouteInMainTable
-(
- uint8_t *destinationAddress,
- uint8_t *deviceName,
- uint8_t *gatewayAddress,
- Cmd_line_actions commandAction
-)
-{
- CustomRouteInfo *currentDevice = NULL;
- map<uint8_t*, RoutingTableInfo*>::iterator routingTableMapIter;
- map<uint8_t*, CustomRouteInfo*>::iterator customRouteMapIter;
-
- if (NULL == destinationAddress)
- {
- CNE_LOGD("Null destination address was passed while modifying a custom route " \
- "in the main table");
- return false;
- }
-
- switch(commandAction)
- {
- case ACTIONS_ADD_ENUM:
- {
- CNE_LOGV("Adding a custom route in the main table to destination %s",
- destinationAddress);
-
- if (NULL == deviceName)
- {
- CNE_LOGD("Null device name was passed when adding a custom route");
- return false;
- }
-
- if (NULL == gatewayAddress)
- {
- CNE_LOGV("A null gateway address was passed when adding the entry to %s",
- destinationAddress);
- }
-
- routingTableMapIter = routingTableMap.find(deviceName);
-
- if ((routingTableMapIter != routingTableMap.end()) &&
- (NULL == routingTableMapIter->second))
- {
- CNE_LOGD("Routing table information has been corrupted for %s table",
- deviceName);
- }
-
- else if (routingTableMapIter != routingTableMap.end())
- {
- CNE_LOGV("A separate routing table exists for %s. This table will not be " \
- "updated.", deviceName);
- }
-
- customRouteMapIter = customRouteMap.find(destinationAddress);
-
- if ((customRouteMapIter != customRouteMap.end()) &&
- (NULL == customRouteMapIter->second))
- {
- CNE_LOGD("Custom route in main table information has been corrupted for %s",
- destinationAddress);
- }
-
- else if (customRouteMapIter != customRouteMap.end())
- {
- CustomRouteInfo *existingDevice = customRouteMapIter->second;
-
- uint8_t *existingGateway = existingDevice->getGatewayAddress();
-
- // If interface name has changed for a particular destination, must
- // delete and add back the custom entry. A simple 'replace' command
- // will not remove the old entry. Any changes to the gateway address
- // will be picked up when a new entry is added
- if (0 != strcmp((char *)existingDevice->getDeviceName(),
- (char *)deviceName))
- {
- commandAction = ACTIONS_REPLACE_ENUM;
-
- existingDevice->setDeviceName(deviceName);
- existingDevice->setGatewayAddress(gatewayAddress);
-
- break;
- }
-
- // Because the gateway address is an optional parameter, must account
- // for cases where the gateway address changes from null to non-null or
- // vice-versa
- else if ( !((NULL == existingGateway) && (NULL == gatewayAddress)) &&
- ((NULL == gatewayAddress) || (NULL == existingGateway) ||
- (0 != strcmp((char *)existingGateway,
- (char *)gatewayAddress))) )
- {
- commandAction = ACTIONS_REPLACE_ENUM;
-
- existingDevice->setGatewayAddress(gatewayAddress);
-
- break;
- }
-
- else {
- if (NULL == gatewayAddress)
- {
- CNE_LOGV("Adding duplicate custom route in main table with device %s," \
- "destination address %s.", deviceName, destinationAddress);
- return true;
- }
-
- else {
- CNE_LOGV("Adding duplicate custom route in main table with device %s," \
- "destination %s, gateway %s",
- deviceName, destinationAddress, gatewayAddress);
- return true;
- }
- }
- }
- else {
- CNE_LOGV("Device '%s' not found in a custom entry to main table",
- deviceName);
- }
-
- currentDevice = new CustomRouteInfo(deviceName,
- gatewayAddress,
- destinationAddress);
-
- if ((NULL == currentDevice) ||
- (NULL == currentDevice->getDeviceName()) ||
- (NULL == currentDevice->getDestinationAddress()))
- {
- CNE_LOGD("Failed to allocate new device information while adding custom " \
- "entry over interface %s to main table.", deviceName);
- return false;
- }
-
- break;
- }
-
- case ACTIONS_DELETE_ENUM:
- {
- CNE_LOGV("Deleting a custom route in the main table with destination %s",
- destinationAddress);
-
- if (customRouteMap.empty())
- {
- CNE_LOGD("Deleting a custom route in the main table when no route exists.");
- return false;
- }
-
- customRouteMapIter = customRouteMap.find(destinationAddress);
-
- if (customRouteMapIter == customRouteMap.end())
- {
- CNE_LOGD("Cannot delete custom route over %s that has not been created.",
- destinationAddress);
- return false;
- }
-
- currentDevice = customRouteMapIter->second;
- if (NULL == currentDevice)
- {
- CNE_LOGD("Deleting custom route over %s with a stored name and null value",
- destinationAddress);
- return false;
- }
-
- gatewayAddress = currentDevice->getGatewayAddress();
- deviceName = currentDevice->getDeviceName();
- break;
- }
-
- default:
- {
- CNE_LOGD("Unsupported command action found while modifying a custom route");
- return false;
- }
- }
-
- if (NULL == gatewayAddress)
- {
- cmdLineCaller(ROUTING_CMD,
- cmdLineActionEnumToString(commandAction),
- destinationAddress,
- CMD_LINE_DEVICE_NAME,
- deviceName,
- SCOPE_KEYWORD,
- SCOPE_LINK,
- NULL);
- }
-
- else
- {
- cmdLineCaller(ROUTING_CMD,
- cmdLineActionEnumToString(commandAction),
- destinationAddress,
- CMD_LINE_GATEWAY_ADDRESS,
- gatewayAddress,
- CMD_LINE_DEVICE_NAME,
- deviceName,
- SCOPE_KEYWORD,
- SCOPE_GLOBAL,
- NULL);
- }
-
- switch(commandAction)
- {
- case ACTIONS_ADD_ENUM:
- {
- customRouteMap.insert(make_pair(currentDevice->getDestinationAddress(),
- currentDevice));
- break;
- }
-
- case ACTIONS_DELETE_ENUM:
- {
- customRouteMap.erase(destinationAddress);
- delete currentDevice;
-
- break;
- }
-
- default:
- break;
- }
-
- flushCache();
-
- return true;
-}
-/*----------------------------------------------------------------------------
- * FUNCTION modifyDefaultRoute
-
- * DESCRIPTION Changes the default route given the name of the device that
- will be the new default. The default case occurs if a packet
- is sent from some source address not associated with a defined
- table. When this occurs, the main table will route these
- undefined source addresses to the gateway of the defined
- default device. This function will add or delete that default
- route in the main table. If a default route is being deleted,
- no input is required for deviceName. The 'replace' command
- will change the default entry already existing in the main
- routing table, or add the entry if it does not exist.
-
- * DEPENDENCIES commandAction should be either REPLACE OR DELETE
-
- * RETURN VALUE bool - True if function is successful. False otherwise.
-
- * SIDE EFFECTS None
- *--------------------------------------------------------------------------*/
-bool modifyDefaultRoute
-(
- uint8_t *deviceName,
- uint8_t *cmdGatewayAddress,
- Cmd_line_actions commandAction
-)
-{
- uint8_t *gatewayAddress = NULL;
-
- CNE_LOGV("modifyDefaultRoute: devName:%s, cmdGateway:%s, action:%d",
- deviceName, cmdGatewayAddress, commandAction);
-
- switch(commandAction)
- {
- case ACTIONS_REPLACE_ENUM:
- {
- if (NULL == deviceName)
- {
- CNE_LOGD("A null device name was passed while replacing the default table");
- return false;
- }
-
- // Case where the default device known by cnd is the same as the new
- // device that is replacing it.
- if ((NULL != defaultDevice) &&
- (0 == strcmp((char *)defaultDevice, (char *)deviceName)))
- {
- CNE_LOGV("The new default interface %s is the same as the one known by cnd",
- deviceName);
- }
-
- CNE_LOGV("Replacing default routing table with %s", deviceName);
-
- bool foundMatchingEntry = false;
- map<uint8_t*, RoutingTableInfo*>::iterator routingTableMapIter;
- map<uint8_t*, CustomRouteInfo*>::iterator customRouteMapIter;
-
- routingTableMapIter = routingTableMap.find(deviceName);
- customRouteMapIter = customRouteMap.begin();
-
- if (routingTableMapIter != routingTableMap.end())
- {
- if (NULL == routingTableMapIter->second)
- {
- CNE_LOGD("Routing table for new default %s has corrupt stored values",
- deviceName);
- }
-
- else
- {
- CNE_LOGV("Routing table for new default %s found", deviceName);
- foundMatchingEntry = true;
- gatewayAddress = routingTableMapIter->second->getGatewayAddress();
- }
- }
-
- else
- {
- while (customRouteMapIter != customRouteMap.end())
- {
- uint8_t *destinationAddress = customRouteMapIter->first;
- CustomRouteInfo *currentDevice = customRouteMapIter->second;
-
- ++customRouteMapIter;
-
- if (NULL == destinationAddress)
- {
- CNE_LOGD("Entry in custom route map is corrupted");
- continue;
- }
-
- if (NULL == currentDevice)
- {
- CNE_LOGD("Value in custom route map with destination %s is corrupted",
- destinationAddress);
- continue;
- }
-
- if (0 == strcmp((char *)currentDevice->getDeviceName(),
- (char *)deviceName))
- {
- CNE_LOGV("Custom route for new default %s found", deviceName);
- foundMatchingEntry = true;
- gatewayAddress = currentDevice->getGatewayAddress();
- break;
- }
- }
- }
-
- if (!foundMatchingEntry)
- {
- CNE_LOGV("No routing tables or entries found for new default device %s",
- deviceName);
- }
-
- defaultDevice = storeRoutingInformation(deviceName);
-
- break;
- }
-
- case ACTIONS_DELETE_ENUM:
- {
- // The following case should only be entered if the default table is
- // being deleted when no tables exist
- if (NULL == defaultDevice)
- {
- CNE_LOGD("No stored default device; use deleteDefaultEntryFromMainTable.");
- return false;
- }
-
- CNE_LOGV("Deleting default routing table");
-
- break;
- }
-
- default:
- {
- CNE_LOGD("Unsupported command action found while changing the default table");
- return false;
- }
- }
-
- // These commands may fail if the kernel has already executed an operation on
- // its own. Treat a call to modify the main table as if was successful.
- if (NULL == gatewayAddress)
- gatewayAddress = cmdGatewayAddress;
-
- if (NULL == gatewayAddress)
- {
- cmdLineCaller(ROUTING_CMD,
- cmdLineActionEnumToString(commandAction),
- DEFAULT_ADDRESS,
- CMD_LINE_DEVICE_NAME,
- defaultDevice,
- NULL);
- }
- else
- {
- cmdLineCaller(ROUTING_CMD,
- cmdLineActionEnumToString(commandAction),
- DEFAULT_ADDRESS,
- CMD_LINE_GATEWAY_ADDRESS,
- gatewayAddress,
- CMD_LINE_DEVICE_NAME,
- defaultDevice,
- NULL);
- }
-
- if (ACTIONS_DELETE_ENUM == commandAction)
- {
- // After a deletion, there should be no default device defined in the main
- // routing table
- if (NULL != defaultDevice)
- {
- delete [] defaultDevice;
- defaultDevice = NULL;
- }
- }
-
- flushCache();
-
- return true;
-}
-
-/*----------------------------------------------------------------------------
- * FUNCTION modifyRoutingTable
-
- * DESCRIPTION Adds or deletes a routing table given the name of the device
- This routing table has one route, which will route all packets
- to the device with the inputted name. This route can
- optionally be set up to send packets through an inputted
- gateway address. Once the table has been modified,
- modifyRoutingTable will call another function to create or
- delete a rule that maps some source address' packets to this
- table.
-
- * DEPENDENCIES commandAction should be either ADD OR DELETE
-
- * RETURN VALUE bool - True if function is successful. False otherwise.
-
- * SIDE EFFECTS None
- *--------------------------------------------------------------------------*/
-bool modifyRoutingTable
-(
- uint8_t *deviceName,
- uint8_t *sourcePrefix,
- uint8_t *gatewayAddress,
- Cmd_line_actions commandAction
-)
-{
- int32_t tableNumber;
- int32_t priorityNumber;
-
- RoutingTableInfo *currentDevice = NULL;
- map<uint8_t*, RoutingTableInfo*>::iterator routingTableMapIter;
- set<int32_t>::iterator tableNumberSetIter;
-
- if (NULL == deviceName)
- {
- CNE_LOGD("A null device name was passed while modifying a routing table");
- return false;
- }
- switch(commandAction)
- {
- case ACTIONS_ADD_ENUM:
- {
- CNE_LOGV("Adding a routing table for interface %s", deviceName);
-
- if (NULL == sourcePrefix)
- {
- CNE_LOGD("A null source prefix was passed when adding the %s table",
- deviceName);
- return false;
- }
-
- if (NULL == gatewayAddress)
- {
- CNE_LOGV("A null gateway address was passed when adding the %s table",
- deviceName);
- }
-
- routingTableMapIter = routingTableMap.find(deviceName);
-
- if ((routingTableMapIter != routingTableMap.end()) &&
- (NULL == routingTableMapIter->second))
- {
- CNE_LOGD("Adding duplicate routing table with corrupt device information");
- routingTableMap.erase(deviceName);
- }
-
- // If a call to add a routing table overwrites an existing table, the
- // new source and gateway addresses will overwrite the old ones.
- // However, calls to add a duplicate table, where the source and
- // gateway addresses do not change, are ignored and will simply return
- // true.
- else if (routingTableMapIter != routingTableMap.end())
- {
- RoutingTableInfo *existingDevice = routingTableMapIter->second;
-
- int isNewSourcePrefix = strcmp((char *)existingDevice->getSourcePrefix(),
- (char *)sourcePrefix);
-
- uint8_t *existingGateway = existingDevice->getGatewayAddress();
-
- // Because the gateway address is an optional parameter, must account
- // for cases where the gateway address changes from null to non-null or
- // vice-versa
- if ( !((NULL == existingGateway) && (NULL == gatewayAddress)) &&
- ((NULL == gatewayAddress) || (NULL == existingGateway) ||
- (0 != strcmp((char *)existingGateway,
- (char *)gatewayAddress))) )
- {
- // Replace active table and rule with changes to gateway address and
- // possibly the source prefix, if it has changed.
- commandAction = ACTIONS_REPLACE_ENUM;
-
- modifyRule(existingDevice, ACTIONS_DELETE_ENUM);
-
- existingDevice->setGatewayAddress(gatewayAddress);
-
- if (0 != isNewSourcePrefix)
- {
- existingDevice->setSourcePrefix(sourcePrefix);
- }
-
- tableNumber = existingDevice->getTableNumber();
-
- break;
- }
-
- // Check for differences between source addresses. If a change in the
- // gateway address has already been detected, this step of modifying the
- // rule will be done implicitly.
- else if (0 != isNewSourcePrefix)
- {
- modifyRule(existingDevice, ACTIONS_DELETE_ENUM);
- existingDevice->setSourcePrefix(sourcePrefix);
- modifyRule(existingDevice, ACTIONS_ADD_ENUM);
-
- return true;
- }
-
- else {
- if (NULL == gatewayAddress)
- {
- CNE_LOGV("Adding a duplicate %s table with source %s.",
- deviceName, sourcePrefix);
- return true;
- }
-
- else {
- CNE_LOGV("Adding a duplicate %s table with gateway %s and source %s.",
- deviceName, sourcePrefix, gatewayAddress);
- return true;
- }
- }
- }
-
- else {
- CNE_LOGV("Device '%s' not found as an active interface", deviceName);
- }
-
- // Instantiating more than 252 tables simultaneously is an error
- if (MAX_TABLE_NUMBER - MIN_TABLE_NUMBER < tableNumberSet.size())
- {
- CNE_LOGD("Too many tables exist to add %s. %d tables are defined",
- deviceName, tableNumberSet.size());
- return false;
- }
-
- // Locate next available table number. If the previous check passed,
- // there must be a table number available
- for (int32_t nextTableNumber = MIN_TABLE_NUMBER;
- nextTableNumber < MAX_TABLE_NUMBER; nextTableNumber++)
- {
- tableNumberSetIter = tableNumberSet.find(nextTableNumber);
- if (tableNumberSetIter == tableNumberSet.end())
- {
- tableNumber = nextTableNumber;
- break;
- }
- }
-
- // Always map the same rule to the same table number. This allows the
- // reuse of priority numbers.
- priorityNumber = MAX_PRIORITY_NUMBER - tableNumber + 1;
-
- currentDevice = new RoutingTableInfo(deviceName,
- tableNumber,
- gatewayAddress,
- sourcePrefix,
- priorityNumber);
-
- if ((NULL == currentDevice) ||
- (NULL == currentDevice->getDeviceName()) ||
- (NULL == currentDevice->getSourcePrefix()))
- {
- CNE_LOGD("Failed to allocate new device information while adding table %s.",
- deviceName);
- return false;
- }
-
- break;
- }
-
- case ACTIONS_DELETE_ENUM:
- {
- CNE_LOGV("Deleting routing table for interface %s", deviceName);
-
- if (routingTableMap.empty())
- {
- CNE_LOGD("Deleting a table when no table exists.");
- return false;
- }
-
- routingTableMapIter = routingTableMap.find(deviceName);
-
- if (routingTableMapIter == routingTableMap.end())
- {
- CNE_LOGD("Cannot delete table %s that has not been created.", deviceName);
- return false;
- }
-
- currentDevice = routingTableMapIter->second;
- if (NULL == currentDevice)
- {
- CNE_LOGD("Deleting table with a stored name and null value");
- return false;
- }
-
- gatewayAddress = currentDevice->getGatewayAddress();
- tableNumber = currentDevice->getTableNumber();
- break;
- }
-
- default:
- {
- CNE_LOGD("Unsupported command action found while modifying a table");
- return false;
- }
- }
-
- // Convert table number int to string, null-terminating the result
- char tableNumberString[MAX_DIGITS_TABLE_NUMBER+1];
- int32_t numberOfDigits = snprintf(tableNumberString,
- MAX_DIGITS_TABLE_NUMBER+1,
- "%d",
- tableNumber);
- tableNumberString[numberOfDigits] = '\0';
-
- if (NULL == gatewayAddress)
- {
- cmdLineCaller(ROUTING_CMD,
- cmdLineActionEnumToString(commandAction),
- DEFAULT_ADDRESS,
- CMD_LINE_DEVICE_NAME,
- deviceName,
- CMD_LINE_TABLE_NUMBER,
- (uint8_t *)tableNumberString,
- NULL);
- }
- else
- {
- cmdLineCaller(ROUTING_CMD,
- cmdLineActionEnumToString(commandAction),
- DEFAULT_ADDRESS,
- CMD_LINE_GATEWAY_ADDRESS,
- gatewayAddress,
- CMD_LINE_DEVICE_NAME,
- deviceName,
- CMD_LINE_TABLE_NUMBER,
- (uint8_t *)tableNumberString,
- NULL);
- }
-
- switch(commandAction)
- {
- // This case should not break to account for common code with the replace
- // command.
- case ACTIONS_ADD_ENUM:
- {
- routingTableMap.insert(make_pair(currentDevice->getDeviceName(),currentDevice));
- tableNumberSet.insert(tableNumber);
- }
-
- case ACTIONS_REPLACE_ENUM:
- {
- // If there is no default entry, the new device should be the default.
- if (NULL == defaultDevice)
- {
- CNE_LOGV("Routing table added when no default exists. Adding new default.");
- modifyDefaultRoute(deviceName, gatewayAddress, ACTIONS_REPLACE_ENUM);
- }
-
- break;
- }
-
- case ACTIONS_DELETE_ENUM:
- {
- routingTableMap.erase(deviceName);
- tableNumberSet.erase(tableNumber);
-
- // If there are no more tables, then there should be no default device.
- // There is a scenarios where iproute2 is recorded having no table since
- // iproute2 not adding it, but there is default entry in main table
- // created by system when network comes up, and if the default entry is
- // removed, then there will be no default. Need to revisit iproute2.
- if (0 == tableNumberSet.size())
- {
- CNE_LOGW("Warning: There are no tables");
- }
-
- // If the default table has been deleted and another device is available,
- // set an arbitrary new device as the new default.
- else if (0 == strcmp((char *)defaultDevice,
- (char *)currentDevice->getDeviceName()))
- {
- uint8_t *newDefaultName = routingTableMap.begin()->first;
-
- CNE_LOGV("Replacing old default device with %s", newDefaultName);
- modifyDefaultRoute(newDefaultName, gatewayAddress, ACTIONS_REPLACE_ENUM);
- }
-
- break;
- }
-
- default:
- break;
- }
-
- // There is no 'ip rule replace' command. When a gateway address is changed,
- // must delete the rule and add it back.
- if (ACTIONS_REPLACE_ENUM == commandAction) {
- commandAction = ACTIONS_ADD_ENUM;
- }
-
- bool modifyRuleRetValue = modifyRule(currentDevice, commandAction);
-
- // Delete device information that will no longer be used, if it is not
- // being stored elsewhere
- if (ACTIONS_DELETE_ENUM == commandAction)
- {
- delete currentDevice;
- }
-
- return modifyRuleRetValue;
-}
-
-/*----------------------------------------------------------------------------
- * FUNCTION modifyRule
-
- * DESCRIPTION Adds or deletes a rule given the actual device object of the
- table associated with that rule. Every defined routing table
- requires some rule to map packets from some given source
- address to that routing table. This function takes an object
- so that after a routing table has been removed, the source
- prefix, table number, and priority number associated with that
- table can still be accessed. This allows a call to be made to
- iproute2 to delete the corresponding rule.
-
- * DEPENDENCIES commandAction should be either ADD OR DELETE
-
- * RETURN VALUE bool - True if function is successful. False otherwise.
-
- * SIDE EFFECTS None
- *--------------------------------------------------------------------------*/
-bool modifyRule
-(
- RoutingTableInfo *currentDevice,
- Cmd_line_actions commandAction
-)
-{
- if (NULL == currentDevice)
- {
- CNE_LOGD("A null device was passed while modifying a rule");
- return false;
- }
-
- uint8_t* deviceName = currentDevice->getDeviceName();
- map<uint8_t*, RoutingTableInfo*>::iterator routingTableMapIter;
- routingTableMapIter = routingTableMap.find(deviceName);
-
- // If a rule is being added, its corresponding table should exist in the map
- // of all routing tables.
- if ((ACTIONS_ADD_ENUM == commandAction) &&
- (routingTableMapIter == routingTableMap.end()))
- {
- CNE_LOGD("Cannot %s a rule for nonexistant table %s",
- cmdLineActionEnumToString(commandAction),
- deviceName);
- return false;
- }
-
- int32_t tableNumber = currentDevice->getTableNumber();
- int32_t priorityNumber = currentDevice->getPriorityNumber();
- uint8_t *sourcePrefix = currentDevice->getSourcePrefix();
-
- // Convert table number & priority number ints to string, null-terminating
- // the results
- char tableNumberString[MAX_DIGITS_TABLE_NUMBER+1];
- char priorityNumberString[MAX_DIGITS_PRIORITY_NUMBER+1];
-
- int32_t numberOfDigits = snprintf(tableNumberString,
- MAX_DIGITS_TABLE_NUMBER+1,
- "%d",
- tableNumber);
- tableNumberString[numberOfDigits] = '\0';
-
- numberOfDigits = snprintf(priorityNumberString,
- MAX_DIGITS_PRIORITY_NUMBER+1,
- "%d",
- priorityNumber);
- priorityNumberString[numberOfDigits] = '\0';
-
- cmdLineCaller(RULE_CMD,
- cmdLineActionEnumToString(commandAction),
- CMD_LINE_SOURCE_PREFIX,
- sourcePrefix,
- CMD_LINE_TABLE_NUMBER,
- (uint8_t *)tableNumberString,
- CMD_LINE_PRIORITY_NUMBER,
- (uint8_t *)priorityNumberString,
- NULL);
-
- flushCache();
-
- return true;
-}
-
-/*----------------------------------------------------------------------------
- * FUNCTION cmdLineCaller
-
- * DESCRIPTION Sends a call to iproute2 over the command line. This function
- takes in a list of an arbitrary number of words, which is
- parsed together into one final string. This string is sent
- over the command line using the C routine 'system'. To see
- the standard output of a failed command in the ADB logs, the
- 'logwrapper' utility must be used while instantiating the cnd
- process.
-
- * DEPENDENCIES Should not be any spaces in any inputted argument
-
- * RETURN VALUE bool - True if function is successful. False otherwise.
-
- * SIDE EFFECTS None
- *--------------------------------------------------------------------------*/
-bool cmdLineCaller
-(
- const uint8_t* cmdLineFirstWord,
- ...
-)
-{
- size_t byteLength = 0;
- size_t memLength;
- int32_t numberOfSpaces = 0;
- va_list cmdLineWordList;
- uint8_t *nextWord;
- char *cmdLineString;
-
- if (NULL == cmdLineFirstWord)
- {
- CNE_LOGD("No actual command passed to build a command line.");
- return false;
- }
-
- // Find length of overall command line string to determine how much
- // space to allocate for it
- byteLength = strlen((char *)cmdLineFirstWord);
- va_start(cmdLineWordList, cmdLineFirstWord);
-
- while((nextWord = va_arg(cmdLineWordList,uint8_t*)) != NULL)
- {
- byteLength += strlen((char *)nextWord);
- numberOfSpaces++;
- }
-
- va_end(cmdLineWordList);
-
- // Allocate command line string, which is number of bytes in inputted words
- // plus the null character, plus the number of white spaces.
- cmdLineString = new (nothrow) char[byteLength + numberOfSpaces + 1];
-
- if (NULL == cmdLineString)
- {
- CNE_LOGW("Could not allocate memory to build command line string.");
- return false;
- }
-
- memLength = strlcpy(cmdLineString,
- (char *)cmdLineFirstWord,
- strlen((char *)cmdLineFirstWord) * sizeof(uint8_t) + 1);
- if (memLength > strlen((char *)cmdLineFirstWord) * sizeof(uint8_t) + 1)
- {
- CNE_LOGD("Failure building first word of command line string.");
- delete [] cmdLineString;
- return false;
- }
-
- // Build command line string containing each inputted word.
- va_start(cmdLineWordList, cmdLineFirstWord);
-
- while((nextWord = va_arg(cmdLineWordList,uint8_t*)) != NULL)
- {
- // Add white space
- memLength = strlcat(cmdLineString,
- " ",
- strlen(cmdLineString) * sizeof(char) +
- sizeof(uint8_t) + 1);
- if (memLength > strlen(cmdLineString) * sizeof(char) + sizeof(uint8_t) + 1)
- {
- CNE_LOGD("Failure adding whitespace to command line string.");
- delete [] cmdLineString;
- va_end(cmdLineWordList);
- return false;
- }
-
- // Add next word
- memLength = strlcat(cmdLineString,
- (char *)nextWord,
- strlen(cmdLineString) * sizeof(char) +
- strlen((char *)nextWord) * sizeof(uint8_t) + 1);
- if (memLength > strlen(cmdLineString) * sizeof(char) +
- strlen((char *)nextWord) * sizeof(uint8_t) + 1)
- {
- CNE_LOGD("Failure adding next word to command line string.");
- delete [] cmdLineString;
- va_end(cmdLineWordList);
- return false;
- }
- }
-
- va_end(cmdLineWordList);
-
- cmdLineString[byteLength + numberOfSpaces] = '\0';
-
- CNE_LOGV("Iproute2 will be called with: %s", cmdLineString);
-
- int cmdLineExitValue = system(cmdLineString);
-
- delete [] cmdLineString;
-
- if (0 != cmdLineExitValue)
- {
- CNE_LOGD("Command line call to iproute2 failed with exitvalue %d.",
- cmdLineExitValue);
- return false;
- }
-
- CNE_LOGV("Iproute2 successfully called.");
-
- return true;
-}
-
-
-/*----------------------------------------------------------------------------
- * FUNCTION addCustomEntryInMainTable
-
- * DESCRIPTION Adds a custom entry to the main table to a specific destination
- address over the given interface name
-
- * DEPENDENCIES None
-
- * RETURN VALUE bool - True if function is successful. False otherwise.
-
- * SIDE EFFECTS None
- *--------------------------------------------------------------------------*/
-bool cnd_iproute2::addCustomEntryInMainTable
-(
- uint8_t *destinationAddress,
- uint8_t *deviceName,
- uint8_t *gatewayAddress
-)
-{
- return (modifyCustomRouteInMainTable(destinationAddress,
- deviceName,
- gatewayAddress,
- ACTIONS_ADD_ENUM));
-}
-
-/*----------------------------------------------------------------------------
- * FUNCTION addRoutingTable
-
- * DESCRIPTION Adds a routing table to the system that contains a single
- default entry, a route to the device with the inputted name,
- which will optionally route through an inputted gateway
- address. It also adds a rule to route a given source network
- prefix or address to the new table.
-
- The parameter deviceName refers to the name of the device
- whose table will be added (Such as wlan or wwan)
- The parameter sourcePrefix refers to the source network prefix
- or address that will be routed to the device (Such as
- 37.214.21/24 or 10.156.45.1)
-
- * DEPENDENCIES None
-
- * RETURN VALUE bool - True if function is successful. False otherwise.
-
- * SIDE EFFECTS None
- *--------------------------------------------------------------------------*/
-bool cnd_iproute2::addRoutingTable
-(
- uint8_t *deviceName,
- uint8_t *sourcePrefix,
- uint8_t *gatewayAddress
-)
-{
- return (modifyRoutingTable(deviceName,
- sourcePrefix,
- gatewayAddress,
- ACTIONS_ADD_ENUM));
-}
-
-/*----------------------------------------------------------------------------
- * FUNCTION deleteRoutingTable
-
- * DESCRIPTION Deletes a routing table from the system along with the rule
- corresponding to that table.
-
- * DEPENDENCIES The table must have already been added via the addRoutingTable
- API.
-
- * RETURN VALUE bool - True if function is successful. False otherwise.
-
- * SIDE EFFECTS None
- *--------------------------------------------------------------------------*/
-bool cnd_iproute2::deleteRoutingTable
-(
- uint8_t *deviceName
-)
-{
- return (modifyRoutingTable(deviceName, NULL, NULL, ACTIONS_DELETE_ENUM));
-}
-
-/*----------------------------------------------------------------------------
- * FUNCTION deleteCustomEntryInMainTable
-
- * DESCRIPTION Deletes a custom entry from the main table that has already
- been added via addCustomEntryToMainTable
-
- * DEPENDENCIES None
-
- * RETURN VALUE bool - True if function is successful. False otherwise.
-
- * SIDE EFFECTS None
- *--------------------------------------------------------------------------*/
-bool cnd_iproute2::deleteCustomEntryInMainTable
-(
- uint8_t *destinationAddress
-)
-{
- return (modifyCustomRouteInMainTable(destinationAddress,
- NULL,
- NULL,
- ACTIONS_DELETE_ENUM));
-}
-
-/*----------------------------------------------------------------------------
- * FUNCTION deleteDeviceCustomEntriesInMainTable
-
- * DESCRIPTION Deletes all custom entries from the main table that route
- through the inputted interface name. These routes must have
- already been added via addCustomEntryToMainTable
-
- * DEPENDENCIES None
-
- * RETURN VALUE bool - True if function is successful. False otherwise.
-
- * SIDE EFFECTS None
- *--------------------------------------------------------------------------*/
-bool cnd_iproute2::deleteDeviceCustomEntriesInMainTable
-(
- uint8_t *deviceName
-)
-{
- if (NULL == deviceName)
- {
- CNE_LOGD("Null device name was passed when adding a custom route");
- return false;
- }
-
- CNE_LOGV("Deleting custom routes in the main table through interface %s",
- deviceName);
-
- if (customRouteMap.empty())
- {
- CNE_LOGD("Deleting a custom route in the main table when no route exists.");
- return false;
- }
-
- bool returnValue = true;
- bool foundMatchingEntry = false;
-
- map<uint8_t*, CustomRouteInfo*>::iterator customRouteMapIter;
-
- customRouteMapIter = customRouteMap.begin();
-
- while (customRouteMapIter != customRouteMap.end())
- {
- uint8_t *destinationAddress = customRouteMapIter->first;
- CustomRouteInfo *currentDevice = customRouteMapIter->second;
-
- ++customRouteMapIter;
-
- if (NULL == destinationAddress)
- {
- CNE_LOGD("Entry in currentDevice is corrupted.");
- continue;
- }
-
- if (NULL == currentDevice)
- {
- CNE_LOGD("Entry in currentDevice with destination %s is corrupted",
- destinationAddress);
- continue;
- }
-
- if (0 == strcmp((char *)currentDevice->getDeviceName(), (char *)deviceName))
- {
- foundMatchingEntry = true;
- returnValue = modifyCustomRouteInMainTable(destinationAddress,
- NULL,
- NULL,
- ACTIONS_DELETE_ENUM);
- }
- }
-
- if (!foundMatchingEntry)
- {
- CNE_LOGD("No entry was found with interface name %s.", deviceName);
- return false;
- }
-
- return returnValue;
-}
-
-/*----------------------------------------------------------------------------
- * FUNCTION deleteDefaultEntryInMainTable
-
- * DESCRIPTION Deletes the default entry in the main table for the inputted
- interface name.
-
- * DEPENDENCIES None
-
- * RETURN VALUE bool - True if function is successful. False otherwise.
-
- * SIDE EFFECTS None
- *--------------------------------------------------------------------------*/
-bool cnd_iproute2::deleteDefaultEntryInMainTable
-(
- uint8_t *deviceName
-)
-{
- CNE_LOGV("Deleting %s interface from main table.", deviceName);
-
- if (!cmdLineCaller(ROUTING_CMD,
- cmdLineActionEnumToString(ACTIONS_DELETE_ENUM),
- DEFAULT_ADDRESS,
- CMD_LINE_DEVICE_NAME,
- deviceName,
- NULL))
- {
- return false;
- }
-
- flushCache();
-
- return true;
-}
-
-/*----------------------------------------------------------------------------
- * FUNCTION replaceDefaultEntryInMainTable
-
- * DESCRIPTION Changes the default device where packets are routed to. If
- some source address does not match an already defined rule,
- packets from that source address will be routed through the
- main table to some default device. This function replaces the
- default route to direct traffic to an inputted, already
- defined device. A routing table associated with this device
- must have been added through addRoutingTable() before it can
- be the default.
-
- * DEPENDENCIES The new default table must have already been added via the
- addRoutingTable API.
-
- * RETURN VALUE bool - True if function is successful. False otherwise.
-
- * SIDE EFFECTS None
- *--------------------------------------------------------------------------*/
-bool cnd_iproute2::replaceDefaultEntryInMainTable
-(
- uint8_t *deviceName,
- uint8_t *gatewayAddress
-)
-{
- CNE_LOGV("replaceDefaultEntryInMainTable: devName:%s, gatewayAddress:%s",
- deviceName, gatewayAddress);
- return (modifyDefaultRoute(deviceName, gatewayAddress, ACTIONS_REPLACE_ENUM));
-}
-
-/*----------------------------------------------------------------------------
- * FUNCTION showAllRoutingTables
-
- * DESCRIPTION Displays the contents of all routing tables for debugging
- purposes.
-
- * DEPENDENCIES None
-
- * RETURN VALUE bool - True if function is successful. False otherwise.
-
- * SIDE EFFECTS None
- *--------------------------------------------------------------------------*/
-bool cnd_iproute2::showAllRoutingTables
-(
- void
-)
-{
- return cmdLineCaller(ROUTING_CMD,
- cmdLineActionEnumToString(ACTIONS_SHOW_ENUM),
- CMD_LINE_TABLE_NUMBER,
- ALL_TABLES,
- NULL);
-}
-
-/*----------------------------------------------------------------------------
- * FUNCTION showRoutingTable
-
- * DESCRIPTION Displays the contents of the routing table associated with
- the inputted device name.
-
- * DEPENDENCIES None
-
- * RETURN VALUE bool - True if function is successful. False otherwise.
-
- * SIDE EFFECTS None
- *--------------------------------------------------------------------------*/
-bool cnd_iproute2::showRoutingTable
-(
- uint8_t *deviceName
-)
-{
- if (NULL == deviceName)
- {
- CNE_LOGD("A null device name was passed while displaying a table.");
- return false;
- }
-
- return cmdLineCaller(ROUTING_CMD,
- cmdLineActionEnumToString(ACTIONS_SHOW_ENUM),
- CMD_LINE_TABLE_NUMBER,
- deviceName,
- NULL);
-}
-
-/*----------------------------------------------------------------------------
- * FUNCTION showRoutingTable
-
- * DESCRIPTION Displays the rules associated with all tables for debugging
- purposes.
-
- * DEPENDENCIES None
-
- * RETURN VALUE bool - True if function is successful. False otherwise.
-
- * SIDE EFFECTS None
- *--------------------------------------------------------------------------*/
-bool cnd_iproute2::showRules
-(
- void
-)
-{
- return cmdLineCaller(RULE_CMD,
- cmdLineActionEnumToString(ACTIONS_SHOW_ENUM),
- NULL);
-}