《可以了解并学习Uboot的tftp流程.doc》由会员分享,可在线阅读,更多相关《可以了解并学习Uboot的tftp流程.doc(4页珍藏版)》请在三一文库上搜索。
1、可以了解并学习Uboot的tftp流程int tftp_download(char *filename, ulong msec_max, int cnt_max, ulong addr).TftpRRQTimeoutMSecs = msec_max;/100TftpRRQTImeoutCountMax = cnt_max;/0setenv(netretry, no);load_addr = addr;/下载到内存的地址copy_filename(BootFile, filename, sizeof(BootFile);size = NetLoop(TFTP);if(size PING:Ping
2、Start();break;case NFS:NfsStart();break;case CDP:CDPStart();break;case NETCONS:NcStart();break;case SNTP:SntpStart();break;case DNS:DnsStart();break;.voidTftpStart (void)./设置参数NetSetTImeout (TftpTImeoutMSecs * CFG_HZ, TftpTImeout);NetSetHandler (TftpHandler);./发送TftpSend ();.static voidTftpSend (voi
3、d)./容错/开始组包pkt = NetTxPacket + NetEthHdrSize() + IP_HDR_SIZE;/针对各种状态组包switch (TftpState)case STATE_RRQ:xp = pkt;s = (ushort *)pkt;if(TftpState = STATE_WRQ)*s+ = htons(TFTP_WRQ);else*s+ = htons(TFTP_RRQ);pkt = (uchar *)s;strcpy (char *)pkt, tftp_filename);pkt += strlen(tftp_filename) + 1;strcpy (char
4、 *)pkt, octet);pkt += 5 /*strlen(octet)*/ + 1;strcpy (char *)pkt, timeout);pkt += 7 /*strlen(timeout)*/ + 1;sprintf(char *)pkt, %lu, TftpTimeoutMSecs / 1000);pkt += strlen(char *)pkt) + 1;memcpy(char *)pkt, tsize00000, 8);pkt += 8;if(TftpState = STATE_WRQ)pkt += sprintf(char *)pkt,blksize%c%d%c,0,Tf
5、tpBlkSizeOption,0);elsepkt += sprintf(char *)pkt,blksize%c%d%c,0,TftpBlkSizeOption,0);if (!ProhibitMcastBitmap=NULL;pkt += sprintf(char *)pkt,multicast%c%c,0,0);len = pkt - xp;break;case STATE_WRQ:.case STATE_OACK:.case STATE_DATA:.case STATE_TOO_LARGE:.case STATE_BAD_MAGIC:.case STATE_ACK:./发送NetSe
6、ndUDPPacket(NetServerEther, TftpServerIP, TftpServerPort, TftpOurPort, len);intNetSendUDPPacket(uchar *ether, IPaddr_t dest, int dport, int sport, int len)/容错:目标IP/容错:ether 发ARPif (memcmp(ether, NetEtherNullAddr, 6) = 0)NetArpWaitPacketIP = dest;NetArpWaitPacketMAC = ether;pkt = NetArpWaitTxPacket;p
7、kt += NetSetEther (pkt, NetArpWaitPacketMAC, PROT_IP);NetSetIP (pkt, dest, dport, sport, len);memcpy(pkt + IP_HDR_SIZE, (uchar *)NetTxPacket + (pkt - (uchar *)NetArpWaitTxPacket) + IP_HDR_SIZE, len);NetArpWaitTxPacketSize = (pkt - NetArpWaitTxPacket) + IP_HDR_SIZE + len;NetArpWaitTry = 1;NetArpWaitT
8、imerStart = get_timer(0);ArpRequest();return 1;/容错:time发ARPif (times = 10000)times = 0;NetArpWaitPacketIP = dest;NetArpWaitPacketMAC = ether;pkt = NetArpWaitTxPacket;pkt += NetSetEther(pkt, NetArpWaitPacketMAC, PROT_IP);NetSetIP(pkt, dest, dport, sport, len);memcpy(pkt + IP_HDR_SIZE, (uchar *)NetTxP
9、acket +(pkt - (uchar *)NetArpWaitTxPacket) +IP_HDR_SIZE, len);NetArpWaitTxPacketSize = (pkt - NetArpWaitTxPacket) +IP_HDR_SIZE + len;NetArpWaitTry = 1;NetArpWaitTimerStart = get_timer(0);ArpRequest();/组包发送times+;pkt = (uchar *)NetTxPacket;pkt += NetSetEther (pkt, ether, PROT_IP);NetSetIP (pkt, dest, dport, sport, len);(void) eth_send(NetTxPacket, (pkt - NetTxPacket) + IP_HDR_SIZE + len);.至此,(void) eth_send(NetTxPacket, (pkt - NetTxPacket) + IP_HDR_SIZE + len);开始转向各个网卡驱动的发送函数。