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

📄 igmpcon_snmp.c

📁 igmp for switch in vxworks
💻 C
📖 第 1 页 / 共 5 页
字号:
	p = buf + 22;
	i = 0;
	count = gcount;
	while (count)
	{
		rev = addGroup2Profile (tmpno, *(UINT *) p, *(p + 4));
		if (ERROR == rev)
		{
			if (bConDebugSnmp)
			{
				printf ("addGroup2Profile\r\n");
			}
			set_error_code(err, SNMP_ERROR, 0x0030fffc,  NULL);
			return -4;
		}
		p += 5;
		count--;
	}

	count = 0;
	PASS_ONU(i, j)
	{
		if (1== j)
		SendCfgPkt (groupcfgmsg, i, 1, 1, 0);
		if (onulist[i][j].used)
		{
			
			if (onulist[i][j].flag_ftth)
			{
				start = onulist[i][j].igmp_port;
				end =start;
			}
			else
			{
				start = 1;
				end = onulist[i][j].total_port;
			}
			for (k = start; k <= end; ++k)
			{
				if (portstatlist[i][j][k].tmpno == tmpno)
				SendCfgPkt (port2groupmsg, i, j, k, 1);
			}
		}
	}
	END_PASS_ONU

	profile[tmpno].Groupcount = gcount;
	return OK;
}

int igmp_profile_info_get (char *profilename, char *buf, unsigned short *len)
{
	int i, j, k, count, size;
	char *p;
	char tmpno;
	GroupAuth *ptmp;
	int gcount = 0;

	tmpno = GetProfliebyName (profilename);
	if (!tmpno)
	{
		*len = 0;
		return OK;
	}

	p = buf;
	*(int *)p = SNMP_SUCCESS;
	p += 4;
	strcpy (p, profilename);
	p = p + 20;
	*p = 0xff;					/*加入字段不显示 */
	p++;
	count = profile[tmpno].Groupcount;
	*p = count;
	size = 21 + count * 5 + 1;
	memset (p, 0, size);
	*len = size;
	p++;

	semTake (semConauth, WAIT_FOREVER);
	ptmp = authlist;
	while (ptmp)
	{
		if (ptmp->profile[tmpno] != MEMBER_NONE)
		{
			*(UINT *) p = ptmp->groupaddress;
			p = p + 4;
			*p = ptmp->profile[tmpno];
			p++;
			gcount++;
		}
		ptmp = ptmp->pNext;
	}
	*(buf + 21) = gcount;

	if (bConDebugSnmp)
	{
		typePkt (buf, *len);
	}

	*len = p-buf;
	semGive (semConauth);
	return OK;
}

int default_preview_parameters_set (char *buf, int len, STRUCT_ERROR_INFO *err)
{
	char *p;

	set_error_code(err, SNMP_SUCCESS, 0,0);
	p = buf;
	previewcount = *p;
	p++;
	previewtime = *p;
	p++;
	previewinterval = *p;
	p++;
	previewresettime = *p;
	p++;
	previewTotalTime = *p;
	return OK;
}

int default_preview_parameters_get (char *buf, USHORT * len)
{
	char *p;

	
	*len = 5+6;
	p = buf;
	*(int *)p = SNMP_SUCCESS;
	p += 4;
	memset (p, 0, 5);
	*p = previewcount;
	p++;
	*p = previewtime;
	p++;
	*p = previewinterval;
	p++;
	*p = previewresettime;
	p++;
	*p = previewTotalTime;
	p++;

	*len =  p - buf;
	return OK;
}

int record_parameters_set (char *buf, int len, STRUCT_ERROR_INFO *err)
{
	char *p;

	set_error_code(err, SNMP_SUCCESS, 0,0);
	p = buf;
	RecordIgnore = *p;
	p++;
	RecordHolding = *p;
	return OK;
}

int record_parameters_get (char *buf, USHORT * len)
{
	char *p;

	p = buf;
	*(int *)p = SNMP_SUCCESS;
	p += 4;
	*p = RecordIgnore;
	p++;
	*p = RecordHolding;
	p++;
	*len = p-buf;
	return OK;
}


