Skip to content

Commit

Permalink
Routing policy code changes
Browse files Browse the repository at this point in the history
Initial version of the config handling code for Routing Policy

Change-Id: I65ae7e7ea8f4a3b6af42202ddc267874733a13af
Closes-bug: #1500698
  • Loading branch information
bailkeri committed Nov 20, 2015
1 parent 577eaf3 commit 3c7f0fc
Show file tree
Hide file tree
Showing 31 changed files with 1,021 additions and 4 deletions.
2 changes: 2 additions & 0 deletions src/bgp/SConscript
Expand Up @@ -110,6 +110,8 @@ test_suite += env.SConscript('l3vpn/SConscript', exports='BuildEnv',
duplicate = 0)
test_suite += env.SConscript('origin-vn/SConscript', exports='BuildEnv',
duplicate = 0)
env.SConscript('routing-policy/SConscript', exports='BuildEnv', duplicate = 0)

env.SConscript('routing-instance/SConscript', exports='BuildEnv', duplicate = 0)
test_suite += env.SConscript('rtarget/SConscript', exports='BuildEnv',
duplicate = 0)
Expand Down
22 changes: 22 additions & 0 deletions src/bgp/bgp_config.cc
Expand Up @@ -285,6 +285,19 @@ const ServiceChainConfig *BgpInstanceConfig::service_chain_info(
return NULL;
}


BgpRoutingPolicyConfig::BgpRoutingPolicyConfig(const std::string &name)
: name_(name),
last_change_at_(UTCTimestampUsec()) {
}

BgpRoutingPolicyConfig::~BgpRoutingPolicyConfig() {
}

void BgpRoutingPolicyConfig::Clear() {
terms_.clear();
}

BgpConfigManager::BgpConfigManager(BgpServer *server)
: server_(server) {
}
Expand All @@ -301,6 +314,15 @@ void BgpConfigManager::Notify<BgpInstanceConfig>(
}
}

template<>
void BgpConfigManager::Notify<BgpRoutingPolicyConfig>(
const BgpRoutingPolicyConfig *config, EventType event) {
config->set_last_change_at(UTCTimestampUsec());
if (obs_.policy) {
(obs_.policy)(config, event);
}
}

template<>
void BgpConfigManager::Notify<BgpProtocolConfig>(
const BgpProtocolConfig *config, EventType event) {
Expand Down
78 changes: 78 additions & 0 deletions src/bgp/bgp_config.h
Expand Up @@ -262,12 +262,73 @@ struct StaticRouteConfig {
std::vector<std::string> route_target;
};

typedef std::vector<std::string> CommunityList;

struct PrefixMatch {
std::string prefix_to_match;
std::string prefix_match_type;
};

struct RoutingPolicyMatch {
std::string community_match;
PrefixMatch prefix_match;
};

struct ActionUpdate {
CommunityList community_set;
CommunityList community_add;
CommunityList community_remove;
uint32_t local_pref;
};

struct RoutingPolicyAction {
enum ActionType {
ACCEPT,
REJECT,
NEXT_TERM
};
ActionUpdate update;
ActionType action;
};

struct RoutingPolicyTerm {
RoutingPolicyMatch match;
RoutingPolicyAction action;
};

// Route Policy configuration.
class BgpRoutingPolicyConfig {
public:
typedef std::vector<RoutingPolicyTerm> RoutingPolicyTermList;
explicit BgpRoutingPolicyConfig(const std::string &name);
virtual ~BgpRoutingPolicyConfig();

const std::string &name() const { return name_; }
void set_last_change_at(uint64_t tstamp) const { last_change_at_ = tstamp; }
void add_term(RoutingPolicyTerm term) {
terms_.push_back(term);
}
void Clear();

private:
std::string name_;
mutable uint64_t last_change_at_;
RoutingPolicyTermList terms_;
DISALLOW_COPY_AND_ASSIGN(BgpRoutingPolicyConfig);
};

struct RoutingPolicyAttachInfo {
std::string sequence_;
std::string routing_policy_;
};

// Instance configuration.
class BgpInstanceConfig {
public:
typedef std::set<std::string> RouteTargetList;
typedef std::vector<StaticRouteConfig> StaticRouteList;
typedef std::vector<ServiceChainConfig> ServiceChainList;
typedef std::vector<RoutingPolicyAttachInfo> RoutingPolicyList;

explicit BgpInstanceConfig(const std::string &name);
virtual ~BgpInstanceConfig();
Expand Down Expand Up @@ -320,6 +381,12 @@ class BgpInstanceConfig {
}
const ServiceChainConfig *service_chain_info(Address::Family family) const;

const RoutingPolicyList &routing_policy_list() const {
return routing_policies_;
}
void swap_routing_policy_list(RoutingPolicyList *list) {
std::swap(routing_policies_, *list);
}
void Clear();

private:
Expand All @@ -337,6 +404,7 @@ class BgpInstanceConfig {
StaticRouteList inet_static_routes_;
StaticRouteList inet6_static_routes_;
ServiceChainList service_chain_list_;
RoutingPolicyList routing_policies_;

DISALLOW_COPY_AND_ASSIGN(BgpInstanceConfig);
};
Expand Down Expand Up @@ -411,13 +479,19 @@ class BgpConfigManager {
BgpInstanceObserver;
typedef boost::function<void(const BgpNeighborConfig *, EventType)>
BgpNeighborObserver;
typedef boost::function<void(const BgpRoutingPolicyConfig *, EventType)>
BgpRoutingPolicyObserver;

struct Observers {
BgpProtocolObserver protocol;
BgpInstanceObserver instance;
BgpNeighborObserver neighbor;
BgpRoutingPolicyObserver policy;
};

typedef std::map<std::string, BgpRoutingPolicyConfig *> RoutingPolicyMap;
typedef std::pair<RoutingPolicyMap::const_iterator,
RoutingPolicyMap::const_iterator> RoutingPolicyMapRange;
typedef std::map<std::string, BgpInstanceConfig *> InstanceMap;
typedef std::pair<InstanceMap::const_iterator,
InstanceMap::const_iterator> InstanceMapRange;
Expand All @@ -437,6 +511,8 @@ class BgpConfigManager {
virtual void Terminate() = 0;
virtual const std::string &localname() const = 0;

virtual RoutingPolicyMapRange RoutingPolicyMapItems(
const std::string &start_policy = std::string()) const = 0;
virtual InstanceMapRange InstanceMapItems(
const std::string &start_instance = std::string()) const = 0;
virtual NeighborMapRange NeighborMapItems(
Expand All @@ -446,6 +522,8 @@ class BgpConfigManager {

virtual const BgpInstanceConfig *FindInstance(
const std::string &name) const = 0;
virtual const BgpRoutingPolicyConfig *FindRoutingPolicy(
const std::string &name) const = 0;
virtual const BgpProtocolConfig *GetProtocolConfig(
const std::string &instance_name) const = 0;
virtual const BgpNeighborConfig *FindNeighbor(
Expand Down

0 comments on commit 3c7f0fc

Please sign in to comment.