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

📄 igmpcon_main.c

📁 igmp for switch in vxworks
💻 C
📖 第 1 页 / 共 5 页
字号:
int sendInfoMsgbyCmd (UCHAR slot, UCHAR onu, UCHAR onuPort, UCHAR cmd,
	UCHAR state, UCHAR preview, UINT group)
{
	ConMsg msg;
	int rev;

	msg.type = infomsg;
	msg.slot = slot;
	msg.group = group;
	msg.cmd = cmd;
	msg.onu = onu;
	msg.onuPort = onuPort;
	msg.preview = preview;
	msg.state = state;

	/*发送到消息队列 */
	rev =
		msgQSend (ConMsgQId, (char *) &msg, sizeof (msg), NO_WAIT,
		MSG_PRI_NORMAL);
	if (rev != OK)
	{
		if (bConDebug)
		{
			printf ("ERROR!!,Can't send to the msgQueue.\n");
		}
		return ERROR;
	}
	return rev;
}

/*************************************************
  Function:       ProcessConMsg
  Description:   process control msg
  Input:         	 msg
  Output:         无
  Return:          n/a
  Others:         // 其它说明
*************************************************/
void ProcessConMsg (ConMsg msg)
{

	switch (msg.type)
	{
		case infomsg:
			if (msg.onu < 1 || msg.slot < 1 || msg.slot > MAX_DOWN_SLOT)
				return;
			ProcessInfoMsg (msg);
			break;

		case Slothangemsg:
			ProcessSlotChangeMsg (msg);
			break;

		default:
			break;
	}
}

/*************************************************
  Function:       ConMain
  Description:   main function of igmp_control moudle
  Input:         	 none
  Output:          n/a
  Return:          n/a
  Others:         // 其它说明
*************************************************/
void ConMain (void)
{
	ConMsg Recmsg;
	char date[20];
	int sem;

	memset (&Recmsg, 0, sizeof (ConMsg));
	while (1)
	{
		if (msgQReceive (ConMsgQId, (char *) &Recmsg, sizeof (ConMsg),
				WAIT_FOREVER) == sizeof (ConMsg))
		{
			sem = semTake (semConinfo, 20);
			if (sem == ERROR && bConDebug)
			{
				printf ("\r\nsemTake(semConinfo, 1) error !,ConMain");
				return;
			}
			ProcessConMsg (Recmsg);
			sem = semGive (semConinfo);
			if (sem == ERROR)
			{
				printf ("\r\nsemGive(semConinfo) error !,ConMain");
				/*semMGiveForce (semConinfo); */
			}

		}
		else
		{
			if (bConDebug)
			{
				printf ("msgQReceive failed!\n");
			}
		}
	}
}

/*************************************************
  Function:       ConInit
  Description:   initial globle variables and struct data, start main task
  Input:         	 void
  Output:          n/a
  Return:          success 0, error -1;
  Others:         // 其它说明
*************************************************/
int ConInit (void)
{
	int mem;
	int slot, onu, port;
	char date[20];

	sprintf (date, "%s %s", __DATE__, __TIME__);
	set_version (1, 3, date);

	/*配置信息 */
	previewtime = 10;
	previewinterval = 30;
	previewcount = 4;
	previewresettime = 24;
	RecordIgnore = 0;
	RecordHolding = 60;			/*日志轮询时间(分钟) */

	memset (onulist, 0, sizeof (onulist));
	memset (portstatlist, 0, sizeof (portstatlist));
	for (slot = 1; slot <= MAX_DOWN_SLOT; slot++)
	{
		for (onu = 1; onu <= MaxOnu; onu++)
		{
			for (port = 1; port <= MaxOnuPort; port++)
			{
				portstatlist[slot][onu][port].gouplimit = 32;
				portstatlist[slot][onu][port].fast_leave_capability = 1;
				portstatlist[slot][onu][port].fast_leave_state = 1;
			}
		}
	}

	authlist = NULL;

	/*状态信息 */
	tConRecordTmer = 0;			/*日志查询时间定时器 */
	semConinfo = 0;
	semConauth = 0;
	semConLog = 0;
	semConStat = 0;

	ConMsgQId = 0;
	ConTaskId = 0;

	infolist = NULL;
	recordlist = NULL;
	groupstatlist = NULL;
	Totalgroup = 0;
	Totaluser = 0;
	Totalauthgroup = 0;
	recordcount = 0;
	groupstatcount = 0;

	semtakeerror = 0;

	MaxUpBandwidth = 0;			/*上传带宽上限 */
	CurrentUpBandwidth = 0;		/*当前总共上传带宽 */
	/*SetSlotType(); */
	/*SendCfg2allSlot (); */

	memset (sendpktcount, 0, sizeof (sendpktcount));

	semConauth = semMCreate (SEM_Q_PRIORITY);
	semConinfo = semMCreate (SEM_Q_PRIORITY);
	semConLog = semMCreate (SEM_Q_PRIORITY);
	semConStat = semMCreate (SEM_Q_PRIORITY);
	semBandwidth = semMCreate (SEM_Q_PRIORITY);

	/*创建消息队列 */
	ConMsgQId = msgQCreate (4096, sizeof (ConMsg), MSG_Q_FIFO);

	if (ConMsgQId == 0)
	{
		printf ("Create the message queue failure!\n");
		return ERROR;
	}

	/*启动日志轮询定时器 */
	StartRecordTimer ();

	/*转载命令 */
	/*ConCmd_install(); */

	/*启动主任务 */
	ConTaskId =
		taskSpawn ("IgmpCon", 76, 0, 2000000, (FUNCPTR) ConMain, 0, 0, 0, 0, 0,
		0, 0, 0, 0, 0);

	if (ConTaskId == ERROR)
	{
		printf ("IGMPCon Task Spawn ERROR!\n");
		ConTaskId = 0;
		return ERROR;
	}

	/*init igmp proxy module */
	IgmpInit ();

	/*读取保存配置 */
	/*cl_load_startup_config_igmp(); */
	cl_igmpcon_module_init ();

	return OK;
}

/*************************************************
  Function:       set_igmp_default
  Description:   set igmp state and configuration to default
  Input:         	 msg
  Output:         无
  Return:         success 0, error -1;
  Others:         // 其它说明
*************************************************/
int set_igmp_default (void)
{
	int mem;
	int slot, onu, port;
	int ret;

	set_igmp_proxy_default ();

	ret = del_all_igmp_profile ();
	if (ret != 0)
		return ret;

	/*配置信息 */
	previewtime = 10;
	previewinterval = 30;
	previewcount = 4;
	previewresettime = 24;
	RecordIgnore = 0;
	RecordHolding = 60;			/*日志轮询时间(分钟) */

	for (slot = 1; slot <= MAX_DOWN_SLOT; slot++)
	{
		for (onu = 1; onu <= MaxOnu; onu++)
		{
			for (port = 1; port <= MaxOnuPort; port++)
			{
				portstatlist[slot][onu][port].gouplimit = 32;
				portstatlist[slot][onu][port].control = 0;
				portstatlist[slot][onu][port].vlanpeer = 0;
				portstatlist[slot][onu][port].bandwidth = 0;
				portstatlist[slot][onu][port].tmpno = 0;
				portstatlist[slot][onu][port].fast_leave_capability = 1;
				portstatlist[slot][onu][port].fast_leave_state = 1;
			}
		}
	}

	authlist = NULL;

	MaxUpBandwidth = 0;			/*上传带宽上限 */
	CurrentUpBandwidth = 0;		/*当前总共上传带宽 */

	for (slot = 1; slot <= MAX_DOWN_SLOT; slot++)
		SendCfg2Slot (slot);
	return 0;
}

void typePkt (char *pkt, int len)
{
	int i;

	printf ("\r\n");
	for (i = 0; i < len; i++)
	{
		printf ("%02x-", *(pkt + i));
		if ((i > 0) && ((i + 1) % 4 == 0))
			printf ("|-");
		if ((i > 1) && ((i + 1) % 16 == 0))
			printf ("\n\r");
	}
	printf ("\r\n");
}

void typePkt1 (char *pkt, int len, int head, int step)
{
	int i;

	typePkt (pkt, head);

	i = head;
	while (i < len)
	{
		typePkt (pkt + i, step);
		i += step;
	}
}

/*************************************************
  Function:       RecConPktGsw
  Description:   receive control packet from downlink slot, make 
  			 them a msg send to msgQueue;
  Input:         	 short slot, char *ConPkt, USHORT usLength
  Output:         无
  Return:         success 0, error -1;
  Others:         // 其它说明
*************************************************/
int RecConPktGsw (short slot, char *ConPkt, USHORT usLength)
{
	ConMsg msg;
	UINT gip;
	int nReturnValue;
	char *ph, *p;
	int i, j;
	unsigned char onu, onuPort;

	if (bConDebug)
	{
		printf ("\n\rreceive from Slot %d:\r\n", slot);
		typePkt (ConPkt, usLength);
	}

	p = ConPkt;
	switch (*p)
	{
		case infomsg:
			{
				msg.type = infomsg;
				msg.slot = slot;
				p++;
				msg.onu = *p;
				p++;
				msg.onuPort = *p;
				p++;
				msg.cmd = *p;
				p++;
				msg.state = *p;
				p++;
				msg.preview = *p;
				p += 3;
				msg.group = *(UINT *) p;
			}
			break;

		case portcfgreturnmsg:
			onu = *(p + 1);
			onuPort = *(p + 2);
			if (!onu || !onuPort || onu > MaxOnu || onuPort > MaxOnuPort)
			{
				return ERROR;
			}
			portstatlist[slot][onu][onuPort].control = *(p + 3);
			portstatlist[slot][onu][onuPort].vlanpeer = *(p + 10);
			portstatlist[slot][onu][1].fast_leave_capability = *(p + 11);
			gPortCfgResponse = 1;
			break;

		default:
			break;
	}

	/*发送到消息队列 */
	nReturnValue =
		msgQSend (ConMsgQId, (char *) &msg, sizeof (msg), NO_WAIT,
		MSG_PRI_NORMAL);
	if (nReturnValue != OK)
	{
		if (bConDebug)
		{
			printf ("ERROR!!,Can't send to the msgQueue.\n");
		}
		return ERROR;
	}
	return nReturnValue;
}

/*	获取并设置各个线卡槽位的类型*/
int SetSlotType (void)
{
	UCHAR slot;
	UCHAR *p;
	int i;

/*	if (GetSlotType(&slot) != OK)*/
	if (0)
	{
		if (bConDebug)
		{
			printf ("Error!!,Can't get the LineCard type.\n");
		}
		return ERROR;
	}

	p = &slot;
	for (i = 1; i <= 16; i++);
	{
		aSlotType[i] = *p;
		p++;
	}

	return OK;
}

/*把配置发到指定的线卡盘*/
void SendCfg2Slot (UCHAR slot)
{
	int i, j, k;
	int end, start;

	if (SlotType (slot) == -1)
	{
		if (bConDebug)
		{
			printf ("It's not right slot, can't send control packets\r\n");
		}
		return;
	}

	SendCfgPkt (clearcfgmsg, slot, 0, 1, 1);
	SendCfgPkt (clearcfgmsg, slot, 1, 1, 1);
	SendCfgPkt (groupcfgmsg, slot, 1, 1, 0);
	/*send cross vlan msg */
	SendCfgPkt (zcrossvlanmsg, slot, 1, 1, 1);
	SendCfgPkt (igmpparametersmsg, slot, 1, 1, 1);

	for (i = 1; i <= MaxOnu; i++)
	{
		if (onulist[slot][i].type && onulist[slot][i].used)
		{
			if (onulist[slot][i].flag_ftth)
			{
				start = onulist[slot][i].igmp_port;
				end = start;
			}
			else
			{
				start = 1;
				end = onulist[slot][i].total_port;
			}
			for (k = start; k <= end; k++)
			{
				SendCfgPkt (port2groupmsg, slot, i, k, 1);
				SendCfgPkt (portcfgmsg, slot, i, k, 1);
			}
		}
	}
	sendQuery2Slot (slot);
	SendCfgPkt (igmpmodemsg, slot, 1, 1, 1);
}

void SendAuth2Slot (char slot)
{
	int i, j, k, start, end;

	if (SlotType (slot) == -1)
	{
		if (bConDebug)
		{
			printf ("It's not right slot, can't send control packets\r\n");
		}
		return;
	}

	SendCfgPkt (groupcfgmsg, slot, 1, 1, 0);

	for (i = 1; i <= MaxOnu; i++)
	{
		if (onulist[slot][i].type && onulist[slot][i].used)
		{
			if (onulist[slot][i].flag_ftth)
			{
				start = onulist[slot][i].igmp_port;
				end = start;
			}
			else
			{
				start = 1;
				end = onulist[slot][i].total_port;
			}
			for (k = start; k <= end; k++)
				SendCfgPkt (port2groupmsg, slot, i, k, 1);
		}
	}
}

/*************************************************
  Function:       dm_send_igmp
  Description:   send control packet by dm module, count the
  			send packet number, when reach 300 packets
  			per slot, wait 5 ticks
  Input:         	 char inter_slot, char *sendPkt, short len
  Output:         无
  Return:          n/a
  Others:         // 其它说明
*************************************************/
void dm_send_igmp (char inter_slot, char *sendPkt, short len)
{
	int ret;

	/*发送该包,底层提供接口函数 */
	if (sendpktcount[inter_slot] > 300)
	{
		taskDelay (5);
		sendpktcount[inter_slot] = 0;
	}
	dm_MakeCmdPkt_IGMP (inter_slot, 0x9001, (char *) sendPkt, len);
	sendpktcount[inter_slot]++;

	if (bConDebug)
	{
		printf ("\n\rSend to Slot %d: \r\n", inter_slot);
		typePkt (sendPkt, len);
	}
}

/*************************************************
  Function:       send_groupcfgmsg_06a
  Description:   in 06a system, the groupcfg packet may contain more than 255 groups,
  			 so we should splite the packet into serval packets.
  Input:         	 slot
  Output:         无
  Return:          success 0, error -1;
  Others:         // 其它说明
*************************************************/
int send_groupcfgmsg_06a (char islot)
{
	int size, count, pn, total_count;
	int max_packet_group;
	char *sendPkt, *p, *phead;
	GroupAuth *ptmp;
	short i, len;

	/* max groups per packet */
	max_packet_group = 200;

	/*calculate the packet number */
	pn = Totalauthgroup / max_packet_group + 1;
	if (Totalauthgroup > 0 && (Totalauthgroup % max_packet_group) == 0)
		pn--;

	size = 16 * Totalauthgroup + 4 * 100;
	sendPkt = (char *) malloc (size);
	p = sendPkt;
	if (NULL == sendPkt)
	{
		if (bConDebug)
		{
			printf ("Error, Can't send a cfgEnable Packet!!\n");
		}
		return ERROR;
	}

	ptmp = authlist;
	count = 0;
	total_count = 0;

	*p = groupcfgmsg;
	*(p + 1) = 0;
	*(p + 2) = pn;
	*(p + 3) = 1;

	while (ptmp)
	{
		if (total_count % max_packet_group == 0)
		{
			phead = p;
			p = p + 4;
		}
		*(UINT *) p = ptmp->groupaddress;
		p = p + 4;
		*p = ptmp->preCount;
		p = p + 1;
		*p = ptmp->preTime;
		p = p + 1;
		*p = ptmp->preInterval;
		p = p + 1;
		*p = ptmp->preReset;
		p = p + 1;
		*p = ptmp->pretotaltime;
		p = p + 4;
		*(USHORT *) p = ptmp->vlanid;
		p += 2;
		*(USHORT *) p = ptmp->bandwidth;
		p += 2;

⌨️ 快捷键说明

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