337 lines
8.3 KiB
C
337 lines
8.3 KiB
C
#include "./include/mtp3.h"
|
|
#include "./include/mtpstm.h"
|
|
#include "./include/mtpext.h"
|
|
#include "./include/mtpfunc.h"
|
|
|
|
/*@ignore@*/
|
|
void hmrt_srm_msg(BYTE linkset, BYTE MsgType, long dst);
|
|
void hmrt_tfrc_update_routing_tables(BYTE dst, BYTE nw);
|
|
void tsrc_fun6(BYTE link,BYTE nw,BYTE sp_place);
|
|
void tsrc_fun8(BYTE ls,BYTE nw,BYTE sp_place);
|
|
int find_dst_place(long dst,BYTE ls);
|
|
|
|
void mark_alternative_linkset_available(BYTE *routine)
|
|
{
|
|
(*routine) = ( (*routine) & 0xc3 ) + 0x10;/* mark alternative route use and acessible*/
|
|
}
|
|
|
|
void mark_alternative_linkset_unavailable(BYTE *routine)
|
|
{
|
|
(*routine) = ((*routine) & 0xf3 ) + 0x08;/* mark alternative route can't use */
|
|
}
|
|
|
|
void mark_normal_linkset_available(BYTE *routine)
|
|
{
|
|
(*routine) = ((*routine) & 0xcc) + 0x10;/* mark normal route can use,and acessible */
|
|
}
|
|
|
|
void mark_normal_linkset_unavailable(BYTE *routine)
|
|
{
|
|
(*routine) = ((*routine) & 0xfc) + 0x02;/* mark normal route unavailable */
|
|
}
|
|
|
|
void mark_dstSP_inaccessible(BYTE *routine)
|
|
{
|
|
(*routine) = ((*routine) & 0xcf);/* mark destination sp inaccessible */
|
|
}
|
|
|
|
int find_directLS_to_dst(long dst)
|
|
{
|
|
BYTE i;
|
|
|
|
for ( i=0; i<128; i++ )
|
|
{
|
|
if ( mtp3_para->ls_op_pc[i] == dst )
|
|
return i;
|
|
}
|
|
return 128;
|
|
}
|
|
|
|
void tsrc_rtpc_signalling_route_unavailable(BYTE dst, BYTE nw)
|
|
{
|
|
BYTE ls;
|
|
network *sp;
|
|
BYTE msgopc;
|
|
BYTE nls;
|
|
BYTE als;
|
|
|
|
nls = mtp3_para->nw[nw].normal_ls[dst];
|
|
als = mtp3_para->nw[nw].alternative_ls[dst];
|
|
sp = &mtp3.nw[nw];
|
|
msgopc = TFPmsg_OPC;
|
|
ls = mtp3_para->lk[TFPmsg_SrcLk].e1_to_linkset;
|
|
|
|
if ( ls > 127 )
|
|
return;
|
|
if ( mtp3.ls[ls].adjacentsp_restarting == 1 )/* adjacent sp restarting */
|
|
{
|
|
if (nls == ls)
|
|
mark_normal_linkset_unavailable(&sp->routine[dst]);
|
|
else if (als == ls)
|
|
mark_alternative_linkset_unavailable(&sp->routine[dst]);
|
|
}
|
|
else
|
|
{
|
|
if ( nls == ls )
|
|
{
|
|
if ( (sp->routine[dst] >> 6) == 2 )
|
|
return;
|
|
tsrc_fun6(TFPmsg_SrcLk,nw,dst);
|
|
hmrt_tfrc_update_routing_tables(dst,nw);
|
|
}
|
|
else if ( als == ls )
|
|
{
|
|
tsrc_fun6(TFPmsg_SrcLk,nw,dst);
|
|
hmrt_tfrc_update_routing_tables(dst,nw);
|
|
}
|
|
}
|
|
}
|
|
|
|
void tsrc_rtac_signalling_route_available(BYTE dst, BYTE nw)
|
|
{
|
|
int ls;
|
|
network *sp;
|
|
DWORD msgopc;
|
|
BYTE nls_t;
|
|
BYTE als_t;
|
|
BYTE current_route;
|
|
WORD msgopc_place;
|
|
int lsnoRSP_is_msgOPC;
|
|
|
|
sp = &mtp3.nw[nw];
|
|
current_route = sp->routine[dst] >> 6;
|
|
msgopc = TFAmsg_OPC;
|
|
ls = mtp3_para->lk[TFAmsg_SrcLk].e1_to_linkset;
|
|
if ( ls > 127 )
|
|
return;
|
|
lsnoRSP_is_msgOPC = find_directLS_to_dst(msgopc);
|
|
if ( lsnoRSP_is_msgOPC == 128 )
|
|
return;/* msg opc is not any linkset's remote sp */
|
|
msgopc_place = mtp3.ls[lsnoRSP_is_msgOPC].adjacent_sp_place;
|
|
if (msgopc_place > 255)
|
|
return;
|
|
|
|
if ( !own_sp_restarting )
|
|
{
|
|
if ( ((sp->routine[msgopc_place] >> 4) & 3) == SP_ACCESSIBLE )/* msg opc accessible */
|
|
tsrc_fun8(ls,nw,dst);
|
|
|
|
else/* msg opc inacessible */
|
|
{
|
|
// mtp3_debug(MTP3_DEBUG_LOG,"msgopc inacessible\n\r");
|
|
sp->rtac_input[msgopc_place] = RTAC_DEST_ACCESSIBLE;/* send tfa to all adjacent sp */
|
|
|
|
nls_t = mtp3_para->nw[nw].normal_ls[msgopc_place];
|
|
als_t = mtp3_para->nw[nw].alternative_ls[msgopc_place];
|
|
mtp3ObjInput.taprc_input[lsnoRSP_is_msgOPC] = TPRC_ADJACENT_SP_RESTARTING;
|
|
|
|
if ( nls_t == ls )
|
|
mark_normal_linkset_available(&sp->routine[msgopc_place]);
|
|
else if ( als_t == ls )
|
|
mark_alternative_linkset_available(&sp->routine[msgopc_place]);
|
|
current_measure->ls_measure[ls][4]++;/* Broadcast TFA for recovery of measured linkset */
|
|
}
|
|
}
|
|
hmrt_tfrc_update_routing_tables(msgopc_place,nw);
|
|
hmrt_tfrc_update_routing_tables(dst,nw);
|
|
}
|
|
|
|
void rtpc_proc(BYTE netw,BYTE dst)
|
|
{
|
|
network *nw;
|
|
BYTE ls;
|
|
|
|
nw = &mtp3.nw[netw];
|
|
switch ( nw->rtpc_state[dst] )
|
|
{
|
|
case RTPC_IDLE_STATE:
|
|
switch ( nw->rtpc_input[dst] )
|
|
{
|
|
case RTPC_RSRT_SEND_TFP_MSG:/* not supported */
|
|
nw->rtpc_input[dst] = IDLE;
|
|
hmrt_srm_msg(sdTFP_Ls,SIGNAL_TFP,mtp3_para->nw[netw].dpc[dst]);
|
|
nw->rtpc_state[dst] = RTPC_WAIT_STATE;
|
|
break;
|
|
|
|
case RTPC_TSRC_SEND_TFP_MSG:/* send tfp message to linkset opposit sp */
|
|
// printf("send tfp message to linkset %d,TFDPC=%lx\n",sdTFP_Ls,mtp3_para->nw[netw].dpc[dst]);
|
|
nw->rtpc_input[dst] = IDLE;
|
|
hmrt_srm_msg(sdTFP_Ls,SIGNAL_TFP,mtp3_para->nw[netw].dpc[dst]);
|
|
nw->rtpc_state[dst] = RTPC_WAIT_STATE;
|
|
break;
|
|
|
|
case RTPC_DEST_INACCESSIBLE:/*one dst inaccessible, send tfp to all adjacent sp about this dst */
|
|
nw->rtpc_input[dst] = IDLE;
|
|
for ( ls=0; ls<128; ls++ )
|
|
{
|
|
if ((mtp3_para->ls_pro[ls] & 3) == netw)
|
|
{
|
|
// printf("send tfp message to linkset %d,TFDPC=%lx\n",ls,mtp3_para->nw[netw].dpc[dst]);
|
|
hmrt_srm_msg(ls,SIGNAL_TFP,mtp3_para->nw[netw].dpc[dst]);/* send tfp to adjacent sp */
|
|
}
|
|
}
|
|
if (own_sp_restarting == 1)
|
|
{
|
|
// hmrt_tra_msg(ls);//printf("send tra\n");
|
|
mtp3ObjInput.tprc_input = TPRC_RTPC_TFP_SENT;
|
|
}
|
|
break;
|
|
|
|
case RTPC_TFP_MSG:/* receive TFP from other sp */
|
|
// printf("rtpc dst %d tfp\n",dst);
|
|
nw->rtpc_input[dst] = IDLE;
|
|
if ( controlled_rerouting_in_progress[dst] == TRUE )
|
|
transfer_prohibited[dst] = TRUE;
|
|
else
|
|
{
|
|
tsrc_rtpc_signalling_route_unavailable(dst,netw);
|
|
if (!own_sp_restarting)
|
|
{
|
|
nw->rsrt_input[dst] = RSRT_RTPC_ROUTE_SET_TEST;
|
|
}
|
|
//if sp isn't restarting
|
|
//start route set test
|
|
}
|
|
break;
|
|
|
|
case RTPC_CTRL_RERT_TERMINATED:/* not supported */
|
|
nw->rtpc_input[dst] = IDLE;
|
|
controlled_rerouting_in_progress[dst] = FALSE;
|
|
if ( transfer_prohibited[dst] == TRUE )
|
|
{
|
|
transfer_prohibited[dst] = FALSE;
|
|
//tsrc_rtpc_signalling_route_unavailable
|
|
//if sp isn't restarting
|
|
//start route set test
|
|
}
|
|
break;
|
|
|
|
case RTPC_CONTROLLED_RERT:/* not supported */
|
|
nw->rtpc_input[dst] = IDLE;
|
|
controlled_rerouting_in_progress[dst] = TRUE;
|
|
break;
|
|
|
|
case RTPC_RESTART_BEGINS:
|
|
nw->rtpc_input[dst] = IDLE;
|
|
controlled_rerouting_in_progress[dst] = FALSE;
|
|
transfer_prohibited[dst] = FALSE;
|
|
/* mark sp restarting */
|
|
break;
|
|
|
|
case RTPC_RESTART_ENDS:
|
|
nw->rtpc_input[dst] = IDLE;
|
|
/* cancel sp restarting */
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case RTPC_WAIT_STATE:
|
|
nw->rtpc_state[dst] = RTPC_IDLE_STATE;
|
|
break;
|
|
}
|
|
}
|
|
|
|
void rtac_proc(BYTE netw,BYTE dst)
|
|
{
|
|
network *nw;
|
|
BYTE ls;
|
|
|
|
nw = &mtp3.nw[netw];
|
|
switch ( nw->rtac_input[dst] )
|
|
{
|
|
case RTAC_TFA_MSG:
|
|
nw->rtac_input[dst] = IDLE;
|
|
tsrc_rtac_signalling_route_available(dst,netw);
|
|
nw->rsrt_input[dst] = RSRT_RTAC_ROUTE_AVAILABLE;
|
|
break;
|
|
|
|
case RTAC_DEST_ACCESSIBLE:// one dst become accessible, send tfa to all adjacent sp about this dst
|
|
nw->rtac_input[dst] = IDLE;
|
|
for ( ls=0; ls<128; ls++ )
|
|
{
|
|
if ( (mtp3_para->ls_pro[ls] & 3) == netw)
|
|
{
|
|
hmrt_srm_msg(ls,SIGNAL_TFA,mtp3_para->nw[netw].dpc[dst]);/* send tfa to adjacent sp */
|
|
}
|
|
}
|
|
break;
|
|
|
|
case RTAC_STP_NOLONGER_FOR_DEST:
|
|
nw->rtac_input[dst] = IDLE;
|
|
hmrt_srm_msg(sdTFA_Ls,SIGNAL_TFA,mtp3_para->nw[netw].dpc[dst]);
|
|
break;
|
|
|
|
case RTAC_SEND_TFA_MSG:
|
|
nw->rtac_input[dst] = IDLE;
|
|
hmrt_srm_msg(sdTFA_Ls,SIGNAL_TFA,mtp3_para->nw[netw].dpc[dst]);
|
|
break;
|
|
|
|
case RTAC_FORCED_RERT:
|
|
break;
|
|
|
|
case RTAC_FORCED_RERT_TERMINATED:
|
|
break;
|
|
|
|
case RTAC_FORCED_RERT_NOT_REQ:
|
|
break;
|
|
|
|
case RTAC_RESTART_BEGINS:
|
|
break;
|
|
|
|
case RTAC_RESTART_ENDS:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void rsrt_proc(BYTE netw,BYTE dst)
|
|
{
|
|
network *nw;
|
|
|
|
nw = &mtp3.nw[netw];
|
|
switch (nw->rsrt_state[dst])
|
|
{
|
|
case RSRT_IDLE_STATE:
|
|
switch (nw->rsrt_input[dst])
|
|
{
|
|
case RSRT_RTPC_ROUTE_SET_TEST:
|
|
nw->rsrt_t10[dst] = 0;
|
|
nw->rsrt_state[dst] = RSRT_WAIT_STATE;
|
|
break;
|
|
case RSRT_TSRC_ROUTE_SET_TEST:
|
|
hmrt_srm_msg(mtp3_para->nw[netw].normal_ls[dst],SIGNAL_RST,mtp3_para->nw[netw].dpc[dst]);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
case RSRT_WAIT_STATE:
|
|
nw->rsrt_t10[dst] ++;
|
|
switch (nw->rsrt_input[dst])
|
|
{
|
|
case RSRT_RTPC_ROUTE_SET_TEST:
|
|
break;
|
|
case RSRT_TSRC_ROUTE_SET_TEST:
|
|
break;
|
|
case RSRT_RTAC_ROUTE_AVAILABLE:
|
|
nw->rsrt_t10[dst] = 0;
|
|
nw->rsrt_state[dst] = RSRT_IDLE_STATE;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
if (nw->rsrt_t10[dst] >= mtp3_para->mtp3_t10)
|
|
{
|
|
hmrt_srm_msg(mtp3_para->nw[netw].normal_ls[dst],SIGNAL_RST,mtp3_para->nw[netw].dpc[dst]);
|
|
//send route test message out
|
|
nw->rsrt_t10[dst] = 0;
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
|
|
}
|
|
nw->rsrt_input[dst] = IDLE;
|
|
}
|
|
/*@end@*/
|
|
|