| 
				
			 | 
			
			
				
				@@ -27,6 +27,8 @@ 
			 | 
		
		
	
		
			
			| 
				27
			 | 
			
				27
			 | 
			
			
				
				 #include <gpxe/open.h> 
			 | 
		
		
	
		
			
			| 
				28
			 | 
			
				28
			 | 
			
			
				
				 #include <gpxe/job.h> 
			 | 
		
		
	
		
			
			| 
				29
			 | 
			
				29
			 | 
			
			
				
				 #include <gpxe/retry.h> 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				30
			 | 
			
			
				
				+#include <gpxe/tcpip.h> 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				31
			 | 
			
			
				
				+#include <gpxe/ip.h> 
			 | 
		
		
	
		
			
			| 
				30
			 | 
			
				32
			 | 
			
			
				
				 #include <gpxe/dhcp.h> 
			 | 
		
		
	
		
			
			| 
				31
			 | 
			
				33
			 | 
			
			
				
				  
			 | 
		
		
	
		
			
			| 
				32
			 | 
			
				34
			 | 
			
			
				
				 /** @file 
			 | 
		
		
	
	
		
			
			| 
				
			 | 
			
			
				
				@@ -502,7 +504,8 @@ struct dhcp_session { 
			 | 
		
		
	
		
			
			| 
				502
			 | 
			
				504
			 | 
			
			
				
				 	/** Network device being configured */ 
			 | 
		
		
	
		
			
			| 
				503
			 | 
			
				505
			 | 
			
			
				
				 	struct net_device *netdev; 
			 | 
		
		
	
		
			
			| 
				504
			 | 
			
				506
			 | 
			
			
				
				 	/** Option block registration routine */ 
			 | 
		
		
	
		
			
			| 
				505
			 | 
			
				
			 | 
			
			
				
				-	int ( * register_options ) ( struct dhcp_option_block *options ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				507
			 | 
			
			
				
				+	int ( * register_options ) ( struct net_device *netdev, 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				508
			 | 
			
			
				
				+				     struct dhcp_option_block *options ); 
			 | 
		
		
	
		
			
			| 
				506
			 | 
			
				509
			 | 
			
			
				
				  
			 | 
		
		
	
		
			
			| 
				507
			 | 
			
				510
			 | 
			
			
				
				 	/** State of the session 
			 | 
		
		
	
		
			
			| 
				508
			 | 
			
				511
			 | 
			
			
				
				 	 * 
			 | 
		
		
	
	
		
			
			| 
				
			 | 
			
			
				
				@@ -717,7 +720,7 @@ static int dhcp_deliver_raw ( struct xfer_interface *xfer, 
			 | 
		
		
	
		
			
			| 
				717
			 | 
			
				720
			 | 
			
			
				
				 	if ( dhcp->state < DHCPACK ) { 
			 | 
		
		
	
		
			
			| 
				718
			 | 
			
				721
			 | 
			
			
				
				 		dhcp_send_request ( dhcp ); 
			 | 
		
		
	
		
			
			| 
				719
			 | 
			
				722
			 | 
			
			
				
				 	} else { 
			 | 
		
		
	
		
			
			| 
				720
			 | 
			
				
			 | 
			
			
				
				-		dhcp->register_options ( dhcp->options ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				723
			 | 
			
			
				
				+		dhcp->register_options ( dhcp->netdev, dhcp->options ); 
			 | 
		
		
	
		
			
			| 
				721
			 | 
			
				724
			 | 
			
			
				
				 		dhcp_finished ( dhcp, 0 ); 
			 | 
		
		
	
		
			
			| 
				722
			 | 
			
				725
			 | 
			
			
				
				 	} 
			 | 
		
		
	
		
			
			| 
				723
			 | 
			
				726
			 | 
			
			
				
				 	return 0; 
			 | 
		
		
	
	
		
			
			| 
				
			 | 
			
			
				
				@@ -782,7 +785,8 @@ static struct job_interface_operations dhcp_job_operations = { 
			 | 
		
		
	
		
			
			| 
				782
			 | 
			
				785
			 | 
			
			
				
				  * options. 
			 | 
		
		
	
		
			
			| 
				783
			 | 
			
				786
			 | 
			
			
				
				  */ 
			 | 
		
		
	
		
			
			| 
				784
			 | 
			
				787
			 | 
			
			
				
				 int start_dhcp ( struct job_interface *job, struct net_device *netdev, 
			 | 
		
		
	
		
			
			| 
				785
			 | 
			
				
			 | 
			
			
				
				-		 int ( * register_options ) ( struct dhcp_option_block * ) ) { 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				788
			 | 
			
			
				
				+		 int ( * register_options ) ( struct net_device *netdev, 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				789
			 | 
			
			
				
				+					      struct dhcp_option_block * ) ) { 
			 | 
		
		
	
		
			
			| 
				786
			 | 
			
				790
			 | 
			
			
				
				 	static struct sockaddr_in server = { 
			 | 
		
		
	
		
			
			| 
				787
			 | 
			
				791
			 | 
			
			
				
				 		.sin_family = AF_INET, 
			 | 
		
		
	
		
			
			| 
				788
			 | 
			
				792
			 | 
			
			
				
				 		.sin_addr.s_addr = INADDR_BROADCAST, 
			 | 
		
		
	
	
		
			
			| 
				
			 | 
			
			
				
				@@ -827,3 +831,57 @@ int start_dhcp ( struct job_interface *job, struct net_device *netdev, 
			 | 
		
		
	
		
			
			| 
				827
			 | 
			
				831
			 | 
			
			
				
				 	ref_put ( &dhcp->refcnt ); 
			 | 
		
		
	
		
			
			| 
				828
			 | 
			
				832
			 | 
			
			
				
				 	return rc; 
			 | 
		
		
	
		
			
			| 
				829
			 | 
			
				833
			 | 
			
			
				
				 } 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				834
			 | 
			
			
				
				+ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				835
			 | 
			
			
				
				+/**************************************************************************** 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				836
			 | 
			
			
				
				+ * 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				837
			 | 
			
			
				
				+ * Network device configurator 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				838
			 | 
			
			
				
				+ * 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				839
			 | 
			
			
				
				+ */ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				840
			 | 
			
			
				
				+ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				841
			 | 
			
			
				
				+/* Avoid dragging in dns.o */ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				842
			 | 
			
			
				
				+struct sockaddr_tcpip nameserver; 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				843
			 | 
			
			
				
				+ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				844
			 | 
			
			
				
				+/* Avoid dragging in syslog.o */ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				845
			 | 
			
			
				
				+struct in_addr syslogserver; 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				846
			 | 
			
			
				
				+ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				847
			 | 
			
			
				
				+/** 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				848
			 | 
			
			
				
				+ * Configure network device from DHCP options 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				849
			 | 
			
			
				
				+ * 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				850
			 | 
			
			
				
				+ * @v netdev		Network device 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				851
			 | 
			
			
				
				+ * @v options		DHCP options block 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				852
			 | 
			
			
				
				+ * @ret rc		Return status code 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				853
			 | 
			
			
				
				+ */ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				854
			 | 
			
			
				
				+int dhcp_configure_netdev ( struct net_device *netdev, 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				855
			 | 
			
			
				
				+			    struct dhcp_option_block *options ) { 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				856
			 | 
			
			
				
				+	struct in_addr address = { 0 }; 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				857
			 | 
			
			
				
				+	struct in_addr netmask = { 0 }; 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				858
			 | 
			
			
				
				+	struct in_addr gateway = { INADDR_NONE }; 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				859
			 | 
			
			
				
				+	struct sockaddr_in *sin_nameserver; 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				860
			 | 
			
			
				
				+	int rc; 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				861
			 | 
			
			
				
				+ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				862
			 | 
			
			
				
				+	/* Clear any existing routing table entry */ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				863
			 | 
			
			
				
				+	del_ipv4_address ( netdev ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				864
			 | 
			
			
				
				+ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				865
			 | 
			
			
				
				+	/* Retrieve IP address configuration */ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				866
			 | 
			
			
				
				+	find_dhcp_ipv4_option ( options, DHCP_EB_YIADDR, &address ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				867
			 | 
			
			
				
				+	find_dhcp_ipv4_option ( options, DHCP_SUBNET_MASK, &netmask ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				868
			 | 
			
			
				
				+	find_dhcp_ipv4_option ( options, DHCP_ROUTERS, &gateway ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				869
			 | 
			
			
				
				+ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				870
			 | 
			
			
				
				+	/* Set up new IP address configuration */ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				871
			 | 
			
			
				
				+	if ( ( rc = add_ipv4_address ( netdev, address, netmask, 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				872
			 | 
			
			
				
				+				       gateway ) ) != 0 ) { 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				873
			 | 
			
			
				
				+		DBG ( "Could not configure %s with DHCP results: %s\n", 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				874
			 | 
			
			
				
				+		      netdev->name, strerror ( rc ) ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				875
			 | 
			
			
				
				+		return rc; 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				876
			 | 
			
			
				
				+	} 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				877
			 | 
			
			
				
				+ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				878
			 | 
			
			
				
				+	/* Retrieve other DHCP options that we care about */ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				879
			 | 
			
			
				
				+	sin_nameserver = ( struct sockaddr_in * ) &nameserver; 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				880
			 | 
			
			
				
				+	sin_nameserver->sin_family = AF_INET; 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				881
			 | 
			
			
				
				+	find_dhcp_ipv4_option ( options, DHCP_DNS_SERVERS, 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				882
			 | 
			
			
				
				+				&sin_nameserver->sin_addr ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				883
			 | 
			
			
				
				+	find_dhcp_ipv4_option ( options, DHCP_LOG_SERVERS, 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				884
			 | 
			
			
				
				+				&syslogserver ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				885
			 | 
			
			
				
				+ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				886
			 | 
			
			
				
				+	return 0; 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				887
			 | 
			
			
				
				+} 
			 |