pw->status = stream_getl(s);
}
+static void zclient_capability_decode(int command, struct zclient *zclient,
+ zebra_size_t length, vrf_id_t vrf_id)
+{
+ struct zclient_capabilities cap;
+ struct stream *s = zclient->ibuf;
+ uint8_t mpls_enabled;
+
+ memset(&cap, 0, sizeof(cap));
+ STREAM_GETC(s, mpls_enabled);
+ cap.mpls_enabled = !!mpls_enabled;
+ STREAM_GETL(s, cap.ecmp);
+
+ if (zclient->zebra_capabilities)
+ (*zclient->zebra_capabilities)(&cap);
+
+stream_failure:
+ return;
+}
+
/* Zebra client message read function. */
static int zclient_read(struct thread *thread)
{
(void *)zclient, command, vrf_id);
switch (command) {
+ case ZEBRA_CAPABILITIES:
+ zclient_capability_decode(command, zclient, length, vrf_id);
+ break;
case ZEBRA_ROUTER_ID_UPDATE:
if (zclient->router_id_update)
(*zclient->router_id_update)(command, zclient, length,
ZEBRA_ROUTER_ID_DELETE,
ZEBRA_ROUTER_ID_UPDATE,
ZEBRA_HELLO,
+ ZEBRA_CAPABILITIES,
ZEBRA_NEXTHOP_REGISTER,
ZEBRA_NEXTHOP_UNREGISTER,
ZEBRA_NEXTHOP_UPDATE,
struct list *instances;
};
+struct zclient_capabilities {
+ uint32_t ecmp;
+ bool mpls_enabled;
+};
+
/* Structure for the zebra client. */
struct zclient {
/* The thread master we schedule ourselves on */
/* Pointer to the callback functions. */
void (*zebra_connected)(struct zclient *);
+ void (*zebra_capabilities)(struct zclient_capabilities *cap);
int (*router_id_update)(int, struct zclient *, uint16_t, vrf_id_t);
int (*interface_add)(int, struct zclient *, uint16_t, vrf_id_t);
int (*interface_delete)(int, struct zclient *, uint16_t, vrf_id_t);
vrf_bitmap_unset(client->ridinfo, zvrf_id(zvrf));
}
+static void zsend_capabilities(struct zserv *client, struct zebra_vrf *zvrf)
+{
+ struct stream *s = stream_new(ZEBRA_MAX_PACKET_SIZ);
+
+ zclient_create_header(s, ZEBRA_CAPABILITIES, zvrf->vrf->vrf_id);
+ stream_putc(s, mpls_enabled);
+ stream_putl(s, multipath_num);
+
+ stream_putw_at(s, 0, stream_get_endp(s));
+ zebra_server_send_message(client, s);
+}
+
/* Tie up route-type and client->sock */
static void zread_hello(ZAPI_HANDLER_ARGS)
{
client->instance = instance;
}
+ zsend_capabilities(client, zvrf);
stream_failure:
return;
}