Shouldn't we have the opposite side in lib/zclient.c that allows the zclient->XXXX callback to be called?
doanld On Wed, Jan 20, 2016 at 9:17 AM, Paul Jakma <[email protected]> wrote: > 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 >
_______________________________________________ Quagga-dev mailing list [email protected] https://lists.quagga.net/mailman/listinfo/quagga-dev
