bgp_bfd_peer_sendmsg (struct peer *peer, int command)
{
struct bfd_info *bfd_info;
+ vrf_id_t vrf_id = VRF_DEFAULT;
bfd_info = (struct bfd_info *)peer->bfd_info;
+ if (peer->bgp && (peer->bgp->inst_type == BGP_INSTANCE_TYPE_VRF))
+ vrf_id = peer->bgp->vrf_id;
+
if (peer->su.sa.sa_family == AF_INET)
bfd_peer_sendmsg (zclient, bfd_info, AF_INET,
&peer->su.sin.sin_addr,
(peer->su_local) ? &peer->su_local->sin.sin_addr : NULL,
(peer->nexthop.ifp) ? peer->nexthop.ifp->name : NULL,
- peer->ttl, bgp_bfd_is_peer_multihop(peer), command, 1, VRF_DEFAULT);
+ peer->ttl, bgp_bfd_is_peer_multihop(peer), command, 1, vrf_id);
else if (peer->su.sa.sa_family == AF_INET6)
bfd_peer_sendmsg (zclient, bfd_info, AF_INET6,
&peer->su.sin6.sin6_addr,
(peer->su_local) ? &peer->su_local->sin6.sin6_addr : NULL,
(peer->nexthop.ifp) ? peer->nexthop.ifp->name : NULL,
- peer->ttl, bgp_bfd_is_peer_multihop(peer), command, 1, VRF_DEFAULT);
+ peer->ttl, bgp_bfd_is_peer_multihop(peer), command, 1, vrf_id);
}
/*
else
continue;
+ if ((vrf_id != VRF_DEFAULT) && (peer->bgp->vrf_id != vrf_id))
+ continue;
+
bgp_bfd_peer_status_update(peer, status);
}
}
#include "buffer.h"
#include "zebra/zebra_ptm_redistribute.h"
#include "bfd.h"
+#include "vrf.h"
#define ZEBRA_PTM_RECONNECT_TIME_INITIAL 1 /* initial reconnect is 1s */
#define ZEBRA_PTM_RECONNECT_TIME_MAX 300
const char ZEBRA_PTM_BFDSTATUS_DOWN_STR[] = "Down";
const char ZEBRA_PTM_BFDDEST_STR[] = "peer";
const char ZEBRA_PTM_BFDSRC_STR[] = "local";
+const char ZEBRA_PTM_BFDVRF_STR[] = "vrf";
const char ZEBRA_PTM_INVALID_PORT_NAME[] = "N/A";
const char ZEBRA_PTM_INVALID_SRC_IP[] = "N/A";
+const char ZEBRA_PTM_INVALID_VRF[] = "N/A";
const char ZEBRA_PTM_BFD_DST_IP_FIELD[] = "dstIPaddr";
const char ZEBRA_PTM_BFD_SRC_IP_FIELD[] = "srcIPaddr";
const char ZEBRA_PTM_BFD_IFNAME_FIELD[] = "ifName";
const char ZEBRA_PTM_BFD_MAX_HOP_CNT_FIELD[] = "maxHopCnt";
const char ZEBRA_PTM_BFD_SEND_EVENT[] = "sendEvent";
+const char ZEBRA_PTM_BFD_VRF_NAME_FIELD[] = "vrfName";
extern struct zebra_t zebrad;
/* BFD session goes down, send message to the protocols. */
static void
if_bfd_session_update (struct interface *ifp, struct prefix *dp,
- struct prefix *sp, int status)
+ struct prefix *sp, int status, vrf_id_t vrf_id)
{
if (IS_ZEBRA_DEBUG_EVENT)
{
else
{
zlog_debug ("MESSAGE: ZEBRA_INTERFACE_BFD_DEST_UPDATE %s/%d "
- "with src %s/%d %s event",
+ "with src %s/%d and vrf %d %s event",
inet_ntop (dp->family, &dp->u.prefix, buf[0], INET6_ADDRSTRLEN),
dp->prefixlen,
inet_ntop (sp->family, &sp->u.prefix, buf[1], INET6_ADDRSTRLEN),
- sp->prefixlen, bfd_get_status_str(status));
+ sp->prefixlen, vrf_id, bfd_get_status_str(status));
}
}
- zebra_interface_bfd_update (ifp, dp, sp, status);
+ zebra_interface_bfd_update (ifp, dp, sp, status, vrf_id);
}
static int
char bfdst_str[32];
char dest_str[64];
char src_str[64];
+ char vrf_str[64];
struct prefix dest_prefix;
struct prefix src_prefix;
return -1;
}
+ ptm_lib_find_key_in_msg(in_ctxt, ZEBRA_PTM_BFDVRF_STR, vrf_str);
+
+ if (vrf_str[0] == '\0') {
+ zlog_debug("%s: Key %s not found in PTM msg", __func__,
+ ZEBRA_PTM_BFDVRF_STR);
+ return -1;
+ }
+
if (IS_ZEBRA_DEBUG_EVENT)
- zlog_debug("%s: Recv Port [%s] bfd status [%s] peer [%s] local [%s]",
+ zlog_debug("%s: Recv Port [%s] bfd status [%s] vrf [%s] peer [%s] local [%s]",
__func__, ifp ? ifp->name : "N/A", bfdst_str,
- dest_str, src_str);
+ vrf_str, dest_str, src_str);
if (str2prefix(dest_str, &dest_prefix) == 0) {
zlog_err("%s: Peer addr %s not found", __func__,
}
if (!strcmp (bfdst_str, ZEBRA_PTM_BFDSTATUS_DOWN_STR)) {
- if_bfd_session_update(ifp, &dest_prefix, &src_prefix, BFD_STATUS_DOWN);
+ if_bfd_session_update(ifp, &dest_prefix, &src_prefix, BFD_STATUS_DOWN,
+ vrf_name_to_id(vrf_str));
} else {
- if_bfd_session_update(ifp, &dest_prefix, &src_prefix, BFD_STATUS_UP);
+ if_bfd_session_update(ifp, &dest_prefix, &src_prefix, BFD_STATUS_UP,
+ vrf_name_to_id(vrf_str));
}
return 0;
/* BFD peer/dst register/update */
int
zebra_ptm_bfd_dst_register (struct zserv *client, int sock, u_short length,
- int command)
+ int command, vrf_id_t vrf_id)
{
struct stream *s;
struct prefix src_p;
char buf[INET6_ADDRSTRLEN];
char tmp_buf[64];
int data_len = ZEBRA_PTM_SEND_MAX_SOCKBUF;
+ struct zebra_vrf *zvrf;
if (command == ZEBRA_BFD_DEST_UPDATE)
client->bfd_peer_upd8_cnt++;
sprintf(tmp_buf, "%d", multi_hop_cnt);
ptm_lib_append_msg(ptm_hdl, out_ctxt, ZEBRA_PTM_BFD_MAX_HOP_CNT_FIELD,
tmp_buf);
+
+ if (vrf_id)
+ {
+ zvrf = vrf_info_lookup (vrf_id);
+ if (zvrf)
+ ptm_lib_append_msg(ptm_hdl, out_ctxt, ZEBRA_PTM_BFD_VRF_NAME_FIELD,
+ zvrf->name);
+ }
}
else
{
/* BFD peer/dst deregister */
int
-zebra_ptm_bfd_dst_deregister (struct zserv *client, int sock, u_short length)
+zebra_ptm_bfd_dst_deregister (struct zserv *client, int sock, u_short length,
+ vrf_id_t vrf_id)
{
struct stream *s;
struct prefix src_p;
char tmp_buf[64];
int data_len = ZEBRA_PTM_SEND_MAX_SOCKBUF;
void *out_ctxt;
+ struct zebra_vrf *zvrf;
client->bfd_peer_del_cnt++;
ZEBRA_PTM_BFD_SRC_IP_FIELD, buf);
}
#endif /* HAVE_IPV6 */
+ if (vrf_id)
+ {
+ zvrf = vrf_info_lookup (vrf_id);
+ if (zvrf)
+ ptm_lib_append_msg(ptm_hdl, out_ctxt, ZEBRA_PTM_BFD_VRF_NAME_FIELD,
+ zvrf->name);
+ }
}
else
{
static int
zsend_interface_bfd_update (int cmd, struct zserv *client,
struct interface *ifp, struct prefix *dp,
- struct prefix *sp, int status)
+ struct prefix *sp, int status, vrf_id_t vrf_id)
{
int blen;
struct stream *s;
s = client->obuf;
stream_reset (s);
- zserv_create_header (s, cmd, (ifp ? ifp->vrf_id : VRF_DEFAULT));
+ zserv_create_header (s, cmd, vrf_id);
if (ifp)
stream_putl (s, ifp->ifindex);
else
void
zebra_interface_bfd_update (struct interface *ifp, struct prefix *dp,
- struct prefix *sp, int status)
+ struct prefix *sp, int status, vrf_id_t vrf_id)
{
struct listnode *node, *nnode;
struct zserv *client;
/* Notify to the protocol daemons. */
zsend_interface_bfd_update (ZEBRA_INTERFACE_BFD_DEST_UPDATE, client, ifp,
- dp, sp, status);
+ dp, sp, status, vrf_id);
}
}