diff --git a/juice/include/juice/juice.h b/juice/include/juice/juice.h index 675d2d5bd..a766e9538 100644 --- a/juice/include/juice/juice.h +++ b/juice/include/juice/juice.h @@ -131,6 +131,7 @@ JUICE_EXPORT int juice_set_local_ice_attributes(juice_agent_t *agent, const char JUICE_EXPORT const char *juice_state_to_string(juice_state_t state); JUICE_EXPORT int juice_bind_stun(const char *bind_address, int local_port, juice_cb_stun_binding_t cb); +JUICE_EXPORT int juice_unbind_stun(); // ICE server diff --git a/juice/src/conn.c b/juice/src/conn.c index 39ba4135c..cda77f1cc 100644 --- a/juice/src/conn.c +++ b/juice/src/conn.c @@ -248,8 +248,34 @@ int conn_get_addrs(juice_agent_t *agent, addr_record_t *records, size_t size) { return get_mode_entry(agent)->get_addrs_func(agent, records, size); } +int juice_unbind_stun() { + conn_mode_entry_t *entry = &mode_entries[JUICE_CONCURRENCY_MODE_MUX]; + + mutex_lock(&entry->mutex); + + conn_registry_t *registry = entry->registry; + if (!registry) { + mutex_unlock(&entry->mutex); + return -1; + } + + mutex_lock(®istry->mutex); + + registry->cb_stun_binding = NULL; + conn_mux_interrupt_registry(registry); + + release_registry(entry); + + mutex_unlock(&entry->mutex); + + return 0; +} + int juice_bind_stun(const char *bind_address, int local_port, juice_cb_stun_binding_t cb) { + if (!cb) + return juice_unbind_stun(); + conn_mode_entry_t *entry = &mode_entries[JUICE_CONCURRENCY_MODE_MUX]; udp_socket_config_t config; diff --git a/juice/src/conn_mux.c b/juice/src/conn_mux.c index ed11e4673..f76f12625 100644 --- a/juice/src/conn_mux.c +++ b/juice/src/conn_mux.c @@ -318,7 +318,7 @@ static juice_agent_t *lookup_agent(conn_registry_t *registry, char *buf, size_t binding_info.pwd = separator + 1; binding_info.family = sa->sa_family; binding_info.address = host; - binding_info.port = addr_get_port(src); + binding_info.port = addr_get_port((struct sockaddr *)src); registry->cb_stun_binding(&binding_info); @@ -508,14 +508,7 @@ void conn_mux_unlock(juice_agent_t *agent) { mutex_unlock(®istry->mutex); } -int conn_mux_interrupt(juice_agent_t *agent) { - conn_impl_t *conn_impl = agent->conn_impl; - conn_registry_t *registry = conn_impl->registry; - - mutex_lock(®istry->mutex); - conn_impl->next_timestamp = current_timestamp(); - mutex_unlock(®istry->mutex); - +int conn_mux_interrupt_registry(conn_registry_t *registry) { JLOG_VERBOSE("Interrupting connections thread"); registry_impl_t *registry_impl = registry->impl; @@ -531,6 +524,17 @@ int conn_mux_interrupt(juice_agent_t *agent) { return 0; } +int conn_mux_interrupt(juice_agent_t *agent) { + conn_impl_t *conn_impl = agent->conn_impl; + conn_registry_t *registry = conn_impl->registry; + + mutex_lock(®istry->mutex); + conn_impl->next_timestamp = current_timestamp(); + mutex_unlock(®istry->mutex); + + return conn_mux_interrupt_registry(registry); +} + int conn_mux_send(juice_agent_t *agent, const addr_record_t *dst, const char *data, size_t size, int ds) { conn_impl_t *conn_impl = agent->conn_impl; diff --git a/juice/src/conn_mux.h b/juice/src/conn_mux.h index 9519f0668..68b51b673 100644 --- a/juice/src/conn_mux.h +++ b/juice/src/conn_mux.h @@ -24,6 +24,7 @@ int conn_mux_init(juice_agent_t *agent, conn_registry_t *registry, udp_socket_co void conn_mux_cleanup(juice_agent_t *agent); void conn_mux_lock(juice_agent_t *agent); void conn_mux_unlock(juice_agent_t *agent); +int conn_mux_interrupt_registry(conn_registry_t *registry); int conn_mux_interrupt(juice_agent_t *agent); int conn_mux_send(juice_agent_t *agent, const addr_record_t *dst, const char *data, size_t size, int ds);