Source: ../../policy/code.hh
|
|
|
|
// -*- c-basic-offset: 4; tab-width: 8; indent-tabs-mode: t -*-
// vim:set sts=4 ts=8:
// 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/policy/code.hh,v 1.14 2009/01/05 18:31:03 jtc Exp $
#ifndef __POLICY_CODE_HH__
#define __POLICY_CODE_HH__
#include <string>
#include <set>
#include <map>
#include "policy/common/filter.hh"
typedef map<string, string> SUBR; // XXX string* would be better...
/**
* @short This class represents the intermediate language code.
*
* It contains the actual code for the policy, its target, and names of the
* sets referenced. It also contains the policytags referenced.
*/
class Code {
public:
/**
* @short A target represents where the code should be placed.
*
* A target consists of a protocol and a filter type. It identifies exactly
* which filter of which protocol has to be configured with this code.
*/
class Target {
public:
/**
* Default constructor.
*/
Target() {}
/**
* Construct a target [protocol/filter pair].
*
* @param p target protocol.
* @param f target filter.
*/
Target(const string& p, filter::Filter f) : _protocol(p), _filter(f) {}
/**
* Operator to compare Targets. Needed for STL set storage.
*
* @return true if target is less than argument
* @param rhs target to compare with
*/
bool operator<(const Target& rhs) const;
bool operator==(const Target& rhs) const;
bool operator!=(const Target& rhs) const;
/**
* Get the protocol.
*
* @return the protocol.
*/
const string protocol() const { return _protocol; }
/**
* Set the protocol.
*
* @param protocol the protocol name.
*/
void set_protocol(const string& protocol) { _protocol = protocol; }
/**
* Get the filter type.
*
* @return the filter type.
*/
filter::Filter filter() const { return _filter; }
/**
* Set the filter type.
*
* @param filter the filter type.
*/
void set_filter(const filter::Filter& filter) { _filter = filter; }
/**
* @return string representation of target.
*/
string str() const;
private:
string _protocol;
filter::Filter _filter;
};
typedef set<Target> TargetSet;
// if it is export filter code, these are the tags used by the code.
typedef set<uint32_t> TagSet;
/**
* Get the target.
*
* @return a reference to the target.
*/
const Code::Target& target() const { return _target; }
/**
* Set the target.
*
* @param target the target.
*/
void set_target(const Code::Target target) { _target = target; }
/**
* Set the target protocol.
*
* @param protocol the target protocol name.
*/
void set_target_protocol(const string& protocol);
/**
* Set the target filter type.
*
* @param filter the target filter type.
*/
void set_target_filter(const filter::Filter& filter);
/**
* Get the actual code.
*
* @return a reference to the actual code.
*/
const string& code() const { return _code; }
/**
* Set the actual code.
*
* @param code the actual code.
*/
void set_code(const string& code) { _code = code; }
/**
* Add to the actual code.
*
* @param code the code to add.
*/
void add_code(const string& code) { _code += code; }
/**
* Get the names of the sets referenced by this code.
*
* @return a reference to the names of the sets referenced by this code.
*/
const set<string> referenced_set_names() const {
return _referenced_set_names;
}
/**
* Set the names of the sets referenced by this code.
*
* @param set_names the names of the sets referenced by this code.
*/
void set_referenced_set_names(const set<string>& set_names) {
_referenced_set_names = set_names;
}
/**
* Add the name of a set referenced by this code.
*
* @param set_name the name of the set referenced by this code.
*/
void add_referenced_set_name(const string& set_name) {
_referenced_set_names.insert(set_name);
}
/**
* Remove the names of all sets referenced by this code.
*/
void clear_referenced_set_names() { _referenced_set_names.clear(); }
/*
* Get the set of source protocols.
*
* @return a reference to the set of source protocols.
*/
const set<string>& source_protocols() const { return _source_protocols; }
/**
* Add a source protocol.
*
* @param protocol the protocol to add.
*/
void add_source_protocol(const string& protocol) {
_source_protocols.insert(protocol);
}
/**
* Get the set with all tags.
*
* @return a reference to the set with all tags.
*/
const Code::TagSet& all_tags() const { return _all_tags; }
/**
* Get the set with the tags used for route redistribution to other
* protocols.
*
* @return a reference to the set with tags used for route redistribution.
*/
const Code::TagSet& redist_tags() const { return _redist_tags; }
/**
* Add a tag.
*
* @param tag the tag to add.
* @param is_redist_tag if true, the tag is used for route redistribution
* to other protocols.
*/
void add_tag(uint32_t tag, bool is_redist_tag) {
_all_tags.insert(tag);
if (is_redist_tag)
_redist_tags.insert(tag);
}
void add_subr(const string& policy, const string& code);
const SUBR& subr() const;
/**
* @return string representation of code.
*/
string str();
/**
* Appends code to current code. It enables for chunks of code to be
* linked.
*
* @return reference to the updated code.
* @param rhs code to link.
*/
Code& operator +=(const Code& rhs);
private:
Target _target;
string _code;
set<string> _referenced_set_names;
// if it is an export filter code, these are source protocols which will
// send routes to the target
set<string> _source_protocols;
TagSet _all_tags;
TagSet _redist_tags; // The tags used for route redistribution
SUBR _subr;
};
#endif // __POLICY_CODE_HH__
Generated by: pavlin on kobe.xorp.net on Wed Jan 7 19:11:02 2009, using kdoc 2.0a54+XORP.