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

📄 igmp_router_state.c

📁 路由器协议平台igmp协议设计实现源码。
💻 C
📖 第 1 页 / 共 2 页
字号:

	mfapi_router_join_alert (IGMPv2, &source_group_pair, (USHORT) port, MFT_DYNAMIC);
}
/********************************************************************************************/
void igmp_router_notify_routing_of_group_deletion (UINT port, ULONG group_ip_address)
{
	char ip_address[IP_ADDRESS_PRINT_BUFFER_SIZE];
	MCAST_SOURCE_GROUP_PAIR source_group_pair;

	IGMP_PROTOCOL_ALARM_TRACE (IGMP_ALARM_TRACE, "IGMP Router: Notifying routing for deleting group %s on port %u.\n",
			convert_ip_address_to_dot_format (&ip_address[0], group_ip_address), port);

	source_group_pair.source_address = 0x00000000L;
	source_group_pair.group_address = group_ip_address;

	mfapi_router_prune_alert (IGMPv2, &source_group_pair, (USHORT) port, MFT_DYNAMIC);
}
/********************************************************************************************/
void igmp_router_start_group_specific_timer (UINT port, ULONG group_ip_address)
{
	char ip_address[IP_ADDRESS_PRINT_BUFFER_SIZE];
	IGMP_GROUP_CLASS *sptr_matching_group_node;
	UINT expiry_time;

	sptr_matching_group_node = igmp_get_matching_group_node_on_port (group_ip_address, port);

	if (sptr_matching_group_node == NULL)
		{
		IGMP_PROTOCOL_ALARM_TRACE (IGMP_ALARM_TRACE, "IGMP Router: Unable to locate group %s on port %u for starting group specific timer.\n",
				convert_ip_address_to_dot_format (&ip_address[0], group_ip_address), port);

		return;
		}

	IGMP_PROTOCOL_TRACE (IGMP_TRACE, "IGMP Router: Starting group specific timer for group %s on port %u.\n",
			convert_ip_address_to_dot_format (&ip_address[0], group_ip_address), port);

	expiry_time = ((igmp.port_table[port].robustness * igmp.port_table[port].router_port.general_query_interval) +
						igmp.port_table[port].router_port.general_query_max_response_time);

	igmp_enable_timer (&sptr_matching_group_node->router_group.group_specific_timer, expiry_time);
}
/********************************************************************************************/
void igmp_router_start_v1_host_timer (UINT port, ULONG group_ip_address)
{
	char ip_address[IP_ADDRESS_PRINT_BUFFER_SIZE];
	IGMP_GROUP_CLASS *sptr_matching_group_node;
	UINT expiry_time;

	sptr_matching_group_node = igmp_get_matching_group_node_on_port (group_ip_address, port);

	if (sptr_matching_group_node == NULL)
		{
		IGMP_PROTOCOL_ALARM_TRACE (IGMP_ALARM_TRACE, "IGMP Router: Unable to locate group %s on port %u for starting V1 host timer.\n",
				convert_ip_address_to_dot_format (&ip_address[0], group_ip_address), port);

		return;
		}

	IGMP_PROTOCOL_TRACE (IGMP_TRACE, "IGMP Router: Starting V1 host timer for group %s on port %u.\n",
			convert_ip_address_to_dot_format (&ip_address[0], group_ip_address), port);

	expiry_time = ((igmp.port_table[port].robustness * igmp.port_table[port].router_port.general_query_interval) +
						igmp.port_table[port].router_port.general_query_max_response_time);
		
	igmp_enable_timer (&sptr_matching_group_node->router_group.v1_host_timer, expiry_time);
}
/********************************************************************************************/
void igmp_router_start_star_timer (UINT port, ULONG group_ip_address)
{
	char ip_address[IP_ADDRESS_PRINT_BUFFER_SIZE];
	IGMP_GROUP_CLASS *sptr_matching_group_node;
	UINT expiry_time;

	sptr_matching_group_node = igmp_get_matching_group_node_on_port (group_ip_address, port);

	if (sptr_matching_group_node == NULL)
		{
		IGMP_PROTOCOL_ALARM_TRACE (IGMP_ALARM_TRACE, "IGMP Router: Unable to locate group %s on port %u for starting star timer.\n",
				convert_ip_address_to_dot_format (&ip_address[0], group_ip_address), port);

		return;
		}
		
	IGMP_PROTOCOL_TRACE (IGMP_TRACE, "IGMP Router: Starting star timer for group %s on port %u.\n",
			convert_ip_address_to_dot_format (&ip_address[0], group_ip_address), port);

	if (igmp.port_table[port].router_port.state == IGMP_ROUTER_PORT_QUERIER_STATE)
		{
		expiry_time = sptr_matching_group_node->router_group.group_specific_query_interval *
							sptr_matching_group_node->router_group.group_specific_query_count;
		}
	else
		{
		expiry_time = igmp.port_table[port].max_response_time_from_most_recent_query *
							sptr_matching_group_node->router_group.group_specific_query_count;
		}
		
	
	igmp_enable_timer (&sptr_matching_group_node->router_group.group_specific_timer, expiry_time);
}
/********************************************************************************************/
void igmp_router_start_retransmit_timer (UINT port, ULONG group_ip_address)
{
	char ip_address[IP_ADDRESS_PRINT_BUFFER_SIZE];
	IGMP_GROUP_CLASS *sptr_matching_group_node;

	sptr_matching_group_node = igmp_get_matching_group_node_on_port (group_ip_address, port);

	if (sptr_matching_group_node == NULL)
		{
		IGMP_PROTOCOL_ALARM_TRACE (IGMP_ALARM_TRACE, "IGMP Router: Unable to locate group %s on port %u for starting star timer.\n",
				convert_ip_address_to_dot_format (&ip_address[0], group_ip_address), port);

		return;
		}
		
	IGMP_PROTOCOL_TRACE (IGMP_TRACE, "IGMP Router: Starting retransmit timer for group %s on port %u.\n",
			convert_ip_address_to_dot_format (&ip_address[0], group_ip_address), port);
	
	igmp_enable_timer (&sptr_matching_group_node->router_group.retransmit_timer, sptr_matching_group_node->router_group.group_specific_query_interval);
}
/********************************************************************************************/
void igmp_router_clear_retransmit_timer (UINT port, ULONG group_ip_address)
{
	char ip_address[IP_ADDRESS_PRINT_BUFFER_SIZE];
	IGMP_GROUP_CLASS *sptr_matching_group_node;

	sptr_matching_group_node = igmp_get_matching_group_node_on_port (group_ip_address, port);

	if (sptr_matching_group_node == NULL)
		{
		IGMP_PROTOCOL_ALARM_TRACE (IGMP_ALARM_TRACE, "IGMP Router: Unable to locate group %s on port %u for clearing star timer.\n",
				convert_ip_address_to_dot_format (&ip_address[0], group_ip_address), port);

		return;
		}
		
	IGMP_PROTOCOL_TRACE (IGMP_TRACE, "IGMP Router: Clearing retransmit timer for group %s on port %u.\n",
			convert_ip_address_to_dot_format (&ip_address[0], group_ip_address), port);

	igmp_initialize_timer (&sptr_matching_group_node->router_group.retransmit_timer);
}
/********************************************************************************************/
void igmp_router_tx_message (UINT port, ULONG group_ip_address)
{
	igmp_transmit_message (port, group_ip_address, IGMP_MEMBERSHIP_QUERY, /*copy_to_router*/ FALSE, /*copy_to_host*/ TRUE);
}
/********************************************************************************************/
static void igmp_router_manage_group_timers_and_state (UINT port, enum IGMP_ROUTER_PORT_STATE old_state_of_port,
		enum IGMP_ROUTER_PORT_STATE new_state_of_port)
{
	char ip_address[IP_ADDRESS_PRINT_BUFFER_SIZE];
	IGMP_GROUP_CLASS *sptr_matching_group_node;
	ULONG group_ip_address;
	UINT expiry_time;

	if (old_state_of_port == new_state_of_port)
		{
		return;
		}
		
	IGMP_PROTOCOL_ALARM_TRACE (IGMP_ALARM_TRACE, "IGMP Router: Port %u changed state from %s to %s.\n", port,
		igmp_router_port_state_string [old_state_of_port],
		igmp_router_port_state_string [new_state_of_port]);

	if ((old_state_of_port == IGMP_ROUTER_PORT_QUERIER_STATE) && (new_state_of_port == IGMP_ROUTER_PORT_NON_QUERIER_STATE))
		{
		igmp_initialize_timer (&igmp.port_table[port].router_port.general_query_timer);

		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;

				switch (sptr_matching_group_node->router_group.state)
					{
					case IGMP_ROUTER_GROUP_V1_MEMBERS_PRESENT_STATE:
						IGMP_PROTOCOL_TRACE (IGMP_TRACE, "IGMP Router: Stopping V1 Host timer for group %s on port %u due to port state change.\n",
							convert_ip_address_to_dot_format (&ip_address[0], group_ip_address), port);

						igmp_initialize_timer (&sptr_matching_group_node->router_group.v1_host_timer);
						
						igmp_initialize_timer (&sptr_matching_group_node->router_group.group_specific_timer);
						
						break;
					case IGMP_ROUTER_GROUP_CHECKING_MEMBERSHIP_STATE:
						IGMP_PROTOCOL_TRACE (IGMP_TRACE, "IGMP Router: Stopping Retransmit timer for group %s on port %u due to port state change.\n",
							convert_ip_address_to_dot_format (&ip_address[0], group_ip_address), port);

						igmp_initialize_timer (&sptr_matching_group_node->router_group.retransmit_timer);

						break;
					case IGMP_ROUTER_GROUP_V2_MEMBERS_PRESENT_STATE:
						IGMP_PROTOCOL_TRACE (IGMP_TRACE, "IGMP Router: Changing state to V1_MEMBERS_PRESENT for group %s on port %u due to port state change.\n",
							convert_ip_address_to_dot_format (&ip_address[0], group_ip_address), port);

						sptr_matching_group_node->router_group.state = IGMP_ROUTER_GROUP_V1_MEMBERS_PRESENT_STATE;
						
						igmp_initialize_timer (&sptr_matching_group_node->router_group.group_specific_timer);
						
						break;
					default:
						IGMP_PROTOCOL_ALARM_TRACE (IGMP_ALARM_TRACE, "IGMP Router: Group %s in unknown state on port %u. No actions performed inspite of port state change.\n",
							convert_ip_address_to_dot_format (&ip_address[0], group_ip_address), port);

						break;
					}
				}
			}
		}
	else if ((new_state_of_port == IGMP_ROUTER_PORT_NON_QUERIER_STATE) && (old_state_of_port == IGMP_ROUTER_PORT_QUERIER_STATE))
		{
		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 == FALSE)
				{
				group_ip_address = sptr_matching_group_node->multicast_group_ip_address;

				switch (sptr_matching_group_node->router_group.state)
					{
					case IGMP_ROUTER_GROUP_V1_MEMBERS_PRESENT_STATE:
						IGMP_PROTOCOL_TRACE (IGMP_TRACE, "IGMP Router: Starting V1 Host timer for group %s on port %u due to port state change.\n",
							convert_ip_address_to_dot_format (&ip_address[0], group_ip_address), port);

						expiry_time = ((igmp.port_table[port].robustness *
							igmp.port_table[port].router_port.general_query_interval) + igmp.port_table[port].router_port.general_query_max_response_time);
			
						igmp_enable_timer (&sptr_matching_group_node->router_group.v1_host_timer, expiry_time);

						igmp_enable_timer (&sptr_matching_group_node->router_group.group_specific_timer, expiry_time);

						break;
					case IGMP_ROUTER_GROUP_CHECKING_MEMBERSHIP_STATE:
						IGMP_PROTOCOL_TRACE (IGMP_TRACE, "IGMP Router: Starting Retransmit timer for group %s on port %u due to port state change.\n",
							convert_ip_address_to_dot_format (&ip_address[0], group_ip_address), port);

						igmp_enable_timer (&sptr_matching_group_node->router_group.retransmit_timer, sptr_matching_group_node->router_group.group_specific_query_interval);

						break;
					default:
						IGMP_PROTOCOL_ALARM_TRACE (IGMP_ALARM_TRACE, "IGMP Router: Group %s in unknown state on port %u. No actions performed inspite of port state change.\n",
							convert_ip_address_to_dot_format (&ip_address[0], group_ip_address), port);

						break;
					}
				}
			}
		}
}
/********************************************************************************************/
static enum BOOLEAN igmp_router_port_state_is_valid (enum IGMP_ROUTER_PORT_STATE state)
{
	if ((state == IGMP_ROUTER_PORT_NON_QUERIER_STATE) || (state == IGMP_ROUTER_PORT_QUERIER_STATE))
		{
		return (TRUE);
		}

	return (FALSE);
}
/********************************************************************************************/
static enum BOOLEAN igmp_router_group_state_is_valid (enum IGMP_ROUTER_GROUP_STATE state)
{
	if ((state == IGMP_ROUTER_GROUP_NO_MEMBERS_PRESENT_STATE) ||
		(state == IGMP_ROUTER_GROUP_V1_MEMBERS_PRESENT_STATE) ||
		(state == IGMP_ROUTER_GROUP_V2_MEMBERS_PRESENT_STATE) ||
		(state == IGMP_ROUTER_GROUP_CHECKING_MEMBERSHIP_STATE))
		{
		return (TRUE);
		}

	return (FALSE);	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -