原创 U-boot中TFTP 解释

2011-7-5 16:13 2823 9 9 分类: 工程师职场
http://www.cnblogs.com/heaad/archive/2009/08/10/1542538.html

一、      概述

      U-boot中的TFTP用于发送较小的文件。下层使用UDP协议,发送使用UDP 69端口,每次发送的最大分组为512 Bytes。发送双方采用超时重传机制。数据传输模式为octet模式( 二进制模式 )。

    在U-boot中使用tftp功能可以使用如下命令:

            tftp  MemoryAddress  FileName

    其中MemoryAddress为放入文件的内存首地址,FileName为传送文件的文件名(文件需放在tftp默认目录下)。

二、      使用TFTP

使用TFTP传送文件的步骤: 

1 使用时已经初始化以下变量:

NetOurIP (本机IP地址,定义在Net.c文件)

NetServerIPTFTP服务器的IP地址,定义在Net.c文件)

BootFile (需要传送文件的文件名,定于在Tftp.c

NetOurGatewayIP (本机的网关地址)

NetOurSubnetMask (本机子网掩码)

2 调用TftpStart 函数开始文件传送。

三、      TFTP实现

(1)客户端状态

TFTP使用一个变量TftpState来描述TFTP客户端可能的5种状态:

状态

说明

STATE_RRQ

发出读取请求,正等待批准

STATE_DATA

正在接收数据

STATE_TOO_LARGE

文件太大

STATE_BAD_MAGIC

Bad magic number

STATE_OACK

收到OACK

(2)包类型 

使用TFTP传送的包分为6种类型:

类型

说明

TFTP_RRQ

请求读取文件

TFTP_WRQ

请求写文件

TFTP_DATA

数据包

TFTP_ACK

确认包

TFTP_ERROR

包含出错信息的包

TFTP_OACK

option acknowledge,当服务器超时未收到客户端的ACK帧时,主动发出一个OACK

(3)各种包结构 

TFTP协议中各种包的结构:

 

tftp1.jpg
1.TFTP协议中包结构


    具体到U-boot中客户端发送的各种包的结构:

RRQ(请求读的包的结构):

TFTP_RRQ(包的类型)

请求文件名

0

“octet”(传输模式)

0

“timeout”(超时重传机制)

0

TIMEOUT(超时重传等待时间)

 

ACK(确认帧)结构:

TFTP_ACK

确认的包的编号

(4)主要函数及作用 

U-boot中与tftp协议有关的文件有tftp.ctftp.h文件,主要函数包括:

 

static __inline__ void

store_block (unsigned block, uchar * src, unsigned len);

/* 根据预先设定的地址load_addr决定将首地址为src,长度为lenblock个数据块写入flash 或写入内存*/

 

static void

TftpSend (void) ;

/* 根据TftpState变量的不同值发送不同的 Tftp (使用UDP协议发送) */

 

static void

TftpHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len) ;

/* 处理收到的Tftp */

 

static void

TftpTimeout (void);

/* 超时处理函数 */

 

void

TftpStart (void);

/* 初始化各个需要的数据 然后开始发送TFTP读请求 */

 

(5) 流程 

TFTP总体流程:

首先客户端发出读写请求。如果服务器批准此请求,则打开连接,并第一个数据包。客户端收到数据包后发回确认,而服务器发出下一个数据包以前必须得到客户对上一个数据包的确认。如果数据包在传输过程中丢失,服务器方会在超时后重新传输最后一个未被确认的数据包。

 

发送的数据包一般为512字节,如果一个数据包小于 512 字节,则表示这个包是最后一个包,如果发送的数据正好是 512 的整数倍,发送完后再发一个空包。

客户端程序流程:

<1>客户端设定NetOurIP NetServerIPBootFile 变量的值。

<2>调用TftpStart函数,TftpStart函数完成如下的6步工作:

1BootFile为空,则使用默认文件名;否则使用BootFile为传送的文件名。

2比较客户端和服务器的子网地址,判断两者是否在同一个子网内。

3设定超时处理函数为TftpTimeout 

4设置处理接收到的TFTP包的函数为TftpHandler

5初始化服务器端口、本机端口、超时次数为0、初始状态为RRQ

6调用TftpSend函数发送TFTP读取请求。

   <3> TftpSend函数根据TftpState 发送不同的包,同时TftpHandler函数根据包的类型和当前客户端的状态(TftpState 处理接收到的包。

 

tftp2.jpg
2.TFTP流程


PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
9
关闭 站长推荐上一条 /3 下一条