summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMichael Brown2006-07-19 19:49:31 +0200
committerMichael Brown2006-07-19 19:49:31 +0200
commit6d9d48537e9609eb22fd36a6078d3c2d4d6b60a1 (patch)
tree0c6d276e8f8b6b5354cd0dd1047d203b926fe53b /src
parentProof of concept: transmit a single DHCPDISCOVER and dump out any (diff)
downloadipxe-6d9d48537e9609eb22fd36a6078d3c2d4d6b60a1.tar.gz
ipxe-6d9d48537e9609eb22fd36a6078d3c2d4d6b60a1.tar.xz
ipxe-6d9d48537e9609eb22fd36a6078d3c2d4d6b60a1.zip
Added some debug messages and DHCP test code
Diffstat (limited to 'src')
-rw-r--r--src/include/gpxe/dhcp.h2
-rw-r--r--src/net/udp/dhcp.c28
-rw-r--r--src/tests/dhcptest.c10
3 files changed, 39 insertions, 1 deletions
diff --git a/src/include/gpxe/dhcp.h b/src/include/gpxe/dhcp.h
index 576b9ead3..2cb4f0167 100644
--- a/src/include/gpxe/dhcp.h
+++ b/src/include/gpxe/dhcp.h
@@ -433,4 +433,6 @@ extern unsigned long find_global_dhcp_num_option ( unsigned int tag );
extern void delete_dhcp_option ( struct dhcp_option_block *options,
unsigned int tag );
+extern struct async_operation * start_dhcp ( struct dhcp_session *dhcp );
+
#endif /* _GPXE_DHCP_H */
diff --git a/src/net/udp/dhcp.c b/src/net/udp/dhcp.c
index f23eb9441..f5a8f08de 100644
--- a/src/net/udp/dhcp.c
+++ b/src/net/udp/dhcp.c
@@ -58,6 +58,26 @@ static uint8_t dhcp_request_options_data[] = {
DHCP_END
};
+/**
+ * Name a DHCP packet type
+ *
+ * @v msgtype DHCP message type
+ * @ret string DHCP mesasge type name
+ */
+static inline const char * dhcp_message_type_name ( unsigned int msgtype ) {
+ switch ( msgtype ) {
+ case DHCPDISCOVER: return "DHCPDISCOVER";
+ case DHCPOFFER: return "DHCPOFFER";
+ case DHCPREQUEST: return "DHCPREQUEST";
+ case DHCPDECLINE: return "DHCPDECLINE";
+ case DHCPACK: return "DHCPACK";
+ case DHCPNAK: return "DHCPNAK";
+ case DHCPRELEASE: return "DHCPRELEASE";
+ case DHCPINFORM: return "DHCPINFORM";
+ default: return "DHCP<invalid>";
+ }
+}
+
/** Options common to all DHCP requests */
static struct dhcp_option_block dhcp_request_options = {
.data = dhcp_request_options_data,
@@ -419,6 +439,8 @@ static void dhcp_senddata ( struct udp_connection *conn,
struct dhcp_packet dhcppkt;
int rc;
+ DBG ( "Transmitting %s\n", dhcp_message_type_name ( dhcp->state ) );
+
assert ( ( dhcp->state == DHCPDISCOVER ) ||
( dhcp->state == DHCPREQUEST ) );
@@ -455,7 +477,7 @@ static void dhcp_newdata ( struct udp_connection *conn,
/* Check for matching transaction ID */
if ( dhcphdr->xid != dhcp->xid ) {
- DBG ( "DHCP wrong transaction ID (wanted %08x, got %08x)\n",
+ DBG ( "DHCP wrong transaction ID (wanted %08lx, got %08lx)\n",
ntohl ( dhcphdr->xid ), ntohl ( dhcp->xid ) );
return;
};
@@ -467,6 +489,10 @@ static void dhcp_newdata ( struct udp_connection *conn,
return;
}
+ DBG ( "Received %s\n",
+ dhcp_message_type_name ( find_dhcp_num_option ( options,
+ DHCP_MESSAGE_TYPE ) ) );
+
/* Proof of concept: just dump out the parsed options */
hex_dump ( options->data, options->len );
free_dhcp_options ( options );
diff --git a/src/tests/dhcptest.c b/src/tests/dhcptest.c
new file mode 100644
index 000000000..d35e02c2e
--- /dev/null
+++ b/src/tests/dhcptest.c
@@ -0,0 +1,10 @@
+#include <string.h>
+#include <gpxe/dhcp.h>
+
+int test_dhcp ( struct net_device *netdev ) {
+ struct dhcp_session dhcp;
+
+ memset ( &dhcp, 0, sizeof ( dhcp ) );
+ dhcp.netdev = netdev;
+ return async_wait ( start_dhcp ( &dhcp ) );
+}