Skip to content

Commit

Permalink
static/mcast: Support per-route distance configurable.
Browse files Browse the repository at this point in the history
Default distance is 0 for static, 1 for PIM.  Static supports
over-rides, but PIM does not at this time.

Signed-off-by: Ben Greear <greearb@candelatech.com>
  • Loading branch information
greearb committed Jun 20, 2012
1 parent 6566779 commit 8462aa7
Show file tree
Hide file tree
Showing 12 changed files with 99 additions and 61 deletions.
13 changes: 10 additions & 3 deletions xorp/etc/templates/static_routes.tp
Expand Up @@ -29,6 +29,7 @@ protocols {
input_if: txt;
input_ip: ipv4;
output_ifs: txt;
distance: u32 = 0;
}

route4 @: ipv4net { /* %deprecated */
Expand Down Expand Up @@ -293,9 +294,9 @@ protocols {
%help: short "Configure a static Multicast route";
%mandatory: $(@.input_if), $(@.input_ip), $(@.output_ifs);

%create: xrl "$(static.targetname)/static_routes/0.1/add_mcast_route4?mcast_addr:ipv4=$(@)&input_if:txt=$(@.input_if)&input_ip:ipv4=$(@.input_ip)&output_ifs:txt=$(@.output_ifs)";
%update: xrl "$(static.targetname)/static_routes/0.1/replace_mcast_route4?mcast_addr:ipv4=$(@)&input_if:txt=$(@.input_if)&input_ip:ipv4=$(@.input_ip)&output_ifs:txt=$(@.output_ifs)";
%delete: xrl "$(static.targetname)/static_routes/0.1/delete_mcast_route4?mcast_addr:ipv4=$(@)&input_if:txt=$(@.input_if)&input_ip:ipv4=$(@.input_ip)&output_ifs:txt=$(@.output_ifs)";
%create: xrl "$(static.targetname)/static_routes/0.1/add_mcast_route4?mcast_addr:ipv4=$(@)&input_if:txt=$(@.input_if)&input_ip:ipv4=$(@.input_ip)&output_ifs:txt=$(@.output_ifs)&distance:u32=$(@.distance)";
%update: xrl "$(static.targetname)/static_routes/0.1/replace_mcast_route4?mcast_addr:ipv4=$(@)&input_if:txt=$(@.input_if)&input_ip:ipv4=$(@.input_ip)&output_ifs:txt=$(@.output_ifs))&distance:u32=$(@.distance)";
%delete: xrl "$(static.targetname)/static_routes/0.1/delete_mcast_route4?mcast_addr:ipv4=$(@)&input_ip:ipv4=$(@.input_ip)";

input_if {
%help: short "Configure the input interface";
Expand All @@ -311,6 +312,12 @@ protocols {
%help: short "Configure the input output interface(s)";
%set:;
}

distance {
%help: short "Configure the routing distance. Lower value wins";
%allow-range: $(@) "0" "7" %help: "The routing distance";
%set:;
}
}


Expand Down
34 changes: 24 additions & 10 deletions xorp/fea/mfea_node.cc
Expand Up @@ -1844,16 +1844,23 @@ int MfeaNode::add_mfc_str(const string& module_instance_name,
const IPvX& group,
const string& iif_name,
const string& oif_names,
uint32_t distance,
string& error_msg, bool check_stored_routes) {
int rv;
uint32_t iif_vif_index;

XLOG_INFO("MFEA add_mfc_str, module: %s source: %s group: %s check-stored-routes: %i",
XLOG_INFO("MFEA add_mfc_str, module: %s source: %s group: %s check-stored-routes: %i distance: %u",
module_instance_name.c_str(), source.str().c_str(),
group.str().c_str(), (int)(check_stored_routes));
group.str().c_str(), (int)(check_stored_routes), distance);

if (distance >= MAX_MFEA_DISTANCE) {
error_msg += c_format("distance is above maximimum: %u >= %u\n",
distance, MAX_MFEA_DISTANCE);
return XORP_ERROR;
}

if (check_stored_routes) {
MfeaRouteStorage mrs(0, module_instance_name, source,
MfeaRouteStorage mrs(distance, module_instance_name, source,
group, iif_name, oif_names);
routes[mrs.distance][mrs.getHash()] = mrs;

Expand Down Expand Up @@ -1921,7 +1928,7 @@ int MfeaNode::add_mfc_str(const string& module_instance_name,
rv = add_mfc(module_instance_name, source, group,
iif_vif_index, oiflist,
oiflist_disable_wrongvif,
MAX_VIFS, rp_addr, error_msg, false);
MAX_VIFS, rp_addr, distance, error_msg, false);
if (rv != XORP_OK) {
error_msg = "call to add_mfc failed";
}
Expand Down Expand Up @@ -1952,15 +1959,22 @@ MfeaNode::add_mfc(const string& module_instance_name,
uint32_t iif_vif_index, const Mifset& oiflist,
const Mifset& oiflist_disable_wrongvif,
uint32_t max_vifs_oiflist,
const IPvX& rp_addr, string& error_msg,
const IPvX& rp_addr, uint32_t distance,
string& error_msg,
bool check_stored_routes)
{
uint8_t oifs_ttl[MAX_VIFS];
uint8_t oifs_flags[MAX_VIFS];

XLOG_INFO("MFEA add_mfc, module: %s source: %s group: %s check-stored-routes: %i",
XLOG_INFO("MFEA add_mfc, module: %s source: %s group: %s check-stored-routes: %i distance: %u",
module_instance_name.c_str(), source.str().c_str(),
group.str().c_str(), (int)(check_stored_routes));
group.str().c_str(), (int)(check_stored_routes), distance);

if (distance >= MAX_MFEA_DISTANCE) {
error_msg += c_format("distance is above maximimum: %u >= %u\n",
distance, MAX_MFEA_DISTANCE);
return XORP_ERROR;
}

if (max_vifs_oiflist > MAX_VIFS) {
error_msg += c_format("max-vifs-oiflist: %u > MAX_VIFS: %u\n",
Expand All @@ -1981,7 +1995,7 @@ MfeaNode::add_mfc(const string& module_instance_name,
}

if (check_stored_routes) {
MfeaRouteStorage mrs(1, module_instance_name, source,
MfeaRouteStorage mrs(distance, module_instance_name, source,
group, iif_vif_index, oiflist,
oiflist_disable_wrongvif, max_vifs_oiflist,
rp_addr);
Expand Down Expand Up @@ -2145,13 +2159,13 @@ MfeaNode::delete_mfc(const string& module_instance_name,
iter->second.iif_vif_index,
iter->second.oiflist, iter->second.oiflist_disable_wrongvif,
iter->second.max_vifs_oiflist, iter->second.rp_addr,
error_msg, false);
iter->second.distance, error_msg, false);
}
else {
rv = add_mfc_str(iter->second.module_instance_name,
iter->second.source, iter->second.group,
iter->second.iif_name, iter->second.oif_names,
error_msg, false);
iter->second.distance, error_msg, false);
}
break;
}
Expand Down
4 changes: 3 additions & 1 deletion xorp/fea/mfea_node.hh
Expand Up @@ -621,14 +621,16 @@ public:
uint32_t iif_vif_index, const Mifset& oiflist,
const Mifset& oiflist_disable_wrongvif,
uint32_t max_vifs_oiflist,
const IPvX& rp_addr, string& error_msg,
const IPvX& rp_addr, uint32_t distance,
string& error_msg,
bool check_stored_routes);

int add_mfc_str(const string& module_instance_name,
const IPvX& source,
const IPvX& group,
const string& iif_name,
const string& oif_names,
uint32_t distance,
string& error_msg, bool check_stored_routes);

/**
Expand Down
15 changes: 9 additions & 6 deletions xorp/fea/xrl_mfea_node.cc
Expand Up @@ -895,7 +895,8 @@ XrlMfeaNode::mfea_0_1_add_mfc6(
const vector<uint8_t>& oiflist,
const vector<uint8_t>& oiflist_disable_wrongvif,
const uint32_t& max_vifs_oiflist,
const IPv6& rp_address)
const IPv6& rp_address,
const uint32_t& distance)
{
string error_msg;
Mifset mifset;
Expand Down Expand Up @@ -930,7 +931,7 @@ XrlMfeaNode::mfea_0_1_add_mfc6(
IPvX(source_address), IPvX(group_address),
iif_vif_index, mifset, mifset_disable_wrongvif,
max_vifs_oiflist,
IPvX(rp_address), error_msg, true)
IPvX(rp_address), distance, error_msg, true)
!= XORP_OK) {
error_msg += c_format("Cannot add MFC for "
"source %s and group %s "
Expand Down Expand Up @@ -1183,7 +1184,8 @@ XrlMfeaNode::mfea_0_1_add_mfc4(
const vector<uint8_t>& oiflist,
const vector<uint8_t>& oiflist_disable_wrongvif,
const uint32_t& max_vifs_oiflist,
const IPv4& rp_address)
const IPv4& rp_address,
const uint32_t& distance)
{
string error_msg;
Mifset mifset;
Expand Down Expand Up @@ -1218,7 +1220,7 @@ XrlMfeaNode::mfea_0_1_add_mfc4(
IPvX(source_address), IPvX(group_address),
iif_vif_index, mifset, mifset_disable_wrongvif,
max_vifs_oiflist,
IPvX(rp_address), error_msg, true)
IPvX(rp_address), distance, error_msg, true)
!= XORP_OK) {
error_msg += c_format("Cannot add MFC for "
"source %s and group %s "
Expand All @@ -1239,7 +1241,8 @@ XrlMfeaNode::mfea_0_1_add_mfc4_str(
const IPv4& source_address,
const IPv4& group_address,
const string& iif_ifname,
const string& oif_ifnames)
const string& oif_ifnames,
const uint32_t& distance)
{
string error_msg;

Expand All @@ -1260,7 +1263,7 @@ XrlMfeaNode::mfea_0_1_add_mfc4_str(

if (MfeaNode::add_mfc_str(xrl_sender_name,
IPvX(source_address), IPvX(group_address),
iif_ifname, oif_ifnames, error_msg, true) != XORP_OK) {
iif_ifname, oif_ifnames, distance, error_msg, true) != XORP_OK) {
return XrlCmdError::COMMAND_FAILED(error_msg);
}

Expand Down
17 changes: 10 additions & 7 deletions xorp/fea/xrl_mfea_node.hh
Expand Up @@ -269,7 +269,8 @@ protected:
const vector<uint8_t>& oiflist,
const vector<uint8_t>& oiflist_disable_wrongvif,
const uint32_t& max_vifs_oiflist,
const IPv6& rp_address);
const IPv6& rp_address,
const uint32_t& distance);

XrlCmdError mfea_0_1_delete_mfc6(
// Input values,
Expand Down Expand Up @@ -359,21 +360,23 @@ protected:
const IPv4& source_address,
const IPv4& group_address,
const uint32_t& iif_vif_index,
const vector<uint8_t>& oiflist,
const vector<uint8_t>& oiflist_disable_wrongvif,
const uint32_t& max_vifs_oiflist,
const IPv4& rp_address);
const vector<uint8_t>& oiflist,
const vector<uint8_t>& oiflist_disable_wrongvif,
const uint32_t& max_vifs_oiflist,
const IPv4& rp_address,
const uint32_t& distance);

XrlCmdError mfea_0_1_add_mfc4_str(
// Input values,
const string& xrl_sender_name,
const IPv4& source_address,
const IPv4& group_address,
const string& iif_ifname,
const string& oif_ifnames);
const string& oif_ifnames,
const uint32_t& distance);

XrlCmdError mfea_0_1_delete_mfc4(
// Input values,
// Input values,
const string& xrl_sender_name,
const IPv4& source_address,
const IPv4& group_address);
Expand Down
2 changes: 2 additions & 0 deletions xorp/pim/xrl_pim_node.cc
Expand Up @@ -1656,6 +1656,7 @@ XrlPimNode::send_add_delete_mfc()
oiflist_disable_wrongvif_vector,
max_vifs_oiflist,
rp_addr.get_ipv4(),
1, /* default distance is 1 for PIM */
callback(this, &XrlPimNode::mfea_client_send_add_delete_mfc_cb));
if (success)
return;
Expand All @@ -1673,6 +1674,7 @@ XrlPimNode::send_add_delete_mfc()
oiflist_disable_wrongvif_vector,
max_vifs_oiflist,
rp_addr.get_ipv6(),
1, /* default distance is 1 for PIM */
callback(this, &XrlPimNode::mfea_client_send_add_delete_mfc_cb));
if (success)
return;
Expand Down
13 changes: 6 additions & 7 deletions xorp/static_routes/static_routes_node.cc
Expand Up @@ -788,10 +788,10 @@ StaticRoutesNode::delete_route6(bool unicast, bool multicast,

int StaticRoutesNode::add_mcast_route4(const IPv4& mcast_addr, const string& input_if,
const IPv4& input_ip, const string& output_ifs,
string& error_msg) {
uint32_t distance, string& error_msg) {
map<IPvX, McastRoute>::const_iterator iter = _mcast_routes.find(mcast_addr);
if (iter == _mcast_routes.end()) {
McastRoute mr(mcast_addr, input_if, input_ip, output_ifs);
McastRoute mr(mcast_addr, input_if, input_ip, output_ifs, distance);
_mcast_routes[mcast_addr] = mr;
McastRoute copy_route = mr;
copy_route.set_add_route();
Expand All @@ -806,10 +806,10 @@ int StaticRoutesNode::add_mcast_route4(const IPv4& mcast_addr, const string& inp

int StaticRoutesNode::replace_mcast_route4(const IPv4& mcast_addr, const string& input_if,
const IPv4& input_ip, const string& output_ifs,
string& error_msg) {
uint32_t distance, string& error_msg) {
UNUSED(error_msg);

McastRoute mr(mcast_addr, input_if, input_ip, output_ifs);
McastRoute mr(mcast_addr, input_if, input_ip, output_ifs, distance);
map<IPvX, McastRoute>::const_iterator iter = _mcast_routes.find(mcast_addr);
if (iter == _mcast_routes.end()) {
if (iter->second == mr) {
Expand All @@ -828,16 +828,15 @@ int StaticRoutesNode::replace_mcast_route4(const IPv4& mcast_addr, const string&
}


int StaticRoutesNode::delete_mcast_route4(const IPv4& mcast_addr, const string& input_if,
const IPv4& input_ip, const string& output_ifs,
int StaticRoutesNode::delete_mcast_route4(const IPv4& mcast_addr, const IPv4& input_ip,
string& error_msg) {
UNUSED(error_msg);

map<IPvX, McastRoute>::const_iterator iter = _mcast_routes.find(mcast_addr);
if (iter != _mcast_routes.end()) {
_mcast_routes.erase(mcast_addr);

McastRoute mr(mcast_addr, input_if, input_ip, output_ifs);
McastRoute mr(mcast_addr, input_ip);
mr.set_delete_route();
inform_mfea(mr);
}
Expand Down
19 changes: 12 additions & 7 deletions xorp/static_routes/static_routes_node.hh
Expand Up @@ -379,28 +379,34 @@ protected:
string _ifname; // assume vifname == ifname
IPvX _input_ip;
string _output_ifs; // assume vifname == ifname
uint32_t _distance;

public:
McastRoute() { };
McastRoute(const IPvX& addr, const string& ifname, const IPvX& input_ip,
const string& output_ifs) :
const string& output_ifs, uint32_t distance) :
_mcast_addr(addr), _ifname(ifname), _input_ip(input_ip),
_output_ifs(output_ifs) { }
_output_ifs(output_ifs), _distance(distance) { }

McastRoute(const IPvX& addr, const IPvX& input_ip) :
_mcast_addr(addr), _input_ip(input_ip) { }

bool operator==(const McastRoute& other) const {
if (this == &other)
return true;
return (_mcast_addr == other._mcast_addr &&
_ifname == other._ifname &&
_input_ip == other._input_ip &&
_output_ifs == other._output_ifs);
_output_ifs == other._output_ifs &&
_distance == other._distance);
}

const IPvX& mcast_addr() const { return _mcast_addr; }
const string& ifname() const { return _ifname; }
const string& vifname() const { return ifname(); }
const IPvX& input_ip() const { return _input_ip; }
const string& output_ifs() const { return _output_ifs; }
const uint32_t& distance() const { return _distance; }
};

/**
Expand Down Expand Up @@ -635,14 +641,13 @@ public:

int add_mcast_route4(const IPv4& mcast_addr, const string& input_if,
const IPv4& input_ip, const string& output_ifs,
string& error_msg);
uint32_t distance, string& error_msg);

int replace_mcast_route4(const IPv4& mcast_addr, const string& input_if,
const IPv4& input_ip, const string& output_ifs,
string& error_msg);
uint32_t distance, string& error_msg);

int delete_mcast_route4(const IPv4& mcast_addr, const string& input_if,
const IPv4& input_ip, const string& output_ifs,
int delete_mcast_route4(const IPv4& mcast_addr, const IPv4& input_ip,
string& error_msg);


Expand Down

0 comments on commit 8462aa7

Please sign in to comment.