mirror of
https://github.com/u-boot/u-boot.git
synced 2024-12-12 14:23:50 +08:00
d2986567b2
The NFS protocol uses file handles to refer to file or directory.
In NFSv2 file handles have a fixed size of 32 bytes.
In NFSv3 file handles have a variable length up to 64 bytes. This is
also true for the MOUNT protocol. [1]
When the NFSv3 server replies with a file handle length > 32 bytes, U-Boot
only copies 32 bytes of that file handle and the next LOOKUP Call fails:
BIOS> nfs ${loadaddr} 192.168.1.51:/nfsroot/opos93dev-br/boot/Image
Using ethernet@428a0000 device
File transfer via NFS from server 192.168.1.51; our IP address is 192.168.1.133
Filename '/nfsroot/opos93dev-br/boot/Image'.
Load address: 0x80400000
Loading: *** ERROR: File lookup fail
done
BIOS>
Looking at this transfer in Wireshark, we can see that the server
replies with the following file handle:
length: 36
[hash (CRC-32): 0x230ac67b]
FileHandle: 0100070101005e000000000091763911f87c449fa73c298552db19ba0c9f60002980cfd2
and U-Boot sends the following file handle in the next LOOKUP Call:
length: 32
[hash (CRC-32): 0x6314131b]
FileHandle: 000000240100070101005e000000000091763911f87c449fa73c298552db19ba
Fix this by using a variable length file handle for dirfh.
[1] https://www.rfc-editor.org/rfc/rfc1813.html#page-106
Fixes:
|
||
---|---|---|
.. | ||
arp.c | ||
arp.h | ||
bootp.c | ||
bootp.h | ||
cdp.c | ||
cdp.h | ||
dhcpv6.c | ||
dhcpv6.h | ||
dns.c | ||
dns.h | ||
dsa-uclass.c | ||
eth_bootdev.c | ||
eth_common.c | ||
eth_internal.h | ||
eth-uclass.c | ||
fastboot_tcp.c | ||
fastboot_udp.c | ||
Kconfig | ||
link_local.c | ||
link_local.h | ||
Makefile | ||
mdio-mux-uclass.c | ||
mdio-uclass.c | ||
ndisc.c | ||
net6.c | ||
net_rand.h | ||
net.c | ||
nfs.c | ||
nfs.h | ||
pcap.c | ||
ping6.c | ||
ping.c | ||
ping.h | ||
rarp.c | ||
rarp.h | ||
sntp.c | ||
tcp.c | ||
tftp.c | ||
udp.c | ||
wget.c | ||
wol.c | ||
wol.h |