|
@@ -340,14 +340,16 @@ struct dhcp_session {
|
340
|
340
|
* (e.g. @c DHCPDISCOVER).
|
341
|
341
|
*/
|
342
|
342
|
enum dhcp_session_state state;
|
343
|
|
- /** DHCPOFFER obtained during DHCPDISCOVER */
|
|
343
|
+ /** DHCPOFFER obtained during DHCPDISCOVER containing IP address */
|
344
|
344
|
struct dhcp_settings *dhcpoffer;
|
345
|
|
- /** ProxyDHCPOFFER obtained during DHCPDISCOVER */
|
346
|
|
- struct dhcp_settings *proxydhcpoffer;
|
347
|
|
- /** DHCPACK obtained during DHCPREQUEST */
|
|
345
|
+ /** DHCPOFFER obtained during DHCPDISCOVER containing "PXEClient" */
|
|
346
|
+ struct dhcp_settings *pxedhcpoffer;
|
|
347
|
+ /** DHCPACK obtained during DHCPREQUEST containing IP address */
|
348
|
348
|
struct dhcp_settings *dhcpack;
|
349
|
|
- /** ProxyDHCPACK obtained during ProxyDHCPREQUEST */
|
350
|
|
- struct dhcp_settings *proxydhcpack;
|
|
349
|
+ /** DHCPACK obtained during DHCPREQUEST or ProxyDHCPREQUEST
|
|
350
|
+ * containing "PXEClient"
|
|
351
|
+ */
|
|
352
|
+ struct dhcp_settings *pxedhcpack;
|
351
|
353
|
/** BootServerDHCPACK obtained during BootServerDHCPREQUEST */
|
352
|
354
|
struct dhcp_settings *bsdhcpack;
|
353
|
355
|
/** Retransmission timer */
|
|
@@ -367,9 +369,9 @@ static void dhcp_free ( struct refcnt *refcnt ) {
|
367
|
369
|
|
368
|
370
|
netdev_put ( dhcp->netdev );
|
369
|
371
|
dhcpset_put ( dhcp->dhcpoffer );
|
370
|
|
- dhcpset_put ( dhcp->proxydhcpoffer );
|
|
372
|
+ dhcpset_put ( dhcp->pxedhcpoffer );
|
371
|
373
|
dhcpset_put ( dhcp->dhcpack );
|
372
|
|
- dhcpset_put ( dhcp->proxydhcpack );
|
|
374
|
+ dhcpset_put ( dhcp->pxedhcpack );
|
373
|
375
|
dhcpset_put ( dhcp->bsdhcpack );
|
374
|
376
|
free ( dhcp );
|
375
|
377
|
}
|
|
@@ -586,7 +588,7 @@ int dhcp_create_request ( struct dhcp_packet *dhcppkt,
|
586
|
588
|
static int dhcp_tx ( struct dhcp_session *dhcp ) {
|
587
|
589
|
static struct sockaddr_in dest = {
|
588
|
590
|
.sin_family = AF_INET,
|
589
|
|
- .sin_port = htons ( PROXYDHCP_PORT ),
|
|
591
|
+ .sin_port = htons ( PXE_PORT ),
|
590
|
592
|
};
|
591
|
593
|
static struct sockaddr_in src = {
|
592
|
594
|
.sin_family = AF_INET,
|
|
@@ -624,11 +626,11 @@ static int dhcp_tx ( struct dhcp_session *dhcp ) {
|
624
|
626
|
break;
|
625
|
627
|
case DHCP_STATE_PROXYREQUEST:
|
626
|
628
|
assert ( dhcp->dhcpoffer );
|
627
|
|
- assert ( dhcp->proxydhcpoffer );
|
|
629
|
+ assert ( dhcp->pxedhcpoffer );
|
628
|
630
|
assert ( dhcp->dhcpack );
|
629
|
631
|
msgtype = DHCPREQUEST;
|
630
|
632
|
ciaddr = dhcp->dhcpoffer->dhcppkt.dhcphdr->yiaddr;
|
631
|
|
- dhcppkt_fetch ( &dhcp->proxydhcpoffer->dhcppkt,
|
|
633
|
+ dhcppkt_fetch ( &dhcp->pxedhcpoffer->dhcppkt,
|
632
|
634
|
DHCP_SERVER_IDENTIFIER, &dest.sin_addr,
|
633
|
635
|
sizeof ( dest.sin_addr ) );
|
634
|
636
|
meta.dest = ( struct sockaddr * ) &dest;
|
|
@@ -638,16 +640,16 @@ static int dhcp_tx ( struct dhcp_session *dhcp ) {
|
638
|
640
|
break;
|
639
|
641
|
case DHCP_STATE_BSREQUEST:
|
640
|
642
|
assert ( dhcp->dhcpoffer );
|
641
|
|
- assert ( dhcp->proxydhcpoffer );
|
|
643
|
+ assert ( dhcp->pxedhcpoffer );
|
642
|
644
|
assert ( dhcp->dhcpack );
|
643
|
|
- assert ( dhcp->proxydhcpack );
|
|
645
|
+ assert ( dhcp->pxedhcpack );
|
644
|
646
|
msgtype = DHCPREQUEST;
|
645
|
647
|
ciaddr = dhcp->dhcpoffer->dhcppkt.dhcphdr->yiaddr;
|
646
|
|
- dhcppkt_fetch ( &dhcp->proxydhcpack->dhcppkt,
|
|
648
|
+ dhcppkt_fetch ( &dhcp->pxedhcpack->dhcppkt,
|
647
|
649
|
DHCP_PXE_BOOT_SERVER_MCAST,
|
648
|
650
|
&dest.sin_addr, sizeof ( dest.sin_addr ) );
|
649
|
651
|
meta.dest = ( struct sockaddr * ) &dest;
|
650
|
|
- dhcppkt_fetch ( &dhcp->proxydhcpack->dhcppkt,
|
|
652
|
+ dhcppkt_fetch ( &dhcp->pxedhcpack->dhcppkt,
|
651
|
653
|
DHCP_PXE_BOOT_MENU, &menu_item.type,
|
652
|
654
|
sizeof ( menu_item.type ) );
|
653
|
655
|
assert ( dest.sin_addr.s_addr );
|
|
@@ -744,21 +746,21 @@ static void dhcp_next_state ( struct dhcp_session *dhcp ) {
|
744
|
746
|
dhcp_set_state ( dhcp, DHCP_STATE_REQUEST );
|
745
|
747
|
break;
|
746
|
748
|
case DHCP_STATE_REQUEST:
|
747
|
|
- if ( dhcp->proxydhcpoffer ) {
|
748
|
|
- /* Store DHCPACK as ProxyDHCPACK. This
|
749
|
|
- * handles the case in which the DHCP server
|
750
|
|
- * itself responds with "PXEClient" and PXE
|
751
|
|
- * options but there is no actual ProxyDHCP
|
752
|
|
- * server resident on the machine.
|
|
749
|
+ if ( dhcp->pxedhcpoffer ) {
|
|
750
|
+ /* Store DHCPACK as PXEDHCPACK. This handles
|
|
751
|
+ * the case in which the DHCP server itself
|
|
752
|
+ * responds with "PXEClient" and PXE options
|
|
753
|
+ * but there is no ProxyDHCP server resident
|
|
754
|
+ * on the machine.
|
753
|
755
|
*/
|
754
|
|
- dhcp->proxydhcpack = dhcpset_get ( dhcp->dhcpack );
|
|
756
|
+ dhcp->pxedhcpack = dhcpset_get ( dhcp->dhcpack );
|
755
|
757
|
dhcp_set_state ( dhcp, DHCP_STATE_PROXYREQUEST );
|
756
|
758
|
break;
|
757
|
759
|
}
|
758
|
760
|
/* Fall through */
|
759
|
761
|
case DHCP_STATE_PROXYREQUEST:
|
760
|
|
- if ( dhcp->proxydhcpack ) {
|
761
|
|
- dhcppkt_fetch ( &dhcp->proxydhcpack->dhcppkt,
|
|
762
|
+ if ( dhcp->pxedhcpack ) {
|
|
763
|
+ dhcppkt_fetch ( &dhcp->pxedhcpack->dhcppkt,
|
762
|
764
|
DHCP_PXE_BOOT_SERVER_MCAST,
|
763
|
765
|
&bs_mcast, sizeof ( bs_mcast ) );
|
764
|
766
|
if ( bs_mcast.s_addr ) {
|
|
@@ -827,7 +829,7 @@ static void dhcp_rx_dhcpoffer ( struct dhcp_session *dhcp,
|
827
|
829
|
struct in_addr server_id = { 0 };
|
828
|
830
|
char vci[9]; /* "PXEClient" */
|
829
|
831
|
int len;
|
830
|
|
- uint8_t ignore_proxy = 0;
|
|
832
|
+ uint8_t ignore_pxe = 0;
|
831
|
833
|
unsigned long elapsed;
|
832
|
834
|
|
833
|
835
|
/* Check for presence of DHCP server ID */
|
|
@@ -849,26 +851,25 @@ static void dhcp_rx_dhcpoffer ( struct dhcp_session *dhcp,
|
849
|
851
|
}
|
850
|
852
|
|
851
|
853
|
/* If there is a "PXEClient" vendor class ID, it's a
|
852
|
|
- * ProxyDHCPOFFER. Note that it could be both a normal
|
853
|
|
- * DHCPOFFER and a ProxyDHCPOFFER.
|
|
854
|
+ * PXEDHCPOFFER. Note that it could be both a normal
|
|
855
|
+ * DHCPOFFER and a PXEDHCPOFFER.
|
854
|
856
|
*/
|
855
|
857
|
len = dhcppkt_fetch ( &dhcpoffer->dhcppkt, DHCP_VENDOR_CLASS_ID,
|
856
|
858
|
vci, sizeof ( vci ) );
|
857
|
859
|
if ( ( server_id.s_addr != 0 ) &&
|
858
|
860
|
( len >= ( int ) sizeof ( vci ) ) &&
|
859
|
861
|
( strncmp ( "PXEClient", vci, sizeof ( vci ) ) == 0 ) ) {
|
860
|
|
- DBGC ( dhcp, "DHCP %p DHCPOFFER %p from %s is a "
|
861
|
|
- "ProxyDHCPOFFER\n",
|
|
862
|
+ DBGC ( dhcp, "DHCP %p DHCPOFFER %p from %s has PXE options\n",
|
862
|
863
|
dhcp, dhcpoffer, inet_ntoa ( server_id ) );
|
863
|
864
|
dhcp_store_dhcpoffer ( dhcp, dhcpoffer,
|
864
|
|
- &dhcp->proxydhcpoffer );
|
|
865
|
+ &dhcp->pxedhcpoffer );
|
865
|
866
|
}
|
866
|
867
|
|
867
|
868
|
/* We can transition to making the DHCPREQUEST when we have a
|
868
|
869
|
* valid DHCPOFFER, and either:
|
869
|
870
|
*
|
870
|
|
- * o The DHCPOFFER instructs us to not wait for ProxyDHCP, or
|
871
|
|
- * o We have a valid ProxyDHCPOFFER, or
|
|
871
|
+ * o The DHCPOFFER instructs us to ignore PXEDHCPOFFERs, or
|
|
872
|
+ * o We have a valid PXEDHCPOFFER, or
|
872
|
873
|
* o We have allowed sufficient time for ProxyDHCPOFFERs.
|
873
|
874
|
*/
|
874
|
875
|
|
|
@@ -876,20 +877,20 @@ static void dhcp_rx_dhcpoffer ( struct dhcp_session *dhcp,
|
876
|
877
|
if ( ! dhcp->dhcpoffer )
|
877
|
878
|
return;
|
878
|
879
|
|
879
|
|
- /* If the DHCPOFFER instructs us to ignore ProxyDHCP, discard
|
880
|
|
- * any ProxyDHCPOFFER
|
|
880
|
+ /* If the DHCPOFFER instructs us to ignore PXEDHCP, discard
|
|
881
|
+ * any PXEDHCPOFFER
|
881
|
882
|
*/
|
882
|
|
- dhcppkt_fetch ( &dhcp->dhcpoffer->dhcppkt, DHCP_EB_NO_PROXYDHCP,
|
883
|
|
- &ignore_proxy, sizeof ( ignore_proxy ) );
|
884
|
|
- if ( ignore_proxy && dhcp->proxydhcpoffer ) {
|
885
|
|
- DBGC ( dhcp, "DHCP %p discarding ProxyDHCPOFFER\n", dhcp );
|
886
|
|
- dhcpset_put ( dhcp->proxydhcpoffer );
|
887
|
|
- dhcp->proxydhcpoffer = NULL;
|
|
883
|
+ dhcppkt_fetch ( &dhcp->dhcpoffer->dhcppkt, DHCP_EB_NO_PXEDHCP,
|
|
884
|
+ &ignore_pxe, sizeof ( ignore_pxe ) );
|
|
885
|
+ if ( ignore_pxe && dhcp->pxedhcpoffer ) {
|
|
886
|
+ DBGC ( dhcp, "DHCP %p discarding PXEDHCPOFFER\n", dhcp );
|
|
887
|
+ dhcpset_put ( dhcp->pxedhcpoffer );
|
|
888
|
+ dhcp->pxedhcpoffer = NULL;
|
888
|
889
|
}
|
889
|
890
|
|
890
|
891
|
/* If we can't yet transition to DHCPREQUEST, do nothing */
|
891
|
892
|
elapsed = ( currticks() - dhcp->start );
|
892
|
|
- if ( ! ( ignore_proxy || dhcp->proxydhcpoffer ||
|
|
893
|
+ if ( ! ( ignore_pxe || dhcp->pxedhcpoffer ||
|
893
|
894
|
( elapsed > PROXYDHCP_WAIT_TIME ) ) )
|
894
|
895
|
return;
|
895
|
896
|
|
|
@@ -978,11 +979,11 @@ static void dhcp_rx_proxydhcpack ( struct dhcp_session *dhcp,
|
978
|
979
|
int rc;
|
979
|
980
|
|
980
|
981
|
/* Verify server ID matches, if present */
|
981
|
|
- assert ( dhcp->proxydhcpoffer != NULL );
|
|
982
|
+ assert ( dhcp->pxedhcpoffer != NULL );
|
982
|
983
|
if ( ( rc = dhcppkt_fetch ( &proxydhcpack->dhcppkt,
|
983
|
984
|
DHCP_SERVER_IDENTIFIER, &ack_server_id,
|
984
|
985
|
sizeof ( ack_server_id ) ) ) > 0 ) {
|
985
|
|
- dhcppkt_fetch ( &dhcp->proxydhcpoffer->dhcppkt,
|
|
986
|
+ dhcppkt_fetch ( &dhcp->pxedhcpoffer->dhcppkt,
|
986
|
987
|
DHCP_SERVER_IDENTIFIER, &offer_server_id,
|
987
|
988
|
sizeof ( offer_server_id ) );
|
988
|
989
|
if ( offer_server_id.s_addr != ack_server_id.s_addr ) {
|
|
@@ -996,9 +997,9 @@ static void dhcp_rx_proxydhcpack ( struct dhcp_session *dhcp,
|
996
|
997
|
/* Rename settings */
|
997
|
998
|
proxydhcpack->settings.name = PROXYDHCP_SETTINGS_NAME;
|
998
|
999
|
|
999
|
|
- /* Record ProxyDHCPACK */
|
1000
|
|
- dhcpset_put ( dhcp->proxydhcpack );
|
1001
|
|
- dhcp->proxydhcpack = dhcpset_get ( proxydhcpack );
|
|
1000
|
+ /* Record ProxyDHCPACK as PXEDHCPACK */
|
|
1001
|
+ dhcpset_put ( dhcp->pxedhcpack );
|
|
1002
|
+ dhcp->pxedhcpack = dhcpset_get ( proxydhcpack );
|
1002
|
1003
|
|
1003
|
1004
|
/* Register settings */
|
1004
|
1005
|
if ( ( rc = dhcp_store_dhcpack ( dhcp, proxydhcpack, NULL ) ) != 0 )
|
|
@@ -1012,7 +1013,7 @@ static void dhcp_rx_proxydhcpack ( struct dhcp_session *dhcp,
|
1012
|
1013
|
* Handle received BootServerDHCPACK
|
1013
|
1014
|
*
|
1014
|
1015
|
* @v dhcp DHCP session
|
1015
|
|
- * @v bsdhcpack Received BootServerDHCPACK
|
|
1016
|
+ * @v bsdhcpack Received BootServerDHCPACK
|
1016
|
1017
|
*/
|
1017
|
1018
|
static void dhcp_rx_bsdhcpack ( struct dhcp_session *dhcp,
|
1018
|
1019
|
struct dhcp_settings *bsdhcpack ) {
|
|
@@ -1021,7 +1022,7 @@ static void dhcp_rx_bsdhcpack ( struct dhcp_session *dhcp,
|
1021
|
1022
|
/* Rename settings */
|
1022
|
1023
|
bsdhcpack->settings.name = BSDHCP_SETTINGS_NAME;
|
1023
|
1024
|
|
1024
|
|
- /* Record ProxyDHCPACK */
|
|
1025
|
+ /* Record BootServerDHCPACK */
|
1025
|
1026
|
assert ( dhcp->bsdhcpack == NULL );
|
1026
|
1027
|
dhcp->bsdhcpack = dhcpset_get ( bsdhcpack );
|
1027
|
1028
|
|
|
@@ -1107,12 +1108,12 @@ static int dhcp_deliver_iob ( struct xfer_interface *xfer,
|
1107
|
1108
|
break;
|
1108
|
1109
|
case DHCP_STATE_PROXYREQUEST:
|
1109
|
1110
|
if ( ( msgtype == DHCPACK ) &&
|
1110
|
|
- ( src_port == htons ( PROXYDHCP_PORT ) ) )
|
|
1111
|
+ ( src_port == htons ( PXE_PORT ) ) )
|
1111
|
1112
|
dhcp_rx_proxydhcpack ( dhcp, dhcpset );
|
1112
|
1113
|
break;
|
1113
|
1114
|
case DHCP_STATE_BSREQUEST:
|
1114
|
1115
|
if ( ( msgtype == DHCPACK ) &&
|
1115
|
|
- ( src_port == htons ( PROXYDHCP_PORT ) ) )
|
|
1116
|
+ ( src_port == htons ( PXE_PORT ) ) )
|
1116
|
1117
|
dhcp_rx_bsdhcpack ( dhcp, dhcpset );
|
1117
|
1118
|
break;
|
1118
|
1119
|
default:
|