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/net/click_ether.c
===================================================================
--- /branches/rel_apv_10_4_0_112_india/usr/src/sys/click/net/click_ether.c	(revision 38322)
+++ /branches/rel_apv_10_4_0_112_india/usr/src/sys/click/net/click_ether.c	(working copy)
@@ -2599,8 +2599,10 @@
 		if (isipv6 || (LOCAL_IP != iph->ip_dst.s_addr)) {
 			if (ip_p == IPPROTO_TCP){
 				tcph = (struct tcphdr *)l4_hdr;
-				if ((tcph->th_flags & (TH_SYN | TH_ACK)) != (TH_SYN | TH_ACK)){
-					rts_create(m, ip_v, EROUTE_RTS_BSD);
+                                if (tcph->th_flags == TH_SYN) {
+                                        rts_create(m, ip_v, EROUTE_RTS_BSD);
+                                } else if ((tcph->th_flags & (TH_SYN | TH_ACK)) != (TH_SYN | TH_ACK)){
+					rts_create(m, ip_v, EROUTE_RTS_BSD | EROUTE_RTS_UPDATE);
 				}
 			}else if (ip_p == IPPROTO_UDP){
 				rts_create(m, ip_v, EROUTE_RTS_BSD);
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);
Index: /branches/rel_apv_10_4_0_112_india/usr/src/sys/click/netinet/click_input.c
===================================================================
--- /branches/rel_apv_10_4_0_112_india/usr/src/sys/click/netinet/click_input.c	(revision 38322)
+++ /branches/rel_apv_10_4_0_112_india/usr/src/sys/click/netinet/click_input.c	(working copy)
@@ -15179,8 +15179,10 @@
 		}		
 		
 		if (proto == IPPROTO_TCP){
-			if ((tcp->th_flags & (TH_SYN | TH_ACK)) != (TH_SYN | TH_ACK)){
-				rts_create(m, ip_p, EROUTE_RTS_BSD);
+                        if (tcp->th_flags == TH_SYN) {
+                                rts_create(m, ip_p, EROUTE_RTS_BSD);
+                        } else if ((tcp->th_flags & (TH_SYN | TH_ACK)) != (TH_SYN | TH_ACK)){
+				rts_create(m, ip_p, EROUTE_RTS_BSD | EROUTE_RTS_UPDATE);
 			}
 		}else if (proto == IPPROTO_UDP){
 			rts_create(m, ip_p, EROUTE_RTS_BSD);
