[Xorp-users] Redistributing the system kernel route table into OSPF

Pavlin Radoslavov pavlin@icir.org
Tue, 11 Apr 2006 10:35:47 -0700


> I am a new user to XORP and I am attempting to redistribute the system
> kernel route table into XORP OSPF.  I see redistribution support for
> connected and static routes, but not for the kernel route table, as is
> available in Quagga.  In my case, the system kernel route table is being
> written by another routing protocol (Optimized Link State Routing) into
> which XORP has no visibility.  The "connected" and "static" features are not
> sufficient to satisfy my objectives.

You won't be able to do this out-of-the-box, but there is a
semi-hackish way around it. The basic idea is to use the fib2mrib
module in XORP.
That module typically is used to snoop the unicast routes from the
kernel so they can be used for multicast purpose (the Reverse Path
Forwarding check in PIM-SM). In your case you will redistribute them
to OSPF.

1. Get the latest XORP code from the anonymous CVS, and make sure
   that file xrl/targets/fib2mrib_base.hh is ref. 1.12 (at least).
   The instructions for the anonymous CVS access are available from
   http://www.xorp.org/cvs.html

2. Apply the patch at the end of this email to the checked-out code.
   Basically, this patch adds the necessary hooks to the
   etc/templates/policy.tp and etc/templats/fib2mrib.tp so fib2mrib
   can be used as part of the policy framework.
   Also, it adds a hack to ospf/xrl_target.cc so OSPF will accept
   the routes that would come from fib2mrib. If you want to export
   the fib2mrib routes to some other protocol (BGP or RIP), then you
   may have to apply a similar hack to the particular protocol.

3. You can export the fib2mrib routes by using the following in your
   XORP configuration:

policy {
    policy-statement export_fib2mrib {
        term export {
            from {
                protocol: "fib2mrib"
            }
        }
    }
}

protocols {
    ospf4 {
        export: "export_fib2mrib"
	....
    }
}

protocols {
    fib2mrib {
        disable: false
    }
}

FYI, I tried the above mechanism, and it appears to work for me, but
please let me know if you run into some issues.

Pavlin

Index: etc/templates/fib2mrib.tp
===================================================================
RCS file: /usr/local/share/doc/apache/cvs/xorp/etc/templates/fib2mrib.tp,v
retrieving revision 1.10
diff -u -p -r1.10 fib2mrib.tp
--- etc/templates/fib2mrib.tp	22 Feb 2006 02:26:10 -0000	1.10
+++ etc/templates/fib2mrib.tp	11 Apr 2006 17:10:58 -0000
@@ -8,11 +8,22 @@ protocols {
     }
 }
 
+policy {
+    policy-statement @: txt {
+	term @: txt {
+	    from {
+		metric: u32range;
+	    }
+	}
+    }
+}
+
 protocols {
     fib2mrib {
 	%help:		short		"Configure the FIB2MRIB module";
 	%modinfo:	provides	fib2mrib;
 	%modinfo:	depends		rib;
+	%modinfo:	depends		policy;
 	%modinfo:	path		"fib2mrib/xorp_fib2mrib";
 	%modinfo:	default_targetname "fib2mrib";
 	%modinfo:	status_method	xrl "$(fib2mrib.targetname)/common/0.1/get_status->status:u32&reason:txt";
@@ -43,3 +54,21 @@ protocols {
 	}
     }
 }
+
+policy {
+    %create: xrl "$(policy.targetname)/policy/0.1/set_proto_target?protocol:txt=fib2mrib&target:txt=fib2mrib";
+    %create: xrl "$(policy.targetname)/policy/0.1/add_varmap?protocol:txt=fib2mrib&variable:txt=network4&type:txt=ipv4net&access:txt=r&id:u32=10";
+    %create: xrl "$(policy.targetname)/policy/0.1/add_varmap?protocol:txt=fib2mrib&variable:txt=metric&type:txt=u32&access:txt=rw&id:u32=14";
+
+    policy-statement @: txt {
+	term @: txt {
+	    from {
+		metric {
+		    %help: short "Set the metric value";
+		    %set: xrl "$(policy.targetname)/policy/0.1/update_term_block?policy:txt=$(policy-statement.@)&term:txt=$(term.@)&block:u32=0&order:txt=$(#)&statement:txt=metric $(<>) $(@);";
+		    %delete: xrl "$(policy.targetname)/policy/0.1/update_term_block?policy:txt=$(policy-statement.@)&term:txt=$(term.@)&block:u32=0&order:txt=$(#)&statement:txt=";
+		}
+	    }
+	}
+    }
+}
Index: etc/templates/policy.tp
===================================================================
RCS file: /usr/local/share/doc/apache/cvs/xorp/etc/templates/policy.tp,v
retrieving revision 1.20
diff -u -p -r1.20 policy.tp
--- etc/templates/policy.tp	3 Apr 2006 23:35:14 -0000	1.20
+++ etc/templates/policy.tp	11 Apr 2006 17:10:58 -0000
@@ -73,6 +73,7 @@ policy {
 		    %help: short "Protocol from which route was learned";
 		    %allow: $(@) "bgp" %help: "BGP routes";
 		    %allow: $(@) "connected" %help: "Directly connected sub-network routes";
+		    %allow: $(@) "fib2mrib" %help: "FIB2MRIB routes";
 		    %allow: $(@) "ospf4" %help: "OSPF IPv4 routes";
 		    %allow: $(@) "rip" %help: "RIP routes";
 		    %allow: $(@) "ripng" %help: "RIPng routes";
Index: ospf/xrl_target.cc
===================================================================
RCS file: /usr/local/share/doc/apache/cvs/xorp/ospf/xrl_target.cc,v
retrieving revision 1.36
diff -u -p -r1.36 xrl_target.cc
--- ospf/xrl_target.cc	28 Mar 2006 03:06:55 -0000	1.36
+++ ospf/xrl_target.cc	11 Apr 2006 17:10:59 -0000
@@ -278,8 +278,10 @@ XrlOspfV2Target::policy_redist4_0_1_add_
 	      cstring(network), cstring(nexthop), pb(unicast), pb(multicast),
 	      metric);
 
+#if 0
     if (!unicast)
 	return XrlCmdError::OKAY();
+#endif
 
     if (!_ospf.originate_route(network, nexthop, metric, policytags)) {
 	return XrlCmdError::COMMAND_FAILED("Network: " + network.str());
@@ -296,8 +298,10 @@ XrlOspfV2Target::policy_redist4_0_1_dele
     debug_msg("Net: %s Unicast: %s Multicast %s\n",
 	      cstring(network), pb(unicast), pb(multicast));
 
+#if 0
     if (!unicast)
 	return XrlCmdError::OKAY();
+#endif
 
     if (!_ospf.withdraw_route(network)) {
 	return XrlCmdError::COMMAND_FAILED("Network: " + network.str());