📄 c010agent.c
字号:
#if 0
#include "mplsevent.h"
#include "zxb10stubs.h"
#include "pvcmpls.h"
#include "ldpque.h"
#include "mpls_cmn.h"
#define _DEBUG_STUBS
/*****************************************************************************/
/* global variable */
/* c010msg: C010 -- Ldp messages module buffer */
/* ldpserv: access service board ldp process no */
/* c010Pid: C010 Pid */
/* currmodule: current module */
/*****************************************************************************/
mpls_c010req c010msg[C010_MSG_MAX];
PID ldpserv, c010Pid;
unsigned char currmodule;
/* ********************************************************************/
/* Product Name:ATM_B10 */
/* Modul Name: MPLS File Name : c010agent.c */
/* Creat Date: 2002.01.07 Author : weng.qing */
/* Function: print C010 LDP message digest */
/* Version: 1.0 */
/* History: */
/* Date Version Modifier Activies */
/* ********************************************************************/
void print_c010req(mpls_c010req *c010req)
{
#ifdef _DEBUG_STUBS
printf("==c010req: localLspId %x, IngressId %x, LspCBNo %x, ldpmod %x==\n",
c010req->localLspId,c010req->IngressId,
c010req->LspCBNo,c010req->ldpmod);
#endif
}
/* ********************************************************************/
/* Product Name:ATM_B10 */
/* Modul Name: MPLS File Name : c010agent.c */
/* Creat Date: 2002.01.07 Author : weng.qing */
/* Function: init c010msg global variable */
/* Version: 1.0 */
/* History: */
/* Date Version Modifier Activies */
/* ********************************************************************/
void init_c010agent()
{
mpls_c010req * head, *p;
unsigned long ii;
unsigned long sizeofElem;
sizeofElem = sizeof(mpls_c010req);
memset(c010msg,0,sizeofElem*C010_MSG_MAX);
head = c010msg;
p = head;
p->next = LDP_C010_EMPTY;
for (ii = 1; ii < C010_MSG_MAX; ii++)
{
p =(mpls_c010req *) ((unsigned char *)head + ii * sizeofElem);
p->next = ii + 1;
}
p->next = LDP_C010_EMPTY;
return;
}
/* ********************************************************************/
/* Product Name:ATM_B10 */
/* Modul Name: MPLS File Name : c010agent.c */
/* Creat Date: 2002.01.07 Author : weng.qing */
/* Function: add message to c010msg buffer */
/* Version: 1.0 */
/* History: */
/* Date Version Modifier Activies */
/* ********************************************************************/
unsigned long add_c010agent(mpls_c010req * item)
{
unsigned long entryNo;
mpls_c010req * p, * head, * free;
unsigned long sizeofElem;
char * startaddr;
startaddr = (char *)c010msg;
sizeofElem = sizeof(mpls_c010req);
head = (mpls_c010req *)startaddr;
free = (mpls_c010req *)((unsigned char *)head + sizeofElem); /* 指向空闲链表 */
if (free->next == LDP_C010_EMPTY)
{
printf("MODULE: List is full!\n");
entryNo = 0;
}
else
{
/* 先得到空闲元素 */
entryNo = free->next;
p = (mpls_c010req *)((unsigned char *)head + entryNo * sizeofElem);
free->next = p->next; /* 空闲链表指向p的下一跳 */
memcpy(p,item,sizeofElem);
/* 然后将它插入到数据链表的头部 */
p->next = head->next;
head->next = entryNo;
}
return (entryNo);
}
/* ********************************************************************/
/* Product Name:ATM_B10 */
/* Modul Name: MPLS File Name : c010agent.c */
/* Creat Date: 2002.01.07 Author : weng.qing */
/* Function: index message in c010msg buffer */
/* Version: 1.0 */
/* History: */
/* Date Version Modifier Activies */
/* ********************************************************************/
unsigned long index_c010agent(mpls_c010req * item)
{
mpls_c010req * head, * p,* q;
char * startaddr;
unsigned long entryno = 0;
startaddr = (char *)c010msg;
head = (mpls_c010req *)startaddr;
p = head;
while(p->next != LDP_C010_EMPTY)
{
q = ( mpls_c010req * )( startaddr + (p->next)*sizeof(mpls_c010req) );
if( (item->localLspId == q->localLspId) &&
(item->IngressId == q->IngressId) &&
(item->LspCBNo == q->LspCBNo))
{
entryno = p->next;
break;
}
else
{
p = q;
}
}
return entryno;
}
/* ********************************************************************/
/* Product Name:ATM_B10 */
/* Modul Name: MPLS File Name : c010agent.c */
/* Creat Date: 2002.01.07 Author : weng.qing */
/* Function: del message in c010msg buffer */
/* Version: 1.0 */
/* History: */
/* Date Version Modifier Activies */
/* ********************************************************************/
long del_c010agent(unsigned long no)
{
mpls_c010req *p, *q, *head, *free;
unsigned char exitMark = 0;
long result ;
head = (mpls_c010req *)c010msg;
free = (mpls_c010req *)((unsigned char *)head + sizeof(mpls_c010req));
p = head; /* 从head元素开始 */
q = p;
while ((p->next != LDP_C010_EMPTY) && (exitMark == 0))
{
q = p;
p = (mpls_c010req *)((unsigned char *)head + (p->next)*sizeof(mpls_c010req)); /* 转移到下一个元素 */
if (q->next == no) /* 从第一个有效元素开始 */
exitMark = 1;
}
if (exitMark == 0)
{
printf("MODULE:, Can't find the Entry!\n");
result = 0;
}
else
{
/* 首先释放该元素 */
q->next = p->next;
memset(p,0,sizeof(mpls_c010req));
/* 然后将释放的空闲插入到空闲链表的头部 */
p->next = free->next;
free->next = no;
result = no;
}
return (result);
}
/* ********************************************************************/
/* Product Name:ATM_B10 */
/* Modul Name: MPLS File Name : c010agent.c */
/* Creat Date: 2002.01.07 Author : weng.qing */
/* Function: main process */
/* Version: 1.0 */
/* History: */
/* Date Version Modifier Activies */
/* ********************************************************************/
/* modify by hyh, 2002-6-27 11:01, for queue confirm */
void c010agent(unsigned short event,void *In)
{
MPLS_BANDWIDTH_REQ *bandReq;
MPLS_RLSBW_REQ *rlsbandreq;
MPLS_CRPVC_REQ *crpvcReq;
MPLS_RLSPVC_REQ *rlspvcReq;
STRUC_AD_MPLS_BANDWIDTH_ACK *bandwithAck;
STRUC_AD_MPLS_CRPVC_ACK *createPvcAck;
STRUC_AD_MPLS_RLSBW_ACK *relBwAck;
STRUC_AD_MPLS_RLSPVC_ACK *relPvcAck;
XC_ACK mplsAck;
mpls_c010req c010req;
unsigned long no;
PID ldpPid;
printf("!!!c020 module %d, receive msg. event: %d ",currmodule,event);
switch(event)
{
case MPLS_AD_CREATEPVC_REQ:
printf("======!!!module %d, receive MPLS_AD_CREATEPVC_REQ msg======",currmodule);
SENDER(&ldpPid);
crpvcReq = (MPLS_CRPVC_REQ *)In;
/* 给LDP回接收确认 */
#if 0
conf_ack.index = crpvcReq->req_index;
ASEND(MPLS_C_QUE_CONF,&conf_ack,sizeof(XCREQ_CONF),ldpPid);
#endif
/*给c010发请求消息*/
c010req.localLspId = crpvcReq->req.localLspId;
c010req.IngressId = crpvcReq->req.IngressId;
c010req.LspCBNo = crpvcReq->req.LspCBNo;
c010req.ldpmod = ldpPid.module;
c010req.index = crpvcReq->req_index;
print_c010req(&c010req);
no = index_c010agent(&c010req);
if( no == 0 )
{
no = add_c010agent(&c010req);
if( no == 0 )
{
printf("err add fail");
}
else
{
/******************************************************/
/* Send req to C010 */
/* follow is the same */
/******************************************************/
ASEND( MPLS_AD_CREATEPVC_REQ,&(crpvcReq->req),
sizeof(STRUC_MPLS_AD_CRPVC_REQ),c010Pid );
printf("!!!indexno %d, module %d,mpls send create pvc msg to c010.",
no, currmodule);
}
}
else
{
printf("err request duplicate");
}
break;
case MPLS_AD_RLSPVC_REQ:
printf("======!!!module %d, receive MPLS_AD_RLSPVC_REQ msg======",currmodule);
SENDER(&ldpPid);
rlspvcReq = (MPLS_RLSPVC_REQ *)In;
/* 给LDP回接收确认 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -