浏览代码

[dhcp] Allow for missing server ID in ProxyDHCPACK

The Linux PXE server (http://www.kano.org.uk/projects/pxe) does not
set the server identifier in its ProxyDHCP responses.  If the server
ID is missing, do not treat this as an error.

This resolves the "vague and unsettling memory" mentioned in commit
fdb8481d ("[dhcp] Verify server identifier on ProxyDHCPACKs").

Note that we already accept ProxyDHCPOFFERs without a server
identifier; they get treated as potential BOOTP packets.
tags/v0.9.7
Michael Brown 16 年前
父节点
当前提交
d7de30e5e4
共有 1 个文件被更改,包括 13 次插入9 次删除
  1. 13
    9
      src/net/udp/dhcp.c

+ 13
- 9
src/net/udp/dhcp.c 查看文件

@@ -845,16 +845,20 @@ static void dhcp_rx_proxydhcpack ( struct dhcp_session *dhcp,
845 845
 	struct in_addr ack_server_id = { 0 };
846 846
 	int rc;
847 847
 
848
-	/* Verify server ID matches */
848
+	/* Verify server ID matches, if present */
849 849
 	assert ( dhcp->proxydhcpoffer != NULL );
850
-	dhcppkt_fetch ( &dhcp->proxydhcpoffer->dhcppkt, DHCP_SERVER_IDENTIFIER,
851
-			&offer_server_id, sizeof ( offer_server_id ) );
852
-	dhcppkt_fetch ( &proxydhcpack->dhcppkt, DHCP_SERVER_IDENTIFIER,
853
-			&ack_server_id, sizeof ( ack_server_id ) );
854
-	if ( offer_server_id.s_addr != ack_server_id.s_addr ) {
855
-		DBGC ( dhcp, "DHCP %p ignoring ProxyDHCPACK with wrong server "
856
-		       "ID %s\n", dhcp, inet_ntoa ( ack_server_id ) );
857
-		return;
850
+	if ( ( rc = dhcppkt_fetch ( &proxydhcpack->dhcppkt,
851
+				    DHCP_SERVER_IDENTIFIER, &ack_server_id,
852
+				    sizeof ( ack_server_id ) ) ) > 0 ) {
853
+		dhcppkt_fetch ( &dhcp->proxydhcpoffer->dhcppkt,
854
+				DHCP_SERVER_IDENTIFIER, &offer_server_id,
855
+				sizeof ( offer_server_id ) );
856
+		if ( offer_server_id.s_addr != ack_server_id.s_addr ) {
857
+			DBGC ( dhcp, "DHCP %p ignoring ProxyDHCPACK with "
858
+			       "wrong server ID %s\n",
859
+			       dhcp, inet_ntoa ( ack_server_id ) );
860
+			return;
861
+		}
858 862
 	}
859 863
 
860 864
 	/* Rename settings */

正在加载...
取消
保存