forked from Mirror/frr
bgpd: add [no]neighbor capability fqdn command
cisco routers are not dealing fairly whith unsupported capabilities. When a cisco router receive an unsupported capabilities it reset the negociation without notifying the unmatching capability as described in RFC2842. Cisco suggest the use of neighbor x.x.x.x capability fqdn to avoid the use of fqdn in open message. this new command is to remove the use of fqdn capability in the open message with the peer "x.x.x.x". Link: https://www.cisco.com/c/en/us/support/docs/ip/border-gateway-protocol-bgp/116189-problemsolution-technology-00.pdf Signed-off-by: Francois Dumontet <francois.dumontet@6wind.com>
This commit is contained in:
parent
14c7797b72
commit
e146ea53ef
|
@ -1897,8 +1897,9 @@ uint16_t bgp_open_capability(struct stream *s, struct peer *peer,
|
|||
stream_putc(s, CAPABILITY_CODE_DYNAMIC_LEN);
|
||||
}
|
||||
|
||||
/* Hostname capability */
|
||||
if (cmd_hostname_get()) {
|
||||
/* FQDN capability */
|
||||
if (CHECK_FLAG(peer->flags, PEER_FLAG_CAPABILITY_FQDN)
|
||||
&& cmd_hostname_get()) {
|
||||
SET_FLAG(peer->cap, PEER_CAP_HOSTNAME_ADV);
|
||||
stream_putc(s, BGP_OPEN_OPT_CAP);
|
||||
rcapp = stream_get_endp(s); /* Ptr to length placeholder */
|
||||
|
|
|
@ -5735,6 +5735,30 @@ DEFUN (no_neighbor_dont_capability_negotiate,
|
|||
PEER_FLAG_DONT_CAPABILITY);
|
||||
}
|
||||
|
||||
/* neighbor capability fqdn */
|
||||
DEFPY (neighbor_capability_fqdn,
|
||||
neighbor_capability_fqdn_cmd,
|
||||
"[no$no] neighbor <A.B.C.D|X:X::X:X|WORD>$neighbor capability fqdn",
|
||||
NO_STR
|
||||
NEIGHBOR_STR
|
||||
NEIGHBOR_ADDR_STR2
|
||||
"Advertise capability to the peer\n"
|
||||
"Advertise fqdn capability to the peer\n")
|
||||
{
|
||||
struct peer *peer;
|
||||
|
||||
peer = peer_and_group_lookup_vty(vty, neighbor);
|
||||
if (!peer)
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
|
||||
if (no)
|
||||
return peer_flag_unset_vty(vty, neighbor,
|
||||
PEER_FLAG_CAPABILITY_FQDN);
|
||||
else
|
||||
return peer_flag_set_vty(vty, neighbor,
|
||||
PEER_FLAG_CAPABILITY_FQDN);
|
||||
}
|
||||
|
||||
/* neighbor capability extended next hop encoding */
|
||||
DEFUN (neighbor_capability_enhe,
|
||||
neighbor_capability_enhe_cmd,
|
||||
|
@ -18189,6 +18213,12 @@ static void bgp_config_write_peer_global(struct vty *vty, struct bgp *bgp,
|
|||
if (peergroup_flag_check(peer, PEER_FLAG_DONT_CAPABILITY))
|
||||
vty_out(vty, " neighbor %s dont-capability-negotiate\n", addr);
|
||||
|
||||
/* capability fqdn */
|
||||
if (peergroup_flag_check(peer, PEER_FLAG_CAPABILITY_FQDN))
|
||||
vty_out(vty,
|
||||
" no neighbor %s capability fqdn\n",
|
||||
addr);
|
||||
|
||||
/* override-capability */
|
||||
if (peergroup_flag_check(peer, PEER_FLAG_OVERRIDE_CAPABILITY))
|
||||
vty_out(vty, " neighbor %s override-capability\n", addr);
|
||||
|
@ -20525,6 +20555,9 @@ void bgp_vty_init(void)
|
|||
install_element(BGP_NODE, &neighbor_dont_capability_negotiate_cmd);
|
||||
install_element(BGP_NODE, &no_neighbor_dont_capability_negotiate_cmd);
|
||||
|
||||
/* "neighbor capability fqdn" command. */
|
||||
install_element(BGP_NODE, &neighbor_capability_fqdn_cmd);
|
||||
|
||||
/* "neighbor ebgp-multihop" commands. */
|
||||
install_element(BGP_NODE, &neighbor_ebgp_multihop_cmd);
|
||||
install_element(BGP_NODE, &neighbor_ebgp_multihop_ttl_cmd);
|
||||
|
|
|
@ -1535,6 +1535,9 @@ struct peer *peer_new(struct bgp *bgp)
|
|||
if (CHECK_FLAG(bgp->flags, BGP_FLAG_ENFORCE_FIRST_AS))
|
||||
SET_FLAG(peer->flags, PEER_FLAG_ENFORCE_FIRST_AS);
|
||||
|
||||
SET_FLAG(peer->flags_invert, PEER_FLAG_CAPABILITY_FQDN);
|
||||
SET_FLAG(peer->flags, PEER_FLAG_CAPABILITY_FQDN);
|
||||
|
||||
/* Initialize per peer bgp GR FSM */
|
||||
bgp_peer_gr_init(peer);
|
||||
|
||||
|
@ -4571,6 +4574,7 @@ static const struct peer_flag_action peer_flag_action_list[] = {
|
|||
{PEER_FLAG_AIGP, 0, peer_change_none},
|
||||
{PEER_FLAG_GRACEFUL_SHUTDOWN, 0, peer_change_none},
|
||||
{PEER_FLAG_CAPABILITY_SOFT_VERSION, 0, peer_change_none},
|
||||
{PEER_FLAG_CAPABILITY_FQDN, 0, peer_change_reset},
|
||||
{0, 0, 0}};
|
||||
|
||||
static const struct peer_flag_action peer_af_flag_action_list[] = {
|
||||
|
|
|
@ -1460,6 +1460,7 @@ struct peer {
|
|||
#define PEER_FLAG_AIGP (1ULL << 34)
|
||||
#define PEER_FLAG_GRACEFUL_SHUTDOWN (1ULL << 35)
|
||||
#define PEER_FLAG_CAPABILITY_SOFT_VERSION (1ULL << 36)
|
||||
#define PEER_FLAG_CAPABILITY_FQDN (1ULL << 37) /* fqdn capability */
|
||||
|
||||
/*
|
||||
*GR-Disabled mode means unset PEER_FLAG_GRACEFUL_RESTART
|
||||
|
|
|
@ -282,6 +282,13 @@ static struct test_peer_attr test_peer_attrs[] = {
|
|||
.u.flag = PEER_FLAG_DONT_CAPABILITY,
|
||||
.type = PEER_AT_GLOBAL_FLAG,
|
||||
},
|
||||
{
|
||||
.cmd = "capability fqdn",
|
||||
.u.flag = PEER_FLAG_CAPABILITY_FQDN,
|
||||
.type = PEER_AT_GLOBAL_FLAG,
|
||||
.o.invert_peer = true,
|
||||
.o.invert_group = true,
|
||||
},
|
||||
{
|
||||
.cmd = "local-as",
|
||||
.peer_cmd = "local-as 1",
|
||||
|
|
|
@ -15,6 +15,7 @@ TestFlag.okfail("peer\\capability extended-nexthop")
|
|||
TestFlag.okfail("peer\\description")
|
||||
TestFlag.okfail("peer\\disable-connected-check")
|
||||
TestFlag.okfail("peer\\dont-capability-negotiate")
|
||||
TestFlag.okfail("peer\\capability fqdn")
|
||||
TestFlag.okfail("peer\\local-as")
|
||||
TestFlag.okfail("peer\\local-as 1 no-prepend")
|
||||
TestFlag.okfail("peer\\local-as 1 no-prepend replace-as")
|
||||
|
|
Loading…
Reference in a new issue