⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ip_rte_support.ex.c

📁 备
💻 C
📖 第 1 页 / 共 5 页
字号:
/* ip_rte_support.ex.c */
/* Support routines for ip_dispatch and its associated child processes */

/****************************************/
/*      Copyright (c) 1987 - 2002       */
/*      by OPNET Technologies, Inc.     */
/*       (A Delaware Corporation)       */
/*    7255 Woodmont Av., Suite 250      */
/*     Bethesda, MD 20814, U.S.A.       */
/*       All Rights Reserved.           */
/****************************************/

/* ---- (SECTION_INC) Include Directives ---- */

#include <string.h>
#include <opnet.h>
#include <ip_rte_support.h>
#include <mpls_support.h>
#include <ip_addr_v4.h>
#include <oms_bgutil.h>
#include <ip_vrf_table.h>
#include <ip_te_support.h>
#include <ip_rte_v4.h>
#include <ip_rte_slot.h>
#include <oms_slot.h>
#include <ip_cmn_rte_table.h>
#include <ip_rte_table_v4.h>
#include <dsr_pkt_support.h>
#include <ip_mcast_support.h>
#include <ip_sim_attr_cache.h>
#include <ip_ot_support.h>
#include <manet_tora_imep.h>
#include <mobile_ip_support.h>
#include <ip_notif_log_support.h>
#include <oms_rr.h>
#include <umts_gtp_support.h>
#include <ip_firewall.h>
#include <aodv.h>
#include <aodv_ptypes.h>
#include <aodv_pkt_support.h>
//koo
#include <dymo.h>
#include <dymo_ptypes.h>
#include <dymo_pkt_support.h>
//koo
#include <mpls_path_support.h>
#include <ip_grouping.h>
#include "mipv6_signaling_sup.h"
#include "mipv6_support.h"


/* ---- Internal Data types ---- */
typedef enum IpT_Support_Intf_Type
	{
	IpC_Support_Intf_Type_Physical = 0,
	IpC_Support_Intf_Type_Loopback = 1,
	IpC_Support_Intf_Type_Tunnel = 2,
	IpC_Support_Intf_Type_Virtual = 3,
	IpC_Support_Intf_Type_Aggregate = 4,
	IpC_Support_Intf_Type_Number
	} IpT_Support_Intf_Type;

#define NUM_INTERFACE_TYPES		IpC_Support_Intf_Type_Number

static const char* local_intf_name = "Local";

typedef struct IpT_Rte_Datagram_Dest_Get_Args
	{
	IpT_Rte_Module_Data*		iprmd_ptr;
	Packet*						pkptr;
	Ici* 						rsvp_ici_ptr;
	InetT_Address 				dest_addr;
	int 						input_intf_tbl_index;
	Boolean 					packet_from_lower_layer;
	int 						protocol_type;
	InetT_Address* 				next_addr_ptr;
	char** 						lsp_name_pstr;
	Boolean* 					broadcast_ptr;
	Boolean* 					higher_layer_ptr;
	Boolean* 					destroy_pkt_ptr;
	IpT_Port_Info* 				output_port_info_ptr;
	IpT_Interface_Info**		interface_ptr;
	int* 						num_tracer_info_ptr;
	IpT_Tracer_Info ** 			tracer_info_array_pptr;
	char** 						drop_reason_pstr;
	IpT_Rte_Proc_Id* 			src_proto_ptr;
	} IpT_Rte_Datagram_Dest_Get_Args;

const char* intf_types_str_array [NUM_INTERFACE_TYPES] = {"Interface Information", "Loopback Interfaces", "Tunnel Interfaces", "VLAN Interfaces", "Aggregate Interfaces"};
static Pmohandle				objid_pmh;
static Boolean					objid_pmh_initialized = OPC_FALSE;
static char						intf_name_unknown_str[] = "Unknown";
static Boolean					ip_rte_pkt_is_routing_pkt (IpT_Dgram_Fields* pk_fd_ptr);
static Boolean					ip_rte_pkt_is_routing_pkt_ext (IpT_Dgram_Fields* pk_fd_ptr);

/* The following two addresses are used by MANET models. InetI_Imep_Mcast_Addr is used in this file also.	*/
/* Since ip_rte_support.ex.c is included in all layer-2 models, it is a good idea to define these variables	*/
/* in this file. That way, manet files need not be declared in all layer-2 process models.					*/
InetT_Address	InetI_Imep_Mcast_Addr;
IpT_Address		IpI_Imep_Mcast_Addr;

