void aodv_support_routing_traffic_sent_stats_update (AodvT_Local_Stathandles* stat_handle_ptr, AodvT_Global_Stathandles* global_stathandle_ptr, Packet* pkptr) { OpT_Packet_Size pkt_size; /** Updates the routing traffic sent statistics **/ /** in both bits/sec and pkts/sec **/ FIN (aodv_support_routing_traffic_sent_stats_update (<args>)); /* Get the size of the packet */ pkt_size = op_pk_total_size_get (pkptr); /* Update the local routing traffic sent stat in bps */ op_stat_write (stat_handle_ptr->rte_traf_sent_bps_shandle, pkt_size); op_stat_write (stat_handle_ptr->rte_traf_sent_bps_shandle, 0.0); /* Update the local routing traffic sent stat in pps */ op_stat_write (stat_handle_ptr->rte_traf_sent_pps_shandle, 1.0); op_stat_write (stat_handle_ptr->rte_traf_sent_pps_shandle, 0.0); /* Update the global routing traffic sent stat in bps */ op_stat_write (global_stathandle_ptr->rte_traf_sent_bps_global_shandle, pkt_size); op_stat_write (global_stathandle_ptr->rte_traf_sent_bps_global_shandle, 0.0); /* Update the global routing traffic sent stat in pps */ op_stat_write (global_stathandle_ptr->rte_traf_sent_pps_global_shandle, 1.0); op_stat_write (global_stathandle_ptr->rte_traf_sent_pps_global_shandle, 0.0); FOUT; }
void ra_aloha_ss_intrpt_strm_handler(void) { Packet* sduptr; Packet* pduptr; int istrm; int ss_id; char pk_fmt_str[64]; static Boolean wait_ack_flag = OPC_FALSE; static Evhandle tr_ack; FIN(ra_aloha_ss_intrpt_strm_handler()); istrm = op_intrpt_strm(); if (istrm == svptr->istrm_hl) { sduptr = op_pk_get(istrm); if (wait_ack_flag) { //What will happen if the subq overflows? op_subq_pk_insert(0, sduptr, OPC_QPOS_TAIL); if (op_prg_odb_ltrace_active("aloha")) { op_prg_odb_print_major("Queueing a data packet.", OPC_NIL); } FOUT ; } buf_pkptr = op_pk_copy(sduptr); pduptr = op_pk_create_fmt(Ra_Aloha_Data_Pk_Name ); op_stat_write(svptr->sh_load_bits, op_pk_total_size_get(sduptr)); op_stat_write(svptr->sh_load_bits, 0.0); op_stat_write(svptr->gsh_load_bits, op_pk_total_size_get(sduptr)); op_stat_write(svptr->gsh_load_bits, 0.0); op_pk_nfd_set_pkt(pduptr, "Data", sduptr); op_pk_send(pduptr, svptr->ostrm_ll); tr_ack = op_intrpt_schedule_self(Cur_Time + tr_len_ack, TR_ACK_TO); wait_ack_flag = OPC_TRUE; if (op_prg_odb_ltrace_active("aloha")) { op_prg_odb_print_major("Sending a data packet.", OPC_NIL); } } else if (istrm == svptr->istrm_ll) { pduptr = op_pk_get(istrm); op_pk_format(pduptr, pk_fmt_str); if (strcmp(pk_fmt_str, Ra_Aloha_Ack_Pk_Name)==0) { op_pk_nfd_get_int32(pduptr, "SS ID", & ss_id); if (ss_id != svptr->ss_id) { op_pk_destroy(pduptr); FOUT; } wait_ack_flag = OPC_FALSE; //TODO: check whether the timer event is valid op_ev_cancel(tr_ack); //op_ev_cancel(svptr->tr_ack); op_stat_write(svptr->sh_goodput_bits, op_pk_total_size_get(buf_pkptr)); op_stat_write(svptr->sh_goodput_bits, 0.0); op_pk_destroy(buf_pkptr); //the waiting queue is not empty, scheduing next tx if (!op_subq_empty(0)) { sduptr = ra_aloha_ss_dequeue(); buf_pkptr = op_pk_copy(sduptr); pduptr = op_pk_create_fmt(Ra_Aloha_Data_Pk_Name ); op_pk_nfd_set(pduptr, "Data", sduptr); op_pk_send(pduptr, svptr->ostrm_ll); op_pk_send(pduptr, svptr->ostrm_ll); tr_ack = op_intrpt_schedule_self(Cur_Time + tr_len_ack, TR_ACK_TO); } } //op_pk_send(pduptr, svptr->ostrm_hl); } //istrm_ll FOUT; }