diff -ur ./nasoc/src/apps/udhcpd.brcm/arpping.c /home/chihchun/workspace/wl700ge/WL700gE_FW_1.0.7.8_GPL/nasoc/src/apps/udhcpd/arpping.c
--- ./nasoc/src/apps/udhcpd.brcm/arpping.c	2005-08-23 23:02:39.000000000 +0800
+++ /home/chihchun/workspace/wl700ge/WL700gE_FW_1.0.7.8_GPL/nasoc/src/apps/udhcpd/arpping.c	2007-08-02 10:41:52.000000000 +0800
@@ -102,3 +102,79 @@
 	DEBUG(LOG_INFO, "%salid arp replies for this address", rv ? "No v" : "V");	 
 	return rv;
 }
+
+/* Arthur, 050809, for auto ip function, { */
+int arpping_1(u_int32_t yiaddr, u_int32_t ip, unsigned char *mac, char *interface)
+{
+
+	int	timeout = 2;
+	int 	optval = 1;
+	int	s;			/* socket */
+	int	rv = 1;			/* return value */
+	struct sockaddr addr;		/* for interface name */
+	struct arpMsg	arp;
+	fd_set		fdset;
+	struct timeval	tm;
+	time_t		prevTime;
+
+
+	if ((s = socket (PF_PACKET, SOCK_PACKET, htons(ETH_P_ARP))) == -1) {
+		LOG(LOG_ERR, "Could not open raw socket");
+		return -1;
+	}
+	
+	if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, &optval, sizeof(optval)) == -1) {
+		LOG(LOG_ERR, "Could not setsocketopt on raw socket");
+		close(s);
+		return -1;
+	}
+
+	/* send arp request */
+	memset(&arp, 0, sizeof(arp));
+	memcpy(arp.ethhdr.h_dest, MAC_BCAST_ADDR, 6);	/* MAC DA */
+	memcpy(arp.ethhdr.h_source, mac, 6);		/* MAC SA */
+	arp.ethhdr.h_proto = htons(ETH_P_ARP);		/* protocol type (Ethernet) */
+	arp.htype = htons(ARPHRD_ETHER);		/* hardware type */
+	arp.ptype = htons(ETH_P_IP);			/* protocol type (ARP message) */
+	arp.hlen = 6;					/* hardware address length */
+	arp.plen = 4;					/* protocol address length */
+	arp.operation = htons(ARPOP_REQUEST);		/* ARP op code */
+	*((u_int *) arp.sInaddr) = ip;			/* source IP address */
+	memcpy(arp.sHaddr, mac, 6);			/* source hardware address */
+	*((u_int *) arp.tInaddr) = yiaddr;		/* target IP address */
+	
+	memset(&addr, 0, sizeof(addr));
+	strcpy(addr.sa_data, interface);
+	if (sendto(s, &arp, sizeof(arp), 0, &addr, sizeof(addr)) < 0)
+		rv = 0;
+	
+	/* wait arp reply, and check it */
+	tm.tv_usec = 0;
+	time(&prevTime);
+	while (timeout > 0) {
+		FD_ZERO(&fdset);
+		FD_SET(s, &fdset);
+		tm.tv_sec = timeout;
+		if (select(s + 1, &fdset, (fd_set *) NULL, (fd_set *) NULL, &tm) < 0) {
+			DEBUG(LOG_ERR, "Error on ARPING request: %s", strerror(errno));
+			if (errno != EINTR) rv = 0;
+		} else if (FD_ISSET(s, &fdset)) {
+			if (recv(s, &arp, sizeof(arp), 0) < 0 ) rv = 0;
+			if ( (arp.operation == htons(ARPOP_REPLY) || (arp.operation == htons(ARPOP_REQUEST))) && 
+			    bcmp(arp.tHaddr, mac, 6) == 0 && 
+			    *((u_int *) arp.sInaddr) == yiaddr) {
+				DEBUG(LOG_INFO, "Valid arp reply receved for this address");
+				rv = 0;
+				break;
+			}
+		}
+		timeout -= time(NULL) - prevTime;
+		time(&prevTime);
+	}
+	close(s);
+	DEBUG(LOG_INFO, "%salid arp replies for this address", rv ? "No v" : "V");	 
+	return rv;
+}
+/* Arthur, 050809, for auto ip function, } */
+
+
diff -ur ./nasoc/src/apps/udhcpd.brcm/clientpacket.c /home/chihchun/workspace/wl700ge/WL700gE_FW_1.0.7.8_GPL/nasoc/src/apps/udhcpd/clientpacket.c
--- ./nasoc/src/apps/udhcpd.brcm/clientpacket.c	2005-08-23 23:02:39.000000000 +0800
+++ /home/chihchun/workspace/wl700ge/WL700gE_FW_1.0.7.8_GPL/nasoc/src/apps/udhcpd/clientpacket.c	2007-08-02 10:41:52.000000000 +0800
@@ -115,7 +115,6 @@
 		add_simple_option(packet.options, DHCP_REQUESTED_IP, requested);
 
 	add_requests(&packet);
-	LOG(LOG_DEBUG, "Sending discover...");
 	return raw_packet(&packet, INADDR_ANY, CLIENT_PORT, INADDR_BROADCAST, 
 				SERVER_PORT, MAC_BCAST_ADDR, client_config.ifindex);
 }
diff -ur ./nasoc/src/apps/udhcpd.brcm/dhcpc.c /home/chihchun/workspace/wl700ge/WL700gE_FW_1.0.7.8_GPL/nasoc/src/apps/udhcpd/dhcpc.c
--- ./nasoc/src/apps/udhcpd.brcm/dhcpc.c	2005-08-23 23:02:39.000000000 +0800
+++ /home/chihchun/workspace/wl700ge/WL700gE_FW_1.0.7.8_GPL/nasoc/src/apps/udhcpd/dhcpc.c	2007-08-02 10:41:52.000000000 +0800
@@ -46,6 +46,12 @@
 #include "debug.h"
 #include "pidfile.h"
 
+/* Arthur, 050802, support AUTO IP function, { */
+#include <bcmnvram.h>
+#include "arpping.h"
+#define sin_addr(s) (((struct sockaddr_in *)(s))->sin_addr)
+/* Arthur, 050802, support AUTO IP function, } */
+
 static int state;
 static unsigned long requested_ip; /* = 0 */
 static unsigned long server_addr;
@@ -76,6 +82,128 @@
 	arp: "\0\0\0\0\0\0",		/* appease gcc-3.0 */
 };
 