static const IpT_Rte_Proc_Id direct_routes_proto_id = IP_CMN_RTE_TABLE_UNIQUE_ROUTE_PROTO_ID (IPC_DYN_RTE_DIRECTLY_CONNECTED, IPC_NO_MULTIPLE_PROC);

/* ---- (SECTION_LP) Local Prototypes ---- */

static void
ip_rte_total_packets_received_stat_update (IpT_Rte_Module_Data * iprmd_ptr, int pkt_dest_type,
	Packet * pk_ptr, InetT_Addr_Family addr_family);

static void
ip_rte_dgram_options_process (IpT_Rte_Module_Data * iprmd_ptr, Packet* ip_pkptr, int output_table_index);

static Compcode
ip_rte_datagram_dest_get (IpT_Rte_Module_Data * iprmd_ptr, Packet* pkptr, Ici* rsvp_ici_ptr, Boolean force_fwd, 
	InetT_Address dest_addr, int input_intf_tbl_index, Boolean packet_from_lower_layer, IpT_Dgram_Fields* pk_fd_ptr,
	IpT_Rte_Ind_Ici_Fields* ici_fdstruct_ptr, InetT_Address *next_addr_ptr,char** lsp_name_pstr, Boolean *broadcast_ptr, 
	Boolean *higher_layer_ptr, Boolean *destroy_pkt_ptr, IpT_Port_Info* output_port_info_ptr, 
	IpT_Interface_Info **interface_ptr, int * num_tracer_info_ptr, 
	IpT_Tracer_Info ** tracer_info_array_pptr, char** drop_reason_pstr, IpT_Rte_Proc_Id* src_proto_ptr, 
	IpT_Cmn_Rte_Table_Entry** route_entry_pptr);

static Compcode
ip_rte_gateway_datagram_dest_get (IpT_Rte_Module_Data* iprmd_ptr, Boolean force_fwd, Packet* pkptr, 
	InetT_Address dest_addr, Boolean packet_from_lower_layer, IpT_Dgram_Fields* pk_fd_ptr,
	IpT_Rte_Ind_Ici_Fields* ici_fdstruct_ptr, InetT_Address *next_addr_ptr, char** lsp_name_pstr,
	Boolean *broadcast_ptr, Boolean *higher_layer_ptr, Boolean *destroy_pkt_ptr,
	IpT_Port_Info* output_port_info_ptr, IpT_Interface_Info **interface_pptr, int *num_tracer_info_ptr, 
	IpT_Tracer_Info** tracer_info_array_pptr, char** drop_reason_pstr, IpT_Rte_Proc_Id* src_proto_ptr, 
	IpT_Cmn_Rte_Table_Entry** route_entry_pptr);

static Compcode
ip_rte_datagram_to_direct_connected_dest_handle (IpT_Rte_Module_Data* iprmd_ptr, Boolean force_fwd,
	InetT_Address dest_addr, Boolean packet_from_lower_layer, InetT_Address *next_addr_ptr, Boolean *broadcast_ptr,
	Boolean *higher_layer_ptr, Boolean *destroy_pkt_ptr, IpT_Port_Info* output_port_info_ptr,
	IpT_Interface_Info **interface_pptr, char** drop_reason_pstr);

static Compcode
ip_rte_bgutil_packet_split (IpT_Rte_Module_Data* iprmd_ptr, InetT_Address* next_addr_ptr, IpT_Cmn_Rte_Table_Entry* route_entry_ptr,
	Boolean* destroy_pkt_ptr, IpT_Port_Info* output_port_info_ptr, IpT_Interface_Info** interface_pptr, int* num_tracer_info_ptr,
	IpT_Tracer_Info** tracer_info_array_pptr, char** drop_reason_pstr, IpT_Rte_Proc_Id* src_proto_ptr);

static Compcode
ip_rte_host_higher_layer_datagram_dest_get (IpT_Rte_Module_Data* iprmd_ptr, Boolean force_fwd,
	InetT_Address dest_addr, int protocol_type, InetT_Address* next_addr_ptr, Boolean* broadcast_ptr,
	Boolean* higher_layer_ptr, Boolean* destroy_pkt_ptr, IpT_Port_Info* output_port_info_ptr,
	IpT_Interface_Info** interface_pptr, char** drop_reason_pstr, IpT_Rte_Proc_Id* src_proto_ptr);

