From 91d227b7e3cb53ad8fdbcd9d4cff7f0a666918e3 Mon Sep 17 00:00:00 2001 From: Renato Westphal Date: Wed, 2 Jan 2019 13:05:53 -0200 Subject: [PATCH] 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 --- lib/zclient.c | 12 ++++++------ zebra/zapi_msg.c | 4 ++-- 2 files changed, 8 insertions(+), 8 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; } diff --git a/zebra/zapi_msg.c b/zebra/zapi_msg.c index 26a3cd5b42..32614f408e 100644 --- a/zebra/zapi_msg.c +++ b/zebra/zapi_msg.c @@ -432,8 +432,8 @@ int zsend_interface_vrf_update(struct zserv *client, struct interface *ifp, zclient_create_header(s, ZEBRA_INTERFACE_VRF_UPDATE, ifp->vrf_id); - /* Fill in the ifIndex of the interface and its new VRF (id) */ - stream_putl(s, ifp->ifindex); + /* Fill in the name of the interface and its new VRF (id) */ + stream_put(s, ifp->name, INTERFACE_NAMSIZ); stream_putl(s, vrf_id); /* Write packet size. */