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

📄 igmp_router.cpp

📁 igmp for switch in vxworks
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		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 + -