opnet包处理问题

来源:互联网 发布:魅族手机仅限数据连接 编辑:程序博客网 时间:2024/05/30 05:07

一、队列中包处理

在节点模型的队列处理机中,主要三个队列函数:
1.op_subq_pk_insert (index, pkptr, OPC_QPOS_TAIL);
2.pkptr = op_subq_pk_access(index, OPC_QPOS_HEAD);
3.pkptr = op_subq_pk_remove(index, OPC_QPOS_HEAD);
第一个是将包pkptr插入到由index指定的队尾中(OPC_QPOS_TAIL)。
第二个是将从index指定的队列中取得队头的包(OPC_QPOS_HEAD),但不删除。
第三个是将包从index指定的队列中删去队头的包(OPC_QPOS_HEAD)。
其中index可以是:0,1,2,3....
一般情况是,从高层收到包后,插入到指定的队列中,然后通过使用op_subq_pk_access得到队头的包并发送出去,如果成功接收则在队列中调用op_subq_pk_remove删除队头的包。


二、opnet包延迟问题

在opnet中,一般通过取当前时间与包创建时间之差做为延迟时间:
eg:
ete_delay = op_sim_time() - op_pk_creation_time_get (pktmp);
包的创建方式有三种,分别对应仿真核心的三个函数:
1.op_pk_create(),创建一个无格式包
2.op_pk_create_fmt(),创建一个有格式包
3.op_pk_copy(),复制一个包
包的创建时间即为调用这三个函数的时刻。
一般情况下,在发送包的时候会考虑发送失败需要重传的情况,如果利用op_pk_copy()来复制当前要发送的包做为备份的话,随后的统计包延迟信息可能会不准确,因为复制的时候把包的创建时间给更改了。这时候我们就需要对其进行处理,如:
//从队列中取出一个包,但不删除,以备重传的情况
pkptr = op_subq_pk_access(QUEUE,OPC_QPOS_HEAD);
//获得包的创建时间
pk_create_time = op_pk_creation_time_get(pkptr);
//复制一份当前包,这时候包的创建时间发生改变
pkptr = op_pk_copy(pkptr);
//重设包的创建时间,使复制的包时间与队列中包时间一致
op_pk_creation_time_set(pkptr, pk_create_time);
仿真结果:
1.不使用重设时间的情况:
节点1创建一个网络层包的时间:


节点1创建一个MAC层包的时间


节点2收到包的时间:


可以看出,节点2收的包的MAC包与NET包时间是一样的,这里是原为在MAC层复制了网络层的包从而使包的创建时间发生改变。
2.使用重设时间的情况:
节点1创建一个网络层包的时间:


节点1创建一个MAC层包的时间


节点2收到包的时间:


从以上对比可以看出,收发节点的网络层包时间是一致的。


三、统计信息

在opnet中,统计信息默认是以秒为单位的。


已知一个包的大小是1024bits,从图中可以看出,第14s时,接收的包是2048bits,在15s时是1024bits


这是在debug模式下输出的调试信息,可以看出,在10-11s时只有收到一个包,在14s时收到2个包,15时收到一个包,对应到上图可以看出是一致的。
原创粉丝点击