diff --git a/src/apps/relay/netengine.c b/src/apps/relay/netengine.c index 64be86de..24d981a2 100644 --- a/src/apps/relay/netengine.c +++ b/src/apps/relay/netengine.c @@ -77,6 +77,32 @@ static void barrier_wait_func(const char* func, int line) #define barrier_wait() barrier_wait_func(__FUNCTION__,__LINE__) +/////////////// Bandwidth ////////////////// + +static pthread_mutex_t mutex_bps; + +static band_limit_t allocate_bps(band_limit_t bps) +{ + band_limit_t ret = 0; + if(bps>0) { + pthread_mutex_lock(&mutex_bps); + + if(turn_params.bps_capacity_allocated < turn_params.bps_capacity) { + band_limit_t reserve = turn_params.bps_capacity - turn_params.bps_capacity_allocated; + if(reserve <= bps) { + ret = reserve; + turn_params.bps_capacity_allocated = turn_params.bps_capacity; + } else { + ret = bps; + turn_params.bps_capacity_allocated -= ret; + } + } + + pthread_mutex_unlock(&mutex_bps); + } + return ret; +} + /////////////// AUX SERVERS //////////////// static void add_aux_server_list(const char *saddr, turn_server_addrs_list_t *list) @@ -1382,7 +1408,7 @@ static void setup_relay_server(struct relay_server *rs, ioa_engine_handle e, int &turn_params.secure_stun, turn_params.shatype, &turn_params.mobility, turn_params.server_relay, send_turn_session_info, - turn_params.max_bps); + turn_params.max_bps, allocate_bps); if(to_set_rfc5780) { set_rfc5780(&(rs->server), get_alt_addr, send_message_from_listener_to_client); @@ -1527,6 +1553,8 @@ void setup_server(void) { evthread_use_pthreads(); + pthread_mutex_init(&mutex_bps, NULL); + #if !defined(TURN_NO_THREAD_BARRIERS) /* relay threads plus auth thread plus main listener thread */ diff --git a/src/server/ns_turn_server.c b/src/server/ns_turn_server.c index 362c34fe..40398cd0 100644 --- a/src/server/ns_turn_server.c +++ b/src/server/ns_turn_server.c @@ -4349,7 +4349,7 @@ void init_turn_server(turn_turnserver* server, send_socket_to_relay_cb send_socket_to_relay, vintp secure_stun, SHATYPE shatype, vintp mobility, int server_relay, send_turn_session_info_cb send_turn_session_info, - band_limit_t max_bps) { + band_limit_t max_bps, allocate_bps_cb allocate_bps_func) { if (!server) return; @@ -4407,6 +4407,7 @@ void init_turn_server(turn_turnserver* server, server->send_socket_to_relay = send_socket_to_relay; server->max_bps = max_bps; + server->allocate_bps_func = allocate_bps_func; set_ioa_timer(server->e, 1, 0, timer_timeout_handler, server, 1, "timer_timeout_handler"); } diff --git a/src/server/ns_turn_server.h b/src/server/ns_turn_server.h index f55470fc..3a76ca39 100644 --- a/src/server/ns_turn_server.h +++ b/src/server/ns_turn_server.h @@ -92,7 +92,7 @@ typedef void (*release_allocation_quota_cb)(u08bits *username, u08bits *realm); typedef int (*send_socket_to_relay_cb)(turnserver_id id, u64bits cid, stun_tid *tid, ioa_socket_handle s, int message_integrity, MESSAGE_TO_RELAY_TYPE rmt, ioa_net_data *nd); typedef int (*send_turn_session_info_cb)(struct turn_session_info *tsi); -typedef vint band_limit_t; +typedef band_limit_t (*allocate_bps_cb)(band_limit_t bps); struct _turn_turnserver { @@ -154,6 +154,7 @@ struct _turn_turnserver { /* Bandwidth draft: */ band_limit_t max_bps; + allocate_bps_cb allocate_bps_func; }; /////////////////////////////////////////// @@ -188,7 +189,8 @@ void init_turn_server(turn_turnserver* server, vintp mobility, int server_relay, send_turn_session_info_cb send_turn_session_info, - band_limit_t max_bps); + band_limit_t max_bps, + allocate_bps_cb allocate_bps_func); ioa_engine_handle turn_server_get_engine(turn_turnserver *s); diff --git a/src/server/ns_turn_session.h b/src/server/ns_turn_session.h index 86c6010e..cd9a8fcd 100644 --- a/src/server/ns_turn_session.h +++ b/src/server/ns_turn_session.h @@ -60,6 +60,7 @@ struct _realm_options_t { //////////////// session info ////////////////////// typedef u64bits turnsession_id; +typedef unsigned int band_limit_t; #define NONCE_MAX_SIZE (NONCE_LENGTH_32BITS*4+1) @@ -103,6 +104,8 @@ struct _ts_ur_super_session { realm_options_t realm_options; int realm_set; s08bits origin[STUN_MAX_ORIGIN_SIZE + 1]; + /* Bandwidth */ + band_limit_t bps; }; ////// Session info for statistics //////