diff options
Diffstat (limited to 'src/dumm/bridge.c')
-rw-r--r-- | src/dumm/bridge.c | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/src/dumm/bridge.c b/src/dumm/bridge.c index c6068e60c..cb8017c78 100644 --- a/src/dumm/bridge.c +++ b/src/dumm/bridge.c @@ -31,6 +31,11 @@ struct private_bridge_t { /** list of attached interfaces */ linked_list_t *ifaces; }; + +/** + * defined in iface.c + */ +bool iface_control(char *name, bool up); /** * Implementation of bridge_t.get_name. @@ -41,11 +46,11 @@ static char* get_name(private_bridge_t *this) } /** - * Implementation of bridge_t.create_iface_iterator. + * Implementation of bridge_t.create_iface_enumerator. */ -static iterator_t* create_iface_iterator(private_bridge_t *this) +static enumerator_t* create_iface_enumerator(private_bridge_t *this) { - return this->ifaces->create_iterator(this->ifaces, TRUE); + return this->ifaces->create_enumerator(this->ifaces); } /** @@ -53,12 +58,12 @@ static iterator_t* create_iface_iterator(private_bridge_t *this) */ static bool disconnect_iface(private_bridge_t *this, iface_t *iface) { - iterator_t *iterator; - iface_t *current; + enumerator_t *enumerator; + iface_t *current = NULL; bool good = FALSE; - iterator = this->ifaces->create_iterator(this->ifaces, TRUE); - while (iterator->iterate(iterator, (void**)¤t)) + enumerator = this->ifaces->create_enumerator(this->ifaces); + while (enumerator->enumerate(enumerator, (void**)¤t)) { if (current == iface) { @@ -70,6 +75,7 @@ static bool disconnect_iface(private_bridge_t *this, iface_t *iface) else { iface->set_bridge(iface, NULL); + this->ifaces->remove_at(this->ifaces, enumerator); good = TRUE; } break; @@ -80,7 +86,7 @@ static bool disconnect_iface(private_bridge_t *this, iface_t *iface) DBG1("iface '%s' not found on bridge '%s'", iface->get_hostif(iface), this->name); } - iterator->destroy(iterator); + enumerator->destroy(enumerator); return good; } @@ -118,8 +124,9 @@ static void unregister(iface_t *iface) */ static void destroy(private_bridge_t *this) { - this->ifaces->invoke_function(this->ifaces, (void(*)(void*))unregister); + this->ifaces->invoke_function(this->ifaces, (linked_list_invoke_t)unregister); this->ifaces->destroy(this->ifaces); + iface_control(this->name, FALSE); if (br_del_bridge(this->name) != 0) { DBG1("deleting bridge '%s' from kernel failed: %m", this->name); @@ -150,7 +157,7 @@ bridge_t *bridge_create(char *name) this = malloc_thing(private_bridge_t); this->public.get_name = (char*(*)(bridge_t*))get_name; - this->public.create_iface_iterator = (iterator_t*(*)(bridge_t*))create_iface_iterator; + this->public.create_iface_enumerator = (enumerator_t*(*)(bridge_t*))create_iface_enumerator; this->public.disconnect_iface = (bool(*)(bridge_t*, iface_t *iface))disconnect_iface; this->public.connect_iface = (bool(*)(bridge_t*, iface_t *iface))connect_iface; this->public.destroy = (void*)destroy; @@ -161,6 +168,10 @@ bridge_t *bridge_create(char *name) free(this); return NULL; } + if (!iface_control(name, TRUE)) + { + DBG1("bringing bridge '%s' up failed: %m", name); + } this->name = strdup(name); this->ifaces = linked_list_create(); |