bgpd: Add bgp allow-martian-nexthop command

The command `debug bgp allow-martian` is not actually
a debug command it's a command that when entered allows
bgp to not reset a peering when a martian nexthop is
passed in the nlri.

Add the `bgp allow-martian-nexthop` command and allow it to be
used.

Signed-off-by: Donald Sharp <sharpd@nvidia.com>
This commit is contained in:
Donald Sharp 2022-04-25 16:30:36 -04:00
parent aaa331923d
commit 8666265e2e
5 changed files with 40 additions and 1 deletions

View File

@ -1603,11 +1603,12 @@ enum bgp_attr_parse_ret bgp_attr_nexthop_valid(struct peer *peer,
struct attr *attr) struct attr *attr)
{ {
in_addr_t nexthop_h; in_addr_t nexthop_h;
struct bgp *bgp = peer->bgp;
nexthop_h = ntohl(attr->nexthop.s_addr); nexthop_h = ntohl(attr->nexthop.s_addr);
if ((IPV4_NET0(nexthop_h) || IPV4_NET127(nexthop_h) || if ((IPV4_NET0(nexthop_h) || IPV4_NET127(nexthop_h) ||
!ipv4_unicast_valid(&attr->nexthop)) && !ipv4_unicast_valid(&attr->nexthop)) &&
!BGP_DEBUG(allow_martians, ALLOW_MARTIANS)) { !bgp->allow_martian) {
uint8_t data[7]; /* type(2) + length(1) + nhop(4) */ uint8_t data[7]; /* type(2) + length(1) + nhop(4) */
char buf[INET_ADDRSTRLEN]; char buf[INET_ADDRSTRLEN];

View File

@ -4423,6 +4423,24 @@ DEFUN (neighbor_remote_as,
return peer_remote_as_vty(vty, argv[idx_peer]->arg, return peer_remote_as_vty(vty, argv[idx_peer]->arg,
argv[idx_remote_as]->arg); argv[idx_remote_as]->arg);
} }
DEFPY (bgp_allow_martian,
bgp_allow_martian_cmd,
"[no]$no bgp allow-martian-nexthop",
NO_STR
BGP_STR
"Allow Martian nexthops to be received in the NLRI from a peer\n")
{
VTY_DECLVAR_CONTEXT(bgp, bgp);
if (no)
bgp->allow_martian = false;
else
bgp->allow_martian = true;
return CMD_SUCCESS;
}
/* Enable fast convergence of bgp sessions. If this is enabled, bgp /* Enable fast convergence of bgp sessions. If this is enabled, bgp
* sessions do not wait for hold timer expiry to bring down the sessions * sessions do not wait for hold timer expiry to bring down the sessions
* when nexthop becomes unreachable * when nexthop becomes unreachable
@ -17517,6 +17535,9 @@ int bgp_config_write(struct vty *vty)
if (CHECK_FLAG(bgp->flags, BGP_FLAG_SHUTDOWN)) if (CHECK_FLAG(bgp->flags, BGP_FLAG_SHUTDOWN))
vty_out(vty, " bgp shutdown\n"); vty_out(vty, " bgp shutdown\n");
if (bgp->allow_martian)
vty_out(vty, " bgp allow-martian-nexthop\n");
if (bgp->fast_convergence) if (bgp->fast_convergence)
vty_out(vty, " bgp fast-convergence\n"); vty_out(vty, " bgp fast-convergence\n");
@ -17860,6 +17881,8 @@ void bgp_vty_init(void)
install_element(CONFIG_NODE, &bgp_set_route_map_delay_timer_cmd); install_element(CONFIG_NODE, &bgp_set_route_map_delay_timer_cmd);
install_element(CONFIG_NODE, &no_bgp_set_route_map_delay_timer_cmd); install_element(CONFIG_NODE, &no_bgp_set_route_map_delay_timer_cmd);
install_element(BGP_NODE, &bgp_allow_martian_cmd);
/* bgp fast-convergence command */ /* bgp fast-convergence command */
install_element(BGP_NODE, &bgp_fast_convergence_cmd); install_element(BGP_NODE, &bgp_fast_convergence_cmd);
install_element(BGP_NODE, &no_bgp_fast_convergence_cmd); install_element(BGP_NODE, &no_bgp_fast_convergence_cmd);

View File

@ -3126,6 +3126,7 @@ static struct bgp *bgp_create(as_t *as, const char *name,
bgp_lock(bgp); bgp_lock(bgp);
bgp->allow_martian = false;
bgp_process_queue_init(bgp); bgp_process_queue_init(bgp);
bgp->heuristic_coalesce = true; bgp->heuristic_coalesce = true;
bgp->inst_type = inst_type; bgp->inst_type = inst_type;

View File

@ -770,6 +770,8 @@ struct bgp {
struct timeval ebgprequirespolicywarning; struct timeval ebgprequirespolicywarning;
#define FIFTEENMINUTE2USEC (int64_t)15 * 60 * 1000000 #define FIFTEENMINUTE2USEC (int64_t)15 * 60 * 1000000
bool allow_martian;
QOBJ_FIELDS; QOBJ_FIELDS;
}; };
DECLARE_QOBJ_TYPE(bgp); DECLARE_QOBJ_TYPE(bgp);

View File

@ -3365,6 +3365,12 @@ Debugging
Display Listen sockets and the vrf that created them. Useful for debugging of when Display Listen sockets and the vrf that created them. Useful for debugging of when
listen is not working and this is considered a developer debug statement. listen is not working and this is considered a developer debug statement.
.. clicmd:: debug bgp allow-martian
Enable or disable BGP accepting martian nexthops from a peer. Please note
this is not an actual debug command and this command is also being deprecated
and will be removed soon. The new command is :clicmd:`bgp allow-martian-nexthop`
.. clicmd:: debug bgp bfd .. clicmd:: debug bgp bfd
Enable or disable debugging for BFD events. This will show BFD integration Enable or disable debugging for BFD events. This will show BFD integration
@ -4006,6 +4012,12 @@ unless removed from the configuration with the negating command prior to the
configuration write operation. At this point in time non SAFI_UNICAST BGP configuration write operation. At this point in time non SAFI_UNICAST BGP
data is not properly withdrawn from zebra when this command is issued. data is not properly withdrawn from zebra when this command is issued.
.. clicmd:: bgp allow-martian-nexthop
When a peer receives a martian nexthop as part of the NLRI for a route
permit the nexthop to be used as such, instead of rejecting and resetting
the connection.
.. clicmd:: bgp send-extra-data zebra .. clicmd:: bgp send-extra-data zebra
This command turns on the ability of BGP to send extra data to zebra. Currently, This command turns on the ability of BGP to send extra data to zebra. Currently,