Skip to content

Commit aa50f5e

Browse files
committed
bfdd: Add BFD "log-session-changes" feature.
Add the BFD "log-session-changes" via the YANG and northbound API. Also add the configured value to show and operational state. Signed-off-by: Acee Lindem <[email protected]>
1 parent 4b0aeb6 commit aa50f5e

File tree

8 files changed

+183
-13
lines changed

8 files changed

+183
-13
lines changed

bfdd/bfd.c

+41
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ static void bfd_profile_set_default(struct bfd_profile *bp)
7979
bp->detection_multiplier = BFD_DEFDETECTMULT;
8080
bp->echo_mode = false;
8181
bp->passive = false;
82+
bp->log_session_changes = false;
8283
bp->minimum_ttl = BFD_DEF_MHOP_TTL;
8384
bp->min_echo_rx = BFD_DEF_REQ_MIN_ECHO_RX;
8485
bp->min_echo_tx = BFD_DEF_DES_MIN_ECHO_TX;
@@ -210,6 +211,12 @@ void bfd_session_apply(struct bfd_session *bs)
210211
else
211212
bfd_set_shutdown(bs, bs->peer_profile.admin_shutdown);
212213

214+
/* Toggle 'no log-session-changes' if default value. */
215+
if (bs->peer_profile.log_session_changes == false)
216+
bfd_set_log_session_changes(bs, bp->log_session_changes);
217+
else
218+
bfd_set_log_session_changes(bs, bs->peer_profile.log_session_changes);
219+
213220
/* If session interval changed negotiate new timers. */
214221
if (bs->ses_state == PTM_BFD_UP
215222
&& (bs->timers.desired_min_tx != min_tx
@@ -574,6 +581,9 @@ void ptm_bfd_sess_up(struct bfd_session *bfd)
574581
zlog_debug("state-change: [%s] %s -> %s",
575582
bs_to_string(bfd), state_list[old_state].str,
576583
state_list[bfd->ses_state].str);
584+
if (CHECK_FLAG(bfd->flags, BFD_SESS_FLAG_LOG_SESSION_CHANGES))
585+
zlog_notice("Session-Change: [%s] %s -> %s", bs_to_string(bfd),
586+
state_list[old_state].str, state_list[bfd->ses_state].str);
577587
}
578588
}
579589

@@ -621,6 +631,11 @@ void ptm_bfd_sess_dn(struct bfd_session *bfd, uint8_t diag)
621631
bs_to_string(bfd), state_list[old_state].str,
622632
state_list[bfd->ses_state].str,
623633
get_diag_str(bfd->local_diag));
634+
if (CHECK_FLAG(bfd->flags, BFD_SESS_FLAG_LOG_SESSION_CHANGES) &&
635+
old_state == PTM_BFD_UP)
636+
zlog_notice("Session-Change: [%s] %s -> %s reason:%s", bs_to_string(bfd),
637+
state_list[old_state].str, state_list[bfd->ses_state].str,
638+
get_diag_str(bfd->local_diag));
624639
}
625640

626641
/* clear peer's mac address */
@@ -651,6 +666,9 @@ void ptm_sbfd_sess_up(struct bfd_session *bfd)
651666
if (bglobal.debug_peer_event)
652667
zlog_info("state-change: [%s] %s -> %s", bs_to_string(bfd),
653668
state_list[old_state].str, state_list[bfd->ses_state].str);
669+
if (CHECK_FLAG(bfd->flags, BFD_SESS_FLAG_LOG_SESSION_CHANGES))
670+
zlog_notice("Session-Change: [%s] %s -> %s", bs_to_string(bfd),
671+
state_list[old_state].str, state_list[bfd->ses_state].str);
654672
}
655673
}
656674

