mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-11-08 12:18:42 +00:00
BGP: Improve bgp_create_update_bmp()
Fix issue with missing AF cap (e.g. IPv4 unicast when no capabilities are announced). Add Linpool save/restore action similar to bgp_create_update(). Based on patch from Michal Zagorski <mzagorsk@akamai.com> co-authored with Pawel Maslanka <pmaslank@akamai.com>. Thanks!
This commit is contained in:
parent
aa3c35498d
commit
c1821a9aba
@ -2424,15 +2424,20 @@ bgp_create_update_bmp(struct bgp_channel *c, byte *buf, struct bgp_bucket *buck,
|
|||||||
{
|
{
|
||||||
struct bgp_proto *p = (void *) c->c.proto;
|
struct bgp_proto *p = (void *) c->c.proto;
|
||||||
byte *end = buf + (BGP_MAX_EXT_MSG_LENGTH - BGP_HEADER_LENGTH);
|
byte *end = buf + (BGP_MAX_EXT_MSG_LENGTH - BGP_HEADER_LENGTH);
|
||||||
|
byte *res = NULL;
|
||||||
/* FIXME: must be a bit shorter */
|
/* FIXME: must be a bit shorter */
|
||||||
|
|
||||||
|
struct lp_state tmpp;
|
||||||
|
lp_save(tmp_linpool, &tmpp);
|
||||||
|
|
||||||
struct bgp_caps *peer = p->conn->remote_caps;
|
struct bgp_caps *peer = p->conn->remote_caps;
|
||||||
const struct bgp_af_caps *rem = bgp_find_af_caps(peer, c->afi);
|
const struct bgp_af_caps *rem = bgp_find_af_caps(peer, c->afi);
|
||||||
|
|
||||||
struct bgp_write_state s = {
|
struct bgp_write_state s = {
|
||||||
.proto = p,
|
.proto = p,
|
||||||
.channel = c,
|
.channel = c,
|
||||||
.pool = tmp_linpool,
|
.pool = tmp_linpool,
|
||||||
.mp_reach = (c->afi != BGP_AF_IPV4) || rem->ext_next_hop,
|
.mp_reach = (c->afi != BGP_AF_IPV4) || (rem && rem->ext_next_hop),
|
||||||
.as4_session = 1,
|
.as4_session = 1,
|
||||||
.add_path = c->add_path_rx,
|
.add_path = c->add_path_rx,
|
||||||
.mpls = c->desc->mpls,
|
.mpls = c->desc->mpls,
|
||||||
@ -2441,16 +2446,20 @@ bgp_create_update_bmp(struct bgp_channel *c, byte *buf, struct bgp_bucket *buck,
|
|||||||
|
|
||||||
if (!update)
|
if (!update)
|
||||||
{
|
{
|
||||||
return !s.mp_reach ?
|
res = !s.mp_reach ?
|
||||||
bgp_create_ip_unreach(&s, buck, buf, end):
|
bgp_create_ip_unreach(&s, buck, buf, end):
|
||||||
bgp_create_mp_unreach(&s, buck, buf, end);
|
bgp_create_mp_unreach(&s, buck, buf, end);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return !s.mp_reach ?
|
res = !s.mp_reach ?
|
||||||
bgp_create_ip_reach(&s, buck, buf, end):
|
bgp_create_ip_reach(&s, buck, buf, end):
|
||||||
bgp_create_mp_reach(&s, buck, buf, end);
|
bgp_create_mp_reach(&s, buck, buf, end);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lp_restore(tmp_linpool, &tmpp);
|
||||||
|
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
static byte *
|
static byte *
|
||||||
|
Loading…
Reference in New Issue
Block a user