⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmd9118.c

📁 SMSC NET controller 9218 driver software
💻 C
📖 第 1 页 / 共 5 页
字号:
	server=(struct sockaddr *)&server4;





	printf("Starting server at port %d\n",portNumber);


	server_control = socket(server->sa_family,SOCK_STREAM,0);


	if(server_control==INVALID_SOCKET) 


	{


		printf("Error creating the socket\n");


		exit(1);


	}


	if(setsockopt(server_control,


		SOL_SOCKET,


		SO_REUSEADDR,


		(char *)&on,


		sizeof(on))==SOCKET_ERROR)


	{


		printf("Error: SO_REUSEADDR\n");


		exit(1);


	}


	if(bind(server_control,server,sockaddr_len)==SOCKET_ERROR)


	{


		printf("Error binding the socket\n");


		exit(1);


	}


	if(listen(server_control,5)==SOCKET_ERROR)


	{


		printf("Error listening\n");


		exit(1);


	}


	switch(fork()) {


	case -1:


		printf("Error on fork\n");


		exit(1);


	case 0:


		fclose(stdin);


		fclose(stderr);


		setsid();


		for(;;)


		{


			if((server_sock=accept(server_control,


					&peeraddr,


					&sockaddr_len)) == INVALID_SOCKET)


			{


				printf("Error accept failed\n");


				exit(1);


			}


			switch(fork()) {


			case -1:


				//something went wrong


				exit(1);


			case 0:


				//we are the child process


				close(server_control);


				process_requests(commandData);


				close(server_sock);


				exit(0);


				break;


			default:


				//we are the parent process


				close(server_sock);


				break;


			}


		}





		break;


	default:


		exit(0);


	}


}





bool ReceiveFlowParams(SOCKET sock,PFLOW_PARAMS flowParams) 


{


	bool result=false;


	if(SendULong(sock,COMMAND_GET_FLOW_PARAMS)) {


		unsigned long data=0;


		if(!ReceiveULong(sock,&data)) goto DONE;


		if(data) {


			if(!ReceiveULong(sock,&data)) goto DONE;


			flowParams->MeasuredMaxThroughput=data;


			if(!ReceiveULong(sock,&data)) goto DONE;


			flowParams->MeasuredMaxPacketCount=data;


			if(!ReceiveULong(sock,&data)) goto DONE;


			flowParams->MaxThroughput=data;


			if(!ReceiveULong(sock,&data)) goto DONE;


			flowParams->MaxPacketCount=data;


			if(!ReceiveULong(sock,&data)) goto DONE;


			flowParams->PacketCost=data;


			if(!ReceiveULong(sock,&data)) goto DONE;


			flowParams->BurstPeriod=data;


			if(!ReceiveULong(sock,&data)) goto DONE;


			flowParams->MaxWorkLoad=data;


			if(!ReceiveULong(sock,&data)) goto DONE;


			flowParams->IntDeas=data;


			result=true;


		}


	}


DONE:


	return result;


}





bool SendFlowParams(SOCKET sock,PFLOW_PARAMS flowParams)


{


	bool result=false;


	unsigned long timeout=100;


	unsigned long data=0;


AGAIN:


	SendULong(sock,COMMAND_SET_FLOW_PARAMS);


	SendULong(sock,flowParams->MeasuredMaxThroughput);


	SendULong(sock,flowParams->MeasuredMaxPacketCount);


	SendULong(sock,flowParams->MaxThroughput);


	SendULong(sock,flowParams->MaxPacketCount);


	SendULong(sock,flowParams->PacketCost);


	SendULong(sock,flowParams->BurstPeriod);


	SendULong(sock,flowParams->MaxWorkLoad);


	SendULong(sock,flowParams->IntDeas);


	if(ReceiveULong(sock,&data)) {


		if(data) {


			result=true;


		} else {


			//If flow control was active this command will fail


			//  therefore wait and try again later.


			if(timeout>0) {


				timeout--;


				sleep(5);


				goto AGAIN;


			}


		}


	}


	return result;


}





