12 years ago[802.11] Modify 802.11 layer to use ieee80211_next_ie() to step through IEs
Joshua Oreman [Thu, 18 Jun 2009 22:21:09 +0000 (15:21 -0700)]
[802.11] Modify 802.11 layer to use ieee80211_next_ie() to step through IEs

This replaces an old method of "ie_byte += ie->len + 2; ie = ie_byte;"
that was ad-hoc and bug-prone.

12 years ago[802.11] Clean up, document, and add helper inline functions to ieee80211.h
Joshua Oreman [Thu, 18 Jun 2009 22:20:14 +0000 (15:20 -0700)]
[802.11] Clean up, document, and add helper inline functions to ieee80211.h

12 years ago[drivers rtl8180] Only report TX status once per packet
Joshua Oreman [Thu, 18 Jun 2009 00:49:21 +0000 (17:49 -0700)]
[drivers rtl8180] Only report TX status once per packet

A missing check in the TX status-reporting code caused the whole
TX ring to be reported complete every time a packet was transmitted,
with NULL io_buffers passed to net80211_tx_complete() for the spurious

12 years ago[802.11] Fix packet duplication elimination state
Joshua Oreman [Thu, 18 Jun 2009 00:47:34 +0000 (17:47 -0700)]
[802.11] Fix packet duplication elimination state

Using a signed 16-bit value to store an unsigned 16-bit field caused
packets with sequence numbers above 2048 to be ignored by the
duplication elimination code.

12 years ago[drivers rtl8180] Provide retry information with TX completion
Joshua Oreman [Wed, 17 Jun 2009 07:47:36 +0000 (00:47 -0700)]
[drivers rtl8180] Provide retry information with TX completion

12 years ago[802.11] Recognize retransmitted packets
Joshua Oreman [Wed, 17 Jun 2009 07:46:39 +0000 (00:46 -0700)]
[802.11] Recognize retransmitted packets

This functionality will be needed by the rate-control function when it
is implemented; it can also be useful for debugging.

12 years ago[802.11] Clean up channel and rate handling
Joshua Oreman [Tue, 16 Jun 2009 07:51:35 +0000 (00:51 -0700)]
[802.11] Clean up channel and rate handling

12 years ago[802.11] Add status-printing callback
Joshua Oreman [Tue, 16 Jun 2009 07:21:03 +0000 (00:21 -0700)]
[802.11] Add status-printing callback

12 years ago[Makefile] Remove -Wformat-nonliteral command-line option
Joshua Oreman [Tue, 16 Jun 2009 07:16:20 +0000 (00:16 -0700)]
[Makefile] Remove -Wformat-nonliteral command-line option

There are cases where using a format string indexed from an array
is the most efficient way to handle something; the particular case that
prompted this change involved a code-size savings of 60 bytes in the
802.11 status code.

12 years ago[netdevice] Add print_status callback for link-layer-specific state
Joshua Oreman [Tue, 16 Jun 2009 06:39:17 +0000 (23:39 -0700)]
[netdevice] Add print_status callback for link-layer-specific state

struct net_device now includes a callback, defaulting to NULL, that may
be set by the link-layer setup code if there is important state
associated with the link layer that needs to be visible to an "ifstat".
This is the case, for instance, with 802.11, where it can be quite
important to know what channel, SSID, and transmission power are
being used.

Modified ifstat() to call netdev->print_status() in addition to its normal
output if the callback is non-NULL.

12 years ago[802.11] Remember to NUL-terminate SSID before printing it in a DBGC() call
Joshua Oreman [Mon, 15 Jun 2009 21:31:56 +0000 (14:31 -0700)]
[802.11] Remember to NUL-terminate SSID before printing it in a DBGC() call

12 years ago[802.11] Debug and output cleanup, minor association improvements
Joshua Oreman [Mon, 15 Jun 2009 21:00:13 +0000 (14:00 -0700)]
[802.11] Debug and output cleanup, minor association improvements

Core 802.11 code now uniformly uses DBGC() or DBGC2() with messages
starting with "802.11 %p", per mcb30's suggestion. Removed the
"[802.11 associating... ok, <network>]" status display.

