Merge pull request #2856 from opensourcerouting/bfd-work

bfdd: bug fixes and improvements
This commit is contained in:
Donald Sharp 2018-08-16 18:48:51 -04:00 committed by GitHub
commit 018928cbaa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 344 additions and 70 deletions

View File

@ -185,10 +185,12 @@ void ptm_bfd_ses_up(struct bfd_session *bfd)
control_notify(bfd);
if (old_state != bfd->ses_state)
if (old_state != bfd->ses_state) {
bfd->stats.session_up++;
log_info("state-change: [%s] %s -> %s", bs_to_string(bfd),
state_list[old_state].str,
state_list[bfd->ses_state].str);
}
}
void ptm_bfd_ses_dn(struct bfd_session *bfd, uint8_t diag)
@ -212,11 +214,13 @@ void ptm_bfd_ses_dn(struct bfd_session *bfd, uint8_t diag)
if (BFD_CHECK_FLAG(bfd->flags, BFD_SESS_FLAG_ECHO_ACTIVE))
ptm_bfd_echo_stop(bfd, 0);
if (old_state != bfd->ses_state)
if (old_state != bfd->ses_state) {
bfd->stats.session_down++;
log_info("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));
}
}
static int ptm_bfd_get_vrf_name(char *port_name, char *vrf_name)

View File

@ -186,6 +186,9 @@ struct bfd_session_stats {
uint64_t tx_ctrl_pkt;
uint64_t rx_echo_pkt;
uint64_t tx_echo_pkt;
uint64_t session_up;
uint64_t session_down;
uint64_t znotification;
};
struct bfd_session_vxlan_info {

View File

@ -718,12 +718,6 @@ static ssize_t bfd_recv_ipv4(int sd, bool is_mhop, char *port, size_t portlen,
msghdr.msg_control = cmsgbuf;
msghdr.msg_controllen = sizeof(cmsgbuf);
/* Sanitize input/output. */
memset(port, 0, portlen);
memset(vrfname, 0, vrfnamelen);
memset(local, 0, sizeof(*local));
memset(peer, 0, sizeof(*peer));
mlen = recvmsg(sd, &msghdr, MSG_DONTWAIT);
if (mlen == -1) {
if (errno != EAGAIN)
@ -843,12 +837,6 @@ ssize_t bfd_recv_ipv6(int sd, bool is_mhop, char *port, size_t portlen,
msghdr6.msg_control = cmsgbuf6;
msghdr6.msg_controllen = sizeof(cmsgbuf6);
/* Sanitize input/output. */
memset(port, 0, portlen);
memset(vrfname, 0, vrfnamelen);
memset(local, 0, sizeof(*local));
memset(peer, 0, sizeof(*peer));
mlen = recvmsg(sd, &msghdr6, MSG_DONTWAIT);
if (mlen == -1) {
if (errno != EAGAIN)
@ -983,6 +971,12 @@ int bfd_recv_cb(struct thread *t)
return 0;
}
/* Sanitize input/output. */
memset(port, 0, sizeof(port));
memset(vrfname, 0, sizeof(vrfname));
memset(&local, 0, sizeof(local));
memset(&peer, 0, sizeof(peer));
/* Handle control packets. */
is_mhop = is_vxlan = false;
if (sd == bglobal.bg_shop || sd == bglobal.bg_mhop) {

View File

@ -58,12 +58,25 @@ static int bfd_configure_peer(struct bfd_peer_cfg *bpc, bool mhop,
const char *ifname, const char *vrfname,
char *ebuf, size_t ebuflen);
static void _display_peer_header(struct vty *vty, struct bfd_session *bs);
static struct json_object *__display_peer_json(struct bfd_session *bs);
static struct json_object *_peer_json_header(struct bfd_session *bs);
static void _display_peer_json(struct vty *vty, struct bfd_session *bs);
static void _display_peer(struct vty *vty, struct bfd_session *bs);
static void _display_all_peers(struct vty *vty, bool use_json);
static void _display_peer_iter(struct hash_backet *hb, void *arg);
static void _display_peer_json_iter(struct hash_backet *hb, void *arg);
static void _display_peer_counter(struct vty *vty, struct bfd_session *bs);
static struct json_object *__display_peer_counters_json(struct bfd_session *bs);
static void _display_peer_counters_json(struct vty *vty, struct bfd_session *bs);
static void _display_peer_counter_iter(struct hash_backet *hb, void *arg);
static void _display_peer_counter_json_iter(struct hash_backet *hb, void *arg);
static void _display_peers_counter(struct vty *vty, bool use_json);
static struct bfd_session *
_find_peer_or_error(struct vty *vty, int argc, struct cmd_token **argv,
const char *label, const char *peer_str,
const char *local_str, const char *ifname,
const char *vrfname);
/*
@ -353,11 +366,8 @@ DEFPY(bfd_no_peer, bfd_no_peer_cmd,
/*
* Show commands helper functions
*/
static void _display_peer(struct vty *vty, struct bfd_session *bs)
static void _display_peer_header(struct vty *vty, struct bfd_session *bs)
{
char buf[256];
time_t now;
if (BFD_CHECK_FLAG(bs->flags, BFD_SESS_FLAG_MH)) {
vty_out(vty, "\tpeer %s", satostr(&bs->mhop.peer));
vty_out(vty, " multihop");
@ -377,6 +387,14 @@ static void _display_peer(struct vty *vty, struct bfd_session *bs)
if (bs->pl)
vty_out(vty, "\t\tlabel: %s\n", bs->pl->pl_label);
}
static void _display_peer(struct vty *vty, struct bfd_session *bs)
{
char buf[256];
time_t now;
_display_peer_header(vty, bs);
vty_out(vty, "\t\tID: %u\n", bs->discrs.my_discr);
vty_out(vty, "\t\tRemote ID: %u\n", bs->discrs.remote_discr);
@ -418,7 +436,7 @@ static void _display_peer(struct vty *vty, struct bfd_session *bs)
vty_out(vty, "\t\t\tTransmission interval: %" PRIu32 "ms",
bs->timers.desired_min_tx / 1000);
if (bs->up_min_tx != bs->timers.desired_min_tx)
vty_out(vty, " (configured %" PRIu32 "ms)\n",
vty_out(vty, " (configured %" PRIu32 "ms)\n",
bs->up_min_tx / 1000);
else
vty_out(vty, "\n");
@ -441,7 +459,7 @@ static void _display_peer(struct vty *vty, struct bfd_session *bs)
vty_out(vty, "\n");
}
static struct json_object *__display_peer_json(struct bfd_session *bs)
static struct json_object *_peer_json_header(struct bfd_session *bs)
{
struct json_object *jo = json_object_new_object();
@ -465,6 +483,13 @@ static struct json_object *__display_peer_json(struct bfd_session *bs)
if (bs->pl)
json_object_string_add(jo, "label", bs->pl->pl_label);
return jo;
}
static struct json_object *__display_peer_json(struct bfd_session *bs)
{
struct json_object *jo = _peer_json_header(bs);
json_object_int_add(jo, "id", bs->discrs.my_discr);
json_object_int_add(jo, "remote-id", bs->discrs.remote_discr);
@ -550,6 +575,7 @@ static void _display_all_peers(struct vty *vty, bool use_json)
struct json_object *jo;
if (use_json == false) {
vty_out(vty, "BFD Peers:\n");
bfd_id_iterate(_display_peer_iter, vty);
return;
}
@ -561,37 +587,94 @@ static void _display_all_peers(struct vty *vty, bool use_json)
json_object_free(jo);
}
DEFPY(bfd_show_peers, bfd_show_peers_cmd, "show bfd peers [json]",
SHOW_STR
"Bidirection Forwarding Detection\n"
"BFD peers status\n"
JSON_STR)
static void _display_peer_counter(struct vty *vty, struct bfd_session *bs)
{
bool json = use_json(argc, argv);
_display_peer_header(vty, bs);
if (json) {
_display_all_peers(vty, true);
} else {
vty_out(vty, "BFD Peers:\n");
_display_all_peers(vty, false);
}
return CMD_SUCCESS;
vty_out(vty, "\t\tControl packet input: %" PRIu64 " packets\n",
bs->stats.rx_ctrl_pkt);
vty_out(vty, "\t\tControl packet output: %" PRIu64 " packets\n",
bs->stats.tx_ctrl_pkt);
vty_out(vty, "\t\tEcho packet input: %" PRIu64 " packets\n",
bs->stats.rx_echo_pkt);
vty_out(vty, "\t\tEcho packet output: %" PRIu64 " packets\n",
bs->stats.tx_echo_pkt);
vty_out(vty, "\t\tSession up events: %" PRIu64 "\n",
bs->stats.session_up);
vty_out(vty, "\t\tSession down events: %" PRIu64 "\n",
bs->stats.session_down);
vty_out(vty, "\t\tZebra notifications: %" PRIu64 "\n",
bs->stats.znotification);
vty_out(vty, "\n");
}
DEFPY(bfd_show_peer, bfd_show_peer_cmd,
"show bfd peer <WORD$label|<A.B.C.D|X:X::X:X>$peer [{multihop|local-address <A.B.C.D|X:X::X:X>$local|interface IFNAME$ifname|vrf NAME$vrfname}]> [json]",
SHOW_STR
"Bidirection Forwarding Detection\n"
"BFD peers status\n"
"Peer label\n"
PEER_IPV4_STR PEER_IPV6_STR
MHOP_STR
LOCAL_STR LOCAL_IPV4_STR LOCAL_IPV6_STR
INTERFACE_STR
LOCAL_INTF_STR
VRF_STR VRF_NAME_STR
JSON_STR)
static struct json_object *__display_peer_counters_json(struct bfd_session *bs)
{
struct json_object *jo = _peer_json_header(bs);
json_object_int_add(jo, "control-packet-input", bs->stats.rx_ctrl_pkt);
json_object_int_add(jo, "control-packet-output", bs->stats.tx_ctrl_pkt);
json_object_int_add(jo, "echo-packet-input", bs->stats.rx_echo_pkt);
json_object_int_add(jo, "echo-packet-output", bs->stats.tx_echo_pkt);
json_object_int_add(jo, "session-up", bs->stats.session_up);
json_object_int_add(jo, "session-down", bs->stats.session_down);
json_object_int_add(jo, "zebra-notifications", bs->stats.znotification);
return jo;
}
static void _display_peer_counters_json(struct vty *vty, struct bfd_session *bs)
{
struct json_object *jo = __display_peer_counters_json(bs);
vty_out(vty, "%s\n", json_object_to_json_string_ext(jo, 0));
json_object_free(jo);
}
static void _display_peer_counter_iter(struct hash_backet *hb, void *arg)
{
struct vty *vty = arg;
struct bfd_session *bs = hb->data;
_display_peer_counter(vty, bs);
}
static void _display_peer_counter_json_iter(struct hash_backet *hb, void *arg)
{
struct json_object *jo = arg, *jon = NULL;
struct bfd_session *bs = hb->data;
jon = __display_peer_counters_json(bs);
if (jon == NULL) {
log_warning("%s: not enough memory", __func__);
return;
}
json_object_array_add(jo, jon);
}
static void _display_peers_counter(struct vty *vty, bool use_json)
{
struct json_object *jo;
if (use_json == false) {
vty_out(vty, "BFD Peers:\n");
bfd_id_iterate(_display_peer_counter_iter, vty);
return;
}
jo = json_object_new_array();
bfd_id_iterate(_display_peer_counter_json_iter, jo);
vty_out(vty, "%s\n", json_object_to_json_string_ext(jo, 0));
json_object_free(jo);
}
static struct bfd_session *
_find_peer_or_error(struct vty *vty, int argc, struct cmd_token **argv,
const char *label, const char *peer_str,
const char *local_str, const char *ifname,
const char *vrfname)
{
int idx;
bool mhop;
@ -608,7 +691,7 @@ DEFPY(bfd_show_peer, bfd_show_peer_cmd,
bs = pl->pl_bs;
} else {
strtosa(peer_str, &psa);
if (local) {
if (local_str) {
strtosa(local_str, &lsa);
lsap = &lsa;
} else
@ -622,7 +705,7 @@ DEFPY(bfd_show_peer, bfd_show_peer_cmd,
!= 0) {
vty_out(vty, "%% Invalid peer configuration: %s\n",
errormsg);
return CMD_WARNING_CONFIG_FAILED;
return NULL;
}
bs = bs_peer_find(&bpc);
@ -634,15 +717,49 @@ DEFPY(bfd_show_peer, bfd_show_peer_cmd,
label ? label : peer_str);
if (ifname)
vty_out(vty, " interface %s", ifname);
if (local)
if (local_str)
vty_out(vty, " local-address %s", local_str);
if (vrfname)
vty_out(vty, " vrf %s", vrfname);
vty_out(vty, "'\n");
return CMD_WARNING_CONFIG_FAILED;
return NULL;
}
return bs;
}
/*
* Show commands.
*/
DEFPY(bfd_show_peers, bfd_show_peers_cmd, "show bfd peers [json]",
SHOW_STR
"Bidirection Forwarding Detection\n"
"BFD peers status\n" JSON_STR)
{
_display_all_peers(vty, use_json(argc, argv));
return CMD_SUCCESS;
}
DEFPY(bfd_show_peer, bfd_show_peer_cmd,
"show bfd peer <WORD$label|<A.B.C.D|X:X::X:X>$peer [{multihop|local-address <A.B.C.D|X:X::X:X>$local|interface IFNAME$ifname|vrf NAME$vrfname}]> [json]",
SHOW_STR
"Bidirection Forwarding Detection\n"
"BFD peers status\n"
"Peer label\n" PEER_IPV4_STR PEER_IPV6_STR MHOP_STR LOCAL_STR
LOCAL_IPV4_STR LOCAL_IPV6_STR INTERFACE_STR LOCAL_INTF_STR VRF_STR
VRF_NAME_STR JSON_STR)
{
struct bfd_session *bs;
/* Look up the BFD peer. */
bs = _find_peer_or_error(vty, argc, argv, label, peer_str, local_str,
ifname, vrfname);
if (bs == NULL)
return CMD_WARNING_CONFIG_FAILED;
if (use_json(argc, argv)) {
_display_peer_json(vty, bs);
} else {
@ -653,6 +770,54 @@ DEFPY(bfd_show_peer, bfd_show_peer_cmd,
return CMD_SUCCESS;
}
DEFPY(bfd_show_peer_counters, bfd_show_peer_counters_cmd,
"show bfd peer <WORD$label|<A.B.C.D|X:X::X:X>$peer [{multihop|local-address <A.B.C.D|X:X::X:X>$local|interface IFNAME$ifname|vrf NAME$vrfname}]> counters [json]",
SHOW_STR
"Bidirection Forwarding Detection\n"
"BFD peers status\n"
"Peer label\n"
PEER_IPV4_STR
PEER_IPV6_STR
MHOP_STR
LOCAL_STR
LOCAL_IPV4_STR
LOCAL_IPV6_STR
INTERFACE_STR
LOCAL_INTF_STR
VRF_STR
VRF_NAME_STR
"Show BFD peer counters information\n"
JSON_STR)
{
struct bfd_session *bs;
/* Look up the BFD peer. */
bs = _find_peer_or_error(vty, argc, argv, label, peer_str, local_str,
ifname, vrfname);
if (bs == NULL)
return CMD_WARNING_CONFIG_FAILED;
if (use_json(argc, argv))
_display_peer_counters_json(vty, bs);
else
_display_peer_counter(vty, bs);
return CMD_SUCCESS;
}
DEFPY(bfd_show_peers_counters, bfd_show_peers_counters_cmd,
"show bfd peers counters [json]",
SHOW_STR
"Bidirection Forwarding Detection\n"
"BFD peers status\n"
"Show BFD peer counters information\n"
JSON_STR)
{
_display_peers_counter(vty, use_json(argc, argv));
return CMD_SUCCESS;
}
/*
* Function definitions.
@ -847,6 +1012,8 @@ struct cmd_node bfd_peer_node = {
void bfdd_vty_init(void)
{
install_element(ENABLE_NODE, &bfd_show_peers_counters_cmd);
install_element(ENABLE_NODE, &bfd_show_peer_counters_cmd);
install_element(ENABLE_NODE, &bfd_show_peers_cmd);
install_element(ENABLE_NODE, &bfd_show_peer_cmd);
install_element(CONFIG_NODE, &bfd_enter_cmd);

View File

@ -514,7 +514,7 @@ skip_header:
if (bcb->bcb_left > 0)
goto schedule_next_read;
switch (bcm.bcm_type) {
switch (bcb->bcb_bcm->bcm_type) {
case BMT_REQUEST_ADD:
control_handle_request_add(bcs, bcb->bcb_bcm);
break;
@ -533,8 +533,8 @@ skip_header:
default:
log_debug("%s: unhandled message type: %d", __func__,
bcm.bcm_type);
control_response(bcs, bcm.bcm_id, BCM_RESPONSE_ERROR,
bcb->bcb_bcm->bcm_type);
control_response(bcs, bcb->bcb_bcm->bcm_id, BCM_RESPONSE_ERROR,
"invalid message type");
break;
}

View File

@ -155,6 +155,8 @@ int ptm_bfd_notify(struct bfd_session *bs)
struct stream *msg;
struct sockaddr_any sac;
bs->stats.znotification++;
/*
* Message format:
* - header: command, vrf
@ -274,7 +276,7 @@ static void _ptm_msg_read_address(struct stream *msg, struct sockaddr_any *sa)
return;
default:
log_warning("%s: invalid family: %d", __func__, family);
log_warning("ptm-read-address: invalid family: %d", family);
break;
}
@ -329,7 +331,7 @@ static int _ptm_msg_read(struct stream *msg, int command,
*pc = pc_new(pid);
if (*pc == NULL) {
log_debug("%s: failed to allocate memory", __func__);
log_debug("ptm-read: failed to allocate memory");
return -1;
}
@ -370,8 +372,8 @@ static int _ptm_msg_read(struct stream *msg, int command,
* structure, otherwise fail.
*/
STREAM_GETC(msg, ifnamelen);
if (ifnamelen > sizeof(bpc->bpc_localif)) {
log_error("%s: interface name is too big", __func__);
if (ifnamelen >= sizeof(bpc->bpc_localif)) {
log_error("ptm-read: interface name is too big");
return -1;
}
@ -386,8 +388,7 @@ static int _ptm_msg_read(struct stream *msg, int command,
if (bpc->bpc_local.sa_sin.sin_family != 0
&& (bpc->bpc_local.sa_sin.sin_family
!= bpc->bpc_peer.sa_sin.sin_family)) {
log_warning("%s: peer family doesn't match local type",
__func__);
log_warning("ptm-read: peer family doesn't match local type");
return -1;
}
@ -415,7 +416,7 @@ static void bfdd_dest_register(struct stream *msg)
if (bs == NULL) {
bs = ptm_bfd_sess_new(&bpc);
if (bs == NULL) {
log_debug("%s: failed to create BFD session", __func__);
log_debug("ptm-add-dest: failed to create BFD session");
return;
}
} else {
@ -428,7 +429,7 @@ static void bfdd_dest_register(struct stream *msg)
/* Create client peer notification register. */
pcn = pcn_new(pc, bs);
if (pcn == NULL) {
log_error("%s: failed to registrate notifications", __func__);
log_error("ptm-add-dest: failed to registrate notifications");
return;
}
@ -451,7 +452,7 @@ static void bfdd_dest_deregister(struct stream *msg)
/* Find or start new BFD session. */
bs = bs_peer_find(&bpc);
if (bs == NULL) {
log_debug("%s: failed to create BFD session", __func__);
log_debug("ptm-del-dest: failed to find BFD session");
return;
}
@ -474,14 +475,14 @@ static void bfdd_client_register(struct stream *msg)
pc = pc_new(pid);
if (pc == NULL) {
log_error("%s: failed to register client: %u", __func__, pid);
log_error("ptm-add-client: failed to register client: %u", pid);
return;
}
return;
stream_failure:
log_error("%s: failed to register client", __func__);
log_error("ptm-add-client: failed to register client");
}
/*
@ -498,7 +499,7 @@ static void bfdd_client_deregister(struct stream *msg)
pc = pc_lookup(pid);
if (pc == NULL) {
log_debug("%s: failed to find client: %u", __func__, pid);
log_debug("ptm-del-client: failed to find client: %u", pid);
return;
}
@ -507,7 +508,7 @@ static void bfdd_client_deregister(struct stream *msg)
return;
stream_failure:
log_error("%s: failed to deregister client", __func__);
log_error("ptm-del-client: failed to deregister client");
}
static int bfdd_replay(int cmd, struct zclient *zc, uint16_t len, vrf_id_t vid)
@ -533,14 +534,14 @@ static int bfdd_replay(int cmd, struct zclient *zc, uint16_t len, vrf_id_t vid)
break;
default:
log_debug("%s: invalid message type %u", __func__, rcmd);
log_debug("ptm-replay: invalid message type %u", rcmd);
return -1;
}
return 0;
stream_failure:
log_error("%s: failed to find command", __func__);
log_error("ptm-replay: failed to find command");
return -1;
}

View File

@ -38,7 +38,7 @@ may also be specified (:ref:`common-invocation-options`).
.. option:: --bfdctl <unix-socket>
Set the BFD daemon control socket location. If using a non-default
socket location.
socket location::
/usr/lib/frr/bfdd --bfdctl /tmp/bfdd.sock
@ -160,6 +160,8 @@ Peer Configurations
BGP BFD Configuration
---------------------
The following commands are available inside the BGP configuration node.
.. index:: neighbor <A.B.C.D|X:X::X:X|WORD> bfd
.. clicmd:: neighbor <A.B.C.D|X:X::X:X|WORD> bfd
@ -174,6 +176,66 @@ BGP BFD Configuration
Removes any notification registration for this neighbor.
.. _bfd-ospf-peer-config:
OSPF BFD Configuration
---------------------
The following commands are available inside the interface configuration node.
.. index:: ip ospf bfd
.. clicmd:: ip ospf bfd
Listen for BFD events on peers created on the interface. Every time
a new neighbor is found a BFD peer is created to monitor the link
status for fast convergence.
.. index:: no ip ospf bfd
.. clicmd:: no ip ospf bfd
Removes any notification registration for this interface peers.
.. _bfd-ospf6-peer-config:
OSPF6 BFD Configuration
-----------------------
The following commands are available inside the interface configuration node.
.. index:: ipv6 ospf6 bfd
.. clicmd:: ipv6 ospf6 bfd
Listen for BFD events on peers created on the interface. Every time
a new neighbor is found a BFD peer is created to monitor the link
status for fast convergence.
.. index:: no ipv6 ospf6 bfd
.. clicmd:: no ipv6 ospf6 bfd
Removes any notification registration for this interface peers.
.. _bfd-pim-peer-config:
PIM BFD Configuration
---------------------
The following commands are available inside the interface configuration node.
.. index:: ip pim bfd
.. clicmd:: ip pim bfd
Listen for BFD events on peers created on the interface. Every time
a new neighbor is found a BFD peer is created to monitor the link
status for fast convergence.
.. index:: no ip pim bfd
.. clicmd:: no ip pim bfd
Removes any notification registration for this interface peers.
.. _bfd-configuration:
Configuration
@ -300,3 +362,44 @@ You can inspect the current BFD peer status with the following commands:
Receive interval: 300ms
Transmission interval: 300ms
Echo transmission interval: 50ms
frr# show bfd peer 192.168.0.1 json
{"multihop":false,"peer":"192.168.0.1","id":1,"remote-id":1,"status":"up","uptime":161,"diagnostic":"ok","remote-diagnostic":"ok","receive-interval":300,"transmit-interval":300,"echo-interval":50,"remote-receive-interval":300,"remote-transmit-interval":300,"remote-echo-interval":50}
You can also inspect peer session counters with the following commands:
::
frr# show bfd peers counters
BFD Peers:
peer 192.168.2.1 interface r2-eth2
Control packet input: 28 packets
Control packet output: 28 packets
Echo packet input: 0 packets
Echo packet output: 0 packets
Session up events: 1
Session down events: 0
Zebra notifications: 2
peer 192.168.0.1
Control packet input: 54 packets
Control packet output: 103 packets
Echo packet input: 965 packets
Echo packet output: 966 packets
Session up events: 1
Session down events: 0
Zebra notifications: 4
frr# show bfd peer 192.168.0.1 counters
peer 192.168.0.1
Control packet input: 126 packets
Control packet output: 247 packets
Echo packet input: 2409 packets
Echo packet output: 2410 packets
Session up events: 1
Session down events: 0
Zebra notifications: 4
frr# show bfd peer 192.168.0.1 counters json
{"multihop":false,"peer":"192.168.0.1","control-packet-input":348,"control-packet-output":685,"echo-packet-input":6815,"echo-packet-output":6816,"session-up":1,"session-down":0,"zebra-notifications":4}

View File

@ -1289,6 +1289,7 @@ static void zebra_ptm_send_bfdd(struct stream *msg)
}
stream_free(msgc);
stream_free(msg);
}
static void zebra_ptm_send_clients(struct stream *msg)
@ -1329,6 +1330,7 @@ static void zebra_ptm_send_clients(struct stream *msg)
}
stream_free(msgc);
stream_free(msg);
}
static int _zebra_ptm_bfd_client_deregister(struct zserv *zs)