Skip to content

Commit

Permalink
Support setting med in routing policy action
Browse files Browse the repository at this point in the history
Add support for updating the MED in routing policy action.
Test case to validate it

Change-Id: I23ac0570673329a571c48606e3fc80cdf057081a
Related-bug: #1500698
  • Loading branch information
bailkeri committed Feb 1, 2016
1 parent 76f64fb commit 56295b1
Show file tree
Hide file tree
Showing 9 changed files with 92 additions and 0 deletions.
3 changes: 3 additions & 0 deletions src/bgp/bgp_config.cc
Expand Up @@ -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;
Expand Down
1 change: 1 addition & 0 deletions src/bgp/bgp_config.h
Expand Up @@ -317,6 +317,7 @@ struct ActionUpdate {
CommunityList community_add;
CommunityList community_remove;
uint32_t local_pref;
uint32_t med;
};

struct RoutingPolicyActionConfig {
Expand Down
1 change: 1 addition & 0 deletions src/bgp/bgp_config_ifmap.cc
Expand Up @@ -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;
Expand Down
6 changes: 6 additions & 0 deletions src/bgp/routing-policy/routing_policy.cc
Expand Up @@ -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());
Expand Down
20 changes: 20 additions & 0 deletions src/bgp/routing-policy/routing_policy_action.cc
Expand Up @@ -99,3 +99,23 @@ bool UpdateLocalPref::IsEqual(const RoutingPolicyAction &local_pref) const {
static_cast<const UpdateLocalPref&>(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<const UpdateMed&>(med);
return (med_ == in_med.med_);
}
12 changes: 12 additions & 0 deletions src/bgp/routing-policy/routing_policy_action.h
Expand Up @@ -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_
30 changes: 30 additions & 0 deletions src/bgp/test/routing_policy_test.cc
Expand Up @@ -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<InetDefinition>(peers_[0], "test.inet.0",
"10.0.1.1/32", 100);
task_util::WaitForIdle();

VERIFY_EQ(1, RouteCount("test.inet.0"));
BgpRoute *rt =
RouteLookup<InetDefinition>("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<InetDefinition>(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");
Expand Down
18 changes: 18 additions & 0 deletions src/bgp/testdata/routing_policy_1b.xml
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<config>
<routing-policy name='basic'>
<term>
<then>
<update>
<med>1234</med>
</update>
</then>
</term>
</routing-policy>
<routing-instance name="test">
<routing-policy to="basic">
<sequence>1.0</sequence>
</routing-policy>
<vrf-target>target:1:103</vrf-target>
</routing-instance>
</config>
1 change: 1 addition & 0 deletions src/schema/routing_policy.xsd
Expand Up @@ -35,6 +35,7 @@
<xsd:complexType name="ActionUpdate">
<xsd:element name="community" type="ActionCommunity"/>
<xsd:element name="local-pref" type="xsd:integer"/>
<xsd:element name="med" type="xsd:integer"/>
</xsd:complexType>

<xsd:complexType name='PolicyAction'>
Expand Down

0 comments on commit 56295b1

Please sign in to comment.