We now clear NET80211_AUTHENTICATED when switching networks, fixing a
bug that caused SSID switches after association to fail.

The association process will now resend an authentication or
association packet if it does not receive a response within one
second, and will limit itself to 2 tries before giving up with a
"timed out" error. Both of these parameters are configurable via

12 years agoMerge branch 'master' into wireless
Joshua Oreman [Sat, 13 Jun 2009 18:49:23 +0000 (11:49 -0700)]
Merge branch 'master' into wireless

12 years agoMerge branch 'master' of git://
Joshua Oreman [Sat, 13 Jun 2009 18:49:15 +0000 (11:49 -0700)]
Merge branch 'master' of git://

12 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 <>
12 years ago[802.11] Properly reset state on interface closure
Joshua Oreman [Sat, 13 Jun 2009 02:03:17 +0000 (19:03 -0700)]
[802.11] Properly reset state on interface closure

This fixes a bug that caused ifopen, ifclose, dhcp to fail.

12 years ago[drivers rtl8180] Use CTS protection when necessary
Joshua Oreman [Sat, 13 Jun 2009 02:02:48 +0000 (19:02 -0700)]
[drivers rtl8180] Use CTS protection when necessary

12 years ago[802.11] Add high-level support for CTS protection
Joshua Oreman [Sat, 13 Jun 2009 02:01:23 +0000 (19:01 -0700)]
[802.11] Add high-level support for CTS protection

This involves calculating the rate to use for RTS/CTS packets
whenever we change the basic data rate. From there it's up to
the driver to program the card to use the CTS if phy_flags
has the NET80211_PHY_USE_PROTECTION bit set.

12 years ago[802.11] Fix erroneous handling of rates element in association request
Joshua Oreman [Sat, 13 Jun 2009 01:14:13 +0000 (18:14 -0700)]
[802.11] Fix erroneous handling of rates element in association request

When associating with an access point, the standard implies that
we are to send in our association request frame the intersection
between our hardware's supported rates and the rates the AP claimed
it supported in its beacon, marking as "basic" those rates that
were marked as "basic" in the AP's beacon to us. The previous code
erroneously sent simply the hardware's supported rates list, without
consideration to the AP's list and without marking any as "basic".
The AP I was testing with allowed this, but most will not.

12 years ago[802.11] Add DBGP()-level hex dumps of beacon received and assoc-req sent
Joshua Oreman [Sat, 13 Jun 2009 00:56:11 +0000 (17:56 -0700)]
[802.11] Add DBGP()-level hex dumps of beacon received and assoc-req sent

12 years ago[802.11] Add settings applicator and error-propagating code
Joshua Oreman [Sat, 13 Jun 2009 00:18:45 +0000 (17:18 -0700)]
[802.11] Add settings applicator and error-propagating code

802.11-specific error codes are encoded using the 32 possible per-file
errors and four POSIX error codes: ECONNREFUSED and EHOSTUNREACH for
rejected associations explained by a status code, and ECONNRESET and
ENETRESET for later disassociations explained by a reason code. In
each case the second POSIX error is used if the 802.11 code is greater
than 32, since each type of error has currently defined values up to
45 or 50. In this way, we keep all error information necessary without
going outside the established gPXE error-reporting mechanism.

Also added a settings applicator; changing net0/ssid while an 802.11
device is open should cause it to associate with the new network.

12 years ago[802.11] Comments and cleanup for 802.11 code
Joshua Oreman [Fri, 12 Jun 2009 02:49:04 +0000 (19:49 -0700)]
[802.11] Comments and cleanup for 802.11 code

Completely documented the structures and functions for the core 802.11
code. Renamed "ERP parameters" to PHY parameters, because they apply
whether we're on an ERP network or not. Cleaned up fragment processing
code - it had been quite ugly because I assumed we had to handle
fragments received out of order, and we don't. Cleaned up output of
the association task, so it'll now look something like

  Waiting for link-up on net0... [802.11 associating... ok, <network>] ok.

