mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-19 21:51:31 +00:00
TFTP: net/tftp.c: add server mode receive
Signed-off-by: Luca Ceresoli <luca.ceresoli@comelit.it> Cc: Wolfgang Denk <wd@denx.de> Acked-by: Detlev Zundel <dzu@denx.de>
This commit is contained in:
parent
e3fb0abe2b
commit
e59e35620a
2 changed files with 64 additions and 4 deletions
60
net/tftp.c
60
net/tftp.c
|
@ -2,6 +2,8 @@
|
||||||
* Copyright 1994, 1995, 2000 Neil Russell.
|
* Copyright 1994, 1995, 2000 Neil Russell.
|
||||||
* (See License)
|
* (See License)
|
||||||
* Copyright 2000, 2001 DENX Software Engineering, Wolfgang Denk, wd@denx.de
|
* Copyright 2000, 2001 DENX Software Engineering, Wolfgang Denk, wd@denx.de
|
||||||
|
* Copyright 2011 Comelit Group SpA,
|
||||||
|
* Luca Ceresoli <luca.ceresoli@comelit.it>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
|
@ -85,6 +87,7 @@ static short TftpNumchars;
|
||||||
#define STATE_TOO_LARGE 3
|
#define STATE_TOO_LARGE 3
|
||||||
#define STATE_BAD_MAGIC 4
|
#define STATE_BAD_MAGIC 4
|
||||||
#define STATE_OACK 5
|
#define STATE_OACK 5
|
||||||
|
#define STATE_RECV_WRQ 6
|
||||||
|
|
||||||
/* default TFTP block size */
|
/* default TFTP block size */
|
||||||
#define TFTP_BLOCK_SIZE 512
|
#define TFTP_BLOCK_SIZE 512
|
||||||
|
@ -257,6 +260,8 @@ TftpSend(void)
|
||||||
(Mapsize*8), 0);
|
(Mapsize*8), 0);
|
||||||
/*..falling..*/
|
/*..falling..*/
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
case STATE_RECV_WRQ:
|
||||||
case STATE_DATA:
|
case STATE_DATA:
|
||||||
xp = pkt;
|
xp = pkt;
|
||||||
s = (ushort *)pkt;
|
s = (ushort *)pkt;
|
||||||
|
@ -309,7 +314,8 @@ TftpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
|
||||||
#endif
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (TftpState != STATE_SEND_RRQ && src != TftpRemotePort)
|
if (TftpState != STATE_SEND_RRQ && src != TftpRemotePort &&
|
||||||
|
TftpState != STATE_RECV_WRQ)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (len < 2)
|
if (len < 2)
|
||||||
|
@ -322,12 +328,24 @@ TftpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
|
||||||
switch (ntohs(proto)) {
|
switch (ntohs(proto)) {
|
||||||
|
|
||||||
case TFTP_RRQ:
|
case TFTP_RRQ:
|
||||||
case TFTP_WRQ:
|
|
||||||
case TFTP_ACK:
|
case TFTP_ACK:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
#ifdef CONFIG_CMD_TFTPSRV
|
||||||
|
case TFTP_WRQ:
|
||||||
|
debug("Got WRQ\n");
|
||||||
|
TftpRemoteIP = sip;
|
||||||
|
TftpRemotePort = src;
|
||||||
|
TftpOurPort = 1024 + (get_timer(0) % 3072);
|
||||||
|
TftpLastBlock = 0;
|
||||||
|
TftpBlockWrap = 0;
|
||||||
|
TftpBlockWrapOffset = 0;
|
||||||
|
TftpSend(); /* Send ACK(0) */
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
case TFTP_OACK:
|
case TFTP_OACK:
|
||||||
debug("Got OACK: %s %s\n",
|
debug("Got OACK: %s %s\n",
|
||||||
pkt,
|
pkt,
|
||||||
|
@ -402,7 +420,8 @@ TftpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
|
||||||
if (TftpState == STATE_SEND_RRQ)
|
if (TftpState == STATE_SEND_RRQ)
|
||||||
debug("Server did not acknowledge timeout option!\n");
|
debug("Server did not acknowledge timeout option!\n");
|
||||||
|
|
||||||
if (TftpState == STATE_SEND_RRQ || TftpState == STATE_OACK) {
|
if (TftpState == STATE_SEND_RRQ || TftpState == STATE_OACK ||
|
||||||
|
TftpState == STATE_RECV_WRQ) {
|
||||||
/* first block received */
|
/* first block received */
|
||||||
TftpState = STATE_DATA;
|
TftpState = STATE_DATA;
|
||||||
TftpRemotePort = src;
|
TftpRemotePort = src;
|
||||||
|
@ -537,6 +556,7 @@ TftpTimeout(void)
|
||||||
} else {
|
} else {
|
||||||
puts("T ");
|
puts("T ");
|
||||||
NetSetTimeout(TftpTimeoutMSecs, TftpTimeout);
|
NetSetTimeout(TftpTimeoutMSecs, TftpTimeout);
|
||||||
|
if (TftpState != STATE_RECV_WRQ)
|
||||||
TftpSend();
|
TftpSend();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -661,6 +681,40 @@ TftpStart(void)
|
||||||
TftpSend();
|
TftpSend();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_CMD_TFTPSRV
|
||||||
|
void
|
||||||
|
TftpStartServer(void)
|
||||||
|
{
|
||||||
|
tftp_filename[0] = 0;
|
||||||
|
|
||||||
|
#if defined(CONFIG_NET_MULTI)
|
||||||
|
printf("Using %s device\n", eth_get_name());
|
||||||
|
#endif
|
||||||
|
printf("Listening for TFTP transfer on %pI4\n", &NetOurIP);
|
||||||
|
printf("Load address: 0x%lx\n", load_addr);
|
||||||
|
|
||||||
|
puts("Loading: *\b");
|
||||||
|
|
||||||
|
TftpTimeoutCountMax = TIMEOUT_COUNT;
|
||||||
|
TftpTimeoutCount = 0;
|
||||||
|
TftpTimeoutMSecs = TIMEOUT;
|
||||||
|
NetSetTimeout(TftpTimeoutMSecs, TftpTimeout);
|
||||||
|
|
||||||
|
/* Revert TftpBlkSize to dflt */
|
||||||
|
TftpBlkSize = TFTP_BLOCK_SIZE;
|
||||||
|
TftpBlock = 0;
|
||||||
|
TftpOurPort = WELL_KNOWN_PORT;
|
||||||
|
|
||||||
|
#ifdef CONFIG_TFTP_TSIZE
|
||||||
|
TftpTsize = 0;
|
||||||
|
TftpNumchars = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
TftpState = STATE_RECV_WRQ;
|
||||||
|
NetSetHandler(TftpHandler);
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_CMD_TFTPSRV */
|
||||||
|
|
||||||
#ifdef CONFIG_MCAST_TFTP
|
#ifdef CONFIG_MCAST_TFTP
|
||||||
/* Credits: atftp project.
|
/* Credits: atftp project.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
* LiMon - BOOTP/TFTP.
|
* LiMon - BOOTP/TFTP.
|
||||||
*
|
*
|
||||||
* Copyright 1994, 1995, 2000 Neil Russell.
|
* Copyright 1994, 1995, 2000 Neil Russell.
|
||||||
|
* Copyright 2011 Comelit Group SpA
|
||||||
|
* Luca Ceresoli <luca.ceresoli@comelit.it>
|
||||||
* (See License)
|
* (See License)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -16,6 +18,10 @@
|
||||||
/* tftp.c */
|
/* tftp.c */
|
||||||
extern void TftpStart (void); /* Begin TFTP get */
|
extern void TftpStart (void); /* Begin TFTP get */
|
||||||
|
|
||||||
|
#ifdef CONFIG_CMD_TFTPSRV
|
||||||
|
extern void TftpStartServer(void); /* Wait for incoming TFTP put */
|
||||||
|
#endif
|
||||||
|
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
|
|
||||||
#endif /* __TFTP_H__ */
|
#endif /* __TFTP_H__ */
|
||||||
|
|
Loading…
Add table
Reference in a new issue