Example #1
0
void start_igmp_proxy(void)
{
	int ret = 0;
	pid_t pid;
	char name[80], *next, *svbuf;
	char *argv[] = { "igmprt", "/tmp/igmpproxy.conf", NULL };

	int ifcount = 0;

	FILE *fp = fopen("/tmp/igmpproxy.conf", "wb");

	if (nvram_match("dtag_vlan8", "1") && nvram_match("wan_vdsl", "1")) {
		fprintf(fp, "quickleave\nphyint %s upstream  ratelimit 0  threshold 1\n", nvram_safe_get("tvnicfrom"));
		fprintf(fp, "phyint %s disabled\n", get_wan_face());
	} else {
		fprintf(fp, "quickleave\nphyint %s upstream  ratelimit 0  threshold 1\n", get_wan_face());
	}
	if (nvram_match("block_multicast", "0")) {
		fprintf(fp, "phyint %s downstream  ratelimit 0  threshold 1\n", nvram_safe_get("lan_ifname"));
		ifcount++;
	} else {
		fprintf(fp, "phyint %s disabled\n" "phyint %s:0 disabled\n", nvram_safe_get("lan_ifname"), nvram_safe_get("lan_ifname"));
	}
	char ifnames[256];

	getIfLists(ifnames, 256);
	foreach(name, ifnames, next) {
		if (strcmp(get_wan_face(), name)
		    && strcmp(nvram_safe_get("lan_ifname"), name)
		    && strcmp(nvram_safe_get("tvnicfrom"), name)) {
			if (nvram_nmatch("0", "%s_bridged", name)
			    && nvram_nmatch("1", "%s_multicast", name)) {
				fprintf(fp, "phyint %s downstream  ratelimit 0  threshold 1\n", name);
				ifcount++;
			} else
				fprintf(fp, "phyint %s disabled\n", name);
		}
	}
	fprintf(fp, "phyint lo disabled\n");
	fclose(fp);
	if (nvram_match("wan_proto", "disabled"))	// todo: add upstream 
		// config
	{
		// ret = _evalpid (igmp_proxybr_argv, NULL, 0, &pid);
		return;
	} else {
		if (ifcount) {
			if (pidof("igmprt") < 1)
				ret = _evalpid(argv, NULL, 0, &pid);
			dd_syslog(LOG_INFO, "igmprt : multicast daemon successfully started\n");
		}
	}

	cprintf("done\n");
	return;
}
Example #2
0
void start_snmp(void)
{
	int ret = 0;
	pid_t pid;

	char *snmpd_argv[] = { "snmpd", "-c", SNMP_CONF_FILE, NULL };
	FILE *fp = NULL;

	stop_snmp();

	if (!nvram_invmatch("snmpd_enable", "0"))
		return;

	fp = fopen(SNMP_CONF_FILE, "w");
	if (NULL == fp)
		return;

	if (strlen(nvram_safe_get("snmpd_syslocation")) > 0)
		fprintf(fp, "syslocation %s\n",
			nvram_safe_get("snmpd_syslocation"));
	if (strlen(nvram_safe_get("snmpd_syscontact")) > 0)
		fprintf(fp, "syscontact %s\n",
			nvram_safe_get("snmpd_syscontact"));
	if (strlen(nvram_safe_get("snmpd_sysname")) > 0)
		fprintf(fp, "sysname %s\n", nvram_safe_get("snmpd_sysname"));
	if (strlen(nvram_safe_get("snmpd_rocommunity")) > 0)
		fprintf(fp, "rocommunity %s\n",
			nvram_safe_get("snmpd_rocommunity"));
	if (strlen(nvram_safe_get("snmpd_rwcommunity")) > 0)
		fprintf(fp, "rwcommunity %s\n",
			nvram_safe_get("snmpd_rwcommunity"));
	fprintf(fp, "sysservices 9\n");
	fprintf(fp, "pass_persist .1.3.6.1.4.1.2021.255 /etc/wl_snmpd.sh\n");

	fclose(fp);
	ret = _evalpid(snmpd_argv, NULL, 0, &pid);

	cprintf("done\n");
	dd_syslog(LOG_INFO, "snmpd : SNMP daemon successfully started\n");

	return;
}
Example #3
0
void start_ttraff(void)
{
	if (!nvram_match("ttraff_enable", "1"))
		return;

	if ((nvram_match("ttraff_iface", "") || !nvram_get("ttraff_iface"))
	    && (nvram_match("wan_proto", "disabled")
		|| getWET()))
		return;

	pid_t pid;

	char *argv[] = { "ttraff", NULL };
	int ret = _evalpid(argv, NULL, 0, &pid);

	dd_syslog(LOG_INFO, "ttraff : traffic counter daemon successfully started\n");

	cprintf("done");

	return;
}
Example #4
0
void start_radio_timer(void)
{
	if (nvram_match("radio0_timer_enable", "0")
	    && nvram_match("radio1_timer_enable", "0"))
		return;
#ifdef HAVE_MADWIFI
	if (nvram_match("ath0_net_mode", "disabled"))
#else
	if (nvram_match("wl0_net_mode", "disabled")
	    && nvram_match("wl1_net_mode", "disabled"))
#endif
		return;

	pid_t pid;

	char *argv[] = { "radio_timer", NULL };
	int ret = _evalpid(argv, NULL, 0, &pid);

	dd_syslog(LOG_INFO, "radio_timer : radio timer daemon successfully started\n");

	cprintf("done");

	return;
}
Example #5
0
void start_l2tp(int status)
{
	int ret;
	FILE *fp;
	char *l2tp_argv[] = { "xl2tpd",
		NULL
	};
	char username[80], passwd[80];

	// stop_dhcpc();
#ifdef HAVE_PPPOE
	stop_pppoe();
#endif
#ifdef HAVE_PPTP
	stop_pptp();
#endif
	stop_l2tp();

	snprintf(username, sizeof(username), "%s",
		 nvram_safe_get("ppp_username"));
	snprintf(passwd, sizeof(passwd), "%s", nvram_safe_get("ppp_passwd"));

	if (status != REDIAL) {
		insmod("ipv6");
		insmod("l2tp_core");
		insmod("l2tp_netlink");
		insmod("l2tp_ppp");
		mkdir("/tmp/ppp", 0777);
		mkdir("/var/run/xl2tpd", 0777);
		mkdir("/tmp/xl2tpd", 0777);
		symlink("/sbin/rc", "/tmp/ppp/ip-up");
		symlink("/sbin/rc", "/tmp/ppp/ip-down");
		symlink("/dev/null", "/tmp/ppp/connect-errors");

		/*
		 * Generate L2TP configuration file 
		 */
		if (!(fp = fopen("/tmp/xl2tpd/xl2tpd.conf", "w"))) {
			perror("/tmp/xl2tpd/xl2tpd.conf");
			return;
		}
/*[global]
port = 1701
;auth file = /etc/xl2tpd/xl2tp-secrets

[lac fbnl2tpserver]
lns = 10.64.1.237
require chap = yes
refuse pap = yes
require authentication = yes
; Name should be the same as the username in the PPP authentication!
name = dani
ppp debug = yes
pppoptfile = /etc/xl2tpd/options.l2tp
length bit = yes
*/

		fprintf(fp, "[global]\n");	// Global section
		fprintf(fp, "port = 1701\n");	// Bind address
		fprintf(fp, "[lac %s]\n", nvram_safe_get("l2tp_server_name"));
		fprintf(fp, "lns = %s\n", nvram_safe_get("l2tp_server_name"));
		fprintf(fp, "require chap = %s\n",
			nvram_default_get("l2tp_req_chap", "yes"));
		fprintf(fp, "refuse pap = %s\n",
			nvram_default_get("l2tp_ref_pap", "yes"));
		fprintf(fp, "redial = yes\n");
		fprintf(fp, "redial timeout = 15\n");
		fprintf(fp, "require authentication = %s\n",
			nvram_default_get("l2tp_req_auth", "yes"));
		fprintf(fp, "name = %s\n", username);
		fprintf(fp, "pppoptfile = /tmp/ppp/options\n");
		fprintf(fp, "length bit = yes\n");
		fclose(fp);

		/*
		 * Generate options file 
		 */
		if (!(fp = fopen("/tmp/ppp/options", "w"))) {
			perror("/tmp/ppp/options");
			return;
		}

		if (nvram_match("mtu_enable", "1")) {
			if (atoi(nvram_safe_get("wan_mtu")) > 0) {
				fprintf(fp, "mtu %s\n",
					nvram_safe_get("wan_mtu"));
				fprintf(fp, "mru %s\n",
					nvram_safe_get("wan_mtu"));
			}

		}

		fprintf(fp, "defaultroute\n");	// Add a default route to the 
		// system routing tables,
		// using the peer as the
		// gateway
		fprintf(fp, "usepeerdns\n");	// Ask the peer for up to 2 DNS
		// server addresses
		// fprintf(fp, "pty 'pptp %s
		// --nolaunchpppd'\n",nvram_safe_get("pptp_server_ip")); 
		fprintf(fp, "user '%s'\n", username);
		// fprintf(fp, "persist\n"); // Do not exit after a connection is
		// terminated.

		if (nvram_match("ppp_demand", "1")) {	// demand mode
			fprintf(fp, "idle %d\n",
				nvram_match("ppp_demand",
					    "1") ?
				atoi(nvram_safe_get("ppp_idletime")) * 60 : 0);
			// fprintf(fp, "demand\n"); // Dial on demand
			// fprintf(fp, "persist\n"); // Do not exit after a connection is 
			// terminated.
			// fprintf(fp, "%s:%s\n",PPP_PSEUDO_IP,PPP_PSEUDO_GW); // <local
			// IP>:<remote IP>
			fprintf(fp, "ipcp-accept-remote\n");
			fprintf(fp, "ipcp-accept-local\n");
			fprintf(fp, "connect true\n");
			fprintf(fp, "noipdefault\n");	// Disables the default
			// behaviour when no local IP 
			// address is specified
			fprintf(fp, "ktune\n");	// Set /proc/sys/net/ipv4/ip_dynaddr
			// to 1 in demand mode if the local
			// address changes
		} else {	// keepalive mode
			start_redial();
		}

		fprintf(fp, "default-asyncmap\n");	// Disable asyncmap
		fprintf(fp, "crtscts\n");	// Disable protocol field compression
		// negotiation
		fprintf(fp, "nopcomp\n");	// Disable protocol field compression
		fprintf(fp, "refuse-eap\n");	// Disable protocol field compression
		fprintf(fp, "noaccomp\n");	// Disable Address/Control
		// compression 
		fprintf(fp, "noccp\n");	// Disable CCP (Compression Control
		// Protocol)
		fprintf(fp, "novj\n");	// Disable Van Jacobson style TCP/IP
		// header compression
		fprintf(fp, "nobsdcomp\n");	// Disables BSD-Compress compression
		fprintf(fp, "nodeflate\n");	// Disables Deflate compression
		fprintf(fp, "lcp-echo-interval 0\n");	// Don't send an LCP
		// echo-request frame to the
		// peer
		fprintf(fp, "lock\n");
		fprintf(fp, "noauth\n");
//              fprintf(fp, "debug\n");

		fclose(fp);

		/*
		 * Generate pap-secrets file 
		 */
		if (!(fp = fopen("/tmp/ppp/pap-secrets", "w"))) {
			perror("/tmp/ppp/pap-secrets");
			return;
		}
		fprintf(fp, "\"%s\" * \"%s\" *\n", username, passwd);
		fclose(fp);
		chmod("/tmp/ppp/pap-secrets", 0600);

		/*
		 * Generate chap-secrets file 
		 */
		if (!(fp = fopen("/tmp/ppp/chap-secrets", "w"))) {
			perror("/tmp/ppp/chap-secrets");
			return;
		}
		fprintf(fp, "\"%s\" * \"%s\" *\n", username, passwd);
		fclose(fp);
		chmod("/tmp/ppp/chap-secrets", 0600);

		/*
		 * Enable Forwarding 
		 */
		if ((fp = fopen("/proc/sys/net/ipv4/ip_forward", "r+"))) {
			fputc('1', fp);
			fclose(fp);
		} else
			perror("/proc/sys/net/ipv4/ip_forward");
	}

	/*
	 * Bring up WAN interface 
	 */
	// ifconfig(nvram_safe_get("wan_ifname"), IFUP,
	// nvram_safe_get("wan_ipaddr"), nvram_safe_get("wan_netmask"));

	ret = _evalpid(l2tp_argv, NULL, 0, NULL);
	sleep(1);

	if (nvram_match("ppp_demand", "1")) {
		/*
		 * Trigger Connect On Demand if user press Connect button in Status
		 * page 
		 */
		if (nvram_match("action_service", "start_l2tp")) {
			start_force_to_dial();
			nvram_unset("action_service");
		}
		/*
		 * Trigger Connect On Demand if user ping pptp server 
		 */
		else
			eval("listen", nvram_safe_get("lan_ifname"));
	} else {
		sysprintf("echo \"c %s\" >  /var/run/xl2tpd/l2tp-control",
			  nvram_safe_get("l2tp_server_name"));
	}

	cprintf("done\n");
	return;
}
Example #6
0
int _eval(char *const argv[])
{
	return _evalpid(argv, ">/dev/console", 0, NULL);
}
Example #7
0
void start_freeradius(void)
{
	int ret = 0;
	pid_t pid;

	char *radiusd_argv[] = { "radiusd", "-d", "/jffs/etc/freeradius", NULL };
	FILE *fp = NULL;
	stop_freeradius();
	nvram_default_get("radius_country", "DE");
	nvram_default_get("radius_state", "Saxony");
	nvram_default_get("radius_locality", "none");
	nvram_default_get("radius_expiration", "365");
	nvram_default_get("radius_passphrase", "changeme");
	nvram_default_get("radius_organisation", "DD-WRT");
	nvram_default_get("radius_email", "*****@*****.**");
	nvram_default_get("radius_common", "DD-WRT FreeRadius Certificate");

	nvram_default_get("radius_port", "1812");
	nvram_default_get("radius_enabled", "0");
	if (!nvram_match("radius_enabled", "1"))
		return;

#ifndef HAVE_OPENRISC
#ifndef HAVE_VENTANA
#if !defined(HAVE_RB600) || defined(HAVE_WDR4900)
#ifdef HAVE_X86
	system("mount --bind /usr/local /jffs");
#else
	if (!nvram_match("jffs_mounted", "1"))
		return;		//jffs is a requirement for radius and must be mounted at this point here
#endif
#endif
#endif
#endif
	prep();
	sysprintf("sed \"s/port = 0/port = %s/g\" /etc/freeradius/radiusd.conf > /jffs/etc/freeradius/radiusd.conf", nvram_safe_get("radius_port"));
	sysprintf("sed \"s/private_key_password = whatever/private_key_password = %s/g\" /etc/freeradius/eap.conf > /jffs/etc/freeradius/eap.conf", nvram_safe_get("radius_passphrase"));

	if (!f_exists("/jffs/etc/freeradius/certs/server.pem")) {
		//prepare certificates
		start_gen_radius_cert();
	}

	int i;

	/* generate clients */
	{
		struct radiusclientdb *db = loadradiusclientdb();
		if (db) {
			fp = fopen("/jffs/etc/freeradius/clients.conf", "wb");
			system("touch /jffs/etc/freeradius/clients.manual");
			fprintf(fp, "$INCLUDE clients.manual\n");

			for (i = 0; i < db->usercount; i++) {
				if (!db->users[i].clientsize)
					continue;
				if (!db->users[i].client || !strlen(db->users[i].client))
					continue;
				fprintf(fp, "client %s {\n" "\tsecret = %s\n" "\tshortname = DD-WRT-RADIUS\n}\n", db->users[i].client, db->users[i].passwd);
			}

			fclose(fp);
			freeradiusclientdb(db);
		}
	}

	/* now generate users */
	{
		struct radiusdb *db = loadradiusdb();
		if (db) {
			fp = fopen("/jffs/etc/freeradius/users", "wb");
			system("touch /jffs/etc/freeradius/users.manual");
			fprintf(fp, "$INCLUDE users.manual\n");
			fprintf(fp, "DEFAULT FreeRADIUS-Proxied-To == 127.0.0.1\n" "\tSession-Timeout := 3600,\n" "\tUser-Name := \"%%{User-Name}\",\n" "\tAcct-Interim-Interval := 300,\n" "\tFall-Through = Yes\n\n");
			time_t tm;
			struct tm tm_time;
			for (i = 0; i < db->usercount; i++) {
				if (!db->users[i].usersize)
					continue;
				if (!db->users[i].user || !strlen(db->users[i].user))
					continue;
				if (!db->users[i].enabled)
					continue;
				fprintf(fp, "%s        Cleartext-Password := \"%s\"", db->users[i].user, db->users[i].passwd);
				if (db->users[i].expiration) {
					tm = db->users[i].expiration * 24 * 60 * 60;
					memcpy(&tm_time, localtime(&tm), sizeof(tm_time));
					char datebuf[128];
					strftime(datebuf, sizeof(datebuf), "%d %b %Y", &tm_time);
					fprintf(fp, ", Expiration == \"%s\"\n", datebuf);
				} else
					fprintf(fp, "\n");
				if (db->users[i].downstream) {
					fprintf(fp, "\tWISPr-Bandwidth-Max-Down := %d,\n", db->users[i].downstream * 1024);
					fprintf(fp, "\tRP-Downstream-Speed-Limit := %d", db->users[i].downstream);
				}
				if (db->users[i].upstream) {
					if (db->users[i].downstream)
						fprintf(fp, ",\n");
					fprintf(fp, "\tWISPr-Bandwidth-Max-Up := %d,\n", db->users[i].upstream * 1024);
					fprintf(fp, "\tRP-Upstream-Speed-Limit := %d", db->users[i].upstream);
				}
				fprintf(fp, "\n");
			}
			fclose(fp);
			freeradiusdb(db);
		}
	}
	ret = _evalpid(radiusd_argv, NULL, 0, &pid);

	dd_syslog(LOG_INFO, "radiusd : FreeRadius daemon successfully started\n");

	return;
}
Example #8
0
void start_pptp(int status)
{
	int ret;
	FILE *fp;
	char *pptp_argv[] = { "pppd",
		NULL
	};
	char username[80], passwd[80];

	stop_dhcpc();
#ifdef HAVE_PPPOE
	stop_pppoe();
#endif
	stop_vpn_modules();

	snprintf(username, sizeof(username), "%s",
		 nvram_safe_get("ppp_username"));
	snprintf(passwd, sizeof(passwd), "%s", nvram_safe_get("ppp_passwd"));

	if (status != REDIAL) {
		create_pptp_config(nvram_safe_get("pptp_server_name"),
				   username);
		/*
		 * Generate pap-secrets file 
		 */
		if (!(fp = fopen("/tmp/ppp/pap-secrets", "w"))) {
			perror("/tmp/ppp/pap-secrets");
			return;
		}
		fprintf(fp, "\"%s\" * \"%s\" *\n", username, passwd);
		fclose(fp);
		chmod("/tmp/ppp/pap-secrets", 0600);

		/*
		 * Generate chap-secrets file 
		 */
		if (!(fp = fopen("/tmp/ppp/chap-secrets", "w"))) {
			perror("/tmp/ppp/chap-secrets");
			return;
		}
		fprintf(fp, "\"%s\" * \"%s\" *\n", username, passwd);
		fclose(fp);
		chmod("/tmp/ppp/chap-secrets", 0600);

		/*
		 * Enable Forwarding 
		 */
		if ((fp = fopen("/proc/sys/net/ipv4/ip_forward", "r+"))) {
			fputc('1', fp);
			fclose(fp);
		} else
			perror("/proc/sys/net/ipv4/ip_forward");
	}
	char *wan_ifname = nvram_safe_get("wan_ifname");

	if (isClient()) {
		wan_ifname = getSTA();
	}

	nvram_set("pptp_ifname", wan_ifname);
	/*
	 * Bring up WAN interface 
	 */
	if (nvram_match("pptp_use_dhcp", "1")) {
		// pid_t pid;
		// char *wan_ipaddr;
		// char *wan_netmask;
		// char *wan_gateway;

		// char *pptp_server_ip = nvram_safe_get ("pptp_server_ip");
		// char *wan_hostname = nvram_safe_get ("wan_hostname");

		nvram_set("wan_get_dns", "");
		nvram_unset("dhcpc_done");
		//dirty hack
		start_dhcpc(wan_ifname, NULL, NULL, 1);
		int timeout;

		for (timeout = 60; !nvram_match("dhcpc_done", "1") && timeout > 0; --timeout) {	/* wait for info from dhcp server */
			sleep(1);
		}
		stop_dhcpc();	/* we don't need dhcp client anymore */
		create_pptp_config(nvram_safe_get("pptp_server_ip"), username);

	} else {
		ifconfig(wan_ifname, IFUP, nvram_safe_get("wan_ipaddr"),
			 nvram_safe_get("wan_netmask"));
		struct dns_lists *dns_list = NULL;
		dns_to_resolv();
		dns_list = get_dns_list();
		int i = 0;

		if (dns_list) {
			for (i = 0; i < dns_list->num_servers; i++)
				route_add(wan_ifname, 0,
					  dns_list->dns_server[i],
					  nvram_safe_get("pptp_wan_gateway"),
					  "255.255.255.255");
		}
		route_add(wan_ifname, 0, "0.0.0.0",
			  nvram_safe_get("pptp_wan_gateway"), "0.0.0.0");
		char pptpip[64];
		getIPFromName(nvram_safe_get("pptp_server_name"), pptpip);
		route_del(wan_ifname, 0, "0.0.0.0",
			  nvram_safe_get("pptp_wan_gateway"), "0.0.0.0");
		if (dns_list) {
			for (i = 0; i < dns_list->num_servers; i++)
				route_del(wan_ifname, 0,
					  dns_list->dns_server[i],
					  nvram_safe_get("pptp_wan_gateway"),
					  "255.255.255.255");
			free(dns_list);
		}
		
		nvram_set("pptp_server_ip", pptpip);
		if (!nvram_match("pptp_wan_gateway", "0.0.0.0"))
			route_add(wan_ifname, 0,
				  nvram_safe_get("pptp_server_ip"),
				  nvram_safe_get("pptp_wan_gateway"),
				  "255.255.255.255");
	}
	ret = _evalpid(pptp_argv, NULL, 0, NULL);

	if (nvram_match("ppp_demand", "1")) {
		/*
		 * Trigger Connect On Demand if user press Connect button in Status
		 * page 
		 */
		if (nvram_match("action_service", "start_pptp")
		    || nvram_match("action_service", "start_l2tp")) {
			start_force_to_dial();
			// force_to_dial(nvram_safe_get("action_service"));
			nvram_unset("action_service");
		}
		/*
		 * Trigger Connect On Demand if user ping pptp server 
		 */
		else {
			eval("listen", nvram_safe_get("lan_ifname"));
		}
	}
	stop_wland();
	start_wshaper();
	start_wland();
	cprintf("done\n");
	return;
}
Example #9
0
void start_pppoe(int pppoe_num)
{
	char idletime[20], retry_num[20], param[4];
	char username[80], passwd[80];

	char ppp_username[2][20] = { "ppp_username", "ppp_username_1" };
	char ppp_passwd[2][20] = { "ppp_passwd", "ppp_passwd_1" };
	char ppp_demand[2][20] = { "ppp_demand", "ppp_demand_1" };
	char ppp_service[2][20] = { "ppp_service", "ppp_service_1" };
	char ppp_ac[2][10] = { "ppp_ac", "ppp_ac_1" };
	// char wanip[2][15] = { "wan_ipaddr", "wan_ipaddr_1" };
	// char wanmask[2][15] = { "wan_netmask", "wan_netmask_1" };
	// char wangw[2][15] = { "wan_gateway", "wan_gateway_1" };
	char pppoeifname[15];
	char *wan_ifname = nvram_safe_get("wan_ifname");

	if (isClient()) {
		wan_ifname = getSTA();
	}

	pid_t pid;

	sprintf(pppoeifname, "pppoe_ifname%d", pppoe_num);
	nvram_set(pppoeifname, "");

	cprintf("start session %d\n", pppoe_num);
	sprintf(idletime, "%d", atoi(nvram_safe_get("ppp_idletime")) * 60);
	snprintf(retry_num, sizeof(retry_num), "%d",
		 (atoi(nvram_safe_get("ppp_redialperiod")) / 5) - 1);

	snprintf(username, sizeof(username), "%s",
		 nvram_safe_get(ppp_username[pppoe_num]));
	snprintf(passwd, sizeof(passwd), "%s",
		 nvram_safe_get(ppp_passwd[pppoe_num]));
	sprintf(param, "%d", pppoe_num);
	/*
	 * add here 
	 */
	char *pppoe_argv[] = { "pppoecd",
		wan_ifname,
		"-u", username,
		"-p", passwd,
		"-r", nvram_safe_get("wan_mtu"),  // del by honor, add by tallest.
		"-t", nvram_safe_get("wan_mtu"),
		"-i", nvram_match(ppp_demand[pppoe_num], "1") ? idletime : "0",
		"-I", "10",	// Send an LCP echo-request frame to the
				// server every 10 seconds
		"-T", "20",	// pppd will presume the server to be dead if 
				// 20 LCP echo-requests are sent without
				//-> timeout 1 min
		// receiving a valid LCP echo-reply
		"-P", param,	// PPPOE session number.
		"-N", retry_num,	// To avoid kill pppd when pppd has been
		// connecting.
#if LOG_PPPOE == 2
		"-d",
#endif
		"-C", "disconnected_pppoe",	// by tallest 0407
		NULL,		/* set default route */
		NULL, NULL,	/* pppoe_service */
		NULL, NULL,	/* pppoe_ac */
		NULL,		/* pppoe_keepalive */
		NULL
	}, **arg;
	/*
	 * Add optional arguments 
	 */
	for (arg = pppoe_argv; *arg; arg++) ;

	/*
	 * Removed by AhMan 
	 */

	if (pppoe_num == PPPOE0) {	// PPPOE0 must set default route.
		*arg++ = "-R";
	}

	if (nvram_invmatch(ppp_service[pppoe_num], "")) {
		*arg++ = "-s";
		*arg++ = nvram_safe_get(ppp_service[pppoe_num]);
	}
	if (nvram_invmatch(ppp_ac[pppoe_num], "")) {
		*arg++ = "-a";
		*arg++ = nvram_safe_get(ppp_ac[pppoe_num]);
	}
	if (nvram_match("ppp_static", "1")) {
		*arg++ = "-L";
		*arg++ = nvram_safe_get("ppp_static_ip");
	}
	// if (nvram_match("pppoe_demand", "1") || nvram_match("pppoe_keepalive", 
	// "1"))
	*arg++ = "-k";

	mkdir("/tmp/ppp", 0777);
	symlink("/sbin/rc", "/tmp/ppp/ip-up");
	symlink("/sbin/rc", "/tmp/ppp/ip-down");
	symlink("/sbin/rc", "/tmp/ppp/set-pppoepid");	// tallest 1219
	unlink("/tmp/ppp/log");

	// Clean rpppoe client files - Added by ice-man (Wed Jun 1)
	unlink("/tmp/ppp/options.pppoe");
	unlink("/tmp/ppp/connect-errors");

	_evalpid(pppoe_argv, NULL, 0, &pid);

	if (nvram_match(ppp_demand[pppoe_num], "1")) {
		// int timeout = 5;
		start_tmp_ppp(pppoe_num);

		// This should be handled in start_wan_done
		// while (ifconfig (nvram_safe_get (pppoeifname), IFUP, NULL, NULL)
		// && timeout--)
		// sleep (1);
		// route_add (nvram_safe_get ("wan_iface"), 0, "0.0.0.0",
		// "10.112.112.112",
		// "0.0.0.0");

	}
	cprintf("done. session %d\n", pppoe_num);
	return;
}
Example #10
0
File: wpa.c Project: rogerhu/dd-wrt
void start_nas_notify(char *ifname)
{
	char *argv[] = { "nas4not", "lan", ifname, "up",
		NULL,		/* role */
		NULL,		/* crypto */
		NULL,		/* auth */
		NULL,		/* passphrase */
		NULL,		/* ssid */
		NULL
	};
	char *str = NULL;
	char tmp[100], prefix[] = "wlXXXXXXXXXX_", pidfile[] = "/tmp/nas.wlXXXXXXXlan.pid";
	int unit;
	char remote[ETHER_ADDR_LEN];
	char ssid[48], pass[80], auth[16], crypto[16], role[8];
	int i;

	/*
	 * the wireless interface must be configured to run NAS 
	 */
	wl_ioctl(ifname, WLC_GET_INSTANCE, &unit, sizeof(unit));
	snprintf(prefix, sizeof(prefix), "wl%d_", unit);
	snprintf(pidfile, sizeof(pidfile), "/tmp/nas.wl%dlan.pid", unit);

	if (!(str = file2str(pidfile)))	// no pidfile means no nas was run (required)
	{
		return;
	}
	free(str);
	sleep(3);
	/*
	 * find WDS link configuration 
	 */
	wl_ioctl(ifname, WLC_WDS_GET_REMOTE_HWADDR, remote, ETHER_ADDR_LEN);
	for (i = 0; i < MAX_NVPARSE; i++) {
		char mac[ETHER_ADDR_STR_LEN];
		uint8 ea[ETHER_ADDR_LEN];

		if (get_wds_wsec(unit, i, mac, role, crypto, auth, ssid, pass)
		    && ether_atoe(mac, ea)
		    && !bcmp(ea, remote, ETHER_ADDR_LEN)) {
			argv[4] = role;
			argv[5] = crypto;
			argv[6] = auth;
			argv[7] = pass;
			argv[8] = ssid;
			break;
		}
	}

	/*
	 * did not find WDS link configuration, use wireless' 
	 */
	if (i == MAX_NVPARSE) {
		/*
		 * role 
		 */
		argv[4] = "auto";
		/*
		 * crypto 
		 */
		argv[5] = nvram_safe_get(strcat_r(prefix, "crypto", tmp));
		/*
		 * auth mode 
		 */
		argv[6] = nvram_safe_get(strcat_r(prefix, "akm", tmp));
		/*
		 * passphrase 
		 */
		argv[7] = nvram_safe_get(strcat_r(prefix, "wpa_psk", tmp));
		/*
		 * ssid 
		 */
		argv[8] = nvram_safe_get(strcat_r(prefix, "ssid", tmp));
	}
	int pid;

	_evalpid(argv, ">/dev/console", 0, &pid);
}