📄 igmp_router_state.c
字号:
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 + -