コード例 #1
0
ファイル: ntp.c プロジェクト: nick-ratbert/asuswrt-merlin
static void ntp_service()
{
	static int first_sync = 1;

	if (first_sync) {
		first_sync = 0;

		nvram_set("reload_svc_radio", "1");
		nvram_set("svc_ready", "1");

		setup_timezone();

		if (is_routing_enabled())
			notify_rc("restart_upnp");
#ifdef RTCONFIG_IPV6
#ifdef RTCONFIG_WIDEDHCP6
/* switch to monotonic clock usage *//*
		if (get_ipv6_service() != IPV6_DISABLED) {
			notify_rc("restart_dhcp6s");
			notify_rc("restart_radvd");
		}
*/
#endif /* RTCONFIG_WIDEDHCP6 */
#endif
#ifdef RTCONFIG_DISK_MONITOR
		notify_rc("restart_diskmon");
#endif
	}
}
コード例 #2
0
ファイル: watchdog.c プロジェクト: eckyecky/rt-n56u
static void 
ez_action_shutdown(void)
{
	logmessage("watchdog", "Perform ez-button shutdown...");
	
	notify_rc("shutdown_prepare");
}
コード例 #3
0
ファイル: watchdog.c プロジェクト: jing-git/rt-n56u
static void
inet_handler(int is_ap_mode)
{
    if (!is_ap_mode)
    {
        long i_deferred_wanup = nvram_get_int("deferred_wanup_t");
        if (i_deferred_wanup > 0 && uptime() >= i_deferred_wanup)
        {
            notify_rc("deferred_wan_connect");

            return;
        }

        if (has_wan_ip4(0) && has_wan_gw4())
        {
            /* sync time to ntp server if necessary */
            ntpc_handler();
        }
    }
    else
    {
        if (has_lan_ip4() && has_lan_gw4())
            ntpc_handler();
    }
}
コード例 #4
0
ファイル: timemachine.c プロジェクト: hebjt/asuswrt-merlin
void stop_afpd()
{
	if (getpid() != 1) {
		notify_rc("stop_afpd");
	}

	//killall_tk("afpd");
	system("killall -SIGKILL afpd");
	return;
}
コード例 #5
0
ファイル: wps-ralink.c プロジェクト: matti/asuswrt-merlin
int 
start_wps_method(void)
{
	if(getpid()!=1) {
		notify_rc("start_wps_method");
		return 0;
	}

	start_wsc();
}
コード例 #6
0
ファイル: timemachine.c プロジェクト: hebjt/asuswrt-merlin
void stop_cnid_metad()
{
	if (getpid() != 1) {
		notify_rc("stop_cnid_metad");
	}

	//killall_tk("cnid_metad");
	system("killall -SIGKILL cnid_metad");
	return;
}
コード例 #7
0
ファイル: timemachine.c プロジェクト: hebjt/asuswrt-merlin
void stop_avahi_daemon()
{
	if (getpid() != 1) {
		notify_rc("stop_avahi_daemon");
	}

	//killall_tk("avahi-daemon");
	system("killall -SIGKILL avahi-daemon");
	return;
}
コード例 #8
0
void stop_pptpd(void)
{
	if (getpid() != 1) {
		notify_rc("stop_pptpd");
	}

	killall_tk("pptpd");
	killall_tk("bcrelay");
	return;
}
コード例 #9
0
ファイル: wps-ralink.c プロジェクト: matti/asuswrt-merlin
int 
stop_wps_method(void)
{
	if(getpid()!=1) {
		notify_rc("stop_wps_method");
		return 0;
	}

//	doSystem("iwpriv %s set WscConfMode=%d", get_wpsifname(), 0);	// WPS disabled
	doSystem("iwpriv %s set WscStatus=%d", get_wpsifname(), 0);	// Not Used
//	doSystem("iwpriv %s set WscConfMode=%d", get_non_wpsifname(), 7);	// trigger Windows OS to give a popup about WPS PBC AP
}
コード例 #10
0
ファイル: usb_modem.c プロジェクト: PterX/rt-n56u
void
notify_modem_on_internet_state_changed(int has_internet)
{
	if (has_internet)
		return;

	if (nvram_get_int("modem_prio") != 3)
		return;

	if (get_usb_modem_wan(0))
		return;

	if (!get_modem_devnum())
		return;

	notify_rc("auto_wan_reconnect");
}
コード例 #11
0
ファイル: wps-qca.c プロジェクト: rjknight123/asuswrt-merlin
int 
start_wps_method(void)
{
	if(getpid()!=1) {
		notify_rc("start_wps_method");
		return 0;
	}

#ifdef RTCONFIG_WPS_ENROLLEE
	if (nvram_match("wps_enrollee", "1"))
		start_wsc_enrollee();
	else
#endif
		start_wsc();

	return 0;
}
コード例 #12
0
int 
stop_wps_method(void)
{
	char buf[256] = "SET ";
	int len = 4;

	if(getpid()!=1) {
		notify_rc("stop_wps_method");
		return 0;
	}

	len += sprintf(buf + len, "wps_config_command=%d ", WPS_UI_CMD_STOP);
	len += sprintf(buf + len, "wps_action=%d ", WPS_UI_ACT_NONE);

	set_wps_env(buf);

	return 0;
}
コード例 #13
0
ファイル: usb_devices.c プロジェクト: eckyecky/rt-n56u
int mdev_lp_main(int argc, char **argv)
{
	int isLock;
	const char *device_name, *action;

	if(argc != 3){
		printf("Usage: %s [device_name] [action]\n", argv[0]);
		return 0;
	}

	device_name = argv[1];
	action = argv[2];

	usb_dbg("(%s): action=%s.\n", device_name, action);

	if(get_device_type_by_device(device_name) != DEVICE_TYPE_PRINTER){
		usb_dbg("(%s): The device is not a printer.\n", device_name);
		return 0;
	}

	// Check Lock.
	if((isLock = file_lock((char *)device_name)) == -1){
		usb_dbg("(%s): Can't set the file lock!\n", device_name);
		return 0;
	}

	// If remove the device?
	if(!check_hotplug_action(action)){
		int ports_used_usblp = usb_port_module_used("usblp");
		if (!ports_used_usblp)
			stop_usb_printer_spoolers();
		
		file_unlock(isLock);
		return 0;
	}

	notify_rc("on_hotplug_usb_printer");

	usb_dbg("(%s): Success!\n", device_name);

	file_unlock(isLock);

	return 1;
}
コード例 #14
0
ファイル: usb_modem.c プロジェクト: PterX/rt-n56u
void
notify_modem_on_wan_ether_link_changed(int has_link)
{
	int modem_used, link_wan;

	if (nvram_get_int("modem_prio") != 2)
		return;

	if (get_wan_wisp_active(NULL))
		return;

	if (!get_modem_devnum())
		return;

	link_wan = (has_link) ? 1 : 0;
	modem_used = (get_usb_modem_wan(0)) ? 1 : 0;

	if (modem_used == link_wan)
		notify_rc("auto_wan_reconnect");
}
コード例 #15
0
ファイル: usb_devices.c プロジェクト: eckyecky/rt-n56u
int mdev_sd_main(int argc, char **argv)
{
	char aidisk_cmd[64];
	int isLock, mount_result;
	const char *device_name, *action;

	if(argc != 3){
		printf("Usage: %s [device_name] [action]\n", argv[0]);
		return 0;
	}

	device_name = argv[1];
	action = argv[2];

	usb_dbg("(%s): action=%s.\n", device_name, action);

	if(get_device_type_by_device(device_name) != DEVICE_TYPE_DISK){
		usb_dbg("(%s): The device is not a sd device.\n", device_name);
		return 0;
	}

	// Check Lock.
	if((isLock = file_lock((char *)device_name)) == -1){
		usb_dbg("(%s): Can't set the file lock!\n", device_name);
		return 0;
	}

	// If remove the device?
	if(!check_hotplug_action(action)){
		if (device_name[3] != '\0')
			detach_swap_partition((char*)device_name);
		else
			notify_rc("on_unplug_usb_storage");
		
		file_unlock(isLock);
		return 0;
	}

	memset(aidisk_cmd, 0, sizeof(aidisk_cmd));
	if (device_name[3] == '\0')	// sda, sdb, sdc...
	{
		system("/sbin/hddtune.sh $MDEV");
		
		if (!check_root_partition(device_name))
		{
			sprintf(aidisk_cmd, "/sbin/automount.sh $MDEV AiDisk_%c%c", device_name[2], '1');
		}
		else
			goto No_Need_To_Mount;
	}
	else
	{
		sprintf(aidisk_cmd, "/sbin/automount.sh $MDEV AiDisk_%c%c", device_name[2], device_name[3]);
	}

	umask(0000);
	mount_result = system(aidisk_cmd);
	if (mount_result == 0)
	{
		notify_rc("on_hotplug_usb_storage");
	}

	usb_dbg("(%s): Success!\n", device_name);
	file_unlock(isLock);
	return 1;

No_Need_To_Mount:
	usb_dbg("(%s): No need to mount!\n", device_name);
	file_unlock(isLock);

	return 0;
}
コード例 #16
0
int 
start_wps_method(void)
{
	int wps_band;
	int wps_action;
//	int wps_method;
	char *wps_sta_pin;
	char prefix[]="wlXXXXXX_", tmp[100];
	char buf[256] = "SET ";
	int len = 4;

	if(getpid()!=1) {
		notify_rc("start_wps_method");
		return 0;
	}

	wps_band = nvram_get_int("wps_band");
	snprintf(prefix, sizeof(prefix), "wl%d_", wps_band);
	wps_action = nvram_get_int("wps_action");
//	wps_method = nvram_get_int("wps_method"); // useless
	wps_sta_pin = nvram_safe_get("wps_sta_pin");

	if(strlen(wps_sta_pin) && strcmp(wps_sta_pin, "00000000") && (wl_wpsPincheck(wps_sta_pin) == 0))
		len += sprintf(buf + len, "wps_method=%d ", WPS_UI_METHOD_PIN);	
	else
		len += sprintf(buf + len, "wps_method=%d ", WPS_UI_METHOD_PBC);
	
	if(nvram_match("wps_version2", "enabled") && strlen(nvram_safe_get("wps_autho_sta_mac")))
		len += sprintf(buf + len, "wps_autho_sta_mac=%s ", nvram_safe_get("wps_autho_sta_mac"));

	if(strlen(wps_sta_pin))
		len += sprintf(buf + len, "wps_sta_pin=%s ", wps_sta_pin);
	else
		len += sprintf(buf + len, "wps_sta_pin=00000000 ");

//	len += sprintf(buf + len, "wps_action=%d ", wps_action);
	len += sprintf(buf + len, "wps_action=%d ", WPS_UI_ACT_ADDENROLLEE);

	len += sprintf(buf + len, "wps_config_command=%d ", WPS_UI_CMD_START);

	nvram_set("wps_proc_status", "0");

	len += sprintf(buf + len, "wps_pbc_method=%d ", WPS_UI_PBC_SW);
	len += sprintf(buf + len, "wps_ifname=%s ", nvram_safe_get(strcat_r(prefix, "ifname", tmp)));

	dbG("wps env buffer: %s\n", buf);

//	nvram_unset("wps_sta_devname");
//	nvram_unset("wps_sta_mac");
//	nvram_unset("wps_pinfail");
//	nvram_unset("wps_pinfail_mac");
//	nvram_unset("wps_pinfail_name");
//	nvram_unset("wps_pinfail_state");

	set_wps_env(buf);

	sprintf(tmp, "%lu", uptime());
	nvram_set("wps_uptime", tmp);

	return 0;
}
コード例 #17
0
void start_pptpd(void)
{
	int ret = 0, mss = 0, manual_dns = 0;
	char *lpTemp;
	FILE *fp;

	int pid = getpid();
	_dprintf("start_pptpd: getpid= %d\n", pid);

	if(getpid() != 1) {
		notify_rc("start_pptpd");
		return;
	}

	if (!nvram_match("pptpd_enable", "1")) {
		return;
	}
	// cprintf("stop vpn modules\n");
	// stop_vpn_modules ();

	// Create directory for use by pptpd daemon and its supporting files
	mkdir("/tmp/pptpd", 0744);
	cprintf("open options file\n");
	// Create options file that will be unique to pptpd to avoid interference 
	// with pppoe and pptp
	fp = fopen("/tmp/pptpd/options.pptpd", "w");
	fprintf(fp, "logfile /var/log/pptpd-pppd.log\ndebug\n");
	if (nvram_match("pptpd_radius", "1"))
		fprintf(fp, "plugin radius.so\nplugin radattr.so\n"
			"radius-config-file /tmp/pptpd/radius/radiusclient.conf\n");

	cprintf("check if wan_wins = zero\n");
	int nowins = 0;

	if (nvram_match("wan_wins", "0.0.0.0")) {
		nvram_set("wan_wins", "");
		nowins = 1;
	}
	if (strlen(nvram_safe_get("wan_wins")) == 0)
		nowins = 1;

	cprintf("write config\n");
	fprintf(fp, "lock\n"
		"name *\n"
		"proxyarp\n"
		"ipcp-accept-local\n"
		"ipcp-accept-remote\n"
		"lcp-echo-failure 10\n"
		"lcp-echo-interval 5\n"
		"deflate 0\n" "auth\n" "-chap\n" "-mschap\n" "+mschap-v2\n");

	fprintf(fp, "nomppe-stateful\n");

	if (nvram_match("pptpd_forcemppe", "none")) {
                fprintf(fp, "nomppe nomppc\n");
        }
	else if (nvram_match("pptpd_forcemppe", "auto")) {
                fprintf(fp, "require-mppe-40\n"
                	    "require-mppe-56\n"
                	    "require-mppe-128\n");
        } 
	else if (nvram_match("pptpd_forcemppe", "+mppe-40")) {
		fprintf(fp, "require-mppe\n"
                	    "require-mppe-40\n");
        } 
	else if (nvram_match("pptpd_forcemppe", "+mppe-56")) {
                fprintf(fp, "require-mppe\n"
			    "nomppe-40\n"
                            "require-mppe-56\n");
        } 
	else if (nvram_match("pptpd_forcemppe", "+mppe-128")) {
                fprintf(fp, "require-mppe\n"
			    "nomppe-40\n"
                            "nomppe-56\n"
                            "require-mppe-128\n");
        }
	
	fprintf(fp, "ms-ignore-domain\n"
		"chap-secrets /tmp/pptpd/chap-secrets\n"
		"ip-up-script /tmp/pptpd/ip-up\n"
		"ip-down-script /tmp/pptpd/ip-down\n"
		"mtu %s\n" "mru %s\n",
		nvram_get("pptpd_mtu") ? nvram_get("pptpd_mtu") : "1450",
		nvram_get("pptpd_mru") ? nvram_get("pptpd_mru") : "1450");
	//WINS Server
	if (!nowins) {
		fprintf(fp, "ms-wins %s\n", nvram_safe_get("wan_wins"));
	}
	if (strlen(nvram_safe_get("pptpd_wins1"))) {
		fprintf(fp, "ms-wins %s\n", nvram_safe_get("pptpd_wins1"));
	}
	if (strlen(nvram_safe_get("pptpd_wins2"))) {
		fprintf(fp, "ms-wins %s\n", nvram_safe_get("pptpd_wins2"));
	}
	//DNS Server
	if (strlen(nvram_safe_get("pptpd_dns1"))) {
		fprintf(fp, "ms-dns %s\n", nvram_safe_get("pptpd_dns1"));
		manual_dns=1;
	}
	if (strlen(nvram_safe_get("pptpd_dns2"))) {
		fprintf(fp, "ms-dns %s\n", nvram_safe_get("pptpd_dns2"));
		manual_dns=1;
	}
	if(!manual_dns && !nvram_match("lan_ipaddr", ""))
                fprintf(fp, "ms-dns %s\n", nvram_safe_get("lan_ipaddr"));

	// force ppp interface starting from 10
	fprintf(fp, "minunit 10\n");

	// Following is all crude and need to be revisited once testing confirms
	// that it does work
	// Should be enough for testing..
	if (nvram_match("pptpd_radius", "1")) {
		if (nvram_get("pptpd_radserver") != NULL
		    && nvram_get("pptpd_radpass") != NULL) {

			fclose(fp);

			mkdir("/tmp/pptpd/radius", 0744);

			fp = fopen("/tmp/pptpd/radius/radiusclient.conf", "w");
			fprintf(fp, "auth_order radius\n"
				"login_tries 4\n"
				"login_timeout 60\n"
				"radius_timeout 10\n"
				"nologin /etc/nologin\n"
				"servers /tmp/pptpd/radius/servers\n"
				"dictionary /etc/dictionary\n"
				"seqfile /var/run/radius.seq\n"
				"mapfile /etc/port-id-map\n"
				"radius_retries 3\n"
				"authserver %s:%s\n",
				nvram_get("pptpd_radserver"),
				nvram_get("pptpd_radport") ?
				nvram_get("pptpd_radport") : "radius");

			if (nvram_get("pptpd_radserver") != NULL
			    && nvram_get("pptpd_acctport") != NULL)
				fprintf(fp, "acctserver %s:%s\n",
					nvram_get("pptpd_radserver"),
					nvram_get("pptpd_acctport") ?
					nvram_get("pptpd_acctport") :
					"radacct");
			fclose(fp);

			fp = fopen("/tmp/pptpd/radius/servers", "w");
			fprintf(fp, "%s\t%s\n", nvram_get("pptpd_radserver"),
				nvram_get("pptpd_radpass"));
			fclose(fp);

		} else
			fclose(fp);
	} else
		fclose(fp);

	// Create pptpd.conf options file for pptpd daemon
	fp = fopen("/tmp/pptpd/pptpd.conf", "w");
	fprintf(fp, "bcrelay %s\n", nvram_safe_get("pptpd_broadcast"));
	fprintf(fp, "localip %s\n"
		"remoteip %s\n", nvram_safe_get("lan_ipaddr"),
		nvram_safe_get("pptpd_clients"));
	fclose(fp);

	// Create ip-up and ip-down scripts that are unique to pptpd to avoid
	// interference with pppoe and pptp
	/*
	 * adjust for tunneling overhead (mtu - 40 byte IP - 108 byte tunnel
	 * overhead) 
	 */
	if (nvram_match("mtu_enable", "1"))
		mss = atoi(nvram_safe_get("wan_mtu")) - 40 - 108;
	else
		mss = 1500 - 40 - 108;
	char bcast[32];

	strcpy(bcast, nvram_safe_get("lan_ipaddr"));
	get_broadcast(bcast, nvram_safe_get("lan_netmask"));

	fp = fopen("/tmp/pptpd/ip-up", "w");
	fprintf(fp, "#!/bin/sh\n" "startservice set_routes\n"	// reinitialize 
		"echo $PPPD_PID $1 $5 $6 $PEERNAME >> /tmp/pptp_connected\n" 
		"iptables -I FORWARD -i $1 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu\n" 
		"iptables -I INPUT -i $1 -j ACCEPT\n" "iptables -I FORWARD -i $1 -j ACCEPT\n" 
		"iptables -t nat -I PREROUTING -i $1 -p udp -m udp --sport 9 -j DNAT --to-destinati	on %s "	// rule for wake on lan over pptp tunnel
		"%s\n", bcast,
		nvram_get("pptpd_ipup_script") ? nvram_get("pptpd_ipup_script") : "");
	fclose(fp);
	fp = fopen("/tmp/pptpd/ip-down", "w");
	fprintf(fp, "#!/bin/sh\n" "grep -v $1  /tmp/pptp_connected > /tmp/pptp_connected.new\n" 
		"mv /tmp/pptp_connected.new /tmp/pptp_connected\n" 
		"iptables -D FORWARD -i $1 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu\n" 
		"iptables -D INPUT -i $1 -j ACCEPT\n" 
		"iptables -D FORWARD -i $1 -j ACCEPT\n" 
		"iptables -t nat -D PREROUTING -i $1 -p udp -m udp --sport 9 -j DNAT --to-destination %s "	// rule for wake on lan over pptp tunnel
		"%s\n", bcast,
		nvram_get("pptpd_ipdown_script") ? nvram_get("pptpd_ipdown_script") : "");
	fclose(fp);
	chmod("/tmp/pptpd/ip-up", 0744);
	chmod("/tmp/pptpd/ip-down", 0744);

	// Exctract chap-secrets from nvram
	write_chap_secret("/tmp/pptpd/chap-secrets");

	chmod("/tmp/pptpd/chap-secrets", 0600);

	// Execute pptpd daemon
	ret =
	    eval("pptpd", "-c", "/tmp/pptpd/pptpd.conf", "-o",
		 "/tmp/pptpd/options.pptpd");

	_dprintf("start_pptpd: ret= %d\n", ret);
	//dd_syslog(LOG_INFO, "pptpd : pptp daemon successfully started\n");
	return;
}
コード例 #18
0
// used for various testing
static int rctest_main(int argc, char *argv[])
{
	int on;

	if (argc < 3) {
		_dprintf("test what?\n");
	}
	else if (strcmp(argv[1], "rc_service")==0) {
		notify_rc(argv[2]);
	}
	else if(strcmp(argv[1], "get_phy_status")==0) {
		int mask;
		mask = atoi(argv[2]);
		TRACE_PT("debug for phy_status %x\n", get_phy_status(mask));
	}
	else if(strcmp(argv[1], "get_phy_speed")==0) {
		int mask;
		mask = atoi(argv[2]);
		TRACE_PT("debug for phy_speed %x\n", get_phy_speed(mask));
	}
	else if(strcmp(argv[1], "set_phy_ctrl")==0) {
		int mask, ctrl;
		mask = atoi(argv[2]);
		ctrl = atoi(argv[3]);
		TRACE_PT("debug for phy_speed %x\n", set_phy_ctrl(mask, ctrl));
	}
	else if(strcmp(argv[1], "handle_notifications")==0) {
		handle_notifications();
	}
	else if(strcmp(argv[1], "check_action")==0) {
		_dprintf("check: %d\n", check_action());
	}
	else if(strcmp(argv[1], "nvramhex")==0) {
		int i;
		char *nv;

		nv = nvram_safe_get(argv[2]);

		_dprintf("nvram %s(%d): ", nv, strlen(nv));
		for(i=0;i<strlen(nv);i++) {
			_dprintf(" %x", (unsigned char)*(nv+i));
		}
		_dprintf("\n");
	}
	else {
		on = atoi(argv[2]);
		_dprintf("%s %d\n", argv[1], on);

		if (strcmp(argv[1], "vlan") == 0)
		{	
			if(on) start_vlan();
			else stop_vlan();
		}
		else if (strcmp(argv[1], "lan") == 0) {
			if(on) start_lan();
			else stop_lan();
		}
		else if (strcmp(argv[1], "wl") == 0) {
			if(on) 
			{
				start_wl();
				lanaccess_wl();
			}
		}
		else if (strcmp(argv[1], "wan") == 0) {
			if(on) start_wan();
			else stop_wan();
		}
		else if (strcmp(argv[1], "firewall") == 0) {
			//if(on) start_firewall();
			//else stop_firewall();
		}
		else if (strcmp(argv[1], "watchdog") == 0) {
			if(on) start_watchdog();
			else stop_watchdog();
		}
#ifdef RTCONFIG_FANCTRL
		else if (strcmp(argv[1], "phy_tempsense") == 0) {
			if(on) start_phy_tempsense();
			else stop_phy_tempsense();
		}
#endif
#ifdef RTCONFIG_BCMWL6
#ifdef RTCONFIG_PROXYSTA
		else if (strcmp(argv[1], "psta_monitor") == 0) {
			if(on) start_psta_monitor();
			else stop_psta_monitor();
		}
#endif
#endif
		else if (strcmp(argv[1], "qos") == 0) {//qos test
			if(on){
#ifdef RTCONFIG_RALINK
				if (module_loaded("hw_nat"))
				{
					modprobe_r("hw_nat");
					sleep(1);
#if 0
					system("echo 0 > /proc/sys/net/ipv4/conf/default/force_igmp_version");
					system("echo 0 > /proc/sys/net/ipv4/conf/all/force_igmp_version");
#endif
				}
#endif
				add_iQosRules(get_wan_ifname(0));
				start_iQos();
			}
			else 
			{
#ifdef RTCONFIG_RALINK
				if (nvram_get_int("hwnat") &&
					/* TODO: consider RTCONFIG_DUALWAN case */
//					!nvram_match("wan0_proto", "l2tp") &&
//					!nvram_match("wan0_proto", "pptp") &&
//					!(nvram_get_int("fw_pt_l2tp") || nvram_get_int("fw_pt_ipsec") &&
//					(nvram_match("wl0_radio", "0") || nvram_get_int("wl0_mrate_x")) &&
//					(nvram_match("wl1_radio", "0") || nvram_get_int("wl1_mrate_x")) &&
					!module_loaded("hw_nat"))
				{
#if 0
					system("echo 2 > /proc/sys/net/ipv4/conf/default/force_igmp_version");
					system("echo 2 > /proc/sys/net/ipv4/conf/all/force_igmp_version");
#endif
					modprobe("hw_nat");
					sleep(1);
				}
#endif
				stop_iQos();
				del_iQosRules();
			}
		}
#ifdef RTCONFIG_WEBDAV
		else if (strcmp(argv[1], "webdav") == 0) {
			if(on)
				start_webdav();
		}
#endif
		else if (strcmp(argv[1], "gpiow") == 0) {
			if(argc>=4) set_gpio(atoi(argv[2]), atoi(argv[3]));
		}
		else if (strcmp(argv[1], "gpior") == 0) {
			_dprintf("%d\n", get_gpio(atoi(argv[2])));
		}
		else if (strcmp(argv[1], "gpiod") == 0) {
			if(argc>=4) gpio_dir(atoi(argv[2]), atoi(argv[3]));
		}
		else if (strcmp(argv[1], "init_switch") == 0) {
			init_switch(on);
		}
		else if (strcmp(argv[1], "set_action") == 0) {
			set_action(on);
		}
		else if (strcmp(argv[1], "pwr_usb") == 0) {
			set_pwr_usb(atoi(argv[2]));
			_dprintf("done.\n");
		}
		else {
			printf("what?\n");
		}
	}
	return 0;
}
コード例 #19
0
ファイル: watchdog.c プロジェクト: jing-git/rt-n56u
/* Check for time-dependent service */
static int
svc_timecheck(void)
{
    int activeNow;

#if BOARD_HAS_5G_RADIO
    if (get_enabled_radio_wl())
    {
        /* Initialize */
        if (nvram_match("reload_svc_wl", "1"))
        {
            nvram_set_int_temp("reload_svc_wl", 0);
            svcStatus[RADIO5_ACTIVE] = -1;
            svcStatus[GUEST5_ACTIVE] = -1;
        }

        activeNow = is_radio_allowed_wl();
        if (activeNow != svcStatus[RADIO5_ACTIVE])
        {
            svcStatus[RADIO5_ACTIVE] = activeNow;

            if (activeNow)
                notify_rc("control_wifi_radio_wl_on");
            else
                notify_rc("control_wifi_radio_wl_off");
        }

        if (svcStatus[RADIO5_ACTIVE] > 0)
        {
            activeNow = is_guest_allowed_wl();
            if (activeNow != svcStatus[GUEST5_ACTIVE])
            {
                svcStatus[GUEST5_ACTIVE] = activeNow;

                if (activeNow)
                    notify_rc("control_wifi_guest_wl_on");
                else
                    notify_rc("control_wifi_guest_wl_off");
            }
        }
        else
        {
            if (svcStatus[GUEST5_ACTIVE] >= 0)
                svcStatus[GUEST5_ACTIVE] = -1;
        }
    }
#endif

    if (get_enabled_radio_rt())
    {
        /* Initialize */
        if (nvram_match("reload_svc_rt", "1"))
        {
            nvram_set_int_temp("reload_svc_rt", 0);
            svcStatus[RADIO2_ACTIVE] = -1;
            svcStatus[GUEST2_ACTIVE] = -1;
        }

        activeNow = is_radio_allowed_rt();
        if (activeNow != svcStatus[RADIO2_ACTIVE])
        {
            svcStatus[RADIO2_ACTIVE] = activeNow;

            if (activeNow)
                notify_rc("control_wifi_radio_rt_on");
            else
                notify_rc("control_wifi_radio_rt_off");
        }

        if (svcStatus[RADIO2_ACTIVE] > 0)
        {
            activeNow = is_guest_allowed_rt();
            if (activeNow != svcStatus[GUEST2_ACTIVE])
            {
                svcStatus[GUEST2_ACTIVE] = activeNow;

                if (activeNow)
                    notify_rc("control_wifi_guest_rt_on");
                else
                    notify_rc("control_wifi_guest_rt_off");
            }
        }
        else
        {
            if (svcStatus[GUEST2_ACTIVE] >= 0)
                svcStatus[GUEST2_ACTIVE] = -1;
        }
    }

    return 0;
}
コード例 #20
0
ファイル: usb_devices.c プロジェクト: eckyecky/rt-n56u
int mdev_tty_main(int argc, char **argv)
{
	FILE *fp;
	int isLock, devnum, has_int_pipe;
	char usb_port_id[64], usb_interface_id[64], node_fname[64];
	const char *device_name, *action;

	if(argc != 3){
		printf("Usage: %s [device_name] [action]\n", argv[0]);
		return 0;
	}

	device_name = argv[1];
	action = argv[2];
	usb_dbg("(%s): action=%s.\n", device_name, action);

	if (!isSerialNode(device_name) && !isACMNode(device_name))
		return 0;

	sprintf(node_fname, "%s/%s", MODEM_NODE_DIR, device_name);

	// Check Lock.
	if((isLock = file_lock((char *)device_name)) == -1)
		return 0;
	
	// If remove the device?
	if(!check_hotplug_action(action)){
		unlink(node_fname);
		
		if (get_usb_modem_wan(0))
			notify_rc("on_unplug_usb_modem");
		
		usb_dbg("(%s): Remove the modem node\n", device_name);
		
		goto out_unlock;
	}

	// Get DevNum
	devnum = 0;
	has_int_pipe = 0;
	usb_port_id[0] = 0;
	if (get_interface_by_device(device_name, usb_interface_id, sizeof(usb_interface_id))) {
		has_int_pipe = get_interface_Int_endpoint(usb_interface_id);
		if (get_usb_port_by_interface_string(usb_interface_id, usb_port_id, sizeof(usb_port_id)))
			devnum = get_usb_devnum(usb_port_id);
	}

	// Write node file.
	mkdir_if_none(MODEM_NODE_DIR);
	fp = fopen(node_fname, "w+");
	if (fp) {
		fprintf(fp, "pref=%d\n", (has_int_pipe) ? 1 : 0);
		fprintf(fp, "devnum=%d\n", devnum);
		fprintf(fp, "portid=%s\n", usb_port_id);
		fclose(fp);
	}

	if (nvram_invmatch("modem_arun", "0") && nvram_match("modem_rule", "1") && nvram_invmatch("modem_type", "3"))
		notify_rc("on_hotplug_usb_modem");
	
	usb_dbg("(%s): Success!\n", device_name);

out_unlock:
	file_unlock(isLock);

	return 1;
}
コード例 #21
0
ファイル: rc.c プロジェクト: hebjt/asuswrt-merlin
// used for various testing
static int rctest_main(int argc, char *argv[])
{
	int on;

	if (argc < 2) {
		_dprintf("test what?\n");
	}
	else if (strcmp(argv[1], "rc_service")==0) {
		notify_rc(argv[2]);
	}
	else if(strcmp(argv[1], "get_phy_status")==0) {
		int mask;
		mask = atoi(argv[2]);
		TRACE_PT("debug for phy_status %x\n", get_phy_status(mask));
	}
	else if(strcmp(argv[1], "get_phy_speed")==0) {
		int mask;
		mask = atoi(argv[2]);
		TRACE_PT("debug for phy_speed %x\n", get_phy_speed(mask));
	}
	else if(strcmp(argv[1], "set_phy_ctrl")==0) {
		int mask, ctrl;
		mask = atoi(argv[2]);
		ctrl = atoi(argv[3]);
		TRACE_PT("debug for phy_speed %x\n", set_phy_ctrl(mask, ctrl));
	}
	else if(strcmp(argv[1], "handle_notifications")==0) {
		handle_notifications();
	}
	else if(strcmp(argv[1], "check_action")==0) {
		_dprintf("check: %d\n", check_action());
	}
	else if(strcmp(argv[1], "nvramhex")==0) {
		int i;
		char *nv;

		nv = nvram_safe_get(argv[2]);

		_dprintf("nvram %s(%d): ", nv, strlen(nv));
		for(i=0;i<strlen(nv);i++) {
			_dprintf(" %x", (unsigned char)*(nv+i));
		}
		_dprintf("\n");
	}
	else {
		on = atoi(argv[2]);
		_dprintf("%s %d\n", argv[1], on);

		if (strcmp(argv[1], "vlan") == 0)
		{
			if(on) start_vlan();
			else stop_vlan();
		}
		else if (strcmp(argv[1], "lan") == 0) {
			if(on) start_lan();
			else stop_lan();
		}
		else if (strcmp(argv[1], "wl") == 0) {
			if(on)
			{
				start_wl();
				lanaccess_wl();
			}
		}
		else if (strcmp(argv[1], "wan") == 0) {
			if(on) start_wan();
			else stop_wan();
		}
		else if (strcmp(argv[1], "wan_port") == 0) {
			if(on) start_wan_port();
			else stop_wan_port();
		}
		else if (strcmp(argv[1], "firewall") == 0) {
			//if(on) start_firewall();
			//else stop_firewall();
		}
		else if (strcmp(argv[1], "watchdog") == 0) {
			if(on) start_watchdog();
			else stop_watchdog();
		}
#if ! (defined(RTCONFIG_QCA) || defined(RTCONFIG_RALINK))
		else if (strcmp(argv[1], "watchdog02") == 0) {
			if(on) start_watchdog02();
			else stop_watchdog02();
		}
#endif  /* ! (RTCONFIG_QCA || RTCONFIG_RALINK) */
		else if (strcmp(argv[1], "sw_devled") == 0) {
			if(on) start_sw_devled();
			else stop_sw_devled();
		}
#ifdef RTCONFIG_FANCTRL
		else if (strcmp(argv[1], "phy_tempsense") == 0) {
			if(on) start_phy_tempsense();
			else stop_phy_tempsense();
		}
#endif
#ifdef RTCONFIG_BCMWL6
#ifdef RTCONFIG_PROXYSTA
		else if (strcmp(argv[1], "psta_monitor") == 0) {
			if(on) start_psta_monitor();
			else stop_psta_monitor();
		}
#endif
#endif
#ifdef RTCONFIG_IPERF
		else if (strcmp(argv[1], "monitor") == 0) {
			if(on) start_monitor();
			else stop_monitor();
		}
#endif
		else if (strcmp(argv[1], "qos") == 0) {//qos test
			if(on){
#ifdef RTCONFIG_RALINK
				if (module_loaded("hw_nat"))
				{
					modprobe_r("hw_nat");
					sleep(1);
#if 0
					f_write_string("/proc/sys/net/ipv4/conf/default/force_igmp_version", "0", 0, 0);
					f_write_string("/proc/sys/net/ipv4/conf/all/force_igmp_version", "0", 0, 0);
#endif
				}
#endif
			add_iQosRules(get_wan_ifname(wan_primary_ifunit()));
#ifdef RTCONFIG_BWDPI
				if(nvram_get_int("qos_type") == 1) {
					start_dpi_engine_service();
					// force to rebuild firewall to avoid some loopback issue
					if (nvram_match("fw_nat_loopback", "2"))
						start_firewall(wan_primary_ifunit(), 0);
				}
				else
#endif
				start_iQos();
			}
			else
			{
#ifdef RTCONFIG_RALINK
				if (nvram_get_int("hwnat") &&
					/* TODO: consider RTCONFIG_DUALWAN case */
//					!nvram_match("wan0_proto", "l2tp") &&
//					!nvram_match("wan0_proto", "pptp") &&
//					!(nvram_get_int("fw_pt_l2tp") || nvram_get_int("fw_pt_ipsec") &&
//					(nvram_match("wl0_radio", "0") || nvram_get_int("wl0_mrate_x")) &&
//					(nvram_match("wl1_radio", "0") || nvram_get_int("wl1_mrate_x")) &&
					!module_loaded("hw_nat"))
				{
#if 0
					f_write_string("/proc/sys/net/ipv4/conf/default/force_igmp_version", "2", 0, 0);
					f_write_string("/proc/sys/net/ipv4/conf/all/force_igmp_version", "2", 0, 0);
#endif

#if defined(RTN14U) || defined(RTAC52U) || defined(RTAC51U) || defined(RTN11P) || defined(RTN300) || defined(RTN54U) || defined(RTAC1200HP) || defined(RTN56UB1) || defined(RTAC54U) || defined(RTN56UB2)
					if (!(!nvram_match("switch_wantag", "none")&&!nvram_match("switch_wantag", "")))
#endif
					{
						modprobe("hw_nat");
						sleep(1);
					}
				}
#endif
#ifdef RTCONFIG_BWDPI
				if(nvram_get_int("qos_type") == 1){
					stop_dpi_engine_service(1);
				}
				else
#endif
				stop_iQos();
				del_iQosRules();
			}
		}
#ifdef RTCONFIG_WEBDAV
		else if (strcmp(argv[1], "webdav") == 0) {
			if(on)
				start_webdav();
		}
#endif
#ifdef RTCONFIG_TUNNEL
		else if (strcmp(argv[1], "mastiff") == 0) {
			if(on)
				start_mastiff();
		}
#endif
		else if (strcmp(argv[1], "gpiow") == 0) {
			if(argc>=4) set_gpio(atoi(argv[2]), atoi(argv[3]));
		}
		else if (strcmp(argv[1], "gpior") == 0) {
			printf("%d\n", get_gpio(atoi(argv[2])));
		}
		else if (strcmp(argv[1], "gpiod") == 0) {
			if(argc>=4) gpio_dir(atoi(argv[2]), atoi(argv[3]));
		}
		else if (strcmp(argv[1], "init_switch") == 0) {
			init_switch();
		}
		else if (strcmp(argv[1], "set_action") == 0) {
			set_action(on);
		}
		else if (strcmp(argv[1], "pwr_usb") == 0) {
			set_pwr_usb(atoi(argv[2]));
			_dprintf("done.\n");
		}
		else if (strcmp(argv[1], "enc_chk") == 0) {
        		unsigned char enc_buf[ENC_WORDS_LEN];
        		unsigned char dec_buf[DATA_WORDS_LEN + 1];

			_dprintf("get enc str:[%s]\n", enc_str(argv[2], (char *) enc_buf));
			_dprintf("get dec str:[%s]\n", dec_str((char *) enc_buf, (char *) dec_buf));

			_dprintf("done(%d)\n", strcmp(argv[2], (const char *) dec_buf));
		}
#ifdef RTCONFIG_BCMFA
		else if (strcmp(argv[1], "fa_rev") == 0) {
			_dprintf("(%d) done.\n", get_fa_rev());
		}
		else if (strcmp(argv[1], "fa_dump") == 0) {
			_dprintf("(%d) done.\n", get_fa_dump());
		}
#endif
		else {
			printf("what?\n");
		}
	}
	return 0;
}
コード例 #22
0
ファイル: rc.c プロジェクト: clockzhong/RouterN56U
int
main(int argc, char **argv)
{
	int ret;
	char *base = strrchr(argv[0], '/');
	const applet_rc_t *app;
	base = base ? base + 1 : argv[0];

	/* init */
	if (!strcmp(base, "init")) {
		if (getpid() != 1 ) {
			dbg("error: %s must be run as PID 1!\n", base);
			return -1;
		}
		init_main_loop();
		return 0;
	}

	/* stub for early kernel hotplug */
	if (!strcmp(base, "hotplug")) {
		return 0;
	}

	if (!strcmp(base, "reboot")) {
		return sys_exit();
	}

	if (!strcmp(base, "shutdown") || !strcmp(base, "halt")) {
		return sys_stop();
	}

	if (!strcmp(base, "rc")) {
		dbg("error: cannot run rc directly!\n");
		return EINVAL;
	}

	/* Set TZ for all rc programs */
	setenv_tz();

	/* Start applets */
	for (app = applets_rc; app->name; app++) {
		if (strcmp(base, app->name) == 0)
			return app->main(argc, argv);
	}

	ret = 0;
	if (!strcmp(base, "reset_to_defaults")) {
		erase_nvram();
		sys_exit();
	}
	else if (!strcmp(base, "run_ftpsamba")) {
#if defined(APP_SMBD)
		restart_smbd();
#else
		;
#endif
#if defined(APP_FTPD)
		restart_ftpd();
#endif
	}
#if defined(APP_SMBD)
	else if (!strcmp(base, "run_samba")) {
		restart_smbd();
	}
#endif
#if defined(APP_FTPD)
	else if (!strcmp(base, "run_ftp")) {
		restart_ftpd();
	}
#endif
#if defined(APP_NFSD)
	else if (!strcmp(base, "run_nfsd")) {
		run_nfsd();
	}
#endif
#if defined(APP_MINIDLNA)
	else if (!strcmp(base, "run_minidlna")) {
		restart_dms(0);
	}
#endif
#if defined(APP_FIREFLY)
	else if (!strcmp(base, "run_firefly")) {
		restart_itunes();
	}
#endif
#if defined(APP_TRMD)
	else if (!strcmp(base, "run_transmission")) {
		restart_torrent();
	}
#endif
#if defined(APP_ARIA)
	else if (!strcmp(base, "run_aria")) {
		restart_aria();
	}
#endif
#if defined(APP_FTPD)
	else if (!strcmp(base, "stop_ftp")) {
		stop_ftp();
	}
#endif
#if defined(APP_SMBD)
	else if (!strcmp(base, "stop_samba")) {
		stop_samba(0);
	}
#endif
	else if (!strcmp(base, "stop_ftpsamba")) {
#if defined(APP_FTPD)
		stop_ftp();
#endif
#if defined(APP_SMBD)
		stop_samba(0);
#else
		;
#endif
	}
#if defined(APP_NFSD)
	else if (!strcmp(base, "stop_nfsd")) {
		stop_nfsd();
	}
#endif
#if defined(APP_MINIDLNA)
	else if (!strcmp(base, "stop_minidlna")) {
		stop_dms();
	}
#endif
#if defined(APP_FIREFLY)
	else if (!strcmp(base, "stop_firefly")) {
		stop_itunes();
	}
#endif
#if defined(APP_TRMD)
	else if (!strcmp(base, "stop_transmission")) {
		stop_torrent();
	}
#endif
#if defined(APP_ARIA)
	else if (!strcmp(base, "stop_aria")) {
		stop_aria();
	}
#endif
	else if (!strcmp(base, "start_ddns")) {
		start_ddns(1);
	}
	else if (!strcmp(base, "stop_wan")) {
		notify_rc("manual_wan_disconnect");
	}
	else if (!strcmp(base, "restart_wan")) {
		notify_rc("manual_wan_reconnect");
	}
	else if (!strcmp(base, "restart_dns")) {
		restart_dns();
	}
	else if (!strcmp(base, "restart_dhcpd")) {
		restart_dhcpd();
	}
	else if (!strcmp(base, "restart_networkmap")) {
		restart_networkmap();
	}
	else if (!strcmp(base, "run_telnetd")) {
		run_telnetd();
	}
	else if (!strcmp(base, "restart_firewall")) {
		restart_firewall();
	}
	else if (!strcmp(base, "radio2_toggle")) {
		manual_toggle_radio_rt(-1);
	}
	else if (!strcmp(base, "radio2_toggle_on")) {
		manual_toggle_radio_rt(1);
	}
	else if (!strcmp(base, "radio2_toggle_off")) {
		manual_toggle_radio_rt(0);
	}
	else if (!strcmp(base, "radio2_enable")) {
		manual_change_radio_rt(1);
	}
	else if (!strcmp(base, "radio2_disable")) {
		manual_change_radio_rt(0);
	}
	else if (!strcmp(base, "radio2_guest_enable")) {
		manual_change_guest_rt(1);
	}
	else if (!strcmp(base, "radio2_guest_disable")) {
		manual_change_guest_rt(0);
	}
	else if (!strcmp(base, "radio2_eeprom_mac")) {
		if (argc > 1 && strlen(argv[1]) == 17)
			ret = set_wireless_mac(0, argv[1]);
		else {
			printf("Usage: %s XX:XX:XX:XX:XX:XX\n\n", base);
			ret = get_wireless_mac(0);
		}
	}
	else if (!strcmp(base, "radio2_restart")) {
		int radio_on = get_enabled_radio_rt();
		if (radio_on)
			radio_on = is_radio_allowed_rt();
		restart_wifi_rt(radio_on, 1);
	}
#if BOARD_HAS_5G_RADIO
	else if (!strcmp(base, "radio5_toggle")) {
		manual_toggle_radio_wl(-1);
	}
	else if (!strcmp(base, "radio5_toggle_on")) {
		manual_toggle_radio_wl(1);
	}
	else if (!strcmp(base, "radio5_toggle_off")) {
		manual_toggle_radio_wl(0);
	}
	else if (!strcmp(base, "radio5_enable")) {
		manual_change_radio_wl(1);
	}
	else if (!strcmp(base, "radio5_disable")) {
		manual_change_radio_wl(0);
	}
	else if (!strcmp(base, "radio5_guest_enable")) {
		manual_change_guest_wl(1);
	}
	else if (!strcmp(base, "radio5_guest_disable")) {
		manual_change_guest_wl(0);
	}
	else if (!strcmp(base, "radio5_eeprom_mac")) {
		if (argc > 1 && strlen(argv[1]) == 17)
			ret = set_wireless_mac(1, argv[1]);
		else {
			printf("Usage: %s XX:XX:XX:XX:XX:XX\n\n", base);
			ret = get_wireless_mac(1);
		}
	}
	else if (!strcmp(base, "radio5_restart")) {
		int radio_on = get_enabled_radio_wl();
		if (radio_on)
			radio_on = is_radio_allowed_wl();
		restart_wifi_wl(radio_on, 1);
	}
#endif
#if (BOARD_NUM_USB_PORTS > 0)
	else if (!strcmp(base, "ejusb")) {
		int port = 0;
		char *devn = NULL;
		if (argc > 1) {
			if (strncmp(argv[1], "sd", 2) == 0)
				devn = argv[1];
			else {
				port = atoi(argv[1]);
				if (argc > 2)
					devn = argv[2];
			}
		}
		ret = safe_remove_usb_device(port, devn, 1);
	}
	else if (!strcmp(base, "ejusb1")) {
		char *devn = (argc > 1) ? argv[1] : NULL;
		ret = safe_remove_usb_device(1, devn, 1);
	}
#if (BOARD_NUM_USB_PORTS > 1)
	else if (!strcmp(base, "ejusb2")) {
		char *devn = (argc > 1) ? argv[1] : NULL;
		ret = safe_remove_usb_device(2, devn, 1);
	}
#endif
#endif
	else if (!strcmp(base, "pids")) {
		if (argc > 1)
			ret = pids_main(argv[1]);
		else
			ret = EINVAL;
	}
	else {
		printf("Unknown applet: %s\n", base);
		ret = EINVAL;
	}

	return ret;
}
コード例 #23
0
ファイル: web-dsl.c プロジェクト: noikiy/asuswrt-merlin
int update_dsl_iptv_variables()
{
	char *nv, *nvp, *b;
	char *vpi, *vci, *proto, *encap, *vid;
	int unit = 0;
	char prefix[] = "dslxxx_xxxxxxxx";
	char tmp[64];

	_dprintf("dsltmp_cfg_iptv_pvclist=%s\n", nvram_safe_get("dsltmp_cfg_iptv_pvclist"));

	nvp = nv = strdup(nvram_safe_get("dsltmp_cfg_iptv_pvclist"));
	while(nv && (b = strsep(&nvp, "<")) != NULL){
		if((vstrsep(b, ">", &vpi, &vci, &proto, &encap, &vid) != 5))
			continue;

		unit++;

		_dprintf("vpi=[%s], vci=[%s], proto=[%s], encap=[%s], vid=[%s]\n", vpi, vci, proto, encap, vid);

		if(nvram_match("dsltmp_transmode", "atm")) {
			snprintf(prefix, sizeof(prefix), "dsl%d_", unit);

			nvram_set(strcat_r(prefix, "vpi", tmp), vpi);
			nvram_set(strcat_r(prefix, "vci", tmp), vci);
			nvram_set(strcat_r(prefix, "encap", tmp), encap);
		}
		else {	//ptm
			snprintf(prefix, sizeof(prefix), "dsl8.%d_", unit);

			nvram_set("dslx_transmode", "ptm");
			notify_rc("restart_dsl_setting");
		}

		nvram_set(strcat_r(prefix, "enable", tmp), "1");

		if(!strcmp(proto, "0")) {
			nvram_set(strcat_r(prefix, "proto", tmp), "pppoe");
		}
		else if(!strcmp(proto, "1")) {
			nvram_set(strcat_r(prefix, "proto", tmp), "pppoa");
		}
		else if(!strcmp(proto, "2")) {
			nvram_set(strcat_r(prefix, "proto", tmp), "dhcp");
		}
		else if(!strcmp(proto, "3")) {
			nvram_set(strcat_r(prefix, "proto", tmp), "bridge");
		}
		else if(!strcmp(proto, "4")) {
			nvram_set(strcat_r(prefix, "proto", tmp), "ipoa");
		}
		else {
			nvram_set(strcat_r(prefix, "proto", tmp), "bridge");
		}

		if(strlen(vid)) {
			nvram_set(strcat_r(prefix, "dot1q", tmp), "1");
			nvram_set(strcat_r(prefix, "vid", tmp), vid);
		}
	}
	free(nv);

	if(unit) {
		if(nvram_match("switch_stb_x", "1")
			&& (nvram_get_int("dslx_config_num") > 1)
		) {
			nvram_set("dsltmp_qis_reboot", "0");
		}
		else {
			nvram_set("switch_stb_x", "1");
			nvram_set("wans_lanport", "4");
			nvram_set("dsltmp_qis_reboot", "1");
		}
	}
	else {
		if(nvram_match("switch_stb_x", "0"))  {
			nvram_set("dsltmp_qis_reboot", "0");
		}
		else {
			nvram_set("switch_stb_x", "0");
			nvram_set("dsl1_enable", "0");
			nvram_set("dsl2_enable", "0");
			nvram_set("dsl3_enable", "0");
			nvram_set("dsl4_enable", "0");
			nvram_set("dsl5_enable", "0");
			nvram_set("dsl6_enable", "0");
			nvram_set("dsl7_enable", "0");
#ifdef RTCONFIG_VDSL
			nvram_set("dsl8.1_enable", "0");
			nvram_set("dsl8.2_enable", "0");
			nvram_set("dsl8.3_enable", "0");
			nvram_set("dsl8.4_enable", "0");
			nvram_set("dsl8.5_enable", "0");
			nvram_set("dsl8.6_enable", "0");
			nvram_set("dsl8.7_enable", "0");
#endif
			nvram_set("dsltmp_qis_reboot", "1");
		}
	}

	return 0;
}