12 years ago[drivers rtl8180] Update rtl8180 driver for aesthetic net80211 changes
Joshua Oreman [Fri, 12 Jun 2009 02:48:16 +0000 (19:48 -0700)]
[drivers rtl8180] Update rtl8180 driver for aesthetic net80211 changes

12 years ago[netdevice] Change "Network device pointer" to "Network device" in comments
Joshua Oreman [Fri, 12 Jun 2009 02:46:22 +0000 (19:46 -0700)]
[netdevice] Change "Network device pointer" to "Network device" in comments

12 years ago[802.11] Fix a compile error that popped up when cleaning up hidden->active
Joshua Oreman [Tue, 9 Jun 2009 05:32:58 +0000 (22:32 -0700)]
[802.11] Fix a compile error that popped up when cleaning up hidden->active

12 years agoMerge branch 'master' into wireless
Joshua Oreman [Tue, 9 Jun 2009 05:12:25 +0000 (22:12 -0700)]
Merge branch 'master' into wireless


            Updated for MAX_LL_HEADER_LEN == 32 for 802.11,
            with explanatory comment.

12 years agoMerge branch 'master' of git://
Joshua Oreman [Tue, 9 Jun 2009 05:07:42 +0000 (22:07 -0700)]
Merge branch 'master' of git://

12 years ago[802.11] Bugfix and minor improvement potpourri
Joshua Oreman [Tue, 9 Jun 2009 05:01:52 +0000 (22:01 -0700)]
[802.11] Bugfix and minor improvement potpourri

Bugs fixed:
- Call net80211_prepare_default() as soon as the device is opened,
  in case some unscrupulous code tries to transmit regardless of
  the fact that the link is down.
- If the association process is running when we're closed, kill it.
- Initialize the list head for the parallel queue of signal strengths
  of packets in the management queue.
- When advancing to the next info element in a management packet, we
  need to advance by ie->len + 2 bytes, not just ie->len. ie->len
  doesn't include the two bytes of header.
- If probe doesn't return anything, set an error code (ETIMEDOUT)
  instead of leaving it at "Error in association: no error".
- Set NET80211_WAITING state when we send an auth or assoc packet,
  so we don't try to keep processing while we're waiting for the

Minor improvements made:
- Call the hidden-SSID setting "active-scan" instead of "hidden";
  it makes its ultimate purpose clearer, and there may be times
  people want an active scan without a hidden-SSID network around.
  (Beacons are usually transmitted with fairly low power; if the
  signal strength is poor, active scanning makes it easier to
  find the network.)
- Give the probe 4 seconds to find a better AP, up from 2. Hard
  timeout if it can't find anything at all is still at 6 seconds.
  I will probably adjust these more later.
- Probe where netX/ssid isn't set will pick up the network with the
  best signal strength around.
- Cleaned up the messages output a bit.
- Display 802.11 reason code when we receive a deauth or disassoc
  message, and don't try to reassociate - there's usually a deeper
  issue than "the AP decided it didn't like us".

12 years ago[dhcp] Await link-up before starting DHCP
Joshua Oreman [Tue, 9 Jun 2009 04:46:56 +0000 (21:46 -0700)]
[dhcp] Await link-up before starting DHCP

The existing code does not check for link-up status on an interface
before it begins sending DHCP requests. On wired NICs, this is mostly
harmless, as the link comes up quickly and the DHCP requests are
retried several times. On wireless, though, the "link-up" process
involves a network scan and association that can take several seconds,
and it's best to wait to start sending DHCP packets until that's over.

I chose 15 seconds as the timeout, to match autoboot.

12 years ago[netdevice] Adjust maximum link-layer header length for 802.11
Joshua Oreman [Tue, 9 Jun 2009 04:46:05 +0000 (21:46 -0700)]
[netdevice] Adjust maximum link-layer header length for 802.11

802.11 link-layer headers can be up to 32 bytes (24 for the frame header
and 8 for the 802.3 LLC/SNAP header).

12 years ago[drivers rtl8180] Debugging tweaks, decrease ring size, ignore DMA errors
Joshua Oreman [Tue, 9 Jun 2009 04:40:09 +0000 (21:40 -0700)]
[drivers rtl8180] Debugging tweaks, decrease ring size, ignore DMA errors

This card generates a very large number of RX packets with the DMA_FAIL
status flag set. As best I can tell, this is a somewhat brain-damaged way
of flagging packets that were garbled upon reception (as is rather common
on wireless networks). The Linux driver ignores such packets, and we will

Also decreased the ring size from 16 to 8 descriptors in each of TX and RX,
so we don't do quite such a number on the heap. 802.11 frames can be up to
2356 bytes, so with the alignment constraints of io_buffers we need 4k off
the bat for each RX descriptor.

Finally, changed some debugging messages a bit. Changed the tx status code
for "this packet was not ACKed properly" from EBUSY to EIO as more befitting
the situation.

12 years ago[802.11] MAC layer: Add probe functionality, other small improvements
Joshua Oreman [Mon, 8 Jun 2009 06:37:33 +0000 (23:37 -0700)]
[802.11] MAC layer: Add probe functionality, other small improvements

The MAC layer is now theoretically complete enough to use for booting.
We'll see if it works.

12 years ago[802.11] Fix sequence number fields in ieee80211.h
Joshua Oreman [Mon, 8 Jun 2009 06:35:32 +0000 (23:35 -0700)]
[802.11] Fix sequence number fields in ieee80211.h

The IEEE 802.11 documentation confusingly diagrams the LSB of a field to the
left of the page; this had caused me to reverse the order of the seqnr and
fragment fields in the Sequence Control field in 802.11 frame headers.

12 years ago[drivers rtl8180] Fix a couple bugs, add a bunch of debugging
Joshua Oreman [Mon, 8 Jun 2009 06:31:59 +0000 (23:31 -0700)]
[drivers rtl8180] Fix a couple bugs, add a bunch of debugging

Fixed a few small bugs: no .id_count in rtl8180_driver, EEPROM read/write bits
reversed, netdev->pdev wasn't set properly.

Current state of the card: it gets set up fine, and can even rx small packets
(at least 64 bytes), but anything bigger than 85 bytes (or possibly smaller)
triggers a DMA failure indication.

12 years ago[aesthetic] Adjust parenthesis spacing on net80211.[ch] to fit gPXE style
Joshua Oreman [Sun, 7 Jun 2009 05:28:50 +0000 (22:28 -0700)]
[aesthetic] Adjust parenthesis spacing on net80211.[ch] to fit gPXE style

12 years ago[drivers rtl8180] Updated rtl8180 driver for API changes
Joshua Oreman [Sun, 7 Jun 2009 04:57:05 +0000 (21:57 -0700)]
[drivers rtl8180] Updated rtl8180 driver for API changes