int multicast_vlan_set (char *buf, int len, STRUCT_ERROR_INFO *err)
{
	short vlan;
	char mode;
	char *p;
	int i;

	set_error_code(err, SNMP_SUCCESS, 0,0);
	p = buf;
	mode = *p;
	p++;
	vlan = *(short *) p;

	if (vlan)
	global_vlan = vlan;
	else
	global_vlan = DefaultVlan;

	for (i = 1; i <= MAX_DOWN_SLOT; i++)
	{
		SendCfgPkt (zcrossvlanmsg, i, 1, 1, 1);
	}
	return OK;
}

int multicast_vlan_get (char *buf, USHORT * len)
{
	char *p;

	p = buf;
	*(int *)p = SNMP_SUCCESS;
	p += 4;
	*p = gEnableCrossVlan + 1;
	p++;
	*(short *) p = global_vlan;
	p += 2;
	*len = p-buf;
	return OK;
}

int maximum_uplink_multicast_bandwidth_set (int bandwidth)
{
	MaxUpBandwidth = bandwidth;
	return OK;
}

int maximum_uplink_multicast_bandwidth_get (int *bandwidth)
{
	GroupAuth *ptmp;
	GroupInfo *curr;
	short bandtemp = 0;

	*bandwidth = MaxUpBandwidth;
	return 0;
}

int igmp_proxy_ipaddress_set (UINT ipaddress)
{
	if (ipaddress >- 0xe0000000)
	return -1;
	
	set_igmpproxy_ip (ipaddress);
	return OK;
}

int igmp_proxy_ipaddress_get (UINT * ipaddress)
{
	*ipaddress = get_igmpProxyIpaddress ();

	if (bConDebugSnmp)
	{
		typePkt ((char*)ipaddress, 4);
	}
	return OK;
}

int prejoin_group_set (char *buf, int len, STRUCT_ERROR_INFO *err)
{
	char *p;
	UINT group;
	int count;

	set_error_code(err, SNMP_SUCCESS, 0,0);
	DelAllPreJoinNode ();

	p = buf;
	count = *p;
	p++;
	while (count)
	{
		group = *(UINT *) p;
		if (group >= 0xe0000000)
		return -1;
		
		if (ERROR == AddPreJoinNode (group))
		{
			return 0;
		}
		p += 4;
		count--;
	}
	return OK;
}

int prejoin_group_get (char *buf, USHORT * len)
{
	return get_all_prejoin (buf, len);
}

