From 56295b15ac19ad7b1b0e4b08125a4fe53ac819b5 Mon Sep 17 00:00:00 2001 From: Prakash Bailkeri Date: Mon, 1 Feb 2016 08:50:28 +0530 Subject: [PATCH] Support setting med in routing policy action Add support for updating the MED in routing policy action. Test case to validate it Change-Id: I23ac0570673329a571c48606e3fc80cdf057081a Related-bug: #1500698 --- src/bgp/bgp_config.cc | 3 ++ src/bgp/bgp_config.h | 1 + src/bgp/bgp_config_ifmap.cc | 1 + src/bgp/routing-policy/routing_policy.cc | 6 ++++ .../routing-policy/routing_policy_action.cc | 20 +++++++++++++ .../routing-policy/routing_policy_action.h | 12 ++++++++ src/bgp/test/routing_policy_test.cc | 30 +++++++++++++++++++ src/bgp/testdata/routing_policy_1b.xml | 18 +++++++++++ src/schema/routing_policy.xsd | 1 + 9 files changed, 92 insertions(+) create mode 100644 src/bgp/testdata/routing_policy_1b.xml diff --git a/src/bgp/bgp_config.cc b/src/bgp/bgp_config.cc index 08a844aa7d6..d55ad2598a3 100644 --- a/src/bgp/bgp_config.cc +++ b/src/bgp/bgp_config.cc @@ -369,6 +369,9 @@ string RoutingPolicyActionConfig::ToString() const { if (update.local_pref) { oss << " local-preference " << update.local_pref << std::endl; } + if (update.med) { + oss << " med " << update.med << std::endl; + } if (action == ACCEPT) { oss << " accept" << std::endl; diff --git a/src/bgp/bgp_config.h b/src/bgp/bgp_config.h index 31f8285f8d6..a242a87b609 100644 --- a/src/bgp/bgp_config.h +++ b/src/bgp/bgp_config.h @@ -317,6 +317,7 @@ struct ActionUpdate { CommunityList community_add; CommunityList community_remove; uint32_t local_pref; + uint32_t med; }; struct RoutingPolicyActionConfig { diff --git a/src/bgp/bgp_config_ifmap.cc b/src/bgp/bgp_config_ifmap.cc index c32f59c2319..6caf652d52d 100644 --- a/src/bgp/bgp_config_ifmap.cc +++ b/src/bgp/bgp_config_ifmap.cc @@ -1592,6 +1592,7 @@ static void BuildPolicyTerm(autogen::PolicyTerm cfg_term, term->action.update.community_set.push_back(community); } term->action.update.local_pref = cfg_term.then.update.local_pref; + term->action.update.med = cfg_term.then.update.med; term->action.action = RoutingPolicyActionConfig::NEXT_TERM; if (strcmp(cfg_term.then.action.c_str(), "reject") == 0) { term->action.action = RoutingPolicyActionConfig::REJECT; diff --git a/src/bgp/routing-policy/routing_policy.cc b/src/bgp/routing-policy/routing_policy.cc index 4b2d09c1e9f..8ff5f8850f2 100644 --- a/src/bgp/routing-policy/routing_policy.cc +++ b/src/bgp/routing-policy/routing_policy.cc @@ -423,6 +423,12 @@ RoutingPolicy::PolicyTermPtr RoutingPolicy::BuildTerm(const RoutingPolicyTerm &c actions.push_back(local_pref); } + if (cfg_term.action.update.med) { + UpdateMed *med = + new UpdateMed(cfg_term.action.update.med); + actions.push_back(med); + } + PolicyTermPtr ret_term; if (!actions.empty() || !matches.empty()) { ret_term = PolicyTermPtr(new PolicyTerm()); diff --git a/src/bgp/routing-policy/routing_policy_action.cc b/src/bgp/routing-policy/routing_policy_action.cc index ce3b123b5ac..3f36bdd0d95 100644 --- a/src/bgp/routing-policy/routing_policy_action.cc +++ b/src/bgp/routing-policy/routing_policy_action.cc @@ -99,3 +99,23 @@ bool UpdateLocalPref::IsEqual(const RoutingPolicyAction &local_pref) const { static_cast(local_pref); return (local_pref_ == in_lp.local_pref_); } + +UpdateMed::UpdateMed(uint32_t med) + : med_(med) { +} + +void UpdateMed::operator()(BgpAttr *attr) const { + attr->set_med(med_); +} + +string UpdateMed::ToString() const { + ostringstream oss; + oss << "med " << med_; + return oss.str(); +} + +bool UpdateMed::IsEqual(const RoutingPolicyAction &med) const { + const UpdateMed in_med = + static_cast(med); + return (med_ == in_med.med_); +} diff --git a/src/bgp/routing-policy/routing_policy_action.h b/src/bgp/routing-policy/routing_policy_action.h index a354388b1c2..35f0939606f 100644 --- a/src/bgp/routing-policy/routing_policy_action.h +++ b/src/bgp/routing-policy/routing_policy_action.h @@ -105,4 +105,16 @@ class UpdateLocalPref : public RoutingPolicyUpdateAction { private: uint32_t local_pref_; }; + +class UpdateMed : public RoutingPolicyUpdateAction { +public: + UpdateMed(uint32_t med); + virtual ~UpdateMed() {} + virtual void operator()(BgpAttr *out_attr) const; + std::string ToString() const; + virtual bool IsEqual(const RoutingPolicyAction &med) const; +private: + uint32_t med_; +}; + #endif // SRC_BGP_ROUTING_POLICY_ROUTING_POLICY_ACTION_H_ diff --git a/src/bgp/test/routing_policy_test.cc b/src/bgp/test/routing_policy_test.cc index a75680f2d85..2db3dbde486 100644 --- a/src/bgp/test/routing_policy_test.cc +++ b/src/bgp/test/routing_policy_test.cc @@ -390,6 +390,36 @@ TEST_F(RoutingPolicyTest, PolicyMultiplePrefixMatchUpdateLocalPref) { } +TEST_F(RoutingPolicyTest, PolicyNoMatchUpdateMed) { + string content = + FileRead("controller/src/bgp/testdata/routing_policy_1b.xml"); + EXPECT_TRUE(parser_.Parse(content)); + task_util::WaitForIdle(); + + boost::system::error_code ec; + peers_.push_back( + new BgpPeerMock(Ip4Address::from_string("192.168.0.1", ec))); + + AddRoute(peers_[0], "test.inet.0", + "10.0.1.1/32", 100); + task_util::WaitForIdle(); + + VERIFY_EQ(1, RouteCount("test.inet.0")); + BgpRoute *rt = + RouteLookup("test.inet.0", "10.0.1.1/32"); + ASSERT_TRUE(rt != NULL); + VERIFY_EQ(peers_[0], rt->BestPath()->GetPeer()); + const BgpAttr *attr = rt->BestPath()->GetAttr(); + const BgpAttr *orig_attr = rt->BestPath()->GetOriginalAttr(); + uint32_t original_med = orig_attr->med(); + uint32_t policy_med = attr->med(); + ASSERT_TRUE(policy_med == 1234); + ASSERT_TRUE(original_med == 0); + + DeleteRoute(peers_[0], "test.inet.0", "10.0.1.1/32"); +} + + TEST_F(RoutingPolicyTest, PolicyCommunityMatchReject) { string content = FileRead("controller/src/bgp/testdata/routing_policy_0.xml"); diff --git a/src/bgp/testdata/routing_policy_1b.xml b/src/bgp/testdata/routing_policy_1b.xml new file mode 100644 index 00000000000..b4c530d860b --- /dev/null +++ b/src/bgp/testdata/routing_policy_1b.xml @@ -0,0 +1,18 @@ + + + + + + + 1234 + + + + + + + 1.0 + + target:1:103 + + diff --git a/src/schema/routing_policy.xsd b/src/schema/routing_policy.xsd index d4f3bca7022..1cc0570c538 100644 --- a/src/schema/routing_policy.xsd +++ b/src/schema/routing_policy.xsd @@ -35,6 +35,7 @@ +