From 560c84a2fe45bd6158d5f894bfbd7cb88d7adcda Mon Sep 17 00:00:00 2001 From: adamdunkels Date: Tue, 15 Jun 2010 19:16:22 +0000 Subject: [PATCH] Added a function for getting the first global IPv6 address --- core/net/uip-ds6.c | 28 +++++++++++++++++++++++----- core/net/uip-ds6.h | 1 + 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/core/net/uip-ds6.c b/core/net/uip-ds6.c index 6099ddc7b..2935c5821 100755 --- a/core/net/uip-ds6.c +++ b/core/net/uip-ds6.c @@ -391,7 +391,7 @@ uip_ds6_defrt_lookup(uip_ipaddr_t * ipaddr) /*---------------------------------------------------------------------------*/ uip_ipaddr_t * -uip_ds6_defrt_choose() +uip_ds6_defrt_choose(void) { uip_ds6_nbr_t *bestnbr; @@ -476,7 +476,6 @@ uip_ds6_prefix_add(uip_ipaddr_t * ipaddr, uint8_t ipaddrlen, #endif /* UIP_CONF_ROUTER */ /*---------------------------------------------------------------------------*/ - void uip_ds6_prefix_rm(uip_ds6_prefix_t * prefix) { @@ -485,7 +484,6 @@ uip_ds6_prefix_rm(uip_ds6_prefix_t * prefix) } return; } - /*---------------------------------------------------------------------------*/ uip_ds6_prefix_t * uip_ds6_prefix_lookup(uip_ipaddr_t * ipaddr, uint8_t ipaddrlen) @@ -576,10 +574,11 @@ uip_ds6_addr_lookup(uip_ipaddr_t * ipaddr) * (TENTATIVE, PREFERRED, DEPRECATED) */ uip_ds6_addr_t * -uip_ds6_get_link_local(int8_t state) { +uip_ds6_get_link_local(int8_t state) +{ for(locaddr = uip_ds6_if.addr_list; locaddr < uip_ds6_if.addr_list + UIP_DS6_ADDR_NB; locaddr++) { - if((locaddr->isused) && (state == - 1 || locaddr->state == state) + if((locaddr->isused) && (state == -1 || locaddr->state == state) && (uip_is_addr_link_local(&locaddr->ipaddr))) { return locaddr; } @@ -587,6 +586,25 @@ uip_ds6_get_link_local(int8_t state) { return NULL; } +/*---------------------------------------------------------------------------*/ +/* + * get a global address - + * state = -1 => any address is ok. Otherwise state = desired state of addr. + * (TENTATIVE, PREFERRED, DEPRECATED) + */ +uip_ds6_addr_t * +uip_ds6_get_global(int8_t state) +{ + for(locaddr = uip_ds6_if.addr_list; + locaddr < uip_ds6_if.addr_list + UIP_DS6_ADDR_NB; locaddr++) { + if((locaddr->isused) && (state == -1 || locaddr->state == state) + && !(uip_is_addr_link_local(&locaddr->ipaddr))) { + return locaddr; + } + } + return NULL; +} + /*---------------------------------------------------------------------------*/ uip_ds6_maddr_t * uip_ds6_maddr_add(uip_ipaddr_t * ipaddr) diff --git a/core/net/uip-ds6.h b/core/net/uip-ds6.h index d49eb76e9..11d83a82a 100755 --- a/core/net/uip-ds6.h +++ b/core/net/uip-ds6.h @@ -342,6 +342,7 @@ uip_ds6_addr_t *uip_ds6_addr_add(uip_ipaddr_t *ipaddr, void uip_ds6_addr_rm(uip_ds6_addr_t *addr); uip_ds6_addr_t *uip_ds6_addr_lookup(uip_ipaddr_t *ipaddr); uip_ds6_addr_t *uip_ds6_get_link_local(int8_t state); +uip_ds6_addr_t *uip_ds6_get_global(int8_t state); /** @} */