Index: /branches/rel_apv_10_7/usr/click/lib/libamp_ulog/amp_ulog.h
===================================================================
--- /branches/rel_apv_10_7/usr/click/lib/libamp_ulog/amp_ulog.h	(revision 37931)
+++ /branches/rel_apv_10_7/usr/click/lib/libamp_ulog/amp_ulog.h	(working copy)
@@ -320,6 +320,7 @@
 #define LOG_HTTP_REQ                              0x1
 #define LOG_HTTP_RESP                             0x2
 
+
 #define LOG_HTTP_REQ_OPTIONS                          0x000000000000001
 #define LOG_HTTP_REQ_GET                              0x000000000000002
 #define LOG_HTTP_REQ_HEAD                             0x000000000000004
@@ -328,50 +329,51 @@
 #define LOG_HTTP_REQ_DELETE                           0x000000000000020
 #define LOG_HTTP_REQ_TRACE                            0x000000000000040
 #define LOG_HTTP_REQ_CONNECT                          0x000000000000080
-#define LOG_HTTP_REQ_HDRS_ACCEPT                      0x000000000000100
-#define LOG_HTTP_REQ_HDRS_ACCEPT_CHARSET              0x000000000000200
-#define LOG_HTTP_REQ_HDRS_ACCEPT_ENCODING             0x000000000000400
-#define LOG_HTTP_REQ_HDRS_ACCEPT_LANGUAGE             0x000000000000800
-#define LOG_HTTP_REQ_HDRS_AUTHORIZATION               0x000000000001000
-#define LOG_HTTP_REQ_HDRS_CACHE_CONTROL               0x000000000002000
-#define LOG_HTTP_REQ_HDRS_CONNECTION_CLOSE            0x000000000004000
-#define LOG_HTTP_REQ_HDRS_CONNECTION_KEEPALIVE        0x000000000008000
-#define LOG_HTTP_REQ_HDRS_CONTENT_LENGTH              0x000000000010000
-#define LOG_HTTP_REQ_HDRS_COOKIE                      0x000000000020000
-#define LOG_HTTP_REQ_HDRS_DATE                        0x000000000040000
-#define LOG_HTTP_REQ_HDRS_EXPECT                      0x000000000080000
-#define LOG_HTTP_REQ_HDRS_FROM                        0x000000000100000
-#define LOG_HTTP_REQ_HDRS_HOST                        0x000000000200000
-#define LOG_HTTP_REQ_HDRS_IF_MATCH                    0x000000000400000
-#define LOG_HTTP_REQ_HDRS_IF_MODIFIED_SINCE           0x000000000800000
+#define LOG_HTTP_REQ_PATCH                            0x000000000000100
+#define LOG_HTTP_REQ_HDRS_ACCEPT                      0x000000000000200
+#define LOG_HTTP_REQ_HDRS_ACCEPT_CHARSET              0x000000000000400
+#define LOG_HTTP_REQ_HDRS_ACCEPT_ENCODING             0x000000000000800
+#define LOG_HTTP_REQ_HDRS_ACCEPT_LANGUAGE             0x000000000001000
+#define LOG_HTTP_REQ_HDRS_AUTHORIZATION               0x000000000002000
+#define LOG_HTTP_REQ_HDRS_CACHE_CONTROL               0x000000000004000
+#define LOG_HTTP_REQ_HDRS_CONNECTION_CLOSE            0x000000000008000
+#define LOG_HTTP_REQ_HDRS_CONNECTION_KEEPALIVE        0x000000000010000
+#define LOG_HTTP_REQ_HDRS_CONTENT_LENGTH              0x000000000020000
+#define LOG_HTTP_REQ_HDRS_COOKIE                      0x000000000040000
+#define LOG_HTTP_REQ_HDRS_DATE                        0x000000000080000
+#define LOG_HTTP_REQ_HDRS_EXPECT                      0x000000000100000
+#define LOG_HTTP_REQ_HDRS_FROM                        0x000000000200000
+#define LOG_HTTP_REQ_HDRS_HOST                        0x000000000400000
+#define LOG_HTTP_REQ_HDRS_IF_MATCH                    0x000000000800000
+#define LOG_HTTP_REQ_HDRS_IF_MODIFIED_SINCE           0x000000001000000
 #define LOG_HTTP_REQ_HDRS_IF_NONE_MATCH               0x000000001000000
-#define LOG_HTTP_REQ_HDRS_IF_RANGE                    0x000000002000000
-#define LOG_HTTP_REQ_HDRS_IF_UNMODIFIED_SINCE         0x000000004000000
-#define LOG_HTTP_REQ_HDRS_JSSESSIONID                 0x000000008000000
-#define LOG_HTTP_REQ_HDRS_KEEP_ALIVE                  0x000000010000000
-#define LOG_HTTP_REQ_HDRS_PRAGMA                      0x000000020000000
-#define LOG_HTTP_REQ_HDRS_PROXY_AUTHORIZATION         0x000000040000000
-#define LOG_HTTP_REQ_HDRS_PROXY_CONNECTION            0x000000080000000
-#define LOG_HTTP_REQ_HDRS_RANGE                       0x000000100000000
-#define LOG_HTTP_REQ_HDRS_REFERER                     0x000000200000000
-#define LOG_HTTP_REQ_HDRS_TE                          0x000000400000000
-#define LOG_HTTP_REQ_HDRS_TRAILER                     0x000000800000000
-#define LOG_HTTP_REQ_HDRS_TRANSFER_ENCODING           0x000001000000000
-#define LOG_HTTP_REQ_HDRS_TRANSFER_ENCODING_CHUNKED   0x000002000000000
-#define LOG_HTTP_REQ_HDRS_UPGRADE                     0x000004000000000
-#define LOG_HTTP_REQ_HDRS_USER_AGENT                  0x000008000000000
-#define LOG_HTTP_REQ_HDRS_VIA                         0x000010000000000
-#define LOG_HTTP_REQ_HDRS_X_ACCESS_CONTROL            0x000020000000000
-#define LOG_HTTP_REQ_HDRS_X_BANDWIDTH                 0x000040000000000
-#define LOG_HTTP_REQ_HDRS_X_BEARER                    0x000080000000000
-#define LOG_HTTP_REQ_HDRS_X_FORWARDED_FOR             0x000100000000000
-#define LOG_HTTP_REQ_HDRS_X_MSISDN                    0x000200000000000
-#define LOG_HTTP_REQ_HDRS_X_VODAFONE_ACCESS_CONTROL   0x000400000000000
-#define LOG_HTTP_REQ_HDRS_X_WAP_PROFILE               0x000800000000000
-#define LOG_HTTP_REQ_HDRS_X_WSB_DIALLED               0x001000000000000
-#define LOG_HTTP_REQ_HDRS_X_WSB_MSISDN                0x002000000000000
-#define LOG_HTTP_REQ_HDRS_X_WSB_MSISDN_CONTENT_FILTER 0x004000000000000
-#define LOG_HTTP_REQ_HDRS_CONNECTION_UPGRADE          0x008000000000000
+#define LOG_HTTP_REQ_HDRS_IF_RANGE                    0x000000004000000
+#define LOG_HTTP_REQ_HDRS_IF_UNMODIFIED_SINCE         0x000000008000000
+#define LOG_HTTP_REQ_HDRS_JSSESSIONID                 0x000000010000000
+#define LOG_HTTP_REQ_HDRS_KEEP_ALIVE                  0x000000020000000
+#define LOG_HTTP_REQ_HDRS_PRAGMA                      0x000000040000000
+#define LOG_HTTP_REQ_HDRS_PROXY_AUTHORIZATION         0x000000080000000
+#define LOG_HTTP_REQ_HDRS_PROXY_CONNECTION            0x000000100000000
+#define LOG_HTTP_REQ_HDRS_RANGE                       0x000000200000000
+#define LOG_HTTP_REQ_HDRS_REFERER                     0x000000400000000
+#define LOG_HTTP_REQ_HDRS_TE                          0x000000800000000
+#define LOG_HTTP_REQ_HDRS_TRAILER                     0x000001000000000
+#define LOG_HTTP_REQ_HDRS_TRANSFER_ENCODING           0x000002000000000
+#define LOG_HTTP_REQ_HDRS_TRANSFER_ENCODING_CHUNKED   0x000004000000000
+#define LOG_HTTP_REQ_HDRS_UPGRADE                     0x000008000000000
+#define LOG_HTTP_REQ_HDRS_USER_AGENT                  0x000010000000000
+#define LOG_HTTP_REQ_HDRS_VIA                         0x000020000000000
+#define LOG_HTTP_REQ_HDRS_X_ACCESS_CONTROL            0x000040000000000
+#define LOG_HTTP_REQ_HDRS_X_BANDWIDTH                 0x000080000000000
+#define LOG_HTTP_REQ_HDRS_X_BEARER                    0x000100000000000
+#define LOG_HTTP_REQ_HDRS_X_FORWARDED_FOR             0x000200000000000
+#define LOG_HTTP_REQ_HDRS_X_MSISDN                    0x000400000000000
+#define LOG_HTTP_REQ_HDRS_X_VODAFONE_ACCESS_CONTROL   0x000800000000000
+#define LOG_HTTP_REQ_HDRS_X_WAP_PROFILE               0x001000000000000
+#define LOG_HTTP_REQ_HDRS_X_WSB_DIALLED               0x002000000000000
+#define LOG_HTTP_REQ_HDRS_X_WSB_MSISDN                0x004000000000000
+#define LOG_HTTP_REQ_HDRS_X_WSB_MSISDN_CONTENT_FILTER 0x008000000000000
+#define LOG_HTTP_REQ_HDRS_CONNECTION_UPGRADE          0x010000000000000
 
 /* 
  * these are used to record position of the last parsed hdr in bitmap
Index: /branches/rel_apv_10_7/usr/click/lib/libarray_parsers_http/array_parsers_http.pm
===================================================================
--- /branches/rel_apv_10_7/usr/click/lib/libarray_parsers_http/array_parsers_http.pm	(revision 37931)
+++ /branches/rel_apv_10_7/usr/click/lib/libarray_parsers_http/array_parsers_http.pm	(working copy)
@@ -11768,12 +11768,13 @@
 					{ input => "HTTP_PRNCHAR",     result => "GLOBAL_HTTP_INVALID_HDR", },
 					{ input => "HTTP_EXTCHAR",     result => "GLOBAL_HTTP_INVALID_HDR", },
 					{ input => "HTTP_ALPHA",       result => "1", },
+					{ input => "a",                result => "112", },
 					{ input => "o",                result => "30", },
 					{ input => "u",                result => "33", },
 	# Bug 10325,10323, panzj, 2005-05-12
 	# add new permit method flags for extension-method # for WebDAV
 					{ input => "r",                result => "40", },
-	# end of 10325, 10323 
+	# end of 10325, 10323
 				],
 			},
 			{
@@ -12704,6 +12705,51 @@
 					{ input => "HTTP_TAB_SPACE",   result => "RDG_OUT_DATA", },
 				],
 			},
+#PATCH
+			{
+				id => "112",
+				default => "1",
+				transitions => [
+					{ input => "HTTP_CTLCHAR",     result => "GLOBAL_HTTP_INVALID_HDR", },
+					{ input => "HTTP_PRNCHAR",     result => "GLOBAL_HTTP_INVALID_HDR", },
+					{ input => "HTTP_EXTCHAR",     result => "GLOBAL_HTTP_INVALID_HDR", },
+					{ input => "HTTP_ALPHA",       result => "1", },
+					{ input => "t",                result => "113", },
+				],
+			},
+			{
+				id => "113",
+				default => "1",
+				transitions => [
+					{ input => "HTTP_CTLCHAR",     result => "GLOBAL_HTTP_INVALID_HDR", },
+					{ input => "HTTP_PRNCHAR",     result => "GLOBAL_HTTP_INVALID_HDR", },
+					{ input => "HTTP_EXTCHAR",     result => "GLOBAL_HTTP_INVALID_HDR", },
+					{ input => "HTTP_ALPHA",       result => "1", },
+					{ input => "c",                result => "114", },
+				],
+			},
+			{
+				id => "114",
+				default => "1",
+				transitions => [
+					{ input => "HTTP_CTLCHAR",     result => "GLOBAL_HTTP_INVALID_HDR", },
+					{ input => "HTTP_PRNCHAR",     result => "GLOBAL_HTTP_INVALID_HDR", },
+					{ input => "HTTP_EXTCHAR",     result => "GLOBAL_HTTP_INVALID_HDR", },
+					{ input => "HTTP_ALPHA",       result => "1", },
+					{ input => "h",                result => "115", },
+				],
+			},
+			{
+				id => "115",
+				default => "1",
+				transitions => [
+					{ input => "HTTP_CTLCHAR",     result => "GLOBAL_HTTP_INVALID_HDR", },
+					{ input => "HTTP_PRNCHAR",     result => "GLOBAL_HTTP_INVALID_HDR", },
+					{ input => "HTTP_EXTCHAR",     result => "GLOBAL_HTTP_INVALID_HDR", },
+					{ input => "HTTP_ALPHA",       result => "1", },
+					{ input => "HTTP_TAB_SPACE",   result => "PATCH", },
+				],
+			},
 		],
 	}, # method
 	{
Index: /branches/rel_apv_10_7/usr/click/lib/libdns_agent/Makefile
===================================================================
--- /branches/rel_apv_10_7/usr/click/lib/libdns_agent/Makefile	(revision 37934)
+++ /branches/rel_apv_10_7/usr/click/lib/libdns_agent/Makefile	(working copy)
@@ -34,7 +34,7 @@
 	  -L${.OBJDIR}/../libhttp_utils -lhttp_utils \
 	  -L${.OBJDIR}/../libfastlog -lfastlog \
 	  -L${.OBJDIR}/../libenglog -lenglog \
-	  -lcrypt -lm -lz
+	  -lcrypt -lanl -lm -lz
 
 .if defined(USTACK)
 .include <bsd.lib.mk>
Index: /branches/rel_apv_10_7/usr/click/lib/libdns_agent/dns_daemon.c
===================================================================
--- /branches/rel_apv_10_7/usr/click/lib/libdns_agent/dns_daemon.c	(revision 37934)
+++ /branches/rel_apv_10_7/usr/click/lib/libdns_agent/dns_daemon.c	(working copy)
@@ -1,3 +1,4 @@
+#define _GNU_SOURCE
 #include <bsd/bsd.h>
 
 #include <stdio.h>
@@ -9,11 +10,14 @@
 #include <arpa/inet.h>
 #include <sys/stat.h>
 #include <sys/resource.h>
+#include <netdb.h>
+#include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 #include <fcntl.h>
 #include <sys/syslog.h>
 
+
 #include <click/sys/uproxy_limits.h>
 #include "dns_daemon.h"
 #include "webagent_dns.h"
@@ -41,6 +45,17 @@
 extern void* atcp_event_inrq_dequeue(uint16_t app_id);
 extern int atcp_event_outrq_enqueue(int thread_id, void *buf, uint16_t app_id);
 
+struct dns_req_ctx {
+	int busy_fl;
+	webagent_dns_data_t *webagent_ctx;
+	struct gaicb *req[1];
+	struct gaicb req_item;
+};
+#define DNS_REQ_LIST_LEN 20
+
+static __thread struct dns_req_ctx dns_req_wait_list[DNS_REQ_LIST_LEN];
+__thread int outstanding_dns_req_cnt = 0;
+  
 static time_t 
 get_nsfile_last_mtime(void)
 {
@@ -383,6 +398,7 @@
 	return;
 }
 
+/* not used, replaced with domain_resolve_asynch */
 static void 
 domain_resolve(char ns_table[][INET6_ADDRSTRLEN], int n_ns, char *host, webagent_dns_data_t *dns_data_p)
 {
@@ -397,6 +413,112 @@
 	return;
 }
 
