可以了解并学习Uboot的tftp流程

 int tftp_download(char *filename, ulong msec_max, int cnt_max, ulong addr)

{

...

TftpRRQ     Ti   meoutMSecs = msec_max;   //100

TftpRRQ  TI meoutCountMax = cnt_max;  //0

se     te   nv("netretry", "no");

load_addr = addr;             //下载到内存的地址

copy_filename(BootFile, filename, sizeof(BootFile));

size = NetLoop(TFTP);

if(size < 0)

return ERROR;

else

flush_cache(addr,size);

...

}

int NetLoop(proto_t protocol)

{

...

switch (protocol)
{

case TFTP:
TftpStart();
break;

case DHCP:
BootpTry = 0;
NetOurIP = 0;
DhcpRequest();
break;
case BOOTP:

BootpTry = 0;
NetOurIP = 0;
BootpRequest ();
break;

case RARP:
RarpTry = 0;
NetOurIP = 0;
RarpRequest ();
break;
case     PI   NG:
PingStart();
break;
case NFS:
NfsStart();
break;
case CDP:
CDPStart();
break;
case NETCONS:
NcStart();
break;
case SNTP:
SntpStart();
break;
case DNS:
DnsStart();
break;

}

...

}

void TftpStart (void)

{

...

//设置参数

NetSet  TI meout (Tftp  TI meoutMSecs * CFG_HZ, Tftp  TI meout);
NetSetHandler (TftpHandler);

...

//发送

TftpSend ();

...

}

static void TftpSend (void)

{

...

//容错

//开始组包

pkt = NetTxPacket + NetEthHd     rS   ize() + 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 *)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;
m     emc   py((char *)pkt, "tsize\0000\0", 8);
pkt += 8;
if(TftpState == STATE_WRQ)
pkt += sprintf((char *)pkt,"blksize%c%d%c", 0,TftpBlkSizeOption,0);
else
pkt += sprintf((char *)pkt,"blksize%c%d%c", 0,TftpBlkSizeOption,0);
if (!ProhibitMcast && (Bitmap=malloc(Mapsize)) && eth_get_dev()->mcast)
{
free(Bitmap);
Bitmap=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:

...

}

//发送

NetSendUDPPacket(NetServerEther, TftpServerIP, TftpServerPort, TftpOurPort, len);

}

int NetSendUDPPacket(uchar *ether, I     Pad   dr_t dest, int dport, int sport, int len)

{

//容错:目标IP

//容错:ether 发ARP

if (memcmp(ether, NetEtherNullAddr, 6) == 0)

{

NetArpW     ai   tPacketIP = dest;
NetArpWaitPacketMAC = ether;

pkt = NetArpWaitTxPacket;
pkt += 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;
NetArpWaitTimerStart = get_timer(0);
ArpRequest();
return 1;

}

//容错:time 发ARP

if (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 *)NetTxPacket + (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);开始转向各个网卡驱动的发送函数。



可以了解并学习Uboot的tftp流程_设计制作_嵌入式技术
76
170
0
69

相关资讯

  1. 1、51岁王祖贤被网友偶遇,虎背熊腰被吐槽,粉丝:别再打扰她了!3187
  2. 2、秋瓷炫产下儿子后身体状况欠佳,于晓光:详细病因有待确诊!4247
  3. 3、板车哥父爱感动观众丁俊晖熊乃瑾主动联系捐款3628
  4. 4、《斗破苍穹》“神仙姐姐”李若彤饰萧炎母亲,气场十足却早早下线3004
  5. 5、投资2.6亿票房2亿,李安也无奈,好莱坞大导演沦为票房毒药3587
  6. 6、反杀《复联4》,《阿凡达》重新成为全球票房冠军611
  7. 7、4版“雷震子”的扮演者,李家声经典向佐靠特效,而他造型太前卫716
  8. 8、你的城市还缺电影院吗?4513
  9. 9、《周末宅影院》25期:渣男,想说爱你不容易4898
  10. 10、《如懿传》帝后反目误会解除,如懿为何还要烧掉自己的画像?1057
全部评论(0)
我也有话说
0
收藏
点赞
顶部