diff --git a/src/bbl_rx.c b/src/bbl_rx.c index da573dfb..a74affb1 100644 --- a/src/bbl_rx.c +++ b/src/bbl_rx.c @@ -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; diff --git a/src/bbl_stats.c b/src/bbl_stats.c index a08b1ffe..b9c38a36 100644 --- a/src/bbl_stats.c +++ b/src/bbl_stats.c @@ -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; } } diff --git a/src/bbl_tx.c b/src/bbl_tx.c index 72f77a5c..37469c35 100644 --- a/src/bbl_tx.c +++ b/src/bbl_tx.c @@ -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) {