Source: ../../contrib/olsr/olsr.hh
|
|
|
|
// -*- c-basic-offset: 4; tab-width: 8; indent-tabs-mode: t -*-
// vim:set sts=4 ts=8 sw=4:
// Copyright (c) 2001-2009 XORP, Inc.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License, Version 2, June
// 1991 as published by the Free Software Foundation. Redistribution
// and/or modification of this program under the terms of any other
// version of the GNU General Public License is not permitted.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For more details,
// see the GNU General Public License, Version 2, a copy of which can be
// found in the XORP LICENSE.gpl file.
//
// XORP Inc, 2953 Bunker Hill Lane, Suite 204, Santa Clara, CA 95054, USA;
// http://xorp.net
// $XORP: xorp/contrib/olsr/olsr.hh,v 1.4 2009/01/05 18:30:46 jtc Exp $
#ifndef __OLSR_OLSR_HH__
#define __OLSR_OLSR_HH__
#include "olsr_types.hh"
#include "exceptions.hh"
#include "policy_varrw.hh"
#include "io.hh"
#include "message.hh"
#include "link.hh"
#include "neighbor.hh"
#include "twohop.hh"
#include "face.hh"
#include "face_manager.hh"
#include "neighborhood.hh"
#include "topology.hh"
#include "external.hh"
#include "libxorp/trie.hh"
#include "libproto/spt.hh"
#include "vertex.hh"
#include "route_manager.hh"
#include "trace.hh"
#include "libxorp/profile.hh"
#include "profile_vars.hh"
/**
* @short An OLSR routing process.
*
* IO is performed by the associated class IO.
*/
class Olsr {
public:
Olsr(EventLoop& eventloop, IO* io);
/**
* @return true if this routing process is running.
*/
inline bool running() { return _io->status() != SERVICE_SHUTDOWN; }
/**
* Determine routing process status.
*
* @param reason a text description of the current process status.
* @return status of the routing process.
*/
ProcessStatus status(string& reason);
/**
* Shut down this routing process.
*/
void shutdown();
/**
* Callback method to: receive a datagram.
*
* All packets for OLSR are received through this interface. All good
* packets are sent to the face manager which verifies that the packet
* is expected, and is wholly responsible for further processing.
*/
void receive(const string& interface, const string& vif,
IPv4 dst, uint16_t dport, IPv4 src, uint16_t sport,
uint8_t* data, uint32_t len);
/**
* Transmit a datagram.
*/
bool transmit(const string& interface, const string& vif,
const IPv4& dst, const uint16_t& dport,
const IPv4& src, const uint16_t& sport,
uint8_t* data, const uint32_t& len);
/**
* Register vif status callback with the FEA.
*
* @param cb the callback to register.
*/
inline void register_vif_status(IO::VifStatusCb cb) {
_io->register_vif_status(cb);
}
/**
* Register address status callback with the FEA.
*
* @param cb the callback to register.
*/
inline void register_address_status(IO::AddressStatusCb cb) {
_io->register_address_status(cb);
}
inline EventLoop& get_eventloop() {
return _eventloop;
}
inline FaceManager& face_manager() {
return _fm;
}
inline Neighborhood& neighborhood() {
return _nh;
}
inline TopologyManager& topology_manager() {
return _tm;
}
inline ExternalRoutes& external_routes() {
return _er;
}
inline RouteManager& route_manager() {
return _rm;
}
/**
* Set the main address for the node.
*
* @param addr the main address to set.
* @return true if the main address was set successfully.
*/
inline bool set_main_addr(const IPv4& addr) {
return face_manager().set_main_addr(addr);
}
/**
* @return the main address.
*/
inline IPv4 get_main_addr() {
return face_manager().get_main_addr();
}
/**
* Set the MPR_COVERAGE for the node.
*
* @param mpr_coverage the new value of MPR_COVERAGE.
* @return true if MPR_COVERAGE was set successfully.
*/
inline bool set_mpr_coverage(const uint32_t mpr_coverage) {
neighborhood().set_mpr_coverage(mpr_coverage);
return true;
}
/**
* @return the value of the MPR_COVERAGE variable.
*/
inline uint32_t get_mpr_coverage() {
return neighborhood().mpr_coverage();
}
/**
* Set the TC_REDUNDANCY for the node.
*
* @param tc_redundancy the new value of TC_REDUNDANCY.
* @return true if TC_REDUNDANCY was set successfully.
*/
inline bool set_tc_redundancy(const uint32_t tc_redundancy) {
neighborhood().set_tc_redundancy(tc_redundancy);
return true;
}
/**
* @return the value of the TC_REDUNDANCY variable.
*/
inline uint32_t get_tc_redundancy() {
return neighborhood().get_tc_redundancy();
}
/**
* Set the HELLO_INTERVAL.
*
* @param interval the new value of HELLO_INTERVAL.
* @return true if HELLO_INTERVAL was set successfully.
*/
inline bool set_hello_interval(const TimeVal& interval) {
face_manager().set_hello_interval(interval);
return true;
}
/**
* @return the value of the HELLO_INTERVAL variable.
*/
inline TimeVal get_hello_interval() {
return face_manager().get_hello_interval();
}
/**
* Set the MID_INTERVAL.
*
* @param interval the new value of MID_INTERVAL.
* @return true if MID_INTERVAL was set successfully.
*/
inline bool set_mid_interval(const TimeVal& interval) {
face_manager().set_mid_interval(interval);
return true;
}
/**
* @return the value of the MID_INTERVAL variable.
*/
inline TimeVal get_mid_interval() {
return face_manager().get_mid_interval();
}
/**
* Set the REFRESH_INTERVAL.
*
* @param interval the new refresh interval.
* @return true if the refresh interval was set successfully.
*/
inline bool set_refresh_interval(const TimeVal& interval) {
neighborhood().set_refresh_interval(interval);
return true;
}
/**
* @return the value of the REFRESH_INTERVAL protocol variable.
*/
inline TimeVal get_refresh_interval() {
return neighborhood().get_refresh_interval();
}
/**
* Set the TC interval for the node.
*
* @param interval the new TC interval.
* @return true if the TC interval was set successfully.
*/
inline bool set_tc_interval(TimeVal interval) {
neighborhood().set_tc_interval(interval);
return true;
}
/**
* @return the value of the TC_INTERVAL protocol variable.
*/
inline TimeVal get_tc_interval() {
return neighborhood().get_tc_interval();
}
/**
* Set the WILLINGNESS.
*
* @param willingness the new willingness-to-forward.
* @return true if the willingness was set successfully.
*/
inline bool set_willingness(const OlsrTypes::WillType willingness) {
neighborhood().set_willingness(willingness);
return true;
}
/**
* @return the WILLINGNESS protocol variable.
*/
inline OlsrTypes::WillType get_willingness() {
return neighborhood().willingness();
}
/**
* Set the HNA interval.
*
* @param interval the new HNA interval.
* @return true if the HNA interval was set successfully.
*/
inline bool set_hna_interval(const TimeVal& interval) {
external_routes().set_hna_interval(interval);
return true;
}
/**
* @return the value of the HNA_INTERVAL protocol variable.
*/
inline TimeVal get_hna_interval() {
return external_routes().get_hna_interval();
}
/**
* Set the DUP_HOLD_TIME.
*
* @param interval the new duplicate message hold time
* @return true if the DUP_HOLD_TIME was set successfully.
*/
inline bool set_dup_hold_time(const TimeVal& interval) {
face_manager().set_dup_hold_time(interval);
return true;
}
/**
* @return the value of the DUP_HOLD_TIME protocol variable.
*/
inline TimeVal get_dup_hold_time() {
return face_manager().get_dup_hold_time();
}
/**
* Bind OLSR to an interface.
*
* @param interface the name of the interface to listen on.
* @param vif the name of the vif to listen on.
* @param local_addr the address to listen on.
* @param local_port the address on the interface to listen on.
* @param all_nodes_addr the address to transmit to.
* @param all_nodes_port the port to transmit to.
* @return true if the address was bound successfully.
*/
bool bind_address(const string& interface,
const string& vif,
const IPv4& local_addr,
const uint32_t& local_port,
const IPv4& all_nodes_addr,
const uint32_t& all_nodes_port);
/**
* Unbind OLSR from an interface.
*
* OLSR may only be bound to a single address on an interface,
* therefore there is no 'address' argument to this method.
*
* @param interface the name of the interface to unbind.
* @param vif the name of the vif to unbind.
* @return true if the interface was unbound successfully.
*/
bool unbind_address(const string& interface, const string& vif);
/**
* Enable I/O for OLSR on a given address.
*
* Proxy for class IO.
*
* @param interface the name of the interface to listen on.
* @param vif the name of the vif to listen on.
* @param address the name of the address to listen on.
* @param port the name of the port to listen on.
* @param all_nodes_address the name of the address to transmit to.
* @return true if the address was enabled successfully.
*/
bool enable_address(const string& interface, const string& vif,
const IPv4& address, const uint16_t& port,
const IPv4& all_nodes_address);
/**
* Disable I/O for OLSR on a given address.
*
* Proxy for class IO.
*
* @param interface the name of the interface to listen on.
* @param vif the name of the vif to listen on.
* @param address the name of the address to listen on.
* @param port the name of the port to listen on.
* @return true if the address was enabled successfully.
*/
bool disable_address(const string& interface, const string& vif,
const IPv4& address, const uint16_t& port);
/**
* Enable or disable an interface for OLSR.
*
* @param interface the name of the interface to enable/disable.
* @param vif the name of the vif to enable/disable.
* @param enabled the new enable state of the interface.
* @return true if the interface state was set to @param enabled
* successfully.
*/
bool set_interface_enabled(const string& interface, const string& vif,
const bool enabled);
/**
* Determine if an interface is enabled for OLSR.
*
* @param interface the name of the interface to examine.
* @param vif the name of the vif to examine.
* @param enabled output variable will be set to the enable state
* of the interface.
* @return true if the enable state was retrieved successfully.
*/
bool get_interface_enabled(const string& interface, const string& vif,
bool& enabled);
/**
* Get an interface's statistics.
*
* @param interface the name of the interface to examine.
* @param vif the name of the vif to examine.
* @param stats output variable will be set to the interface stats.
* @return true if the stats werre retrieved successfully.
*/
bool get_interface_stats(const string& interface, const string& vif,
FaceCounters& stats);
/**
* Set the cost on an interface.
*
* @param interface the name of the interface to set cost for.
* @param vif the name of the vif to set cost for.
* @param cost the new cost of the interface.
* @return true if the interface cost was set successfully.
*/
inline bool set_interface_cost(const string& interface,
const string& vif, int cost)
{
OlsrTypes::FaceID faceid = face_manager().get_faceid(interface, vif);
return face_manager().set_interface_cost(faceid, cost);
}
/**
* Get the MTU of an interface.
*
* @param interface the name of the interface to get MTU for.
* @return the MTU of the interface.
*/
uint32_t get_mtu(const string& interface);
/**
* Get the primary IPv4 broadcast address configured for this
* interface/vif/address.
*
* @param interface the interface to get broadcast address for.
* @param vif the vif to get broadcast address for.
* @param address the IPv4 interface address.
* @param bcast_address (out argument) the IPv4 broadcast address.
* @return true if the broadcast address was obtained successfully.
*/
bool get_broadcast_address(const string& interface, const string& vif,
const IPv4& address, IPv4& bcast_address);
/**
* Test whether this interface/vif is broadcast capable.
*
* @param interface the interface to test.
* @param vif the vif to test.
* @return true if it is broadcast capable, otherwise false.
*/
bool is_vif_broadcast_capable(const string& interface,
const string& vif);
/**
* Test whether this interface/vif is multicast capable.
*
* @param interface the interface to test.
* @param vif the vif to test.
* @return true if it is multicast capable, otherwise false.
*/
bool is_vif_multicast_capable(const string& interface,
const string& vif);
/**
* Add route.
*
* @param net network
* @param nexthop
* @param nexthop_id interface ID towards the nexthop
* @param metric to network
* @param policytags policy info to the RIB.
*/
bool add_route(IPv4Net net, IPv4 nexthop, uint32_t nexthop_id,
uint32_t metric, const PolicyTags& policytags);
/**
* Replace route.
*
* @param net network
* @param nexthop
* @param nexthop_id interface ID towards the nexthop
* @param metric to network
* @param policytags policy info to the RIB.
*/
bool replace_route(IPv4Net net, IPv4 nexthop, uint32_t nexthop_id,
uint32_t metric, const PolicyTags& policytags);
/**
* Delete route.
*
* @param net network
*/
bool delete_route(IPv4Net net);
/**
* Configure a policy filter
*
* @param filter Id of filter to configure.
* @param conf Configuration of filter.
*/
void configure_filter(const uint32_t& filter, const string& conf);
/**
* Reset a policy filter.
*
* @param filter Id of filter to reset.
*/
void reset_filter(const uint32_t& filter);
/**
* Push routes through policy filters for re-filtering.
*/
void push_routes();
/**
* Originate an external route in HNA.
*
* @param net network prefix to originate.
* @param nexthop the next hop. Ignored by HNA.
* @param metric external metric for this route.
* @param policytags the policy tags associated with this route.
* @return true if the route was originated successfully.
*/
bool originate_external_route(const IPv4Net& net,
const IPv4& nexthop,
const uint32_t& metric,
const PolicyTags& policytags);
/**
* Withdraw an external route from HNA.
*
* @param net network prefix to withdraw.
* @return true if the route was withdrawn successfully.
*/
bool withdraw_external_route(const IPv4Net& net);
/**
* @return a reference to the policy filters
*/
PolicyFilters& get_policy_filters() { return _policy_filters; }
/**
* @return a reference to the tracing variables
*/
Trace& trace() { return _trace; }
/**
* @return a reference to the profiler
*/
//Profile& profile() { return _profile; }
/**
* Clear protocol databases.
*
* A full routing recomputation should be triggered by this operation.
* This specifically clears links, MID, TC, learned HNA entries,
* and the duplicate message set only.
*/
bool clear_database();
private:
EventLoop& _eventloop;
IO* _io;
FaceManager _fm;
Neighborhood _nh;
TopologyManager _tm;
ExternalRoutes _er;
RouteManager _rm;
string _reason;
ProcessStatus _process_status;
PolicyFilters _policy_filters;
/**
* Trace variables.
*/
Trace _trace;
/**
* Profiler instance.
*/
//Profile _profile;
};
#endif // __OLSR_OLSR_HH__
Generated by: pavlin on kobe.xorp.net on Wed Jan 7 19:11:15 2009, using kdoc 2.0a54+XORP.