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

📄 cmd9118.c

📁 基于pxa270的linux下smsc9118的网卡驱动源码
💻 C
📖 第 1 页 / 共 5 页
字号:
		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);

	}

⌨️ 快捷键说明

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