char* ActiveTake::ItemString(char* str, int maxLen) { char g1[64], g2[64]; guidToString(&m_item, g1); guidToString(&m_activeTake, g2); _snprintf(str, maxLen, "ITEM %s %s", g1, g2); return str; }
char* ActiveTakeTrack::ItemString(char* str, int maxLen) { char guidStr[64]; guidToString(&m_guid, guidStr); _snprintf(str, maxLen, "<ACTIVETAKESTRACK %s", guidStr); return str; }
char* SelItemsTrack::ItemString(char* str, int maxLen, bool* bDone) { static int iState = 0; static int iSlot = 0; *bDone = false; bool bSubDone; char guidStr[64]; switch(iState) { case 0: // Track GUID guidToString(&m_guid, guidStr); sprintf(str, "<SELTRACKITEMSELSTATE %s", guidStr); iState = 1; break; case 1: // Slot text while (iSlot < SEL_SLOTS && !m_selItems[iSlot]) iSlot++; if (iSlot == SEL_SLOTS) { *bDone = true; iSlot = 0; iState = 0; sprintf(str, ">"); } else { sprintf(str, "<SLOT %d", iSlot+1); iState = 2; } break; case 2: // Write out GUIDs m_selItems[iSlot]->ItemString(str, maxLen, &bSubDone); if (bSubDone) { iSlot++; iState = 1; } break; } return str; }
/** * Gets the switch port info from WMI (switch port friendly name, ifSpeed) * and merges into the list of existing ports. */ void readWMISwitchPorts(HSP *sp) { BSTR path = SysAllocString(WMI_VIRTUALIZATION_NS_V2); HRESULT hr = S_FALSE; IWbemServices *pNamespace = NULL; hr = connectToWMI(path, &pNamespace); if (FAILED(hr)) { //only try the v2 namespace since this will only be present //with the extensible switch that supports sampling. //don't try to get counters if there is no sampling. SysFreeString(path); myLog(LOG_INFO, "readWMISwitchPorts: virtualization namespace v2 not found"); return; } else { SysFreeString(path); } BSTR queryLang = SysAllocString(L"WQL"); wchar_t *query = L"SELECT * FROM Msvm_EthernetSwitchPort"; IEnumWbemClassObject *switchPortEnum = NULL; hr = pNamespace->ExecQuery(queryLang, query, WBEM_FLAG_FORWARD_ONLY, NULL, &switchPortEnum); SysFreeString(queryLang); if (FAILED(hr)) { myLog(LOG_ERR,"readWMISwitchPorts: ExecQuery() failed for query %S error=0x%x", query, hr); pNamespace->Release(); return; } if (sp->vAdaptorList == NULL) { sp->vAdaptorList = adaptorListNew(); } IWbemClassObject *switchPortObj = NULL; hr = WBEM_S_NO_ERROR; while (WBEM_S_NO_ERROR == hr) { SFLAdaptor *vAdaptor = NULL; ULONG uReturned = 1; hr = switchPortEnum->Next(WBEM_INFINITE, 1, &switchPortObj, &uReturned); if (0 == uReturned) { break; } wchar_t *guidString = stringFromWMIProperty(switchPortObj, PROP_NAME); if (guidString != NULL) { char portGuid[FORMATTED_GUID_LEN+1]; guidToString(guidString, (UCHAR *)portGuid, FORMATTED_GUID_LEN); myLog(LOG_INFO, "readWMISwitchPorts: portGuid=%s", portGuid); my_free(guidString); vAdaptor = adaptorListGet(sp->vAdaptorList, portGuid); } if (vAdaptor != NULL) { HVSVPortInfo *portInfo = (HVSVPortInfo *)vAdaptor->userData; wchar_t *switchName = stringFromWMIProperty(switchPortObj, PROP_SYSTEM_NAME); if (switchName != NULL) { if (portInfo->switchName != NULL) { my_free(portInfo->switchName); } portInfo->switchName = switchName; } wchar_t *friendlyName = stringFromWMIProperty(switchPortObj, PROP_ELEMENT_NAME); if (friendlyName != NULL) { if (portInfo->portFriendlyName != NULL) { my_free(portInfo->portFriendlyName); } portInfo->portFriendlyName = friendlyName; } setPortCountersInstance(vAdaptor); wchar_t *speedString = stringFromWMIProperty(switchPortObj, PROP_SPEED); if (speedString != NULL) { ULONGLONG ifSpeed = _wcstoui64(speedString, NULL, 10); vAdaptor->ifSpeed = ifSpeed; my_free(speedString); } //could also get ifDirection but FullDuplex=True always //Get the MACs and VM system name when we enumerate the vms. myLog(LOG_INFO, "readWMISwitchPorts: updated switch port %s %S portId=%u ifIndex=%u ifSpeed=%llu counterName=%S", vAdaptor->deviceName, portInfo->portFriendlyName, portInfo->portId, vAdaptor->ifIndex, vAdaptor->ifSpeed, portInfo->portCountersInstance); } else { myLog(LOG_INFO, "readWMISwitchPorts: vAdapter not found"); } switchPortObj->Release(); } switchPortEnum->Release(); pNamespace->Release(); }
/** * Updates the switch port list with the information in pSwitchConfig * obtained from the filter. */ void updateSwitchPorts(HSP *sp, PAllSwitchesConfig config) { if (config->revision <= sp->portInfoRevision) { return; } if (sp->vAdaptorList == NULL) { sp->vAdaptorList = adaptorListNew(); } else { adaptorListMarkAll(sp->vAdaptorList); } PSwitchConfig switchConfig; for (uint32_t switchNum = 0; switchNum < config->numSwitches; switchNum++) { if (switchNum == 0) { switchConfig = GET_FIRST_SWITCH_CONFIG(config); } else { switchConfig = GET_NEXT_SWITCH_CONFIG(switchConfig); } wchar_t *switchName = ndiswcsdup(&switchConfig->switchName); uint64_t switchId = switchConfig->switchID; for (uint32_t portNum = 0; portNum < switchConfig->numPorts; portNum++) { PPortEntry portEntry = GET_PORT_ENTRY_AT(switchConfig, portNum); uint32_t portId = portEntry->portID; wchar_t *portName = ndiswcsdup(&portEntry->portName); char portGuid[FORMATTED_GUID_LEN+1]; guidToString(portName, (UCHAR *)portGuid, FORMATTED_GUID_LEN); SFLAdaptor *switchPort = adaptorListGet(sp->vAdaptorList, portGuid); if (switchPort == NULL) { //new port so add to the vadaptor list //convert GUID to uuid format to look up ifIndex/dsIndex char uuid[16]; hexToBinary((UCHAR *)portGuid, (UCHAR *)uuid, 33); uint32_t ifIndex = assign_dsIndex(&sp->portStore, uuid, &sp->maxIfIndex, &sp->portStoreInvalid); switchPort = addVAdaptor(sp->vAdaptorList, portGuid, ifIndex); HVSVPortInfo *portInfo = (HVSVPortInfo *)switchPort->userData; portInfo->filterEnabled = TRUE; portInfo->portId = portId; portInfo->revision = portEntry->revision; switchPort->marked = FALSE; updatePortSwitchName(switchPort, switchName); portInfo->switchId = switchConfig->switchID; myLog(LOG_INFO, "updateSwitchPorts: Added new portId=%u ifIndex=%u deviceName=%s switchId=%llu switchName=%S", portInfo->portId, switchPort->ifIndex, switchPort->deviceName, portInfo->switchId, portInfo->switchName); addPoller(sp, switchPort); } else { //we already know about this port, so make sure we have a poller //and the current info SFLDataSource_instance dsi; SFL_DS_SET(dsi, 0, switchPort->ifIndex, 0); SFLPoller *poller = sfl_agent_getPoller(sp->sFlow->agent, &dsi); if (poller == NULL) { poller = addPoller(sp, switchPort); } HVSVPortInfo *portInfo = (HVSVPortInfo *)switchPort->userData; if (portEntry->revision > portInfo->revision) { updatePortSwitchName(switchPort, switchName); portInfo->revision = portEntry->revision; if (poller != NULL) { sfl_poller_resetCountersSeqNo(poller); } myLog(LOG_INFO, "updateSwitchPorts: revision changed: portId=%u ifIndex=%u deviceName=%s switchId=%llu switchName=%S", portInfo->portId, switchPort->ifIndex, switchPort->deviceName, portInfo->switchId, portInfo->switchName); } portInfo->filterEnabled = TRUE; switchPort->marked = FALSE; } my_free(portName); } my_free(switchName); } //now sweep //remove the pollers for non-sampling ports for (uint32_t i = 0; i < sp->vAdaptorList->num_adaptors; i++) { SFLAdaptor *vAdaptor = sp->vAdaptorList->adaptors[i]; if (vAdaptor->marked) { HVSVPortInfo *portInfo = (HVSVPortInfo *)vAdaptor->userData; if (portInfo->filterEnabled) { //filter (ie sampling) has been disabled in the switch with this port ((HVSVPortInfo *)vAdaptor->userData)->portId = 0; removePoller(sp, vAdaptor); portInfo->filterEnabled = FALSE; //Clear the mark so this port will not be deleted, the VM and adaptor may still exist. //If the adaptor does not exist, it will be removed when we next refresh the VMs. vAdaptor->marked = FALSE; } else { //this was a port added for a vm on a switch with the filter disabled, so //just clear the mark so that it will not be deleted. vAdaptor->marked = FALSE; } } } //Now remove the marked adaptors and their port info from the list adaptorListFreeMarked(sp->vAdaptorList, freePortInfo); //TODO ageout the persistent ifIndex->GUID mapping and remove from vAdaptor list. sp->portInfoRevision = config->revision; readWMISwitchPorts(sp); //update the ifSpeed, MAC, VM name sp->refreshVms = TRUE; }
/** * Enumerates the adapters for this host from WMI Win32_NetworkAdapter * where NetConnectionStatus=2 (to exclude tunnels, ras, wan miniports etc). * Uses the information to populate the sp->adaptorList structure. * adapter->deviceName = Win32_NetworkAdapter.GUID (converted to * lowercase char with enclosing {} removed) * adapter->ifIndex = Win32_NetworkAdapter.InterfaceIndex * this is the interface index used in the route table (rather than Index * which is the index for the interface in the registry). * adapter->userData->countersInstance = Win32_NetworkAdapter.Name * (with reserved chars replaced) * adapter->userData->isVirtual = (Win32_NetworkAdapter.ServiceName == "VMSMP") * Optionally gets the IP address (v4 and/or v6) from the associated * Win32_NetworkAdapterConfiguration. This is only required when trying * to identify the IP addresses that could be used as the agent address. * Returns true on success, false on failure. */ static BOOL readInterfacesWin32(SFLAdaptorList *adaptorList, BOOL getIpAddr) { BSTR path = SysAllocString(WMI_CIMV2_NS); HRESULT hr = S_FALSE; IWbemServices *pNamespace = NULL; hr = connectToWMI(path, &pNamespace); SysFreeString(path); if (WBEM_S_NO_ERROR != hr) { myLog(LOG_ERR,"readInterfacesWin32: connectToWMI failed for namespace %S", path); return FALSE; } BSTR queryLang = SysAllocString(L"WQL"); BSTR query = SysAllocString(L"SELECT * FROM Win32_NetworkAdapter WHERE NetConnectionStatus=2"); IEnumWbemClassObject *adapterEnum = NULL; hr = pNamespace->ExecQuery(queryLang, query, WBEM_FLAG_FORWARD_ONLY, NULL, &adapterEnum); SysFreeString(queryLang); if (!SUCCEEDED(hr)) { myLog(LOG_ERR,"readInterfacesWin32: ExecQuery() failed for query %S error=0x%x", query, hr); SysFreeString(query); pNamespace->Release(); return FALSE; } SysFreeString(query); IWbemClassObject *adapterObj = NULL; VARIANT ifIndexVal; hr = WBEM_S_NO_ERROR; while (WBEM_S_NO_ERROR == hr) { ULONG adapterCount = 1; hr = adapterEnum->Next(WBEM_INFINITE, 1, &adapterObj, &adapterCount); if (0 == adapterCount) { break; } wchar_t *guidString = stringFromWMIProperty(adapterObj, PROP_GUID); wchar_t *macString = stringFromWMIProperty(adapterObj, PROP_MAC); if (guidString != NULL && macString != NULL) { u_char deviceName[FORMATTED_GUID_LEN+1]; guidToString(guidString, deviceName, FORMATTED_GUID_LEN); u_char mac[13]; wchexToBinary(macString, mac, 13); SFLAdaptor *adaptor = adaptorListAdd(adaptorList, (char *)deviceName, mac, sizeof(HSPAdaptorNIO)); // clear the mark so we don't free it later adaptor->marked = FALSE; if (WBEM_S_NO_ERROR == adapterObj->Get(PROP_IFINDEX, 0, &ifIndexVal, 0, 0) && (V_VT(&ifIndexVal) == VT_I4 || V_VT(&ifIndexVal) == VT_UI4)) { adaptor->ifIndex = ifIndexVal.ulVal; } HSPAdaptorNIO *userData = (HSPAdaptorNIO *)adaptor->userData; if (userData->countersInstance != NULL) { my_free(userData->countersInstance); } wchar_t *counterName = stringFromWMIProperty(adapterObj, PROP_NAME); if (counterName != NULL) { cleanCounterName(counterName, UTNETWORK_INTERFACE); userData->countersInstance = counterName; } wchar_t *svcName = stringFromWMIProperty(adapterObj, PROP_SVC_NAME); if (svcName != NULL) { userData->isVirtual = (_wcsicmp(VMSMP, svcName) == 0); my_free(svcName); } if (getIpAddr) { userData->ipPriority = IPSP_NONE; readIpAddressesWin32(pNamespace, adapterObj, adaptor); } myLog(LOG_INFO,"ReadInterfacesWin32:\n\tAdapterName:\t%s\n\tifIndex:\t%lu\n\tCounterName:\t%S\n\tisVirtual\t%u", adaptor->deviceName, adaptor->ifIndex, userData->countersInstance, userData->isVirtual); } if (guidString != NULL) { my_free(guidString); } if (macString != NULL) { my_free(macString); } adapterObj->Release(); VariantClear(&ifIndexVal); } adapterEnum->Release(); pNamespace->Release(); return TRUE; }
void TrackSend::GetChunk(WDL_FastString* chunk) { char guidStr[64]; guidToString(&m_destGuid, guidStr); chunk->AppendFormatted(chunk->GetLength() + 150, "AUXSEND %s %s\n", guidStr, m_str.Get()); }
/** * Gets the switch port info from WMI (switch port friendly name, ifSpeed) * and merges into the list of existing ports. */ void readWMISwitchPorts(HSP *sp) { myLog(LOG_INFO, "entering readWMISwitchPorts"); BSTR path = SysAllocString(WMI_VIRTUALIZATION_NS_V2); HRESULT hr = S_FALSE; IWbemServices *pNamespace = NULL; hr = connectToWMI(path, &pNamespace); if (FAILED(hr)) { //only try the v2 namespace since this will only be present //with the extensible switch that supports sampling. //don't try to get counters if there is no sampling. SysFreeString(path); myLog(LOG_INFO, "readWMISwitchPorts: virtualization namespace v2 not found"); return; } else { SysFreeString(path); } BSTR queryLang = SysAllocString(L"WQL"); BSTR query = SysAllocString(L"SELECT * FROM Msvm_EthernetSwitchPort"); IEnumWbemClassObject *switchPortEnum = NULL; hr = pNamespace->ExecQuery(queryLang, query, WBEM_FLAG_FORWARD_ONLY, NULL, &switchPortEnum); SysFreeString(queryLang); SysFreeString(query); if (FAILED(hr)) { myLog(LOG_ERR,"readWMISwitchPorts: ExecQuery() failed for query %S error=0x%x", query, hr); CoUninitialize(); return; } if (sp->vAdaptorList == NULL) { sp->vAdaptorList = adaptorListNew(); } IWbemClassObject *switchPortObj = NULL; BSTR propElementName = SysAllocString(L"ElementName"); BSTR propSystemName = SysAllocString(L"SystemName"); BSTR propName = SysAllocString(L"Name"); BSTR propSpeed = SysAllocString(L"Speed"); //could also get ifDirection but FullDuplex=True always VARIANT systemVal; VARIANT elementVal; VARIANT nameVal; VARIANT speedVal; hr = WBEM_S_NO_ERROR; while (WBEM_S_NO_ERROR == hr) { SFLAdaptor *vAdaptor = NULL; ULONG uReturned = 1; hr = switchPortEnum->Next(WBEM_INFINITE, 1, &switchPortObj, &uReturned); if (0 == uReturned) { break; } HRESULT portHr; portHr = switchPortObj->Get(propName, 0, &nameVal, 0, 0); char portGuid[FORMATTED_GUID_LEN+1]; guidToString(nameVal.bstrVal, (UCHAR *)portGuid, FORMATTED_GUID_LEN); myLog(LOG_INFO, "readWMISwitchPorts: portGuid=%s", portGuid); VariantClear(&nameVal); vAdaptor = adaptorListGet(sp->vAdaptorList, portGuid); if (vAdaptor != NULL) { portHr = switchPortObj->Get(propSystemName, 0, &systemVal, 0, 0); portHr = switchPortObj->Get(propElementName, 0, &elementVal, 0, 0); portHr = switchPortObj->Get(propSpeed, 0, &speedVal, 0, 0); int length = SysStringLen(systemVal.bstrVal)+1; //include room for terminating null wchar_t *switchName = (wchar_t *)my_calloc(length*sizeof(wchar_t)); wcscpy_s(switchName, length, systemVal.bstrVal); length = SysStringLen(elementVal.bstrVal)+1; wchar_t *friendlyName = (wchar_t *)my_calloc(length*sizeof(wchar_t)); wcscpy_s(friendlyName, length, elementVal.bstrVal); ULONGLONG ifSpeed = _wcstoui64(speedVal.bstrVal, NULL, 10); VariantClear(&systemVal); VariantClear(&elementVal); VariantClear(&speedVal); HVSVPortInfo *portInfo = (HVSVPortInfo *)vAdaptor->userData; if (portInfo->switchName != NULL) { my_free(portInfo->switchName); } portInfo->switchName = switchName; if (portInfo->portFriendlyName != NULL) { my_free(portInfo->portFriendlyName); } portInfo->portFriendlyName = friendlyName; setPortCountersInstance(vAdaptor); vAdaptor->ifSpeed = ifSpeed; //Get the MACs and VM system name when we enumerate the vms. myLog(LOG_INFO, "readWMISwitchPorts: updated switch port %s %S portId=%u ifIndex=%u ifSpeed=%llu counterName=%S", vAdaptor->deviceName, portInfo->portFriendlyName, portInfo->portId, vAdaptor->ifIndex, vAdaptor->ifSpeed, portInfo->portCountersInstance); } else { myLog(LOG_INFO, "readWMISwitchPorts: vAdapter not found"); } switchPortObj->Release(); } switchPortEnum->Release(); pNamespace->Release(); CoUninitialize(); SysFreeString(propElementName); SysFreeString(propSystemName); SysFreeString(propName); SysFreeString(propSpeed); return; }