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

📄 igmp_cli.c

📁 igmp for switch in vxworks
💻 C
📖 第 1 页 / 共 3 页
字号:
		onu = 0;
	}
	else if (argc == 4)
	{
		count = atoi (argv[3]);
		onu = 0;
	}
	else if (argc == 5)
	{
		onu = atoi (argv[3]);
		port = atoi (argv[4]);
		count = 1;
	}
	else/* if (argc == 6)*/
	{
		onu = atoi (argv[3]);
		port = atoi (argv[4]);
		count = atoi (argv[5]);
	}
	
	inet_aton (argv[1], &gip1);

	printf ("argc =%d, slot=%d, onu=%d, port=%d, count=%d\r\n", argc, slot, onu, port, count);

	for (i = 0; i < count; i ++)
	{
		SendIgmpPktbyCmd(atoi (argv[0]), i+gip1.s_addr, 0x0a190001, slot, 2);
		if (onu)
		processtest (slot, onu, port,  23-atoi (argv[0]),0,i+gip1.s_addr);
	}
	return OK;
}


DEFUN (set_prejoin_func, set_prejoin_cmd,
	"set igmp prejoin  <groupaddress> ",
	"Configure system services.\n" "Configure Igmp services.\n"
	"Set prejoin services.\n" "Input the group address.\n")
{
	struct in_addr gip;
	UINT min, max;
	int i; 

	if (GetGroupAddRang (argv[0], &max, &min) < 0 )
	{
		vty_out(vty, "\r\ninvalid multicast group address!\r\n");
		return ERROR;
	}

	for (i = 0; i <=(max-min); i++)
	{
		if (ERROR == AddPreJoinNode (min +i))
		vty_out (vty, "Command Error!\r\n");
	}
	return OK;
}

