From aeae109682869ec2375e4fc1d2aec3cb204efd9b Mon Sep 17 00:00:00 2001 From: Igor Ryzhov Date: Thu, 27 May 2021 20:02:56 +0300 Subject: [PATCH] lib: fix bfd multihop Never send an interface name/index for multihop sessions. It breaks "neighbor A.B.C.D update-source" config in BGP. Signed-off-by: Igor Ryzhov --- bfdd/ptm_adapter.c | 2 +- lib/bfd.c | 14 +++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/bfdd/ptm_adapter.c b/bfdd/ptm_adapter.c index 4135e5fb49..838acf450f 100644 --- a/bfdd/ptm_adapter.c +++ b/bfdd/ptm_adapter.c @@ -232,7 +232,7 @@ int ptm_bfd_notify(struct bfd_session *bs, uint8_t notify_state) stream_putl(msg, ZEBRA_INTERFACE_BFD_DEST_UPDATE); /* NOTE: Interface is a shortcut to avoid comparing source address. */ - if (bs->ifp != NULL) + if (!CHECK_FLAG(bs->flags, BFD_SESS_FLAG_MH) && bs->ifp != NULL) stream_putl(msg, bs->ifp->ifindex); else stream_putl(msg, IFINDEX_INTERNAL); diff --git a/lib/bfd.c b/lib/bfd.c index 4989188e4e..4327f7c28d 100644 --- a/lib/bfd.c +++ b/lib/bfd.c @@ -314,9 +314,17 @@ int zclient_bfd_command(struct zclient *zc, struct bfd_session_arg *args) stream_putc(s, args->ttl); /* Send interface name if any. */ - stream_putc(s, args->ifnamelen); - if (args->ifnamelen) - stream_put(s, args->ifname, args->ifnamelen); + if (args->mhop) { + /* Don't send interface. */ + stream_putc(s, 0); + if (bsglobal.debugging && args->ifnamelen) + zlog_debug("%s: multi hop is configured, not sending interface", + __func__); + } else { + stream_putc(s, args->ifnamelen); + if (args->ifnamelen) + stream_put(s, args->ifname, args->ifnamelen); + } /* Send the C bit indicator. */ stream_putc(s, args->cbit); -- 2.39.5