void ipv6_net_if_get_best_src_addr(ipv6_addr_t *src, const ipv6_addr_t *dest) { /* try to find best match if dest is not mcast or link local */ int if_id = 0; // TODO: get this somehow uint8_t tmp = 0; uint8_t bmatch = 0; ipv6_net_if_addr_t *addr = NULL; ipv6_net_if_addr_t *tmp_addr = NULL; if (!(ipv6_addr_is_link_local(dest)) && !(ipv6_addr_is_multicast(dest))) { while ((addr = (ipv6_net_if_addr_t *)net_if_iter_addresses(if_id, (net_if_addr_t **)&addr))) { if (addr->ndp_state == NDP_ADDR_STATE_PREFERRED) { if (!ipv6_addr_is_link_local(addr->addr_data) && !ipv6_addr_is_multicast(addr->addr_data) && !ipv6_addr_is_unique_local_unicast(addr->addr_data)) { tmp = ipv6_get_addr_match(dest, addr->addr_data); if (tmp >= bmatch) { bmatch = tmp; tmp_addr = addr; } } } } } else { while ((addr = (ipv6_net_if_addr_t *)net_if_iter_addresses(if_id, (net_if_addr_t **)&addr))) { if (addr->ndp_state == NDP_ADDR_STATE_PREFERRED && ipv6_addr_is_link_local(addr->addr_data) && !ipv6_addr_is_multicast(addr->addr_data)) { tmp_addr = addr; } } } if (tmp_addr == NULL) { memset(src, 0, 16); } else { memcpy(src, tmp_addr->addr_data, 16); } }
int sixlowpan_lowpan_border_init(int if_id) { ipv6_net_if_addr_t *addr = NULL; uint8_t abr_addr_initialized = 0; serial_reader_pid = thread_create( serial_reader_stack, READER_STACK_SIZE, PRIORITY_MAIN - 1, CREATE_STACKTEST, serial_reader_f, "serial_reader"); ip_process_pid = thread_create(ip_process_buf, IP_PROCESS_STACKSIZE, PRIORITY_MAIN - 1, CREATE_STACKTEST, border_process_lowpan, "border_process_lowpan"); if (ip_process_pid < 0) { return 0; } if (!sixlowpan_lowpan_init_interface(if_id)) { return 0; } while (net_if_iter_addresses(if_id, (net_if_addr_t **) &addr)) { if (!ipv6_addr_is_multicast(addr->addr_data) && !ipv6_addr_is_link_local(addr->addr_data) && !ipv6_addr_is_loopback(addr->addr_data) && !ipv6_addr_is_unique_local_unicast(addr->addr_data)) { abr_addr_initialized = 1; abr_addr = addr->addr_data; break; } } if (!abr_addr_initialized) { DEBUG("sixlowpan_lowpan_border_init(): A prefix must be initialized to" "interface %d first", if_id); return 0; } ipv6_init_as_router(); return 1; }