> From: Laszlo Ersek [mailto:[email protected]] > Sent: Tuesday, September 29, 2015 5:52 PM > On 09/29/15 12:57, Sharma Bhupesh wrote: > > Thanks Laszlo for the very thorough description of the probable root- > cause. It helped a lot. > > > > One thing though, which makes me wonder if this is similar to a "Brand > > X USB3.0 mass storage drive doesn't work on my Brand Y USB host > > machine" case, as on this particular machine (also checked on a set of > co-located machines), the tftp server was able to work both with u-boot > Bootloader and Linux kernel for tftp based file transfer. > > > > So, while I understand this might be a tftp server version issue, do > > we need to fully check the explicit difference between the tftp > command/packet transfer sequence when done by uefi and say Linux? > > I think that the packet capture we've investigated until now is > sufficient to pinpoint the culprit. > > The difference in requirements between edk2 and other TFTP clients (eg. > Linux, u-boot etc) is that edk2 implements the EFI_MTFTP4_PROTOCOL > (defined in the UEFI spec). The GetInfo() member function of that > protocol places pretty high requirements on the server -- please consult > the UEFI spec. In particular the server needs to be an "MTFTPv4 server", > capable of sending "OACK", and -- as we can see it from the edk2 > implementation, and also the debugging thus far - that *requires* TFTP > option support in the server. > > If another TFTP client only needs RRQ without options, DATA, etc, like > (probably) many other TFTP clients do, then I guess less capable TFTP > servers can work as well. > > One possible improvement I can imagine for the UEFI spec (or, at least, > for the edk2 implementation) is to spell out exactly what RFCs the TFTP > server must support to be compliant. > > ... Actually, look at > "MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Impl.h": > > Mtftp4 Implementation, it supports the following RFCs: > RFC1350 - THE TFTP PROTOCOL (REVISION 2) > RFC2090 - TFTP Multicast Option > RFC2347 - TFTP Option Extension > RFC2348 - TFTP Blocksize Option > RFC2349 - TFTP Timeout Interval and Transfer Size Options > > The comment says "supports". Maybe it should say "requires" instead, or > distinguish supports / requires on an RFC-by-RFC basis.
I agree that a "requires" here would make more sense. Regards, Bhupesh > But, I think the above is a quite good list to verify TFTP servers > against. > > Thanks > Laszlo > > > > > Regards, > > Bhupesh > > > > > >> -----Original Message----- > >> From: edk2-devel [mailto:[email protected]] On Behalf > >> Of Leekha Shaveta > >> Sent: Tuesday, September 29, 2015 3:32 PM > >> To: Laszlo Ersek > >> Cc: [email protected]; Gary Ching-Pang Lin; Fu, Siyuan; Chris > >> Cuthbert > >> Subject: Re: [edk2] TFTP issue, Ping 1st packet reply missing > >> > >> Hi Laszlo, > >> > >> Many Thanks for your help !! > >> It actually worked well with latest tftp server (atftpd), so it > >> turned out to be a server issue (as you said rightly :) ) > >> > >> Some replies are inlined > >> > >> Thanks and Regards, > >> Shaveta > >> > >> > >> -----Original Message----- > >> From: Laszlo Ersek [mailto:[email protected]] > >> Sent: Monday, September 28, 2015 6:30 PM > >> To: Leekha Shaveta-B20052 <[email protected]> > >> Cc: [email protected] <[email protected]>; Fu, Siyuan > >> <[email protected]>; Chris Cuthbert <[email protected]>; Gary > >> Ching- Pang Lin <[email protected]> > >> Subject: Re: [edk2] TFTP issue, Ping 1st packet reply missing > >> > >> On 09/28/15 12:24, Leekha Shaveta wrote: > >>> Hi Laszlo, > >>> > >>> Please find the detailed "tcpdump" on my setup: > >>> > >>> test@boardfram-OptiPlex-790:/tftpboot$ sudo tcpdump -v -v -n -l -X > >>> -e -i eth0 > >>> tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture > >>> size > >>> 65535 bytes > >>> 21:39:42.028524 68:05:ca:04:d5:6a > 18:03:73:15:7b:12, ethertype > >>> IPv4 > >> (0x0800), length 63: (tos 0x0, ttl 64, id 54858, offset 0, flags > >> [none], proto UDP (17), length 49) > >>> 192.168.3.154.1051 > 192.168.3.221.69: [udp sum ok] 21 RRQ > "test" > >> octet tsize 0 > >>> 0x0000: 4500 0031 d64a 0000 4011 1baa c0a8 039a > >> E..1.J..@....... > >>> 0x0010: c0a8 03dd 041b 0045 001d d2e6 0001 7465 > >> .......E......te > >>> 0x0020: 7374 006f 6374 6574 0074 7369 7a65 0030 > >> st.octet.tsize.0 > >>> 0x0030: 00 . > >>> 21:39:42.030313 18:03:73:15:7b:12 > 68:05:ca:04:d5:6a, ethertype > >>> IPv4 > >> (0x0800), length 65: (tos 0x0, ttl 64, id 7770, offset 0, flags [DF], > >> proto UDP (17), length 51) > >>> 192.168.3.221.40480 > 192.168.3.154.1051: [udp sum ok] UDP, > >>> length > >> 23 > >>> 0x0000: 4500 0033 1e5a 4000 4011 9398 c0a8 03dd > >> E..3.Z@.@....... > >>> 0x0010: c0a8 039a 9e20 041b 001f 169a 0003 0001 > >> ................ > >>> 0x0020: 6969 6969 6964 6863 626a 7364 6320 7364 > >> iiiiidhcbjsdc.sd > >>> 0x0030: 6320 0a c.. > >>> 21:39:42.058922 68:05:ca:04:d5:6a > 18:03:73:15:7b:12, ethertype > >>> IPv4 > >> (0x0800), length 68: (tos 0x0, ttl 64, id 54859, offset 0, flags > >> [none], proto UDP (17), length 54) > >>> 192.168.3.154.1051 > 192.168.3.221.40480: [udp sum ok] UDP, > >>> length > >> 26 > >>> 0x0000: 4500 0036 d64b 0000 4011 1ba4 c0a8 039a > >> E..6.K..@....... > >>> 0x0010: c0a8 03dd 041b 9e20 0022 ed64 0005 0004 > >> .........".d.... > >>> 0x0020: 5573 6572 2061 626f 7274 6564 2064 6f77 > >> User.aborted.dow > >>> 0x0030: 6e6c 6f61 6400 nload. > >>> ^C > >>> 3 packets captured > >>> 3 packets received by filter > >>> 0 packets dropped by kernel > >>> > >>> > >>> Command I had run for tftp was: > >>> > >>> Shell> tftp 192.168.3.221 test t4 > >>> unicast promiscuous. > >>> PacketType 4 > >>> protocol 8 > >>> Src MAC Address: 18 3 73 15 7B 12 > >>> Dest MAC Address: 68 5 CA 4 D5 6A > >>> Failed to get the size of the file 'test' on 'eth0' - Protocol Error > >>> Shell> > >>> > >>> > >>> > >>> I have now compiled the code with latest ShellPkg and ran it. > >>> > >>> Does this log give any pointer, why Token state is getting "ABORTED" > >>> in > >> tftp? > >> > >> The reason I recommended the -X (more precisely, -l -X) options is > >> because the packets often contain ASCII strings that the source code > >> can be grepped for. (Clearly the source code that is responsible for > >> sending out that packet.) > >> > >> In this case, the 3rd packet (which is sent by edk2) contains "User > >> aborted download": > >> > >> $ git grep 'User aborted download' > >> > >> The one hit (restricting the results to IPv4) is in > >> "MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Rrq.c", function > >> Mtftp4RrqSaveBlock(). The documentation on that function is > >> > >> Deliver the received data block to the user, which can be saved in > the > >> user provide buffer or through the CheckPacket callback. > >> > >> The textual error message is passed by Mtftp4RrqSaveBlock() to > >> Mtftp4SendError(), and this branch depends on the > >> Token->CheckPacket() callback *failing*. Thus, we can say that the > >> Token->CheckPacket() function call rejects the 2nd packet. > >> > >> In addition, the Mtftp4RrqSaveBlock() function documents its own > >> EFI_ABORTED retval like this: > >> > >> The user tells to abort by return an error through CheckPacket > >> > >> [Shaveta] > >> I got to this point by putting some debug logs and it was getting > >> aborted from here only: > >> if (Token->CheckPacket != NULL) { > >> DEBUG((EFI_D_INFO, " Check packet from HERE: %r\n", Token- > >Status)); > >> Status = Token->CheckPacket (&Instance->Mtftp4, Token, (UINT16) > >> Len, Packet); > >> > >> if (EFI_ERROR (Status)) { > >> Mtftp4SendError ( > >> Instance, > >> EFI_MTFTP4_ERRORCODE_ILLEGAL_OPERATION, > >> (UINT8 *) "User aborted download" > >> ); > >> > >> return EFI_ABORTED; > >> } > >> } > >> > >> ... As far as I can see in this directory, EfiMtftp4GetInfo() > >> populates the CheckPacket function pointer with the address of > >> Mtftp4GetInfoCheckPacket(). So let's see what > >> Mtftp4GetInfoCheckPacket() > >> does: > >> > >> Apparently, this function *always* returns EFI_ABORTED (which in turn > >> always triggers the above branch in Mtftp4RrqSaveBlock()). However, > >> remember that it's only EfiMtftp4GetInfo() that sets up the > >> CheckPacket callback pointer like this. > >> > >> In addition, before returning EFI_ABORTED indiscriminately, > >> Mtftp4GetInfoCheckPacket() stores a status code in > >> ((MTFTP4_GETINFO_STATE *)Token->Context)->Status. > >> > >> Therefore, we can determine the following: when you use > >> Mtftp4RrqSaveBlock() as part of a "normal" download, the CheckPacket > >> callback ptr is NULL, and this doesn't happen. However, when you use > >> the same function as part of querying *metadata* of the remote file, > ie. > >> initiated from EfiMtftp4GetInfo(), then the callback function is > >> always set to Mtftp4GetInfoCheckPacket(), which will (a) abort the > >> transfer invariably after the first packet -- which is valid, we only > >> care about the metadata in the first packet --, and (b) it will store > >> a status code too in the context, "for later", ie. for the actual > >> download that is supposed to take place after the metadata have been > >> parsed on the edk2 side. > >> > >> And, in your case, this "actual" download doesn't seem to be > happening. > >> Why? > >> > >> [Shaveta] Read something similar: > >> Errors that are not really Errors. > >> TFTP is a file transfer protocol that does not have special > >> provisions for telling the client in advance the size of a file the > >> client is planning to retrieve. The client sometimes needs this > >> information for control or memory allocation purposes, then you will > >> see this kind of log > >> sequence: > >> > >> In such particular case: > >> > >> The client requests the say "abc" file. > >> The client quickly aborts the transfer, but it received the "abc" > >> file size from the first packet transmitted by the purposely stopped > transfer. > >> The client verifies the "abc" file size is within the expected values > >> and if everything is OK it requests a new transfer. > >> This time the transfer is completed. > >> > >> > >> > >> But I too was wondering that why Opcode that I am getting is "3" > >> which is incorrect, and why the actual download is not taking place. > >> So I got stuck :( > >> > >> Thanks for such a detailed explanation :) :) > >> > >> > >> > >> > >> > >> Well, in your UEFI shell log, I see "Protocol Error" -- in > >> Mtftp4GetInfoCheckPacket(), I see exactly one branch that does > >> > >> State->Status = EFI_PROTOCOL_ERROR; > >> > >> and that branch corresponds to > >> > >> NTOHS (Packet->OpCode) != EFI_MTFTP4_OPCODE_ERROR && > >> NTOHS (Packet->OpCode) != EFI_MTFTP4_OPCODE_OACK > >> > >> In other words, the TFTP server supposedly sends back an opcode, in > >> the 2nd packet, that is neither ERROR (5) nor OACK (6). > >> > >> For further analysis, we have to consult various RFCs: > >> > >> https://tools.ietf.org/html/rfc1350 -- "basic" TFTP > >> https://tools.ietf.org/html/rfc1782 -- TFTP Option Extension > >> https://tools.ietf.org/html/rfc2349 -- Transfer Size option > >> > >> Here's again the RRQ: > >> > >>> 192.168.3.154.1051 > 192.168.3.221.69: [udp sum ok] 21 RRQ > "test" > >> octet tsize 0 > >>> 0x0000: 4500 0031 d64a 0000 4011 1baa c0a8 039a > >> E..1.J..@....... > >>> 0x0010: c0a8 03dd 041b 0045 001d d2e6 0001 7465 > >>> .......E......te > >> ^ ^ ^ > >> | | | > >> IPv4 header ends here UDP hdr ends here | > >> OpCode = RRQ > >> > >>> 0x0020: 7374 006f 6374 6574 0074 7369 7a65 0030 > >>> st.octet.tsize.0 > >> ^ ^ ^ > >> | | | > >> filename ("test") ends here | | > >> | | > >> mode ("octet") ends here | > >> | > >> first TFTP option ("tsize") ends here > >> > >>> 0x0030: 00 . > >> ^ > >> | > >> first TFTP option value ("0") ends here > >> > >> So, in the first packet, edk2 composes a TFTP RRQ. The basic > >> structure is governed by RFC 1350. Then, it appends one option > >> (tsize=0). The general formatting for options is described in RFC > >> 1782; practically "append a sequence of NUL-terminated ASCII > >> strings". The actual option that edk2 appends is tsize\00\0, which is > described in RFC 2349. > >> > >> From RFC 2349, the meaning of tsize=0 is: > >> > >> In Read Request packets, a size of "0" is specified in the request > >> and the size of the file, in octets, is returned in the OACK. If > the > >> file is too large for the client to handle, it may abort the > transfer > >> with an Error packet (error code 3). [...] > >> > >> Meaning tsize=0 can be used to query the file size in advance. > >> > >> Now let's see how a TFTP server is allowed to answer to an RRQ that > >> has options (consult RFC 1782, section "Negotiation Protocol"): > >> > >> When the client appends options to the end of a Read Request > packet, > >> three possible responses may be returned by the server: > >> > >> OACK - acknowledge of Read Request and the options; > >> > >> DATA - acknowledge of Read Request, but not the options; > >> > >> ERROR - the request has been denied. > >> > >> Looking at the second packet: > >> > >>> 21:39:42.030313 18:03:73:15:7b:12 > 68:05:ca:04:d5:6a, ethertype > >>> IPv4 > >> (0x0800), length 65: (tos 0x0, ttl 64, id 7770, offset 0, flags [DF], > >> proto UDP (17), length 51) > >>> 192.168.3.221.40480 > 192.168.3.154.1051: [udp sum ok] UDP, > >>> length > >> 23 > >>> 0x0000: 4500 0033 1e5a 4000 4011 9398 c0a8 03dd > >> E..3.Z@.@....... > >>> 0x0010: c0a8 039a 9e20 041b 001f 169a 0003 0001 > >> ................ > >> ^ > >> | > >> OpCode = 3 (DATA) > >> > >>> 0x0020: 6969 6969 6964 6863 626a 7364 6320 7364 > >> iiiiidhcbjsdc.sd > >>> 0x0030: 6320 0a c.. > >> > >> > >> This means that the TFTP server acknowledges RRQ, but not the > >> options; specifically, tsize=0. > >> > >> Meaning the server starts the actual data transfer, instead of just > >> responding with the size of the file that the client (edk2) is > >> interested in, at the moment. > >> > >> This is why the EFI_PROTOCOL_ERROR branch is taken in > >> Mtftp4GetInfoCheckPacket(): because the TFTP server is incapable of > >> responding with *just* the remote file size, without the actual file > >> contents. This makes it very impractical to implement the > >> EFI_MTFTP4_PROTOCOL.GetInfo() member function. > >> > >> Solution: enable option parsing (according to at least RFC 1782 and > >> RFC > >> 2349) in your TFTP server, or use a more modern TFTP server. > >> > >> More details: I happen to have a debian box running on my desk. The > >> executable name from one of your earlier emails (from the xinetd > >> config > >> file) is "/usr/sbin/in.tftpd". I ran the following command: > >> > >> $ apt-file search /usr/sbin/in.tftpd > >> > >> (I had the impression that you were using Debian or Ubuntu.) > >> > >> Three packages were returned by apt-file, as providing that binary: > >> "atftpd", "tftpd", and "tftpd-hpa". > >> > >> Now look at their package descriptions: > >> > >> https://packages.debian.org/atftpd > >> > >> Multi-threaded TFTP server implementing all options (option > >> extension and multicast) as specified in RFC1350, RFC2090, > RFC2347, > >> RFC2348 and RFC2349. Atftpd also supports multicast protocol known > >> as mtftp, defined in the PXE specification. [...] > >> > >> https://packages.debian.org/tftpd > >> > >> Tftpd is a server which supports the Internet Trivial File > Transfer > >> Protocol (RFC 783). The TFTP server operates at the port indicated > >> in the `tftp' service description; see services(5). The server is > >> normally started by inetd(8). Tftpd is not suitable for use with > the > >> PXE bootloader; for that, use atftpd or tftpd-hpa. > >> > >> https://packages.debian.org/tftpd-hpa > >> > >> Trivial File Transfer Protocol (TFTP) is a file transfer protocol, > >> mainly to serve boot images over the network to other machines > >> (PXE). [...] > >> > >> You simply have the wrong package installed! Please install "atftpd" > >> instead of "tftpd", and retry. > >> > >> ... Once again, it seems proven that (a) most PXE / TFTP issues > >> experienced with edk2 exist on the server (or network) side, and (b) > >> you can fix many issues simply by reading documentation. > >> > >> Of course you can also ask others to read docs for you, and hope they > >> are interested... :) > >> > >> Laszlo > >> > >>> > >>> Thanks and Regards, > >>> Shaveta > >>> > >>> > >>> -----Original Message----- > >>> From: Laszlo Ersek [mailto:[email protected]] > >>> Sent: Friday, September 25, 2015 11:09 PM > >>> To: Leekha Shaveta-B20052 <[email protected]> > >>> Cc: [email protected] <[email protected]>; Fu, Siyuan > >>> <[email protected]>; Chris Cuthbert <[email protected]>; Gary > >>> Ching-Pang Lin <[email protected]> > >>> Subject: Re: [edk2] TFTP issue, Ping 1st packet reply missing > >>> > >>> On 09/25/15 12:46, Leekha Shaveta wrote: > >>>> > >>>> > >>>> -----Original Message----- > >>>> From: Laszlo Ersek [mailto:[email protected]] > >>>> Sent: Friday, September 25, 2015 3:11 PM > >>>> To: Leekha Shaveta-B20052 <[email protected]> > >>>> Cc: [email protected] <[email protected]>; Fu, Siyuan > >>>> <[email protected]>; Chris Cuthbert <[email protected]>; Gary > >>>> Ching-Pang Lin <[email protected]> > >>>> Subject: Re: [edk2] TFTP issue, Ping 1st packet reply missing > >>>> > >>>> On 09/25/15 09:21, Leekha Shaveta wrote: > >>>>> > >>>>> > >>>>> -----Original Message----- > >>>>> From: Laszlo Ersek [mailto:[email protected]] > >>>>> Sent: Friday, September 25, 2015 1:04 AM > >>>>> To: Leekha Shaveta-B20052 <[email protected]> > >>>>> Cc: [email protected] <[email protected]>; Fu, Siyuan > >>>>> <[email protected]>; Chris Cuthbert <[email protected]>; Gary > >>>>> Ching-Pang Lin <[email protected]> > >>>>> Subject: Re: [edk2] TFTP issue, Ping 1st packet reply missing > >>>>> > >>>>> On 09/24/15 13:08, Laszlo Ersek wrote: > >>>>> > >>>>>> BTW when I wrote that I had just tested PXE boot, I didn't use > >>>>>> the UEFI shell utility; it was a network boot option instead. > >>>>> > >>>>> Now I tested the shell command too, in my usual virtual network > >> environment; it works fine for me. > >>>>> > >>>>> Thanks > >>>>> Laszlo > >>>>> > >>>>> I Too faced compilation issues, so I picked up > >>>>> "Guid/NicIp4ConfigNvData.h" file from tianocore site " > >> http://sourceforge.net/p/tianocore/edk2/ci/2638c111076f9a49d4766ca5ac > >> bafa 0eb7f66a18/tree/MdeModulePkg/Include/Guid/NicIp4ConfigNvData.h" > >>>>> Copied it in Guid folder and my code compiled. > >>>>> > >>>>> Is this the correct file to compile the code with? > >>>> > >>>> No. Please pull the new commits; Jaben checked in the patch that > >>>> fixes > >> the build (on Windows at least, and I have a pending patch that fixes > >> it with gcc too). > >>>> > >>>> Thanks > >>>> Laszlo > >>>> > >>>> > >>>> Thanks Laszlo! > >>>> > >>>> I am not working on windows, so will wait for the patch that you > >>>> are > >> going to send to fix this. > >>> > >>> It is SVN r18553 now. > >>> > >>>> > >>>> I had captured TCPDUMP during TFTP on server: > >>>> test@boardfram-OptiPlex-790:/tftpboot$ sudo tcpdump -i eth0 > >>>> tcpdump: verbose output suppressed, use -v or -vv for full protocol > >>>> decode > >>> > >>> Unfortunately, the parameters you passed to tcpdump are not ideal -- > >>> I > >> had proposed parameters up-thread that are more suitable for > >> debugging; please use those. > >>> > >>>> listening on eth0, link-type EN10MB (Ethernet), capture size 65535 > >>>> bytes > >>>> 22:04:50.929700 ARP, Request who-has 192.168.3.221 tell > >>>> 192.168.3.154, length 46 > >>>> 22:04:50.929720 ARP, Reply 192.168.3.221 is-at 18:03:73:15:7b:12 > >>>> (oui Unknown), length 28 > >>>> 22:04:50.988247 IP 192.168.3.154.ingreslock > 192.168.3.221.tftp: > >>>> 21 RRQ "test" octet tsize 0 > >>>> 22:04:50.990025 IP 192.168.3.221.50033 > 192.168.3.154.ingreslock: > >>>> UDP, length 23 > >>>> 22:04:51.013103 IP 192.168.3.154.ingreslock > 192.168.3.221.50033: > >>>> UDP, length 26 > >>>> > >>>> Any idea what is this "ingreslock" in these dump?? > >>> > >>> Sure. You didn't pass "-n" to tcpdump (despite my recommendation > >>> :)), > >> hence tcpdump tries to resolve both IP addresses to domain names, and > >> port numbers to service names (from /etc/services, and any other > >> sources configured in /etc/nsswitch.conf for service name resolution). > >>> "ingreslock" has no particular meaning here; it is port 1524, but > >>> for > >> endpoints that you do not bind explicitly, the system "randomly" > >> chooses a port number from a suitable range. > >>> > >>> In the TFTP client case, the target port (where the TFTP server > >>> lives) > >> is of course well known, but the source port is not bound by the > >> client explicitly (there's no reason to), hence the system assigns a > "random" > >>> source port number. In this case, it happened to be 1524, which is > >> "ingreslock", according to /etc/services. > >>> > >>> Service name resolution is frequently just a distraction with > >>> tcpdump, hence my proposal to use "-n". (Please consider the tcpdump > >>> parameters I had suggested before.) > >>> > >>> If, for any reason, you insist on specifying a source port number, > >> instead of the system-assigned one, the TFTP command's -l option can > >> accommodate that (see its help). > >>> > >>> ... Also, your dump is missing the DHCP packets that should be > >>> captured > >> while the ifconfig program (launched from the UEFI shell) brings up > >> the interface on which you later use TFTP. > >>> > >>> Laszlo > >>> > >>> > >>>> > >>>> Regards, > >>>> Shaveta > >>>> > >>>> > >>>>> > >>>>> Regards, > >>>>> Shaveta > >>>>> > >>>>>> > >>>>>> ... I tried to build the TFTP shell command into OVMF now, just > >>>>>> to test it, but it failed to compile, and the patch that > >>>>>> supposedly fixes it is not readable on the list. :( > >>>>>> > >>>>>> Thanks > >>>>>> Laszlo > >>>>>> > >>>>>>> > >>>>>>> Thanks and regards, > >>>>>>> Shaveta > >>>>>>> > >>>>>>> -----Original Message----- > >>>>>>> From: Laszlo Ersek [mailto:[email protected]] > >>>>>>> Sent: Thursday, September 24, 2015 2:05 PM > >>>>>>> To: Leekha Shaveta-B20052 <[email protected]> > >>>>>>> Cc: [email protected] <[email protected]>; Fu, Siyuan > >>>>>>> <[email protected]>; Chris Cuthbert <[email protected]>; Gary > >>>>>>> Ching-Pang Lin <[email protected]> > >>>>>>> Subject: Re: [edk2] TFTP issue, Ping 1st packet reply missing > >>>>>>> > >>>>>>> On 09/24/15 08:04, Leekha Shaveta wrote: > >>>>>>>> Hi, > >>>>>>>> > >>>>>>>> Tftp is also giving issues. > >>>>>>>> > >>>>>>>> During tftp, as one of its step it calls " GetFileSize" > >>>>>>>> Which go through Mtftp4 protocol and calls " Mtftp4->GetInfo" > >>>>>>>> > >>>>>>>> And this fails. > >>>>>>>> > >>>>>>>> Any idea what is the issue with tftp command? Has anyone tested > >>>>>>>> it > >> successfully? > >>>>>>> > >>>>>>> I frequently retest TFTP, and I just did it right now as well, > >>>>>>> on > >> top of current master. It works fine. My test environment is a > >> virtual network, where OVMF runs in a virtual machine, and DHCP and > >> TFTP are configured by libvirt and served by dnsmasq. The edk2 PXE > >> client downloads shim, then shim downloads grub (with the PXE Base > >> Code protocol), then grub downloads the kernel and the initial > >> ramdisk, for a networked linux installation. > >>>>>>> > >>>>>>> I have encountered and/or investigated quite a few TFTP issues, > >>>>>>> and most of the time they have occurred due to problematic DHCP > >>>>>>> or TFTP config, or problems in UEFI applications, or lower level > >>>>>>> network driver implementations. (In several other cases though, > >>>>>>> people contributed edk2 fixes ultimately.) > >>>>>>> > >>>>>>> Anyhow, the first thing to in such cases is to capture a > >>>>>>> detailed > >> packet log with tcpdump or wireshark, and analyze the packets against > >> the DHCP / TFTP server config, the DHCP / PXE specs, and the edk2 > code. > >> Usually (again, in my experience, although I don't claim to be an > >> expert), the DHCP / TFTP server config, or -- possibly -- the network > >> is the culprit. > >>>>>>> > >>>>>>> Please capture some packets, and analyze them. Analyzing DHCP > >> packets against the specs and the server config takes forever, but > >> I've found it to be the only way. Good luck. > >>>>>>> > >>>>>>> Thanks > >>>>>>> Laszlo > >>>>>>> > >>>>>>> > >>>>>>>> > >>>>>>>> Thanks and Regards, > >>>>>>>> Shaveta > >>>>>>>> > >>>>>>>> -----Original Message----- > >>>>>>>> From: edk2-devel [mailto:[email protected]] On > >>>>>>>> Behalf Of Leekha Shaveta > >>>>>>>> Sent: Thursday, September 24, 2015 11:15 AM > >>>>>>>> To: [email protected] > >>>>>>>> Subject: [edk2] Ping 1st packet reply missing > >>>>>>>> > >>>>>>>> > >>>>>>>> Hi, > >>>>>>>> > >>>>>>>> My ping is working with Intel's E1000 driver code. > >>>>>>>> > >>>>>>>> But everytime 1st packet is not getting received successfully, > >>>>>>>> is > >> there some known issue here, or something to be set/missing? > >>>>>>>> > >>>>>>>> Regards, > >>>>>>>> Shaveta > >>>>>>>> > >>>>>>>> Ping Snippet: > >>>>>>>> =========== > >>>>>>>> Shell> ping 192.168.3.1ping 192.168.3.1 -n 16 > >>>>>>>> InstallProtocolInterface: 41D94CD2-35B6-455A-8258-D4E51334AADD > >> DF56EA60 Ping 192.168.3.1 16 data bytes. > >>>>>>>> GigAdapter->cur_rx_ind: 0 > >>>>>>>> GigAdapter->cur_rx_ind: 1 > >>>>>>>> 16 bytes from 192.168.3.1 : icmp_seq=2 ttl=0 time=1ms > >>>>>>>> GigAdapter->cur_rx_ind: 2 > >>>>>>>> 16 bytes from 192.168.3.1 : icmp_seq=3 ttl=0 time=1ms > >>>>>>>> GigAdapter->cur_rx_ind: 3 > >>>>>>>> 16 bytes from 192.168.3.1 : icmp_seq=4 ttl=0 time=1ms > >>>>>>>> GigAdapter->cur_rx_ind: 4 > >>>>>>>> 16 bytes from 192.168.3.1 : icmp_seq=5 ttl=0 time=1ms > >>>>>>>> GigAdapter->cur_rx_ind: 5 > >>>>>>>> 16 bytes from 192.168.3.1 : icmp_seq=6 ttl=0 time=1ms > >>>>>>>> GigAdapter->cur_rx_ind: 6 > >>>>>>>> 16 bytes from 192.168.3.1 : icmp_seq=7 ttl=0 time=1ms > >>>>>>>> GigAdapter->cur_rx_ind: 7 > >>>>>>>> 16 bytes from 192.168.3.1 : icmp_seq=8 ttl=0 time=1ms > >>>>>>>> GigAdapter->cur_rx_ind: 0 > >>>>>>>> 16 bytes from 192.168.3.1 : icmp_seq=9 ttl=0 time=1ms > >>>>>>>> GigAdapter->cur_rx_ind: 1 > >>>>>>>> 16 bytes from 192.168.3.1 : icmp_seq=10 ttl=0 time=1ms > >>>>>>>> GigAdapter->cur_rx_ind: 2 > >>>>>>>> 16 bytes from 192.168.3.1 : icmp_seq=11 ttl=0 time=1ms > >>>>>>>> GigAdapter->cur_rx_ind: 3 > >>>>>>>> 16 bytes from 192.168.3.1 : icmp_seq=12 ttl=0 time=1ms > >>>>>>>> GigAdapter->cur_rx_ind: 4 > >>>>>>>> 16 bytes from 192.168.3.1 : icmp_seq=13 ttl=0 time=1ms > >>>>>>>> GigAdapter->cur_rx_ind: 5 > >>>>>>>> 16 bytes from 192.168.3.1 : icmp_seq=14 ttl=0 time=1ms > >>>>>>>> GigAdapter->cur_rx_ind: 6 > >>>>>>>> 16 bytes from 192.168.3.1 : icmp_seq=15 ttl=0 time=1ms > >>>>>>>> GigAdapter->cur_rx_ind: 7 > >>>>>>>> 16 bytes from 192.168.3.1 : icmp_seq=16 ttl=0 time=1ms > >>>>>>>> > >>>>>>>> 16 packets transmitted, 15 received, 6% packet loss, time 15ms > >>>>>>>> > >>>>>>>> Rtt(round trip time) min=1ms max=1ms avg=1ms > >>>>>>>> > >>>>>>>> Sent 1 packet: > >>>>>>>> Shell> ping 192.168.3.1 -n 1 > >>>>>>>> InstallProtocolInterface: 41D94CD2-35B6-455A-8258-D4E51334AADD > >> DF56EA60 Ping 192.168.3.1 16 data bytes. > >>>>>>>> GigAdapter->cur_rx_ind: 4 > >>>>>>>> > >>>>>>>> 1 packets transmitted, 0 received, 100% packet loss, time 0ms > >>>>>>>> > >>>>>>>>> -----Original Message----- > >>>>>>>>> From: Leekha Shaveta-B20052 > >>>>>>>>> Sent: Saturday, September 12, 2015 11:34 PM > >>>>>>>>> To: 'Benjamin Herrenschmidt' > >>>>>>>>> <[email protected]<mailto:[email protected]>>; > >>>>>>>>> 'Andrew Fish' <[email protected]<mailto:[email protected]>>; > >>>>>>>>> '[email protected]' > >>>>>>>>> <[email protected]<mailto:[email protected]>>; > >>>>>>>>> 'Tian, Feng' <[email protected]<mailto:[email protected]>> > >>>>>>>>> Subject: Re: PCI and non-1:1 mapping of MMIO space (Doubt o > >>>>>>>>> PCI Root bridge IOMap and IoAllocateBuffer) > >>>>>>>>> > >>>>>>>>> Hi > >>>>>>>>> > >>>>>>>>> I was implementing PCI RootBridgeIo protocol and have some > >>>>>>>>> doubts > >> in "IoMap" and "AllocateBuffer" functions of this protocol. > >>>>>>>>> > >>>>>>>>> In our platform, PCI space is starting form address > >> 0x50_0000_0000 (40 bit addressable) And its mapping on PCI bus is > like: > >>>>>>>>> 50_0000_0000 => 0000_0000 (32 bit) > >>>>>>>>> > >>>>>>>>> From where the "AllocateBuffer" function should allocate > >>>>>>>>> memory > >> when asked by any PCI device? > >>>>>>>>> What is the meaning of "Allocates pages that are suitable for > >>>>>>>>> an EfiPciOperationBusMasterCommonBuffer or > >>>>>>>>> EfiPciOperationBusMasterCommonBuffer64 mapping" > >>>>>>>>> > >>>>>>>>> How to manage mapping in "RootBridgeIoMap" function? > >>>>>>>>> > >>>>>>>>> Thanks and Regards, > >>>>>>>>> Shaveta > >>>>>>>>> > >>>>>>>>> -----Original Message----- > >>>>>>>>> From: edk2-devel [mailto:[email protected]] On > >>>>>>>>> Behalf Of Tian, Feng > >>>>>>>>> Sent: Wednesday, August 26, 2015 7:24 AM > >>>>>>>>> To: Benjamin Herrenschmidt > >>>>>>>>> <[email protected]<mailto:[email protected]>>; > >>>>>>>>> Andrew Fish <[email protected]<mailto:[email protected]>> > >>>>>>>>> Cc: [email protected]<mailto:[email protected]> > >>>>>>>>> <[email protected]<mailto:[email protected]>>; Tian, > >>>>>>>>> Feng <[email protected]<mailto:[email protected]>> > >>>>>>>>> Subject: Re: [edk2] PCI and non-1:1 mapping of MMIO space > >>>>>>>>> > >>>>>>>>> Hi, Ben & Andrew > >>>>>>>>> > >>>>>>>>> The GetBarAttributes() returns a set of ACPI 2.0 resource > >> descriptors that describe the current configuration of the BARs of > >> the PCI controller. > >>>>>>>>> > >>>>>>>>> What I understood is the returned value of GetBarAttributes() > >>>>>>>>> is > >> a CPU address rather than a PCI address. From the view of PciIo, > >> nobody needs to know/use Bar's PCI address. > >>>>>>>>> > >>>>>>>>> Thanks > >>>>>>>>> Feng > >>>>>>>>> > >>>>>>>>> -----Original Message----- > >>>>>>>>> From: edk2-devel [mailto:[email protected]] On > >>>>>>>>> Behalf Of Benjamin Herrenschmidt > >>>>>>>>> Sent: Wednesday, August 26, 2015 07:54 > >>>>>>>>> To: Andrew Fish > >>>>>>>>> Cc: [email protected]<mailto:[email protected]> > >>>>>>>>> Subject: Re: [edk2] PCI and non-1:1 mapping of MMIO space > >>>>>>>>> > >>>>>>>>> (Argh, I keep sending these from my IBM address which isn't > >>>>>>>>> the > >> one on the list. Sorry Andrew for the duplicates). > >>>>>>>>> > >>>>>>>>> On Tue, 2015-08-25 at 14:48 -0700, Andrew Fish wrote: > >>>>>>>>> > >>>>>>>>>> > >>>>>>>>>>> So if we stick to the definition of GetBarAttributes() only > >>>>>>>>>>> returning a BAR value, then it's impossible to implement a > >>>>>>>>>>> PCI GOP driver by following the spec. > >>>>>>>>>>> > >>>>>>>>>> I came to that conclusion too. > >>>>>>>>> > >>>>>>>>> :( > >>>>>>>>> > >>>>>>>>>>> Now, there's one thing that might work, which would be to > >>>>>>>>>>> exploit the "AddressTranslationOffset" field of the ACPI > >>>>>>>>>>> resource descriptor. > >>>>>>>>>>> > >>>>>>>>>> How do you represent a system like this in ACPI? It might be > >>>>>>>>>> a good idea to solve it in a similar way. > >>>>>>>>> > >>>>>>>>> Unfortunately, I am not familiar with the details of ACPI, I > >>>>>>>>> only > >> have a high level understanding of it. Our platforms have been Open > >> Firmware based for as far as I've been involved with them and lately, > >> we use C -generated flat device-tree along with a custom runtime > >> firmwarealled a OPAL). > >>>>>>>>> > >>>>>>>>> At this point I'm not (yet) considering a move to ACPI. I'm > >>>>>>>>> doing > >> a proof of concept ppc64 UEFI port to get a feel of the water > >> temperature more than anything else (though I'll be happy to > >> contribute things back once I get the appropriate legalese sorted > internally to IBM). > >>>>>>>>> > >>>>>>>>>> The PCI IO was designed to not required the 1:1 mapping. The > >>>>>>>>>> direct access to the Framebuffer came along later, as was > >>>>>>>>>> mostly a fallback for the OS on a safe mode boot kind of > thing. > >>>>>>>>>> I think we missed passing the frame buffer out on a system > >>>>>>>>>> that > >> was not 1:1. > >>>>>>>>> > >>>>>>>>> Ok. Well, it will be needed even on non-1:1 systems, we will > >>>>>>>>> have > >> similar requirements of the OS needing an early boot framebuffer > etc... > >>>>>>>>> and I suspect the desire to directly access BARs (at least > >>>>>>>>> prefetchable > >>>>>>>>> ones) from the CPU isn't going away in other areas either. > >>>>>>>>> > >>>>>>>>> So maybe we should try to address this. I'm trying to figure > >>>>>>>>> out > >> how to join the appropriate working groups etc... so I can > >> participate in the spec side discussion as well (which I'll need to > >> do for other reasons anyway if we are ever going to officially > >> defining the ppc64 ABI in the spec). > >>>>>>>>> > >>>>>>>>> Cheers, > >>>>>>>>> Ben. > >>>>>>>>> > >>>>>>>>>> Thanks, > >>>>>>>>>> > >>>>>>>>>> Andrew Fish > >>>>>>>>>> > >>>>>>>>>>> Cheers, > >>>>>>>>>>> Ben. > >>>>>>>>> _______________________________________________ > >>>>>>>>> edk2-devel mailing list > >>>>>>>>> [email protected]<mailto:[email protected]> > >>>>>>>>> https://lists.01.org/mailman/listinfo/edk2-devel > >>>>>>>>> _______________________________________________ > >>>>>>>>> edk2-devel mailing list > >>>>>>>>> [email protected]<mailto:[email protected]> > >>>>>>>>> https://lists.01.org/mailman/listinfo/edk2-devel > >>>>>>>> _______________________________________________ > >>>>>>>> edk2-devel mailing list > >>>>>>>> [email protected] > >>>>>>>> https://lists.01.org/mailman/listinfo/edk2-devel > >>>>>>>> _______________________________________________ > >>>>>>>> edk2-devel mailing list > >>>>>>>> [email protected] > >>>>>>>> https://lists.01.org/mailman/listinfo/edk2-devel > >>>>>>>> > >>>>>>> > >>>>>> > >>>>> > >>>> > >>> > >> > >> _______________________________________________ > >> edk2-devel mailing list > >> [email protected] > >> https://lists.01.org/mailman/listinfo/edk2-devel _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