Updated the rtl8180 driver to pass signal strength to net80211_rx()
instead of storing it in the net80211_device, and to use dev->state
instead of dev->assoc in configuring the RX filter. Also added a
forgotten initialization step (setting MAC address if the user changed

12 years ago[802.11] The 802.11 MAC layer, second big commit
Joshua Oreman [Sun, 7 Jun 2009 04:47:29 +0000 (21:47 -0700)]
[802.11] The 802.11 MAC layer, second big commit

With this commit the MAC layer is almost "barebones feature-complete";
the only things I still need to implement before I can test is the
network probe functionality. Various changes include:

- net80211_device.channels is now a statically declared array, to
  avoid constantly reallocating it.
- net80211_device.assoc has been replaced by "state", containing a
  set of flags (authenticated, associated, etc) related to the
  association process as well as the most recent IEEE status code from
  said process.
- Signal strength info has been moved from a per-device to a per-frame
  basis, since its only real use (choosing between different APs on
  the same network while scanning) requires that.
    -> The code for this would be made much cleaner if there were
       space for a couple bytes of private data in io_buffer.
- The net80211_wlan structure has been amended to include a copy of
  the beacon from this access point and an authentication-method state
  variable for the association task. Association now can be handled
  just by passing one structure around.
- Added net80211_prepare_default(), to create a default list of
  channels to listen on during network scanning.
- Implemented the association API described on my notes page.
- Added settings for SSID and hidden-network-ness.
- Added a function to send an arbitrary management frame.
- Added processing for received beacons.
- Implemented most of the association process.

12 years ago[802.11] The 802.11 MAC layer, first big commit
Joshua Oreman [Fri, 5 Jun 2009 04:06:16 +0000 (21:06 -0700)]
[802.11] The 802.11 MAC layer, first big commit

Implemented much of the basic functionality required of the 802.11 MAC
layer. gPXE with rtl8180 compiled in will now link, but should not be
tested yet because the rather fundamental "associate with a network"
function is one of the ones still stubbed.

12 years ago[drivers rtl8180] Make a #define clearer
Joshua Oreman [Fri, 5 Jun 2009 04:05:34 +0000 (21:05 -0700)]
[drivers rtl8180] Make a #define clearer

12 years ago[netdevice] Add netdev argument to ll_protocol::push, pull
Joshua Oreman [Fri, 5 Jun 2009 04:02:02 +0000 (21:02 -0700)]
[netdevice] Add netdev argument to ll_protocol::push, pull

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 ll_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 netdev.

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

12 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 <>
12 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 <>
12 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

12 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

12 years ago[drivers rtl8180] Fix rtl8225 rf idnumber - was 10, should be 9
Joshua Oreman [Tue, 2 Jun 2009 04:04:54 +0000 (21:04 -0700)]
[drivers rtl8180] Fix rtl8225 rf idnumber - was 10, should be 9

12 years ago[drivers rtl8180] Fix the main rtl8180 driver filename
Joshua Oreman [Tue, 2 Jun 2009 03:49:34 +0000 (20:49 -0700)]
[drivers rtl8180] Fix the main rtl8180 driver filename

The Linux driver named the main file rtl8180_dev.c, which does not fit existing
gPXE conventions. Rename deferred to a separate commit so as not to mess up the

12 years ago[drivers rtl8180] First shot at an rtl8180/8185 driver
Joshua Oreman [Tue, 2 Jun 2009 03:48:50 +0000 (20:48 -0700)]
[drivers rtl8180] First shot at an rtl8180/8185 driver

I trimmed and ported the Linux rtl8180 driver, supporting the 8180
and 8185 chipsets, to gPXE's fledgling 802.11 layer. The result
compiles but does not yet link because none of the generic 802.11
functions have been written yet. Code size is 3k for the card and
up to 8k for the RF initialization (lots of constants).

This chipset is often bundled with different RF modules; I've
included support for the four supported by the Linux driver using
gPXE's linker tables. The rtl8225 chip supports 802.11g on 8185
cards; the other three are similar and support 802.11b on 8180

# Please enter the commit message for your changes.
# (Comment lines starting with '#' will not be included)
# On branch wireless
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
# modified:   Makefile
# new file:   drivers/net/rtl818x/rtl8180.c
# modified:   drivers/net/rtl818x/rtl8180.h
# deleted:    drivers/net/rtl818x/rtl8180_dev.c
# modified:   drivers/net/rtl818x/rtl8180_grf5101.c
# deleted:    drivers/net/rtl818x/rtl8180_grf5101.h
# modified:   drivers/net/rtl818x/rtl8180_max2820.c
# deleted:    drivers/net/rtl818x/rtl8180_max2820.h
# modified:   drivers/net/rtl818x/rtl8180_rtl8225.c
# deleted:    drivers/net/rtl818x/rtl8180_rtl8225.h
# modified:   drivers/net/rtl818x/rtl8180_sa2400.c
# deleted:    drivers/net/rtl818x/rtl8180_sa2400.h
# modified:   drivers/net/rtl818x/rtl818x.h
# modified:   include/gpxe/errfile.h
# modified:   include/gpxe/ieee80211.h
# modified:   include/gpxe/net80211.h
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
# ../#foo#
# ../._linux-2.6.29
# ../80211-notes.txt
# ../atheros/
# ../b43-tools/
# ../core
# ../dhcp-capture.pcap
# ../fireproxy-0.34.tar.gz
# ../fireproxy-0.34/
# ../firewire-chainload.patch
# ../flashrom/
# ../gdb-firewire-v2-v3-incr.patch
# ../gdb-firewire-v2.patch
# ../gdb-firewire-v3-v4-incr.patch
# ../gdb-firewire-v3.patch
# ../gdb-firewire-v4.patch
# ../gdb-firewire.patch
# ../gpxe.lkrn
# ../ieee1394_types.h
# ../lin-ohci1394.c
# ../lin-skge.c
# ../lin-skge.h
# ../lin-sky2.c
# ../lin-sky2.h
# ../linux-2.6.29/
# ../ohci1394.h
# ../ohci1394_dma_early-v3.diff
# ../pxe-ohci1394.c
# ../pxe-ohci1394.h
# ../pxe-skge.c
# ../pxe-skge.h
# ../pxe-sky2.c
# ../pxe-sky2.h
# ../sky2-incr-v1-v2.patch
# ../sky2-v2.patch
# ../sky2.patch
# drivers/net/rtl818x/#rtl8180_max2820.c#
# drivers/net/rtl818x/.#rtl8180_max2820.c
# ../wpa_supplicant-0.6.9.tar.gz
# ../wpa_supplicant-0.6.9/

12 years ago[802.11] Tweaks to API for clarity and practicality
Joshua Oreman [Tue, 2 Jun 2009 03:45:34 +0000 (20:45 -0700)]
[802.11] Tweaks to API for clarity and practicality

In working on the rtl8185 driver, I found some issues with the
generic 802.11 API as I had originally designed it, and modified
the API headers slightly to ameliorate or clarify.

12 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.

12 years ago[drivers 802.11] Initial import Realtek 8180/8185 driver from Linux
Joshua Oreman [Mon, 1 Jun 2009 18:57:03 +0000 (11:57 -0700)]
[drivers 802.11] Initial import Realtek 8180/8185 driver from Linux

This is the code of Linux kernel rtl8180 module, as of kernel 2.6.29,
as yet unmodified for gPXE. I'm importing it now so as to have a clear
record of the things I change.

Most of the code is quite simple, like with most Realtek drivers, but
things are complicated slightly by the presence of at least four
different RF modules that can be packaged with the rtl8180 chip.

12 years ago[802.11] Add net80211.h with preliminary declarations for gPXE's 802.11 layer
Joshua Oreman [Fri, 29 May 2009 23:59:02 +0000 (16:59 -0700)]
[802.11] Add net80211.h with preliminary declarations for gPXE's 802.11 layer

12 years ago[802.11] Add ieee80211.h defining standard constants and frame formats
Joshua Oreman [Fri, 29 May 2009 23:58:19 +0000 (16:58 -0700)]
[802.11] Add ieee80211.h defining standard constants and frame formats

12 years agoMerge branch 'master' of git://
Joshua Oreman [Thu, 28 May 2009 18:50:10 +0000 (11:50 -0700)]
Merge branch 'master' of git://

12 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 <>
12 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 <>
12 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 <>
12 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 <>
12 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 <>
12 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 <>
12 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.

12 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.

12 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

12 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 <>
12 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 <>
12 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()

12 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 <>
12 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 <>
12 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

12 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.

12 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).

