zoukankan      html  css  js  c++  java
  • uboot--tftp

    一、      概述

          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协议中各种包的结构:

     


    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 处理接收到的包。

     


    2.TFTP流程

    过程

  • 相关阅读:
    django 如何重用app
    vim常用命令
    linux find grep
    linux su su-的区别
    linux定时任务crontab
    linux shell的单行多行注释
    python字符串的截取,查找
    gdb调试
    python字符转化
    python读写文件
  • 原文地址:https://www.cnblogs.com/kernel-style/p/3305435.html
Copyright © 2011-2022 走看看