#!/bin/sh /etc/rc.common

START=10

draft_patch_141570() {
	echo "draft_patch_141570" > /dev/console
	echo 10 > /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_time_wait
	echo 1 > /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_fin_wait
	echo 1 > /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_close_wait
	echo 1 > /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_close

	echo 120 > /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_syn_recv
	echo 30 > /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established
	echo 65536 >/sys/module/nf_conntrack/parameters/hashsize
	echo 524288 > /proc/sys/net/nf_conntrack_max
	# echo 4096 > /sys/class/net/br-lan/bridge/hash_max
	echo 1 > /proc/tc3162/hwnat_fast_bind

	#/userfs/bin/qdmamgr_lan set rxratelimit config Disable Packet

	/usr/bin/hw_nat -T 1
	/usr/bin/hw_nat -N 1
	/usr/bin/hw_nat -U 1 1 1 1

	#Check IP Protocol Field
	/usr/bin/sys memwl 1fb50e08 000f000c
	#disable KA_CFG
	/usr/bin/sys memwl 1fb50e1c ef400fb4
	#PPE Bind Limit
	/usr/bin/sys memwl 1fb50e2c 3fff3fff
	#PPE Bind Limit
	/usr/bin/sys memwl 1fb50e30 00013fff

	#TX congestion total threshold configure, not modify
	/usr/bin/sys memwl 1fb550a4 39992000
	/usr/bin/sys memwl 1fb570a4 39992000

	echo "insmod swnat.ko" > /dev/console
	insmod /lib/modules/5.4.55/swnat.ko
	echo 1000 > /proc/tc3162/swnat_entry_life
	echo 0 3 8 > /proc/tc3162/swnat_foe_tbl
	echo 0x0145 > /proc/tc3162/swnat_test_flag

	echo clear > /proc/ifc_debug
}

boot() {
	echo "[DrayTek-Init] mount mtd and cgi init" > /dev/console
	/usr/bin/dray_init

	# The draft_patch_141570 is a modification derived from airoho draft_patch_141570_ipsec_performance_20230526.patch.
	# This particular modification includes the sys configuration, hw_nat and the addition of swnat.ko.
	# However, it is uncertain which parts have been improved. For now, it is temporarily marked and not executed.
	# draft_patch_141570

	start "$@"
}

stop() {
	echo "stop drayRC" > /dev/null
	killall dray_monitor
	killall dray_cm
}

start() {
	dray_gpl_ipk

	DBG_ON="0"

	if [ "$DBG_ON" -eq "1" ]; then
		DEV_CONSOLE="/dev/console"
	else
		DEV_CONSOLE="/dev/null"
	fi
	
	[ ! -e /dev/dray_event ] && {
		dray_event_major="$(grep dray_event /proc/devices | cut -d ' ' -f 1)"
		echo "[DrayTek-Init] mknod -m 660 /dev/dray_event c $dray_event_major 0" > $DEV_CONSOLE
		mknod -m 660 /dev/dray_event c $dray_event_major 0
	}

	[ ! -e /dev/dray_wl_center ] && {
		echo "[DrayTek-Init] mknod -m 660 /dev/dray_wl_center c 266 0" > $DEV_CONSOLE
		mknod -m 660 /dev/dray_wl_center c 266 0
	}

	echo "[DrayTek-Init] Start dray_cm" > $DEV_CONSOLE
	[ ! -e /data/dbg ] && {
		echo "[DrayTek-Init] mkdir /data/dbg" > $DEV_CONSOLE
		mkdir /data/dbg
	}
	[ ! -e /data/dray_acs ] && {
		echo "[DrayTek-Init] mkdir /data/dray_acs" > $DEV_CONSOLE
		mkdir /data/dray_acs
	}
	[ ! -e /etc/config/dray_acs ] && {
		echo "[DrayTek-Init] mkdir /etc/config/dray_acs" > $DEV_CONSOLE
		mkdir /etc/config/dray_acs
	}
	[ ! -e /usr/bin/acs_cwmpd ] && {
		echo "[DrayTek-Init] ln -s /usr/bin/cwmpd /usr/bin/acs_cwmpd" > $DEV_CONSOLE
		ln -s /usr/bin/cwmpd /usr/bin/acs_cwmpd
	}
	[ ! -e /etc/seeds/deviceacs.xml ] && {
		echo "[DrayTek-Init] ln -s /etc/seeds/device.xml /etc/seeds/deviceacs.xml" > $DEV_CONSOLE
		ln -s /etc/seeds/device.xml /etc/seeds/deviceacs.xml
	}
	[ ! -e /tmp/dray_hw ] && {
		echo "[DrayTek-Init] mkdir /tmp/dray_hw" > $DEV_CONSOLE
		mkdir /tmp/dray_hw
	}
	[ ! -e /tmp/dray_acs ] && {
		echo "[DrayTek-Init] mkdir /tmp/dray_acs" > $DEV_CONSOLE
		mkdir /tmp/dray_acs
	}
	[ ! -e /tmp/dray_acs/default_config ] && {
		echo "[DrayTek-Init] mkdir /tmp/dray_acs/default_config" > $DEV_CONSOLE
		mkdir /tmp/dray_acs/default_config
	}
	[ ! -e /tmp/dray_acs/node ] && {
		echo "[DrayTek-Init] mkdir /tmp/dray_acs/node" > $DEV_CONSOLE
		mkdir /tmp/dray_acs/node
	}
	[ ! -e /tmp/vigormesh ] && {
		echo "[DrayTek-Init] mkdir /tmp/vigormesh" > $DEV_CONSOLE
		mkdir /tmp/vigormesh
	}
	[ ! -e /tmp/easymesh ] && {
		echo "[DrayTek-Init] mkdir /tmp/easymesh" > $DEV_CONSOLE
		mkdir /tmp/easymesh
	}
	[ ! -e /tmp/dwc_data ] && {
		echo "[DrayTek-Init] mkdir /tmp/dwc_data" > $DEV_CONSOLE
		mkdir /tmp/dwc_data
	}
	[ ! -e /tmp/cache ] && {
		echo "[DrayTek-Init] mkdir /tmp/cache" > $DEV_CONSOLE
		mkdir /tmp/cache
	}

	sleep 1
	/usr/bin/dray_hw init_files
	/usr/bin/dray_monitor

	echo "[DrayTek-Init] start CGI bootstrap" > /dev/console
	/usr/bin/syscmd bootstrap restart
	echo "[DrayTek-Init] CGI bootstrap done" > /dev/console
}

restart_service(){
	stop
	start
}
