/*---------------------------------------------------------------------------*/ uip_ds6_route_t * uip_ds6_route_add(uip_ipaddr_t * ipaddr, u8_t length, uip_ipaddr_t * nexthop, u8_t metric) { if(uip_ds6_list_loop ((uip_ds6_element_t *) uip_ds6_routing_table, UIP_DS6_ROUTE_NB, sizeof(uip_ds6_route_t), ipaddr, length, (uip_ds6_element_t **) & locroute) == FREESPACE) { locroute->isused = 1; uip_ipaddr_copy(&(locroute->ipaddr), ipaddr); locroute->length = length; uip_ipaddr_copy(&(locroute->nexthop), nexthop); locroute->metric = metric; PRINTF("DS6: adding route:"); PRINT6ADDR(ipaddr); PRINTF(" via "); PRINT6ADDR(nexthop); PRINTF("\n"); } return locroute; }
/*---------------------------------------------------------------------------*/ uip_ds6_defrt_t * uip_ds6_defrt_add(uip_ipaddr_t *ipaddr, unsigned long interval) { if(uip_ds6_list_loop ((uip_ds6_element_t *)uip_ds6_defrt_list, UIP_DS6_DEFRT_NB, sizeof(uip_ds6_defrt_t), ipaddr, 128, (uip_ds6_element_t **)&locdefrt) == FREESPACE) { locdefrt->isused = 1; uip_ipaddr_copy(&locdefrt->ipaddr, ipaddr); if(interval != 0) { stimer_set(&locdefrt->lifetime, interval); locdefrt->isinfinite = 0; } else { locdefrt->isinfinite = 1; } PRINTF("Adding defrouter with ip addr "); PRINT6ADDR(&locdefrt->ipaddr); PRINTF("\n"); ANNOTATE("#L %u 1\n", ipaddr->u8[sizeof(uip_ipaddr_t) - 1]); return locdefrt; } return NULL; }
/*---------------------------------------------------------------------------*/ uip_ds6_addr_t * uip_ds6_addr_add(uip_ipaddr_t * ipaddr, unsigned long vlifetime, u8_t type) { if(uip_ds6_list_loop ((uip_ds6_element_t *) uip_ds6_if.addr_list, UIP_DS6_ADDR_NB, sizeof(uip_ds6_addr_t), ipaddr, 128, (uip_ds6_element_t **) & locaddr) == FREESPACE) { locaddr->isused = 1; uip_ipaddr_copy(&locaddr->ipaddr, ipaddr); if (uip_is_addr_link_local(ipaddr)) { locaddr->state = ADDR_PREFERRED; } else { locaddr->state = ADDR_TENTATIVE; } locaddr->type = type; if(vlifetime == 0) { locaddr->isinfinite = 1; } else { locaddr->isinfinite = 0; stimer_set(&locaddr->vlifetime, vlifetime); } #if UIP_CONF_ROUTER /* * If 6LoWPAN-ND optimizations are implemented, hosts do not join the * Solicited-node multicast address. */ uip_create_solicited_node(ipaddr, &loc_fipaddr); uip_ds6_maddr_add(&loc_fipaddr); #endif /* UIP_CONF_ROUTER */ return locaddr; } return NULL; }
/*---------------------------------------------------------------------------*/ uip_ds6_prefix_t * uip_ds6_prefix_add(uip_ipaddr_t *ipaddr, uint8_t ipaddrlen, uint8_t advertise, uint8_t flags, unsigned long vtime, unsigned long ptime) { if(uip_ds6_list_loop ((uip_ds6_element_t *)uip_ds6_prefix_list, UIP_DS6_PREFIX_NB, sizeof(uip_ds6_prefix_t), ipaddr, ipaddrlen, (uip_ds6_element_t **)&locprefix) == FREESPACE) { locprefix->isused = 1; uip_ipaddr_copy(&locprefix->ipaddr, ipaddr); locprefix->length = ipaddrlen; locprefix->advertise = advertise; locprefix->l_a_reserved = flags; locprefix->vlifetime = vtime; locprefix->plifetime = ptime; PRINTF("Adding prefix "); PRINT6ADDR(&locprefix->ipaddr); PRINTF("length %u, flags %x, Valid lifetime %lx, Preffered lifetime %lx\n", ipaddrlen, flags, vtime, ptime); return locprefix; } else { PRINTF("No more space in Prefix list\n"); } return NULL; }
/*---------------------------------------------------------------------------*/ uip_ds6_addr_t * uip_ds6_addr_add(uip_ipaddr_t *ipaddr, unsigned long vlifetime, uint8_t type) { loc_loop_state = uip_ds6_list_loop ((uip_ds6_element_t *)uip_ds6_if.addr_list, UIP_DS6_ADDR_NB, sizeof(uip_ds6_addr_t), ipaddr, 128, (uip_ds6_element_t **)&locaddr); if(loc_loop_state == NOSPACE) { uip_ds6_addr_clean(); } if(loc_loop_state == FREESPACE) { locaddr->isused = 1; uip_ipaddr_copy(&locaddr->ipaddr, ipaddr); locaddr->type = type; if(vlifetime == 0) { locaddr->isinfinite = 1; } else { locaddr->isinfinite = 0; stimestamp_set(&(locaddr->vlifetime), vlifetime); } locaddr->state = ADDR_PREFERRED; uip_create_solicited_node(ipaddr, &loc_fipaddr); uip_ds6_maddr_add(&loc_fipaddr); return locaddr; } return NULL; }
/*---------------------------------------------------------------------------*/ uip_ds6_addr_t * uip_ds6_addr_add(uip_ipaddr_t *ipaddr, unsigned long vlifetime, uint8_t type) { if(uip_ds6_list_loop ((uip_ds6_element_t *)uip_ds6_if.addr_list, UIP_DS6_ADDR_NB, sizeof(uip_ds6_addr_t), ipaddr, 128, (uip_ds6_element_t **)&locaddr) == FREESPACE) { locaddr->isused = 1; uip_ipaddr_copy(&locaddr->ipaddr, ipaddr); locaddr->type = type; if(vlifetime == 0) { locaddr->isinfinite = 1; } else { locaddr->isinfinite = 0; stimer_set(&(locaddr->vlifetime), vlifetime); } #if UIP_ND6_DEF_MAXDADNS > 0 locaddr->state = ADDR_TENTATIVE; timer_set(&locaddr->dadtimer, random_rand() % (UIP_ND6_MAX_RTR_SOLICITATION_DELAY * CLOCK_SECOND)); locaddr->dadnscount = 0; #else /* UIP_ND6_DEF_MAXDADNS > 0 */ locaddr->state = ADDR_PREFERRED; #endif /* UIP_ND6_DEF_MAXDADNS > 0 */ uip_create_solicited_node(ipaddr, &loc_fipaddr); uip_ds6_maddr_add(&loc_fipaddr); return locaddr; } return NULL; }
/*---------------------------------------------------------------------------*/ uip_ds6_route_t * uip_ds6_route_add(uip_ipaddr_t *ipaddr, uint8_t length, uip_ipaddr_t *nexthop, uint8_t metric) { if(uip_ds6_list_loop ((uip_ds6_element_t *)uip_ds6_routing_table, UIP_DS6_ROUTE_NB, sizeof(uip_ds6_route_t), ipaddr, length, (uip_ds6_element_t **)&locroute) == FREESPACE) { locroute->isused = 1; uip_ipaddr_copy(&(locroute->ipaddr), ipaddr); locroute->length = length; uip_ipaddr_copy(&(locroute->nexthop), nexthop); locroute->metric = metric; #ifdef UIP_DS6_ROUTE_STATE_TYPE memset(&locroute->state, 0, sizeof(UIP_DS6_ROUTE_STATE_TYPE)); #endif PRINTF("DS6: adding route: "); PRINT6ADDR(ipaddr); PRINTF(" via "); PRINT6ADDR(nexthop); PRINTF("\n"); ANNOTATE("#L %u 1;blue\n", nexthop->u8[sizeof(uip_ipaddr_t) - 1]); } return locroute; }
/*---------------------------------------------------------------------------*/ uip_ds6_defrt_t * uip_ds6_defrt_lookup(uip_ipaddr_t *ipaddr) { if(uip_ds6_list_loop((uip_ds6_element_t *)uip_ds6_defrt_list, UIP_DS6_DEFRT_NB, sizeof(uip_ds6_defrt_t), ipaddr, 128, (uip_ds6_element_t **)&locdefrt) == FOUND) { return locdefrt; } return NULL; }
/*---------------------------------------------------------------------------*/ uip_ds6_aaddr_t * uip_ds6_aaddr_lookup(uip_ipaddr_t *ipaddr) { if(uip_ds6_list_loop((uip_ds6_element_t *)uip_ds6_if.aaddr_list, UIP_DS6_AADDR_NB, sizeof(uip_ds6_aaddr_t), ipaddr, 128, (uip_ds6_element_t **)&locaaddr) == FOUND) { return locaaddr; } return NULL; }
/*---------------------------------------------------------------------------*/ uip_ds6_maddr_t * uip_ds6_maddr_lookup(const uip_ipaddr_t *ipaddr) { if(uip_ds6_list_loop ((uip_ds6_element_t *)uip_ds6_if.maddr_list, UIP_DS6_MADDR_NB, sizeof(uip_ds6_maddr_t), (void*)ipaddr, 128, (uip_ds6_element_t **)&locmaddr) == FOUND) { return locmaddr; } return NULL; }
uip_ds6_route_info_t * uip_ds6_route_info_lookup(uip_ipaddr_t * ipaddr, uint8_t ipaddrlen) { if(uip_ds6_list_loop((uip_ds6_element_t *) uip_ds6_route_info_list, UIP_DS6_ROUTE_INFO_NB, sizeof(uip_ds6_route_info_t), ipaddr, ipaddrlen, (uip_ds6_element_t **) & locrtinfo) == FOUND) { return locrtinfo; } return NULL; }
/*---------------------------------------------------------------------------*/ uip_ds6_prefix_t * uip_ds6_prefix_lookup(uip_ipaddr_t *ipaddr, uint8_t ipaddrlen) { if(uip_ds6_list_loop((uip_ds6_element_t *)uip_ds6_prefix_list, UIP_DS6_PREFIX_NB, sizeof(uip_ds6_prefix_t), ipaddr, ipaddrlen, (uip_ds6_element_t **)&locprefix) == FOUND) { return locprefix; } return NULL; }
/*---------------------------------------------------------------------------*/ uip_ds6_dup_addr_t * uip_ds6_dup_addr_lookup(uip_ipaddr_t *ipaddr) { if(uip_ds6_list_loop ((uip_ds6_element_t *)uip_ds6_dup_addr_list, UIP_DS6_DUPADDR_NB, sizeof(uip_ds6_dup_addr_t), ipaddr, 128, (uip_ds6_element_t **)&locdad) == FOUND) { return locdad; } return NULL; }
/*---------------------------------------------------------------------------*/ uip_ds6_nbr_t * uip_ds6_nbr_lookup(uip_ipaddr_t *ipaddr) { if(uip_ds6_list_loop ((uip_ds6_element_t *) uip_ds6_nbr_cache, UIP_DS6_NBR_NB, sizeof(uip_ds6_nbr_t), ipaddr, 128, (uip_ds6_element_t **) & locnbr) == FOUND) { return locnbr; } return NULL; }
node_info_t * node_info_lookup(uip_ipaddr_t * ipaddr) { node_info_t *node; if(uip_ds6_list_loop((uip_ds6_element_t *) node_info_table, UIP_DS6_ROUTE_NB, sizeof(node_info_t), ipaddr, 128, (uip_ds6_element_t **) & node) == FOUND) { return node; } return NULL; }
/*---------------------------------------------------------------------------*/ pgw_nbr_t* pgw_nbr_add(uip_ipaddr_t * ipaddr, uip_lladdr_t * lladdr, u8_t isrouter, u8_t state) { int r; r = uip_ds6_list_loop((uip_ds6_element_t *)pgw_6ln_cache, UIP_DS6_NBR_NB, sizeof(pgw_nbr_t), ipaddr, 128, (uip_ds6_element_t **)&locnbr); if(r == FREESPACE) { locnbr->isused = 1; uip_ipaddr_copy(&(locnbr->ipaddr), ipaddr); if(lladdr != NULL) { memcpy(&(locnbr->lladdr), lladdr, UIP_LLADDR_LEN); } else { memset(&(locnbr->lladdr), 0, UIP_LLADDR_LEN); } locnbr->isrouter = isrouter; locnbr->state = state; if(locnbr->state == PGW_GARBAGE_COLLECTIBLE) { stimer_set(&(locnbr->reachable), GARBAGE_COLLECTIBLE_NCE_LIFETIME); } else if (locnbr->state == PGW_TENTATIVE){ stimer_set(&(locnbr->reachable), TENTATIVE_NCE_LIFETIME); } locnbr->aro_pending = 0; locnbr->ra_pending = 0; locnbr->last_lookup = clock_time(); return locnbr; } else if(r == NOSPACE) { /* We did not find any empty slot on the neighbor list, so we need to remove one old entry to make room. */ pgw_nbr_t *n, *oldest; clock_time_t oldest_time; oldest = NULL; oldest_time = clock_time(); for(n = pgw_6ln_cache; n < &pgw_6ln_cache[UIP_DS6_NBR_NB]; n++) { if(n->isused) { if((n->last_lookup < oldest_time) && (n->state == PGW_GARBAGE_COLLECTIBLE)) { /* We do not want to remove any registered or tentative entry */ oldest = n; oldest_time = n->last_lookup; } } } if(oldest != NULL) { pgw_nbr_rm(oldest); return pgw_nbr_add(ipaddr, lladdr, isrouter, state); } } return NULL; }
/*---------------------------------------------------------------------------*/ uip_ds6_maddr_t * uip_ds6_maddr_add(const uip_ipaddr_t *ipaddr) { if(uip_ds6_list_loop ((uip_ds6_element_t *)uip_ds6_if.maddr_list, UIP_DS6_MADDR_NB, sizeof(uip_ds6_maddr_t), (void*)ipaddr, 128, (uip_ds6_element_t **)&locmaddr) == FREESPACE) { locmaddr->isused = 1; uip_ipaddr_copy(&locmaddr->ipaddr, ipaddr); return locmaddr; } return NULL; }
/*---------------------------------------------------------------------------*/ uip_ds6_aaddr_t * uip_ds6_aaddr_add(uip_ipaddr_t *ipaddr) { if(uip_ds6_list_loop ((uip_ds6_element_t *)uip_ds6_if.aaddr_list, UIP_DS6_AADDR_NB, sizeof(uip_ds6_aaddr_t), ipaddr, 128, (uip_ds6_element_t **)&locaaddr) == FREESPACE) { locaaddr->isused = 1; uip_ipaddr_copy(&locaaddr->ipaddr, ipaddr); return locaaddr; } return NULL; }
/*---------------------------------------------------------------------------*/ uip_ds6_maddr_t * uip_ds6_maddr_add(uip_ipaddr_t *ipaddr) { if(uip_ds6_list_loop ((uip_ds6_element_t *)uip_ds6_if.maddr_list, UIP_DS6_MADDR_NB, sizeof(uip_ds6_maddr_t), ipaddr, 128, (uip_ds6_element_t **)&locmaddr) == FREESPACE) { locmaddr->isused = 1; locmaddr->isreported = 0; uip_ipaddr_copy(&locmaddr->ipaddr, ipaddr); mld_report_now(); return locmaddr; } return NULL; }
/*---------------------------------------------------------------------------*/ uip_ds6_addr_t * uip_ds6_addr_lookup(uip_ipaddr_t *ipaddr) { if(uip_ds6_list_loop ((uip_ds6_element_t *)uip_ds6_if.addr_list, UIP_DS6_ADDR_NB, sizeof(uip_ds6_addr_t), ipaddr, 128, (uip_ds6_element_t **)&locaddr) == FOUND) { if((!locaddr->isinfinite) && (stimestamp_expired(&locaddr->vlifetime))) { uip_ds6_addr_rm(locaddr); return NULL; } return locaddr; } return NULL; }
/*---------------------------------------------------------------------------*/ uip_ds6_maddr_t * uip_ds6_maddr_lookup(uip_ipaddr_t *ipaddr) { if(uip_ds6_list_loop ((uip_ds6_element_t *)uip_ds6_if.maddr_list, UIP_DS6_MADDR_NB, sizeof(uip_ds6_maddr_t), ipaddr, 128, (uip_ds6_element_t **)&locmaddr) == FOUND) { if (uip_is_addr_solicited_node(&locmaddr->ipaddr)) { return uip_ds6_maddr_solicited_node_verify(locmaddr); } else { return locmaddr; } } return NULL; }
/*---------------------------------------------------------------------------*/ uip_ds6_route_t * uip_ds6_route_add(uip_ipaddr_t *ipaddr, uint8_t length, uip_ipaddr_t *nexthop, uint8_t metric) { loc_loop_state = uip_ds6_list_loop ((uip_ds6_element_t *)uip_ds6_routing_table, UIP_DS6_ROUTE_NB, sizeof(uip_ds6_route_t), ipaddr, length, (uip_ds6_element_t **)&locroute); #ifdef UIP_DS6_ROUTE_STATE_CLEAN if (loc_loop_state == NOSPACE) { for(locroute = uip_ds6_routing_table; locroute < uip_ds6_routing_table + UIP_DS6_ROUTE_NB; ++locroute) { if(locroute->isused && (UIP_DS6_ROUTE_STATE_CLEAN(&locroute->state))) { uip_ds6_route_rm(locroute); loc_loop_state = FREESPACE; break; } } } if (loc_loop_state == NOSPACE) { locroute = NULL; } #endif /* UIP_DS6_ROUTE_STATE_TYPE */ if (loc_loop_state == FREESPACE) { locroute->isused = 1; uip_ipaddr_copy(&(locroute->ipaddr), ipaddr); locroute->length = length; uip_ipaddr_copy(&(locroute->nexthop), nexthop); locroute->metric = metric; #ifdef UIP_DS6_ROUTE_STATE_TYPE memset (&(locroute->state),0,sizeof(UIP_DS6_ROUTE_STATE_TYPE)); #endif PRINTF("DS6: adding route: "); PRINT6ADDR(ipaddr); PRINTF(" via "); PRINT6ADDR(nexthop); PRINTF("\n"); ANNOTATE("#L %u 1;blue\n", nexthop->u8[sizeof(uip_ipaddr_t) - 1]); } return locroute; }
/*---------------------------------------------------------------------------*/ uip_ds6_maddr_t * uip_ds6_maddr_add(uip_ipaddr_t *ipaddr) { if(uip_ds6_list_loop ((uip_ds6_element_t *)uip_ds6_if.maddr_list, UIP_DS6_MADDR_NB, sizeof(uip_ds6_maddr_t), ipaddr, 128, (uip_ds6_element_t **)&locmaddr) == FREESPACE) { locmaddr->isused = 1; uip_ipaddr_copy(&locmaddr->ipaddr, ipaddr); #if UIP_CONF_MLD uip_icmp6_mldv1_schedule_report(locmaddr); #endif return locmaddr; } return NULL; }
/*---------------------------------------------------------------------------*/ uip_ds6_dup_addr_t * uip_ds6_dup_addr_add(uip_ipaddr_t *ipaddr, uint16_t lifetime, uip_lladdr_t *eui64) { if(uip_ds6_list_loop ((uip_ds6_element_t *)uip_ds6_dup_addr_list, UIP_DS6_DUPADDR_NB, sizeof(uip_ds6_dup_addr_t), ipaddr, 128, (uip_ds6_element_t **)&locdad) == FREESPACE) { locdad->isused = 1; uip_ipaddr_copy(&locdad->ipaddr, ipaddr); if(lifetime != 0) { stimer_set(&locdad->lifetime, lifetime * 60); } memcpy(&locdad->eui64, eui64, UIP_LLADDR_LEN); return locdad; } return NULL; }
/** * Remove a multicast address from the list. */ ule6lo_status_t ule6loGI_removeMulticastAddr(ule6lo_ip6addr_t* ipaddress) { ule6lo_status_t status = STATUS_NO_DEVICE; #if UIP_CONF_MLD uip_ds6_maddr_t *locmaddr; if(uip_ds6_list_loop ((uip_ds6_element_t *)uip_ds6_if.maddr_list, UIP_DS6_MADDR_NB, sizeof(uip_ds6_maddr_t), (void*)ipaddress, 128, (uip_ds6_element_t **)&locmaddr) == FOUND) { locmaddr->isused = 0; locmaddr->report_count = 0; stimer_set(&(locmaddr->report_timeout), 0); uip_ds6_maddr_rm(locmaddr); memset(&locmaddr->ipaddr, 0x00, sizeof(uip_ipaddr_t)); status = STATUS_SUCCESS; } #endif return status; }
node_info_t * node_info_add(uip_ipaddr_t * ipaddr) { node_info_t *node = NULL; if(uip_ds6_list_loop ((uip_ds6_element_t *) node_info_table, UIP_DS6_ROUTE_NB, sizeof(node_info_t), ipaddr, 128, (uip_ds6_element_t **) & node) == FREESPACE) { memset(node, 0, sizeof(node_info_t)); node->isused = 1; uip_ipaddr_copy(&(node->ipaddr), ipaddr); node->stats_start = clock_time(); LOG6LBR_6ADDR(DEBUG, ipaddr, "New node created "); } else { LOG6LBR_6ADDR(ERROR, ipaddr, "Not enough memory to create node "); } return node; }
/*---------------------------------------------------------------------------*/ uip_ds6_prefix_t * uip_ds6_prefix_add(uip_ipaddr_t *ipaddr, uint8_t ipaddrlen, uint8_t advertise, uint8_t flags, unsigned long vtime, unsigned long ptime) { if(uip_ds6_list_loop ((uip_ds6_element_t *)uip_ds6_prefix_list, UIP_DS6_PREFIX_NB, sizeof(uip_ds6_prefix_t), ipaddr, ipaddrlen, (uip_ds6_element_t **)&locprefix) == FREESPACE) { locprefix->isused = 1; uip_ipaddr_copy(&locprefix->ipaddr, ipaddr); locprefix->length = ipaddrlen; locprefix->advertise = advertise; locprefix->l_a_reserved = flags; locprefix->vlifetime_val = vtime; locprefix->plifetime = ptime; #if UIP_CONF_6LR if(vtime != 0) { stimer_set(&(locprefix->vlifetime), vtime); locprefix->isinfinite = 0; } else { locprefix->isinfinite = 1; } #endif /* UIP_CONF_6LR */ #if UIP_CONF_6LBR /* Increase version in border router */ locbr = uip_ds6_br_lookup(NULL); if(locbr != NULL) { locbr->state = BR_ST_NEW_VERSION; } #endif /* UIP_CONF_6LBR */ PRINTF("Adding prefix "); PRINT6ADDR(&locprefix->ipaddr); PRINTF("length %u, flags %x, Valid lifetime %lx, Preffered lifetime %lx\n", ipaddrlen, flags, vtime, ptime); return locprefix; } else { PRINTF("No more space in Prefix list\n"); } return NULL; }
uip_ds6_route_info_t * uip_ds6_route_info_add(uip_ipaddr_t * ipaddr, uint8_t ipaddrlen, uint8_t flags, unsigned long rlifetime) { if(uip_ds6_list_loop ((uip_ds6_element_t *) uip_ds6_route_info_list, UIP_DS6_ROUTE_INFO_NB, sizeof(uip_ds6_route_info_t), ipaddr, ipaddrlen, (uip_ds6_element_t **) & locrtinfo) == FREESPACE) { locrtinfo->isused = 1; uip_ipaddr_copy(&locrtinfo->ipaddr, ipaddr); locrtinfo->length = ipaddrlen; locrtinfo->flags = flags; locrtinfo->lifetime = rlifetime; PRINTF("Adding route information: length=%u, flags=%x, route lifetime=%lu, dest=", ipaddrlen, flags, rlifetime); return locrtinfo; } else { PRINTF("No more space in route information list\n"); } return NULL; }
/*---------------------------------------------------------------------------*/ uip_ds6_prefix_t * uip_ds6_prefix_add(uip_ipaddr_t *ipaddr, uint8_t ipaddrlen, uint8_t advertise, uint8_t flags, unsigned long vtime, unsigned long ptime) { if(uip_ds6_list_loop ((uip_ds6_element_t *)uip_ds6_prefix_list, UIP_DS6_PREFIX_NB, sizeof(uip_ds6_prefix_t), ipaddr, ipaddrlen, (uip_ds6_element_t **)&locprefix) == FREESPACE) { locprefix->isused = 1; uip_ipaddr_copy(&locprefix->ipaddr, ipaddr); locprefix->length = ipaddrlen; locprefix->advertise = advertise; locprefix->l_a_reserved = flags; locprefix->vlifetime = vtime; locprefix->plifetime = ptime; PRINTF("Adding prefix "); PRINT6ADDR(&locprefix->ipaddr); PRINTF("length %u, flags %x, Valid lifetime %lx, Preffered lifetime %lx\n", ipaddrlen, flags, vtime, ptime); return locprefix; } else { PRINTF("No more space in Prefix list\n"); } return NULL; } #else /* UIP_CONF_ROUTER */ uip_ds6_prefix_t * uip_ds6_prefix_add(uip_ipaddr_t *ipaddr, uint8_t ipaddrlen, unsigned long interval) { if(uip_ds6_list_loop ((uip_ds6_element_t *)uip_ds6_prefix_list, UIP_DS6_PREFIX_NB, sizeof(uip_ds6_prefix_t), ipaddr, ipaddrlen, (uip_ds6_element_t **)&locprefix) == FREESPACE) { locprefix->isused = 1; uip_ipaddr_copy(&locprefix->ipaddr, ipaddr); locprefix->length = ipaddrlen; if(interval != 0) { stimer_set(&(locprefix->vlifetime), interval); locprefix->isinfinite = 0; } else { locprefix->isinfinite = 1; } PRINTF("Adding prefix "); PRINT6ADDR(&locprefix->ipaddr); PRINTF("length %u, vlifetime%lu\n", ipaddrlen, interval); } return NULL; }
/*---------------------------------------------------------------------------*/ uip_ds6_nbr_t * uip_ds6_nbr_add(uip_ipaddr_t *ipaddr, uip_lladdr_t *lladdr, uint8_t isrouter, uint8_t state) { int r; r = uip_ds6_list_loop ((uip_ds6_element_t *)uip_ds6_nbr_cache, UIP_DS6_NBR_NB, sizeof(uip_ds6_nbr_t), ipaddr, 128, (uip_ds6_element_t **)&locnbr); if(r == FREESPACE) { locnbr->isused = 1; uip_ipaddr_copy(&locnbr->ipaddr, ipaddr); if(lladdr != NULL) { memcpy(&locnbr->lladdr, lladdr, UIP_LLADDR_LEN); } else { memset(&locnbr->lladdr, 0, UIP_LLADDR_LEN); } locnbr->isrouter = isrouter; locnbr->state = state; #if UIP_CONF_IPV6_QUEUE_PKT uip_packetqueue_new(&locnbr->packethandle); #endif /* UIP_CONF_IPV6_QUEUE_PKT */ /* timers are set separately, for now we put them in expired state */ stimer_set(&locnbr->reachable, 0); stimer_set(&locnbr->sendns, 0); locnbr->nscount = 0; PRINTF("Adding neighbor with ip addr "); PRINT6ADDR(ipaddr); PRINTF("link addr "); PRINTLLADDR((&(locnbr->lladdr))); PRINTF("state %u\n", state); NEIGHBOR_STATE_CHANGED(locnbr); locnbr->last_lookup = clock_time(); return locnbr; } else if(r == NOSPACE) { /* We did not find any empty slot on the neighbor list, so we need to remove one old entry to make room. */ uip_ds6_nbr_t *n, *oldest; clock_time_t oldest_time; oldest = NULL; oldest_time = clock_time(); for(n = uip_ds6_nbr_cache; n < &uip_ds6_nbr_cache[UIP_DS6_NBR_NB]; n++) { if(n->isused) { if(n->last_lookup < oldest_time) { oldest = n; oldest_time = n->last_lookup; } } } if(oldest != NULL) { uip_ds6_nbr_rm(oldest); return uip_ds6_nbr_add(ipaddr, lladdr, isrouter, state); } } PRINTF("uip_ds6_nbr_add drop\n"); return NULL; }