@@ -693,6 +711,11 @@ void ptm_sbfd_init_sess_dn(struct bfd_session *bfd, uint8_t diag)
693711
zlog_debug("state-change: [%s] %s -> %s reason:%s", bs_to_string(bfd),
694712
state_list[old_state].str, state_list[bfd->ses_state].str,
695713
get_diag_str(bfd->local_diag));
714+
if (CHECK_FLAG(bfd->flags, BFD_SESS_FLAG_LOG_SESSION_CHANGES) &&
715+
old_state == PTM_BFD_UP)
716+
zlog_notice("Session-Change: [%s] %s -> %s reason:%s", bs_to_string(bfd),
717+
state_list[old_state].str, state_list[bfd->ses_state].str,
718+
get_diag_str(bfd->local_diag));
696719
}
697720
/* reset local address ,it might has been be changed after bfd is up*/
698721
//memset(&bfd->local_address, 0, sizeof(bfd->local_address));
@@ -721,6 +744,11 @@ void ptm_sbfd_echo_sess_dn(struct bfd_session *bfd, uint8_t diag)
721744
zlog_warn("state-change: [%s] %s -> %s reason:%s", bs_to_string(bfd),
722745
state_list[old_state].str, state_list[bfd->ses_state].str,
723746
get_diag_str(bfd->local_diag));
747+
if (CHECK_FLAG(bfd->flags, BFD_SESS_FLAG_LOG_SESSION_CHANGES) &&
748+
old_state == PTM_BFD_UP)
749+
zlog_notice("Session-Change: [%s] %s -> %s reason:%s", bs_to_string(bfd),
750+
state_list[old_state].str, state_list[bfd->ses_state].str,
751+
get_diag_str(bfd->local_diag));
724752
}
725753
}
726754

