📄 igmp_timer.c
字号:
/*
$Log:: /OEM Source Code/igmp/igmp_timer.c $
*
* 1 4/23/98 9:53p Release Engineer
* Initial release
* IGMP v4.1.0
*/
/************************************************************************/
/* Copyright (C) 1997-1998 RouterWare, Inc. */
/* Unpublished - rights reserved under the Copyright Laws of the */
/* United States. Use, duplication, or disclosure by the */
/* Government is subject to restrictions as set forth in */
/* subparagraph (c)(1)(ii) of the Rights in Technical Data and */
/* Computer Software clause at 252.227-7013. */
/* RouterWare, Inc., 3961 MacArthur Blvd. Suite 212, Newport Beach, CA */
/************************************************************************/
#include "igmp.h"
/********************************************************************************************/
static void igmp_check_port_timers (UINT port);
static void igmp_check_group_timers (UINT port);
static void igmp_check_router_port_timers (UINT port);
static void igmp_check_router_group_timers (UINT port);
static void igmp_check_host_port_timers (UINT port);
static void igmp_check_host_group_timers (UINT port);
/********************************************************************************************/
void igmp_timer (void)
{
UINT port;
if (igmp.enabled == TRUE)
{
++igmp.tick_counter;
if (igmp.tick_counter >= igmp.clock_ticks_per_second)
{
igmp.tick_counter = 0;
for (port = 0; port < igmp.number_of_ports; ++port)
{
if (igmp.port_table[port].enabled == TRUE)
{
igmp_check_port_timers (port);
igmp_check_group_timers (port);
}
}
}
}
}
/********************************************************************************************/
static void igmp_check_port_timers (UINT port)
{
if (igmp.port_table[port].router_enabled == TRUE)
{
igmp_check_router_port_timers (port);
}
if (igmp.port_table[port].host_enabled == TRUE)
{
igmp_check_host_port_timers (port);
}
}
/********************************************************************************************/
static void igmp_check_group_timers (UINT port)
{
if (igmp.port_table[port].router_enabled == TRUE)
{
igmp_check_router_group_timers (port);
}
if (igmp.port_table[port].host_enabled == TRUE)
{
igmp_check_host_group_timers (port);
}
}
/********************************************************************************************/
static void igmp_check_router_port_timers (UINT port)
{
if (igmp.port_table[port].router_enabled == TRUE)
{
igmp_increment_timer (&igmp.port_table[port].router_port.general_query_timer);
if (igmp_timer_has_expired (&igmp.port_table[port].router_port.general_query_timer))
{
igmp_initialize_timer (&igmp.port_table[port].router_port.general_query_timer);
if (igmp.port_table[port].router_port.initializing == TRUE)
{
++igmp.port_table[port].router_port.number_of_startup_queries_sent;
if (igmp.port_table[port].router_port.number_of_startup_queries_sent >= igmp.port_table[port].router_port.number_of_startup_queries_to_send)
{
igmp.port_table[port].router_port.initializing = FALSE;
}
}
igmp_process_router_port_state_transition (port, 0x00000000L, IGMP_ROUTER_PORT_GENERAL_QUERY_TIMER_EXPIRED_EVENT);
}
igmp_increment_timer (&igmp.port_table[port].router_port.other_querier_present_timer);
if (igmp_timer_has_expired (&igmp.port_table[port].router_port.other_querier_present_timer))
{
igmp_initialize_timer (&igmp.port_table[port].router_port.other_querier_present_timer);
igmp_process_router_port_state_transition (port, 0x00000000L, IGMP_ROUTER_PORT_OTHER_QUERIER_PRESENT_TIMER_EXPIRED_EVENT);
}
}
}
/********************************************************************************************/
static void igmp_check_router_group_timers (UINT port)
{
ULONG group_ip_address;
IGMP_GROUP_CLASS *sptr_matching_group_node;
if (igmp.port_table[port].router_enabled == TRUE)
{
for (sptr_matching_group_node = (IGMP_GROUP_CLASS *) get_pointer_to_first_entry_in_list ((LINK *) &igmp.port_table[port].active_group_list);
sptr_matching_group_node != NULL;
sptr_matching_group_node = (IGMP_GROUP_CLASS *) get_pointer_to_next_entry_in_list ((LINK *) &sptr_matching_group_node->links))
{
if (sptr_matching_group_node->enabled == TRUE)
{
group_ip_address = sptr_matching_group_node->multicast_group_ip_address;
igmp_increment_timer (&sptr_matching_group_node->router_group.group_specific_timer);
if (igmp_timer_has_expired (&sptr_matching_group_node->router_group.group_specific_timer))
{
igmp_initialize_timer (&sptr_matching_group_node->router_group.group_specific_timer);
igmp_process_router_group_state_transition (port, group_ip_address, IGMP_ROUTER_GROUP_SPECIFIC_TIMER_EXPIRED_EVENT);
}
igmp_increment_timer (&sptr_matching_group_node->router_group.retransmit_timer);
if (igmp_timer_has_expired (&sptr_matching_group_node->router_group.retransmit_timer))
{
igmp_initialize_timer (&sptr_matching_group_node->router_group.retransmit_timer);
igmp_process_router_group_state_transition (port, group_ip_address, IGMP_ROUTER_GROUP_RETRANSMIT_TIMER_EXPIRED_EVENT);
}
igmp_increment_timer (&sptr_matching_group_node->router_group.v1_host_timer);
if (igmp_timer_has_expired (&sptr_matching_group_node->router_group.v1_host_timer))
{
igmp_initialize_timer (&sptr_matching_group_node->router_group.v1_host_timer);
igmp_process_router_group_state_transition (port, group_ip_address, IGMP_ROUTER_GROUP_V1_HOST_TIMER_EXPIRED_EVENT);
}
}
}
}
}
/********************************************************************************************/
static void igmp_check_host_port_timers (UINT port)
{
if (igmp.port_table[port].host_enabled == TRUE)
{
if (igmp.port_table[port].host_port.v1_router_present == TRUE)
{
++igmp.port_table[port].host_port.v1_router_present_timer;
if (igmp.port_table[port].host_port.v1_router_present_timer >= IGMP_HOST_V1_ROUTER_PRESENT_TIMEOUT)
{
IGMP_PROTOCOL_TRACE (IGMP_TRACE, "IGMP Host: v1 router present timer expired on port %u.\n", port);
igmp.port_table[port].host_port.v1_router_present_timer = 0;
igmp.port_table[port].host_port.v1_router_present = FALSE;
}
}
}
}
/********************************************************************************************/
static void igmp_check_host_group_timers (UINT port)
{
ULONG group_ip_address;
IGMP_GROUP_CLASS *sptr_matching_group_node;
if (igmp.port_table[port].host_enabled == TRUE)
{
for (sptr_matching_group_node = (IGMP_GROUP_CLASS *) get_pointer_to_first_entry_in_list ((LINK *) &igmp.port_table[port].active_group_list);
sptr_matching_group_node != NULL;
sptr_matching_group_node = (IGMP_GROUP_CLASS *) get_pointer_to_next_entry_in_list ((LINK *) &sptr_matching_group_node->links))
{
if (sptr_matching_group_node->enabled == TRUE)
{
igmp_increment_timer (&sptr_matching_group_node->host_group.report_delay_timer);
if (igmp_timer_has_expired (&sptr_matching_group_node->host_group.report_delay_timer) &&
(sptr_matching_group_node->host_group.state == IGMP_HOST_GROUP_DELAYING_MEMBER_STATE))
{
group_ip_address = sptr_matching_group_node->multicast_group_ip_address;
igmp_process_host_group_state_transition (port, group_ip_address, IGMP_HOST_GROUP_REPORT_DELAY_TIMER_EXPIRED_EVENT);
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -