/* Sanity check: don't leak open sockets. */
if (bs->sock != -1) {
- zlog_debug("session-enable: previous socket open");
+ if (bglobal.debug_peer_event)
+ zlog_debug("session-enable: previous socket open");
+
close(bs->sock);
bs->sock = -1;
}
if (old_state != bfd->ses_state) {
bfd->stats.session_up++;
- zlog_debug("state-change: [%s] %s -> %s", bs_to_string(bfd),
- state_list[old_state].str,
- state_list[bfd->ses_state].str);
+ if (bglobal.debug_peer_event)
+ zlog_debug("state-change: [%s] %s -> %s",
+ bs_to_string(bfd), state_list[old_state].str,
+ state_list[bfd->ses_state].str);
}
}
if (old_state != bfd->ses_state) {
bfd->stats.session_down++;
- zlog_debug("state-change: [%s] %s -> %s reason:%s",
- bs_to_string(bfd), state_list[old_state].str,
- state_list[bfd->ses_state].str,
- get_diag_str(bfd->local_diag));
+ if (bglobal.debug_peer_event)
+ zlog_debug("state-change: [%s] %s -> %s reason:%s",
+ bs_to_string(bfd), state_list[old_state].str,
+ state_list[bfd->ses_state].str,
+ get_diag_str(bfd->local_diag));
}
}
if (bfd->key.ifname[0] || bfd->key.vrfname[0] || bfd->sock == -1)
bs_observer_add(bfd);
- zlog_debug("session-new: %s", bs_to_string(bfd));
+ if (bglobal.debug_peer_event)
+ zlog_debug("session-new: %s", bs_to_string(bfd));
control_notify_config(BCM_NOTIFY_CONFIG_ADD, bfd);
return -1;
}
- zlog_debug("session-delete: %s", bs_to_string(bs));
+ if (bglobal.debug_peer_event)
+ zlog_debug("session-delete: %s", bs_to_string(bs));
control_notify_config(BCM_NOTIFY_CONFIG_DELETE, bs);
break;
default:
- zlog_debug("state-change: unhandled neighbor state: %d",
- nstate);
+ if (bglobal.debug_peer_event)
+ zlog_debug("state-change: unhandled neighbor state: %d",
+ nstate);
break;
}
}
break;
default:
- zlog_debug("state-change: unhandled neighbor state: %d",
- nstate);
+ if (bglobal.debug_peer_event)
+ zlog_debug("state-change: unhandled neighbor state: %d",
+ nstate);
break;
}
}
if (old_state != bfd->ses_state) {
bfd->stats.session_down++;
-
- zlog_debug("state-change: [%s] %s -> %s reason:%s",
- bs_to_string(bfd), state_list[old_state].str,
- state_list[bfd->ses_state].str,
- get_diag_str(bfd->local_diag));
+ if (bglobal.debug_peer_event)
+ zlog_debug("state-change: [%s] %s -> %s reason:%s",
+ bs_to_string(bfd), state_list[old_state].str,
+ state_list[bfd->ses_state].str,
+ get_diag_str(bfd->local_diag));
}
}
break;
default:
- zlog_debug("state-change: unhandled neighbor state: %d",
- nstate);
+ if (bglobal.debug_peer_event)
+ zlog_debug("state-change: unhandled neighbor state: %d",
+ nstate);
break;
}
}
break;
default:
- zlog_debug("state-change: [%s] is in invalid state: %d",
- bs_to_string(bs), nstate);
+ if (bglobal.debug_peer_event)
+ zlog_debug("state-change: [%s] is in invalid state: %d",
+ bs_to_string(bs), nstate);
break;
}
}
memset(&bs.key.local, 0, sizeof(bs.key.local));
bsp = hash_lookup(bfd_key_hash, &bs);
if (bsp) {
- char addr_buf[INET6_ADDRSTRLEN];
-
- inet_ntop(bs.key.family, &key.local, addr_buf,
- sizeof(addr_buf));
- zlog_debug(" peer %s found, but loc-addr %s ignored",
- peer_buf, addr_buf);
+ if (bglobal.debug_peer_event) {
+ char addr_buf[INET6_ADDRSTRLEN];
+ inet_ntop(bs.key.family, &key.local, addr_buf,
+ sizeof(addr_buf));
+ zlog_debug(
+ " peer %s found, but loc-addr %s ignored",
+ peer_buf, addr_buf);
+ }
return bsp;
}
}
memset(bs.key.ifname, 0, sizeof(bs.key.ifname));
bsp = hash_lookup(bfd_key_hash, &bs);
if (bsp) {
- zlog_debug(" peer %s found, but ifp %s ignored",
- peer_buf, key.ifname);
+ if (bglobal.debug_peer_event)
+ zlog_debug(" peer %s found, but ifp %s ignored",
+ peer_buf, key.ifname);
return bsp;
}
}
memset(&bs.key.local, 0, sizeof(bs.key.local));
bsp = hash_lookup(bfd_key_hash, &bs);
if (bsp) {
- char addr_buf[INET6_ADDRSTRLEN];
-
- inet_ntop(bs.key.family, &bs.key.local, addr_buf,
- sizeof(addr_buf));
- zlog_debug(
- " peer %s found, but ifp %s"
- " and loc-addr %s ignored",
- peer_buf, key.ifname, addr_buf);
+ if (bglobal.debug_peer_event) {
+ char addr_buf[INET6_ADDRSTRLEN];
+ inet_ntop(bs.key.family, &bs.key.local,
+ addr_buf, sizeof(addr_buf));
+ zlog_debug(
+ " peer %s found, but ifp %s"
+ " and loc-addr %s ignored",
+ peer_buf, key.ifname, addr_buf);
+ }
return bsp;
}
}
/* change key */
if (ctx.result) {
bsp = ctx.result;
- zlog_debug(
- " peer %s found, but ifp"
- " and/or loc-addr params ignored",
- peer_buf);
+ if (bglobal.debug_peer_event)
+ zlog_debug(
+ " peer %s found, but ifp"
+ " and/or loc-addr params ignored",
+ peer_buf);
}
return bsp;
}
*/
static int bfd_vrf_new(struct vrf *vrf)
{
- zlog_debug("VRF Created: %s(%u)", vrf->name, vrf->vrf_id);
+ if (bglobal.debug_zebra)
+ zlog_debug("VRF Created: %s(%u)", vrf->name, vrf->vrf_id);
+
return 0;
}
static int bfd_vrf_delete(struct vrf *vrf)
{
- zlog_debug("VRF Deletion: %s(%u)", vrf->name, vrf->vrf_id);
+ if (bglobal.debug_zebra)
+ zlog_debug("VRF Deletion: %s(%u)", vrf->name, vrf->vrf_id);
+
return 0;
}
{
if (!vrf_is_enabled(vrf))
return 0;
- zlog_debug("VRF update: %s(%u)", vrf->name, vrf->vrf_id);
+
+ if (bglobal.debug_zebra)
+ zlog_debug("VRF update: %s(%u)", vrf->name, vrf->vrf_id);
+
/* a different name is given; update bfd list */
bfdd_sessions_enable_vrf(vrf);
return 0;
vrf->info = (void *)bvrf;
} else
bvrf = vrf->info;
- zlog_debug("VRF enable add %s id %u", vrf->name, vrf->vrf_id);
+
+ if (bglobal.debug_zebra)
+ zlog_debug("VRF enable add %s id %u", vrf->name, vrf->vrf_id);
+
if (vrf->vrf_id == VRF_DEFAULT ||
vrf_get_backend() == VRF_BACKEND_NETNS) {
if (!bvrf->bg_shop)
bfdd_zclient_unregister(vrf->vrf_id);
}
- zlog_debug("VRF disable %s id %d", vrf->name, vrf->vrf_id);
+ if (bglobal.debug_zebra)
+ zlog_debug("VRF disable %s id %d", vrf->name, vrf->vrf_id);
/* Disable read/write poll triggering. */
THREAD_OFF(bvrf->bg_ev[0]);
#endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */
rv = sendto(sd, data, datalen, 0, sa, slen);
if (rv <= 0) {
- zlog_debug("packet-send: send failure: %s", strerror(errno));
+ if (bglobal.debug_network)
+ zlog_debug("packet-send: send failure: %s",
+ strerror(errno));
return -1;
}
- if (rv < (ssize_t)datalen)
- zlog_debug("packet-send: send partial: %s", strerror(errno));
+ if (rv < (ssize_t)datalen) {
+ if (bglobal.debug_network)
+ zlog_debug("packet-send: send partial: %s",
+ strerror(errno));
+ }
return 0;
}
/* Your discriminator not zero - use it to find session */
bfd = bfd_id_lookup(my_discr);
if (bfd == NULL) {
- zlog_debug("echo-packet: no matching session (id:%u)",
- my_discr);
+ if (bglobal.debug_network)
+ zlog_debug("echo-packet: no matching session (id:%u)",
+ my_discr);
return -1;
}
if (!CHECK_FLAG(bfd->flags, BFD_SESS_FLAG_ECHO_ACTIVE)) {
- zlog_debug("echo-packet: echo disabled [%s] (id:%u)",
- bs_to_string(bfd), my_discr);
+ if (bglobal.debug_network)
+ zlog_debug("echo-packet: echo disabled [%s] (id:%u)",
+ bs_to_string(bfd), my_discr);
return -1;
}
memcpy(&ttlval, CMSG_DATA(cm), sizeof(ttlval));
if (ttlval > 255) {
- zlog_debug("ipv4-recv: invalid TTL: %u",
- ttlval);
+ if (bglobal.debug_network)
+ zlog_debug("ipv4-recv: invalid TTL: %u",
+ ttlval);
return -1;
}
*ttl = ttlval;
if (cm->cmsg_type == IPV6_HOPLIMIT) {
memcpy(&ttlval, CMSG_DATA(cm), sizeof(ttlval));
if (ttlval > 255) {
- zlog_debug("ipv6-recv: invalid TTL: %u",
- ttlval);
+ if (bglobal.debug_network)
+ zlog_debug("ipv6-recv: invalid TTL: %u",
+ ttlval);
return -1;
}
char buf[512], peerstr[128], localstr[128], portstr[64], vrfstr[64];
va_list vl;
+ /* Don't to any processing if debug is disabled. */
+ if (bglobal.debug_network == false)
+ return;
+
if (peer->sa_sin.sin_family)
snprintf(peerstr, sizeof(peerstr), " peer:%s", satostr(peer));
else
/* Send echo back. */
wlen = sendmsg(sd, &msg, 0);
if (wlen <= 0) {
- zlog_debug("udp-send: loopback failure: (%d) %s", errno,
- strerror(errno));
+ if (bglobal.debug_network)
+ zlog_debug("udp-send: loopback failure: (%d) %s", errno,
+ strerror(errno));
return -1;
} else if (wlen < (ssize_t)datalen) {
- zlog_debug("udp-send: partial send: %zd expected %zu", wlen,
- datalen);
+ if (bglobal.debug_network)
+ zlog_debug("udp-send: partial send: %zd expected %zu",
+ wlen, datalen);
return -1;
}
return CMD_SUCCESS;
}
+DEFPY(
+ bfd_debug_peer, bfd_debug_peer_cmd,
+ "[no] debug bfd peer",
+ NO_STR
+ DEBUG_STR
+ "Bidirection Forwarding Detection\n"
+ "Peer events debugging\n")
+{
+ bglobal.debug_peer_event = !no;
+ return CMD_SUCCESS;
+}
+
+DEFPY(
+ bfd_debug_zebra, bfd_debug_zebra_cmd,
+ "[no] debug bfd zebra",
+ NO_STR
+ DEBUG_STR
+ "Bidirection Forwarding Detection\n"
+ "Zebra events debugging\n")
+{
+ bglobal.debug_zebra = !no;
+ return CMD_SUCCESS;
+}
+
+DEFPY(
+ bfd_debug_network, bfd_debug_network_cmd,
+ "[no] debug bfd network",
+ NO_STR
+ DEBUG_STR
+ "Bidirection Forwarding Detection\n"
+ "Network layer debugging\n")
+{
+ bglobal.debug_network = !no;
+ return CMD_SUCCESS;
+}
+
/*
* Function definitions.
*/
"BFD daemon\n")
{
vty_out(vty, "BFD debugging status:\n");
+ vty_out(vty, " Peer events debugging.\n");
+ vty_out(vty, " Zebra events debugging.\n");
+ vty_out(vty, " Network layer debugging.\n");
return CMD_SUCCESS;
}
struct lyd_node *dnode;
int written = 0;
+ if (bglobal.debug_peer_event) {
+ vty_out(vty, "debug bfd peer\n");
+ written = 1;
+ }
+
+ if (bglobal.debug_zebra) {
+ vty_out(vty, "debug bfd zebra\n");
+ written = 1;
+ }
+
+ if (bglobal.debug_network) {
+ vty_out(vty, "debug bfd network\n");
+ written = 1;
+ }
+
dnode = yang_dnode_get(running_config->dnode, "/frr-bfdd:bfdd");
if (dnode) {
nb_cli_show_dnode_cmds(vty, dnode, false);
install_element(ENABLE_NODE, &bfd_show_peers_brief_cmd);
install_element(ENABLE_NODE, &show_debugging_bfd_cmd);
+ install_element(ENABLE_NODE, &bfd_debug_peer_cmd);
+ install_element(ENABLE_NODE, &bfd_debug_zebra_cmd);
+ install_element(ENABLE_NODE, &bfd_debug_network_cmd);
+
+ install_element(CONFIG_NODE, &bfd_debug_peer_cmd);
+ install_element(CONFIG_NODE, &bfd_debug_zebra_cmd);
+ install_element(CONFIG_NODE, &bfd_debug_network_cmd);
+
/* Install BFD node and commands. */
install_node(&bfd_node, bfdd_write_config);
install_default(BFD_NODE);
if (bs == NULL) {
bs = ptm_bfd_sess_new(&bpc);
if (bs == NULL) {
- zlog_debug(
- "ptm-add-dest: failed to create BFD session");
+ if (bglobal.debug_zebra)
+ zlog_debug(
+ "ptm-add-dest: failed to create BFD session");
return;
}
} else {
/* Find or start new BFD session. */
bs = bs_peer_find(&bpc);
if (bs == NULL) {
- zlog_debug("ptm-del-dest: failed to find BFD session");
+ if (bglobal.debug_zebra)
+ zlog_debug("ptm-del-dest: failed to find BFD session");
return;
}
pc = pc_lookup(pid);
if (pc == NULL) {
- zlog_debug("ptm-del-client: failed to find client: %u", pid);
+ if (bglobal.debug_zebra)
+ zlog_debug("ptm-del-client: failed to find client: %u",
+ pid);
return;
}
break;
default:
- zlog_debug("ptm-replay: invalid message type %u", rcmd);
+ if (bglobal.debug_zebra)
+ zlog_debug("ptm-replay: invalid message type %u", rcmd);
return -1;
}
static int bfd_ifp_destroy(struct interface *ifp)
{
+ if (bglobal.debug_zebra)
+ zlog_debug("zclient: delete interface %s", ifp->name);
+
bfdd_sessions_disable_interface(ifp);
return 0;
static int bfdd_interface_address_update(ZAPI_CALLBACK_ARGS)
{
struct connected *ifc;
+ char buf[64];
ifc = zebra_interface_address_read(cmd, zclient->ibuf, vrf_id);
if (ifc == NULL)
return 0;
+ if (bglobal.debug_zebra)
+ zlog_debug("zclient: %s local address %s",
+ cmd == ZEBRA_INTERFACE_ADDRESS_ADD ? "add"
+ : "delete",
+ prefix2str(ifc->address, buf, sizeof(buf)));
+
bfdd_sessions_enable_address(ifc);
return 0;
static int bfd_ifp_create(struct interface *ifp)
{
+ if (bglobal.debug_zebra)
+ zlog_debug("zclient: add interface %s", ifp->name);
+
bfdd_sessions_enable_interface(ifp);
return 0;