summaryrefslogtreecommitdiff
path: root/src/dhcpv6.c
diff options
context:
space:
mode:
authorJukka Rissanen <jukka.rissanen@linux.intel.com>2012-01-18 15:25:00 +0200
committerSamuel Ortiz <sameo@linux.intel.com>2012-01-20 01:35:24 +0100
commit65557bbb7dc89348981fe65f2ee56e0ac31da275 (patch)
tree77c6ef69a032c33149428c712654607e06bc7500 /src/dhcpv6.c
parent295fb30ff4057a055d6fe908df8c38b3ee08e27a (diff)
downloadconnman-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.c16
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);