From jonas.gorski@gmail.com Mon Nov  5 19:11:19 2012
Received: with ECARTIS (v1.0.0; list freecwmp); Mon, 05 Nov 2012 19:11:20 +0100 (CET)
Received: from mail-bk0-f49.google.com ([209.85.214.49]:39701 "EHLO
        mail-bk0-f49.google.com" rhost-flags-OK-OK-OK-OK)
        by eddie.linux-mips.org with ESMTP id S6825959Ab2KESLTQV7Jg (ORCPT
        <rfc822;freecwmp@linux-mips.org>); Mon, 5 Nov 2012 19:11:19 +0100
Received: by mail-bk0-f49.google.com with SMTP id j4so2083382bkw.36
        for <freecwmp@linux-mips.org>; Mon, 05 Nov 2012 10:11:13 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=gmail.com; s=20120113;
        h=from:to:subject:date:message-id:x-mailer;
        bh=sf5KnvMmG1w+RQWh1LprtICEuzRF1k+3AKAKkUvCJx4=;
        b=iRyTQl29ZNlWeClCyjHsHXO6Sw4mnlGXn7o0ArgAkkSOlwWlAwXRSXWDUP70TTrTKC
         2Ogfqd3qy05jIbcK4sXZgU1GoytWPN7KW0br4q62vksTW85cmpMiI/GAsLPFIY7PoSqf
         x9dyBCvfU9egFY2IIx0fIT1V6c4YVVvL/qSTeRwH/nUoZQbQQK9wYjF7RrsqM3683M9A
         xKYQsmv4PEiQJ/Y9RtOFPGk/oi9JQq07RT9MIIMPbZ8hpBPHcJ6x7hasDg5F61t0SBvd
         zDpMpGD+53h4+EobeVOPK33WZRY0eIsYdZkge5AsjblJ2di63Tqt0S3RhSZrZomIUBRD
         WMBQ==
Received: by 10.204.12.215 with SMTP id y23mr2476013bky.13.1352139073734;
        Mon, 05 Nov 2012 10:11:13 -0800 (PST)
Received: from ixxyvirt.lan (p50811630.dip.t-dialin.net. [80.129.22.48])
        by mx.google.com with ESMTPS id e13sm10550092bkw.12.2012.11.05.10.11.12
        (version=SSLv3 cipher=OTHER);
        Mon, 05 Nov 2012 10:11:12 -0800 (PST)
From:   Jonas Gorski <jonas.gorski@gmail.com>
To:     freecwmp@linux-mips.org
Subject: [PATCH] fix "method not implemented" error generation
Date:   Mon,  5 Nov 2012 19:11:06 +0100
Message-Id: <1352139066-26827-1-git-send-email-jonas.gorski@gmail.com>
X-Mailer: git-send-email 1.7.10.4
Return-Path: <jonas.gorski@gmail.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s freecwmp"> (uid 0)
X-Orcpt: rfc822;freecwmp@linux-mips.org
Original-Recipient: rfc822;freecwmp@linux-mips.org
X-archive-position: 66
X-ecartis-version: Ecartis v1.0.0
Sender: freecwmp-bounce@linux-mips.org
Errors-to: freecwmp-bounce@linux-mips.org
X-original-sender: jonas.gorski@gmail.com
Precedence: bulk
X-list: freecwmp

The check for error message generation success was inverted, causing
the "method not implemented" errors not being sent and freecwmp thought
parsing failed.

Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>
---
 src/xml.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/xml.c b/src/xml.c
index 22cfbcd..9fa036b 100644
--- a/src/xml.c
+++ b/src/xml.c
@@ -509,7 +509,7 @@ find_method:
 		if (asprintf(&fault_message, "%s not supported", c) == -1)
 			goto error;
 
-		if (!xml_create_generic_fault_message(b, true, "9000", fault_message)) {
+		if (xml_create_generic_fault_message(b, true, "9000", fault_message)) {
 			FREE(fault_message);
 			goto error;
 		}
-- 
1.7.10.4


From miroslav.rajsek@innbox.net Fri Nov 16 13:56:16 2012
Received: with ECARTIS (v1.0.0; list freecwmp); Fri, 16 Nov 2012 13:56:18 +0100 (CET)
Received: from ittec.iskratel.si ([193.77.24.3]:62261 "EHLO ittec.iskratel.si"
        rhost-flags-OK-OK-OK-OK) by eddie.linux-mips.org with ESMTP
        id S6825951Ab2KPM4QMgZWv convert rfc822-to-8bit (ORCPT
        <rfc822;freecwmp@linux-mips.org>); Fri, 16 Nov 2012 13:56:16 +0100
Received: from ntmailhub.iskratel.si (ntmailhub.iskratel.si [10.2.2.103])
        by ittec.iskratel.si (8.13.6/8.13.6) with ESMTP id qAGCuBxU012496
        for <freecwmp@linux-mips.org>; Fri, 16 Nov 2012 13:56:11 +0100 (MET)
Received: from NTMAILKR.iskratel.si ([10.2.2.101]) by ntmailhub.iskratel.si
 ([::1]) with mapi; Fri, 16 Nov 2012 13:56:10 +0100
From:   Rajsek Miroslav <miroslav.rajsek@innbox.net>
To:     "freecwmp@linux-mips.org" <freecwmp@linux-mips.org>
Date:   Fri, 16 Nov 2012 13:56:10 +0100
Subject: Patch for two memleaks in connection request scenario 
Thread-Topic: Patch for two memleaks in connection request scenario 
Thread-Index: AQHNw/i5QCts22xAjEK7GiCjXuYXIw==
Message-ID: <96728A6499D0F74397BCA42A8B9F7215373E11414A@NTMAILKR.iskratel.si>
Accept-Language: sl-SI
Content-Language: sl-SI
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
acceptlanguage: sl-SI
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 8BIT
MIME-Version: 1.0
Return-Path: <miroslav.rajsek@innbox.net>
X-Envelope-To: <"|/home/ecartis/ecartis -s freecwmp"> (uid 0)
X-Orcpt: rfc822;freecwmp@linux-mips.org
Original-Recipient: rfc822;freecwmp@linux-mips.org
X-archive-position: 67
X-ecartis-version: Ecartis v1.0.0
Sender: freecwmp-bounce@linux-mips.org
Errors-to: freecwmp-bounce@linux-mips.org
X-original-sender: miroslav.rajsek@innbox.net
Precedence: bulk
X-list: freecwmp

Hi  Luka, hi everybody

My name is Miroslav Rajsek, I am from Slovenia, working for a CPE manufacturer.
I am responsible for TR-069, so I am following freecwmp project more or less intensively for about two or three months. I am subscribed at #freecwmp IRC, my nickname is rajsek.
I am using Motive HDM and NetMania AcsLite TR-069 ACSs in my test environment, OpenACS from time to time. 

I am testing freecwmp-curl in development environment on my ubuntu desktop. I have also ported freecwmp-curl to one of our CPE under development, based on PowerPC and using openwrt. 
Today I was running freecwmp with valgrind on my ubuntu and noticed two small memory leaks in scenario when connection request was sent from ACS.  As far as fetching latest commits it seems to me a fix has not been provided yet. However it could be the thing is already known to you.

So I have a patch proposal below. Note that this is my very first patch. Please can you check it, I am glad if you find it useful. 

Regards,

Miroslav


---
 src/http.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/src/http.c b/src/http.c
index 8663598..6540eb4 100644
--- a/src/http.c
+++ b/src/http.c
@@ -107,7 +107,7 @@ http_client_exit(void)
 	FREE(http_c.url);
 
 #ifdef HTTP_CURL
-	if (!http_c.header_list)
+	if (http_c.header_list)
 		curl_slist_free_all(http_c.header_list);
 	if (access(fc_cookies, W_OK) == 0)
 		remove(fc_cookies);
@@ -401,6 +401,7 @@ http_end_child:
 
 done_child:
 			fclose(fp);
+			free(uproc);
 			DDF("--- RECEIVED HTTP REQUEST ---\n");
 			exit(status);
 		}
-- 
1.7.0.4




 

From mohamed.kallel@pivasoftware.com Fri Nov 16 18:25:24 2012
Received: with ECARTIS (v1.0.0; list freecwmp); Fri, 16 Nov 2012 18:25:30 +0100 (CET)
Received: from moutng.kundenserver.de ([212.227.126.187]:59606 "EHLO
        moutng.kundenserver.de" rhost-flags-OK-OK-OK-OK)
        by eddie.linux-mips.org with ESMTP id S6823042Ab2KPRZYOjam- (ORCPT
        <rfc822;freecwmp@linux-mips.org>); Fri, 16 Nov 2012 18:25:24 +0100
Received: from [127.0.0.1] ([41.230.22.138])
        by mrelayeu.kundenserver.de (node=mreu3) with ESMTP (Nemesis)
        id 0MDaAr-1TWLFW3ycn-00GmzU; Fri, 16 Nov 2012 18:25:18 +0100
Message-ID: <50A676F4.8080708@pivasoftware.com>
Date:   Fri, 16 Nov 2012 18:25:08 +0100
From:   KALLEL Mohamed <mohamed.kallel@pivasoftware.com>
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:16.0) Gecko/20121026 Thunderbird/16.0.2
MIME-Version: 1.0
To:     freecwmp@linux-mips.org
Subject: NEW PATCH for data model
References: <508E5D2B.6050508@pivasoftware.com>
In-Reply-To: <508E5D2B.6050508@pivasoftware.com>
Content-Type: multipart/mixed;
 boundary="------------000002090002030008060608"
X-Provags-ID: V02:K0:xYm1E0nCMUSpDif7/Z0uswf29khDlSDejD6qa8BFm+G
 LTlXxn2CQ+FwTfGJu70qehzcnl7UOYJ1/dzcJO8eUP9rxWodeb
 Fagw9bGYCRGatUN/fsAzhupvVRdvALGhCm2uNRjPU49mqcQURP
 T3Y7OEwtFgOd75QUwWZHsGJwbiv7aI+L1gWdsiVn0gzamnjZ7E
 AJF0BWAYOTYXflAzVGISfdUYwHMIDx+YsK8DGUBJG2B4Mwt6Du
 0nNqLKNC9St0pmyTqgm/iQqHpFDGaaDkT7eAWt1t72mUnd6ZKC
 xgUsJujOGmwKt0PFN0JlqlW3j5UwG2+CL4j4dLxDzCUc518mHV
 FDGZ8GJ0xHkmw87NxFFCYWh9gJhPDqYqETH1+rGJp
Return-Path: <mohamed.kallel@pivasoftware.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s freecwmp"> (uid 0)
X-Orcpt: rfc822;freecwmp@linux-mips.org
Original-Recipient: rfc822;freecwmp@linux-mips.org
X-archive-position: 68
X-ecartis-version: Ecartis v1.0.0
Sender: freecwmp-bounce@linux-mips.org
Errors-to: freecwmp-bounce@linux-mips.org
X-original-sender: mohamed.kallel@pivasoftware.com
Precedence: bulk
X-list: freecwmp

This is a multi-part message in MIME format.
--------------000002090002030008060608
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Hi Luka
please find attached a new patch.
  This patch contains:
- Support for GetParameterName method.
- The communication from external script to core is replaced by ubus.
- Update GetParameterValue method in order to support many parameter 
names and in order to support parameter type.
- Update GetParameterNames related scripts

Note:  For The communication from external script to core is replaced by 
ubus,  We have added a thread in order to be able to listening to ubus 
sockets from script because the libubox does not support multithread. we 
can avoid the use of multithread but in this case we have to made major 
modification in the core. I suggest to do this in the future in another 
patch

Regards

--------------000002090002030008060608
Content-Type: text/plain; charset=windows-1256;
 name="0001-Add-GetParameterName-feature.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="0001-Add-GetParameterName-feature.patch"

From c851a853c131130563244fcdf3e38ff04adb5790 Mon Sep 17 00:00:00 2001
From: Mohamed <mohamed.kallel@pivasoftware.com>
Date: Fri, 16 Nov 2012 18:08:02 +0100
Subject: [PATCH] Add GetParameterName feature.
 communication from external script to core via ubus.
 Update GetParameterValue in order to support many parameter names and in order to support parameter type. and modify GetParameterNames related scripts
 Contributed by Inteno Broadband Technology AB

---
 bin/Makefile.am                                 |    3 +-
 configure.ac                                    |    3 +
 ext/openwrt/config/freecwmp                     |    6 +
 ext/openwrt/scripts/freecwmp.sh                 |   98 +++++++-
 ext/openwrt/scripts/functions/common            |   27 ++
 ext/openwrt/scripts/functions/device_hosts      |   23 +-
 ext/openwrt/scripts/functions/device_info       |  216 ++++++++++++++-
 ext/openwrt/scripts/functions/device_routing    |   33 ++--
 ext/openwrt/scripts/functions/device_users      |   13 +-
 ext/openwrt/scripts/functions/lan_device        |  108 ++++++++-
 ext/openwrt/scripts/functions/management_server |  318 +++++++++++++++++++++--
 ext/openwrt/scripts/functions/misc              |    8 +-
 ext/openwrt/scripts/functions/wan_device        |  217 +++++++++++++++-
 src/external.c                                  |  173 ++++++++++--
 src/external.h                                  |   16 ++
 src/freecwmp.c                                  |   19 ++
 src/freecwmp.h                                  |    1 +
 src/ubus.c                                      |  127 +++++++++
 src/xml.c                                       |  211 ++++++++++++----
 src/xml.h                                       |    4 +
 20 files changed, 1457 insertions(+), 167 deletions(-)

diff --git a/bin/Makefile.am b/bin/Makefile.am
index 78cb111..ac96905 100644
--- a/bin/Makefile.am
+++ b/bin/Makefile.am
@@ -48,5 +48,6 @@ freecwmpd_LDADD =		\
 	$(LIBUBUS_LIBS)		\
 	$(MICROXML_LIBS)	\
 	$(LIBCURL_LIBS)		\
-	$(LIBZSTREAM_LIBS)
+	$(LIBZSTREAM_LIBS)	\
+	$(LIBPTHREAD_LIBS)
 
diff --git a/configure.ac b/configure.ac
index c646c3a..38d3df4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -80,6 +80,9 @@ AC_SUBST([LIBUBUS_LDFLAGS])
 LIBUBUS_LIBS='-lubus'
 AC_SUBST([LIBUBUS_LIBS])
 
+LIBPTHREAD_LIBS='-lpthread'
+AC_SUBST([LIBPTHREAD_LIBS])
+
 AM_COND_IF([HTTP_CURL], [
  AC_DEFINE(HTTP_CURL)
  PKG_CHECK_MODULES(LIBCURL, [libcurl])
diff --git a/ext/openwrt/config/freecwmp b/ext/openwrt/config/freecwmp
index c5b4ed4..88dca66 100644
--- a/ext/openwrt/config/freecwmp
+++ b/ext/openwrt/config/freecwmp
@@ -29,19 +29,25 @@ config scripts
 	# freecwmp specific functions
 	list location /usr/share/freecwmp/functions/device_info
 	list get_value_function get_device_info
+	list get_name_function get_device_info_name
 	list set_value_function set_device_info
 	list get_value_function get_device_info_generic
+	list get_name_function get_device_info_generic_name
 	list set_value_function set_device_info_generic
 	list location /usr/share/freecwmp/functions/lan_device
 	list get_value_function get_lan_device
+	list get_name_function get_lan_device_name
 	list set_value_function set_lan_device
 	list location /usr/share/freecwmp/functions/management_server
 	list get_value_function get_management_server
+	list get_name_function get_management_server_name
 	list set_value_function set_management_server
 	list get_value_function get_management_server_generic
+	list get_name_function get_management_server_generic_name
 	list set_value_function set_management_server_generic
 	list location /usr/share/freecwmp/functions/wan_device
 	list get_value_function get_wan_device
+	list get_name_function get_wan_device_name
 	list set_value_function set_wan_device
 	list location /usr/share/freecwmp/functions/misc
 	list get_value_function get_misc
diff --git a/ext/openwrt/scripts/freecwmp.sh b/ext/openwrt/scripts/freecwmp.sh
index 3fbee27..60c29b0 100644
--- a/ext/openwrt/scripts/freecwmp.sh
+++ b/ext/openwrt/scripts/freecwmp.sh
@@ -67,6 +67,10 @@ case "$1" in
 		elif [ "$2" = "value" ]; then
 			__arg1="$3"
 			action="get_value"
+		elif [ "$2" = "name" ]; then
+			__arg1="$3"
+			__arg2=`echo $4| tr '[A-Z]' '[a-z]'`
+			action="get_name"
 		elif [ "$2" = "all" ]; then
 			__arg1="$3"
 			action="get_all"
@@ -106,27 +110,103 @@ handle_scripts() {
 	config_get prefix "$section" "prefix"
 	config_list_foreach "$section" 'location' load_script
 	config_get get_value_functions "$section" "get_value_function"
+	config_get get_name_functions "$section" "get_name_function"
 	config_get set_value_functions "$section" "set_value_function"
 }
 
 config_load freecwmp
 config_foreach handle_scripts "scripts"
 
+# Fault code
+
+FAULT_CPE_NO_FAULT="0"
+FAULT_CPE_REQUEST_DENIED="1"
+FAULT_CPE_INTERNAL_ERROR="2"
+FAULT_CPE_INVALID_ARGUMENTS="3"
+FAULT_CPE_RESOURCES_EXCEEDED="4"
+FAULT_CPE_INVALID_PARAMETER_NAME="5"
+FAULT_CPE_INVALID_PARAMETER_TYPE="6"
+FAULT_CPE_INVALID_PARAMETER_VALUE="7"
+FAULT_CPE_NON_WRITABLE_PARAMETER="8"
+FAULT_CPE_NOTIFICATION_REJECTED="9"
+FAULT_CPE_DOWNLOAD_FAILURE="10"
+FAULT_CPE_UPLOAD_FAILURE="11"
+FAULT_CPE_FILE_TRANSFER_AUTHENTICATION_FAILURE="12"
+FAULT_CPE_FILE_TRANSFER_UNSUPPORTED_PROTOCOL="13"
+FAULT_CPE_DOWNLOAD_FAIL_MULTICAST_GROUP="14"
+FAULT_CPE_DOWNLOAD_FAIL_CONTACT_SERVER="15"
+FAULT_CPE_DOWNLOAD_FAIL_ACCESS_FILE="16"
+FAULT_CPE_DOWNLOAD_FAIL_COMPLETE_DOWNLOAD="17"
+FAULT_CPE_DOWNLOAD_FAIL_FILE_CORRUPTED="18"
+FAULT_CPE_DOWNLOAD_FAIL_FILE_AUTHENTICATION="19"
+
 if [ "$action" = "get_value" -o "$action" = "get_all" ]; then
-	if [ ${FLAGS_force} -eq ${FLAGS_FALSE} ]; then
-		__tmp_arg="Device."
-		# TODO: don't check only string length ; but this is only used
-		#       for getting correct prefix of CWMP parameter anyway
-		if [  ${#__arg1} -lt ${#__tmp_arg} ]; then
-			echo "CWMP parameters usualy begin with 'InternetGatewayDevice.' or 'Device.'     "
-			echo "if you want to force script execution with provided parameter use '-f' flag."
-			exit -1
-		fi
+	no_fault="0"
+	freecwmp_check_fault "$__arg1"
+	fault_code="$?"
+	if [ "$fault_code" = "0" ]; then
+		if [ \( "$__arg1" = "InternetGatewayDevice." \) -o \( "$__arg1" = "" \) ]; then
+			__arg1="InternetGatewayDevice."
 	fi
 	for function_name in $get_value_functions
 	do
 		$function_name "$__arg1"
+			fault_code="$?"
+			if [ "$fault_code" = "0" ]; then
+				no_fault="1"
+			fi
+			if [ "$fault_code" = "$FAULT_CPE_INVALID_ARGUMENTS" ]; then
+				break
+			fi
+		done
+		if [ "$no_fault" = "1" ]; then fault_code="0"; fi
+	fi
+	if [ "$fault_code" != "0" ]; then
+		let fault_code=$fault_code+9000
+		ubus_freecwmp_output "$__arg1" "" "" "$fault_code"
+	fi
+fi
+
+if [ "$action" = "get_name" -o "$action" = "get_all" ]; then
+	no_fault="0"
+	freecwmp_check_fault "$__arg1"
+	fault_code="$?"
+	if [ "$fault_code" = "0" ]; then
+		if [ \( "$__arg2" != "0" \) -a \( "$__arg2" != "1" \) -a \( "$__arg2" != "true" \) -a \( "$__arg2" != "false" \) ]; then
+			fault_code="$FAULT_CPE_INVALID_ARGUMENTS"
+		else
+			if [ "$__arg2" = "true" ]; then
+				__arg2="1"
+			elif [ "$__arg2" = "false" ]; then
+				__arg2="0"
+			fi
+		fi
+		if [ "$fault_code" = "0" ]; then
+			if [ \( "$__arg1" = "InternetGatewayDevice." \) -o \( "$__arg1" = "" \) ]; then
+				ubus_freecwmp_output "InternetGatewayDevice." "0"
+				if [ \( "$__arg1" = "" \) -a \( "$__arg2" = "1" \) ]; then
+					exit 0
+				fi
+				__arg1="InternetGatewayDevice."
+			fi
+			for function_name in $get_name_functions
+			do
+				$function_name "$__arg1" "$__arg2"
+				fault_code="$?"
+				if [ "$fault_code" = "0" ]; then
+					no_fault="1"
+				fi
+				if [ "$fault_code" = "$FAULT_CPE_INVALID_ARGUMENTS" ]; then
+					break
+				fi
 	done
+			if [ "$no_fault" = "1" ]; then fault_code="0"; fi
+		fi
+	fi
+	if [ "$fault_code" != "0" ]; then
+		let fault_code=$fault_code+9000
+		ubus_freecwmp_output "$__arg1" "" "" "$fault_code"
+	fi
 fi
 
 if [ "$action" = "set_value" ]; then
diff --git a/ext/openwrt/scripts/functions/common b/ext/openwrt/scripts/functions/common
index 7e3000a..7e26acf 100644
--- a/ext/openwrt/scripts/functions/common
+++ b/ext/openwrt/scripts/functions/common
@@ -34,6 +34,26 @@ if [ -n "$value" -o ${FLAGS_empty} -eq ${FLAGS_TRUE} ]; then
 fi
 }
 
+ubus_freecwmp_output() {
+local parameter="$1"
+local value="$2"
+local type="$3"
+local fault_code="$4"
+
+if [ "$type" = "" ]; then
+	type="xsd:string"
+fi
+
+case "$action" in
+	get_value)
+	ubus call tr069 GetParameterValues '{"parameter": "'$parameter'", "value": "'$value'", "type": "'$type'", "fault_code":"'$fault_code'"}'
+	;;
+	get_name)
+	ubus call tr069 GetParameterNames '{"parameter": "'$parameter'", "writable": "'$value'", "fault_code":"'$fault_code'"}'
+	;;
+esac
+}
+
 freecwmp_value_output() {
 	freecwmp_output "$1" "$2" "V"
 }
@@ -249,3 +269,10 @@ EOF
 	sh "$lock" &
 fi
 }
+
+freecwmp_check_fault() {
+if [ "$1" = "." ]; then
+	return $FAULT_CPE_INVALID_PARAMETER_NAME
+fi
+return $FAULT_CPE_NO_FAULT
+}
diff --git a/ext/openwrt/scripts/functions/device_hosts b/ext/openwrt/scripts/functions/device_hosts
index 4c3fcd4..1e80f32 100644
--- a/ext/openwrt/scripts/functions/device_hosts
+++ b/ext/openwrt/scripts/functions/device_hosts
@@ -44,7 +44,7 @@ local parameter=`echo -n $1 | sed "s/InternetGatewayDevice\.LANDevice\.1\./Devic
 case "$parameter" in
 	Device.Hosts.HostNumberOfEntries)
 	let local val=$num_static_leases+$num_dynamic_leases
-	freecwmp_output "$parameter" "$val"
+	ubus_freecwmp_output "$parameter" "$val"
 	return
 	;;
 esac
@@ -66,7 +66,7 @@ if [ $rc -eq 0 ]; then
 		local sed_cmd=`echo -n \'$num; echo p\'`
 		val=`eval sed -n $sed_cmd $leases_file | awk '{ print $2 }'`
 	fi
-	freecwmp_value_output "$parameter" "$val"
+	ubus_freecwmp_output "$parameter" "$val"
 	return
 fi
 
@@ -74,7 +74,7 @@ freecwmp_parse_formated_parameter "$parameter" "Device.Hosts.Host.{i}.IPAddress"
 if [ $rc -eq 0 ]; then
 	local val
 	get_device_hosts_ip_address "$leases_file" "$num" "$num_static_leases" "$num_dynamic_leases" "val"
-	freecwmp_value_output "$parameter" "$val"
+	ubus_freecwmp_output "$parameter" "$val"
 	return
 fi
 
@@ -88,7 +88,7 @@ if [ $rc -eq 0 ]; then
 	if [ $num -gt 0 -a $num -le $num_dynamic_leases ]; then
 		val="DHCP"
 	fi
-	freecwmp_value_output "$parameter" "$val"
+	ubus_freecwmp_output "$parameter" "$val"
 	return
 fi
 
@@ -107,7 +107,7 @@ if [ $rc -eq 0 ]; then
 		local t2=`date +%s`
 		let val=$t1-$t2
 	fi
-	freecwmp_value_output "$parameter" "$val"
+	ubus_freecwmp_output "$parameter" "$val"
 	return
 fi
 
@@ -131,7 +131,7 @@ if [ $rc -eq 0 ]; then
 		val=`eval sed -n $sed_cmd $leases_file | awk '{ print $4 }'`
 		if [ "x$val" == "x*" ]; then val=""; fi
 	fi
-	freecwmp_value_output "$parameter" "$val"
+	ubus_freecwmp_output "$parameter" "$val"
 	return
 fi
 
@@ -144,7 +144,7 @@ if [ $rc -eq 0 ]; then
 	get_device_hosts_ip_address "$leases_file" "$num" "$num_static_leases" "$num_dynamic_leases" "ip"
 	val=`ping -c 1 $ip 2>&1 > /dev/null ; echo $?`
 	let val=!$val
-	freecwmp_value_output "$parameter" "$val"
+	ubus_freecwmp_output "$parameter" "$val"
 	return
 fi
 
@@ -156,7 +156,7 @@ if [ $rc -eq 0 ]; then
 	if [ $num -le $n ]; then
 		val=1
 	fi
-	freecwmp_value_output "$parameter" "$val"
+	ubus_freecwmp_output "$parameter" "$val"
 	return
 fi
 
@@ -168,7 +168,7 @@ if [ $rc -eq 0 ]; then
 	if [ $num -le $n ]; then
 		val=0
 	fi
-	freecwmp_value_output "$parameter" "$val"
+	ubus_freecwmp_output "$parameter" "$val"
 	return
 fi
 
@@ -182,10 +182,11 @@ if [ $rc -eq 0 ]; then
 	if [ $num2 -eq 1 ]; then
 		get_device_hosts_ip_address "$leases_file" "$num1" "$num_static_leases" "$num_dynamic_leases" "val"
 	fi
-	freecwmp_value_output "$parameter" "$val"
+	ubus_freecwmp_output "$parameter" "$val"
 	return
 fi
 
 # TODO: Device.Hosts.Host.{i}.IPv6Address.{i}.IPAddress (no IPv6 support yet)
-
+return $FAULT_CPE_INVALID_PARAMETER_NAME
 }