+/* Arthur, 050802, support AUTO IP function, { */
+int ifconfig(char *name, int flags, char *addr, char *netmask)
+{
+	int s;
+	struct ifreq ifr;
+	struct in_addr in_addr, in_netmask, in_broadaddr;
+
+	/* Open a raw socket to the kernel */
+	if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0)
+		goto err;
+
+	/* Set interface name */
+	strncpy(ifr.ifr_name, name, IFNAMSIZ);
+	
+	/* Set interface flags */
+	ifr.ifr_flags = flags;
+	if (ioctl(s, SIOCSIFFLAGS, &ifr) < 0)
+		goto err;
+	
+	/* Set IP address */
+	if (addr) {
+		inet_aton(addr, &in_addr);
+		sin_addr(&ifr.ifr_addr).s_addr = in_addr.s_addr;
+		ifr.ifr_addr.sa_family = AF_INET;
+		if (ioctl(s, SIOCSIFADDR, &ifr) < 0)
+			goto err;
+	}
+
+	/* Set IP netmask and broadcast */
+	if (addr && netmask) {
+		inet_aton(netmask, &in_netmask);
+		sin_addr(&ifr.ifr_netmask).s_addr = in_netmask.s_addr;
+		ifr.ifr_netmask.sa_family = AF_INET;
+		if (ioctl(s, SIOCSIFNETMASK, &ifr) < 0)
+			goto err;
+
+		in_broadaddr.s_addr = (in_addr.s_addr & in_netmask.s_addr) | ~in_netmask.s_addr;
+		sin_addr(&ifr.ifr_broadaddr).s_addr = in_broadaddr.s_addr;
+		ifr.ifr_broadaddr.sa_family = AF_INET;
+		if (ioctl(s, SIOCSIFBRDADDR, &ifr) < 0)
+			goto err;
+	}
+
+	close(s);
+
+	return 0;
+
+ err:
+	close(s);
+	perror(name);
+	return errno;
+}	
+
+int call_autoip(void)
+{
+	char *macaddr = NULL, *autoip = NULL, *macbuffer = NULL, *macindex = NULL; 
+	char *ipindex = NULL;  
+	int mactmp = 0, i = 0;
+	char *macbuf = NULL;
+
+	int retVal = 0;
+
+	unsigned char macc[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+	unsigned int maci[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+	char macs[128] = "\0";
+	
+	autoip = (char *)malloc(32);
+	macbuffer = (char *)malloc(32);
+	macbuf = (char *)malloc(64);
+	macaddr = nvram_safe_get("et0macaddr");  
+   	macindex=macaddr;
+
+	sprintf(macs, "%s:", macaddr);
+
+   	while(strcmp(macindex, ""))
+   	{
+    		mactmp = strtol(macaddr, &macindex, 0);
+    		sprintf(macbuf, "%s%d", macbuffer, mactmp);
+    		macaddr=macindex;
+    		macaddr++;
+   	}
+   	srand(time(NULL)*strtol(macbuf, NULL, 0));
+
+	/* mac address convertion */
+	sscanf(macs, "%02x:%02x:%02x:%02x:%02x:%02x:", 
+			&maci[0], &maci[1], &maci[2], &maci[3], &maci[4], &maci[5]);
+	for(i=0;i<6;i++)
+		macc[i] = (unsigned char) maci[i];
+
+	for(i = 0; i<10; i++) 
+	{
+		sprintf(autoip, "169.254.%d.%d", ((int)(255.0*rand()/(RAND_MAX+1.0))), ((int)(255.0*rand()/(RAND_MAX+1.0))));
+		
+ 		while((ipindex=strrchr(autoip, '.'))&&!strncmp(ipindex+1, "0", 1))
+ 		{
+ 			sprintf(autoip, "169.254.%d.%d", ((int)(255.0*rand()/(RAND_MAX+1.0))),
+ 					((int)(255.0*rand()/(RAND_MAX+1.0))));
+ 		}
+
+		if (arpping_1(inet_addr(autoip), 0x00000000, macc, "br0") == 0)
+			continue;
+		else
+		{
+  			ifconfig("br0", (IFF_UP|IFF_RUNNING|IFF_BROADCAST|IFF_MULTICAST), autoip, "255.255.0.0");  
+ 			nvram_set("lan_ipaddr_t", autoip);  nvram_set("lan_netmask_t", "255.255.0.0");
+ 			retVal = 1;
+			arpping_1(inet_addr(autoip), inet_addr(autoip), macc, "br0");
+			arpping_1(inet_addr(autoip), inet_addr(autoip), macc, "br0");
+			break;
+		}
+	}
+	
+	if(autoip)
+		free(autoip);
+  	if(macbuffer)
+   		free(macbuffer);
+	if(macbuf)
+		free(macbuf);
+	return retVal;
+ }
+/* Arthur, 050802, support AUTO IP function, } */
+
 #ifndef BB_VER
 static void show_usage(void)
 {
@@ -200,27 +328,6 @@
 	pidfile_write_release(pid_fd);
 }
 
-static int valid_lease_exists(const char *interface)
-{
-	FILE *fp = NULL;
-	time_t now, expires;
-	char expire_filename[] = {"/tmp/udhcpc_eth0.expiresXXXXXX"};
-	char lease[80];
-
-	sprintf(expire_filename, "/tmp/udhcpc_%s.expires", interface);
-
-	if (!(fp = fopen(expire_filename, "r")))
-		return 0;
-	fgets(lease, sizeof(lease), fp);
-
-	expires = atoi(lease);
-	time(&now);
-
-	if ((expires) && (expires >= now))
-		return 1;
-	else
-		return 0;
-}
 
 #ifdef COMBINED_BINARY
 int udhcpc_main(int argc, char *argv[])
@@ -242,6 +349,9 @@
 	int max_fd;
 	int sig;
 
+	int timecnt = 0; /* Arthur, support auto ip function */
+	int autoip_flag = 0; /* Arthur, support auto ip function */
+
 	static struct option arg_options[] = {
 		{"clientid",	required_argument,	0, 'c'},
 		{"foreground",	no_argument,		0, 'f'},
@@ -283,12 +393,24 @@
 			break;
 		case 'h':
 		case 'H':
-			len = strlen(optarg) > 255 ? 255 : strlen(optarg);
-			if (client_config.hostname) free(client_config.hostname);
-			client_config.hostname = xmalloc(len + 2);
-			client_config.hostname[OPT_CODE] = DHCP_HOST_NAME;
-			client_config.hostname[OPT_LEN] = len;
-			strncpy(client_config.hostname + 2, optarg, len);
+			if(nvram_invmatch("wan_hostname", ""))
+			{
+				len = strlen(nvram_safe_get("wan_hostname")) > 255 ? 255 : strlen(nvram_safe_get("wan_hostname"));
+				if (client_config.hostname) free(client_config.hostname);
+				client_config.hostname = xmalloc(len + 2);
+				client_config.hostname[OPT_CODE] = DHCP_HOST_NAME;
+				client_config.hostname[OPT_LEN] = len;
+				strncpy(client_config.hostname + 2, nvram_safe_get("wan_hostname"), len);
+			}
+			else
+			{
+				len = strlen(optarg) > 255 ? 255 : strlen(optarg);
+				if (client_config.hostname) free(client_config.hostname);
+				client_config.hostname = xmalloc(len + 2);
+				client_config.hostname[OPT_CODE] = DHCP_HOST_NAME;
+				client_config.hostname[OPT_LEN] = len;
+				strncpy(client_config.hostname + 2, optarg, len);
+			}
 			break;
 		case 'i':
 			client_config.interface =  optarg;
@@ -349,18 +471,8 @@
 	signal(SIGUSR2, signal_handler);
 	signal(SIGTERM, signal_handler);
 	
-	/*
-	Check if there is an existing valid lease. If there is, go to
-	renew state, else goto init.
-	*/
-	if (valid_lease_exists(client_config.interface)) {
-		xid = random_xid();
-		state = RENEW_REQUESTED;
-	} else {
-		state = INIT_SELECTING;
-		run_script(NULL, "deconfig");
-	}
-
+	state = INIT_SELECTING;
+	run_script(NULL, "deconfig");
 	change_mode(LISTEN_RAW);
 
 	for (;;) {
@@ -386,7 +498,8 @@
 			DEBUG(LOG_INFO, "Waiting on select...\n");
 			max_fd = signal_pipe[0] > fd ? signal_pipe[0] : fd;
 			retval = select(max_fd + 1, &rfds, NULL, NULL, &tv);
-		} else retval = 0; /* If we already timed out, fall through */
+		} else 
+			retval = 0; /* If we already timed out, fall through */
 
 		now = time(0);
 		if (retval == 0) {
@@ -410,16 +523,26 @@
 						LOG(LOG_INFO, "No lease, failing.");
 						exit_client(1);
 				  	}
-					/*
-					Call IP autoconfiguration script. If IP autoconfiguration is
-					enabled, APIPA address will be assigned to the interface after
-					a pre-determined time has elapsed.
-					*/
-					run_script(NULL, "autoip");
-
 					/* wait to try again */
+
+					/* Arthur, 050809, support auto ip function, { */
+					#if 1
+					if ( strcasecmp("br0", client_config.interface) == 0 )
+					{
+						if( timecnt++ >1 && state != RENEWING && autoip_flag == 0) 
+						{
+							if (call_autoip() == 1)
+							{
+								autoip_flag = 1;
+								system("/shares/bin/rcex");
+							}
+						}
+					}
+					#endif
+					/* Arthur, 050809, support auto ip function, } */
+					
 					packet_num = 0;
-					timeout = now + 60;
+					timeout = now + 5;
 				}
 				break;
 			case RENEW_REQUESTED:
@@ -428,7 +551,8 @@
 					/* send request packet */
 					if (state == RENEW_REQUESTED)
 						send_renew(xid, server_addr, requested_ip); /* unicast */
-					else send_selecting(xid, server_addr, requested_ip); /* broadcast */
+					else 
+						send_selecting(xid, server_addr, requested_ip); /* broadcast */
 					
 					timeout = now + ((packet_num == 2) ? 10 : 2);
 					packet_num++;
@@ -444,7 +568,8 @@
 			case BOUND:
 				/* Lease is starting to run out, time to enter renewing state */
 				state = RENEWING;
-				change_mode(LISTEN_KERNEL);
+				//change_mode(LISTEN_KERNEL);
+				change_mode(LISTEN_RAW);
 				DEBUG(LOG_INFO, "Entering renew state");
 				/* fall right through */
 			case RENEWING:
@@ -546,12 +671,13 @@
 					/* little fixed point for n * .875 */
 					t2 = (lease * 0x7) >> 3;
 					temp_addr.s_addr = packet.yiaddr;
-					LOG(LOG_INFO, "Lease of %s obtained, lease time %ld", 
-						inet_ntoa(temp_addr), lease);
+					LOG(LOG_INFO, "(%d) Lease of %s obtained, lease time %ld", 
+						state, inet_ntoa(temp_addr), lease);
 					start = now;
 					timeout = t1 + start;
 					requested_ip = packet.yiaddr;
-					run_script(&packet,
+					if (state != RENEWING && state !=REBINDING)
+						run_script(&packet,
 						   ((state == RENEWING || state == REBINDING) ? "renew" : "bound"));
 
 					state = BOUND;
@@ -561,6 +687,17 @@
 					if (!client_config.foreground)
 						background();
 
+					/* Arthur, 050809, support auto ip function, { */
+					if ( strcasecmp("br0", client_config.interface) == 0 )
+					{
+						if(autoip_flag == 1)
+						{
+							autoip_flag = 0; 
+							system("/shares/bin/rcex");
+						}
+					}
+					/* Arthur, 050809, support auto ip function, } */
+
 				} else if (*message == DHCPNAK) {
 					/* return to init state */
 					LOG(LOG_INFO, "Received DHCP NAK");
@@ -604,4 +741,3 @@
 	}
 	return 0;
 }
