11 years ago[tcp] Avoid printf format warnings on some compilers
Michael Brown [Sun, 2 Aug 2009 21:19:31 +0000 (22:19 +0100)]
[tcp] Avoid printf format warnings on some compilers

In several places, we currently use size_t to represent a difference
between TCP sequence numbers.  This can cause compiler warnings
relating to printf format specifiers, since the result of
(uint32_t+size_t) may be an unsigned long on some compilers.

Fix by using uint32_t for all variables that represent a difference
between TCP sequence numbers.

Tested-by: Joshua Oreman <>
11 years ago[build] Allow safe concurrent builds of .iso, .liso and .sdsk targets
Michael Brown [Sun, 2 Aug 2009 10:17:02 +0000 (11:17 +0100)]
[build] Allow safe concurrent builds of .iso, .liso and .sdsk targets

The geniso, genliso and gensdsk scripts contain hard-coded temporary
directory names, and so could potentially collide with each other when
run as part of a concurrent build (e.g. "make -j 4").

Fix by using mktemp to generate suitable temporary directory names.

11 years ago[build] Make .liso image generation silent unless errors occur
Michael Brown [Sun, 2 Aug 2009 10:08:43 +0000 (11:08 +0100)]
[build] Make .liso image generation silent unless errors occur

11 years ago[build] Add syslinux floppy image type .sdsk
Marty Connor [Sun, 29 Mar 2009 05:25:15 +0000 (01:25 -0400)]
[build] Add syslinux floppy image type .sdsk

We add a syslinux floppy disk type using parts of the genliso script.
This floppy image cat be dd'ed to a physical floppy or used in
instances where a virtual floppy with an mountable DOS filesystem is

We also modify the genliso script to only generate .liso images
rather than creating images depending on how it is called.

Signed-off-by: Michael Brown <>
11 years ago[rtl818x] Add driver for Realtek 8180/8185 wireless cards
Joshua Oreman [Sun, 21 Jun 2009 00:58:10 +0000 (17:58 -0700)]
[rtl818x] Add driver for Realtek 8180/8185 wireless cards

11 years ago[802.11] Add support for 802.11 devices with software MAC layer
Joshua Oreman [Tue, 21 Jul 2009 18:16:38 +0000 (11:16 -0700)]
[802.11] Add support for 802.11 devices with software MAC layer

This is required for all modern 802.11 devices, and allows drivers
to be written for them with minimally more effort than is required
for a wired NIC.

Signed-off-by: Michael Brown <>
Modified-by: Michael Brown <>
11 years ago[hermon] Add support for RC queue pairs
Michael Brown [Fri, 17 Jul 2009 21:34:38 +0000 (22:34 +0100)]
[hermon] Add support for RC queue pairs

11 years ago[hermon] Allow software GMA to receive packets destined for QP1
Michael Brown [Thu, 9 Jul 2009 04:18:33 +0000 (05:18 +0100)]
[hermon] Allow software GMA to receive packets destined for QP1

The Linux IB Communication Manager will always send MADs to QP1,
rather than back to the originating QP.  On Hermon, QP1 is by default
handled by the embedded firmware.  We can change this, but the cost is
that we have to handle both QP0 and QP1 (i.e. we have to provide SMA
as well as GMA service in software), and we have to use MLX queues
rather than standard UD queues (i.e. we have to construct the UD
datagrams by hand).

There doesn't seem to be any viable way around this situation, ugly
though it is.

11 years ago[hermon] Disable debugging around mapping of firmware tables
Michael Brown [Thu, 9 Jul 2009 01:45:37 +0000 (02:45 +0100)]
[hermon] Disable debugging around mapping of firmware tables

11 years ago[hermon] Remove an unnecessary check for GID-less transmissions
Michael Brown [Wed, 8 Jul 2009 21:00:07 +0000 (22:00 +0100)]
[hermon] Remove an unnecessary check for GID-less transmissions

11 years ago[infiniband] Add Communication Manager (CM)
Michael Brown [Fri, 17 Jul 2009 21:10:42 +0000 (22:10 +0100)]
[infiniband] Add Communication Manager (CM)

The Communication Manager is responsible for handling the setup and
teardown of RC connections.

11 years ago[infiniband] Add infrastructure for RC queue pairs
Michael Brown [Fri, 17 Jul 2009 21:27:34 +0000 (22:27 +0100)]
[infiniband] Add infrastructure for RC queue pairs

Queue pairs are now assumed to be created in the INIT state, with a
call to ib_modify_qp() required to bring the queue pair to the RTS

ib_modify_qp() no longer takes a modification list; callers should
modify the relevant queue pair parameters (e.g. qkey) directly and
then call ib_modify_qp() to synchronise the changes to the hardware.

The packet sequence number is now a property of the queue pair, rather
than of the device.

Each queue pair may have an associated address vector.  For RC queue
pairs, this is the address vector that will be programmed in to the
hardware as the remote address.  For UD queue pairs, it will be used
as the default address vector if none is supplied to ib_post_send().

11 years ago[infiniband] Pass a generic MAD to ib_set_port_info()
Michael Brown [Fri, 17 Jul 2009 21:40:12 +0000 (22:40 +0100)]
[infiniband] Pass a generic MAD to ib_set_port_info()

11 years ago[infiniband] Expose supported and enabled link speeds and widths
Michael Brown [Sat, 11 Jul 2009 00:14:43 +0000 (01:14 +0100)]
[infiniband] Expose supported and enabled link speeds and widths

11 years ago[infiniband] Allow MAD handlers to indicate response via return value
Michael Brown [Fri, 10 Jul 2009 21:31:40 +0000 (22:31 +0100)]
[infiniband] Allow MAD handlers to indicate response via return value

