📄 igmpcon_main.c
字号:
int sendInfoMsgbyCmd (UCHAR slot, UCHAR onu, UCHAR onuPort, UCHAR cmd,
UCHAR state, UCHAR preview, UINT group)
{
ConMsg msg;
int rev;
msg.type = infomsg;
msg.slot = slot;
msg.group = group;
msg.cmd = cmd;
msg.onu = onu;
msg.onuPort = onuPort;
msg.preview = preview;
msg.state = state;
/*发送到消息队列 */
rev =
msgQSend (ConMsgQId, (char *) &msg, sizeof (msg), NO_WAIT,
MSG_PRI_NORMAL);
if (rev != OK)
{
if (bConDebug)
{
printf ("ERROR!!,Can't send to the msgQueue.\n");
}
return ERROR;
}
return rev;
}
/*************************************************
Function: ProcessConMsg
Description: process control msg
Input: msg
Output: 无
Return: n/a
Others: // 其它说明
*************************************************/
void ProcessConMsg (ConMsg msg)
{
switch (msg.type)
{
case infomsg:
if (msg.onu < 1 || msg.slot < 1 || msg.slot > MAX_DOWN_SLOT)
return;
ProcessInfoMsg (msg);
break;
case Slothangemsg:
ProcessSlotChangeMsg (msg);
break;
default:
break;
}
}
/*************************************************
Function: ConMain
Description: main function of igmp_control moudle
Input: none
Output: n/a
Return: n/a
Others: // 其它说明
*************************************************/
void ConMain (void)
{
ConMsg Recmsg;
char date[20];
int sem;
memset (&Recmsg, 0, sizeof (ConMsg));
while (1)
{
if (msgQReceive (ConMsgQId, (char *) &Recmsg, sizeof (ConMsg),
WAIT_FOREVER) == sizeof (ConMsg))
{
sem = semTake (semConinfo, 20);
if (sem == ERROR && bConDebug)
{
printf ("\r\nsemTake(semConinfo, 1) error !,ConMain");
return;
}
ProcessConMsg (Recmsg);
sem = semGive (semConinfo);
if (sem == ERROR)
{
printf ("\r\nsemGive(semConinfo) error !,ConMain");
/*semMGiveForce (semConinfo); */
}
}
else
{
if (bConDebug)
{
printf ("msgQReceive failed!\n");
}
}
}
}
/*************************************************
Function: ConInit
Description: initial globle variables and struct data, start main task
Input: void
Output: n/a
Return: success 0, error -1;
Others: // 其它说明
*************************************************/
int ConInit (void)
{
int mem;
int slot, onu, port;
char date[20];
sprintf (date, "%s %s", __DATE__, __TIME__);
set_version (1, 3, date);
/*配置信息 */
previewtime = 10;
previewinterval = 30;
previewcount = 4;
previewresettime = 24;
RecordIgnore = 0;
RecordHolding = 60; /*日志轮询时间(分钟) */
memset (onulist, 0, sizeof (onulist));
memset (portstatlist, 0, sizeof (portstatlist));
for (slot = 1; slot <= MAX_DOWN_SLOT; slot++)
{
for (onu = 1; onu <= MaxOnu; onu++)
{
for (port = 1; port <= MaxOnuPort; port++)
{
portstatlist[slot][onu][port].gouplimit = 32;
portstatlist[slot][onu][port].fast_leave_capability = 1;
portstatlist[slot][onu][port].fast_leave_state = 1;
}
}
}
authlist = NULL;
/*状态信息 */
tConRecordTmer = 0; /*日志查询时间定时器 */
semConinfo = 0;
semConauth = 0;
semConLog = 0;
semConStat = 0;
ConMsgQId = 0;
ConTaskId = 0;
infolist = NULL;
recordlist = NULL;
groupstatlist = NULL;
Totalgroup = 0;
Totaluser = 0;
Totalauthgroup = 0;
recordcount = 0;
groupstatcount = 0;
semtakeerror = 0;
MaxUpBandwidth = 0; /*上传带宽上限 */
CurrentUpBandwidth = 0; /*当前总共上传带宽 */
/*SetSlotType(); */
/*SendCfg2allSlot (); */
memset (sendpktcount, 0, sizeof (sendpktcount));
semConauth = semMCreate (SEM_Q_PRIORITY);
semConinfo = semMCreate (SEM_Q_PRIORITY);
semConLog = semMCreate (SEM_Q_PRIORITY);
semConStat = semMCreate (SEM_Q_PRIORITY);
semBandwidth = semMCreate (SEM_Q_PRIORITY);
/*创建消息队列 */
ConMsgQId = msgQCreate (4096, sizeof (ConMsg), MSG_Q_FIFO);
if (ConMsgQId == 0)
{
printf ("Create the message queue failure!\n");
return ERROR;
}
/*启动日志轮询定时器 */
StartRecordTimer ();
/*转载命令 */
/*ConCmd_install(); */
/*启动主任务 */
ConTaskId =
taskSpawn ("IgmpCon", 76, 0, 2000000, (FUNCPTR) ConMain, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0);
if (ConTaskId == ERROR)
{
printf ("IGMPCon Task Spawn ERROR!\n");
ConTaskId = 0;
return ERROR;
}
/*init igmp proxy module */
IgmpInit ();
/*读取保存配置 */
/*cl_load_startup_config_igmp(); */
cl_igmpcon_module_init ();
return OK;
}
/*************************************************
Function: set_igmp_default
Description: set igmp state and configuration to default
Input: msg
Output: 无
Return: success 0, error -1;
Others: // 其它说明
*************************************************/
int set_igmp_default (void)
{
int mem;
int slot, onu, port;
int ret;
set_igmp_proxy_default ();
ret = del_all_igmp_profile ();
if (ret != 0)
return ret;
/*配置信息 */
previewtime = 10;
previewinterval = 30;
previewcount = 4;
previewresettime = 24;
RecordIgnore = 0;
RecordHolding = 60; /*日志轮询时间(分钟) */
for (slot = 1; slot <= MAX_DOWN_SLOT; slot++)
{
for (onu = 1; onu <= MaxOnu; onu++)
{
for (port = 1; port <= MaxOnuPort; port++)
{
portstatlist[slot][onu][port].gouplimit = 32;
portstatlist[slot][onu][port].control = 0;
portstatlist[slot][onu][port].vlanpeer = 0;
portstatlist[slot][onu][port].bandwidth = 0;
portstatlist[slot][onu][port].tmpno = 0;
portstatlist[slot][onu][port].fast_leave_capability = 1;
portstatlist[slot][onu][port].fast_leave_state = 1;
}
}
}
authlist = NULL;
MaxUpBandwidth = 0; /*上传带宽上限 */
CurrentUpBandwidth = 0; /*当前总共上传带宽 */
for (slot = 1; slot <= MAX_DOWN_SLOT; slot++)
SendCfg2Slot (slot);
return 0;
}
void typePkt (char *pkt, int len)
{
int i;
printf ("\r\n");
for (i = 0; i < len; i++)
{
printf ("%02x-", *(pkt + i));
if ((i > 0) && ((i + 1) % 4 == 0))
printf ("|-");
if ((i > 1) && ((i + 1) % 16 == 0))
printf ("\n\r");
}
printf ("\r\n");
}
void typePkt1 (char *pkt, int len, int head, int step)
{
int i;
typePkt (pkt, head);
i = head;
while (i < len)
{
typePkt (pkt + i, step);
i += step;
}
}
/*************************************************
Function: RecConPktGsw
Description: receive control packet from downlink slot, make
them a msg send to msgQueue;
Input: short slot, char *ConPkt, USHORT usLength
Output: 无
Return: success 0, error -1;
Others: // 其它说明
*************************************************/
int RecConPktGsw (short slot, char *ConPkt, USHORT usLength)
{
ConMsg msg;
UINT gip;
int nReturnValue;
char *ph, *p;
int i, j;
unsigned char onu, onuPort;
if (bConDebug)
{
printf ("\n\rreceive from Slot %d:\r\n", slot);
typePkt (ConPkt, usLength);
}
p = ConPkt;
switch (*p)
{
case infomsg:
{
msg.type = infomsg;
msg.slot = slot;
p++;
msg.onu = *p;
p++;
msg.onuPort = *p;
p++;
msg.cmd = *p;
p++;
msg.state = *p;
p++;
msg.preview = *p;
p += 3;
msg.group = *(UINT *) p;
}
break;
case portcfgreturnmsg:
onu = *(p + 1);
onuPort = *(p + 2);
if (!onu || !onuPort || onu > MaxOnu || onuPort > MaxOnuPort)
{
return ERROR;
}
portstatlist[slot][onu][onuPort].control = *(p + 3);
portstatlist[slot][onu][onuPort].vlanpeer = *(p + 10);
portstatlist[slot][onu][1].fast_leave_capability = *(p + 11);
gPortCfgResponse = 1;
break;
default:
break;
}
/*发送到消息队列 */
nReturnValue =
msgQSend (ConMsgQId, (char *) &msg, sizeof (msg), NO_WAIT,
MSG_PRI_NORMAL);
if (nReturnValue != OK)
{
if (bConDebug)
{
printf ("ERROR!!,Can't send to the msgQueue.\n");
}
return ERROR;
}
return nReturnValue;
}
/* 获取并设置各个线卡槽位的类型*/
int SetSlotType (void)
{
UCHAR slot;
UCHAR *p;
int i;
/* if (GetSlotType(&slot) != OK)*/
if (0)
{
if (bConDebug)
{
printf ("Error!!,Can't get the LineCard type.\n");
}
return ERROR;
}
p = &slot;
for (i = 1; i <= 16; i++);
{
aSlotType[i] = *p;
p++;
}
return OK;
}
/*把配置发到指定的线卡盘*/
void SendCfg2Slot (UCHAR slot)
{
int i, j, k;
int end, start;
if (SlotType (slot) == -1)
{
if (bConDebug)
{
printf ("It's not right slot, can't send control packets\r\n");
}
return;
}
SendCfgPkt (clearcfgmsg, slot, 0, 1, 1);
SendCfgPkt (clearcfgmsg, slot, 1, 1, 1);
SendCfgPkt (groupcfgmsg, slot, 1, 1, 0);
/*send cross vlan msg */
SendCfgPkt (zcrossvlanmsg, slot, 1, 1, 1);
SendCfgPkt (igmpparametersmsg, slot, 1, 1, 1);
for (i = 1; i <= MaxOnu; i++)
{
if (onulist[slot][i].type && onulist[slot][i].used)
{
if (onulist[slot][i].flag_ftth)
{
start = onulist[slot][i].igmp_port;
end = start;
}
else
{
start = 1;
end = onulist[slot][i].total_port;
}
for (k = start; k <= end; k++)
{
SendCfgPkt (port2groupmsg, slot, i, k, 1);
SendCfgPkt (portcfgmsg, slot, i, k, 1);
}
}
}
sendQuery2Slot (slot);
SendCfgPkt (igmpmodemsg, slot, 1, 1, 1);
}
void SendAuth2Slot (char slot)
{
int i, j, k, start, end;
if (SlotType (slot) == -1)
{
if (bConDebug)
{
printf ("It's not right slot, can't send control packets\r\n");
}
return;
}
SendCfgPkt (groupcfgmsg, slot, 1, 1, 0);
for (i = 1; i <= MaxOnu; i++)
{
if (onulist[slot][i].type && onulist[slot][i].used)
{
if (onulist[slot][i].flag_ftth)
{
start = onulist[slot][i].igmp_port;
end = start;
}
else
{
start = 1;
end = onulist[slot][i].total_port;
}
for (k = start; k <= end; k++)
SendCfgPkt (port2groupmsg, slot, i, k, 1);
}
}
}
/*************************************************
Function: dm_send_igmp
Description: send control packet by dm module, count the
send packet number, when reach 300 packets
per slot, wait 5 ticks
Input: char inter_slot, char *sendPkt, short len
Output: 无
Return: n/a
Others: // 其它说明
*************************************************/
void dm_send_igmp (char inter_slot, char *sendPkt, short len)
{
int ret;
/*发送该包,底层提供接口函数 */
if (sendpktcount[inter_slot] > 300)
{
taskDelay (5);
sendpktcount[inter_slot] = 0;
}
dm_MakeCmdPkt_IGMP (inter_slot, 0x9001, (char *) sendPkt, len);
sendpktcount[inter_slot]++;
if (bConDebug)
{
printf ("\n\rSend to Slot %d: \r\n", inter_slot);
typePkt (sendPkt, len);
}
}
/*************************************************
Function: send_groupcfgmsg_06a
Description: in 06a system, the groupcfg packet may contain more than 255 groups,
so we should splite the packet into serval packets.
Input: slot
Output: 无
Return: success 0, error -1;
Others: // 其它说明
*************************************************/
int send_groupcfgmsg_06a (char islot)
{
int size, count, pn, total_count;
int max_packet_group;
char *sendPkt, *p, *phead;
GroupAuth *ptmp;
short i, len;
/* max groups per packet */
max_packet_group = 200;
/*calculate the packet number */
pn = Totalauthgroup / max_packet_group + 1;
if (Totalauthgroup > 0 && (Totalauthgroup % max_packet_group) == 0)
pn--;
size = 16 * Totalauthgroup + 4 * 100;
sendPkt = (char *) malloc (size);
p = sendPkt;
if (NULL == sendPkt)
{
if (bConDebug)
{
printf ("Error, Can't send a cfgEnable Packet!!\n");
}
return ERROR;
}
ptmp = authlist;
count = 0;
total_count = 0;
*p = groupcfgmsg;
*(p + 1) = 0;
*(p + 2) = pn;
*(p + 3) = 1;
while (ptmp)
{
if (total_count % max_packet_group == 0)
{
phead = p;
p = p + 4;
}
*(UINT *) p = ptmp->groupaddress;
p = p + 4;
*p = ptmp->preCount;
p = p + 1;
*p = ptmp->preTime;
p = p + 1;
*p = ptmp->preInterval;
p = p + 1;
*p = ptmp->preReset;
p = p + 1;
*p = ptmp->pretotaltime;
p = p + 4;
*(USHORT *) p = ptmp->vlanid;
p += 2;
*(USHORT *) p = ptmp->bandwidth;
p += 2;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -