/*---------------------------------------------------------------------------*/ void cetic_6lbr_set_prefix(uip_ipaddr_t * prefix, unsigned len, uip_ipaddr_t * ipaddr) { #if CETIC_6LBR_SMARTBRIDGE int new_prefix = !uip_ipaddr_prefixcmp(&wsn_net_prefix, prefix, len); int new_dag_prefix = cetic_dag == NULL || !uip_ipaddr_prefixcmp(&cetic_dag->prefix_info.prefix, prefix, len); if((nvm_data.mode & CETIC_MODE_WAIT_RA_MASK) == 0) { LOG6LBR_DEBUG("Ignoring RA\n"); return; } if(new_prefix) { LOG6LBR_6ADDR(INFO, prefix, "Setting prefix : "); uip_ipaddr_copy(&wsn_ip_addr, ipaddr); uip_ipaddr_copy(&wsn_net_prefix, prefix); wsn_net_prefix_len = len; LOG6LBR_6ADDR(INFO, &wsn_ip_addr, "Tentative global IPv6 address : "); #if CONTIKI_TARGET_NATIVE cetic_6lbr_save_ip(); #endif } if(new_dag_prefix) { if((nvm_data.rpl_config & CETIC_6LBR_MODE_GLOBAL_DODAG) != 0) { cetic_dag = rpl_set_root(nvm_data.rpl_instance_id, &wsn_ip_addr); rpl_set_prefix(cetic_dag, prefix, len); LOG6LBR_6ADDR(INFO, &cetic_dag->dag_id, "Configured as DODAG Root "); } else { rpl_set_prefix(cetic_dag, prefix, len); LOG6LBR_6ADDR(INFO, prefix, "Setting DAG prefix : "); rpl_repair_root(RPL_DEFAULT_INSTANCE); } } #endif }
void cetic_6lbr_set_prefix(uip_ipaddr_t * prefix, unsigned len, uip_ipaddr_t * ipaddr) { #if CETIC_6LBR_SMARTBRIDGE int new_prefix = cetic_dag != NULL && !uip_ipaddr_prefixcmp(&cetic_dag->prefix_info.prefix, prefix, len); if((nvm_data.mode & CETIC_MODE_WAIT_RA_MASK) == 0) { LOG6LBR_DEBUG("Ignoring RA\n"); return; } LOG6LBR_INFO("CETIC_BRIDGE : set_prefix\n"); uip_ipaddr_copy(&wsn_ip_addr, ipaddr); if(cetic_dag != NULL) { rpl_set_prefix(cetic_dag, prefix, len); uip_ipaddr_copy(&wsn_net_prefix, prefix); wsn_net_prefix_len = len; if(new_prefix) { LOG6LBR_6ADDR(INFO, prefix, "Setting DAG prefix : "); rpl_repair_root(RPL_DEFAULT_INSTANCE); } } #if CONTIKI_TARGET_NATIVE cetic_6lbr_save_ip(); #endif #endif }
static void send_to_uip(void) { if(tcpip_inputfunc != NULL) { tcpip_inputfunc(); } else { LOG6LBR_DEBUG("No input function set\n"); } }
/*---------------------------------------------------------------------------*/ void httpd_cgi_add(httpd_cgi_call_t *c) { httpd_cgi_call_t *l; LOG6LBR_DEBUG("Adding page : %s\n", c->name); c->next = NULL; if(calls == NULL) { calls = c; } else { for(l = calls; l->next != NULL; l = l->next); l->next = c; } }
/*---------------------------------------------------------------------------*/ void httpd_group_add(httpd_group_t *group) { httpd_group_t *l; LOG6LBR_DEBUG("Adding group : %s\n", group->title); group->next = NULL; if(groups == NULL) { groups = group; } else { for(l = groups; l->next != NULL; l = l->next); l->next = group; } }
/*---------------------------------------------------------------------------*/ void httpd_cgi_command_add(httpd_cgi_command_t *c) { httpd_cgi_command_t *l; LOG6LBR_DEBUG("Adding command : %s\n", c->name); c->next = NULL; if(commands == NULL) { commands = c; } else { for(l = commands; l->next != NULL; l = l->next); l->next = c; } }
void nvm_data_write(void) { memcpy(nvm_mem, (uint8_t *) & nvm_data, sizeof(nvm_data)); LOG6LBR_DEBUG("Opening nvm file '%s'\n", sixlbr_config_nvm_file); int s = open(sixlbr_config_nvm_file, O_WRONLY | O_TRUNC | O_CREAT, 0644); if(s > 0) { if(write(s, nvm_mem, NVM_SIZE) != NVM_SIZE) { LOG6LBR_ERROR("Failed to write to NVM"); } close(s); } else { LOG6LBR_ERROR("Could not open nvm file\n"); } }
void switch_lookup_learn_addr(const uip_lladdr_t *lladdr, uint8_t ifindex) { #if UIP_SWITCH_LOOKUP if(lladdr != NULL && !linkaddr_cmp((linkaddr_t *)lladdr, &linkaddr_null)) { uip_ds6_nbr_t *nbr; nbr = uip_ds6_nbr_ll_lookup(lladdr); if(nbr) { nbr->ifindex = ifindex; } else { LOG6LBR_LLADDR(PACKET, lladdr, "No neighbor found for "); } } else { LOG6LBR_DEBUG("Can not learn broadcast or null addr\n"); } #endif }
int nvm_data_reset(void) { int force_reset = 0; LOG6LBR_DEBUG("Opening nvm factory file '%s'\n", sixlbr_config_factory_nvm_file); memset(nvm_mem, 0xff, NVM_SIZE); int s = open(sixlbr_config_factory_nvm_file, O_RDONLY); if(s > 0) { if(read(s, nvm_mem, NVM_SIZE) < 0) { LOG6LBR_INFO("Could not read factory NVM"); force_reset = 1; } close(s); } else { LOG6LBR_INFO("Could not open factory nvm file\n"); force_reset = 1; } memcpy((uint8_t *) & nvm_data, nvm_mem, sizeof(nvm_data)); nvm_data_write(); return force_reset; }
void nvm_data_read(void) { int valid = 1; LOG6LBR_DEBUG("Opening nvm file '%s'\n", sixlbr_config_nvm_file); memset(nvm_mem, 0xff, NVM_SIZE); int s = open(sixlbr_config_nvm_file, O_RDONLY); if(s > 0) { if(read(s, nvm_mem, NVM_SIZE) < 0) { LOG6LBR_ERROR("Failed to read NVM"); valid = 0; } close(s); } else { LOG6LBR_ERROR("Could not open nvm file\n"); valid = 0; } if(valid) { memcpy((uint8_t *) & nvm_data, nvm_mem, sizeof(nvm_data)); } else { nvm_data_reset(); } }
static int update_config(const char *name, uint8_t *reboot_needed) { const char *ptr = name; char *next; uint8_t do_update = 1; uip_ipaddr_t loc_fipaddr; #if CETIC_6LBR_IP64 uip_ip4addr_t loc_fip4addr; #endif *reboot_needed = 0; while(*ptr) { const char *param = ptr; next = index(ptr, '='); if(!next) break; *next = 0; ptr = next + 1; const char *value = ptr; next = index(ptr, '&'); if(next) { *next = 0; ptr = next + 1; } else { ptr += strlen(ptr); } LOG6LBR_DEBUG("Got param: '%s' = '%s'\n", param, value); if (0) { } UPDATE_FLAG("smart_multi", mode, CETIC_MODE_SMART_MULTI_BR, 1) UPDATE_FLAG("wait_ra", mode, CETIC_MODE_WAIT_RA_MASK, 1) UPDATE_INT("channel", channel, 1) UPDATE_HEX("panid", pan_id, 1) #if CETIC_6LBR_MAC_WRAPPER UPDATE_INT("mac", mac_layer, 1) #endif UPDATE_INT("llsec", security_layer, 1) UPDATE_INT("llsec_level", security_level, 1) UPDATE_KEY("psk", noncoresec_key, 16, 1) UPDATE_FLAG( "sec_dis_ar", noncoresec_flags, CETIC_6LBR_NONCORESEC_DISABLE_ANTIREPLAY, 1) UPDATE_FLAG( "sec_ar_wa", noncoresec_flags, CETIC_6LBR_NONCORESEC_ANTIREPLAY_WORKAROUND, 1) UPDATE_IPADDR("wsn_pre", wsn_net_prefix, 1) UPDATE_INT("wsn_pre_len", wsn_net_prefix_len, 1) UPDATE_IPADDR("wsn_context_0", wsn_6lowpan_context_0, 1) UPDATE_FLAG("wsn_auto", mode, CETIC_MODE_WSN_AUTOCONF, 1) UPDATE_IPADDR("wsn_addr", wsn_ip_addr, 1) UPDATE_IPADDR("dns", dns_server, 1) UPDATE_IPADDR("eth_pre", eth_net_prefix, 1) UPDATE_INT("eth_pre_len", eth_net_prefix_len, 1) UPDATE_FLAG("eth_auto", mode, CETIC_MODE_ETH_AUTOCONF, 1) UPDATE_IPADDR("eth_addr", eth_ip_addr, 1) UPDATE_IPADDR("eth_dft", eth_dft_router, 1) UPDATE_FLAG("ra_daemon", mode, CETIC_MODE_ROUTER_RA_DAEMON, 1) UPDATE_FLAG("rewrite", mode, CETIC_MODE_REWRITE_ADDR_MASK, 1) #if CETIC_6LBR_IP64 UPDATE_FLAG("ip64", global_flags, CETIC_GLOBAL_IP64, 1) UPDATE_FLAG("ip64_dhcp", eth_ip64_flags, CETIC_6LBR_IP64_DHCP, 1) UPDATE_IP4ADDR("ip64_addr", eth_ip64_addr, 1) UPDATE_IP4ADDR("ip64_netmask", eth_ip64_netmask, 1) UPDATE_IP4ADDR("ip64_gateway", eth_ip64_gateway, 1) UPDATE_FLAG("ip64_port_map", eth_ip64_flags, CETIC_6LBR_IP64_SPECIAL_PORTS, 1) UPDATE_FLAG("ip64_6052", eth_ip64_flags, CETIC_6LBR_IP64_RFC6052_PREFIX, 1) #endif #if RESOLV_CONF_SUPPORTS_MDNS UPDATE_FLAG("mdns", global_flags, CETIC_GLOBAL_MDNS, 1) UPDATE_STRING("hostname", dns_host_name, NVM_DATA_DNS_HOST_NAME_SIZE, 1) #if RESOLV_CONF_SUPPORTS_DNS_SD UPDATE_FLAG("dns_sd", dns_flags, CETIC_6LBR_DNS_DNS_SD, 1) #endif #endif #if CETIC_NODE_CONFIG UPDATE_FLAG("nc_filter", global_flags, CETIC_GLOBAL_FILTER_NODES, 1) #endif UPDATE_INT( "ra_lifetime", ra_router_lifetime, 1) UPDATE_INT( "ra_max_interval", ra_max_interval, 1) UPDATE_INT( "ra_min_interval", ra_min_interval, 1) UPDATE_INT( "ra_min_delay", ra_min_delay, 1) UPDATE_FLAG( "ra_pio", ra_prefix_flags, CETIC_6LBR_MODE_SEND_PIO, 1) UPDATE_FLAG( "ra_prefix_o", ra_prefix_flags, UIP_ND6_RA_FLAG_ONLINK, 1) UPDATE_FLAG( "ra_prefix_a", ra_prefix_flags, UIP_ND6_RA_FLAG_AUTONOMOUS, 1) UPDATE_INT( "ra_prefix_vtime", ra_prefix_vtime, 1) UPDATE_INT( "ra_prefix_ptime", ra_prefix_ptime, 1) UPDATE_FLAG( "ra_rio_en", ra_rio_flags, CETIC_6LBR_MODE_SEND_RIO, 1) UPDATE_INT( "ra_rio_lifetime", ra_rio_lifetime, 1) UPDATE_INT( "rpl_instance_id", rpl_instance_id, 1) UPDATE_FLAG("dodag_manual", rpl_config, CETIC_6LBR_MODE_MANUAL_DODAG, 1) UPDATE_FLAG("dodag_global", rpl_config, CETIC_6LBR_MODE_GLOBAL_DODAG, 1) UPDATE_IPADDR("dodag_id", rpl_dodag_id, 1) UPDATE_INT( "rpl_preference", rpl_preference, 1) UPDATE_INT( "rpl_dio_intdoubl", rpl_dio_intdoubl, 1) UPDATE_INT( "rpl_dio_intmin", rpl_dio_intmin, 1) UPDATE_INT( "rpl_dio_redundancy", rpl_dio_redundancy, 1) UPDATE_INT( "rpl_default_lifetime", rpl_default_lifetime, 1) UPDATE_INT( "rpl_min_hoprankinc", rpl_min_hoprankinc, 1) UPDATE_INT( "rpl_max_rankinc", rpl_max_rankinc, 1) UPDATE_INT( "rpl_lifetime_unit", rpl_lifetime_unit, 1) #if !LOG6LBR_STATIC UPDATE_INT( "log_level", log_level, 0) UPDATE_HEX( "log_services", log_services, 0) #endif else { LOG6LBR_WARN("Unknown parameter '%s'\n", param); do_update=0; } } if(do_update) { store_nvm_config(); #if !LOG6LBR_STATIC if(nvm_data.log_level != 0xFF) { Log6lbr_level = nvm_data.log_level; Log6lbr_services = nvm_data.log_services; } #endif } return do_update; }