Index: /branches/rel_apv_10_7_4/usr/src/sys/click/netinet/click_udp.c
===================================================================
--- /branches/rel_apv_10_7_4/usr/src/sys/click/netinet/click_udp.c	(revision 39851)
+++ /branches/rel_apv_10_7_4/usr/src/sys/click/netinet/click_udp.c	(working copy)
@@ -349,12 +349,20 @@
 
 	if (r) {
 		if (r->flags & DYN_NAT_TO_IP6) {
+			/*TWSD-969, create rts table before CHECK_PCB_EROUTE()*/
+			if (rts_enable > 0) {
+				rts_create(m, mtod(m, struct ip6_hdr*), EROUTE_RTS_NOT_BSD);
+			}
 			peer_pcb = clickudp6_open(pcb, &r->nsrc_ip.in6,
 							   ntohs(r->nsrc_port),
 							   &r->ndst_ip.in6,
 							   ntohs(r->ndst_port), NULL,
 							   r->timeout, NULL, NULL);
 		} else {
+			/*TWSD-969, create rts table before CHECK_PCB_EROUTE()*/
+			if (rts_enable > 0) {
+				rts_create(m, mtod(m, struct ip *), EROUTE_RTS_NOT_BSD);
+			}
 			peer_pcb = clickudp_open(pcb, r->nsrc_ip.in4.s_addr,
 							  ntohs(r->nsrc_port),
 							  r->ndst_ip.in4.s_addr,
@@ -717,11 +725,19 @@
                 if (!get_source_ip6_by_server(&remoteip6, &localip6)) {
 					clicktcp6_border_ip6_by_eroute(eroute_rule, &localip6); 
                 }
+				/*TWSD-969, create rts table before CHECK_PCB_EROUTE()*/
+				if (rts_enable > 0) {
+					rts_create(m, mtod(m, struct ip6_hdr*), EROUTE_RTS_NOT_BSD);
+				}
 				llbdns_ret = clickudp_open_dnsproxy(isipv6, pcb, 0, &localip6, localport,  0, &remoteip6, ntohs(udp->uh_dport), llb_dnsproxy_pcb_timeout, eroute_rule);
 			} else {
                 if ((localip = get_source_ip_by_server(&remoteip)) == 0) { 
 					localip = clicktcp_border_ip_by_eroute(eroute_rule);
                 }
+				/*TWSD-969, create rts table before CHECK_PCB_EROUTE()*/
+				if (rts_enable > 0) {
+					rts_create(m, mtod(m, struct ip *), EROUTE_RTS_NOT_BSD);
+				}
 				llbdns_ret = clickudp_open_dnsproxy(isipv6, pcb, localip, NULL, localport,  remoteip.s_addr, NULL, ntohs(udp->uh_dport), llb_dnsproxy_pcb_timeout, eroute_rule);
 			}
 
@@ -803,6 +819,10 @@
 				localip = ip_pool_request(pcb->cp_remoteip.s_addr, nat_conf_p->pol);
 			}
 		}
+		/*TWSD-969, create rts table before CHECK_PCB_EROUTE()*/
+		if (rts_enable > 0) {
+			rts_create(m, isipv6?(void*)ip6:(void*)ip, EROUTE_RTS_NOT_BSD);
+		}
 		if (clickudp_open_nat(isipv6, pcb, localip, &localip6, localport, ip->ip_dst.s_addr, &ip6->ip6_dst, 
 						ntohs(udp->uh_dport), nat_conf_p->timeout/hz, *eroute_rule) != 0) {
 				/* Could not open new connection, drop and forget about packet */
@@ -1358,13 +1378,6 @@
 	}
     /* Bug 12086, end */
 
-	if (new_conn) {
-		if (rts_enable) {
-			rts_create(m, isipv6?(void*)ip6:(void*)ip, EROUTE_RTS_NOT_BSD);
-		}
-		CHECK_PCB_EROUTE(pcb, pcb->cp_eroute, EROUTE_LOOKUP_ONLY);
-	}
-
 	while (m != NULL) {
 		n = m->m_nextpkt;
 		m->m_nextpkt = NULL;
