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

📄 igmp_router.cpp~

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

		/*此处的间隔有问题*/
		IgmpGroup->tGroupPortLastMemberQueryTimer[usPort] = usLastMemberQueryInterval * TIMER_RATE;
		
	}
}

⌨️ 快捷键说明

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