@@ -944,6 +972,11 @@ static void _bfd_session_update(struct bfd_session *bs,
944972
bs->peer_profile.echo_mode = bpc->bpc_echo;
945973
bfd_set_echo(bs, bpc->bpc_echo);
946974

975+
if (bpc->bpc_log_session_changes)
976+
SET_FLAG(bs->flags, BFD_SESS_FLAG_LOG_SESSION_CHANGES);
977+
else
978+
UNSET_FLAG(bs->flags, BFD_SESS_FLAG_LOG_SESSION_CHANGES);
979+
947980
/*
948981
* Shutdown needs to be the last in order to avoid timers enable when
949982
* the session is disabled.
@@ -1608,6 +1641,14 @@ void bfd_set_passive_mode(struct bfd_session *bs, bool passive)
16081641
}
16091642
}
16101643

1644+
void bfd_set_log_session_changes(struct bfd_session *bs, bool log_session_changes)
1645+
{
1646+
if (log_session_changes)
1647+
SET_FLAG(bs->flags, BFD_SESS_FLAG_LOG_SESSION_CHANGES);
1648+
else
1649+
UNSET_FLAG(bs->flags, BFD_SESS_FLAG_LOG_SESSION_CHANGES);
1650+
}
1651+
16111652
/*
16121653
* Helper functions.
16131654
*/

bfdd/bfd.h

+23-11
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ struct bfd_peer_cfg {
8484

8585
bool bpc_cbit;
8686
bool bpc_passive;
87+
bool bpc_log_session_changes;
8788

8889
bool bpc_has_profile;
8990
char bpc_profile[64];
@@ -224,21 +225,22 @@ enum bfd_diagnosticis {
224225
/* BFD session flags */
225226
enum bfd_session_flags {
226227
BFD_SESS_FLAG_NONE = 0,
227-
BFD_SESS_FLAG_ECHO = 1 << 0, /* BFD Echo functionality */
228-
BFD_SESS_FLAG_ECHO_ACTIVE = 1 << 1, /* BFD Echo Packets are being sent
228+
BFD_SESS_FLAG_ECHO = 1 << 0, /* BFD Echo functionality */
229+
BFD_SESS_FLAG_ECHO_ACTIVE = 1 << 1, /* BFD Echo Packets are being sent
229230
* actively
230231
*/
231-
BFD_SESS_FLAG_MH = 1 << 2, /* BFD Multi-hop session */
232-
BFD_SESS_FLAG_IPV6 = 1 << 4, /* BFD IPv6 session */
233-
BFD_SESS_FLAG_SEND_EVT_ACTIVE = 1 << 5, /* send event timer active */
234-
BFD_SESS_FLAG_SEND_EVT_IGNORE = 1 << 6, /* ignore send event when timer
232+
BFD_SESS_FLAG_MH = 1 << 2, /* BFD Multi-hop session */
233+
BFD_SESS_FLAG_IPV6 = 1 << 4, /* BFD IPv6 session */
234+
BFD_SESS_FLAG_SEND_EVT_ACTIVE = 1 << 5, /* send event timer active */
235+
BFD_SESS_FLAG_SEND_EVT_IGNORE = 1 << 6, /* ignore send event when timer
235236
* expires
236237
*/
237-
BFD_SESS_FLAG_SHUTDOWN = 1 << 7, /* disable BGP peer function */
238-
BFD_SESS_FLAG_CONFIG = 1 << 8, /* Session configured with bfd NB API */
239-
BFD_SESS_FLAG_CBIT = 1 << 9, /* CBIT is set */
240-
BFD_SESS_FLAG_PASSIVE = 1 << 10, /* Passive mode */
241-
BFD_SESS_FLAG_MAC_SET = 1 << 11, /* MAC of peer known */
238+
BFD_SESS_FLAG_SHUTDOWN = 1 << 7, /* disable BGP peer function */
239+
BFD_SESS_FLAG_CONFIG = 1 << 8, /* Session configured with bfd NB API */
240+
BFD_SESS_FLAG_CBIT = 1 << 9, /* CBIT is set */
241+
BFD_SESS_FLAG_PASSIVE = 1 << 10, /* Passive mode */
242+
BFD_SESS_FLAG_MAC_SET = 1 << 11, /* MAC of peer known */
243+
BFD_SESS_FLAG_LOG_SESSION_CHANGES = 1 << 12, /* Log session changes */
242244
};
243245

244246
enum bfd_mode_type {
@@ -297,6 +299,8 @@ struct bfd_profile {
297299
bool admin_shutdown;
298300
/** Passive mode. */
299301
bool passive;
302+
/** Log session changes. */
303+
bool log_session_changes;
300304
/** Minimum expected TTL value. */
301305
uint8_t minimum_ttl;
302306

@@ -682,6 +686,14 @@ void bfd_set_shutdown(struct bfd_session *bs, bool shutdown);
682686
*/
683687
void bfd_set_passive_mode(struct bfd_session *bs, bool passive);
684688

689+
/**
690+
* Set the BFD session to log or not log session changes.
691+
*
692+
* \param bs the BFD session.
693+
* \param log_session indicates whether or not to log session changes.
694+
*/
695+
void bfd_set_log_session_changes(struct bfd_session *bs, bool log_session);
696+
685697
/**
686698
* Picks the BFD session configuration from the appropriated source:
687699
* if using the default peer configuration prefer profile (if it exists),

bfdd/bfdd_cli.c

+20
Original file line numberDiff line numberDiff line change
@@ -754,6 +754,21 @@ void bfd_cli_show_passive(struct vty *vty, const struct lyd_node *dnode,
754754
yang_dnode_get_bool(dnode, NULL) ? "" : "no ");
755755
}
756756

757+
DEFPY_YANG(bfd_peer_log_session_changes, bfd_peer_log_session_changes_cmd,
758+
"[no] log-session-changes",
759+
NO_STR
760+
"Log Up/Down changes for the session\n")
761+
{
762+
nb_cli_enqueue_change(vty, "./log-session-changes", NB_OP_MODIFY, no ? "false" : "true");
763+
return nb_cli_apply_changes(vty, NULL);
764+
}
765+
766+
void bfd_cli_show_log_session_changes(struct vty *vty, const struct lyd_node *dnode,
767+
bool show_defaults)
768+
{
769+
vty_out(vty, " %slog-session-changes\n", yang_dnode_get_bool(dnode, NULL) ? "" : "no ");
770+
}
771+
757772
DEFPY_YANG(
758773
bfd_peer_minimum_ttl, bfd_peer_minimum_ttl_cmd,
759774
"[no] minimum-ttl (1-254)$ttl",
@@ -1063,6 +1078,9 @@ ALIAS_YANG(bfd_peer_passive, bfd_profile_passive_cmd,
10631078
NO_STR
10641079
"Don't attempt to start sessions\n")
10651080

1081+
ALIAS_YANG(bfd_peer_log_session_changes, bfd_profile_log_session_changes_cmd,
1082+
"[no] log-session-changes", NO_STR "Log Up/Down session changes in the profile\n")
1083+
10661084
ALIAS_YANG(bfd_peer_minimum_ttl, bfd_profile_minimum_ttl_cmd,
10671085
"[no] minimum-ttl (1-254)$ttl",
10681086
NO_STR
@@ -1329,6 +1347,7 @@ bfdd_cli_init(void)
13291347
install_element(BFD_PEER_NODE, &bfd_peer_echo_receive_interval_cmd);
13301348
install_element(BFD_PEER_NODE, &bfd_peer_profile_cmd);
13311349
install_element(BFD_PEER_NODE, &bfd_peer_passive_cmd);
1350+
install_element(BFD_PEER_NODE, &bfd_peer_log_session_changes_cmd);
13321351
install_element(BFD_PEER_NODE, &bfd_peer_minimum_ttl_cmd);
13331352
install_element(BFD_PEER_NODE, &no_bfd_peer_minimum_ttl_cmd);
13341353

@@ -1350,6 +1369,7 @@ bfdd_cli_init(void)
13501369
install_element(BFD_PROFILE_NODE, &bfd_profile_echo_transmit_interval_cmd);
13511370
install_element(BFD_PROFILE_NODE, &bfd_profile_echo_receive_interval_cmd);
13521371
install_element(BFD_PROFILE_NODE, &bfd_profile_passive_cmd);
1372+
install_element(BFD_PROFILE_NODE, &bfd_profile_log_session_changes_cmd);
13531373
install_element(BFD_PROFILE_NODE, &bfd_profile_minimum_ttl_cmd);
13541374
install_element(BFD_PROFILE_NODE, &no_bfd_profile_minimum_ttl_cmd);
13551375
}

bfdd/bfdd_nb.c

+35
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,13 @@ const struct frr_yang_module_info frr_bfdd_info = {
7070
.cli_show = bfd_cli_show_passive,
7171
}
7272
},
73+
{
74+
.xpath = "/frr-bfdd:bfdd/bfd/profile/log-session-changes",
75+
.cbs = {
76+
.modify = bfdd_bfd_profile_log_session_changes_modify,
77+
.cli_show = bfd_cli_show_log_session_changes,
78+
}
79+
},
7380
{
7481
.xpath = "/frr-bfdd:bfdd/bfd/profile/minimum-ttl",
7582
.cbs = {
@@ -160,6 +167,13 @@ const struct frr_yang_module_info frr_bfdd_info = {
160167
.cli_show = bfd_cli_show_passive,
161168
}
162169
},
170+
{
171+
.xpath = "/frr-bfdd:bfdd/bfd/sessions/single-hop/log-session-changes",
172+
.cbs = {
173+
.modify = bfdd_bfd_sessions_single_hop_log_session_changes_modify,
174+
.cli_show = bfd_cli_show_log_session_changes,
175+
}
176+
},
163177
{
164178
.xpath = "/frr-bfdd:bfdd/bfd/sessions/single-hop/echo-mode",
165179
.cbs = {
@@ -356,6 +370,13 @@ const struct frr_yang_module_info frr_bfdd_info = {
356370
.cli_show = bfd_cli_show_passive,
357371
}
358372
},
373+
{
374+
.xpath = "/frr-bfdd:bfdd/bfd/sessions/multi-hop/log-session-changes",
375+
.cbs = {
376+
.modify = bfdd_bfd_sessions_single_hop_log_session_changes_modify,
377+
.cli_show = bfd_cli_show_log_session_changes,
378+
}
379+
},
359380
{
360381
.xpath = "/frr-bfdd:bfdd/bfd/sessions/multi-hop/minimum-ttl",
361382
.cbs = {
@@ -572,6 +593,13 @@ const struct frr_yang_module_info frr_bfdd_info = {
572593
.cli_show = bfd_cli_show_passive,
573594
}
574595
},
596+
{
597+
.xpath = "/frr-bfdd:bfdd/bfd/sessions/sbfd-echo/log-session-changes",
598+
.cbs = {
599+
.modify = bfdd_bfd_sessions_single_hop_log_session_changes_modify,
600+
.cli_show = bfd_cli_show_log_session_changes,
601+
}
602+
},
575603
{
576604
.xpath = "/frr-bfdd:bfdd/bfd/sessions/sbfd-echo/bfd-mode",
577605
.cbs = {
@@ -788,6 +816,13 @@ const struct frr_yang_module_info frr_bfdd_info = {
788816
.cli_show = bfd_cli_show_passive,
789817
}
790818
},
819+
{
820+
.xpath = "/frr-bfdd:bfdd/bfd/sessions/sbfd-init/log-session-changes",
821+
.cbs = {
822+
.modify = bfdd_bfd_sessions_single_hop_log_session_changes_modify,
823+
.cli_show = bfd_cli_show_log_session_changes,
824+
}
825+
},
791826
{
792827
.xpath = "/frr-bfdd:bfdd/bfd/sessions/sbfd-init/bfd-mode",
793828
.cbs = {

bfdd/bfdd_nb.h

+4
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ int bfdd_bfd_profile_required_receive_interval_modify(
2424
struct nb_cb_modify_args *args);
2525
int bfdd_bfd_profile_administrative_down_modify(struct nb_cb_modify_args *args);
2626
int bfdd_bfd_profile_passive_mode_modify(struct nb_cb_modify_args *args);
27+
int bfdd_bfd_profile_log_session_changes_modify(struct nb_cb_modify_args *args);
2728
int bfdd_bfd_profile_minimum_ttl_modify(struct nb_cb_modify_args *args);
2829
int bfdd_bfd_profile_echo_mode_modify(struct nb_cb_modify_args *args);
2930
int bfdd_bfd_profile_desired_echo_transmission_interval_modify(
@@ -54,6 +55,7 @@ int bfdd_bfd_sessions_single_hop_administrative_down_modify(
5455
struct nb_cb_modify_args *args);
5556
int bfdd_bfd_sessions_single_hop_passive_mode_modify(
5657
struct nb_cb_modify_args *args);
58+
int bfdd_bfd_sessions_single_hop_log_session_changes_modify(struct nb_cb_modify_args *args);
5759
int bfdd_bfd_sessions_single_hop_echo_mode_modify(
5860
struct nb_cb_modify_args *args);
5961
int bfdd_bfd_sessions_single_hop_desired_echo_transmission_interval_modify(
@@ -229,6 +231,8 @@ void bfd_cli_peer_profile_show(struct vty *vty, const struct lyd_node *dnode,
229231
bool show_defaults);
230232
void bfd_cli_show_passive(struct vty *vty, const struct lyd_node *dnode,
231233
bool show_defaults);
234+
void bfd_cli_show_log_session_changes(struct vty *vty, const struct lyd_node *dnode,
235+
bool show_defaults);
232236
void bfd_cli_show_minimum_ttl(struct vty *vty, const struct lyd_node *dnode,
233237
bool show_defaults);
234238

bfdd/bfdd_nb_config.c

+49
Original file line numberDiff line numberDiff line change
@@ -595,6 +595,23 @@ int bfdd_bfd_profile_passive_mode_modify(struct nb_cb_modify_args *args)
595595
return NB_OK;
596596
}
597597

598+
/*
599+
* XPath: /frr-bfdd:bfdd/bfd/profile/log-session-changes
600+
*/
601+
int bfdd_bfd_profile_log_session_changes_modify(struct nb_cb_modify_args *args)
602+
{
603+
struct bfd_profile *bp;
604+
605+
if (args->event != NB_EV_APPLY)
606+
return NB_OK;
607+
608+
bp = nb_running_get_entry(args->dnode, NULL, true);
609+
bp->log_session_changes = yang_dnode_get_bool(args->dnode, NULL);
610+
bfd_profile_update(bp);
611+
612+
return NB_OK;
613+
}
614+
598615
/*
599616
* XPath: /frr-bfdd:bfdd/bfd/profile/minimum-ttl
600617
*/
@@ -903,6 +920,38 @@ int bfdd_bfd_sessions_single_hop_passive_mode_modify(
903920
return NB_OK;
904921
}
905922

923+
/*
924+
* XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/log-session-changes
925+
* /frr-bfdd:bfdd/bfd/sessions/multi-hop/log-session-changes
926+
* /frr-bfdd:bfdd/bfd/sessions/sbfd_echo/log-session-changes
927+
* /frr-bfdd:bfdd/bfd/sessions/sbfd_init/log-session-changes
928+
*/
929+
int bfdd_bfd_sessions_single_hop_log_session_changes_modify(struct nb_cb_modify_args *args)
930+
{
931+
struct bfd_session *bs;
932+
bool log_session_changes;
933+
934+
switch (args->event) {
935+
case NB_EV_VALIDATE:
936+
case NB_EV_PREPARE:
937+
return NB_OK;
938+
939+
case NB_EV_APPLY:
940+
break;
941+
942+
case NB_EV_ABORT:
943+
return NB_OK;
944+
}
945+
946+
log_session_changes = yang_dnode_get_bool(args->dnode, NULL);
947+
948+
bs = nb_running_get_entry(args->dnode, NULL, true);
949+
bs->peer_profile.log_session_changes = log_session_changes;
950+
bfd_session_apply(bs);
951+
952+
return NB_OK;
953+
}
954+
906955
/*
907956
* XPath: /frr-bfdd:bfdd/bfd/sessions/sbfd-init/bfd-mode
908957
* /frr-bfdd:bfdd/bfd/sessions/sbfd-echo/bfd-mode

0 commit comments

Comments
 (0)