void DisplayFlowParams(PFLOW_PARAMS flowParams) 


{


	printf("Flow Control Parameters\n");


	printf("  MaxThroughput          = 0x%08lX\n",flowParams->MaxThroughput);


	printf("  MaxPacketCount         = 0x%08lX\n",flowParams->MaxPacketCount);


	printf("  PacketCost             = 0x%08lX\n",flowParams->PacketCost);


	printf("  BurstPeriod            = 0x%08lX\n",flowParams->BurstPeriod);


	printf("  IntDeas                = 0x%08lX\n",flowParams->IntDeas);


}





unsigned long ReadThroughput(char * fileName)


{


	unsigned long result=0;


	bool clearFlag=true;


	FILE * filePtr=NULL;


	filePtr=fopen(fileName,"r");


	if(filePtr!=NULL) {


		char ch=0;


		while(fread(&ch,1,1,filePtr)!=0) {


			switch(ch) {


			case '0':case '1':case '2':case '3':case '4':





			case '5':case '6':case '7':case '8':case '9':


				if(clearFlag) {


					result=0;


					clearFlag=false;


				}


				result*=10;


				result+=(unsigned long)(ch-'0');


				break;


			case '.':


				break;


			default:


				clearFlag=true;


				break;


			}


		}


		fclose(filePtr);


	} else {


		printf("ReadThroughput: unable to open file\n");


	}


	return result;


}





void RunTuner(const char *hostName,unsigned short portNum)


