Source: ../../rip/peer.hh
|
|
|
|
// -*- c-basic-offset: 4; tab-width: 8; indent-tabs-mode: t -*-
// 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/rip/peer.hh,v 1.16 2009/01/05 18:31:08 jtc Exp $
#ifndef __RIP_PEER_HH__
#define __RIP_PEER_HH__
#include "libxorp/timeval.hh"
#include "route_entry.hh"
/**
* @short Container of counters associated with a peer.
*/
struct PeerCounters {
public:
PeerCounters() : _packets_recv(0), _updates_recv(0), _requests_recv(0),
_bad_routes(0), _bad_packets(0), _bad_auth_packets(0)
{}
/**
* Get the total number of packets received.
*/
uint32_t packets_recv() const { return _packets_recv; }
/**
* Increment the total number of packets received.
*/
void incr_packets_recv() { _packets_recv++; }
/**
* Get the total number of update packets received.
*/
uint32_t update_packets_recv() const { return _updates_recv; }
/**
* Increment the total number of update packets received.
*/
void incr_update_packets_recv() { _updates_recv++; }
/**
* Get the total number of table request packets received.
*/
uint32_t table_requests_recv() const { return _requests_recv; }
/**
* Increment the total number of table request packets received.
*/
void incr_table_requests_recv() { _requests_recv++; }
/**
* Get the number of bad routes received (eg invalid metric,
* invalid address family).
*/
uint32_t bad_routes() const { return _bad_routes; }
/**
* Increment the number of bad routes received.
*/
void incr_bad_routes() { _bad_routes++; }
/**
* Get the number of bad response packets received.
*/
uint32_t bad_packets() const { return _bad_packets; }
/**
* Increment the number of bad response packets received.
*/
void incr_bad_packets() { _bad_packets++; }
/**
* Get the number of bad authentication packets received.
*/
uint32_t bad_auth_packets() const { return _bad_auth_packets; }
/**
* Increment the number of bad authentication packets received.
*/
void incr_bad_auth_packets() { _bad_auth_packets++; }
protected:
uint32_t _packets_recv;
uint32_t _updates_recv;
uint32_t _requests_recv;
uint32_t _bad_routes;
uint32_t _bad_packets;
uint32_t _bad_auth_packets;
};
// Forward declaration of Peer class
template <typename A> class Peer;
/**
* @short RIP Peer Routes
*
* A class for storing the original routes received from a Peer host.
* Those routes are used to push them whenever the routing policy is modified.
*/
template <typename A>
class PeerRoutes : public RouteEntryOrigin<A> {
public:
PeerRoutes(Peer<A>& peer) : RouteEntryOrigin<A>(false), _peer(peer) {}
private:
uint32_t expiry_secs() const;
uint32_t deletion_secs() const;
Peer<A>& _peer; // The corresponding peer
};
// Forward declaration of Port class
template <typename A>
class Port;
/**
* @short RIP Peer
*
* A RIP peer is a host that sent RIP packets, originating routes, to
* the local RIP Port (@ref Port<A>) that have originated routes.
* Most of a Peer's work is conducted by the Port associated with
* the Peer instance. The Peer class just acts as a container of
* information about the Peer host, such as the number of packets sent,
* the time of last update, etc.
* It also contains the original routes as received from the Peer host.
* Those routes are used to push them whenever the routing policy is modified.
*/
template <typename A>
class Peer : public RouteEntryOrigin<A>
{
public:
typedef A Addr;
typedef Port<A> RipPort;
typedef RouteEntry<A> Route;
public:
Peer(RipPort& p, const Addr& addr);
~Peer();
/**
* Get address of Peer.
*/
const Addr& address() const { return _addr; }
/**
* Get counters associated with Peer.
*/
PeerCounters& counters() { return _counters; }
/**
* Get counters associated with Peer.
*/
const PeerCounters& counters() const { return _counters; }
/**
* Get port associated with Peer.
*/
RipPort& port() { return _port; }
/**
* Get port associated with Peer.
*/
const RipPort& port() const { return _port; }
/**
* Set last active time.
*/
void set_last_active(const TimeVal& t) { _last_active = t; }
/**
* Get last active time.
*/
const TimeVal& last_active() const { return _last_active; }
/**
* Update Route Entry in database for specified route.
*
* @param net the network route being updated.
* @param nexthop the corresponding nexthop address.
* @param cost the corresponding metric value as received from the
* route originator.
* @param tag the corresponding route tag.
* @param policytags the policytags of this route.
* @return true if an update occurs, false otherwise.
*/
bool update_route(const IPNet<A>& net,
const A& nexthop,
uint32_t cost,
uint32_t tag,
const PolicyTags& policytags);
/**
* Push routes through the system.
*
* This is needed to apply the policy filters for re-filtering.
*/
void push_routes();
uint32_t expiry_secs() const;
uint32_t deletion_secs() const;
protected:
void set_expiry_timer(Route* route);
void expire_route(Route* route);
RipPort& _port;
Addr _addr;
PeerCounters _counters;
TimeVal _last_active;
PeerRoutes<A> _peer_routes;
};
/**
* Unary Function Predicate class for use with STL to determine if a
* peer has an address.
*/
template <typename A>
struct peer_has_address {
peer_has_address(const A& addr) : _a(addr) {}
bool operator() (const Peer<A>& p) const { return p.address() == _a; }
bool operator() (const Peer<A>* p) const { return p->address() == _a; }
private:
A _a;
};
#endif // __RIP_PEER_HH__
Generated by: pavlin on kobe.xorp.net on Wed Jan 7 19:11:10 2009, using kdoc 2.0a54+XORP.