/*---------------------------------------------------------------------------*/ struct ip64_addrmap_entry * ip64_addrmap_lookup(const uip_ip6addr_t *ip6addr, uint16_t ip6port, const uip_ip4addr_t *ip4addr, uint16_t ip4port, uint8_t protocol) { struct ip64_addrmap_entry *m; printf("lookup ip4port %d ip6port %d\n", uip_htons(ip4port), uip_htons(ip6port)); check_age(); for(m = list_head(entrylist); m != NULL; m = list_item_next(m)) { printf("protocol %d %d, ip4port %d %d, ip6port %d %d, ip4 %d ip6 %d\n", m->protocol, protocol, m->ip4port, ip4port, m->ip6port, ip6port, uip_ip4addr_cmp(&m->ip4addr, ip4addr), uip_ip6addr_cmp(&m->ip6addr, ip6addr)); if(m->protocol == protocol && m->ip4port == ip4port && m->ip6port == ip6port && uip_ip4addr_cmp(&m->ip4addr, ip4addr) && uip_ip6addr_cmp(&m->ip6addr, ip6addr)) { return m; } } return NULL; }
/*---------------------------------------------------------------------------*/ static void echo_reply_handler(uip_ipaddr_t *source, uint8_t ttl, uint8_t *data, uint16_t datalen) { if(uip_ip6addr_cmp(source, uip_ds6_defrt_choose())) { def_rt_rssi = sicslowpan_get_last_rssi(); } }
/* * get border router structur associated to ipaddr * ipaddr == NULL => find first border router */ uip_ds6_border_router_t * uip_ds6_br_lookup(uip_ipaddr_t *ipaddr) { for(locbr = uip_ds6_br_list; locbr < uip_ds6_br_list + UIP_DS6_BR_NB; locbr++) { if(locbr->state != BR_ST_FREE && (ipaddr == NULL || uip_ip6addr_cmp(ipaddr, &locbr->ipaddr))) { return locbr; } } return NULL; }
/*---------------------------------------------------------------------------*/ static struct neighbor_entry *find_entry(struct uip_stack *ustack, struct in6_addr *addr6) { int i; for (i = 0; i < UIP_NEIGHBOR_ENTRIES; ++i) { if (uip_ip6addr_cmp (ustack->neighbor_entries[i].ipaddr.s6_addr, addr6->s6_addr)) { return &ustack->neighbor_entries[i]; } } return NULL; }
void uip_neighbor_add(struct uip_stack *ustack, struct in6_addr *addr6, struct uip_eth_addr *addr) { int i, oldest; u8_t oldest_time; char buf[INET6_ADDRSTRLEN]; inet_ntop(AF_INET6, addr6, buf, sizeof(buf)); pthread_mutex_lock(&ustack->lock); /* Find the first unused entry or the oldest used entry. */ oldest_time = 0; oldest = 0; for (i = 0; i < UIP_NEIGHBOR_ENTRIES; ++i) { if (ustack->neighbor_entries[i].time == MAX_TIME) { oldest = i; break; } if (uip_ip6addr_cmp (ustack->neighbor_entries[i].ipaddr.s6_addr, addr6)) { oldest = i; break; } if (ustack->neighbor_entries[i].time > oldest_time) { oldest = i; oldest_time = ustack->neighbor_entries[i].time; } } /* Use the oldest or first free entry (either pointed to by the "oldest" variable). */ ustack->neighbor_entries[oldest].time = 0; uip_ip6addr_copy(ustack->neighbor_entries[oldest].ipaddr.s6_addr, addr6); memcpy(&ustack->neighbor_entries[oldest].mac_addr, addr, sizeof(struct uip_eth_addr)); LOG_DEBUG("Adding neighbor %s with " "mac address %02x:%02x:%02x:%02x:%02x:%02x at %d", buf, addr->addr[0], addr->addr[1], addr->addr[2], addr->addr[3], addr->addr[4], addr->addr[5], oldest); pthread_mutex_unlock(&ustack->lock); }