diff options
author | Jukka Rissanen <jukka.rissanen@linux.intel.com> | 2012-01-18 15:25:00 +0200 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2012-01-20 01:35:24 +0100 |
commit | 65557bbb7dc89348981fe65f2ee56e0ac31da275 (patch) | |
tree | 77c6ef69a032c33149428c712654607e06bc7500 /src/dhcpv6.c | |
parent | 295fb30ff4057a055d6fe908df8c38b3ee08e27a (diff) | |
download | connman-65557bbb7dc89348981fe65f2ee56e0ac31da275.tar.gz connman-65557bbb7dc89348981fe65f2ee56e0ac31da275.tar.bz2 connman-65557bbb7dc89348981fe65f2ee56e0ac31da275.zip |
dhcpv6: Prevent user from starting DHCPv6 multiple times
We must make sure that user cannot start DHCPv6 many times
for a given network.
Diffstat (limited to 'src/dhcpv6.c')
-rw-r--r-- | src/dhcpv6.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/src/dhcpv6.c b/src/dhcpv6.c index 04b8b2b4..e6290665 100644 --- a/src/dhcpv6.c +++ b/src/dhcpv6.c @@ -67,6 +67,7 @@ struct connman_dhcpv6 { GSList *prefixes; /* network prefixes from radvd */ int request_count; /* how many times REQUEST have been sent */ gboolean stateless; /* TRUE if stateless DHCPv6 is used */ + gboolean started; /* TRUE if we have DHCPv6 started */ }; static GHashTable *network_table; @@ -106,6 +107,7 @@ static void dhcpv6_free(struct connman_dhcpv6 *dhcp) dhcp->nameservers = NULL; dhcp->timeservers = NULL; + dhcp->started = FALSE; g_slist_foreach(dhcp->prefixes, free_prefix, NULL); g_slist_free(dhcp->prefixes); @@ -985,6 +987,12 @@ int __connman_dhcpv6_start_info(struct connman_network *network, DBG(""); + if (network_table != NULL) { + dhcp = g_hash_table_lookup(network_table, network); + if (dhcp != NULL && dhcp->started == TRUE) + return -EBUSY; + } + dhcp = g_try_new0(struct connman_dhcpv6, 1); if (dhcp == NULL) return -ENOMEM; @@ -992,6 +1000,7 @@ int __connman_dhcpv6_start_info(struct connman_network *network, dhcp->network = network; dhcp->callback = callback; dhcp->stateless = TRUE; + dhcp->started = TRUE; connman_network_ref(network); @@ -1144,6 +1153,12 @@ int __connman_dhcpv6_start(struct connman_network *network, DBG(""); + if (network_table != NULL) { + dhcp = g_hash_table_lookup(network_table, network); + if (dhcp != NULL && dhcp->started == TRUE) + return -EBUSY; + } + dhcp = g_try_new0(struct connman_dhcpv6, 1); if (dhcp == NULL) return -ENOMEM; @@ -1151,6 +1166,7 @@ int __connman_dhcpv6_start(struct connman_network *network, dhcp->network = network; dhcp->callback = callback; dhcp->prefixes = prefixes; + dhcp->started = TRUE; connman_network_ref(network); |