|
@@ -67,6 +67,8 @@ static struct auth_server authserver[256];
|
|
|
static struct relay_server *general_relay_servers[1+((turnserver_id)-1)];
|
|
|
static struct relay_server *udp_relay_servers[1+((turnserver_id)-1)];
|
|
|
|
|
|
+static struct relay_server* get_relay_server(turnserver_id id);
|
|
|
+
|
|
|
//////////////////////////////////////////////
|
|
|
|
|
|
static void run_events(struct event_base *eb, ioa_engine_handle e);
|
|
@@ -441,6 +443,42 @@ static void allocate_relay_addrs_ports(void) {
|
|
|
|
|
|
static int handle_relay_message(relay_server_handle rs, struct message_to_relay *sm);
|
|
|
|
|
|
+static struct relay_server* get_relay_server(turnserver_id id) {
|
|
|
+ struct relay_server *rs = NULL;
|
|
|
+ if(id>=TURNSERVER_ID_BOUNDARY_BETWEEN_TCP_AND_UDP) {
|
|
|
+ size_t dest = id-TURNSERVER_ID_BOUNDARY_BETWEEN_TCP_AND_UDP;
|
|
|
+ if(dest >= get_real_udp_relay_servers_number()) {
|
|
|
+ TURN_LOG_FUNC(
|
|
|
+ TURN_LOG_LEVEL_ERROR,
|
|
|
+ "%s: Too large UDP relay number: %d, total=%d\n",
|
|
|
+ __FUNCTION__,(int)dest,(int)get_real_udp_relay_servers_number());
|
|
|
+ }
|
|
|
+ rs = udp_relay_servers[dest];
|
|
|
+ if(!rs) {
|
|
|
+ TURN_LOG_FUNC(
|
|
|
+ TURN_LOG_LEVEL_ERROR,
|
|
|
+ "%s: Wrong UDP relay number: %d, total=%d\n",
|
|
|
+ __FUNCTION__,(int)dest,(int)get_real_udp_relay_servers_number());
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ size_t dest = id;
|
|
|
+ if(dest >= get_real_general_relay_servers_number()) {
|
|
|
+ TURN_LOG_FUNC(
|
|
|
+ TURN_LOG_LEVEL_ERROR,
|
|
|
+ "%s: Too large general relay number: %d, total=%d\n",
|
|
|
+ __FUNCTION__,(int)dest,(int)get_real_general_relay_servers_number());
|
|
|
+ }
|
|
|
+ rs = general_relay_servers[dest];
|
|
|
+ if(!rs) {
|
|
|
+ TURN_LOG_FUNC(
|
|
|
+ TURN_LOG_LEVEL_ERROR,
|
|
|
+ "%s: Wrong general relay number: %d, total=%d\n",
|
|
|
+ __FUNCTION__,(int)dest,(int)get_real_general_relay_servers_number());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return rs;
|
|
|
+}
|
|
|
+
|
|
|
static pthread_mutex_t auth_message_counter_mutex = PTHREAD_MUTEX_INITIALIZER;
|
|
|
static authserver_id auth_message_counter = 1;
|
|
|
|
|
@@ -481,42 +519,15 @@ static void auth_server_receive_message(struct bufferevent *bev, void *ptr)
|
|
|
am.success = 1;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- size_t dest = am.id;
|
|
|
-
|
|
|
+
|
|
|
struct evbuffer *output = NULL;
|
|
|
-
|
|
|
- if(dest>=TURNSERVER_ID_BOUNDARY_BETWEEN_TCP_AND_UDP) {
|
|
|
- dest -= TURNSERVER_ID_BOUNDARY_BETWEEN_TCP_AND_UDP;
|
|
|
- if(dest >= get_real_udp_relay_servers_number()) {
|
|
|
- TURN_LOG_FUNC(
|
|
|
- TURN_LOG_LEVEL_ERROR,
|
|
|
- "%s: Too large UDP relay number: %d\n",
|
|
|
- __FUNCTION__,(int)dest);
|
|
|
- } else if(!(udp_relay_servers[dest])) {
|
|
|
- TURN_LOG_FUNC(
|
|
|
- TURN_LOG_LEVEL_ERROR,
|
|
|
- "%s: Wrong UDP relay number: %d, total %d\n",
|
|
|
- __FUNCTION__,(int)dest, (int)get_real_udp_relay_servers_number());
|
|
|
- } else {
|
|
|
- output = bufferevent_get_output(udp_relay_servers[dest]->auth_out_buf);
|
|
|
- }
|
|
|
- } else {
|
|
|
- if(dest >= get_real_general_relay_servers_number()) {
|
|
|
- TURN_LOG_FUNC(
|
|
|
- TURN_LOG_LEVEL_ERROR,
|
|
|
- "%s: Too large general relay number: %d, total %d\n",
|
|
|
- __FUNCTION__,(int)dest,(int)get_real_general_relay_servers_number());
|
|
|
- } else if(!(general_relay_servers[dest])) {
|
|
|
- TURN_LOG_FUNC(
|
|
|
- TURN_LOG_LEVEL_ERROR,
|
|
|
- "%s: Wrong general relay number: %d, total %d\n",
|
|
|
- __FUNCTION__,(int)dest,(int)get_real_general_relay_servers_number());
|
|
|
- } else {
|
|
|
- output = bufferevent_get_output(general_relay_servers[dest]->auth_out_buf);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
+ struct relay_server* relay_server = get_relay_server(am.id);
|
|
|
+ if(relay_server) {
|
|
|
+ output = bufferevent_get_output(relay_server->auth_out_buf);
|
|
|
+ } else {
|
|
|
+ TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, "%s: can't find relay for turn_server_id: %d\n", __FUNCTION__,(int)am.id);
|
|
|
+ }
|
|
|
+
|
|
|
if(output)
|
|
|
evbuffer_add(output,&am,sizeof(struct auth_message));
|
|
|
else {
|
|
@@ -585,41 +596,10 @@ static int send_socket_to_relay(turnserver_id id, uint64_t cid, stun_tid *tid, i
|
|
|
|
|
|
ioa_socket_handle s_to_delete = s;
|
|
|
|
|
|
- struct relay_server *rs = NULL;
|
|
|
- if(id>=TURNSERVER_ID_BOUNDARY_BETWEEN_TCP_AND_UDP) {
|
|
|
- size_t dest = id-TURNSERVER_ID_BOUNDARY_BETWEEN_TCP_AND_UDP;
|
|
|
- if(dest >= get_real_udp_relay_servers_number()) {
|
|
|
- TURN_LOG_FUNC(
|
|
|
- TURN_LOG_LEVEL_ERROR,
|
|
|
- "%s: Too large UDP relay number: %d, rmt=%d, total=%d\n",
|
|
|
- __FUNCTION__,(int)dest,(int)rmt, (int)get_real_udp_relay_servers_number());
|
|
|
- goto err;
|
|
|
- }
|
|
|
- rs = udp_relay_servers[dest];
|
|
|
- if(!rs) {
|
|
|
- TURN_LOG_FUNC(
|
|
|
- TURN_LOG_LEVEL_ERROR,
|
|
|
- "%s: Wrong UDP relay number: %d, rmt=%d, total=%d\n",
|
|
|
- __FUNCTION__,(int)dest,(int)rmt, (int)get_real_udp_relay_servers_number());
|
|
|
- goto err;
|
|
|
- }
|
|
|
- } else {
|
|
|
- size_t dest = id;
|
|
|
- if(dest >= get_real_general_relay_servers_number()) {
|
|
|
- TURN_LOG_FUNC(
|
|
|
- TURN_LOG_LEVEL_ERROR,
|
|
|
- "%s: Too large general relay number: %d, rmt=%d, total=%d\n",
|
|
|
- __FUNCTION__,(int)dest,(int)rmt, (int)get_real_general_relay_servers_number());
|
|
|
- goto err;
|
|
|
- }
|
|
|
- rs = general_relay_servers[dest];
|
|
|
- if(!rs) {
|
|
|
- TURN_LOG_FUNC(
|
|
|
- TURN_LOG_LEVEL_ERROR,
|
|
|
- "%s: Wrong general relay number: %d, rmt=%d, total=%d\n",
|
|
|
- __FUNCTION__,(int)dest,(int)rmt, (int)get_real_general_relay_servers_number());
|
|
|
- goto err;
|
|
|
- }
|
|
|
+ struct relay_server *rs = get_relay_server(id);
|
|
|
+ if(!rs) {
|
|
|
+ TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, "%s: can't find relay for turn_server_id: %d\n", __FUNCTION__,(int)id);
|
|
|
+ goto err;
|
|
|
}
|
|
|
|
|
|
switch (rmt) {
|
|
@@ -716,45 +696,11 @@ int send_session_cancellation_to_relay(turnsession_id sid)
|
|
|
|
|
|
turnserver_id id = (turnserver_id)(sid / TURN_SESSION_ID_FACTOR);
|
|
|
|
|
|
- struct relay_server *rs = NULL;
|
|
|
- if(id>=TURNSERVER_ID_BOUNDARY_BETWEEN_TCP_AND_UDP) {
|
|
|
- size_t dest = id-TURNSERVER_ID_BOUNDARY_BETWEEN_TCP_AND_UDP;
|
|
|
- if(dest >= get_real_udp_relay_servers_number()) {
|
|
|
- TURN_LOG_FUNC(
|
|
|
- TURN_LOG_LEVEL_ERROR,
|
|
|
- "%s: Too large UDP relay number: %d, total=%d\n",
|
|
|
- __FUNCTION__,(int)dest,(int)get_real_udp_relay_servers_number());
|
|
|
- ret = -1;
|
|
|
- goto err;
|
|
|
- }
|
|
|
- rs = udp_relay_servers[dest];
|
|
|
- if(!rs) {
|
|
|
- TURN_LOG_FUNC(
|
|
|
- TURN_LOG_LEVEL_ERROR,
|
|
|
- "%s: Wrong UDP relay number: %d, total=%d\n",
|
|
|
- __FUNCTION__,(int)dest,(int)get_real_udp_relay_servers_number());
|
|
|
- ret = -1;
|
|
|
- goto err;
|
|
|
- }
|
|
|
- } else {
|
|
|
- size_t dest = id;
|
|
|
- if(dest >= get_real_general_relay_servers_number()) {
|
|
|
- TURN_LOG_FUNC(
|
|
|
- TURN_LOG_LEVEL_ERROR,
|
|
|
- "%s: Too large general relay number: %d, total=%d\n",
|
|
|
- __FUNCTION__,(int)dest,(int)get_real_general_relay_servers_number());
|
|
|
- ret = -1;
|
|
|
- goto err;
|
|
|
- }
|
|
|
- rs = general_relay_servers[dest];
|
|
|
- if(!rs) {
|
|
|
- TURN_LOG_FUNC(
|
|
|
- TURN_LOG_LEVEL_ERROR,
|
|
|
- "%s: Wrong general relay number: %d, total=%d\n",
|
|
|
- __FUNCTION__,(int)dest,(int)get_real_general_relay_servers_number());
|
|
|
- ret = -1;
|
|
|
- goto err;
|
|
|
- }
|
|
|
+ struct relay_server *rs = get_relay_server(id);
|
|
|
+ if(!rs) {
|
|
|
+ TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, "%s: can't find relay for turn_server_id: %d\n", __FUNCTION__,(int)id);
|
|
|
+ ret = -1;
|
|
|
+ goto err;
|
|
|
}
|
|
|
|
|
|
sm.relay_server = rs;
|