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