Merge pull request #15640 from opensourcerouting/fix/handling_dynamic_capability_mp_gr

bgpd: Fix errors handling for MP/GR capabilities as dynamic capability
This commit is contained in:
Donald Sharp 2024-04-05 13:42:03 -04:00 committed by GitHub
commit 959439f459
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -3734,6 +3734,7 @@ static int bgp_capability_msg_parse(struct peer *peer, uint8_t *pnt,
zlog_err("%pBP: Capability length error", peer); zlog_err("%pBP: Capability length error", peer);
bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE, bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_SUBCODE_UNSPECIFIC); BGP_NOTIFY_SUBCODE_UNSPECIFIC);
pnt += length;
return BGP_Stop; return BGP_Stop;
} }
action = *pnt; action = *pnt;
@ -3746,7 +3747,7 @@ static int bgp_capability_msg_parse(struct peer *peer, uint8_t *pnt,
action); action);
bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE, bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_SUBCODE_UNSPECIFIC); BGP_NOTIFY_SUBCODE_UNSPECIFIC);
return BGP_Stop; goto done;
} }
if (bgp_debug_neighbor_events(peer)) if (bgp_debug_neighbor_events(peer))
@ -3758,12 +3759,13 @@ static int bgp_capability_msg_parse(struct peer *peer, uint8_t *pnt,
zlog_err("%pBP: Capability length error", peer); zlog_err("%pBP: Capability length error", peer);
bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE, bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_SUBCODE_UNSPECIFIC); BGP_NOTIFY_SUBCODE_UNSPECIFIC);
pnt += length;
return BGP_Stop; return BGP_Stop;
} }
/* Ignore capability when override-capability is set. */ /* Ignore capability when override-capability is set. */
if (CHECK_FLAG(peer->flags, PEER_FLAG_OVERRIDE_CAPABILITY)) if (CHECK_FLAG(peer->flags, PEER_FLAG_OVERRIDE_CAPABILITY))
continue; goto done;
capability = lookup_msg(capcode_str, hdr->code, "Unknown"); capability = lookup_msg(capcode_str, hdr->code, "Unknown");
@ -3778,7 +3780,7 @@ static int bgp_capability_msg_parse(struct peer *peer, uint8_t *pnt,
peer, capability, peer, capability,
sizeof(struct capability_mp_data), sizeof(struct capability_mp_data),
hdr->length); hdr->length);
return BGP_Stop; goto done;
} }
memcpy(&mpc, pnt + 3, sizeof(struct capability_mp_data)); memcpy(&mpc, pnt + 3, sizeof(struct capability_mp_data));
@ -3793,7 +3795,7 @@ static int bgp_capability_msg_parse(struct peer *peer, uint8_t *pnt,
peer, capability, peer, capability,
iana_afi2str(pkt_afi), iana_afi2str(pkt_afi),
iana_safi2str(pkt_safi)); iana_safi2str(pkt_safi));
continue; goto done;
} }
/* Address family check. */ /* Address family check. */
@ -3820,7 +3822,7 @@ static int bgp_capability_msg_parse(struct peer *peer, uint8_t *pnt,
if (peer_active_nego(peer)) if (peer_active_nego(peer))
bgp_clear_route(peer, afi, safi); bgp_clear_route(peer, afi, safi);
else else
return BGP_Stop; goto done;
} }
break; break;
case CAPABILITY_CODE_RESTART: case CAPABILITY_CODE_RESTART:
@ -3830,7 +3832,7 @@ static int bgp_capability_msg_parse(struct peer *peer, uint8_t *pnt,
bgp_notify_send(peer->connection, bgp_notify_send(peer->connection,
BGP_NOTIFY_CEASE, BGP_NOTIFY_CEASE,
BGP_NOTIFY_SUBCODE_UNSPECIFIC); BGP_NOTIFY_SUBCODE_UNSPECIFIC);
return BGP_Stop; goto done;
} }
bgp_dynamic_capability_graceful_restart(pnt, action, bgp_dynamic_capability_graceful_restart(pnt, action,
@ -3866,7 +3868,7 @@ static int bgp_capability_msg_parse(struct peer *peer, uint8_t *pnt,
bgp_notify_send(peer->connection, bgp_notify_send(peer->connection,
BGP_NOTIFY_CEASE, BGP_NOTIFY_CEASE,
BGP_NOTIFY_SUBCODE_UNSPECIFIC); BGP_NOTIFY_SUBCODE_UNSPECIFIC);
return BGP_Stop; goto done;
} }
uint8_t role; uint8_t role;
@ -3888,6 +3890,7 @@ static int bgp_capability_msg_parse(struct peer *peer, uint8_t *pnt,
break; break;
} }
done:
pnt += hdr->length + 3; pnt += hdr->length + 3;
} }