⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 igmp_timer.c

📁 路由器协议平台igmp协议设计实现源码。
💻 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 + -