📄 igmp_router.cpp
字号:
IgmpGroup->tGroupPortV2MembershipTimer[usPort] = 0;
IgmpGroup->tHostReportDelayTimer = 0;
//if (IgmpGroup->tHostReportDelayTimer != 0)
//{
//StopHostReportDelayTimer (IgmpGroup->tHostReportDelayTimer);
// IgmpGroup->tHostReportDelayTimer = 0;
//}
IgmpGroup->eGroupPortStatus[usPort] = NoMembersPresent;
IgmpGroup->usGroupUserNumber--;
usCurrentUser--;
if (IgmpGroup->usGroupUserNumber == 0) /*该组播组没有成员了 */
{
SpecificGroupSendLeaveGroup (IgmpGroup->unGroupAddress);
DeleteSpecificIgmpGroup (IgmpGroup);
}
}
else /*不允许快速离开 */
{
IgmpGroup->ucGroupPortLastMemberQueryCount[usPort] = 0;
StartGroupPortLastMemberQueryTimer (IgmpGroup, usPort);
IgmpGroup->eGroupPortStatus[usPort] = CheckingMembership;
RouterSendGroupSpecificQuery (IgmpGroup->unGroupAddress,
usLastMemberQueryInterval, usPort);
}
semGive (semIgmpDelete); /*解除保护 */
}
/***************************************************
函数名称:DeletePortFromSpecificGroupByConsole
函数功能:通过网管命令将端口从指定组播组中删除
输入参数:IgmpGroup 指向组播组的指针
usPort 指定的端口
返回值: 无
***************************************************/
void DeletePortFromSpecificGroupByConsole (GroupEntity * IgmpGroup,
USHORT usPort)
{
if (semIgmpDelete == NULL)
{
return;
}
semTake (semIgmpDelete, WAIT_FOREVER);
if (IgmpGroup->eGroupPortStatus[usPort] == NoMembersPresent)
{
semGive (semIgmpDelete);
return;
}
DelPortFromGroup1 (IgmpGroup->unGroupAddress, usPort); /*由底层提供的接口函数 */
//StopGroupPortV2MembershipTimer (IgmpGroup-> tGroupPortV2MembershipTimer[usPort]);
IgmpGroup->eGroupPortStatus[usPort] = NoMembersPresent;
DelPortFromSearchGroup (IgmpGroup, usPort);
IgmpGroup->tGroupPortV2MembershipTimer[usPort] = 0;
IgmpGroup->tHostReportDelayTimer = 0;
IgmpGroup->tGroupPortLastMemberQueryTimer[usPort] = 0;
IgmpGroup->ucGroupPortLastMemberQueryCount[usPort] = 0;
IgmpGroup->tGroupPortV1HostTimer[usPort] = 0;
IgmpGroup->usGroupUserNumber--;
usCurrentUser--;
if (IgmpGroup->usGroupUserNumber == 0) /*该端口没有成员了 */
{
SpecificGroupSendLeaveGroup (IgmpGroup->unGroupAddress);
DeleteSpecificIgmpGroup (IgmpGroup);
}
semGive (semIgmpDelete);
}
/***************************************************
函数名称:FindPortInSpecificGroup
函数功能:在指定的组播组中查找端口
输入参数:IgmpGroup 指向组播组的指针
usPort 指定的端口
返回值: TRUE 表示找到
FALSE 表示未找到
***************************************************/
BOOL FindPortInSpecificGroup (GroupEntity * IgmpGroup, USHORT usPort)
{
if (IgmpGroup->eGroupPortStatus[usPort] == NoMembersPresent)
{
if (0)
{
if ((IgmpGroup->tGroupPortV2MembershipTimer[usPort] != 0) ||
(IgmpGroup->tGroupPortV1HostTimer[usPort] != 0) ||
(IgmpGroup->tGroupPortLastMemberQueryTimer[usPort] != 0))
{
printf ("Find ERROR:port NOT found but timer exist!\n");
}
if (FindPortInGroup (IgmpGroup->unGroupAddress, usPort))
{
printf ("Find ERROR:port NOT found but Microcode found!\n");
}
}
return FALSE;
}
else
{
if (bIgmpDebug)
{
if ((IgmpGroup->tGroupPortV2MembershipTimer[usPort] == 0) &&
(IgmpGroup->tGroupPortV1HostTimer[usPort] == 0) &&
(IgmpGroup->tGroupPortLastMemberQueryTimer[usPort] == 0))
{
printf ("Find ERROR:port found but timer NOT exist!\n");
}
if (!FindPortInGroup (IgmpGroup->unGroupAddress, usPort))
{
printf ("Find ERROR:port found but Microcode NOT found!\n");
}
}
return TRUE;
}
}
void DeleteProxyGroup (UINT groupaddress)
{
GroupEntity *ptmp;
ptmp = FindIgmpGroupByAddress (groupaddress);
if (NULL == ptmp)
return;
DeleteSpecificIgmpGroup (ptmp);
return;
}
/***************************************************
函数名称:FindPortInSpecificGroup
函数功能:根据组地址查找组播组是否存在
输入参数:unGroupAddress 组播组地址
返回值: 非0 表示指向组播组的指针(找到)
0 表示未找到
***************************************************/
GroupEntity *FindIgmpGroupByAddress (UINT unGroupAddress)
{
GroupEntity *pTemp;
if (pGroupEntityList == NULL)
{
return NULL;
}
pTemp = pGroupEntityList;
while (pTemp)
{
if (pTemp->unGroupAddress == unGroupAddress)
{
return pTemp;
}
pTemp = pTemp->pNext;
}
return NULL;
}
/***************************************************
函数名称:FindPort
函数功能:查找指定端口是否是组成员
输入参数:usPort 端口号
返回值: 非0 表示指向组播组的指针(找到)
0 表示未找到
***************************************************/
GroupEntity *FindPort (USHORT usPort)
{
GroupEntity *pTemp = pGroupEntityList;
while (pTemp)
{
if (FindPortInSpecificGroup (pTemp, usPort))
{
return pTemp;
}
else
{
pTemp = pTemp->pNext;
}
}
return NULL;
}
/***************************************************
函数名称:DeleteSpecificIgmpGroup
函数功能:删除指定的组播组
输入参数:IgmpGroup 指向组播组的指针
返回值: 无
***************************************************/
void DeleteSpecificIgmpGroup (GroupEntity * IgmpGroup)
{
USHORT i;
semTake (semIgmpDelete, WAIT_FOREVER); /*信号量保护 */
DelGroup (IgmpGroup->unGroupAddress); /*通知底层 */
DeleteGroupFromList (IgmpGroup);
semGive (semIgmpDelete); /*信号量保护 */
}
/***************************************************
函数名称:AddNewIgmpGroup
函数功能:在组播表中添加新的组播组
输入参数:unGroupAddress 组播组地址
返回值: 非0 表示指向组播组的指针(成功)
0 表示失败
***************************************************/
GroupEntity *AddNewIgmpGroup (UINT unGroupAddress)
{
GroupEntity *IgmpGroup;
int i;
semTake (semIgmpDelete, WAIT_FOREVER); /*信号量保护 */
IgmpGroup = (GroupEntity *) malloc (sizeof (GroupEntity));
/*IgmpGroup = (GroupEntity *) CustomMalloc (sizeof (GroupEntity)); */
if (IgmpGroup == NULL)
{
printf ("IGMP CustomMalloc FAIL!\n");
semGive (semIgmpDelete); /*信号量保护 */
return NULL;
}
else
{
ulCustomMemoryUsed++;
}
memset (IgmpGroup, 0, sizeof (GroupEntity));
IgmpGroup->unGroupAddress = unGroupAddress;
for (i = 1; i <= MAX_UPLINK_PORT; i++)
{
if (slot_module[i] == HOST_MODULE_PORT)
{
IgmpGroup->bHostLastMemberFlag[i] = TRUE;
}
}
IgmpGroup->usGroupUserNumber = 1;
IgmpGroup->bGroupV1HostPresentFlag = FALSE;
IgmpGroup->eHostStatus = DelayingMember;
IgmpGroup->pNext = NULL;
IgmpGroup->pNode = NULL;
IgmpGroup->OutVlanTag = GetGroupVlan (unGroupAddress); /*edit by aibin 20080404 */
AddGroupToGroupList (IgmpGroup);
/*printf("AddGroup:0x%x\n",unGroupAddress); */
AddGroup (unGroupAddress); /*通知底层 */
usCurrentGroup++;
/*pSearchGroup = (SearchGroup *) malloc (sizeof(struct search_group));
pSearchGroup->IgmpGroup = IgmpGroup;
pSearchGroup->pNext = NULL;
pSearchGroup->pNode = NULL;
if(pSearchGroupList == NULL)
{
pSearchGroupList = pSearchGroup;
}
else
{
pSearchGroup->pNext = pSearchGroupList;
pSearchGroupList = pSearchGroup;
} */
/*printf("Group++\n"); */
semGive (semIgmpDelete); /*信号量保护 */
return IgmpGroup;
}
/***************************************************
函数名称:AddGroupToGroupList
函数功能:将指定的组播组加入组播表
输入参数:IgmpGroup 指向组播组的指针
返回值: 无
***************************************************/
void AddGroupToGroupList (GroupEntity * IgmpGroup)
{
/*GroupEntity *pTemp; */
if (pGroupEntityList == NULL)
{
pGroupEntityList = IgmpGroup;
}
else
{
IgmpGroup->pNext = pGroupEntityList;
pGroupEntityList = IgmpGroup;
}
}
/***************************************************
函数名称:DeleteGroupFromList
函数功能:将指定的组播组从组播表中删除
输入参数:IgmpGroup 指向组播组的指针
返回值: 无
***************************************************/
void DeleteGroupFromList (GroupEntity * IgmpGroup)
{
GroupEntity *pTemp;
pTemp = pGroupEntityList;
if ((IgmpGroup == NULL) || (pTemp == NULL))
{
if (bIgmpDebug)
{
printf ("DeleteGroupFromList ERROR : pGroupEntityList is NULL!\n");
}
return;
}
if (pTemp == IgmpGroup)
{
pGroupEntityList = pTemp->pNext;
bzero ((char *) IgmpGroup, sizeof (GroupEntity));
free (IgmpGroup);
/*CustomFree ((void *)IgmpGroup); */
IgmpGroup = NULL;
usCurrentGroup--;
ulCustomMemoryUsed--;
return;
}
while (pTemp->pNext)
{
if (pTemp->pNext == IgmpGroup)
{
pTemp->pNext = IgmpGroup->pNext;
bzero ((char *) IgmpGroup, sizeof (GroupEntity));
free (IgmpGroup);
/*CustomFree ((void *)IgmpGroup); */
IgmpGroup = NULL;
usCurrentGroup--;
ulCustomMemoryUsed--;
return;
}
else
{
pTemp = pTemp->pNext;
}
}
if (bIgmpDebug)
{
printf ("删除组播组错误 :组播组不存在!\n");
}
}
/***************************************************
函数名称:RouterProcessStartupQueryTimeOutEvent
函数功能:处理StartupQuery定时器超时事件
输入参数:无
返回值: 无
***************************************************/
void RouterProcessStartupQueryTimeOutEvent ()
{
ucCurrentStartupQueryCount++;
if (bIgmpDebug)
{
if (tGeneralQueryTimer != 0)
{
printf ("StartupQueryTimeOut ERROR:GeneralQueryTimer Exist! \n ");
return;
}
}
/*printf("处理初始查询超时事件\n"); */
if (ucCurrentStartupQueryCount >= ucStartupQueryCount)
{
/*printf("启动普通查询定时器\n"); */
if (tGeneralQueryTimer != 0) /*mod by aibin 2005-01-21 */
{
unGeneralQueryTimerCount = 0;
}
else
{
StartGeneralQueryTimer ();
}
tStartupQueryTimer = 0;
}
else
{
/*printf("启动初始查询定时器\n"); */
StartStartupQueryTimer ();
}
RouterSendGenernalQueryToAllPort ();
}
/***************************************************
函数名称:RouterProcessGroupPortV1HostTimeOutEvent
函数功能:处理GroupPortV1Host定时器超时事件
输入参数:IgmpGroup 指向组播组的指针
usPort 端口号
返回值: 无
***************************************************/
void RouterProcessGroupPortV1HostTimeOutEvent (GroupEntity * IgmpGroup,
USHORT usPort)
{
if (!FindIgmpGroupFromList (IgmpGroup))
{
if (bIgmpDebug)
{
printf ("GroupV1HostPresentTimeOut ERROR:Group Not Found!\n");
}
return;
}
if (IgmpGroup->eGroupPortStatus[usPort] != V1MembersPresent)
{
if (bIgmpDebug)
{
printf ("GroupV1HostPresentTimeOut ERROR: GS = %d\n",
IgmpGroup->eGroupPortStatus[usPort]);
}
}
IgmpGroup->eGroupPortStatus[usPort] = MembersPresent;
IgmpGroup->tGroupPortV1HostTimer[usPort] = 0;
}
/***************************************************
函数名称:RouterProcessGroupPortLastMemberQueryTimeOutEvent
函数功能:处理GroupPortLastMemberQuery定时器超时事件
输入参数:IgmpGroup 指向组播组的指针
usPort 端口号
返回值: 无
***************************************************/
void RouterProcessGroupPortLastMemberQueryTimeOutEvent (GroupEntity * IgmpGroup,
USHORT usPort)
{
if (!FindIgmpGroupFromList (IgmpGroup))
{
if (bIgmpDebug)
{
printf ("PortV2MembershipTimeOut ERROR:Group Not Found!\n");
}
return;
}
IgmpGroup->ucGroupPortLastMemberQueryCount[usPort]++;
if (IgmpGroup->ucGroupPortLastMemberQueryCount[usPort] >=
ucLastMemberQueryCount)
{
DelPortFromGroup1 (IgmpGroup->unGroupAddress, usPort); /*删底层表中的端口信息 */
IgmpGroup->tGroupPortV1HostTimer[usPort] = 0;
IgmpGroup->tHostReportDelayTimer = 0;
IgmpGroup->tGroupPortV2MembershipTimer[usPort] = 0;
IgmpGroup->eGroupPortStatus[usPort] = NoMembersPresent;
DelPortFromSearchGroup (IgmpGroup, usPort);
IgmpGroup->usGroupUserNumber--;
usCurrentUser--;
if (IgmpGroup->usGroupUserNumber == 0)
{
DelGroup (IgmpGroup->unGroupAddress); /*删除底层表中的组信息 */
SpecificGroupSendLeaveGroup (IgmpGroup->unGroupAddress);
IgmpGroup->tGroupV1HostPresentTimer = 0;
IgmpGroup->unGroupAddress = 0;
}
}
else
{
RouterSendGroupSpecificQuery (IgmpGroup->unGroupAddress,
usLastMemberQueryInterval, usPort);
/*此处的间隔有问题 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -