From: Paul Jakma <[email protected]>

* lib/zebra.h: Add ZEBRA_VRF_{ADD,DEL} messages
* zserv.c: (zsend_vrf_update) Send a list of added or deleted VRF Ids to
  all zclients
  (zsend_vrf_init) Send an Add of all valid VRFs to the given client.
  (zebra_client_create) Call previous helper to send all VRFs to new clients
  immediately.
* zserv.h: Export zsend_vrf_update helper.
* main.c: (zebra_vrf_{en,dis}able) Have the vrf enable/disable hooks
  call zsend_vrf_update to update all clients.

Patch originates while with OpenSourceRouting.org.
---
 lib/zebra.h   |  7 ++++++-
 zebra/main.c  |  5 ++++-
 zebra/zserv.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 zebra/zserv.h |  2 ++
 4 files changed, 63 insertions(+), 3 deletions(-)

diff --git a/lib/zebra.h b/lib/zebra.h
index 97ed05c..787d667 100644
--- a/lib/zebra.h
+++ b/lib/zebra.h
@@ -415,7 +415,8 @@ struct in_pktinfo
 #define ZEBRA_HELLO                       23
 #define ZEBRA_IPV4_NEXTHOP_LOOKUP_MRIB    24
 #define ZEBRA_VRF_UNREGISTER              25
-#define ZEBRA_MESSAGE_MAX                 26
+#define ZEBRA_VRF_UPDATE                  27
+#define ZEBRA_MESSAGE_MAX                 28
 
 /* Marker value used in new Zserv, in the byte location corresponding
  * the command value in the old zserv header. To allow old and new
@@ -478,6 +479,10 @@ extern const char *zserv_command_string (unsigned int 
command);
 #define ZEBRA_NEXTHOP_IPV6_IFNAME        8
 #define ZEBRA_NEXTHOP_BLACKHOLE          9
 
+/* ZEBRA_VRF_UPDATE sub-commands */
+#define ZEBRA_VRF_UPDATE_ADD            1
+#define ZEBRA_VRF_UPDATE_DEL             2
+
 #ifndef INADDR_LOOPBACK
 #define        INADDR_LOOPBACK 0x7f000001      /* Internet address 127.0.0.1.  
*/
 #endif
diff --git a/zebra/main.c b/zebra/main.c
index f3c08f1..f684f9e 100644
--- a/zebra/main.c
+++ b/zebra/main.c
@@ -235,6 +235,7 @@ zebra_vrf_enable (vrf_id_t vrf_id, void **info)
   kernel_init (zvrf);
   interface_list (zvrf);
   route_read (zvrf);
+  zsend_vrf_update (zvrf, ZEBRA_VRF_UPDATE_ADD);
 
   return 0;
 }
@@ -248,7 +249,9 @@ zebra_vrf_disable (vrf_id_t vrf_id, void **info)
   struct interface *ifp;
 
   assert (zvrf);
-
+  
+  zsend_vrf_update (zvrf, ZEBRA_VRF_UPDATE_DEL);
+  
   rib_close_table (zvrf->table[AFI_IP][SAFI_UNICAST]);
   rib_close_table (zvrf->table[AFI_IP6][SAFI_UNICAST]);
 
diff --git a/zebra/zserv.c b/zebra/zserv.c
index f14b1b1..9a5aaf2 100644
--- a/zebra/zserv.c
+++ b/zebra/zserv.c
@@ -775,6 +775,54 @@ zsend_router_id_update (struct zserv *client, struct 
prefix *p,
   return zebra_server_send_message(client);
 }
 
+/* Inform all clients of additions and deletes to valid VRF IDs */
+void
+zsend_vrf_update (struct zebra_vrf *zvrf, int cmd)
+{
+  struct listnode *node, *nnode;
+  struct zserv *client;
+  
+  for (ALL_LIST_ELEMENTS (zebrad.client_list, node, nnode, client))
+    {
+      struct stream *s = client->obuf;
+      stream_reset (s);
+      
+      zserv_create_header (s, ZEBRA_VRF_UPDATE, 0);
+      stream_putw (s, cmd);
+      stream_putw (s, 1);
+      stream_putw (s, zvrf->vrf_id);
+      stream_putw_at (s, 0, stream_get_endp (s));
+      
+      zebra_server_send_message (client);
+    }
+}
+
+static int
+zsend_vrf_init (struct zserv *client)
+{
+  vrf_iter_t iter;
+  struct stream *s = client->obuf;
+  int n;
+  
+  stream_reset (s);
+  
+  zserv_create_header (s, ZEBRA_VRF_UPDATE, 0);
+  stream_putw (s, ZEBRA_VRF_UPDATE_ADD);
+  size_t npos = stream_get_endp (s);
+  stream_putw (s, 0);
+  
+  for (n = 0, iter = vrf_first ();
+       iter != VRF_ITER_INVALID;
+       iter = vrf_next (iter), n++)
+    {
+      struct zebra_vrf *zvrf = vrf_iter2info (iter);
+      stream_putw (s, zvrf->vrf_id);
+    }
+  stream_putw_at (s, 0, stream_get_endp (s));
+  stream_putw_at (s, npos, n);
+  return zebra_server_send_message(client);
+}
+
 /* Register zebra server interface information.  Send current all
    interface and address information. */
 static int
@@ -1325,7 +1373,7 @@ zebra_client_create (int sock)
   client->obuf = stream_new (ZEBRA_MAX_PACKET_SIZ);
   client->wb = buffer_new(0);
 
-  /* Set table number. */
+  /* Set table number. XXX? Make sense with VRFs? */
   client->rtm_table = zebrad.rtm_table_default;
 
   /* Initialize flags */
@@ -1338,6 +1386,8 @@ zebra_client_create (int sock)
   /* Add this client to linked list. */
   listnode_add (zebrad.client_list, client);
   
+  zsend_vrf_init (client);
+  
   /* Make new read thread. */
   zebra_event (ZEBRA_READ, sock, client);
 }
diff --git a/zebra/zserv.h b/zebra/zserv.h
index fc01f96..e3cf26c 100644
--- a/zebra/zserv.h
+++ b/zebra/zserv.h
@@ -111,6 +111,8 @@ extern int zsend_route_multipath (int, struct zserv *, 
struct prefix *,
 extern int zsend_router_id_update (struct zserv *, struct prefix *,
                                    vrf_id_t);
 
+extern void zsend_vrf_update (struct zebra_vrf *, int);
+
 extern pid_t pid;
 
 #endif /* _ZEBRA_ZEBRA_H */
-- 
2.5.0


_______________________________________________
Quagga-dev mailing list
[email protected]
https://lists.quagga.net/mailman/listinfo/quagga-dev

Reply via email to