Browse Source

[DHCP] Add support for ProxyDHCP requests

The PXE spec is (as usual) unclear on precisely when ProxyDHCPREQUESTs
should be issued.  We adapt the following, slightly paranoid approach:

  If an offer contains an IP address, then it is a normal DHCPOFFER.

  If an offer contains an option #60 "PXEClient", then it is a
  ProxyDHCPOFFER.  Note that the same packet can be both a normal
  DHCPOFFER and a ProxyDHCPOFFER.

  After receiving the normal DHCPACK, if we have received a
  ProxyDHCPOFFER, we unicast a ProxyDHCPREQUEST back to the ProxyDHCP
  server on port 4011.  If we time out waiting for a ProxyDHCPACK, we
  treat this as a non-fatal error.
tags/v0.9.4
Michael Brown 17 years ago
parent
commit
aa74a7d53c
3 changed files with 557 additions and 351 deletions
  1. 7
    3
      src/include/gpxe/dhcp.h
  2. 4
    3
      src/net/fakedhcp.c
  3. 546
    345
      src/net/udp/dhcp.c

+ 7
- 3
src/include/gpxe/dhcp.h View File

24
 /** BOOTP/DHCP client port */
24
 /** BOOTP/DHCP client port */
25
 #define BOOTPC_PORT 68
25
 #define BOOTPC_PORT 68
26
 
26
 
27
+/** ProxyDHCP server port */
28
+#define PROXYDHCP_PORT 4011
29
+
27
 /** Construct a tag value for an encapsulated option
30
 /** Construct a tag value for an encapsulated option
28
  *
31
  *
29
  * This tag value can be passed to Etherboot functions when searching
32
  * This tag value can be passed to Etherboot functions when searching
433
  */
436
  */
434
 #define DHCP_MIN_LEN 552
437
 #define DHCP_MIN_LEN 552
435
 
438
 
436
-/** Maximum time that we will wait for ProxyDHCP offers */
439
+/** Maximum time that we will wait for ProxyDHCP responses */
437
 #define PROXYDHCP_WAIT_TIME ( TICKS_PER_SEC * 1 )
440
 #define PROXYDHCP_WAIT_TIME ( TICKS_PER_SEC * 1 )
438
 
441
 
439
 /** Settings block name used for DHCP responses */
442
 /** Settings block name used for DHCP responses */
442
 /** Settings block name used for ProxyDHCP responses */
445
 /** Settings block name used for ProxyDHCP responses */
443
 #define PROXYDHCP_SETTINGS_NAME "proxydhcp"
446
 #define PROXYDHCP_SETTINGS_NAME "proxydhcp"
444
 
447
 
445
-extern int create_dhcp_packet ( struct dhcp_packet *dhcppkt,
448
+extern int dhcp_create_packet ( struct dhcp_packet *dhcppkt,
446
 				struct net_device *netdev, uint8_t msgtype,
449
 				struct net_device *netdev, uint8_t msgtype,
447
 				struct dhcp_options *options, 
450
 				struct dhcp_options *options, 
448
 				void *data, size_t max_len );
451
 				void *data, size_t max_len );
449
-extern int create_dhcp_request ( struct dhcp_packet *dhcppkt,
452
+extern int dhcp_create_request ( struct dhcp_packet *dhcppkt,
450
 				 struct net_device *netdev,
453
 				 struct net_device *netdev,
454
+				 struct in_addr ciaddr,
451
 				 struct dhcp_packet *dhcpoffer,
455
 				 struct dhcp_packet *dhcpoffer,
452
 				 void *data, size_t max_len );
456
 				 void *data, size_t max_len );
453
 extern int start_dhcp ( struct job_interface *job, struct net_device *netdev );
457
 extern int start_dhcp ( struct job_interface *job, struct net_device *netdev );

+ 4
- 3
src/net/fakedhcp.c View File

108
 int create_fakedhcpdiscover ( struct net_device *netdev,
108
 int create_fakedhcpdiscover ( struct net_device *netdev,
109
 			      void *data, size_t max_len ) {
109
 			      void *data, size_t max_len ) {
110
 	struct dhcp_packet dhcppkt;
110
 	struct dhcp_packet dhcppkt;
111
+	struct in_addr ciaddr = { 0 };
111
 	int rc;
112
 	int rc;
112
 
113
 
113
-	if ( ( rc = create_dhcp_request ( &dhcppkt, netdev, NULL, data,
114
+	if ( ( rc = dhcp_create_request ( &dhcppkt, netdev, ciaddr, NULL, data,
114
 					  max_len ) ) != 0 ) {
115
 					  max_len ) ) != 0 ) {
115
 		DBG ( "Could not create DHCPDISCOVER: %s\n",
116
 		DBG ( "Could not create DHCPDISCOVER: %s\n",
116
 		      strerror ( rc ) );
117
 		      strerror ( rc ) );
136
 	int rc;
137
 	int rc;
137
 
138
 
138
 	/* Create base DHCPACK packet */
139
 	/* Create base DHCPACK packet */
139
-	if ( ( rc = create_dhcp_packet ( &dhcppkt, netdev, DHCPACK, NULL,
140
+	if ( ( rc = dhcp_create_packet ( &dhcppkt, netdev, DHCPACK, NULL,
140
 					 data, max_len ) ) != 0 ) {
141
 					 data, max_len ) ) != 0 ) {
141
 		DBG ( "Could not create DHCPACK: %s\n", strerror ( rc ) );
142
 		DBG ( "Could not create DHCPACK: %s\n", strerror ( rc ) );
142
 		return rc;
143
 		return rc;
187
 	}
188
 	}
188
 
189
 
189
 	/* Create base DHCPACK packet */
190
 	/* Create base DHCPACK packet */
190
-	if ( ( rc = create_dhcp_packet ( &dhcppkt, netdev, DHCPACK, NULL,
191
+	if ( ( rc = dhcp_create_packet ( &dhcppkt, netdev, DHCPACK, NULL,
191
 					 data, max_len ) ) != 0 ) {
192
 					 data, max_len ) ) != 0 ) {
192
 		DBG ( "Could not create ProxyDHCPACK: %s\n",
193
 		DBG ( "Could not create ProxyDHCPACK: %s\n",
193
 		      strerror ( rc ) );
194
 		      strerror ( rc ) );

+ 546
- 345
src/net/udp/dhcp.c
File diff suppressed because it is too large
View File


Loading…
Cancel
Save