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

📄 ip_rte_support.h

📁 备
💻 H
📖 第 1 页 / 共 4 页
字号:
	IpC_Rte_Process_Type_Distrib_Cpu,
	IpC_Rte_Process_Type_Slot,
	IpC_Rte_Process_Type_Cloud
	} IpT_Rte_Process_Type;

/* Information used for tracer packets that need to be forwarded	*/
/* to a set of interfaces.											*/
typedef struct IpT_Tracer_Info
	{
	IpT_Interface_Info *	interface_ptr;
	int						minor_port;
	int						output_intf_index;
	InetT_Address			next_addr;
	double					ratio;
	} IpT_Tracer_Info;

/* Structure to pass info to MANET routing protocol (AODV, DYMO) from IP */
/* Code will define void* pointer type, which can be Application   */
/* layer packet or a Destination Address.						   */
typedef struct ManetT_Info
	{
	int 		code;
	void*		manet_info_type_ptr;
	} ManetT_Info;

/* Structure to pass on the nexthop info of MANET (AODV, DYMO) control  */
/* packets to IP. This is facilitated by even state functions.    */
typedef struct ManetT_Nexthop_Info
	{
	InetT_Address			next_hop_addr;
	int						output_table_index;
	IpT_Interface_Info*		interface_info_ptr;
	} ManetT_Nexthop_Info;
	

/* the flow mapping on interface from one flow_id to another */
/* this is the element of the "per_if_flow_mapping" of IpT_Interface_Info */
typedef struct
	{
	double in_flow;
	double out_flow;
	InetT_Address next_hop_addr;
	} IpT_Flow_Pair; 

/* Type used by the ip_rte_proto_intf_attr_objid_table functions	*/
typedef PrgT_String_Hash_Table*				IpT_Intf_Name_Objid_Table_Handle;
#define IpC_Intf_Name_Objid_Table_Invalid	((IpT_Intf_Name_Objid_Table_Handle) OPC_NIL)

/* Used for broadcast */
typedef void (*IpT_Rte_Datagram_Interface_Forward)(IpT_Rte_Module_Data *,
	InetT_Address dest_addr, InetT_Address next_addr, Packet* pk_ptr, 
	int intf_tbl_index, IpT_Rte_Ind_Ici_Fields* intf_ici_fdstruct_ptr);

void		ip_rte_set_procs (IpT_Rte_Module_Data * iprmd_ptr, 
	IpT_Rte_Error_Proc error_proc, IpT_Rte_Warning_Proc warning_proc);

/* Macro for checking whether a node is a gateway or not				*/
#define ip_rte_node_is_gateway(_iprmd_ptr)			((Boolean) ((_iprmd_ptr)->gateway_status))

/* Macros for checking if IPv4/IPv6 is active on a node.				*/
#define ip_rte_node_ipv4_active(_iprmd_ptr)			((Boolean) ((_iprmd_ptr)->first_loopback_intf_index != IPC_INTF_INDEX_INVALID))
#define ip_rte_node_ipv6_active(_iprmd_ptr)			((Boolean) ((_iprmd_ptr)->first_ipv6_loopback_intf_index != IPC_INTF_INDEX_INVALID))
#define ip_rte_node_ip_version_active(_iprmd_ptr, _ver)	\
													((Boolean) (((InetC_Addr_Family_v4 == (_ver)) && ((_iprmd_ptr)->first_loopback_intf_index != IPC_INTF_INDEX_INVALID)) || \
																((InetC_Addr_Family_v6 == (_ver)) && ((_iprmd_ptr)->first_ipv6_loopback_intf_index != IPC_INTF_INDEX_INVALID))))

/* Functions used to interface with the IpT_Interface_Table structure   */
#define	ip_rte_num_interfaces_get(_iprmd_ptr)		((_iprmd_ptr)->interface_table.num_ipv4_interfaces)
#define inet_rte_num_interfaces_get(_iprmd_ptr)		((_iprmd_ptr)->interface_table.total_interfaces)
#define inet_rte_num_phy_interfaces_get(_iprmd_ptr)	((_iprmd_ptr)->num_phys_interfaces)														
#define ipv6_rte_num_interfaces_get(_iprmd_ptr)		((_iprmd_ptr)->interface_table.num_ipv6_interfaces)
#define	inet_first_ipv4_intf_index_get(_iprmd_ptr)	(0)
#define	inet_last_ipv4_intf_index_get(_iprmd_ptr)	((_iprmd_ptr)->interface_table.num_ipv4_interfaces - 1)
#define	inet_first_ipv6_intf_index_get(_iprmd_ptr)	((_iprmd_ptr)->interface_table.total_interfaces - \
													 (_iprmd_ptr)->interface_table.num_ipv6_interfaces)
#define	inet_last_ipv6_intf_index_get(_iprmd_ptr)	((_iprmd_ptr)->interface_table.total_interfaces - 1)
#define inet_ipv6_intf_index_to_inet_index_convert(_iprmd_ptr, _ipv6_index) \
													((_ipv6_index) + inet_first_ipv6_intf_index_get (_iprmd_ptr))
#define inet_intf_index_to_ipv6_intf_index_convert(_iprmd_ptr, _inet_index) \
													((_inet_index) - inet_first_ipv6_intf_index_get (_iprmd_ptr))

/* Macros to check if IPv4/IPv6 is active on the interface.				*/
#define ip_rte_intf_ipv4_active(_intf_ptr)			((Boolean) ((_intf_ptr)->addr_range_ptr != OPC_NIL))
#define ip_rte_intf_ipv6_active(_intf_ptr)			((Boolean) ((_intf_ptr)->ipv6_info_ptr != OPC_NIL))
#define ip_rte_intf_ip_version_active(_intf_ptr, _ver)	\
													((Boolean) (((InetC_Addr_Family_v4 == (_ver)) && ((_intf_ptr)->addr_range_ptr != OPC_NIL)) || \
																((InetC_Addr_Family_v6 == (_ver)) && ((_intf_ptr)->ipv6_info_ptr != OPC_NIL))))
														
/* Macro for checking whether an interface is a subinterface or a		*/
/* physical interface. Note that even loopbacks will be considered		*/
/* physical since they are not subintefaces.							*/
#define	ip_rte_intf_is_physical(_intf_ptr)			((Boolean) (IPC_SUBINTF_PHYS_INTF == (_intf_ptr)->subintf_addr_index))

/* Macro for checking whether an interface is loopback.					*/													
#define	ip_rte_intf_is_loopback(_intf_ptr)			((Boolean) (IpC_Intf_Status_Loopback == (_intf_ptr)->phys_intf_info_ptr->intf_status))

/* Macro for checking whether an interface is unconnected.					*/													
#define	ip_rte_intf_is_unconnected(_intf_ptr)			((Boolean) (IpC_Intf_Status_Unconnected == (_intf_ptr)->phys_intf_info_ptr->intf_status))

/* Macro for checking whether an interface is a tunnel					*/
#define ip_rte_intf_is_tunnel(_intf_ptr)			((Boolean) ((_intf_ptr)->tunnel_info_ptr != OPC_NIL))

/* Macro for checking whether a given interface is logical.				*/
#define ip_rte_intf_is_logical(_intf_ptr)			((Boolean) (IPC_PORT_NUM_INVALID == ip_rte_intf_in_port_num_get (_intf_ptr)))

/* Macros for checking if a given tunnel interface is point to			*/
/* multipoint or not. 													*/
#define ip_rte_intf_tunnel_is_point_to_multipoint_v6(_intf_ptr)	((Boolean) (IpC_Tunnel_Mode_IPv6_6to4 == (_intf_ptr)->tunnel_info_ptr->mode))
#define ip_rte_intf_tunnel_is_point_to_multipoint_v4(_intf_ptr)	((Boolean) (0 != (_intf_ptr)->tunnel_info_ptr->dest_count))

/* Used to access what is currently		*/
/* IpT_Phys_Interface_Info type			*/
#define ip_rte_intf_type_get(_intf_ptr)				((IpT_Interface_Type) ((_intf_ptr)->phys_intf_info_ptr->intf_type))
#define	ip_rte_intf_addr_index_get(_intf_ptr)		((short) ((_intf_ptr)->phys_intf_info_ptr->addr_index))
#define	ip_rte_intf_ip_addr_index_get(_intf_ptr)	((short) ((_intf_ptr)->phys_intf_info_ptr->ip_addr_index))
#define ip_rte_intf_out_port_num_get(_intf_ptr)		((short) ((_intf_ptr)->phys_intf_info_ptr->port_num))
#define ip_rte_intf_in_port_num_get(_intf_ptr)		((short) ((_intf_ptr)->phys_intf_info_ptr->in_port_num))
#define ip_rte_intf_slot_index_get(_intf_ptr)		((short) ((_intf_ptr)->phys_intf_info_ptr->slot_index))
#define	ip_rte_intf_conn_link_objid_get(_intf_ptr)	((Objid) ((_intf_ptr)->phys_intf_info_ptr->connected_link_objid))
#define ip_rte_intf_link_bandwidth_get(_intf_ptr)	((double) ((_intf_ptr)->phys_intf_info_ptr->link_bandwidth))
#define ip_rte_intf_unnumbered(_intf_ptr)			((Boolean) (OPC_NIL != (_intf_ptr)->unnumbered_info))
#define ip_rte_unnumbered_intf_addr_get(_intf_ptr)	((IpT_Address) ((_intf_ptr)->unnumbered_info->interface_addr))
#define ip_rte_intf_status_get(_intf_ptr)			((IpT_Interface_Status) ((_intf_ptr)->phys_intf_info_ptr->intf_status))
#define ip_rte_intf_link_status_get(_intf_ptr)		((Boolean) ((_intf_ptr)->phys_intf_info_ptr->link_status))
#define ip_rte_intf_link_is_failed(_intf_ptr)		((Boolean) ((_intf_ptr)->phys_intf_info_ptr->link_status == 0))
#define ip_rte_intf_active(_intf_ptr)				((Boolean) (IpC_Intf_Status_Shutdown != ((_intf_ptr)->phys_intf_info_ptr->intf_status)))
#define ip_rte_intf_is_shutdown(_intf_ptr)			((Boolean) (IpC_Intf_Status_Shutdown == ((_intf_ptr)->phys_intf_info_ptr->intf_status)))
#define ip_rte_intf_is_group(_intf_ptr)				((Boolean) (IpC_Intf_Status_Group == ((_intf_ptr)->phys_intf_info_ptr->intf_status)))
#define	ip_rte_num_subinterfaces_get(_intf_ptr)		((const int) ((_intf_ptr)->phys_intf_info_ptr->num_subinterfaces))
#define ip_rte_ith_subintf_info_get(_intf_ptr, _i)	((IPC_SUBINTF_PHYS_INTF == _i) ? (_intf_ptr) : (_intf_ptr)->phys_intf_info_ptr->subintf_pptr[_i])
#define	ip_rte_intf_lower_layer_addr_get(_intf_ptr)	((int) ((_intf_ptr)->phys_intf_info_ptr->lower_layer_addr))
#define	ip_rte_intf_lower_layer_addr_type_get(_intf_ptr)	((IpT_Intf_Lower_Layer_Type) ((_intf_ptr)->phys_intf_info_ptr->lower_layer_type))

/* Used to access what is currently		*/
/* IpT_Interface_Info type				*/
#define ip_rte_intf_index_get(_intf_ptr)			((int) ((_intf_ptr)->intf_index))
#define ip_rte_intf_addr_range_get(_intf_ptr)		((IpT_Address_Range *) ((_intf_ptr)->addr_range_ptr))
#define ip_rte_intf_addr_get(_intf_ptr)				((const IpT_Address) ((_intf_ptr)->addr_range_ptr->address))
#define ip_rte_intf_mask_get(_intf_ptr)				((const IpT_Address) ((_intf_ptr)->addr_range_ptr->subnet_mask))
#define ip_rte_intf_network_address_get(_intf_ptr)	((const IpT_Address) ((_intf_ptr)->network_address))
#define ip_rte_intf_name_get(_intf_ptr)				((char *) ((_intf_ptr)->full_name))
#define ip_rte_intf_name_string_get(_intf_ptr, _intf_name_str) \
													(strcpy (_intf_name_str, ip_rte_intf_name_get (_intf_ptr)))
