home *** CD-ROM | disk | FTP | other *** search
- /*
- * Author : Ranveer Chandra
- * Directory: VirtualWiFi_Root\Service
- * File Name: ServiceLoop.cpp
- * Purpose : Defines the main loop of the Service, including switching networks
- */
- #include "VirtualWiFiservice.h"
- #include "ioctl.h"
-
- extern FILE *fpConfig;
- //using namespace std;
-
- bool DEBUG_ON;
-
- void SleepM(DWORD Duration)
- {
- MSG msg;
- MsgWaitForMultipleObjects(0, NULL, TRUE, Duration, QS_ALLINPUT | QS_ALLPOSTMESSAGE);
- if (0 != PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
- DispatchMessage(&msg);
- }
-
-
- // The main routine for the VirtualWiFi Client
- extern VOID ServiceLoop(HANDLE *hEvents)
- {
- ULONG numNodes=0;
- RemoteNode VirtualWiFiNodes[MAX_VirtualWiFi_NODES];
- int i;
- ULONG j=0;
- int k;
- char *adapterNum="1\0";
- DEBUG_ON = false;
- ULONG totalTimeToStay = 0;
- ULONG adaptiveScheduling = 0;
- int adaptiveWindowSize = 5;
- DWORD dwWait;
- ULONG switchTime = 0;
- ULONG waitTime = 0;
- char lpOutputString[50];
- ULONG numVirtualWiFiNodes=0;
- ULONG isAdaptiveScheduling = 0;
- char VirtualWiFiChar[50], ssidChar[SSID_LENGTH], modeChar[3];
- char dataFileName[100];
-
- DEBUG_ON = true;
-
- SleepM(1000);
- //fpConfig = fopen("C:\\Windows\\VirtualWiFiData.txt", "r");
- sprintf(dataFileName, "%s\\VirtualWiFiData.txt", getenv("windir"));
- fpConfig = fopen(dataFileName, "r");
- if(fpConfig != NULL) {
- sprintf(lpOutputString, "Successfully opened the config file\n");
- OutputDebugString(TEXT(lpOutputString));
- while(!feof(fpConfig)) {
- NetworkModeAndSSID networkModeAndSSID;
- dwWait = WaitForMultipleObjects( 2, hEvents, FALSE, 3 );
- if ( dwWait == WAIT_OBJECT_0 ) // not overlapped i/o event - error occurred,
- break; // or server stop signaled
-
- fscanf(fpConfig, "%s %s %s\n", VirtualWiFiChar, modeChar, ssidChar);
- sprintf(lpOutputString, "Connection is %s %s\n", ssidChar, modeChar);
- OutputDebugString(TEXT(lpOutputString));
- if(!_stricmp(modeChar, "ah"))
- networkModeAndSSID.networkMode = MODE_AH;
- else if(!_stricmp(modeChar, "is"))
- networkModeAndSSID.networkMode = MODE_IS;
- else {
- sprintf(lpOutputString, "Could not understand the mode\n");
- OutputDebugString(TEXT(lpOutputString));
- }
- strcpy(networkModeAndSSID.networkSSID, ssidChar);
- networkModeAndSSID.adapterNum = "1";
- networkModeAndSSID.ssidLength = (ULONG)strlen(networkModeAndSSID.networkSSID);
- ioctlSet(IOCTL_SET_CURRENT_SSID, &networkModeAndSSID, (DWORD) sizeof(networkModeAndSSID));
- }
- fclose(fpConfig);
- } else {
- sprintf(lpOutputString, "Problems opening the config file\n");
- OutputDebugString(TEXT(lpOutputString));
- }
-
-
- // Initialize the data structures
- // numVirtualWiFiNodes = ioctlGetULongFromAdapter(IOCTL_GET_NUM_NETWORKS, adapterNum, (DWORD)strlen(adapterNum));
- numVirtualWiFiNodes = ioctlGetFromAdapter(IOCTL_GET_NUM_NETWORKS, adapterNum, (DWORD)strlen(adapterNum), &numNodes, sizeof(ULONG));
-
- sprintf(lpOutputString, "Number of nodes is %d\n", numVirtualWiFiNodes);
- OutputDebugString(TEXT(lpOutputString));
-
- adaptiveScheduling = ioctlGetFromAdapter(IOCTL_GET_SCHEDULING_SCHEME, adapterNum,
- (DWORD)strlen(adapterNum), &isAdaptiveScheduling, sizeof(ULONG));
-
- sprintf(lpOutputString, "Scheduling scheme is %d\n", adaptiveScheduling);
- OutputDebugString(TEXT(lpOutputString));
-
-
- for(j=0; j<numVirtualWiFiNodes; j++) {
- ULONG tempSwitchTime = 0;
- ULONG tempWaitTime = 0;
- ioctlSet(IOCTL_SWITCH_SSID, adapterNum, sizeof(adapterNum));
- switchTime = ioctlGetFromAdapter(IOCTL_GET_SWITCH_TIME, adapterNum,
- (DWORD)strlen(adapterNum), &tempSwitchTime, sizeof(ULONG));
- VirtualWiFiNodes[j].timeToSwitchToNetwork = switchTime;
- waitTime = ioctlGetFromAdapter(IOCTL_GET_WAIT_TIME, adapterNum,
- (DWORD)strlen(adapterNum), &tempWaitTime, sizeof(ULONG));
- VirtualWiFiNodes[j].timeInNetwork = waitTime;
- totalTimeToStay += waitTime;
- sprintf(lpOutputString, "Network %d, switch time %d, wait time %d\n", j, switchTime, waitTime);
- OutputDebugString(TEXT(lpOutputString));
- }
-
- // Initialize for adaptive scheduling
- if(adaptiveScheduling) {
- for(j=0; j<numVirtualWiFiNodes; j++) {
- for(k=0; k<adaptiveWindowSize; k++)
- VirtualWiFiNodes[j].bufferLengthHistory[k] = 0;
- VirtualWiFiNodes[j].currentWindowPosition = 0;
- VirtualWiFiNodes[j].totalPacketsOverWindow = 0;
- }
- }
-
- j = 0;
- //adaptiveScheduling = 0;
-
- // Main Service Routine
- // - Switch Card, send buffer messages, and coordinate with remote VirtualWiFi nodes
- while(1)
- {
- // char currentSSID[33];
- char bufferLength[10];
- double timeInNetwork = 0; // Used for adaptive Scheduling
- int intTimeInNetwork = 0;
- ULONG retVal = 0;
-
- dwWait = WaitForMultipleObjects( 2, hEvents, FALSE, 3 );
- if ( dwWait == WAIT_OBJECT_0 ) { // not overlapped i/o event - error occurred,
- sprintf(lpOutputString, "Service break received in loop\n");
- OutputDebugString(TEXT(lpOutputString));
- break; // or server stop signaled
- }
- // Switch the SSID
- retVal = ioctlSet(IOCTL_SWITCH_SSID, adapterNum, sizeof(adapterNum));
- //if(retVal == 1) continue;
- if(j < MAX_VirtualWiFi_NODES) {
- sprintf(lpOutputString, "j=%d, TTSN %ld\n", j, VirtualWiFiNodes[j].timeToSwitchToNetwork);
- OutputDebugString(TEXT(lpOutputString));
- SleepM(VirtualWiFiNodes[j].timeToSwitchToNetwork);
- sprintf(lpOutputString, "VirtualWiFi connection %d active, totalTimeToStay %d\n", j, totalTimeToStay);
- OutputDebugString(TEXT(lpOutputString));
- }
- // if the scheduling is adaptive, then get the buffer lengths
- if(adaptiveScheduling) {
- ULONG totalBufferedPackets = 0;
- ULONG k;
-
- // Get the number of packets buffered on the current network
- retVal = ioctlGetFromAdapter(IOCTL_GET_BUFFER_QUEUE_LENGTH, adapterNum, sizeof(adapterNum), bufferLength, 20);
- //if(retVal == 1) continue;
- // Reduce the oldest entry for the current network
- if (j < MAX_VirtualWiFi_NODES) {
- VirtualWiFiNodes[j].totalPacketsOverWindow -= VirtualWiFiNodes[j].bufferLengthHistory[VirtualWiFiNodes[j].currentWindowPosition];
- sscanf(bufferLength, "%d", &VirtualWiFiNodes[j].bufferLengthHistory[VirtualWiFiNodes[j].currentWindowPosition]);
- VirtualWiFiNodes[j].totalPacketsOverWindow += VirtualWiFiNodes[j].bufferLengthHistory[VirtualWiFiNodes[j].currentWindowPosition];
-
- for(k=0; k<numVirtualWiFiNodes; k++)
- totalBufferedPackets += VirtualWiFiNodes[k].totalPacketsOverWindow;
-
- if(totalBufferedPackets != 0)
- timeInNetwork = VirtualWiFiNodes[j].totalPacketsOverWindow/(totalBufferedPackets*1.0)*totalTimeToStay;
- else
- timeInNetwork = VirtualWiFiNodes[j].timeInNetwork/2;
-
- if(timeInNetwork == 0)
- timeInNetwork = VirtualWiFiNodes[j].timeInNetwork;
- }
- if (j < MAX_VirtualWiFi_NODES) {
- sprintf(lpOutputString, "total buffered here %ld, overall %ld\n",
- VirtualWiFiNodes[j].totalPacketsOverWindow, totalBufferedPackets);
- OutputDebugString(TEXT(lpOutputString));
-
- intTimeInNetwork = (int)timeInNetwork;
- sprintf(lpOutputString, "time to stay in network %f and %d ms\n", timeInNetwork, intTimeInNetwork);
- OutputDebugString(TEXT(lpOutputString));
-
- // we need to handle the buffer lengths. here we maintain it as a circular queue
- VirtualWiFiNodes[j].currentWindowPosition++;
- if(VirtualWiFiNodes[j].currentWindowPosition == adaptiveWindowSize)
- VirtualWiFiNodes[j].currentWindowPosition = 0;
- }
- }
-
- // Send the packets buffered on the current SSID
- retVal = ioctlSet(IOCTL_SEND_BUFFERED_PACKETS, adapterNum, sizeof(adapterNum));
- //if(retVal == 1) continue;
-
- // Stay in the network for the amount of time
- if(adaptiveScheduling && intTimeInNetwork < 10000) {
- sprintf(lpOutputString, "Sleeping for %d seconds\n", intTimeInNetwork);
- OutputDebugString(TEXT(lpOutputString));
- SleepM(intTimeInNetwork);
- } else if (j < MAX_VirtualWiFi_NODES && VirtualWiFiNodes[j].timeInNetwork < 10000) {
- sprintf(lpOutputString, "Sleeping for j %d seconds\n", VirtualWiFiNodes[j].timeInNetwork);
- OutputDebugString(TEXT(lpOutputString));
- SleepM(VirtualWiFiNodes[j].timeInNetwork);
- }
-
- j++;
- if(j>=numVirtualWiFiNodes)
- j = 0;
- }
-
- return;
- }
-
-