Source: ../../rib/redist_policy.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/rib/redist_policy.hh,v 1.8 2009/01/05 18:31:07 jtc Exp $
#ifndef __RIB_REDIST_POLICY_HH__
#define __RIB_REDIST_POLICY_HH__
/**
* @short Base class for Redistribution Policy objects.
*
* Redistribution Policy objects are intended to be composable.
* Logical Operators as well as route attibute operators are defined.
*/
template <typename A>
class RedistPolicy {
public:
/**
* Determine whether route should be accepted for redistribution.
*
* @param ipr route to be examined.
*
* @return true if route should be accepted for redistribution, false
* otherwise.
*/
virtual bool accept(const IPRouteEntry<A>& ipr) const = 0;
virtual ~RedistPolicy() {};
};
/**
* @short Base class for Unary Redistribution Policy objects.
*/
template <typename A>
class RedistUnaryOp {
public:
/**
* Constructor.
*
* @param policy policy object allocated with new.
*/
RedistUnaryOp(const RedistPolicy<A>* policy) : _p1(policy) {}
~RedistUnaryOp() { delete _p1; }
private:
// The following are not implemented
RedistUnaryOp();
RedistUnaryOp(const RedistUnaryOp<A>&);
RedistUnaryOp<A>& operator=(const RedistUnaryOp<A>&);
protected:
const RedistPolicy<A>* _p1;
};
/**
* @short Base class for Binary Redistribution Policy objects.
*/
template <typename A>
class RedistBinaryOp : public RedistPolicy<A> {
public:
/**
* Constructor.
*
* @param one policy object allocated with new.
* @param two policy object allocated with new.
*
* Note: destructor deletes supplied policy objects.
*/
RedistBinaryOp(RedistPolicy<A>* one, RedistPolicy<A>* two)
: _p1(one), _p2(two) {}
~RedistBinaryOp() { delete _p1; delete _p2; }
private:
// The following are not implemented
RedistBinaryOp();
RedistBinaryOp(const RedistBinaryOp<A>&);
RedistBinaryOp<A>& operator=(const RedistBinaryOp<A>&);
protected:
const RedistPolicy<A>* _p1;
const RedistPolicy<A>* _p2;
};
/**
* @short Logical-Not for Redistribution Policy objects.
*/
template <typename A>
class RedistLogicalNot : public RedistUnaryOp<A> {
public:
RedistLogicalNot(const RedistPolicy<A>* p) : RedistUnaryOp<A>(p) {}
bool accept() const { return ! this->_p1->accept(); }
};
/**
* @short Logical-And for Redistribution Policy objects.
*/
template <typename A>
class RedistLogicalAnd : public RedistBinaryOp<A> {
public:
RedistLogicalAnd(const RedistPolicy<A>* p1, const RedistPolicy<A>* p2)
: RedistBinaryOp<A>(p1, p2)
{}
bool accept(const IPRouteEntry<A>& ipr)
{
return this->_p1->accept(ipr) && this->_p2->accept(ipr);
}
};
/**
* @short Logical-And for Redistribution Policy objects.
*/
template <typename A>
class RedistLogicalOr : public RedistBinaryOp<A> {
public:
RedistLogicalOr(const RedistPolicy<A>* one, const RedistPolicy<A>* two)
: RedistBinaryOp<A>(one, two)
{}
bool accept(const IPRouteEntry<A>& ipr)
{
return this->_p1->accept(ipr) || this->_p2->accept(ipr);
}
};
/**
* @short Protocol Policy class.
*
* Accepts route update from a specific routing protocol.
*/
template <typename A>
class IsOfProtocol : public RedistPolicy<A>
{
public:
IsOfProtocol(const Protocol& p) : _protocol(p) {}
bool accept(const IPRouteEntry<A>& ipr) const {
return ipr.protocol() == _protocol;
}
private:
Protocol _protocol;
};
/**
* @short IGP Protocol Policy.
*
* Accepts route updates from Interior Gateway Protocols.
*/
template <typename A>
class IsIGP : public RedistPolicy<A>
{
public:
IsIGP() {}
bool accept(const IPRouteEntry<A>& ipr) const {
return ipr.protocol_type() == IGP;
}
};
/**
* @short EGP Protocol Policy.
*
* Accepts route updates from Exterior Gateway Protocols.
*/
template <typename A>
class IsEGP : public RedistPolicy<A>
{
public:
IsEGP() {}
bool accept(const IPRouteEntry<A>& ipr) const {
return ipr.protocol_type() == EGP;
}
};
#endif // __RIB_REDIST_POLICY_HH__
Generated by: pavlin on kobe.xorp.net on Wed Jan 7 19:11:09 2009, using kdoc 2.0a54+XORP.