void TEST_ROUTE(){ route_add("ping", method_ping); route_add("sum", method_sum); route_add("unkown_error", method_unknown_error); route_add("error_msg", method_error_msg); // check all possible error TEST_CALL("invalid json", testInvalidJSON); TEST_CALL("invalid request not object/array", testInvalidRequest); TEST_CALL("invalid request (id)", testInvalidRequestId); TEST_CALL("invalid request (method, version)", testInvalidRequestElse); TEST_CALL("not insert params", testInvalidParams); TEST_CALL("not found", testNotFound); TEST_CALL("unknown error", testUnknownError); TEST_CALL("error message", testErrorMessage); // ping TEST_CALL("test ping", testPing); // sum TEST_CALL("test sum", testSum); // batch TEST_CALL("test batch request", testBatch); TEST_CALL("test batch invalid one", testBatchInvalidOne); }
struct tunnel *l2tp_call (char *host, int port, struct lac *lac, struct lns *lns) { /* * Establish a tunnel from us to host * on port port */ struct call *tmp = NULL; struct hostent *hp; struct in_addr addr; port = htons (port); hp = gethostbyname (host); if (!hp) { l2tp_log (LOG_WARNING, "Host name lookup failed for %s.\n", host); schedule_redial(lac); return NULL; } bcopy (hp->h_addr, &addr.s_addr, hp->h_length); /* Force creation of a new tunnel and set it's tid to 0 to cause negotiation to occur */ /* * to do IPsec properly here, we need to set a socket policy, * and/or communicate with pluto. */ tmp = get_call (0, 0, addr, port, IPSEC_SAREF_NULL, IPSEC_SAREF_NULL); if (!tmp) { l2tp_log (LOG_WARNING, "%s: Unable to create tunnel to %s.\n", __FUNCTION__, host); schedule_redial(lac); return NULL; } tmp->container->tid = 0; tmp->container->lac = lac; tmp->container->lns = lns; tmp->lac = lac; tmp->lns = lns; if (lac) lac->t = tmp->container; if (lns) lns->t = tmp->container; /* * Since our state is 0, we will establish a tunnel now */ l2tp_log (LOG_NOTICE, "Connecting to host %s, port %d\n", host, ntohs (port)); if (lac) { if (lac->route_rdgw == 1) route_add(tmp->container->peer.sin_addr, 0, &tmp->container->rt); else if (lac->route_rdgw == 2) route_add(tmp->container->peer.sin_addr, 1, &tmp->container->rt); } control_finish (tmp->container, tmp); return tmp->container; }
/* ***************************************************************************** The main function ***************************************************************************** */ int main(int argc, char const *argv[]) { /* initialize the CLI helper and options */ cli_init(argc, argv); /* sertup routes */ route_add("/json", on_request_json); route_add("/plaintext", on_request_plain_text); /* Server name and header */ HTTP_HEADER_SERVER = fiobj_str_new("server", 6); HTTP_VALUE_SERVER = fiobj_str_new("facil.io " FIO_VERSION_STRING, strlen("facil.io " FIO_VERSION_STRING)); /* JSON values to be serialized */ JSON_KEY = fiobj_str_new("message", 7); JSON_VALUE = fiobj_str_new("Hello, World!", 13); /* Test for static file service */ const char *public_folder = fio_cli_get("-www"); if (public_folder) { fprintf(stderr, "* serving static files from:%s\n", public_folder); } /* listen to HTTP connections */ http_listen(fio_cli_get("-port"), fio_cli_get("-address"), .on_request = route_perform, .public_folder = public_folder, .log = fio_cli_get_bool("-log")); /* Start the facil.io reactor */ fio_start(.threads = fio_cli_get_i("-t"), .workers = fio_cli_get_i("-w")); /* perform cleanup */ cleanup(); return 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"); } } } }
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 void recv_data(struct unicast_conn *c, const linkaddr_t *from) { struct route_entry *e; linkaddr_t source; uip_len = packetbuf_copyto(&uip_buf[UIP_LLH_LEN]); source.u8[0] = BUF->srcipaddr.u8[2]; source.u8[1] = BUF->srcipaddr.u8[3]; e = route_lookup(&source); if(e == NULL) { route_add(&source, from, 10, 0); } else { route_refresh(e); } /* If we received data via a gateway, we refresh the gateway route. * Note: we refresh OUR gateway route, although we are not sure it forwarded the data. */ if(!uip_ipaddr_maskcmp(&BUF->srcipaddr, &netaddr, &netmask)) { e = route_lookup(&gateway); if(e != NULL) { route_refresh(e); } } PRINTF("uip-over-mesh: %d.%d: recv_data with len %d\n", linkaddr_node_addr.u8[0], linkaddr_node_addr.u8[1], uip_len); tcpip_input(); }
/*---------------------------------------------------------------------------*/ static void insert_route(const linkaddr_t *originator, const linkaddr_t *last_hop, uint8_t hops) { PRINTF("%d.%d: Inserting %d.%d into routing table, next hop %d.%d, hop count %d\n", linkaddr_node_addr.u8[0], linkaddr_node_addr.u8[1], originator->u8[0], originator->u8[1], last_hop->u8[0], last_hop->u8[1], hops); route_add(originator, last_hop, hops, 0); /* struct route_entry *rt; rt = route_lookup(originator); if(rt == NULL || hops < rt->hop_count) { PRINTF("%d.%d: Inserting %d.%d into routing table, next hop %d.%d, hop count %d\n", linkaddr_node_addr.u8[0], linkaddr_node_addr.u8[1], originator->u8[0], originator->u8[1], last_hop->u8[0], last_hop->u8[1], hops); route_add(originator, last_hop, hops, 0); #if CONTIKI_TARGET_NETSIM ether_set_line(last_hop->u8[0], last_hop->u8[1]); #endif }*/ }
void update_rt_summary(uint32_t area_id) { OspfArea *area = areaFind(area_id); if (area == NULL) return; // do everything else OspfLsa *lsa = lsadbGetList(area_id, LSA_TYPE_SUM_NET); while (lsa != NULL) { if (lsa->h.nexthop) { uint32_t mask = ntohl(lsa->u.net.mask); uint32_t ip = ntohl(lsa->header.link_state_id); ip &= mask; rcpLog(muxsock, RCP_PROC_OSPF, RLOG_DEBUG, RLOG_FC_OSPF_SPF, "adding inter-area route %d.%d.%d.%d/%d via %d.%d.%d.%d, cost %u, output interface %d.%d.%d.%d\n", RCP_PRINT_IP(ip), mask2bits(mask), RCP_PRINT_IP(lsa->h.nexthop), lsa->h.cost, RCP_PRINT_IP(lsa->h.outhop)); RT *rt = route_add(ip, mask, 0, lsa->h.nexthop, lsa->h.cost, RT_OSPF_IA); if (rt != NULL) { rt->area_id = area_id; rt->ifip = lsa->h.outhop; rt->del_flag = 0; } } lsa = lsa->h.next; } }
/* configure loopback interface */ void config_loopback(void) { /* Bring up loopback interface */ ifconfig("lo", IFUP, "127.0.0.1", "255.0.0.0"); /* Add to routing table */ route_add("lo", 0, "127.0.0.0", "0.0.0.0", "255.0.0.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; }
tun_t * tun_open(struct addr *src, struct addr *dst, int mtu) { struct intf_entry ifent; tun_t *tun; char dev[128]; int i; if (src->addr_type != ADDR_TYPE_IP || dst->addr_type != ADDR_TYPE_IP || src->addr_bits != IP_ADDR_BITS || dst->addr_bits != IP_ADDR_BITS) { errno = EINVAL; return (NULL); } if ((tun = calloc(1, sizeof(*tun))) == NULL) return (NULL); if ((tun->intf = intf_open()) == NULL) return (tun_close(tun)); memset(&ifent, 0, sizeof(ifent)); ifent.intf_len = sizeof(ifent); for (i = 0; i < MAX_DEVS; i++) { snprintf(dev, sizeof(dev), "/dev/tun%d", i); strlcpy(ifent.intf_name, dev + 5, sizeof(ifent.intf_name)); tun->save = ifent; if ((tun->fd = open(dev, O_RDWR, 0)) != -1 && intf_get(tun->intf, &tun->save) == 0) { route_t *r; struct route_entry entry; ifent.intf_flags = INTF_FLAG_UP|INTF_FLAG_POINTOPOINT; ifent.intf_addr = *src; ifent.intf_dst_addr = *dst; ifent.intf_mtu = mtu; if (intf_set(tun->intf, &ifent) < 0) tun = tun_close(tun); /* XXX - try to ensure our route got set */ if ((r = route_open()) != NULL) { entry.route_dst = *dst; entry.route_gw = *src; route_add(r, &entry); route_close(r); } break; } } if (i == MAX_DEVS) tun = tun_close(tun); return (tun); }
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; }
void processarp(int in_cleanup) { ARPTAB_ENTRY *cur_entry=*arptab, *prev_entry=NULL; /* First loop to remove unwanted routes */ while (cur_entry != NULL) { if (debug && verbose) printf("Working on route %s(%s) tstamp %u want_route %d\n", inet_ntoa(cur_entry->ipaddr_ia), cur_entry->ifname, (int) cur_entry->tstamp, cur_entry->want_route); if ( !cur_entry->want_route || time(NULL) - cur_entry->tstamp > ARP_TABLE_ENTRY_TIMEOUT || in_cleanup) { if (cur_entry->route_added) route_remove(cur_entry); /* remove from arp list */ if (debug) printf("Delete arp %s(%s)\n", inet_ntoa(cur_entry->ipaddr_ia), cur_entry->ifname); if (prev_entry != NULL) { prev_entry->next = cur_entry->next; free(cur_entry); cur_entry=prev_entry->next; } else { *arptab = cur_entry->next; free(cur_entry); cur_entry=*arptab; } } else { prev_entry = cur_entry; cur_entry = cur_entry->next; } } /* while loop */ /* Now loop to add new routes */ cur_entry=*arptab; while (cur_entry != NULL) { if (time(NULL) - cur_entry->tstamp <= ARP_TABLE_ENTRY_TIMEOUT && cur_entry->want_route && !cur_entry->route_added && !in_cleanup) { /* add route to the kernel */ route_add(cur_entry); } cur_entry = cur_entry->next; } /* while loop */ }
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); } } }
void update_rt_connected(uint32_t area_id) { OspfArea *area = areaFind(area_id); if (area) { OspfNetwork *net = area->network; while (net != NULL) { uint32_t ip = net->ip & net->mask; rcpLog(muxsock, RCP_PROC_OSPF, RLOG_DEBUG, RLOG_FC_OSPF_SPF, "adding connected route %d.%d.%d.%d/%d via %d.%d.%d.%d, cost %u", RCP_PRINT_IP(ip), mask2bits(net->mask), RCP_PRINT_IP(net->ip), net->cost); route_add(net->ip & net->mask, net->mask, 0, net->ip, net->cost, RT_CONNECTED, area_id, net->ip); net = net->next; } } }
static void check_and_set_comm_if(void) { #ifndef RTCONFIG_RALINK const char *ipaddr; char buf_ip[32]; ipaddr = getifaddr("vlan2", AF_INET, GIF_PREFIXLEN); //_dprintf("%s: %s\n", __func__, ipaddr); if(!ipaddr || (ipaddr && strncmp("169.254", ipaddr, 7))) { pick_a_random_ipv4(buf_ip); ifconfig("vlan2", IFUP, buf_ip, "255.255.0.0"); } if(!check_if_route_exist("vlan2", "169.254.0.1", "255.255.255.255")) route_add("vlan2", 0, "169.254.0.1", "0.0.0.0", "255.255.255.255"); #endif }
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; }
/* 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); }
int main(int argc, char *argv[]) { const char rtnet_dev[] = "/dev/rtnet"; if (argc == 1) print_routes(); if ((strcmp(argv[1], "--help") == 0) || (argc < 3)) help(); f = open(rtnet_dev, O_RDWR); if (f < 0) { perror(rtnet_dev); exit(1); } /* add host routes from file? */ if (strcmp(argv[1], "-f") == 0) route_listadd(argv[2]); /* second argument is now always an IP address */ if (!inet_aton(argv[2], &addr)) help(); if (strcmp(argv[1], "solicit") == 0) route_solicit(argc, argv); if (strcmp(argv[1], "add") == 0) route_add(argc, argv); if (strcmp(argv[1], "del") == 0) route_delete(argc, argv); help(); return 0; }
void sharp_install_routes_helper(struct prefix *p, vrf_id_t vrf_id, uint8_t instance, struct nexthop_group *nhg, uint32_t routes) { uint32_t temp, i; bool v4 = false; zlog_debug("Inserting %u routes", routes); if (p->family == AF_INET) { v4 = true; temp = ntohl(p->u.prefix4.s_addr); } else temp = ntohl(p->u.val32[3]); monotime(&sg.r.t_start); for (i = 0; i < routes; i++) { route_add(p, vrf_id, (uint8_t)instance, nhg); if (v4) p->u.prefix4.s_addr = htonl(++temp); else p->u.val32[3] = htonl(++temp); } }
int main (int argc, char **argv) { int status; int i; /* configure interface */ for (i = 0 ; i < (sizeof(ifinfo)/sizeof(struct ifinfo)) ; i++) { struct ifinfo *ifn = &ifinfo[i]; ipaddr_t broadcast; apply_netmask_broadcast(broadcast,(char *)&ifn->ip, (char *)&ifn->netmask); printf(" Name: %s ",ifn->interface); printf("Ip Address: %s ",pripaddr((char *)&ifn->ip)); printf("Netmask: %s ",pripaddr((char *)&ifn->netmask)); printf("Broadcast: %s\n",pripaddr(broadcast)); status = ifconfig(ifn->interface,ifn->flags, (char *)&ifn->ip, (char *)&ifn->netmask,broadcast); printf("ifconfig %s => %d\n",ifn->interface,status); if (status != 0) { printf("ifconfig failed\n"); } } /* add default route */ status = route_add(ROUTE_INET, ((ipaddr_t){0,0,0,0}), ((ipaddr_t){0,0,0,0}), mygateway); printf("route add default %s ==> %d\n",pripaddr(mygateway),status); /* start arp daemon, necessary to be started before mounting nfs server * so that the server can resolve our ip address, and we can resolve his. */ { extern void arpd_main (void); if (fork () == 0) { arpd_main (); } } /* mount the nfs root */ { extern int nfs_mount_root(); printf("MOUNTING ROOT: "); status = nfs_mount_root(nfs_server_ip,nfs_server_path); printf("DONE\n"); if (status != 0) { printf("failed (errno: %d)\n",errno); printf("check machine \"%s\" /etc/exports file, and make sure that you\n" "either have -alldirs or the exact directory there\n" "you have restarted mountd after making changes\n" "and that you have the proper permission\n",nfs_server_ip); printf("fix the problem and try again\n"); } } /* configuring lo0: configure loopback interface and route * ip packets from our machineip to our machineip via loopback * interface */ { ipaddr_t lo0mask = {255,255,255,255}; if_show(); status = ifconfig("lo0",IF_UP|IF_LOOPBACK, IPADDR_LOOPBACK, lo0mask, IPADDR_BROADCAST); printf("ifconfig lo0 => %d\n",status); for (i = 0 ; i < (sizeof(ifinfo)/sizeof(struct ifinfo)) ; i++) { struct ifinfo *ifn = &ifinfo[i]; status = route_add(ROUTE_INET, ifn->ip,IPADDR_BROADCAST, IPADDR_LOOPBACK); printf("route %s localhost ==> %d\n",pripaddr(ifn->ip),status); } } /* set the hostname */ { struct hostent *h; if ((h = gethostbyaddr(ifinfo[0].ip,4,AF_INET)) != NULL) { printf("My hostname is: %s\n",h->h_name); sethostname(h->h_name,strlen(h->h_name)); setdomainname(DOMAIN,strlen(DOMAIN)); } else { printf("gethostbyaddr %s %d %d failed\n",pripaddr(ifinfo[0].ip),4,AF_INET); } } /* if there is an rc.local files execute it. this is crucial because * otherwise the machine will simple have mounted a file system and stopped */ #ifdef RCLOCAL { struct stat sb; if (stat(RCLOCAL,&sb) == 0) { int status; sys_cputs("Spawning "); sys_cputs(RCLOCAL); sys_cputs("\n"); status = system(RCLOCAL); /* child */ kprintf("%d system(%s) returned %d %d\n",getpid(),RCLOCAL,status,errno); } } #endif /* RCLOCAL */ /* setup reaper */ #if 1 signal(SIGCHLD,reapchild); for(;;) sleep(100); #endif /* the first process now sleeps forever. It can't die, since it holds * references to important resources (like some memory pages) */ #if 0 reapchildren(); #else UAREA.u_status = U_SLEEP; yield(-1); #endif kprintf("FIRST PROCESS SHOULD NEVER PRINT THIS ==> TROUBLE\n"); assert(0); return 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; }
int start_vpnc(void) { FILE *fp; char options[80]; char *pppd_argv[] = { "/usr/sbin/pppd", "file", options, NULL}; char tmp[100], prefix[] = "vpnc_", wan_prefix[] = "wanXXXXXXXXXX_"; char buf[256]; /* although maximum length of pppoe_username/pppoe_passwd is 64. pppd accepts up to 256 characters. */ mode_t mask; int ret = 0; snprintf(wan_prefix, sizeof(wan_prefix), "wan%d_", wan_primary_ifunit()); #if 0 if (nvram_match(strcat_r(wan_prefix, "proto", tmp), "pptp") || nvram_match(strcat_r(wan_prefix, "proto", tmp), "l2tp")) return 0; #endif if (nvram_match(strcat_r(prefix, "proto", tmp), "pptp")) sprintf(options, "/tmp/ppp/vpnc_options.pptp"); else if (nvram_match(strcat_r(prefix, "proto", tmp), "l2tp")) sprintf(options, "/tmp/ppp/vpnc_options.l2tp"); else return 0; /* shut down previous instance if any */ stop_vpnc(); /* unset vpnc_dut_disc */ nvram_unset(strcat_r(prefix, "dut_disc", tmp)); update_vpnc_state(prefix, WAN_STATE_INITIALIZING, 0); mask = umask(0000); /* Generate options file */ if (!(fp = fopen(options, "w"))) { perror(options); umask(mask); return -1; } umask(mask); /* route for pptp/l2tp's server */ if (nvram_match(strcat_r(wan_prefix, "proto", tmp), "pptp") || nvram_match(strcat_r(wan_prefix, "proto", tmp), "l2tp")) { char *wan_ifname = nvram_safe_get(strcat_r(wan_prefix, "pppoe_ifname", tmp)); route_add(wan_ifname, 0, nvram_safe_get(strcat_r(wan_prefix, "gateway", tmp)), "0.0.0.0", "255.255.255.255"); } /* do not authenticate peer and do not use eap */ fprintf(fp, "noauth\n"); fprintf(fp, "refuse-eap\n"); fprintf(fp, "user '%s'\n", ppp_safe_escape(nvram_safe_get(strcat_r(prefix, "pppoe_username", tmp)), buf, sizeof(buf))); fprintf(fp, "password '%s'\n", ppp_safe_escape(nvram_safe_get(strcat_r(prefix, "pppoe_passwd", tmp)), buf, sizeof(buf))); if (nvram_match(strcat_r(prefix, "proto", tmp), "pptp")) { fprintf(fp, "plugin pptp.so\n"); fprintf(fp, "pptp_server '%s'\n", nvram_invmatch(strcat_r(prefix, "heartbeat_x", tmp), "") ? nvram_safe_get(strcat_r(prefix, "heartbeat_x", tmp)) : nvram_safe_get(strcat_r(prefix, "gateway_x", tmp))); fprintf(fp, "vpnc 1\n"); /* see KB Q189595 -- historyless & mtu */ if (nvram_match(strcat_r(wan_prefix, "proto", tmp), "pptp") || nvram_match(strcat_r(wan_prefix, "proto", tmp), "l2tp")) fprintf(fp, "nomppe-stateful mtu 1300\n"); else fprintf(fp, "nomppe-stateful mtu 1400\n"); if (nvram_match(strcat_r(prefix, "pptp_options_x", tmp), "-mppc")) { fprintf(fp, "nomppe nomppc\n"); } else if (nvram_match(strcat_r(prefix, "pptp_options_x", tmp), "+mppe-40")) { fprintf(fp, "require-mppe\n" "require-mppe-40\n"); } else if (nvram_match(strcat_r(prefix, "pptp_options_x", tmp), "+mppe-56")) { fprintf(fp, "nomppe-40\n" "nomppe-128\n" "require-mppe\n" "require-mppe-56\n"); } else if (nvram_match(strcat_r(prefix, "pptp_options_x", tmp), "+mppe-128")) { fprintf(fp, "nomppe-40\n" "nomppe-56\n" "require-mppe\n" "require-mppe-128\n"); } } else { fprintf(fp, "nomppe nomppc\n"); if (nvram_match(strcat_r(wan_prefix, "proto", tmp), "pptp") || nvram_match(strcat_r(wan_prefix, "proto", tmp), "l2tp")) fprintf(fp, "mtu 1300\n"); else fprintf(fp, "mtu 1400\n"); } if (nvram_invmatch(strcat_r(prefix, "proto", tmp), "l2tp")) { ret = nvram_get_int(strcat_r(prefix, "pppoe_idletime", tmp)); if (ret && nvram_get_int(strcat_r(prefix, "pppoe_demand", tmp))) { fprintf(fp, "idle %d ", ret); if (nvram_invmatch(strcat_r(prefix, "pppoe_txonly_x", tmp), "0")) fprintf(fp, "tx_only "); fprintf(fp, "demand\n"); } fprintf(fp, "persist\n"); } fprintf(fp, "holdoff %d\n", nvram_get_int(strcat_r(prefix, "pppoe_holdoff", tmp)) ? : 10); fprintf(fp, "maxfail %d\n", nvram_get_int(strcat_r(prefix, "pppoe_maxfail", tmp))); if (nvram_invmatch(strcat_r(prefix, "dnsenable_x", tmp), "0")) fprintf(fp, "usepeerdns\n"); fprintf(fp, "ipcp-accept-remote ipcp-accept-local noipdefault\n"); fprintf(fp, "ktune\n"); /* pppoe set these options automatically */ /* looks like pptp also likes them */ fprintf(fp, "default-asyncmap nopcomp noaccomp\n"); /* pppoe disables "vj bsdcomp deflate" automagically */ /* ccp should still be enabled - mppe/mppc requires this */ fprintf(fp, "novj nobsdcomp nodeflate\n"); /* echo failures */ fprintf(fp, "lcp-echo-interval 6\n"); fprintf(fp, "lcp-echo-failure 10\n"); /* pptp has Echo Request/Reply, l2tp has Hello packets */ if (nvram_match(strcat_r(prefix, "proto", tmp), "pptp") || nvram_match(strcat_r(prefix, "proto", tmp), "l2tp")) fprintf(fp, "lcp-echo-adaptive\n"); fprintf(fp, "unit %d\n", vpnc_unit); fprintf(fp, "linkname vpn%d\n", vpnc_unit); fprintf(fp, "ip-up-script %s\n", "/tmp/ppp/vpnc-ip-up"); fprintf(fp, "ip-down-script %s\n", "/tmp/ppp/vpnc-ip-down"); fprintf(fp, "ip-pre-up-script %s\n", "/tmp/ppp/vpnc-ip-pre-up"); fprintf(fp, "auth-fail-script %s\n", "/tmp/ppp/vpnc-auth-fail"); #if 0 /* unsupported */ #ifdef RTCONFIG_IPV6 switch (get_ipv6_service()) { case IPV6_NATIVE_DHCP: case IPV6_MANUAL: fprintf(fp, "+ipv6\n"); break; } #endif #endif /* user specific options */ fprintf(fp, "%s\n", nvram_safe_get(strcat_r(prefix, "pppoe_options_x", tmp))); fclose(fp); #if 0 /* shut down previous instance if any */ stop_vpnc(); nvram_unset(strcat_r(prefix, "dut_disc", tmp)); #endif if (nvram_match(strcat_r(prefix, "proto", tmp), "l2tp")) { if (!(fp = fopen(L2TP_VPNC_CONF, "w"))) { perror(options); return -1; } fprintf(fp, "# automagically generated\n" "global\n\n" "load-handler \"sync-pppd.so\"\n" "load-handler \"cmd.so\"\n\n" "section sync-pppd\n\n" "lac-pppd-opts \"file %s\"\n\n" "section peer\n" "port 1701\n" "peername %s\n" "vpnc 1\n" "hostname %s\n" "lac-handler sync-pppd\n" "persist yes\n" "maxfail %d\n" "holdoff %d\n" "hide-avps no\n" "section cmd\n" "socket-path " L2TP_VPNC_CTRL "\n\n", options, nvram_invmatch(strcat_r(prefix, "heartbeat_x", tmp), "") ? nvram_safe_get(strcat_r(prefix, "heartbeat_x", tmp)) : nvram_safe_get(strcat_r(prefix, "gateway_x", tmp)), nvram_invmatch(strcat_r(prefix, "hostname", tmp), "") ? nvram_safe_get(strcat_r(prefix, "hostname", tmp)) : "localhost", nvram_get_int(strcat_r(prefix, "pppoe_maxfail", tmp)) ? : 32767, nvram_get_int(strcat_r(prefix, "pppoe_holdoff", tmp)) ? : 10); fclose(fp); /* launch l2tp */ eval("/usr/sbin/l2tpd", "-c", L2TP_VPNC_CONF, "-p", L2TP_VPNC_PID); ret = 3; do { _dprintf("%s: wait l2tpd up at %d seconds...\n", __FUNCTION__, ret); usleep(1000*1000); } while (!pids("l2tpd") && ret--); /* start-session */ ret = eval("/usr/sbin/l2tp-control", "-s", L2TP_VPNC_CTRL, "start-session 0.0.0.0"); /* pppd sync nodetach noaccomp nobsdcomp nodeflate */ /* nopcomp novj novjccomp file /tmp/ppp/options.l2tp */ } else
struct call *get_call (int tunnel, int call, unsigned int addr, int port, IPsecSAref_t refme, IPsecSAref_t refhim) { /* * Figure out which call struct should handle this. * If we have tunnel and call ID's then they are unique. * Otherwise, if the tunnel is 0, look for an existing connection * or create a new tunnel. */ struct tunnel *st; struct call *sc; if (tunnel) { st = tunnels.head; while (st) { if (st->ourtid == tunnel && (gconfig.ipsecsaref==0 || (st->refhim == refhim || refhim==IPSEC_SAREF_NULL || st->refhim==IPSEC_SAREF_NULL))) { if (call) { sc = st->call_head; while (sc) { /* confirm that this is in fact a call with the right SA! */ if (sc->ourcid == call) return sc; sc = sc->next; } l2tp_log (LOG_DEBUG, "%s: can't find call %d in tunnel %d\n (ref=%d/%d)", __FUNCTION__, call, tunnel, refme, refhim); return NULL; } else { return st->self; } } st = st->next; } l2tp_log (LOG_INFO, "Can not find tunnel %u (refhim=%u)\n", tunnel, refhim); return NULL; } else { /* You can't specify a call number if you haven't specified a tunnel silly! */ if (call) { l2tp_log (LOG_WARNING, "%s: call ID specified, but no tunnel ID specified. tossing.\n", __FUNCTION__); return NULL; } /* * Well, nothing appropriate... Let's add a new tunnel, if * we are not at capacity. */ if (gconfig.debug_tunnel) { l2tp_log (LOG_DEBUG, "%s: allocating new tunnel for host %s, port %d.\n", __FUNCTION__, IPADDY (addr), ntohs (port)); } if (!(st = new_tunnel ())) { l2tp_log (LOG_WARNING, "%s: unable to allocate new tunnel for host %s, port %d.\n", __FUNCTION__, IPADDY (addr), ntohs (port)); return NULL; }; st->peer.sin_family = AF_INET; st->peer.sin_port = port; st->refme = refme; st->refhim = refhim; bcopy (&addr, &st->peer.sin_addr, sizeof (addr)); st->next = tunnels.head; tunnels.head = st; tunnels.count++; /* Add route to the peer */ memset(&st->rt, 0, sizeof(&st->rt)); route_add(st->peer.sin_addr, &st->rt); return st->self; } }
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 service_add(struct service *sv, const uint8_t uid[20], uint32_t addr, uint16_t port) { route_add(sv->table, sv->srcid, uid, addr, port); }
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; }
int route_configure( Route *route, Link *link, sd_netlink_message_handler_t callback) { _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL; _cleanup_(sd_event_source_unrefp) sd_event_source *expire = NULL; usec_t lifetime; int r; assert(link); assert(link->manager); assert(link->manager->rtnl); assert(link->ifindex > 0); assert(route->family == AF_INET || route->family == AF_INET6); if (route_get(link, route->family, &route->dst, route->dst_prefixlen, route->tos, route->priority, route->table, NULL) <= 0 && set_size(link->routes) >= ROUTES_PER_LINK_MAX) return -E2BIG; r = sd_rtnl_message_new_route(link->manager->rtnl, &req, RTM_NEWROUTE, route->family, route->protocol); if (r < 0) return log_error_errno(r, "Could not create RTM_NEWROUTE message: %m"); if (!in_addr_is_null(route->family, &route->gw)) { if (route->family == AF_INET) r = sd_netlink_message_append_in_addr(req, RTA_GATEWAY, &route->gw.in); else if (route->family == AF_INET6) r = sd_netlink_message_append_in6_addr(req, RTA_GATEWAY, &route->gw.in6); if (r < 0) return log_error_errno(r, "Could not append RTA_GATEWAY attribute: %m"); r = sd_rtnl_message_route_set_family(req, route->family); if (r < 0) return log_error_errno(r, "Could not set route family: %m"); } if (route->dst_prefixlen) { if (route->family == AF_INET) r = sd_netlink_message_append_in_addr(req, RTA_DST, &route->dst.in); else if (route->family == AF_INET6) r = sd_netlink_message_append_in6_addr(req, RTA_DST, &route->dst.in6); if (r < 0) return log_error_errno(r, "Could not append RTA_DST attribute: %m"); r = sd_rtnl_message_route_set_dst_prefixlen(req, route->dst_prefixlen); if (r < 0) return log_error_errno(r, "Could not set destination prefix length: %m"); } if (route->src_prefixlen) { if (route->family == AF_INET) r = sd_netlink_message_append_in_addr(req, RTA_SRC, &route->src.in); else if (route->family == AF_INET6) r = sd_netlink_message_append_in6_addr(req, RTA_SRC, &route->src.in6); if (r < 0) return log_error_errno(r, "Could not append RTA_SRC attribute: %m"); r = sd_rtnl_message_route_set_src_prefixlen(req, route->src_prefixlen); if (r < 0) return log_error_errno(r, "Could not set source prefix length: %m"); } if (!in_addr_is_null(route->family, &route->prefsrc)) { if (route->family == AF_INET) r = sd_netlink_message_append_in_addr(req, RTA_PREFSRC, &route->prefsrc.in); else if (route->family == AF_INET6) r = sd_netlink_message_append_in6_addr(req, RTA_PREFSRC, &route->prefsrc.in6); if (r < 0) return log_error_errno(r, "Could not append RTA_PREFSRC attribute: %m"); } r = sd_rtnl_message_route_set_scope(req, route->scope); if (r < 0) return log_error_errno(r, "Could not set scope: %m"); r = sd_rtnl_message_route_set_flags(req, route->flags); if (r < 0) return log_error_errno(r, "Could not set flags: %m"); if (route->table != RT_TABLE_DEFAULT) { if (route->table < 256) { r = sd_rtnl_message_route_set_table(req, route->table); if (r < 0) return log_error_errno(r, "Could not set route table: %m"); } else { r = sd_rtnl_message_route_set_table(req, RT_TABLE_UNSPEC); if (r < 0) return log_error_errno(r, "Could not set route table: %m"); /* Table attribute to allow more than 256. */ r = sd_netlink_message_append_data(req, RTA_TABLE, &route->table, sizeof(route->table)); if (r < 0) return log_error_errno(r, "Could not append RTA_TABLE attribute: %m"); } } r = sd_netlink_message_append_u32(req, RTA_PRIORITY, route->priority); if (r < 0) return log_error_errno(r, "Could not append RTA_PRIORITY attribute: %m"); r = sd_netlink_message_append_u8(req, RTA_PREF, route->pref); if (r < 0) return log_error_errno(r, "Could not append RTA_PREF attribute: %m"); r = sd_netlink_message_append_u32(req, RTA_OIF, link->ifindex); if (r < 0) return log_error_errno(r, "Could not append RTA_OIF attribute: %m"); r = sd_netlink_call_async(link->manager->rtnl, req, callback, link, 0, NULL); if (r < 0) return log_error_errno(r, "Could not send rtnetlink message: %m"); link_ref(link); lifetime = route->lifetime; r = route_add(link, route->family, &route->dst, route->dst_prefixlen, route->tos, route->priority, route->table, &route); if (r < 0) return log_error_errno(r, "Could not add route: %m"); /* TODO: drop expiration handling once it can be pushed into the kernel */ route->lifetime = lifetime; if (route->lifetime != USEC_INFINITY) { r = sd_event_add_time(link->manager->event, &expire, clock_boottime_or_monotonic(), route->lifetime, 0, route_expire_handler, route); if (r < 0) return log_error_errno(r, "Could not arm expiration timer: %m"); } sd_event_source_unref(route->expire); route->expire = expire; expire = NULL; return 0; }