+static int
+domain_resolve_asynch(char *host, webagent_dns_data_t *dns_data_p)
+{
+	int free_idx = 0;
+	int ret;
+	
+	/* find first free slot and Queue nreqs_base..nreqs requests. */
+	while (free_idx < DNS_REQ_LIST_LEN) {
+		if (dns_req_wait_list[free_idx].busy_fl == 0) {
+			break;
+		}
+		free_idx++;
+	}
+	if (free_idx > DNS_REQ_LIST_LEN) {
+		/* Note: this should not happen because in the thread func we do not read if list is full */
+		fastlog_syslog(LOG_DEBUG, "%s: run out of free requests %d", __FUNCTION__, outstanding_dns_req_cnt);
+		ulog_error_no_conn(AMP_ULOG_WEBAGENT, "run out of free requests");
+		return -1;
+	}
+	dns_req_wait_list[free_idx].req_item.ar_name = host;
+	dns_req_wait_list[free_idx].req_item.ar_service = NULL;
+	dns_req_wait_list[free_idx].req_item.ar_request = NULL; //hints will be default 
+	dns_req_wait_list[free_idx].req_item.ar_result = NULL;
+	dns_req_wait_list[free_idx].req[0] = &(dns_req_wait_list[free_idx].req_item);
+
+	ret = getaddrinfo_a(GAI_NOWAIT, dns_req_wait_list[free_idx].req, 1, NULL);
+	if (ret) {
+		fastlog_syslog(LOG_DEBUG, "%s: getaddrinfo_a failed %d", __FUNCTION__, ret);
+		ulog_error_no_conn(AMP_ULOG_WEBAGENT, "getaddrinfo_a failed %d", ret);
+		return -2;
+	}
+	/* dns req successfully sent */
+	dns_req_wait_list[free_idx].webagent_ctx = dns_data_p;
+	dns_req_wait_list[free_idx].busy_fl = 1;
+	outstanding_dns_req_cnt++;
+	//fastlog_syslog(LOG_DEBUG, "%s: sent req for %s(idx %d), out reqs %d",
+	//	       __FUNCTION__, host, free_idx, outstanding_dns_req_cnt);
+	return 0;
+}
+
+static void
+cleanup_poll_item(struct dns_req_ctx *poll_item)
+{
+	poll_item->webagent_ctx = NULL;
+	poll_item->busy_fl = 0;
+	outstanding_dns_req_cnt--;
+}
+
+static int
+domain_resolve_poll()
+{
+	int ret;
+	struct addrinfo *res;
+	struct gaicb *req_p;
+	webagent_dns_data_t *webagent_ctx;
+	int poll_freed_cnt = 0;
+
+	for (int i = 0; i < DNS_REQ_LIST_LEN; i++) {
+		if (dns_req_wait_list[i].busy_fl == 0) {
+			continue;
+		}
+		req_p = dns_req_wait_list[i].req[0];
+		ret = gai_error(req_p);
+
+		if (ret == EAI_INPROGRESS) {
+			continue;
+		}
+		webagent_ctx = dns_req_wait_list[i].webagent_ctx;
+
+		if (ret == 0) {
+			/* ready */
+			res = req_p->ar_result;
+			if (res->ai_addr->sa_family == AF_INET) {
+				struct sockaddr_in *my_addr = (struct sockaddr_in *)res->ai_addr;
+				fastlog_syslog(LOG_DEBUG, "%s: [%d], outstanding req %d, thread id %d: host %s -> ip %s",
+					       __FUNCTION__, i, outstanding_dns_req_cnt, webagent_ctx->thread_id,
+					       webagent_ctx->host, inet_ntoa(my_addr->sin_addr));
+
+				webagent_ctx->iptable.ip4_dns_record_table[0].ip = my_addr->sin_addr.s_addr;
+			} else {
+				struct sockaddr_in6 *my_addr = (struct sockaddr_in6 *)res->ai_addr;
+				webagent_ctx->iptable.ip6_dns_record_table[0].ip = my_addr->sin6_addr;
+			} 
+			webagent_ctx->ip_num = 1;
+		} else {
+			/* error from dns lookup */
+			fastlog_syslog(LOG_DEBUG, "%s: getaddrinfo_a poll failed, thread id [%hu], host %s",
+				       __FUNCTION__, webagent_ctx->thread_id,  webagent_ctx->host);
+			ulog_error_no_conn(AMP_ULOG_WEBAGENT, "getaddrinfo_a poll failed, thread id [%hu]",
+					   webagent_ctx->thread_id);
+		}
+		/* send it back */
+		ret = atcp_event_outrq_enqueue(webagent_ctx->thread_id, (void*)webagent_ctx, ATCP_DNS_RQ);
+		if (ret != 0) {
+			fastlog_syslog(LOG_DEBUG, "%s: failed to send dns reply back to webagent [%hu]",
+				       __FUNCTION__, webagent_ctx->thread_id);
+			ulog_error_no_conn(AMP_ULOG_WEBAGENT, "failed to insert webagent dns data to outrq [%hu]",
+					   webagent_ctx->thread_id);
+			WEBAGENT_DNS_FREE(webagent_ctx);
+		}
+		cleanup_poll_item(&dns_req_wait_list[i]);
+		poll_freed_cnt++;
+	}
+	return poll_freed_cnt;
+}
+
 static void
 dns_process_data_cb(void *data)
 {
@@ -417,22 +539,27 @@
 	dns_data_p->thread_id = input_data_p->thread_id;
 
 	if (dns_nameserver_avail) {
-		domain_resolve(ns_table, NAMESERVER_MAX_NUM, input_data_p->host, dns_data_p);
-		if (dns_data_p->ip_num == 0) {
-			dbg_printf("%s: failed to DNS lookup ip address", __FUNCTION__);
-			syslog(LOG_EMERG, "%s: failed to DNS lookup ip address", __FUNCTION__);
-			ulog_error_no_conn(AMP_ULOG_WEBAGENT, "%s: failed to DNS lookup ip address", __FUNCTION__);
-		}
+		ret = domain_resolve_asynch(input_data_p->host, dns_data_p);
+		if (ret) {
+			fastlog_syslog(LOG_DEBUG, "%s: failed to send DNS request", __FUNCTION__);
+			ulog_error_no_conn(AMP_ULOG_WEBAGENT, "failed to send DNS request");
+			goto sendback;
+		}
+		/*
+		 * Note: successfully sent a query to dns server, we do not need to enqueue anything back right now,
+		 * we will send back to webagent from the domain_resolve_poll function
+		 */
+		return;
 	}
-
+sendback:
+	/* did not send a query to the dns server, just send back to webagent */
 	ret = atcp_event_outrq_enqueue(input_data_p->thread_id, (void*)dns_data_p, ATCP_DNS_RQ);
 	if (ret != 0) {
 		dbg_printf("%s: failed to insert webagent dns data to outrq [%hu]", __FUNCTION__, input_data_p->thread_id);
-		syslog(LOG_EMERG, "%s: failed to insert webagent dns data to outrq [%hu]", __FUNCTION__, input_data_p->thread_id);
+		fastlog_syslog(LOG_DEBUG, "%s: failed to insert webagent dns data to outrq [%hu]", __FUNCTION__, input_data_p->thread_id);
 		ulog_error_no_conn(AMP_ULOG_WEBAGENT, "%s: failed to insert webagent dns data to outrq [%hu]", __FUNCTION__, input_data_p->thread_id);
 		WEBAGENT_DNS_FREE(dns_data_p);
 	}
-	
 	return;
 }
 
@@ -441,7 +568,7 @@
 {
 	if(user_ticks_init() != 0){
         printf("Could not access system ticks.. exiting\n");
-		fastlog_syslog(LOG_ERR, "Could not access system ticks.. exiting\n");
+        fastlog_syslog(LOG_ERR, "Could not access system ticks.. exiting\n");
         return -1;
     }
 
@@ -483,21 +610,33 @@
 			last_ticks = click_softticks100;
 		}
 
-		if (atcp_event_inrq_empty(ATCP_DNS_RQ)) {
-            usleep(DNS_AGENT_SLEEP_TIME);
-            continue;
-        }
+		if (atcp_event_inrq_empty(ATCP_DNS_RQ) && outstanding_dns_req_cnt == 0) {
+			/* nothing incoming or outstanding */
+			usleep(DNS_AGENT_SLEEP_TIME);
+			continue;
+		}
+
+		if (outstanding_dns_req_cnt) {
+			if (domain_resolve_poll() == 0) {
+				/* nothing freed up from the poll */
+				usleep(DNS_AGENT_SLEEP_TIME);
+			}	
+		}
 
 		while (!atcp_event_inrq_empty(ATCP_DNS_RQ)) {
-			data_p = atcp_event_inrq_dequeue(ATCP_DNS_RQ);
-			if (data_p == NULL) {
+			if(outstanding_dns_req_cnt < DNS_REQ_LIST_LEN) {
+				/* only read if we have room in the dns req list */
+				data_p = atcp_event_inrq_dequeue(ATCP_DNS_RQ);
+				if (data_p == NULL) {
+					break;
+				}
+				dns_process_data_cb(data_p);
+				WEBAGENT_DNS_FREE(data_p);
+			} else {
+				/* poll is full cannot send right now */
 				break;
 			}
-
-			dns_process_data_cb(data_p);
-			WEBAGENT_DNS_FREE(data_p);
 		}
-
 	}
 }
 
Index: /branches/rel_apv_10_7/usr/click/lib/libhttp_proxy/http_log.h
===================================================================
--- /branches/rel_apv_10_7/usr/click/lib/libhttp_proxy/http_log.h	(revision 37931)
+++ /branches/rel_apv_10_7/usr/click/lib/libhttp_proxy/http_log.h	(working copy)
@@ -19,6 +19,7 @@
  */
 
 #define HTTP_LOG_GET_METHOD_STR        "GET"
+#define HTTP_LOG_PATCH_METHOD_STR      "PATCH"
 #define HTTP_LOG_POST_METHOD_STR       "POST"
 #define HTTP_LOG_PUT_METHOD_STR        "PUT"
 #define HTTP_LOG_DELETE_METHOD_STR     "DELETE"
Index: /branches/rel_apv_10_7/usr/click/lib/libhttp_proxy/http_log.c
===================================================================
--- /branches/rel_apv_10_7/usr/click/lib/libhttp_proxy/http_log.c	(revision 37931)
+++ /branches/rel_apv_10_7/usr/click/lib/libhttp_proxy/http_log.c	(working copy)
@@ -190,6 +190,8 @@
 	switch (request_type) {
 	case HTTP_METHOD_GET:
 		return (HTTP_LOG_GET_METHOD_STR);
+	case HTTP_METHOD_PATCH:
+		return (HTTP_LOG_PATCH_METHOD_STR);
 	case HTTP_METHOD_POST:
 		return (HTTP_LOG_POST_METHOD_STR);
 	case HTTP_METHOD_PUT:
Index: /branches/rel_apv_10_7/usr/click/lib/libhttp_proxy/parser.h
===================================================================
--- /branches/rel_apv_10_7/usr/click/lib/libhttp_proxy/parser.h	(revision 37931)
+++ /branches/rel_apv_10_7/usr/click/lib/libhttp_proxy/parser.h	(working copy)
@@ -62,6 +62,9 @@
 #define HTTP_PERMIT_METHOD_OPTIONS		0x00000040
 #define HTTP_PERMIT_METHOD_HEAD			0x00000080
 #define HTTP_PERMIT_METHOD_UNSUPPORTED		0x00000100
+#define HTTP_PERMIT_METHOD_PATCH                0x00000200
+
+/* extended methods */
 #define HTTP_PERMIT_METHOD_PROPFIND		0x00001000
 #define HTTP_PERMIT_METHOD_PROPPATCH		0x00002000
 #define HTTP_PERMIT_METHOD_MKCOL		0x00004000
Index: /branches/rel_apv_10_7/usr/click/lib/libhttp_proxy/parser.c
===================================================================
--- /branches/rel_apv_10_7/usr/click/lib/libhttp_proxy/parser.c	(revision 37931)
+++ /branches/rel_apv_10_7/usr/click/lib/libhttp_proxy/parser.c	(working copy)
@@ -1399,6 +1399,17 @@
 		}
 		proxy_p->request_type = req_method;
 		break;