int igmp_cascade_ports_set (char *buf, int len, STRUCT_ERROR_INFO *err)
{
	int i, count= 0;
	char *p,*portlist, port, slot, uplinkport;
	int  portno;
	char temp[MAX_UPLINK_PORT+1];
	GroupEntity *ptmp;
	char max_cascade_port;

#ifdef _AN5116_06A_
	max_cascade_port = 10;
#else
	max_cascade_port = 7;
#endif

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

	p = buf;
	count = *p;
	p++;
	if (count == max_cascade_port)
	{
		set_error_code(err, SNMP_ERROR, 0x0038ffff,0);
		return ERROR;
	}
	
	if (count == 0)
	{
		/*如果输入"none",直接跳到最后*/
	}
	else
	{
		i = count;
		while (i)
		{
			slot = *p;
#ifdef _AN5116_06A_
			if (slot == 8)
			uplinkport =17;
			else if (slot == 9)
			uplinkport = 25;
			else if (slot == 10)
			uplinkport = 26;
			else
			uplinkport = 17 + slot;
#else
			uplinkport = 17 + slot;
#endif
			temp[uplinkport] = ROUTER_MODULE_PORT;
			p++;
			i--;
		}
	}

	/*由级联口变为上联口时,必须离开原所在的所有组*/
	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 igmp_cascade_ports_get (char *buf, USHORT  *len)
{
	char *p;
	char count, i, j;

	p = buf;
	*(int *)p = SNMP_SUCCESS;
	p += 4;
	p++;
	count = 0;
	for (i = MIN_UPLINK_PORT; i <= MAX_UPLINK_PORT; i++)
	{
		if (slot_module[i] == ROUTER_MODULE_PORT)
		{
#ifdef _AN5116_06A_
			if (i == 17)
			*p =8;
			else if (i == 25)
			*p= 9;
			else if (i == 26)
			*p = 10;
			else
			*p = i-17;
#else		
			*p = i-17;
#endif
			count++;
			p++;
		}
	}
	*(buf+4) = count;
	*len = p-buf;
	return OK;
}

int group_parameters_set_all (char *buf, int len, STRUCT_ERROR_INFO *err)
{
	USHORT band, vlanid;
	UINT groupaddress;
	char *p;
	GroupInfo *onlineGroup;
	GroupAuth *authgroup;
	int i, j, k, gcount, count, rev;
	char start, end;

	if (bConDebugSnmp)
	{
		typePkt (buf, len);
	}

	set_error_code(err, SNMP_SUCCESS, 0,0);
	p = buf;

	gcount = *(int *)p;
	if (gcount > MaxGroup)
	{
		set_error_code(err, SNMP_ERROR,0x0042fffe, 0);
		return -2;
	}
	
	p += 4;
	count = gcount;
	while (count)
	{
		groupaddress = *(UINT *) p;
		authgroup = GetAuthGroup (groupaddress);
		if (NULL == authgroup)
		{
			set_error_code(err, SNMP_ERROR,0x0042fffe, (char*)&groupaddress);
			return -2;
		}
		p += 4;

		if (*p)
		{
			authgroup->preCount = *p;
		}
		else
		{
			authgroup->preCount = previewcount;
		}
		p++;

		if (*p)
		{
			authgroup->preTime = *p;
		}
		else
		{
			authgroup->preTime = previewtime;
		}
		p++;

		if (*p)
		{
			authgroup->preInterval = *p;
		}
		else
		{
			authgroup->preInterval = previewinterval;
		}
		p++;

		if (*p)
		{
			authgroup->preReset = *p;
		}
		else
		{
			authgroup->preReset = previewresettime;
		}
		p++;

		if (*p)
		{
			authgroup->pretotaltime = *p;
		}
		else
		{
			authgroup->pretotaltime = previewTotalTime;
		}
		p++;

		authgroup->bandwidth = *(USHORT *) p;
		p += 2;

		vlanid = *(USHORT *) p;
		if (vlanid == global_vlan || !vlanid)
		authgroup->vlanid = 0;
		else
		authgroup->vlanid = vlanid;
		p += 2;

		authgroup->leavedelay = *(USHORT *) p;
		p += 2;

		authgroup->uplink_vlan = *(USHORT *)p;
		p += 2;
			
		count--;
	}

	PASS_ONU(i, j)
	{
		if (1 == j) 
		SendCfgPkt (groupcfgmsg, i, 1, 1, 0);
		if (onulist[i][j].used)
		{
			
			if (onulist[i][j].flag_ftth)
			{
				start = onulist[i][j].igmp_port;
				end =start;
			}
			else
			{
				start = 1;
				end = onulist[i][j].total_port;
			}
			for (k = start; k <= end; ++k)
			{
				SendCfgPkt (port2groupmsg, i, j, k, 1);
			}
		}
	}
	END_PASS_ONU
	return OK;
}


/*增加分包的功能*/
int group_parameters_set_new(int index, char *buf, int len, STRUCT_ERROR_INFO *err)
{
	int total_len = 0;
	int count = 0;
	char *p;
	char reval = 0;
	STRUCT_ERROR_INFO *success;

	p = buf;
	total_len = NULL;
		
	/*第一个包要分配空间*/
	if (index == 1)
	{
		set_error_code(err, SNMP_SUCCESS, 0,0);
		/*only one snmp-packet*/
		if (len < SNMP_MAX_PACKET_LENGTH)
		{
			reval = group_parameters_set_all (buf, len, err);
			return reval;
		}

		/*the first snmp-packet*/
		else if (len == SNMP_MAX_PACKET_LENGTH)
		{
			count = *(int *)p;
			totalbuf = (char *)calloc (17*count + 4, 1);
			if (NULL == totalbuf)
			{
				set_error_code(err, SNMP_ERROR, 0x002efffe,0);
				return 0;
			}
			
			memcpy (totalbuf, buf, SNMP_MAX_PACKET_LENGTH);
			return 0;
		}
		else
		{
			return 0;
		}
	}

	/*the middle packet*/
	else if (len == SNMP_MAX_PACKET_LENGTH)
	{
		memcpy (totalbuf+(index-1)*SNMP_MAX_PACKET_LENGTH, buf, SNMP_MAX_PACKET_LENGTH);
		return 0;
	}

	/*the last packet*/
	else
	{
		memcpy (totalbuf+(index-1)*SNMP_MAX_PACKET_LENGTH, buf, len);
		reval = group_parameters_set_all (totalbuf, len+(index-1)*SNMP_MAX_PACKET_LENGTH, err);
		free (totalbuf);
		totalbuf = NULL;
		return reval;
	}
}


int group_parameters_get (char *buf, unsigned short *len)
{
	USHORT band, vlanid;
	UINT groupaddress;
	char *p;
	GroupInfo *onlineGroup;
	GroupAuth *ptmp;
	int i, j, k, gcount, count, rev;

	p = buf;
	*(int *)p = SNMP_SUCCESS;
	p += 4;
	gcount = 0;
	*p = gcount;
	p++;

	ptmp = authlist;
	semTake (semConauth, WAIT_FOREVER);
	while (ptmp)
	{
		*(UINT *) p = ptmp->groupaddress;
		p += 4;

		*p = ptmp->preCount;
		p++;
		*p = ptmp->preTime;
		p++;
		*p = ptmp->preInterval;
		p++;
		*p = ptmp->preReset;
		p++;
		*p = ptmp->pretotaltime;
		p++;

		*(USHORT *) p = ptmp->bandwidth;
		p += 2;

		if (ptmp->vlanid == 0)
		{
			*(USHORT *) p = global_vlan;
		}
		else
		{
			*(USHORT *) p = ptmp->vlanid;
		}
		p += 2;

		*(USHORT *) p = ptmp->leavedelay;
		p += 2;

		gcount++;
		ptmp = ptmp->pNext;
	}

	*(buf+4) = (char)gcount;

	*len = p - buf;

	if (bConDebugSnmp)
	{
		typePkt (buf, *len);
	}

	semGive (semConauth);
	return OK;
}


/*return the packet number, from this function, the return packets plus one for the last empty packet aibin 20080617*/
int group_parameters_get_buf(void)
{
	int i, tmpno;
	int size = 0;
	char *p, *start;
	GroupAuth *ptmp;

	size = 4+17*Totalauthgroup;
	size += 4; /*success head*/
	
	/*need to split packet upload, if size more than 7680 then malloc a space*/
	if (size > SNMP_MAX_PACKET_LENGTH)
	{
		totalbuf = (char *)malloc (size);
		if (NULL == totalbuf)
		return -1;
		memset (totalbuf, 0, size);
		p = totalbuf;
	}
	else
	{
		memset (tempbuf, 0, sizeof (tempbuf));
		p = tempbuf;
	}

	start = p;

	*(int *)p = SNMP_SUCCESS;
	p += 4;
	*(int *)p = Totalauthgroup;
	p += 4;

	ptmp = authlist;
	semTake (semConauth, WAIT_FOREVER);
	while (ptmp)
	{
		*(UINT *) p = ptmp->groupaddress;
		p += 4;

		*p = ptmp->preCount;
		p++;
		*p = ptmp->preTime;
		p++;
		*p = ptmp->preInterval;
		p++;
		*p = ptmp->preReset;
		p++;
		*p = ptmp->pretotaltime;
		p++;

		*(USHORT *) p = ptmp->bandwidth;
		p += 2;

		if (ptmp->vlanid == 0)
		{
			*(USHORT *) p = global_vlan;
		}
		else
		{
			*(USHORT *) p = ptmp->vlanid;
		}
		p += 2;

		*(USHORT *) p = ptmp->leavedelay;
		p += 2;

		*(USHORT *) p = ptmp->uplink_vlan;
		p += 2;
		ptmp = ptmp->pNext;
	}
	semGive (semConauth);

	if (bConDebugSnmp)

⌨️ 快捷键说明

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