Ver código fonte

[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 16 anos atrás
pai
commit
aa74a7d53c
3 arquivos alterados com 557 adições e 351 exclusões
  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 Ver arquivo

@@ -24,6 +24,9 @@ struct dhcp_packet;
24 24
 /** BOOTP/DHCP client port */
25 25
 #define BOOTPC_PORT 68
26 26
 
27
+/** ProxyDHCP server port */
28
+#define PROXYDHCP_PORT 4011
29
+
27 30
 /** Construct a tag value for an encapsulated option
28 31
  *
29 32
  * This tag value can be passed to Etherboot functions when searching
@@ -433,7 +436,7 @@ struct dhcphdr {
433 436
  */
434 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 440
 #define PROXYDHCP_WAIT_TIME ( TICKS_PER_SEC * 1 )
438 441
 
439 442
 /** Settings block name used for DHCP responses */
@@ -442,12 +445,13 @@ struct dhcphdr {
442 445
 /** Settings block name used for ProxyDHCP responses */
443 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 449
 				struct net_device *netdev, uint8_t msgtype,
447 450
 				struct dhcp_options *options, 
448 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 453
 				 struct net_device *netdev,
454
+				 struct in_addr ciaddr,
451 455
 				 struct dhcp_packet *dhcpoffer,
452 456
 				 void *data, size_t max_len );
453 457
 extern int start_dhcp ( struct job_interface *job, struct net_device *netdev );

+ 4
- 3
src/net/fakedhcp.c Ver arquivo

@@ -108,9 +108,10 @@ static int copy_settings ( struct dhcp_packet *dest,
108 108
 int create_fakedhcpdiscover ( struct net_device *netdev,
109 109
 			      void *data, size_t max_len ) {
110 110
 	struct dhcp_packet dhcppkt;
111
+	struct in_addr ciaddr = { 0 };
111 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 115
 					  max_len ) ) != 0 ) {
115 116
 		DBG ( "Could not create DHCPDISCOVER: %s\n",
116 117
 		      strerror ( rc ) );
@@ -136,7 +137,7 @@ int create_fakedhcpack ( struct net_device *netdev,
136 137
 	int rc;
137 138
 
138 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 141
 					 data, max_len ) ) != 0 ) {
141 142
 		DBG ( "Could not create DHCPACK: %s\n", strerror ( rc ) );
142 143
 		return rc;
@@ -187,7 +188,7 @@ int create_fakeproxydhcpack ( struct net_device *netdev,
187 188
 	}
188 189
 
189 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 192
 					 data, max_len ) ) != 0 ) {
192 193
 		DBG ( "Could not create ProxyDHCPACK: %s\n",
193 194
 		      strerror ( rc ) );

+ 546
- 345
src/net/udp/dhcp.c
Diferenças do arquivo suprimidas por serem muito extensas
Ver arquivo


Carregando…
Cancelar
Salvar