From 3258c619ed8536cbda6787ef08f582a199338f70 Mon Sep 17 00:00:00 2001 From: Zebadiah Long Date: Tue, 2 Oct 2018 16:59:13 +0000 Subject: [PATCH 1/2] added bandwidth usage reporting for bandwidth used by peers --- src/apps/relay/ns_ioalib_engine_impl.c | 28 +++++++++++- src/server/ns_turn_server.c | 62 ++++++++++++++++++++++++-- src/server/ns_turn_session.h | 18 ++++++++ 3 files changed, 103 insertions(+), 5 deletions(-) diff --git a/src/apps/relay/ns_ioalib_engine_impl.c b/src/apps/relay/ns_ioalib_engine_impl.c index 02eba0a8..eaffe7c6 100644 --- a/src/apps/relay/ns_ioalib_engine_impl.c +++ b/src/apps/relay/ns_ioalib_engine_impl.c @@ -3570,6 +3570,13 @@ void turn_report_allocation_delete(void *a) snprintf(key, sizeof(key), "turn/user/%s/allocation/%018llu/total_traffic", (char*)ss->username, (unsigned long long)ss->id); } send_message_to_redis(e->rch, "publish", key, "rcvp=%lu, rcvb=%lu, sentp=%lu, sentb=%lu", (unsigned long)(ss->t_received_packets), (unsigned long)(ss->t_received_bytes), (unsigned long)(ss->t_sent_packets), (unsigned long)(ss->t_sent_bytes)); + if (ss->realm_options.name[0]) { + snprintf(key, sizeof(key), "turn/realm/%s/user/%s/allocation/%018llu/total_traffic/peer", ss->realm_options.name, (char*)ss->username, (unsigned long long)(ss->id)); + } + else { + snprintf(key, sizeof(key), "turn/user/%s/allocation/%018llu/total_traffic/peer", (char*)ss->username, (unsigned long long)(ss->id)); + } + send_message_to_redis(e->rch, "publish", key, "rcvp=%lu, rcvb=%lu, sentp=%lu, sentb=%lu", (unsigned long)(ss->t_peer_received_packets), (unsigned long)(ss->t_peer_received_bytes), (unsigned long)(ss->t_peer_sent_packets), (unsigned long)(ss->t_peer_sent_bytes)); } #endif } @@ -3584,9 +3591,10 @@ void turn_report_session_usage(void *session, int force_invalid) turn_turnserver *server = (turn_turnserver*)ss->server; if(server && (ss->received_packets || ss->sent_packets || force_invalid)) { ioa_engine_handle e = turn_server_get_engine(server); - if(((ss->received_packets+ss->sent_packets)&2047)==0 || force_invalid) { + if(((ss->received_packets+ss->sent_packets+ss->peer_received_packets+ss->peer_sent_packets)&4095)==0 || force_invalid) { if(e && e->verbose) { TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,"session %018llu: usage: realm=<%s>, username=<%s>, rp=%lu, rb=%lu, sp=%lu, sb=%lu\n", (unsigned long long)(ss->id), (char*)ss->realm_options.name, (char*)ss->username, (unsigned long)(ss->received_packets), (unsigned long)(ss->received_bytes),(unsigned long)(ss->sent_packets),(unsigned long)(ss->sent_bytes)); + TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "session %018llu: peer usage: realm=<%s>, username=<%s>, rp=%lu, rb=%lu, sp=%lu, sb=%lu\n", (unsigned long long)(ss->id), (char*)ss->realm_options.name, (char*)ss->username, (unsigned long)(ss->peer_received_packets), (unsigned long)(ss->peer_received_bytes), (unsigned long)(ss->peer_sent_packets), (unsigned long)(ss->peer_sent_bytes)); } #if !defined(TURN_NO_HIREDIS) { @@ -3597,12 +3605,23 @@ void turn_report_session_usage(void *session, int force_invalid) snprintf(key,sizeof(key),"turn/user/%s/allocation/%018llu/traffic",(char*)ss->username, (unsigned long long)(ss->id)); } send_message_to_redis(e->rch, "publish", key, "rcvp=%lu, rcvb=%lu, sentp=%lu, sentb=%lu",(unsigned long)(ss->received_packets), (unsigned long)(ss->received_bytes),(unsigned long)(ss->sent_packets),(unsigned long)(ss->sent_bytes)); + if (ss->realm_options.name[0]) { + snprintf(key, sizeof(key), "turn/realm/%s/user/%s/allocation/%018llu/traffic/peer", ss->realm_options.name, (char*)ss->username, (unsigned long long)(ss->id)); + } + else { + snprintf(key, sizeof(key), "turn/user/%s/allocation/%018llu/traffic/peer", (char*)ss->username, (unsigned long long)(ss->id)); + } + send_message_to_redis(e->rch, "publish", key, "rcvp=%lu, rcvb=%lu, sentp=%lu, sentb=%lu", (unsigned long)(ss->peer_received_packets), (unsigned long)(ss->peer_received_bytes), (unsigned long)(ss->peer_sent_packets), (unsigned long)(ss->peer_sent_bytes)); } #endif ss->t_received_packets += ss->received_packets; ss->t_received_bytes += ss->received_bytes; ss->t_sent_packets += ss->sent_packets; ss->t_sent_bytes += ss->sent_bytes; + ss->t_peer_received_packets += ss->peer_received_packets; + ss->t_peer_received_bytes += ss->peer_received_bytes; + ss->t_peer_sent_packets += ss->peer_sent_packets; + ss->t_peer_sent_bytes += ss->peer_sent_bytes; { turn_time_t ct = get_turn_server_time(server); @@ -3611,6 +3630,9 @@ void turn_report_session_usage(void *session, int force_invalid) ss->received_rate = (u32bits)(ss->t_received_bytes / ct); ss->sent_rate = (u32bits)(ss->t_sent_bytes / ct); ss->total_rate = ss->received_rate + ss->sent_rate; + ss->peer_received_rate = (u32bits)(ss->t_peer_received_bytes / ct); + ss->peer_sent_rate = (u32bits)(ss->t_peer_sent_bytes / ct); + ss->peer_total_rate = ss->peer_received_rate + ss->peer_sent_rate; } } @@ -3620,6 +3642,10 @@ void turn_report_session_usage(void *session, int force_invalid) ss->received_bytes=0; ss->sent_packets=0; ss->sent_bytes=0; + ss->peer_received_packets = 0; + ss->peer_received_bytes = 0; + ss->peer_sent_packets = 0; + ss->peer_sent_bytes = 0; } } } diff --git a/src/server/ns_turn_server.c b/src/server/ns_turn_server.c index 5eaf6172..e093008e 100644 --- a/src/server/ns_turn_server.c +++ b/src/server/ns_turn_server.c @@ -503,11 +503,34 @@ int turn_session_info_copy_from(struct turn_session_info* tsi, ts_ur_super_sessi tsi->sent_bytes = ss->t_sent_bytes; else tsi->sent_bytes = ss->sent_bytes; + + if (ss->t_peer_received_packets > ss->peer_received_packets) + tsi->peer_received_packets = ss->t_peer_received_packets; + else + tsi->peer_received_packets = ss->peer_received_packets; + + if (ss->t_peer_sent_packets > ss->peer_sent_packets) + tsi->peer_sent_packets = ss->t_peer_sent_packets; + else + tsi->peer_sent_packets = ss->peer_sent_packets; + + if (ss->t_peer_received_bytes > ss->peer_received_bytes) + tsi->peer_received_bytes = ss->t_peer_received_bytes; + else + tsi->peer_received_bytes = ss->peer_received_bytes; + + if (ss->t_peer_sent_bytes > ss->peer_sent_bytes) + tsi->peer_sent_bytes = ss->t_peer_sent_bytes; + else + tsi->peer_sent_bytes = ss->peer_sent_bytes; { tsi->received_rate = ss->received_rate; tsi->sent_rate = ss->sent_rate; tsi->total_rate = tsi->received_rate + tsi->sent_rate; + tsi->peer_received_rate = ss->peer_received_rate; + tsi->peer_sent_rate = ss->peer_sent_rate; + tsi->peer_total_rate = tsi->peer_received_rate + tsi->peer_sent_rate; } tsi->is_mobile = ss->is_mobile; @@ -1903,6 +1926,11 @@ static void tcp_peer_input_handler(ioa_socket_handle s, int event_type, ioa_net_ in_buffer->nbh = NULL; u32bits bytes = (u32bits)ioa_network_buffer_get_size(nbh); + + if (ss) { + ++(ss->peer_received_packets); + ss->peer_received_bytes += bytes; + } int ret = send_data_from_ioa_socket_nbh(tc->client_s, NULL, nbh, TTL_IGNORE, TOS_IGNORE, NULL); if (ret < 0) { @@ -1910,6 +1938,9 @@ static void tcp_peer_input_handler(ioa_socket_handle s, int event_type, ioa_net_ } else if(ss) { ++(ss->sent_packets); ss->sent_bytes += bytes; + } + + if (ss) { turn_report_session_usage(ss, 0); } } @@ -1938,17 +1969,23 @@ static void tcp_client_input_handler_rfc6062data(ioa_socket_handle s, int event_ ioa_network_buffer_handle nbh = in_buffer->nbh; in_buffer->nbh = NULL; + u32bits bytes = (u32bits)ioa_network_buffer_get_size(nbh); if(ss) { - u32bits bytes = (u32bits)ioa_network_buffer_get_size(nbh); ++(ss->received_packets); ss->received_bytes += bytes; } - int ret = send_data_from_ioa_socket_nbh(tc->peer_s, NULL, nbh, TTL_IGNORE, TOS_IGNORE, NULL); + int skip = 0; + int ret = send_data_from_ioa_socket_nbh(tc->peer_s, NULL, nbh, TTL_IGNORE, TOS_IGNORE, &skip); if (ret < 0) { set_ioa_socket_tobeclosed(s); } + if (!skip) { + ++(ss->peer_sent_packets); + ss->peer_sent_bytes += bytes; + } + turn_report_session_usage(ss, 0); } @@ -2998,7 +3035,13 @@ static int handle_turn_send(turn_turnserver *server, ts_ur_super_session *ss, ioa_network_buffer_set_size(nbh,len); } ioa_network_buffer_header_init(nbh); - send_data_from_ioa_socket_nbh(get_relay_socket_ss(ss,peer_addr.ss.sa_family), &peer_addr, nbh, in_buffer->recv_ttl-1, in_buffer->recv_tos, NULL); + int skip = 0; + send_data_from_ioa_socket_nbh(get_relay_socket_ss(ss,peer_addr.ss.sa_family), &peer_addr, nbh, in_buffer->recv_ttl-1, in_buffer->recv_tos, &skip); + if (!skip) { + ++(ss->peer_sent_packets); + ss->peer_sent_bytes += len; + turn_report_session_usage(ss, 0); + } in_buffer->nbh = NULL; } @@ -4080,7 +4123,15 @@ static int write_to_peerchannel(ts_ur_super_session* ss, u16bits chnum, ioa_net_ ioa_network_buffer_header_init(nbh); - rc = send_data_from_ioa_socket_nbh(get_relay_socket_ss(ss, chn->peer_addr.ss.sa_family), &(chn->peer_addr), nbh, in_buffer->recv_ttl-1, in_buffer->recv_tos, NULL); + int skip = 0; + rc = send_data_from_ioa_socket_nbh(get_relay_socket_ss(ss, chn->peer_addr.ss.sa_family), &(chn->peer_addr), nbh, in_buffer->recv_ttl-1, in_buffer->recv_tos, &skip); + + if (!skip) { + ++(ss->peer_sent_packets); + ss->peer_sent_bytes += (u32bits)ioa_network_buffer_get_size(in_buffer->nbh); + turn_report_session_usage(ss, 0); + } + in_buffer->nbh = NULL; } } @@ -4709,6 +4760,9 @@ static void peer_input_handler(ioa_socket_handle s, int event_type, (int)(ioa_network_buffer_get_capacity_udp() - offset)); if (ilen >= 0) { + ++(ss->peer_received_packets); + ss->peer_received_bytes += ilen; + turn_report_session_usage(ss, 0); allocation* a = get_allocation_ss(ss); if (is_allocation_valid(a)) { diff --git a/src/server/ns_turn_session.h b/src/server/ns_turn_session.h index a3f4542e..5ac3a82b 100644 --- a/src/server/ns_turn_session.h +++ b/src/server/ns_turn_session.h @@ -101,6 +101,17 @@ struct _ts_ur_super_session { u64bits received_rate; size_t sent_rate; size_t total_rate; + u32bits peer_received_packets; + u32bits peer_sent_packets; + u32bits peer_received_bytes; + u32bits peer_sent_bytes; + u32bits t_peer_received_packets; + u32bits t_peer_sent_packets; + u32bits t_peer_received_bytes; + u32bits t_peer_sent_bytes; + u64bits peer_received_rate; + size_t peer_sent_rate; + size_t peer_total_rate; /* Mobile */ int is_mobile; mobile_id_t mobile_id; @@ -143,6 +154,13 @@ struct turn_session_info { u32bits received_rate; u32bits sent_rate; u32bits total_rate; + u64bits peer_received_packets; + u64bits peer_sent_packets; + u64bits peer_received_bytes; + u64bits peer_sent_bytes; + u32bits peer_received_rate; + u32bits peer_sent_rate; + u32bits peer_total_rate; /* Mobile */ int is_mobile; /* Peers */ From 68427ca145baf6e3725825cf06cadbc2c0754e4e Mon Sep 17 00:00:00 2001 From: Zebadiah Long Date: Wed, 3 Oct 2018 19:38:35 +0000 Subject: [PATCH 2/2] documentation for redis peer bandwidth usage stats --- turndb/schema.stats.redis | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/turndb/schema.stats.redis b/turndb/schema.stats.redis index 428074cf..e8d0a072 100644 --- a/turndb/schema.stats.redis +++ b/turndb/schema.stats.redis @@ -17,11 +17,17 @@ in the traffic information must subscribe to the events as: psubscribe turn/realm/*/user/*/allocation/*/traffic +Additionally peer traffic is available with the key "turn/user//allocation//traffic/peer". +The application that is interested in the peer traffic information must subscribe to the events as: + + psubscribe turn/realm/*/user/*/allocation/*/traffic/peer + Total traffic information is also reported when the allocation is deleted. The keys are -"turn/user//allocation//total_traffic". Applications interested in the total amount -of traffic per allocation can subscribe to these events as: +"turn/user//allocation//total_traffic" or "turn/user//allocation//total_traffic/peer". +Applications interested in the total amount of traffic per allocation can subscribe to these events as: psubscribe turn/realm/*/user/*/allocation/*/total_traffic + psubscribe turn/realm/*/user/*/allocation/*/total_traffic/peer Or, to receive all allocation events: