#include "opnetProtoRouteMgr.h"
OpnetProtoRouteMgr::OpnetProtoRouteMgr()
{
#ifdef OP_DEBUG2
printf("\t\tOpnetProtoRouteMgr::OpnetProtoRouteMgr()\n");
#endif
}
OpnetProtoRouteMgr::~OpnetProtoRouteMgr()
{
}
bool OpnetProtoRouteMgr::Open(const void* userData)
{
#ifdef OP_DEBUG1
printf("\t\tOpnetProtoRouteMgr::Open()\n");
#endif
bool r_val = OPC_TRUE;
return (r_val);
}
bool OpnetProtoRouteMgr::Open(IpT_Cmn_Rte_Table * cmn_rte_table, int nodeId,
IpT_Rte_Proc_Id olsr_protocol_id, IpT_Interface_Info* ip_intf_pnt)
{
opnet_cmn_route_table = cmn_rte_table;
my_node_id = nodeId;
my_protocol_id = olsr_protocol_id;
my_ip_interface_pnt = ip_intf_pnt;
#ifdef OP_DEBUG1
printf("Node %d - OpnetProtoRouteMgr::Open() - cmn_route_table = %ld, protocol_id = %I64d, ip_interf_pnt = %ld\n",
my_node_id, opnet_cmn_route_table, my_protocol_id, my_ip_interface_pnt);
#endif
bool r_value = OPC_TRUE;
return r_value;
}
bool OpnetProtoRouteMgr::IsOpen() const
{
if (opnet_cmn_route_table != OPC_NIL)
return (OPC_TRUE);
else
return (OPC_FALSE);
}
void OpnetProtoRouteMgr::Close()
{
}
bool OpnetProtoRouteMgr::GetAllRoutes(ProtoAddress::Type addrType,
ProtoRouteTable& routeTable)
{
#ifdef OP_DEBUG1
printf("\t\tOpnetProtoRouteMgr::GetAllRoutes().\n");
#endif
return OPC_TRUE;
}
bool OpnetProtoRouteMgr::GetRoute(const ProtoAddress& dst,
unsigned int prefixLen,
ProtoAddress& gw,
unsigned int& ifIndex,
int& metric)
{
#ifdef OP_DEBUG1
printf("\t\tOpnetProtoRouteMgr::GetRoute() - Not used yet. \n");
#endif
return OPC_TRUE;
}
bool OpnetProtoRouteMgr::SetRoute(const ProtoAddress& dst,
unsigned int prefixLen,
const ProtoAddress& gw,
unsigned int ifIndex,
int metric)
{
Compcode comp;
IpT_Address dest, mask, next_hop;
IpT_Port_Info port_info;
int admin_distance;
dest = (IpT_Address) dst.SimGetAddress();
if(dest ==INADDR_ANY)
mask = NETMASK_DEFAULT;
else
mask = NETMASK_HOST;
port_info.intf_tbl_index = my_ip_interface_pnt->phys_intf_info_ptr->ip_addr_index; port_info.output_info.intf_name = "WLAN"; port_info.minor_port = IPC_SUBINTF_PHYS_INTF;
next_hop = (IpT_Address) gw.SimGetAddress();
if (next_hop == 0) next_hop = (IpT_Address) dst.SimGetAddress();
admin_distance = 0;
#ifdef OP_DEBUG1
printf("Node %d - OpnetProtoRouteMgr::SetRoute() - dest = %u, next-hop = %u\n",
my_node_id, dest, next_hop);
printf("\t\t - port_info->intf_tbl_index = %hd, metrix = %d, admin_distance = %d\n",
port_info.intf_tbl_index, metric, admin_distance);
#endif
comp = Inet_Cmn_Rte_Table_Entry_Add_Options (
opnet_cmn_route_table,
my_ip_interface_pnt,
ip_cmn_rte_table_v4_dest_prefix_create(dest,mask),
inet_address_from_ipv4_address_create(next_hop),
port_info,
metric,
my_protocol_id,
admin_distance,
IPC_CMN_RTE_TABLE_ENTRY_ADD_INDIRECT_NEXTHOP_OPTION);
if (op_prg_odb_ltrace_active ("olsr route table"))
ip_cmn_rte_table_print (opnet_cmn_route_table);
return ((bool)comp);
}
bool OpnetProtoRouteMgr::DeleteRoute(const ProtoAddress& dst,
unsigned int prefixLen,
const ProtoAddress& gw,
unsigned int ifIndex)
{
Compcode comp;
IpT_Address dest, mask, next_hop;
IpT_Port_Info port_info;
int admin_distance;
dest = (IpT_Address) dst.SimGetAddress();
#ifdef OP_DEBUG1
printf("Node %d - OpnetProtoRouteMgr::DeleteRoute() - dest = %u\n", my_node_id, dest);
#endif
if(dest ==INADDR_ANY)
mask = NETMASK_DEFAULT;
else
mask = NETMASK_HOST;
port_info.intf_tbl_index = my_ip_interface_pnt->phys_intf_info_ptr->ip_addr_index; port_info.output_info.intf_name = "WLAN";
next_hop = (IpT_Address) gw.SimGetAddress();
if (next_hop == 0) next_hop = (IpT_Address) dst.SimGetAddress();
admin_distance = 0;
comp = Ip_Cmn_Rte_Table_Route_Delete (
opnet_cmn_route_table,
dest,
mask,
my_protocol_id);
if (op_prg_odb_ltrace_active ("olsr route table"))
ip_cmn_rte_table_print (opnet_cmn_route_table);
return ((bool)comp);
}
bool OpnetProtoRouteMgr::SetForwarding(bool state)
{
forwardingOn = state;
return OPC_TRUE;
}
OpnetProtoRouteMgr* OpnetProtoRouteMgr::Create()
{
#ifdef OP_DEBUG1
printf("\t\tOpnetProtoRouteMgr::Create()\n");
#endif
return (new OpnetProtoRouteMgr);
}
ProtoRouteMgr* ProtoRouteMgr::Create()
{
return (ProtoRouteMgr*)(new OpnetProtoRouteMgr);
}
bool OpnetProtoRouteMgr::GetInterfaceAddressList(unsigned int ifIndex,
ProtoAddress::Type addrType,
ProtoAddress::List& addrList)
{
FIN (OpnetProtoRouteMgr::GetLocalAddress());
IpT_Interface_Info * ip_intf_pnt;
ip_intf_pnt = this->GetIntfInfoPnt();
IpT_Address IpAddr = ip_intf_pnt->addr_range_ptr->address;
ProtoAddress ifAddr;
ifAddr.SimSetAddress((SIMADDR)IpAddr);
bool result = addrList.Insert(ifAddr);
if (!result)
PLOG(PL_ERROR, "OpnetProtoRouteMgr::GetLocalAddress() error: "
"unable to add addr to list\n");
#ifdef OP_DEBUG1
printf("OpnetProtoRouteMgr::GetLocalAddress(my_Ip_Addr = %u)\n", IpAddr);
#endif
FRET (result);
}
unsigned int OpnetProtoRouteMgr::GetInterfaceIndex(const char* interfaceName)
{
FIN (OpnetProtoRouteMgr::GetInterfaceIndex());
IpT_Interface_Info * ip_intf_pnt;
ip_intf_pnt = this->GetIntfInfoPnt();
int index = ip_intf_pnt->phys_intf_info_ptr->ip_addr_index + 1;
#ifdef OP_DEBUG1
printf("Node %d - opnetProtoRouteMgr.pr.c - GetInterfaceIndex() - name = %s, index = %d\n",
this->getNodeId(), interfaceName, index);
#endif
FRET ( (unsigned int) index);
}
bool OpnetProtoRouteMgr::GetInterfaceName(unsigned int interfaceIndex,
char* buffer,
unsigned int buflen)
{
FIN (OpnetProtoRouteMgr::GetInterfaceName());
IpT_Interface_Info * ip_intf_pnt;
ip_intf_pnt = this->GetIntfInfoPnt();
strcpy (buffer, ip_intf_pnt->full_name);
#ifdef OP_DEBUG1
printf("Node %d - opnetProtoRouteMgr.pr.c - GetInterfaceName() - name = %s\n",
this->getNodeId(), buffer);
#endif
FRET (OPC_TRUE);
}