Now that MAD handlers no longer return a status code, we can allow
them to return a pointer to a MAD structure if and only if they want
to send a response.  This provides a more natural and flexible
approach than using a "response method" field within the handler's

11 years ago[infiniband] Remove the return status code from MAD handlers
Michael Brown [Fri, 10 Jul 2009 20:29:25 +0000 (21:29 +0100)]
[infiniband] Remove the return status code from MAD handlers

MAD handlers have to set the status fields within the MAD itself
anyway, in order to provide a meaningful response MAD; the additional
gPXE return status code is just noise.

Note that we probably don't need to ever explicitly set the status to
IB_MGMT_STATUS_OK, since it should already have this value from the
request.  (By not explicitly setting the status in this way, we can
safely have ib_sma_set_xxx() call ib_sma_get_xxx() in order to
generate the GetResponse MAD without worrying that ib_sma_get_xxx()
will clear any error status set by ib_sma_set_xxx().)

11 years ago[infiniband] Allow external QPN to differ from real QPN
Michael Brown [Thu, 9 Jul 2009 14:52:04 +0000 (15:52 +0100)]
[infiniband] Allow external QPN to differ from real QPN

Most IB hardware seems not to allow allocation of the genuine QPNs 0
and 1, so allow for the externally-visible QPN (as constructed and
parsed by ib_packet, where used) to differ from the real
hardware-allocated QPN.

11 years ago[infiniband] Always create an SMA and a GMA
Michael Brown [Thu, 9 Jul 2009 02:49:37 +0000 (03:49 +0100)]
[infiniband] Always create an SMA and a GMA

11 years ago[infiniband] Add notion of a queue pair type
Michael Brown [Thu, 9 Jul 2009 02:09:00 +0000 (03:09 +0100)]
[infiniband] Add notion of a queue pair type

11 years ago[infiniband] Allow completion queue operations to be optional
Michael Brown [Wed, 8 Jul 2009 10:50:47 +0000 (11:50 +0100)]
[infiniband] Allow completion queue operations to be optional

The send completion handler typically will just free the I/O buffer,
so allow this common case to be handled by the Infiniband core.

11 years ago[infiniband] Improve ib_packet debugging messages
Michael Brown [Wed, 8 Jul 2009 03:31:48 +0000 (04:31 +0100)]
[infiniband] Improve ib_packet debugging messages

11 years ago[ipoib] Attempt the broadcast group join only if the link is up
Michael Brown [Tue, 7 Jul 2009 18:14:52 +0000 (19:14 +0100)]
[ipoib] Attempt the broadcast group join only if the link is up

Attempting the broadcast group join while the link is down is
harmless, but can generate annoying volumes of debug messages.

11 years ago[infiniband] Implement SMA as an instance of a GMA
Michael Brown [Tue, 7 Jul 2009 17:30:15 +0000 (18:30 +0100)]
[infiniband] Implement SMA as an instance of a GMA

The GMA code was based upon the SMA code.  We can save space by making
the SMA simply an instance of the GMA.

11 years ago[infiniband] Pass GMA as a parameter to GMA MAD handlers
Michael Brown [Tue, 7 Jul 2009 17:09:21 +0000 (18:09 +0100)]
[infiniband] Pass GMA as a parameter to GMA MAD handlers

11 years ago[ipoib] Remove the queue set abstraction
Michael Brown [Tue, 7 Jul 2009 15:26:57 +0000 (16:26 +0100)]
[ipoib] Remove the queue set abstraction

Now that IPoIB has to deal with only one set of queues, the queue set
abstraction becomes merely an inconvenient wrapper.

11 years ago[ipoib] Kill off the now-unused IPoIB metadata queue set
Michael Brown [Tue, 7 Jul 2009 15:18:47 +0000 (16:18 +0100)]
[ipoib] Kill off the now-unused IPoIB metadata queue set

All packets handled by the metadata queue set now go via the GMA.

11 years ago[infiniband] Provide a general mechanism for multicast group joins
Michael Brown [Tue, 7 Jul 2009 15:07:31 +0000 (16:07 +0100)]
[infiniband] Provide a general mechanism for multicast group joins

Generalise out the multicast group membership record code from IPoIB.

11 years ago[infiniband] Allow for sending MADs via GMA without retransmission
Michael Brown [Tue, 7 Jul 2009 15:01:51 +0000 (16:01 +0100)]
[infiniband] Allow for sending MADs via GMA without retransmission

11 years ago[infiniband] Make qkey and rate optional parameters to ib_post_send()
Michael Brown [Tue, 7 Jul 2009 13:03:11 +0000 (14:03 +0100)]
[infiniband] Make qkey and rate optional parameters to ib_post_send()

The queue key is stored as a property of the queue pair, and so can
optionally be added by the Infiniband core at the time of calling
ib_post_send(), rather than always having to be specified by the

This allows IPoIB to avoid explicitly keeping track of the data queue

11 years ago[ipoib] Clarify new role of IPoIB peer cache as for MAC addresses only
Michael Brown [Tue, 7 Jul 2009 12:54:39 +0000 (13:54 +0100)]
[ipoib] Clarify new role of IPoIB peer cache as for MAC addresses only

Now that path record lookups are handled entirely via
ib_resolve_path(), the only role of the IPoIB peer cache is as a
lookup table for MAC addresses.  Update the code structure and
comments to reflect this.

11 years ago[ipoib] Expose the real broadcast MAC
Michael Brown [Tue, 7 Jul 2009 12:30:47 +0000 (13:30 +0100)]
[ipoib] Expose the real broadcast MAC

