BGP: Log route updates that were changed to withdraws
Typical BGP error handling is treat-as-withdraw, where an invalid route is replaced with a withdraw. Log route network when it happens.
This commit is contained in:
parent
a9646efd40
commit
9dbb7eb6eb
3 changed files with 12 additions and 1 deletions
|
@ -1845,6 +1845,10 @@ bgp_rt_notify(struct proto *P, struct channel *C, net *n, rte *new, rte *old)
|
||||||
{
|
{
|
||||||
struct ea_list *attrs = bgp_update_attrs(p, c, new, new->attrs->eattrs, bgp_linpool2);
|
struct ea_list *attrs = bgp_update_attrs(p, c, new, new->attrs->eattrs, bgp_linpool2);
|
||||||
|
|
||||||
|
/* Error during attribute processing */
|
||||||
|
if (!attrs)
|
||||||
|
log(L_ERR "%s: Invalid route %N withdrawn", p->p.name, n->n.addr);
|
||||||
|
|
||||||
/* If attributes are invalid, we fail back to withdraw */
|
/* If attributes are invalid, we fail back to withdraw */
|
||||||
buck = attrs ? bgp_get_bucket(c, attrs) : bgp_get_withdraw_bucket(c);
|
buck = attrs ? bgp_get_bucket(c, attrs) : bgp_get_withdraw_bucket(c);
|
||||||
path = new->attrs->src->global_id;
|
path = new->attrs->src->global_id;
|
||||||
|
|
|
@ -423,6 +423,7 @@ struct bgp_parse_state {
|
||||||
int as4_session;
|
int as4_session;
|
||||||
int add_path;
|
int add_path;
|
||||||
int mpls;
|
int mpls;
|
||||||
|
int reach_nlri_step;
|
||||||
|
|
||||||
u32 attrs_seen[256/32];
|
u32 attrs_seen[256/32];
|
||||||
|
|
||||||
|
|
|
@ -1335,7 +1335,7 @@ bgp_update_next_hop_none(struct bgp_export_state *s, eattr *a, ea_list **to)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
bgp_rte_update(struct bgp_parse_state *s, net_addr *n, u32 path_id, rta *a0)
|
bgp_rte_update(struct bgp_parse_state *s, const net_addr *n, u32 path_id, rta *a0)
|
||||||
{
|
{
|
||||||
if (path_id != s->last_id)
|
if (path_id != s->last_id)
|
||||||
{
|
{
|
||||||
|
@ -1348,6 +1348,10 @@ bgp_rte_update(struct bgp_parse_state *s, net_addr *n, u32 path_id, rta *a0)
|
||||||
|
|
||||||
if (!a0)
|
if (!a0)
|
||||||
{
|
{
|
||||||
|
/* Route update was changed to withdraw */
|
||||||
|
if (s->err_withdraw && s->reach_nlri_step)
|
||||||
|
REPORT("Invalid route %N withdrawn", n);
|
||||||
|
|
||||||
/* Route withdraw */
|
/* Route withdraw */
|
||||||
rte_update3(&s->channel->c, n, NULL, s->last_src);
|
rte_update3(&s->channel->c, n, NULL, s->last_src);
|
||||||
return;
|
return;
|
||||||
|
@ -2543,6 +2547,8 @@ bgp_rx_update(struct bgp_conn *conn, byte *pkt, uint len)
|
||||||
if (s.mp_unreach_len)
|
if (s.mp_unreach_len)
|
||||||
bgp_decode_nlri(&s, s.mp_unreach_af, s.mp_unreach_nlri, s.mp_unreach_len, NULL, NULL, 0);
|
bgp_decode_nlri(&s, s.mp_unreach_af, s.mp_unreach_nlri, s.mp_unreach_len, NULL, NULL, 0);
|
||||||
|
|
||||||
|
s.reach_nlri_step = 1;
|
||||||
|
|
||||||
if (s.ip_reach_len)
|
if (s.ip_reach_len)
|
||||||
bgp_decode_nlri(&s, BGP_AF_IPV4, s.ip_reach_nlri, s.ip_reach_len,
|
bgp_decode_nlri(&s, BGP_AF_IPV4, s.ip_reach_nlri, s.ip_reach_len,
|
||||||
ea, s.ip_next_hop_data, s.ip_next_hop_len);
|
ea, s.ip_next_hop_data, s.ip_next_hop_len);
|
||||||
|
|
Loading…
Reference in a new issue