显示标签为“OPNET”的博文。显示所有博文
显示标签为“OPNET”的博文。显示所有博文

2009年5月9日星期六

OPNET Process Model : mpls_mgr

去年的OPNET笔记整理,看看能坚持几篇?!

毕竟OPNET这个东西实在是太BT了,T__T


SV:

节点名:my_node_hname

路由器IP接口数:num_ip_interfaces

IP模块数据指针:ip_module_data_ptr

数据包指针:packet_ptr


FB:

MPLS标签处理,数据包转发:

static void mpls_mgr_packet_forward (MplsT_Forward_State* state_ptr, IpT_Rte_Ind_Ici_Fields* intf_ici_fdstruct_ptr)

解析配置的LSP参数,建立LSP,并绑定到FEC跟TRUNK:

static void mpls_mgr_lsps_parse ()

取路由器第i个接口的IP:

   ip_intf_i_ptr = ip_rte_intf_tbl_access (ip_module_data_ptr, i);
   intf_i_ip = ip_rte_intf_addr_get (ip_intf_i_ptr);
   ip_address_print(str_intf_i_ip, intf_i_ip);

取数据包的源&目的IP地址:

if (op_pk_nfd_access (packet_ptr, "fields", &pk_fd_ptr) == OPC_COMPCODE_SUCCESS){
   inet_address_print (str_src_addr, pk_fd_ptr->src_addr);
   inet_address_print (str_dest_addr, pk_fd_ptr->dest_addr);   
   /* 协议号:pk_fd_ptr->protocol */
}  

LSP的绑定笔记:

新建一个te_binding :

   te_binding = (MplsT_TE_Binding*) op_prg_mem_alloc (sizeof (MplsT_TE_Binding));
 

如果有入接口信息就加进去:

   op_prg_list_insert (te_binding->binded_ifaces_lptr, in_iface_ptr, OPC_LISTPOS_TAIL);
  

根据fec_name取得fecs_lptr:

   te_binding->binded_fecs_lptr = (List*) oms_data_def_entry_access ("fecs", fec_name);

根据traffic_trunk_name设定te_binging对应的参数,并取指针:

   strcpy(te_binding->binded_trunk_name,traffic_trunk_name);
   traffic_trunk_ptr = (MplsT_Traffic_Trunk*) oms_data_def_entry_access ("MPLS Traffic Trunks",
   te_binding->binded_trunk_name);

LSP注册:

   mpls_support_registered_lsp_create (lsp_name, te_binding);

得到LSP信息指针:

   lsp_info_ptr = mpls_support_lsp_info_get_from_name (lsp_name);
   path_attrs_ptr = (MplsT_Path_Attrs*) lsp_info_ptr->path_attrs;

静态LSP绑定:

if ((mpls_path_attrs_ptr->lsp_type  == MplsC_Lsp_Type_Elsp) ||
      (mpls_path_attrs_ptr->lsp_type  == MplsC_Lsp_Type_Llsp))
{
  // ......FLM......
    mpls_mgr_lsp_binding_create (lsp_name, weight, fec_lptr, label_space_handle, traffic_trunk_instance_ptr, in_iface, fec_name);  
}

动态LSP绑定:

else if ((path_attrs_ptr->lsp_type  == MplsC_Lsp_Type_Dyn_Elsp) ||
                (path_attrs_ptr->lsp_type  == MplsC_Lsp_Type_Dyn_Llsp))
    {
      //......
      op_prg_list_insert (lsp_state_info_ptr->lsp_bindings_lptr, te_binding, OPC_LISTPOS_TAIL);
      //......
      op_prg_list_insert (dynamic_lsps_lptr, dynamic_lsp_detail_ptr, OPC_LISTPOS_TAIL);
}

2009年1月7日星期三

OPNET:设MPLS时LSP监测不到流量

有可能是IP路由的问题,默认是rip协议,ip能跑,但是加了mpls之后,lsp一直没流量。
换成ospf就好了。

2008年12月15日星期一

OPNET:找不到Traffic Growth

重装OPNET后运行仿真时找不到Traffic Growth选项卡了,如下:

需要在Product Modules中打开:

2008年12月12日星期五

OPNET:mpls出现rsvp错误

根据des的log信息,找到对应路由器上的lsp,选择显示lsp。 错误信息一般出现形式:

<<< Recoverable Error >>> Object ID (OPC_OBJID_INVALID) is out-of-range. T (140), EV (759563), MOD (top.Network.subnet_3.subnet_1.R1.rsvp)

2008年9月4日星期四

2008年8月1日星期五

OPNET:出现unresolved externals错误

首先确认在Process Model那边声明了外部文件,具体是在File->Declare External Files那边添加。
比如mpls_mgr进程使用了mpls_path_support外部文件。

我们在mpls_path_support处添加一个自定义函数,该函数没有返回任何值:
MPLSC_EXPORT void
mpls_path_test_function(char *lsp_name);
这边返回类型写成了MPLSC_EXPORT void,如果写成static void的话,编译能通过,但是运行仿真时总会报出现unresolved externals的错误。

另,在mpls_path_support.c开头有MPLSC_EXPORT的宏定义:
#define MPLSC_EXPORT DLLEXPORT

OPNET:指定编辑器

默认的编辑器字最大也就调成9号,看着超累。
把Edit->Preferences->editor_prog的值从built-in改成我们指定的编辑器地址,比如:d:\file\vim\vim71\gvim.exe。

OPNET:工程文件夹下文件的读取、写入

详见:\models\std\utilities\oms\oms_ext_file_support.ex.c

包含以下函数:

Oms_Ext_File_Handle_Get
Oms_Ext_File_Open
Oms_Ext_File_Write
Oms_Ext_File_Close
Oms_Ext_File_Info_Append
Oms_Ext_File_Name_Get
Oms_Ext_File_Clear
oms_ext_file_desc_create 

2008年7月22日星期二

OPNET:从GDF文件导入LSP

资料:MPLS Model User Guide---Specialized Models User Guide---MPLS Model User Guide

LSP信息的GDF假设名为zzz-lsp_info.gdf,每条LSP相当于文件中的一行:

# Field Legend:
# -------------
# LSP Name      Path with outgoing interface at each node.         LSP Color
#----------------------------------


Dynamic:R2 - R1, Campus Network.R2:L, Campus Network.R1:None,Start:150.00,End:-1.00,BW:1040.00,Delay:-1.00,Hops:-1,Retry:40.00,Max_attempts:1,Color:3

把zzz-lsp_info.gdf放入已设定的Model文件夹内,比如放到我们自定义的e:\work\opnet\project内。

我们可以通过File->Open->Generic Data File窗口查看其内容:

2008-07-22_095750

2008-07-22_095932

选择Protocol->MPLS->Import LSP Information进行LSP导入,还要选"Show All"才会显示这些新导入的LSP :

2008-07-22_100415

选择Protocol->MPLS->Update LSP Details,更新LSP信息。

LSP导入完毕。

2008年6月12日星期四

OPNET:数据包自定义域值的设置与存取

FILE->OPEN->Files Of Type下拉框中选Packet Format,选中要修改的包格式打开:

sshot-1

如上图所示,新添一个field 0域,虽然实际写入该域的结构体可能比较复杂,不过域值类型偶还是选integer好了。

因为上回我选了structure,结果域值死活取不出来,简直要流泪了。

一怒之下换成integer竟然就取出来了,虽然之前写进去的那个结构体根本不是int型的。

囧毙了,不知道为啥会这样。

在OPNET->HELP->Product Documentation->Discrete Event Simulation API Reference Manual->10 Packet Package下面有

数据包处理的函数,其中常用的几个域值存取函数如下:

op_pk_nfd_is_set()

op_pk_nfd_set()

op_pk_nfd_access()

2008年4月2日星期三

OPNET中添加新的Project存放路径

来源:如何将模块添加到OPNET中?

  • 如何将模块添加到OPNET中? edit - > preferences -> mod_dirs 添加模块路径即可。
  • 为什么每次新建一个project 都给我保存在 c:\op_models 目录下 ,我想换一个地 方,怎么设置? edit - > preferences -> mod_dirs中,新建一个路径,并作为第一路径即可。

OPNET中Obj id和User id的区别

来源:Objid和user id的区别?
Objid是系统分配的,全局唯一,整数。user id是自己可以设置的,可以不唯一。

OPNET中宏指令FIN/FRET/FOUT的功能

来源:OPNET中的函数FIN,FRET以及FOUT都是什么功能?
为了使一个用户定义的函数被执行,该函数必须与一个特殊的堆栈跟踪代码相连。堆栈跟踪技术靠在函数的入口点和出口点插入预处理器宏指令完成(一个函数只有一个入口点,但可以有多个出口点(由C语言的return声明决定))。
这些宏指令为:FIN、FOUT和FRET。FIN被插入到函数的入口点,FOUT被插入到函数的出口点,但却不返回任何值,FRET被插入到函数的出口点,返回一个值。注意这些宏指令不需要以分号结束(它们自我包含),FIN的参数中也不需要双引号。
Opnet提供的所有的示例模型都包含了这些宏指令,并且建议用户定义的函数也包含这些宏指令。如果FIN、FOUT、和FRET被正确插入了用户代码中,我们就可以使用op_vuerr来找出程序错误的位置,哪怕是在一个嵌套的模型函数调用中。

2008年4月1日星期二

OPNET中的IP-MPLS模型

来源:基于ATM的MPLS仿真模型的总体设计

OPNET中具有基于IP的MPLS标准模型(IP-MPLS模型),它是基于标签来完成交换的,而且在交换中只是标签有效,其它IP包的字段无效。

(1)IP模块:完成IP转发处理、ICMP处理等处理以及IP-MPLS中的MPLS标签交换处理的整个过程。这个模块是IP-MPLS模型的核心部分。它统一协调整个模型的运行,整个模型的全局数据也在这个模块模型中定义维护:接口表,路由转发表,标签空间,LSP的NHLFE表等。这些全局的数据结构定义为Ip_Rte_Module_Data类型的数据结构指针变量。通过在模块根进程(ip_dispatch)中实现为QP_level memory。本模块里面的所有进程可以直接访问,其他模块下面的进程通过OPNET的process registry技术来完成访问。

(2)LDP模块:完成基于IP的MPLS的控制信令功能。分配的标签结果和建立的LSP将被IP模块访问使用。

OPNET中查看MPLS建模的例子

打开:

FILE -> OPEN -> Files of type:Project

-> OPNET\XX.X.X\models\std

-> example_networks -> mpls

open_mpls

切换场景:

Scenarios -> Switch to scenario -> MPLS with DiffServ(等等)

switch_mpls