The IPoIB broadcast MAC address varies according to the partition key.
Now that the broadcast MAC address is a property of the network device
rather than of the link layer, we can expose this real MAC address

The broadcast LID is now identified via a path record lookup; this is
marginally inefficient (since it was present in the MCMemberRecord
GetResponse), but avoids the need to special-case broadcasts when
constructing the address vector in ipoib_transmit().

11 years ago[ipoib] Use Infiniband broadcast QPN in IPoIB broadcast MAC address
Michael Brown [Tue, 7 Jul 2009 10:31:35 +0000 (11:31 +0100)]
[ipoib] Use Infiniband broadcast QPN in IPoIB broadcast MAC address

Remove the special handling of the IPoIB broadcast QPN.

11 years ago[infiniband] Provide a general mechanism for path record lookups
Michael Brown [Tue, 7 Jul 2009 01:01:21 +0000 (02:01 +0100)]
[infiniband] Provide a general mechanism for path record lookups

Generalise out the path record lookup code from IPoIB.

11 years ago[infiniband] Create a general management agent
Michael Brown [Mon, 6 Jul 2009 22:09:26 +0000 (23:09 +0100)]
[infiniband] Create a general management agent

Generalise the subnet management agent into a general management agent
capable of sending and responding to MADs, including support for
retransmissions as necessary.

11 years ago[infiniband] Centralise SMA and GMA queue constants
Michael Brown [Mon, 6 Jul 2009 19:31:44 +0000 (20:31 +0100)]
[infiniband] Centralise SMA and GMA queue constants

11 years ago[infiniband] Poll completion queues automatically
Michael Brown [Mon, 6 Jul 2009 18:12:12 +0000 (19:12 +0100)]
[infiniband] Poll completion queues automatically

Currently, all Infiniband users must create a process for polling
their completion queues (or rely on a regular hook such as
netdev_poll() in ipoib.c).

