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

📄 igmp_cli.c

📁 igmp for switch in vxworks
💻 C
📖 第 1 页 / 共 3 页
字号:
			}
			else
			{
				VlanTag.TagProtocolType = htons (0x8100);
				VlanTag.VlanID = htons (OutVlanTag);
				memcpy (IgmpPkt + 12, &VlanTag, sizeof (vlantag));
				*(USHORT *) (IgmpPkt + 16) = ntohs (0x0800);
				memcpy (IgmpPkt + 18, &IpHeaderWithOption,
					sizeof (IpHeaderWithOption));
				memcpy (IgmpPkt + 18 + sizeof (IpHeaderWithOption), &IgmpHeader,
					sizeof (igmpheader));
			}
			break;
		case IGMPLeaveGroup:

			DestinationIpAddress = 0xe0000002; 
			/*DestinationIpAddress = unGroupAddress;*/
			/*IpAddress.s_addr = ntohl (DestinationIpAddress);aibin for test 2005-04-2*/
			IgmpEtherMapIpMulticast (ntohl (DestinationIpAddress),
				DestinationMacAddress);
			memcpy (IgmpPkt, DestinationMacAddress, 6);	/*目的Mac */
			memcpy (IgmpPkt + 6, smac, 6);	/*源Mac */
			IpHeaderWithOption.version = 4;
			IpHeaderWithOption.headerlength = 6;
			IpHeaderWithOption.tos = 0;
			IpHeaderWithOption.total_len = htons (0x0020);
			srand (tickGet ());
			IpHeaderWithOption.id = (USHORT)rand ();
			IpHeaderWithOption.frag_off = 0;
			IpHeaderWithOption.ttl = 1;
			IpHeaderWithOption.protocol = 2;
			IpHeaderWithOption.checksum = 0;
			IpHeaderWithOption.saddr = htonl (sourceip);
			IpHeaderWithOption.daddr = ntohl (DestinationIpAddress);
			IpHeaderWithOption.option = htonl (0x94040000);
			CaculateChecksum ((UCHAR *) & IpHeaderWithOption,
				sizeof (IpHeaderWithOption), 10);
			IgmpHeader.ucType = ucIgmpType;
			IgmpHeader.ucMaxRespTime = 0;
			IgmpHeader.usChecksum = 0;
			IgmpHeader.unGroupAddress = htonl (unGroupAddress);
			CaculateChecksum ((UCHAR *) & IgmpHeader, sizeof (igmpheader), 2);
			/*IgmpHeader.usChecksum =  nos_in_cksum ((UCHAR *) & IgmpHeader, 8);*/
			IgmpGroup = FindIgmpGroupByAddress (unGroupAddress);
			
			/*OutVlanTag = IgmpGroup->OutVlanTag;aibin*/
			if (1)
			
			{
				*(USHORT *) (IgmpPkt + 12) = ntohs (0x0800);
				memcpy (IgmpPkt + 14, &IpHeaderWithOption,
					sizeof (IpHeaderWithOption));
				memcpy (IgmpPkt + 14 + sizeof (IpHeaderWithOption), &IgmpHeader,
					sizeof (igmpheader));
			}
			break;
		default:
			break;
	}

	/*如果是225.0.0.2,带tag100
	if (unGroupAddress == 0xe1000002)
	{
		memset (temp, 0, sizeof (temp));
		memcpy (temp, IgmpPkt+6, 62);
	}
*/
	/*memcpy (IgmpPkt +14 + sizeof (ipheader) + sizeof (igmpheader), user, 1);*/
	memset (IgmpPkt + 46, user, 1);
	vid = GetGroupVlan(unGroupAddress);
	IgmpReceive(usPort, (char *) IgmpPkt, 68, vid);
}

void jointest (int number, int count)
{
	int i, j;
	
	for (j = 0; j < count; j ++)
	{
		for (i = 0; i < number; i ++)
		{
			SendIgmpPktbyCmd(22, i+0xe1000001+1000*j, 0x0a190001, 2, 2);
		}
		for (i = 0; i < number; i ++)
		{
			SendIgmpPktbyCmd(23, i+0xe1000001+1000*j, 0x0a190001, 2, 2);
		}
	}
}

void ShowRunPrejoin (struct vty *vty)
{
	PreJoinNode *ptmp;
	UINT add[300];
	UINT first, last;
	int i,j,count;
	struct in_addr gip1, gip2;
	char ip[20], ip2[20];

	memset (add, 0, sizeof(add));
	
	ptmp = pPreJoinList;
	while (ptmp)
	{
		InsertNodebySeq(300, ptmp->unGroupAddress, add);
		ptmp = ptmp->pNext;
	}

	i = 0; 
	while (add[i] && i <300)
	{
		first = add[i];
		for (; add[i+1]-add[i] == 1; i ++);
		last = add[i];
		gip1.s_addr = first;
		gip2.s_addr = last;
		inet_ntoa_b(gip1,ip);
		inet_ntoa_b(gip2,ip2);
		if (first == last)
		{
			vty_out (vty, "set igmp prejoin %s\r\n", ip);
		}
		else
		{
			vty_out (vty,  "set igmp prejoin %s-%s\r\n", ip, ip2);
		}
		i++;
	}
}