DEFUN (no_prejoin_func, no_prejoin_cmd,
	"delete igmp prejoin  {<A.B.C.D>}*1 ",
	"Delete system services.\n" "Delete Igmp services.\n"
	"Delete prejoin services\n" "Input the group address\n")
{
	struct in_addr gip;

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

DEFUN (show_prejoin_func, show_prejoin_cmd,
	"show igmp prejoin ",
	"Show system services.\n" "Show Igmp services.\n"
	"Show prejoin services.\n")
{
	struct in_addr gip;
	int count;
	PreJoinNode *ptemp;
	char *paddr;
	char ip[20];

	count = 0;
	ptemp = pPreJoinList;
	while (ptemp)
	{
		count ++;
		gip.s_addr = ptemp->unGroupAddress;
		inet_ntoa_b(gip,ip);
		vty_out (vty, "%d: %s\r\n", count, ip);
		ptemp =ptemp->pNext;
	}
	return OK;

}

DEFUN (turbo_func, turbo_cmd,
	"turbo [enable|disable|clear|show]",
	"\n")
{
	vty_out(vty, "\r\n");
	if (strcmp(argv[0], "enable") == 0)
	{
		turboclear();
		turbo = 1;
		return OK;
	}
	if (strcmp(argv[0], "disable") == 0)
	{
		turboclear();
		turbo = 0;
		return OK;
	}
	if (strcmp(argv[0], "clear") == 0)
	{
		turboclear();
		return OK;
	}
	if (strcmp(argv[0], "show") == 0)
	{
		turboshow();
		return OK;
	}
	return OK;
}

DEFUN (gz_test_func, gz_test_cmd,
	"GZ [enable|disable|clear|show]",
	"\n")
{
	vty_out(vty, "\r\n");
	if (strcmp(argv[0], "enable") == 0)
	{
		gz_test_clear();
		gz_ctc_test = 1;
		return OK;
	}
	if (strcmp(argv[0], "disable") == 0)
	{
		gz_test_clear();
		gz_ctc_test = 0;
		return OK;
	}
	if (strcmp(argv[0], "clear") == 0)
	{
		gz_test_clear();
		return OK;
	}
	if (strcmp(argv[0], "show") == 0)
	{
		gz_test_show();
		return OK;
	}
	return OK;
}

DEFUN (set_instantleave_func, start_instantleave_cmd,
	"set instant leave [enable|disable] ",
	"Configure system services.\n" "Configure igmp leave status.\n"
	"Set instant leave status.\n"
	"Config instant leave enable.\n" "Config instant leave disable.\n")
{
	int i;

	if (strcmp (argv[0], "enable") == 0)
	{
		bEnableInstantLeave = 1;
	}
	if (strcmp (argv[0], "disable") == 0)
	{
		bEnableInstantLeave = 0;
	}
	return OK;
}

DEFUN (start_igmpproxy_func, start_igmpproxy_cmd,
	"set igmp proxy  [enable|disable]",
	"Configure system services.\n" "Configure igmp status.\n"
	"Configure igmp proxy status.\n" 	"Set gsw igmp proxy enable.\n" "Set gsw igmp proxy disable.\n")
{
	int i, slot, state;
	char *p;
	
	start_igmp_proxy(argv[0], vty);
	return 0;
}


DEFUN (gz_test_vlan_func, gz_test_vlan_cmd,
	"set out vlan <A.B.C.C> <0-4096> <0-1>",
	"\n")
{
	unsigned groupaddres;
	int i;
	short vlan;
	char tag;

	vlan = atoi (argv[1]);
	tag = atoi (argv[2]);
	groupaddres = inet_addr (argv[0]);

	if (!groupaddres)
	return;
	
	for (i=0; i < 255; i++)
	{
		if (groupaddres == GZ_add[i].groupaddress)
		{
			if (vlan == 0)
			{
				GZ_add[i].groupaddress = 0;
				GZ_add[i].outvlan = 0;
				GZ_add[i].tag = 0;
			}
			else
			{
				GZ_add[i].outvlan = vlan;
				GZ_add[i].tag = tag;
			}
			return 0;
		}
	}

	for (i = 0; i <=255; i++)
	{
		if (GZ_add[i].groupaddress == 0 && vlan)
		{
			GZ_add[i].groupaddress = groupaddres;
			GZ_add[i].outvlan = vlan;
			GZ_add[i].tag = tag;
			return 0;
		}
	}
	return OK;
}


/************************************************************************************
  函数名称: IP_Install
  功能描述: 完成igmp proxy部分的命令安装
  输入参数: 无
  输出参数: 无
  返回值:       OK
  作者:             aibin
  日期              20050118
  备注:
*************************************************************************************/

int IP_Install_cli (void)
{
	install_element (CONFIG_IGMP_NODE, &start_igmpproxy_cmd);
	install_element (CONFIG_IGMP_NODE, &set_cascade_cmd);
	install_element (CONFIG_IGMP_NODE, &set_igmpip_cmd);
	install_element (CONFIG_IGMP_NODE, &show_igmpip_cmd);
	install_element (CONFIG_IGMP_NODE, &show_prejoin_cmd);
	install_element (CONFIG_IGMP_NODE, &show_uplink_cmd);
	install_element (CONFIG_IGMP_NODE, &set_prejoin_cmd); 
	install_element (CONFIG_IGMP_NODE, &no_prejoin_cmd);
	install_element (CONFIG_IGMP_NODE, &start_instantleave_cmd);

	install_element (DEBUG_HIDDEN_NODE, &show_igmpgroup_cmd);
	install_element (DEBUG_HIDDEN_NODE, &set_igmpage_cmd);
	install_element (DEBUG_HIDDEN_NODE, &debug_igmpproxy_cmd);
	install_element (DEBUG_HIDDEN_NODE, &sendpacket_cmd);
	install_element (DEBUG_HIDDEN_NODE, &turbo_cmd);
	
	return 0;
}

int show_run_igmp_proxy (struct vty *vty)
{
	if (gEc2IGMPProxyEnable != 1)
	{
		if (gEc2IGMPProxyEnable == 0)
		vty_out (vty, "set igmp proxy ec2 disable\r\n");
		
		if (gEc2IGMPProxyEnable == 2)
		vty_out (vty, "set igmp proxy ec2 control\r\n");

		return 0;
	}
}

int IP_Install (void)
{
	struct cl_cmd_module *cl_mod_igmp;

	  cl_mod_igmp =
		(struct cl_cmd_module *) malloc (sizeof (struct cl_cmd_module));
	if (!cl_mod_igmp)
	{
		return 0;
	}
	memset (cl_mod_igmp, 0, sizeof (struct cl_cmd_module));

	cl_mod_igmp->module_name = (char *) malloc (20);
	if (cl_mod_igmp->module_name == NULL)	/* modified by aibin  2006/08/16 */
	{
		free (cl_mod_igmp);
		return 0;
	}
	memset (cl_mod_igmp->module_name, 0, 20);
	memcpy (cl_mod_igmp->module_name, "igmp proxy", 13);

	cl_mod_igmp->init_func = IP_Install_cli;

	cl_mod_igmp->showrun_func = show_run_igmp_proxy;
	/*
	   cl_mod_um->showrun_func = NULL;
	 */
	cl_mod_igmp->next = NULL;
	cl_mod_igmp->prev = NULL;
	cl_install_module (cl_mod_igmp);
	return 1;
}

int test_igmp_cascade_ports_set ()
{
	char buf[2000];
	char *p;
	STRUCT_ERROR_INFO *err;

	memset (buf, 0, sizeof (buf));
	p = buf;
	*p = 3;
	p++;
	*p = 2;
	p++;
	*p = 3;
	p++;
	*p = 4;
	p++;

	typePkt (buf, 4);

	igmp_cascade_ports_set (buf, 4, err);

}

void testigmp_cascade_ports_get (void)
{
	char buf[2000];
	char *p;
	short len;

	memset (buf, 0, sizeof (buf));
	p = buf;

	igmp_cascade_ports_get (buf, &len);
	typePkt (buf, len);
	return ;
}


int groupcount_in_cascade_get(char uplinkport, char * buf,unsigned short *len)
{
	GroupEntity *ptmp;
	char *p;
	short gcount, *gc;
	
	p = buf;
	*p = uplinkport;
	p++;
	
	*(short *)p = 0;
	gc = (short *)p;
	p += 2;

	gcount = 0;
	semTake (semIgmpDelete, WAIT_FOREVER);
	ptmp = pGroupEntityList;
	while (ptmp)
	{
		if (ptmp->eGroupPortStatus[17+uplinkport] != NoMembersPresent)
		{
			*(UINT *)p = ptmp->unGroupAddress;
			p += 4;
			gcount++;
		}
		ptmp = ptmp->pNext;
	}
	semGive(semIgmpDelete);

	*gc = gcount;
	*len = 3 + 4*gcount;
	return OK;
}

void test_get_igmp_uplink_info(void)
{
	char buf[1000];
	short len;

	memset (buf, 0, sizeof (buf));
	get_igmp_uplink_info (buf,&len);
	typePkt(buf, len);
}

int testgroupcount_in_cascade_get (char port)
{
	char buf[2000];
	char *p;
	short len;

	memset (buf, 0, sizeof (buf));
	p = buf;

	groupcount_in_cascade_get (port, buf, &len);
	typePkt (buf, len);
	return len;
}


#if 0
 /* 设置组播级联上联口正确返回0,错误返回-1*/
int set_Igmp_serial_uplink_ports(char *uplinkPorts)
 {
	int i, count= 0;
	char *portlist, port, slot, uplink;
	int  portno;
	char temp[MAX_UPLINK_PORT+1];
	GroupEntity *ptmp;

	memset (temp, ROUTER_MODULE_PORT, sizeof(temp));
	for (i = usMaxPort - 6; i <= usMaxPort; i++)
	temp[i] = HOST_MODULE_PORT;

	if (strcmp ("NULL", uplinkPorts) == 0)
	{
		/*如果输入"none",直接跳到最后*/
	}
	else
	{
		portlist = uplinkPorts;
		/*检查输入合法性*/
		BEGIN_PARSE_PORT_LIST (portlist, portno)
		{
			port = portno%(MAXPortNum2 + 1);
			slot = (portno - port)/(MAXPortNum2+1);
			if (slot != UPLINKSLOT || port >7||port<1)
			{
				return ERROR;
			}
		}
		END_PARSE_PORT_LIST();

		portlist = uplinkPorts;
		BEGIN_PARSE_PORT_LIST (portlist, portno)
		{
			port = portno%(MAXPortNum2 + 1);
			slot = (portno - port)/(MAXPortNum2+1);
			if (slot != UPLINKSLOT || port >7||port<1)
			{
				continue;
			}
			uplink = usMaxPort -7 +port;
			temp[uplink] = ROUTER_MODULE_PORT;
		}
		END_PARSE_PORT_LIST();
		/*不能全部配成级联口*/
		for (i = 1;  i <= usMaxPort; i++)
		{
			count = count + temp[i];
		}
		if (!count)
		{
			return ERROR;
		}
		
	}

	/*由级联口变为上联口时,必须离开原所在的所有组*/
	semTake (semIgmpDelete, WAIT_FOREVER);
	ptmp = pGroupEntityList;
	while (ptmp)
	{
		for (i = usMaxPort-7; i <= usMaxPort; 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;
 }


/* 获取组播级联上联口。正确返回0,错误返回-1*/
int get_Igmp_serial_uplink_ports(char *uplinkPorts) 
{
	char portlist[50];
	char temp[10];
	int i, j, k;
	int start, end, last;

	for (i = usMaxPort; i >= usMaxPort-6; i--)
	{
		if (slot_module[i] == ROUTER_MODULE_PORT)
		{
			last = i;
			i = usMaxPort;
			break;
		}
		else
		{
			continue;
		}
	}

	if(i != usMaxPort)
	{
		return ERROR;
	}

	memset (portlist, 0, sizeof (portlist));
	i = usMaxPort -6;
	while (i <= usMaxPort)
	{
		if (slot_module[i] == ROUTER_MODULE_PORT)
		{
			start = i;
			j = i;
			for (j = i; j < usMaxPort&&slot_module[j+1] == ROUTER_MODULE_PORT; j++);
			end = j;
			if (start == end)
			{
				if (end == last)
				sprintf (temp, "%d:%d", UPLINKSLOT, end+7-usMaxPort);
				else
				sprintf (temp, "%d:%d,", UPLINKSLOT, end+7-usMaxPort);
			}
			else
			{
				if (end == last)
				sprintf (temp, "%d:%d-%d:%d", UPLINKSLOT, start+7-usMaxPort, UPLINKSLOT, end+7-usMaxPort);
				else
				sprintf (temp, "%d:%d-%d:%d,", UPLINKSLOT, start+7-usMaxPort, UPLINKSLOT, end+7-usMaxPort);
			}
			i = end;
		}
		strcat (portlist, temp);
		memset (temp, 0, sizeof (temp));
		i++;
	}
	strcpy(uplinkPorts, portlist);
	return OK;
}

/* 通过指定槽位号和端口好,获取级联上联口所在组播组地址信息。正确返回改级联端口所有组播组数目,错误返回0。*/
int get_Igmp_serial_uplinkPort_group_addresses(char uplinkSlotNo, char uplinkPortNo, unsigned int *uplinkGroupAddr)
{
	int i,j;
	int count = 0;
	UINT group[255], *gp;
	GroupEntity *ptmp;

	memset (group, 0, sizeof(group));
	if (uplinkSlotNo != UPLINKSLOT || uplinkPortNo>7 ||uplinkPortNo <1)
	return 0;
	
	ptmp = pGroupEntityList;
	if (NULL == ptmp)
	return 0;
	i = 0;
	while (ptmp)
	{
		if (slot_module[usMaxPort-7+uplinkPortNo] == ROUTER_MODULE_PORT && ptmp->eGroupPortStatus[usMaxPort-7+uplinkPortNo]!= NoMembersPresent)
		{
			group[i] = ptmp->unGroupAddress;
			i++;
		}
		ptmp = ptmp->pNext;
	}

	memcpy (uplinkGroupAddr, group, i*4);
	gp = uplinkGroupAddr;
	/*for (j = 0; j <i; j++)
	{
		printf ("%x\r\n", *gp);
		gp++;
	}*/
	return i;
}

/*通过指定 槽位号和端口号,获取指定上联口的级联信息。1表示该端口为级联端口,2表示该端口不是级联端口, -1表示其它端口。*/
int get_Igmp_uplink_port_serial_info(char uplinkSlotNo, char uplinkPortNo)
{
	if (uplinkSlotNo != UPLINKSLOT || uplinkPortNo>7 ||uplinkPortNo <1)
	return ERROR;

	return slot_module[usMaxPort - 7 + uplinkPortNo] + 1;
}

	

#endif 


⌨️ 快捷键说明

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