static Compcode
ip_rte_host_lower_layer_datagram_dest_get (IpT_Rte_Module_Data* iprmd_ptr,
	InetT_Address dest_addr, int protocol_type, InetT_Address* next_addr_ptr, Boolean* broadcast_ptr,
	Boolean* higher_layer_ptr, Boolean* destroy_pkt_ptr, IpT_Port_Info* output_port_info_ptr,
	IpT_Interface_Info** interface_pptr, char** drop_reason_pstr, IpT_Rte_Proc_Id* src_proto_ptr);

static Compcode
ip_rte_mcast_datagram_dest_get (IpT_Rte_Module_Data * iprmd_ptr, Packet* pkptr, Ici* rsvp_ici_ptr, 
	IpT_Rte_Ind_Ici_Fields* intf_ici_fdstruct_ptr, InetT_Address dest_addr, 
	InetT_Address* next_addr_ptr, Boolean* higher_layer_ptr, Boolean* destroy_pkt_ptr, 
	int protocol_type,  int* output_table_index_ptr, IpT_Interface_Info** interface_pptr);

static double
ip_rte_decomp_delay_compute (Packet* pkptr, IpT_Dgram_Fields* pk_fd_ptr);

#if 0
static void
ip_unnumbered_intf_router_id_assign (IpT_Rte_Module_Data * iprmd_ptr);
#endif

static IpT_Address
ip_obtain_neighbor_router_id (IpT_Rte_Module_Data * iprmd_ptr, Objid link_objid);

static void
ip_rte_pk_fragment (IpT_Rte_Module_Data * iprmd_ptr, Packet *pk_ptr, InetT_Address dest_addr, InetT_Address next_addr, 
	int conn_class, IpT_Rte_Ind_Ici_Fields* intf_ici_ptr);

static void
ip_rte_frag_send (IpT_Rte_Module_Data* iprmd_ptr, Packet* pk_ptr,
	InetT_Addr_Family addr_family, InetT_Address dest_addr, InetT_Address next_addr, 
	int conn_class, IpT_Interface_Info* iface_info_ptr, IpT_Rte_Ind_Ici_Fields* intf_ici_ptr);

static void
ip_rte_pk_sent_stats_update (IpT_Rte_Module_Data* iprmd_ptr, Packet* pk_ptr,
	int  ip_queuing_scheme, int pk_tx_type, InetT_Addr_Family addr_family);

static void
ip_src_address_determine (InetT_Address *src_addr_ptr, IpT_Rte_Module_Data* iprmd_ptr, int intf_tbl_index,
	InetT_Addr_Family addr_family);

static void
ip_inface_statistic_update (IpT_Rte_Module_Data * iprmd_ptr, IpT_Interface_Info* out_intf_info_ptr, double pkt_bitsize, Packet * pkptr);

static void
ip_forward_packet_to_output_queues (IpT_Rte_Module_Data * iprmd_ptr, Packet* pk_ptr, int outstrm,
	Ici* iciptr, int pkt_txtype, IpT_Rte_Ind_Ici_Fields* intf_ici_fdstruct_ptr);

static void
ip_rte_ip_vpn_tunnel_packet (IpT_Rte_Module_Data * iprmd_ptr, 
	Packet** pkptr, double* tunnel_delay);

static void
ip_rte_packet_tunnel_proc (IpT_Rte_Module_Data* iprmd_ptr, Packet* inner_pkptr,
	int instrm, InetT_Address next_addr, IpT_Interface_Info* tunnel_intf_ptr);

static void
ip_packet_tunnel (IpT_Rte_Module_Data* iprmd_ptr, Packet* inner_pkptr,
	int instrm, InetT_Address next_addr, InetT_Address phys_addr, IpT_Interface_Info* tunnel_intf_ptr);

static Compcode
ip_rte_ipv6_manual_tunnel_pkt_fields_set (IpT_Dgram_Fields* pkt_fields_ptr, IpT_Interface_Info* tunnel_intf_ptr);

static Compcode
ip_rte_ipv6_auto_tunnel_pkt_fields_set (IpT_Dgram_Fields* pkt_fields_ptr, InetT_Address dest_addr,
	IpT_Interface_Info* tunnel_intf_ptr);

static Compcode
ip_rte_ipv6_6to4_tunnel_pkt_fields_set (IpT_Dgram_Fields* pkt_fields_ptr, InetT_Address dest_addr,
   	IpT_Interface_Info* tunnel_intf_ptr);

static Packet*
ip_rte_tunnel_gre_pkt_create (Packet* tunneled_pkptr);

static void
ip_rte_load_balancer_handle_packet (IpT_Rte_Module_Data* module_data, Packet** pkptr);