-
diff -ur ./nasoc/src/apps/udhcpd.brcm/dhcpd.c /home/chihchun/workspace/wl700ge/WL700gE_FW_1.0.7.8_GPL/nasoc/src/apps/udhcpd/dhcpd.c
--- ./nasoc/src/apps/udhcpd.brcm/dhcpd.c	2005-08-23 23:02:39.000000000 +0800
+++ /home/chihchun/workspace/wl700ge/WL700gE_FW_1.0.7.8_GPL/nasoc/src/apps/udhcpd/dhcpd.c	2007-08-02 10:41:52.000000000 +0800
@@ -116,6 +116,17 @@
 	
 	leases = malloc(sizeof(struct dhcpOfferedAddr) * server_config.max_leases);
 	memset(leases, 0, sizeof(struct dhcpOfferedAddr) * server_config.max_leases);
+
+	// Added by Joey to load static lease
+#ifdef FILE_LOAD
+	if (argc>=3)
+	{
+		load_leases(argv[2]);
+	}
+#else // NVRAM_LOAD
+	load_leases();
+#endif
+
 	read_leases(server_config.lease_file);
 
 	if (read_interface(server_config.interface, &server_config.ifindex,
@@ -268,7 +279,6 @@
 				} else {
 					sendNAK(&packet);
 				}
-
 			} else if (packet.ciaddr) {
 				/* RENEWING or REBINDING State */
 				sendNAK(&packet);
Binary files ./nasoc/src/apps/udhcpd.brcm/dhcpd.o and /home/chihchun/workspace/wl700ge/WL700gE_FW_1.0.7.8_GPL/nasoc/src/apps/udhcpd/dhcpd.o differ
Binary files ./nasoc/src/apps/udhcpd.brcm/dumpleases and /home/chihchun/workspace/wl700ge/WL700gE_FW_1.0.7.8_GPL/nasoc/src/apps/udhcpd/dumpleases differ
diff -ur ./nasoc/src/apps/udhcpd.brcm/files.c /home/chihchun/workspace/wl700ge/WL700gE_FW_1.0.7.8_GPL/nasoc/src/apps/udhcpd/files.c
--- ./nasoc/src/apps/udhcpd.brcm/files.c	2005-08-23 23:02:39.000000000 +0800
+++ /home/chihchun/workspace/wl700ge/WL700gE_FW_1.0.7.8_GPL/nasoc/src/apps/udhcpd/files.c	2007-08-02 10:41:52.000000000 +0800
@@ -11,6 +11,7 @@
 #include <time.h>
 #include <ctype.h>
 #include <netdb.h>
+#include <bcmnvram.h>
 
 #include "debug.h"
 #include "dhcpd.h"
@@ -18,6 +19,8 @@
 #include "options.h"
 #include "leases.h"
 
+unsigned int current_subnet=0;
+
 /* on these functions, make sure you datatype matches */
 static int read_ip(char *line, void *arg)
 {
@@ -97,6 +100,13 @@
 			switch (option->flags & TYPE_MASK) {
 			case OPTION_IP:
 				retval = read_ip(val, buffer);
+				if(strcmp(option->name, "subnet")==0)
+				{	
+					unsigned int *map;
+					map = (unsigned int *)buffer;
+					current_subnet = *map;
+					fprintf(stderr, "subnet %x %x\n", retval, current_subnet);
+				}
 				break;
 			case OPTION_IP_PAIR:
 				retval = read_ip(val, buffer);
@@ -179,6 +189,7 @@
 	FILE *in;
 	char buffer[80], orig[80], *token, *line;
 	int i;
+	int dns_again_flag;
 
 	for (i = 0; strlen(keywords[i].keyword); i++)
 		if (strlen(keywords[i].def))
@@ -189,7 +200,31 @@
 		return 0;
 	}
 	
+	dns_again_flag=0;
+
 	while (fgets(buffer, 80, in)) {
+		// added by Joey to urgly handle option
+		if (nvram_invmatch("dhcp_gateway_x", "") && strstr(buffer, "option router"))
+			sprintf(buffer, "option router %s\n", nvram_safe_get("dhcp_gateway_x"));
+		else if (strstr(buffer, "option lease"))
+			sprintf(buffer, "option lease %s\n", nvram_safe_get("dhcp_lease"));
+		else if (strstr(buffer, "start "))
+			sprintf(buffer, "start %s\n", nvram_safe_get("dhcp_start"));
+		else if (strstr(buffer, "end "))
+			sprintf(buffer, "end %s\n", nvram_safe_get("dhcp_end"));
+
+dns_again:
+		if(strstr(buffer, "option dns"))
+		{
+			if(nvram_invmatch("dhcp_dns1_x", ""))
+				dns_again_flag++;
+
+			if (dns_again_flag==1) sprintf(buffer, "option dns %s\n", nvram_safe_get("dhcp_dns1_x"));
+			else sprintf(buffer, "option dns %s\n", nvram_safe_get("lan_ipaddr"));
+		}
+		
+		//fprintf(stderr, "dns: %s %d %s\n", buffer, dns_again_flag, nvram_safe_get("wan_ipaddr"));
+
 		if (strchr(buffer, '\n')) *(strchr(buffer, '\n')) = '\0';
 		strncpy(orig, buffer, 80);
 		if (strchr(buffer, '#')) *(strchr(buffer, '#')) = '\0';
@@ -213,6 +248,13 @@
 					/* reset back to the default value */
 					keywords[i].handler(keywords[i].def, keywords[i].var);
 				}
+
+		if (dns_again_flag==1)
+		{
+			dns_again_flag++;
+			sprintf(buffer, "option dns %s\n", nvram_safe_get("lan_ipaddr"));
+			goto dns_again;
+		}
 	}
 	fclose(in);
 	return 1;
@@ -228,16 +270,19 @@
 	unsigned long lease_time;
 	
 	if (!(fp = fopen(server_config.lease_file, "w"))) {
-		LOG(LOG_ERR, "Unable to open %s for writing", server_config.lease_file);
+		LOG(LOG_INFO, "Unable to open %s for writing", server_config.lease_file);
 		return;
 	}
 	
 	for (i = 0; i < server_config.max_leases; i++) {
-		if (leases[i].yiaddr != 0) {
+		if (leases[i].yiaddr != 0) 
+		{
+			LOG(LOG_INFO, "L:%d %x\n", i, leases[i].expires);
 			if (server_config.remaining) {
 				if (lease_expired(&(leases[i])))
 					lease_time = 0;
-				else lease_time = leases[i].expires - curr;
+				else if (leases[i].expires!=0xffffffff) lease_time = leases[i].expires - curr;
+				else lease_time = leases[i].expires;
 			} else lease_time = leases[i].expires;
 			lease_time = htonl(lease_time);
 			fwrite(leases[i].chaddr, 16, 1, fp);
@@ -254,13 +299,19 @@
 	}
 }
 
+int in_subnet(unsigned int leaseip, unsigned int refip)
+{
+	//fprintf(stderr, "ip: %x %x \n", leaseip, refip);
+	if((leaseip&current_subnet)==(refip&current_subnet)) return 1;
+	else return 0;
+}
 
 void read_leases(char *file)
 {
 	FILE *fp;
 	unsigned int i = 0;
-	struct dhcpOfferedAddr lease, *oldest;
-	
+	struct dhcpOfferedAddr lease;
+
 	if (!(fp = fopen(file, "r"))) {
 		LOG(LOG_ERR, "Unable to open %s for reading", file);
 		return;
@@ -268,20 +319,116 @@
 	
 	while (i < server_config.max_leases && (fread(&lease, sizeof lease, 1, fp) == 1)) {
 		/* ADDME: is it a static lease */
-		if (lease.yiaddr >= server_config.start && lease.yiaddr <= server_config.end) {
+		if (lease.yiaddr >= server_config.start && lease.yiaddr <= server_config.end && in_subnet(lease.yiaddr, server_config.start)) {
+			/* ADD by Chen-I to filter out lease beyond the subnet */
+			
 			lease.expires = ntohl(lease.expires);
 			if (!server_config.remaining) lease.expires -= time(0);
-			if (!(oldest = add_lease(lease.chaddr, lease.yiaddr, lease.expires))) {
+			if (!(add_lease(lease.chaddr, lease.yiaddr, lease.expires))) {
 				LOG(LOG_WARNING, "Too many leases while loading %s\n", file);
 				break;
 			}				
-			strncpy(oldest->hostname, lease.hostname, sizeof(oldest->hostname) - 1);
-			oldest->hostname[sizeof(oldest->hostname) - 1] = '\0';
 			i++;
 		}
 	}
 	DEBUG(LOG_INFO, "Read %d leases", i);
 	fclose(fp);
 }
+
+#define ETHER_ADDR_LEN 6
+void read_mac(char *str, uint8_t *mac)
+{
+	char m[3];
+	char *c;
+	int i=0;
+
+	c = str;
+
+	for(i=0; i<ETHER_ADDR_LEN; i++)
+	{
+		strncpy(m, c, 2);
+		m[2] = 0;
+		mac[i] = (unsigned char) strtoul(m, NULL, 16);
+		c+=2;
+	}
+} 
+
+#ifdef FILE_LOAD
+int load_lease(struct dhcpOfferedAddr *lease, FILE *fp)
+{
+	char buffer[256];
+	char *ip, *mac;
+	
+	if (fgets(buffer, sizeof(buffer), fp)==NULL) return 0;
+
+	mac = buffer;
+	ip = strsep(&mac, ",");
+
+	//printf("Lease Map2: %s - %s\n", ip, mac);	
+
+	read_ip(ip, &lease->yiaddr);
+	read_mac(mac, &lease->chaddr);
+	lease->expires = 0xffffffff;
+	return 1;
+}
+
+void load_leases(char *file)
+{
+	FILE *fp;
+	unsigned int i = 0;
+	struct dhcpOfferedAddr lease;
+	
+	if (!(fp = fopen(file, "r"))) {
+		LOG(LOG_ERR, "Unable to open %s for loading", file);
+		return;
+	}
+	
+	while (i < server_config.max_leases && (load_lease(&lease, fp) == 1)) 
+        {
+		/* ADDME: is it a static lease */
+		/* It is exactly a static lease */
+		if (!(add_lease(lease.chaddr, lease.yiaddr, lease.expires))) 
+		{
+			LOG(LOG_WARNING, "Too many leases while loading %s\n", file);
+			break;
+		}
+		i++;
+	}
+	DEBUG(LOG_INFO, "Load %d leases", i);
+	fclose(fp);
+}	
+#else
+int load_lease(struct dhcpOfferedAddr *lease, int count)
+{
+	char ipname[32], macname[32];
+	sprintf(ipname, "dhcp_staticip_x%d", count);
+	sprintf(macname, "dhcp_staticmac_x%d", count);
+
+	read_ip(nvram_safe_get(ipname), &lease->yiaddr);
+	read_mac(nvram_safe_get(macname), &lease->chaddr);
+	lease->expires = 0xffffffff;
+	return 1;
+}
+
+void load_leases(void)
+{
+	unsigned int i = 0, num;
+	struct dhcpOfferedAddr lease;
+
+	if (nvram_invmatch("dhcp_static_x","1")) return;
+
+	num = atoi(nvram_safe_get("dhcp_staticnum_x"));
 		
-		
+	while (i < server_config.max_leases && i < num) 
+        {
+		/* ADDME: is it a static lease */
+		/* It is exactly a static lease */
+		load_lease(&lease, i);
+		if (!(add_lease(lease.chaddr, lease.yiaddr, lease.expires))) 
+		{
+			break;
+		}
+		i++;
+	}
+}
+#endif	
diff -ur ./nasoc/src/apps/udhcpd.brcm/leases.c /home/chihchun/workspace/wl700ge/WL700gE_FW_1.0.7.8_GPL/nasoc/src/apps/udhcpd/leases.c
--- ./nasoc/src/apps/udhcpd.brcm/leases.c	2005-08-23 23:02:39.000000000 +0800
+++ /home/chihchun/workspace/wl700ge/WL700gE_FW_1.0.7.8_GPL/nasoc/src/apps/udhcpd/leases.c	2007-08-02 10:41:52.000000000 +0800
@@ -17,19 +17,32 @@
 #include "arpping.h"
 
 unsigned char blank_chaddr[] = {[0 ... 15] = 0};
+struct dhcpOfferedAddr *static_lease;
+	
 
 /* clear every lease out that chaddr OR yiaddr matches and is nonzero */
 void clear_lease(u_int8_t *chaddr, u_int32_t yiaddr)
 {
 	unsigned int i, j;
 	
+	//added by Joey to handle static lease
+	static_lease = NULL;
+	
 	for (j = 0; j < 16 && !chaddr[j]; j++);
 	
 	for (i = 0; i < server_config.max_leases; i++)
+	{
+		// added by Joey to handle static lease
+		//if (memcmp(leases[i].chaddr, chaddr, 16)==0 && leases[i].expires==0xffffffff)
+		//	static_lease = &leases[i];
+
 		if ((j != 16 && !memcmp(leases[i].chaddr, chaddr, 16)) ||
-		    (yiaddr && leases[i].yiaddr == yiaddr)) {
-			memset(&(leases[i]), 0, sizeof(struct dhcpOfferedAddr));
+		    (yiaddr && leases[i].yiaddr == yiaddr)) 
+		{	
+			if (leases[i].expires==0xffffffff) static_lease=&leases[i];
+			else memset(&(leases[i]), 0, sizeof(struct dhcpOfferedAddr));
 		}
+	}
 }
 
 
@@ -38,15 +51,21 @@
 {
 	struct dhcpOfferedAddr *oldest;
 	
-	/* clean out any old ones */
+	/* clean out any old ones */	
 	clear_lease(chaddr, yiaddr);
+
+	// added by Joey to handle static lease
+	if (static_lease) return(static_lease);
 		
 	oldest = oldest_expired_lease();
 	
 	if (oldest) {
 		memcpy(oldest->chaddr, chaddr, 16);
 		oldest->yiaddr = yiaddr;
-		oldest->expires = time(0) + lease;
+		if (lease==0xffffffff)
+			oldest->expires = 0xffffffff;
+		else
+			oldest->expires = time(0) + lease;
 	}
 	
 	return oldest;
@@ -84,7 +103,9 @@
 	unsigned int i;
 
 	for (i = 0; i < server_config.max_leases; i++)
-		if (!memcmp(leases[i].chaddr, chaddr, 16)) return &(leases[i]);
+		//JYWeng: 20030701 for palm: chaddr error after first 6 bytes
+		//if (!memcmp(leases[i].chaddr, chaddr, 16)) return &(leases[i]);
+		if (!memcmp(leases[i].chaddr, chaddr, 6)) return &(leases[i]);
 	
 	return NULL;
 }
diff -ur ./nasoc/src/apps/udhcpd.brcm/Makefile /home/chihchun/workspace/wl700ge/WL700gE_FW_1.0.7.8_GPL/nasoc/src/apps/udhcpd/Makefile
--- ./nasoc/src/apps/udhcpd.brcm/Makefile	2005-08-23 23:02:39.000000000 +0800
+++ /home/chihchun/workspace/wl700ge/WL700gE_FW_1.0.7.8_GPL/nasoc/src/apps/udhcpd/Makefile	2007-08-02 10:41:52.000000000 +0800
@@ -61,6 +61,11 @@
 STRIP=$(CROSS_COMPILE)strip
 endif
 
+CFLAGS	+= -I. -I$(TOP)/shared -I$(SRCBASE)/include 
+LDFLAGS	+= -L$(TOP)/nvram -L$(INSTALLROOT)/nvram/usr/lib -lnvram 
+ 
+
+
 all: $(EXEC1) $(EXEC2) $(EXEC3)
 	$(STRIP) --remove-section=.note --remove-section=.comment $(EXEC1) $(EXEC2) $(EXEC3)
 
