From: Jukka Rissanen Date: Thu, 9 Dec 2010 11:11:47 +0000 (+0200) Subject: ipconfig: Do not add duplicate IP address to the address list X-Git-Tag: 2.0_alpha~2013 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=29aef4d4cf1d44db8d6dc9839242eefb70e990dc;p=framework%2Fconnectivity%2Fconnman.git ipconfig: Do not add duplicate IP address to the address list --- diff --git a/src/ipconfig.c b/src/ipconfig.c index 133db61..62323c7 100644 --- a/src/ipconfig.c +++ b/src/ipconfig.c @@ -594,6 +594,17 @@ void __connman_ipconfig_dellink(int index, struct rtnl_link_stats *stats) g_hash_table_remove(ipdevice_hash, GINT_TO_POINTER(index)); } +static inline gint check_duplicate_address(gconstpointer a, gconstpointer b) +{ + const struct connman_ipaddress *addr1 = a; + const struct connman_ipaddress *addr2 = b; + + if (addr1->prefixlen != addr2->prefixlen) + return addr2->prefixlen - addr1->prefixlen; + + return g_strcmp0(addr1->local, addr2->local); +} + void __connman_ipconfig_newaddr(int index, int family, const char *label, unsigned char prefixlen, const char *address) { @@ -614,6 +625,12 @@ void __connman_ipconfig_newaddr(int index, int family, const char *label, ipaddress->prefixlen = prefixlen; ipaddress->local = g_strdup(address); + if (g_slist_find_custom(ipdevice->address_list, ipaddress, + check_duplicate_address)) { + connman_ipaddress_free(ipaddress); + return; + } + ipdevice->address_list = g_slist_append(ipdevice->address_list, ipaddress);