aboutsummaryrefslogtreecommitdiffstats
path: root/src/net/udp/dhcp.c
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2010-10-09 01:24:18 +0100
committerMichael Brown <mcb30@ipxe.org>2010-10-09 01:24:18 +0100
commit6d11229e83b91ac987bf34b811686f37ec750ef4 (patch)
tree841cbb2d26804f79ee35bea37836b716b6d5286f /src/net/udp/dhcp.c
parent831106a8752fbb7157458339a1693de54b6ad43c (diff)
downloadipxe-6d11229e83b91ac987bf34b811686f37ec750ef4.tar.gz
[dhcp] Include session state metadata in packet traces
(Ab)use the "secs" field in transmitted DHCP packets to convey metadata about the DHCP session state. In particular: bit 0 represents the receipt of a ProxyDHCPOFFER bit 1 represents the receipt of a DHCPOFFER bits 2+ represent the transmitted packet sequence number This allows some relevant information about the internal state of the DHCP session to be read out from a packet trace from a non-debug build of iPXE. It also potentially allows replies to be correlated to their requests (for servers that copy the "secs" field from request to reply). Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/net/udp/dhcp.c')
-rw-r--r--src/net/udp/dhcp.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/net/udp/dhcp.c b/src/net/udp/dhcp.c
index 9ab93dcf7..443ae3aa4 100644
--- a/src/net/udp/dhcp.c
+++ b/src/net/udp/dhcp.c
@@ -245,6 +245,8 @@ struct dhcp_session {
/** Retransmission timer */
struct retry_timer timer;
+ /** Transmission counter */
+ unsigned int count;
/** Start time of the current state (in ticks) */
unsigned long start;
};
@@ -1098,6 +1100,14 @@ static int dhcp_tx ( struct dhcp_session *dhcp ) {
goto done;
}
+ /* (Ab)use the "secs" field to convey metadata about the DHCP
+ * session state into packet traces. Useful for extracting
+ * debug information from non-debug builds.
+ */
+ dhcppkt.dhcphdr->secs = htons ( ( ++(dhcp->count) << 2 ) |
+ ( dhcp->offer.s_addr ? 0x02 : 0 ) |
+ ( dhcp->proxy_offer ? 0x01 : 0 ) );
+
/* Fill in packet based on current state */
if ( ( rc = dhcp->state->tx ( dhcp, &dhcppkt, &peer ) ) != 0 ) {
DBGC ( dhcp, "DHCP %p could not fill DHCP request: %s\n",