added bandwidth usage reporting for bandwidth used by peers

This commit is contained in:
Zebadiah Long 2018-10-02 16:59:13 +00:00
parent 5d88f8275d
commit 3258c619ed
3 changed files with 103 additions and 5 deletions

View File

@ -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;
}
}
}

View File

@ -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)) {

View File

@ -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 */