21 Commits

Author SHA1 Message Date
rodrigc
1621843c39 Fixes to newer tftp code in libstand:
(1) Coding style changes.
 (2) If the server does not acknowledge any blocksize option,
     revert to the default blocksize of 512 bytes.
 (3) Send ACK if the first packet happens to be the last packet.
 (4) Do not accept blocksize greater than what was requested.
 (5) Drop any unwanted OACK received if a tftp transfer is already
     in progress.
 (6) Terminate incomplete transfers with a special no-error ERROR packet.
     Otherwise we rely on the tftp server to time out, which it does
     eventually, after re-sending the last packet several times and spamming
     the system log about it every time.  This idea is borrowed from the
     PXE client, which does exactly that.

Submitted by:  Alexander Kabaev <kan@FreeBSD.org>
Reviewed and Tested by: Santhanakrishnan Balraj <sbalraj at juniper dot net>
2011-06-24 03:50:54 +00:00
rodrigc
dc6fca7b3a Bring back following change which was undone in previous commit:
------------------------------------------------------------------------
    r172854 | marius | 2007-10-21 10:03:18 -0700 (Sun, 21 Oct 2007) | 16 lines
    Changed paths:
       M /head/lib/libstand/tftp.c

    - Given that we tell the compiler that struct ip is packed and 32-bit
      aligned, GCC 4.2.1 also generates code for sendudp() that assumes
      this alignment. GCC 4.2.1 however doesn't 32-bit align wbuf, causing
      the loader to crash due to an unaligned access of wbuf in sendudp()
      when netbooting sparc64. Solve this by specifying wbuf as packed and
      32-bit aligned, too. As for lastdata and readudp() this currently is
      no issue when compiled with GCC 4.2.1, though give lastdata the same
      treatment as wbuf for consistency and possibility of being affected
      in the future. [1]
    - Sprinkle const on a lookup table.
    ------------------------------------------------------------------------
2011-06-15 23:22:35 +00:00
rodrigc
9b64106b02 (1) When sending the TFTP RRQ packet to read a file,
send along the "blksize" option specified in RFC2348,
     and the "tsize" option specified in RFC2349.

     Add code to parse the TFTP Option Acknowledgement (OACK) packet as
     specified in RFC2347.

     For TFTP servers which support the "blksize" option, we can
     specify a TFTP Data block size larger than the default 512 bytes
     specified in RFC1350.  This offers greater read performance when
     downloading files.

     We request an initial size of 1428 bytes, which is less than the
     Ethernet MTU of 1500 bytes.  If the TFTP server sends back an OACK
     packet, then use the block size specified in the OACK packet.
     Most times it is usually the same value as what we request.
     If the TFTP server supports RFC2348, we will see performance improvements
     by transferring files over TFTP with larger block sizes.

     If we do not get back an OACK packet, then we most likely we
     are interoperating with a legacy TFTP server that does not
     support TFTP extension options, so default to the block size of
     512 bytes.

(2)  If the "tftp.blksize" environment variable is set, then
     take that value and use it when sending the TFTP RRQ packet,
     instead of 1428.  This allows us to set different values of
     "tftp.blksize" in the loader, so that we can test out different
     TFTP block sizes at run time.

Obtained from: Juniper Networks
Fixed by:  rodrigc
2011-06-15 22:13:22 +00:00
rodrigc
62ae73089f Currently tftp code in the loader retransmits the previous packet if it receives any
unwanted packet(non-tftp). Change this to retransmit the packet(request or ack) only after
a timeout.

Obtained from:	Juniper Networks
Fixed by: Santhanakrishnan Balraj <sbalraj at juniper dot net>
2011-06-15 22:08:18 +00:00
rodrigc
d05f25ce84 Added sendrecv_tftp function instead of sendrecv for use by tftp.
In sendrecv_tftp:
    * Upon receving an unexpected block of data or error, resend the ACK
      immediately instead of waiting till the expiry of receive data timeout
      to resend the ACK.
    * change the receive timeout value between retries to be 2xMINTMO.

