* Switch to a different IGMP version on the given interface, * as per Section 7.2.1. */
| 1990 | * as per Section 7.2.1. |
| 1991 | */ |
| 1992 | static void |
| 1993 | igmp_set_version(struct igmp_ifsoftc *igi, const int version) |
| 1994 | { |
| 1995 | int old_version_timer; |
| 1996 | |
| 1997 | IGMP_LOCK_ASSERT(); |
| 1998 | |
| 1999 | CTR4(KTR_IGMPV3, "%s: switching to v%d on ifp %p(%s)", __func__, |
| 2000 | version, igi->igi_ifp, igi->igi_ifp->if_xname); |
| 2001 | |
| 2002 | if (version == IGMP_VERSION_1 || version == IGMP_VERSION_2) { |
| 2003 | /* |
| 2004 | * Compute the "Older Version Querier Present" timer as per |
| 2005 | * Section 8.12. |
| 2006 | */ |
| 2007 | old_version_timer = igi->igi_rv * igi->igi_qi + igi->igi_qri; |
| 2008 | old_version_timer *= PR_SLOWHZ; |
| 2009 | |
| 2010 | if (version == IGMP_VERSION_1) { |
| 2011 | igi->igi_v1_timer = old_version_timer; |
| 2012 | igi->igi_v2_timer = 0; |
| 2013 | } else if (version == IGMP_VERSION_2) { |
| 2014 | igi->igi_v1_timer = 0; |
| 2015 | igi->igi_v2_timer = old_version_timer; |
| 2016 | } |
| 2017 | } |
| 2018 | |
| 2019 | if (igi->igi_v1_timer == 0 && igi->igi_v2_timer > 0) { |
| 2020 | if (igi->igi_version != IGMP_VERSION_2) { |
| 2021 | igi->igi_version = IGMP_VERSION_2; |
| 2022 | igmp_v3_cancel_link_timers(igi); |
| 2023 | } |
| 2024 | } else if (igi->igi_v1_timer > 0) { |
| 2025 | if (igi->igi_version != IGMP_VERSION_1) { |
| 2026 | igi->igi_version = IGMP_VERSION_1; |
| 2027 | igmp_v3_cancel_link_timers(igi); |
| 2028 | } |
| 2029 | } |
| 2030 | } |
| 2031 | |
| 2032 | /* |
| 2033 | * Cancel pending IGMPv3 timers for the given link and all groups |
no test coverage detected