[Xorp-hackers] [PATCH] Admin distance set from config file

Jean Michel MacKay mackay.jm at gmail.com
Mon Jan 14 02:07:20 PST 2013


From: Jean Michel MacKay <jnmackay at rockwellcollins.com>

---
 xorp/etc/templates/bgp.tp           |   14 ++++++++++++++
 xorp/etc/templates/fib2mrib.tp      |    7 +++++++
 xorp/etc/templates/ospfv2.tp        |    7 +++++++
 xorp/etc/templates/ospfv3.tp        |    7 +++++++
 xorp/etc/templates/rip.tp           |    7 +++++++
 xorp/etc/templates/static_routes.tp |    7 +++++++
 xorp/rib/rib.cc                     |    8 +++++---
 xorp/rib/rt_tab_origin.hh           |    5 +++++
 8 files changed, 59 insertions(+), 3 deletions(-)

diff --git a/xorp/etc/templates/bgp.tp b/xorp/etc/templates/bgp.tp
index 6e1ce8a..c534068 100644
--- a/xorp/etc/templates/bgp.tp
+++ b/xorp/etc/templates/bgp.tp
@@ -6,6 +6,8 @@ protocols {
 	bgp-id: ipv4;
 	local-as: txt;
 	enable-4byte-as-numbers: bool = false;
+	internal-distance: u32;
+	external-distance: u32;
 
 	route-reflector {
 	    cluster-id: ipv4;
@@ -166,6 +168,18 @@ protocols {
 	    %set:;
 	}
 
+	internal-distance {
+            %help:      short "Administrative Distance for IBGP";
+            %allow-range: $(@) "0" "255" %help: "Administrative Distance for IBGP";
+            %set:       xrl "rib/rib/0.1/set_protocol_admin_distance?protocol:txt=ibgp&ipv4:bool=true&ipv6:bool=false&unicast:bool=true&multicast:bool=false&admin_distance:u32=$(@)";
+        }
+
+	external-distance {
+            %help:      short "Administrative Distance for EBGP";
+            %allow-range: $(@) "0" "255" %help: "Administrative Distance for EBGP";
+            %set:       xrl "rib/rib/0.1/set_protocol_admin_distance?protocol:txt=ebgp&ipv4:bool=true&ipv6:bool=false&unicast:bool=true&multicast:bool=false&admin_distance:u32=$(@)";
+        }
+
     %create: xrl "$(policy.targetname)/policy/0.1/add_varmap?protocol:txt=bgp&variable:txt=network4&type:txt=ipv4net&access:txt=r&id:u32=10";
     %create: xrl "$(policy.targetname)/policy/0.1/add_varmap?protocol:txt=bgp&variable:txt=network6&type:txt=ipv6net&access:txt=r&id:u32=12";
     %create: xrl "$(policy.targetname)/policy/0.1/add_varmap?protocol:txt=bgp&variable:txt=nexthop4&type:txt=ipv4nexthop&access:txt=rw&id:u32=11";
diff --git a/xorp/etc/templates/fib2mrib.tp b/xorp/etc/templates/fib2mrib.tp
index f590349..55af3f4 100644
--- a/xorp/etc/templates/fib2mrib.tp
+++ b/xorp/etc/templates/fib2mrib.tp
@@ -5,6 +5,7 @@ protocols {
 	targetname:	txt = "fib2mrib";
 	disable:	toggle = false;
 	enabled:	bool;		/* %deprecated */
+	distance: 	u32;
     }
 }
 
@@ -54,6 +55,12 @@ protocols {
 	    %create:;
 	    %set:	xrl "$(fib2mrib.targetname)/fib2mrib/0.1/enable_fib2mrib?enable:bool=$(@)";
 	}
+
+	distance {
+            %help:      short "Administrative Distance for FIB2MRIB";
+            %allow-range: $(@) "0" "255" %help: "Administrative Distance for FIB2MRIB";
+            %set:       xrl "rib/rib/0.1/set_protocol_admin_distance?protocol:txt=fib2mrib&ipv4:bool=true&ipv6:bool=false&unicast:bool=true&multicast:bool=false&admin_distance:u32=$(@)";
+        }
     }
 }
 