#define inet_rte_intf_mtu_get(_intf_ptr,_addr_family)	((InetC_Addr_Family_v6 == _addr_family) ? IPV6C_MIN_MTU : ((_intf_ptr)->mtu))
#define ip_rte_intf_mtu_get(_intf_ptr)				((_intf_ptr)->mtu)
#define ip_rte_intf_routing_prot_get(_intf_ptr)		((List *) ((_intf_ptr)->routing_protocols_lptr))
#define ip_rte_intf_load_bits_get(_intf_ptr)		((const double) ((_intf_ptr)->load_bits))
#define ip_rte_intf_load_bps_get(_intf_ptr)			((const double) ((_intf_ptr)->load_bps))
#define ip_rte_intf_avail_bw_get(_intf_ptr)			((const double) ((_intf_ptr)->avail_bw))
#define ip_rte_intf_delay_get(_intf_ptr)			((const double) ((_intf_ptr)->delay))
#define ip_rte_intf_reliability_get(_intf_ptr)		((const double) ((_intf_ptr)->reliability))
#define ip_rte_intf_comp_info_get(_intf_ptr)		((IpT_Compression_Info *) ((_intf_ptr)->comp_info))
#define	ip_rte_intf_group_info_get(_intf_ptr)		((IpT_Group_Intf_Info *) ((_intf_ptr)->phys_intf_info_ptr->group_info_ptr))
#define	ip_rte_intf_group_type_get(_intf_ptr)		((const IpT_Intf_Aggregation_Type) ((_intf_ptr)->phys_intf_info_ptr->group_info_ptr->aggregation_type))

#define ip_rte_intf_mcast_enabled(_intf_ptr)		((const Boolean) ((_intf_ptr)->multicast_enabled))
#define ip_rte_intf_igmp_enabled(_intf_ptr)			((const Boolean) ((_intf_ptr)->igmp_enabled))

#define ip_rte_intf_igmp_ph_get(_intf_ptr)			((Prohandle) ((_intf_ptr)->igmp_rte_iface_ph))
#define ip_rte_intf_load_bgutil_get(_intf_ptr)	 	((OmsT_Bgutil_Routed_State *) ((_intf_ptr)->load_bgutil_routed_state_ptr))
#define ip_rte_intf_last_load_update_get(_intf_ptr)	((double) ((_intf_ptr)->last_load_update_time))
#define ip_rte_intf_queuing_scheme_get(_intf_ptr)	((IpT_Queuing_Scheme) ((_intf_ptr)->queuing_scheme))
#define ip_rte_intf_output_ph_get(_intf_ptr)		((Prohandle) ((_intf_ptr)->output_iface_prohandle))
#define ip_rte_intf_rsvp_enabled(_intf_ptr)			((Boolean) ((_intf_ptr)->rsvp_enabled))
#define ip_rte_intf_sub_addr_index_get(_intf_ptr)	((short) ((_intf_ptr)->subintf_addr_index))
#define ip_rte_intf_l2_mappings_get(_intf_ptr)		((IpT_Layer2_Mappings) ((_intf_ptr)->layer2_mappings))
#define ip_rte_intf_user_metrics_get(_intf_ptr)		((IpT_Intf_User_Metrics *) ((_intf_ptr)->user_metrics))

#define ip_rte_intf_no_ip_address(_intf_ptr)		((Boolean) (ip_address_equal ((_intf_ptr)->addr_range_ptr->address, IpI_No_Ip_Address)))
#define ip_rte_intf_is_dumb(_intf_ptr)				((Boolean) (IpC_Intf_Type_Dumb == ip_rte_intf_type_get (_intf_ptr)))
#define ip_rte_intf_is_smart(_intf_ptr)				((Boolean) (IpC_Intf_Type_Smart == ip_rte_intf_type_get (_intf_ptr)))
#define	ip_rte_intf_is_ethernet_group(_intf_ptr)	((Boolean) (IpC_Intf_Aggregation_Type_Ethernet == ip_rte_intf_group_type_get (_intf_ptr)))

