Пример #1
0
CWBool CWParseSettingsFile()
{
	char *line = NULL;
		
	gSettingsFile = fopen (CW_SETTINGS_FILE, "rb");
	if (gSettingsFile == NULL) {
		CWErrorRaiseSystemError(CW_ERROR_GENERAL);
	}
	
	CW_CREATE_ARRAY_ERR(gDefaultQosValues, NUM_QOS_PROFILES, WTPQosValues, return CWErrorRaise(CW_ERROR_OUT_OF_MEMORY, NULL););
Пример #2
0
// creates a semaphore
CWBool CWThreadCreateSem(CWThreadSem *semPtr, int value) {
	if(semPtr == NULL) return CWErrorRaise(CW_ERROR_WRONG_ARG, NULL);
	
	// we use named semaphore on platforms that support only them (e.g. Mac OS X)
	#ifdef CW_USE_NAMED_SEMAPHORES
	{
		static int semCount = 0;
		char name[32];

		snprintf(name, 32, "/CWSem-%d-%4.4d", getpid(), semCount++);
		if ( (semPtr->semPtr = sem_open(name, O_CREAT, 0600, value)) == (sem_t *)SEM_FAILED ) {
			CWErrorRaiseSystemError(CW_ERROR_GENERAL);
		} else {
			sem_unlink(name);
		}
	}
	#else
		if ( sem_init(semPtr, 0, value) < 0 ) {
			CWErrorRaiseSystemError(CW_ERROR_GENERAL);
		}
	#endif
	
	return CW_TRUE;
}
Пример #3
0
CWBool CWParseSettingsFile()
{
	char *line = NULL;
		
	gSettingsFile = fopen (CW_SETTINGS_FILE, "rb");
	if (gSettingsFile == NULL) {
		CWErrorRaiseSystemError(CW_ERROR_GENERAL);
	}
	
	while((line = (char*)CWGetCommand(gSettingsFile)) != NULL) 
	{
		char* startTag=NULL;
		char* endTag=NULL;
		
		if((startTag=strchr (line, '<'))==NULL) 
		{
			CW_FREE_OBJECT(line);
			continue;
		}

		if((endTag=strchr (line, '>'))==NULL) 
		{
			CW_FREE_OBJECT(line);
			continue;
		}
			
		if (!strncmp(startTag+1, "IF_NAME", endTag-startTag-1))
		{
			char* startValue=NULL;
			char* endValue=NULL;
			int offset = 0;

			CWExtractValue(endTag, &startValue, &endValue, &offset);

			CW_CREATE_STRING_ERR(gInterfaceName, offset, return CWErrorRaise(CW_ERROR_OUT_OF_MEMORY,NULL););
			strncpy(gInterfaceName, startValue, offset);
			gInterfaceName[offset] ='\0';
			CWLog(": %s", gInterfaceName);
			CW_FREE_OBJECT(line);
			continue;	
		}
Пример #4
0
CWBool CWThreadTimedSemWait(CWThreadTimedSem *semPtr, time_t sec, time_t nsec) {
#ifdef HAVE_SEM_TIMEDWAIT
	struct timespec timeout;
	time_t t;
	
	#ifdef CW_USE_NAMED_SEMAPHORES
		if(semPtr == NULL || semPtr->semPtr == NULL) return CWErrorRaise(CW_ERROR_WRONG_ARG, NULL);
	#else
		if(semPtr == NULL) return CWErrorRaise(CW_ERROR_WRONG_ARG, NULL);
	#endif
	
	CWDebugLog("Sem Timed Wait");
	
	time(&t);

	timeout.tv_sec = t + sec;
	timeout.tv_nsec = nsec;
	
	#ifdef CW_USE_NAMED_SEMAPHORES
		while(sem_timedwait(semPtr->semPtr, &timeout) < 0 ) {
	#else
		while(sem_timedwait(semPtr, &timeout) < 0 ) {
	#endif
			if(errno == EINTR) { continue;}
			else if(errno == ETIMEDOUT) {
				CWDebugLog("sem_timedwait expired");
				return CWErrorRaise(CW_ERROR_TIME_EXPIRED, NULL);
			} else {
				CWErrorRaiseSystemError(CW_ERROR_GENERAL);
			}
		}
	
#else
	fd_set fset;
	int r;
	struct timeval timeout;
	char dummy;
	
	if(semPtr == NULL) return CWErrorRaise(CW_ERROR_WRONG_ARG, NULL);
	
	CWDebugLog("Timed Sem Wait");
	
	FD_ZERO(&fset);
	FD_SET((*semPtr)[0], &fset);
	
	timeout.tv_sec = sec;
	timeout.tv_usec = nsec / 1000;
	
	CWDebugLog("Timed Sem Wait Before Select");
	while((r = select(((*semPtr)[0])+1, &fset, NULL, NULL, &timeout)) <= 0) {
		CWDebugLog("Timed Sem Wait Select error");
		if(r == 0) {
			CWDebugLog("Timed Sem Wait Timeout");
			return CWErrorRaise(CW_ERROR_TIME_EXPIRED, NULL);
		} else if(errno == EINTR) {
			timeout.tv_sec = sec;
			timeout.tv_usec = nsec / 1000;
			continue;
		}
		CWErrorRaiseSystemError(CW_ERROR_GENERAL);
	}
	
	CWDebugLog("Timed Sem Wait After Select");
	
	// ready to read
	
	while(read((*semPtr)[0], &dummy, 1) < 0) {
		if(errno == EINTR) continue;
		CWErrorRaiseSystemError(CW_ERROR_GENERAL);
	}
	
	// send ack (three-way handshake)
	
	while(send((*semPtr)[0], &dummy, 1, 0) < 0) {
		if(errno == EINTR) continue;
		CWErrorRaiseSystemError(CW_ERROR_SENDING);
	}
	
	timeout.tv_sec = 2;
	timeout.tv_usec = 0;
	
	CWDebugLog("Timed Sem Wait Before Select 2");
	while((r = select(((*semPtr)[0])+1, &fset, NULL, NULL, &timeout)) <= 0) {
		CWDebugLog("Timed Sem Wait Select error 2");
		if(r == 0) {
			CWDebugLog("Timed Sem Wait Timeout 2");
			return CWErrorRaise(CW_ERROR_TIME_EXPIRED, NULL);
		} else if(errno == EINTR) {
			timeout.tv_sec = 2;
			timeout.tv_usec = 0;
			continue;
		}
		CWErrorRaiseSystemError(CW_ERROR_GENERAL);
	}
	
	CWDebugLog("Timed Sem Wait After Select 2");
	
	// read ack
	
	while(read((*semPtr)[0], &dummy, 1) < 0) {
		if(errno == EINTR) continue;
		CWErrorRaiseSystemError(CW_ERROR_GENERAL);
	}
	
#endif
	
	CWDebugLog("End of Timed Sem Wait");
	
	return CW_TRUE;
}

CWBool CWThreadTimedSemPost(CWThreadTimedSem *semPtr) {
#ifdef HAVE_SEM_TIMEDWAIT
	return CWThreadSemPost(semPtr);
#else
	char dummy = 'D';
	fd_set fset;
	int r;
	struct timeval timeout;
	
	if(semPtr == NULL) return CWErrorRaise(CW_ERROR_WRONG_ARG, NULL);
	
	CWDebugLog("Timed Sem Post");
	
	while(send((*semPtr)[1], &dummy, 1, 0) < 0) {
		if(errno == EINTR) continue;
		CWErrorRaiseSystemError(CW_ERROR_SENDING);
	}
	
	// read ack (three-way handshake)
	
	FD_ZERO(&fset);
	FD_SET((*semPtr)[1], &fset);
	
	timeout.tv_sec = 2;
	timeout.tv_usec = 0;
	
	CWDebugLog("Timed Sem Post Before Select");
	while((r = select(((*semPtr)[1])+1, &fset, NULL, NULL, &timeout)) <= 0) {
		CWDebugLog("Timed Sem Post Select Error");
		if(r == 0) { // timeout, server is not responding
			// note: this is not an error in a traditional semaphore, btw it's an error
			// according to our logic
			CWDebugLog("Timed Sem Post Timeout");
			return CWErrorRaise(CW_ERROR_GENERAL, "Nobody is Waiting on this Sem");
		} else if(errno == EINTR) {
			timeout.tv_sec = 2;
			timeout.tv_usec = 0;
			continue;
		}
		CWErrorRaiseSystemError(CW_ERROR_GENERAL);
	}
	
	CWDebugLog("Timed Sem Post After Select");
	
	while(read((*semPtr)[1], &dummy, 1) < 0) {
		if(errno == EINTR) continue;
		CWErrorRaiseSystemError(CW_ERROR_GENERAL);
	}
	
	// send ack
	while(send((*semPtr)[1], &dummy, 1, 0) < 0) {
		if(errno == EINTR) continue;
		CWErrorRaiseSystemError(CW_ERROR_SENDING);
	}
	
	CWDebugLog("End of Sem Post");
	
	return CW_TRUE;
#endif
}


// wrappers for pthread_key_*()
CWBool CWThreadCreateSpecific(CWThreadSpecific *specPtr, void (*destructor)(void *)) {
	if(specPtr == NULL) return CW_FALSE;  // NULL destructor is allowed

	if(pthread_key_create(specPtr, destructor) != 0) {
		CWDebugLog("Error pthread key create");
		return CW_FALSE;
	}
	
	return CW_TRUE;
}

void CWThreadDestroySpecific(CWThreadSpecific *specPtr) {
	if(specPtr == NULL) return;
	pthread_key_delete(*specPtr);
}

void *CWThreadGetSpecific(CWThreadSpecific *specPtr) {
	if(specPtr == NULL) return NULL;
	return pthread_getspecific(*specPtr);
}

CWBool CWThreadSetSpecific(CWThreadSpecific *specPtr, void *valPtr) {
	if(specPtr == NULL || valPtr == NULL) return CW_FALSE;

	switch(pthread_setspecific(*specPtr, valPtr)) {
		case 0: // success
			break;
		case ENOMEM:
			return CW_FALSE;
		default:
			return CW_FALSE;
	}
	
	return CW_TRUE;
}

// terminate the calling thread
void CWExitThread() {
	printf("\n*** Exit Thread ***\n");

	pthread_exit((void *) 0);
}
Пример #5
0
// perform wait on a semaphore
CWBool CWThreadSemWait(CWThreadSem *semPtr) {
#ifdef CW_USE_NAMED_SEMAPHORES
	if(semPtr == NULL || semPtr->semPtr == NULL) return CWErrorRaise(CW_ERROR_WRONG_ARG, NULL);
#else
	if(semPtr == NULL) return CWErrorRaise(CW_ERROR_WRONG_ARG, NULL);
#endif

	//CWDebugLog("Sem Wait");
	
#ifdef CW_USE_NAMED_SEMAPHORES
	while(sem_wait(semPtr->semPtr) < 0 ) {
#else
	while(sem_wait(semPtr) < 0 ) {
#endif
		if(errno == EINTR) continue;
		else {
			CWErrorRaiseSystemError(CW_ERROR_GENERAL);
		}
	}
	
	return CW_TRUE;
}

// perform post on a semaphore
CWBool CWThreadSemPost(CWThreadSem *semPtr) {
#ifdef CW_USE_NAMED_SEMAPHORES
	if(semPtr == NULL || semPtr->semPtr == NULL) return CWErrorRaise(CW_ERROR_WRONG_ARG, NULL);
#else
	if(semPtr == NULL) return CWErrorRaise(CW_ERROR_WRONG_ARG, NULL);
#endif

#ifdef CW_USE_NAMED_SEMAPHORES
	if(sem_post(semPtr->semPtr) < 0 ) {
#else
	if(sem_post(semPtr) < 0 ) {
#endif
		CWErrorRaiseSystemError(CW_ERROR_GENERAL);
	}
	
	return CW_TRUE;
}

// get the value of a semaphore
CWBool CWThreadSemGetValue(CWThreadSem *semPtr, int *valuePtr) {
#ifdef CW_USE_NAMED_SEMAPHORES
	if(valuePtr == NULL || semPtr == NULL || semPtr->semPtr == NULL) return CWErrorRaise(CW_ERROR_WRONG_ARG, NULL);
#else
	if(valuePtr == NULL || semPtr == NULL) return CWErrorRaise(CW_ERROR_WRONG_ARG, NULL);
#endif

#ifdef CW_USE_NAMED_SEMAPHORES
	if(sem_getvalue(semPtr->semPtr, valuePtr) < 0) { // note: broken on Mac OS X? Btw we don't need it
		CWErrorRaiseSystemError(CW_ERROR_GENERAL);
	}
#else
	if(sem_getvalue(semPtr, valuePtr) < 0) {
		CWErrorRaiseSystemError(CW_ERROR_GENERAL);
	}
#endif
	if(*valuePtr < 0 ) {
		*valuePtr = 0;
	}
	
	return CW_TRUE;
}


__inline__ sem_t *CWThreadGetSemT(CWThreadSem *semPtr) {
	#ifdef CW_USE_NAMED_SEMAPHORES
		return (semPtr->semPtr);		
	#else		
		return semPtr;	
	#endif
}


// creates a semaphore that can be used with CWThreadTimedSemWait(). This type of semaphore
// is different from CWThreadSemaphore to support platforms that don't have sem_timedwait() (e.g. Mac OS X)
CWBool CWThreadCreateTimedSem(CWThreadTimedSem *semPtr, int value) {
#ifdef HAVE_SEM_TIMEDWAIT
	return CWThreadCreateSem(semPtr, value);
#else
	// if we don't have sem_timedwait(), the timed semaphore is a pair of unix domain sockets.
	// We write a dummy packet on a socket (client) when we want to post, and select() with timer on the other socket
	// when we want to wait. 
	struct sockaddr_un serverAddr, clientAddr;
	int i;
	
	if(semPtr == NULL) return CWErrorRaise(CW_ERROR_WRONG_ARG, NULL);
	
	if((((*semPtr)[0] = socket(AF_LOCAL, SOCK_DGRAM, 0)) < 0) ||
		(((*semPtr)[1] = socket(AF_LOCAL, SOCK_DGRAM, 0)) < 0)) { // create a pair of datagram unix domain socket
		close((*semPtr)[0]);
		CWErrorRaiseSystemError(CW_ERROR_CREATING);
	}
	
	CW_ZERO_MEMORY(&serverAddr, sizeof(serverAddr));
	serverAddr.sun_family = AF_LOCAL;
	if(tmpnam((char*) &(serverAddr.sun_path)) == NULL) {
		CWErrorRaiseSystemError(CW_ERROR_CREATING);
	}
	
	CW_ZERO_MEMORY(&clientAddr, sizeof(clientAddr));
	clientAddr.sun_family = AF_LOCAL;
	if(tmpnam((char*) &(clientAddr.sun_path)) == NULL) {
		CWErrorRaiseSystemError(CW_ERROR_CREATING);
	}
	
	if(	(bind((*semPtr)[0], (struct sockaddr*) &serverAddr, sizeof(serverAddr)) < 0) ||
		(bind((*semPtr)[1], (struct sockaddr*) &clientAddr, sizeof(clientAddr)) < 0) ||
		(connect((*semPtr)[1], (struct sockaddr*) &serverAddr, sizeof(serverAddr)) < 0) || // connect each socket to the other
		(connect((*semPtr)[0], (struct sockaddr*) &clientAddr, sizeof(clientAddr)) < 0)
	) {
		close((*semPtr)[0]);
		close((*semPtr)[1]);
		CWErrorRaiseSystemError(CW_ERROR_CREATING);
	}
	
	for(i = 0; i < value; i++) {
		if(!CWThreadTimedSemPost(semPtr)) return CW_FALSE;
	}
	
	return CW_TRUE;
#endif
}

// CW_TRUE if the semaphore has zero value, CW_FALSE otherwise
CWBool CWThreadTimedSemIsZero(CWThreadTimedSem *semPtr) {
#ifdef HAVE_SEM_TIMEDWAIT
	int value;
	if(!CWThreadSemGetValue(semPtr, &value)) return CW_FALSE;
	
	return (value==0) ? CW_TRUE : CW_FALSE;
#else
	fd_set fset;
	int r;
	struct timeval timeout;
	
	if(semPtr == NULL) return CW_FALSE;

	FD_ZERO(&fset);
	FD_SET((*semPtr)[0], &fset);
	FD_SET((*semPtr)[1], &fset);
	
	timeout.tv_sec = 0; // poll
	timeout.tv_usec = 0;
	
	while((r=select(max((*semPtr)[1], (*semPtr)[0])+1, &fset, NULL, NULL, &timeout)) < 0) {
		if(errno == EINTR) {
			timeout.tv_sec = 0;
			timeout.tv_usec = 0;
			continue;
		}
		CWErrorRaiseSystemError(CW_ERROR_GENERAL);
	}
	
	return (r==0) ? CW_TRUE : CW_FALSE;
#endif
}

CWBool CWThreadTimedSemSetValue(CWThreadTimedSem *semPtr, int value) {
#ifdef HAVE_SEM_TIMEDWAIT
	// note: we can implement this, but our implemntation does't really need it in case
	// of a system semaphore. This is useful for our Unix Domain Socket Hack
	return CW_TRUE;
	//return CWErrorRaise(CW_ERROR_NEED_RESOURCE, "Operation Not Supported");
#else
	fd_set fset;
	int r, i;
	struct timeval timeout;
	
	if(semPtr == NULL) return CW_FALSE;

	FD_ZERO(&fset);
	FD_SET((*semPtr)[0], &fset);
	FD_SET((*semPtr)[1], &fset);
	
	timeout.tv_sec = 0; // poll
	timeout.tv_usec = 0;
	
	// first, remove all the pending packets
	CW_REPEAT_FOREVER {
		char dummy;
		while((r=select(max((*semPtr)[1], (*semPtr)[0])+1, &fset, NULL, NULL, &timeout)) < 0) {
			if(errno == EINTR) {
				timeout.tv_sec = 0;
				timeout.tv_usec = 0;
				continue;
			}
			CWErrorRaiseSystemError(CW_ERROR_GENERAL);
		}
		
		if(r == 0) break;
		
		if(FD_ISSET((*semPtr)[0], &fset)) {
			while(read((*semPtr)[0], &dummy, 1) < 0) {
				if(errno == EINTR) continue;
				CWErrorRaiseSystemError(CW_ERROR_GENERAL);
			}
		}
		
		if(FD_ISSET((*semPtr)[1], &fset)) {
			while(read((*semPtr)[1], &dummy, 1) < 0) {
				if(errno == EINTR) continue;
				CWErrorRaiseSystemError(CW_ERROR_GENERAL);
			}
		}
	}
	
	// second, send n packets, where n is the value we want to set for the semaphore
	for(i = 0; i < value; i++) {
		if(!CWThreadTimedSemPost(semPtr)) return CW_FALSE;
	}
	
	return CW_TRUE;
#endif
}

void CWThreadDestroyTimedSem(CWThreadTimedSem *semPtr) {
#ifdef HAVE_SEM_TIMEDWAIT
	CWThreadDestroySem(semPtr);
#else
	if(semPtr == NULL) return;
	close((*semPtr)[0]);
	close((*semPtr)[1]);
#endif
}
Пример #6
0
CWBool CWParseSettingsFile()
{
	char line[CW_BUFFER_SIZE];

	gSettingsFile = fopen(gCWSettingsFileName, "rb");
	if (gSettingsFile == NULL) {
		CWErrorRaiseSystemError(CW_ERROR_GENERAL);
	}

	while (CWGetCommand(gSettingsFile, line, sizeof(line)) == CW_TRUE) {
		char *startTag = NULL;
		char *endTag = NULL;
		char *Value = NULL;

		if ((startTag = strchr(line, '<')) == NULL)
			continue;
		startTag++;

		if ((endTag = strchr(startTag, '>')) == NULL)
			continue;
		*endTag++ = '\0';

		Value = ltrim(endTag);

		if (!strcmp(startTag, "IF_NAME")) {
			if (!(gInterfaceName = ralloc_strdup(NULL, Value)))
				 return CWErrorRaise(CW_ERROR_OUT_OF_MEMORY, NULL);
			CWLog(": %s", gInterfaceName);
		}
		else if (!strcmp(startTag, "WTP_ETH_IF_NAME")) {
			if (!(gEthInterfaceName = ralloc_strdup(NULL, Value)))
				 return CWErrorRaise(CW_ERROR_OUT_OF_MEMORY, NULL);
			CWLog(": %s", gEthInterfaceName);
		}
		else if (!strcmp(startTag, "RADIO_0_IF_NAME")) {
			if (!(gRadioInterfaceName_0 = ralloc_strdup(NULL, Value)))
				 return CWErrorRaise(CW_ERROR_OUT_OF_MEMORY, NULL);
			CWLog(": %s", gRadioInterfaceName_0);
		}
		else if (!strcmp(startTag, "BASE_MAC_IF_NAME")) {
			if (!(gBaseMACInterfaceName = ralloc_strdup(NULL, Value)))
				 return CWErrorRaise(CW_ERROR_OUT_OF_MEMORY, NULL);
			CWLog(": %s", gBaseMACInterfaceName);
		}
		else if (!strcmp(startTag, "BOARD_REVISION_NO")) {
			gBoardReversionNo = atoi(Value);
			CWLog(": %d", gBoardReversionNo);
		}
		else if (!strcmp(startTag, "WTP_HOSTAPD_PORT")) {
			gHostapd_port = atoi(Value);
			CWLog(": %d", gHostapd_port);
		}
		else if (!strcmp(startTag, "WTP_HOSTAPD_UNIX_PATH")) {
			if (!(gHostapd_unix_path = ralloc_strdup(NULL, Value)))
				 return CWErrorRaise(CW_ERROR_OUT_OF_MEMORY, NULL);
			CWLog(": %s", gHostapd_unix_path);
		}
		else if (!strcmp(startTag, "WTP_MODEL_NUM")) {
			if (!(gWtpModelNumber = ralloc_strdup(NULL, Value)))
				 return CWErrorRaise(CW_ERROR_OUT_OF_MEMORY, NULL);
			CWLog(": %s", gWtpModelNumber);
		}
		else if (!strcmp(startTag, "WTP_SERIAL_NUM")) {
			if (!(gWtpSerialNumber = ralloc_strdup(NULL, Value)))
				 return CWErrorRaise(CW_ERROR_OUT_OF_MEMORY, NULL);
			CWLog(": %s", gWtpSerialNumber);
		}
		else if (!strcmp(startTag, "WTP_HARDWARE_VERSION")) {
			if (!(gWtpHardwareVersion = ralloc_strdup(NULL, Value)))
				 return CWErrorRaise(CW_ERROR_OUT_OF_MEMORY, NULL);
			CWLog(": %s", gWtpHardwareVersion);
		}
		else if (!strcmp(startTag, "WTP_ACTIVE_SOFTWARE_VERSION")) {
			if (!(gWtpActiveSoftwareVersion = ralloc_strdup(NULL, Value)))
				 return CWErrorRaise(CW_ERROR_OUT_OF_MEMORY, NULL);
			CWLog(": %s", gWtpActiveSoftwareVersion);
		}
		else if (!strcmp(startTag, "WTP_BOOT_VERSION")) {
			if (!(gWtpBootVersion = ralloc_strdup(NULL, Value)))
				 return CWErrorRaise(CW_ERROR_OUT_OF_MEMORY, NULL);
			CWLog(": %s", gWtpBootVersion);
		}
		else
			CWLog(": unknown Tag: %s = %s", startTag, Value);

	}
	return CW_TRUE;
}
Пример #7
0
CWBool CWParseSettingsFile()
{
	char line[CW_BUFFER_SIZE];

	gSettingsFile = fopen(gCWSettingsFileName, "rb");
	if (gSettingsFile == NULL) {
		CWErrorRaiseSystemError(CW_ERROR_GENERAL);
	}

	if (!(gDefaultQosValues = ralloc_array(NULL, WTPQosValues, NUM_QOS_PROFILES)))
		return CWErrorRaise(CW_ERROR_OUT_OF_MEMORY, NULL);

	while (CWGetCommand(gSettingsFile, line, sizeof(line)) == CW_TRUE) {
		char *startTag = NULL;
		char *endTag = NULL;

		if ((startTag = strchr(line, '<')) == NULL)
			continue;

		if ((endTag = strchr(line, '>')) == NULL)
			continue;

		if (!strncmp(startTag + 1, "CWMIN_VOICE", endTag - startTag - 1)) {
			int value = atoi(endTag + 1);

			if (value == 0)
				value = CWMIN_DEFAULT;
			gDefaultQosValues[VOICE_QUEUE_INDEX].cwMin = value;
			CWDebugLog("CWMIN_VOICE: %d", gDefaultQosValues[VOICE_QUEUE_INDEX].cwMin);
			continue;
		}
		if (!strncmp(startTag + 1, "CWMAX_VOICE", endTag - startTag - 1)) {
			int value = atoi(endTag + 1);

			if (value == 0)
				value = CWMAX_DEFAULT;
			gDefaultQosValues[VOICE_QUEUE_INDEX].cwMax = value;
			CWDebugLog("CWMAX_VOICE: %d", gDefaultQosValues[VOICE_QUEUE_INDEX].cwMax);
			continue;
		}
		if (!strncmp(startTag + 1, "AIFS_VOICE", endTag - startTag - 1)) {
			int value = atoi(endTag + 1);

			if (value == 0)
				value = AIFS_DEFAULT;
			gDefaultQosValues[VOICE_QUEUE_INDEX].AIFS = value;
			CWDebugLog("AIFS_VOICE: %d", gDefaultQosValues[VOICE_QUEUE_INDEX].AIFS);
			continue;
		}

		if (!strncmp(startTag + 1, "CWMIN_VIDEO", endTag - startTag - 1)) {
			int value = atoi(endTag + 1);

			if (value == 0)
				value = CWMIN_DEFAULT;
			gDefaultQosValues[VIDEO_QUEUE_INDEX].cwMin = value;
			CWDebugLog("CWMIN_VIDEO: %d", gDefaultQosValues[VIDEO_QUEUE_INDEX].cwMin);
			continue;
		}
		if (!strncmp(startTag + 1, "CWMAX_VIDEO", endTag - startTag - 1)) {
			int value = atoi(endTag + 1);

			if (value == 0)
				value = CWMAX_DEFAULT;
			gDefaultQosValues[VIDEO_QUEUE_INDEX].cwMax = value;
			CWDebugLog("CWMAX_VIDEO: %d", gDefaultQosValues[VIDEO_QUEUE_INDEX].cwMax);
			continue;
		}
		if (!strncmp(startTag + 1, "AIFS_VIDEO", endTag - startTag - 1)) {
			int value = atoi(endTag + 1);

			if (value == 0)
				value = AIFS_DEFAULT;
			gDefaultQosValues[VIDEO_QUEUE_INDEX].AIFS = value;
			CWDebugLog("AIFS_VIDEO: %d", gDefaultQosValues[VIDEO_QUEUE_INDEX].AIFS);
			continue;
		}

		if (!strncmp(startTag + 1, "CWMIN_BEST_EFFORT", endTag - startTag - 1)) {
			int value = atoi(endTag + 1);

			if (value == 0)
				value = CWMIN_DEFAULT;
			gDefaultQosValues[BESTEFFORT_QUEUE_INDEX].cwMin = value;
			CWDebugLog("CWMIN_BEST_EFFORT: %d", gDefaultQosValues[BESTEFFORT_QUEUE_INDEX].cwMin);
			continue;
		}
		if (!strncmp(startTag + 1, "CWMAX_BEST_EFFORT", endTag - startTag - 1)) {
			int value = atoi(endTag + 1);

			if (value == 0)
				value = CWMAX_DEFAULT;
			gDefaultQosValues[BESTEFFORT_QUEUE_INDEX].cwMax = value;
			CWDebugLog("CWMAX_BEST_EFFORT: %d", gDefaultQosValues[BESTEFFORT_QUEUE_INDEX].cwMax);
			continue;
		}
		if (!strncmp(startTag + 1, "AIFS_BEST_EFFORT", endTag - startTag - 1)) {
			int value = atoi(endTag + 1);

			if (value == 0)
				value = AIFS_DEFAULT;
			gDefaultQosValues[BESTEFFORT_QUEUE_INDEX].AIFS = value;
			CWDebugLog("AIFS_BEST_EFFORT: %d", gDefaultQosValues[BESTEFFORT_QUEUE_INDEX].AIFS);
			continue;
		}

		if (!strncmp(startTag + 1, "CWMIN_BACKGROUND", endTag - startTag - 1)) {
			int value = atoi(endTag + 1);

			if (value == 0)
				value = CWMIN_DEFAULT;
			gDefaultQosValues[BACKGROUND_QUEUE_INDEX].cwMin = value;
			CWDebugLog("CWMIN_BACKGROUND: %d", gDefaultQosValues[BACKGROUND_QUEUE_INDEX].cwMin);
			continue;
		}
		if (!strncmp(startTag + 1, "CWMAX_BACKGROUND", endTag - startTag - 1)) {
			int value = atoi(endTag + 1);

			if (value == 0)
				value = CWMAX_DEFAULT;
			gDefaultQosValues[BACKGROUND_QUEUE_INDEX].cwMax = value;
			CWDebugLog("CWMAX_BACKGROUND: %d", gDefaultQosValues[BACKGROUND_QUEUE_INDEX].cwMax);
			continue;
		}
		if (!strncmp(startTag + 1, "AIFS_BACKGROUND", endTag - startTag - 1)) {
			int value = atoi(endTag + 1);

			if (value == 0)
				value = AIFS_DEFAULT;
			gDefaultQosValues[BACKGROUND_QUEUE_INDEX].AIFS = value;
			CWDebugLog("AIFS_BACKGROUND: %d", gDefaultQosValues[BACKGROUND_QUEUE_INDEX].AIFS);
			continue;
		}
		if (!strncmp(startTag + 1, "AC_HOSTAPD_PORT", endTag - startTag - 1)) {

			gHostapd_port = atoi(endTag + 1);

			CWDebugLog("Hostapd Port connection: %d", gHostapd_port);
			continue;
		}
		if (!strncmp(startTag + 1, "AC_HOSTAPD_UNIX_PATH", endTag - startTag - 1)) {
			char *startValue = NULL;
			char *endValue = NULL;
			int offset = 0;

			CWExtractValue(endTag, &startValue, &endValue, &offset);

			if (!((gHostapd_unix_path = ralloc_strndup(NULL, startValue, offset))))
				return CWErrorRaise(CW_ERROR_OUT_OF_MEMORY, NULL);

			CWDebugLog("Hostapd Unix Domain Path: %s", gHostapd_unix_path);
			continue;

		}
	}
	return CW_TRUE;
}