📄 igmp_cli.c
字号:
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 + -