/* Macros for identifying MIPv6 node types.		*/
#define ip_rte_intf_is_mipv6_home_agent(_intf_ptr) 			(((_intf_ptr)->ipv6_info_ptr->mipv6_info_ptr != OPC_NIL) && ((_intf_ptr)->ipv6_info_ptr->mipv6_info_ptr->mipv6_iface_type ==  Mipv6C_Home_Agent))
#define ip_rte_node_is_mipv6_enabled(_iprmd_ptr) 			(((_iprmd_ptr)->mipv6_info_ptr != OPC_NIL))
#define ip_rte_node_is_mipv6_home_agent(_iprmd_ptr) 		(((_iprmd_ptr)->mipv6_info_ptr != OPC_NIL) && ((_iprmd_ptr)->mipv6_info_ptr->node_type == Mipv6C_Home_Agent))
#define ip_rte_node_is_mipv6_mobile_node(_iprmd_ptr) 		(((_iprmd_ptr)->mipv6_info_ptr != OPC_NIL) && ((_iprmd_ptr)->mipv6_info_ptr->node_type == Mipv6C_Mobile_Node))
#define ip_rte_node_is_mipv6_correspondent_node(_iprmd_ptr) (((_iprmd_ptr)->mipv6_info_ptr != OPC_NIL) && ((_iprmd_ptr)->mipv6_info_ptr->node_type == Mipv6C_Correspondent_Node))

/* Macros for accessing fields in IpT_Tunnel_Info structure	*/
#define ip_rte_intf_tunnel_mode_get(_intf_ptr)		((_intf_ptr)->tunnel_info_ptr->mode)
#define ip_rte_tunnel_dest_addr_get(_intf_ptr)		((_intf_ptr)->tunnel_info_ptr->dest_addr)

/* IPv6 related functions	*/
#define ip_rte_intf_link_local_addr_get(_intf_ptr)				(inet_address_range_addr_get (&((_intf_ptr)->ipv6_info_ptr->ipv6_addr_array[0])))
#define ip_rte_intf_link_local_addr_get_fast(_intf_ptr)			(inet_address_range_addr_get_fast (&((_intf_ptr)->ipv6_info_ptr->ipv6_addr_array[0])))
#define ip_rte_intf_link_local_addr_range_get_fast(_intf_ptr)	((&((_intf_ptr)->ipv6_info_ptr->ipv6_addr_array[0])))
#define ip_rte_intf_link_local_addr_equal(_intf_ptr,_addr)		(inet_address_range_address_equal (&((_intf_ptr)->ipv6_info_ptr->ipv6_addr_array[0]), &(_addr)))
#define ip_rte_intf_num_ipv6_addrs_get(_intf_ptr)				((_intf_ptr)->ipv6_info_ptr->num_addresses)
#define ip_rte_intf_ith_ipv6_addr_get(_intf_ptr,_i)				(inet_address_range_addr_get (&((_intf_ptr)->ipv6_info_ptr->ipv6_addr_array[_i])))
#define ip_rte_intf_ith_ipv6_addr_get_fast(_intf_ptr, _i)		(inet_address_range_addr_get_fast (&((_intf_ptr)->ipv6_info_ptr->ipv6_addr_array[_i])))
#define ip_rte_intf_ith_ipv6_addr_equal(_intf_ptr, _i, _addr)	(inet_address_range_address_equal (&((_intf_ptr)->ipv6_info_ptr->ipv6_addr_array[_i]), &(_addr)))
#define ip_rte_intf_ith_ipv6_addr_range_get_fast(_intf_ptr, _i)	(&((_intf_ptr)->ipv6_info_ptr->ipv6_addr_array[_i]))
#define ip_rte_intf_ith_ipv6_prefix_len_get(_intf_ptr, _i)		(inet_address_range_mask_get (&((_intf_ptr)->ipv6_info_ptr->ipv6_addr_array[_i])))
#define ip_rte_intf_ith_ipv6_ntwk_addr_get(_intf_ptr, _i)		(inet_address_range_network_addr_get (&((_intf_ptr)->ipv6_info_ptr->ipv6_addr_array[_i])))
#define ip_rte_intf_num_ipv6_gbl_addrs_get(_intf_ptr)			(ipv6_rte_intf_num_gbl_addrs_get ((_intf_ptr)->ipv6_info_ptr))
#define ip_rte_intf_ith_gbl_ipv6_addr_get(_intf_ptr,_i)			(inet_address_range_addr_get (&((_intf_ptr)->ipv6_info_ptr->ipv6_addr_array[(_i) + 1])))
#define ip_rte_intf_ith_gbl_ipv6_addr_get_fast(_intf_ptr, _i)	(inet_address_range_addr_get_fast (&((_intf_ptr)->ipv6_info_ptr->ipv6_addr_array[(_i) + 1])))
#define ip_rte_intf_ith_gbl_ipv6_addr_equal(_intf_ptr,_i,_addr)	(inet_address_range_address_equal (&((_intf_ptr)->ipv6_info_ptr->ipv6_addr_array[(_i) + 1]), _addr))
#define ip_rte_intf_ith_gbl_ipv6_addr_range_get(_intf_ptr, _i)	(ipv6_rte_intf_ith_gbl_addr_range_get ((_intf_ptr)->ipv6_info_ptr, (_i)))
#define ip_rte_intf_ith_gbl_ipv6_addr_range_get_fast(_intf_ptr, _i)	(ipv6_rte_intf_ith_gbl_addr_range_get_fast ((_intf_ptr)->ipv6_info_ptr, (_i)))
#define ip_rte_intf_ith_gbl_ipv6_prefix_len_get(_intf_ptr, _i)	(inet_address_range_mask_get (&((_intf_ptr)->ipv6_info_ptr->ipv6_addr_array[_i + 1])))
#define ip_rte_intf_ith_gbl_ipv6_ntwk_addr_get(_intf_ptr, _i)	(inet_address_range_network_addr_get (&((_intf_ptr)->ipv6_info_ptr->ipv6_addr_array[_i + 1])))
#define ip_rte_intf_mac_addr_get(_intf_ptr)						((_intf_ptr)->ipv6_info_ptr->mac_addr)
#define ipv6_rte_intf_num_gbl_addrs_get(_ipv6_info_ptr)			(((_ipv6_info_ptr)->num_addresses) - 1)
#define ipv6_rte_intf_ith_gbl_addr_range_get(_ipv6_info_ptr,_i)	(inet_address_range_copy ((_ipv6_info_ptr)->ipv6_addr_array[(_i) + 1]))
#define ipv6_rte_intf_ith_gbl_addr_range_get_fast(_ipv6_info_ptr, _i)	(&((_ipv6_info_ptr)->ipv6_addr_array[(_i) + 1]))

