OPNET中常用函数
1、与调度相关:
(1)Evhandle op_intrpt_schedule_self(op_sim_time()+ 仿真推进的时间T,中断码),为调用进程调度一个自中断。通过调用它,你可以设置在何时产生一次中断,然后针对中断类型,作出相应的处理。其中,参数time指定了中断时间,而code 是你自己定义的一个中断标识,通过这个标识可以知道当前的中断类型。返回类型就是此中断事件的句柄。
a)你可以利用这个函数来表示一次time out。譬如,接收机正在等待接收数据包,如果2s后仍然没有收到相应数据,于是产生一个超时中断,便可以这样用:op_intrpt_schedule_self(op_sim_time( )+2, PKT_TIMEOUT)。如果在2s内收到了数据包,需要用op_ev_cancel(PKT_TIMEOUT)来取消中断。
b)另一种用法是表示一次处理延时。例如,发送方需要一定的时间来产生一个数据包,在这段时间后,才能发送数据包。
比如:
/* self interrupt scheduling */
evh = op_intrpt_schedule_self (sch_time, 5);
/* self interrupt cancelling */
op_ev_cancel (evh);
2、与仿真(指仿真过程)有关:
(1)double op_sim_time (),获得当前的仿真时间。.
3、与事件有关:
(1)Compcode op_ev_cancel(Evhandle env),取消前面已经被调度过的一个事件。
返回值:OPC_COMPCODE_SUCCESS或OPC_COMPCODE_FAILURE。
(2) Evhandle op_ev_current (),获理当前执行事件的句柄。
(3)int op_ev_type (evhandle), 获得当前执行事件的类型。常用的type有如下所示:
OPC_INTRPT_ACCESS—access interrupt
OPC_INTRPT_BEGSIM—begin simulation interrupt
OPC_INTRPT_ENDSIM—end simulation interrupt
OPC_INTRPT_PROCEDURE—procedure interrupt
OPC_INTRPT_PROCESS—process interrupt
OPC_INTRPT_RECOVER—node/link recovery interrupt
OPC_INTRPT_REGULAR—regular interrupt
OPC_INTRPT_REMOTE—remote interrupt)
OPC_INTRPT_SELF—self interrupt
OPC_INTRPT_STAT—statistic interrupt
OPC_INTRPT_STRM—stream interrupt
4、与分配/布相关:
(1)double op_dist_uniform (double limit),产生[0.0-limit)的随机数。
(2)Distribution* op_dist_load (const char* dist_name, double dist_arg0, double dist_arg1), 函数的返回值是:指向装入的分布的分布指针. 出错返回常量 OPC_NIL.作用是产生arg0到arg1符合分布dist_name(分布名,比如泊松)的随机数。
(3)double op_dist_outcome(Distribution* dist_ptr), 由指定分布产生一个浮点数.如果出错的话,返回OPC_DBL_INVALID.
5、与数据包相关(fd为无格式包操作,nfd为有格式包操作):
(1)Packet* op_pk_create (OpT_Packet_Size bulk_size), 创建一个无格式的数据包,大小为bulk_size.返回值:返回指向新创建的数据包的指针, or OPC_NIL。
(2)Packet* op_pk_create_fmt (const char* format_name), 新建一个先前定义好的格式数据包。返回指向新数据包的指针,失败返回OPC_NIL。
(3) void op_pk_destroy (Packet* pkptr), 销毁包,释放内存空间。
(4) void op_pk_format (Packet* pkptr, char* fmt_name), 获得pkptr所指向的数据包的包格式类型,赋给fmt_name。
(5)Compcode op_pk_nfd_get (Packet* pkptr, const char* fd_name,void* value_ptr),作用是将pkptr所指向的包的fd_name域的值读入到value_ptr中。返回值:如果成功,则返回相应的成功代码,失败则返回 OPC_COMPCODE_FAILURE。比如:
op_pk_nfd_get (pkptr, \
(5)void op_pk_send (Packet* pkptr, int outstrm_index),将pkptr所指向的包发送到outstrm_index所指向的输出流中。
(6)Packet* op_pk_get (int instrm_index),从instrm_index所指向的输入流中读入数据包,返回指向包的指针。
(7)Packet* op_pk_copy (Packet* pkptr),将pkptr所指向的数据包复制一份,并返回指向新数据包的指针。
(8)Compcode op_pk_fd_get(pkptr, field_index, value_ptr), 返回值是:成功为OPC_COMPCODE_FAILURE,OPC_COMPCODE_SUCCESS otherwise。比如:
op_pk_fd_get(pkptr, 0, &i);
(9)Compcode op_pk_fd_set (Packet* pkptr, int fd_index, int type, void* value, int/double/OpT_Int64 size),作用是设定pkptr所指向的数据包的字段索引,字段数据类型,字段值,及大小。
可用的type有:
OPC_FIELD_TYPE_INTEGER,OPC_FIELD_TYPE_INT64,OPC_FIELD_TYPE_DOUBLE,OPC_FIELD_TYPE_PACKET_ID,OPC_FIELD_TYPE_OBJECT_ID,andOPC_FIELD_TYPE_ PACKET。比如:
/* create an unformatted packet */
uf_pkptr = op_pk_create (64);
/* assign integer fields in the packet */
op_pk_fd_set (uf_pkptr, 0, OPC_FIELD_TYPE_INTEGER, 2511, 16);
int64_value = 5 * 200000000000;
op_pk_fd_set (uf_pkptr, 1, OPC_FIELD_TYPE_INT64, int64_value, 16); ...
/* encapsulate a higher-level packet in the packet */
enc_pkptr = op_pk_create (24);
op_pk_fd_set (uf_pkptr, 4, OPC_FIELD_TYPE_PACKET, enc_pkptr, -1);
(10)Compcode op_pk_nfd_get_objid (Packet* pkptr, const char* fd_name, Objid* value_ptr),作用是将pkptr所指向的包中域名为fd_name的值赋给value_ptr所指向的地址,比如:op_pk_nfd_get_objid (pkptr, \
(11)Compcode op_pk_nfd_set (Packet* pkptr,const char* fd_name, void* value),将pkptr所指向的包中域名为fd_name域赋值为value。比如:
op_pk_nfd_set (f_pkptr, \
(12)void op_pk_send_forced (Packet* pkptr, int outstrm_index),立即将指定的数据包发送到指定的输入输出索引。
(13)double op_pk_creation_time_get (Packet* pkptr) ,获得指定包创建的时间。
(14)void op_pk_send_quiet (Packet* pkptr, int outstrm_index) ,将包发出去,当到达目的模块时不会调度一个中断或调用,由目的模块主动来发现和获取。
(15)OpT_Packet_Size op_pk_bulk_size_get (Packet* pkptr),获得指定数据包的大小(以bit记)。如
/* obtain the arriving packet */
pkptr = op_pk_get (INPUT_STRM);
/* determine the bulk size of the packet */
bulk_size = op_pk_bulk_size_get (pkptr);
/* Compute the total time required to service the packet based on its size. */
/* Keep track of the service time as a global statistic. */
svc_time = bulk_size / svc_rate;
op_stat_global_write (svc_time_glob_stat, svc_time);
(15)Compcode op_pk_total_size_set (Packet* pkptr,OpT_Packet_Size total_size);给指定的数据包设定大小。如:
/* create a packet to send to mac */
pkptr = op_pk_create_fmt (\
/* assign its overall size. */
op_pk_total_size_set (pkptr, pklen);
/* assign the time of creation */
op_pk_nfd_set (pkptr, \
(16)Compcode op_pk_total_size_get (pkptr),获得指定数据包的大小。
(17)void op_pk_priority_set (Packet* pkptr, double value),给包设置优先级。(18)double op_pk_priority_get (Packet* pkptr),获得包的优先级。
(19)void op_pk_send_delayed (pkptr, outstrm_index, delay)
将pkptr指向的包在延时delay后传送到outstrm_index指向的输出流中。
6、与统计相关:
(1)void op_stat_write (Stathandle stat_handle, double value) ,将(time,value)写入到统计量中;其中time指当前时间,而value为刚刚由统计量stat_handle所指的值,也就是op_stat_write函数刚写入的value值。