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

📄 build_tftp.c

📁 裸板的tftp客户端
💻 C
字号:
#include "./include/build_tftp.h"#include "./include/myout.h"char FileName[]={"u-boot.bin"};char Prot[]={"octet"};static U8 	HostMac[], ClientMac[]={0x00,0x11,0x22,0x33,0x44,0x55} ;static U8 	HostIp[]={192,168,0,1}, ClientIp[]={192,168,0,111};static U16	HostPort=69, SrPort=0x8002;U16 check_sum(U16 *pwData,U32 nSize){	U32 nChksum=0;	while(nSize>1){		nChksum+=*pwData++;		nSize-=sizeof(U16);	}	if(nSize)		nChksum+=*(U8*)pwData;	nChksum=(nChksum>>16)+(nChksum&0xffff);	nChksum+=(nChksum>>16);	return (U16)(~nChksum);}inline void swap(U8 *a, U8 *b){	U8 tmpch;	tmpch=*a;	*a=*b;	*b=tmpch;}int build_tftp_packet(U8 *PacketPage, U8 *HMac, U16 HPort, U16 BlockNumber, U32 PacketType){	int i, j, totalLen=0, useLen=0, macLen=14, ipLen=20, vudpLen=12, udpLen=8, tmpInt;	U16 *tmpdata6;	//UseData	tmpInt=macLen+ipLen+vudpLen+udpLen;	if(PacketType == 1)			// file request packetpage	{		PacketPage[tmpInt]=0x00;		PacketPage[tmpInt+1]=0x01;		for(i=0;FileName[i]!='\0';i++)			PacketPage[2+tmpInt+i]=FileName[i];		for(j=0;Prot[j]!='\0';j++)			PacketPage[i+3+j+tmpInt]=Prot[j];		useLen=i+j+4;	}	else if(PacketType == 4)	{		PacketPage[tmpInt]=0x00;		PacketPage[tmpInt+1]=0x04;		tmpdata6=(U16 *)(PacketPage+tmpInt+2);		*tmpdata6=BlockNumber;		swap(&PacketPage[tmpInt+2], &PacketPage[tmpInt+3]);		useLen=4;	}	//MacHead build	for(i = 0; i < 6; i++)	{		if(1==PacketType){			HostMac[i]=PacketPage[i]=HMac[i];		}		else			PacketPage[i]=HostMac[i];		PacketPage[i+6]=ClientMac[i];	}	PacketPage[2*i]=0x08;	PacketPage[2*i+1]=0x00;	// IpHead build	totalLen=ipLen+udpLen+useLen;	PacketPage[macLen]= 5<<0|4<<4;		//Ip headLen & version	PacketPage[macLen+1]=0x00;		// tos	tmpdata6=(U16 *)(PacketPage+macLen+2);	*tmpdata6=useLen+udpLen+ipLen;		//totall len	swap(&PacketPage[macLen+2], &PacketPage[macLen+3]);	PacketPage[macLen+4]=0x0;			//unique identifier	PacketPage[macLen+5]=0x0;	PacketPage[macLen+6]=0x40;		// wFlags		PacketPage[macLen+7]=0x0;	PacketPage[macLen+8]=0x40;		// life cycle	PacketPage[macLen+9]=0x11;		// transmite type	tmpdata6 = (U16 *)(PacketPage+macLen+10);	*tmpdata6 = 0x00;				// checksum	for(i=0;i<4;i++)	{		PacketPage[macLen+12+i]=ClientIp[i];	//source ip		PacketPage[macLen+16+i]=HostIp[i];	//destination ip	}	tmpdata6 = (U16 *)(PacketPage+macLen+10);		//actual checksum	*tmpdata6 = check_sum((U16 *)(PacketPage+macLen), 20);	// VudpHead build	tmpInt=macLen+ipLen;	for(i=0;i<4;i++)	{		PacketPage[tmpInt+i]=ClientIp[i];	//source of Ip		PacketPage[tmpInt+4+i]=HostIp[i];	//destination of Ip	}	PacketPage[tmpInt+8]=0x0;			//zero	PacketPage[tmpInt+9]=0x11;	PacketPage[tmpInt+10]=0x00;			//bProto	PacketPage[tmpInt+11]=useLen+udpLen;		//wUdpLen	//UdpHead build	tmpInt=macLen+ipLen+vudpLen;	tmpdata6=(U16 *)(PacketPage+tmpInt);	*tmpdata6=SrPort;					//source of port	tmpdata6=(U16 *)(PacketPage+tmpInt+2);	if(1==BlockNumber)		HostPort=*tmpdata6=HPort;	else		*tmpdata6=HostPort;	tmpdata6=(U16 *)(PacketPage+tmpInt+4);	*tmpdata6=useLen+udpLen;			//udp len	PacketPage[tmpInt+6]=0x0;	PacketPage[tmpInt+7]=0x0;	tmpdata6 =(U16 *)(PacketPage+tmpInt+6);	//udp checksum	*tmpdata6 =0x00;	for(i=0;i<8;i+=2) 			//modify order	{		swap(&PacketPage[tmpInt+i], &PacketPage[tmpInt+i+1]);	}	*tmpdata6=check_sum((U16 *)(PacketPage+macLen+ipLen), useLen+udpLen+vudpLen);	//clear VudpHead	tmpInt = macLen+ipLen;	for(i=0;i<udpLen+useLen;i++)	{		PacketPage[tmpInt+i]=PacketPage[tmpInt+vudpLen+i];	}	for(i=0;i<vudpLen;i++)	{			PacketPage[tmpInt+udpLen+useLen+i]='\0';		}	return macLen+ipLen+udpLen+useLen;}

⌨️ 快捷键说明

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