/* Default route related funcitons.					*/
InetT_Address	inet_default_route_get (IpT_Rte_Module_Data* iprmd_ptr, InetT_Addr_Family addr_family, short* out_intf_index_ptr);
#define inet_default_route_available(_iprmd_ptr, _addr_family)	(inet_address_valid (_iprmd_ptr->default_route_addr_array[_addr_family]))
#define ip_default_route_available(_iprmd_ptr)					(inet_address_valid ((_iprmd_ptr)->default_route_addr_array[InetC_Addr_Family_v4]))
#define ip_default_route_get(_iprmd_ptr, intf_index_ptr)		(inet_ipv4_address_get (\
	inet_default_route_get (_iprmd_ptr,InetC_Addr_Family_v4,intf_index_ptr)))

/* Macros for accessing the first loopback index.	*/
#define ip_rte_first_loopback_intf_index_get(_iprmd_ptr, _addr_family) \
			((InetC_Addr_Family_v4 == _addr_family) ? (_iprmd_ptr->first_loopback_intf_index) : (_iprmd_ptr->first_ipv6_loopback_intf_index))

/* Macros to access secondary IP address information */
#define ip_rte_intf_num_secondary_addresses_get(_intf_ptr) \
	((_intf_ptr->sec_addr_tbl_ptr == OPC_NIL) ? 0 : (_intf_ptr)->sec_addr_tbl_ptr->num_sec_addresses)
/* Following macros assume that the interface has secondary addresses */

/* Macro for accessing the ith secondary address. If the index		*/
/* passed is -1, the primary address is returned.					*/
#define ip_rte_intf_secondary_addr_range_get(_intf_ptr, _ith_addr) \
	((-1 == (_ith_addr)) ? ((_intf_ptr)->addr_range_ptr) : (&((_intf_ptr)->sec_addr_tbl_ptr->sec_addr_array[_ith_addr].ip_addr_range)))
