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

Reply via email to