+
diff --git a/ext/openwrt/scripts/functions/device_info b/ext/openwrt/scripts/functions/device_info
index 4423b8b..a4f0552 100644
--- a/ext/openwrt/scripts/functions/device_info
+++ b/ext/openwrt/scripts/functions/device_info
@@ -2,8 +2,16 @@
 # Copyright (C) 2011-2012 Luka Perkov <freecwmp@lukaperkov.net>
 
 get_device_info_manufacturer() {
-local val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get freecwmp.@device[0].manufacturer 2> /dev/null`
-freecwmp_output "InternetGatewayDevice.DeviceInfo.Manufacturer" "$val"
+local val=""
+case "$action" in
+	get_value)
+	val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get freecwmp.@device[0].manufacturer 2> /dev/null`
+	;;
+	get_name)
+	val="0"
+	;;
+esac
+ubus_freecwmp_output "InternetGatewayDevice.DeviceInfo.Manufacturer" "$val"
 }
 
 set_device_info_manufacturer() {
@@ -11,8 +19,16 @@ set_device_info_manufacturer() {
 }
 
 get_device_info_oui() {
-local val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get freecwmp.@device[0].oui 2> /dev/null`
-freecwmp_output "InternetGatewayDevice.DeviceInfo.ManufacturerOUI" "$val"
+local val=""
+case "$action" in
+	get_value)
+	val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get freecwmp.@device[0].oui 2> /dev/null`
+	;;
+	get_name)
+	val="0"
+	;;
+esac
+ubus_freecwmp_output "InternetGatewayDevice.DeviceInfo.ManufacturerOUI" "$val"
 }
 
 set_device_info_oui() {
@@ -20,8 +36,16 @@ set_device_info_oui() {
 }
 
 get_device_info_product_class() {
-local val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get freecwmp.@device[0].product_class 2> /dev/null`
-freecwmp_output "InternetGatewayDevice.DeviceInfo.ProductClass" "$val"
+local val=""
+case "$action" in
+	get_value)
+	val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get freecwmp.@device[0].product_class 2> /dev/null`
+	;;
+	get_name)
+	val="0"
+	;;
+esac
+ubus_freecwmp_output "InternetGatewayDevice.DeviceInfo.ProductClass" "$val"	
 }
 
 set_device_info_product_class() {
@@ -29,8 +53,16 @@ set_device_info_product_class() {
 }
 
 get_device_info_serial_number() {
+local val=""
+case "$action" in
+	get_value)
 local val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get freecwmp.@device[0].serial_number 2> /dev/null`
-freecwmp_output "InternetGatewayDevice.DeviceInfo.SerialNumber" "$val"
+	;;
+	get_name)
+	local val="0"
+	;;
+esac
+ubus_freecwmp_output "InternetGatewayDevice.DeviceInfo.SerialNumber" "$val"
 }
 
 set_device_info_serial_number() {
@@ -38,8 +70,16 @@ set_device_info_serial_number() {
 }
 
 get_device_info_hardware_version() {
-local val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get freecwmp.@device[0].hardware_version 2> /dev/null`
-freecwmp_output "InternetGatewayDevice.DeviceInfo.HardwareVersion" "$val"
+local val=""
+case "$action" in
+	get_value)
+	val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get freecwmp.@device[0].hardware_version 2> /dev/null`
+	;;
+	get_name)
+	val="0"
+	;;
+esac
+ubus_freecwmp_output "InternetGatewayDevice.DeviceInfo.HardwareVersion" "$val"
 }
 
 set_device_info_hardware_version() {
@@ -47,8 +87,16 @@ set_device_info_hardware_version() {
 }
 
 get_device_info_software_version() {
-local val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get freecwmp.@device[0].software_version 2> /dev/null`
-freecwmp_output "InternetGatewayDevice.DeviceInfo.SoftwareVersion" "$val"
+local val=""
+case "$action" in
+	get_value)
+	val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get freecwmp.@device[0].software_version 2> /dev/null`
+	;;
+	get_name)
+	val="0"
+	;;
+esac
+ubus_freecwmp_output "InternetGatewayDevice.DeviceInfo.SoftwareVersion" "$val"
 }
 
 set_device_info_software_version() {
@@ -56,18 +104,33 @@ set_device_info_software_version() {
 }
 
 get_device_info_uptime() {
-local val=`cat /proc/uptime | awk -F "." '{ print $1 }'`
-freecwmp_output "InternetGatewayDevice.DeviceInfo.UpTime" "$val"
+local val=""
+case "$action" in
+	get_value)
+	val=`cat /proc/uptime | awk -F "." '{ print $1 }'`
+	;;
+	get_name)
+	val="0"
+	;;
+esac
+ubus_freecwmp_output "InternetGatewayDevice.DeviceInfo.UpTime" "$val"
 }
 
 get_device_info_device_log() {
 local val=""
+case "$action" in
+	get_value)
 if [ ${FLAGS_last} -eq ${FLAGS_TRUE} ]; then
 	val=`dmesg | tail -n1`
 else
 	val=`dmesg | tail -n10`
 fi
-freecwmp_output "InternetGatewayDevice.DeviceInfo.DeviceLog" "$val"
+	;;
+	get_name)
+	val="0"
+	;;
+esac
+ubus_freecwmp_output "InternetGatewayDevice.DeviceInfo.DeviceLog" "$val"
 }
 
 get_device_info() {
@@ -81,6 +144,7 @@ case "$1" in
 	get_device_info_software_version
 	get_device_info_uptime
 	get_device_info_device_log
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.DeviceInfo.)
 	get_device_info_manufacturer
@@ -91,32 +155,130 @@ case "$1" in
 	get_device_info_software_version
 	get_device_info_uptime
 	get_device_info_device_log
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.DeviceInfo.Manufacturer)
 	get_device_info_manufacturer
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.DeviceInfo.ManufacturerOUI)
 	get_device_info_oui
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.DeviceInfo.ProductClass)
 	get_device_info_product_class
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.DeviceInfo.SerialNumber)
 	get_device_info_serial_number
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.DeviceInfo.HardwareVersion)
 	get_device_info_hardware_version
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.DeviceInfo.SoftwareVersion)
 	get_device_info_software_version
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.DeviceInfo.UpTime)
 	get_device_info_uptime
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.DeviceInfo.DeviceLog)
 	get_device_info_device_log
+	return $FAULT_CPE_NO_FAULT
 	;;
 esac
+return $FAULT_CPE_INVALID_PARAMETER_NAME
+}
+
+get_device_info_name() {
+case "$1" in
+	InternetGatewayDevice.)
+	ubus_freecwmp_output "InternetGatewayDevice.DeviceInfo." "0"
+	if [ "$2" = "0" ]; then
+		get_device_info_manufacturer
+		get_device_info_oui
+		get_device_info_product_class
+		get_device_info_serial_number
+		get_device_info_hardware_version
+		get_device_info_software_version
+		get_device_info_uptime
+		get_device_info_device_log
+	fi
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.DeviceInfo.)
+	ubus_freecwmp_output "InternetGatewayDevice.DeviceInfo." "0"
+	get_device_info_manufacturer
+	get_device_info_oui
+	get_device_info_product_class
+	get_device_info_serial_number
+	get_device_info_hardware_version
+	get_device_info_software_version
+	get_device_info_uptime
+	get_device_info_device_log
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.DeviceInfo.Manufacturer)
+	if [ "$2" = "1" ]; then
+		return $FAULT_CPE_INVALID_ARGUMENTS
+	fi
+	get_device_info_manufacturer
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.DeviceInfo.ManufacturerOUI)
+	if [ "$2" = "1" ]; then
+		return $FAULT_CPE_INVALID_ARGUMENTS
+	fi
+	get_device_info_oui
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.DeviceInfo.ProductClass)
+	if [ "$2" = "1" ]; then
+		return $FAULT_CPE_INVALID_ARGUMENTS
+	fi
+	get_device_info_product_class
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.DeviceInfo.SerialNumber)
+	if [ "$2" = "1" ]; then
+		return $FAULT_CPE_INVALID_ARGUMENTS
+	fi
+	get_device_info_serial_number
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.DeviceInfo.HardwareVersion)
+	if [ "$2" = "1" ]; then
+		return $FAULT_CPE_INVALID_ARGUMENTS
+	fi
+	get_device_info_hardware_version
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.DeviceInfo.SoftwareVersion)
+	if [ "$2" = "1" ]; then
+		return $FAULT_CPE_INVALID_ARGUMENTS
+	fi
+	get_device_info_software_version
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.DeviceInfo.UpTime)
+	if [ "$2" = "1" ]; then
+		return $FAULT_CPE_INVALID_ARGUMENTS
+	fi
+	get_device_info_uptime
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.DeviceInfo.DeviceLog)
+	if [ "$2" = "1" ]; then
+		return $FAULT_CPE_INVALID_ARGUMENTS
+	fi
+	get_device_info_device_log
+	return $FAULT_CPE_NO_FAULT
+	;;
+esac
+return $FAULT_CPE_INVALID_PARAMETER_NAME
 }
 
 set_device_info() {
@@ -164,7 +326,31 @@ get_device_info_generic() {
 	check_parameter_device_info_generic "$1" ; _tmp=$? ; if [ "$_tmp" -eq 1 ]; then return 0; fi
 
 	freecwmp_get_parameter_value "val" "$1"
-	freecwmp_value_output "$1" "$val"
+	ubus_freecwmp_output "$1" "$val"
+}
+
+get_device_info_generic_name() {
+	local val=""
+	case "$1" in
+	InternetGatewayDevice.DeviceInfo.ModelName|\
+	InternetGatewayDevice.DeviceInfo.Description|\
+	InternetGatewayDevice.DeviceInfo.ModemFirmwareVersion|\
+	InternetGatewayDevice.DeviceInfo.EnabledOptions|\
+	InternetGatewayDevice.DeviceInfo.AdditionalHardwareVersion|\
+	InternetGatewayDevice.DeviceInfo.AdditionalSoftwareVersion|\
+	InternetGatewayDevice.DeviceInfo.SpecVersion|\
+	InternetGatewayDevice.DeviceInfo.FirstUseDate)
+	val="0"
+	ubus_freecwmp_output "$1" "$val"
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.DeviceInfo.ProvisioningCode)
+	val="1"
+	ubus_freecwmp_output "$1" "$val"
+	return $FAULT_CPE_NO_FAULT
+	;;
+	esac
+return $FAULT_CPE_INVALID_PARAMETER_NAME
 }
 
 set_device_info_generic() {
diff --git a/ext/openwrt/scripts/functions/device_routing b/ext/openwrt/scripts/functions/device_routing
index 3dfa418..ca6dab1 100644
--- a/ext/openwrt/scripts/functions/device_routing
+++ b/ext/openwrt/scripts/functions/device_routing
@@ -85,7 +85,7 @@ local parameter=$1
 
 case "$parameter" in
 	Device.Routing.RouterNumberOfEntries)
-	freecwmp_output "$parameter" "1"
+	ubus_freecwmp_output "$parameter" "1"
 	return
 	;;
 esac
@@ -101,7 +101,7 @@ if [ $rc -eq 0 ]; then
 	else
 		val="0"
 	fi
-	freecwmp_output "$parameter" "$val"
+	ubus_freecwmp_output "$parameter" "$val"
 	return
 fi
 
@@ -113,7 +113,7 @@ if [ $rc -eq 0 ]; then
 	else
 		val="Disabled"
 	fi
-	freecwmp_output "$parameter" "$val"
+	ubus_freecwmp_output "$parameter" "$val"
 	return
 fi
 
@@ -134,7 +134,7 @@ if [ $rc -eq 0 ]; then
 	else
 		return
 	fi
-	freecwmp_output "$parameter" "$total"
+	ubus_freecwmp_output "$parameter" "$total"
 	return
 fi
 
@@ -146,7 +146,7 @@ if [ $rc -eq 0 ]; then
 	else
 		return
 	fi
-	freecwmp_output "$parameter" "$val"
+	ubus_freecwmp_output "$parameter" "$val"
 	return
 fi
 
@@ -166,15 +166,15 @@ if [ $rc -eq 0 ]; then
 			return
 		fi
 		if [ $num2 -gt $static ]; then
-			freecwmp_output "$parameter" "Enabled"
+			ubus_freecwmp_output "$parameter" "Enabled"
 			return
 		fi
 		if [ $num2 -le $inactive ]; then
-			freecwmp_output "$parameter" "Error: not active but enabled"
+			ubus_freecwmp_output "$parameter" "Error: not active but enabled"
 			return
 		fi
 		if [ $num2 -le $static ]; then
-			freecwmp_output "$parameter" "Enabled"
+			ubus_freecwmp_output "$parameter" "Enabled"
 			return
 		fi
 	else
@@ -197,11 +197,11 @@ if [ $rc -eq 0 ]; then
 			return
 		fi
 		if [ $num2 -gt $static ]; then
-			freecwmp_output "$parameter" "0"
+			ubus_freecwmp_output "$parameter" "0"
 			return
 		fi
 		if [ $num2 -le $static ]; then
-			freecwmp_output "$parameter" "1"
+			ubus_freecwmp_output "$parameter" "1"
 			return
 		fi
 	else
@@ -230,7 +230,7 @@ if [ $rc -eq 0 ]; then
 			let local i=$static-$num2
 			target=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get network.@route[$i].target 2> /dev/null`
 		fi
-		freecwmp_output "$parameter" "$target"
+		ubus_freecwmp_output "$parameter" "$target"
 		return
 	else
 		return
@@ -258,7 +258,7 @@ if [ $rc -eq 0 ]; then
 			let local i=$static-$num2
 			netmask=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get network.@route[$i].netmask 2> /dev/null`
 		fi
-		freecwmp_output "$parameter" "$netmask"
+		ubus_freecwmp_output "$parameter" "$netmask"
 		return
 	else
 		return
@@ -288,7 +288,7 @@ if [ $rc -eq 0 ]; then
 			let local i=$static-$num2
 			gateway=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get network.@route[$i].gateway 2> /dev/null`
 		fi
-		freecwmp_output "$parameter" "$gateway"
+		ubus_freecwmp_output "$parameter" "$gateway"
 		return
 	else
 		return
@@ -315,7 +315,7 @@ if [ $rc -eq 0 ]; then
 		elif [ $num2 -le $static ]; then
 			val="Static"
 		fi
-		freecwmp_output "$parameter" "$val"
+		ubus_freecwmp_output "$parameter" "$val"
 		return
 	else
 		return
@@ -343,11 +343,12 @@ if [ $rc -eq 0 ]; then
 			let local i=$static-$num2
 			metric=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get network.@route[$i].metric 2> /dev/null`
 		fi
-		freecwmp_output "$parameter" "$metric"
+		ubus_freecwmp_output "$parameter" "$metric"
 		return
 	else
 		return
 	fi
 fi
-
+return $FAULT_CPE_INVALID_PARAMETER_NAME
 }
+
diff --git a/ext/openwrt/scripts/functions/device_users b/ext/openwrt/scripts/functions/device_users
index 0d377f7..d8dba61 100644
--- a/ext/openwrt/scripts/functions/device_users
+++ b/ext/openwrt/scripts/functions/device_users
@@ -6,7 +6,7 @@ local parameter="$1"
 case "$parameter" in
 	Device.Users.UserNumberOfEntries)
 	local val=`wc -l /etc/passwd | awk '{ print $1 }'`
-	freecwmp_value_output "$parameter" "$val"
+	ubus_freecwmp_output "$parameter" "$val"
 	return
 	;;
 esac
@@ -21,7 +21,7 @@ if [ $rc -eq 0 ]; then
 	# TODO: this is very system dependent, for now just look at users shell
 	local sed_cmd=`echo -n \'$num; echo p\'`
 	local val=`eval sed -n $sed_cmd /etc/passwd | grep -v '/bin/false' | wc -l`
-	freecwmp_value_output "$parameter" "$val"
+	ubus_freecwmp_output "$parameter" "$val"
 	return
 fi
 
@@ -30,7 +30,7 @@ if [ $rc -eq 0 ]; then
 	# TODO: this is very system dependent, for now just look at users shell
 	local sed_cmd=`echo -n \'$num; echo p\'`
 	local val=`eval sed -n $sed_cmd /etc/passwd | grep -v '/bin/false' | wc -l`
-	freecwmp_value_output "$parameter" "$val"
+	ubus_freecwmp_output "$parameter" "$val"
 	return
 fi
 
@@ -38,7 +38,7 @@ freecwmp_parse_formated_parameter "$parameter" "Device.Users.User.{i}.Username"
 if [ $rc -eq 0 ]; then
 	local sed_cmd=`echo -n \'$num; echo p\'`
 	local val=`eval sed -n $sed_cmd /etc/passwd | awk -F ':' '{ print $1 }'`
-	freecwmp_value_output "$parameter" "$val"
+	ubus_freecwmp_output "$parameter" "$val"
 	return
 fi
 
@@ -48,15 +48,16 @@ if [ $rc -eq 0 ]; then
 	#   local sed_cmd=`echo -n \'$num; echo p\'`
 	#   local val=`eval sed -n $sed_cmd /etc/shadow | awk -F ':' '{ print $2 }'`
 	#   freecwmp_value_output "$parameter" "$val"
-	freecwmp_value_output "$parameter" ""
+	ubus_freecwmp_output "$parameter" ""
 	return
 fi
 
 freecwmp_parse_formated_parameter "$parameter" "Device.Users.User.{i}.Language" "rc" "num"
 if [ $rc -eq 0 ]; then
-	freecwmp_value_output "$parameter" ""
+	ubus_freecwmp_output "$parameter" ""
 	return
 fi
+return $FAULT_CPE_INVALID_PARAMETER_NAME
 }
 
 set_device_users() {
diff --git a/ext/openwrt/scripts/functions/lan_device b/ext/openwrt/scripts/functions/lan_device
index 5ba513c..b29f07a 100644
--- a/ext/openwrt/scripts/functions/lan_device
+++ b/ext/openwrt/scripts/functions/lan_device
@@ -3,14 +3,26 @@
 
 get_wlan_enable() {
 local num="$1"
-local val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get wireless.@wifi-device[$num].disabled 2> /dev/null`
+local type="xsd:boolean"
+local val=""
+case "$action" in
+	get_value)
+	val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get wireless.@wifi-device[$num].disabled 2> /dev/null`
 let num=$num+1
 if [ "$val" = "1" ]; then
 	val="0"
 else
 	val="1"
 fi
-freecwmp_output "InternetGatewayDevice.LANDevice.1.WLANConfiguration.$num.Enable" "$val"
+	ubus_freecwmp_output "InternetGatewayDevice.LANDevice.1.WLANConfiguration.$num.Enable" "$val" "$type"
+	;;
+	get_name)
+	val="1"
+	let num=$num+1
+	ubus_freecwmp_output "InternetGatewayDevice.LANDevice.1.WLANConfiguration.$num.Enable" "$val"
+	;;
+esac
+
 }
 
 set_wlan_enable() {
@@ -27,9 +39,20 @@ delay_command "wifi" "wifi" "45"
 
 get_wlan_ssid() {
 local num="$1"
-local val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get wireless.@wifi-iface[$num].ssid 2> /dev/null`
+local val=""
+case "$action" in
+	get_value)
+	val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get wireless.@wifi-iface[$num].ssid 2> /dev/null`
 let num=$num+1
-freecwmp_output "InternetGatewayDevice.LANDevice.1.WLANConfiguration.$num.SSID" "$val"
+	ubus_freecwmp_output "InternetGatewayDevice.LANDevice.1.WLANConfiguration.$num.SSID" "$val"
+	;;
+	get_name)
+	val="1"
+	let num=$num+1
+	ubus_freecwmp_output "InternetGatewayDevice.LANDevice.1.WLANConfiguration.$num.SSID" "$val"
+	;;
+esac
+
 }
 
 set_wlan_ssid() {
@@ -44,30 +67,107 @@ case "$1" in
 	InternetGatewayDevice.)
 	get_wlan_enable 0
 	get_wlan_ssid 0
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.LANDevice.)
 	get_wlan_enable 0
 	get_wlan_ssid 0
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.LANDevice.1.)
+	get_wlan_enable 0
+	get_wlan_ssid 0
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.LANDevice.1.WLANConfiguration.)
+	get_wlan_enable 0
+	get_wlan_ssid 0
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.)
+	get_wlan_enable 0
+	get_wlan_ssid 0
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.Enable)
+	get_wlan_enable 0
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.SSID)
+	get_wlan_ssid 0
+	return $FAULT_CPE_NO_FAULT
+	;;
+esac
+return $FAULT_CPE_INVALID_PARAMETER_NAME
+}
+
+get_lan_device_name() {
+case "$1" in
+	InternetGatewayDevice.)
+	ubus_freecwmp_output "InternetGatewayDevice.LANDevice." "1"
+	if [ "$2" = "0" ]; then
+		ubus_freecwmp_output "InternetGatewayDevice.LANDevice.1." "1"
+		ubus_freecwmp_output "InternetGatewayDevice.LANDevice.1.WLANConfiguration." "1"
+		ubus_freecwmp_output "InternetGatewayDevice.LANDevice.1.WLANConfiguration.1." "1"
+		get_wlan_enable 0
+		get_wlan_ssid 0
+	fi
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.LANDevice.)
+	ubus_freecwmp_output "InternetGatewayDevice.LANDevice." "1"
+	ubus_freecwmp_output "InternetGatewayDevice.LANDevice.1." "1"
+	if [ "$2" = "0" ]; then
+		ubus_freecwmp_output "InternetGatewayDevice.LANDevice.1.WLANConfiguration." "1"
+		ubus_freecwmp_output "InternetGatewayDevice.LANDevice.1.WLANConfiguration.1." "1"
+		get_wlan_enable 0
+		get_wlan_ssid 0
+	fi
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.LANDevice.1.)
+	ubus_freecwmp_output "InternetGatewayDevice.LANDevice.1." "1"
+	ubus_freecwmp_output "InternetGatewayDevice.LANDevice.1.WLANConfiguration." "1"
+	if [ "$2" = "0" ]; then
+		ubus_freecwmp_output "InternetGatewayDevice.LANDevice.1.WLANConfiguration.1." "1"
 	get_wlan_enable 0
 	get_wlan_ssid 0
+	fi
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.LANDevice.1.WLANConfiguration.)
+	ubus_freecwmp_output "InternetGatewayDevice.LANDevice.1.WLANConfiguration." "1"
+	ubus_freecwmp_output "InternetGatewayDevice.LANDevice.1.WLANConfiguration.1." "1"
+	if [ "$2" = "0" ]; then
 	get_wlan_enable 0
 	get_wlan_ssid 0
+	fi
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.)
+	ubus_freecwmp_output "InternetGatewayDevice.LANDevice.1.WLANConfiguration.1." "1"
+	if [ "$2" = "0" ]; then
 	get_wlan_enable 0
 	get_wlan_ssid 0
+	fi
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.Enable)
+	if [ "$2" = "1" ]; then
+		return $FAULT_CPE_INVALID_ARGUMENTS
+	fi
 	get_wlan_enable 0
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.SSID)
+	if [ "$2" = "1" ]; then
+		return $FAULT_CPE_INVALID_ARGUMENTS
+	fi
 	get_wlan_ssid 0
+	return $FAULT_CPE_NO_FAULT
 	;;
 esac
+return $FAULT_CPE_INVALID_PARAMETER_NAME
 }
 
 set_lan_device() {
diff --git a/ext/openwrt/scripts/functions/management_server b/ext/openwrt/scripts/functions/management_server
index 9d1447e..2979863 100644
--- a/ext/openwrt/scripts/functions/management_server
+++ b/ext/openwrt/scripts/functions/management_server
@@ -9,8 +9,16 @@ local hostname=`get_management_server_x_freecwmp_org__acs_hostname`
 local port=`get_management_server_x_freecwmp_org__acs_port`
 local path=`get_management_server_x_freecwmp_org__acs_path`
 FLAGS_value=$tmp
-local val=`echo $scheme://$hostname:$port$path`
-freecwmp_output "InternetGatewayDevice.ManagementServer.URL" "$val"
+local val=""
+case "$action" in
+	get_value)
+	val=`echo $scheme://$hostname:$port$path`
+	;;
+	get_name)
+	val="0"
+	;;
+esac
+ubus_freecwmp_output "InternetGatewayDevice.ManagementServer.URL" "$val"
 }
 
 set_management_server_url() {
@@ -45,8 +53,16 @@ ubus ${UBUS_SOCKET:+-s $UBUS_SOCKET} call tr069 inform '{ "event": "value_change
 }
 
 get_management_server_username() {
-local val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get freecwmp.@acs[0].username 2> /dev/null`
-freecwmp_output "InternetGatewayDevice.ManagementServer.Username" "$val"
+local val=""
+case "$action" in
+	get_value)
+	val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get freecwmp.@acs[0].username 2> /dev/null`
+	;;
+	get_name)
+	val="0"
+	;;
+esac
+ubus_freecwmp_output "InternetGatewayDevice.ManagementServer.Username" "$val"
 }
 
 set_management_server_username() {
@@ -54,8 +70,16 @@ set_management_server_username() {
 }
 
 get_management_server_password() {
-local val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get freecwmp.@acs[0].password 2> /dev/null`
-freecwmp_output "InternetGatewayDevice.ManagementServer.Password" "$val"
+local val=""
+case "$action" in
+	get_value)
+	val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get freecwmp.@acs[0].password 2> /dev/null`
+	;;
+	get_name)
+	val="0"
+	;;
+esac
+ubus_freecwmp_output "InternetGatewayDevice.ManagementServer.Password" "$val"
 }
 
 set_management_server_password() {
@@ -63,9 +87,17 @@ set_management_server_password() {
 }
 
 get_management_server_periodic_inform_enable() {
+local val=""
 local parm="InternetGatewayDevice.ManagementServer.PeriodicInformEnable"
+case "$action" in
+	get_value)
 freecwmp_get_parameter_value "val" "$parm"
-freecwmp_output "$parm" "$val"
+	;;
+	get_name)
+	val="1"
+	;;
+esac
+ubus_freecwmp_output "$parm" "$val"
 }
 
 set_management_server_periodic_inform_enable() {
@@ -74,9 +106,17 @@ freecwmp_set_parameter_value "$parm" "$1"
 }
 
 get_management_server_periodic_inform_interval() {
+local val=""
 local parm="InternetGatewayDevice.ManagementServer.PeriodicInformInterval"
+case "$action" in
+	get_value)
 freecwmp_get_parameter_value "val" "$parm"
-freecwmp_output "$parm" "$val"
+	;;
+	get_name)
+	val="1"
+	;;
+esac
+ubus_freecwmp_output "$parm" "$val"
 }
 
 set_management_server_periodic_inform_interval() {
@@ -86,6 +126,8 @@ freecwmp_set_parameter_value "$parm" "$1"
 
 get_management_server_connection_request_url() {
 local val
+case "$action" in
+	get_value)
 if [ -z "$default_management_server_connection_request_url" ]; then
 	local tmp=${FLAGS_value}
 	FLAGS_value=${FLAGS_TRUE}
@@ -99,13 +141,25 @@ if [ -z "$default_management_server_connection_request_url" ]; then
 else
 	val=$default_management_server_connection_request_url
 fi
-
-freecwmp_output "InternetGatewayDevice.ManagementServer.ConnectionRequestURL" "$val"
+	;;
+	get_name)
+	val="0"
+	;;
+esac
+ubus_freecwmp_output "InternetGatewayDevice.ManagementServer.ConnectionRequestURL" "$val"
 }
 
 get_management_server_connection_request_username() {
-local val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get freecwmp.@local[0].username 2> /dev/null`
-freecwmp_value_output "InternetGatewayDevice.ManagementServer.ConnectionRequestUsername" "$val"
+local val=""
+case "$action" in
+	get_value)
+	val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get freecwmp.@local[0].username 2> /dev/null`
+	;;
+	get_name)
+	val="0"
+	;;
+esac
+ubus_freecwmp_output "InternetGatewayDevice.ManagementServer.ConnectionRequestUsername" "$val"
 }
 
 set_management_server_connection_request_username() {
@@ -113,8 +167,16 @@ set_management_server_connection_request_username() {
 }
 
 get_management_server_connection_request_password() {
-local val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get freecwmp.@local[0].password 2> /dev/null`
-freecwmp_value_output "InternetGatewayDevice.ManagementServer.ConnectionRequestPassword" "$val"
+local val=""
+case "$action" in
+	get_value)
+	val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get freecwmp.@local[0].password 2> /dev/null`
+	;;
+	get_name)
+	val="0"
+	;;
+esac
+ubus_freecwmp_output "InternetGatewayDevice.ManagementServer.ConnectionRequestPassword" "$val"
 }
 
 set_management_server_connection_request_password() {
@@ -124,8 +186,20 @@ set_management_server_connection_request_password() {
 # TODO: InternetGatewayDevice.ManagementServer.PeriodicInformTime
 
 get_management_server_x_freecwmp_org__acs_scheme() {
-local val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get freecwmp.@acs[0].scheme 2> /dev/null`
+local val=""
+case "$action" in
+	get_value)
+	val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get freecwmp.@acs[0].scheme 2> /dev/null`
+	;;
+	get_name)
+	val="1"
+	;;
+esac
+if [ "$FLAGS_value" != "${FLAGS_TRUE}" ]; then
+	ubus_freecwmp_output "InternetGatewayDevice.ManagementServer.X_freecwmp_org__ACS_Scheme" "$val"
+else
 freecwmp_output "InternetGatewayDevice.ManagementServer.X_freecwmp_org__ACS_Scheme" "$val"
+fi
 }
 
 set_management_server_x_freecwmp_org__acs_scheme() {
@@ -133,8 +207,20 @@ set_management_server_x_freecwmp_org__acs_scheme() {
 }
 
 get_management_server_x_freecwmp_org__acs_hostname() {
-local val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get freecwmp.@acs[0].hostname 2> /dev/null`
+local val=""
+case "$action" in
+	get_value)
+	val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get freecwmp.@acs[0].hostname 2> /dev/null`
+	;;
+	get_name)
+	val="1"
+	;;
+esac
+if [ "$FLAGS_value" != "${FLAGS_TRUE}" ]; then
+	ubus_freecwmp_output "InternetGatewayDevice.ManagementServer.X_freecwmp_org__ACS_Hostname" "$val"
+else
 freecwmp_output "InternetGatewayDevice.ManagementServer.X_freecwmp_org__ACS_Hostname" "$val"
+fi
 }
 
 set_management_server_x_freecwmp_org__acs_hostname() {
@@ -146,8 +232,20 @@ fi
 }
 
 get_management_server_x_freecwmp_org__acs_port() {
-local val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get freecwmp.@acs[0].port 2> /dev/null`
+local val=""
+case "$action" in
+	get_value)
+	val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get freecwmp.@acs[0].port 2> /dev/null`
+	;;
+	get_name)
+	val="1"
+	;;
+esac
+if [ "$FLAGS_value" != "${FLAGS_TRUE}" ]; then
+	ubus_freecwmp_output "InternetGatewayDevice.ManagementServer.X_freecwmp_org__ACS_Port" "$val"
+else
 freecwmp_output "InternetGatewayDevice.ManagementServer.X_freecwmp_org__ACS_Port" "$val"
+fi
 }
 
 set_management_server_x_freecwmp_org__acs_port() {
@@ -155,8 +253,20 @@ set_management_server_x_freecwmp_org__acs_port() {
 }
 
 get_management_server_x_freecwmp_org__acs_path() {
-local val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get freecwmp.@acs[0].path 2> /dev/null`
+local val=""
+case "$action" in
+	get_value)
+	val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get freecwmp.@acs[0].path 2> /dev/null`
+	;;
+	get_name)
+	val="1"
+	;;
+esac
+if [ "$FLAGS_value" != "${FLAGS_TRUE}" ]; then
+	ubus_freecwmp_output "InternetGatewayDevice.ManagementServer.X_freecwmp_org__ACS_Path" "$val"
+else
 freecwmp_output "InternetGatewayDevice.ManagementServer.X_freecwmp_org__ACS_Path" "$val"
+fi
 }
 
 set_management_server_x_freecwmp_org__acs_path() {
@@ -164,8 +274,20 @@ set_management_server_x_freecwmp_org__acs_path() {
 }
 
 get_management_server_x_freecwmp_org__connection_request_port() {
-local val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get freecwmp.@local[0].port 2> /dev/null`
+local val=""
+case "$action" in
+	get_value)
+	val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get freecwmp.@local[0].port 2> /dev/null`
+	;;
+	get_name)
+	val="1"
+	;;
+esac
+if [ "$FLAGS_value" != "${FLAGS_TRUE}" ]; then
+	ubus_freecwmp_output "InternetGatewayDevice.ManagementServer.X_freecwmp_org__Connection_Request_Port" "$val"
+else
 freecwmp_output "InternetGatewayDevice.ManagementServer.X_freecwmp_org__Connection_Request_Port" "$val"
+fi
 }
 
 set_management_server_x_freecwmp_org__connection_request_port() {
@@ -188,6 +310,7 @@ case "$1" in
 	get_management_server_x_freecwmp_org__acs_port
 	get_management_server_x_freecwmp_org__acs_path
 	get_management_server_x_freecwmp_org__connection_request_port
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.ManagementServer.)
 	get_management_server_url
@@ -203,47 +326,195 @@ case "$1" in
 	get_management_server_x_freecwmp_org__acs_port
 	get_management_server_x_freecwmp_org__acs_path
 	get_management_server_x_freecwmp_org__connection_request_port
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.ManagementServer.URL)
 	get_management_server_url
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.ManagementServer.Username)
 	get_management_server_username
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.ManagementServer.Password)
 	get_management_server_password
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.ManagementServer.PeriodicInformEnable)
 	get_management_server_periodic_inform_enable
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.ManagementServer.PeriodicInformInterval)
 	get_management_server_periodic_inform_interval
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.ManagementServer.ConnectionRequestURL)
 	get_management_server_connection_request_url
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.ManagementServer.ConnectionRequestUsername)
 	get_management_server_connection_request_username
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.ManagementServer.ConnectionRequestPassword)
 	get_management_server_connection_request_password
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.ManagementServer.X_freecwmp_org__ACS_Scheme)
 	get_management_server_x_freecwmp_org__acs_scheme
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.ManagementServer.X_freecwmp_org__ACS_Hostname)
 	get_management_server_x_freecwmp_org__acs_hostname
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.ManagementServer.X_freecwmp_org__ACS_Port)
 	get_management_server_x_freecwmp_org__acs_port
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.ManagementServer.X_freecwmp_org__ACS_Path)
 	get_management_server_x_freecwmp_org__acs_path
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.ManagementServer.X_freecwmp_org__Connection_Request_Port)
 	get_management_server_x_freecwmp_org__connection_request_port
+	return $FAULT_CPE_NO_FAULT
 	;;
 esac
+return $FAULT_CPE_INVALID_PARAMETER_NAME
+}
+
+get_management_server_name() {
+case "$1" in
+	InternetGatewayDevice.)
+	ubus_freecwmp_output "InternetGatewayDevice.ManagementServer." "0"
+	if [ "$2" = "0" ]; then
+		get_management_server_url
+		get_management_server_username
+		get_management_server_password
+		get_management_server_periodic_inform_enable
+		get_management_server_periodic_inform_interval
+		get_management_server_connection_request_url
+		get_management_server_connection_request_username
+		get_management_server_connection_request_password
+		get_management_server_x_freecwmp_org__acs_scheme
+		get_management_server_x_freecwmp_org__acs_hostname
+		get_management_server_x_freecwmp_org__acs_port
+		get_management_server_x_freecwmp_org__acs_path
+		get_management_server_x_freecwmp_org__connection_request_port
+	fi
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.ManagementServer.)
+	ubus_freecwmp_output "InternetGatewayDevice.ManagementServer." "0"
+	get_management_server_url
+	get_management_server_username
+	get_management_server_password
+	get_management_server_periodic_inform_enable
+	get_management_server_periodic_inform_interval
+	get_management_server_connection_request_url
+	get_management_server_connection_request_username
+	get_management_server_connection_request_password
+	get_management_server_x_freecwmp_org__acs_scheme
+	get_management_server_x_freecwmp_org__acs_hostname
+	get_management_server_x_freecwmp_org__acs_port
+	get_management_server_x_freecwmp_org__acs_path
+	get_management_server_x_freecwmp_org__connection_request_port
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.ManagementServer.URL)
+	if [ "$2" = "1" ]; then
+		return $FAULT_CPE_INVALID_ARGUMENTS
+	fi
+	get_management_server_url
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.ManagementServer.Username)
+	if [ "$2" = "1" ]; then
+		return $FAULT_CPE_INVALID_ARGUMENTS
+	fi
+	get_management_server_username
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.ManagementServer.Password)
+	if [ "$2" = "1" ]; then
+		return $FAULT_CPE_INVALID_ARGUMENTS
+	fi
+	get_management_server_password
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.ManagementServer.PeriodicInformEnable)
+	if [ "$2" = "1" ]; then
+		return $FAULT_CPE_INVALID_ARGUMENTS
+	fi
+	get_management_server_periodic_inform_enable
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.ManagementServer.PeriodicInformInterval)
+	if [ "$2" = "1" ]; then
+		return $FAULT_CPE_INVALID_ARGUMENTS
+	fi
+	get_management_server_periodic_inform_interval
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.ManagementServer.ConnectionRequestURL)
+	if [ "$2" = "1" ]; then
+		return $FAULT_CPE_INVALID_ARGUMENTS
+	fi
+	get_management_server_connection_request_url
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.ManagementServer.ConnectionRequestUsername)
+	if [ "$2" = "1" ]; then
+		return $FAULT_CPE_INVALID_ARGUMENTS
+	fi
+	get_management_server_connection_request_username
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.ManagementServer.ConnectionRequestPassword)
+	if [ "$2" = "1" ]; then
+		return $FAULT_CPE_INVALID_ARGUMENTS
+	fi
+	get_management_server_connection_request_password
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.ManagementServer.X_freecwmp_org__ACS_Scheme)
+	if [ "$2" = "1" ]; then
+		return $FAULT_CPE_INVALID_ARGUMENTS
+	fi
+	get_management_server_x_freecwmp_org__acs_scheme
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.ManagementServer.X_freecwmp_org__ACS_Hostname)
+	if [ "$2" = "1" ]; then
+		return $FAULT_CPE_INVALID_ARGUMENTS
+	fi
+	get_management_server_x_freecwmp_org__acs_hostname
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.ManagementServer.X_freecwmp_org__ACS_Port)
+	if [ "$2" = "1" ]; then
+		return $FAULT_CPE_INVALID_ARGUMENTS
+	fi
+	get_management_server_x_freecwmp_org__acs_port
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.ManagementServer.X_freecwmp_org__ACS_Path)
+	if [ "$2" = "1" ]; then
+		return $FAULT_CPE_INVALID_ARGUMENTS
+	fi
+	get_management_server_x_freecwmp_org__acs_path
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.ManagementServer.X_freecwmp_org__Connection_Request_Port)
+	if [ "$2" = "1" ]; then
+		return $FAULT_CPE_INVALID_ARGUMENTS
+	fi
+	get_management_server_x_freecwmp_org__connection_request_port
+	return $FAULT_CPE_NO_FAULT
+	;;
+esac
+return $FAULT_CPE_INVALID_PARAMETER_NAME
 }
 
 set_management_server() {
@@ -304,7 +575,14 @@ get_management_server_generic() {
 	check_parameter_management_server_generic "$1" ; _tmp=$? ; if [ "$_tmp" -eq 1 ]; then return 0; fi
 
 	freecwmp_get_parameter_value "val" "$1"
-	freecwmp_value_output "$1" "$val"
+	ubus_freecwmp_output "$1" "$val"
+}
+
+get_management_server_generic_name() {
+	check_parameter_management_server_generic "$1" ; _tmp=$? ; if [ "$_tmp" -eq 1 ]; then return $FAULT_CPE_INVALID_PARAMETER_NAME; fi
+
+	local val="1"
+	ubus_freecwmp_output "$1" "$val"
 }
 
 set_management_server_generic() {
diff --git a/ext/openwrt/scripts/functions/misc b/ext/openwrt/scripts/functions/misc
index 2e0210c..13f2142 100644
--- a/ext/openwrt/scripts/functions/misc
+++ b/ext/openwrt/scripts/functions/misc
@@ -3,21 +3,25 @@
 
 get_misc_cpu_usage() {
 local val=`uptime | awk -F'average: ' '{ print $2 }' | awk -F',' '{ print $1 }' | awk -F'.' '{ print $2 }'`
-freecwmp_value_output "Device.DeviceInfo.ProcessStatus.CPUUsage" "$val"
+ubus_freecwmp_output "Device.DeviceInfo.ProcessStatus.CPUUsage" "$val"
 }
 
 get_misc_process_number() {
 local val=`ps | grep -v COMMAND | wc -l`
-freecwmp_value_output "Device.DeviceInfo.ProcessStatus.ProcessNumberOfEntries" "$val"
+local type="xsd:unsignedInt"
+ubus_freecwmp_output "Device.DeviceInfo.ProcessStatus.ProcessNumberOfEntries" "$val" "$type"
 }
 
 get_misc() {
 case "$1" in
 	Device.DeviceInfo.ProcessStatus.CPUUsage)
 	get_misc_cpu_usage
+	return $FAULT_CPE_NO_FAULT
 	;;
 	Device.DeviceInfo.ProcessStatus.ProcessNumberOfEntries)
 	get_misc_process_number
+	return $FAULT_CPE_NO_FAULT
 	;;
 esac
+return $FAULT_CPE_INVALID_PARAMETER_NAME
 }
diff --git a/ext/openwrt/scripts/functions/wan_device b/ext/openwrt/scripts/functions/wan_device
index 77cb63f..5c128e7 100644
--- a/ext/openwrt/scripts/functions/wan_device
+++ b/ext/openwrt/scripts/functions/wan_device
@@ -3,35 +3,76 @@
 
 get_wan_device_mng_status() {
 # TODO: Unconfigured ; Connecting ; Connected ; PendingDisconnect ; Disconneting ; Disconnected 
-local val="Connected"
-freecwmp_output "InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANIPConnection.1.ConnectionStatus" "$val"
+local val=""
+local type="xsd:boolean"
+case "$action" in
+	get_value)
+	val="Connected"
+	;;
+	get_name)
+	val="0"
+	;;
+esac
+ubus_freecwmp_output "InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANIPConnection.1.ConnectionStatus" "$val"
 }
 
 get_wan_device_mng_interface_ip() {
-local val
+local val=""
+case "$action" in
+	get_value)
 if [ -z "$default_wan_device_mng_interface_ip" ]; then
 	val=`network_get_ipaddr val mng`
 else
 	val=$default_wan_device_mng_interface_ip
 fi
+	;;
+	get_name)
+	val="0"
+	;;
+esac
+if [ "$FLAGS_value" != "${FLAGS_TRUE}" ]; then
+	ubus_freecwmp_output "InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANIPConnection.1.ExternalIPAddress" "$val"
+else
 freecwmp_output "InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANIPConnection.1.ExternalIPAddress" "$val"
+fi
 }
 
 get_wan_device_mng_interface_mac() {
+local val=""
+case "$action" in
+	get_value)
 if [ -z "$default_wan_device_mng_interface_mac" ]; then
 	val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get network.mng.macaddr`
 else
 	val=$default_wan_device_mng_interface_mac
 fi
+	;;
+	get_name)
+	val="0"
+	;;
+esac
+if [ "$FLAGS_value" != "${FLAGS_TRUE}" ]; then
+	ubus_freecwmp_output "InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANIPConnection.1.MACAddress" "$val"
+else
 freecwmp_output "InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANIPConnection.1.MACAddress" "$val"
+fi
 }
 
 get_wan_device_wan_ppp_enable() {
-local val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get network.wan.auto 2> /dev/null`
+local val=""
+local type="xsd:boolean"
+case "$action" in
+	get_value)
+	val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get network.wan.auto 2> /dev/null`
 if [ -z $val ]; then
 	val="1"
 fi
-freecwmp_output "InternetGatewayDevice.WANDevice.1.WANConnectionDevice.2.WANPPPConnection.1.Enable" "$val"
+	;;
+	get_name)
+	val="1"
+	;;
+esac
+ubus_freecwmp_output "InternetGatewayDevice.WANDevice.1.WANConnectionDevice.2.WANPPPConnection.1.Enable" "$val" "$type"
 }
 
 set_wan_device_wan_ppp_enable() {
@@ -46,8 +87,16 @@ fi
 }
 
 get_wan_device_wan_ppp_username() {
-local val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get network.wan.username 2> /dev/null`
-freecwmp_output "InternetGatewayDevice.WANDevice.1.WANConnectionDevice.2.WANPPPConnection.1.Username" "$val"
+local val=""
+case "$action" in
+	get_value)
+	val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get network.wan.username 2> /dev/null`
+	;;
+	get_name)
+	val="1"
+	;;
+esac
+ubus_freecwmp_output "InternetGatewayDevice.WANDevice.1.WANConnectionDevice.2.WANPPPConnection.1.Username" "$val"
 }
 
 set_wan_device_wan_ppp_username() {
@@ -55,7 +104,16 @@ set_wan_device_wan_ppp_username() {
 }
 
 get_wan_device_wan_ppp_password() {
-freecwmp_output "InternetGatewayDevice.WANDevice.1.WANConnectionDevice.2.WANPPPConnection.1.Password" ""
+local val=""
+case "$action" in
+	get_value)
+	val=`/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} get network.wan.password 2> /dev/null`
+	;;
+	get_name)
+	val="1"
+	;;
+esac
+ubus_freecwmp_output "InternetGatewayDevice.WANDevice.1.WANConnectionDevice.2.WANPPPConnection.1.Password" "$val"
 }
 
 set_wan_device_wan_ppp_password() {
@@ -71,68 +129,211 @@ case "$1" in
 	get_wan_device_wan_ppp_enable
 	get_wan_device_wan_ppp_username
 	get_wan_device_wan_ppp_password
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.WANDevice.)
+	get_wan_device_mng_status
+	get_wan_device_mng_interface_ip
+	get_wan_device_mng_interface_mac
+	get_wan_device_wan_ppp_enable
+	get_wan_device_wan_ppp_username
+	get_wan_device_wan_ppp_password
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.WANDevice.1.)
+	get_wan_device_mng_status
+	get_wan_device_mng_interface_ip
+	get_wan_device_mng_interface_mac
+	get_wan_device_wan_ppp_enable
+	get_wan_device_wan_ppp_username
+	get_wan_device_wan_ppp_password
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.WANDevice.1.WANConnectionDevice.)
+	get_wan_device_mng_status
+	get_wan_device_mng_interface_ip
+	get_wan_device_mng_interface_mac
+	get_wan_device_wan_ppp_enable
+	get_wan_device_wan_ppp_username
+	get_wan_device_wan_ppp_password
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.)
+	get_wan_device_mng_status
+	get_wan_device_mng_interface_ip
+	get_wan_device_mng_interface_mac
+	get_wan_device_wan_ppp_enable
+	get_wan_device_wan_ppp_username
+	get_wan_device_wan_ppp_password
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANIPConnection.)
+	get_wan_device_mng_status
+	get_wan_device_mng_interface_ip
+	get_wan_device_mng_interface_mac
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANIPConnection.1.)
+	get_wan_device_mng_status
+	get_wan_device_mng_interface_ip
+	get_wan_device_mng_interface_mac
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANIPConnection.1.ConnectionStatus)
+	get_wan_device_mng_status
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANIPConnection.1.ExternalIPAddress)
+	get_wan_device_mng_interface_ip
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANIPConnection.1.MACAddress)
+	get_wan_device_mng_interface_mac
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.WANDevice.1.WANConnectionDevice.2.WANPPPConnection.1.Enable)
+	get_wan_device_wan_ppp_enable
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.WANDevice.1.WANConnectionDevice.2.WANPPPConnection.1.Username)
+	get_wan_device_wan_ppp_username
+	return $FAULT_CPE_NO_FAULT
+	;;
+	InternetGatewayDevice.WANDevice.1.WANConnectionDevice.2.WANPPPConnection.1.Password)
+	get_wan_device_wan_ppp_password
+	return $FAULT_CPE_NO_FAULT
+	;;
+esac
+return $FAULT_CPE_INVALID_PARAMETER_NAME
+}
+
+get_wan_device_name() {
+case "$1" in
+	InternetGatewayDevice.)
+	ubus_freecwmp_output "InternetGatewayDevice.WANDevice." "1"
+	if [ "$2" = "0" ]; then
+		get_wan_device_mng_status
+		get_wan_device_mng_interface_ip
+		get_wan_device_mng_interface_mac
+		get_wan_device_wan_ppp_enable
+		get_wan_device_wan_ppp_username
+		get_wan_device_wan_ppp_password
+	fi
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.WANDevice.)
+	ubus_freecwmp_output "InternetGatewayDevice.WANDevice." "1"
+	ubus_freecwmp_output "InternetGatewayDevice.WANDevice.1." "1"
+	if [ "$2" = "0" ]; then
 	get_wan_device_mng_status
 	get_wan_device_mng_interface_ip
 	get_wan_device_mng_interface_mac
 	get_wan_device_wan_ppp_enable
 	get_wan_device_wan_ppp_username
 	get_wan_device_wan_ppp_password
+	fi
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.WANDevice.1.)
+	ubus_freecwmp_output "InternetGatewayDevice.WANDevice.1." "1"
+	ubus_freecwmp_output "InternetGatewayDevice.WANDevice.1.WANConnectionDevice." "1"
+	if [ "$2" = "0" ]; then
 	get_wan_device_mng_status
 	get_wan_device_mng_interface_ip
 	get_wan_device_mng_interface_mac
 	get_wan_device_wan_ppp_enable
 	get_wan_device_wan_ppp_username
 	get_wan_device_wan_ppp_password
+	fi
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.WANDevice.1.WANConnectionDevice.)
+	ubus_freecwmp_output "InternetGatewayDevice.WANDevice.1.WANConnectionDevice." "1"
+	ubus_freecwmp_output "InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1." "1"
+	if [ "$2" = "0" ]; then
 	get_wan_device_mng_status
 	get_wan_device_mng_interface_ip
 	get_wan_device_mng_interface_mac
 	get_wan_device_wan_ppp_enable
 	get_wan_device_wan_ppp_username
 	get_wan_device_wan_ppp_password
+	fi
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.)
+	ubus_freecwmp_output "InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1." "1"
+	ubus_freecwmp_output "InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANIPConnection." "1"
+	if [ "$2" = "0" ]; then
 	get_wan_device_mng_status
 	get_wan_device_mng_interface_ip
 	get_wan_device_mng_interface_mac
 	get_wan_device_wan_ppp_enable
 	get_wan_device_wan_ppp_username
 	get_wan_device_wan_ppp_password
+	fi
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANIPConnection.)
+	ubus_freecwmp_output "InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANIPConnection." "1"
+	ubus_freecwmp_output "InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANIPConnection.1." "1"
+	if [ "$2" = "0" ]; then
 	get_wan_device_mng_status
 	get_wan_device_mng_interface_ip
 	get_wan_device_mng_interface_mac
+	fi
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANIPConnection.1.)
+	ubus_freecwmp_output "InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANIPConnection.1." "1"
 	get_wan_device_mng_status
 	get_wan_device_mng_interface_ip
 	get_wan_device_mng_interface_mac
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANIPConnection.1.ConnectionStatus)
+	if [ "$2" = "1" ]; then
+		return $FAULT_CPE_INVALID_ARGUMENTS
+	fi
 	get_wan_device_mng_status
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANIPConnection.1.ExternalIPAddress)
+	if [ "$2" = "1" ]; then
+		return $FAULT_CPE_INVALID_ARGUMENTS
+	fi
 	get_wan_device_mng_interface_ip
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANIPConnection.1.MACAddress)
+	if [ "$2" = "1" ]; then
+		return $FAULT_CPE_INVALID_ARGUMENTS
+	fi
 	get_wan_device_mng_interface_mac
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.WANDevice.1.WANConnectionDevice.2.WANPPPConnection.1.Enable)
+	if [ "$2" = "1" ]; then
+		return $FAULT_CPE_INVALID_ARGUMENTS
+	fi
 	get_wan_device_wan_ppp_enable
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.WANDevice.1.WANConnectionDevice.2.WANPPPConnection.1.Username)
+	if [ "$2" = "1" ]; then
+		return $FAULT_CPE_INVALID_ARGUMENTS
+	fi
 	get_wan_device_wan_ppp_username
+	return $FAULT_CPE_NO_FAULT
 	;;
 	InternetGatewayDevice.WANDevice.1.WANConnectionDevice.2.WANPPPConnection.1.Password)
+	if [ "$2" = "1" ]; then
+		return $FAULT_CPE_INVALID_ARGUMENTS
+	fi
 	get_wan_device_wan_ppp_password
+	return $FAULT_CPE_NO_FAULT
 	;;
 esac
+return $FAULT_CPE_INVALID_PARAMETER_NAME
 }
 
 set_wan_device() {
diff --git a/src/external.c b/src/external.c
index fa802af..e62b14d 100644
--- a/src/external.c
+++ b/src/external.c
@@ -25,15 +25,81 @@
 #include "freecwmp.h"
 
 static struct uloop_process uproc;
+pthread_t ubus_thread;
+LIST_HEAD(external_list_parameter);
+
+void *thread_uloop_run (void *v)
+{
+	uloop_run();
+	return NULL;
+}
+
+void external_add_list_paramameter(char *param_name, char *param_data, char *param_type, char *fault_code)
+{
+	struct external_parameter *external_parameter;
+	struct list_head *ilist; int i =0;
+	external_parameter = calloc(1, sizeof(struct external_parameter));
+	list_add_tail(&external_parameter->list,&external_list_parameter);
+	if (param_name) external_parameter->name = strdup(param_name);
+	if (param_data) external_parameter->data = strdup(param_data);
+	if (param_type) external_parameter->type = strdup(param_type);
+	if (fault_code) external_parameter->fault_code = strdup(fault_code);
+}
+
+void external_free_list_parameter()
+{
+	struct external_parameter *external_parameter;
+	while (external_list_parameter.next!=&external_list_parameter) {
+		external_parameter = list_entry(external_list_parameter.next, struct external_parameter, list);
+		list_del(&external_parameter->list);
+		CFREE(external_parameter->name);
+		CFREE(external_parameter->data);
+		CFREE(external_parameter->type);
+		CFREE(external_parameter->fault_code);
+		CFREE(external_parameter);
+	}
+}
+
+void external_get_head_parameter_data(char *data_buffer)
+{
+	struct external_parameter *external_parameter;
+	if (external_list_parameter.next!=&external_list_parameter) {
+		external_parameter = list_entry(external_list_parameter.next, struct external_parameter, list);
+		if (external_parameter->data) strcpy(data_buffer, external_parameter->data);
+		list_del(&external_parameter->list);
+		CFREE(external_parameter->name);
+		CFREE(external_parameter->data);
+		CFREE(external_parameter->type);
+		CFREE(external_parameter->fault_code);
+		CFREE(external_parameter);
+	}
+}
 
 int external_get_action(char *action, char *name, char **value)
 {
+	struct external_parameter *external_parameter;
+	external_get_action_common(action, name, NULL);
+	if (external_list_parameter.next!=&external_list_parameter) {
+		external_parameter = list_entry(external_list_parameter.next, struct external_parameter, list);
+		if (external_parameter->data)
+			*value = external_parameter->data;
+		list_del(&external_parameter->list);
+		CFREE(external_parameter->name);
+		CFREE(external_parameter->data);
+		CFREE(external_parameter->type);
+		CFREE(external_parameter->fault_code);
+		CFREE(external_parameter);
+	}
+	external_free_list_parameter();
+}
+
+int external_get_action_common(char *action, char *name, char *arg /* arg is added for GetParameterNames NextLevel argument*/)
+{
 	freecwmp_log_message(NAME, L_NOTICE,
 			     "executing get %s '%s'\n", action, name);
 
-	int pfds[2];
-	if (pipe(pfds) < 0)
-		return -1;
+
+	pthread_create(&ubus_thread, NULL, &thread_uloop_run, NULL);
 
 	if ((uproc.pid = fork()) == -1)
 		goto error;
@@ -45,57 +111,106 @@ int external_get_action(char *action, char *name, char **value)
 		int i = 0;
 		argv[i++] = "/bin/sh";
 		argv[i++] = fc_script;
-		argv[i++] = "--newline";
-		argv[i++] = "--value";
 		argv[i++] = "get";
 		argv[i++] = action;
 		argv[i++] = name;
+		if(arg) argv[i++] = arg;
 		argv[i++] = NULL;
 
-		close(pfds[0]);
-		dup2(pfds[1], 1);
-		close(pfds[1]);
-
 		execvp(argv[0], (char **) argv);
 		exit(ESRCH);
 
 	} else if (uproc.pid < 0)
 		goto error;
 
-	/* parent */
-	close(pfds[1]);
-
 	int status;
 	while (wait(&status) != uproc.pid) {
 		DD("waiting for child to exit");
 	}
+	pthread_cancel(ubus_thread);
+	pthread_join(ubus_thread,NULL);
 
-	char buffer[2];
-	ssize_t rxed;
+	return 0;
+
+error:
+	return -1;
 
-	*value = (char *) calloc(1, sizeof(char));
-	while ((rxed = read(pfds[0], buffer, sizeof(buffer))) > 0) {
-		*value = (char *) realloc(*value, (strlen(*value) + rxed + 1) * sizeof(char));
-		if (!(*value)) goto error;
-		bzero(*value + strlen(*value), rxed + 1);
-		memcpy(*value + strlen(*value), buffer, rxed);
 	}
 
-	if (!strlen(*value)) {
-		FREE(*value);
-		goto done;
+int external_get_action_write(char *action, char *name, char *arg)
+{
+	freecwmp_log_message(NAME, L_NOTICE,
+		"adding to get %s script '%s'\n", action, name);
+
+	FILE *fp;
+
+	if (access(fc_script_get_actions, R_OK | W_OK | X_OK) != -1) {
+		fp = fopen(fc_script_get_actions, "a");
+		if (!fp) return -1;
+	} else {
+		fp = fopen(fc_script_get_actions, "w");
+		if (!fp) return -1;
+
+		fprintf(fp, "#!/bin/sh\n");
+
+		if (chmod(fc_script_get_actions,
+			strtol("0700", 0, 8)) < 0) {
+			return -1;
+		}
 	}
 
-	if (rxed < 0)
-		goto error;
+#ifdef DUMMY_MODE
+	fprintf(fp, "/bin/sh `pwd`/%s get %s %s %s\n", fc_script, action, name, arg?arg:"");
+#else
+	fprintf(fp, "/bin/sh %s get %s %s %s\n", fc_script, action, name, arg?arg:"");
+#endif
+
+	fclose(fp);
 
-done:
-	close(pfds[0]);
 	return 0;
+}
 
-error:
-	close(pfds[0]);
+int external_get_action_execute()
+{
+	freecwmp_log_message(NAME, L_NOTICE, "executing get script\n");
+
+	pthread_create(&ubus_thread, NULL, &thread_uloop_run, NULL);
+
+	if ((uproc.pid = fork()) == -1) {
+		return -1;
+	}
+
+	if (uproc.pid == 0) {
+		/* child */
+
+		const char *argv[3];
+		int i = 0;
+		argv[i++] = "/bin/sh";
+		argv[i++] = fc_script_get_actions;
+		argv[i++] = NULL;
+
+		execvp(argv[0], (char **) argv);
+		exit(ESRCH);
+
+	} else if (uproc.pid < 0)
+		return -1;
+
+	/* parent */
+	int status;
+	while (wait(&status) != uproc.pid) {
+		DD("waiting for child to exit");
+	}
+
+	pthread_cancel(ubus_thread);
+	pthread_join(ubus_thread,NULL);
+
+
+	// TODO: add some kind of checks
+
+	if (remove(fc_script_get_actions) != 0)
 	return -1;
+
+	return 0;
 }
 
 int external_set_action_write(char *action, char *name, char *value)
diff --git a/src/external.h b/src/external.h
index 8606266..fcf9819 100644
--- a/src/external.h
+++ b/src/external.h
@@ -9,6 +9,7 @@
 
 #ifndef _FREECWMP_EXTERNAL_H__
 #define _FREECWMP_EXTERNAL_H__
+#include <libubox/list.h>
 
 #ifdef DUMMY_MODE
 static char *fc_script = "./ext/openwrt/scripts/freecwmp.sh";
@@ -16,12 +17,27 @@ static char *fc_script = "./ext/openwrt/scripts/freecwmp.sh";
 static char *fc_script = "/usr/sbin/freecwmp";
 #endif
 static char *fc_script_set_actions = "/tmp/freecwmp_set_action_values.sh";
+static char *fc_script_get_actions = "/tmp/freecwmp_get_action_values.sh";
+
+struct external_parameter {
+	struct list_head list;
+	char *name;
+	char *data; /* notification for GetParameterAttribute; writable for GetParameterNames; value for GetParameterValues*/
+	char *type;
+	char *fault_code;
+};
+
 
 int external_get_action(char *action, char *name, char **value);
+int external_get_action_common(char *action, char *name, char *arg);
+int external_get_action_write(char *action, char *name, char *arg);
+int external_get_action_execute();
 int external_set_action_write(char *action, char *name, char *value);
 int external_set_action_execute();
 int external_simple(char *arg);
 int external_download(char *url, char *size);
+void external_add_list_paramameter(char *param_name, char *param_data, char *param_type, char *fault_code);
+void external_free_list_parameter();
 
 #endif
 
diff --git a/src/freecwmp.c b/src/freecwmp.c
index 7d6a672..e6742a4 100644
--- a/src/freecwmp.c
+++ b/src/freecwmp.c
@@ -18,6 +18,9 @@
 #include <arpa/inet.h>
 #include <linux/netlink.h>
 #include <linux/rtnetlink.h>
+#include <signal.h>
+
+
 
 #include <libfreecwmp.h>
 #include <libubox/uloop.h>
@@ -194,11 +197,27 @@ netlink_init(void)
 	return 0;
 }
 
+void signal_kill_all_handler(int sig)
+{
+     pthread_exit(NULL);
+}
+
+
+
 int main (int argc, char **argv)
 {
 	freecwmp_log_message(NAME, L_NOTICE, "daemon started\n");
 
 	bool foreground = false;
+	struct sigaction sigint_action;
+
+	sigint_action.sa_handler = &signal_kill_all_handler;
+	sigemptyset (&sigint_action.sa_mask);
+	/* reset handler in case when pthread_cancel didn't stop
+	   threads for some reason */
+	sigint_action.sa_flags = SA_RESETHAND;
+	sigaction(SIGTERM, &sigint_action, NULL);
+
 
 	setlocale(LC_CTYPE, "");
 	umask(0037);
diff --git a/src/freecwmp.h b/src/freecwmp.h
index c5304c8..3777181 100644
--- a/src/freecwmp.h
+++ b/src/freecwmp.h
@@ -13,6 +13,7 @@
 #define NAME	"freecwmpd"
 
 #define FREE(x) free(x); x = NULL;
+#define CFREE(x) if (x) free(x);
 
 #ifdef DEBUG
 #define D(format, ...) fprintf(stderr, "%s(%d): " format, __func__, __LINE__, ## __VA_ARGS__)
diff --git a/src/ubus.c b/src/ubus.c
index ce25e07..db9d5d3 100644
--- a/src/ubus.c
+++ b/src/ubus.c
@@ -16,6 +16,7 @@
 #include "config.h"
 #include "cwmp.h"
 #include "freecwmp.h"
+#include "external.h"
 
 static struct ubus_context *ctx = NULL;
 
@@ -98,9 +99,135 @@ freecwmpd_handle_reload(struct ubus_context *ctx, struct ubus_object *obj,
 	return 0;
 }
 
+static enum getParamValues {
+	GETPARAMVALUES_PARAM,
+	GETPARAMVALUES_VALUE,
+	GETPARAMVALUES_TYPE,
+	GETPARAMVALUES_FAULT,
+	__GETPARAMVALUES_MAX
+};
+
+static const struct blobmsg_policy getParamValues_policy[] = {
+	[GETPARAMVALUES_PARAM] = { .name = "parameter", .type = BLOBMSG_TYPE_STRING },
+	[GETPARAMVALUES_VALUE] = { .name = "value", .type = BLOBMSG_TYPE_STRING },
+	[GETPARAMVALUES_TYPE] = { .name = "type", .type = BLOBMSG_TYPE_STRING },
+	[GETPARAMVALUES_FAULT] = { .name = "fault_code", .type = BLOBMSG_TYPE_STRING },
+};
+
+static int
+freecwmpd_handle_getParamValues(struct ubus_context *ctx, struct ubus_object *obj,
+			struct ubus_request_data *req, const char *method,
+			struct blob_attr *msg)
+{
+	struct blob_attr *tb[__GETPARAMVALUES_MAX];
+
+	blobmsg_parse(getParamValues_policy, ARRAY_SIZE(getParamValues_policy), tb,
+		      blob_data(msg), blob_len(msg));
+
+	if (!tb[GETPARAMVALUES_PARAM])
+		return UBUS_STATUS_INVALID_ARGUMENT;
+
+
+	freecwmp_log_message(NAME, L_NOTICE,
+			     "triggered ubus GetParameterValues parameter %s\n",
+			     blobmsg_data(tb[GETPARAMVALUES_PARAM]));
+
+
+	external_add_list_paramameter(blobmsg_data(tb[GETPARAMVALUES_PARAM]),
+			tb[GETPARAMVALUES_VALUE]? blobmsg_data(tb[GETPARAMVALUES_VALUE]) : NULL,
+			tb[GETPARAMVALUES_TYPE]? blobmsg_data(tb[GETPARAMVALUES_TYPE]) : "xsd:string",
+			tb[GETPARAMVALUES_FAULT]? blobmsg_data(tb[GETPARAMVALUES_FAULT]) : NULL);
+
+	return 0;
+}
+
+static enum getParamNames {
+	GETPARAMNAMES_PARAM,
+	GETPARAMNAMES_WRITABLE,
+	GETPARAMNAMES_FAULT,
+	__GETPARAMNAMES_MAX
+};
+
+static const struct blobmsg_policy getParamNames_policy[] = {
+	[GETPARAMNAMES_PARAM] = { .name = "parameter", .type = BLOBMSG_TYPE_STRING },
+	[GETPARAMNAMES_WRITABLE] = { .name = "writable", .type = BLOBMSG_TYPE_STRING },
+	[GETPARAMNAMES_FAULT] = { .name = "fault_code", .type = BLOBMSG_TYPE_STRING },
+};
+
+static int
+freecwmpd_handle_getParamNames(struct ubus_context *ctx, struct ubus_object *obj,
+			struct ubus_request_data *req, const char *method,
+			struct blob_attr *msg)
+{
+	struct blob_attr *tb[__GETPARAMNAMES_MAX];
+
+	blobmsg_parse(getParamNames_policy, ARRAY_SIZE(getParamNames_policy), tb,
+		      blob_data(msg), blob_len(msg));
+
+	if (!tb[GETPARAMNAMES_PARAM])
+		return UBUS_STATUS_INVALID_ARGUMENT;
+
+
+	freecwmp_log_message(NAME, L_NOTICE,
+			     "triggered ubus GetParameterNames parameter %s\n",
+			     blobmsg_data(tb[GETPARAMNAMES_PARAM]));
+
+
+	external_add_list_paramameter(blobmsg_data(tb[GETPARAMNAMES_PARAM]),
+			tb[GETPARAMNAMES_WRITABLE]? blobmsg_data(tb[GETPARAMNAMES_WRITABLE]) : NULL,
+			NULL,
+			tb[GETPARAMNAMES_FAULT]? blobmsg_data(tb[GETPARAMNAMES_FAULT]) : NULL);
+
+	return 0;
+}
+
+static enum getParamAttributes {
+	GETPARAMATTRIBUTES_PARAM,
+	GETPARAMATTRIBUTES_NOTIF,
+	GETPARAMATTRIBUTES_FAULT,
+	__GETPARAMATTRIBUTES_MAX
+};
+
+static const struct blobmsg_policy getParamAttributes_policy[] = {
+	[GETPARAMATTRIBUTES_PARAM] = { .name = "parameter", .type = BLOBMSG_TYPE_STRING },
+	[GETPARAMATTRIBUTES_NOTIF] = { .name = "notification", .type = BLOBMSG_TYPE_STRING },
+	[GETPARAMATTRIBUTES_FAULT] = { .name = "fault_code", .type = BLOBMSG_TYPE_STRING },
+};
+
+static int
+freecwmpd_handle_getParamAttributes(struct ubus_context *ctx, struct ubus_object *obj,
+			struct ubus_request_data *req, const char *method,
+			struct blob_attr *msg)
+{
+	struct blob_attr *tb[__GETPARAMATTRIBUTES_MAX];
+
+	blobmsg_parse(getParamAttributes_policy, ARRAY_SIZE(getParamAttributes_policy), tb,
+		      blob_data(msg), blob_len(msg));
+
+	if (!tb[GETPARAMATTRIBUTES_PARAM])
+		return UBUS_STATUS_INVALID_ARGUMENT;
+
+	if (!tb[GETPARAMATTRIBUTES_NOTIF])
+		return UBUS_STATUS_INVALID_ARGUMENT;
+
+	freecwmp_log_message(NAME, L_NOTICE,
+			     "triggered ubus GetParameterAttributes parameter %s\n",
+			     blobmsg_data(tb[GETPARAMATTRIBUTES_PARAM]));
+
+	external_add_list_paramameter(blobmsg_data(tb[GETPARAMATTRIBUTES_PARAM]),
+				      blobmsg_data(tb[GETPARAMATTRIBUTES_NOTIF]),
+				      NULL,
+				      blobmsg_data(tb[GETPARAMATTRIBUTES_FAULT]));
+
+	return 0;
+}
+
 static const struct ubus_method freecwmp_methods[] = {
 	UBUS_METHOD("notify", freecwmpd_handle_notify, notify_policy),
 	UBUS_METHOD("inform", freecwmpd_handle_inform, inform_policy),
+	UBUS_METHOD("GetParameterValues", freecwmpd_handle_getParamValues, getParamValues_policy),
+	UBUS_METHOD("GetParameterNames", freecwmpd_handle_getParamNames, getParamNames_policy),
+	UBUS_METHOD("GetParameterAttributes", freecwmpd_handle_getParamAttributes, getParamAttributes_policy),
 	{ .name = "reload", .handler = freecwmpd_handle_reload },
 };
 
diff --git a/src/xml.c b/src/xml.c
index 22cfbcd..000f216 100644
--- a/src/xml.c
+++ b/src/xml.c
@@ -21,6 +21,8 @@
 #include "messages.h"
 #include "time.h"
 
+extern struct list_head external_list_parameter;
+
 struct rpc_method {
 	const char *name;
 	int (*handler)(mxml_node_t *body_in, mxml_node_t *tree_in,
@@ -49,6 +51,7 @@ static struct cwmp_namespaces
 const struct rpc_method rpc_methods[] = {
 	{ "SetParameterValues", xml_handle_set_parameter_values },
 	{ "GetParameterValues", xml_handle_get_parameter_values },
+	{ "GetParameterNames", xml_handle_get_parameter_names },
 	{ "SetParameterAttributes", xml_handle_set_parameter_attributes },
 	{ "Download", xml_handle_download },
 	{ "FactoryReset", xml_handle_factory_reset },
@@ -217,6 +220,7 @@ int xml_prepare_inform_message(char **msg_out)
 {
 	mxml_node_t *tree, *b;
 	char *c, *tmp;
+	struct external_parameter *external_parameter;
 
 #ifdef DUMMY_MODE
 	FILE *fp;
@@ -335,37 +339,33 @@ int xml_prepare_inform_message(char **msg_out)
 	if (mxmlGetType(b) != MXML_ELEMENT)
 		goto error;
 
-	tmp = "InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANIPConnection.1.ExternalIPAddress";
-	b = mxmlFindElementText(tree, tree, tmp, MXML_DESCEND);
-	if (!b) goto error;
-
-	b = b->parent->next->next;
-	if (mxmlGetType(b) != MXML_ELEMENT)
+	external_get_action_write("value","InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANIPConnection.1.ExternalIPAddress", NULL);
+	external_get_action_write("value","InternetGatewayDevice.ManagementServer.ConnectionRequestURL", NULL);
+	if (external_get_action_execute())
 		goto error;
 
-	c = NULL;
-	if (external_get_action("value", tmp, &c)) goto error;
-	if (c) {
-		b = mxmlNewText(b, 0, c);
-		FREE(c);
-		if (!b) goto error;
-	}
-
-	tmp = "InternetGatewayDevice.ManagementServer.ConnectionRequestURL";
-	b = mxmlFindElementText(tree, tree, tmp, MXML_DESCEND);
-	if (!b) goto error;
+	while (external_list_parameter.next!=&external_list_parameter)
+	{
+		external_parameter = list_entry(external_list_parameter.next, struct external_parameter, list);
+		b = mxmlFindElementText(tree, tree, external_parameter->name, MXML_DESCEND);
+		if (!b) continue;
 
 	b = b->parent->next->next;
 	if (mxmlGetType(b) != MXML_ELEMENT)
 		goto error;
 
-	c = NULL;
-	if (external_get_action("value", tmp, &c)) goto error;
-	if (c) {
-		b = mxmlNewText(b, 0, c);
-		FREE(c);
+		if (external_parameter->data) {
+			b = mxmlNewText(b, 0, external_parameter->data);
 		if (!b) goto error;
 	}
+		list_del(&external_parameter->list);
+		CFREE(external_parameter->name);
+		CFREE(external_parameter->data);
+		CFREE(external_parameter->type);
+		CFREE(external_parameter->fault_code);
+		CFREE(external_parameter);
+	}
+
 
 	if (xml_prepare_notifications_inform(tree))
 		goto error;
@@ -376,6 +376,7 @@ int xml_prepare_inform_message(char **msg_out)
 	return 0;
 
 error:
+	external_free_list_parameter();
 	mxmlDelete(tree);
 	return -1;
 }
@@ -628,10 +629,11 @@ int xml_handle_get_parameter_values(mxml_node_t *body_in,
 				    mxml_node_t *tree_in,
 				    mxml_node_t *tree_out)
 {
-	mxml_node_t *n, *b = body_in;
+	mxml_node_t *n, *ParameterList, *b = body_in;
+	struct external_parameter *external_parameter;
 	char *parameter_name = NULL;
 	char *parameter_value = NULL;
-	char *c;
+	char *c = NULL;
 	int counter = 0;
 
 	n = mxmlFindElement(tree_out, tree_out, "soap_env:Body",
@@ -655,29 +657,44 @@ int xml_handle_get_parameter_values(mxml_node_t *body_in,
 		    !strcmp(b->parent->value.element.name, "string")) {
 			parameter_name = b->value.text.string;
 		}
-
+		if (b && b->type == MXML_ELEMENT && /* added in order to support GetParameterValues with empty string*/
+			!strcmp(b->value.element.name, "string") &&
+			!b->child) {
+			parameter_name = "";
+		}
 		if (parameter_name) {
 			if (!config_get_cwmp(parameter_name, &parameter_value)) {
+				external_add_list_paramameter(parameter_name,parameter_value,"xsd:string",NULL);
+				FREE(parameter_value);
 				// got the parameter value using libuci
-			} else if (!external_get_action("value",
-					parameter_name, &parameter_value)) {
+			} else if (!external_get_action_write("value",parameter_name, NULL)) {
 				// got the parameter value via external script
 			} else {
 				// error occurred when getting parameter value
 				goto out;
 			}
-			counter++;
+		}
+		b = mxmlWalkNext(b, body_in, MXML_DESCEND);
+		parameter_name = NULL;
+	}
 
-			n = mxmlFindElement(tree_out, tree_out, "ParameterList", NULL, NULL, MXML_DESCEND);
-			if (!n) goto out;
+	if (external_get_action_execute())
+		goto out;
 
-			n = mxmlNewElement(n, "ParameterValueStruct");
+	ParameterList = mxmlFindElement(tree_out, tree_out, "ParameterList", NULL, NULL, MXML_DESCEND);
+	if (!ParameterList) goto out;
+
+	while (external_list_parameter.next!=&external_list_parameter) {
+
+		external_parameter = list_entry(external_list_parameter.next, struct external_parameter, list);
+
+		n = mxmlNewElement(ParameterList, "ParameterValueStruct");
 			if (!n) goto out;
 
 			n = mxmlNewElement(n, "Name");
 			if (!n) goto out;
 
-			n = mxmlNewText(n, 0, parameter_name);
+		n = mxmlNewText(n, 0, external_parameter->name);
 			if (!n) goto out;
 
 			n = n->parent->parent;
@@ -685,42 +702,144 @@ int xml_handle_get_parameter_values(mxml_node_t *body_in,
 			if (!n) goto out;
 
 #ifdef ACS_MULTI
-			mxmlElementSetAttr(n, "xsi:type", "xsd:string");
+		mxmlElementSetAttr(n, "xsi:type", external_parameter->type);
 #endif
-			n = mxmlNewText(n, 0, parameter_value ? parameter_value : "");
+		n = mxmlNewText(n, 0, external_parameter->data? external_parameter->data : "");
 			if (!n) goto out;
 
-			/*
-			 * three day's work to finally find memory leak if we
-			 * free parameter_name;
-			 * it points to: b->value.text.string
-			 *
-			 * also, parameter_value can be NULL so we don't do checks
-			 */
-			parameter_name = NULL;
+		counter++;
+		
+		list_del(&external_parameter->list);
+		CFREE(external_parameter->name);
+		CFREE(external_parameter->data);
+		CFREE(external_parameter->type);
+		CFREE(external_parameter->fault_code);
+		CFREE(external_parameter);
+	}
+#ifdef ACS_MULTI
+	b = mxmlFindElement(tree_out, tree_out, "ParameterList", 
+			    NULL, NULL, MXML_DESCEND);
+	if (!b) goto out;
+
+	if (asprintf(&c, "cwmp:ParameterValueStruct[%d]", counter) == -1)
+		goto out;
+
+	mxmlElementSetAttr(b, "soap_enc:arrayType", c);
+	FREE(c);
+#endif
+
+	return 0;
+
+out:
+	external_free_list_parameter();
+	return -1;
 		}
 		
-		FREE(parameter_value);
+int xml_handle_get_parameter_names(mxml_node_t *body_in,
+				    mxml_node_t *tree_in,
+				    mxml_node_t *tree_out)
+{
+	mxml_node_t *n, *ParameterList, *b = body_in;
+	struct external_parameter *external_parameter;
+	char *parameter_name = NULL;
+	char *NextLevel = NULL;
+	char *c;
+	int counter = 0;
+
+	n = mxmlFindElement(tree_out, tree_out, "soap_env:Body",
+			    NULL, NULL, MXML_DESCEND);
+	if (!n) return -1;
+
+	n = mxmlNewElement(n, "cwmp:GetParameterNamesResponse");
+	if (!n) return -1;
+
+	n = mxmlNewElement(n, "ParameterList");
+	if (!n) return -1;
+
+#ifdef ACS_MULTI
+	mxmlElementSetAttr(n, "xsi:type", "soap_enc:Array");
+#endif
+
+	while (b) {
+		if (b && b->type == MXML_TEXT &&
+			b->value.text.string &&
+			b->parent->type == MXML_ELEMENT &&
+			!strcmp(b->parent->value.element.name, "ParameterPath")) {
+			parameter_name = b->value.text.string;
+		}
+		if (b && b->type == MXML_ELEMENT && /* added in order to support GetParameterNames with empty ParameterPath*/
+			!strcmp(b->value.element.name, "ParameterPath") &&
+			!b->child) {
+			parameter_name = "";
+		}
+		if (b && b->type == MXML_TEXT &&
+			b->value.text.string &&
+			b->parent->type == MXML_ELEMENT &&
+			!strcmp(b->parent->value.element.name, "NextLevel")) {
+			NextLevel = b->value.text.string;
+		}
 		b = mxmlWalkNext(b, body_in, MXML_DESCEND);
 	}
+	if (parameter_name && NextLevel) {
+		if (!external_get_action_common("name", parameter_name, NextLevel)) {
+			// got the parameter value via external script
+		} else {
+			// error occurred when getting parameter value
+			goto out;
+		}
+	}
+
+
+	ParameterList = mxmlFindElement(tree_out, tree_out, "ParameterList", NULL, NULL, MXML_DESCEND);
+	if (!ParameterList) goto out;
+
+	while (external_list_parameter.next!=&external_list_parameter) {
+
+		external_parameter = list_entry(external_list_parameter.next, struct external_parameter, list);
+
+
+		n = mxmlNewElement(ParameterList, "ParameterInfoStruct");
+		if (!n) goto out;
+
+		n = mxmlNewElement(n, "Name");
+		if (!n) goto out;
+
+		n = mxmlNewText(n, 0, external_parameter->name);
+		if (!n) goto out;
+
+		n = n->parent->parent;
+		n = mxmlNewElement(n, "Writable");
+		if (!n) goto out;
+
+		n = mxmlNewText(n, 0, external_parameter->data);
+		if (!n) goto out;
+
+		counter++;
+
+		list_del(&external_parameter->list);
+		CFREE(external_parameter->name);
+		CFREE(external_parameter->data);
+		CFREE(external_parameter->type);
+		CFREE(external_parameter->fault_code);
+		CFREE(external_parameter);
+	}
 
 #ifdef ACS_MULTI
 	b = mxmlFindElement(tree_out, tree_out, "ParameterList", 
 			    NULL, NULL, MXML_DESCEND);
 	if (!b) goto out;
 
-	if (asprintf(&c, "cwmp:ParameterValueStruct[%d]", counter) == -1)
+	if (asprintf(&c, "cwmp:ParameterInfoStruct[%d]", counter) == -1)
 		goto out;
 
 	mxmlElementSetAttr(b, "soap_enc:arrayType", c);
 	FREE(c);
 #endif
 
-	FREE(parameter_value);
 	return 0;
 
 out:
-	FREE(parameter_value);
+	external_free_list_parameter();
 	return -1;
 }
 
diff --git a/src/xml.h b/src/xml.h
index 8f63192..a9191eb 100644
--- a/src/xml.h
+++ b/src/xml.h
@@ -26,6 +26,10 @@ static int xml_handle_get_parameter_values(mxml_node_t *body_in,
 					   mxml_node_t *tree_in,
 					   mxml_node_t *tree_out);
 
+static int xml_handle_get_parameter_names(mxml_node_t *body_in,
+					   mxml_node_t *tree_in,
+					   mxml_node_t *tree_out);
+
 static int xml_handle_set_parameter_attributes(mxml_node_t *body_in,
 					       mxml_node_t *tree_in,
 					       mxml_node_t *tree_out);
-- 
1.7.4.1


--------------000002090002030008060608--

From jonas.gorski@gmail.com Fri Nov 16 19:20:15 2012
Received: with ECARTIS (v1.0.0; list freecwmp); Fri, 16 Nov 2012 19:20:16 +0100 (CET)
Received: from mail-ob0-f177.google.com ([209.85.214.177]:47897 "EHLO
        mail-ob0-f177.google.com" rhost-flags-OK-OK-OK-OK)
        by eddie.linux-mips.org with ESMTP id S6825953Ab2KPSUPHFM52 (ORCPT
        <rfc822;freecwmp@linux-mips.org>); Fri, 16 Nov 2012 19:20:15 +0100
Received: by mail-ob0-f177.google.com with SMTP id eh20so2949662obb.36
        for <freecwmp@linux-mips.org>; Fri, 16 Nov 2012 10:20:08 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=gmail.com; s=20120113;
        h=mime-version:in-reply-to:references:from:date:message-id:subject:to
         :cc:content-type;
        bh=d49t46y8TjdeZ+DIS9eCqY45h7jHXgVD5HKWy7Dxy3Y=;
        b=m7RvHtv5cbTpQHafqs4Zm5ATkDJYx7oZMfX64w7l9hNenQBNZmaJSv6vzEomCVi7km
         62UJsIhjDtZ4NuwINlFgAvc5L7Msz7tsTtjPEn8TY2UWbry3r1GjZyjaxs+gcGOle2on
         XyCD0KzhC0e5DkU0yiuYHjm0Us8I2IXlR7hijkOweSoXsxe8W8ripnOdoDYETEuA0dW8
         jzkqVppCa0p3zd+AqqN8voEGu/Oxant0u33Xkrw/D78QDSK38oi2HYbxxPr2v9TnnJHL
         Bpc9HWk9A1V6dkD+911aGA4an8cEpD+4dANPmwNx0vfZ30wd7k55EZP+BGmdJA1XyOKz
         4qrw==
Received: by 10.182.23.79 with SMTP id k15mr4567870obf.100.1353090008511; Fri,
 16 Nov 2012 10:20:08 -0800 (PST)
MIME-Version: 1.0
Received: by 10.76.28.70 with HTTP; Fri, 16 Nov 2012 10:19:47 -0800 (PST)
In-Reply-To: <50A676F4.8080708@pivasoftware.com>
References: <508E5D2B.6050508@pivasoftware.com> <50A676F4.8080708@pivasoftware.com>
From:   Jonas Gorski <jonas.gorski@gmail.com>
Date:   Fri, 16 Nov 2012 19:19:47 +0100
Message-ID: <CAOiHx==qi9w3a3Rj6JyLY9Np+uju=LR=AUi9OqhGTj-=6bG0bQ@mail.gmail.com>
Subject: Re: NEW PATCH for data model
To:     KALLEL Mohamed <mohamed.kallel@pivasoftware.com>
Cc:     freecwmp@linux-mips.org
Content-Type: text/plain; charset=UTF-8
Return-Path: <jonas.gorski@gmail.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s freecwmp"> (uid 0)
X-Orcpt: rfc822;freecwmp@linux-mips.org
Original-Recipient: rfc822;freecwmp@linux-mips.org
X-archive-position: 69
X-ecartis-version: Ecartis v1.0.0
Sender: freecwmp-bounce@linux-mips.org
Errors-to: freecwmp-bounce@linux-mips.org
X-original-sender: jonas.gorski@gmail.com
Precedence: bulk
X-list: freecwmp

Hi Mohamed,

On 16 November 2012 18:25, KALLEL Mohamed
<mohamed.kallel@pivasoftware.com> wrote:
> Hi Luka
> please find attached a new patch.
>  This patch contains:
> - Support for GetParameterName method.
> - The communication from external script to core is replaced by ubus.
> - Update GetParameterValue method in order to support many parameter names
> and in order to support parameter type.
> - Update GetParameterNames related scripts

These are four different things, your patch should only contain one.
Please split this into smaller, easier to review patches. You are also
missing your Signed-off-by.

Regards
Jonas

From freecwmp@lukaperkov.net Mon Nov 19 01:39:37 2012
Received: with ECARTIS (v1.0.0; list freecwmp); Mon, 19 Nov 2012 01:39:38 +0100 (CET)
Received: from mail-bk0-f49.google.com ([209.85.214.49]:53478 "EHLO
        mail-bk0-f49.google.com" rhost-flags-OK-OK-OK-OK)
        by eddie.linux-mips.org with ESMTP id S6823732Ab2KSAjhoWjUi (ORCPT
        <rfc822;freecwmp@linux-mips.org>); Mon, 19 Nov 2012 01:39:37 +0100
Received: by mail-bk0-f49.google.com with SMTP id jm19so470086bkc.36
        for <freecwmp@linux-mips.org>; Sun, 18 Nov 2012 16:39:32 -0800 (PST)
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=google.com; s=20120113;
        h=date:from:to:cc:subject:message-id:mail-followup-to:references
         :mime-version:content-type:content-disposition:in-reply-to
         :user-agent:x-gm-message-state;
        bh=5+cmrZH57IBrMfyapK0U6YLuuyGdmiSloZdnLPPo7Uw=;
        b=pM/KT6Iv+AlBDbsilweX/GNvaXFu+n82UtkROxllRQhPq9KBZYQ1JppkNOX1stkq8n
         9fY5PJ8XvMGY89kK7gWFRY5dPs+IWrzeYjn9nnFGT4lC1IDVL1GhVfkq4zD1C3fTRxis
         2irWGM9GKEB5PqQI4NsW5JV07GI1vYHwkW/Thsnx5tdoAzcdW/IA5xX0XL0SYXBMVtxQ
         i4lunJFE2b6dTLu140l1+3Bhi+vaN+nVbwQBbS8hCMZJUapfOV6i9FkZrzmVx16LlWKY
         McUG+CgFySXm7wyOTmrofvC3Gc2y8uKYiqzp4J1SQ0IIVf1L0NttuBCSbKZ6sWBzegua
         zCyA==
Received: by 10.204.8.67 with SMTP id g3mr4222693bkg.107.1353285572041;
        Sun, 18 Nov 2012 16:39:32 -0800 (PST)
Received: from w500.lan (213-191-157-161.dhcp.iskon.hr. [213.191.157.161])
        by mx.google.com with ESMTPS id t11sm3322523bkv.11.2012.11.18.16.39.30
        (version=SSLv3 cipher=OTHER);
        Sun, 18 Nov 2012 16:39:31 -0800 (PST)
Date:   Mon, 19 Nov 2012 01:39:30 +0100
From:   Luka Perkov <freecwmp@lukaperkov.net>
To:     Rajsek Miroslav <miroslav.rajsek@innbox.net>
Cc:     "freecwmp@linux-mips.org" <freecwmp@linux-mips.org>
Subject: Re: Patch for two memleaks in connection request scenario
Message-ID: <20121119003930-14198@mutt-kz>
Mail-Followup-To: Rajsek Miroslav <miroslav.rajsek@innbox.net>,
        "freecwmp@linux-mips.org" <freecwmp@linux-mips.org>
References: <96728A6499D0F74397BCA42A8B9F7215373E11414A@NTMAILKR.iskratel.si>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <96728A6499D0F74397BCA42A8B9F7215373E11414A@NTMAILKR.iskratel.si>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Gm-Message-State: ALoCoQmK4tazQl+aayebG33I5OcoHd04eWg/3TY+YUN8bhHpGWm1mxnemrvqy9DJuDIq+YvRyXKw
Return-Path: <freecwmp@lukaperkov.net>
X-Envelope-To: <"|/home/ecartis/ecartis -s freecwmp"> (uid 0)
X-Orcpt: rfc822;freecwmp@linux-mips.org
Original-Recipient: rfc822;freecwmp@linux-mips.org
X-archive-position: 70
X-ecartis-version: Ecartis v1.0.0
Sender: freecwmp-bounce@linux-mips.org
Errors-to: freecwmp-bounce@linux-mips.org
X-original-sender: freecwmp@lukaperkov.net
Precedence: bulk
X-list: freecwmp

Hi Miroslav,

On Fri, Nov 16, 2012 at 01:56:10PM +0100, Rajsek Miroslav wrote:
> My name is Miroslav Rajsek, I am from Slovenia, working for a CPE manufacturer.
> I am responsible for TR-069, so I am following freecwmp project more or less intensively for about two or three months. I am subscribed at #freecwmp IRC, my nickname is rajsek.
> I am using Motive HDM and NetMania AcsLite TR-069 ACSs in my test environment, OpenACS from time to time. 

Good to know. Welcome aboard :)
 
> I am testing freecwmp-curl in development environment on my ubuntu desktop. I have also ported freecwmp-curl to one of our CPE under development, based on PowerPC and using openwrt. 
> Today I was running freecwmp with valgrind on my ubuntu and noticed two small memory leaks in scenario when connection request was sent from ACS.  As far as fetching latest commits it seems to me a fix has not been provided yet. However it could be the thing is already known to you.
> 
> So I have a patch proposal below. Note that this is my very first patch. Please can you check it, I am glad if you find it useful. 

Thank you. I have applied this.

Please next time when sending a patch add a "Signed-off-by" line.

Regards,
Luka

From freecwmp@lukaperkov.net Mon Nov 19 01:40:32 2012
Received: with ECARTIS (v1.0.0; list freecwmp); Mon, 19 Nov 2012 01:40:33 +0100 (CET)
Received: from mail-bk0-f49.google.com ([209.85.214.49]:50298 "EHLO
        mail-bk0-f49.google.com" rhost-flags-OK-OK-OK-OK)
        by eddie.linux-mips.org with ESMTP id S6823732Ab2KSAkc1viWq (ORCPT
        <rfc822;freecwmp@linux-mips.org>); Mon, 19 Nov 2012 01:40:32 +0100
Received: by mail-bk0-f49.google.com with SMTP id jm19so470162bkc.36
        for <freecwmp@linux-mips.org>; Sun, 18 Nov 2012 16:40:27 -0800 (PST)
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=google.com; s=20120113;
        h=date:from:to:cc:subject:message-id:mail-followup-to:references
         :mime-version:content-type:content-disposition:in-reply-to
         :user-agent:x-gm-message-state;
        bh=uu2wZALRmf+13E7V6/4xkRNk6xv7PE+5tcF5Uxkpw+s=;
        b=j1nXN0FBVqSgCk0nAAdAK9lLL4vkuL9C3tYxjcvJs9f/bPI+QLACum8MSB7JfxSkjB
         mdQv8EBMBNI/hH4ZuYwOgki92a5F6Esdu9Pl78UVgZItUBjCwIEbQHw6YU6WKaOrm0Y1
         t15wfj4WVWbVYAxr9LG7FQUqGC8WN0gImL4sGRh9Is68RyY3jY6HVwPJVMvzVfcJP1J7
         D1g6lTTkf2ZGCU0ynh/fdGtrTp1EbowKKKVWqTmPRFvW+4A1kWXrmlWcZ6+rsddomgkv
         4CU/d51/IhbYl+RRq/g6Szx/yVAukVdyAHOdBIt7hZQxoVYnDByAXpQYMJqP4CD9UHuH
         h7Xg==
Received: by 10.205.130.9 with SMTP id hk9mr4340419bkc.52.1353285627019;
        Sun, 18 Nov 2012 16:40:27 -0800 (PST)
Received: from w500.lan (213-191-157-161.dhcp.iskon.hr. [213.191.157.161])
        by mx.google.com with ESMTPS id ht18sm3353733bkc.14.2012.11.18.16.40.26
        (version=SSLv3 cipher=OTHER);
        Sun, 18 Nov 2012 16:40:26 -0800 (PST)
Date:   Mon, 19 Nov 2012 01:40:26 +0100
From:   Luka Perkov <freecwmp@lukaperkov.net>
To:     Jonas Gorski <jonas.gorski@gmail.com>
Cc:     freecwmp@linux-mips.org
Subject: Re: [PATCH] fix "method not implemented" error generation
Message-ID: <20121119004025-14198@mutt-kz>
Mail-Followup-To: Jonas Gorski <jonas.gorski@gmail.com>,
        freecwmp@linux-mips.org
References: <1352139066-26827-1-git-send-email-jonas.gorski@gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1352139066-26827-1-git-send-email-jonas.gorski@gmail.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Gm-Message-State: ALoCoQn/KRvJ8VoHpu1TSTV7adfP3fA13bWhrDpsFYZp1RwwuwCTr4GBssfVvHJhOhXTlH/kOisB
Return-Path: <freecwmp@lukaperkov.net>
X-Envelope-To: <"|/home/ecartis/ecartis -s freecwmp"> (uid 0)
X-Orcpt: rfc822;freecwmp@linux-mips.org
Original-Recipient: rfc822;freecwmp@linux-mips.org
X-archive-position: 71
X-ecartis-version: Ecartis v1.0.0
Sender: freecwmp-bounce@linux-mips.org
Errors-to: freecwmp-bounce@linux-mips.org
X-original-sender: freecwmp@lukaperkov.net
Precedence: bulk
X-list: freecwmp

On Mon, Nov 05, 2012 at 07:11:06PM +0100, Jonas Gorski wrote:
> The check for error message generation success was inverted, causing
> the "method not implemented" errors not being sent and freecwmp thought
> parsing failed.

Applied. Thank you.

Luka

From mohamed.kallel@pivasoftware.com Mon Nov 19 17:15:42 2012
Received: with ECARTIS (v1.0.0; list freecwmp); Mon, 19 Nov 2012 17:15:47 +0100 (CET)
Received: from moutng.kundenserver.de ([212.227.17.8]:62139 "EHLO
        moutng.kundenserver.de" rhost-flags-OK-OK-OK-OK)
        by eddie.linux-mips.org with ESMTP id S6824766Ab2KSQPmbrDqj (ORCPT
        <rfc822;freecwmp@linux-mips.org>); Mon, 19 Nov 2012 17:15:42 +0100
Received: from [127.0.0.1] ([41.230.28.107])
        by mrelayeu.kundenserver.de (node=mreu0) with ESMTP (Nemesis)
        id 0M5L11-1TLxCU2IuN-00zP3O; Mon, 19 Nov 2012 17:15:36 +0100
Message-ID: <50AA5B24.305@pivasoftware.com>
Date:   Mon, 19 Nov 2012 17:15:32 +0100
From:   KALLEL Mohamed <mohamed.kallel@pivasoftware.com>
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:16.0) Gecko/20121026 Thunderbird/16.0.2
MIME-Version: 1.0
To:     Jonas Gorski <jonas.gorski@gmail.com>
CC:     freecwmp@linux-mips.org
Subject: Re: NEW PATCH for data model
References: <508E5D2B.6050508@pivasoftware.com> <50A676F4.8080708@pivasoftware.com> <CAOiHx==qi9w3a3Rj6JyLY9Np+uju=LR=AUi9OqhGTj-=6bG0bQ@mail.gmail.com>
In-Reply-To: <CAOiHx==qi9w3a3Rj6JyLY9Np+uju=LR=AUi9OqhGTj-=6bG0bQ@mail.gmail.com>
Content-Type: multipart/mixed;
 boundary="------------090909030309040801070705"
X-Provags-ID: V02:K0:tKMQZy74Zs9Sl7FncOkgoaMozacL0KqsDoc+1PDnmK8
 QiwEoldvAShtS+EK7/K0+wDjGhDn1y/ckntCsB4IZPOc3vNST7
 BQ29T6ays7VIHYx7nB6UI38mgumrEgr0GO6vWPQF1sH4j44C5r
 AZqhDFy0m9U6AcoyLW5119AFL+dETS396FeVKrElp1ftoc95TG
 I2RG2gV+n3uz8MtX3CvU1bNVREiKP/uABKgvvHhSx/8Ys+hsGm
 JcahPARJ+lUz+QhnG6ekuqasOKB3tzvFrYHR5e5xM03Gs4zUUK
 Tq/3dU37KWm/huexPfARPOS00VCHJ+/+vutQWMA0LqQQDrFpKy
 G4mmu2CTWg2tBtBeyHzu3dlyXD801VdR5SSHZv11x
Return-Path: <mohamed.kallel@pivasoftware.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s freecwmp"> (uid 0)
X-Orcpt: rfc822;freecwmp@linux-mips.org
Original-Recipient: rfc822;freecwmp@linux-mips.org
X-archive-position: 72
X-ecartis-version: Ecartis v1.0.0
Sender: freecwmp-bounce@linux-mips.org
Errors-to: freecwmp-bounce@linux-mips.org
X-original-sender: mohamed.kallel@pivasoftware.com
Precedence: bulk
X-list: freecwmp

This is a multi-part message in MIME format.
--------------090909030309040801070705
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit

Hello

Please, Find attached the new patch file.
It contains only support  communication from script to core with C

Regards


*Mohamed KALLEL*
Baniere PIVA Software
Technical Director
*Tel :*  (+216) 74 611 029
*Fax :*  (+216) 74 612 729
http://www.pivasoftware.com

	Logo PIVA Software

  
==============================================================================
CONFIDENTIALITY NOTICE

This message and its attachments (if any) may contain confidential,
proprietary or legally privileged information and it is intended only for
the use of the addressee named above. No confidentiality or privilege
is waived or lost by any mistransmission.

If you are not the intended recipient of this message you are hereby
notified that you must not use, disseminate, copy it in any form or take
any action in reliance on it. If you have received this message in error,
please, delete it (and any copies of it) and kindly inform the sender, of this
e-mail, by replying or go to www.pivasoftware.com on "contact".
===============================================================================

Le 16/11/2012 19:19, Jonas Gorski a Ã©crit :
> Hi Mohamed,
>
> On 16 November 2012 18:25, KALLEL Mohamed
> <mohamed.kallel@pivasoftware.com> wrote:
>> Hi Luka
>> please find attached a new patch.
>>   This patch contains:
>> - Support for GetParameterName method.
>> - The communication from external script to core is replaced by ubus.
>> - Update GetParameterValue method in order to support many parameter names
>> and in order to support parameter type.
>> - Update GetParameterNames related scripts
> These are four different things, your patch should only contain one.
> Please split this into smaller, easier to review patches. You are also
> missing your Signed-off-by.
>
> Regards
> Jonas
>


--------------090909030309040801070705
Content-Type: text/plain; charset=windows-1256;
 name="0001-communication-from-external-script-to-core-with-ubus.patch"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename*0="0001-communication-from-external-script-to-core-with-ubus.pa";
 filename*1="tch"

RnJvbSBkZmU2OGM0N2VkYTMwNzc2YzQyY2U4MzMzNjQ1N2QzMWJmZGY1ODExIE1vbiBTZXAg
MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBNb2hhbWVkIDxtb2hhbWVkLmthbGxlbEBwaXZhc29m
dHdhcmUuY29tPgpEYXRlOiBNb24sIDE5IE5vdiAyMDEyIDE2OjU1OjAxICswMTAwClN1Ympl
Y3Q6IFtQQVRDSF0gVGhlIGNvbW11bmljYXRpb24gZnJvbSBleHRlcm5hbCBzY3JpcHQoc2hl
bGwpIHRvIGNvcmUgKEMpIGlzIHJlcGxhY2VkIGJ5IHVidXMuCiBDb250cmlidXRlZCBieSBJ
bnRlbm8gQnJvYWRiYW5kIFRlY2hub2xvZ3kgQUIKCgpTaWduZWQtb2ZmLWJ5OiBNb2hhbWVk
IDxtb2hhbWVkLmthbGxlbEBwaXZhc29mdHdhcmUuY29tPgotLS0KIGNvbmZpZ3VyZS5hYyAg
IHwgICAgMyArCiBzcmMvZXh0ZXJuYWwuYyB8ICAxNjcgKysrKysrKysrKysrKysrKysrKysr
KysrKysrKysrKysrKysrKysrKysrKy0tLS0tLS0tLS0tLS0KIHNyYy9leHRlcm5hbC5oIHwg
ICAxNiArKysrKwogc3JjL2ZyZWVjd21wLmMgfCAgIDE5ICsrKysrKwogc3JjL2ZyZWVjd21w
LmggfCAgICAxICsKIHNyYy91YnVzLmMgICAgIHwgIDEyNyArKysrKysrKysrKysrKysrKysr
KysrKysrKysrKysrKysrKysrKysrKysKIHNyYy94bWwuYyAgICAgIHwgIDEwNSArKysrKysr
KysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLQogNyBmaWxlcyBjaGFuZ2VkLCAzNTMgaW5z
ZXJ0aW9ucygrKSwgODUgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvY29uZmlndXJlLmFj
IGIvY29uZmlndXJlLmFjCmluZGV4IGM2NDZjM2EuLjM4ZDNkZjQgMTAwNjQ0Ci0tLSBhL2Nv
bmZpZ3VyZS5hYworKysgYi9jb25maWd1cmUuYWMKQEAgLTgwLDYgKzgwLDkgQEAgQUNfU1VC
U1QoW0xJQlVCVVNfTERGTEFHU10pCiBMSUJVQlVTX0xJQlM9Jy1sdWJ1cycKIEFDX1NVQlNU
KFtMSUJVQlVTX0xJQlNdKQogCitMSUJQVEhSRUFEX0xJQlM9Jy1scHRocmVhZCcKK0FDX1NV
QlNUKFtMSUJQVEhSRUFEX0xJQlNdKQorCiBBTV9DT05EX0lGKFtIVFRQX0NVUkxdLCBbCiAg
QUNfREVGSU5FKEhUVFBfQ1VSTCkKICBQS0dfQ0hFQ0tfTU9EVUxFUyhMSUJDVVJMLCBbbGli
Y3VybF0pCmRpZmYgLS1naXQgYS9zcmMvZXh0ZXJuYWwuYyBiL3NyYy9leHRlcm5hbC5jCmlu
ZGV4IDlhYzdiMzYuLjIyMjI2NDYgMTAwNjQ0Ci0tLSBhL3NyYy9leHRlcm5hbC5jCisrKyBi
L3NyYy9leHRlcm5hbC5jCkBAIC0yNSwxNSArMjUsNjcgQEAKICNpbmNsdWRlICJmcmVlY3dt
cC5oIgogCiBzdGF0aWMgc3RydWN0IHVsb29wX3Byb2Nlc3MgdXByb2M7CitwdGhyZWFkX3Qg
dWJ1c190aHJlYWQ7CitMSVNUX0hFQUQoZXh0ZXJuYWxfbGlzdF9wYXJhbWV0ZXIpOworCit2
b2lkICp0aHJlYWRfdWxvb3BfcnVuICh2b2lkICp2KQoreworCXVsb29wX3J1bigpOworCXJl
dHVybiBOVUxMOworfQorCit2b2lkIGV4dGVybmFsX2FkZF9saXN0X3BhcmFtYW1ldGVyKGNo
YXIgKnBhcmFtX25hbWUsIGNoYXIgKnBhcmFtX2RhdGEsIGNoYXIgKnBhcmFtX3R5cGUsIGNo
YXIgKmZhdWx0X2NvZGUpCit7CisJc3RydWN0IGV4dGVybmFsX3BhcmFtZXRlciAqZXh0ZXJu
YWxfcGFyYW1ldGVyOworCXN0cnVjdCBsaXN0X2hlYWQgKmlsaXN0OyBpbnQgaSA9MDsKKwll
eHRlcm5hbF9wYXJhbWV0ZXIgPSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBleHRlcm5hbF9w
YXJhbWV0ZXIpKTsKKwlsaXN0X2FkZF90YWlsKCZleHRlcm5hbF9wYXJhbWV0ZXItPmxpc3Qs
JmV4dGVybmFsX2xpc3RfcGFyYW1ldGVyKTsKKwlpZiAocGFyYW1fbmFtZSkgZXh0ZXJuYWxf
cGFyYW1ldGVyLT5uYW1lID0gc3RyZHVwKHBhcmFtX25hbWUpOworCWlmIChwYXJhbV9kYXRh
KSBleHRlcm5hbF9wYXJhbWV0ZXItPmRhdGEgPSBzdHJkdXAocGFyYW1fZGF0YSk7CisJaWYg
KHBhcmFtX3R5cGUpIGV4dGVybmFsX3BhcmFtZXRlci0+dHlwZSA9IHN0cmR1cChwYXJhbV90
eXBlKTsKKwlpZiAoZmF1bHRfY29kZSkgZXh0ZXJuYWxfcGFyYW1ldGVyLT5mYXVsdF9jb2Rl
ID0gc3RyZHVwKGZhdWx0X2NvZGUpOworfQorCit2b2lkIGV4dGVybmFsX2ZyZWVfbGlzdF9w
YXJhbWV0ZXIoKQoreworCXN0cnVjdCBleHRlcm5hbF9wYXJhbWV0ZXIgKmV4dGVybmFsX3Bh
cmFtZXRlcjsKKwl3aGlsZSAoZXh0ZXJuYWxfbGlzdF9wYXJhbWV0ZXIubmV4dCE9JmV4dGVy
bmFsX2xpc3RfcGFyYW1ldGVyKSB7CisJCWV4dGVybmFsX3BhcmFtZXRlciA9IGxpc3RfZW50
cnkoZXh0ZXJuYWxfbGlzdF9wYXJhbWV0ZXIubmV4dCwgc3RydWN0IGV4dGVybmFsX3BhcmFt
ZXRlciwgbGlzdCk7CisJCWxpc3RfZGVsKCZleHRlcm5hbF9wYXJhbWV0ZXItPmxpc3QpOwor
CQlDRlJFRShleHRlcm5hbF9wYXJhbWV0ZXItPm5hbWUpOworCQlDRlJFRShleHRlcm5hbF9w
YXJhbWV0ZXItPmRhdGEpOworCQlDRlJFRShleHRlcm5hbF9wYXJhbWV0ZXItPnR5cGUpOwor
CQlDRlJFRShleHRlcm5hbF9wYXJhbWV0ZXItPmZhdWx0X2NvZGUpOworCQlDRlJFRShleHRl
cm5hbF9wYXJhbWV0ZXIpOworCX0KK30KKwogCiBpbnQgZXh0ZXJuYWxfZ2V0X2FjdGlvbihj
aGFyICphY3Rpb24sIGNoYXIgKm5hbWUsIGNoYXIgKip2YWx1ZSkKIHsKKwlzdHJ1Y3QgZXh0
ZXJuYWxfcGFyYW1ldGVyICpleHRlcm5hbF9wYXJhbWV0ZXI7CisJZXh0ZXJuYWxfZ2V0X2Fj
dGlvbl9jb21tb24oYWN0aW9uLCBuYW1lLCBOVUxMKTsKKwlpZiAoZXh0ZXJuYWxfbGlzdF9w
YXJhbWV0ZXIubmV4dCE9JmV4dGVybmFsX2xpc3RfcGFyYW1ldGVyKSB7CisJCWV4dGVybmFs
X3BhcmFtZXRlciA9IGxpc3RfZW50cnkoZXh0ZXJuYWxfbGlzdF9wYXJhbWV0ZXIubmV4dCwg
c3RydWN0IGV4dGVybmFsX3BhcmFtZXRlciwgbGlzdCk7CisJCWlmIChleHRlcm5hbF9wYXJh
bWV0ZXItPmRhdGEpCisJCQkqdmFsdWUgPSBleHRlcm5hbF9wYXJhbWV0ZXItPmRhdGE7CisJ
CWxpc3RfZGVsKCZleHRlcm5hbF9wYXJhbWV0ZXItPmxpc3QpOworCQlDRlJFRShleHRlcm5h
bF9wYXJhbWV0ZXItPm5hbWUpOworCQlDRlJFRShleHRlcm5hbF9wYXJhbWV0ZXItPmRhdGEp
OworCQlDRlJFRShleHRlcm5hbF9wYXJhbWV0ZXItPnR5cGUpOworCQlDRlJFRShleHRlcm5h
bF9wYXJhbWV0ZXItPmZhdWx0X2NvZGUpOworCQlDRlJFRShleHRlcm5hbF9wYXJhbWV0ZXIp
OworCX0KKwlleHRlcm5hbF9mcmVlX2xpc3RfcGFyYW1ldGVyKCk7Cit9CisKK2ludCBleHRl
cm5hbF9nZXRfYWN0aW9uX2NvbW1vbihjaGFyICphY3Rpb24sIGNoYXIgKm5hbWUsIGNoYXIg
KmFyZyAvKiBhcmcgaXMgYWRkZWQgZm9yIEdldFBhcmFtZXRlck5hbWVzIE5leHRMZXZlbCBh
cmd1bWVudCovKQorewogCWZyZWVjd21wX2xvZ19tZXNzYWdlKE5BTUUsIExfTk9USUNFLAog
CQkJICAgICAiZXhlY3V0aW5nIGdldCAlcyAnJXMnXG4iLCBhY3Rpb24sIG5hbWUpOwogCi0J
aW50IHBmZHNbMl07Ci0JaWYgKHBpcGUocGZkcykgPCAwKQotCQlyZXR1cm4gLTE7CisKKwlw
dGhyZWFkX2NyZWF0ZSgmdWJ1c190aHJlYWQsIE5VTEwsICZ0aHJlYWRfdWxvb3BfcnVuLCBO
VUxMKTsKIAogCWlmICgodXByb2MucGlkID0gZm9yaygpKSA9PSAtMSkKIAkJZ290byBlcnJv
cjsKQEAgLTQ1LDY3ICs5NywxMDYgQEAgaW50IGV4dGVybmFsX2dldF9hY3Rpb24oY2hhciAq
YWN0aW9uLCBjaGFyICpuYW1lLCBjaGFyICoqdmFsdWUpCiAJCWludCBpID0gMDsKIAkJYXJn
dltpKytdID0gIi9iaW4vc2giOwogCQlhcmd2W2krK10gPSBmY19zY3JpcHQ7Ci0JCWFyZ3Zb
aSsrXSA9ICItLW5ld2xpbmUiOwotCQlhcmd2W2krK10gPSAiLS12YWx1ZSI7CiAJCWFyZ3Zb
aSsrXSA9ICJnZXQiOwogCQlhcmd2W2krK10gPSBhY3Rpb247CiAJCWFyZ3ZbaSsrXSA9IG5h
bWU7CisJCWlmKGFyZykgYXJndltpKytdID0gYXJnOwogCQlhcmd2W2krK10gPSBOVUxMOwog
Ci0JCWNsb3NlKHBmZHNbMF0pOwotCQlkdXAyKHBmZHNbMV0sIDEpOwotCQljbG9zZShwZmRz
WzFdKTsKLQogCQlleGVjdnAoYXJndlswXSwgKGNoYXIgKiopIGFyZ3YpOwogCQlleGl0KEVT
UkNIKTsKIAogCX0gZWxzZSBpZiAodXByb2MucGlkIDwgMCkKIAkJZ290byBlcnJvcjsKIAot
CS8qIHBhcmVudCAqLwotCWNsb3NlKHBmZHNbMV0pOwotCiAJaW50IHN0YXR1czsKIAl3aGls
ZSAod2FpdCgmc3RhdHVzKSAhPSB1cHJvYy5waWQpIHsKIAkJREQoIndhaXRpbmcgZm9yIGNo
aWxkIHRvIGV4aXQiKTsKIAl9CisJcHRocmVhZF9jYW5jZWwodWJ1c190aHJlYWQpOworCXB0
aHJlYWRfam9pbih1YnVzX3RocmVhZCxOVUxMKTsKIAotCWNoYXIgYnVmZmVyWzY0XTsKLQlz
c2l6ZV90IHJ4ZWQ7Ci0JY2hhciAqYzsKLQlpbnQgdDsKLQotCSp2YWx1ZSA9IE5VTEw7Ci0J
d2hpbGUgKChyeGVkID0gcmVhZChwZmRzWzBdLCBidWZmZXIsIHNpemVvZihidWZmZXIpKSkg
PiAwKSB7Ci0JCWlmICgqdmFsdWUpCi0JCQl0ID0gYXNwcmludGYoJmMsICIlcyUuKnMiLCAq
dmFsdWUsIChpbnQpIHJ4ZWQsIGJ1ZmZlcik7Ci0JCWVsc2UKLQkJCXQgPSBhc3ByaW50Zigm
YywgIiUuKnMiLCAoaW50KSByeGVkLCBidWZmZXIpOworCXJldHVybiAwOwogCi0JCWlmICh0
ID09IC0xKSBnb3RvIGVycm9yOworZXJyb3I6CisJcmV0dXJuIC0xOwogCi0JCWZyZWUoKnZh
bHVlKTsKLQkJKnZhbHVlID0gc3RyZHVwKGMpOwotCQlmcmVlKGMpOwogCX0KIAotCWlmICgh
c3RybGVuKCp2YWx1ZSkpIHsKLQkJRlJFRSgqdmFsdWUpOwotCQlnb3RvIGRvbmU7CitpbnQg
ZXh0ZXJuYWxfZ2V0X2FjdGlvbl93cml0ZShjaGFyICphY3Rpb24sIGNoYXIgKm5hbWUsIGNo
YXIgKmFyZykKK3sKKwlmcmVlY3dtcF9sb2dfbWVzc2FnZShOQU1FLCBMX05PVElDRSwKKwkJ
ImFkZGluZyB0byBnZXQgJXMgc2NyaXB0ICclcydcbiIsIGFjdGlvbiwgbmFtZSk7CisKKwlG
SUxFICpmcDsKKworCWlmIChhY2Nlc3MoZmNfc2NyaXB0X2dldF9hY3Rpb25zLCBSX09LIHwg
V19PSyB8IFhfT0spICE9IC0xKSB7CisJCWZwID0gZm9wZW4oZmNfc2NyaXB0X2dldF9hY3Rp
b25zLCAiYSIpOworCQlpZiAoIWZwKSByZXR1cm4gLTE7CisJfSBlbHNlIHsKKwkJZnAgPSBm
b3BlbihmY19zY3JpcHRfZ2V0X2FjdGlvbnMsICJ3Iik7CisJCWlmICghZnApIHJldHVybiAt
MTsKKworCQlmcHJpbnRmKGZwLCAiIyEvYmluL3NoXG4iKTsKKworCQlpZiAoY2htb2QoZmNf
c2NyaXB0X2dldF9hY3Rpb25zLAorCQkJc3RydG9sKCIwNzAwIiwgMCwgOCkpIDwgMCkgewor
CQkJcmV0dXJuIC0xOworCQl9CiAJfQogCi0JaWYgKHJ4ZWQgPCAwKQotCQlnb3RvIGVycm9y
OworI2lmZGVmIERVTU1ZX01PREUKKwlmcHJpbnRmKGZwLCAiL2Jpbi9zaCBgcHdkYC8lcyBn
ZXQgJXMgJXMgJXNcbiIsIGZjX3NjcmlwdCwgYWN0aW9uLCBuYW1lLCBhcmc/YXJnOiIiKTsK
KyNlbHNlCisJZnByaW50ZihmcCwgIi9iaW4vc2ggJXMgZ2V0ICVzICVzICVzXG4iLCBmY19z
Y3JpcHQsIGFjdGlvbiwgbmFtZSwgYXJnP2FyZzoiIik7CisjZW5kaWYKKworCWZjbG9zZShm
cCk7CiAKLWRvbmU6Ci0JY2xvc2UocGZkc1swXSk7CiAJcmV0dXJuIDA7Cit9CiAKLWVycm9y
OgotCUZSRUUoKmMpOwotCUZSRUUoKnZhbHVlKTsKLQljbG9zZShwZmRzWzBdKTsKK2ludCBl
eHRlcm5hbF9nZXRfYWN0aW9uX2V4ZWN1dGUoKQoreworCWZyZWVjd21wX2xvZ19tZXNzYWdl
KE5BTUUsIExfTk9USUNFLCAiZXhlY3V0aW5nIGdldCBzY3JpcHRcbiIpOworCisJcHRocmVh
ZF9jcmVhdGUoJnVidXNfdGhyZWFkLCBOVUxMLCAmdGhyZWFkX3Vsb29wX3J1biwgTlVMTCk7
CisKKwlpZiAoKHVwcm9jLnBpZCA9IGZvcmsoKSkgPT0gLTEpIHsKKwkJcmV0dXJuIC0xOwor
CX0KKworCWlmICh1cHJvYy5waWQgPT0gMCkgeworCQkvKiBjaGlsZCAqLworCisJCWNvbnN0
IGNoYXIgKmFyZ3ZbM107CisJCWludCBpID0gMDsKKwkJYXJndltpKytdID0gIi9iaW4vc2gi
OworCQlhcmd2W2krK10gPSBmY19zY3JpcHRfZ2V0X2FjdGlvbnM7CisJCWFyZ3ZbaSsrXSA9
IE5VTEw7CisKKwkJZXhlY3ZwKGFyZ3ZbMF0sIChjaGFyICoqKSBhcmd2KTsKKwkJZXhpdChF
U1JDSCk7CisKKwl9IGVsc2UgaWYgKHVwcm9jLnBpZCA8IDApCisJCXJldHVybiAtMTsKKwor
CS8qIHBhcmVudCAqLworCWludCBzdGF0dXM7CisJd2hpbGUgKHdhaXQoJnN0YXR1cykgIT0g
dXByb2MucGlkKSB7CisJCUREKCJ3YWl0aW5nIGZvciBjaGlsZCB0byBleGl0Iik7CisJfQor
CisJcHRocmVhZF9jYW5jZWwodWJ1c190aHJlYWQpOworCXB0aHJlYWRfam9pbih1YnVzX3Ro
cmVhZCxOVUxMKTsKKworCisJLy8gVE9ETzogYWRkIHNvbWUga2luZCBvZiBjaGVja3MKKwor
CWlmIChyZW1vdmUoZmNfc2NyaXB0X2dldF9hY3Rpb25zKSAhPSAwKQogCXJldHVybiAtMTsK
KworCXJldHVybiAwOwogfQogCiBpbnQgZXh0ZXJuYWxfc2V0X2FjdGlvbl93cml0ZShjaGFy
ICphY3Rpb24sIGNoYXIgKm5hbWUsIGNoYXIgKnZhbHVlKQpkaWZmIC0tZ2l0IGEvc3JjL2V4
dGVybmFsLmggYi9zcmMvZXh0ZXJuYWwuaAppbmRleCA4NjA2MjY2Li5mY2Y5ODE5IDEwMDY0
NAotLS0gYS9zcmMvZXh0ZXJuYWwuaAorKysgYi9zcmMvZXh0ZXJuYWwuaApAQCAtOSw2ICs5
LDcgQEAKIAogI2lmbmRlZiBfRlJFRUNXTVBfRVhURVJOQUxfSF9fCiAjZGVmaW5lIF9GUkVF
Q1dNUF9FWFRFUk5BTF9IX18KKyNpbmNsdWRlIDxsaWJ1Ym94L2xpc3QuaD4KIAogI2lmZGVm
IERVTU1ZX01PREUKIHN0YXRpYyBjaGFyICpmY19zY3JpcHQgPSAiLi9leHQvb3BlbndydC9z
Y3JpcHRzL2ZyZWVjd21wLnNoIjsKQEAgLTE2LDEyICsxNywyNyBAQCBzdGF0aWMgY2hhciAq
ZmNfc2NyaXB0ID0gIi4vZXh0L29wZW53cnQvc2NyaXB0cy9mcmVlY3dtcC5zaCI7CiBzdGF0
aWMgY2hhciAqZmNfc2NyaXB0ID0gIi91c3Ivc2Jpbi9mcmVlY3dtcCI7CiAjZW5kaWYKIHN0
YXRpYyBjaGFyICpmY19zY3JpcHRfc2V0X2FjdGlvbnMgPSAiL3RtcC9mcmVlY3dtcF9zZXRf
YWN0aW9uX3ZhbHVlcy5zaCI7CitzdGF0aWMgY2hhciAqZmNfc2NyaXB0X2dldF9hY3Rpb25z
ID0gIi90bXAvZnJlZWN3bXBfZ2V0X2FjdGlvbl92YWx1ZXMuc2giOworCitzdHJ1Y3QgZXh0
ZXJuYWxfcGFyYW1ldGVyIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJY2hhciAqbmFt
ZTsKKwljaGFyICpkYXRhOyAvKiBub3RpZmljYXRpb24gZm9yIEdldFBhcmFtZXRlckF0dHJp
YnV0ZTsgd3JpdGFibGUgZm9yIEdldFBhcmFtZXRlck5hbWVzOyB2YWx1ZSBmb3IgR2V0UGFy
YW1ldGVyVmFsdWVzKi8KKwljaGFyICp0eXBlOworCWNoYXIgKmZhdWx0X2NvZGU7Cit9Owor
CiAKIGludCBleHRlcm5hbF9nZXRfYWN0aW9uKGNoYXIgKmFjdGlvbiwgY2hhciAqbmFtZSwg
Y2hhciAqKnZhbHVlKTsKK2ludCBleHRlcm5hbF9nZXRfYWN0aW9uX2NvbW1vbihjaGFyICph
Y3Rpb24sIGNoYXIgKm5hbWUsIGNoYXIgKmFyZyk7CitpbnQgZXh0ZXJuYWxfZ2V0X2FjdGlv
bl93cml0ZShjaGFyICphY3Rpb24sIGNoYXIgKm5hbWUsIGNoYXIgKmFyZyk7CitpbnQgZXh0
ZXJuYWxfZ2V0X2FjdGlvbl9leGVjdXRlKCk7CiBpbnQgZXh0ZXJuYWxfc2V0X2FjdGlvbl93
cml0ZShjaGFyICphY3Rpb24sIGNoYXIgKm5hbWUsIGNoYXIgKnZhbHVlKTsKIGludCBleHRl
cm5hbF9zZXRfYWN0aW9uX2V4ZWN1dGUoKTsKIGludCBleHRlcm5hbF9zaW1wbGUoY2hhciAq
YXJnKTsKIGludCBleHRlcm5hbF9kb3dubG9hZChjaGFyICp1cmwsIGNoYXIgKnNpemUpOwor
dm9pZCBleHRlcm5hbF9hZGRfbGlzdF9wYXJhbWFtZXRlcihjaGFyICpwYXJhbV9uYW1lLCBj
aGFyICpwYXJhbV9kYXRhLCBjaGFyICpwYXJhbV90eXBlLCBjaGFyICpmYXVsdF9jb2RlKTsK
K3ZvaWQgZXh0ZXJuYWxfZnJlZV9saXN0X3BhcmFtZXRlcigpOwogCiAjZW5kaWYKIApkaWZm
IC0tZ2l0IGEvc3JjL2ZyZWVjd21wLmMgYi9zcmMvZnJlZWN3bXAuYwppbmRleCA0ZWY4Mzk1
Li43ODA4YjQzIDEwMDY0NAotLS0gYS9zcmMvZnJlZWN3bXAuYworKysgYi9zcmMvZnJlZWN3
bXAuYwpAQCAtMTgsNiArMTgsOSBAQAogI2luY2x1ZGUgPGFycGEvaW5ldC5oPgogI2luY2x1
ZGUgPGxpbnV4L25ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNp
bmNsdWRlIDxzaWduYWwuaD4KKworCiAKICNpbmNsdWRlIDxsaWJmcmVlY3dtcC5oPgogI2lu
Y2x1ZGUgPGxpYnVib3gvdWxvb3AuaD4KQEAgLTE5NCwxMSArMTk3LDI3IEBAIG5ldGxpbmtf
aW5pdCh2b2lkKQogCXJldHVybiAwOwogfQogCit2b2lkIHNpZ25hbF9raWxsX2FsbF9oYW5k
bGVyKGludCBzaWcpCit7CisgICAgIHB0aHJlYWRfZXhpdChOVUxMKTsKK30KKworCisKIGlu
dCBtYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiB7CiAJZnJlZWN3bXBfbG9nX21lc3Nh
Z2UoTkFNRSwgTF9OT1RJQ0UsICJkYWVtb24gc3RhcnRlZFxuIik7CiAKIAlib29sIGZvcmVn
cm91bmQgPSBmYWxzZTsKKwlzdHJ1Y3Qgc2lnYWN0aW9uIHNpZ2ludF9hY3Rpb247CisKKwlz
aWdpbnRfYWN0aW9uLnNhX2hhbmRsZXIgPSAmc2lnbmFsX2tpbGxfYWxsX2hhbmRsZXI7CisJ
c2lnZW1wdHlzZXQgKCZzaWdpbnRfYWN0aW9uLnNhX21hc2spOworCS8qIHJlc2V0IGhhbmRs
ZXIgaW4gY2FzZSB3aGVuIHB0aHJlYWRfY2FuY2VsIGRpZG4ndCBzdG9wCisJICAgdGhyZWFk
cyBmb3Igc29tZSByZWFzb24gKi8KKwlzaWdpbnRfYWN0aW9uLnNhX2ZsYWdzID0gU0FfUkVT
RVRIQU5EOworCXNpZ2FjdGlvbihTSUdURVJNLCAmc2lnaW50X2FjdGlvbiwgTlVMTCk7CisK
IAogCXNldGxvY2FsZShMQ19DVFlQRSwgIiIpOwogCXVtYXNrKDAwMzcpOwpkaWZmIC0tZ2l0
IGEvc3JjL2ZyZWVjd21wLmggYi9zcmMvZnJlZWN3bXAuaAppbmRleCBjYjJhNTQ4Li4yMmQy
MmNmIDEwMDY0NAotLS0gYS9zcmMvZnJlZWN3bXAuaAorKysgYi9zcmMvZnJlZWN3bXAuaApA
QCAtMTMsNiArMTMsNyBAQAogI2RlZmluZSBOQU1FCSJmcmVlY3dtcGQiCiAKICNkZWZpbmUg
RlJFRSh4KSBkbyB7IGZyZWUoeCk7IHggPSBOVUxMOyB9IHdoaWxlICgwKTsKKyNkZWZpbmUg
Q0ZSRUUoeCkgaWYgKHgpIGZyZWUoeCk7CiAKICNpZmRlZiBERUJVRwogI2RlZmluZSBEKGZv
cm1hdCwgLi4uKSBmcHJpbnRmKHN0ZGVyciwgIiVzKCVkKTogIiBmb3JtYXQsIF9fZnVuY19f
LCBfX0xJTkVfXywgIyMgX19WQV9BUkdTX18pCmRpZmYgLS1naXQgYS9zcmMvdWJ1cy5jIGIv
c3JjL3VidXMuYwppbmRleCBjMTAxNzBkLi5iMmU5NjgxIDEwMDY0NAotLS0gYS9zcmMvdWJ1
cy5jCisrKyBiL3NyYy91YnVzLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlICJjb25m
aWcuaCIKICNpbmNsdWRlICJjd21wLmgiCiAjaW5jbHVkZSAiZnJlZWN3bXAuaCIKKyNpbmNs
dWRlICJleHRlcm5hbC5oIgogCiBzdGF0aWMgc3RydWN0IHVidXNfY29udGV4dCAqY3R4ID0g
TlVMTDsKIHN0YXRpYyBzdHJ1Y3QgdWJ1c19vYmplY3QgbWFpbl9vYmplY3Q7CkBAIC0xNTcs
MTAgKzE1OCwxMzYgQEAgZnJlZWN3bXBkX2hhbmRsZV9jb21tYW5kKHN0cnVjdCB1YnVzX2Nv
bnRleHQgKmN0eCwgc3RydWN0IHVidXNfb2JqZWN0ICpvYmosCiAJcmV0dXJuIDA7CiB9CiAK
K3N0YXRpYyBlbnVtIGdldFBhcmFtVmFsdWVzIHsKKwlHRVRQQVJBTVZBTFVFU19QQVJBTSwK
KwlHRVRQQVJBTVZBTFVFU19WQUxVRSwKKwlHRVRQQVJBTVZBTFVFU19UWVBFLAorCUdFVFBB
UkFNVkFMVUVTX0ZBVUxULAorCV9fR0VUUEFSQU1WQUxVRVNfTUFYCit9OworCitzdGF0aWMg
Y29uc3Qgc3RydWN0IGJsb2Jtc2dfcG9saWN5IGdldFBhcmFtVmFsdWVzX3BvbGljeVtdID0g
eworCVtHRVRQQVJBTVZBTFVFU19QQVJBTV0gPSB7IC5uYW1lID0gInBhcmFtZXRlciIsIC50
eXBlID0gQkxPQk1TR19UWVBFX1NUUklORyB9LAorCVtHRVRQQVJBTVZBTFVFU19WQUxVRV0g
PSB7IC5uYW1lID0gInZhbHVlIiwgLnR5cGUgPSBCTE9CTVNHX1RZUEVfU1RSSU5HIH0sCisJ
W0dFVFBBUkFNVkFMVUVTX1RZUEVdID0geyAubmFtZSA9ICJ0eXBlIiwgLnR5cGUgPSBCTE9C
TVNHX1RZUEVfU1RSSU5HIH0sCisJW0dFVFBBUkFNVkFMVUVTX0ZBVUxUXSA9IHsgLm5hbWUg
PSAiZmF1bHRfY29kZSIsIC50eXBlID0gQkxPQk1TR19UWVBFX1NUUklORyB9LAorfTsKKwor
c3RhdGljIGludAorZnJlZWN3bXBkX2hhbmRsZV9nZXRQYXJhbVZhbHVlcyhzdHJ1Y3QgdWJ1
c19jb250ZXh0ICpjdHgsIHN0cnVjdCB1YnVzX29iamVjdCAqb2JqLAorCQkJc3RydWN0IHVi
dXNfcmVxdWVzdF9kYXRhICpyZXEsIGNvbnN0IGNoYXIgKm1ldGhvZCwKKwkJCXN0cnVjdCBi
bG9iX2F0dHIgKm1zZykKK3sKKwlzdHJ1Y3QgYmxvYl9hdHRyICp0YltfX0dFVFBBUkFNVkFM
VUVTX01BWF07CisKKwlibG9ibXNnX3BhcnNlKGdldFBhcmFtVmFsdWVzX3BvbGljeSwgQVJS
QVlfU0laRShnZXRQYXJhbVZhbHVlc19wb2xpY3kpLCB0YiwKKwkJICAgICAgYmxvYl9kYXRh
KG1zZyksIGJsb2JfbGVuKG1zZykpOworCisJaWYgKCF0YltHRVRQQVJBTVZBTFVFU19QQVJB
TV0pCisJCXJldHVybiBVQlVTX1NUQVRVU19JTlZBTElEX0FSR1VNRU5UOworCisKKwlmcmVl
Y3dtcF9sb2dfbWVzc2FnZShOQU1FLCBMX05PVElDRSwKKwkJCSAgICAgInRyaWdnZXJlZCB1
YnVzIEdldFBhcmFtZXRlclZhbHVlcyBwYXJhbWV0ZXIgJXNcbiIsCisJCQkgICAgIGJsb2Jt
c2dfZGF0YSh0YltHRVRQQVJBTVZBTFVFU19QQVJBTV0pKTsKKworCisJZXh0ZXJuYWxfYWRk
X2xpc3RfcGFyYW1hbWV0ZXIoYmxvYm1zZ19kYXRhKHRiW0dFVFBBUkFNVkFMVUVTX1BBUkFN
XSksCisJCQl0YltHRVRQQVJBTVZBTFVFU19WQUxVRV0/IGJsb2Jtc2dfZGF0YSh0YltHRVRQ
QVJBTVZBTFVFU19WQUxVRV0pIDogTlVMTCwKKwkJCXRiW0dFVFBBUkFNVkFMVUVTX1RZUEVd
PyBibG9ibXNnX2RhdGEodGJbR0VUUEFSQU1WQUxVRVNfVFlQRV0pIDogInhzZDpzdHJpbmci
LAorCQkJdGJbR0VUUEFSQU1WQUxVRVNfRkFVTFRdPyBibG9ibXNnX2RhdGEodGJbR0VUUEFS
QU1WQUxVRVNfRkFVTFRdKSA6IE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBl
bnVtIGdldFBhcmFtTmFtZXMgeworCUdFVFBBUkFNTkFNRVNfUEFSQU0sCisJR0VUUEFSQU1O
QU1FU19XUklUQUJMRSwKKwlHRVRQQVJBTU5BTUVTX0ZBVUxULAorCV9fR0VUUEFSQU1OQU1F
U19NQVgKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYmxvYm1zZ19wb2xpY3kgZ2V0UGFy
YW1OYW1lc19wb2xpY3lbXSA9IHsKKwlbR0VUUEFSQU1OQU1FU19QQVJBTV0gPSB7IC5uYW1l
ID0gInBhcmFtZXRlciIsIC50eXBlID0gQkxPQk1TR19UWVBFX1NUUklORyB9LAorCVtHRVRQ
QVJBTU5BTUVTX1dSSVRBQkxFXSA9IHsgLm5hbWUgPSAid3JpdGFibGUiLCAudHlwZSA9IEJM
T0JNU0dfVFlQRV9TVFJJTkcgfSwKKwlbR0VUUEFSQU1OQU1FU19GQVVMVF0gPSB7IC5uYW1l
ID0gImZhdWx0X2NvZGUiLCAudHlwZSA9IEJMT0JNU0dfVFlQRV9TVFJJTkcgfSwKK307CisK
K3N0YXRpYyBpbnQKK2ZyZWVjd21wZF9oYW5kbGVfZ2V0UGFyYW1OYW1lcyhzdHJ1Y3QgdWJ1
c19jb250ZXh0ICpjdHgsIHN0cnVjdCB1YnVzX29iamVjdCAqb2JqLAorCQkJc3RydWN0IHVi
dXNfcmVxdWVzdF9kYXRhICpyZXEsIGNvbnN0IGNoYXIgKm1ldGhvZCwKKwkJCXN0cnVjdCBi
bG9iX2F0dHIgKm1zZykKK3sKKwlzdHJ1Y3QgYmxvYl9hdHRyICp0YltfX0dFVFBBUkFNTkFN
RVNfTUFYXTsKKworCWJsb2Jtc2dfcGFyc2UoZ2V0UGFyYW1OYW1lc19wb2xpY3ksIEFSUkFZ
X1NJWkUoZ2V0UGFyYW1OYW1lc19wb2xpY3kpLCB0YiwKKwkJICAgICAgYmxvYl9kYXRhKG1z
ZyksIGJsb2JfbGVuKG1zZykpOworCisJaWYgKCF0YltHRVRQQVJBTU5BTUVTX1BBUkFNXSkK
KwkJcmV0dXJuIFVCVVNfU1RBVFVTX0lOVkFMSURfQVJHVU1FTlQ7CisKKworCWZyZWVjd21w
X2xvZ19tZXNzYWdlKE5BTUUsIExfTk9USUNFLAorCQkJICAgICAidHJpZ2dlcmVkIHVidXMg
R2V0UGFyYW1ldGVyTmFtZXMgcGFyYW1ldGVyICVzXG4iLAorCQkJICAgICBibG9ibXNnX2Rh
dGEodGJbR0VUUEFSQU1OQU1FU19QQVJBTV0pKTsKKworCisJZXh0ZXJuYWxfYWRkX2xpc3Rf
cGFyYW1hbWV0ZXIoYmxvYm1zZ19kYXRhKHRiW0dFVFBBUkFNTkFNRVNfUEFSQU1dKSwKKwkJ
CXRiW0dFVFBBUkFNTkFNRVNfV1JJVEFCTEVdPyBibG9ibXNnX2RhdGEodGJbR0VUUEFSQU1O
QU1FU19XUklUQUJMRV0pIDogTlVMTCwKKwkJCU5VTEwsCisJCQl0YltHRVRQQVJBTU5BTUVT
X0ZBVUxUXT8gYmxvYm1zZ19kYXRhKHRiW0dFVFBBUkFNTkFNRVNfRkFVTFRdKSA6IE5VTEwp
OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBlbnVtIGdldFBhcmFtQXR0cmlidXRlcyB7
CisJR0VUUEFSQU1BVFRSSUJVVEVTX1BBUkFNLAorCUdFVFBBUkFNQVRUUklCVVRFU19OT1RJ
RiwKKwlHRVRQQVJBTUFUVFJJQlVURVNfRkFVTFQsCisJX19HRVRQQVJBTUFUVFJJQlVURVNf
TUFYCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGJsb2Jtc2dfcG9saWN5IGdldFBhcmFt
QXR0cmlidXRlc19wb2xpY3lbXSA9IHsKKwlbR0VUUEFSQU1BVFRSSUJVVEVTX1BBUkFNXSA9
IHsgLm5hbWUgPSAicGFyYW1ldGVyIiwgLnR5cGUgPSBCTE9CTVNHX1RZUEVfU1RSSU5HIH0s
CisJW0dFVFBBUkFNQVRUUklCVVRFU19OT1RJRl0gPSB7IC5uYW1lID0gIm5vdGlmaWNhdGlv
biIsIC50eXBlID0gQkxPQk1TR19UWVBFX1NUUklORyB9LAorCVtHRVRQQVJBTUFUVFJJQlVU
RVNfRkFVTFRdID0geyAubmFtZSA9ICJmYXVsdF9jb2RlIiwgLnR5cGUgPSBCTE9CTVNHX1RZ
UEVfU1RSSU5HIH0sCit9OworCitzdGF0aWMgaW50CitmcmVlY3dtcGRfaGFuZGxlX2dldFBh
cmFtQXR0cmlidXRlcyhzdHJ1Y3QgdWJ1c19jb250ZXh0ICpjdHgsIHN0cnVjdCB1YnVzX29i
amVjdCAqb2JqLAorCQkJc3RydWN0IHVidXNfcmVxdWVzdF9kYXRhICpyZXEsIGNvbnN0IGNo
YXIgKm1ldGhvZCwKKwkJCXN0cnVjdCBibG9iX2F0dHIgKm1zZykKK3sKKwlzdHJ1Y3QgYmxv
Yl9hdHRyICp0YltfX0dFVFBBUkFNQVRUUklCVVRFU19NQVhdOworCisJYmxvYm1zZ19wYXJz
ZShnZXRQYXJhbUF0dHJpYnV0ZXNfcG9saWN5LCBBUlJBWV9TSVpFKGdldFBhcmFtQXR0cmli
dXRlc19wb2xpY3kpLCB0YiwKKwkJICAgICAgYmxvYl9kYXRhKG1zZyksIGJsb2JfbGVuKG1z
ZykpOworCisJaWYgKCF0YltHRVRQQVJBTUFUVFJJQlVURVNfUEFSQU1dKQorCQlyZXR1cm4g
VUJVU19TVEFUVVNfSU5WQUxJRF9BUkdVTUVOVDsKKworCWlmICghdGJbR0VUUEFSQU1BVFRS
SUJVVEVTX05PVElGXSkKKwkJcmV0dXJuIFVCVVNfU1RBVFVTX0lOVkFMSURfQVJHVU1FTlQ7
CisKKwlmcmVlY3dtcF9sb2dfbWVzc2FnZShOQU1FLCBMX05PVElDRSwKKwkJCSAgICAgInRy
aWdnZXJlZCB1YnVzIEdldFBhcmFtZXRlckF0dHJpYnV0ZXMgcGFyYW1ldGVyICVzXG4iLAor
CQkJICAgICBibG9ibXNnX2RhdGEodGJbR0VUUEFSQU1BVFRSSUJVVEVTX1BBUkFNXSkpOwor
CisJZXh0ZXJuYWxfYWRkX2xpc3RfcGFyYW1hbWV0ZXIoYmxvYm1zZ19kYXRhKHRiW0dFVFBB
UkFNQVRUUklCVVRFU19QQVJBTV0pLAorCQkJCSAgICAgIGJsb2Jtc2dfZGF0YSh0YltHRVRQ
QVJBTUFUVFJJQlVURVNfTk9USUZdKSwKKwkJCQkgICAgICBOVUxMLAorCQkJCSAgICAgIGJs
b2Jtc2dfZGF0YSh0YltHRVRQQVJBTUFUVFJJQlVURVNfRkFVTFRdKSk7CisKKwlyZXR1cm4g
MDsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCB1YnVzX21ldGhvZCBmcmVlY3dtcF9tZXRo
b2RzW10gPSB7CiAJVUJVU19NRVRIT0QoIm5vdGlmeSIsIGZyZWVjd21wZF9oYW5kbGVfbm90
aWZ5LCBub3RpZnlfcG9saWN5KSwKIAlVQlVTX01FVEhPRCgiaW5mb3JtIiwgZnJlZWN3bXBk
X2hhbmRsZV9pbmZvcm0sIGluZm9ybV9wb2xpY3kpLAogCVVCVVNfTUVUSE9EKCJjb21tYW5k
IiwgZnJlZWN3bXBkX2hhbmRsZV9jb21tYW5kLCBjb21tYW5kX3BvbGljeSksCisJVUJVU19N
RVRIT0QoIkdldFBhcmFtZXRlclZhbHVlcyIsIGZyZWVjd21wZF9oYW5kbGVfZ2V0UGFyYW1W
YWx1ZXMsIGdldFBhcmFtVmFsdWVzX3BvbGljeSksCisJVUJVU19NRVRIT0QoIkdldFBhcmFt
ZXRlck5hbWVzIiwgZnJlZWN3bXBkX2hhbmRsZV9nZXRQYXJhbU5hbWVzLCBnZXRQYXJhbU5h
bWVzX3BvbGljeSksCisJVUJVU19NRVRIT0QoIkdldFBhcmFtZXRlckF0dHJpYnV0ZXMiLCBm
cmVlY3dtcGRfaGFuZGxlX2dldFBhcmFtQXR0cmlidXRlcywgZ2V0UGFyYW1BdHRyaWJ1dGVz
X3BvbGljeSksCiB9OwogCiBzdGF0aWMgc3RydWN0IHVidXNfb2JqZWN0X3R5cGUgbWFpbl9v
YmplY3RfdHlwZSA9CmRpZmYgLS1naXQgYS9zcmMveG1sLmMgYi9zcmMveG1sLmMKaW5kZXgg
OWZhMDM2Yi4uMDUzZWUxYSAxMDA2NDQKLS0tIGEvc3JjL3htbC5jCisrKyBiL3NyYy94bWwu
YwpAQCAtMjEsNiArMjEsOCBAQAogI2luY2x1ZGUgIm1lc3NhZ2VzLmgiCiAjaW5jbHVkZSAi
dGltZS5oIgogCitleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBleHRlcm5hbF9saXN0X3BhcmFt
ZXRlcjsKKwogc3RydWN0IHJwY19tZXRob2QgewogCWNvbnN0IGNoYXIgKm5hbWU7CiAJaW50
ICgqaGFuZGxlcikobXhtbF9ub2RlX3QgKmJvZHlfaW4sIG14bWxfbm9kZV90ICp0cmVlX2lu
LApAQCAtMjE3LDYgKzIxOSw3IEBAIGludCB4bWxfcHJlcGFyZV9pbmZvcm1fbWVzc2FnZShj
aGFyICoqbXNnX291dCkKIHsKIAlteG1sX25vZGVfdCAqdHJlZSwgKmI7CiAJY2hhciAqYywg
KnRtcDsKKwlzdHJ1Y3QgZXh0ZXJuYWxfcGFyYW1ldGVyICpleHRlcm5hbF9wYXJhbWV0ZXI7
CiAKICNpZmRlZiBEVU1NWV9NT0RFCiAJRklMRSAqZnA7CkBAIC0zMzUsMzcgKzMzOCwzMyBA
QCBpbnQgeG1sX3ByZXBhcmVfaW5mb3JtX21lc3NhZ2UoY2hhciAqKm1zZ19vdXQpCiAJaWYg
KG14bWxHZXRUeXBlKGIpICE9IE1YTUxfRUxFTUVOVCkKIAkJZ290byBlcnJvcjsKIAotCXRt
cCA9ICJJbnRlcm5ldEdhdGV3YXlEZXZpY2UuV0FORGV2aWNlLjEuV0FOQ29ubmVjdGlvbkRl
dmljZS4xLldBTklQQ29ubmVjdGlvbi4xLkV4dGVybmFsSVBBZGRyZXNzIjsKLQliID0gbXht
bEZpbmRFbGVtZW50VGV4dCh0cmVlLCB0cmVlLCB0bXAsIE1YTUxfREVTQ0VORCk7Ci0JaWYg
KCFiKSBnb3RvIGVycm9yOwotCi0JYiA9IGItPnBhcmVudC0+bmV4dC0+bmV4dDsKLQlpZiAo
bXhtbEdldFR5cGUoYikgIT0gTVhNTF9FTEVNRU5UKQorCWV4dGVybmFsX2dldF9hY3Rpb25f
d3JpdGUoInZhbHVlIiwiSW50ZXJuZXRHYXRld2F5RGV2aWNlLldBTkRldmljZS4xLldBTkNv
bm5lY3Rpb25EZXZpY2UuMS5XQU5JUENvbm5lY3Rpb24uMS5FeHRlcm5hbElQQWRkcmVzcyIs
IE5VTEwpOworCWV4dGVybmFsX2dldF9hY3Rpb25fd3JpdGUoInZhbHVlIiwiSW50ZXJuZXRH
YXRld2F5RGV2aWNlLk1hbmFnZW1lbnRTZXJ2ZXIuQ29ubmVjdGlvblJlcXVlc3RVUkwiLCBO
VUxMKTsKKwlpZiAoZXh0ZXJuYWxfZ2V0X2FjdGlvbl9leGVjdXRlKCkpCiAJCWdvdG8gZXJy
b3I7CiAKLQljID0gTlVMTDsKLQlpZiAoZXh0ZXJuYWxfZ2V0X2FjdGlvbigidmFsdWUiLCB0
bXAsICZjKSkgZ290byBlcnJvcjsKLQlpZiAoYykgewotCQliID0gbXhtbE5ld1RleHQoYiwg
MCwgYyk7Ci0JCUZSRUUoYyk7Ci0JCWlmICghYikgZ290byBlcnJvcjsKLQl9Ci0KLQl0bXAg
PSAiSW50ZXJuZXRHYXRld2F5RGV2aWNlLk1hbmFnZW1lbnRTZXJ2ZXIuQ29ubmVjdGlvblJl
cXVlc3RVUkwiOwotCWIgPSBteG1sRmluZEVsZW1lbnRUZXh0KHRyZWUsIHRyZWUsIHRtcCwg
TVhNTF9ERVNDRU5EKTsKLQlpZiAoIWIpIGdvdG8gZXJyb3I7CisJd2hpbGUgKGV4dGVybmFs
X2xpc3RfcGFyYW1ldGVyLm5leHQhPSZleHRlcm5hbF9saXN0X3BhcmFtZXRlcikKKwl7CisJ
CWV4dGVybmFsX3BhcmFtZXRlciA9IGxpc3RfZW50cnkoZXh0ZXJuYWxfbGlzdF9wYXJhbWV0
ZXIubmV4dCwgc3RydWN0IGV4dGVybmFsX3BhcmFtZXRlciwgbGlzdCk7CisJCWIgPSBteG1s
RmluZEVsZW1lbnRUZXh0KHRyZWUsIHRyZWUsIGV4dGVybmFsX3BhcmFtZXRlci0+bmFtZSwg
TVhNTF9ERVNDRU5EKTsKKwkJaWYgKCFiKSBjb250aW51ZTsKIAogCWIgPSBiLT5wYXJlbnQt
Pm5leHQtPm5leHQ7CiAJaWYgKG14bWxHZXRUeXBlKGIpICE9IE1YTUxfRUxFTUVOVCkKIAkJ
Z290byBlcnJvcjsKIAotCWMgPSBOVUxMOwotCWlmIChleHRlcm5hbF9nZXRfYWN0aW9uKCJ2
YWx1ZSIsIHRtcCwgJmMpKSBnb3RvIGVycm9yOwotCWlmIChjKSB7Ci0JCWIgPSBteG1sTmV3
VGV4dChiLCAwLCBjKTsKLQkJRlJFRShjKTsKKwkJaWYgKGV4dGVybmFsX3BhcmFtZXRlci0+
ZGF0YSkgeworCQkJYiA9IG14bWxOZXdUZXh0KGIsIDAsIGV4dGVybmFsX3BhcmFtZXRlci0+
ZGF0YSk7CiAJCWlmICghYikgZ290byBlcnJvcjsKIAl9CisJCWxpc3RfZGVsKCZleHRlcm5h
bF9wYXJhbWV0ZXItPmxpc3QpOworCQlDRlJFRShleHRlcm5hbF9wYXJhbWV0ZXItPm5hbWUp
OworCQlDRlJFRShleHRlcm5hbF9wYXJhbWV0ZXItPmRhdGEpOworCQlDRlJFRShleHRlcm5h
bF9wYXJhbWV0ZXItPnR5cGUpOworCQlDRlJFRShleHRlcm5hbF9wYXJhbWV0ZXItPmZhdWx0
X2NvZGUpOworCQlDRlJFRShleHRlcm5hbF9wYXJhbWV0ZXIpOworCX0KKwogCiAJaWYgKHht
bF9wcmVwYXJlX25vdGlmaWNhdGlvbnNfaW5mb3JtKHRyZWUpKQogCQlnb3RvIGVycm9yOwpA
QCAtMzc2LDYgKzM3NSw3IEBAIGludCB4bWxfcHJlcGFyZV9pbmZvcm1fbWVzc2FnZShjaGFy
ICoqbXNnX291dCkKIAlyZXR1cm4gMDsKIAogZXJyb3I6CisJZXh0ZXJuYWxfZnJlZV9saXN0
X3BhcmFtZXRlcigpOwogCW14bWxEZWxldGUodHJlZSk7CiAJcmV0dXJuIC0xOwogfQpAQCAt
NjI4LDEwICs2MjgsMTEgQEAgaW50IHhtbF9oYW5kbGVfZ2V0X3BhcmFtZXRlcl92YWx1ZXMo
bXhtbF9ub2RlX3QgKmJvZHlfaW4sCiAJCQkJICAgIG14bWxfbm9kZV90ICp0cmVlX2luLAog
CQkJCSAgICBteG1sX25vZGVfdCAqdHJlZV9vdXQpCiB7Ci0JbXhtbF9ub2RlX3QgKm4sICpi
ID0gYm9keV9pbjsKKwlteG1sX25vZGVfdCAqbiwgKlBhcmFtZXRlckxpc3QsICpiID0gYm9k
eV9pbjsKKwlzdHJ1Y3QgZXh0ZXJuYWxfcGFyYW1ldGVyICpleHRlcm5hbF9wYXJhbWV0ZXI7
CiAJY2hhciAqcGFyYW1ldGVyX25hbWUgPSBOVUxMOwogCWNoYXIgKnBhcmFtZXRlcl92YWx1
ZSA9IE5VTEw7Ci0JY2hhciAqYzsKKwljaGFyICpjID0gTlVMTDsKIAlpbnQgY291bnRlciA9
IDA7CiAKIAluID0gbXhtbEZpbmRFbGVtZW50KHRyZWVfb3V0LCB0cmVlX291dCwgInNvYXBf
ZW52OkJvZHkiLApAQCAtNjU1LDI5ICs2NTYsNDQgQEAgaW50IHhtbF9oYW5kbGVfZ2V0X3Bh
cmFtZXRlcl92YWx1ZXMobXhtbF9ub2RlX3QgKmJvZHlfaW4sCiAJCSAgICAhc3RyY21wKGIt
PnBhcmVudC0+dmFsdWUuZWxlbWVudC5uYW1lLCAic3RyaW5nIikpIHsKIAkJCXBhcmFtZXRl
cl9uYW1lID0gYi0+dmFsdWUudGV4dC5zdHJpbmc7CiAJCX0KLQorCQlpZiAoYiAmJiBiLT50
eXBlID09IE1YTUxfRUxFTUVOVCAmJiAvKiBhZGRlZCBpbiBvcmRlciB0byBzdXBwb3J0IEdl
dFBhcmFtZXRlclZhbHVlcyB3aXRoIGVtcHR5IHN0cmluZyovCisJCQkhc3RyY21wKGItPnZh
bHVlLmVsZW1lbnQubmFtZSwgInN0cmluZyIpICYmCisJCQkhYi0+Y2hpbGQpIHsKKwkJCXBh
cmFtZXRlcl9uYW1lID0gIiI7CisJCX0KIAkJaWYgKHBhcmFtZXRlcl9uYW1lKSB7CiAJCQlp
ZiAoIWNvbmZpZ19nZXRfY3dtcChwYXJhbWV0ZXJfbmFtZSwgJnBhcmFtZXRlcl92YWx1ZSkp
IHsKKwkJCQlleHRlcm5hbF9hZGRfbGlzdF9wYXJhbWFtZXRlcihwYXJhbWV0ZXJfbmFtZSxw
YXJhbWV0ZXJfdmFsdWUsInhzZDpzdHJpbmciLE5VTEwpOworCQkJCUZSRUUocGFyYW1ldGVy
X3ZhbHVlKTsKIAkJCQkvLyBnb3QgdGhlIHBhcmFtZXRlciB2YWx1ZSB1c2luZyBsaWJ1Y2kK
LQkJCX0gZWxzZSBpZiAoIWV4dGVybmFsX2dldF9hY3Rpb24oInZhbHVlIiwKLQkJCQkJcGFy
YW1ldGVyX25hbWUsICZwYXJhbWV0ZXJfdmFsdWUpKSB7CisJCQl9IGVsc2UgaWYgKCFleHRl
cm5hbF9nZXRfYWN0aW9uX3dyaXRlKCJ2YWx1ZSIscGFyYW1ldGVyX25hbWUsIE5VTEwpKSB7
CiAJCQkJLy8gZ290IHRoZSBwYXJhbWV0ZXIgdmFsdWUgdmlhIGV4dGVybmFsIHNjcmlwdAog
CQkJfSBlbHNlIHsKIAkJCQkvLyBlcnJvciBvY2N1cnJlZCB3aGVuIGdldHRpbmcgcGFyYW1l
dGVyIHZhbHVlCiAJCQkJZ290byBvdXQ7CiAJCQl9Ci0JCQljb3VudGVyKys7CisJCX0KKwkJ
YiA9IG14bWxXYWxrTmV4dChiLCBib2R5X2luLCBNWE1MX0RFU0NFTkQpOworCQlwYXJhbWV0
ZXJfbmFtZSA9IE5VTEw7CisJfQogCi0JCQluID0gbXhtbEZpbmRFbGVtZW50KHRyZWVfb3V0
LCB0cmVlX291dCwgIlBhcmFtZXRlckxpc3QiLCBOVUxMLCBOVUxMLCBNWE1MX0RFU0NFTkQp
OwotCQkJaWYgKCFuKSBnb3RvIG91dDsKKwlpZiAoZXh0ZXJuYWxfZ2V0X2FjdGlvbl9leGVj
dXRlKCkpCisJCWdvdG8gb3V0OworCisJUGFyYW1ldGVyTGlzdCA9IG14bWxGaW5kRWxlbWVu
dCh0cmVlX291dCwgdHJlZV9vdXQsICJQYXJhbWV0ZXJMaXN0IiwgTlVMTCwgTlVMTCwgTVhN
TF9ERVNDRU5EKTsKKwlpZiAoIVBhcmFtZXRlckxpc3QpIGdvdG8gb3V0OworCisJd2hpbGUg
KGV4dGVybmFsX2xpc3RfcGFyYW1ldGVyLm5leHQhPSZleHRlcm5hbF9saXN0X3BhcmFtZXRl
cikgeworCisJCWV4dGVybmFsX3BhcmFtZXRlciA9IGxpc3RfZW50cnkoZXh0ZXJuYWxfbGlz
dF9wYXJhbWV0ZXIubmV4dCwgc3RydWN0IGV4dGVybmFsX3BhcmFtZXRlciwgbGlzdCk7CiAK
LQkJCW4gPSBteG1sTmV3RWxlbWVudChuLCAiUGFyYW1ldGVyVmFsdWVTdHJ1Y3QiKTsKKwkJ
biA9IG14bWxOZXdFbGVtZW50KFBhcmFtZXRlckxpc3QsICJQYXJhbWV0ZXJWYWx1ZVN0cnVj
dCIpOwogCQkJaWYgKCFuKSBnb3RvIG91dDsKIAogCQkJbiA9IG14bWxOZXdFbGVtZW50KG4s
ICJOYW1lIik7CiAJCQlpZiAoIW4pIGdvdG8gb3V0OwogCi0JCQluID0gbXhtbE5ld1RleHQo
biwgMCwgcGFyYW1ldGVyX25hbWUpOworCQluID0gbXhtbE5ld1RleHQobiwgMCwgZXh0ZXJu
YWxfcGFyYW1ldGVyLT5uYW1lKTsKIAkJCWlmICghbikgZ290byBvdXQ7CiAKIAkJCW4gPSBu
LT5wYXJlbnQtPnBhcmVudDsKQEAgLTY4NSwyMyArNzAxLDE5IEBAIGludCB4bWxfaGFuZGxl
X2dldF9wYXJhbWV0ZXJfdmFsdWVzKG14bWxfbm9kZV90ICpib2R5X2luLAogCQkJaWYgKCFu
KSBnb3RvIG91dDsKIAogI2lmZGVmIEFDU19NVUxUSQotCQkJbXhtbEVsZW1lbnRTZXRBdHRy
KG4sICJ4c2k6dHlwZSIsICJ4c2Q6c3RyaW5nIik7CisJCW14bWxFbGVtZW50U2V0QXR0cihu
LCAieHNpOnR5cGUiLCBleHRlcm5hbF9wYXJhbWV0ZXItPnR5cGUpOwogI2VuZGlmCi0JCQlu
ID0gbXhtbE5ld1RleHQobiwgMCwgcGFyYW1ldGVyX3ZhbHVlID8gcGFyYW1ldGVyX3ZhbHVl
IDogIiIpOworCQluID0gbXhtbE5ld1RleHQobiwgMCwgZXh0ZXJuYWxfcGFyYW1ldGVyLT5k
YXRhPyBleHRlcm5hbF9wYXJhbWV0ZXItPmRhdGEgOiAiIik7CiAJCQlpZiAoIW4pIGdvdG8g
b3V0OwogCi0JCQkvKgotCQkJICogdGhyZWUgZGF5J3Mgd29yayB0byBmaW5hbGx5IGZpbmQg
bWVtb3J5IGxlYWsgaWYgd2UKLQkJCSAqIGZyZWUgcGFyYW1ldGVyX25hbWU7Ci0JCQkgKiBp
dCBwb2ludHMgdG86IGItPnZhbHVlLnRleHQuc3RyaW5nCi0JCQkgKgotCQkJICogYWxzbywg
cGFyYW1ldGVyX3ZhbHVlIGNhbiBiZSBOVUxMIHNvIHdlIGRvbid0IGRvIGNoZWNrcwotCQkJ
ICovCi0JCQlwYXJhbWV0ZXJfbmFtZSA9IE5VTEw7Ci0JCX0KKwkJY291bnRlcisrOwogCQkK
LQkJRlJFRShwYXJhbWV0ZXJfdmFsdWUpOwotCQliID0gbXhtbFdhbGtOZXh0KGIsIGJvZHlf
aW4sIE1YTUxfREVTQ0VORCk7CisJCWxpc3RfZGVsKCZleHRlcm5hbF9wYXJhbWV0ZXItPmxp
c3QpOworCQlDRlJFRShleHRlcm5hbF9wYXJhbWV0ZXItPm5hbWUpOworCQlDRlJFRShleHRl
cm5hbF9wYXJhbWV0ZXItPmRhdGEpOworCQlDRlJFRShleHRlcm5hbF9wYXJhbWV0ZXItPnR5
cGUpOworCQlDRlJFRShleHRlcm5hbF9wYXJhbWV0ZXItPmZhdWx0X2NvZGUpOworCQlDRlJF
RShleHRlcm5hbF9wYXJhbWV0ZXIpOwogCX0KIAogI2lmZGVmIEFDU19NVUxUSQpAQCAtNzE2
LDExICs3MjgsMTAgQEAgaW50IHhtbF9oYW5kbGVfZ2V0X3BhcmFtZXRlcl92YWx1ZXMobXht
bF9ub2RlX3QgKmJvZHlfaW4sCiAJRlJFRShjKTsKICNlbmRpZgogCi0JRlJFRShwYXJhbWV0
ZXJfdmFsdWUpOwogCXJldHVybiAwOwogCiBvdXQ6Ci0JRlJFRShwYXJhbWV0ZXJfdmFsdWUp
OworCWV4dGVybmFsX2ZyZWVfbGlzdF9wYXJhbWV0ZXIoKTsKIAlyZXR1cm4gLTE7CiB9CiAK
LS0gCjEuNy40LjEKCg==
--------------090909030309040801070705--

From freecwmp@lukaperkov.net Tue Nov 20 11:25:16 2012
Received: with ECARTIS (v1.0.0; list freecwmp); Tue, 20 Nov 2012 11:25:20 +0100 (CET)
Received: from mail-bk0-f49.google.com ([209.85.214.49]:53818 "EHLO
        mail-bk0-f49.google.com" rhost-flags-OK-OK-OK-OK)
        by eddie.linux-mips.org with ESMTP id S6816671Ab2KTKZQrAkwr (ORCPT
        <rfc822;freecwmp@linux-mips.org>); Tue, 20 Nov 2012 11:25:16 +0100
Received: by mail-bk0-f49.google.com with SMTP id jm19so1085530bkc.36
        for <freecwmp@linux-mips.org>; Tue, 20 Nov 2012 02:25:11 -0800 (PST)
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=google.com; s=20120113;
        h=date:from:to:cc:subject:message-id:mail-followup-to:references
         :mime-version:content-type:content-disposition:in-reply-to
         :user-agent:x-gm-message-state;
        bh=PwJjouH9iNDpl3WD1nzRhRfp3tFzT++meK/NT55UUiE=;
        b=KTvgp7rf2V4dHOOZ3C0ehrB20vB0lsAPmPL1i84rkxQ9HtWapqTI3d8Uo8mJcDj3Tj
         gaxL8XW2dEUjxZup7dRBaFJqFA2lqlv8uCcn3WSYl7rIpKEEJruMrJnqUFsJQerNV3OG
         740z0bTSl9AaR6+OnN+OEAn0VekTv4s8pa4DH/nxW8xxRFIoKPqnsBB2Y8zbw32QNnbU
         hwwHIuODbSjDzirSAh94wjS2TWacdEfiImM78vuq+165+f7EsVQHoqDVPxeR3Okhb/RY
         FbraHNuTdZe9x7W/aJce5NUocOU3H9cnRb3+O3suHBtASHHPy876ZyRMGmL3xpB9V82b
         epiQ==
Received: by 10.204.4.145 with SMTP id 17mr5994388bkr.34.1353407111092;
        Tue, 20 Nov 2012 02:25:11 -0800 (PST)
Received: from w500 (168-186.dsl.iskon.hr. [89.164.168.186])
        by mx.google.com with ESMTPS id k3sm6403213bku.13.2012.11.20.02.25.07
        (version=SSLv3 cipher=OTHER);
        Tue, 20 Nov 2012 02:25:09 -0800 (PST)
Date:   Tue, 20 Nov 2012 11:25:08 +0100
From:   Luka Perkov <freecwmp@lukaperkov.net>
To:     KALLEL Mohamed <mohamed.kallel@pivasoftware.com>
Cc:     Jonas Gorski <jonas.gorski@gmail.com>, freecwmp@linux-mips.org
Subject: Re: NEW PATCH for data model
Message-ID: <20121120102508-13507@mutt-kz>
Mail-Followup-To: KALLEL Mohamed <mohamed.kallel@pivasoftware.com>,
        Jonas Gorski <jonas.gorski@gmail.com>, freecwmp@linux-mips.org
References: <508E5D2B.6050508@pivasoftware.com>
 <50A676F4.8080708@pivasoftware.com>
 <CAOiHx==qi9w3a3Rj6JyLY9Np+uju=LR=AUi9OqhGTj-=6bG0bQ@mail.gmail.com>
 <50AA5B24.305@pivasoftware.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <50AA5B24.305@pivasoftware.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Gm-Message-State: ALoCoQm9HcYbiF2eiOiRxrxnNZKkArU1fy4slklrWC/I7a1Tc9h8fcKitaGsvK1uZFzFTPr7jUg8
Return-Path: <freecwmp@lukaperkov.net>
X-Envelope-To: <"|/home/ecartis/ecartis -s freecwmp"> (uid 0)
X-Orcpt: rfc822;freecwmp@linux-mips.org
Original-Recipient: rfc822;freecwmp@linux-mips.org
X-archive-position: 73
X-ecartis-version: Ecartis v1.0.0
Sender: freecwmp-bounce@linux-mips.org
Errors-to: freecwmp-bounce@linux-mips.org
X-original-sender: freecwmp@lukaperkov.net
Precedence: bulk
X-list: freecwmp

Hi Mohamed,

On Mon, Nov 19, 2012 at 05:15:32PM +0100, KALLEL Mohamed wrote:
> Please, Find attached the new patch file.

Please send patches inline and not attached. Also give us more
information about this patch.

It's hard to review all the changes you made. Please look how to
properly introduce big changes:

https://github.com/KanjiMonster/freecwmp/commits/rpc_rework

Look at commits made including and after "add generic rpc method
handling".

> It contains only support  communication from script to core with C
> 
> Signed-off-by: Mohamed <mohamed.kallel@pivasoftware.com>
> ---
>  configure.ac   |    3 +
>  src/external.c |  167 +++++++++++++++++++++++++++++++++++++++++++-------------
>  src/external.h |   16 +++++
>  src/freecwmp.c |   19 ++++++
>  src/freecwmp.h |    1 +
>  src/ubus.c     |  127 ++++++++++++++++++++++++++++++++++++++++++
>  src/xml.c      |  105 +++++++++++++++++++----------------
>  7 files changed, 353 insertions(+), 85 deletions(-)
> 
> diff --git a/configure.ac b/configure.ac
> index c646c3a..38d3df4 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -80,6 +80,9 @@ AC_SUBST([LIBUBUS_LDFLAGS])
>  LIBUBUS_LIBS='-lubus'
>  AC_SUBST([LIBUBUS_LIBS])
>  
> +LIBPTHREAD_LIBS='-lpthread'
> +AC_SUBST([LIBPTHREAD_LIBS])
> +

Why are you using threads and not uloop ?

>  AM_COND_IF([HTTP_CURL], [
>   AC_DEFINE(HTTP_CURL)
>   PKG_CHECK_MODULES(LIBCURL, [libcurl])
> diff --git a/src/external.c b/src/external.c
> index 9ac7b36..2222646 100644
> --- a/src/external.c
> +++ b/src/external.c
> @@ -25,15 +25,67 @@
>  #include "freecwmp.h"
>  
>  static struct uloop_process uproc;
> +pthread_t ubus_thread;
> +LIST_HEAD(external_list_parameter);
> +
> +void *thread_uloop_run (void *v)
> +{
> +	uloop_run();
> +	return NULL;
> +}
> +
> +void external_add_list_paramameter(char *param_name, char *param_data, char *param_type, char *fault_code)
> +{
> +	struct external_parameter *external_parameter;
> +	struct list_head *ilist; int i =0;
> +	external_parameter = calloc(1, sizeof(struct external_parameter));
> +	list_add_tail(&external_parameter->list,&external_list_parameter);
> +	if (param_name) external_parameter->name = strdup(param_name);
> +	if (param_data) external_parameter->data = strdup(param_data);
> +	if (param_type) external_parameter->type = strdup(param_type);
> +	if (fault_code) external_parameter->fault_code = strdup(fault_code);
> +}
> +
> +void external_free_list_parameter()
> +{
> +	struct external_parameter *external_parameter;
> +	while (external_list_parameter.next!=&external_list_parameter) {
> +		external_parameter = list_entry(external_list_parameter.next, struct external_parameter, list);
> +		list_del(&external_parameter->list);
> +		CFREE(external_parameter->name);
> +		CFREE(external_parameter->data);
> +		CFREE(external_parameter->type);
> +		CFREE(external_parameter->fault_code);
> +		CFREE(external_parameter);
> +	}
> +}
> +
>  
>  int external_get_action(char *action, char *name, char **value)
>  {
> +	struct external_parameter *external_parameter;
> +	external_get_action_common(action, name, NULL);
> +	if (external_list_parameter.next!=&external_list_parameter) {
> +		external_parameter = list_entry(external_list_parameter.next, struct external_parameter, list);
> +		if (external_parameter->data)
> +			*value = external_parameter->data;
> +		list_del(&external_parameter->list);
> +		CFREE(external_parameter->name);
> +		CFREE(external_parameter->data);
> +		CFREE(external_parameter->type);
> +		CFREE(external_parameter->fault_code);
> +		CFREE(external_parameter);
> +	}
> +	external_free_list_parameter();
> +}
> +
> +int external_get_action_common(char *action, char *name, char *arg /* arg is added for GetParameterNames NextLevel argument*/)
> +{
>  	freecwmp_log_message(NAME, L_NOTICE,
>  			     "executing get %s '%s'\n", action, name);
>  
> -	int pfds[2];
> -	if (pipe(pfds) < 0)
> -		return -1;
> +
> +	pthread_create(&ubus_thread, NULL, &thread_uloop_run, NULL);
>  
>  	if ((uproc.pid = fork()) == -1)
>  		goto error;
> @@ -45,67 +97,106 @@ int external_get_action(char *action, char *name, char **value)
>  		int i = 0;
>  		argv[i++] = "/bin/sh";
>  		argv[i++] = fc_script;
> -		argv[i++] = "--newline";
> -		argv[i++] = "--value";
>  		argv[i++] = "get";
>  		argv[i++] = action;
>  		argv[i++] = name;
> +		if(arg) argv[i++] = arg;
>  		argv[i++] = NULL;
>  
> -		close(pfds[0]);
> -		dup2(pfds[1], 1);
> -		close(pfds[1]);
> -
>  		execvp(argv[0], (char **) argv);
>  		exit(ESRCH);
>  
>  	} else if (uproc.pid < 0)
>  		goto error;
>  
> -	/* parent */
> -	close(pfds[1]);
> -
>  	int status;
>  	while (wait(&status) != uproc.pid) {
>  		DD("waiting for child to exit");
>  	}
> +	pthread_cancel(ubus_thread);
> +	pthread_join(ubus_thread,NULL);
>  
> -	char buffer[64];
> -	ssize_t rxed;
> -	char *c;
> -	int t;
> -
> -	*value = NULL;
> -	while ((rxed = read(pfds[0], buffer, sizeof(buffer))) > 0) {
> -		if (*value)
> -			t = asprintf(&c, "%s%.*s", *value, (int) rxed, buffer);
> -		else
> -			t = asprintf(&c, "%.*s", (int) rxed, buffer);
> +	return 0;
>  
> -		if (t == -1) goto error;
> +error:
> +	return -1;
>  
> -		free(*value);
> -		*value = strdup(c);
> -		free(c);
>  	}
>  
> -	if (!strlen(*value)) {
> -		FREE(*value);
> -		goto done;
> +int external_get_action_write(char *action, char *name, char *arg)
> +{
> +	freecwmp_log_message(NAME, L_NOTICE,
> +		"adding to get %s script '%s'\n", action, name);
> +
> +	FILE *fp;
> +
> +	if (access(fc_script_get_actions, R_OK | W_OK | X_OK) != -1) {
> +		fp = fopen(fc_script_get_actions, "a");
> +		if (!fp) return -1;
> +	} else {
> +		fp = fopen(fc_script_get_actions, "w");
> +		if (!fp) return -1;
> +
> +		fprintf(fp, "#!/bin/sh\n");
> +
> +		if (chmod(fc_script_get_actions,
> +			strtol("0700", 0, 8)) < 0) {
> +			return -1;
> +		}
>  	}
>  
> -	if (rxed < 0)
> -		goto error;
> +#ifdef DUMMY_MODE
> +	fprintf(fp, "/bin/sh `pwd`/%s get %s %s %s\n", fc_script, action, name, arg?arg:"");
> +#else
> +	fprintf(fp, "/bin/sh %s get %s %s %s\n", fc_script, action, name, arg?arg:"");
> +#endif
> +
> +	fclose(fp);
>  
> -done:
> -	close(pfds[0]);
>  	return 0;
> +}
>  
> -error:
> -	FREE(*c);
> -	FREE(*value);
> -	close(pfds[0]);
> +int external_get_action_execute()
> +{
> +	freecwmp_log_message(NAME, L_NOTICE, "executing get script\n");
> +
> +	pthread_create(&ubus_thread, NULL, &thread_uloop_run, NULL);
> +
> +	if ((uproc.pid = fork()) == -1) {
> +		return -1;
> +	}
> +
> +	if (uproc.pid == 0) {
> +		/* child */
> +
> +		const char *argv[3];
> +		int i = 0;
> +		argv[i++] = "/bin/sh";
> +		argv[i++] = fc_script_get_actions;
> +		argv[i++] = NULL;
> +
> +		execvp(argv[0], (char **) argv);
> +		exit(ESRCH);
> +
> +	} else if (uproc.pid < 0)
> +		return -1;
> +
> +	/* parent */
> +	int status;
> +	while (wait(&status) != uproc.pid) {
> +		DD("waiting for child to exit");
> +	}
> +
> +	pthread_cancel(ubus_thread);
> +	pthread_join(ubus_thread,NULL);
> +
> +
> +	// TODO: add some kind of checks
> +
> +	if (remove(fc_script_get_actions) != 0)
>  	return -1;
> +
> +	return 0;
>  }
>  
>  int external_set_action_write(char *action, char *name, char *value)
> diff --git a/src/external.h b/src/external.h
> index 8606266..fcf9819 100644
> --- a/src/external.h
> +++ b/src/external.h
> @@ -9,6 +9,7 @@
>  
>  #ifndef _FREECWMP_EXTERNAL_H__
>  #define _FREECWMP_EXTERNAL_H__
> +#include <libubox/list.h>
>  
>  #ifdef DUMMY_MODE
>  static char *fc_script = "./ext/openwrt/scripts/freecwmp.sh";
> @@ -16,12 +17,27 @@ static char *fc_script = "./ext/openwrt/scripts/freecwmp.sh";
>  static char *fc_script = "/usr/sbin/freecwmp";
>  #endif
>  static char *fc_script_set_actions = "/tmp/freecwmp_set_action_values.sh";
> +static char *fc_script_get_actions = "/tmp/freecwmp_get_action_values.sh";
> +
> +struct external_parameter {
> +	struct list_head list;
> +	char *name;
> +	char *data; /* notification for GetParameterAttribute; writable for GetParameterNames; value for GetParameterValues*/
> +	char *type;
> +	char *fault_code;
> +};
> +

Remove additional newlines.

>  
>  int external_get_action(char *action, char *name, char **value);
> +int external_get_action_common(char *action, char *name, char *arg);
> +int external_get_action_write(char *action, char *name, char *arg);
> +int external_get_action_execute();
>  int external_set_action_write(char *action, char *name, char *value);
>  int external_set_action_execute();
>  int external_simple(char *arg);
>  int external_download(char *url, char *size);
> +void external_add_list_paramameter(char *param_name, char *param_data, char *param_type, char *fault_code);
> +void external_free_list_parameter();
>  
>  #endif
>  
> diff --git a/src/freecwmp.c b/src/freecwmp.c
> index 4ef8395..7808b43 100644
> --- a/src/freecwmp.c
> +++ b/src/freecwmp.c
> @@ -18,6 +18,9 @@
>  #include <arpa/inet.h>
>  #include <linux/netlink.h>
>  #include <linux/rtnetlink.h>
> +#include <signal.h>
> +
> +

Remove additional newlines.

>  
>  #include <libfreecwmp.h>
>  #include <libubox/uloop.h>
> @@ -194,11 +197,27 @@ netlink_init(void)
>  	return 0;
>  }
>  
> +void signal_kill_all_handler(int sig)
> +{
> +     pthread_exit(NULL);
> +}
> +
> +
> +
>  int main (int argc, char **argv)
>  {
>  	freecwmp_log_message(NAME, L_NOTICE, "daemon started\n");
>  
>  	bool foreground = false;
> +	struct sigaction sigint_action;
> +
> +	sigint_action.sa_handler = &signal_kill_all_handler;
> +	sigemptyset (&sigint_action.sa_mask);
> +	/* reset handler in case when pthread_cancel didn't stop
> +	   threads for some reason */
> +	sigint_action.sa_flags = SA_RESETHAND;
> +	sigaction(SIGTERM, &sigint_action, NULL);
> +
>  
>  	setlocale(LC_CTYPE, "");
>  	umask(0037);
> diff --git a/src/freecwmp.h b/src/freecwmp.h
> index cb2a548..22d22cf 100644
> --- a/src/freecwmp.h
> +++ b/src/freecwmp.h
> @@ -13,6 +13,7 @@
>  #define NAME	"freecwmpd"
>  
>  #define FREE(x) do { free(x); x = NULL; } while (0);
> +#define CFREE(x) if (x) free(x);

Either use free() function or use FREE macro. free(NULL) is valid in C.

>  
>  #ifdef DEBUG
>  #define D(format, ...) fprintf(stderr, "%s(%d): " format, __func__, __LINE__, ## __VA_ARGS__)
> diff --git a/src/ubus.c b/src/ubus.c
> index c10170d..b2e9681 100644
> --- a/src/ubus.c
> +++ b/src/ubus.c
> @@ -16,6 +16,7 @@
>  #include "config.h"
>  #include "cwmp.h"
>  #include "freecwmp.h"
> +#include "external.h"
>  
>  static struct ubus_context *ctx = NULL;
>  static struct ubus_object main_object;
> @@ -157,10 +158,136 @@ freecwmpd_handle_command(struct ubus_context *ctx, struct ubus_object *obj,
>  	return 0;
>  }
>  
> +static enum getParamValues {
> +	GETPARAMVALUES_PARAM,

Rename "GETPARAMVALUES_" to "GET_PARAM_VALUES_"

> +	GETPARAMVALUES_VALUE,
> +	GETPARAMVALUES_TYPE,
> +	GETPARAMVALUES_FAULT,
> +	__GETPARAMVALUES_MAX
> +};
> +
> +static const struct blobmsg_policy getParamValues_policy[] = {
> +	[GETPARAMVALUES_PARAM] = { .name = "parameter", .type = BLOBMSG_TYPE_STRING },
> +	[GETPARAMVALUES_VALUE] = { .name = "value", .type = BLOBMSG_TYPE_STRING },
> +	[GETPARAMVALUES_TYPE] = { .name = "type", .type = BLOBMSG_TYPE_STRING },
> +	[GETPARAMVALUES_FAULT] = { .name = "fault_code", .type = BLOBMSG_TYPE_STRING },

Is there any reason why this is not an BLOBMSG_TYPE_INT* ?

> +};
> +
> +static int
> +freecwmpd_handle_getParamValues(struct ubus_context *ctx, struct ubus_object *obj,

Functions and variables  should be named with all lowercase letters.
Where needed separate with "_".

> +			struct ubus_request_data *req, const char *method,
> +			struct blob_attr *msg)
> +{
> +	struct blob_attr *tb[__GETPARAMVALUES_MAX];
> +
> +	blobmsg_parse(getParamValues_policy, ARRAY_SIZE(getParamValues_policy), tb,
> +		      blob_data(msg), blob_len(msg));
> +
> +	if (!tb[GETPARAMVALUES_PARAM])
> +		return UBUS_STATUS_INVALID_ARGUMENT;
> +
> +
> +	freecwmp_log_message(NAME, L_NOTICE,
> +			     "triggered ubus GetParameterValues parameter %s\n",
> +			     blobmsg_data(tb[GETPARAMVALUES_PARAM]));
> +
> +

Remove additional newlines.

> +	external_add_list_paramameter(blobmsg_data(tb[GETPARAMVALUES_PARAM]),
> +			tb[GETPARAMVALUES_VALUE]? blobmsg_data(tb[GETPARAMVALUES_VALUE]) : NULL,
> +			tb[GETPARAMVALUES_TYPE]? blobmsg_data(tb[GETPARAMVALUES_TYPE]) : "xsd:string",
> +			tb[GETPARAMVALUES_FAULT]? blobmsg_data(tb[GETPARAMVALUES_FAULT]) : NULL);
> +
> +	return 0;
> +}
> +
> +static enum getParamNames {
> +	GETPARAMNAMES_PARAM,

Rename "GETPARAMNAMES_" to "GET_PARAM_NAMES_".
> +	GETPARAMNAMES_WRITABLE,
> +	GETPARAMNAMES_FAULT,
> +	__GETPARAMNAMES_MAX
> +};
> +
> +static const struct blobmsg_policy getParamNames_policy[] = {
> +	[GETPARAMNAMES_PARAM] = { .name = "parameter", .type = BLOBMSG_TYPE_STRING },
> +	[GETPARAMNAMES_WRITABLE] = { .name = "writable", .type = BLOBMSG_TYPE_STRING },

Is there any reason why this is not BLOBMSG_TYPE_INT8 ?

> +	[GETPARAMNAMES_FAULT] = { .name = "fault_code", .type = BLOBMSG_TYPE_STRING },

Is there any reason why this is not an BLOBMSG_TYPE_INT* ?

> +};
> +
> +static int
> +freecwmpd_handle_getParamNames(struct ubus_context *ctx, struct ubus_object *obj,
> +			struct ubus_request_data *req, const char *method,
> +			struct blob_attr *msg)
> +{
> +	struct blob_attr *tb[__GETPARAMNAMES_MAX];
> +
> +	blobmsg_parse(getParamNames_policy, ARRAY_SIZE(getParamNames_policy), tb,
> +		      blob_data(msg), blob_len(msg));
> +
> +	if (!tb[GETPARAMNAMES_PARAM])
> +		return UBUS_STATUS_INVALID_ARGUMENT;
> +
> +
> +	freecwmp_log_message(NAME, L_NOTICE,
> +			     "triggered ubus GetParameterNames parameter %s\n",
> +			     blobmsg_data(tb[GETPARAMNAMES_PARAM]));
> +
> +

Remove additional newlines.

> +	external_add_list_paramameter(blobmsg_data(tb[GETPARAMNAMES_PARAM]),
> +			tb[GETPARAMNAMES_WRITABLE]? blobmsg_data(tb[GETPARAMNAMES_WRITABLE]) : NULL,
> +			NULL,
> +			tb[GETPARAMNAMES_FAULT]? blobmsg_data(tb[GETPARAMNAMES_FAULT]) : NULL);
> +
> +	return 0;
> +}
> +
> +static enum getParamAttributes {
> +	GETPARAMATTRIBUTES_PARAM,
> +	GETPARAMATTRIBUTES_NOTIF,
> +	GETPARAMATTRIBUTES_FAULT,
> +	__GETPARAMATTRIBUTES_MAX
> +};
> +
> +static const struct blobmsg_policy getParamAttributes_policy[] = {
> +	[GETPARAMATTRIBUTES_PARAM] = { .name = "parameter", .type = BLOBMSG_TYPE_STRING },
> +	[GETPARAMATTRIBUTES_NOTIF] = { .name = "notification", .type = BLOBMSG_TYPE_STRING },
> +	[GETPARAMATTRIBUTES_FAULT] = { .name = "fault_code", .type = BLOBMSG_TYPE_STRING },
> +};
> +
> +static int
> +freecwmpd_handle_getParamAttributes(struct ubus_context *ctx, struct ubus_object *obj,
> +			struct ubus_request_data *req, const char *method,
> +			struct blob_attr *msg)
> +{
> +	struct blob_attr *tb[__GETPARAMATTRIBUTES_MAX];
> +
> +	blobmsg_parse(getParamAttributes_policy, ARRAY_SIZE(getParamAttributes_policy), tb,
> +		      blob_data(msg), blob_len(msg));
> +
> +	if (!tb[GETPARAMATTRIBUTES_PARAM])
> +		return UBUS_STATUS_INVALID_ARGUMENT;
> +
> +	if (!tb[GETPARAMATTRIBUTES_NOTIF])
> +		return UBUS_STATUS_INVALID_ARGUMENT;
> +
> +	freecwmp_log_message(NAME, L_NOTICE,
> +			     "triggered ubus GetParameterAttributes parameter %s\n",
> +			     blobmsg_data(tb[GETPARAMATTRIBUTES_PARAM]));
> +
> +	external_add_list_paramameter(blobmsg_data(tb[GETPARAMATTRIBUTES_PARAM]),
> +				      blobmsg_data(tb[GETPARAMATTRIBUTES_NOTIF]),
> +				      NULL,
> +				      blobmsg_data(tb[GETPARAMATTRIBUTES_FAULT]));
> +
> +	return 0;
> +}
> +
>  static const struct ubus_method freecwmp_methods[] = {
>  	UBUS_METHOD("notify", freecwmpd_handle_notify, notify_policy),
>  	UBUS_METHOD("inform", freecwmpd_handle_inform, inform_policy),
>  	UBUS_METHOD("command", freecwmpd_handle_command, command_policy),
> +	UBUS_METHOD("GetParameterValues", freecwmpd_handle_getParamValues, getParamValues_policy),

Please rename this to:

UBUS_METHOD("get_parameter_values", freecwmpd_handle_get_parameter_values, get_parameter_values_policy),

> +	UBUS_METHOD("GetParameterNames", freecwmpd_handle_getParamNames, getParamNames_policy),

See above.

> +	UBUS_METHOD("GetParameterAttributes", freecwmpd_handle_getParamAttributes, getParamAttributes_policy),

See above.

>  };
>  
>  static struct ubus_object_type main_object_type =
> diff --git a/src/xml.c b/src/xml.c
> index 9fa036b..053ee1a 100644
> --- a/src/xml.c
> +++ b/src/xml.c
> @@ -21,6 +21,8 @@
>  #include "messages.h"
>  #include "time.h"
>  
> +extern struct list_head external_list_parameter;
> +
>  struct rpc_method {
>  	const char *name;
>  	int (*handler)(mxml_node_t *body_in, mxml_node_t *tree_in,
> @@ -217,6 +219,7 @@ int xml_prepare_inform_message(char **msg_out)
>  {
>  	mxml_node_t *tree, *b;
>  	char *c, *tmp;
> +	struct external_parameter *external_parameter;
>  
>  #ifdef DUMMY_MODE
>  	FILE *fp;
> @@ -335,37 +338,33 @@ int xml_prepare_inform_message(char **msg_out)
>  	if (mxmlGetType(b) != MXML_ELEMENT)
>  		goto error;
>  
> -	tmp = "InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANIPConnection.1.ExternalIPAddress";
> -	b = mxmlFindElementText(tree, tree, tmp, MXML_DESCEND);
> -	if (!b) goto error;
> -
> -	b = b->parent->next->next;
> -	if (mxmlGetType(b) != MXML_ELEMENT)
> +	external_get_action_write("value","InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANIPConnection.1.ExternalIPAddress", NULL);

Missing space here: "value","

> +	external_get_action_write("value","InternetGatewayDevice.ManagementServer.ConnectionRequestURL", NULL);

Missing space here: "value","

> +	if (external_get_action_execute())
>  		goto error;
>  
> -	c = NULL;
> -	if (external_get_action("value", tmp, &c)) goto error;
> -	if (c) {
> -		b = mxmlNewText(b, 0, c);
> -		FREE(c);
> -		if (!b) goto error;
> -	}
> -
> -	tmp = "InternetGatewayDevice.ManagementServer.ConnectionRequestURL";
> -	b = mxmlFindElementText(tree, tree, tmp, MXML_DESCEND);
> -	if (!b) goto error;
> +	while (external_list_parameter.next!=&external_list_parameter)
> +	{

Bracket should go in the same line like while.

> +		external_parameter = list_entry(external_list_parameter.next, struct external_parameter, list);
> +		b = mxmlFindElementText(tree, tree, external_parameter->name, MXML_DESCEND);
> +		if (!b) continue;
>  
>  	b = b->parent->next->next;
>  	if (mxmlGetType(b) != MXML_ELEMENT)
>  		goto error;
>  
> -	c = NULL;
> -	if (external_get_action("value", tmp, &c)) goto error;
> -	if (c) {
> -		b = mxmlNewText(b, 0, c);
> -		FREE(c);
> +		if (external_parameter->data) {
> +			b = mxmlNewText(b, 0, external_parameter->data);
>  		if (!b) goto error;
>  	}
> +		list_del(&external_parameter->list);
> +		CFREE(external_parameter->name);
> +		CFREE(external_parameter->data);
> +		CFREE(external_parameter->type);
> +		CFREE(external_parameter->fault_code);
> +		CFREE(external_parameter);
> +	}
> +
>  
>  	if (xml_prepare_notifications_inform(tree))
>  		goto error;
> @@ -376,6 +375,7 @@ int xml_prepare_inform_message(char **msg_out)
>  	return 0;
>  
>  error:
> +	external_free_list_parameter();
>  	mxmlDelete(tree);
>  	return -1;
>  }
> @@ -628,10 +628,11 @@ int xml_handle_get_parameter_values(mxml_node_t *body_in,
>  				    mxml_node_t *tree_in,
>  				    mxml_node_t *tree_out)
>  {
> -	mxml_node_t *n, *b = body_in;
> +	mxml_node_t *n, *ParameterList, *b = body_in;

Variables must be lower case.

> +	struct external_parameter *external_parameter;
>  	char *parameter_name = NULL;
>  	char *parameter_value = NULL;
> -	char *c;
> +	char *c = NULL;
>  	int counter = 0;
>  
>  	n = mxmlFindElement(tree_out, tree_out, "soap_env:Body",
> @@ -655,29 +656,44 @@ int xml_handle_get_parameter_values(mxml_node_t *body_in,
>  		    !strcmp(b->parent->value.element.name, "string")) {
>  			parameter_name = b->value.text.string;
>  		}
> -
> +		if (b && b->type == MXML_ELEMENT && /* added in order to support GetParameterValues with empty string*/
> +			!strcmp(b->value.element.name, "string") &&
> +			!b->child) {
> +			parameter_name = "";
> +		}
>  		if (parameter_name) {
>  			if (!config_get_cwmp(parameter_name, &parameter_value)) {
> +				external_add_list_paramameter(parameter_name,parameter_value,"xsd:string",NULL);
> +				FREE(parameter_value);
>  				// got the parameter value using libuci
> -			} else if (!external_get_action("value",
> -					parameter_name, &parameter_value)) {
> +			} else if (!external_get_action_write("value",parameter_name, NULL)) {
>  				// got the parameter value via external script
>  			} else {
>  				// error occurred when getting parameter value
>  				goto out;
>  			}
> -			counter++;
> +		}
> +		b = mxmlWalkNext(b, body_in, MXML_DESCEND);
> +		parameter_name = NULL;
> +	}
>  
> -			n = mxmlFindElement(tree_out, tree_out, "ParameterList", NULL, NULL, MXML_DESCEND);
> -			if (!n) goto out;
> +	if (external_get_action_execute())
> +		goto out;
> +
> +	ParameterList = mxmlFindElement(tree_out, tree_out, "ParameterList", NULL, NULL, MXML_DESCEND);
> +	if (!ParameterList) goto out;
> +
> +	while (external_list_parameter.next!=&external_list_parameter) {
> +
> +		external_parameter = list_entry(external_list_parameter.next, struct external_parameter, list);
>  
> -			n = mxmlNewElement(n, "ParameterValueStruct");
> +		n = mxmlNewElement(ParameterList, "ParameterValueStruct");
>  			if (!n) goto out;
>  
>  			n = mxmlNewElement(n, "Name");
>  			if (!n) goto out;
>  
> -			n = mxmlNewText(n, 0, parameter_name);
> +		n = mxmlNewText(n, 0, external_parameter->name);
>  			if (!n) goto out;
>  
>  			n = n->parent->parent;
> @@ -685,23 +701,19 @@ int xml_handle_get_parameter_values(mxml_node_t *body_in,
>  			if (!n) goto out;
>  
>  #ifdef ACS_MULTI
> -			mxmlElementSetAttr(n, "xsi:type", "xsd:string");
> +		mxmlElementSetAttr(n, "xsi:type", external_parameter->type);
>  #endif
> -			n = mxmlNewText(n, 0, parameter_value ? parameter_value : "");
> +		n = mxmlNewText(n, 0, external_parameter->data? external_parameter->data : "");
>  			if (!n) goto out;
>  
> -			/*
> -			 * three day's work to finally find memory leak if we
> -			 * free parameter_name;
> -			 * it points to: b->value.text.string
> -			 *
> -			 * also, parameter_value can be NULL so we don't do checks
> -			 */
> -			parameter_name = NULL;
> -		}
> +		counter++;
>  		
> -		FREE(parameter_value);
> -		b = mxmlWalkNext(b, body_in, MXML_DESCEND);
> +		list_del(&external_parameter->list);
> +		CFREE(external_parameter->name);
> +		CFREE(external_parameter->data);
> +		CFREE(external_parameter->type);
> +		CFREE(external_parameter->fault_code);
> +		CFREE(external_parameter);
>  	}
>  
>  #ifdef ACS_MULTI
> @@ -716,11 +728,10 @@ int xml_handle_get_parameter_values(mxml_node_t *body_in,
>  	FREE(c);
>  #endif
>  
> -	FREE(parameter_value);
>  	return 0;
>  
>  out:
> -	FREE(parameter_value);
> +	external_free_list_parameter();
>  	return -1;
>  }
>  

Luka

From mohamed.kallel@pivasoftware.com Tue Nov 20 15:26:53 2012
Received: with ECARTIS (v1.0.0; list freecwmp); Tue, 20 Nov 2012 15:26:54 +0100 (CET)
Received: from moutng.kundenserver.de ([212.227.17.9]:58232 "EHLO
        moutng.kundenserver.de" rhost-flags-OK-OK-OK-OK)
        by eddie.linux-mips.org with ESMTP id S6816900Ab2KTO0xucU0r (ORCPT
        <rfc822;freecwmp@linux-mips.org>); Tue, 20 Nov 2012 15:26:53 +0100
Received: from [127.0.0.1] ([41.230.19.64])
        by mrelayeu.kundenserver.de (node=mreu2) with ESMTP (Nemesis)
        id 0LhAAN-1SxNQX0dwF-00oRfq; Tue, 20 Nov 2012 15:26:48 +0100
Message-ID: <50AB9323.9080808@pivasoftware.com>
Date:   Tue, 20 Nov 2012 15:26:43 +0100
From:   KALLEL Mohamed <mohamed.kallel@pivasoftware.com>
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:16.0) Gecko/20121026 Thunderbird/16.0.2
MIME-Version: 1.0
To:     freecwmp@linux-mips.org
Subject: Fwd: Re: Question concerning libubox and multithread
References: <509A6EBE.2040205@openwrt.org>
In-Reply-To: <509A6EBE.2040205@openwrt.org>
X-Forwarded-Message-Id: <509A6EBE.2040205@openwrt.org>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 8bit
X-Provags-ID: V02:K0:YyKa4vKqZf518lGRUSXE61YnUzXww8JaAoCFDO15akx
 x2fGtvvIhZccALJKrItpFm6nL6w07IJsAlLV92sB7446i8DyJw
 ttOWtGWmjwqhGO+8GC+QVNb/CpGQdNMv2OHOtFuStFUo5vzUW1
 UHXnNrVwMOCG+B5YRRDBwQuzUkr1r6MNkGrzn5gjwww5gpKnt8
 CvTrDpPNoHLM79+6UKRN1161Cc8AkpSl9D9THKEXFE50XA4JU2
 o1sJLAU1jL0vYQWUc8dnsF3swi3d1qCGHWo5+b4t/y0OV6LdB7
 TGhlQOsDpFw97xPDuJek+U/JzmI3fpsrQWWdKzjdBzK5bbb51U
 OFBDeNE/R2rf90REwKBlb6QAVdC7dZ7lYCdOdrds6
Return-Path: <mohamed.kallel@pivasoftware.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s freecwmp"> (uid 0)
X-Orcpt: rfc822;freecwmp@linux-mips.org
Original-Recipient: rfc822;freecwmp@linux-mips.org
X-archive-position: 74
X-ecartis-version: Ecartis v1.0.0
Sender: freecwmp-bounce@linux-mips.org
Errors-to: freecwmp-bounce@linux-mips.org
X-original-sender: mohamed.kallel@pivasoftware.com
Precedence: bulk
X-list: freecwmp



-------- Message original --------
Sujet: 	Re: Question concerning libubox and multithread
Date : 	Wed, 07 Nov 2012 15:22:54 +0100
De : 	Felix Fietkau <nbd@openwrt.org>
Pour : 	KALLEL Mohamed <mohamed.kallel@pivasoftware.com>
Copie à : 	<blogic@openwrt.org>, <steven@midlink.org>



On 2012-11-07 2:59 PM, KALLEL Mohamed wrote:
> Hello
>
> I m contributing in the development of an opensource project which use
> libubox. and I remarked that libubox execute handler functions in
> monothread mode and not in muItithread mode.
>
> 1) so I m wondering if the libubox supports execution of handler in
> multi thread mode ?
> 2) if yes how to activate multithread for registred handlers with libubox
> 3) if no. I m able to create 2 threads in my main program and then each
> thread will call libubox functions to register handler function. Could
> you give a quick how to do it with libubox?
Hi,

uloop in libubox is currently not designed in a thread-safe way. I would
recommend running uloop in one thread only, and handing processing for
received events off to other threads. Would that be enough for the needs
of your application or do you need any specific changes?

I have not really looked at thread-safe use of epoll yet (which is used
in uloop internally), I only remember some recent kernel related
discussion pointing out that its threaded use may be a bit tricky
because of some race conditions that were only fixed recently.

- Felix





