X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=net%2Ftftp.c;h=59a8ebb3cf339b3c40ff24846c13406e5dc0b9a4;hb=aa42cb71fa28a4f2c8b8cc0e691151f4ba19dbd9;hp=961fdd1a4552197796cabf99fd45595b5f34f0ae;hpb=1fb7cd498e6a5a7e14e1ac5518262a35ed293f3e;p=u-boot diff --git a/net/tftp.c b/net/tftp.c index 961fdd1a45..59a8ebb3cf 100644 --- a/net/tftp.c +++ b/net/tftp.c @@ -11,6 +11,9 @@ #include #include "tftp.h" #include "bootp.h" +#ifdef CONFIG_SYS_DIRECT_FLASH_TFTP +#include +#endif /* Well known TFTP port # */ #define WELL_KNOWN_PORT 69 @@ -112,10 +115,6 @@ static char default_filename[DEFAULT_NAME_LEN]; static char tftp_filename[MAX_LEN]; -#ifdef CONFIG_SYS_DIRECT_FLASH_TFTP -extern flash_info_t flash_info[]; -#endif - /* 512 is poor choice for ethernet, MTU is typically 1500. * Minus eth.hdrs thats 1468. Can get 2x better throughput with * almost-MTU block sizes. At least try... fall back to 512 if need be. @@ -137,7 +136,6 @@ static unsigned *Bitmap; static int PrevBitmapHole, Mapsize = MTFTP_BITMAPSIZE; static uchar ProhibitMcast, MasterClient; static uchar Multicast; -extern IPaddr_t Mcast_addr; static int Mcast_port; static ulong TftpEndingBlock; /* can get 'last' block before done..*/ @@ -157,8 +155,8 @@ mcast_cleanup(void) #endif /* CONFIG_MCAST_TFTP */ -static __inline__ void -store_block(unsigned block, uchar *src, unsigned len) +static inline void +store_block(int block, uchar *src, unsigned len) { ulong offset = block * TftpBlkSize + TftpBlockWrapOffset; ulong newsize = offset + len; @@ -179,11 +177,10 @@ store_block(unsigned block, uchar *src, unsigned len) rc = flash_write((char *)src, (ulong)(load_addr+offset), len); if (rc) { flash_perror(rc); - NetState = NETLOOP_FAIL; + net_set_state(NETLOOP_FAIL); return; } - } - else + } else #endif /* CONFIG_SYS_DIRECT_FLASH_TFTP */ { (void)memcpy((void *)(load_addr + offset), src, len); @@ -198,7 +195,7 @@ store_block(unsigned block, uchar *src, unsigned len) } /* Clear our state ready for a new transfer */ -void new_transfer(void) +static void new_transfer(void) { TftpLastBlock = 0; TftpBlockWrap = 0; @@ -303,16 +300,16 @@ static void tftp_complete(void) } #endif puts("\ndone\n"); - NetState = NETLOOP_SUCCESS; + net_set_state(NETLOOP_SUCCESS); } static void TftpSend(void) { uchar *pkt; - volatile uchar *xp; - int len = 0; - volatile ushort *s; + uchar *xp; + int len = 0; + ushort *s; #ifdef CONFIG_MCAST_TFTP /* Multicast TFTP.. non-MasterClients do not ACK data. */ @@ -325,15 +322,19 @@ TftpSend(void) * We will always be sending some sort of packet, so * cobble together the packet headers now. */ - pkt = (uchar *)(NetTxPacket + NetEthHdrSize() + IP_HDR_SIZE); + pkt = NetTxPacket + NetEthHdrSize() + IP_UDP_HDR_SIZE; switch (TftpState) { case STATE_SEND_RRQ: case STATE_SEND_WRQ: xp = pkt; s = (ushort *)pkt; +#ifdef CONFIG_CMD_TFTPPUT *s++ = htons(TftpState == STATE_SEND_RRQ ? TFTP_RRQ : TFTP_WRQ); +#else + *s++ = htons(TFTP_RRQ); +#endif pkt = (uchar *)s; strcpy((char *)pkt, tftp_filename); pkt += strlen(tftp_filename) + 1; @@ -353,12 +354,14 @@ TftpSend(void) 0, TftpBlkSizeOption, 0); #ifdef CONFIG_MCAST_TFTP /* Check all preconditions before even trying the option */ - if (!ProhibitMcast - && (Bitmap = malloc(Mapsize)) - && eth_get_dev()->mcast) { - free(Bitmap); - Bitmap = NULL; - pkt += sprintf((char *)pkt, "multicast%c%c", 0, 0); + if (!ProhibitMcast) { + Bitmap = malloc(Mapsize); + if (Bitmap && eth_get_dev()->mcast) { + free(Bitmap); + Bitmap = NULL; + pkt += sprintf((char *)pkt, "multicast%c%c", + 0, 0); + } } #endif /* CONFIG_MCAST_TFTP */ len = pkt - xp; @@ -421,7 +424,7 @@ TftpSend(void) TftpOurPort, len); } - +#ifdef CONFIG_CMD_TFTPPUT static void icmp_handler(unsigned type, unsigned code, unsigned dest, IPaddr_t sip, unsigned src, uchar *pkt, unsigned len) { @@ -430,6 +433,7 @@ static void icmp_handler(unsigned type, unsigned code, unsigned dest, restart("TFTP server died"); } } +#endif static void TftpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src, @@ -623,10 +627,9 @@ TftpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src, if (MasterClient && (TftpBlock >= TftpEndingBlock)) { puts("\nMulticast tftp done\n"); mcast_cleanup(); - NetState = NETLOOP_SUCCESS; + net_set_state(NETLOOP_SUCCESS); } - } - else + } else #endif if (len < TftpBlkSize) tftp_complete(); @@ -641,7 +644,7 @@ TftpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src, case TFTP_ERR_ACCESS_DENIED: puts("Not retrying...\n"); eth_halt(); - NetState = NETLOOP_FAIL; + net_set_state(NETLOOP_FAIL); break; case TFTP_ERR_UNDEFINED: case TFTP_ERR_DISK_FULL: @@ -703,7 +706,7 @@ void TftpStart(enum proto_t protocol) TftpRemoteIP = NetServerIP; if (BootFile[0] == '\0') { - sprintf(default_filename, "%02lX%02lX%02lX%02lX.img", + sprintf(default_filename, "%02X%02X%02X%02X.img", NetOurIP & 0xFF, (NetOurIP >> 8) & 0xFF, (NetOurIP >> 16) & 0xFF, @@ -729,7 +732,12 @@ void TftpStart(enum proto_t protocol) printf("Using %s device\n", eth_get_name()); printf("TFTP %s server %pI4; our IP address is %pI4", - protocol == TFTPPUT ? "to" : "from", &TftpRemoteIP, &NetOurIP); +#ifdef CONFIG_CMD_TFTPPUT + protocol == TFTPPUT ? "to" : "from", +#else + "from", +#endif + &TftpRemoteIP, &NetOurIP); /* Check if we need to send across this subnet */ if (NetOurGatewayIP && NetOurSubnetMask) { @@ -770,9 +778,10 @@ void TftpStart(enum proto_t protocol) TftpTimeoutCountMax = TftpRRQTimeoutCountMax; NetSetTimeout(TftpTimeoutMSecs, TftpTimeout); - NetSetHandler(TftpHandler); + net_set_udp_handler(TftpHandler); +#ifdef CONFIG_CMD_TFTPPUT net_set_icmp_handler(icmp_handler); - +#endif TftpRemotePort = WELL_KNOWN_PORT; TftpTimeoutCount = 0; /* Use a pseudo-random port unless a specific port is set */ @@ -831,7 +840,7 @@ TftpStartServer(void) #endif TftpState = STATE_RECV_WRQ; - NetSetHandler(TftpHandler); + net_set_udp_handler(TftpHandler); } #endif /* CONFIG_CMD_TFTPSRV */