On Mon, 18 Jan 2016, Vipin Kumar wrote:

Hi Vincent,

Here is a brief write-up about how we can (and some of it we have already
done) make name-space and vrf-device based vrfs co-exist.

In the kernel, hierarchically,  vrf-devices are well within a name-space.
We can keep the same in quagga. In fact, its looking quite feasible to
leverage both to take the effective vrf scale further.

I am attaching it as a text-file for a better view of the ansii art.

Might have been better to just include it directly. Very difficult to
reply to attachments. ASCII art should come over just fine in email, and
if not, get a better MUA.

Here's the thing. I very much think Quagga needs to become more 'componentised'. I think this is required for scalability and isolation and will be important for the future of Quagga.

CPUs are not getting faster anymore. Transistor counts however are still increasing, so cores/die and RAM are increasing. Any development path that seeks to optimise for a resource that is still growing and plentiful, at the cost of requiring more of a resources that is not growing (and that we already ask too much of in some cases) while ignoring one important area where resources are growing, is a path that is detrimental to the future of Quagga.

Given that.

How it is with 6wind vrf lib patch —

  Configuration:
    vrf <vrf-id> ns-name <path>

  Main data-structures:

    Global vrf_table which holds vrfs in a tree indexed by vrf-id.
    Interface list is moved inside VRFs.

    vrf_init() creates a default vrf.


   +----------------------+
   |   struct vrf {       |
   |                      |
   |      vrf_id_t vrf_id;|
   |      char *name;     |
   |                      |
   |       void *info;    +---------+
   |   }                  |         |
   +----------------------+         |
                                    | (in case of zebra)
                                +---+----------------+
                                | struct zebra_vrf { |
                                |     /*tables etc. *|
                                |                    |
                                | }                  |
                                +--------------------+


Here is how name-space based model is filling well after integration with vrf-devices


  Configuration:
name-space <ns-id> ns-name <path> // proposing renaming of the previous vrf command.
    vrf <name>  // the new config mode

As for the reflection of hierarchies in the running config, we have two possibilities:

1. Continue with the approach we took with interface and vrf, where a vrf is shown in the interface command. Do the same with the vrf command and show name-space next to the vrfs it owns.


          name-space ID name NSNAME

          vrf VRFNAME name-space NSNAME

          interface IFNAME vrf VRFNAME

2. Implement name-space config mode which contains VRFs and interfaces within it.

      We believe (1) is sufficient.

  Main data-structures:

    Global ns_table which holds NSs in a tree indexed by ns-id.
    vrf_table is moved inside name-space structure.

    ns/vrf_init() create default ns/vrf.


   +-------------------------+
   |struct zebra_ns {        |
   |    ns_id_t nsid;        |
   |                         |
   |    /* vrf_table etc. */ |
   |                         +----+
   |}                        |    |   +--------------+
   +-------------------------+    +——>+struct vrf {  |
                                  |   |              |  +--------------------+
                                  |   |}             +> |struct zebra_vrf {  |
                                  |   +--------------+  |                    |
                                  |                     |}                   |
                                  |                     |                    |
                                  |                     +--------------------+
                                  |
                                  +-->
                                  |
                                  |
                                  +


I think the VRF creation needs to be a separate daemon, and probably has to handle at least some interface mgt too. It probably also needs to manage the child processes.

That is, I think, required to have a RIB process per VRF/namespace.

It is much easier to design this as completely separate processes I think, and let others merge them into one if they wish, than the other way around.

I would like to see a vrfd that handles vrf creation. Potentially we need something to also launch and manage RIBs and routing instances as children in the right VRFs (maybe an extension of watchquagga). Whether those two things should be in the same daemon or not I'm not 100% sure, probaly they do.

regards,
--
Paul Jakma      [email protected]  @pjakma Key ID: 64A2FF6A
Fortune:
We ran out of dial tone and we're and waiting for the phone company to deliver 
another bottle.
_______________________________________________
Quagga-dev mailing list
[email protected]
https://lists.quagga.net/mailman/listinfo/quagga-dev

Reply via email to