+	case HTTP_METHOD_PATCH:
+		SET_HTTP_HDR_BITMAP(http_ulog.hdr_bitmap, LOG_HTTP_REQ_PATCH);
+		if (FALSE == permit_http_method(HTTP_PERMIT_METHOD_PATCH, lip)) {
+			PRX_ERROR_TAG_SET(ERR_METHOD_DENIED);
+			PRX_ERROR_STR_SET(*headers_len);
+			read_write_info_dtor(&read_write);
+                        ulog_error_no_conn(AMP_ULOG_HTTP_PROXY,"tanya: pathch denied");
+			return (HTTP_METHOD_DENIED);
+		}
+		proxy_p->request_type = req_method;
+		break;
 	case HTTP_METHOD_POST:
 		SET_HTTP_HDR_BITMAP(http_ulog.hdr_bitmap, LOG_HTTP_REQ_POST);
 		if (FALSE == permit_http_method(HTTP_PERMIT_METHOD_POST, lip)) {
Index: /branches/rel_apv_10_7/usr/click/lib/libhttp_proxy/parser_utils.c
===================================================================
--- /branches/rel_apv_10_7/usr/click/lib/libhttp_proxy/parser_utils.c	(revision 37931)
+++ /branches/rel_apv_10_7/usr/click/lib/libhttp_proxy/parser_utils.c	(working copy)
@@ -4653,6 +4653,9 @@
 		case HTTP_METHOD_OPTIONS:
 			hp_parser_debug("OPTIONS"); 
 			return token;
+		case HTTP_METHOD_PATCH:
+			hp_parser_debug("PATCH"); 
+			return token;
 		case HTTP_METHOD_POST:
 			hp_parser_debug("POST"); 
 			return token;
Index: /branches/rel_apv_10_7/usr/click/lib/libnatd_cli/natd_cli.c
===================================================================
--- /branches/rel_apv_10_7/usr/click/lib/libnatd_cli/natd_cli.c	(revision 37931)
+++ /branches/rel_apv_10_7/usr/click/lib/libnatd_cli/natd_cli.c	(working copy)
@@ -381,7 +381,7 @@
 nat_static(char *vip, char *inside_ip, uint32_t timeout, char *gw, char* description) 
 {
 #ifdef VIP_MANAGEMENT_NAT
-	int newvip = 0;
+	int ret;
 #endif
 	struct in_addr vip4;
 	struct in_addr inside_ip4;
@@ -431,11 +431,9 @@
 		return -1;
 	}
 #ifdef VIP_MANAGEMENT_NAT
-	if (get_vip_exist(isipv6, thevip, MVIP_FWD) == 0) {
-		newvip = 1;
-	}
+	ret = find_managed_vip(NULL, MVIP_FWD, (void*)&vip4.s_addr, (void*)&vip6, isipv6);
 	/* bug 13980, tangmeng, 20060911 */
-	if (newvip) {                 /*bug38294,20120827*/
+	if (ret == 0) {                 /*bug38294,20120827*/
 		if (create_managed_vip(NULL, MVIP_FWD, thevip, isipv6) < 0 ) {
 			printf("failed to assign IP to interface\n");
 			return -1;
@@ -445,7 +443,7 @@
 #endif
 	if (nat_static_kern(vip, inside_ip, timeout, gw, description) != 0) {
 #ifdef VIP_MANAGEMENT_NAT
-		if (newvip) {             /*bug38294 ,20120827*/
+		if (ret == 0) {             /*bug38294 ,20120827*/
 			/* bug 13980, tangmeng, 20060911 */
 			delete_managed_vip(NULL, MVIP_FWD, thevip, isipv6);
 			/* bug 13980, end */
@@ -754,6 +752,7 @@
 	{
 #ifdef VIP_MANAGEMENT_NAT
 		void *vip;
+		int ret;
 		struct in_addr vip4;
 		struct in6_addr vip6;
 
@@ -765,10 +764,13 @@
 			vip = &vip4;
 		}
 
-		if (create_managed_vip(NULL, MVIP_FWD, vip, isipv6) < 0 ) 
-		{
-			printf("failed to assign IP to interface\n");
-			return -1;
+		ret = find_managed_vip(NULL, MVIP_FWD, (void*)&vip4.s_addr, (void*)&vip6, isipv6);
+		if (ret == 0) {
+			if (create_managed_vip(NULL, MVIP_FWD, vip, isipv6) < 0 ) 
+			{
+				printf("failed to assign IP to interface\n");
+				return -1;
+			}
 		}
 #endif	
 		return 0;
Index: /branches/rel_apv_10_7/usr/click/lib/libparser/commands.pm
===================================================================
--- /branches/rel_apv_10_7/usr/click/lib/libparser/commands.pm	(revision 37931)
+++ /branches/rel_apv_10_7/usr/click/lib/libparser/commands.pm	(working copy)
@@ -34188,7 +34188,7 @@
 		function_name => "http_permit_method",
 		function_args => [ {
 					type => "STRING",
-					help_string => "http method name (get, post, put, delete, trace, connect, options, head, propfind, proppatch, mkcol, copy, move, lock, unlock, purge, rpc_in_data, rpc_out_data, rdg_in_data, rdg_out_data)",
+					help_string => "http method name (get, post, put, delete, trace, connect, patch, options, head, propfind, proppatch, mkcol, copy, move, lock, unlock, purge, rpc_in_data, rpc_out_data, rdg_in_data, rdg_out_data)",
 					optional => "NO",
 				},
 				{
Index: /branches/rel_apv_10_7/usr/click/lib/libuinet-atcp/bin/atcp/Makefile
===================================================================
--- /branches/rel_apv_10_7/usr/click/lib/libuinet-atcp/bin/atcp/Makefile	(revision 37934)
+++ /branches/rel_apv_10_7/usr/click/lib/libuinet-atcp/bin/atcp/Makefile	(working copy)
@@ -11,7 +11,7 @@
 CXXFLAGS= -std=c++11 -I${TOPDIR}/../libbreakpad/build/src
 LIBBREAKPAD_CLIENT=${TOPDIR}/../libbreakpad/build/src/client/linux/libbreakpad_client.a
 ifneq ($(ARM64), yes)
-LDADD= -L${UINET_DESTDIR}/lib/ -lm -lpcap \
+LDADD= -L${UINET_DESTDIR}/lib/ -lanl -lm -lpcap \
 	-L${RTE_SDK}/${RTE_TARGET}/lib -ldpdk \
 	-Wl,--start-group \
 	-L${TOPDIR}/../libenv -lenv \
@@ -79,7 +79,7 @@
 	-ludev \
 	-lpciaccess ${TOPDIR}/lib/libev/.libs/libev.a
 else
-LDADD= -L${UINET_DESTDIR}/lib/ -lm -lpcap \
+LDADD= -L${UINET_DESTDIR}/lib/ -lanl -lm -lpcap \
 	-L${RTE_SDK}/${RTE_TARGET}/lib -ldpdk \
 	-Wl,--start-group \
 	-L${TOPDIR}/../libenv -lenv \
Index: /branches/rel_apv_10_7/usr/click/lib/libwebagent/webagent_log.c
===================================================================
--- /branches/rel_apv_10_7/usr/click/lib/libwebagent/webagent_log.c	(revision 37931)
+++ /branches/rel_apv_10_7/usr/click/lib/libwebagent/webagent_log.c	(working copy)
@@ -47,6 +47,8 @@
 	switch (request_type) {
 	case HTTP_METHOD_GET:
 		return (HTTP_LOG_GET_METHOD_STR);
+        case HTTP_METHOD_PATCH:
+                return (HTTP_LOG_PATCH_METHOD_STR);
 	case HTTP_METHOD_POST:
 		return (HTTP_LOG_POST_METHOD_STR);
 	case HTTP_METHOD_PUT:
Index: /branches/rel_apv_10_7/usr/src/sys/click/app/proxy/proxy_cli.c
===================================================================
--- /branches/rel_apv_10_7/usr/src/sys/click/app/proxy/proxy_cli.c	(revision 37931)
+++ /branches/rel_apv_10_7/usr/src/sys/click/app/proxy/proxy_cli.c	(working copy)
@@ -9619,7 +9619,7 @@
 	* for WebDAV
 	*/
 	app_printf(pcb, "[0.0.0.0] %s "
-		   "get post put delete trace connect "
+		   "get patch post put delete trace connect "
 		   "options head propfind proppatch mkcol copy " 
 		   "move lock unlock purge rpc_in_data "
 		   "rpc_out_data rdg_in_data rdg_out_data\n", PERMITTED_METHODS_STR);
@@ -9643,6 +9643,11 @@
 		app_printf(pcb, "get "); 
 	}
 
+        if (FLAG_ISSET(vip_p->method_permit_flags,
+                       HTTP_PERMIT_METHOD_PATCH)) {
+                app_printf(pcb, "patch ");
+        }
+
 	if (FLAG_ISSET(vip_p->method_permit_flags, 
 		       HTTP_PERMIT_METHOD_POST)) {
 		app_printf(pcb, "post ");
@@ -9761,6 +9766,11 @@
 		app_printf(pcb, "get "); 
 	}
 
+        if (!FLAG_ISSET(vip_p->method_permit_flags,
+                        HTTP_PERMIT_METHOD_PATCH)) {
+                app_printf(pcb, "patch ");
+        }
+
 	if (!FLAG_ISSET(vip_p->method_permit_flags, 
 			HTTP_PERMIT_METHOD_POST)) {
 		app_printf(pcb, "post ");
@@ -9882,6 +9892,14 @@
 					*(ptr), *(ptr+1), *(ptr+2), *(ptr+3)); 
 			}
 
+                        if (FLAG_ISSET(http_vip_list[i].method_permit_flags,
+                                        HTTP_PERMIT_METHOD_PATCH)) {
+                                n += sprintf((buff+n),
+                                        "http permit method patch "
+                                        "%u.%u.%u.%u\n",
+                                        *(ptr), *(ptr+1), *(ptr+2), *(ptr+3));
+                        }
+
 			if (FLAG_ISSET(http_vip_list[i].method_permit_flags, 
 					HTTP_PERMIT_METHOD_POST)) {
 				n += sprintf((buff+n), 
@@ -10054,6 +10072,10 @@
 		return HTTP_PERMIT_METHOD_GET;
 	}
 
+        if (0 == strcmp(method, "patch")) {
+                return HTTP_PERMIT_METHOD_PATCH;
+        }
+
 	if (0 == strcmp(method, "post")) {
 		return HTTP_PERMIT_METHOD_POST;
 	}
Index: /branches/rel_apv_10_7/usr/src/sys/click/app/proxy/proxy_flags.h
===================================================================
--- /branches/rel_apv_10_7/usr/src/sys/click/app/proxy/proxy_flags.h	(revision 37931)
+++ /branches/rel_apv_10_7/usr/src/sys/click/app/proxy/proxy_flags.h	(working copy)
@@ -159,6 +159,7 @@
 #define HTTP_PERMIT_METHOD_OPTIONS		0x040
 #define HTTP_PERMIT_METHOD_HEAD			0x080
 #define HTTP_PERMIT_METHOD_UNSUPPORTED		0x100
+#define HTTP_PERMIT_METHOD_PATCH                0x200
 
 /* Bug 10325,10323, panzj, 2005-05-12
  * add new permit method flags for extension-method
