问题: ip模块很复杂,一开始只是看ip模块中的代码,搞得云里雾里。
从头到尾都没有判断目的地址的地方,甚至都没有处理来自arp层的流中断strm_inprtr。
原因: 具体实现代码在 ip_rte_support.ex.c 文件中ip_rte_packet_send
是这样子的,OPNET在调用子进程时,有四种方式,分别是:
Normal Steering•Type-based Steering•Port-based Steering对于后两种方式,当收到特定类型(type-based)或特定端口上(port-based)的中断时,就直接进入相应的子进程而不通过父进程进行调用。具体的你可以参考OPNETWork2002 1504嗯,里面说的挺清楚的。把我的理解贴出来,请你看看对不:
Manual Steering:顾名思义就是手工的来调用子进程。比如说,父进程收到一个流中断后,经过判断是要交给某个子进程处理的,那么就通过op_pro_invoke()来手工的调用子进程。
Normal Steering:用一个例子来说吧:当子进程用op_intrpt_schedule_self()定制了一个自中断,那么当这一中断到来时,系统内核会自动调用该子进程而不通过父进程来调用它。
Type_based Steering:则需要子进程通过op_intrpt_type_register()来注册某一类型的中断,当该类型的中断到来时,也会直接的调用该子进程。
Port_based Steering:与基于Type的类似。
应该是某个子进程注册了Port_based Steering之类的函数,截断了来arp来的流中断。然后执行了 ip_rte_support.ex.c中的ip_rte_packet_send 函数。
参考文章http://netemu.cn/NetworkSimulation/Opnet/20071028/265-1.html
唉,之前没有意识到,子进程功能实现是另外再画了个进程图。悲剧!!!许多功能都是子进程做的,看父进程一头雾水。
查看子进程:
首先创建好子进程,并保存
在进程模块里,FILE--delcare child process models,选中创建的进程,即加入了子进程。
在进程中,使用op_pro_create("proc_name",ptc_mem_ptr)创建子进程,返回进程句柄prohandle(事先需要使用op_prg_mem_alloc()开辟一个内存ptc_mem_ptr,即parent to child memory,父子共享内存,用于存放共享数据)。具体使用方法可以在help和核心函数里查询。
然后通过op_pro_invoke(prohandle,argmem_ptr),就可以需要的地方调用子进程。
参考地址:http://www.baisi.net/viewthread.php?tid=64569