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"); } } } }
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; }
static void pptp_disconnect(void) { if (pptp_server) { close(callmgr_sock); route_del(&rt); } close(pptp_fd); }
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; }
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; }
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; }
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; }
/* 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; }
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; }
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; }
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); } } }
/* 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; }
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); }
/* * 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; }
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; }
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)); } } } }
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); }
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; }