📄 ip_rte_support.ex.c
字号:
/* 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 + -