void ShowRunCascadePort (struct vty *vty)
{
	char *p, portlist[50];
	char temp[10];
	int i, j, k;
	int start, end, last;
	char uplink[10];
	
	for (i = MAX_UPLINK_PORT; i >= MIN_UPLINK_PORT; i--)
	{
		if (slot_module[i] == ROUTER_MODULE_PORT)
		{
			last = i;
			i = MAX_UPLINK_PORT;
			break;
		}
		else
		{
			continue;
		}
	}

	if(i != MAX_UPLINK_PORT)
	{
		return;
	}

	memset (portlist, 0, sizeof (portlist));
	i = MIN_UPLINK_PORT;
	start = 0;
	while (i <= MAX_UPLINK_PORT)
	{
		if (slot_module[i] == ROUTER_MODULE_PORT)
		{
			translate_uplinkport_out(i,uplink);
			if (start == 0)
			{
				sprintf (temp, "%s", uplink);
				start = 1;
			}
			else
			{
				sprintf (temp, ",%s", uplink);
			}
		}
		strcat (portlist, temp);
		memset (temp, 0, sizeof (temp));
		i++;
	}
	vty_out (vty, "set igmp cascade port %s\r\n", portlist);
}

void ShowRunIgmpProxy(struct vty *vty)
{
	struct in_addr gip;
	char ip[20];

	/*预加入*/
	ShowRunPrejoin(vty);

	/*ip*/
	if(gEtherInfo.ipAddr != 0x0a190e39)
	{
		gip.s_addr = gEtherInfo.ipAddr;
		inet_ntoa_b(gip, ip);
		vty_out (vty, "set igmp proxy ip %s\r\n",ip);
	}
	ShowRunCascadePort (vty);

	if (bEnableInstantLeave == TRUE)
	{
		vty_out (vty, "set instant leave enable\r\n");
	}
	else
	{
		vty_out (vty, "set instant leave disable\r\n");
	}
}

void sendQuery2Slot(char slot)
{
	SendIgmpPkt(0x11, 0xe0000001, slot, 100);
}

int GetUplinkPortlist (char *str, UINT groupaddress)
{
	char port[MAX_UPLINK_PORT+1];
	char temp[MAX_UPLINK_PORT+1];
	int i, j, count;
	GroupEntity *ptmp;
	int flag = 0;
	char uplink[10];

	memset (port, 0, sizeof (port));
	ptmp = pGroupEntityList;
	while (ptmp)
	{
		if (ptmp->unGroupAddress == groupaddress)
		{
			flag = 1;
			for (i = MIN_UPLINK_PORT; i <= MAX_UPLINK_PORT; i++)
			port[i] = ptmp->eGroupPortStatus[i];
		}
		ptmp = ptmp->pNext;
	}

	if (!flag)
	return 0;

	count = 0;
	for (i = MIN_UPLINK_PORT; i <MAX_UPLINK_PORT; i ++)
	{
		memset (temp, 0, sizeof (temp));
		if (port[i])
		{
			count ++;
			translate_uplinkport_out (i, uplink);
			sprintf (temp, "%s", uplink);
			strncat (str, temp, strlen(temp));
		}
	}
	return count;
}

int ActiveGroupExist (void)
{
	if(pGroupEntityList)
	return 1;
	else
	return 0;
}

int get_igmpProxyIpaddress(void)
{
	return gEtherInfo.ipAddr;
}

int set_igmpProxyIpaddress(unsigned int ounProxyIpaddress)
{
	gEtherInfo.ipAddr = ounProxyIpaddress;
	return OK;
}

int set_DefaultigmpProxyIpaddress()
{
	gEtherInfo.ipAddr = 0x0a190e39;
	return OK;
}

void gz_test_clear (void)
{
	int i, j;

	memset (GZ_add, 0, sizeof(GZ_add));
}


void gz_test_show (void)
{
	int i, j;
	int count;
	int pc;

	count = 0;
	for (i = 0; i < MaxGroup; i++)
	{
		if (GZ_add[i].groupaddress)
			count++;
	}
	printf ("\r\nTotal Group: %d\r\n", count);

	count = 0;
	for (i = 0; i < MaxGroup; i++)
	{
		if (GZ_add[i].groupaddress)
		{
			count++;
			printf ("%d. 0x%x: %d %d\r\n", count, GZ_add[i].groupaddress, GZ_add[i].outvlan, GZ_add[i].tag);
		}
	}
}