static Boolean		
ip_rte_load_balancer_packet_mine (const InetT_Address dest_address,
	IpT_Rte_Module_Data *iprmd_ptr, int* table_index_ptr);

static void
ip_rte_load_balancer_log ();

static char*
ip_mpls_packet_classify (IpT_Rte_Module_Data* iprmd_ptr, Packet* pkt_ptr, int in_iface, Boolean higher_layer_pkt);

static Boolean
ip_rte_support_is_mpls_tracer (Packet* pkptr, char** fec_name_ptr);

int
ip_cmn_rte_table_entry_cost_get (IpT_Cmn_Rte_Table_Entry *rte_entry_ptr,int hop_index);

static void
ip_rte_flow_id_swap (OmsT_Bgutil_Tracer_Packet_Info* trc_pkt_info_ptr, 
	IpT_Interface_Info* interface_ptr, InetT_Address next_hop_addr);

static int
ip_rte_minor_port_from_next_hop_get (IpT_Rte_Module_Data* iprmd_ptr, int phys_intf_index, InetT_Address next_hop);

static Boolean
ip_mpls_lsp_status_get (IpT_Rte_Module_Data* iprmd_ptr, char* lsp_name_str, int in_iface);

static InetT_Address
ip_rte_support_next_hop_set (IpT_Rte_Module_Data* iprmd_ptr, InetT_Addr_Family addr_family,
	const InetT_Address* addr_ptr, int* out_iface_ptr);

InetT_Address
ip_rte_next_hop_address_valid (IpT_Rte_Module_Data* iprmd_ptr, int intf_index);

static void
ip_rte_isis_pdu_send (IpT_Rte_Module_Data *iprmd_ptr, Packet *pk_ptr);

static void
ip_rte_isis_pdu_recv (IpT_Rte_Module_Data *iprmd_ptr, Packet *pk_ptr, IpT_Interface_Info* rcvd_intf_info_ptr, 
						int instrm, int input_intf_tbl_index, int minor_port_in);
						
static Compcode
ip_rte_pk_rcvd_intf_tbl_indx_get (IpT_Rte_Module_Data *iprmd_ptr, int instrm, IpT_Dgram_Fields* pk_fd_ptr,
     Boolean tunnel_pkt_at_src, int *minor_port_ptr, int *input_intf_tbl_index_ptr);

void
ip_policy_action_into_list_insert (List* ip_policy_action_lptr, char* node_name, char* rte_map_filter_name, 
										const char* iface_name_str, IpT_Policy_Action policy_action);

static IpT_Policy_Action_Info*
ip_policy_action_info_mem_alloc (void);

static int
ip_rte_input_slot_index_determine (IpT_Rte_Module_Data *iprmd_ptr, IpT_Interface_Info* in_iface_ptr, int instrm);

static void
ip_rte_support_intf_objid_add (PrgT_String_Hash_Table* intf_name_htable_ptr, Objid intf_name_objid);

static Boolean
inet_rte_v6intf_addr_range_check (InetT_Address next_hop, IpT_Interface_Info* intf_ptr,
	InetT_Address_Range** addr_range_pptr);

static Boolean
ipv6_rte_is_local_address(const InetT_Address intf_addr, IpT_Rte_Module_Data* iprmd_ptr,
	int* intf_index_ptr);

static Boolean 
ip_rte_subintf_layer2_mapping_found (const char* mapping_name, IpT_Layer2_Mapping mapping_type, IpT_Layer2_Mappings layer2_map);

static Boolean
ip_rte_support_number_range_match (IpT_Rte_Map_Match_Info* match_info_ptr, int number);

static IpT_Rte_Ind_Ici_Fields*
ip_rte_intf_ici_fdstruct_ptr_get (Packet* ip_dgram_ptr);

static void
ip_rte_lacp_pdu_handle (IpT_Rte_Module_Data* iprmd_ptr, Packet* pkptr);

/* ---- (SECTION_ECP) Externally Callable Procedures ---- */

void
ip_rte_set_procs (IpT_Rte_Module_Data * iprmd_ptr, 
	IpT_Rte_Error_Proc error_p, IpT_Rte_Warning_Proc warning_p)
	{
	/** Until a more comprehensive revisit of this code to 	**/
	/** better repackage, we mimick what used to be a set	**/
	/** of process model state variables with a similar		**/
	/** structure that must be set by each model before		**/
	/** invoking any other function in this file.			**/
	FIN (ip_rte_set_procs (iprmd_ptr, error_p, warning_p));

	iprmd_ptr->error_proc = error_p;
	iprmd_ptr->warning_proc = warning_p;

	FOUT;
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -