diff --git a/src/extended/hw_nat/hw_nat.c b/src/extended/hw_nat/hw_nat.c
new file mode 100644
index 0000000..555d451
--- /dev/null
+++ b/src/extended/hw_nat/hw_nat.c
@@ -0,0 +1,847 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/ioctl.h>
+#include <fcntl.h>
+#include <getopt.h>
+#include <strings.h>
+#include <unistd.h>
+#ifndef CONFIG_SUPPORT_OPENWRT
+#include <linux/autoconf.h>
+#endif
+
+#if defined CONFIG_COLGIN_SUPPORT
+#include "hnat_ioctl.h"
+#else
+#include "hwnat_ioctl.h"
+#endif
+#include "hwnat_api.h"
+#include "util.h"
+
+void show_usage(void)
+{
+    printf("Add Static Entry\n");
+    printf("hw_nat -a -h [SMAC] -i [DMAC] -1 [type:hnapt(0)/ipv6_rout(5)]-j [Sip] -2 [Dip] -l [Sp] -3 [Dp]\n");
+    printf("	   -n [New_Sip] -o [New_Dip] -p [New_Sp] -q [New_Dp] -4 [Vlan_layer] -5 [dscp]\n");
+    printf("	   -s [VLAN1_ID] -S [VLAN2_ID] -v [Tcp/Udp] -w [OutIf:CPU/GE1/GE2]\n");
+    printf("Ex(ipv4): hw_nat -a -h 00:0C:43:28:80:11 -i E0:18:77:BD:D5:18 -1 0 -j 10.10.10.3 -2 10.10.20.3\n");
+    printf("-l 1000 -3 2000 -n 10.10.20.254 -o 10.10.20.3 -p 1000 -q 2000 -4 1 -s 1 -v Tcp -w GE2 -5 32\n\n");
+
+    printf("Ex(ipv6): hw_nat -a -h 00:0C:43:28:02:14 -i 00:1B:21:00:9B:03 -1 5 -6 2001:1111:2222:3333:0000:0000:0000:2\n");
+    printf("-7 2001:aaa:6401:101:8000:0000:0000:2 -l 3000 -3 2000 -4 0 -v Tcp -w GE1 -5 32\n\n");
+
+    printf("Del Static Entry\n");
+    printf("hw_nat -b -1 [type:hnapt(0)/ipv6_rout(5)] -j [Sip] -2 [Dip] -l [Sp] -3 [Dp] -v [Tcp/Udp] \n");
+    printf("Ex: hw_nat -b -j 10.10.10.3 -k 10.10.20.3 -l 30 -m 40 -v Tcp\n\n");
+#if defined (CONFIG_HW_NAT_SEMI_AUTO_MODE)
+    printf("Add semi-auto Entry\n");
+    printf("hw_nat -a -1 [type:hnapt(0)/ipv6_rout(5)]-j [Sip] -2 [Dip] -l [Sp] -m [Dp]\n");
+    printf("hw_nat -a -1 0 -j 10.10.10.3 -2 10.10.20.3 -l 1000 -3 2000 \n");
+    printf("hw_nat -a -1 5 -j 2001:1111:2222:3333:0000:0000:0000:2 -2 2001:aaa:6401:101:8000:0000:0000:2 -l 3000 -3 2000\n");
+    printf("Delete semi-auto Entry\n");
+    printf("hw_nat -b -1 0 -j 10.10.10.3 -2 10.10.20.3 -l 1000 -3 2000\n");
+    printf("hw_nat -b -1 5 -j 2001:1111:2222:3333:0000:0000:0000:2 -2 2001:aaa:6401:101:8000:0000:0000:2 -l 3000 -3 2000\n");
+#endif
+    printf("Show Foe Entry\n");
+    printf("hw_nat -c [entry_num]\n");
+    printf("Ex: hw_nat -c 1234\n\n");
+
+    printf("Set Debug Level (0:disable) \n");
+    printf("hw_nat -d [0~7]\n");
+    printf("Ex: hw_nat -d \n\n");
+
+    printf("Show All Foe Invalid Entry\n");
+    printf("Ex: hw_nat -e\n\n");
+
+    printf("Show All Foe Unbinded Entry\n");
+    printf("Ex: hw_nat -f\n\n");
+
+    printf("Show All Foe Binded Entry\n");
+    printf("Ex: hw_nat -g\n\n");
+
+    printf("Unbind Foe Entry\n");
+    printf("hw_nat -x [entry_num]\n");
+    printf("Ex: hw_nat -x 1234\n\n");
+
+    printf("Set Foe Entry to PacketDrop\n");
+    printf("hw_nat -k [entry_num]\n");
+    printf("Ex: hw_nat -k 1234\n\n");
+
+
+#if defined (CONFIG_PPE_MCAST)
+    printf("Add member port in multicast entry\n");
+    printf("Ex: hw_nat -B [vid] [mac] [px_en] [px_qos_en] [mc_qos_qid]\n\n");
+
+    printf("Del member port multicast entry\n");
+    printf("Ex: hw_nat -C [vid] [mac] [px_en] [px_qos_en] [mc_qos_qid]\n\n");
+
+    printf("Dump all multicast entry\n");
+    printf("Ex: hw_nat -D\n\n");
+#endif
+
+    printf("Set PPE Cofigurations:\n");
+    printf("Set HNAT binding threshold per second (d=30)\n");
+    printf("Ex: hw_nat -N [1~65535]\n\n");
+
+
+    printf("Set HNAT TCP/UDP keepalive interval (d=1, 1)(unit:4sec)\n");
+    printf("Ex: hw_nat -Q [1~255][1~255]\n\n");
+
+    printf("Disable Hook API (hook_id: 0=ETH, 1=MD, 2=WIFI, 3=RNDIS, 4=EXT)\n");
+    printf("Ex: hw_nat -O <hook_id>, hwnat -O [0/1/2/3/4]\n\n");
+
+    printf("Restore Hook API (hook_id: 0=ETH, 1=MD, 2=WIFI, 3=RNDIS, 4=EXT)\n");
+    printf("Ex: hw_nat -T <hook_id>, hwnat -T [0/1/2/3/4]\n\n");
+
+    printf("Disable Hook API on specific direction (hook_id: 0=ETH, 1=MD, 2=WIFI, 3=RNDIS, 4=EXT) (dir: 1:rx, 2:tx)\n");
+    printf("Ex: hw_nat -O <hook_id> -P <dir_id>, hwnat -O [0/1/2/3/4] -P[1/2]\n\n");
+
+    printf("Restore Hook API on specific direction (hook_id: 0=ETH, 1=MD, 2=WIFI, 3=RNDIS, 4=EXT) (dir: 1:rx, 2:tx)\n");
+    printf("Ex: hw_nat -T <hook_id> -P <dir_id>, hwnat -T [0/1/2/3/4] -P[1/2]\n\n");
+
+    printf("Set HNAT Life time of Binded TCP/UDP/FIN entry(d=5, 5, 5)(unit:1Sec) \n");
+    printf("Ex: hw_nat -U [1~65535][1~65535][1~65535]\n\n");
+
+    printf("Set LAN/WAN port VLAN ID\n");
+    printf("Ex: hw_nat -V [LAN_VID] [WAN_VID]\n\n");
+    printf("Ex: hw_nat -V 1 2\n\n");
+
+    printf("Only Speed UP (0=Upstream, 1=Downstream, 2=Bi-Direction) flow \n");
+    printf("Ex: hw_nat -Z 1\n\n");
+
+#if defined (CONFIG_RALINK_MT7620) || defined (CONFIG_RALINK_MT7621)
+    printf("Switch Ds-Lite and Map-E(0=Ds-Lite, 1=Map-E,(d=0)):\n");
+    printf("Ex: hw_nat -W [0/1]\n\n");
+#endif
+#if defined (CONFIG_PPE_MIB)
+    printf("Get ppe entry mib counter\n");
+    printf("hw_nat -M -1 [type:hnapt(0)/ipv6_rout(5)]-j [Sip] -2 [Dip] -l [Sp] -m [Dp]\n");
+    printf("hw_nat -M -1 0 -j 10.10.10.3 -2 10.10.20.3 -l 1000 -3 2000 \n");
+    printf("hw_nat -M -1 5 -j 2001:1111:2222:3333:0000:0000:0000:2 -2 2001:aaa:6401:101:8000:0000:0000:2 -l 3000 -3 2000\n");
+    printf("Get ppe entry all mib counter sort by IP\n");
+    printf("hw_nat -X\n");
+#endif
+#if defined (CONFIG_HW_NAT_IPI)
+    printf("Set HNAT IPI control from extif:\n");
+    printf("EX: hw_nat -G [ipi_enable] [queue_thresh] [drop_pkt] [ipi_cnt_mod]\n\n");
+    printf("Set HNAT IPI control from ppehit:\n");
+    printf("EX: hw_nat -L [ipi_enable] [queue_thresh] [drop_pkt] [ipi_cnt_mod]\n\n");
+    printf("hw_nat -G 1 1000 20000 5\n");
+    printf("hw_nat -L 1 1000 20000 44\n");
+#endif
+}
+#if defined CONFIG_COLGIN_SUPPORT
+static void dump_all_ip_cnt(struct hwnat_mib_all_ip_args *args)
+{
+	int i;
+	if(args->entry_num > 0)
+		printf("IP            tx_packets     tx_bytes     rx_packets     rx_bytes\n");
+	for(i=0; i<args->entry_num; i++) {
+		if(args->entries[i].is_ipv4) { //IPV4_NAPT
+			printf("%8x	%10ld  %10ld  %10ld  %10ld\n",
+			args->entries[i].ip.ipv4_addr,
+			args->entries[i].tx_packets,
+			args->entries[i].tx_bytes,
+			args->entries[i].rx_packets,
+			args->entries[i].rx_bytes);
+		} else { //IPV6_5T_ROUTE
+			printf(" %4x:%4x:%4x:%4x:%4x:%4x:%4x:%4x	%10ld  %10ld  %10ld  %10ld\n",
+				NIPHALF(args->entries[i].ip.ipv6_addr[0]),
+				NIPHALF(args->entries[i].ip.ipv6_addr[1]),
+				NIPHALF(args->entries[i].ip.ipv6_addr[2]),
+				NIPHALF(args->entries[i].ip.ipv6_addr[3]),
+				args->entries[i].tx_packets,
+				args->entries[i].tx_bytes,
+				args->entries[i].rx_packets,
+				args->entries[i].rx_bytes);
+		}
+	}
+}
+#endif
+int main(int argc, char *argv[])
+{
+    int opt;
+
+    //char options[] = "aefgy?c:x:k:d:A:B:C:DN:O:P:Q:T:U:V:Z:";
+    char options[] = "abefgyzMD?c:m:r:A:B:C:G:I:J:K:L:S:d:h:i:j:1:k:2:l:3:n:o:p:q:4:s:P:t:u:v:w:5:x:y:N:O:Q:T:U:Z:L:7:8:9:E:F:H:R:6:X";
+
+    int fd, method = -1;
+    int i=0;
+    unsigned int entry_num;
+    unsigned int debug;
+    unsigned int type;
+    struct hwnat_args *args;
+    struct hwnat_tuple args2 = {0};
+    struct hwnat_ac_args args3;
+    struct hwnat_config_args args4;
+#if defined (CONFIG_HW_NAT_IPI)
+    struct hwnat_ipi_args args6;
+    struct hwnat_ipi_args args7;
+#endif
+
+#if defined (CONFIG_PPE_MCAST)
+    struct hwnat_mcast_args args5;
+    unsigned char mac[6];
+#endif
+#if defined (CONFIG_RALINK_MT7620) || defined (CONFIG_RALINK_MT7621)
+	unsigned int swit;
+#endif
+    int	   result;
+#if defined CONFIG_COLGIN_SUPPORT
+	int org_tot_len = 1362;
+	int org_id = 0;
+	int org_frag =0;
+	int chksum_tmp, tot_len_tmp, id_tmp, frag_tmp;
+	int chksum_base = 0;
+	struct hwnat_mib_all_ip_args *args8;
+#endif
+    fd = open("/dev/"HW_NAT_DEVNAME, O_RDONLY);
+    if (fd < 0)
+    {
+	printf("Open %s pseudo device failed\n","/dev/"HW_NAT_DEVNAME);
+	return 0;
+    }
+
+    if(argc < 2) {
+	show_usage();
+        close(fd);
+	return 0;
+    }
+
+    /* Max table size is 16K */
+    args=malloc(sizeof(struct hwnat_args)+sizeof(struct hwnat_tuple)*1024*16);
+    if (NULL == args)
+    {
+	    printf(" Allocate memory for hwnat_args and hwnat_tuple failed.\n");
+            close(fd);
+	    return 0;
+    }
+
+    while ((opt = getopt (argc, argv, options)) != -1) {
+	switch (opt) {
+	case 'h':
+		 str_to_mac(args2.smac, optarg);
+		 break;
+	case 'i':
+		 str_to_mac(args2.dmac, optarg);
+		 break;
+	case '1':
+		 type = strtoll(optarg, NULL, 10);
+		 args2.pkt_type = type;
+		 break;
+	case 'j':
+		if ((type == 0) || (type == 7)) {
+			str_to_ip(&args2.ing_sipv4, optarg);
+		} else if((type == 5) || (type == 3)) {
+			str_to_ipv6(&args2.ing_sipv6_0, optarg, 0);
+			str_to_ipv6(&args2.ing_sipv6_1, optarg, 1);
+			str_to_ipv6(&args2.ing_sipv6_2, optarg, 2);
+			str_to_ipv6(&args2.ing_sipv6_3, optarg, 3);
+		} else {
+			printf("hwnat type error\n");
+			free(args);
+			close(fd);
+			return 0;
+		}
+		 break;
+	case '2':
+		if ((type == 0) || (type == 7)) {
+			str_to_ip(&args2.ing_dipv4, optarg);
+		} else if((type == 5) || (type == 3)) {
+			str_to_ipv6(&args2.ing_dipv6_0, optarg, 0);
+			str_to_ipv6(&args2.ing_dipv6_1, optarg, 1);
+			str_to_ipv6(&args2.ing_dipv6_2, optarg, 2);
+			str_to_ipv6(&args2.ing_dipv6_3, optarg, 3);
+		} else {
+			printf("hwnat type error\n");
+			free(args);
+			close(fd);
+			return 0;
+		}
+		 break;
+	case 'l':
+		 args2.ing_sp = strtoll(optarg, NULL, 10);
+		 break;
+	case '3':
+		 args2.ing_dp = strtoll(optarg, NULL, 10);
+		 break;
+	case 'n':
+		 str_to_ip(&args2.eg_sipv4, optarg);
+		 break;
+	case 'o':
+		 str_to_ip(&args2.eg_dipv4, optarg);
+		 break;
+	case 'p':
+		 args2.eg_sp = strtoll(optarg, NULL, 10);
+		 break;
+	case 'q':
+		 args2.eg_dp = strtoll(optarg, NULL, 10);
+		 break;
+	case '4':
+		 args2.vlan_layer = strtoll(optarg, NULL, 10);
+		 break;
+	case 's':
+		 args2.vlan1 = strtoll(optarg, NULL, 10);
+                 break;
+	case 'S':
+		 args2.vlan2 = strtoll(optarg, NULL, 10);
+		 break;
+#if defined CONFIG_COLGIN_SUPPORT
+	case 'P':
+		args2.etype = strtoll(optarg, NULL, 16);
+		break;
+#endif
+	case 't':
+		 if(strcasecmp(optarg,"Ins")==0){
+			 args2.pppoe_act=1;
+		 }else if(strcasecmp(optarg,"Del")==0){
+			 args2.pppoe_act=0;
+		 }else{
+			 printf("Error: -t No/Mod/Ins/Del\n");
+			 free(args);
+			 close(fd);
+			 return 0;
+		 }
+		 break;
+	case 'u':
+		 args2.pppoe_id = strtoll(optarg, NULL, 10);
+		 break;
+	case 'v':
+		 if(strcasecmp(optarg,"Tcp")==0){
+			 args2.is_udp=0;
+		 }else if(strcasecmp(optarg,"Udp")==0){
+			 args2.is_udp=1;
+		 }else {
+			 printf("Error: -v Tcp/Udp\n");
+			 free(args);
+			 close(fd);
+			 return 0;
+		 }
+		 break;
+	case 'w':
+		 if(strcasecmp(optarg,"CPU")==0){
+			 args2.dst_port=0;
+		 }else if(strcasecmp(optarg,"GE1")==0){
+			 args2.dst_port=1;
+		 }else if(strcasecmp(optarg,"GE2")==0){
+			 args2.dst_port=2;
+		 }else if(strcasecmp(optarg,"P9")==0){
+			 args2.dst_port=9;
+		 }else if(strcasecmp(optarg,"P8")==0){
+			 args2.dst_port=8;
+		 }else if(strcasecmp(optarg,"p10")==0){
+			 args2.dst_port=10;
+		 }else if(strcasecmp(optarg,"p11")==0){
+			 args2.dst_port=11;
+		 }else if(strcasecmp(optarg,"p12")==0){
+			 args2.dst_port=12;
+		 }else {
+			printf("Error: -w CPU/GE1/GE2\n");
+			free(args);
+			close(fd);
+			return 0;
+		 }
+		 break;
+	case '5':
+		 args2.dscp = strtoll(optarg, NULL, 10);
+		 break;
+	case '7':
+		str_to_ipv6(&args2.ing_sipv6_0, optarg, 0);
+		str_to_ipv6(&args2.ing_sipv6_1, optarg, 1);
+		str_to_ipv6(&args2.ing_sipv6_2, optarg, 2);
+		str_to_ipv6(&args2.ing_sipv6_3, optarg, 3);
+		break;
+	case '8':
+		str_to_ipv6(&args2.ing_dipv6_0, optarg, 0);
+		str_to_ipv6(&args2.ing_dipv6_1, optarg, 1);
+		str_to_ipv6(&args2.ing_dipv6_2, optarg, 2);
+		str_to_ipv6(&args2.ing_dipv6_3, optarg, 3);
+		break;
+#if defined CONFIG_COLGIN_SUPPORT
+	case '9':
+		args2.rmt = strtoll(optarg, NULL, 10);
+		break;
+#endif
+	case 'E':
+		args2.hash_index = strtoll(optarg, NULL, 10);
+		break;
+#if defined CONFIG_COLGIN_SUPPORT
+	case 'F':
+		args2.frag = strtoll(optarg, NULL, 10);
+		break;
+	case 'H':
+		chksum_tmp = strtoll(optarg, NULL, 16);
+		chksum_tmp = (0xffff-chksum_tmp);
+		chksum_tmp = (chksum_tmp - org_tot_len - org_id);
+		chksum_base = chksum_tmp & 0xFFFF;
+		printf("chksum_base = %x\n", chksum_base);
+		args2.checksum = chksum_base;
+		break;
+	case 'R':
+		args2.ttl = strtoll(optarg, NULL, 10);
+		break;
+#endif
+	case 'a':
+		method = HW_NAT_ADD_ENTRY;
+		break;
+
+	case 'b':
+		method = HW_NAT_DEL_ENTRY;
+		break;
+	case 'z':
+		method = HW_NAT_DUMP_CACHE_ENTRY;
+		break;
+	case 'c':
+		method = HW_NAT_DUMP_ENTRY;
+		entry_num = strtoll(optarg, NULL, 10);
+		break;
+	case 'I':
+		method = HW_NAT_INVALID_ENTRY;
+		entry_num = strtoll(optarg, NULL, 10);
+		break;
+	case 'x':
+		method = HW_NAT_UNBIND_ENTRY;
+		entry_num = strtoll(optarg, NULL, 10);
+		break;
+	case 'k':
+		method = HW_NAT_DROP_ENTRY;
+		entry_num = strtoll(optarg, NULL, 10);
+		break;
+	case 'd':
+		method = HW_NAT_DEBUG;
+		debug = strtoll(optarg, NULL, 10);
+		break;
+#if defined (CONFIG_RALINK_MT7620) || defined (CONFIG_RALINK_MT7621)
+	case 'W':
+		method = HW_NAT_SWITCH_DSL_MAPE;
+		swit = strtoll(optarg, NULL, 10);
+		break;
+#endif
+	case 'e':
+		method = HW_NAT_GET_ALL_ENTRIES;
+		args->entry_state=0; /* invalid entry */
+		break;
+	case 'f':
+		method = HW_NAT_GET_ALL_ENTRIES;
+		args->entry_state=1; /* unbinded entry */
+		break;
+	case 'g':
+		method = HW_NAT_GET_ALL_ENTRIES;
+		args->entry_state=2; /* binded entry */
+		break;
+	case 'y':
+		method = HW_NAT_TBL_CLEAR;
+		break;
+	case 'A':
+		method = HW_NAT_GET_AC_CNT;
+		args3.ag_index = strtoll(optarg, NULL, 10);
+		break;
+#if defined (CONFIG_PPE_MCAST)
+	case 'B':
+		method = HW_NAT_MCAST_INS;
+		args5.mc_vid = strtoll(argv[2], NULL, 10);
+		str_to_mac(mac, argv[3]);
+		memcpy(args5.dst_mac, mac, sizeof(mac));
+		args5.mc_px_en = strtoll(argv[4], NULL, 10);
+		args5.mc_px_qos_en = strtoll(argv[5], NULL, 10);
+		args5.mc_qos_qid = strtoll(argv[6], NULL, 10);
+		break;
+	case 'C':
+		method = HW_NAT_MCAST_DEL;
+		args5.mc_vid = strtoll(argv[2], NULL, 10);
+		str_to_mac(mac, argv[3]);
+		memcpy(args5.dst_mac, mac, sizeof(mac));
+		memcpy(args5.dst_mac, mac, sizeof(mac));
+		args5.mc_px_en = strtoll(argv[4], NULL, 10);
+		args5.mc_px_qos_en = strtoll(argv[5], NULL, 10);
+		args5.mc_qos_qid = strtoll(argv[6], NULL, 10);
+		break;
+	case 'D':
+		method = HW_NAT_MCAST_DUMP;
+		break;
+#endif
+#if defined (CONFIG_PPE_MIB)
+	case 'm':
+		method = HW_NAT_MIB_DUMP;
+		entry_num = strtoll(optarg, NULL, 10);
+		break;
+	case 'r':
+		method = HW_NAT_MIB_DRAM_DUMP;
+		entry_num = strtoll(optarg, NULL, 10);
+		break;
+	case 'M':
+		method = HW_NAT_MIB_GET;
+		break;
+#if defined CONFIG_COLGIN_SUPPORT
+	case 'X':
+		method = HW_NAT_MIB_GET_ALL_IP;
+		break;
+#endif
+#endif
+	case 'N':
+		method = HW_NAT_BIND_THRESHOLD;
+		args4.bind_threshold = strtoll(argv[2], NULL, 10);
+		break;
+	case 'Q':
+		method = HW_NAT_KA_INTERVAL;
+		args4.foe_tcp_ka = strtoll(argv[2], NULL, 10);
+		args4.foe_udp_ka = strtoll(argv[3], NULL, 10);
+		break;
+	case 'U':
+		method = HW_NAT_BIND_LIFETIME;
+		args4.foe_tcp_dlta = strtoll(argv[2], NULL, 10);
+		args4.foe_udp_dlta = strtoll(argv[3], NULL, 10);
+		args4.foe_fin_dlta = strtoll(argv[4], NULL, 10);
+		break;
+	case 'V':
+		method = HW_NAT_VLAN_ID;
+		args4.lan_vid = strtoll(argv[2], NULL, 10);
+		args4.wan_vid = strtoll(argv[3], NULL, 10);
+		break;
+	case 'Z':
+		method = HW_NAT_BIND_DIRECTION;
+		args4.bind_dir = strtoll(optarg, NULL, 10);
+		break;
+#if defined (CONFIG_HW_NAT_IPI)
+	case 'G': /*FIXME..........................*/
+		method = HW_NAT_IPI_CTRL_FROM_EXTIF;
+		args6.hnat_ipi_enable = strtoll(argv[2], NULL, 10);
+		args6.queue_thresh = strtoll(argv[3], NULL, 10);
+		args6.drop_pkt = strtoll(argv[4], NULL, 10);
+		args6.ipi_cnt_mod = strtoll(argv[5], NULL, 10);
+		//printf("##### hnat_ipi_enable=%d, queue_thresh=%d, drop_pkt=%d #####\n",
+		//		args6.hnat_ipi_enable, args6.queue_thresh, args6.drop_pkt);
+		break;
+	case 'L': /*FIXME..........................*/
+		method = HW_NAT_IPI_CTRL_FROM_PPEHIT;
+		args7.hnat_ipi_enable = strtoll(argv[2], NULL, 10);
+		args7.queue_thresh = strtoll(argv[3], NULL, 10);
+		args7.drop_pkt = strtoll(argv[4], NULL, 10);
+		args7.ipi_cnt_mod = strtoll(argv[5], NULL, 10);
+		//printf("##### hnat_ipi_enable2=%d, queue_thresh2=%d, drop_pkt2=%d #####\n",
+		//		args7.hnat_ipi_enable2, args7.queue_thresh2, args7.drop_pkt);
+		break;
+#endif
+	case '6':
+		method = HW_NAT_DPORT;
+		break;
+	case 'O':
+		method = HW_NAT_CLEAR_HOOK;
+		args2.dst_port = strtoll(optarg, NULL, 10);
+		break;
+	case 'T':
+		method = HW_NAT_RESTORE_HOOK;
+		args2.dst_port = strtoll(optarg, NULL, 10);
+		break;
+	case '?':
+		show_usage();
+
+	}
+    }
+
+    switch(method){
+//#if defined (CONFIG_HW_NAT_MANUAL_MODE) || defined (CONFIG_HW_NAT_SEMI_AUTO_MODE)
+    case HW_NAT_ADD_ENTRY:
+	    result = HwNatAddEntry(&args2);
+	    break;
+    case HW_NAT_DEL_ENTRY:
+	    result = HwNatDelEntry(&args2);
+	    break;
+//#endif
+    case HW_NAT_GET_ALL_ENTRIES:
+	    HwNatGetAllEntries(args);
+
+	    printf("Total Entry Count = %d\n",args->num_of_entries);
+	    for(i=0;i<args->num_of_entries;i++){
+		if(args->entries[i].pkt_type==0) { //IPV4_NAPT
+		    	printf("IPv4_NAPT=%d : %u.%u.%u.%u:%d->%u.%u.%u.%u:%d => %u.%u.%u.%u:%d->%u.%u.%u.%u:%d (RX=%d FP=%d FQOS=%d QID=%d)\n",
+				args->entries[i].hash_index,
+				NIPQUAD(args->entries[i].ing_sipv4),
+				args->entries[i].ing_sp,
+				NIPQUAD(args->entries[i].ing_dipv4),
+				args->entries[i].ing_dp,
+				NIPQUAD(args->entries[i].eg_sipv4),
+				args->entries[i].eg_sp,
+				NIPQUAD(args->entries[i].eg_dipv4),
+				args->entries[i].eg_dp,
+				args->entries[i].rxif_idx,
+				args->entries[i].fport,
+				args->entries[i].fqos,
+				args->entries[i].qid);
+
+		} else if(args->entries[i].pkt_type==1) { //IPV4_NAT
+			printf("IPv4_NAT=%d : %u.%u.%u.%u->%u.%u.%u.%u => %u.%u.%u.%u->%u.%u.%u.%u (RX=%d FP=%d FQOS=%d QID=%d)\n",
+				args->entries[i].hash_index,
+				NIPQUAD(args->entries[i].ing_sipv4),
+				NIPQUAD(args->entries[i].ing_dipv4),
+				NIPQUAD(args->entries[i].eg_sipv4),
+				NIPQUAD(args->entries[i].eg_dipv4),
+				args->entries[i].rxif_idx,
+				args->entries[i].fport,
+				args->entries[i].fqos,
+				args->entries[i].qid);
+
+		} else if(args->entries[i].pkt_type==2) { //IPV6_ROUTING
+			printf("IPv6_1T= %d /DIP: %x:%x:%x:%x:%x:%x:%x:%x (RX=%d FP=%d FQOS=%d QID=%d)\n",
+				args->entries[i].hash_index,
+				NIPHALF(args->entries[i].ing_dipv6_0),
+				NIPHALF(args->entries[i].ing_dipv6_1),
+				NIPHALF(args->entries[i].ing_dipv6_2),
+				NIPHALF(args->entries[i].ing_dipv6_3),
+				args->entries[i].rxif_idx,
+				args->entries[i].fport,
+				args->entries[i].fqos,
+				args->entries[i].qid);
+
+		} else if(args->entries[i].pkt_type==3) { //IPV4_DSLITE
+		    	printf("DS-Lite= %d : %u.%u.%u.%u:%d->%u.%u.%u.%u:%d (%x:%x:%x:%x:%x:%x:%x:%x -> %x:%x:%x:%x:%x:%x:%x:%x)(RX=%d FP=%d FQOS=%d QID=%d)\n", \
+				args->entries[i].hash_index,
+				NIPQUAD(args->entries[i].ing_sipv4),
+				args->entries[i].ing_sp,
+				NIPQUAD(args->entries[i].ing_dipv4),
+				args->entries[i].ing_dp,
+				NIPHALF(args->entries[i].eg_sipv6_0),
+				NIPHALF(args->entries[i].eg_sipv6_1),
+				NIPHALF(args->entries[i].eg_sipv6_2),
+				NIPHALF(args->entries[i].eg_sipv6_3),
+				NIPHALF(args->entries[i].eg_dipv6_0),
+				NIPHALF(args->entries[i].eg_dipv6_1),
+				NIPHALF(args->entries[i].eg_dipv6_2),
+				NIPHALF(args->entries[i].eg_dipv6_3),
+				args->entries[i].rxif_idx,
+				args->entries[i].fport,
+				args->entries[i].fqos,
+				args->entries[i].qid);
+
+		} else if(args->entries[i].pkt_type==4) { //IPV6_3T_ROUTE
+			printf("IPv6_3T= %d SIP: %x:%x:%x:%x:%x:%x:%x:%x DIP: %x:%x:%x:%x:%x:%x:%x:%x (RX=%d FP=%d FQOS=%d QID=%d)\n",
+				args->entries[i].hash_index,
+				NIPHALF(args->entries[i].ing_sipv6_0),
+				NIPHALF(args->entries[i].ing_sipv6_1),
+				NIPHALF(args->entries[i].ing_sipv6_2),
+				NIPHALF(args->entries[i].ing_sipv6_3),
+				NIPHALF(args->entries[i].ing_dipv6_0),
+				NIPHALF(args->entries[i].ing_dipv6_1),
+				NIPHALF(args->entries[i].ing_dipv6_2),
+				NIPHALF(args->entries[i].ing_dipv6_3),
+				args->entries[i].rxif_idx,
+				args->entries[i].fport,
+				args->entries[i].fqos,
+				args->entries[i].qid);
+
+		} else if(args->entries[i].pkt_type==5) { //IPV6_5T_ROUTE
+		    if(args->entries[i].ipv6_flowlabel==1) {
+			printf("IPv6_5T= %d SIP: %x:%x:%x:%x:%x:%x:%x:%x DIP: %x:%x:%x:%x:%x:%x:%x:%x (Flow Label=%x) (RX=%d FP=%d FQOS=%d QID=%d)\n",
+				args->entries[i].hash_index,
+				NIPHALF(args->entries[i].ing_sipv6_0),
+				NIPHALF(args->entries[i].ing_sipv6_1),
+				NIPHALF(args->entries[i].ing_sipv6_2),
+				NIPHALF(args->entries[i].ing_sipv6_3),
+				NIPHALF(args->entries[i].ing_dipv6_0),
+				NIPHALF(args->entries[i].ing_dipv6_1),
+				NIPHALF(args->entries[i].ing_dipv6_2),
+				NIPHALF(args->entries[i].ing_dipv6_3),
+				((args->entries[i].ing_sp << 16) | (args->entries[i].ing_dp))&0xFFFFF,
+				args->entries[i].rxif_idx,
+				args->entries[i].fport,
+				args->entries[i].fqos,
+				args->entries[i].qid);
+
+		    }else {
+			printf("IPv6_5T= %d SIP: %x:%x:%x:%x:%x:%x:%x:%x %d DIP: %x:%x:%x:%x:%x:%x:%x:%x %d (RX=%d FP=%d FQOS=%d QID=%d)\n",
+				args->entries[i].hash_index,
+				NIPHALF(args->entries[i].ing_sipv6_0),
+				NIPHALF(args->entries[i].ing_sipv6_1),
+				NIPHALF(args->entries[i].ing_sipv6_2),
+				NIPHALF(args->entries[i].ing_sipv6_3),
+				args->entries[i].ing_sp,
+				NIPHALF(args->entries[i].ing_dipv6_0),
+				NIPHALF(args->entries[i].ing_dipv6_1),
+				NIPHALF(args->entries[i].ing_dipv6_2),
+				NIPHALF(args->entries[i].ing_dipv6_3),
+				args->entries[i].ing_dp,
+				args->entries[i].rxif_idx,
+				args->entries[i].fport,
+				args->entries[i].fqos,
+				args->entries[i].qid);
+		    }
+
+		} else if(args->entries[i].pkt_type==7) { //IPV6_6RD
+		    if(args->entries[i].ipv6_flowlabel==1) {
+			printf("6RD= %d %x:%x:%x:%x:%x:%x:%x:%x->%x:%x:%x:%x:%x:%x:%x:%x [Flow Label=%x]\n",
+				args->entries[i].hash_index, \
+				NIPHALF(args->entries[i].ing_sipv6_0),
+				NIPHALF(args->entries[i].ing_sipv6_1),
+				NIPHALF(args->entries[i].ing_sipv6_2),
+				NIPHALF(args->entries[i].ing_sipv6_3),
+				NIPHALF(args->entries[i].ing_dipv6_0),
+				NIPHALF(args->entries[i].ing_dipv6_1),
+				NIPHALF(args->entries[i].ing_dipv6_2),
+				NIPHALF(args->entries[i].ing_dipv6_3),
+				((args->entries[i].ing_sp << 16) | (args->entries[i].ing_dp))&0xFFFFF);
+				printf("(%u.%u.%u.%u->%u.%u.%u.%u)(RX=%d FP=%d FQOS=%d QID=%d)\n",
+					NIPQUAD(args->entries[i].eg_sipv4),
+					NIPQUAD(args->entries[i].eg_dipv4),
+					args->entries[i].rxif_idx,
+					args->entries[i].fport,
+					args->entries[i].fqos,
+					args->entries[i].qid);
+		    }else {
+			printf("6RD= %d /SIP: %x:%x:%x:%x:%x:%x:%x:%x [SP:%d] /DIP: %x:%x:%x:%x:%x:%x:%x:%x [DP=%d]",
+				args->entries[i].hash_index,
+				NIPHALF(args->entries[i].ing_sipv6_0),
+				NIPHALF(args->entries[i].ing_sipv6_1),
+				NIPHALF(args->entries[i].ing_sipv6_2),
+				NIPHALF(args->entries[i].ing_sipv6_3),
+				args->entries[i].ing_sp,
+				NIPHALF(args->entries[i].ing_dipv6_0),
+				NIPHALF(args->entries[i].ing_dipv6_1),
+				NIPHALF(args->entries[i].ing_dipv6_2),
+				NIPHALF(args->entries[i].ing_dipv6_3),
+				args->entries[i].ing_dp);
+			printf("(%u.%u.%u.%u->%u.%u.%u.%u)(RX=%d FP=%d FQOS=%d QID=%d)\n",
+				NIPQUAD(args->entries[i].eg_sipv4),
+				NIPQUAD(args->entries[i].eg_dipv4),
+				args->entries[i].rxif_idx,
+				args->entries[i].fport,
+				args->entries[i].fqos,
+				args->entries[i].qid);
+		    }
+		} else{
+		    printf("unknown packet type! (pkt_type=%d) \n", args->entries[i].pkt_type);
+		}
+	    }
+	    result = args->result;
+	    break;
+    case HW_NAT_DUMP_CACHE_ENTRY:
+	    result = HwNatCacheDumpEntry();
+	    break;
+    case HW_NAT_DUMP_ENTRY:
+	    result = HwNatDumpEntry(entry_num);
+	    break;
+    case HW_NAT_UNBIND_ENTRY:
+	    result = HwNatUnBindEntry(entry_num);
+	    break;
+    case HW_NAT_DROP_ENTRY:
+	    result = HwNatDropEntry(entry_num);
+	    break;
+    case HW_NAT_DEBUG:
+	    result = HwNatDebug(debug);
+	    break;
+#if defined (CONFIG_RALINK_MT7620) || defined (CONFIG_RALINK_MT7621)
+	case HW_NAT_SWITCH_DSL_MAPE:
+	    result = HwNatSwitchDsliteMape(swit);
+	    break;
+#endif
+    case HW_NAT_GET_AC_CNT:
+	    HwNatGetAGCnt(&args3);
+	    printf("Byte cnt=%llu\n", args3.ag_byte_cnt);
+	    printf("Pkt cnt=%llu\n", args3.ag_pkt_cnt);
+	    result = args3.result;
+	    break;
+
+    case HW_NAT_BIND_THRESHOLD:
+	    result = HwNatSetBindThreshold(&args4);
+	    break;
+    case HW_NAT_MAX_ENTRY_LMT:
+	    HwNatSetMaxEntryRateLimit(&args4);
+	    result = args4.result;
+	    break;
+    case HW_NAT_RULE_SIZE:
+	    HwNatSetRuleSize(&args4);
+	    result = args4.result;
+	    break;
+    case HW_NAT_KA_INTERVAL:
+	    HwNatSetKaInterval(&args4);
+	    result = args4.result;
+	    break;
+    case HW_NAT_UB_LIFETIME:
+	    HwNatSetUnbindLifeTime(&args4);
+	    result = args4.result;
+	    break;
+    case HW_NAT_BIND_LIFETIME:
+	    result = HwNatSetBindLifeTime(&args4);
+	    break;
+    case HW_NAT_VLAN_ID:
+	    result = HwNatSetVID(&args4);
+	    break;
+    case HW_NAT_BIND_DIRECTION:
+	    result = HwNatSetBindDir(&args4);
+	    break;
+#if defined (CONFIG_PPE_MCAST)
+    case HW_NAT_MCAST_INS:
+	    result = HwNatMcastIns(&args5);
+	    break;
+    case HW_NAT_MCAST_DEL:
+	    result = HwNatMcastDel(&args5);
+	    break;
+    case HW_NAT_MCAST_DUMP:
+	    result = HwNatMcastDump();
+	    break;
+#endif
+#if defined (CONFIG_PPE_MIB)
+    case HW_NAT_MIB_DUMP:
+	    result = HwNatMibDumpEntry(entry_num);
+	    break;
+    case HW_NAT_MIB_DRAM_DUMP:
+	    result = HwNatMibDramDumpEntry(entry_num);
+	    break;
+    case HW_NAT_MIB_GET:
+	    result = HwNatMibGet(&args2);
+	    break;
+#if defined CONFIG_COLGIN_SUPPORT
+	case HW_NAT_MIB_GET_ALL_IP:
+		args8=malloc(sizeof(struct hwnat_mib_all_ip_args));
+		if (NULL == args8)
+		{
+			printf(" Allocate memory for hwnat_mib_all_ip_args failed.\n");
+			close(fd);
+			return 0;
+		}
+		memset(args8, 0, sizeof(struct hwnat_mib_all_ip_args));
+		result = HwNatMibGetAllIP(args8);
+        dump_all_ip_cnt(args8);
+        free(args8);
+	    break;
+#endif
+#endif
+    case HW_NAT_TBL_CLEAR:
+            result = HwNatTblClear();
+            break;
+#if defined (CONFIG_HW_NAT_IPI)
+    case HW_NAT_IPI_CTRL_FROM_EXTIF:
+	    result = HwNatIPICtrlFromExtIf(&args6);
+	    break;
+    case HW_NAT_IPI_CTRL_FROM_PPEHIT:
+	    result = HwNatIPICtrlFromPPEHit(&args7);
+	    break;
+#endif
+    case HW_NAT_DPORT:
+    	    result = HwNatDumpDport();
+    	    break;
+    case HW_NAT_INVALID_ENTRY:
+	    result = HwNatInvalEntry(entry_num);
+	    break;
+    case HW_NAT_CLEAR_HOOK:
+    	    result = HwNatHookModify(&args2, 1);
+    	    break;
+    case HW_NAT_RESTORE_HOOK:
+    	    result = HwNatHookModify(&args2, 0);
+    	    break;
+    default:
+	    result = HWNAT_FAIL;
+
+    }
+
+    if(result==HWNAT_SUCCESS){
+	printf("done\n");
+    }else if(result==HWNAT_ENTRY_NOT_FOUND) {
+	printf("entry not found\n");
+    }else {
+	printf("fail\n");
+    }
+
+    free(args);
+    close(fd);
+    return 0;
+}
