sink模块的进程模型是sink,是OPNET中最简单的进程,功能是"Accepts packets from the source and destroys them",也是新建一个processor时的默认进程模型。
sink模型的state variable有10个,其中5个是local statistic,5个是global statistic,
temp vairable 包括:
Packet* pkptr;
double pk_size;
double ete_delay;
没有函数模块。
状态机很简单:
INIT状态的入口函数是在初始化各统计量handle,使用op_stat_reg()函数注册,然后可以通过这些handle写入数据,如:
bits_rcvd_stathandle = op_stat_reg ("Traffic Sink.Traffic Received (bits)", OPC_STAT_INDEX_NONE, OPC_STAT_LOCAL);
其中"Traffic Sink"大概与group有关。
DISCARD状态的出口函数功能是从输入包流中获得包,记录下统计量,然后销毁包。
/* Obtain the incoming packet. */
pkptr = op_pk_get (op_intrpt_strm ()); //从输入流得到包指针pkptr
/* Caclulate metrics to be updated. */
pk_size = (double) op_pk_total_size_get (pkptr); //得到包总大小
ete_delay = op_sim_time () - op_pk_creation_time_get (pkptr); /*得到这个包的端到端延迟,注意这三个变量都是temp variable,每次在状态跳转后的值都不会保留*/
/* Update local statistics. */
op_stat_write (bits_rcvd_stathandle, pk_size); //收到bits
op_stat_write (pkts_rcvd_stathandle, 1.0); //收到packets
op_stat_write (ete_delay_stathandle, ete_delay); //端到端延迟
op_stat_write (bitssec_rcvd_stathandle, pk_size); //写bits然后马上清零???
op_stat_write (bitssec_rcvd_stathandle, 0.0);
op_stat_write (pktssec_rcvd_stathandle, 1.0); //写packets然后马上清零???
op_stat_write (pktssec_rcvd_stathandle, 0.0);
/* Update global statistics. */
op_stat_write (bits_rcvd_gstathandle, pk_size); //收到bits
op_stat_write (pkts_rcvd_gstathandle, 1.0); //收到packets
op_stat_write (ete_delay_gstathandle, ete_delay); //端到端延迟
op_stat_write (bitssec_rcvd_gstathandle, pk_size);
op_stat_write (bitssec_rcvd_gstathandle, 0.0);
op_stat_write (pktssec_rcvd_gstathandle, 1.0);
op_stat_write (pktssec_rcvd_gstathandle, 0.0);
/* Destroy the received packet. */
op_pk_destroy (pkptr); //销毁包
问题:bitssec_rcvd_stathandle这些统计量为什么需要写完马上清零?是怎样统计的?
大概所有统计速度的(xxx/s)都需要写完马上清零,在simple_source中就是这么做的。