#27 Fix IGMP Delay Calculation

This commit is contained in:
Christian Giese
2021-04-12 11:27:09 +02:00
parent 07d1fd2a99
commit dc2c7fddc2
3 changed files with 20 additions and 9 deletions
+7 -4
View File
@@ -457,7 +457,7 @@ bbl_igmp_zapping(timer_s *timer)
struct timespec time_diff;
struct timespec time_now;
int ms;
uint32_t ms;
if(session->session_state != BBL_ESTABLISHED ||
session->ipcp_state != BBL_PPP_OPENED) {
@@ -483,9 +483,10 @@ bbl_igmp_zapping(timer_s *timer)
group = session->zapping_joined_group;
if(group->first_mc_rx_time.tv_sec) {
timespec_sub(&time_diff, &group->first_mc_rx_time, &group->join_tx_time);
ms = round(time_diff.tv_nsec / 1.0e6); // Convert nanoseconds to milliseconds
ms = time_diff.tv_nsec / 1000000; // convert nanoseconds to milliseconds
if(time_diff.tv_nsec % 1000000) ms++; // simple roundup function
join_delay = (time_diff.tv_sec * 1000) + ms;
if(!join_delay) join_delay = 1; // join delay must be at least one millisecond
session->zapping_join_delay_sum += join_delay;
session->zapping_join_delay_count++;
if(join_delay > session->stats.max_join_delay) session->stats.max_join_delay = join_delay;
@@ -530,8 +531,10 @@ bbl_igmp_zapping(timer_s *timer)
group = session->zapping_leaved_group;
if(group->group && group->last_mc_rx_time.tv_sec && group->leave_tx_time.tv_sec) {
timespec_sub(&time_diff, &group->last_mc_rx_time, &group->leave_tx_time);
ms = round(time_diff.tv_nsec / 1.0e6); // Convert nanoseconds to milliseconds
ms = time_diff.tv_nsec / 1000000; // convert nanoseconds to milliseconds
if(time_diff.tv_nsec % 1000000) ms++; // simple roundup function
leave_delay = (time_diff.tv_sec * 1000) + ms;
if(!leave_delay) leave_delay = 1; // leave delay must be at least one millisecond
session->zapping_leave_delay_sum += leave_delay;
session->zapping_leave_delay_count++;
if(leave_delay > session->stats.max_leave_delay) session->stats.max_leave_delay = leave_delay;
+4 -4
View File
@@ -55,8 +55,8 @@ bbl_stats_generate (bbl_ctx_s *ctx, bbl_stats_t * stats) {
bbl_session_s *session;
uint32_t i;
int join_delays = 0;
int leave_delays = 0;
uint32_t join_delays = 0;
uint32_t leave_delays = 0;
bbl_stats_update_cps(ctx);
@@ -142,10 +142,10 @@ bbl_stats_generate (bbl_ctx_s *ctx, bbl_stats_t * stats) {
}
}
if(join_delays) {
stats->avg_join_delay = round(stats->avg_join_delay / join_delays);
stats->avg_join_delay = stats->avg_join_delay / join_delays;
}
if(leave_delays) {
stats->avg_leave_delay = round(stats->avg_leave_delay / leave_delays);
stats->avg_leave_delay = stats->avg_leave_delay / leave_delays;
}
}
+9 -1
View File
@@ -295,7 +295,6 @@ bbl_encode_packet_igmp (bbl_session_s *session)
if(group->robustness_count) {
group->robustness_count--;
}
if(session->igmp_version == IGMP_VERSION_3) {
igmp.version = IGMP_VERSION_3;
igmp.type = IGMP_TYPE_REPORT_V3;
@@ -375,6 +374,15 @@ bbl_encode_packet_igmp (bbl_session_s *session)
}
break;
}
if(group->state == IGMP_GROUP_JOINING) {
if(!group->robustness_count) {
group->state = IGMP_GROUP_ACTIVE;
}
} else if(group->state == IGMP_GROUP_LEAVING) {
if(!group->robustness_count) {
group->state = IGMP_GROUP_IDLE;
}
}
}
}
if(!group) {