DEFUN (set_cascade_func, set_cascade_cmd,
	"set igmp cascade port [<portlist>|none]",
	"Configure system services.\n" "Configure igmp services\n" "Configure igmp cascade port.\n" "set cascade ports.\n"
	"Input portlist.\n" "Set all ports to be IGMP uplink port.\r\n")
{
	int i, count= 0;
	char *portlist, port, slot, uplinkport;
	int  portno;
	char temp[MAX_UPLINK_PORT+1];
	GroupEntity *ptmp;
	char up[31];

	memset (temp, ROUTER_MODULE_PORT, sizeof(temp));
	for (i = MIN_UPLINK_PORT; i <= MAX_UPLINK_PORT; i++)
	temp[i] = HOST_MODULE_PORT;

	if (strcmp ("none", argv[0]) == 0)
	{
		/*如果输入"none",直接跳到最后*/
	}
	else
	{
		portlist = argv[0];
		if (get_uplinkport_by_list (portlist, up) <0)
		{
				vty_out(vty,"invalid portlist:%s\r\n", portlist);
				return ERROR;
		}	

		for (i = MIN_UPLINK_PORT; i <= MAX_UPLINK_PORT; i++)
		{
			if (up[i])
			temp[i] = ROUTER_MODULE_PORT;
		}
		
		/*不能全部配成级联口*/
		for (i = 1;  i <= MAX_UPLINK_PORT; i++)
		{
			count = count + temp[i];
		}
		if (!count)
		{
			vty_out(vty,"Can't set all ports to be cascaded\r\n");
			return ERROR;
		}
		
	}

	/*由级联口变为上联口时,必须离开原所在的所有组*/
	semTake (semIgmpDelete, WAIT_FOREVER);
	ptmp = pGroupEntityList;
	while (ptmp)
	{
		for (i = MIN_UPLINK_PORT; i <= MAX_UPLINK_PORT; i++)
		{
			if (temp[i] == HOST_MODULE_PORT && ptmp->eGroupPortStatus[i]!= NoMembersPresent)
			SendIgmpPktbyCmd(23, ptmp->unGroupAddress, 0x123, i, 1);
		}
		ptmp = ptmp->pNext;
	}
	semGive(semIgmpDelete);
	memcpy (slot_module, temp, sizeof(temp));
 	return OK;
}


int del_all_cascade_port (void)
{
	int i, count= 0;
	char *portlist, port, slot, uplinkport;
	int  portno;
	char temp[MAX_UPLINK_PORT+1];
	GroupEntity *ptmp;

	memset (temp, ROUTER_MODULE_PORT, sizeof(temp));
	for (i = MIN_UPLINK_PORT; i <= MAX_UPLINK_PORT; i++)
	temp[i] = HOST_MODULE_PORT;

	/*由级联口变为上联口时,必须离开原所在的所有组*/
	semTake (semIgmpDelete, WAIT_FOREVER);
	ptmp = pGroupEntityList;
	while (ptmp)
	{
		for (i = MIN_UPLINK_PORT; i <= MAX_UPLINK_PORT; i++)
		{
			if (temp[i] == HOST_MODULE_PORT && ptmp->eGroupPortStatus[i]!= NoMembersPresent)
			SendIgmpPktbyCmd(23, ptmp->unGroupAddress, 0x123, i, 1);
		}
		ptmp = ptmp->pNext;
	}
	semGive(semIgmpDelete);
	memcpy (slot_module, temp, sizeof(temp));
 	return OK;
}


int del_all_online_group (void)
{
	int i, count= 0;
	GroupEntity *ptmp;

	semTake (semIgmpDelete, WAIT_FOREVER);
	ptmp = pGroupEntityList;
	while (ptmp)
	{
		for (i = 1; i <= MAX_UPLINK_PORT; i++)
		{
			if (ptmp->eGroupPortStatus[i]!= NoMembersPresent)
			SendIgmpPktbyCmd(23, ptmp->unGroupAddress, 0x123, i, 1);
		}
		ptmp = ptmp->pNext;
	}
	semGive(semIgmpDelete);
	return OK;
}


extern BOOL bConDebug;

#if 0
void sendSlotProxyEnable (char slot, char state)
{
	char sendPkt[4] = {0,0,0,0};

	sendPkt [0] = 11; /*ec2proxyswitchmsg*/
	sendPkt[1] = state;
	
	dm_MakeCmdPkt_IGMP (slot, 0x9001, (char *) sendPkt, 4);
	if (bConDebug && slot == 1)
	typePkt (sendPkt, 4);
}

DEFUN (start_igmpproxy_func, start_igmpproxy_cmd,
	"set igmp proxy {[gsw] [enable|disable]}*1 {[ec2] [proxy|control|disable]}*1  ",
	"Configure system services.\n" "Configure igmp status.\n"
	"Configure igmp proxy status.\n" "Configure gsw igmp.\n"
	"Set gsw igmp proxy enable.\n" "Set gsw igmp proxy disable.\n"  "Configure ec2 igmp.\n"
	"Set ec2 igmp proxy mode.\n" "Set ec2 igmp control mode.\n" "Set ec2 igmp proxy disable.\n")
{
	int i, slot, state;
	char *p;
	
	for (i = 0; i < argc; i += 2)
	{
		if (strcmp (argv[i], "gsw") == 0)
		{
			start_igmp_proxy(argv[i+1], vty);
		}

		if (strcmp (argv[i], "ec2") == 0)
		{
			if (strcmp (argv[i+1], "proxy") == 0)
			{
				gEc2IGMPProxyEnable = 1;
			}
			else if (strcmp (argv[i+1], "control") == 0)
			{
				gEc2IGMPProxyEnable = 2;
			}
			else if (strcmp (argv[i+1], "disable") == 0)
			{
				gEc2IGMPProxyEnable = 0;
			}			
			else
			return -1;
		
			for (slot = 1; slot <= 16; slot++)
			sendSlotProxyEnable (slot, gEc2IGMPProxyEnable);
		}
	}
}
#endif

DEFUN (show_igmpgroup_func,show_igmpgroup_cmd,
            "show igmp proxy group {<A.B.C.D>}*1",
            "Show system services.\n"
            "Show igmp information.\n" "Show igmp proxy information.\n"
            "Show igmp proxy group infrormation.\n" "Input the group address.\n")
{
	struct in_addr gip;

	if (argc == 1)
	{
		inet_aton (argv[0], &gip);
		return showgroupusernew (gip.s_addr, vty);
	}
	return showgroupusernew(0, vty);
}

DEFUN (show_uplink_func,show_uplink_cmd,
            "show igmp uplink",
            "Show system services.\n"
            "Show igmp information.\n"  
            "Show igmp uplink port \n"
            )
{
	ShowGroupUplink(vty);
	return OK;
}

DEFUN (show_igmpip_func, show_igmpip_cmd,
	"show igmp proxy ip",
	"Show systme services.\n" "Show igmp information.\n"
       "Show igmp proxy information\n" "Show ip address of proxy.\n")
{
	return show_igmp_ip (vty);
}
	  
DEFUN (set_igmpip_func, set_igmpip_cmd,
	"set igmp proxy  ip <A.B.C.D>",
	"Configure Igmp services.\n" "Configure igmp proxy services.\n"
	"Set igmp proxy parameter.\n" "Set igmp proxy ip address.\n"
	"Please input the ip address.\n")
{
	return set_igmpproxy_ip(inet_addr(argv[0]));
}

DEFUN (set_igmpage_func, set_igmpage_cmd,
	"set igmp age <0-3600>",
	"\n")
{
	int i;
	int slot;
	i = atoi (argv[0]);

	if (igmpageflag)
	{
		if (i>=1&&i<=3600)
		{
			usGroupMembershipInterval = i;
			return OK;
		}
		else if (i == 0)
		{
			igmpageflag = FALSE;
			usGroupMembershipInterval = 0;
			return OK;
		}
		printf ("input wrong number\n");
		return ERROR;
	}

	else 
	{
		if (i>=100&&i<=3600)
		{
			igmpageflag = TRUE;
			usGroupMembershipInterval = i;
			return OK;
		}
		else if (i == 0)
		{
			return OK;
		}
		printf ("input wrong number\n");
		return ERROR;
	}
}

DEFUN (debug_igmpproxy_func,debug_igmpproxy_cmd,
	     "igmp proxy set debug [enable|disable] ",
            "Configure Igmp services.\n" "Configure igmp proxy services.\n"
	     "Set igmp proxy parameter.\n" "Set igmp debug.\n"
	     "Set igmp proxy debug enable.\n" "Set igmp proxy debug disable.\n")
{
	if(strcmp(argv[0], "enable") == 0)
	{
		bIgmpDebug = TRUE;
		return OK;
	}
	else if (strcmp(argv[0], "disable") == 0)
	{
		bIgmpDebug = FALSE;
		return OK;
	}
	return ERROR;
}

DEFUN (sendpacket_func, sendpacket_cmd,
	"send <0-32> <A.B.C.D> <1-29> {<1-254> <1-24>}*1 {<1-1500>}*1",
	"send igmp packet.\n" "packet type.\n"
	"group ip address.\n" "slot.\n""onu.\n" "port.\n" 
	"send count.\n")
{
	struct in_addr gip1;
	struct in_addr gip2;
	UINT i, count, slot;
	char port = 0, onu;

	slot = atoi (argv[2]);
	if (argc == 3)
	{
		count = 1;

⌨️ 快捷键说明

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