40 #include "hostIf_utils.h"
42 #ifdef USE_MoCA_PROFILE
47 #include "secure_wrapper.h"
50 #define MAX_BUF_LEN 128
51 #define MAX_CMD_LEN 256
52 #define MAX_IFNAME_LEN 64
53 #define SYS_CLASS_NET_PATH "/sys/class/net/"
58 #define DEVICE_ETHERNET_INTERFACE(PORT_NUM) std::string("Device.Ethernet.Interface.") + int_to_string(PORT_NUM)
59 #ifdef USE_MoCA_PROFILE
60 #define DEVICE_MOCA_INTERFACE(PORT_NUM) std::string("Device.MoCA.Interface.") + int_to_string(PORT_NUM)
62 #define DEVICE_IP_INTERFACE(PORT_NUM) std::string("Device.IP.Interface.") + int_to_string(PORT_NUM)
63 #define DEVICE_BRIDGING_BRIDGE(BRIDGE_NUM, PORT_NUM) (std::string("Device.Bridging.Bridge.") + \
64 int_to_string(BRIDGE_NUM) + \
66 int_to_string(PORT_NUM))
71 GHashTable* hostif_InterfaceStack::stIshash = NULL;
72 GHashTable* hostif_InterfaceStack::stBridgeTableHash = NULL;
73 GMutex* hostif_InterfaceStack::stMutex = NULL;
74 GHashTable* hostif_InterfaceStack::m_notifyHash = NULL;
89 hostif_InterfaceStack::hostif_InterfaceStack(
int dev_id,
char *_higherLayer,
char *_lowerLayer):dev_id(dev_id)
91 RDK_LOG(RDK_LOG_DEBUG,LOG_TR69HOSTIF,
"Inside constructor for dev_id:%d\n", dev_id);
93 bCalledHigherLayer = 0;
94 bCalledLowerLayer = 0;
96 memset(backupHigherLayer,
'\0',
sizeof(backupHigherLayer));
97 memset(backupLowerLayer,
'\0',
sizeof(backupLowerLayer));
100 strncpy(higherLayer, _higherLayer,
sizeof(higherLayer));
104 memset(higherLayer,
'\0',
sizeof(higherLayer));
109 strncpy(lowerLayer, _lowerLayer,
sizeof(lowerLayer) -1);
110 lowerLayer[
sizeof(lowerLayer) -1] =
'\0';
114 memset(lowerLayer,
'\0',
sizeof(lowerLayer));
162 int hostif_InterfaceStack:: get_Device_InterfaceStackNumberOfEntries(
HOSTIF_MsgData_t *stMsgData)
165 int interfaceStackNumOfEntries = 0;
166 char lowerLayerPath[MAX_HIGHERLAYER_LEN] = {
'\0'};
167 char higherLayerPath[MAX_HIGHERLAYER_LEN] = {
'\0'};
169 InterfaceStackMap_t layerInfo;
170 InterfaceStackMap_t::iterator layerIterator;
171 IPInterfacesMap_t ipInterfaceMap;
174 hostif_InterfaceStack::closeAllInstances();
177 hostif_InterfaceStack::deleteBridgeTable();
180 hostif_InterfaceStack::populateBridgeTable();
184 if( OK != getIPInterfaces(ipInterfaceMap))
186 RDK_LOG(RDK_LOG_ERROR,LOG_TR69HOSTIF,
"%s:%d get_Device_IP_InterfaceNumberOfEntries failed\n", __FILE__, __LINE__);
190 if( OK != buildLowerLayerInfo<hostIf_EthernetInterface>(layerInfo))
192 RDK_LOG(RDK_LOG_ERROR,LOG_TR69HOSTIF,
"%s:%d Failed while building layer info for Ethernet interfaces\n", __FILE__, __LINE__);
196 #ifdef USE_MoCA_PROFILE
197 if( OK != buildLowerLayerInfo<MoCAInterface>(layerInfo))
199 RDK_LOG(RDK_LOG_ERROR,LOG_TR69HOSTIF,
"%s:%d Failed while building layer info for MoCA interfaces\n", __FILE__, __LINE__);
204 if( OK != buildBridgeTableLayerInfo(layerInfo))
206 RDK_LOG(RDK_LOG_ERROR,LOG_TR69HOSTIF,
"%s:%d Failed while building layer info for bridges\n", __FILE__, __LINE__);
210 fillHigherLayersWithIP(layerInfo, ipInterfaceMap);
212 for(layerIterator = layerInfo.begin(); layerIterator != layerInfo.end(); layerIterator++)
214 interfaceStackNumOfEntries++;
216 memset(lowerLayerPath,
'\0',
sizeof(lowerLayerPath));
217 memset(higherLayerPath,
'\0',
sizeof(higherLayerPath));
219 snprintf(higherLayerPath,
sizeof(higherLayerPath), layerIterator->second.higherLayer.c_str());
220 snprintf(lowerLayerPath,
sizeof(lowerLayerPath), layerIterator->second.lowerLayer.c_str());
222 if(OK == hostif_InterfaceStack::createInstance(interfaceStackNumOfEntries, higherLayerPath, lowerLayerPath ))
224 RDK_LOG(RDK_LOG_DEBUG,LOG_TR69HOSTIF,
"%s:%d successfully created instance [%d] with higher layer [%s] lower layer [%s]\n",
225 __FUNCTION__, __LINE__, interfaceStackNumOfEntries, higherLayerPath, lowerLayerPath);
230 if(interfaceStackNumOfEntries > 0)
241 void hostif_InterfaceStack::getLock()
245 stMutex = g_mutex_new();
247 g_mutex_lock(stMutex);
250 void hostif_InterfaceStack::releaseLock()
252 g_mutex_unlock(stMutex);
255 GHashTable* hostif_InterfaceStack::getNotifyHash()
263 return m_notifyHash = g_hash_table_new(g_str_hash, g_str_equal);
267 hostif_InterfaceStack::~hostif_InterfaceStack()
271 g_hash_table_destroy(m_notifyHash);
275 hostif_InterfaceStack* hostif_InterfaceStack::getInstance(
int dev_id)
277 RDK_LOG(RDK_LOG_DEBUG,LOG_TR69HOSTIF,
"Entering [%s]\n", __FUNCTION__);
278 hostif_InterfaceStack* pRet = NULL;
282 pRet = (hostif_InterfaceStack *)g_hash_table_lookup(stIshash, (gpointer) dev_id);
287 RDK_LOG(RDK_LOG_ERROR,LOG_TR69HOSTIF,
"No instance is found with dev_id %d\n", dev_id);
293 int hostif_InterfaceStack::createInstance(
int dev_id,
char *higherLayer,
char *lowerLayer)
296 hostif_InterfaceStack *instance = NULL;
298 if(higherLayer && lowerLayer)
302 stIshash = g_hash_table_new(NULL, NULL);
305 instance =
new hostif_InterfaceStack(dev_id, higherLayer, lowerLayer );
309 g_hash_table_insert(stIshash, (gpointer)dev_id, instance);
314 RDK_LOG(RDK_LOG_ERROR,LOG_TR69HOSTIF,
"Unable to create InterfaceStack instance\n");
319 RDK_LOG(RDK_LOG_ERROR,LOG_TR69HOSTIF,
"%s:%d NULL parameters passed\n", __FUNCTION__, __LINE__);
326 GList* hostif_InterfaceStack::getAllInstances()
329 return g_hash_table_get_keys(stIshash);
334 void hostif_InterfaceStack::closeInstance(hostif_InterfaceStack *pDev)
338 g_hash_table_remove(stIshash, (gconstpointer)pDev->dev_id);
344 void hostif_InterfaceStack::closeAllInstances()
348 GList* tmp_list = g_hash_table_get_values (stIshash);
352 hostif_InterfaceStack* pDev = (hostif_InterfaceStack *)tmp_list->data;
353 tmp_list = tmp_list->next;
368 int hostif_InterfaceStack::populateBridgeTable()
371 struct dirent **nameList;
372 int noOfDirEntries = -1;
373 char cmd[MAX_CMD_LEN] = {
'\0'};
374 char result_buff[MAX_BUF_LEN] = {
'\0'};
377 if(0 > (noOfDirEntries = scandir(SYS_CLASS_NET_PATH, &nameList, NULL, alphasort)))
379 RDK_LOG(RDK_LOG_ERROR,LOG_TR69HOSTIF,
"%s:%s:%d error opening %s\n", __FILE__, __FUNCTION__, __LINE__, SYS_CLASS_NET_PATH);
384 for(
int i = 2; i < noOfDirEntries; i++)
387 snprintf(cmd,
sizeof(cmd),
"%s%s/bridge", SYS_CLASS_NET_PATH, nameList[i]->d_name);
388 if(-1 != access(cmd, F_OK))
391 snprintf(cmd,
sizeof(cmd),
"%s%s/brif", SYS_CLASS_NET_PATH, nameList[i]->d_name);
392 if(-1 != access(cmd, F_OK))
395 snprintf(cmd,
sizeof(cmd),
"ls %s%s/brif|awk 'BEGIN{ORS=\",\";}{print $1}'", SYS_CLASS_NET_PATH, nameList[i]->d_name);
397 fp = v_secure_popen(
"r",
"ls %s%s/brif|awk 'BEGIN{ORS=\",\";}{print $1}'", SYS_CLASS_NET_PATH, nameList[i]->d_name);
399 fp = popen(cmd,
"r");
403 memset(result_buff,
'\0',
sizeof(result_buff));
404 fgets(result_buff,
sizeof(result_buff), fp);
406 ret = insertRowIntoBridgeTable(nameList[i]->d_name, result_buff);
419 while(noOfDirEntries--)
421 free (nameList[noOfDirEntries]);
431 void hostif_InterfaceStack::bridgeInteface_key_data_free(gpointer key)
433 char *myKey = (
char*)key;
444 void hostif_InterfaceStack::bridgeInteface_value_data_free(gpointer value)
446 char *val = (
char*)value;
457 void hostif_InterfaceStack::deleteBridgeTable()
459 GList *keyList = NULL;
462 if(stBridgeTableHash)
464 keyList = g_hash_table_get_keys(stBridgeTableHash);
465 for(elem = keyList; elem; elem = elem->next)
467 g_hash_table_remove(stBridgeTableHash, elem->data);
469 g_hash_table_destroy(stBridgeTableHash);
470 stBridgeTableHash = NULL;
473 g_list_free(keyList);
479 int hostif_InterfaceStack::insertRowIntoBridgeTable(IN
char *bridge, IN
char *bridgeInterfaces)
483 if(!stBridgeTableHash)
485 stBridgeTableHash = g_hash_table_new_full(NULL, NULL, (GDestroyNotify)bridgeInteface_key_data_free,
486 (GDestroyNotify)bridgeInteface_value_data_free);
489 if(bridge && bridgeInterfaces)
491 RDK_LOG(RDK_LOG_DEBUG,LOG_TR69HOSTIF,
"%s:%d Adding bridge %s bridgeInterfaces %s to hash table\n", __FUNCTION__, __LINE__, bridge, bridgeInterfaces);
492 g_hash_table_insert(stBridgeTableHash, g_strdup(bridge), g_strdup(bridgeInterfaces));
504 int hostif_InterfaceStack::getLowerInterfaceNumberOfEntries()
508 memset(&msgData, 0,
sizeof(msgData));
519 RDK_LOG(RDK_LOG_ERROR,LOG_TR69HOSTIF,
"%s:%d get_Device_Ethernet_InterfaceNumberOfEntries failed\n", __FILE__, __LINE__);
522 #ifdef USE_MoCA_PROFILE
523 else if(0 == strcmp(
typeid(T).name(),
typeid(
MoCAInterface).name()))
531 RDK_LOG(RDK_LOG_ERROR,LOG_TR69HOSTIF,
"%s:%d get_Device_MoCA_InterfaceNumberOfEntries failed\n", __FILE__, __LINE__);
543 std::string hostif_InterfaceStack::getInterfaceName(T* pIface)
547 memset(&msgData, 0,
sizeof(msgData));
557 RDK_LOG(RDK_LOG_ERROR,LOG_TR69HOSTIF,
"%s:%d get_Device_Ethernet_Interface_Name failed\n", __FILE__, __LINE__);
560 #ifdef USE_MoCA_PROFILE
561 else if(0 == strcmp(
typeid(T).name(),
typeid(
MoCAInterface).name()))
569 RDK_LOG(RDK_LOG_ERROR,LOG_TR69HOSTIF,
"%s:%d get_Device_MoCA_Interface_Name failed\n", __FILE__, __LINE__);
581 std::string hostif_InterfaceStack::getLowerLayerName(
int index)
583 std::string baseName;
586 baseName.append(DEVICE_ETHERNET_INTERFACE(index));
588 #ifdef USE_MoCA_PROFILE
589 else if(0 == strcmp(
typeid(T).name(),
typeid(
MoCAInterface).name()))
591 baseName.append(DEVICE_MOCA_INTERFACE(index));
612 int hostif_InterfaceStack::buildLowerLayerInfo (InterfaceStackMap_t &layerInfo)
614 int numOfEntries = getLowerInterfaceNumberOfEntries<T> ();
615 for (
int index = 1; index <= numOfEntries; index++)
617 T *pIface = T::getInstance (index);
620 RDK_LOG (RDK_LOG_ERROR, LOG_TR69HOSTIF,
"%s:%d getInstance failed\n", __FILE__, __LINE__);
624 std::string ifname = getInterfaceName<T> (pIface);
625 if (!ifname.empty ())
627 std::pair<std::string, LayerInfo_t> map_element;
628 map_element.first = ifname;
629 map_element.second.higherLayer = std::string (
"");
630 map_element.second.lowerLayer = getLowerLayerName<T> (index);
632 layerInfo.insert (map_element);
643 std::list<std::string> hostif_InterfaceStack::getBridgeElements(
char* elementsCSV)
646 char *savePtr = NULL;
647 std::list<std::string> bridgeElements;
651 token = strtok_r(elementsCSV,
",", &savePtr);
654 bridgeElements.push_back(std::string(token));
655 token = strtok_r(NULL,
",", &savePtr);
659 return bridgeElements;
677 void hostif_InterfaceStack::addBridgeNameLayerInfo(InterfaceStackMap_t &layerInfo, std::string ifname, std::string bridgeLowerLayer)
679 InterfaceStackMap_t::iterator it = layerInfo.find(ifname);
681 if(it != layerInfo.end())
683 it->second.lowerLayer = bridgeLowerLayer;
687 LayerInfo_t tempLayerInfo;
688 std::pair<std::string, LayerInfo_t> map_element;
690 tempLayerInfo.higherLayer = std::string(
"");
691 tempLayerInfo.lowerLayer = bridgeLowerLayer;
693 map_element.first = ifname;
694 map_element.second = tempLayerInfo;
696 layerInfo.insert(map_element);
718 int hostif_InterfaceStack::addBridgeChildLayerInfo(InterfaceStackMap_t &layerInfo, std::string ifname, std::string bridgeHigherLayer)
721 InterfaceStackMap_t::iterator it = layerInfo.find(ifname);
723 if(it != layerInfo.end())
725 it->second.higherLayer = bridgeHigherLayer;
732 if(
TRUE == g_hash_table_lookup_extended (stBridgeTableHash, ifname.c_str(), &origKey, &value) )
734 LayerInfo_t tempLayerInfo;
736 tempLayerInfo.higherLayer = bridgeHigherLayer;
737 tempLayerInfo.lowerLayer = std::string(
"");
739 layerInfo.insert( std::pair<std::string, LayerInfo_t>(ifname, tempLayerInfo));
766 void hostif_InterfaceStack::addBridgeUnmanagedLayerInfo(InterfaceStackMap_t &layerInfo, std::string ifname, std::string bridgeHigherLayer, std::string bridgeLowerLayer)
768 LayerInfo_t tempLayerInfo;
769 std::pair<std::string, LayerInfo_t> map_element;
771 tempLayerInfo.higherLayer = bridgeHigherLayer;
772 tempLayerInfo.lowerLayer = bridgeLowerLayer;
774 map_element.first = ifname;
775 map_element.second = tempLayerInfo;
777 layerInfo.insert(map_element);
784 int hostif_InterfaceStack::buildBridgeTableLayerInfo(InterfaceStackMap_t &layerInfo)
787 GList *bridgeList = NULL;
791 if(stBridgeTableHash)
796 g_hash_table_iter_init(&iter, stBridgeTableHash);
797 while (g_hash_table_iter_next (&iter, &key, &value))
806 std::string bridgeName;
807 std::list<std::string> bridgeElements;
808 std::string bridgeNameLayer;
809 std::list<std::string>::iterator it;
814 bridgeName.append((
const char*)key);
815 bridgeNameLayer.append( DEVICE_BRIDGING_BRIDGE(bridgeNum, portNum) );
816 addBridgeNameLayerInfo(layerInfo, bridgeName, bridgeNameLayer);
821 bridgeElements = getBridgeElements( (
char*) value);
823 for(it = bridgeElements.begin(); it != bridgeElements.end(); ++it, portNum++)
825 std::string unmanagedBridgeName;
826 std::string ifname = *it;
829 std::string bridgeElementLayer = DEVICE_BRIDGING_BRIDGE(bridgeNum, portNum);
831 if(OK == addBridgeChildLayerInfo(layerInfo, ifname, bridgeElementLayer))
834 unmanagedBridgeName.append(bridgeName+
"-child");
835 addBridgeUnmanagedLayerInfo(layerInfo, unmanagedBridgeName, bridgeNameLayer, bridgeElementLayer);
842 g_list_free(bridgeList);
850 int hostif_InterfaceStack::getIPInterfaces(IPInterfacesMap_t& interfaceList)
853 int ipNumOfEntries = 0;
859 RDK_LOG(RDK_LOG_ERROR,LOG_TR69HOSTIF,
"%s:%d get_Device_IP_InterfaceNumberOfEntries failed\n", __FILE__, __LINE__);
865 RDK_LOG(RDK_LOG_DEBUG,LOG_TR69HOSTIF,
"%s:%d ipNumOfEntries = %d\n", __FUNCTION__, __LINE__, ipNumOfEntries);
867 for(ipIndex=1; ipIndex <= ipNumOfEntries; ipIndex++)
869 std::string ipIfName;
874 RDK_LOG(RDK_LOG_ERROR,LOG_TR69HOSTIF,
"%s:%d hostIf_IPInterface::getInstance failed\n", __FILE__, __LINE__);
879 memset(&msgData,
'\0',
sizeof(msgData));
884 interfaceList.insert( std::pair<std::string, int>(ipIfName, ipIndex));
897 void hostif_InterfaceStack::fillHigherLayersWithIP(InterfaceStackMap_t &layerInfo, IPInterfacesMap_t& ipInterfaceMap)
899 InterfaceStackMap_t::iterator layerIterator;
901 for(layerIterator = layerInfo.begin(); layerIterator != layerInfo.end(); layerIterator++)
903 if(layerIterator->second.higherLayer.empty())
905 IPInterfacesMap_t::iterator interfaceIterator;
906 std::string ifname = layerIterator->first;
907 interfaceIterator = ipInterfaceMap.find(ifname);
909 if(interfaceIterator != ipInterfaceMap.end())
911 int portNum = interfaceIterator->second;
912 std::string higherLayer = DEVICE_IP_INTERFACE(portNum);
913 layerIterator->second.higherLayer = higherLayer;
919 void hostif_InterfaceStack::print_map(InterfaceStackMap_t &layerInfo)
921 InterfaceStackMap_t::iterator layerIterator;
923 for(layerIterator = layerInfo.begin(); layerIterator != layerInfo.end(); layerIterator++)
925 RDK_LOG(RDK_LOG_INFO,LOG_TR69HOSTIF,
"%s - %s --- %s\n", layerIterator->first.c_str(), layerIterator->second.higherLayer.c_str(), layerIterator->second.lowerLayer.c_str());
943 int hostif_InterfaceStack::get_Device_InterfaceStack_HigherLayer(
HOSTIF_MsgData_t *stMsgData,
bool *pChanged)
947 if(bCalledHigherLayer && pChanged && strncmp(backupHigherLayer, higherLayer,
sizeof(backupHigherLayer)))
951 bCalledHigherLayer =
true;
952 strncpy(backupHigherLayer, higherLayer,
sizeof(backupHigherLayer) -1);
953 backupHigherLayer[
sizeof(backupHigherLayer) -1] =
'\0';
954 strncpy(stMsgData->
paramValue, higherLayer, TR69HOSTIFMGR_MAX_PARAM_LEN );
955 stMsgData->
paramtype = hostIf_StringType;
973 int hostif_InterfaceStack::get_Device_InterfaceStack_LowerLayer(
HOSTIF_MsgData_t *stMsgData,
bool *pChanged)
977 if(bCalledLowerLayer && pChanged && strncmp(backupLowerLayer, lowerLayer,
sizeof(backupLowerLayer)))
981 bCalledLowerLayer =
true;
982 strncpy(backupLowerLayer, lowerLayer,
sizeof(backupLowerLayer) -1);
983 backupLowerLayer[
sizeof(backupLowerLayer) -1] =
'\0';
984 strncpy(stMsgData->
paramValue, lowerLayer, TR69HOSTIFMGR_MAX_PARAM_LEN );
985 stMsgData->
paramtype = hostIf_StringType;