Index: /branches/rel_apv_10_4_0_112_india/usr/click/lib/libparser/commands.pm
===================================================================
--- /branches/rel_apv_10_4_0_112_india/usr/click/lib/libparser/commands.pm	(revision 38322)
+++ /branches/rel_apv_10_4_0_112_india/usr/click/lib/libparser/commands.pm	(working copy)
@@ -18940,7 +18940,7 @@
 		name => "eroute",
 		help_string => "Configure extended routing table",
 		menu => "root_ip",
-		cmd_attribute => "CMD_ARRAYOS|CMD_SPROXY|CMD_NORMAL|CMD_GLOBAL|CMD_KERN_API",
+		cmd_attribute => "CMD_ARRAYOS|CMD_SPROXY|CMD_NORMAL|CMD_GLOBAL|CMD_KERN_API|CMD_KAPI_LOCK",
 		user_level => "CLI_LEVEL_CONFIG",
 		function_name => "eroute_add_cli_multitype",
 		function_args => [ {
@@ -19007,7 +19007,7 @@
 		obj_type => "ITEM",
 		name => "eroute",
 		help_string => "Remove extended routing policy",
-		cmd_attribute => "CMD_ARRAYOS|CMD_SPROXY|CMD_NORMAL|CMD_GLOBAL|CMD_KERN_API",
+		cmd_attribute => "CMD_ARRAYOS|CMD_SPROXY|CMD_NORMAL|CMD_GLOBAL|CMD_KERN_API|CMD_KAPI_LOCK",
 		user_level => "CLI_LEVEL_CONFIG",
 		menu => "root_no_ip",
 		function_name => "eroute_delete_cli",
@@ -19021,7 +19021,7 @@
 		obj_type => "ITEM",
 		name => "eroute",
 		help_string => "Remove all extended routing policies",
-		cmd_attribute => "CMD_ARRAYOS|CMD_SPROXY|CMD_NORMAL|CMD_GLOBAL|CMD_KERN_API",
+		cmd_attribute => "CMD_ARRAYOS|CMD_SPROXY|CMD_NORMAL|CMD_GLOBAL|CMD_KERN_API|CMD_KAPI_LOCK",
 		user_level => "CLI_LEVEL_CONFIG",
 		menu => "root_clear_ip",
 		function_name => "eroute_clear",
Index: /branches/rel_apv_10_4_0_112_india/usr/src/sys/click/netinet/click_eroute.h
===================================================================
--- /branches/rel_apv_10_4_0_112_india/usr/src/sys/click/netinet/click_eroute.h	(revision 38322)
+++ /branches/rel_apv_10_4_0_112_india/usr/src/sys/click/netinet/click_eroute.h	(working copy)
@@ -648,7 +648,8 @@
 		)
 
 #define EROUTE_RTS_NOT_BSD 0
-#define EROUTE_RTS_BSD 1 
+#define EROUTE_RTS_BSD 1
+#define EROUTE_RTS_UPDATE 2
 
 extern int llb_bw_priority;
 
Index: /branches/rel_apv_10_4_0_112_india/usr/src/sys/click/netinet/click_eroute.c
===================================================================
--- /branches/rel_apv_10_4_0_112_india/usr/src/sys/click/netinet/click_eroute.c	(revision 38322)
+++ /branches/rel_apv_10_4_0_112_india/usr/src/sys/click/netinet/click_eroute.c	(working copy)
@@ -10517,7 +10517,7 @@
 }
 
 void
-rts_create(struct mbuf * m, void *ip_v, int is_bsd)
+rts_create(struct mbuf * m, void *ip_v, int flag)
 {
 	struct in_addr local_ip;
 	struct in_addr remote_ip;
@@ -10531,6 +10531,7 @@
 	struct ip *ip;
 	struct ip6_hdr *ip6;
 	int isipv6;
+        int is_bsd = (flag & EROUTE_RTS_BSD);
 	hash_t *table;
 
 	clicktcp_enter_func(m, NULL);
@@ -10579,8 +10580,12 @@
 	 * Note the insertion is done with temporary entry.  We *need* to
 	 * set hp->rec to a permanent entry if hp->new is true.
 	 */
-	hp = hashInSearch(table, ori_key, &tmp_rirtentry, HASH_INSERT);
+	hp = hashInSearch(table, ori_key, &tmp_rirtentry, (flag & EROUTE_RTS_UPDATE)? HASH_NOINSERT: HASH_INSERT);
 	if (NULL == hp) {
+                if (flag & EROUTE_RTS_UPDATE) {
+                        RIRT_TABLE_UNLOCK(RIRT_LI(ori_key));
+                        return;
+                }
 		/* out of memory, throw away oldest */
 		rirt = TIMER_FIRST(rts_lru[isipv6][RIRT_LI(ori_key)]);
 		if (rirt) {
@@ -10714,7 +10719,10 @@
 		RIRT_TABLE_UNLOCK(RIRT_LI(ori_key));
 		return;
 	}
-	
+	if (flag & EROUTE_RTS_UPDATE) {
+                RIRT_TABLE_UNLOCK(RIRT_LI(ori_key));
+                return;
+        }
 creat_entry:
 
 	erule = rts_get_erule(m, is_bsd);
