// returns a strdup() of the interface name, use free(3) static char * _pickInterfaceName(MetisForwarder *metis) { char *ifname = NULL; CPIInterfaceSet *set = metisSystem_Interfaces(metis); size_t length = cpiInterfaceSet_Length(set); assertTrue(length > 0, "metisSystem_Interfaces returned no interfaces"); for (size_t i = 0; i < length; i++) { CPIInterface *iface = cpiInterfaceSet_GetByOrdinalIndex(set, i); const CPIAddressList *addressList = cpiInterface_GetAddresses(iface); size_t length = cpiAddressList_Length(addressList); for (size_t i = 0; i < length && !ifname; i++) { const CPIAddress *a = cpiAddressList_GetItem(addressList, i); if (cpiAddress_GetType(a) == cpiAddressType_LINK) { ifname = strdup(cpiInterface_GetName(iface)); } } } cpiInterfaceSet_Destroy(&set); return ifname; }
LONGBOW_TEST_CASE(Global, metisSystem_Interfaces) { MetisForwarder *metis = metisForwarder_Create(NULL); CPIInterfaceSet *set = metisSystem_Interfaces(metis); assertNotNull(set, "metisSystem_Interfaces return null set"); // XXX we need some sort of validation test. e.g. open a socket, then ioctl to // XXX get the interface name, then verify its in the list. size_t length = cpiInterfaceSet_Length(set); assertTrue(length > 0, "metisSystem_Interfaces returned no interfaces"); for (size_t i = 0; i < length; i++) { CPIInterface *iface = cpiInterfaceSet_GetByOrdinalIndex(set, i); printf("Interface Index %u\n", cpiInterface_GetInterfaceIndex(iface)); const CPIAddressList *list = cpiInterface_GetAddresses(iface); PARCJSONArray *jsonArray = cpiAddressList_ToJson(list); char *str = parcJSONArray_ToString(jsonArray); printf("%s\n", str); parcMemory_Deallocate((void **) &str); parcJSONArray_Release(&jsonArray); } cpiInterfaceSet_Destroy(&set); metisForwarder_Destroy(&metis); }
static CCNxControl * metisConfiguration_ProcessInterfaceList(MetisConfiguration *config, CCNxControl *request, unsigned ingressId) { CPIInterfaceSet *set = metisSystem_Interfaces(config->metis); PARCJSON *setJson = cpiInterfaceSet_ToJson(set); CCNxControl *response = cpi_CreateResponse(request, setJson); parcJSON_Release(&setJson); cpiInterfaceSet_Destroy(&set); return response; }
unsigned metisSystem_InterfaceMtu(MetisForwarder *metis, const char *interfaceName) { unsigned mtu = 0; if (interfaceName) { CPIInterfaceSet *interfaceSet = metisSystem_Interfaces(metis); CPIInterface *interface = cpiInterfaceSet_GetByName(interfaceSet, interfaceName); if (interface) { mtu = cpiInterface_GetMTU(interface); } cpiInterfaceSet_Destroy(&interfaceSet); } return mtu; }
CPIAddress * metisSystem_GetMacAddressByName(MetisForwarder *metis, const char *interfaceName) { CPIAddress *linkAddress = NULL; CPIInterfaceSet *interfaceSet = metisSystem_Interfaces(metis); CPIInterface *interface = cpiInterfaceSet_GetByName(interfaceSet, interfaceName); if (interface) { const CPIAddressList *addressList = cpiInterface_GetAddresses(interface); size_t length = cpiAddressList_Length(addressList); for (size_t i = 0; i < length && !linkAddress; i++) { const CPIAddress *a = cpiAddressList_GetItem(addressList, i); if (cpiAddress_GetType(a) == cpiAddressType_LINK) { linkAddress = cpiAddress_Copy(a); } } } cpiInterfaceSet_Destroy(&interfaceSet); return linkAddress; }