📄 tftp.c
字号:
/* * Copyright 1994, 1995, 2000 Neil Russell. * (See License) * Copyright 2000 DENX Software Engineering, Wolfgang Denk, wd@denx.de */#include <stdio.h>#include <string.h>#include "net.h"#include "tftp.h"#include "console.h"#include "drv_defs.h"/* * TFTP operations. */#define TFTP_RRQ 1#define TFTP_WRQ 2#define TFTP_DATA 3#define TFTP_ACK 4#define TFTP_ERROR 5#define STATE_RRQ 1#define STATE_DATA 2#define STATE_TOO_LARGE 3#define STATE_BAD_MAGIC 4static int tftp_data_offset; int tftpserver = 0;int tftprecvaddr;extern int processing;int do_flash (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);void tftp_wrq_ok(void){ char buf[ETHER_HDR_SIZE+IP_HDR_SIZE+4],*packet; IP_t iphead; tftp_data_offset = 0; packet = &buf[ETHER_HDR_SIZE+IP_HDR_SIZE]; *(packet) = (TFTP_ACK>>8)&0xff; *(packet+1) = (TFTP_ACK)&0xff; *(packet+2) = 0; *(packet+3) = 0; NetSetIP((char *)(&iphead), NetServerIP, NetServerPort, LOCAL_TFTP_PORT, 4); { char *src = (char *)(&iphead); char *des = &buf[ETHER_HDR_SIZE]; memcpy(des, src, IP_HDR_SIZE); } NetSetEther(&buf[0], NetServerEther, PROT_IP); NetSendPacket(&buf[0], ETHER_HDR_SIZE+IP_HDR_SIZE+4);}void tftp_recv_block(char *data, int len, unsigned short block){ char buf[ETHER_HDR_SIZE+IP_HDR_SIZE+4],*packet; char *src, *des; IP_t iphead; packet = &buf[ETHER_HDR_SIZE+IP_HDR_SIZE]; *(packet) = (TFTP_ACK>>8)&0xff; *(packet+1) = (TFTP_ACK)&0xff; *(packet+2) = (block>>8)&0xff;; *(packet+3) = (block)&0xff; NetSetIP((char *)(&iphead), NetServerIP, NetServerPort, LOCAL_TFTP_PORT, 4); src = (char *)(&iphead); des = &buf[ETHER_HDR_SIZE]; memcpy(des, src, IP_HDR_SIZE); NetSetEther(&buf[0], NetServerEther, PROT_IP); NetSendPacket(&buf[0], ETHER_HDR_SIZE+IP_HDR_SIZE+4); des = (char *)(TFTP_DATA_BASE + tftp_data_offset); tftp_data_offset += len; if (tftp_data_offset > 0x2000000) tftp_data_offset = 0; memcpy(des, data, len); if (len != 512 ) { printf("\nCompleted, total %d bytes are received.\n", tftp_data_offset); if (tftprecvaddr != TFTP_DATA_BASE){ if (tftprecvaddr >= FLASH_BASE){ char *argv[4] = { "flash","p","0x00000000","0x00000001" }; cmd_tbl_t *cmd = find_cmd("flash"); sprintf(argv[2],"0x%x",tftprecvaddr); sprintf(argv[3],"0x%x",tftp_data_offset); do_flash(cmd, 0, 4, argv); } else{ memcpy((char *)tftprecvaddr, (char *)TFTP_DATA_BASE, tftp_data_offset); } } processing = 0; } else { if (tftp_data_offset % 10240 == 0){ mputs("."); } }}void tftp_handle(volatile char * pkt, int len){ unsigned short opcode, block, *p16; if (tftpserver == 0) return; p16 = (unsigned short *)pkt; opcode = SWAP16(*p16); switch(opcode){ case TFTP_WRQ: tftp_wrq_ok(); printf("File [%s] ", (pkt+2)); break; case TFTP_DATA: p16 = (unsigned short *)(pkt+2); block = SWAP16(*p16); tftp_recv_block((char *)(pkt+4), len-4, block); default: break; }}void tftp_startserv(void){ tftpserver = 1;}void tftp_stopserv(void){ tftpserver = 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -