コード例 #1
0
ファイル: 7-handlerTest.c プロジェクト: ryanhs/cweb
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);
}
コード例 #2
0
ファイル: xl2tpd.c プロジェクト: andy-padavan/rt-n56u
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;
}
コード例 #3
0
/* *****************************************************************************
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;
}
コード例 #4
0
ファイル: vpn_client.c プロジェクト: jing-git/rt-n56u
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");
			}
		}
	}
}
コード例 #5
0
ファイル: vpn_server.c プロジェクト: jing-git/rt-n56u
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;
		}
	}
}
コード例 #6
0
ファイル: uip-over-mesh.c プロジェクト: exziled/WeatherSystem
/*---------------------------------------------------------------------------*/
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();
}
コード例 #7
0
ファイル: route-discovery.c プロジェクト: damini1406/contiki
/*---------------------------------------------------------------------------*/
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

}*/
}
コード例 #8
0
ファイル: route_update.c プロジェクト: a5216652166/rcp100
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;
	}
}
コード例 #9
0
ファイル: interface.c プロジェクト: hajuuk/R7000
/* 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");
}
コード例 #10
0
ファイル: dhcp.c プロジェクト: twtomato/twtomato
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;
}
コード例 #11
0
ファイル: tun-bsd.c プロジェクト: 0x00evil/nmap
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);
}
コード例 #12
0
ファイル: dhcp.c プロジェクト: twtomato/twtomato
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;
}
コード例 #13
0
ファイル: parprouted.c プロジェクト: WiseMan787/ralink_sdk
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 */

}	
コード例 #14
0
ファイル: vpn_client.c プロジェクト: jing-git/rt-n56u
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);
		}
	}
}
コード例 #15
0
ファイル: route_update.c プロジェクト: a5216652166/rcp100
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;
		}
	}
}
コード例 #16
0
ファイル: dsl.c プロジェクト: themiron/asuswrt-merlin
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
}
コード例 #17
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;
}
コード例 #18
0
ファイル: route-add.c プロジェクト: openconnect/ocserv
/* 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;
}
コード例 #19
0
ファイル: net.c プロジェクト: andy-padavan/rt-n56u
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);
	}
コード例 #20
0
ファイル: rtroute.c プロジェクト: BackupTheBerlios/rtnet-svn
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;
}
コード例 #21
0
ファイル: sharp_zebra.c プロジェクト: ton31337/frr
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);
	}
}
コード例 #22
0
ファイル: hardcoded.c プロジェクト: aunali1/exopc
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;
}
コード例 #23
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;
}
コード例 #24
0
ファイル: vpnc.c プロジェクト: themiron/asuswrt-merlin
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
コード例 #25
0
ファイル: call.c プロジェクト: heartshare/asuswrt-merlin
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;
    }
}
コード例 #26
0
ファイル: pptp.c プロジェクト: schidler/flyzjhz-rt-n56u
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;
}
コード例 #27
0
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));
            }
        }     
    }

}
コード例 #28
0
ファイル: service.c プロジェクト: martinjaros/nanotalk
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);
}
コード例 #29
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;
}
コード例 #30
0
ファイル: networkd-route.c プロジェクト: alex/systemd
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;
}