{


	SOCKET controlSocket=INVALID_SOCKET;


	struct sockaddr_in server;


    unsigned int addr;


	char command[128];


	char outputFile[]="npout.txt";


	FLOW_PARAMS flowParams;


	FLOW_PARAMS origParams;


	FLOW_PARAMS bestParams;


	unsigned long bestMeasurement=0;


	unsigned long currentSetting=0;


	unsigned long currentMeasurement=0;


	unsigned long tempLow=0;


	unsigned long tempHigh=0;


	int salen;


	memset((char *)&server,0,sizeof(server));





	if(portNum==0) {


		portNum=DEFAULT_PORT_NUMBER;


	}


	server.sin_port=htons(portNum);


	if((addr=inet_addr(hostName))==0xFFFFFFFFUL) {


		printf("Invalid: hostName==\"%s\"",hostName);


		printf("   must be in IP form\n");


		return;


	} else {


		server.sin_addr.s_addr=addr;


		server.sin_family=AF_INET;


	}


	salen=sizeof(server);





	controlSocket=socket(AF_INET,SOCK_STREAM,0);


	if(controlSocket==INVALID_SOCKET) {


		printf("error creating control socket\n");


		return;


	}


	if(connect(controlSocket,


		(struct sockaddr *)&server,


		salen) == INVALID_SOCKET)


	{


		printf("failed to connect to %s:%d\n",hostName,portNum);


		goto DONE;


	}





	if(!ReceiveFlowParams(controlSocket,&origParams)) goto FAILED;


	memcpy(&bestParams,&origParams,sizeof(FLOW_PARAMS));


	bestParams.MeasuredMaxThroughput=0;


	bestParams.MeasuredMaxPacketCount=0;


	bestParams.MaxThroughput=0;


	bestParams.MaxPacketCount=0;


	bestParams.BurstPeriod=100;


	bestParams.MaxWorkLoad=0;


	bestParams.IntDeas=0;


	memcpy(&flowParams,&bestParams,sizeof(FLOW_PARAMS));





	printf("Entire tuning process will take about one hour.\n");


	printf("TUNING IntDeas\n");


	sprintf(command,"./netperf -H%s > %s",hostName,outputFile);


	bestMeasurement=0;


	for(currentSetting=0;currentSetting<80;currentSetting++) {


		flowParams.IntDeas=currentSetting;


		if(!SendFlowParams(controlSocket,&flowParams)) {


			printf("Failed to send new setting: IntDeas=%ld\n",currentSetting);


			goto FAILED;


		}


		if(system(command)==0) {


			currentMeasurement=ReadThroughput(outputFile);


			if(currentMeasurement>bestMeasurement) {


				bestMeasurement=currentMeasurement;


				bestParams.IntDeas=currentSetting;


			}


		} else {


			printf("Failed system command: \"%s\"\n",command);


			goto FAILED;


		}


		printf("IntDeas = %ld, Throughput = %ld\n",currentSetting,currentMeasurement);


	}


	printf("Best: IntDeas = %ld, Throughput = %ld\n",bestParams.IntDeas,bestMeasurement);


	flowParams.IntDeas=bestParams.IntDeas;


	if(!SendFlowParams(controlSocket,&flowParams)) {


		goto FAILED;


	}


	//getting the FlowParams back will make sure the measurements are clear.


	if(!ReceiveFlowParams(controlSocket,&flowParams)) goto FAILED;


	if(flowParams.IntDeas!=bestParams.IntDeas) {


		printf("new setting did not stick\n");


		goto FAILED;


	}


	printf("Measuring Max Throughput, and Max Packet Count\n");


	if(system(command)!=0) goto FAILED;


	if(system(command)!=0) goto FAILED;


	if(system(command)!=0) goto FAILED;


	if(!ReceiveFlowParams(controlSocket,&flowParams)) goto FAILED;


	bestParams.MeasuredMaxThroughput=flowParams.MeasuredMaxThroughput;


	bestParams.MeasuredMaxPacketCount=flowParams.MeasuredMaxPacketCount;


	bestParams.MaxThroughput=bestParams.MeasuredMaxThroughput;


	bestParams.MaxPacketCount=bestParams.MeasuredMaxPacketCount;


	bestParams.PacketCost=0;


	bestParams.MaxWorkLoad=0xFFFFFFFFUL;


	bestParams.BurstPeriod=100;


	memcpy(&flowParams,&bestParams,sizeof(FLOW_PARAMS));





	printf("TUNING Burst Period\n");


	sprintf(command,"./netperf -H%s -tUDP_STREAM -l10 -- -m1472 > %s",


		hostName,outputFile);


	bestMeasurement=0;


	for(currentSetting=10;currentSetting<120;currentSetting++) {


		flowParams.BurstPeriod=currentSetting;


		if(!SendFlowParams(controlSocket,&flowParams)) {


			printf("Failed to send new setting: BurstPeriod=%ld\n",currentSetting);


			goto FAILED;


		}


		if(system(command)==0) {


			currentMeasurement=ReadThroughput(outputFile);


			if(currentMeasurement>bestMeasurement) {


				bestMeasurement=currentMeasurement;


				bestParams.BurstPeriod=currentSetting;


			}


		} else {


			printf("Failed system command: \"%s\"\n",command);


			goto FAILED;


		}


		printf("BurstPeriod = %ld, Throughput = %ld\n",


			currentSetting,currentMeasurement);


	}


	printf("Best: BurstPeriod = %ld, Throughput = %ld\n",


		bestParams.BurstPeriod,bestMeasurement); 


	flowParams.BurstPeriod=bestParams.BurstPeriod;





	printf("TUNING PacketCost\n");


	sprintf(command,"./netperf -H%s -tUDP_STREAM -l10 -- -m16 > %s",


		hostName,outputFile);


	bestMeasurement=0;


	for(currentSetting=0;currentSetting<500;currentSetting+=10) {


		flowParams.PacketCost=currentSetting;


		if(!SendFlowParams(controlSocket, &flowParams)) {


			printf("Failed to send new setting: PacketCost=%ld\n",currentSetting);


			goto FAILED;


		}


		if(system(command)==0) {


			currentMeasurement=ReadThroughput(outputFile);


			if(currentMeasurement>bestMeasurement) {


				bestMeasurement=currentMeasurement;


				bestParams.PacketCost=currentSetting;


			}


		} else {


			printf("Failed system command: \"%s\"\n",command);


			goto FAILED;


		}


		printf("PacketCost = %ld, Throughput = %ld\n",


			currentSetting,currentMeasurement);


	}


	bestMeasurement=0;


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -