Final static ip patch

"Ricardo Carrillo Cruz" <[email protected]> Tue, 14 Mar 2006 16:29:17 +0100
Newsgroups gmane.network.etherboot.user,gmane.network.etherboot.devel
Message-ID <[email protected]>
I suceeded to boot an image with a static ip address.
The patches  are attached to this email.

Of course,feel free to post bugs or comments so we can improve the patch

Regards to all and special thanks to Marty Connor for his suggestions
and David Aubin

Ricardo Carrillo Cruz

(I'm resending the mail in plain text,sorry :S)
Config.diff (application/octet-stream, 1.5 KB)
--- Config.orig	2006-03-07 10:32:43.000000000 +0100
+++ Config	2006-03-13 14:11:54.000000000 +0100
@@ -60,6 +60,10 @@
 #			Use BOOTP instead of DHCP.
 #	-DRARP_NOT_BOOTP
 #			Use RARP instead of BOOTP/DHCP.
+#	-DSTATIC_ADDRESS	Use static ip insted of dynamic protocol
+#	-DSTATIC_CLIENT_IP=\"1.2.3.4\"
+#	-DSTATIC_SERVER_IP=\"1.2.4.5\"
+#	-DSTATIC_GATEWAY_IP=\"1.2.3.254\"
 #	-DREQUIRE_VCI_ETHERBOOT
 #			Require an encapsulated Vendor Class Identifier
 #			of "Etherboot" in the DHCP reply
@@ -379,10 +383,18 @@
 # Disable DHCP support
 # CFLAGS+=	-DNO_DHCP_SUPPORT
 
+# Enable static ip
+CFLAGS+=	-DSTATIC_ADDRESS
+
+#Specify the client IP
+CFLAGS+=	-DSTATIC_CLIENT_IP=\"10.205.99.74\"
+CFLAGS+=	-DSTATIC_SERVER_IP=\"10.205.99.73\"
+CFLAGS+=	-DSTATIC_GATEWAY_IP=\"10.205.99.1\"
+
 # Specify a default bootfile to be used if the DHCP server does not
 # provide the information.  If you do not specify this option, then
 # DHCP offers that do not contain bootfiles will be ignored.
-# CFLAGS+=	-DDEFAULT_BOOTFILE=\"tftp:///tftpboot/kernel\"
+CFLAGS+=	-DDEFAULT_BOOTFILE=\"tftp://10.205.99.73/thinstation.nbi\"
 
 # Limit the delay on packet loss/congestion to a more bearable value. See
 # description above.  If unset, do not limit the delay between resend.
@@ -439,12 +451,12 @@
 # CFLAGS+=	-DNORELOCATE
 
 # you should normally not need to change these
-HOST_CC=	gcc
+HOST_CC=	gcc-3.4
 CPP=		gcc -E -Wp,-Wall
 RM=		rm -f
 TOUCH=		touch
 PERL=		/usr/bin/perl
-CC=		gcc
+CC=		gcc-3.4
 AS=		as
 LD=		ld
 SIZE=		size
nic.diff (application/octet-stream, 2.9 KB)
--- nic_orig.c	2006-03-07 10:38:52.000000000 +0100
+++ nic.c	2006-03-13 13:25:09.000000000 +0100
@@ -270,8 +270,13 @@
 #ifdef RARP_NOT_BOOTP
 static int rarp(void);
 #else
+#ifdef STATIC_ADDRESS
+static void static_client_ip(void);
+static int static_server_ip(void);
+#else	
 static int bootp(void);
 #endif
+#endif
 static unsigned short tcpudpchksum(struct iphdr *ip);
 
 
@@ -314,6 +319,9 @@
 {
 	int server_found;
 	/* Find a server to get BOOTP reply from */
+#ifdef  STATIC_ADDRESS
+	printf("Booting with static ip address...");
+#else	
 #ifdef	RARP_NOT_BOOTP
 	printf("Searching for server (RARP)...");
 #else
@@ -323,12 +331,18 @@
 	printf("Searching for server (BOOTP)...");
 #endif
 #endif
-
+#endif
+	
+#ifdef  STATIC_ADDRESS
+	static_client_ip();
+	server_found= static_server_ip();
+#else	
 #ifdef	RARP_NOT_BOOTP
 	server_found = rarp();
 #else
 	server_found = bootp();
 #endif
+#endif
 	if (!server_found) {
 		printf("No Server found\n");
 		longjmp(restart_etherboot, -1);
@@ -344,6 +358,7 @@
 {
 	const char	*kernel;
 	printf("\nMe: %@", arptable[ARP_CLIENT].ipaddr.s_addr );
+#ifndef STATIC_ADDRESS
 #ifndef NO_DHCP_SUPPORT
 	printf(", DHCP: %@", dhcp_server );
 #ifdef PXE_EXPORT       
@@ -352,6 +367,7 @@
 		       arptable[ARP_PROXYDHCP].ipaddr.s_addr);
 #endif /* PXE_EXPORT */
 #endif /* ! NO_DHCP_SUPPORT */
+#endif /* STATIC_ADDRESS */	
 	printf(", TFTP: %@", arptable[ARP_SERVER].ipaddr.s_addr);
 	if (BOOTP_DATA_ADDR->bootp_reply.bp_giaddr.s_addr)
 		printf(", Relay: %@",
@@ -788,7 +804,33 @@
 }
 #endif	/* DOWNLOAD_PROTO_TFTP */
 
+#ifdef  STATIC_ADDRESS
+/***************************************************************************
+STATIC - Set my IP address and load information
+***************************************************************************/
+void static_client_ip(void)
+{
+	in_addr client_addr;
+	inet_aton(STATIC_CLIENT_IP,&client_addr);
+	memcpy(&arptable[ARP_CLIENT].ipaddr,&client_addr.s_addr,sizeof(in_addr));
+}
+
+int static_server_ip(void)
+{
+	in_addr server_addr,gateway_addr;
+	inet_aton(STATIC_SERVER_IP,&server_addr);
+	inet_aton(STATIC_GATEWAY_IP,&gateway_addr);
+	netmask=default_netmask();
+	memcpy(&arptable[ARP_SERVER].ipaddr,&server_addr.s_addr,sizeof(in_addr));
+	memcpy(&arptable[ARP_GATEWAY].ipaddr,&gateway_addr.s_addr,sizeof(in_addr));
+
+	BOOTP_DATA_ADDR->bootp_reply.bp_op=BOOTP_REPLY;
+	
+	return 1;
+}
+#else
 #ifdef	RARP_NOT_BOOTP
+
 /**************************************************************************
 RARP - Get my IP address and load information
 **************************************************************************/
@@ -851,7 +893,6 @@
 }
 
 #else
-
 /**************************************************************************
 BOOTP - Get my IP address and load information
 **************************************************************************/
@@ -1049,6 +1090,8 @@
 }
 #endif	/* RARP_NOT_BOOTP */
 
+#endif
+
 static uint16_t tcpudpchksum(struct iphdr *ip)
 {
 	struct udp_pseudo_hdr pseudo;