summaryrefslogtreecommitdiff
path: root/lib/zclient.c
diff options
context:
space:
mode:
authorRenato Westphal <renato@opensourcerouting.org>2019-01-02 13:05:53 -0200
committerRenato Westphal <renato@opensourcerouting.org>2019-01-02 13:32:31 -0200
commit91d227b7e3cb53ad8fdbcd9d4cff7f0a666918e3 (patch)
treee974a2e924d536b079e95aad2509fd36decf6354 /lib/zclient.c
parentd52fa66f0eab73d73caf5fdb47aeae4132b144db (diff)
zebra, lib: fix the ZEBRA_INTERFACE_VRF_UPDATE zapi message
Unlike the other interface zapi messages, ZEBRA_INTERFACE_VRF_UPDATE identifies interfaces using ifindexes and not interface names. This is a problem because zebra always sends ZEBRA_INTERFACE_DOWN and ZEBRA_INTERFACE_DELETE messages before sending ZEBRA_INTERFACE_VRF_UPDATE, and the ZEBRA_INTERFACE_DELETE callback from all daemons set the interface index to IFINDEX_INTERNAL. Hence, when decoding a ZEBRA_INTERFACE_VRF_UPDATE message, the interface lookup would always fail since the corresponding interface lost its ifindex. Example (ospfd): OSPF: Zebra: Interface[rt1-eth2] state change to down. OSPF: Zebra: interface delete rt1-eth2 vrf default[0] index 8 flags 11143 metric 0 mtu 1500 OSPF: [EC 100663301] INTERFACE_VRF_UPDATE: Cannot find IF 8 in VRF 0 To fix this problem, use interface names instead of ifindexes to indentify interfaces like the other interface zapi messages do. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
Diffstat (limited to 'lib/zclient.c')
-rw-r--r--lib/zclient.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/lib/zclient.c b/lib/zclient.c
index beb3ca4f34..d2a6c75548 100644
--- a/lib/zclient.c
+++ b/lib/zclient.c
@@ -1770,19 +1770,19 @@ struct interface *zebra_interface_vrf_update_read(struct stream *s,
vrf_id_t vrf_id,
vrf_id_t *new_vrf_id)
{
- unsigned int ifindex;
+ char ifname[INTERFACE_NAMSIZ];
struct interface *ifp;
vrf_id_t new_id;
- /* Get interface index. */
- ifindex = stream_getl(s);
+ /* Read interface name. */
+ stream_get(ifname, s, INTERFACE_NAMSIZ);
/* Lookup interface. */
- ifp = if_lookup_by_index(ifindex, vrf_id);
+ ifp = if_lookup_by_name(ifname, vrf_id);
if (ifp == NULL) {
flog_err(EC_LIB_ZAPI_ENCODE,
- "INTERFACE_VRF_UPDATE: Cannot find IF %u in VRF %d",
- ifindex, vrf_id);
+ "INTERFACE_VRF_UPDATE: Cannot find IF %s in VRF %d",
+ ifname, vrf_id);
return NULL;
}