- struct interface *ifp;
- struct prefix dp;
- struct prefix sp;
- int status;
-
- ifp = bfd_get_peer_info (zclient->ibuf, &dp, &sp, &status, vrf_id);
-
- if (BGP_DEBUG (zebra, ZEBRA))
- {
- char buf[2][PREFIX2STR_BUFFER];
- prefix2str(&dp, buf[0], sizeof(buf[0]));
- if (ifp)
- {
- zlog_debug("Zebra: vrf %d interface %s bfd destination %s %s",
- vrf_id, ifp->name, buf[0], bfd_get_status_str(status));
- }
- else
- {
- prefix2str(&sp, buf[1], sizeof(buf[1]));
- zlog_debug("Zebra: vrf %d source %s bfd destination %s %s",
- vrf_id, buf[1], buf[0], bfd_get_status_str(status));
- }
- }
-
- /* Bring the peer down if BFD is enabled in BGP */
- {
- struct listnode *mnode, *node, *nnode;
- struct bgp *bgp;
- struct peer *peer;
-
- for (ALL_LIST_ELEMENTS_RO (bm->bgp, mnode, bgp))
- for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
- {
- if (!peer->bfd_info)
- continue;
-
- if ((dp.family == AF_INET) && (peer->su.sa.sa_family == AF_INET))
- {
- if (dp.u.prefix4.s_addr != peer->su.sin.sin_addr.s_addr)
- continue;
- }
- else if ((dp.family == AF_INET6) &&
- (peer->su.sa.sa_family == AF_INET6))
- {
- if (memcmp(&dp.u.prefix6, &peer->su.sin6.sin6_addr,
- sizeof (struct in6_addr)))
- continue;
- }
- else
- continue;
-
- if (ifp && (ifp == peer->nexthop.ifp))
- {
- bgp_bfd_peer_status_update(peer, status);
- }
- else
- {
- if (!peer->su_local)
- continue;
-
- if ((sp.family == AF_INET) &&
- (peer->su_local->sa.sa_family == AF_INET))
- {
- if (sp.u.prefix4.s_addr != peer->su_local->sin.sin_addr.s_addr)
- continue;
- }
- else if ((sp.family == AF_INET6) &&
- (peer->su_local->sa.sa_family == AF_INET6))
- {
- if (memcmp(&sp.u.prefix6, &peer->su_local->sin6.sin6_addr,
- sizeof (struct in6_addr)))
- continue;
- }
- else
- continue;
-
- if ((vrf_id != VRF_DEFAULT) && (peer->bgp->vrf_id != vrf_id))
- continue;
-
- bgp_bfd_peer_status_update(peer, status);
- }
- }
- }
-
- return 0;
+ struct interface *ifp;
+ struct prefix dp;
+ struct prefix sp;
+ int status;
+
+ ifp = bfd_get_peer_info(zclient->ibuf, &dp, &sp, &status, vrf_id);
+
+ if (BGP_DEBUG(zebra, ZEBRA)) {
+ char buf[2][PREFIX2STR_BUFFER];
+ prefix2str(&dp, buf[0], sizeof(buf[0]));
+ if (ifp) {
+ zlog_debug(
+ "Zebra: vrf %u interface %s bfd destination %s %s",
+ vrf_id, ifp->name, buf[0],
+ bfd_get_status_str(status));
+ } else {
+ prefix2str(&sp, buf[1], sizeof(buf[1]));
+ zlog_debug(
+ "Zebra: vrf %u source %s bfd destination %s %s",
+ vrf_id, buf[1], buf[0],
+ bfd_get_status_str(status));
+ }
+ }
+
+ /* Bring the peer down if BFD is enabled in BGP */
+ {
+ struct listnode *mnode, *node, *nnode;
+ struct bgp *bgp;
+ struct peer *peer;
+
+ for (ALL_LIST_ELEMENTS_RO(bm->bgp, mnode, bgp))
+ for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
+ if (!peer->bfd_info)
+ continue;
+
+ if ((dp.family == AF_INET)
+ && (peer->su.sa.sa_family == AF_INET)) {
+ if (dp.u.prefix4.s_addr
+ != peer->su.sin.sin_addr.s_addr)
+ continue;
+ } else if ((dp.family == AF_INET6)
+ && (peer->su.sa.sa_family
+ == AF_INET6)) {
+ if (memcmp(&dp.u.prefix6,
+ &peer->su.sin6.sin6_addr,
+ sizeof(struct in6_addr)))
+ continue;
+ } else
+ continue;
+
+ if (ifp && (ifp == peer->nexthop.ifp)) {
+ bgp_bfd_peer_status_update(peer,
+ status);
+ } else {
+ if (!peer->su_local)
+ continue;
+
+ if ((sp.family == AF_INET)
+ && (peer->su_local->sa.sa_family
+ == AF_INET)) {
+ if (sp.u.prefix4.s_addr
+ != peer->su_local->sin
+ .sin_addr.s_addr)
+ continue;
+ } else if ((sp.family == AF_INET6)
+ && (peer->su_local->sa
+ .sa_family
+ == AF_INET6)) {
+ if (memcmp(&sp.u.prefix6,
+ &peer->su_local->sin6
+ .sin6_addr,
+ sizeof(struct
+ in6_addr)))
+ continue;
+ } else
+ continue;
+
+ if ((vrf_id != VRF_DEFAULT)
+ && (peer->bgp->vrf_id != vrf_id))
+ continue;
+
+ bgp_bfd_peer_status_update(peer,
+ status);
+ }
+ }
+ }
+
+ return 0;