Obtained from: Juniper Networks
Fixed by: Santhanakrishnan Balraj <sbalraj at juniper dot net>
2011-06-15 22:04:14 +00:00
rodrigc
e262422a37 Rename DEBUG macro to TFTP_DEBUG, to be more consistent with
debug macros in other files.
2011-05-03 07:46:02 +00:00
rodrigc
a857ffe834 Switch to ANSI function prototypes in a few places.
Get rid of some unused parameter warnings.
2011-05-03 04:44:50 +00:00
ed
8aad8f9ffa Fix minor issues in libstand.
- Don't call tftp_makereq() with too many arguments.
- Don't forget to close one of the comments.

Submitted by:	Pawel Worach
2009-05-31 21:29:07 +00:00
marius
4d2f5e9e2e - Given that we tell the compiler that struct ip is packed and 32-bit
aligned, GCC 4.2.1 also generates code for sendudp() that assumes
  this alignment. GCC 4.2.1 however doesn't 32-bit align wbuf, causing
  the loader to crash due to an unaligned access of wbuf in sendudp()
  when netbooting sparc64. Solve this by specifying wbuf as packed and
  32-bit aligned, too. As for lastdata and readudp() this currently is
  no issue when compiled with GCC 4.2.1, though give lastdata the same
  treatment as wbuf for consistency and possibility of being affected
  in the future. [1]
- Sprinkle const on a lookup table.

Reported by:		marcel [1]
Submitted by:		yongari [1]
Reviewed by:		marcel [1]
MFC after:		5 days
2007-10-21 17:03:18 +00:00
stefanf
06aa92a1b8 Don't add integers to void pointers. 2004-10-03 15:58:20 +00:00
marcel
4007bcfd7b Fix a machine check abort caused by the EFI loader trying to open a
file in the NFS file system when the underlying device is not a
network device. A Sparc64 specific hack for this exact problem was
already present (nfs.c:1.9, tftp.c:1.10), but the problem is not
specific to Sparc64. The hack has been promoted to a non-i386 test
because on non-i386 architectures it's either impossible to have
non-network devices coexist in the same loader with the NFS FS, or
network and non-network device coexist and NFS filesystems can only
be used on top of network devices. I believe i386 pxeboot is where
this does not hold.

The root cause of this problem is in open.c where each file system
is tried until no more file systems exist or a file system returns
success. There's no notion of a list of valid file systems given
the underlying device and the non-existence of a file can cause
the invalid combination to be tried.
2003-03-03 00:58:47 +00:00
jake
9c4815fb21 Add a hack (kludge?) to avoid trying to access files backed by disk
devices as though they were backed by network devices.
2002-07-07 23:01:36 +00:00
obrien
084b4588f2 Remove 'register' keyword. 2002-03-21 23:39:28 +00:00
dillon
f6666a61a9 Add __FBSDID()s to libstand 2001-09-30 22:28:01 +00:00
mikeh
eb666cf8c5 Reset errno so that subsequent TFTP requests don't fail after the
first failure.

PR:		misc/25502
MFC after:	2 weeks
2001-06-30 21:39:09 +00:00
msmith
10ff37925c The shortest valid TFTP packet is 4 bytes, not 8.
PR:		misc/25503
Submitted by:	Jim Browne <jbrowne@jbrowne.com>
MFC after:	1 week
2001-05-28 22:25:44 +00:00
ps
b9f1a189bc When TFTP tries to open a file, it is expecting struct open_file
member f_devdata to be a pointer to a socket number.  When currdev
is "pxe", that assumption is correct.  When currdev is "disk*", that
assumption is incorrect.

Submitted by:	Jim Browne <jbrowne@jbrowne.com>
2000-12-08 05:02:12 +00:00
jlemon
9f5d586c97 Add a readdir function to the loader fsops vector, and implement the
functionality for some of the filesystesms.
2000-04-29 20:47:10 +00:00
ps
1e90e50f9f Break out sendudp and readudp from net.c. This is for PXE, so it
can use its own UDP interface.
2000-04-08 01:18:04 +00:00
msmith
3b7700ffef Path arguments to *_open functions should be const, but we were mangling
them.

Submitted by:	write-protected text segment in BTX
1998-09-18 22:58:01 +00:00
msmith
335c4be5b1 This is libstand; a support library for standalone executables (eg. bootstrap
modules).
Obtained from: NetBSD, with some architectural changes and many additions.
1998-08-20 08:19:55 +00:00