12 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.

12 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

12 years agoMerge branch 'master' into official
Joshua Oreman [Sun, 3 May 2009 20:21:04 +0000 (13:21 -0700)]
Merge branch 'master' into official

12 years ago[fireserve] play nicer with reboots
Joshua Oreman [Sun, 3 May 2009 00:41:28 +0000 (17:41 -0700)]
[fireserve] play nicer with reboots

12 years agosky2: fix bugs - ring size too small, improper iob freeing
Joshua Oreman [Sun, 3 May 2009 00:41:06 +0000 (17:41 -0700)]
sky2: fix bugs - ring size too small, improper iob freeing

12 years agodon't dup fireserve line
Joshua Oreman [Sat, 2 May 2009 20:11:26 +0000 (13:11 -0700)]
don't dup fireserve line

12 years agono memdebug
Joshua Oreman [Sat, 2 May 2009 20:09:04 +0000 (13:09 -0700)]
no memdebug

12 years agomanual merge
Joshua Oreman [Sat, 2 May 2009 20:07:40 +0000 (13:07 -0700)]
manual merge

12 years agoMerge branch 'master' of git://
Joshua Oreman [Sat, 2 May 2009 19:56:00 +0000 (12:56 -0700)]
Merge branch 'master' of git://

12 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.

12 years ago[build] Add {PROVIDE,REQUIRE}_SYMBOL macros and tidy up compiler.h
Michael Brown [Mon, 27 Apr 2009 13:04:35 +0000 (14:04 +0100)]
[build] Add {PROVIDE,REQUIRE}_SYMBOL macros and tidy up compiler.h

