📄 dymo_route_table.ex.c
字号:
/* dymo_route_table.ex.c */
/* C file for DYMO Route Table APIs */
/****************************************/
/* Copyright (c) 1987-2003 */
/* by OPNET Technologies, Inc. */
/* (A Delaware Corporation) */
/* 7255 Woodmont Av., Suite 250 */
/* Bethesda, MD 20814, U.S.A. */
/* All Rights Reserved. */
/****************************************/
/***** Includes *****/
#include <opnet.h>
#include <stdarg.h>
#include <dymo.h>
#include <dymo_pkt_support.h>
#include <dymo_ptypes.h>
#include <ip_addr_v4.h>
#include <ip_cmn_rte_table.h>
/***** Prototypes *****/
static DymoT_Route_Entry* dymo_route_table_entry_mem_alloc (void);
static void dymo_route_table_entry_mem_free (DymoT_Route_Entry*);
extern void dymo_rte_entry_expiry_handle (void*, int);
DymoT_Route_Table*
dymo_route_table_create (IpT_Cmn_Rte_Table* cmn_rte_table_ptr, IpT_Rte_Proc_Id proto_id, double expiry_time,
double delete_period, DymoT_Local_Stathandles* local_stat_ptr)
{
DymoT_Route_Table* route_table_ptr;
/** Creates and allocates memory for **/
/** the DYMO route table **/
FIN (dymo_route_table_create (void));
route_table_ptr = (DymoT_Route_Table*) op_prg_mem_alloc (sizeof (DymoT_Route_Table));
route_table_ptr->route_table = (PrgT_String_Hash_Table*) prg_string_hash_table_create (100, 15);
route_table_ptr->ip_cmn_rte_table_ptr = cmn_rte_table_ptr;
route_table_ptr->dymo_protocol_id = proto_id;
route_table_ptr->route_expiry_time = expiry_time;
route_table_ptr->delete_period = delete_period;
route_table_ptr->stat_handles_ptr = local_stat_ptr;
route_table_ptr->current_size = 0;
FRET (route_table_ptr);
}
void
dymo_route_table_entry_create (DymoT_Route_Table* route_table_ptr, InetT_Address dest_addr, InetT_Subnet_Mask subnet_mask,
InetT_Address next_hop_addr, IpT_Port_Info out_port_info, int num_hops, int dest_seq_num, double expiry_time)
{
DymoT_Route_Entry* route_entry_ptr;
DymoT_Global_Stathandles* global_stathandle_ptr;
char dest_addr_str [INETC_ADDR_STR_LEN];
void* old_contents_ptr;
InetT_Address* dest_addr_ptr;
/** Adds a new route table entry **/
/** in the route table **/
FIN (dymo_route_table_entry_create (<args>));
/* Create the destination address string */
inet_address_print (dest_addr_str, dest_addr);
dest_addr_ptr = inet_address_create_dynamic (dest_addr);
/* Allocate memory for the route entry */
route_entry_ptr = dymo_route_table_entry_mem_alloc ();
route_entry_ptr->dest_prefix = ip_cmn_rte_table_dest_prefix_create (dest_addr, subnet_mask);
route_entry_ptr->dest_seq_num = dest_seq_num;
if (dest_seq_num != DYMOC_DEST_SEQ_NUM_INVALID)
route_entry_ptr->valid_dest_sequence_number_flag = OPC_TRUE;
else
route_entry_ptr->valid_dest_sequence_number_flag = OPC_FALSE;
route_entry_ptr->route_entry_state = DymoC_Valid_Route;
route_entry_ptr->next_hop_addr = inet_address_copy (next_hop_addr);
route_entry_ptr->next_hop_port_info = out_port_info;
route_entry_ptr->hop_count = num_hops;
route_entry_ptr->route_expiry_time = op_sim_time () + expiry_time;
/* Installing event state */
/* This event will be processed by dymo_rte_entry_expiry_handle */
/* function when the timer expires. */
op_ev_state_install (dest_addr_ptr, OPC_NIL);
route_entry_ptr->route_expiry_evhandle = op_intrpt_schedule_call(route_entry_ptr->route_expiry_time,
DYMOC_ROUTE_ENTRY_INVALID, dymo_rte_entry_expiry_handle, dest_addr_ptr);
op_ev_state_install (OPC_NIL, OPC_NIL);
/* Set the route entry for this destination */
/* in the route table */
prg_string_hash_table_item_insert (route_table_ptr->route_table, dest_addr_str, route_entry_ptr, &old_contents_ptr);
/* Insert the route in the IP common route table */
Inet_Cmn_Rte_Table_Entry_Add_Options (route_table_ptr->ip_cmn_rte_table_ptr, OPC_NIL, route_entry_ptr->dest_prefix,
route_entry_ptr->next_hop_addr, route_entry_ptr->next_hop_port_info, route_entry_ptr->hop_count,
route_table_ptr->dymo_protocol_id, 1, IPC_CMN_RTE_TABLE_ENTRY_ADD_INDIRECT_NEXTHOP_OPTION);
/* Update the size of the route table */
route_table_ptr->current_size++;
/* Update the route table size statistic */
op_stat_write (route_table_ptr->stat_handles_ptr->route_table_size_shandle, route_table_ptr->current_size);
/* Update the statistic for the number of hops */
op_stat_write (route_table_ptr->stat_handles_ptr->num_hops_shandle, route_entry_ptr->hop_count);
/* Get a handle to the global statistics */
global_stathandle_ptr = dymo_support_global_stat_handles_obtain ();
/* Update the global statistic for the number of hops */
op_stat_write (global_stathandle_ptr->num_hops_global_shandle, route_entry_ptr->hop_count);
FOUT;
}
DymoT_Route_Entry*
dymo_route_table_entry_get (DymoT_Route_Table* route_table_ptr, InetT_Address dest_addr)
{
DymoT_Route_Entry* route_entry_ptr = OPC_NIL;
char dest_addr_str [INETC_ADDR_STR_LEN];
/** Determines whether an entry exists **/
/** in the route table for a destination**/
FIN (dymo_route_table_entry_get (<args>));
/* Create the destination address string */
inet_address_print (dest_addr_str, dest_addr);
/* Get the entry for this destination */
route_entry_ptr = (DymoT_Route_Entry*) prg_string_hash_table_item_get (route_table_ptr->route_table, dest_addr_str);
if(route_entry_ptr == OPC_NIL)
{
FRET (OPC_NIL);
}
else
{
FRET(route_entry_ptr);
}
}
Compcode
dymo_route_table_entry_param_get (DymoT_Route_Table* route_table_ptr, InetT_Address dest_addr, int param, void* value_ptr)
{
DymoT_Route_Entry* route_entry_ptr = OPC_NIL;
char dest_addr_str [INETC_ADDR_STR_LEN];
int* int_value_ptr;
double* dbl_value_ptr;
Boolean* bool_value_ptr;
DymoC_Route_Entry_State* route_state_ptr;
InetT_Address* ip_addr_ptr;
List** list_pptr;
IpT_Port_Info* port_info_ptr;
/** Access any field in the route table entry **/
FIN (dymo_route_table_entry_param_get (<args>));
/* Create the destination address string */
inet_address_print (dest_addr_str, dest_addr);
/* Get the entry for this destination */
route_entry_ptr = (DymoT_Route_Entry*) prg_string_hash_table_item_get (route_table_ptr->route_table, dest_addr_str);
if (route_entry_ptr == OPC_NIL)
{
FRET (OPC_COMPCODE_FAILURE);
}
/* Based on the input parameter, return */
/* the appropriate parameter */
switch (param)
{
case (DYMOC_ROUTE_ENTRY_DEST_SEQ_NUM):
{
int_value_ptr = (int*) value_ptr;
*int_value_ptr = route_entry_ptr->dest_seq_num;
break;
}
case (DYMOC_ROUTE_ENTRY_VALID_SEQ_NUM_FLAG):
{
bool_value_ptr = (Boolean*) value_ptr;
*bool_value_ptr = route_entry_ptr->valid_dest_sequence_number_flag;
break;
}
case (DYMOC_ROUTE_ENTRY_ROUTE_ENTRY_STATE):
{
route_state_ptr = (DymoC_Route_Entry_State*) value_ptr;
*route_state_ptr = route_entry_ptr->route_entry_state;
break;
}
case (DYMOC_ROUTE_ENTRY_NEXT_HOP_ADDR):
{
ip_addr_ptr = (InetT_Address*) value_ptr;
*ip_addr_ptr = route_entry_ptr->next_hop_addr;
break;
}
case (DYMOC_ROUTE_ENTRY_OUT_PORT_INFO):
{
port_info_ptr = (IpT_Port_Info*) value_ptr;
*port_info_ptr = route_entry_ptr->next_hop_port_info;
break;
}
case (DYMOC_ROUTE_ENTRY_HOP_COUNT):
{
int_value_ptr = (int*) value_ptr;
*int_value_ptr = route_entry_ptr->hop_count;
break;
}
case (DYMOC_ROUTE_ENTRY_PRECURSOR_LIST):
{
list_pptr = (List**) value_ptr;
*list_pptr = route_entry_ptr->precursor_lptr;
break;
}
case (DYMOC_ROUTE_ENTRY_EXPIRY_TIME):
{
dbl_value_ptr = (double*) value_ptr;
*dbl_value_ptr = route_entry_ptr->route_expiry_time;
break;
}
default :
{
/* Unknown input parameter */
FRET (OPC_COMPCODE_FAILURE);
}
}
FRET (OPC_COMPCODE_SUCCESS);
}
Compcode
dymo_route_table_entry_param_set (DymoT_Route_Table* route_table_ptr, InetT_Address dest_addr, int param, ...)
{
DymoT_Route_Entry* route_entry_ptr = OPC_NIL;
char dest_addr_str [INETC_ADDR_STR_LEN];
va_list arg_list;
/** Set the fields of the route table entry **/
FIN (dymo_route_table_entry_param_set (<args>));
/* Create the destination address string */
inet_address_print (dest_addr_str, dest_addr);
/* Get the entry for this destination */
route_entry_ptr = (DymoT_Route_Entry*) prg_string_hash_table_item_get (route_table_ptr->route_table, dest_addr_str);
if (route_entry_ptr == OPC_NIL)
FRET (OPC_COMPCODE_FAILURE);
/* Initialize the list of arguments. Though a list arguments may */
/* not always be passed this approach will help us identify the */
/* data type of the parameters and appropriately cast it. */
va_start (arg_list, param);
/* Based on the input parameter, set */
/* the appropriate parameter */
switch (param)
{
case (DYMOC_ROUTE_ENTRY_DEST_SEQ_NUM):
{
route_entry_ptr->dest_seq_num = va_arg (arg_list, int);
break;
}
case (DYMOC_ROUTE_ENTRY_VALID_SEQ_NUM_FLAG):
{
route_entry_ptr->valid_dest_sequence_number_flag = va_arg (arg_list, Boolean);
break;
}
default :
{
/* Unknown input parameter */
FRET (OPC_COMPCODE_FAILURE);
}
}
FRET (OPC_COMPCODE_SUCCESS);
}
Compcode
dymo_route_table_precursor_add (DymoT_Route_Table* route_table_ptr, InetT_Address dest_addr,
InetT_Address precursor_addr)
{
DymoT_Route_Entry* route_entry_ptr = OPC_NIL;
char dest_addr_str [INETC_ADDR_STR_LEN];
InetT_Address* precursor_addr_ptr;
InetT_Address* pre_addr_ptr;
InetT_Address existing_precursor_addr;
int num, size;
Boolean FOUND;
/** Adds a percursor node to the entry in **/
/** the route table for a destination **/
FIN (dymo_route_table_precursor_add (<args>));
/* Create the destination address string */
inet_address_print (dest_addr_str, dest_addr);
/* Get the entry for this destination */
route_entry_ptr = (DymoT_Route_Entry*) prg_string_hash_table_item_get (route_table_ptr->route_table, dest_addr_str);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -