Beispiel #1
0
static void
vpnc_route_dgw(char *ifname, char *gw, int add)
{
	if (nvram_match("vpnc_dgw", "1")) {
		if (strlen(ifname) > 0 && gw) {
			if (add) {
				route_add(ifname, 0, "0.0.0.0", gw, "128.0.0.0");
				route_add(ifname, 0, "128.0.0.0", gw, "128.0.0.0");
			} else {
				route_del(ifname, 0, "0.0.0.0", gw, "128.0.0.0");
				route_del(ifname, 0, "128.0.0.0", gw, "128.0.0.0");
			}
		}
	}
}
Beispiel #2
0
void
vpns_route_to_remote_lan(const char *cname, char *ifname, char *gw, int add)
{
	int i, i_max;
	char *acl_user, *acl_rnet, *acl_rmsk, *lnet, *lmsk;
	char acl_user_var[16], acl_rnet_var[16], acl_rmsk_var[16];

	lnet = nvram_safe_get("lan_ipaddr");
	lmsk = nvram_safe_get("lan_netmask");

	i_max = nvram_get_int("vpns_num_x");
	if (i_max > MAX_CLIENTS_NUM) i_max = MAX_CLIENTS_NUM;
	for (i = 0; i < i_max; i++) {
		sprintf(acl_user_var, "vpns_user_x%d", i);
		sprintf(acl_rnet_var, "vpns_rnet_x%d", i);
		sprintf(acl_rmsk_var, "vpns_rmsk_x%d", i);
		acl_user = nvram_safe_get(acl_user_var);
		acl_rnet = nvram_safe_get(acl_rnet_var);
		acl_rmsk = nvram_safe_get(acl_rmsk_var);
		if (*acl_user && strcmp(acl_user, cname) == 0 && is_valid_ipv4(acl_rnet) && is_valid_ipv4(acl_rmsk)) {
			if (!is_same_subnet2(acl_rnet, lnet, acl_rmsk, lmsk)) {
				if (add)
					route_add(ifname, 0, acl_rnet, gw, acl_rmsk);
				else
					route_del(ifname, 0, acl_rnet, gw, acl_rmsk);
			}
			
			break;
		}
	}
}
//---------------------------------------------------------------------------------------------------------------------
static int pmip_cache_delete_each(void *data, void *arg)
//---------------------------------------------------------------------------------------------------------------------
{
    pmip_entry_t *bce = (pmip_entry_t *) data;
    if (is_mag()) {
        //Delete existing route & rule for the deleted MN
        mag_remove_route(&bce->mn_addr, bce->link);
        int usercount = tunnel_getusers(bce->tunnel);
        dbg("# of binding entries %d \n", usercount);
        if (usercount == 1) {
            route_del(bce->tunnel, RT6_TABLE_PMIP, IP6_RT_PRIO_MIP6_FWD, &in6addr_any, 0, &in6addr_any, 0, NULL);
        }
        //decrement users of old tunnel.
        pmip_tunnel_del(bce->tunnel);
    }
    //Delete existing route for the deleted MN
    if (is_lma()) {
        lma_remove_route(&bce->mn_addr, bce->tunnel);
        //decrement users of old tunnel.
        pmip_tunnel_del(bce->tunnel);
    }
    //Delete the Entry.
    free_iov_data((struct iovec *) &bce->mh_vec, bce->iovlen);
    pmip_bce_delete(bce);
    return 0;
}
Beispiel #4
0
static void pptp_disconnect(void)
{
    if (pptp_server)
    {
        close(callmgr_sock);
        route_del(&rt);
    }

    close(pptp_fd);
}
Beispiel #5
0
static int renew(char *ifname)
{
	char *a, *b;
	int changed;

	_dprintf("%s: begin\n", __FUNCTION__);

	unlink(renewing);

	changed = env2nv("ip", "wan_ipaddr");
	changed |= env2nv("subnet", "wan_netmask");
	if (changed) {
		ifconfig(ifname, IFUP, nvram_safe_get("wan_ipaddr"), nvram_safe_get("wan_netmask"));
	}

	if (get_wan_proto() == WP_L2TP) {	
		env2nv_gateway("wan_gateway_buf");
	}
	else {
		a = strdup(nvram_safe_get("wan_gateway"));
		env2nv_gateway("wan_gateway");
		b = nvram_safe_get("wan_gateway");
		if ((a) && (strcmp(a, b) != 0)) {
			route_del(ifname, 0, "0.0.0.0", a, "0.0.0.0");
			route_add(ifname, 0, "0.0.0.0", b, "0.0.0.0");
			changed = 1;
		}
		free(a);
	}
	
	changed |= env2nv("domain", "wan_get_domain");
	changed |= env2nv("dns", "wan_get_dns");

	if ((a = getenv("lease")) != NULL) {
		nvram_set("wan_lease", a);
		expires(atoi(a));
	}

	if (changed) {
		set_host_domain_name();
		stop_dnsmasq();
		dns_to_resolv();
		start_dnsmasq();
	}
	
	_dprintf("wan_ipaddr=%s\n", nvram_safe_get("wan_ipaddr"));
	_dprintf("wan_netmask=%s\n", nvram_safe_get("wan_netmask"));
	_dprintf("wan_gateway=%s\n", nvram_safe_get("wan_gateway"));
	_dprintf("wan_get_domain=%s\n", nvram_safe_get("wan_get_domain"));
	_dprintf("wan_get_dns=%s\n", nvram_safe_get("wan_get_dns"));
	_dprintf("wan_lease=%s\n", nvram_safe_get("wan_lease"));
	_dprintf("%s: end\n", __FUNCTION__);
	return 0;
}
Beispiel #6
0
int ipdown_main(int argc, char **argv)
{
	int proto;
	
	TRACE_PT("begin\n");

	if (!wait_action_idle(10)) return -1;

	stop_ddns();	// avoid to trigger DOD
	stop_ntpc();

	unlink("/tmp/ppp/link");

	proto = get_wan_proto();
	if (proto == WP_L2TP || proto == WP_PPTP) {
		/* clear dns from the resolv.conf */
		nvram_set("wan_get_dns","");
		dns_to_resolv();

		if (proto == WP_L2TP) {
			route_del(nvram_safe_get("wan_ifname"), 0, nvram_safe_get("l2tp_server_ip"),
				nvram_safe_get("wan_gateway"), "255.255.255.255"); // fixed routing problem in Israel by kanki
		}

		// Restore the default gateway for WAN interface
		nvram_set("wan_gateway_get", nvram_safe_get("wan_gateway"));

		// Set default route to gateway if specified
		route_del(nvram_safe_get("wan_ifname"), 0, "0.0.0.0", nvram_safe_get("wan_gateway"), "0.0.0.0");
		route_add(nvram_safe_get("wan_ifname"), 0, "0.0.0.0", nvram_safe_get("wan_gateway"), "0.0.0.0");
	}

	if (nvram_get_int("ppp_demand")) {
		killall("listen", SIGKILL);
		eval("listen", nvram_safe_get("lan_ifname"));
	}

	TRACE_PT("end\n");
	return 1;
}
Beispiel #7
0
void stop_pptp(void)
{

	route_del(nvram_safe_get("wan_ifname"), 0,
		  nvram_safe_get("pptp_server_ip"), NULL, NULL);

	unlink("/tmp/ppp/link");
	stop_process("pppd", "PPP daemon");
	stop_process("pptp", "PPTP daemon");
	stop_process("listen", "activity daemon");

	cprintf("done\n");
	return;
}
//---------------------------------------------------------------------------------------------------------------------
int pmip_mag_init(void)
//---------------------------------------------------------------------------------------------------------------------
{
	pmip_common_init();
	conf.OurAddress = conf.MagAddressEgress;
	conf.HomeNetworkPrefix = get_node_prefix(&conf.MagAddressIngress); //copy Home network prefix.
	dbg("Running as MAG entity\n");
	dbg("Entity Egress Address: %x:%x:%x:%x:%x:%x:%x:%x\n", NIP6ADDR(&conf.OurAddress));
	dbg("Entity Ingress Address: %x:%x:%x:%x:%x:%x:%x:%x\n", NIP6ADDR(&conf.MagAddressIngress));
	dbg("Home Network Prefix Address: %x:%x:%x:%x:%x:%x:%x:%x\n", NIP6ADDR(&conf.HomeNetworkPrefix));
	if (mag_init_fsm() < 0) {
		dbg("Initialization of FSM failed...exit\n");
		exit(-1);
	}
	init_iface_ra();
	init_mag_icmp_sock();
	dbg("Initializing the NA handler\n");
	// to capture NA message
	icmp6_handler_reg(ND_NEIGHBOR_ADVERT, &pmip_mag_recv_na_handler);
	dbg("Initializing the RS handler\n");
	// to capture RS message
	icmp6_handler_reg(ND_ROUTER_SOLICIT, &pmip_mag_rs_handler);
	dbg("Initializing the PBA handler\n");
	//To capture PBA/ message.
	mh_handler_reg(IP6_MH_TYPE_BACK, &pmip_mag_pba_handler);
	//Anh Khuong: handle RO messages
	mh_handler_reg(IP6_MH_TYPE_ROI, &pmip_mag_roi_handler);
	mh_handler_reg(IP6_MH_TYPE_ROS, &pmip_mag_ros_handler);
	mh_handler_reg(IP6_MH_TYPE_ROSA, &pmip_mag_rosa_handler);
	mh_handler_reg(IP6_MH_TYPE_ETM, &pmip_mag_etm_handler);
	mh_handler_reg(IP6_MH_TYPE_HI, &pmip_mag_hi_handler);
	mh_handler_reg(IP6_MH_TYPE_HA, &pmip_mag_ha_handler);
	/**
	* Deletes the default route for MN prefix so routing is per unicast MN address!
	**/
	route_del((int) NULL, RT6_TABLE_MAIN, IP6_RT_PRIO_ADDRCONF, &in6addr_any, 0, &conf.HomeNetworkPrefix, 64, NULL);
	dbg("Initializing the HNP cache\n");
	if (pmip_mn_to_hnp_cache_init() < 0) {
		exit (-1);
	}

    char devname[32];
	int iif;
	dbg("Getting ingress informations\n");
	mag_get_ingress_info(&iif, devname);
	dbg("Starting capturing AP messages for incoming MNs detection\n");
	pmip_pcap_loop(devname, iif);

	return 0;
}
Beispiel #9
0
static int bound(char *ifname)
{
	_dprintf("%s: begin\n", __FUNCTION__);

	unlink(renewing);

	env2nv("ip", "wan_ipaddr");
	env2nv("subnet", "wan_netmask");
	env2nv_gateway("wan_gateway");
	env2nv("dns", "wan_get_dns");
	env2nv("domain", "wan_get_domain");
	env2nv("lease", "wan_lease");
	expires(atoi(safe_getenv("lease")));
	
	_dprintf("wan_ipaddr=%s\n", nvram_safe_get("wan_ipaddr"));
	_dprintf("wan_netmask=%s\n", nvram_safe_get("wan_netmask"));
	_dprintf("wan_gateway=%s\n", nvram_safe_get("wan_gateway"));
	_dprintf("wan_get_domain=%s\n", nvram_safe_get("wan_get_domain"));
	_dprintf("wan_get_dns=%s\n", nvram_safe_get("wan_get_dns"));
	_dprintf("wan_lease=%s\n", nvram_safe_get("wan_lease"));
	

	ifconfig(ifname, IFUP, nvram_safe_get("wan_ipaddr"), nvram_safe_get("wan_netmask"));

	if (get_wan_proto() == WP_L2TP) {
		int i = 0;

		/* Delete all default routes */
		while ((route_del(ifname, 0, NULL, NULL, NULL) == 0) || (i++ < 10));

		/* Set default route to gateway if specified */
		route_add(ifname, 0, "0.0.0.0", nvram_safe_get("wan_gateway"), "0.0.0.0");

		/* Backup the default gateway. It should be used if L2TP connection is broken */
		nvram_set("wan_gateway_buf", nvram_get("wan_gateway"));

		/* clear dns from the resolv.conf */
		nvram_set("wan_get_dns","");
		dns_to_resolv();

		start_firewall();
		start_l2tp();
	}
	else {
		start_wan_done(ifname);
	}

	_dprintf("%s: end\n", __FUNCTION__);
	return 0;
}
Beispiel #10
0
/* Executes the commands required to removed all the configured routes 
 * for this client.
 */
void remove_iroutes(struct main_server_st* s, struct proc_st *proc)
{
unsigned i;

	if (proc->config == NULL || proc->config->n_iroutes == 0 || proc->applied_iroutes == 0)
		return;

	for (i=0;i<proc->config->n_iroutes;i++) {
		route_del(s, proc, proc->config->iroutes[i], proc->tun_lease.name);
	}
	proc->applied_iroutes = 0;

	return;
}
Beispiel #11
0
void stop_l2tp(void)
{
	route_del(nvram_safe_get("wan_ifname"), 0,
		  nvram_safe_get("l2tp_server_ip"), NULL, NULL);

	unlink("/tmp/ppp/link");

	stop_process("pppd", "ppp daemon");
	stop_process("xl2tpd", "L2TP daemon");
	stop_process("listen", "connectivity listener");

	cprintf("done\n");
	return;
}
Beispiel #12
0
int remove_routes_by_protocol(int protocol,int family){
	vector routes = get_routes_by_protocol(protocol,family);
	
	int i;
	for(i=0;i<routes.size; i++){
		struct netlink_route *route;
		route = vector_get(&routes,i);

		route_del(&route->dest, &route->gateway,(int)route->prefix,route->metric);
		free(route);
	}

	vector_free(&routes);

	return i;
}
Beispiel #13
0
static void
vpnc_route_to_remote_lan(char *ifname, char *gw, int add)
{
	char *rnet = nvram_safe_get("vpnc_rnet");
	char *rmsk = nvram_safe_get("vpnc_rmsk");

	if (is_valid_ipv4(rnet) && is_valid_ipv4(rmsk)) {
		char *lnet = nvram_safe_get("lan_ipaddr");
		char *lmsk = nvram_safe_get("lan_netmask");
		if (strlen(ifname) > 0 && !is_same_subnet2(rnet, lnet, rmsk, lmsk)) {
			if (add)
				route_add(ifname, 0, rnet, gw, rmsk);
			else
				route_del(ifname, 0, rnet, gw, rmsk);
		}
	}
}
Beispiel #14
0
/* Executes the commands required to apply all the configured routes 
 * for this client locally.
 */
int apply_iroutes(struct main_server_st* s, struct proc_st *proc)
{
unsigned i, j;
int ret;

	if (proc->config->n_iroutes == 0)
		return 0;

	for (i=0;i<proc->config->n_iroutes;i++) {
		ret = route_add(s, proc, proc->config->iroutes[i], proc->tun_lease.name);
		if (ret < 0)
			goto fail;
	}
	proc->applied_iroutes = 1;

	return 0;
fail:
	for (j=0;j<i;j++)
		route_del(s, proc, proc->config->iroutes[j], proc->tun_lease.name);

	return -1;
}
Beispiel #15
0
int
control_static_routes(char *ift, char *ifname, int is_add)
{
	char word[128], *next;
	char *route_buf;
	char *ipaddr, *netmask, *gateway, *metric;

	if (is_add && nvram_invmatch("sr_enable_x", "1"))
		return 0;

	route_buf = (char *)malloc(SR_BUF_LEN*sizeof(char));
	if (!route_buf)
		return -1;

	fill_static_routes(route_buf, SR_BUF_LEN, ift);

	foreach(word, route_buf, next) {
		netmask = word;
		ipaddr = strsep(&netmask, ":");
		if (!ipaddr || !netmask)
			continue;
		gateway = netmask;
		netmask = strsep(&gateway, ":");
		if (!netmask || !gateway)
			continue;
		metric = gateway;
		gateway = strsep(&metric, ":");
		if (!gateway || !metric)
			continue;
		if (!is_valid_ipv4(gateway))
			gateway = nvram_safe_get("wanx_gateway");	// oleg patch
		
		if (is_add)
			route_add(ifname, atoi(metric), ipaddr, gateway, netmask);
		else
			route_del(ifname, atoi(metric), ipaddr, gateway, netmask);
	}
Beispiel #16
0
/*
 * Called when link goes down
 */
int ipdown_main(int argc, char **argv)
{
	if (check_action() != ACT_IDLE)
		return -1;
	runStartup("/etc/config", ".ipdown");
#ifdef HAVE_REGISTER
	if (isregistered_real())
#endif
	{
#ifdef HAVE_RB500
		runStartup("/usr/local/etc/config", ".ipdown");
#else
		runStartup("/jffs/etc/config", ".ipdown");
		runStartup("/mmc/etc/config", ".ipdown");
		runStartup("/tmp/etc/config", ".ipdown");
#endif
	}
	stop_ddns();
	stop_ntpc();

	unlink("/tmp/ppp/link");

	if (nvram_match("wan_proto", "l2tp")) {
		/*
		 * clear dns from the resolv.conf 
		 */
		nvram_set("wan_get_dns", "");
		dns_to_resolv();

		// todo
		route_del(nvram_safe_get("wan_ifname"), 0, nvram_safe_get("l2tp_server_ip"), nvram_safe_get("wan_gateway_buf"), "255.255.255.255");
		/*
		 * Restore the default gateway for WAN interface 
		 */
		nvram_set("wan_gateway", nvram_safe_get("wan_gateway_buf"));

		/*
		 * Set default route to gateway if specified 
		 */
		route_add(nvram_safe_get("wan_ifname"), 0, "0.0.0.0", nvram_safe_get("wan_gateway"), "0.0.0.0");
	}
	if (nvram_match("wan_proto", "pptp")) {
		eval("route", "del", "default");
		nvram_set("wan_gateway", nvram_safe_get("wan_gateway_buf"));
		eval("route", "add", "default", "gw", nvram_safe_get("wan_gateway"));
		sysprintf("iptables -t nat -A POSTROUTING -o %s -j MASQUERADE\n", nvram_safe_get("pptp_ifname"));
	}
#ifdef HAVE_3G
#if defined(HAVE_TMK) || defined(HAVE_BKM)
	else if (nvram_match("wan_proto", "3g")) {
		char *gpio3g = nvram_get("gpio3g");
		if (gpio3g != NULL)
			set_gpio(atoi(gpio3g), 0);
	}
#endif
#endif

	nvram_set("pppoe_ifname", "");
	nvram_set("pppd_pppifname", "");

	// write PPP traffic statistics to nvram if wanted
	if (nvram_match("ppp_traffic", "1")) {
		char buffer[64];
		long long old_in, old_out;
		long long in, out;
		char *pin;
		char *pout;
		time_t stamp;

		old_in = atol(nvram_safe_get("ppp_byte_in"));
		old_out = atol(nvram_safe_get("ppp_byte_out"));

		if ((pin = getenv("BYTES_RCVD")))
			in = atol(pin);
		else
			in = 0;

		if ((pout = getenv("BYTES_SENT")))
			out = atol(pout);
		else
			out = 0;

		in += old_in;
		out += old_out;
		snprintf(buffer, 63, "%lld", in);
		nvram_set("ppp_byte_in", buffer);
		snprintf(buffer, 63, "%lld", out);
		nvram_set("ppp_byte_out", buffer);
		if ((stamp = time(NULL)) < 1087818160)	// clock is not set
			// properly
			stamp = 0;
		snprintf(buffer, 63, "%ld", stamp);
		nvram_set("ppp_byte_stamp", buffer);
		nvram_commit();
	}

	if (nvram_match("ppp_demand", "1")
	    && (nvram_match("wan_proto", "pptp")
		|| nvram_match("wan_proto", "l2tp")
		|| nvram_match("wan_proto", "pppoe"))) {
		stop_process("listen", "activity listener");
		eval("listen", nvram_safe_get("lan_ifname"));
	}

	return 1;
}
Beispiel #17
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;
}
Beispiel #18
0
static int pptp_start_client(void)
{
    socklen_t len;
    struct sockaddr_pppox src_addr,dst_addr;
    struct hostent *hostinfo;
#if !defined(__UCLIBC__) \
 || (__UCLIBC_MAJOR__ == 0 \
 && (__UCLIBC_MINOR__ < 9 || (__UCLIBC_MINOR__ == 9 && __UCLIBC_SUBLEVEL__ < 31)))
    /* force ns refresh from resolv.conf with uClibc pre-0.9.31 */
    res_init();
#endif
    hostinfo=gethostbyname(pptp_server);
    if (!hostinfo)
    {
        error("PPTP: Unknown host %s\n", pptp_server);
        return -1;
    }
    dst_addr.sa_addr.pptp.sin_addr=*(struct in_addr*)hostinfo->h_addr;

    route_del(&rt);
    if (route2man)
        route_add(dst_addr.sa_addr.pptp.sin_addr, &rt);

    {
        int sock;
        struct sockaddr_in addr;
        len=sizeof(addr);
        addr.sin_addr=dst_addr.sa_addr.pptp.sin_addr;
        addr.sin_family=AF_INET;
        addr.sin_port=htons(1700);
        sock=socket(AF_INET,SOCK_DGRAM,0);
        if (connect(sock,(struct sockaddr*)&addr,sizeof(addr)))
        {
            close(sock);
            error("PPTP: connect failed (%s)\n",strerror(errno));
            route_del(&rt);
            return -1;
        }
        getsockname(sock,(struct sockaddr*)&addr,&len);
        src_addr.sa_addr.pptp.sin_addr=addr.sin_addr;
        close(sock);
    }
    //info("PPTP: connect server=%s\n",inet_ntoa(conn.sin_addr));
    //conn.loc_addr.s_addr=INADDR_NONE;
    //conn.timeout=1;
    //conn.window=pptp_window;

    src_addr.sa_family=AF_PPPOX;
    src_addr.sa_protocol=PX_PROTO_PPTP;
    src_addr.sa_addr.pptp.call_id=0;

    dst_addr.sa_family=AF_PPPOX;
    dst_addr.sa_protocol=PX_PROTO_PPTP;
    dst_addr.sa_addr.pptp.call_id=0;

    pptp_fd=socket(AF_PPPOX,SOCK_STREAM,PX_PROTO_PPTP);
    if (pptp_fd<0)
    {
        error("PPTP: failed to create PPTP socket (%s)\n",strerror(errno));
        route_del(&rt);
        return -1;
    }
    if (bind(pptp_fd,(struct sockaddr*)&src_addr,sizeof(src_addr)))
    {
        close(pptp_fd);
        error("PPTP: failed to bind PPTP socket (%s)\n",strerror(errno));
        route_del(&rt);
        return -1;
    }
    len=sizeof(src_addr);
    getsockname(pptp_fd,(struct sockaddr*)&src_addr,&len);
    call_ID=src_addr.sa_addr.pptp.call_id;

    /*
     * Open connection to call manager (Launch call manager if necessary.)
     */
    callmgr_sock = -1;
    do {
        if (callmgr_sock >= 0)
            close(callmgr_sock);
        callmgr_sock = open_callmgr(src_addr.sa_addr.pptp.call_id, dst_addr.sa_addr.pptp.sin_addr, pptp_phone, 50);
        if (callmgr_sock < 0)
        {
            close(pptp_fd);
            route_del(&rt);
            return -1;
        }
        /* Exchange PIDs, get call ID */
    } while (get_call_id(callmgr_sock, getpid(), getpid(), &dst_addr.sa_addr.pptp.call_id) < 0);

    if (connect(pptp_fd,(struct sockaddr*)&dst_addr,sizeof(dst_addr)))
    {
        close(callmgr_sock);
        close(pptp_fd);
        error("PPTP: failed to connect PPTP socket (%s)\n",strerror(errno));
        route_del(&rt);
        return -1;
    }

    sprintf(ppp_devnam,"pptp (%s)", inet_ntoa(dst_addr.sa_addr.pptp.sin_addr));

    return pptp_fd;
}
int main()
{

    int send_sock,listen_sock;
    struct sockaddr_in listen_addr, send_addr, client_addr;
    struct hostent *host;
    char *ip_addr1; 

    char recv_data[256];
    char send_data[256];
    char message[256];
    int addr_len, bytes_read;

    int i,j,k; 
    char recv_msg[256];
    char msg_list[5][128]; 
    char comp_msg[16]; 
    char mn_fl_ip_addr[16];
    char ap_ip_addr[16];
    char ap_name[20];
    char ap_tunnel_ip[20];
    char ap_tunnel_ifc[20];
    char net_mask[20];

    struct pollfd my_sock_fd[2]; 
    int poll_result , optval;

    optval = 1; 

    //###############################
    //# Declaring AP Listen Socket	#
    //###############################

    if ((listen_sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
    {
        perror("socket");
        exit(1);
    }

    ip_addr1 = "0"; 
    listen_addr.sin_family = AF_INET;
    listen_addr.sin_port = htons(9001);
    listen_addr.sin_addr.s_addr = inet_addr(ip_addr1);
    bzero(&(listen_addr.sin_zero),8);

    if((setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, 
            &optval, sizeof optval)) == -1)
    {
        perror("Socket setopt Error");
        exit(1);
    }

    if (bind(listen_sock,(struct sockaddr *)&listen_addr, sizeof(struct sockaddr)) == -1)
    {
        perror("BindError");
        exit(1);
    }

    my_sock_fd[0].fd = listen_sock; 
    my_sock_fd[0].events = POLLIN;

    //##########################
    //# Declaring Send Socket  #
    //##########################

    if ((send_sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) 
    {
        perror("SocketError");
        exit(1);
    }

    send_addr.sin_family = AF_INET;
    send_addr.sin_port = htons(9002);
    //send_addr.sin_addr = *((struct in_addr *)host->h_addr);

    bzero(&(send_addr.sin_zero),8);


    addr_len = sizeof(struct sockaddr);

    #ifdef DEBUG 
    	printf("\nGW Waiting for SWITCH-ROUTE on port 9001\n");
    #endif

    fflush(stdout);
    while (1)
    {
        while ((poll_result = poll(my_sock_fd, 1, -1)) <= 0)
        {
            if (poll_result < 0)
            {
                perror("Poll Error");
                exit(1);
            }
        }


        if (my_sock_fd[0].revents & POLLIN == 1)
        {
            bytes_read = recvfrom(listen_sock,recv_data,256,0,
                (struct sockaddr *)&client_addr, &addr_len);
              
            strcpy(ap_ip_addr , inet_ntoa(client_addr.sin_addr));

            recv_data[bytes_read] = '\0'; 

	    #ifdef DEBUG 
           	 printf("Received Data is :%s\n", recv_data);
  	    #endif

            fflush(stdout);


            j=0;
            k=0;
            for (i=0;i<=bytes_read;i++)
            {
                if (((recv_data[i] == ';') || (recv_data[i] == '\0')) && (k<4))
                {
                    recv_msg[j] = '\0'; 
                    strcpy(msg_list[k],recv_msg);
                    k++; 
                    j = 0; 
                }
                else 
                {
                    recv_msg[j] = recv_data[i];
                    j++;
                }
            }

            strcpy(msg_list[k],"NULL");
            k=0;
	    #ifdef DEBUG
                while ((k<4) && (strcmp(msg_list[k],"NULL")))
                {
                    printf("Messge %d is %s \n",k, msg_list[k]);
                    k++;
                }
	     #endif

            strcpy(mn_fl_ip_addr,msg_list[1]);
            strcpy(ap_name,msg_list[2]);

//            printf("Adding Route to MN IP Address\n");
            

    //###########################################
    //# Declaring MN IP address as host address
    //# to send message to
    //###########################################
    //
            host= (struct hostent *)gethostbyname((char *)ap_ip_addr);

            send_addr.sin_addr = *((struct in_addr *)host->h_addr);

    //###########################################
    //# Put in function call to get AP IP Addr  #
    //# and AP MAC Addrfrom the AP name given   #
    //# as message                              #
    //###########################################
            strcpy(ap_tunnel_ifc, ap_name); 
            strcpy(ap_tunnel_ip, get_ip_addr(ap_tunnel_ifc, ap_tunnel_ip, sizeof(ap_tunnel_ip)));
            strcpy(net_mask,"255.255.255.255"); 

            #ifdef DEBUG 
                printf("Deleting Old Route to MN \n");
                printf("Adding New Route to MN \n");
	    #endif

            route_del(mn_fl_ip_addr, net_mask, ap_tunnel_ifc); 
            route_add(mn_fl_ip_addr, net_mask, ap_tunnel_ip, ap_tunnel_ifc); 
            #ifdef DEBUG 
                printf("AP Name is %s \n",ap_name);
	    #endif

            sprintf (message, "SWITCH-ROUTE-OK;%s;%s",mn_fl_ip_addr,ap_name);

            strcpy(send_data,message); 

            strcpy(comp_msg ,"SWITCH-ROUTE"); 

            if (strcmp(msg_list[0],comp_msg)== 0)
            {
	       	#ifdef DEBUG 
               	    printf("Sending Message : %s \n",send_data); 
	    	#endif
                sendto(send_sock, send_data, strlen(send_data), 0,
                (struct sockaddr *)&send_addr, sizeof(struct sockaddr));
            }
        }     
    }

}
Beispiel #20
0
void destroy_tunnel (struct tunnel *t)
{
    /*
     * Immediately destroy a tunnel (and all its calls)
     * and free its resources.  This may be called
     * by the tunnel itself,so it needs to be
     * "suicide safe"
     */

    struct call *c, *me, *next;
    struct tunnel *p;
    struct timeval tv;
    if (!t)
        return;

    /*
     * Save ourselves until the very
     * end, since we might be calling this ourselves.
     * We must divorce ourself from the tunnel
     * structure, however, to avoid recursion
     * because of the logic of the destroy_call
     */
    me = t->self;

    /*
     * Destroy all the member calls
     */
    c = t->call_head;
    while (c)
    {
        next = c->next;
        destroy_call (c);
        c = next;
    };
    /*
     * Remove ourselves from the list of tunnels
     */

    if (tunnels.head == t)
    {
        tunnels.head = t->next;
        tunnels.count--;
    }
    else
    {
        p = tunnels.head;
        if (p)
        {
            while (p->next && (p->next != t))
                p = p->next;
            if (p->next)
            {
                p->next = t->next;
                tunnels.count--;
            }
            else
            {
                l2tp_log (LOG_WARNING,
                     "%s: unable to locate tunnel in tunnel list\n",
                     __FUNCTION__);
            }
        }
        else
        {
            l2tp_log (LOG_WARNING, "%s: tunnel list is empty!\n", __FUNCTION__);
        }
    }
    if (t->lac)
    {
        t->lac->t = NULL;
        if (t->lac->redial && (t->lac->rtimeout > 0) && !t->lac->rsched &&
            t->lac->active)
        {
            l2tp_log (LOG_INFO, "Will redial in %d seconds\n",
                 t->lac->rtimeout);
            tv.tv_sec = t->lac->rtimeout;
            tv.tv_usec = 0;
            t->lac->rsched = schedule (tv, magic_lac_dial, t->lac);
        }
    }
    /* XXX L2TP/IPSec: remove relevant SAs here?  NTB 20011010
     * XXX But what if another tunnel is using same SA?
     */
    if (t->lns)
        t->lns->t = NULL;
    if (t->chal_us.challenge)
        free (t->chal_us.challenge);
    if (t->chal_them.challenge)
        free (t->chal_them.challenge);
    /* we need no free(t->chal_us.vector) here because we malloc() and free()
       the memory pointed to by t->chal_us.vector at some other place */
    if (t->chal_them.vector)
        free (t->chal_them.vector);
    if (t->pppox_fd > -1 )
        close (t->pppox_fd);
    if (t->udp_fd > -1 )
        close (t->udp_fd);
    route_del(&t->rt);
    free (t);
    free (me);
}
Beispiel #21
0
static int bound(void)
{
	nvram_unset("dhcpc_done");
	char *wan_ifname = safe_getenv("interface");
	char *value;
	static char temp_wan_ipaddr[16], temp_wan_netmask[16],
	    temp_wan_gateway[16];
	int changed = 0;
	static char *cidr;
	if (nvram_match("wan_proto", "iphone"))
		stop_process("ipheth-loop", "IPhone Pairing Daemon");

	cidr = getenv("cidrroute");
	if (cidr && wan_ifname) {
		char *callbuffer = malloc(strlen(cidr) + 128);
		sprintf(callbuffer,
			"export cidrroute=\"%s\";export interface=\"%s\";/etc/cidrroute.sh",
			cidr, wan_ifname);
		system(callbuffer);
		free(callbuffer);
	}

	if ((value = getenv("ip"))) {
		chomp(value);
		if (nvram_match("wan_proto", "pptp")
		    && nvram_match("pptp_use_dhcp", "1"))
			strcpy(temp_wan_ipaddr, value);
		else {
			if (nvram_invmatch("wan_ipaddr", value))
				changed = 1;
		}
		nvram_set("wan_ipaddr", value);
	}
	if ((value = getenv("subnet"))) {
		chomp(value);
		if (nvram_match("wan_proto", "pptp")
		    && nvram_match("pptp_use_dhcp", "1"))
			strcpy(temp_wan_netmask, value);
		else {
			if (nvram_invmatch("wan_netmask", value))
				changed = 1;
			nvram_set("wan_netmask", value);
		}
	}
	if ((value = getenv("router"))) {
		chomp(value);
		if (nvram_invmatch("wan_gateway", value))
			changed = 1;
		nvram_set("wan_gateway", value);
	}
	if ((value = getenv("dns"))) {
		chomp(value);
		// if (nvram_invmatch("wan_get_dns",value))
		// changed=1; 
		nvram_set("wan_get_dns", value);
	}
	/*
	 * Don't care for linksys spec if ((value = getenv("wins")))
	 * nvram_set("wan_wins", value); if ((value = getenv("hostname")))
	 * sethostname(value, strlen(value) + 1); 
	 */
	if ((value = getenv("domain"))) {
		chomp(value);
		if (nvram_invmatch("wan_get_domain", value))
			changed = 1;
		nvram_set("wan_get_domain", value);	// HeartBeat need to use
	}
	if ((value = getenv("lease"))) {
		chomp(value);
		nvram_set("wan_lease", value);
		expires(atoi(value));
	}
	if (!changed) {
		cprintf("interface hasnt changed, do nothing\n");
		return 0;
	}
	stop_firewall();
	cprintf("configure to IF[%s] , IP[%s], MASK[%s]\n", wan_ifname,
		nvram_safe_get("wan_ipaddr"), nvram_safe_get("wan_netmask"));

	if (nvram_match("wan_proto", "pptp")
	    && nvram_match("pptp_use_dhcp", "1"))
		eval("ifconfig", wan_ifname, temp_wan_ipaddr, "netmask",
		     temp_wan_netmask, "up");
	else
		eval("ifconfig", wan_ifname, nvram_safe_get("wan_ipaddr"),
		     "netmask", nvram_safe_get("wan_netmask"), "up");

	/*
	 * We only want to exec bellow functions after dhcp get ip if the
	 * wan_proto is heartbeat 
	 */
#ifdef HAVE_HEARTBEAT
	if (nvram_match("wan_proto", "heartbeat")) {
		int i = 0;

		/*
		 * Delete all default routes 
		 */
		while (route_del(wan_ifname, 0, NULL, NULL, NULL) == 0
		       || i++ < 10) ;

		/*
		 * Set default route to gateway if specified 
		 */
		route_add(wan_ifname, 0, "0.0.0.0",
			  nvram_safe_get("wan_gateway"), "0.0.0.0");

		/*
		 * save dns to resolv.conf 
		 */
		dns_to_resolv();
		stop_udhcpd();
		start_udhcpd();
		start_firewall();
		stop_wland();
		start_wshaper();
		start_wland();
		start_heartbeat_boot();
	}
#else
	if (0) {
		// nothing
	}
#endif
#ifdef HAVE_PPTP
	else if (nvram_match("wan_proto", "pptp")
		 && nvram_match("pptp_use_dhcp", "1")) {
		char pptpip[64];
		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("wan_gateway"),
					  "255.255.255.255");
			free(dns_list);
		}
		route_add(wan_ifname, 0, "0.0.0.0",
			  nvram_safe_get("wan_gateway"), "0.0.0.0");

		nvram_set("wan_gateway_buf", nvram_get("wan_gateway"));

		getIPFromName(nvram_safe_get("pptp_server_name"), pptpip);
		nvram_set("pptp_server_ip", pptpip);

		// Add the route to the PPTP server on the wan interface for pptp
		// client to reach it
		if (nvram_match("wan_gateway", "0.0.0.0")
		    || nvram_match("wan_netmask", "0.0.0.0"))
			route_add(wan_ifname, 0,
				  nvram_safe_get("pptp_server_ip"),
				  nvram_safe_get("wan_gateway"),
				  "255.255.255.255");
		else
			route_add(wan_ifname, 0,
				  nvram_safe_get("pptp_server_ip"),
				  nvram_safe_get("wan_gateway"),
				  nvram_safe_get("wan_netmask"));

	}
#endif
#ifdef HAVE_L2TP
	else if (nvram_match("wan_proto", "l2tp")) {
		char l2tpip[64];
		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("wan_gateway"),
					  "255.255.255.255");
			free(dns_list);
		}

		/*
		 * Backup the default gateway. It should be used if L2TP connection
		 * is broken 
		 */
		nvram_set("wan_gateway_buf", nvram_get("wan_gateway"));

		getIPFromName(nvram_safe_get("l2tp_server_name"), l2tpip);

		nvram_set("l2tp_server_ip", l2tpip);

		route_add(wan_ifname, 0,
			  nvram_safe_get("l2tp_server_ip"),
			  nvram_safe_get("wan_gateway"), "255.255.255.255");

		start_firewall();
		start_l2tp_boot();
	}
#endif
	else {
		cprintf("start wan done\n");
		start_wan_done(wan_ifname);
	}
	nvram_set("dhcpc_done", "1");
	cprintf("done\n");
	return 0;
}