#define inet_rte_intf_secondary_addr_range_get(_intf_ptr, _ith_addr) \
	((-1 == (_ith_addr)) ? (&((_intf_ptr)->inet_addr_range)) : (&((_intf_ptr)->sec_addr_tbl_ptr->sec_addr_array[_ith_addr].inet_addr_range)))
#define ip_rte_intf_secondary_addr_get(_intf_ptr, _ith_addr) \
	((-1 == (_ith_addr)) ? ((_intf_ptr)->addr_range_ptr->address) : ((_intf_ptr)->sec_addr_tbl_ptr->sec_addr_array[_ith_addr].ip_addr_range.address))
#define inet_rte_intf_secondary_addr_get(_intf_ptr, _ith_addr) \
	(inet_address_from_ipv4_address_create (ip_rte_intf_secondary_addr_get ((_intf_ptr), (_ith_addr))))
#define ip_rte_intf_secondary_addr_mask_get(_intf_ptr, _ith_addr) \
	((-1 == (_ith_addr)) ? ((_intf_ptr)->addr_range_ptr->subnet_mask) : ((_intf_ptr)->sec_addr_tbl_ptr->sec_addr_array[_ith_addr].ip_addr_range.subnet_mask))
#define inet_rte_intf_secondary_addr_equal(_intf_ptr, _i, _addr) \
	(ip_address_equal (ip_rte_intf_secondary_addr_get((_intf_ptr), (_i)), inet_ipv4_address_get (_addr)))

/* Macros for setting elements in the IpT_Interface_Info structure.	*/	
void		ip_rte_intf_last_load_update_set		(IpT_Interface_Info *intf_info_ptr, double new_last_load_update);
void		ip_rte_intf_load_bits_set				(IpT_Interface_Info *intf_info_ptr, double new_load_bits);
void		ip_rte_intf_load_bps_set				(IpT_Interface_Info *intf_info_ptr, double new_load_bps);
void		ip_rte_intf_load_bgutil_set				(IpT_Interface_Info *intf_info_ptr, struct OmsT_Bgutil_Routed_State *new_load_bgutil);
void		ip_rte_intf_mcast_enabled_set			(IpT_Interface_Info *intf_info_ptr, Boolean new_mcast_enabled);
void		ip_rte_intf_network_address_set			(IpT_Interface_Info *intf_info_ptr, IpT_Address new_network_address);
void		ip_rte_intf_name_set					(IpT_Interface_Info *intf_info_ptr, char* name);

/* Functions to validate interface indices.						*/
#define		ip_rte_intf_tbl_index_valid(_iprmd_ptr, _i)		(((_i) >= 0) && ((_i) < ip_rte_num_interfaces_get (_iprmd_ptr)))
#define		ipv6_rte_intf_tbl_index_valid(_iprmd_ptr, _i)	(((_i) >= 0) && ((_i) < ipv6_rte_num_interfaces_get (_iprmd_ptr)))
#define		inet_rte_intf_tbl_index_valid(_iprmd_ptr, _i)	(((_i) >= 0) && ((_i) < inet_rte_num_interfaces_get (_iprmd_ptr)))

/* Functions to access the ith interface.						*/
IpT_Interface_Info*	ip_rte_intf_tbl_access (IpT_Rte_Module_Data* iprmd_ptr, int i);
IpT_Interface_Info*	ipv6_rte_intf_tbl_access (IpT_Rte_Module_Data* iprmd_ptr, int i);
IpT_Interface_Info*	inet_rte_intf_tbl_access (IpT_Rte_Module_Data* iprmd_ptr, int i);

/* Function to convert an inet interface index to an IPv6 index	*/
int			ip_rte_ipv6_intf_index_get (IpT_Rte_Module_Data * iprmd_ptr, int intf_index);

/* Function that returns the mode of the interface.				*/
IpT_Interface_Mode ip_rte_intf_mode_get (const IpT_Interface_Info* intf_ptr);
IpT_Interface_Mode ip_rte_node_mode_get (const IpT_Rte_Module_Data* iprmd_ptr);

⌨️ 快捷键说明

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