X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=net%2Fnfs.c;h=f2900149d4980919c94ed864160b78079cee4fbe;hb=055b12f2ffd7c34eea7e983a0588b24f2e69e0e3;hp=2363d61a33627e23cc0a757900e7cef8bb9dda17;hpb=11dadd547c08a3480ea153482e99c6ae70b73415;p=oweals%2Fu-boot.git diff --git a/net/nfs.c b/net/nfs.c index 2363d61a33..f2900149d4 100644 --- a/net/nfs.c +++ b/net/nfs.c @@ -31,19 +31,21 @@ /*#define NFS_DEBUG*/ -#if ((CONFIG_COMMANDS & CFG_CMD_NET) && (CONFIG_COMMANDS & CFG_CMD_NFS)) +#if defined(CONFIG_CMD_NET) && defined(CONFIG_CMD_NFS) #define HASHES_PER_LINE 65 /* Number of "loading" hashes per line */ -#define NFS_TIMEOUT 10 +#define NFS_RETRY_COUNT 30 +#define NFS_TIMEOUT 2000UL static int fs_mounted = 0; -static unsigned long rpc_id; +static unsigned long rpc_id = 0; static int nfs_offset = -1; static int nfs_len; static char dirfh[NFS_FHSIZE]; /* file handle of directory */ static char filefh[NFS_FHSIZE]; /* file handle of kernel image */ +static int NfsDownloadState; static IPaddr_t NfsServerIP; static int NfsSrvMountPort; static int NfsSrvNfsPort; @@ -63,14 +65,14 @@ static char *nfs_filename; static char *nfs_path; static char nfs_path_buff[2048]; -static __inline__ void +static __inline__ int store_block (uchar * src, unsigned offset, unsigned len) { ulong newsize = offset + len; -#ifdef CFG_DIRECT_FLASH_NFS +#ifdef CONFIG_SYS_DIRECT_FLASH_NFS int i, rc = 0; - for (i=0; i= flash_info[i].start[0]) { rc = 1; @@ -82,17 +84,17 @@ store_block (uchar * src, unsigned offset, unsigned len) rc = flash_write ((uchar *)src, (ulong)(load_addr+offset), len); if (rc) { flash_perror (rc); - NetState = NETLOOP_FAIL; - return; + return -1; } } else -#endif /* CFG_DIRECT_FLASH_NFS */ +#endif /* CONFIG_SYS_DIRECT_FLASH_NFS */ { (void)memcpy ((void *)(load_addr + offset), src, len); } if (NetBootFileXferSize < (offset+len)) NetBootFileXferSize = newsize; + return 0; } static char* @@ -122,17 +124,6 @@ dirname (char *path) return path; } -/************************************************************************** -RPC_INIT - set up the ID counter to something fairly random -**************************************************************************/ -static void -rpc_init (void) -{ - unsigned long t; - t=get_ticks(); - rpc_id = t ^ (t << 8) ^ (t << 16); -} - /************************************************************************** RPC_ADD_CREDENTIALS - Add RPC authentication/verifier entries **************************************************************************/ @@ -189,7 +180,7 @@ rpc_req (int rpc_prog, int rpc_proc, uint32_t *data, int datalen) int pktlen; int sport; - id = rpc_id++; + id = ++rpc_id; pkt.u.call.id = htonl(id); pkt.u.call.type = htonl(MSG_CALL); pkt.u.call.rpcvers = htonl(2); /* use RPC version 2 */ @@ -203,7 +194,7 @@ rpc_req (int rpc_prog, int rpc_proc, uint32_t *data, int datalen) pktlen = (char *)p + datalen*sizeof(uint32_t) - (char *)&pkt; - memcpy ((char *)NetTxPacket+ETHER_HDR_SIZE+IP_HDR_SIZE, (char *)&pkt, pktlen); + memcpy ((char *)NetTxPacket + NetEthHdrSize() + IP_HDR_SIZE, (char *)&pkt, pktlen); if (rpc_prog == PROG_PORTMAP) sport = SUNRPC_PORT; @@ -410,10 +401,13 @@ rpc_lookup_reply (int prog, uchar *pkt, unsigned len) printf ("%s\n", __FUNCTION__); #endif + if (ntohl(rpc_pkt.u.reply.id) != rpc_id) + return -1; + if (rpc_pkt.u.reply.rstatus || rpc_pkt.u.reply.verifier || - rpc_pkt.u.reply.astatus || rpc_pkt.u.reply.astatus) { + return -1; } switch (prog) { @@ -439,6 +433,9 @@ nfs_mount_reply (uchar *pkt, unsigned len) memcpy ((unsigned char *)&rpc_pkt, pkt, len); + if (ntohl(rpc_pkt.u.reply.id) != rpc_id) + return -1; + if (rpc_pkt.u.reply.rstatus || rpc_pkt.u.reply.verifier || rpc_pkt.u.reply.astatus || @@ -463,6 +460,9 @@ nfs_umountall_reply (uchar *pkt, unsigned len) memcpy ((unsigned char *)&rpc_pkt, pkt, len); + if (ntohl(rpc_pkt.u.reply.id) != rpc_id) + return -1; + if (rpc_pkt.u.reply.rstatus || rpc_pkt.u.reply.verifier || rpc_pkt.u.reply.astatus) { @@ -486,6 +486,9 @@ nfs_lookup_reply (uchar *pkt, unsigned len) memcpy ((unsigned char *)&rpc_pkt, pkt, len); + if (ntohl(rpc_pkt.u.reply.id) != rpc_id) + return -1; + if (rpc_pkt.u.reply.rstatus || rpc_pkt.u.reply.verifier || rpc_pkt.u.reply.astatus || @@ -510,6 +513,9 @@ nfs_readlink_reply (uchar *pkt, unsigned len) memcpy ((unsigned char *)&rpc_pkt, pkt, len); + if (ntohl(rpc_pkt.u.reply.id) != rpc_id) + return -1; + if (rpc_pkt.u.reply.rstatus || rpc_pkt.u.reply.verifier || rpc_pkt.u.reply.astatus || @@ -544,6 +550,9 @@ nfs_read_reply (uchar *pkt, unsigned len) memcpy ((uchar *)&rpc_pkt, pkt, sizeof(rpc_pkt.u.reply)); + if (ntohl(rpc_pkt.u.reply.id) != rpc_id) + return -1; + if (rpc_pkt.u.reply.rstatus || rpc_pkt.u.reply.verifier || rpc_pkt.u.reply.astatus || @@ -565,7 +574,8 @@ nfs_read_reply (uchar *pkt, unsigned len) } rlen = ntohl(rpc_pkt.u.reply.data[18]); - store_block ((uchar *)pkt+sizeof(rpc_pkt.u.reply), nfs_offset, rlen); + if ( store_block ((uchar *)pkt+sizeof(rpc_pkt.u.reply), nfs_offset, rlen) ) + return -9999; return rlen; } @@ -574,6 +584,18 @@ nfs_read_reply (uchar *pkt, unsigned len) Interfaces of U-BOOT **************************************************************************/ +static void +NfsTimeout (void) +{ + if ( NfsTimeoutCount++ < NFS_RETRY_COUNT ) { + NfsSend (); + return; + } + puts ("Timeout\n"); + NetState = NETLOOP_FAIL; + return; +} + static void NfsHandler (uchar *pkt, unsigned dest, unsigned src, unsigned len) { @@ -616,7 +638,7 @@ NfsHandler (uchar *pkt, unsigned dest, unsigned src, unsigned len) NetState = NETLOOP_FAIL; } else { puts ("\ndone\n"); - NetState = NETLOOP_SUCCESS; + NetState = NfsDownloadState; } break; @@ -652,6 +674,7 @@ NfsHandler (uchar *pkt, unsigned dest, unsigned src, unsigned len) case STATE_READ_REQ: rlen = nfs_read_reply (pkt, len); + NetSetTimeout (NFS_TIMEOUT, NfsTimeout); if (rlen > 0) { nfs_offset += rlen; NfsSend (); @@ -661,6 +684,7 @@ NfsHandler (uchar *pkt, unsigned dest, unsigned src, unsigned len) NfsState = STATE_READLINK_REQ; NfsSend (); } else { + if ( ! rlen ) NfsDownloadState = NETLOOP_SUCCESS; NfsState = STATE_UMOUNT_REQ; NfsSend (); } @@ -668,13 +692,6 @@ NfsHandler (uchar *pkt, unsigned dest, unsigned src, unsigned len) } } -static void -NfsTimeout (void) -{ - puts ("Timeout\n"); - NetState = NETLOOP_FAIL; - return; -} void NfsStart (void) @@ -682,6 +699,7 @@ NfsStart (void) #ifdef NFS_DEBUG printf ("%s\n", __FUNCTION__); #endif + NfsDownloadState = NETLOOP_FAIL; NfsServerIP = NetServerIP; nfs_path = (char *)nfs_path_buff; @@ -693,13 +711,11 @@ NfsStart (void) } if (BootFile[0] == '\0') { - IPaddr_t OurIP = ntohl (NetOurIP); - sprintf (default_filename, "/nfsroot/%02lX%02lX%02lX%02lX.img", - OurIP & 0xFF, - (OurIP >> 8) & 0xFF, - (OurIP >> 16) & 0xFF, - (OurIP >> 24) & 0xFF ); + NetOurIP & 0xFF, + (NetOurIP >> 8) & 0xFF, + (NetOurIP >> 16) & 0xFF, + (NetOurIP >> 24) & 0xFF ); strcpy (nfs_path, default_filename); printf ("*** Warning: no boot file name; using '%s'\n", @@ -738,24 +754,18 @@ NfsStart (void) print_IPaddr (NetOurGatewayIP) ; } } - putc ('\n'); - - printf ("Filename '%s/%s'.", nfs_path, nfs_filename); + printf ("\nFilename '%s/%s'.", nfs_path, nfs_filename); if (NetBootFileSize) { printf (" Size is 0x%x Bytes = ", NetBootFileSize<<9); print_size (NetBootFileSize<<9, ""); } - putc ('\n'); - - printf ("Load address: 0x%lx\n", load_addr); + printf ("\nLoad address: 0x%lx\n" + "Loading: *\b", load_addr); - printf ("Loading: *\b"); - - NetSetTimeout (NFS_TIMEOUT * CFG_HZ, NfsTimeout); + NetSetTimeout (NFS_TIMEOUT, NfsTimeout); NetSetHandler (NfsHandler); - rpc_init (); NfsTimeoutCount = 0; NfsState = STATE_PRCLOOKUP_PROG_MOUNT_REQ; @@ -769,4 +779,4 @@ NfsStart (void) NfsSend (); } -#endif /* CONFIG_COMMANDS & CFG_CMD_NFS */ +#endif