diff --git a/xorp/etc/templates/ospfv2.tp b/xorp/etc/templates/ospfv2.tp
index 44dbbb9..9d25768 100644
--- a/xorp/etc/templates/ospfv2.tp
+++ b/xorp/etc/templates/ospfv2.tp
@@ -6,6 +6,7 @@ protocols {
 	router-id: ipv4;
 	rfc1583-compatibility: bool = false;
 	ip-router-alert: bool = false;
+	distance: u32;
 
 	traceoptions {
 	    flag {
@@ -163,6 +164,12 @@ transmitted packets";
 	    %delete: xrl "$(ospf4.targetname)/ospfv2/0.1/set_ip_router_alert?ip_router_alert:bool=$(DEFAULT)";
 	}
 
+	distance {
+            %help:      short "Administrative Distance for OSPF";
+            %allow-range: $(@) "0" "255" %help: "Administrative Distance for OSPF";
+            %set:       xrl "rib/rib/0.1/set_protocol_admin_distance?protocol:txt=ospf&ipv4:bool=true&ipv6:bool=false&unicast:bool=true&multicast:bool=false&admin_distance:u32=$(@)";
+        }
+
 	area @: ipv4 {
 	    %help: short "The OSPF area to which the attached network belongs";
 
diff --git a/xorp/etc/templates/ospfv3.tp b/xorp/etc/templates/ospfv3.tp
index fec27fb..eb2f729 100644
--- a/xorp/etc/templates/ospfv3.tp
+++ b/xorp/etc/templates/ospfv3.tp
@@ -5,6 +5,7 @@ protocols {
 	targetname: txt = "ospfv3";
 	router-id: ipv4;
 	ip-router-alert: bool = false;
+	distance: u32;
 
 	traceoptions {
 	    flag {
@@ -130,6 +131,12 @@ transmitted packets";
 	    %delete: xrl "$(ospf6. at .targetname)/ospfv3/0.1/set_ip_router_alert?ip_router_alert:bool=$(DEFAULT)";
 	}
 
+	distance {
+            %help:      short "Administrative Distance for OSPF";
+            %allow-range: $(@) "0" "255" %help: "Administrative Distance for OSPF";
+            %set:       xrl "rib/rib/0.1/set_protocol_admin_distance?protocol:txt=ospf&ipv4:bool=true&ipv6:bool=false&unicast:bool=true&multicast:bool=false&admin_distance:u32=$(@)";
+        }
+
 	area @: ipv4 {
 	    %help: short "The OSPF area to which the attached network belongs";
 
diff --git a/xorp/etc/templates/rip.tp b/xorp/etc/templates/rip.tp
index aff2763..d7123ae 100644
--- a/xorp/etc/templates/rip.tp
+++ b/xorp/etc/templates/rip.tp
@@ -7,6 +7,7 @@
 protocols {
     rip {
 	targetname: txt = "rip";
+	distance: u32;
 	traceoptions {
 	    flag {
 		all {
@@ -95,6 +96,12 @@ protocols {
 	    %set:;
 	}
 
+	distance {
+            %help:      short "Administrative Distance for RIP";
+	    %allow-range: $(@) "0" "255" %help: "Administrative Distance for RIP";
+            %set:       xrl "rib/rib/0.1/set_protocol_admin_distance?protocol:txt=rip&ipv4:bool=true&ipv6:bool=false&unicast:bool=true&multicast:bool=false&admin_distance:u32=$(@)";
+        }
+
 	traceoptions {
 	    %help:	short "Configure the tracing options";
 	    flag {
diff --git a/xorp/etc/templates/static_routes.tp b/xorp/etc/templates/static_routes.tp
index 9f69c54..593f2e8 100644
--- a/xorp/etc/templates/static_routes.tp
+++ b/xorp/etc/templates/static_routes.tp
@@ -4,6 +4,7 @@ protocols {
 	targetname:		txt = "static_routes";
 	disable:		toggle = false;
 	enabled:		bool;		/* %deprecated */
+	distance: 		u32;
 
 	route @: ipv4net {
 	    next-hop:		ipv4;
@@ -210,6 +211,12 @@ protocols {
 	    %set:	xrl "$(static.targetname)/static_routes/0.1/enable_static_routes?enable:bool=$(@)";
 	}
 
+	distance {
+            %help:      short "Administrative Distance for Static";
+            %allow-range: $(@) "0" "255" %help: "Administrative Distance for Static";
+            %set:       xrl "rib/rib/0.1/set_protocol_admin_distance?protocol:txt=static&ipv4:bool=true&ipv6:bool=false&unicast:bool=true&multicast:bool=false&admin_distance:u32=$(@)";
+        }
+
 	route @: ipv4net {
 	    %help:	short "Configure a static route";
 	    %mandatory:	$(@.next-hop);
diff --git a/xorp/rib/rib.cc b/xorp/rib/rib.cc
index 3137750..d07ff7f 100644
--- a/xorp/rib/rib.cc
+++ b/xorp/rib/rib.cc
@@ -222,11 +222,13 @@ RIB<A>::set_protocol_admin_distance(const string& protocol_name,
     map<string, uint32_t>::iterator mi = _admin_distances.find(protocol_name);
     if (mi != _admin_distances.end()) {
 	OriginTable<A>* ot = find_origin_table(protocol_name);
-	if (NULL != ot) {
-	    XLOG_ERROR("May not set an admin distance for protocol \"%s\", "
-		       "which has already instantiated an origin table.",
+	if (NULL != ot && ot->route_count() > 0) {    
+		XLOG_ERROR("May not set an admin distance for protocol \"%s\", "
+		       "which has already instantiated an origin table and contains routes.",
 		       protocol_name.c_str());
 	    return XORP_ERROR;
+        }else if (NULL != ot && ot->route_count() == 0) {
+            ot->change_admin_distance(admin_distance);
 	}
     }
     _admin_distances[protocol_name] = admin_distance;
diff --git a/xorp/rib/rt_tab_origin.hh b/xorp/rib/rt_tab_origin.hh
index 1899289..eb6df6b 100644
--- a/xorp/rib/rt_tab_origin.hh
+++ b/xorp/rib/rt_tab_origin.hh
@@ -145,6 +145,11 @@ public:
     RouteRange<A>* lookup_route_range(const A& addr) const;
 
     /**
+    * Changes the admin distance
+    **/
+    void change_admin_distance( uint32_t ad ){ _admin_distance = ad; }
+
+    /**
      * @return the default administrative distance for this OriginTable
      */
     uint32_t admin_distance() const	{ return _admin_distance; }
-- 
1.7.4.1



More information about the Xorp-hackers mailing list