12 years ago[i386] Remove long-obsolete realmode.c file
Michael Brown [Sun, 26 Apr 2009 05:41:41 +0000 (06:41 +0100)]
[i386] Remove long-obsolete realmode.c file

12 years ago[i386] Remove long-obsolete callbacks_arch.h file
Michael Brown [Sun, 26 Apr 2009 05:38:36 +0000 (06:38 +0100)]
[i386] Remove long-obsolete callbacks_arch.h file

12 years ago[build] Fix signed/unsigned division in util/zbin.c
Stefan Hajnoczi [Fri, 24 Apr 2009 09:21:07 +0000 (10:21 +0100)]
[build] Fix signed/unsigned division in util/zbin.c

Commit b149a99 ([build] Round up SUBx deltas) introduced a
signed/unsigned issue that affects gPXE images built on 32-bit hosts.
The zbin fixup utility performed an unsigned division, which led to
.usb images with an incorrect number of sectors to load.

The issue snuck by on 64-bit hosts since uint32_t is promoted to long.
On 32-bit hosts it is promoted to unsigned long.

Modified-by: Michael Brown <>
Signed-off-by: Michael Brown <>
12 years ago[elf] Work around entry point bug in NetBSD kernels
Michael Brown [Fri, 24 Apr 2009 02:42:34 +0000 (03:42 +0100)]
[elf] Work around entry point bug in NetBSD kernels

NetBSD kernels are multiboot ELF kernels with an entry point
incorrectly specified as a virtual address rather than a physical

Work around this by looking for the segment that could plausibly
contain the entry point address (interpreted as either a physical or
virtual address), and using that to determine the eventual physical
entry point.

In the event of any ambiguity, precedence is given to interpretation
of the entry point as a physical address.

12 years ago[multiboot] Work around raw-flag bug in Solaris kernels
Michael Brown [Fri, 24 Apr 2009 02:16:18 +0000 (03:16 +0100)]
[multiboot] Work around raw-flag bug in Solaris kernels

Solaris kernels are multiboot images with the "raw" flag set,
indicating that the loader should use the raw address fields within
the multiboot header rather than looking for an ELF header.  However,
the Solaris kernel contains garbage data in the raw address fields,
and requires us to use the ELF header instead.

Work around this by always using the ELF header if present.  This
renders the "raw" flag somewhat redundant.

12 years ago[doc] Remove obsolete README.pixify
Michael Brown [Sat, 18 Apr 2009 16:10:00 +0000 (17:10 +0100)]
[doc] Remove obsolete README.pixify

12 years ago[build] Automatically sort the list of constituent object sizes
Michael Brown [Sat, 18 Apr 2009 15:19:29 +0000 (16:19 +0100)]
[build] Automatically sort the list of constituent object sizes

12 years ago[build] Provide mechanism for listing constituent object sizes
Michael Brown [Sat, 18 Apr 2009 14:55:01 +0000 (15:55 +0100)]
[build] Provide mechanism for listing constituent object sizes

You can now type e.g.

  make bin/rtl8139.rom.sizes

in order to see the (uncompressed) sizes of all of the object files
linked in to bin/rtl8139.rom.  This should make it easier to identify
relevant code bloat.

12 years ago[build] Remove obsolete linker script files
Michael Brown [Fri, 17 Apr 2009 13:08:47 +0000 (14:08 +0100)]
[build] Remove obsolete linker script files

12 years ago[build] Kill off the multiple-object-per-source-file mechanism
Michael Brown [Fri, 17 Apr 2009 12:43:35 +0000 (13:43 +0100)]
[build] Kill off the multiple-object-per-source-file mechanism

Now that there are no remaining multiple-object source files, kill off
the mechanism in order to simplify the Makefile.

12 years ago[build] Kill off the last multiple-object source file
Michael Brown [Fri, 17 Apr 2009 12:38:18 +0000 (13:38 +0100)]
[build] Kill off the last multiple-object source file

The build mechanism currently allows for multiple objects per source
file.  The only remaining user of this is unnrv2b.S.  Replace this
usage with a separate unnrv2b16.S wrapper file, as is currently used
for e.g. pxeprefix.S and kpxeprefix.S.

12 years ago[build] Provide mechanism for listing per-target source files
Michael Brown [Fri, 17 Apr 2009 11:38:44 +0000 (12:38 +0100)]
[build] Provide mechanism for listing per-target source files

You can now type e.g.

  make bin/rtl8139.rom.deps

to see a list of the source files included in the build of
bin/rtl8139.rom.  This is intended to assist with copyright vetting.

Other new debugging targets include

  make bin/rtl8139.rom.objs

to see a list of object files linked in to bin/rtl8139.rom, and

  make bin/rtl8139.rom.nodeps

to see a list of the source files that are *not* required for the
build of bin/rtl8139.rom.

12 years ago[build] Simplify use of Getopt::Long in
Michael Brown [Thu, 16 Apr 2009 05:13:09 +0000 (06:13 +0100)]
[build] Simplify use of Getopt::Long in

Sometimes it's just so much fun doing things the complicated way that
you forget to check the man page for the existence of a simpler

12 years ago[build] Reinstate the .pdsk padded-floppy image format
Michael Brown [Thu, 16 Apr 2009 04:59:44 +0000 (05:59 +0100)]
[build] Reinstate the .pdsk padded-floppy image format

Some utilities that expect a floppy disk image (e.g. iLO?) may test
for a file of the correct size.  Reinstate the .pdsk image format in
order to provide this if needed.

12 years ago[build] Pad .rom, .dsk, and .hd images to 512-byte boundaries
Michael Brown [Thu, 16 Apr 2009 02:15:08 +0000 (03:15 +0100)]
[build] Pad .rom, .dsk, and .hd images to 512-byte boundaries

QEMU will silently round down a disk or ROM image file to the nearest
512 bytes.  Fix by always padding .rom, .dsk and .hd images to the
nearest 512-byte boundary.

Originally-fixed-by: Stefan Hajnoczi <>
12 years agoMerge branch 'master' of git://
Joshua Oreman [Wed, 15 Apr 2009 23:20:49 +0000 (16:20 -0700)]
Merge branch 'master' of git://

12 years ago[dhcp] Accept filename via DHCP option 67 as well as BOOTP filename field
Michael Brown [Wed, 15 Apr 2009 20:08:02 +0000 (21:08 +0100)]
[dhcp] Accept filename via DHCP option 67 as well as BOOTP filename field

Allow options with dedicated BOOTP fields to fall back to using the
equivalent DHCP option if the relevant field is empty.

12 years ago[smbios] Add asset tag setting
Timothy Stack [Tue, 31 Mar 2009 22:20:07 +0000 (15:20 -0700)]
[smbios] Add asset tag setting

Add SMBIOS asset tag as a named setting.

Signed-off-by: Michael Brown <>
12 years ago[gdb] Allow resynchronisation with gdb
Stefan Hajnoczi [Wed, 15 Apr 2009 16:16:31 +0000 (17:16 +0100)]
[gdb] Allow resynchronisation with gdb

This replaces the gdbstub's polite NAK behavior with retransmission of
the current outstanding reply packet.  It solves situations where gdb
and gPXE's gdbstub get out of sync due to the lack of flow control in
the gdb protocol spec.

Signed-off-by: Michael Brown <>