Move instead to a model whereby the Infiniband core maintains a single
process calling ib_poll_eq(), and polling the event queue triggers
polls of the applicable completion queues.  (At present, the
Infiniband core simply polls all of the device's completion queues.)
Polling a completion queue will now implicitly refill all attached
receive work queues; this is analogous to the way that netdev_poll()
implicitly refills the RX ring.

Infiniband users no longer need to create a process just to poll their
completion queues and refill their receive rings.

11 years ago[infiniband] Centralise assumption of 2048-byte payloads
Michael Brown [Fri, 17 Jul 2009 21:50:33 +0000 (22:50 +0100)]
[infiniband] Centralise assumption of 2048-byte payloads

IPoIB and the SMA have separate constants for the packet size to be
used to I/O buffer allocations.  Merge these into the single

(Various other points in the Infiniband stack have hard-coded
assumptions of a 2048-byte payload; we don't currently support
variable MTUs.)

11 years ago[infiniband] Provide ib_get_hca_info() as a commonly-available function
Michael Brown [Thu, 2 Jul 2009 11:54:36 +0000 (12:54 +0100)]
[infiniband] Provide ib_get_hca_info() as a commonly-available function

11 years ago[infiniband] Split queue set functionality out of ipoib.c to ib_qset.c
Michael Brown [Thu, 2 Jul 2009 08:56:14 +0000 (09:56 +0100)]
[infiniband] Split queue set functionality out of ipoib.c to ib_qset.c

11 years ago[infiniband] Move non-driver-specific code to net/infiniband
Michael Brown [Thu, 2 Jul 2009 07:39:34 +0000 (08:39 +0100)]
[infiniband] Move non-driver-specific code to net/infiniband

11 years ago[netdevice] Make ll_broadcast per-netdevice rather than per-ll_protocol
Michael Brown [Fri, 17 Jul 2009 21:48:31 +0000 (22:48 +0100)]
[netdevice] Make ll_broadcast per-netdevice rather than per-ll_protocol

IPoIB has a link-layer broadcast address that varies according to the
partition key.  We currently go through several contortions to pretend
that the link-layer address is a fixed constant; by making the
broadcast address a property of the network device rather than the
link-layer protocol it will be possible to simplify IPoIB's broadcast

11 years ago[ata] Make ATA command issuing partially asynchronous
Michael Brown [Tue, 7 Jul 2009 22:01:28 +0000 (23:01 +0100)]
[ata] Make ATA command issuing partially asynchronous

Move the icky call to step() from aoe.c to ata.c; this takes it at
least one step further away from where it really doesn't belong.

Unfortunately, AoE has the ugly aoe_discover() mechanism which means
that we still have a step() loop in aoe.c for now; this needs to be
replaced at some future point.

11 years ago[scsi] Improve SCSI debugging
Michael Brown [Mon, 13 Jul 2009 04:01:54 +0000 (05:01 +0100)]
[scsi] Improve SCSI debugging

11 years ago[scsi] Make SCSI command issuing partially asynchronous
Michael Brown [Tue, 7 Jul 2009 22:00:11 +0000 (23:00 +0100)]
[scsi] Make SCSI command issuing partially asynchronous

Move the icky call to step() from iscsi.c to scsi.c; this takes it at
least one step further away from where it really doesn't belong.

11 years ago[debug] Use a delimiter to break up DBG_HD() output
Michael Brown [Sun, 12 Jul 2009 20:30:08 +0000 (21:30 +0100)]
[debug] Use a delimiter to break up DBG_HD() output

Reading sixteen columns of hex digits can be difficult; include a "-"
character to split the output into two groups of eight columns.

11 years ago[xfer] Always nullify interface while sending close() message
Michael Brown [Mon, 6 Jul 2009 15:16:59 +0000 (16:16 +0100)]
[xfer] Always nullify interface while sending close() message

Objects typically call xfer_close() as part of their response to a
close() message.  If the initiating object has already nullified the
xfer interface then this isn't a problem, but it can lead to
unexpected behaviour when the initiating object is aiming to reuse the
connection and so does not nullify the interface.

Fix by always temporarily nullifying the interface during xfer_close()
(as was already being done by xfer_vreopen() in order to work around
this specific problem).

Reported-by: infernix <>
Tested-by: infernix <>
11 years ago[pxe] Add startpxe and stoppxe commands
Michael Brown [Sun, 28 Jun 2009 19:50:23 +0000 (20:50 +0100)]
[pxe] Add startpxe and stoppxe commands

These commands can be used to activate or deactivate the PXE API (on a
specifiable network interface).

This is currently of limited use, since most image formats will call
shutdown() before booting the image, meaning that the underlying net
device gets shut down during remove_devices() anyway.

11 years ago[ifmgmt] Move ifmgmt_cmd.h to include/hci
Michael Brown [Sun, 28 Jun 2009 19:28:38 +0000 (20:28 +0100)]
[ifmgmt] Move ifmgmt_cmd.h to include/hci

11 years ago[ifmgmt] Optimise prototype for ifcommon_exec()
Michael Brown [Sun, 28 Jun 2009 19:24:54 +0000 (20:24 +0100)]
[ifmgmt] Optimise prototype for ifcommon_exec()

ifcommon_exec() was long-ago marked as __attribute__((regparm(2))) in
order to minimise the size of functions that call into it.  Since
then, gPXE has added -mregparm=3 as a general compilation option, and
this "optimisation" is now counter-productive.

Change (and simplify) the prototype to minimise code size given the
current compilation conditions.

11 years ago[pxe] Check for unhookable interrupts in PXENV_STOP_UNDI
Michael Brown [Sun, 28 Jun 2009 19:12:16 +0000 (20:12 +0100)]
[pxe] Check for unhookable interrupts in PXENV_STOP_UNDI

cannot be safely unloaded (e.g. due to interrupt vectors that could
not be unhooked).

11 years ago[pxe] Create pxe_[de]activate() wrapper functions
Michael Brown [Sun, 28 Jun 2009 19:08:58 +0000 (20:08 +0100)]
[pxe] Create pxe_[de]activate() wrapper functions

Merge the pxe_set_netdev()+pxe_[un]hook_int1a() pattern into a single
pxe_[de]activate() call.

11 years ago[pxe] Make pxe_init_structures() an initialisation function
Michael Brown [Sun, 28 Jun 2009 18:40:16 +0000 (19:40 +0100)]
[pxe] Make pxe_init_structures() an initialisation function

pxe_init_structures() fills in the fields of the !PXE and PXENV+
structures that aren't known until gPXE starts up.  Once gPXE is
started, these values will never change.

Make pxe_init_structures() an initialisation function so that PXE
users don't have to worry about calling it.

11 years ago[pxe] Update UNDI transmit count before transmitting packet
Michael Brown [Sat, 27 Jun 2009 15:36:21 +0000 (16:36 +0100)]
[pxe] Update UNDI transmit count before transmitting packet

It is possible that the UNDI ISR may be triggered before netdev_tx()
returns control to pxenv_undi_transmit().  This means that
pxenv_undi_isr() may see a zero undi_tx_count, and so not check for TX
completions.  This is not a significant problem, since it will check
for TX completions on the next call to pxenv_undi_isr() anyway; it
just means that the NBP will see a spurious IRQ that was apparently
caused by nothing.

Fix by updating the undi_tx_count before calling netdev_tx(), so that
pxenv_undi_isr() can decrement it and report the TX completion.

11 years ago[pxe] Implement PXENV_UNDI_{GET,SET}_MCAST_ADDRESS
Michael Brown [Sat, 27 Jun 2009 14:45:27 +0000 (15:45 +0100)]

Symantec Ghost requires working multicast support.  gPXE configures
all (sufficiently supported) network adapters into "receive all
multicasts" mode, which means that PXENV_UNDI_SET_MCAST_ADDRESS is
actually a no-op, but the current implementation returns

Fix by making PXENV_UNDI_SET_MCAST_ADDRESS return success.  For good
measure, also implement PXENV_UNDI_GET_MCAST_ADDRESS, since the
relevant functionality is now exposed by the net device core.

Note that this will silently fail if the gPXE driver for the NIC being
used fails to configure the NIC in "receive all multicasts" mode.

11 years ago[pxe] Improve pxe_undi debug messages
Michael Brown [Sat, 27 Jun 2009 13:43:10 +0000 (14:43 +0100)]
[pxe] Improve pxe_undi debug messages

The PXE debugging messages have remained pretty much unaltered since
Etherboot 5.4, and are now difficult to read in comparison to most of
the rest of gPXE.

Bring the pxe_undi debug messages up to normal gPXE standards.

11 years ago[hci] Expose ifcommon_exec() in a local header so wireless commands can use it
Joshua Oreman [Fri, 19 Jun 2009 09:21:08 +0000 (02:21 -0700)]
[hci] Expose ifcommon_exec() in a local header so wireless commands can use it

This keeps code size down, since the wireless interface management
commands have the same command-line interface and overall structure as
the wired commands.

Signed-off-by: Michael Brown <>
11 years ago[dhcp] Await link-up before starting DHCP
Joshua Oreman [Sat, 20 Jun 2009 08:52:41 +0000 (01:52 -0700)]
[dhcp] Await link-up before starting DHCP

Modified-by: Michael Brown <>
Signed-off-by: Michael Brown <>
11 years ago[ifmgmt] Move link-up status messages from autoboot() to iflinkwait()
Joshua Oreman [Fri, 19 Jun 2009 09:08:21 +0000 (02:08 -0700)]
[ifmgmt] Move link-up status messages from autoboot() to iflinkwait()

With the addition of link status codes, we can now display a detailed
error indication if iflinkwait() fails.

Putting the error output in iflinkwait avoids code duplication, and
gains symmetry with the other interface management routines; ifopen()
already prints an error directly if it cannot open its interface.

Modified-by: Michael Brown <>
Signed-off-by: Michael Brown <>
11 years ago[netdevice] Add mechanism for reporting detailed link status codes
Michael Brown [Wed, 24 Jun 2009 11:52:38 +0000 (12:52 +0100)]
[netdevice] Add mechanism for reporting detailed link status codes

Expand the NETDEV_LINK_UP bit into a link_rc status code field,
allowing specific reasons for link failure to be reported via

Originally-authored-by: Joshua Oreman <>
11 years ago[comboot] Implement INT 22h AX=000Bh (Get Serial Console Configuration)
Daniel Verkamp [Tue, 23 Jun 2009 20:57:05 +0000 (16:57 -0400)]
[comboot] Implement INT 22h AX=000Bh (Get Serial Console Configuration)

Signed-off-by: Michael Brown <>
11 years ago[pxe] Fix interoperability with the Symantec (undipd) DOS UNDI driver
Michael Brown [Tue, 23 Jun 2009 21:53:29 +0000 (22:53 +0100)]
[pxe] Fix interoperability with the Symantec (undipd) DOS UNDI driver

The Symantec UNDI DOS driver fails when run on top of gPXE because we
return our interface type as "gPXE" rather than one of the predefined
NDIS interface type strings.

Fix by returning the standard "DIX+802.3" string; this isn't
necessarily always accurate, but it's highly unlikely that anything
trying to use the UNDI API would understand our IPoIB link-layer
pseudo-header anyway.

11 years ago[pxe] Fix interoperability with the Intel DOS UNDI driver
Michael Brown [Tue, 23 Jun 2009 21:42:55 +0000 (22:42 +0100)]
[pxe] Fix interoperability with the Intel DOS UNDI driver

The Intel DOS UNDI driver fails when run on top of gPXE because we do
not fill in the ServiceFlags field in PXENV_UNDI_GET_IFACE_INFO.

Fix by filling in the ServiceFlags field with reasonable values
indicating our approximate feature capabilities.

11 years ago[pxe] Fix interoperability with the 3Com DOS UNDI driver
Michael Brown [Tue, 23 Jun 2009 20:54:50 +0000 (21:54 +0100)]
[pxe] Fix interoperability with the 3Com DOS UNDI driver

The 3Com DOS UNDI driver fails when run on top of gPXE for two
reasons: firstly because PXENV_UNDI_SET_PACKET_FILTER is unsupported,
and secondly because gPXE enters the NBP without enabling interrupts
on the NIC, and the 3Com driver never calls PXENV_UNDI_OPEN.

Fix by always returning success from PXENV_UNDI_SET_PACKET_FILTER
(which is no worse than the current situation, since we already ignore
the receive packet filter in PXENV_UNDI_OPEN), and by forcibly
enabling interrupts on the NIC within PXENV_UNDI_TRANSMIT.  The latter
is something of a hack, but avoids the need to implement a complete
base-code ISR that we would otherwise need if we were to enter the NBP
with interrupts enabled.

11 years ago[rtl8139] Split debug messages into DBGLVL_LOG and DBGLVL_EXTRA
Michael Brown [Tue, 23 Jun 2009 19:41:44 +0000 (20:41 +0100)]
[rtl8139] Split debug messages into DBGLVL_LOG and DBGLVL_EXTRA

11 years ago[undi] Include PXENV_GET_IFACE_INFO's ServiceFlags in debug output
Michael Brown [Tue, 23 Jun 2009 18:26:07 +0000 (19:26 +0100)]
[undi] Include PXENV_GET_IFACE_INFO's ServiceFlags in debug output

11 years ago[e1000] Ensure descriptor is fully written before sending packet
Michael Brown [Tue, 23 Jun 2009 17:36:01 +0000 (18:36 +0100)]
[e1000] Ensure descriptor is fully written before sending packet

Reported-by: Mark McLoughlin <>
11 years ago[tcp] Avoid rewinding sequence numbers on receiving old duplicate ACKs
Michael Brown [Tue, 23 Jun 2009 15:10:34 +0000 (16:10 +0100)]
[tcp] Avoid rewinding sequence numbers on receiving old duplicate ACKs

Commit 558c1a4 ("[tcp] Improve robustness in the presence of duplicated
received packets") introduced a regression in that an old duplicate
ACK received while in the ESTABLISHED state would pass through normal
ACK processing, including updating tcp->snd_seq.

Fix by ensuring that ACK processing ignores all duplicate ACKs.

11 years ago[tcp] Attempt to catch all possible error cases with debug messages
Michael Brown [Tue, 23 Jun 2009 13:28:00 +0000 (14:28 +0100)]
[tcp] Attempt to catch all possible error cases with debug messages

All TCP errors or unusual events should now generate a debugging
message at DBGLVL_LOG, with enough information (SEQ and ACK numbers)
to be able to identify the corresponding packet (or missing packet) in
a network trace from the remote end.

11 years ago[tcp] Include current sequence numbers in "timer expired" messages
Michael Brown [Tue, 23 Jun 2009 13:03:09 +0000 (14:03 +0100)]
[tcp] Include current sequence numbers in "timer expired" messages

11 years ago[tcp] Move high-frequency debug messages to DBGLVL_EXTRA
Michael Brown [Tue, 23 Jun 2009 12:34:48 +0000 (13:34 +0100)]
[tcp] Move high-frequency debug messages to DBGLVL_EXTRA

This makes it possible to leave TCP debugging enabled in order to see
interesting TCP events, without flooding the console with at least one
message per packet.

11 years ago[image] Modify imgfree command to accept an argument
Joshua Oreman [Tue, 16 Jun 2009 18:46:13 +0000 (11:46 -0700)]
[image] Modify imgfree command to accept an argument

This resolves potential difficulties occurring when more than one script
is used. Total cost: 88 bytes uncompressed.

Signed-off-by: Michael Brown <>
11 years ago[netdevice] Adjust maximum link-layer header length for 802.11
Joshua Oreman [Mon, 15 Jun 2009 18:39:45 +0000 (11:39 -0700)]
[netdevice] Adjust maximum link-layer header length for 802.11

Signed-off-by: Michael Brown <>
11 years ago[netdevice] Add netdev argument to link-layer push and pull handlers
Joshua Oreman [Mon, 15 Jun 2009 18:37:43 +0000 (11:37 -0700)]
[netdevice] Add netdev argument to link-layer push and pull handlers

In order to construct outgoing link-layer frames or parse incoming
ones properly, some protocols (such as 802.11) need more state than is
available in the existing variables passed to the link-layer protocol
handlers. To remedy this, add struct net_device *netdev as the first
argument to each of these functions, so that more information can be
fetched from the link layer-private part of the network device.

Updated all three call sites (netdevice.c, efi_snp.c, pxe_undi.c) and
both implementations (ethernet.c, ipoib.c) of ll_protocol to use the
new argument.

Signed-off-by: Michael Brown <>
11 years ago[nvs] Add init function for Atmel 93C66 EEPROM
Joshua Oreman [Tue, 2 Jun 2009 01:36:25 +0000 (18:36 -0700)]
[nvs] Add init function for Atmel 93C66 EEPROM

The 93C66 is identical to the 93C56 in programming interface and
addressing, but twice as large in data storage (4096 bits). It's
used in some RTL8185 wireless cards.

Signed-off-by: Michael Brown <>
11 years ago[tcp] Improve robustness in the presence of duplicated received packets
Michael Brown [Tue, 23 Jun 2009 00:29:43 +0000 (01:29 +0100)]
[tcp] Improve robustness in the presence of duplicated received packets

gPXE responds to duplicated ACKs with an immediate retransmission,
which can lead to a sorceror's apprentice syndrome.  It also responds
to out-of-range (or old duplicate) ACKs with a RST, which can cause
valid connections to be dropped.

Fix the sorceror's apprentice syndrome by leaving the retransmission
timer running (and so inhibiting the immediate retransmission) when we
receive a potential duplicate ACK.  This seems to match the behaviour
of Linux observed via wireshark traces.

Fix the RST issue by sending RST only on out-of-range ACKs that occur
before the connection is fully established, as per RFC 793.

These problems were exposed during development of the 802.11 wireless
link layer; the 802.11 protocol has a failure mode that can easily
cause duplicated packets.  The fixes were tested in a controlled way
by faking large numbers of duplicated packets in the rtl8139 driver.

Originally-fixed-by: Joshua Oreman <>
11 years ago[settings] Fix setting_cmp() to handle nameless settings
Shao Miller [Thu, 11 Jun 2009 19:12:27 +0000 (15:12 -0400)]
[settings] Fix setting_cmp() to handle nameless settings

setting_cmp() compares by option tag and then by name.  Empty names
will always match, which gives us a false positive.

Fix by explicitly checking for empty names.

Modified-by: Michael Brown <>
Signed-off-by: Michael Brown <>
11 years ago[netdevice] Fix incorrect value for MAX_LL_HEADER_LEN
Michael Brown [Fri, 5 Jun 2009 00:06:07 +0000 (01:06 +0100)]
[netdevice] Fix incorrect value for MAX_LL_HEADER_LEN

MAX_LL_HEADER_LEN is erroneously set to 6 rather than 14, resulting
in possible data corruption whenever we send an ARP packet.

Fix value and add a comment explaining why MAX_LL_ADDR_LEN is greater

Reported-by: Joshua Oreman <>
11 years ago[script] Allow for DOS-style line endings in scripts
Michael Brown [Wed, 3 Jun 2009 09:13:29 +0000 (10:13 +0100)]
[script] Allow for DOS-style line endings in scripts

Windows text editors such as Notepad tend to use CRLF line endings,
which breaks gPXE's signature detection for script images.  Since
scripts are usually very small, they end up falling back to being
detected as valid PXE executable images (since there are no signature
checks for PXE executables).  Executing text files as x86 machine code
tends not to work well.

Fix by allowing for any isspace() character to terminate the "#!gpxe"
signature, and by ensuring that CR characters get stripped during
command line parsing.

Suggested-by: Shao Miller <>
11 years ago[misc] Remove long-obsolete header files dating from Etherboot 5.4
Michael Brown [Wed, 3 Jun 2009 09:09:28 +0000 (10:09 +0100)]
[misc] Remove long-obsolete header files dating from Etherboot 5.4

11 years ago[misc] Fix source files erroneously marked as executable
Michael Brown [Tue, 2 Jun 2009 10:25:38 +0000 (11:25 +0100)]
[misc] Fix source files erroneously marked as executable

11 years ago[spi] Add address-length autodetection to the SPI bit-bashing code
Michael Brown [Thu, 28 May 2009 13:45:32 +0000 (14:45 +0100)]
[spi] Add address-length autodetection to the SPI bit-bashing code

Several SPI chips will respond to an SPI read command with a dummy
zero bit immediately prior to the first real data bit.  This can be
used to autodetect the address length, provided that the command
length and data length are already known, and that the MISO data line
is tied high.

Tested-by: Thomas Miletich <>
Debugged-by: Thomas Miletich <>
11 years ago[build] Add -fno-dwarf2-cfi-asm to CFLAGS if supported by the gcc in use
Michael Brown [Wed, 27 May 2009 01:21:45 +0000 (02:21 +0100)]
[build] Add -fno-dwarf2-cfi-asm to CFLAGS if supported by the gcc in use

gcc 4.4 defaults to using .cfi assembler directives for debugging
information, which causes unneeded .eh_frame sections to be generated.
These sections are already stripped out by our linker script, so don't
affect the final build, but do distort the output of "size" when run
on individual .o files; the .eh_frame size is included within the size
reported for .text.  This makes it difficult to accurately judge the
effects of source code changes upon object code size.

Fix by adding -fno-dwarf2-cfi-asm to CFLAGS if we detect that this
option is supported by the gcc that we are compiling with.

Tested-by: Daniel Verkamp <>
11 years ago[comboot] Implement stub calls for auxiliary data vector handling
Daniel Verkamp [Mon, 25 May 2009 20:32:48 +0000 (16:32 -0400)]
[comboot] Implement stub calls for auxiliary data vector handling

Signed-off-by: Michael Brown <>
11 years ago[ethernet] Add MII link status functions from Linux
Daniel Verkamp [Wed, 10 Dec 2008 08:35:02 +0000 (02:35 -0600)]
[ethernet] Add MII link status functions from Linux

Signed-off-by: Michael Brown <>
11 years ago[ethernet] Update mii.h and use it in drivers that had a private copy
Daniel Verkamp [Wed, 10 Dec 2008 08:30:54 +0000 (02:30 -0600)]
[ethernet] Update mii.h and use it in drivers that had a private copy

Signed-off-by: Michael Brown <>
11 years ago[ethernet] Move struct mii_if_info to mii.h
Daniel Verkamp [Wed, 10 Dec 2008 07:11:50 +0000 (01:11 -0600)]
[ethernet] Move struct mii_if_info to mii.h

Signed-off-by: Michael Brown <>
11 years ago[settings] Allow for arbitrarily-named settings
Michael Brown [Tue, 26 May 2009 10:05:58 +0000 (11:05 +0100)]
[settings] Allow for arbitrarily-named settings

This provides a mechanism for using arbitrarily-named variables within
gPXE, using the existing syntax for settings.

11 years ago[multiboot] Include argv[0] as part of "command line"
Michael Brown [Tue, 26 May 2009 05:58:53 +0000 (06:58 +0100)]
[multiboot] Include argv[0] as part of "command line"

Grub will include the module name as part of the command line, and
some multiboot kernels expect this to be done.

11 years ago[dhcp] Choose ProxyDHCP port based on presence of PXE options
Michael Brown [Thu, 21 May 2009 09:22:42 +0000 (10:22 +0100)]
[dhcp] Choose ProxyDHCP port based on presence of PXE options

If the ProxyDHCPOFFER already includes PXE options (i.e. option 60 is
set to "PXEClient" and option 43 is present) then assume that the
ProxyDHCPREQUEST can be sent to port 67, rather than port 4011.  This
is a reasonable assumption, since in that case the ProxyDHCP server
has already demonstrated by responding to the DHCPDISCOVER that it is
listening on port 67.  (If the ProxyDHCP server were not listening on
port 67, then the standard DHCP server would have been configured to
respond with option 60 set to "PXEClient" but no option 43 present.)

The PXE specification is ambiguous on this point; the specified
behaviour covers only the cases in which option 43 is *not* present in
the ProxyDHCPOFFER.  In these cases, we will continue to send the
ProxyDHCPREQUEST to port 4011.

This change is required in order to allow us to interoperate with
dnsmasq, which listens only on port 67.  (dnsmasq relies on
unspecified behaviour of the Intel PXE stack, which it seems will
retain the ProxyDHCPOFFER as an options source and never issue a
ProxyDHCPREQUEST, thereby enabling dnsmasq to omit listening on port

11 years ago[serial] Define constants for serial port I/O addresses
Thomas Miletich [Thu, 21 May 2009 08:50:48 +0000 (10:50 +0200)]
[serial] Define constants for serial port I/O addresses

Tested with COM1 and COM2.

Signed-off-by: Michael Brown <>
11 years ago[tftp] Process OACKs even if malformed
Michael Brown [Wed, 20 May 2009 09:03:13 +0000 (10:03 +0100)]
[tftp] Process OACKs even if malformed

IBM Tivoli PXE Server is reported to send trailing garbage
bytes at the end of the OACK packet, which causes gPXE to reject the
packet and abort the TFTP transfer.

Work around the problem by processing as much as possible of the OACK,
and treating name/value parsing errors as non-fatal.

Reported-by: Shao Miller <>
11 years ago[settings] Fix erroneous bit-masking in fetch_uintz_setting()
Michael Brown [Wed, 20 May 2009 07:54:41 +0000 (08:54 +0100)]
[settings] Fix erroneous bit-masking in fetch_uintz_setting()

11 years ago[dhcp] Send broadcast PXE boot server discovery requests to port 67
Michael Brown [Wed, 20 May 2009 07:16:51 +0000 (08:16 +0100)]
[dhcp] Send broadcast PXE boot server discovery requests to port 67

We currently send all boot server discovery requests to port 4011.
Section 2.2.1 of the PXE spec states that boot server discovery
packets should be "sent broadcast (port 67), multicast (port 4011), or
unicast (port 4011)".  Adjust our behaviour so that any boot server
discovery packets that are sent to the broadcast address are directed
to port 67 rather than port 4011.

This is required for operation with dnsmasq as a PXE server, since
dnsmasq listens only on port 67, and relies upon this (specified)

This change may break some setups using the (itself very broken) Linux
PXE server from  This server will, in its default
configuration, listen only on port 4011.  It never constructs a boot
server list (PXE_BOOT_SERVERS, option 43.8), and uses the wrong
definitions for the discovery control bits (PXE_DISCOVERY_CONTROL,
option 43.6).  The upshot is that it will always instruct the client
to perform multicast and broadcast discovery only.  In setups lacking
a valid multicast route on the server side, this used to work because
gPXE would eventually give up on the (non-responsive) multicast
address and send a broadcast request to port 4011, which the Linux PXE
server would respond to.  Now that gPXE correctly sends this broadcast
request to port 67 instead, it is never seen by the Linux PXE server,
and the boot fails.  The fix is to either (a) set up a multicast route
correctly on the server side before starting the PXE server, or (b)
edit /etc/pxe.conf to contain the server's unicast address in the
"multicast_address" field (a hack that happens to work).

Suggested-by: Simon Kelley <>
11 years ago[dhcp] Perform ProxyDHCP only if we do not already have PXE options
Michael Brown [Tue, 19 May 2009 14:54:35 +0000 (15:54 +0100)]
[dhcp] Perform ProxyDHCP only if we do not already have PXE options

This prevents gPXE from wasting time attempting to contact a ProxyDHCP
server on port 4011 if the DHCP response already contains the relevant
PXE options.  This behaviour is hinted at (though not explicitly
specified) in the PXE spec, and seems to match what the Intel client

Suggested-by: Simon Kelley <>
11 years ago[legal] Add FILE_LICENCE declaration to romprefix.S
Michael Brown [Mon, 18 May 2009 08:33:36 +0000 (09:33 +0100)]
[legal] Add FILE_LICENCE declaration to romprefix.S

11 years ago[legal] Add a selection of FILE_LICENCE declarations
Michael Brown [Fri, 1 May 2009 14:41:06 +0000 (15:41 +0100)]
[legal] Add a selection of FILE_LICENCE declarations

Add FILE_LICENCE declarations to almost all files that make up the
various standard builds of gPXE.

11 years ago[legal] Add and %.licence make target
Michael Brown [Wed, 29 Apr 2009 07:51:27 +0000 (08:51 +0100)]
[legal] Add and %.licence make target

It is now possible to run e.g.

  make bin/rtl8139.dsk.licence

in order to see a licensing assessment for any given gPXE build.  The
assessment will either produce a single overall licence for the build
(based on combining all the licences used within the source files for
that build), or will exit with an error stating why a licence
assessment is not possible (for example, if there are files involved
that do not yet contain an explicit FILE_LICENCE() declaration).

11 years ago[legal] Add mechanism for explicit per-file licence declarations
Michael Brown [Mon, 27 Apr 2009 13:11:59 +0000 (14:11 +0100)]
[legal] Add mechanism for explicit per-file licence declarations

For partly historical reasons, various files in the gPXE source tree
are licensed under different, though compatible, terms.  Most of the
code is licensed under GPLv2 with the "or later" clause, but there are
exceptions such as:

  The string.h file, which derives from Linux and is licensed as
  Public Domain.

  The EFI header files, which are taken from the EDK2 source tree and
  are licensed under BSD.

  The 3c90x driver, which has a custom GPL-like licence text.

Introduce a FILE_LICENCE() macro to make licensing more explicit.
This macro should be applied exactly once to each source (.c, .S or
.h) file.  It will cause a corresponding zero-sized common symbol to
be added to any .o files generated from that source file (and hence to
any final gPXE binaries generated from that source file).  Determining
the applicable licences to generated files can then be done using e.g.

  $ objdump -t bin/process.o | grep __licence
  00000000       O *COM*  00000001 .hidden __licence_gpl2_or_later

indicating that bin/process.o is covered entirely by the GPLv2
with the "or later" clause, or

  $ objdump -t bin/rtl8139.dsk.tmp | grep __licence
  00033e8c g     O .bss.textdata  00000000 .hidden __licence_gpl2_only
  00033e8c g     O .bss.textdata  00000000 .hidden __licence_gpl2_or_later
  00033e8c g     O .bss.textdata  00000000 .hidden __licence_public_domain

indicating that bin/rtl8139.dsk includes both code licensed under
GPLv2 (both with and without the "or later" clause) and code licensed
as Public Domain.

Determining the result of licence combinations is currently left as an
exercise for the reader.

11 years ago[legacy] Remove long-obsolete old dhcp.h file
Michael Brown [Fri, 1 May 2009 14:58:20 +0000 (15:58 +0100)]
[legacy] Remove long-obsolete old dhcp.h file

11 years ago[pxeprefix] Work around bug in Etherboot 5.4 when loading undionly.kpxe
Michael Brown [Thu, 30 Apr 2009 03:42:21 +0000 (04:42 +0100)]
[pxeprefix] Work around bug in Etherboot 5.4 when loading undionly.kpxe

Etherboot 5.4 erroneously treats PXENV_UNLOAD_STACK as the "final
shutdown" call, and unhooks INT15.  When using gPXE's undionly.kpxe,
this results in gPXE overwriting the portion of Etherboot located in
high memory, because it is no longer hidden from the system memory map
at the time that gPXE loads.

Work around this by explicitly testing for Etherboot as the underlying
PXE stack (as is already done in undinet.c) and skipping the call to
PXENV_UNLOAD_STACK if necessary.