📄 restoration_rte_bak.pr.c
字号:
back_fail++;
}
fail[source_address][destination_address]++;
}
op_pk_destroy(pkptr);
s_f_flag = 1;
}
}
//************************* sub *************************
//************************* link **************************
if(restoration_flag == LINK)
{
if(old_offset_time > 0)
{
//rev_pk_count++;
//op_stat_write(rev_pk_cnt_stathandle, rev_pk_count);
if(userid != source_address)
{
op_pk_nfd_get (pkptr, "bef", &bef_address);
link_receive[userid][bef_address]++;
//node_pk_count++;
}
if(dest_objid != node_objid) //No destination
{
op_rte_pk_dst_node (pkptr, &subnet_id, &dst_node_id);
op_ima_obj_attr_get (dst_node_id, "user id", &dst_address);
if(dst_address == userid) //downstream node change routing again
{
min_rptr_copy = op_rte_route_copy (min_rptr[userid][destination_address]);
current_rptr = min_rptr_copy;
pk_rptr = op_rte_route_copy (current_rptr);
op_rte_pk_route_insert (pkptr, pk_rptr);
}
op_rte_pk_next_node (pkptr, &subnet_id, &next_node_id);
op_ima_obj_attr_get (next_node_id, "user id", &next_address);
if (
(userid == notification_message->fail_link_node1 && next_address == notification_message->fail_link_node2) ||
(userid == notification_message->fail_link_node2 && next_address == notification_message->fail_link_node1)
)
{
min_rptr_copy = op_rte_route_copy (min_rptr[userid][next_address]);
current_rptr = min_rptr_copy;
pk_rptr = op_rte_route_copy (current_rptr);
op_rte_pk_route_insert (pkptr, pk_rptr);
/*
num_nodes = op_rte_route_num_nodes (pk_rptr);
n_start_time = (PROC_TIME + LINK_DELAY)*(num_nodes-1);
op_pk_nfd_get (pkptr, "start", &o_start_time);
start_time = o_start_time + n_start_time;
op_pk_nfd_set (pkptr, "start", start_time);
*/
op_pk_nfd_set (pkptr, "flag", 1);
op_pk_nfd_set (pkptr, "route_flag", 1);
gen_backup_bcp++;
//printf("link\n");
//getchar();
}
//****** need schedule **********
need_schedule = 1;
//****** need schedule **********
}
else if(dest_objid == node_objid) //this node is the packet's destination
{
s_f_flag = 1;
op_pk_nfd_get(pkptr, "route_flag", &route_flag);
if(route_flag==1)
{
back_succ++;
}
op_pk_send (pkptr, PK_OUT_STRM); //sink
}
}
else if(old_offset_time <= 0)
{
if(op_sim_time() >= s_time)
{
op_pk_nfd_get(pkptr, "route_flag", &route_flag);
if(route_flag==1)
{
back_fail++;
}
fail[source_address][destination_address]++;
}
op_pk_destroy(pkptr);
s_f_flag = 1;
}
}
//**************************** link *****************************
//**************************** normal ***************************
if(restoration_flag == NORMAL)
{
if(old_offset_time > 0)
{
//rev_pk_count++;
//op_stat_write(rev_pk_cnt_stathandle, rev_pk_count);
if(userid != source_address)
{
op_pk_nfd_get (pkptr, "bef", &bef_address);
link_receive[userid][bef_address]++;
//node_pk_count++;
}
else
{
if(FIS_GET[userid] == 1 && FIS_TYPE[userid] == PATH)
{
backup_flag = 0;
for(k=0; k<primary_num_nodes[source_address][destination_address]-1; k++)
{
if(
((Primary_path[userid][destination_address][k] == FIS_NODE1[userid]) &&
(Primary_path[userid][destination_address][k+1] == FIS_NODE2[userid]))
||
((Primary_path[userid][destination_address][k] == FIS_NODE2[userid]) &&
(Primary_path[userid][destination_address][k+1] == FIS_NODE1[userid]))
)
{
backup_flag = 1;
}
if(backup_flag == 1) break;
}
if(backup_flag == 1)
{
min_rptr_copy = op_rte_route_copy (min_rptr[userid][destination_address]);
current_rptr = min_rptr_copy;
pk_rptr = op_rte_route_copy (current_rptr);
op_rte_pk_route_insert (pkptr, pk_rptr);
op_pk_nfd_set (pkptr, "route_flag", 1); //backup path flag
gen_backup_bcp++;
}
}
}//if(userid == source_address)
if (dest_objid == node_objid) //this node is the packet's destination
{
op_pk_nfd_get(pkptr, "route_flag", &route_flag);
if(route_flag==1)
{
back_succ++;
}
op_pk_send (pkptr, PK_OUT_STRM); //sink
s_f_flag = 1;
}
else
{
op_rte_pk_next_node (pkptr, &subnet_id, &next_node_id);
op_ima_obj_attr_get (next_node_id, "user id", &next_address);
if(
(notification_message->fail_type == 3) &&
((userid == notification_message->fail_link_node1 && next_address == notification_message->fail_link_node2) ||
(userid == notification_message->fail_link_node2 && next_address == notification_message->fail_link_node1))
)
{
if(op_sim_time() >= s_time)
{
fis_fail[source_address][destination_address]++;
gen_backup_bcp++;
back_fail++;
}
op_pk_destroy(pkptr);
s_f_flag = 1;
}
else
{
//****** need schedule **********
need_schedule = 1;
//****** need schedule **********
}
} //else if (dest_objid != node_objid)
}
else if(old_offset_time <= 0)
{
if(op_sim_time() >= s_time)
{
op_pk_nfd_get(pkptr, "route_flag", &route_flag);
if(route_flag==1)
{
back_fail++;
}
fail[source_address][destination_address]++;
}
op_pk_destroy(pkptr);
s_f_flag = 1;
}
}
//************************** normal **************************
//**************************** need schedule ************************************
if(need_schedule == 1)
{
send_check = 1;
op_rte_pk_next_node (pkptr, &subnet_id, &next_node_id);
op_ima_obj_attr_get (next_node_id, "user id", &next_address);
cur_time = op_sim_time();
op_pk_nfd_get (pkptr, "start", &start_time);
op_pk_nfd_get (pkptr, "dtime", &dtime_time);
start_time = cur_time + start_time;
dtime_time = start_time + dtime_time;
wave_info_table = (wave_info *) op_prg_mem_alloc (sizeof (wave_info));
/*
if(op_sim_time() > s_time)
{
if(userid == 2 && next_address == 4)
{
printf("start_time = %f\tdtime_time = %f\n",start_time,dtime_time);
getchar();
}
}
*/
//**************************************** wave arrival update based on time **********************************************
/*
if ( (op_sim_time() >= s_time) )
{
if(userid == 2 && next_address == 4)
{
printf("\n*****************************************************");
printf("\nOne PK Pass:\narrival = %f\tfinish = %f\tcurrent = %d\tnext = %d",start_time,dtime_time,userid,next_address);
printf("\nold wave list:");
}
}
*/
for(wave_count=0;wave_count<WAVE_NUM;wave_count++)
{
num = op_prg_list_size(wave_lptr[userid][next_address][wave_count]);
/*
if ( (op_sim_time() >= s_time) )
{
if(userid == 2 && next_address == 4)
{
printf("\nwave_index = %d\tlist_size = %d", wave_count, num);
}
}
*/
for(i=0;i<num;i++)
{
wave = (wave_info *)op_prg_list_access (wave_lptr[userid][next_address][wave_count], i);
list_table[i][0] = wave->start;
list_table[i][1] = wave->dtime;
/*
if ( (op_sim_time() >= s_time) )
{
if(userid == 2 && next_address == 4)
{
printf("\nlist_index = %d\tnow = %f\tstart = %f\tdtime = %f",
i, cur_time, list_table[i][0], list_table[i][1]);
}
}
*/
}
delete_num = 999; // list size check
num = op_prg_list_size(wave_lptr[userid][next_address][wave_count]);
for(i=0;i<num;i++)
{
if(cur_time > list_table[i][1])
{
delete_num = i;
}
}
if(delete_num != 999)
{
if(delete_num == 0)
{
wave_free = op_prg_list_remove (wave_lptr[userid][next_address][wave_count], OPC_LISTPOS_HEAD);
op_prg_mem_free(wave_free);
}
else
{
for(i=0;i<=delete_num;i++)
{
wave_free = op_prg_list_remove (wave_lptr[userid][next_address][wave_count], OPC_LISTPOS_HEAD);
op_prg_mem_free(wave_free);
}
}
}
}//for(wave_count=0;wave_count<WAVE_NUM;wave_count++)
//******************************************* insert ***************************************************************
//************************** get gap[userid][next_address][wave_count] ******************************
for(wave_count=0;wave_count<WAVE_NUM;wave_count++)
{
if(start_time < cur_time)
{
gap[userid][next_address][wave_count] = -1;
}
else
{
num1 = op_prg_list_size(wave_lptr[userid][next_address][wave_count]); // original list table
for(i=0;i<num1;i++)
{
wave = (wave_info *)op_prg_list_access (wave_lptr[userid][next_address][wave_count], i);
list_table[i][0] = wave->start;
list_table[i][1] = wave->dtime;
}
if(num1 == 0) //Original list table is empty
{
gap[userid][next_address][wave_count] = 100;
}
else //Original list table is not empty
{
loop_stop = 0;
for(i=0;i<num1;i++) //every list table check
{
if(i==num1-1) //list table tail
{
start_time_1 = list_table[i][0];
dtime_time_1 = list_table[i][1];
if(start_time > dtime_time_1) //insert PK to this list tail
{
gap[userid][next_address][wave_count] = (double) (start_time - dtime_time_1);
loop_stop = 1;
}
else //insert failure
{
gap[userid][next_address][wave_count] = -1;
}
}
if(i!=num1-1) //list table head and body
{
start_time_1 = list_table[i][0];
dtime_time_1 = list_table[i][1];
start_time_2 = list_table[i+1][0];
dtime_time_2 = list_table[i+1][1];
if( (start_time > dtime_time_1) && (dtime_time < start_time_2) )
{
gap[userid][next_address][wave_count] = (double) (start_time - dtime_time_1);
loop_stop = 1;
}
else
{
gap[userid][next_address][wave_count] = -1;
}
}
if(loop_stop == 1) break;
} //for(i=0;i<num2;i++)
} // else
}
/*
if ( (op_sim_time() >= s_time) )
{
if(userid == 2 && next_address == 4)
{
printf("\ngap[%d][%d][%d] = %f",userid,next_address, wave_count,gap[userid][next_address][wave_count]);
}
}
*/
} //for(wave_count=0;wave_count<WAVE_NUM;wave_count++)
temp_gap = 999;
temp_wave = -1;
for(wave_count=0;wave_count<WAVE_NUM;wave_count++)
{
if(gap[userid][next_address][wave_count] != -1)
{
if(gap[userid][next_address][wave_count]<temp_gap)
{
temp_gap = gap[userid][next_address][wave_count];
temp_wave = wave_count;
}
}
}
/*
if ( (op_sim_time() >= s_time) )
{
if(userid == 2 && next_address == 4)
{
printf("\nMIN_gap[%d][%d][%d] = %f",userid, next_address,temp_wave,temp_gap);
getchar();
}
}
*/
//************************** insert or fail ********************************************
if(temp_wave != -1)
{
wave_count = temp_wave;
send_check = 0;
wave_info_table->start = start_time;
wave_info_table->dtime = dtime_time;
num1 = op_prg_list_size(wave_lptr[userid][next_address][wave_count]); // original list table
for(i=0;i<num1;i++)
{
list_table[i][0] = 0;
list_table[i][1] = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -