/*---------------------------------------------------------------------------*/ PROCESS_THREAD(router_node_process, ev, data) { PROCESS_BEGIN(); static struct etimer et; /* Turn radio off while initialazing */ NETSTACK_MAC.off(0); /* Initialize the IP64 module so we'll start translating packets */ ip64_init(); /* Wait to get a DHCP address */ etimer_set(&et, CLOCK_SECOND / 5); while(1) { PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et)); leds_toggle(LEDS_DHCP); if(ip64_hostaddr_is_configured()) { const uip_ip4addr_t *hostaddr = ip64_get_hostaddr(); const uip_ip4addr_t *netmask = ip64_get_netmask(); const uip_ip4addr_t *gwaddr = ip64_get_draddr(); printf("IPv4 DHCP address: %d.%d.%d.%d\n", hostaddr->u8[0], hostaddr->u8[1], hostaddr->u8[2], hostaddr->u8[3]); printf("Netmask : %d.%d.%d.%d\n", netmask->u8[0], netmask->u8[1], netmask->u8[2], netmask->u8[3]); printf("Gateway: %d.%d.%d.%d\n", gwaddr->u8[0], gwaddr->u8[1], gwaddr->u8[2], gwaddr->u8[3]); break; } etimer_reset(&et); } leds_off(LEDS_DHCP); /* Turn the radio on and create the network */ NETSTACK_MAC.off(1); /* Set us up as a RPL root node. */ rpl_dag_root_init_dag(); /* ... and do nothing more. */ while(1) { PROCESS_WAIT_EVENT(); } PROCESS_END(); }
void cetic_6lbr_init_finalize(void) { #if CETIC_6LBR_WITH_RPL if(rpl_fast_startup) { cetic_6lbr_start_dodag_root(); } else { cetic_6lbr_start_delayed_dodag_root(1); } #endif #if CETIC_6LBR_WITH_IP64 if((nvm_data.global_flags & CETIC_GLOBAL_IP64) != 0) { LOG6LBR_INFO("Starting IP64\n"); ip64_eth_addr_set((struct ip64_eth_addr *)eth_mac_addr); if((nvm_data.eth_ip64_flags & CETIC_6LBR_IP64_RFC6052_PREFIX) != 0) { uip_ip6addr_t ip64_prefix = {{ 0, 0x64, 0xff, 0x9b, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; ip64_addr_set_prefix(&ip64_prefix, 96); } ip64_init(); if((nvm_data.eth_ip64_flags & CETIC_6LBR_IP64_DHCP) == 0) { memcpy(ð_ip64_addr, nvm_data.eth_ip64_addr, sizeof(nvm_data.eth_ip64_addr)); memcpy(ð_ip64_netmask, nvm_data.eth_ip64_netmask, sizeof(nvm_data.eth_ip64_netmask)); memcpy(ð_ip64_gateway, nvm_data.eth_ip64_gateway, sizeof(nvm_data.eth_ip64_gateway)); ip64_set_ipv4_address(ð_ip64_addr, ð_ip64_netmask); ip64_set_draddr(ð_ip64_gateway); LOG6LBR_4ADDR(INFO, ð_ip64_addr, "IPv4 address : "); } else { ip64_ipv4_dhcp_init(); } } #endif #if RESOLV_CONF_SUPPORTS_MDNS if((nvm_data.global_flags & CETIC_GLOBAL_MDNS) != 0) { LOG6LBR_INFO("Starting MDNS\n"); process_start(&resolv_process, NULL); resolv_set_hostname((char *)nvm_data.dns_host_name); #if RESOLV_CONF_SUPPORTS_DNS_SD if((nvm_data.dns_flags & CETIC_6LBR_DNS_DNS_SD) != 0) { resolv_add_service("_6lbr._tcp", "", nvm_data.webserver_port); } #endif } #endif LOG6LBR_INFO("Starting as " CETIC_6LBR_MODE "\n"); #if CONTIKI_TARGET_NATIVE cetic_6lbr_save_ip(); #endif }
/*---------------------------------------------------------------------------*/ PROCESS_THREAD(border_router_process, ev, data) { PROCESS_BEGIN(); uip_ipaddr_t ipaddr; /* While waiting for the prefix to be sent through the SLIP connection, the future * border router can join an existing DAG as a parent or child, or acquire a default * router that will later take precedence over the SLIP fallback interface. * Prevent that by turning the radio off until we are initialized as a DAG root. */ prefix_set = 0; NETSTACK_MAC.off(0); PROCESS_PAUSE(); SENSORS_ACTIVATE(button_sensor); leds_init(); ip64_init(); PRINTF("RPL-Border router started\n"); #if 0 /* The border router runs with a 100% duty cycle in order to ensure high packet reception rates. Note if the MAC RDC is not turned off now, aggressive power management of the cpu will interfere with establishing the SLIP connection */ NETSTACK_MAC.off(1); #endif /* Now turn the radio on, but disable radio duty cycling. * Since we are the DAG root, reception delays would constrain mesh throughbut. */ NETSTACK_MAC.off(1); /* Derived from link local (MAC) address */ uip_ip6addr(&ipaddr, UIP_DS6_DEFAULT_PREFIX, 0, 0, 0, 0, 0, 0, 0); set_prefix_64(&ipaddr); print_local_addresses(); while(1) { PROCESS_YIELD(); leds_on(LEDS_YELLOW); if (ev == sensors_event && data == &button_sensor) { PRINTF("Initiating global repair\n"); rpl_repair_root(RPL_DEFAULT_INSTANCE); } } PROCESS_END(); }
/*---------------------------------------------------------------------------*/ PROCESS_THREAD(router_node_process, ev, data) { PROCESS_BEGIN(); /* Set us up as a RPL root node. */ simple_rpl_init_dag(); /* Initialize the IP64 module so we'll start translating packets */ ip64_init(); //#if (ENABLE_WEBSERVER == 1) /* Initialize the IP64 webserver */ ip64_webserver_init(); NETSTACK_RDC.off(1); //#endif /* ... and do nothing more. */ while(1) { PROCESS_WAIT_EVENT(); } PROCESS_END(); }
int main(int argc, char **argv) { #if UIP_CONF_IPV6 #if UIP_CONF_IPV6_RPL printf(CONTIKI_VERSION_STRING " started with IPV6, RPL\n"); #else printf(CONTIKI_VERSION_STRING " started with IPV6\n"); #endif #else printf(CONTIKI_VERSION_STRING " started\n"); #endif /* crappy way of remembering and accessing argc/v */ contiki_argc = argc; contiki_argv = argv; /* native under windows is hardcoded to use the first one or two args */ /* for wpcap configuration so this needs to be "removed" from */ /* contiki_args (used by the native-border-router) */ #ifdef __CYGWIN__ contiki_argc--; contiki_argv++; #ifdef UIP_FALLBACK_INTERFACE contiki_argc--; contiki_argv++; #endif #endif process_init(); process_start(&etimer_process, NULL); ctimer_init(); set_rime_addr(); queuebuf_init(); netstack_init(); printf("MAC %s RDC %s NETWORK %s\n", NETSTACK_MAC.name, NETSTACK_RDC.name, NETSTACK_NETWORK.name); #if WITH_UIP6 memcpy(&uip_lladdr.addr, serial_id, sizeof(uip_lladdr.addr)); process_start(&tcpip_process, NULL); #ifdef __CYGWIN__ process_start(&wpcap_process, NULL); #endif printf("Tentative link-local IPv6 address "); { uip_ds6_addr_t *lladdr; int i; lladdr = uip_ds6_get_link_local(-1); for(i = 0; i < 7; ++i) { printf("%02x%02x:", lladdr->ipaddr.u8[i * 2], lladdr->ipaddr.u8[i * 2 + 1]); } /* make it hardcoded... */ lladdr->state = ADDR_AUTOCONF; printf("%02x%02x\n", lladdr->ipaddr.u8[14], lladdr->ipaddr.u8[15]); } #else process_start(&tcpip_process, NULL); #endif serial_line_init(); autostart_start(autostart_processes); /* Make standard output unbuffered. */ setvbuf(stdout, (char *)NULL, _IONBF, 0); select_set_callback(STDIN_FILENO, &stdin_fd); simple_rpl_init(); ip64_init(); while(1) { fd_set fdr; fd_set fdw; int maxfd; int i; int retval; struct timeval tv; retval = process_run(); tv.tv_sec = 0; tv.tv_usec = retval ? 1 : 1000; FD_ZERO(&fdr); FD_ZERO(&fdw); maxfd = 0; for(i = 0; i <= select_max; i++) { if(select_callback[i] != NULL && select_callback[i]->set_fd(&fdr, &fdw)) { maxfd = i; } } retval = select(maxfd + 1, &fdr, &fdw, NULL, &tv); if(retval < 0) { perror("select"); } else if(retval > 0) { /* timeout => retval == 0 */ for(i = 0; i <= maxfd; i++) { if(select_callback[i] != NULL) { select_callback[i]->handle_fd(&fdr, &fdw); } } } etimer_request_poll(); } return 0; }