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