summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/log.c3
-rw-r--r--lib/zclient.c31
-rw-r--r--lib/zclient.h3
-rw-r--r--lib/zebra.h3
4 files changed, 38 insertions, 2 deletions
diff --git a/lib/log.c b/lib/log.c
index ad610050f8..fefc0db526 100644
--- a/lib/log.c
+++ b/lib/log.c
@@ -874,7 +874,8 @@ static const struct zebra_desc_table command_types[] = {
DESC_ENTRY (ZEBRA_REDISTRIBUTE_IPV4_ADD),
DESC_ENTRY (ZEBRA_REDISTRIBUTE_IPV4_DEL),
DESC_ENTRY (ZEBRA_REDISTRIBUTE_IPV6_ADD),
- DESC_ENTRY (ZEBRA_REDISTRIBUTE_IPV6_DEL)
+ DESC_ENTRY (ZEBRA_REDISTRIBUTE_IPV6_DEL),
+ DESC_ENTRY (ZEBRA_INTERFACE_VRF_UPDATE)
};
#undef DESC_ENTRY
diff --git a/lib/zclient.c b/lib/zclient.c
index 82f0c26e59..655eda8176 100644
--- a/lib/zclient.c
+++ b/lib/zclient.c
@@ -1211,6 +1211,33 @@ zebra_interface_nbr_address_read (int type, struct stream *s, vrf_id_t vrf_id)
return ifc;
}
+struct interface *
+zebra_interface_vrf_update_read (struct stream *s, vrf_id_t vrf_id,
+ vrf_id_t *new_vrf_id)
+{
+ unsigned int ifindex;
+ struct interface *ifp;
+ vrf_id_t new_id = VRF_DEFAULT;
+
+ /* Get interface index. */
+ ifindex = stream_getl (s);
+
+ /* Lookup interface. */
+ ifp = if_lookup_by_index_vrf (ifindex, vrf_id);
+ if (ifp == NULL)
+ {
+ zlog_warn ("INTERFACE_VRF_UPDATE: Cannot find IF %u in VRF %d",
+ ifindex, vrf_id);
+ return NULL;
+ }
+
+ /* Fetch new VRF Id. */
+ new_id = stream_getw (s);
+
+ *new_vrf_id = new_id;
+ return ifp;
+}
+
/* Zebra client message read function. */
static int
zclient_read (struct thread *thread)
@@ -1357,6 +1384,10 @@ zclient_read (struct thread *thread)
if (zclient->interface_down)
(*zclient->interface_down) (command, zclient, length, vrf_id);
break;
+ case ZEBRA_INTERFACE_VRF_UPDATE:
+ if (zclient->interface_vrf_update)
+ (*zclient->interface_vrf_update) (command, zclient, length, vrf_id);
+ break;
case ZEBRA_IPV4_ROUTE_ADD:
if (zclient->ipv4_route_add)
(*zclient->ipv4_route_add) (command, zclient, length, vrf_id);
diff --git a/lib/zclient.h b/lib/zclient.h
index e58870828b..49f73b3e9b 100644
--- a/lib/zclient.h
+++ b/lib/zclient.h
@@ -98,6 +98,7 @@ struct zclient
int (*interface_bfd_dest_update) (int, struct zclient *, uint16_t, vrf_id_t);
int (*interface_nbr_address_add) (int, struct zclient *, uint16_t, vrf_id_t);
int (*interface_nbr_address_delete) (int, struct zclient *, uint16_t, vrf_id_t);
+ int (*interface_vrf_update) (int, struct zclient *, uint16_t, vrf_id_t);
int (*ipv4_route_add) (int, struct zclient *, uint16_t, vrf_id_t);
int (*ipv4_route_delete) (int, struct zclient *, uint16_t, vrf_id_t);
int (*ipv6_route_add) (int, struct zclient *, uint16_t, vrf_id_t);
@@ -200,6 +201,8 @@ extern struct interface *zebra_interface_add_read (struct stream *, vrf_id_t);
extern struct interface *zebra_interface_state_read (struct stream *s, vrf_id_t);
extern struct connected *zebra_interface_address_read (int, struct stream *, vrf_id_t);
extern struct nbr_connected *zebra_interface_nbr_address_read (int, struct stream *, vrf_id_t);
+extern struct interface * zebra_interface_vrf_update_read (struct stream *s, vrf_id_t vrf_id,
+ vrf_id_t *new_vrf_id);
extern void zebra_interface_if_set_value (struct stream *, struct interface *);
extern void zebra_router_id_update_read (struct stream *s, struct prefix *rid);
extern int zapi_ipv4_route (u_char, struct zclient *, struct prefix_ipv4 *,
diff --git a/lib/zebra.h b/lib/zebra.h
index 3d38a4c5cb..2945f15194 100644
--- a/lib/zebra.h
+++ b/lib/zebra.h
@@ -445,7 +445,8 @@ struct in_pktinfo
#define ZEBRA_VRF_UNREGISTER 42
#define ZEBRA_VRF_ADD 43
#define ZEBRA_VRF_DELETE 44
-#define ZEBRA_MESSAGE_MAX 45
+#define ZEBRA_INTERFACE_VRF_UPDATE 45
+#define ZEBRA_MESSAGE_MAX 46
/* Marker value used in new Zserv, in the byte location corresponding
* the command value in the old zserv header. To allow old and new