Skip to content

Commit

Permalink
bgpd: Add clear bgp capabilities command to resend some dynamic cap…
Browse files Browse the repository at this point in the history
…abilities

For instance, it's not possible to resend FQDN capability without resetting
the session, so let's create some more elegant way to do that.

Signed-off-by: Donatas Abraitis <[email protected]>
  • Loading branch information
ton31337 committed Oct 12, 2023
1 parent 90c844f commit c937f17
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 4 deletions.
9 changes: 6 additions & 3 deletions bgpd/bgp_vty.c
Original file line number Diff line number Diff line change
Expand Up @@ -10546,7 +10546,7 @@ static int bgp_clear_prefix(struct vty *vty, const char *view_name,
/* one clear bgp command to rule them all */
DEFUN (clear_ip_bgp_all,
clear_ip_bgp_all_cmd,
"clear [ip] bgp [<view|vrf> VIEWVRFNAME] [<ipv4|ipv6|l2vpn> [<unicast|multicast|vpn|labeled-unicast|flowspec|evpn>]] <*|A.B.C.D$neighbor|X:X::X:X$neighbor|WORD$neighbor|ASNUM|external|peer-group PGNAME> [<soft [<in|out>]|in [prefix-filter]|out|message-stats>]",
"clear [ip] bgp [<view|vrf> VIEWVRFNAME] [<ipv4|ipv6|l2vpn> [<unicast|multicast|vpn|labeled-unicast|flowspec|evpn>]] <*|A.B.C.D$neighbor|X:X::X:X$neighbor|WORD$neighbor|ASNUM|external|peer-group PGNAME> [<soft [<in|out>]|in [prefix-filter]|out|message-stats|capabilities>]",
CLEAR_STR
IP_STR
BGP_STR
Expand All @@ -10569,7 +10569,8 @@ DEFUN (clear_ip_bgp_all,
BGP_SOFT_IN_STR
"Push out prefix-list ORF and do inbound soft reconfig\n"
BGP_SOFT_OUT_STR
"Reset message statistics\n")
"Reset message statistics\n"
"Resend capabilities\n")
{
char *vrf = NULL;

Expand Down Expand Up @@ -10626,7 +10627,7 @@ DEFUN (clear_ip_bgp_all,
clr_sort = clear_external;
}

/* [<soft [<in|out>]|in [prefix-filter]|out|message-stats>] */
/* [<soft [<in|out>]|in [prefix-filter]|out|message-stats|capabilities>] */
if (argv_find(argv, argc, "soft", &idx)) {
if (argv_find(argv, argc, "in", &idx)
|| argv_find(argv, argc, "out", &idx))
Expand All @@ -10643,6 +10644,8 @@ DEFUN (clear_ip_bgp_all,
clr_type = BGP_CLEAR_SOFT_OUT;
} else if (argv_find(argv, argc, "message-stats", &idx)) {
clr_type = BGP_CLEAR_MESSAGE_STATS;
} else if (argv_find(argv, argc, "capabilities", &idx)) {
clr_type = BGP_CLEAR_CAPABILITIES;
} else
clr_type = BGP_CLEAR_SOFT_NONE;

Expand Down
13 changes: 13 additions & 0 deletions bgpd/bgpd.c
Original file line number Diff line number Diff line change
Expand Up @@ -8025,6 +8025,16 @@ static void peer_reset_message_stats(struct peer *peer)
}
}

/* Helper function to resend some BGP capabilities that are uncontrolled.
* For instance, FQDN capability, that can't be turned off, but let's say
* we changed the hostname, we need to resend it.
*/
static void peer_clear_capabilities(struct peer *peer, afi_t afi, safi_t safi)
{
bgp_capability_send(peer, afi, safi, CAPABILITY_CODE_FQDN,
CAPABILITY_ACTION_SET);
}

/*
* If peer clear is invoked in a loop for all peers on the BGP instance,
* it may end up freeing the doppelganger, and if this was the next node
Expand Down Expand Up @@ -8133,6 +8143,9 @@ int peer_clear_soft(struct peer *peer, afi_t afi, safi_t safi,
if (stype == BGP_CLEAR_MESSAGE_STATS)
peer_reset_message_stats(peer);

if (stype == BGP_CLEAR_CAPABILITIES)
peer_clear_capabilities(peer, afi, safi);

return 0;
}

Expand Down
3 changes: 2 additions & 1 deletion bgpd/bgpd.h
Original file line number Diff line number Diff line change
Expand Up @@ -2073,7 +2073,8 @@ enum bgp_clear_type {
BGP_CLEAR_SOFT_IN,
BGP_CLEAR_SOFT_BOTH,
BGP_CLEAR_SOFT_IN_ORF_PREFIX,
BGP_CLEAR_MESSAGE_STATS
BGP_CLEAR_MESSAGE_STATS,
BGP_CLEAR_CAPABILITIES,
};

/* Macros. */
Expand Down

0 comments on commit c937f17

Please sign in to comment.