BGP: Fix extended messages
Change attribute length limit to handle extended (64 kB) messages. Do not mix updates and withdraws (RFC 7606).
This commit is contained in:
parent
f0b822a831
commit
ea0cb652e9
1 changed files with 4 additions and 5 deletions
|
@ -369,7 +369,7 @@ bgp_create_update(struct bgp_conn *conn, byte *buf)
|
||||||
}
|
}
|
||||||
put_u16(buf, wd_size);
|
put_u16(buf, wd_size);
|
||||||
|
|
||||||
if (remains >= 3072)
|
if (!wd_size)
|
||||||
{
|
{
|
||||||
while ((buck = (struct bgp_bucket *) HEAD(p->bucket_queue))->send_node.next)
|
while ((buck = (struct bgp_bucket *) HEAD(p->bucket_queue))->send_node.next)
|
||||||
{
|
{
|
||||||
|
@ -382,7 +382,7 @@ bgp_create_update(struct bgp_conn *conn, byte *buf)
|
||||||
}
|
}
|
||||||
|
|
||||||
DBG("Processing bucket %p\n", buck);
|
DBG("Processing bucket %p\n", buck);
|
||||||
a_size = bgp_encode_attrs(p, w+2, buck->eattrs, 2048);
|
a_size = bgp_encode_attrs(p, w+2, buck->eattrs, remains - 1024);
|
||||||
|
|
||||||
if (a_size < 0)
|
if (a_size < 0)
|
||||||
{
|
{
|
||||||
|
@ -461,8 +461,7 @@ bgp_create_update(struct bgp_conn *conn, byte *buf)
|
||||||
w += size;
|
w += size;
|
||||||
remains -= size;
|
remains -= size;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
if (remains >= 3072)
|
|
||||||
{
|
{
|
||||||
while ((buck = (struct bgp_bucket *) HEAD(p->bucket_queue))->send_node.next)
|
while ((buck = (struct bgp_bucket *) HEAD(p->bucket_queue))->send_node.next)
|
||||||
{
|
{
|
||||||
|
@ -478,7 +477,7 @@ bgp_create_update(struct bgp_conn *conn, byte *buf)
|
||||||
rem_stored = remains;
|
rem_stored = remains;
|
||||||
w_stored = w;
|
w_stored = w;
|
||||||
|
|
||||||
size = bgp_encode_attrs(p, w, buck->eattrs, 2048);
|
size = bgp_encode_attrs(p, w, buck->eattrs, remains - 1024);
|
||||||
if (size < 0)
|
if (size < 0)
|
||||||
{
|
{
|
||||||
log(L_ERR "%s: Attribute list too long, skipping corresponding routes", p->p.name);
|
log(L_ERR "%s: Attribute list too long, skipping corresponding routes", p->p.name);
|
||||||
|
|
Loading…
Reference in a new issue