Bug 229136 - net/frr: Implementing FRR VRFs in the startup script
Summary: net/frr: Implementing FRR VRFs in the startup script
Status: New
Alias: None
Product: Ports & Packages
Classification: Unclassified
Component: Individual Port(s) (show other bugs)
Version: Latest
Hardware: Any Any
: --- Affects Many People
Assignee: Olivier Cochard
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2018-06-19 07:24 UTC by Alexey
Modified: 2024-01-03 20:53 UTC (History)
3 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Alexey 2018-06-19 07:24:35 UTC
OSPF supports several instances and they work fine. But to run the second or more instances need to manually run ospfd with key -n 1.
For example:

run default instance:

#cat /etc/rc.conf |grep frr
frr_enable="YES"
frr_daemons="zebra ospfd"
#/usr/local/etc/rc.d/frr start

run ospd with instance 1:

/usr/local/sbin/ospfd -d -n 1

run ospd with instance 1:

/usr/local/sbin/ospfd -d -n 2222.

And so on.

This is well described in this commit:
https://github.com/CumulusNetworks/quagga/commit/7c8ff89e9346227f0e721f7686d4c4d58f9c9135
Comment 1 Alexey 2018-09-21 22:28:21 UTC
https://github.com/FRRouting/frr/commit/e6f1b8310336f669062f5d75f5d4ed03690687f0
On frr add documentation about OSPF instance
Comment 2 Olivier Cochard freebsd_committer freebsd_triage 2018-10-18 04:28:19 UTC
FRR's RC script is quiet complex with all the daemons to manage.
If you've got an idea to add multiple OSPF instances to this mess: your ideas are welcome!
Comment 3 Alexey 2020-04-15 13:45:11 UTC
(In reply to Olivier Cochard from comment #2)
Hello!
I thought for a long time how to organize this and recently through experiments I have achieved some results. My ideas lead to the likeness of VRF in FreeBSD, not only for ospfd, but and for other daimons (staticd, bgpd ..).

First thing we need to implement my idea is to add the line net.fibs=16 to the /boot/loader.conf file (or write this option in the kernel config and recompile the kernel).

The following action is to add to the start script add the option frr_fib="1,2,3, .. 15"

Next, in the start script, need while cycle that start all copies of daemons in your FIB using the set fib utility with the option -N 1 ... -N 15

In addition, we need to create a directory for the configurations of each FIB table:
/usr/local/etc/frr/1
/usr/local/etc/frr/...
/usr/local/etc/frr/15
/var/run/frr/1/
/var/run/frr/...
/var/run/frr/15/

To connect VRF, we need to add a key for vtysh -N and id FIB.

Information from man frr-zebra:

       -N, --pathspace pathspace
              Insert pathspace into all default paths, changing the defaults
              to:

              /etc/frr/pathspace/<daemon>.conf
              /var/run/frr/pathspace/<daemon>.pid
              /var/run/frr/pathspace/<daemon>.vty
              /var/run/frr/pathspace/zserv.api

              ´.´ and ´/´ characters will not be accepted in pathspace, but
              the empty string will be accepted.

              Note that this only changes the respective defaults, it has no
              effect on the respective path if the -f, -i, -z or –vty_socket
              options are used.

              The purpose of this option is to easily group all file system
              related bits together for running multiple fully-separate
              “logical routers” on a system, particularly with Linux network
              namespaces.  Groups of daemons running with distinct pathspace
              values will be completely unaware of each other and not interact
              in any way.

              This option does not do any system setup (like network
              namespaces.) This must be done by the user, for example by
              running:

              ip netns exec namespace <daemon> -N namespace

Below are the logs of my experiments:

[root@nas5 /home/pautina]# setfib 1 /usr/local/sbin/staticd -d -N 1
[root@nas5 /usr/local/etc]# ps -aux |grep frr
frr     1624    0,0  0,0 70336  8952  -  Is   23:50     0:00,01 /usr/local/sbin/zebra -d
frr     1728    0,0  0,0 97684  9320  -  Is   00:02     0:00,01 /usr/local/sbin/zebra -d -N 1
frr     1734    0,0  0,0 42192  7592  -  Is   00:03     0:00,00 /usr/local/sbin/staticd -d -N 1
root    1743    0,0  0,0 11308  2600  0  R+   00:05     0:00,00 grep frr
[root@nas5 /home/pautina]# vtysh -N 1

Hello, this is FRRouting (version 7.3).
Copyright 1996-2005 Kunihiro Ishiguro, et al.

nas1.istec.net.ua# show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
       F - PBR, f - OpenFabric,
       > - selected route, * - FIB route, q - queued route, r - rejected route

S>* 10.0.0.1/32 [1/0] unreachable (blackhole), 00:00:06
S>* 10.0.0.10/32 [1/0] unreachable (blackhole), 00:00:06
C>* 192.168.254.0/24 [0/1] is directly connected, igb0, 00:00:10
nas1.istec.net.ua# wr
Note: this version of vtysh never writes vtysh.conf
Building Configuration...
Configuration saved to /usr/local/etc/frr/1/zebra.conf
Configuration saved to /usr/local/etc/frr/1/staticd.conf
nas1.istec.net.ua#
[root@nas5 /home/pautina]# netstat -rn -F1
Routing tables (fib: 1)

Internet:
Destination        Gateway            Flags     Netif Expire
10.0.0.1/32        127.0.0.1          UG1B        lo0
10.0.0.10/32       127.0.0.1          UG1B        lo0
127.0.0.1          link#5             UH          lo0
192.168.254.0/24   00:25:90:62:e8:bc  US         igb0
[root@nas5 /home/pautina]# netstat -rn -F0
Routing tables

Internet:
Destination        Gateway            Flags     Netif Expire
default            192.168.254.1      UGS        igb0
127.0.0.1          link#5             UH          lo0
192.168.254.0/24   link#1             U          igb0
192.168.254.76     link#1             UHS         lo0
[root@nas5 /home/pautina]#

If you are interested in my idea - please help to implement this functionality through rc.d script frr