diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/zclient.c | 22 | ||||
| -rw-r--r-- | lib/zclient.h | 7 |
2 files changed, 29 insertions, 0 deletions
diff --git a/lib/zclient.c b/lib/zclient.c index e1ce40ce70..ff4a2c7027 100644 --- a/lib/zclient.c +++ b/lib/zclient.c @@ -2480,6 +2480,25 @@ void zebra_read_pw_status_update(int command, struct zclient *zclient, 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) { @@ -2577,6 +2596,9 @@ 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, diff --git a/lib/zclient.h b/lib/zclient.h index 985239b326..71f5b38384 100644 --- a/lib/zclient.h +++ b/lib/zclient.h @@ -85,6 +85,7 @@ typedef enum { ZEBRA_ROUTER_ID_DELETE, ZEBRA_ROUTER_ID_UPDATE, ZEBRA_HELLO, + ZEBRA_CAPABILITIES, ZEBRA_NEXTHOP_REGISTER, ZEBRA_NEXTHOP_UNREGISTER, ZEBRA_NEXTHOP_UPDATE, @@ -162,6 +163,11 @@ struct redist_proto { 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 */ @@ -206,6 +212,7 @@ struct zclient { /* 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); |
