2002-12-13 21:15:29 +01:00
|
|
|
|
/* BGP attributes management routines.
|
|
|
|
|
Copyright (C) 1996, 97, 98, 1999 Kunihiro Ishiguro
|
|
|
|
|
|
|
|
|
|
This file is part of GNU Zebra.
|
|
|
|
|
|
|
|
|
|
GNU Zebra is free software; you can redistribute it and/or modify it
|
|
|
|
|
under the terms of the GNU General Public License as published by the
|
|
|
|
|
Free Software Foundation; either version 2, or (at your option) any
|
|
|
|
|
later version.
|
|
|
|
|
|
|
|
|
|
GNU Zebra is distributed in the hope that it will be useful, but
|
|
|
|
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
|
General Public License for more details.
|
|
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
|
along with GNU Zebra; see the file COPYING. If not, write to the Free
|
|
|
|
|
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
|
|
|
02111-1307, USA. */
|
|
|
|
|
|
|
|
|
|
#include <zebra.h>
|
|
|
|
|
|
|
|
|
|
#include "linklist.h"
|
|
|
|
|
#include "prefix.h"
|
|
|
|
|
#include "memory.h"
|
|
|
|
|
#include "vector.h"
|
|
|
|
|
#include "vty.h"
|
|
|
|
|
#include "stream.h"
|
|
|
|
|
#include "log.h"
|
|
|
|
|
#include "hash.h"
|
|
|
|
|
|
|
|
|
|
#include "bgpd/bgpd.h"
|
|
|
|
|
#include "bgpd/bgp_attr.h"
|
|
|
|
|
#include "bgpd/bgp_route.h"
|
|
|
|
|
#include "bgpd/bgp_aspath.h"
|
|
|
|
|
#include "bgpd/bgp_community.h"
|
|
|
|
|
#include "bgpd/bgp_debug.h"
|
|
|
|
|
#include "bgpd/bgp_packet.h"
|
|
|
|
|
#include "bgpd/bgp_ecommunity.h"
|
|
|
|
|
|
|
|
|
|
/* Attribute strings for logging. */
|
2009-05-15 18:59:51 +02:00
|
|
|
|
static const struct message attr_str [] =
|
2002-12-13 21:15:29 +01:00
|
|
|
|
{
|
|
|
|
|
{ BGP_ATTR_ORIGIN, "ORIGIN" },
|
|
|
|
|
{ BGP_ATTR_AS_PATH, "AS_PATH" },
|
|
|
|
|
{ BGP_ATTR_NEXT_HOP, "NEXT_HOP" },
|
|
|
|
|
{ BGP_ATTR_MULTI_EXIT_DISC, "MULTI_EXIT_DISC" },
|
|
|
|
|
{ BGP_ATTR_LOCAL_PREF, "LOCAL_PREF" },
|
|
|
|
|
{ BGP_ATTR_ATOMIC_AGGREGATE, "ATOMIC_AGGREGATE" },
|
|
|
|
|
{ BGP_ATTR_AGGREGATOR, "AGGREGATOR" },
|
|
|
|
|
{ BGP_ATTR_COMMUNITIES, "COMMUNITY" },
|
|
|
|
|
{ BGP_ATTR_ORIGINATOR_ID, "ORIGINATOR_ID" },
|
|
|
|
|
{ BGP_ATTR_CLUSTER_LIST, "CLUSTERLIST" },
|
|
|
|
|
{ BGP_ATTR_DPA, "DPA" },
|
|
|
|
|
{ BGP_ATTR_ADVERTISER, "ADVERTISER"} ,
|
|
|
|
|
{ BGP_ATTR_RCID_PATH, "RCID_PATH" },
|
|
|
|
|
{ BGP_ATTR_MP_REACH_NLRI, "MP_REACH_NLRI" },
|
|
|
|
|
{ BGP_ATTR_MP_UNREACH_NLRI, "MP_UNREACH_NLRI" },
|
[bgpd] Merge AS4 support
2007-10-14 Paul Jakma <paul.jakma@sun.com>
* NEWS: Note that MRT dumps are now version 2
* (general) Merge in Juergen Kammer's AS4 patch.
2007-09-27 Paul Jakma <paul.jakma@sun.com>
* bgp_aspath.c: (assegment_normalise) remove duplicates from
from sets.
(aspath_reconcile_as4) disregard a broken part of the RFC around
error handling in path reconciliation.
* aspath_test.c: Test dupe-weeding from sets.
Test that reconciliation merges AS_PATH and AS4_PATH where
former is shorter than latter.
2007-09-26 Paul Jakma <paul.jakma@sun.com>
* aspath_test.c: Test AS4_PATH reconcilation where length
of AS_PATH and AS4_PATH is same.
2007-09-25 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (peek_for_as4_capability) Fix to work.
* bgp_packet.c: (bgp_open_receive) Fix sanity check of as4.
* tests/bgp_capability_test.c: (general) Extend tests to validate
peek_for_as4_capability.
Add test of full OPEN Option block, with multiple capabilities,
both as a series of Option, and a single option.
Add some crap to beginning of stream, to prevent code depending
on getp == 0.
2007-09-18 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (bgp_capability_as4) debug printf inline with others.
(peek_for_as4_capability) There's no need to signal failure, as
failure is better dealt with through full capability parser -
just return the AS4, simpler.
* bgp_packet.c: (bgp_open_receive) Update to match
peek_for_as4_capability change.
Allow use of BGP_AS_TRANS by 2b speakers.
Use NOTIFY_OPEN_ERR rather than CEASE for OPEN parsing errors.
(bgp_capability_msg_parse) missing argument to debug print
(bgp_capability_receive) missing return values.
* tests/bgp_capability_test.c: (parse_test) update for changes to
peek_for_as4_capability
2007-07-25 Paul Jakma <paul.jakma@sun.com>
* Remove 2-byte size macros, just make existing macros take
argument to indicate which size to use.
Adjust all users - typically they want '1'.
* bgp_aspath.c: (aspath_has_as4) New, return 1 if there are any
as4's in a path.
(aspath_put) Return the number of bytes actually written, to
fix the bug Juergen noted: Splitting of segments will change
the number of bytes written from that already written to the
AS_PATH header.
(aspath_snmp_pathseg) Pass 2-byte flag to aspath_put. SNMP
is still defined as 2b.
(aspath_aggregate) fix latent bug.
(aspath_reconcile_as4) AS_PATH+NEW_AS_PATH reconciliation
function.
(aspath_key_make) Hash the AS_PATH string, rather than
just taking the addition of assegment ASes as the hash value,
hopefully sligthly more collision resistant.
(bgp_attr_munge_as4_attrs) Collide the NEW_ attributes
together with the OLD 2-byte forms, code Juergen
had in bgp_attr_parse but re-organised a bit.
(bgp_attr_parse) Bunch of code from Juergen moves
to previous function.
(bgp_packet_attribute) Compact significantly by
just /always/ using extended-length attr header.
Fix bug Juergen noted, by using aspath_put's
(new) returned size value for the attr header rather
than the (guesstimate) of aspath_size() - the two could
differ when aspath_put had to split large segments, unlikely
this bug was ever hit in the 'wild'.
(bgp_dump_routes_attr) Always use extended-len and
use aspath_put return for header length. Output 4b ASN
for AS_PATH and AGGREGATOR.
* bgp_ecommunity.c: (ecommunity_{hash_make,cmp}) fix
hash callback declarations to match prototypes.
(ecommunity_gettoken) Updated for ECOMMUNITY_ENCODE_AS4,
complete rewrite of Juergen's changes (no asdot support)
* bgp_open.c: (bgp_capability_as4) New, does what it says
on the tin.
(peek_for_as4_capability) Rewritten to use streams and
bgp_capability_as4.
* bgp_packet.c: (bgp_open_send) minor edit
checked (in the abstract at least) with Juergen.
Changes are to be more accepting, e.g, allow AS_TRANS on
a 2-byte session.
* (general) Update all commands to use CMD_AS_RANGE.
* bgp_vty.c: (bgp_clear) Fix return vals to use CMD_..
Remove stuff replicated by VTY_GET_LONG
(bgp_clear_vty) Return bgp_clear directly to vty.
* tests/aspath_test.c: Exercise 32bit parsing. Test reconcile
function.
* tests/ecommunity_test.c: New, test AS4 ecommunity changes,
positive test only at this time, error cases not tested yet.
2007-07-25 Juergen Kammer <j.kammer@eurodata.de>
* (general) AS4 support.
* bgpd.h: as_t changes to 4-bytes.
* bgp_aspath.h: Add BGP_AS4_MAX and BGP_AS_TRANS defines.
* bgp_aspath.c: AS_VALUE_SIZE becomes 4-byte, AS16_VALUE_SIZE
added for 2-byte.
Add AS16 versions of length calc macros.
(aspath_count_numas) New, count number of ASes.
(aspath_has_as4) New, return 1 if there are any as4's in a
path.
(assegments_parse) Interpret assegment as 4 or 2 byte,
according to how the caller instructs us, with a new
argument.
(aspath_parse) Add use32bit argument to pass to
assegments_parse. Adjust all its callers to pass 1, unless
otherwise noted.
(assegment_data_put) Adjust to be able to write 2 or 4 byte
AS, according to new use32bit argument.
(aspath_put) Adjust to write 2 or 4.
(aspath_gettoken) Use a long for passed in asno.
* bgp_attr.c: (attr_str) Add BGP_ATTR_AS4_PATH and
BGP_ATTR_AS4_AGGREGATOR.
(bgp_attr_aspath) Call aspath_parse with right 2/4 arg, as
determined by received-capability flag.
(bgp_attr_aspath_check) New, code previously in attr_aspath
but moved to new func so it can be run after NEW_AS_PATH
reconciliation.
(bgp_attr_as4_path) New, handle NEW_AS_PATH.
(bgp_attr_aggregator) Adjust to cope with 2/4 byte ASes.
(bgp_attr_as4_aggregator) New, read NEW_AGGREGATOR.
(bgp_attr_parse) Add handoffs to previous parsers for the two
new AS4 NEW_ attributes.
Various checks added for NEW/OLD reconciliation.
(bgp_packet_attribute) Support 2/4 for AS_PATH and
AGGREGATOR, detect when NEW_ attrs need to be sent.
* bgp_debug.{c,h}: Add 'debug bgp as4'.
* bgp_dump.c: MRTv2 support, unconditionally enabled, which
supports AS4. Based on patches from Erik (RIPE?).
* bgp_ecommunity.c: (ecommunity_ecom2str) ECOMMUNITY_ENCODE_AS4
support.
* bgp_open.c: (peek_for_as4_capability) New, peek for AS4
capability prior to full capability parsing, so we know which
ASN to use for struct peer lookup.
(bgp_open_capability) Always send AS4 capability.
* bgp_packet.c: (bgp_open_send) AS4 handling for AS field
(bgp_open_receive) Peek for AS4 capability first, and figure
out which AS to believe.
* bgp_vty.c: (bgp_show_peer) Print AS4 cap
* tests/aspath_test.c: Support asn32 changes, call aspath_parse
with 16 bit.
* vtysh/extract.pl: AS4 compatibility for router bgp ASNUMBER
* vtysh/extract.pl.in: AS4 compatibility for router bgp ASNUMBER
* vtysh/vtysh.c: AS4 compatibility for router bgp ASNUMBER
2007-10-15 00:32:21 +02:00
|
|
|
|
{ BGP_ATTR_EXT_COMMUNITIES, "EXT_COMMUNITIES" },
|
|
|
|
|
{ BGP_ATTR_AS4_PATH, "AS4_PATH" },
|
|
|
|
|
{ BGP_ATTR_AS4_AGGREGATOR, "AS4_AGGREGATOR" },
|
|
|
|
|
{ BGP_ATTR_AS_PATHLIMIT, "AS_PATHLIMIT" },
|
2002-12-13 21:15:29 +01:00
|
|
|
|
};
|
2009-05-15 18:59:51 +02:00
|
|
|
|
static const int attr_str_max = sizeof(attr_str)/sizeof(attr_str[0]);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
2009-05-15 18:59:51 +02:00
|
|
|
|
static struct hash *cluster_hash;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
2005-06-28 14:44:16 +02:00
|
|
|
|
static void *
|
[bgpd] Fix warnings: hash callbacks should match hash API declarations
2007-04-22 Sebastien Tandel <sebastien@tandel.be>
* bgp_advertise.c : (baa_hash_alloc, baa_hash_key, baa_hash_cmp)
conforms to quagga hash API. Defines _hash_[alloc|key|cmp] with
void * arguments as defined by the API.
* bgp_aspath.c,h : (aspath_key_make) conforms to quagga hash API.
Defines _hash_[alloc|key|cmp] with void * arguments as defined by
the API.
* bgp_attr.c,h : (cluster_hash_alloc, cluster_hash_key_make,
cluster_hash_cmp, transit_hash_alloc, transit_hash_key_make,
transit_hash_cmp, attrhash_key_make, attrhash_cmp,
bgp_attr_hash_alloc) conforms to quagga hash API. Defines
_hash_[alloc|key|cmp] with void * arguments as defined by the API.
2007-04-29 20:25:17 +02:00
|
|
|
|
cluster_hash_alloc (void *p)
|
2002-12-13 21:15:29 +01:00
|
|
|
|
{
|
[bgpd] Fix warnings: hash callbacks should match hash API declarations
2007-04-22 Sebastien Tandel <sebastien@tandel.be>
* bgp_advertise.c : (baa_hash_alloc, baa_hash_key, baa_hash_cmp)
conforms to quagga hash API. Defines _hash_[alloc|key|cmp] with
void * arguments as defined by the API.
* bgp_aspath.c,h : (aspath_key_make) conforms to quagga hash API.
Defines _hash_[alloc|key|cmp] with void * arguments as defined by
the API.
* bgp_attr.c,h : (cluster_hash_alloc, cluster_hash_key_make,
cluster_hash_cmp, transit_hash_alloc, transit_hash_key_make,
transit_hash_cmp, attrhash_key_make, attrhash_cmp,
bgp_attr_hash_alloc) conforms to quagga hash API. Defines
_hash_[alloc|key|cmp] with void * arguments as defined by the API.
2007-04-29 20:25:17 +02:00
|
|
|
|
struct cluster_list * val = (struct cluster_list *) p;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
struct cluster_list *cluster;
|
|
|
|
|
|
|
|
|
|
cluster = XMALLOC (MTYPE_CLUSTER, sizeof (struct cluster_list));
|
|
|
|
|
cluster->length = val->length;
|
|
|
|
|
|
|
|
|
|
if (cluster->length)
|
|
|
|
|
{
|
|
|
|
|
cluster->list = XMALLOC (MTYPE_CLUSTER_VAL, val->length);
|
|
|
|
|
memcpy (cluster->list, val->list, val->length);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
cluster->list = NULL;
|
|
|
|
|
|
|
|
|
|
cluster->refcnt = 0;
|
|
|
|
|
|
|
|
|
|
return cluster;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Cluster list related functions. */
|
2005-06-28 14:44:16 +02:00
|
|
|
|
static struct cluster_list *
|
2004-06-04 19:58:18 +02:00
|
|
|
|
cluster_parse (struct in_addr * pnt, int length)
|
2002-12-13 21:15:29 +01:00
|
|
|
|
{
|
|
|
|
|
struct cluster_list tmp;
|
|
|
|
|
struct cluster_list *cluster;
|
|
|
|
|
|
|
|
|
|
tmp.length = length;
|
2004-06-04 19:58:18 +02:00
|
|
|
|
tmp.list = pnt;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
|
|
cluster = hash_get (cluster_hash, &tmp, cluster_hash_alloc);
|
|
|
|
|
cluster->refcnt++;
|
|
|
|
|
return cluster;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
cluster_loop_check (struct cluster_list *cluster, struct in_addr originator)
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < cluster->length / 4; i++)
|
|
|
|
|
if (cluster->list[i].s_addr == originator.s_addr)
|
|
|
|
|
return 1;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2005-06-28 14:44:16 +02:00
|
|
|
|
static unsigned int
|
[bgpd] Fix warnings: hash callbacks should match hash API declarations
2007-04-22 Sebastien Tandel <sebastien@tandel.be>
* bgp_advertise.c : (baa_hash_alloc, baa_hash_key, baa_hash_cmp)
conforms to quagga hash API. Defines _hash_[alloc|key|cmp] with
void * arguments as defined by the API.
* bgp_aspath.c,h : (aspath_key_make) conforms to quagga hash API.
Defines _hash_[alloc|key|cmp] with void * arguments as defined by
the API.
* bgp_attr.c,h : (cluster_hash_alloc, cluster_hash_key_make,
cluster_hash_cmp, transit_hash_alloc, transit_hash_key_make,
transit_hash_cmp, attrhash_key_make, attrhash_cmp,
bgp_attr_hash_alloc) conforms to quagga hash API. Defines
_hash_[alloc|key|cmp] with void * arguments as defined by the API.
2007-04-29 20:25:17 +02:00
|
|
|
|
cluster_hash_key_make (void *p)
|
2002-12-13 21:15:29 +01:00
|
|
|
|
{
|
[bgpd] Fix warnings: hash callbacks should match hash API declarations
2007-04-22 Sebastien Tandel <sebastien@tandel.be>
* bgp_advertise.c : (baa_hash_alloc, baa_hash_key, baa_hash_cmp)
conforms to quagga hash API. Defines _hash_[alloc|key|cmp] with
void * arguments as defined by the API.
* bgp_aspath.c,h : (aspath_key_make) conforms to quagga hash API.
Defines _hash_[alloc|key|cmp] with void * arguments as defined by
the API.
* bgp_attr.c,h : (cluster_hash_alloc, cluster_hash_key_make,
cluster_hash_cmp, transit_hash_alloc, transit_hash_key_make,
transit_hash_cmp, attrhash_key_make, attrhash_cmp,
bgp_attr_hash_alloc) conforms to quagga hash API. Defines
_hash_[alloc|key|cmp] with void * arguments as defined by the API.
2007-04-29 20:25:17 +02:00
|
|
|
|
struct cluster_list * cluster = (struct cluster_list *) p;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
unsigned int key = 0;
|
|
|
|
|
int length;
|
|
|
|
|
caddr_t pnt;
|
|
|
|
|
|
|
|
|
|
length = cluster->length;
|
|
|
|
|
pnt = (caddr_t) cluster->list;
|
|
|
|
|
|
|
|
|
|
while (length)
|
|
|
|
|
key += pnt[--length];
|
|
|
|
|
|
|
|
|
|
return key;
|
|
|
|
|
}
|
|
|
|
|
|
2005-06-28 14:44:16 +02:00
|
|
|
|
static int
|
2008-08-14 17:25:25 +02:00
|
|
|
|
cluster_hash_cmp (const void *p1, const void *p2)
|
2002-12-13 21:15:29 +01:00
|
|
|
|
{
|
2008-08-14 17:25:25 +02:00
|
|
|
|
const struct cluster_list * cluster1 = p1;
|
|
|
|
|
const struct cluster_list * cluster2 = p2;
|
[bgpd] Fix warnings: hash callbacks should match hash API declarations
2007-04-22 Sebastien Tandel <sebastien@tandel.be>
* bgp_advertise.c : (baa_hash_alloc, baa_hash_key, baa_hash_cmp)
conforms to quagga hash API. Defines _hash_[alloc|key|cmp] with
void * arguments as defined by the API.
* bgp_aspath.c,h : (aspath_key_make) conforms to quagga hash API.
Defines _hash_[alloc|key|cmp] with void * arguments as defined by
the API.
* bgp_attr.c,h : (cluster_hash_alloc, cluster_hash_key_make,
cluster_hash_cmp, transit_hash_alloc, transit_hash_key_make,
transit_hash_cmp, attrhash_key_make, attrhash_cmp,
bgp_attr_hash_alloc) conforms to quagga hash API. Defines
_hash_[alloc|key|cmp] with void * arguments as defined by the API.
2007-04-29 20:25:17 +02:00
|
|
|
|
|
2008-08-14 17:25:25 +02:00
|
|
|
|
return (cluster1->length == cluster2->length &&
|
|
|
|
|
memcmp (cluster1->list, cluster2->list, cluster1->length) == 0);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
}
|
|
|
|
|
|
2005-06-28 14:44:16 +02:00
|
|
|
|
static void
|
2002-12-13 21:15:29 +01:00
|
|
|
|
cluster_free (struct cluster_list *cluster)
|
|
|
|
|
{
|
|
|
|
|
if (cluster->list)
|
|
|
|
|
XFREE (MTYPE_CLUSTER_VAL, cluster->list);
|
|
|
|
|
XFREE (MTYPE_CLUSTER, cluster);
|
|
|
|
|
}
|
|
|
|
|
|
2005-06-28 14:44:16 +02:00
|
|
|
|
static struct cluster_list *
|
2002-12-13 21:15:29 +01:00
|
|
|
|
cluster_dup (struct cluster_list *cluster)
|
|
|
|
|
{
|
|
|
|
|
struct cluster_list *new;
|
|
|
|
|
|
2008-08-18 23:13:29 +02:00
|
|
|
|
new = XCALLOC (MTYPE_CLUSTER, sizeof (struct cluster_list));
|
2002-12-13 21:15:29 +01:00
|
|
|
|
new->length = cluster->length;
|
|
|
|
|
|
|
|
|
|
if (cluster->length)
|
|
|
|
|
{
|
|
|
|
|
new->list = XMALLOC (MTYPE_CLUSTER_VAL, cluster->length);
|
|
|
|
|
memcpy (new->list, cluster->list, cluster->length);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
new->list = NULL;
|
|
|
|
|
|
|
|
|
|
return new;
|
|
|
|
|
}
|
|
|
|
|
|
2005-06-28 14:44:16 +02:00
|
|
|
|
static struct cluster_list *
|
2002-12-13 21:15:29 +01:00
|
|
|
|
cluster_intern (struct cluster_list *cluster)
|
|
|
|
|
{
|
|
|
|
|
struct cluster_list *find;
|
|
|
|
|
|
|
|
|
|
find = hash_get (cluster_hash, cluster, cluster_hash_alloc);
|
|
|
|
|
find->refcnt++;
|
|
|
|
|
|
|
|
|
|
return find;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
cluster_unintern (struct cluster_list *cluster)
|
|
|
|
|
{
|
|
|
|
|
struct cluster_list *ret;
|
|
|
|
|
|
|
|
|
|
if (cluster->refcnt)
|
|
|
|
|
cluster->refcnt--;
|
|
|
|
|
|
|
|
|
|
if (cluster->refcnt == 0)
|
|
|
|
|
{
|
|
|
|
|
ret = hash_release (cluster_hash, cluster);
|
|
|
|
|
cluster_free (cluster);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2005-06-28 14:44:16 +02:00
|
|
|
|
static void
|
|
|
|
|
cluster_init (void)
|
2002-12-13 21:15:29 +01:00
|
|
|
|
{
|
|
|
|
|
cluster_hash = hash_create (cluster_hash_key_make, cluster_hash_cmp);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Unknown transit attribute. */
|
2009-05-15 18:59:51 +02:00
|
|
|
|
static struct hash *transit_hash;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
2005-06-28 14:44:16 +02:00
|
|
|
|
static void
|
2002-12-13 21:15:29 +01:00
|
|
|
|
transit_free (struct transit *transit)
|
|
|
|
|
{
|
|
|
|
|
if (transit->val)
|
|
|
|
|
XFREE (MTYPE_TRANSIT_VAL, transit->val);
|
|
|
|
|
XFREE (MTYPE_TRANSIT, transit);
|
|
|
|
|
}
|
|
|
|
|
|
[bgpd] Fix warnings: hash callbacks should match hash API declarations
2007-04-22 Sebastien Tandel <sebastien@tandel.be>
* bgp_advertise.c : (baa_hash_alloc, baa_hash_key, baa_hash_cmp)
conforms to quagga hash API. Defines _hash_[alloc|key|cmp] with
void * arguments as defined by the API.
* bgp_aspath.c,h : (aspath_key_make) conforms to quagga hash API.
Defines _hash_[alloc|key|cmp] with void * arguments as defined by
the API.
* bgp_attr.c,h : (cluster_hash_alloc, cluster_hash_key_make,
cluster_hash_cmp, transit_hash_alloc, transit_hash_key_make,
transit_hash_cmp, attrhash_key_make, attrhash_cmp,
bgp_attr_hash_alloc) conforms to quagga hash API. Defines
_hash_[alloc|key|cmp] with void * arguments as defined by the API.
2007-04-29 20:25:17 +02:00
|
|
|
|
|
2005-06-28 14:44:16 +02:00
|
|
|
|
static void *
|
[bgpd] Fix warnings: hash callbacks should match hash API declarations
2007-04-22 Sebastien Tandel <sebastien@tandel.be>
* bgp_advertise.c : (baa_hash_alloc, baa_hash_key, baa_hash_cmp)
conforms to quagga hash API. Defines _hash_[alloc|key|cmp] with
void * arguments as defined by the API.
* bgp_aspath.c,h : (aspath_key_make) conforms to quagga hash API.
Defines _hash_[alloc|key|cmp] with void * arguments as defined by
the API.
* bgp_attr.c,h : (cluster_hash_alloc, cluster_hash_key_make,
cluster_hash_cmp, transit_hash_alloc, transit_hash_key_make,
transit_hash_cmp, attrhash_key_make, attrhash_cmp,
bgp_attr_hash_alloc) conforms to quagga hash API. Defines
_hash_[alloc|key|cmp] with void * arguments as defined by the API.
2007-04-29 20:25:17 +02:00
|
|
|
|
transit_hash_alloc (void *p)
|
2002-12-13 21:15:29 +01:00
|
|
|
|
{
|
|
|
|
|
/* Transit structure is already allocated. */
|
[bgpd] Fix warnings: hash callbacks should match hash API declarations
2007-04-22 Sebastien Tandel <sebastien@tandel.be>
* bgp_advertise.c : (baa_hash_alloc, baa_hash_key, baa_hash_cmp)
conforms to quagga hash API. Defines _hash_[alloc|key|cmp] with
void * arguments as defined by the API.
* bgp_aspath.c,h : (aspath_key_make) conforms to quagga hash API.
Defines _hash_[alloc|key|cmp] with void * arguments as defined by
the API.
* bgp_attr.c,h : (cluster_hash_alloc, cluster_hash_key_make,
cluster_hash_cmp, transit_hash_alloc, transit_hash_key_make,
transit_hash_cmp, attrhash_key_make, attrhash_cmp,
bgp_attr_hash_alloc) conforms to quagga hash API. Defines
_hash_[alloc|key|cmp] with void * arguments as defined by the API.
2007-04-29 20:25:17 +02:00
|
|
|
|
return p;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
}
|
|
|
|
|
|
2005-06-28 14:44:16 +02:00
|
|
|
|
static struct transit *
|
2002-12-13 21:15:29 +01:00
|
|
|
|
transit_intern (struct transit *transit)
|
|
|
|
|
{
|
|
|
|
|
struct transit *find;
|
|
|
|
|
|
|
|
|
|
find = hash_get (transit_hash, transit, transit_hash_alloc);
|
|
|
|
|
if (find != transit)
|
|
|
|
|
transit_free (transit);
|
|
|
|
|
find->refcnt++;
|
|
|
|
|
|
|
|
|
|
return find;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
transit_unintern (struct transit *transit)
|
|
|
|
|
{
|
|
|
|
|
struct transit *ret;
|
|
|
|
|
|
|
|
|
|
if (transit->refcnt)
|
|
|
|
|
transit->refcnt--;
|
|
|
|
|
|
|
|
|
|
if (transit->refcnt == 0)
|
|
|
|
|
{
|
|
|
|
|
ret = hash_release (transit_hash, transit);
|
|
|
|
|
transit_free (transit);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2005-06-28 14:44:16 +02:00
|
|
|
|
static unsigned int
|
[bgpd] Fix warnings: hash callbacks should match hash API declarations
2007-04-22 Sebastien Tandel <sebastien@tandel.be>
* bgp_advertise.c : (baa_hash_alloc, baa_hash_key, baa_hash_cmp)
conforms to quagga hash API. Defines _hash_[alloc|key|cmp] with
void * arguments as defined by the API.
* bgp_aspath.c,h : (aspath_key_make) conforms to quagga hash API.
Defines _hash_[alloc|key|cmp] with void * arguments as defined by
the API.
* bgp_attr.c,h : (cluster_hash_alloc, cluster_hash_key_make,
cluster_hash_cmp, transit_hash_alloc, transit_hash_key_make,
transit_hash_cmp, attrhash_key_make, attrhash_cmp,
bgp_attr_hash_alloc) conforms to quagga hash API. Defines
_hash_[alloc|key|cmp] with void * arguments as defined by the API.
2007-04-29 20:25:17 +02:00
|
|
|
|
transit_hash_key_make (void *p)
|
2002-12-13 21:15:29 +01:00
|
|
|
|
{
|
[bgpd] Fix warnings: hash callbacks should match hash API declarations
2007-04-22 Sebastien Tandel <sebastien@tandel.be>
* bgp_advertise.c : (baa_hash_alloc, baa_hash_key, baa_hash_cmp)
conforms to quagga hash API. Defines _hash_[alloc|key|cmp] with
void * arguments as defined by the API.
* bgp_aspath.c,h : (aspath_key_make) conforms to quagga hash API.
Defines _hash_[alloc|key|cmp] with void * arguments as defined by
the API.
* bgp_attr.c,h : (cluster_hash_alloc, cluster_hash_key_make,
cluster_hash_cmp, transit_hash_alloc, transit_hash_key_make,
transit_hash_cmp, attrhash_key_make, attrhash_cmp,
bgp_attr_hash_alloc) conforms to quagga hash API. Defines
_hash_[alloc|key|cmp] with void * arguments as defined by the API.
2007-04-29 20:25:17 +02:00
|
|
|
|
struct transit * transit = (struct transit *) p;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
unsigned int key = 0;
|
|
|
|
|
int length;
|
|
|
|
|
caddr_t pnt;
|
|
|
|
|
|
|
|
|
|
length = transit->length;
|
|
|
|
|
pnt = (caddr_t) transit->val;
|
|
|
|
|
|
|
|
|
|
while (length)
|
|
|
|
|
key += pnt[--length];
|
|
|
|
|
|
|
|
|
|
return key;
|
|
|
|
|
}
|
|
|
|
|
|
2005-06-28 14:44:16 +02:00
|
|
|
|
static int
|
2008-08-14 17:25:25 +02:00
|
|
|
|
transit_hash_cmp (const void *p1, const void *p2)
|
2002-12-13 21:15:29 +01:00
|
|
|
|
{
|
2008-08-14 17:25:25 +02:00
|
|
|
|
const struct transit * transit1 = p1;
|
|
|
|
|
const struct transit * transit2 = p2;
|
[bgpd] Fix warnings: hash callbacks should match hash API declarations
2007-04-22 Sebastien Tandel <sebastien@tandel.be>
* bgp_advertise.c : (baa_hash_alloc, baa_hash_key, baa_hash_cmp)
conforms to quagga hash API. Defines _hash_[alloc|key|cmp] with
void * arguments as defined by the API.
* bgp_aspath.c,h : (aspath_key_make) conforms to quagga hash API.
Defines _hash_[alloc|key|cmp] with void * arguments as defined by
the API.
* bgp_attr.c,h : (cluster_hash_alloc, cluster_hash_key_make,
cluster_hash_cmp, transit_hash_alloc, transit_hash_key_make,
transit_hash_cmp, attrhash_key_make, attrhash_cmp,
bgp_attr_hash_alloc) conforms to quagga hash API. Defines
_hash_[alloc|key|cmp] with void * arguments as defined by the API.
2007-04-29 20:25:17 +02:00
|
|
|
|
|
2008-08-14 17:25:25 +02:00
|
|
|
|
return (transit1->length == transit2->length &&
|
|
|
|
|
memcmp (transit1->val, transit2->val, transit1->length) == 0);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
}
|
|
|
|
|
|
2005-06-28 14:44:16 +02:00
|
|
|
|
static void
|
2009-02-09 19:14:16 +01:00
|
|
|
|
transit_init (void)
|
2002-12-13 21:15:29 +01:00
|
|
|
|
{
|
|
|
|
|
transit_hash = hash_create (transit_hash_key_make, transit_hash_cmp);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Attribute hash routines. */
|
2009-05-15 18:59:51 +02:00
|
|
|
|
static struct hash *attrhash;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
2007-05-04 22:15:47 +02:00
|
|
|
|
static struct attr_extra *
|
|
|
|
|
bgp_attr_extra_new (void)
|
|
|
|
|
{
|
|
|
|
|
return XCALLOC (MTYPE_ATTR_EXTRA, sizeof (struct attr_extra));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
bgp_attr_extra_free (struct attr *attr)
|
|
|
|
|
{
|
|
|
|
|
if (attr->extra)
|
|
|
|
|
{
|
|
|
|
|
XFREE (MTYPE_ATTR_EXTRA, attr->extra);
|
|
|
|
|
attr->extra = NULL;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct attr_extra *
|
|
|
|
|
bgp_attr_extra_get (struct attr *attr)
|
|
|
|
|
{
|
|
|
|
|
if (!attr->extra)
|
|
|
|
|
attr->extra = bgp_attr_extra_new();
|
|
|
|
|
return attr->extra;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Shallow copy of an attribute
|
|
|
|
|
* Though, not so shallow that it doesn't copy the contents
|
|
|
|
|
* of the attr_extra pointed to by 'extra'
|
|
|
|
|
*/
|
|
|
|
|
void
|
|
|
|
|
bgp_attr_dup (struct attr *new, struct attr *orig)
|
|
|
|
|
{
|
|
|
|
|
*new = *orig;
|
|
|
|
|
if (orig->extra)
|
|
|
|
|
{
|
|
|
|
|
new->extra = bgp_attr_extra_new();
|
|
|
|
|
*new->extra = *orig->extra;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2006-03-30 15:20:48 +02:00
|
|
|
|
unsigned long int
|
|
|
|
|
attr_count (void)
|
|
|
|
|
{
|
|
|
|
|
return attrhash->count;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
unsigned long int
|
|
|
|
|
attr_unknown_count (void)
|
|
|
|
|
{
|
|
|
|
|
return transit_hash->count;
|
|
|
|
|
}
|
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
|
unsigned int
|
[bgpd] Fix warnings: hash callbacks should match hash API declarations
2007-04-22 Sebastien Tandel <sebastien@tandel.be>
* bgp_advertise.c : (baa_hash_alloc, baa_hash_key, baa_hash_cmp)
conforms to quagga hash API. Defines _hash_[alloc|key|cmp] with
void * arguments as defined by the API.
* bgp_aspath.c,h : (aspath_key_make) conforms to quagga hash API.
Defines _hash_[alloc|key|cmp] with void * arguments as defined by
the API.
* bgp_attr.c,h : (cluster_hash_alloc, cluster_hash_key_make,
cluster_hash_cmp, transit_hash_alloc, transit_hash_key_make,
transit_hash_cmp, attrhash_key_make, attrhash_cmp,
bgp_attr_hash_alloc) conforms to quagga hash API. Defines
_hash_[alloc|key|cmp] with void * arguments as defined by the API.
2007-04-29 20:25:17 +02:00
|
|
|
|
attrhash_key_make (void *p)
|
2002-12-13 21:15:29 +01:00
|
|
|
|
{
|
[bgpd] Fix warnings: hash callbacks should match hash API declarations
2007-04-22 Sebastien Tandel <sebastien@tandel.be>
* bgp_advertise.c : (baa_hash_alloc, baa_hash_key, baa_hash_cmp)
conforms to quagga hash API. Defines _hash_[alloc|key|cmp] with
void * arguments as defined by the API.
* bgp_aspath.c,h : (aspath_key_make) conforms to quagga hash API.
Defines _hash_[alloc|key|cmp] with void * arguments as defined by
the API.
* bgp_attr.c,h : (cluster_hash_alloc, cluster_hash_key_make,
cluster_hash_cmp, transit_hash_alloc, transit_hash_key_make,
transit_hash_cmp, attrhash_key_make, attrhash_cmp,
bgp_attr_hash_alloc) conforms to quagga hash API. Defines
_hash_[alloc|key|cmp] with void * arguments as defined by the API.
2007-04-29 20:25:17 +02:00
|
|
|
|
struct attr * attr = (struct attr *) p;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
unsigned int key = 0;
|
|
|
|
|
|
|
|
|
|
key += attr->origin;
|
|
|
|
|
key += attr->nexthop.s_addr;
|
|
|
|
|
key += attr->med;
|
|
|
|
|
key += attr->local_pref;
|
2007-08-06 17:24:51 +02:00
|
|
|
|
if (attr->pathlimit.as)
|
|
|
|
|
{
|
|
|
|
|
key += attr->pathlimit.ttl;
|
|
|
|
|
key += attr->pathlimit.as;
|
|
|
|
|
}
|
2007-05-04 22:15:47 +02:00
|
|
|
|
|
|
|
|
|
if (attr->extra)
|
|
|
|
|
{
|
|
|
|
|
key += attr->extra->aggregator_as;
|
|
|
|
|
key += attr->extra->aggregator_addr.s_addr;
|
|
|
|
|
key += attr->extra->weight;
|
|
|
|
|
key += attr->extra->mp_nexthop_global_in.s_addr;
|
|
|
|
|
}
|
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
|
if (attr->aspath)
|
|
|
|
|
key += aspath_key_make (attr->aspath);
|
|
|
|
|
if (attr->community)
|
|
|
|
|
key += community_hash_make (attr->community);
|
2007-05-04 22:15:47 +02:00
|
|
|
|
|
|
|
|
|
if (attr->extra)
|
|
|
|
|
{
|
|
|
|
|
if (attr->extra->ecommunity)
|
|
|
|
|
key += ecommunity_hash_make (attr->extra->ecommunity);
|
|
|
|
|
if (attr->extra->cluster)
|
|
|
|
|
key += cluster_hash_key_make (attr->extra->cluster);
|
|
|
|
|
if (attr->extra->transit)
|
|
|
|
|
key += transit_hash_key_make (attr->extra->transit);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
|
|
#ifdef HAVE_IPV6
|
2007-05-04 22:15:47 +02:00
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
key += attr->extra->mp_nexthop_len;
|
|
|
|
|
for (i = 0; i < 16; i++)
|
|
|
|
|
key += attr->extra->mp_nexthop_global.s6_addr[i];
|
|
|
|
|
for (i = 0; i < 16; i++)
|
|
|
|
|
key += attr->extra->mp_nexthop_local.s6_addr[i];
|
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
#endif /* HAVE_IPV6 */
|
2007-05-04 22:15:47 +02:00
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
|
|
return key;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int
|
2008-08-14 17:25:25 +02:00
|
|
|
|
attrhash_cmp (const void *p1, const void *p2)
|
2002-12-13 21:15:29 +01:00
|
|
|
|
{
|
2008-08-14 17:25:25 +02:00
|
|
|
|
const struct attr * attr1 = p1;
|
|
|
|
|
const struct attr * attr2 = p2;
|
[bgpd] Fix warnings: hash callbacks should match hash API declarations
2007-04-22 Sebastien Tandel <sebastien@tandel.be>
* bgp_advertise.c : (baa_hash_alloc, baa_hash_key, baa_hash_cmp)
conforms to quagga hash API. Defines _hash_[alloc|key|cmp] with
void * arguments as defined by the API.
* bgp_aspath.c,h : (aspath_key_make) conforms to quagga hash API.
Defines _hash_[alloc|key|cmp] with void * arguments as defined by
the API.
* bgp_attr.c,h : (cluster_hash_alloc, cluster_hash_key_make,
cluster_hash_cmp, transit_hash_alloc, transit_hash_key_make,
transit_hash_cmp, attrhash_key_make, attrhash_cmp,
bgp_attr_hash_alloc) conforms to quagga hash API. Defines
_hash_[alloc|key|cmp] with void * arguments as defined by the API.
2007-04-29 20:25:17 +02:00
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
|
if (attr1->flag == attr2->flag
|
|
|
|
|
&& attr1->origin == attr2->origin
|
|
|
|
|
&& attr1->nexthop.s_addr == attr2->nexthop.s_addr
|
2007-05-04 22:15:47 +02:00
|
|
|
|
&& attr1->aspath == attr2->aspath
|
|
|
|
|
&& attr1->community == attr2->community
|
2002-12-13 21:15:29 +01:00
|
|
|
|
&& attr1->med == attr2->med
|
2007-08-06 17:24:51 +02:00
|
|
|
|
&& attr1->local_pref == attr2->local_pref
|
|
|
|
|
&& attr1->pathlimit.ttl == attr2->pathlimit.ttl
|
|
|
|
|
&& attr1->pathlimit.as == attr2->pathlimit.as)
|
2007-05-04 22:15:47 +02:00
|
|
|
|
{
|
2008-08-14 17:25:25 +02:00
|
|
|
|
const struct attr_extra *ae1 = attr1->extra;
|
|
|
|
|
const struct attr_extra *ae2 = attr2->extra;
|
2007-05-04 22:15:47 +02:00
|
|
|
|
|
|
|
|
|
if (ae1 && ae2
|
|
|
|
|
&& ae1->aggregator_as == ae2->aggregator_as
|
|
|
|
|
&& ae1->aggregator_addr.s_addr == ae2->aggregator_addr.s_addr
|
|
|
|
|
&& ae1->weight == ae2->weight
|
2002-12-13 21:15:29 +01:00
|
|
|
|
#ifdef HAVE_IPV6
|
2007-05-04 22:15:47 +02:00
|
|
|
|
&& ae1->mp_nexthop_len == ae2->mp_nexthop_len
|
|
|
|
|
&& IPV6_ADDR_SAME (&ae1->mp_nexthop_global, &ae2->mp_nexthop_global)
|
|
|
|
|
&& IPV6_ADDR_SAME (&ae1->mp_nexthop_local, &ae2->mp_nexthop_local)
|
2002-12-13 21:15:29 +01:00
|
|
|
|
#endif /* HAVE_IPV6 */
|
2007-05-04 22:15:47 +02:00
|
|
|
|
&& IPV4_ADDR_SAME (&ae1->mp_nexthop_global_in, &ae2->mp_nexthop_global_in)
|
|
|
|
|
&& ae1->ecommunity == ae2->ecommunity
|
|
|
|
|
&& ae1->cluster == ae2->cluster
|
|
|
|
|
&& ae1->transit == ae2->transit)
|
|
|
|
|
return 1;
|
|
|
|
|
else if (ae1 || ae2)
|
|
|
|
|
return 0;
|
|
|
|
|
/* neither attribute has extra attributes, so they're same */
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
else
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2005-06-28 14:44:16 +02:00
|
|
|
|
static void
|
2008-08-14 17:25:25 +02:00
|
|
|
|
attrhash_init (void)
|
2002-12-13 21:15:29 +01:00
|
|
|
|
{
|
|
|
|
|
attrhash = hash_create (attrhash_key_make, attrhash_cmp);
|
|
|
|
|
}
|
|
|
|
|
|
2005-06-28 14:44:16 +02:00
|
|
|
|
static void
|
2002-12-13 21:15:29 +01:00
|
|
|
|
attr_show_all_iterator (struct hash_backet *backet, struct vty *vty)
|
|
|
|
|
{
|
|
|
|
|
struct attr *attr = backet->data;
|
|
|
|
|
|
|
|
|
|
vty_out (vty, "attr[%ld] nexthop %s%s", attr->refcnt,
|
|
|
|
|
inet_ntoa (attr->nexthop), VTY_NEWLINE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
attr_show_all (struct vty *vty)
|
|
|
|
|
{
|
|
|
|
|
hash_iterate (attrhash,
|
|
|
|
|
(void (*)(struct hash_backet *, void *))
|
|
|
|
|
attr_show_all_iterator,
|
|
|
|
|
vty);
|
|
|
|
|
}
|
|
|
|
|
|
2005-06-28 14:44:16 +02:00
|
|
|
|
static void *
|
[bgpd] Fix warnings: hash callbacks should match hash API declarations
2007-04-22 Sebastien Tandel <sebastien@tandel.be>
* bgp_advertise.c : (baa_hash_alloc, baa_hash_key, baa_hash_cmp)
conforms to quagga hash API. Defines _hash_[alloc|key|cmp] with
void * arguments as defined by the API.
* bgp_aspath.c,h : (aspath_key_make) conforms to quagga hash API.
Defines _hash_[alloc|key|cmp] with void * arguments as defined by
the API.
* bgp_attr.c,h : (cluster_hash_alloc, cluster_hash_key_make,
cluster_hash_cmp, transit_hash_alloc, transit_hash_key_make,
transit_hash_cmp, attrhash_key_make, attrhash_cmp,
bgp_attr_hash_alloc) conforms to quagga hash API. Defines
_hash_[alloc|key|cmp] with void * arguments as defined by the API.
2007-04-29 20:25:17 +02:00
|
|
|
|
bgp_attr_hash_alloc (void *p)
|
2002-12-13 21:15:29 +01:00
|
|
|
|
{
|
[bgpd] Fix warnings: hash callbacks should match hash API declarations
2007-04-22 Sebastien Tandel <sebastien@tandel.be>
* bgp_advertise.c : (baa_hash_alloc, baa_hash_key, baa_hash_cmp)
conforms to quagga hash API. Defines _hash_[alloc|key|cmp] with
void * arguments as defined by the API.
* bgp_aspath.c,h : (aspath_key_make) conforms to quagga hash API.
Defines _hash_[alloc|key|cmp] with void * arguments as defined by
the API.
* bgp_attr.c,h : (cluster_hash_alloc, cluster_hash_key_make,
cluster_hash_cmp, transit_hash_alloc, transit_hash_key_make,
transit_hash_cmp, attrhash_key_make, attrhash_cmp,
bgp_attr_hash_alloc) conforms to quagga hash API. Defines
_hash_[alloc|key|cmp] with void * arguments as defined by the API.
2007-04-29 20:25:17 +02:00
|
|
|
|
struct attr * val = (struct attr *) p;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
struct attr *attr;
|
|
|
|
|
|
|
|
|
|
attr = XMALLOC (MTYPE_ATTR, sizeof (struct attr));
|
|
|
|
|
*attr = *val;
|
2007-05-04 22:15:47 +02:00
|
|
|
|
if (val->extra)
|
|
|
|
|
{
|
|
|
|
|
attr->extra = bgp_attr_extra_new ();
|
|
|
|
|
*attr->extra = *val->extra;
|
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
attr->refcnt = 0;
|
|
|
|
|
return attr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Internet argument attribute. */
|
|
|
|
|
struct attr *
|
|
|
|
|
bgp_attr_intern (struct attr *attr)
|
|
|
|
|
{
|
|
|
|
|
struct attr *find;
|
|
|
|
|
|
|
|
|
|
/* Intern referenced strucutre. */
|
|
|
|
|
if (attr->aspath)
|
|
|
|
|
{
|
|
|
|
|
if (! attr->aspath->refcnt)
|
|
|
|
|
attr->aspath = aspath_intern (attr->aspath);
|
|
|
|
|
else
|
|
|
|
|
attr->aspath->refcnt++;
|
|
|
|
|
}
|
|
|
|
|
if (attr->community)
|
|
|
|
|
{
|
|
|
|
|
if (! attr->community->refcnt)
|
|
|
|
|
attr->community = community_intern (attr->community);
|
|
|
|
|
else
|
|
|
|
|
attr->community->refcnt++;
|
|
|
|
|
}
|
2007-05-04 22:15:47 +02:00
|
|
|
|
if (attr->extra)
|
2002-12-13 21:15:29 +01:00
|
|
|
|
{
|
2007-05-04 22:15:47 +02:00
|
|
|
|
struct attr_extra *attre = attr->extra;
|
|
|
|
|
|
|
|
|
|
if (attre->ecommunity)
|
|
|
|
|
{
|
|
|
|
|
if (! attre->ecommunity->refcnt)
|
|
|
|
|
attre->ecommunity = ecommunity_intern (attre->ecommunity);
|
|
|
|
|
else
|
|
|
|
|
attre->ecommunity->refcnt++;
|
|
|
|
|
}
|
|
|
|
|
if (attre->cluster)
|
|
|
|
|
{
|
|
|
|
|
if (! attre->cluster->refcnt)
|
|
|
|
|
attre->cluster = cluster_intern (attre->cluster);
|
|
|
|
|
else
|
|
|
|
|
attre->cluster->refcnt++;
|
|
|
|
|
}
|
|
|
|
|
if (attre->transit)
|
|
|
|
|
{
|
|
|
|
|
if (! attre->transit->refcnt)
|
|
|
|
|
attre->transit = transit_intern (attre->transit);
|
|
|
|
|
else
|
|
|
|
|
attre->transit->refcnt++;
|
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
find = (struct attr *) hash_get (attrhash, attr, bgp_attr_hash_alloc);
|
|
|
|
|
find->refcnt++;
|
|
|
|
|
|
|
|
|
|
return find;
|
|
|
|
|
}
|
|
|
|
|
|
2007-04-29 20:31:07 +02:00
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
|
/* Make network statement's attribute. */
|
|
|
|
|
struct attr *
|
|
|
|
|
bgp_attr_default_set (struct attr *attr, u_char origin)
|
|
|
|
|
{
|
|
|
|
|
memset (attr, 0, sizeof (struct attr));
|
2007-05-04 22:15:47 +02:00
|
|
|
|
bgp_attr_extra_get (attr);
|
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
|
attr->origin = origin;
|
|
|
|
|
attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_ORIGIN);
|
|
|
|
|
attr->aspath = aspath_empty ();
|
|
|
|
|
attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_AS_PATH);
|
2007-05-04 22:15:47 +02:00
|
|
|
|
attr->extra->weight = BGP_ATTR_DEFAULT_WEIGHT;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_NEXT_HOP);
|
|
|
|
|
#ifdef HAVE_IPV6
|
2007-05-04 22:15:47 +02:00
|
|
|
|
attr->extra->mp_nexthop_len = IPV6_MAX_BYTELEN;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
#endif
|
2007-04-29 20:31:07 +02:00
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
|
return attr;
|
|
|
|
|
}
|
|
|
|
|
|
2007-04-29 20:31:07 +02:00
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
|
/* Make network statement's attribute. */
|
|
|
|
|
struct attr *
|
|
|
|
|
bgp_attr_default_intern (u_char origin)
|
|
|
|
|
{
|
|
|
|
|
struct attr attr;
|
|
|
|
|
struct attr *new;
|
2007-05-04 22:15:47 +02:00
|
|
|
|
struct attr_extra *attre;
|
|
|
|
|
|
|
|
|
|
memset (&attr, 0, sizeof (struct attr));
|
|
|
|
|
attre = bgp_attr_extra_get (&attr);
|
|
|
|
|
|
2007-04-29 20:31:07 +02:00
|
|
|
|
bgp_attr_default_set(&attr, origin);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
|
|
new = bgp_attr_intern (&attr);
|
2007-05-04 22:15:47 +02:00
|
|
|
|
bgp_attr_extra_free (&attr);
|
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
|
aspath_unintern (new->aspath);
|
|
|
|
|
return new;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct attr *
|
|
|
|
|
bgp_attr_aggregate_intern (struct bgp *bgp, u_char origin,
|
|
|
|
|
struct aspath *aspath,
|
|
|
|
|
struct community *community, int as_set)
|
|
|
|
|
{
|
|
|
|
|
struct attr attr;
|
|
|
|
|
struct attr *new;
|
2007-05-04 22:15:47 +02:00
|
|
|
|
struct attr_extra *attre;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
|
|
memset (&attr, 0, sizeof (struct attr));
|
2007-05-04 22:15:47 +02:00
|
|
|
|
attre = bgp_attr_extra_get (&attr);
|
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
|
/* Origin attribute. */
|
|
|
|
|
attr.origin = origin;
|
|
|
|
|
attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_ORIGIN);
|
|
|
|
|
|
|
|
|
|
/* AS path attribute. */
|
|
|
|
|
if (aspath)
|
|
|
|
|
attr.aspath = aspath_intern (aspath);
|
|
|
|
|
else
|
|
|
|
|
attr.aspath = aspath_empty ();
|
|
|
|
|
attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_AS_PATH);
|
|
|
|
|
|
|
|
|
|
/* Next hop attribute. */
|
|
|
|
|
attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_NEXT_HOP);
|
|
|
|
|
|
|
|
|
|
if (community)
|
|
|
|
|
{
|
|
|
|
|
attr.community = community;
|
|
|
|
|
attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_COMMUNITIES);
|
|
|
|
|
}
|
|
|
|
|
|
2007-05-04 22:15:47 +02:00
|
|
|
|
attre->weight = BGP_ATTR_DEFAULT_WEIGHT;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
#ifdef HAVE_IPV6
|
2007-05-04 22:15:47 +02:00
|
|
|
|
attre->mp_nexthop_len = IPV6_MAX_BYTELEN;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
#endif
|
|
|
|
|
if (! as_set)
|
|
|
|
|
attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE);
|
|
|
|
|
attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_AGGREGATOR);
|
|
|
|
|
if (CHECK_FLAG (bgp->config, BGP_CONFIG_CONFEDERATION))
|
2007-05-04 22:15:47 +02:00
|
|
|
|
attre->aggregator_as = bgp->confed_id;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
else
|
2007-05-04 22:15:47 +02:00
|
|
|
|
attre->aggregator_as = bgp->as;
|
|
|
|
|
attre->aggregator_addr = bgp->router_id;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
|
|
new = bgp_attr_intern (&attr);
|
2007-05-04 22:15:47 +02:00
|
|
|
|
bgp_attr_extra_free (&attr);
|
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
|
aspath_unintern (new->aspath);
|
|
|
|
|
return new;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Free bgp attribute and aspath. */
|
|
|
|
|
void
|
|
|
|
|
bgp_attr_unintern (struct attr *attr)
|
|
|
|
|
{
|
|
|
|
|
struct attr *ret;
|
|
|
|
|
struct aspath *aspath;
|
|
|
|
|
struct community *community;
|
2007-05-04 22:15:47 +02:00
|
|
|
|
struct ecommunity *ecommunity = NULL;
|
|
|
|
|
struct cluster_list *cluster = NULL;
|
|
|
|
|
struct transit *transit = NULL;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
|
|
/* Decrement attribute reference. */
|
|
|
|
|
attr->refcnt--;
|
|
|
|
|
aspath = attr->aspath;
|
|
|
|
|
community = attr->community;
|
2007-05-04 22:15:47 +02:00
|
|
|
|
if (attr->extra)
|
|
|
|
|
{
|
|
|
|
|
ecommunity = attr->extra->ecommunity;
|
|
|
|
|
cluster = attr->extra->cluster;
|
|
|
|
|
transit = attr->extra->transit;
|
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
|
|
/* If reference becomes zero then free attribute object. */
|
|
|
|
|
if (attr->refcnt == 0)
|
|
|
|
|
{
|
|
|
|
|
ret = hash_release (attrhash, attr);
|
|
|
|
|
assert (ret != NULL);
|
2007-05-04 22:15:47 +02:00
|
|
|
|
bgp_attr_extra_free (attr);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
XFREE (MTYPE_ATTR, attr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* aspath refcount shoud be decrement. */
|
|
|
|
|
if (aspath)
|
|
|
|
|
aspath_unintern (aspath);
|
|
|
|
|
if (community)
|
|
|
|
|
community_unintern (community);
|
|
|
|
|
if (ecommunity)
|
|
|
|
|
ecommunity_unintern (ecommunity);
|
|
|
|
|
if (cluster)
|
|
|
|
|
cluster_unintern (cluster);
|
|
|
|
|
if (transit)
|
|
|
|
|
transit_unintern (transit);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
bgp_attr_flush (struct attr *attr)
|
|
|
|
|
{
|
|
|
|
|
if (attr->aspath && ! attr->aspath->refcnt)
|
|
|
|
|
aspath_free (attr->aspath);
|
|
|
|
|
if (attr->community && ! attr->community->refcnt)
|
|
|
|
|
community_free (attr->community);
|
2007-05-04 22:15:47 +02:00
|
|
|
|
if (attr->extra)
|
|
|
|
|
{
|
|
|
|
|
struct attr_extra *attre = attr->extra;
|
|
|
|
|
if (attre->ecommunity && ! attre->ecommunity->refcnt)
|
|
|
|
|
ecommunity_free (attre->ecommunity);
|
|
|
|
|
if (attre->cluster && ! attre->cluster->refcnt)
|
|
|
|
|
cluster_free (attre->cluster);
|
|
|
|
|
if (attre->transit && ! attre->transit->refcnt)
|
|
|
|
|
transit_free (attre->transit);
|
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
}
|
|
|
|
|
|
2007-08-06 17:24:51 +02:00
|
|
|
|
/* Parse AS_PATHLIMIT attribute in an UPDATE */
|
|
|
|
|
static int
|
|
|
|
|
bgp_attr_aspathlimit (struct peer *peer, bgp_size_t length,
|
|
|
|
|
struct attr *attr, u_char flag, u_char *startp)
|
|
|
|
|
{
|
|
|
|
|
bgp_size_t total;
|
|
|
|
|
|
|
|
|
|
total = length + (CHECK_FLAG (flag, BGP_ATTR_FLAG_EXTLEN) ? 4 : 3);
|
|
|
|
|
|
2008-06-01 16:29:03 +02:00
|
|
|
|
if (!CHECK_FLAG(flag, BGP_ATTR_FLAG_TRANS)
|
|
|
|
|
|| !CHECK_FLAG(flag, BGP_ATTR_FLAG_OPTIONAL))
|
2007-08-06 17:24:51 +02:00
|
|
|
|
{
|
|
|
|
|
zlog (peer->log, LOG_ERR,
|
|
|
|
|
"AS-Pathlimit attribute flag isn't transitive %d", flag);
|
|
|
|
|
bgp_notify_send_with_data (peer,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ERR,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ATTR_FLAG_ERR,
|
|
|
|
|
startp, total);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (length != 5)
|
|
|
|
|
{
|
|
|
|
|
zlog (peer->log, LOG_ERR,
|
|
|
|
|
"AS-Pathlimit length, %u, is not 5", length);
|
|
|
|
|
bgp_notify_send_with_data (peer,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ERR,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ATTR_FLAG_ERR,
|
|
|
|
|
startp, total);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
attr->pathlimit.ttl = stream_getc (BGP_INPUT(peer));
|
|
|
|
|
attr->pathlimit.as = stream_getl (BGP_INPUT(peer));
|
|
|
|
|
attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_AS_PATHLIMIT);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
/* Get origin attribute of the update message. */
|
2005-06-28 14:44:16 +02:00
|
|
|
|
static int
|
2002-12-13 21:15:29 +01:00
|
|
|
|
bgp_attr_origin (struct peer *peer, bgp_size_t length,
|
|
|
|
|
struct attr *attr, u_char flag, u_char *startp)
|
|
|
|
|
{
|
|
|
|
|
bgp_size_t total;
|
|
|
|
|
|
|
|
|
|
/* total is entire attribute length include Attribute Flags (1),
|
|
|
|
|
Attribute Type code (1) and Attribute length (1 or 2). */
|
|
|
|
|
total = length + (CHECK_FLAG (flag, BGP_ATTR_FLAG_EXTLEN) ? 4 : 3);
|
|
|
|
|
|
|
|
|
|
/* If any recognized attribute has Attribute Flags that conflict
|
|
|
|
|
with the Attribute Type Code, then the Error Subcode is set to
|
|
|
|
|
Attribute Flags Error. The Data field contains the erroneous
|
|
|
|
|
attribute (type, length and value). */
|
|
|
|
|
if (flag != BGP_ATTR_FLAG_TRANS)
|
|
|
|
|
{
|
|
|
|
|
zlog (peer->log, LOG_ERR,
|
|
|
|
|
"Origin attribute flag isn't transitive %d", flag);
|
|
|
|
|
bgp_notify_send_with_data (peer,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ERR,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ATTR_FLAG_ERR,
|
|
|
|
|
startp, total);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* If any recognized attribute has Attribute Length that conflicts
|
|
|
|
|
with the expected length (based on the attribute type code), then
|
|
|
|
|
the Error Subcode is set to Attribute Length Error. The Data
|
|
|
|
|
field contains the erroneous attribute (type, length and
|
|
|
|
|
value). */
|
|
|
|
|
if (length != 1)
|
|
|
|
|
{
|
|
|
|
|
zlog (peer->log, LOG_ERR, "Origin attribute length is not one %d",
|
|
|
|
|
length);
|
|
|
|
|
bgp_notify_send_with_data (peer, BGP_NOTIFY_UPDATE_ERR,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ATTR_LENG_ERR,
|
|
|
|
|
startp, total);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Fetch origin attribute. */
|
|
|
|
|
attr->origin = stream_getc (BGP_INPUT (peer));
|
|
|
|
|
|
|
|
|
|
/* If the ORIGIN attribute has an undefined value, then the Error
|
|
|
|
|
Subcode is set to Invalid Origin Attribute. The Data field
|
|
|
|
|
contains the unrecognized attribute (type, length and value). */
|
|
|
|
|
if ((attr->origin != BGP_ORIGIN_IGP)
|
|
|
|
|
&& (attr->origin != BGP_ORIGIN_EGP)
|
|
|
|
|
&& (attr->origin != BGP_ORIGIN_INCOMPLETE))
|
|
|
|
|
{
|
|
|
|
|
zlog (peer->log, LOG_ERR, "Origin attribute value is invalid %d",
|
|
|
|
|
attr->origin);
|
|
|
|
|
|
|
|
|
|
bgp_notify_send_with_data (peer,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ERR,
|
|
|
|
|
BGP_NOTIFY_UPDATE_INVAL_ORIGIN,
|
|
|
|
|
startp, total);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Set oring attribute flag. */
|
|
|
|
|
attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_ORIGIN);
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Parse AS path information. This function is wrapper of
|
|
|
|
|
aspath_parse. */
|
2005-06-28 14:44:16 +02:00
|
|
|
|
static int
|
2002-12-13 21:15:29 +01:00
|
|
|
|
bgp_attr_aspath (struct peer *peer, bgp_size_t length,
|
|
|
|
|
struct attr *attr, u_char flag, u_char *startp)
|
|
|
|
|
{
|
|
|
|
|
bgp_size_t total;
|
|
|
|
|
|
|
|
|
|
total = length + (CHECK_FLAG (flag, BGP_ATTR_FLAG_EXTLEN) ? 4 : 3);
|
|
|
|
|
|
|
|
|
|
/* Flag check. */
|
|
|
|
|
if (CHECK_FLAG (flag, BGP_ATTR_FLAG_OPTIONAL)
|
|
|
|
|
|| ! CHECK_FLAG (flag, BGP_ATTR_FLAG_TRANS))
|
|
|
|
|
{
|
|
|
|
|
zlog (peer->log, LOG_ERR,
|
2008-06-01 16:29:03 +02:00
|
|
|
|
"As-Path attribute flag isn't transitive %d", flag);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
bgp_notify_send_with_data (peer,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ERR,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ATTR_FLAG_ERR,
|
|
|
|
|
startp, total);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
[bgpd] Merge AS4 support
2007-10-14 Paul Jakma <paul.jakma@sun.com>
* NEWS: Note that MRT dumps are now version 2
* (general) Merge in Juergen Kammer's AS4 patch.
2007-09-27 Paul Jakma <paul.jakma@sun.com>
* bgp_aspath.c: (assegment_normalise) remove duplicates from
from sets.
(aspath_reconcile_as4) disregard a broken part of the RFC around
error handling in path reconciliation.
* aspath_test.c: Test dupe-weeding from sets.
Test that reconciliation merges AS_PATH and AS4_PATH where
former is shorter than latter.
2007-09-26 Paul Jakma <paul.jakma@sun.com>
* aspath_test.c: Test AS4_PATH reconcilation where length
of AS_PATH and AS4_PATH is same.
2007-09-25 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (peek_for_as4_capability) Fix to work.
* bgp_packet.c: (bgp_open_receive) Fix sanity check of as4.
* tests/bgp_capability_test.c: (general) Extend tests to validate
peek_for_as4_capability.
Add test of full OPEN Option block, with multiple capabilities,
both as a series of Option, and a single option.
Add some crap to beginning of stream, to prevent code depending
on getp == 0.
2007-09-18 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (bgp_capability_as4) debug printf inline with others.
(peek_for_as4_capability) There's no need to signal failure, as
failure is better dealt with through full capability parser -
just return the AS4, simpler.
* bgp_packet.c: (bgp_open_receive) Update to match
peek_for_as4_capability change.
Allow use of BGP_AS_TRANS by 2b speakers.
Use NOTIFY_OPEN_ERR rather than CEASE for OPEN parsing errors.
(bgp_capability_msg_parse) missing argument to debug print
(bgp_capability_receive) missing return values.
* tests/bgp_capability_test.c: (parse_test) update for changes to
peek_for_as4_capability
2007-07-25 Paul Jakma <paul.jakma@sun.com>
* Remove 2-byte size macros, just make existing macros take
argument to indicate which size to use.
Adjust all users - typically they want '1'.
* bgp_aspath.c: (aspath_has_as4) New, return 1 if there are any
as4's in a path.
(aspath_put) Return the number of bytes actually written, to
fix the bug Juergen noted: Splitting of segments will change
the number of bytes written from that already written to the
AS_PATH header.
(aspath_snmp_pathseg) Pass 2-byte flag to aspath_put. SNMP
is still defined as 2b.
(aspath_aggregate) fix latent bug.
(aspath_reconcile_as4) AS_PATH+NEW_AS_PATH reconciliation
function.
(aspath_key_make) Hash the AS_PATH string, rather than
just taking the addition of assegment ASes as the hash value,
hopefully sligthly more collision resistant.
(bgp_attr_munge_as4_attrs) Collide the NEW_ attributes
together with the OLD 2-byte forms, code Juergen
had in bgp_attr_parse but re-organised a bit.
(bgp_attr_parse) Bunch of code from Juergen moves
to previous function.
(bgp_packet_attribute) Compact significantly by
just /always/ using extended-length attr header.
Fix bug Juergen noted, by using aspath_put's
(new) returned size value for the attr header rather
than the (guesstimate) of aspath_size() - the two could
differ when aspath_put had to split large segments, unlikely
this bug was ever hit in the 'wild'.
(bgp_dump_routes_attr) Always use extended-len and
use aspath_put return for header length. Output 4b ASN
for AS_PATH and AGGREGATOR.
* bgp_ecommunity.c: (ecommunity_{hash_make,cmp}) fix
hash callback declarations to match prototypes.
(ecommunity_gettoken) Updated for ECOMMUNITY_ENCODE_AS4,
complete rewrite of Juergen's changes (no asdot support)
* bgp_open.c: (bgp_capability_as4) New, does what it says
on the tin.
(peek_for_as4_capability) Rewritten to use streams and
bgp_capability_as4.
* bgp_packet.c: (bgp_open_send) minor edit
checked (in the abstract at least) with Juergen.
Changes are to be more accepting, e.g, allow AS_TRANS on
a 2-byte session.
* (general) Update all commands to use CMD_AS_RANGE.
* bgp_vty.c: (bgp_clear) Fix return vals to use CMD_..
Remove stuff replicated by VTY_GET_LONG
(bgp_clear_vty) Return bgp_clear directly to vty.
* tests/aspath_test.c: Exercise 32bit parsing. Test reconcile
function.
* tests/ecommunity_test.c: New, test AS4 ecommunity changes,
positive test only at this time, error cases not tested yet.
2007-07-25 Juergen Kammer <j.kammer@eurodata.de>
* (general) AS4 support.
* bgpd.h: as_t changes to 4-bytes.
* bgp_aspath.h: Add BGP_AS4_MAX and BGP_AS_TRANS defines.
* bgp_aspath.c: AS_VALUE_SIZE becomes 4-byte, AS16_VALUE_SIZE
added for 2-byte.
Add AS16 versions of length calc macros.
(aspath_count_numas) New, count number of ASes.
(aspath_has_as4) New, return 1 if there are any as4's in a
path.
(assegments_parse) Interpret assegment as 4 or 2 byte,
according to how the caller instructs us, with a new
argument.
(aspath_parse) Add use32bit argument to pass to
assegments_parse. Adjust all its callers to pass 1, unless
otherwise noted.
(assegment_data_put) Adjust to be able to write 2 or 4 byte
AS, according to new use32bit argument.
(aspath_put) Adjust to write 2 or 4.
(aspath_gettoken) Use a long for passed in asno.
* bgp_attr.c: (attr_str) Add BGP_ATTR_AS4_PATH and
BGP_ATTR_AS4_AGGREGATOR.
(bgp_attr_aspath) Call aspath_parse with right 2/4 arg, as
determined by received-capability flag.
(bgp_attr_aspath_check) New, code previously in attr_aspath
but moved to new func so it can be run after NEW_AS_PATH
reconciliation.
(bgp_attr_as4_path) New, handle NEW_AS_PATH.
(bgp_attr_aggregator) Adjust to cope with 2/4 byte ASes.
(bgp_attr_as4_aggregator) New, read NEW_AGGREGATOR.
(bgp_attr_parse) Add handoffs to previous parsers for the two
new AS4 NEW_ attributes.
Various checks added for NEW/OLD reconciliation.
(bgp_packet_attribute) Support 2/4 for AS_PATH and
AGGREGATOR, detect when NEW_ attrs need to be sent.
* bgp_debug.{c,h}: Add 'debug bgp as4'.
* bgp_dump.c: MRTv2 support, unconditionally enabled, which
supports AS4. Based on patches from Erik (RIPE?).
* bgp_ecommunity.c: (ecommunity_ecom2str) ECOMMUNITY_ENCODE_AS4
support.
* bgp_open.c: (peek_for_as4_capability) New, peek for AS4
capability prior to full capability parsing, so we know which
ASN to use for struct peer lookup.
(bgp_open_capability) Always send AS4 capability.
* bgp_packet.c: (bgp_open_send) AS4 handling for AS field
(bgp_open_receive) Peek for AS4 capability first, and figure
out which AS to believe.
* bgp_vty.c: (bgp_show_peer) Print AS4 cap
* tests/aspath_test.c: Support asn32 changes, call aspath_parse
with 16 bit.
* vtysh/extract.pl: AS4 compatibility for router bgp ASNUMBER
* vtysh/extract.pl.in: AS4 compatibility for router bgp ASNUMBER
* vtysh/vtysh.c: AS4 compatibility for router bgp ASNUMBER
2007-10-15 00:32:21 +02:00
|
|
|
|
/*
|
|
|
|
|
* peer with AS4 => will get 4Byte ASnums
|
|
|
|
|
* otherwise, will get 16 Bit
|
|
|
|
|
*/
|
|
|
|
|
attr->aspath = aspath_parse (peer->ibuf, length,
|
|
|
|
|
CHECK_FLAG (peer->cap, PEER_CAP_AS4_RCV));
|
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
|
/* In case of IBGP, length will be zero. */
|
|
|
|
|
if (! attr->aspath)
|
|
|
|
|
{
|
|
|
|
|
zlog (peer->log, LOG_ERR, "Malformed AS path length is %d", length);
|
|
|
|
|
bgp_notify_send (peer,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ERR,
|
|
|
|
|
BGP_NOTIFY_UPDATE_MAL_AS_PATH);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
[bgpd] Merge AS4 support
2007-10-14 Paul Jakma <paul.jakma@sun.com>
* NEWS: Note that MRT dumps are now version 2
* (general) Merge in Juergen Kammer's AS4 patch.
2007-09-27 Paul Jakma <paul.jakma@sun.com>
* bgp_aspath.c: (assegment_normalise) remove duplicates from
from sets.
(aspath_reconcile_as4) disregard a broken part of the RFC around
error handling in path reconciliation.
* aspath_test.c: Test dupe-weeding from sets.
Test that reconciliation merges AS_PATH and AS4_PATH where
former is shorter than latter.
2007-09-26 Paul Jakma <paul.jakma@sun.com>
* aspath_test.c: Test AS4_PATH reconcilation where length
of AS_PATH and AS4_PATH is same.
2007-09-25 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (peek_for_as4_capability) Fix to work.
* bgp_packet.c: (bgp_open_receive) Fix sanity check of as4.
* tests/bgp_capability_test.c: (general) Extend tests to validate
peek_for_as4_capability.
Add test of full OPEN Option block, with multiple capabilities,
both as a series of Option, and a single option.
Add some crap to beginning of stream, to prevent code depending
on getp == 0.
2007-09-18 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (bgp_capability_as4) debug printf inline with others.
(peek_for_as4_capability) There's no need to signal failure, as
failure is better dealt with through full capability parser -
just return the AS4, simpler.
* bgp_packet.c: (bgp_open_receive) Update to match
peek_for_as4_capability change.
Allow use of BGP_AS_TRANS by 2b speakers.
Use NOTIFY_OPEN_ERR rather than CEASE for OPEN parsing errors.
(bgp_capability_msg_parse) missing argument to debug print
(bgp_capability_receive) missing return values.
* tests/bgp_capability_test.c: (parse_test) update for changes to
peek_for_as4_capability
2007-07-25 Paul Jakma <paul.jakma@sun.com>
* Remove 2-byte size macros, just make existing macros take
argument to indicate which size to use.
Adjust all users - typically they want '1'.
* bgp_aspath.c: (aspath_has_as4) New, return 1 if there are any
as4's in a path.
(aspath_put) Return the number of bytes actually written, to
fix the bug Juergen noted: Splitting of segments will change
the number of bytes written from that already written to the
AS_PATH header.
(aspath_snmp_pathseg) Pass 2-byte flag to aspath_put. SNMP
is still defined as 2b.
(aspath_aggregate) fix latent bug.
(aspath_reconcile_as4) AS_PATH+NEW_AS_PATH reconciliation
function.
(aspath_key_make) Hash the AS_PATH string, rather than
just taking the addition of assegment ASes as the hash value,
hopefully sligthly more collision resistant.
(bgp_attr_munge_as4_attrs) Collide the NEW_ attributes
together with the OLD 2-byte forms, code Juergen
had in bgp_attr_parse but re-organised a bit.
(bgp_attr_parse) Bunch of code from Juergen moves
to previous function.
(bgp_packet_attribute) Compact significantly by
just /always/ using extended-length attr header.
Fix bug Juergen noted, by using aspath_put's
(new) returned size value for the attr header rather
than the (guesstimate) of aspath_size() - the two could
differ when aspath_put had to split large segments, unlikely
this bug was ever hit in the 'wild'.
(bgp_dump_routes_attr) Always use extended-len and
use aspath_put return for header length. Output 4b ASN
for AS_PATH and AGGREGATOR.
* bgp_ecommunity.c: (ecommunity_{hash_make,cmp}) fix
hash callback declarations to match prototypes.
(ecommunity_gettoken) Updated for ECOMMUNITY_ENCODE_AS4,
complete rewrite of Juergen's changes (no asdot support)
* bgp_open.c: (bgp_capability_as4) New, does what it says
on the tin.
(peek_for_as4_capability) Rewritten to use streams and
bgp_capability_as4.
* bgp_packet.c: (bgp_open_send) minor edit
checked (in the abstract at least) with Juergen.
Changes are to be more accepting, e.g, allow AS_TRANS on
a 2-byte session.
* (general) Update all commands to use CMD_AS_RANGE.
* bgp_vty.c: (bgp_clear) Fix return vals to use CMD_..
Remove stuff replicated by VTY_GET_LONG
(bgp_clear_vty) Return bgp_clear directly to vty.
* tests/aspath_test.c: Exercise 32bit parsing. Test reconcile
function.
* tests/ecommunity_test.c: New, test AS4 ecommunity changes,
positive test only at this time, error cases not tested yet.
2007-07-25 Juergen Kammer <j.kammer@eurodata.de>
* (general) AS4 support.
* bgpd.h: as_t changes to 4-bytes.
* bgp_aspath.h: Add BGP_AS4_MAX and BGP_AS_TRANS defines.
* bgp_aspath.c: AS_VALUE_SIZE becomes 4-byte, AS16_VALUE_SIZE
added for 2-byte.
Add AS16 versions of length calc macros.
(aspath_count_numas) New, count number of ASes.
(aspath_has_as4) New, return 1 if there are any as4's in a
path.
(assegments_parse) Interpret assegment as 4 or 2 byte,
according to how the caller instructs us, with a new
argument.
(aspath_parse) Add use32bit argument to pass to
assegments_parse. Adjust all its callers to pass 1, unless
otherwise noted.
(assegment_data_put) Adjust to be able to write 2 or 4 byte
AS, according to new use32bit argument.
(aspath_put) Adjust to write 2 or 4.
(aspath_gettoken) Use a long for passed in asno.
* bgp_attr.c: (attr_str) Add BGP_ATTR_AS4_PATH and
BGP_ATTR_AS4_AGGREGATOR.
(bgp_attr_aspath) Call aspath_parse with right 2/4 arg, as
determined by received-capability flag.
(bgp_attr_aspath_check) New, code previously in attr_aspath
but moved to new func so it can be run after NEW_AS_PATH
reconciliation.
(bgp_attr_as4_path) New, handle NEW_AS_PATH.
(bgp_attr_aggregator) Adjust to cope with 2/4 byte ASes.
(bgp_attr_as4_aggregator) New, read NEW_AGGREGATOR.
(bgp_attr_parse) Add handoffs to previous parsers for the two
new AS4 NEW_ attributes.
Various checks added for NEW/OLD reconciliation.
(bgp_packet_attribute) Support 2/4 for AS_PATH and
AGGREGATOR, detect when NEW_ attrs need to be sent.
* bgp_debug.{c,h}: Add 'debug bgp as4'.
* bgp_dump.c: MRTv2 support, unconditionally enabled, which
supports AS4. Based on patches from Erik (RIPE?).
* bgp_ecommunity.c: (ecommunity_ecom2str) ECOMMUNITY_ENCODE_AS4
support.
* bgp_open.c: (peek_for_as4_capability) New, peek for AS4
capability prior to full capability parsing, so we know which
ASN to use for struct peer lookup.
(bgp_open_capability) Always send AS4 capability.
* bgp_packet.c: (bgp_open_send) AS4 handling for AS field
(bgp_open_receive) Peek for AS4 capability first, and figure
out which AS to believe.
* bgp_vty.c: (bgp_show_peer) Print AS4 cap
* tests/aspath_test.c: Support asn32 changes, call aspath_parse
with 16 bit.
* vtysh/extract.pl: AS4 compatibility for router bgp ASNUMBER
* vtysh/extract.pl.in: AS4 compatibility for router bgp ASNUMBER
* vtysh/vtysh.c: AS4 compatibility for router bgp ASNUMBER
2007-10-15 00:32:21 +02:00
|
|
|
|
/* Forward pointer. */
|
|
|
|
|
/* stream_forward_getp (peer->ibuf, length);*/
|
|
|
|
|
|
|
|
|
|
/* Set aspath attribute flag. */
|
|
|
|
|
attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_AS_PATH);
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int bgp_attr_aspath_check( struct peer *peer,
|
|
|
|
|
struct attr *attr)
|
|
|
|
|
{
|
|
|
|
|
/* These checks were part of bgp_attr_aspath, but with
|
|
|
|
|
* as4 we should to check aspath things when
|
|
|
|
|
* aspath synthesizing with as4_path has already taken place.
|
|
|
|
|
* Otherwise we check ASPATH and use the synthesized thing, and that is
|
|
|
|
|
* not right.
|
|
|
|
|
* So do the checks later, i.e. here
|
|
|
|
|
*/
|
|
|
|
|
struct bgp *bgp = peer->bgp;
|
|
|
|
|
struct aspath *aspath;
|
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
|
bgp = peer->bgp;
|
|
|
|
|
|
|
|
|
|
/* First AS check for EBGP. */
|
|
|
|
|
if (bgp != NULL && bgp_flag_check (bgp, BGP_FLAG_ENFORCE_FIRST_AS))
|
|
|
|
|
{
|
|
|
|
|
if (peer_sort (peer) == BGP_PEER_EBGP
|
|
|
|
|
&& ! aspath_firstas_check (attr->aspath, peer->as))
|
|
|
|
|
{
|
|
|
|
|
zlog (peer->log, LOG_ERR,
|
2009-04-30 15:16:22 +02:00
|
|
|
|
"%s incorrect first AS (must be %u)", peer->host, peer->as);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
bgp_notify_send (peer,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ERR,
|
|
|
|
|
BGP_NOTIFY_UPDATE_MAL_AS_PATH);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* local-as prepend */
|
|
|
|
|
if (peer->change_local_as &&
|
|
|
|
|
! CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND))
|
|
|
|
|
{
|
|
|
|
|
aspath = aspath_dup (attr->aspath);
|
|
|
|
|
aspath = aspath_add_seq (aspath, peer->change_local_as);
|
|
|
|
|
aspath_unintern (attr->aspath);
|
|
|
|
|
attr->aspath = aspath_intern (aspath);
|
|
|
|
|
}
|
|
|
|
|
|
[bgpd] Merge AS4 support
2007-10-14 Paul Jakma <paul.jakma@sun.com>
* NEWS: Note that MRT dumps are now version 2
* (general) Merge in Juergen Kammer's AS4 patch.
2007-09-27 Paul Jakma <paul.jakma@sun.com>
* bgp_aspath.c: (assegment_normalise) remove duplicates from
from sets.
(aspath_reconcile_as4) disregard a broken part of the RFC around
error handling in path reconciliation.
* aspath_test.c: Test dupe-weeding from sets.
Test that reconciliation merges AS_PATH and AS4_PATH where
former is shorter than latter.
2007-09-26 Paul Jakma <paul.jakma@sun.com>
* aspath_test.c: Test AS4_PATH reconcilation where length
of AS_PATH and AS4_PATH is same.
2007-09-25 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (peek_for_as4_capability) Fix to work.
* bgp_packet.c: (bgp_open_receive) Fix sanity check of as4.
* tests/bgp_capability_test.c: (general) Extend tests to validate
peek_for_as4_capability.
Add test of full OPEN Option block, with multiple capabilities,
both as a series of Option, and a single option.
Add some crap to beginning of stream, to prevent code depending
on getp == 0.
2007-09-18 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (bgp_capability_as4) debug printf inline with others.
(peek_for_as4_capability) There's no need to signal failure, as
failure is better dealt with through full capability parser -
just return the AS4, simpler.
* bgp_packet.c: (bgp_open_receive) Update to match
peek_for_as4_capability change.
Allow use of BGP_AS_TRANS by 2b speakers.
Use NOTIFY_OPEN_ERR rather than CEASE for OPEN parsing errors.
(bgp_capability_msg_parse) missing argument to debug print
(bgp_capability_receive) missing return values.
* tests/bgp_capability_test.c: (parse_test) update for changes to
peek_for_as4_capability
2007-07-25 Paul Jakma <paul.jakma@sun.com>
* Remove 2-byte size macros, just make existing macros take
argument to indicate which size to use.
Adjust all users - typically they want '1'.
* bgp_aspath.c: (aspath_has_as4) New, return 1 if there are any
as4's in a path.
(aspath_put) Return the number of bytes actually written, to
fix the bug Juergen noted: Splitting of segments will change
the number of bytes written from that already written to the
AS_PATH header.
(aspath_snmp_pathseg) Pass 2-byte flag to aspath_put. SNMP
is still defined as 2b.
(aspath_aggregate) fix latent bug.
(aspath_reconcile_as4) AS_PATH+NEW_AS_PATH reconciliation
function.
(aspath_key_make) Hash the AS_PATH string, rather than
just taking the addition of assegment ASes as the hash value,
hopefully sligthly more collision resistant.
(bgp_attr_munge_as4_attrs) Collide the NEW_ attributes
together with the OLD 2-byte forms, code Juergen
had in bgp_attr_parse but re-organised a bit.
(bgp_attr_parse) Bunch of code from Juergen moves
to previous function.
(bgp_packet_attribute) Compact significantly by
just /always/ using extended-length attr header.
Fix bug Juergen noted, by using aspath_put's
(new) returned size value for the attr header rather
than the (guesstimate) of aspath_size() - the two could
differ when aspath_put had to split large segments, unlikely
this bug was ever hit in the 'wild'.
(bgp_dump_routes_attr) Always use extended-len and
use aspath_put return for header length. Output 4b ASN
for AS_PATH and AGGREGATOR.
* bgp_ecommunity.c: (ecommunity_{hash_make,cmp}) fix
hash callback declarations to match prototypes.
(ecommunity_gettoken) Updated for ECOMMUNITY_ENCODE_AS4,
complete rewrite of Juergen's changes (no asdot support)
* bgp_open.c: (bgp_capability_as4) New, does what it says
on the tin.
(peek_for_as4_capability) Rewritten to use streams and
bgp_capability_as4.
* bgp_packet.c: (bgp_open_send) minor edit
checked (in the abstract at least) with Juergen.
Changes are to be more accepting, e.g, allow AS_TRANS on
a 2-byte session.
* (general) Update all commands to use CMD_AS_RANGE.
* bgp_vty.c: (bgp_clear) Fix return vals to use CMD_..
Remove stuff replicated by VTY_GET_LONG
(bgp_clear_vty) Return bgp_clear directly to vty.
* tests/aspath_test.c: Exercise 32bit parsing. Test reconcile
function.
* tests/ecommunity_test.c: New, test AS4 ecommunity changes,
positive test only at this time, error cases not tested yet.
2007-07-25 Juergen Kammer <j.kammer@eurodata.de>
* (general) AS4 support.
* bgpd.h: as_t changes to 4-bytes.
* bgp_aspath.h: Add BGP_AS4_MAX and BGP_AS_TRANS defines.
* bgp_aspath.c: AS_VALUE_SIZE becomes 4-byte, AS16_VALUE_SIZE
added for 2-byte.
Add AS16 versions of length calc macros.
(aspath_count_numas) New, count number of ASes.
(aspath_has_as4) New, return 1 if there are any as4's in a
path.
(assegments_parse) Interpret assegment as 4 or 2 byte,
according to how the caller instructs us, with a new
argument.
(aspath_parse) Add use32bit argument to pass to
assegments_parse. Adjust all its callers to pass 1, unless
otherwise noted.
(assegment_data_put) Adjust to be able to write 2 or 4 byte
AS, according to new use32bit argument.
(aspath_put) Adjust to write 2 or 4.
(aspath_gettoken) Use a long for passed in asno.
* bgp_attr.c: (attr_str) Add BGP_ATTR_AS4_PATH and
BGP_ATTR_AS4_AGGREGATOR.
(bgp_attr_aspath) Call aspath_parse with right 2/4 arg, as
determined by received-capability flag.
(bgp_attr_aspath_check) New, code previously in attr_aspath
but moved to new func so it can be run after NEW_AS_PATH
reconciliation.
(bgp_attr_as4_path) New, handle NEW_AS_PATH.
(bgp_attr_aggregator) Adjust to cope with 2/4 byte ASes.
(bgp_attr_as4_aggregator) New, read NEW_AGGREGATOR.
(bgp_attr_parse) Add handoffs to previous parsers for the two
new AS4 NEW_ attributes.
Various checks added for NEW/OLD reconciliation.
(bgp_packet_attribute) Support 2/4 for AS_PATH and
AGGREGATOR, detect when NEW_ attrs need to be sent.
* bgp_debug.{c,h}: Add 'debug bgp as4'.
* bgp_dump.c: MRTv2 support, unconditionally enabled, which
supports AS4. Based on patches from Erik (RIPE?).
* bgp_ecommunity.c: (ecommunity_ecom2str) ECOMMUNITY_ENCODE_AS4
support.
* bgp_open.c: (peek_for_as4_capability) New, peek for AS4
capability prior to full capability parsing, so we know which
ASN to use for struct peer lookup.
(bgp_open_capability) Always send AS4 capability.
* bgp_packet.c: (bgp_open_send) AS4 handling for AS field
(bgp_open_receive) Peek for AS4 capability first, and figure
out which AS to believe.
* bgp_vty.c: (bgp_show_peer) Print AS4 cap
* tests/aspath_test.c: Support asn32 changes, call aspath_parse
with 16 bit.
* vtysh/extract.pl: AS4 compatibility for router bgp ASNUMBER
* vtysh/extract.pl.in: AS4 compatibility for router bgp ASNUMBER
* vtysh/vtysh.c: AS4 compatibility for router bgp ASNUMBER
2007-10-15 00:32:21 +02:00
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Parse AS4 path information. This function is another wrapper of
|
|
|
|
|
aspath_parse. */
|
|
|
|
|
static int
|
|
|
|
|
bgp_attr_as4_path (struct peer *peer, bgp_size_t length,
|
|
|
|
|
struct attr *attr, struct aspath **as4_path)
|
|
|
|
|
{
|
|
|
|
|
*as4_path = aspath_parse (peer->ibuf, length, 1);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
|
|
/* Set aspath attribute flag. */
|
2007-12-22 17:49:52 +01:00
|
|
|
|
if (as4_path)
|
|
|
|
|
attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_AS4_PATH);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Nexthop attribute. */
|
2005-06-28 14:44:16 +02:00
|
|
|
|
static int
|
2002-12-13 21:15:29 +01:00
|
|
|
|
bgp_attr_nexthop (struct peer *peer, bgp_size_t length,
|
|
|
|
|
struct attr *attr, u_char flag, u_char *startp)
|
|
|
|
|
{
|
|
|
|
|
bgp_size_t total;
|
|
|
|
|
|
|
|
|
|
total = length + (CHECK_FLAG (flag, BGP_ATTR_FLAG_EXTLEN) ? 4 : 3);
|
|
|
|
|
|
|
|
|
|
/* Flag check. */
|
|
|
|
|
if (CHECK_FLAG (flag, BGP_ATTR_FLAG_OPTIONAL)
|
|
|
|
|
|| ! CHECK_FLAG (flag, BGP_ATTR_FLAG_TRANS))
|
|
|
|
|
{
|
|
|
|
|
zlog (peer->log, LOG_ERR,
|
|
|
|
|
"Origin attribute flag isn't transitive %d", flag);
|
|
|
|
|
bgp_notify_send_with_data (peer,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ERR,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ATTR_FLAG_ERR,
|
|
|
|
|
startp, total);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Check nexthop attribute length. */
|
|
|
|
|
if (length != 4)
|
|
|
|
|
{
|
|
|
|
|
zlog (peer->log, LOG_ERR, "Nexthop attribute length isn't four [%d]",
|
|
|
|
|
length);
|
|
|
|
|
|
|
|
|
|
bgp_notify_send_with_data (peer,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ERR,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ATTR_LENG_ERR,
|
|
|
|
|
startp, total);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
attr->nexthop.s_addr = stream_get_ipv4 (peer->ibuf);
|
|
|
|
|
attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_NEXT_HOP);
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* MED atrribute. */
|
2005-06-28 14:44:16 +02:00
|
|
|
|
static int
|
2002-12-13 21:15:29 +01:00
|
|
|
|
bgp_attr_med (struct peer *peer, bgp_size_t length,
|
|
|
|
|
struct attr *attr, u_char flag, u_char *startp)
|
|
|
|
|
{
|
|
|
|
|
bgp_size_t total;
|
|
|
|
|
|
|
|
|
|
total = length + (CHECK_FLAG (flag, BGP_ATTR_FLAG_EXTLEN) ? 4 : 3);
|
|
|
|
|
|
|
|
|
|
/* Length check. */
|
|
|
|
|
if (length != 4)
|
|
|
|
|
{
|
|
|
|
|
zlog (peer->log, LOG_ERR,
|
|
|
|
|
"MED attribute length isn't four [%d]", length);
|
|
|
|
|
|
|
|
|
|
bgp_notify_send_with_data (peer,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ERR,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ATTR_LENG_ERR,
|
|
|
|
|
startp, total);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
attr->med = stream_getl (peer->ibuf);
|
|
|
|
|
|
|
|
|
|
attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC);
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Local preference attribute. */
|
2005-06-28 14:44:16 +02:00
|
|
|
|
static int
|
2002-12-13 21:15:29 +01:00
|
|
|
|
bgp_attr_local_pref (struct peer *peer, bgp_size_t length,
|
|
|
|
|
struct attr *attr, u_char flag)
|
|
|
|
|
{
|
|
|
|
|
/* If it is contained in an UPDATE message that is received from an
|
|
|
|
|
external peer, then this attribute MUST be ignored by the
|
|
|
|
|
receiving speaker. */
|
|
|
|
|
if (peer_sort (peer) == BGP_PEER_EBGP)
|
|
|
|
|
{
|
2005-02-09 16:51:56 +01:00
|
|
|
|
stream_forward_getp (peer->ibuf, length);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (length == 4)
|
|
|
|
|
attr->local_pref = stream_getl (peer->ibuf);
|
|
|
|
|
else
|
|
|
|
|
attr->local_pref = 0;
|
|
|
|
|
|
|
|
|
|
/* Set atomic aggregate flag. */
|
|
|
|
|
attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF);
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Atomic aggregate. */
|
2005-06-28 14:44:16 +02:00
|
|
|
|
static int
|
2002-12-13 21:15:29 +01:00
|
|
|
|
bgp_attr_atomic (struct peer *peer, bgp_size_t length,
|
|
|
|
|
struct attr *attr, u_char flag)
|
|
|
|
|
{
|
|
|
|
|
if (length != 0)
|
|
|
|
|
{
|
|
|
|
|
zlog (peer->log, LOG_ERR, "Bad atomic aggregate length %d", length);
|
|
|
|
|
|
|
|
|
|
bgp_notify_send (peer,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ERR,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ATTR_LENG_ERR);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Set atomic aggregate flag. */
|
|
|
|
|
attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE);
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Aggregator attribute */
|
2005-06-28 14:44:16 +02:00
|
|
|
|
static int
|
2002-12-13 21:15:29 +01:00
|
|
|
|
bgp_attr_aggregator (struct peer *peer, bgp_size_t length,
|
|
|
|
|
struct attr *attr, u_char flag)
|
|
|
|
|
{
|
[bgpd] Merge AS4 support
2007-10-14 Paul Jakma <paul.jakma@sun.com>
* NEWS: Note that MRT dumps are now version 2
* (general) Merge in Juergen Kammer's AS4 patch.
2007-09-27 Paul Jakma <paul.jakma@sun.com>
* bgp_aspath.c: (assegment_normalise) remove duplicates from
from sets.
(aspath_reconcile_as4) disregard a broken part of the RFC around
error handling in path reconciliation.
* aspath_test.c: Test dupe-weeding from sets.
Test that reconciliation merges AS_PATH and AS4_PATH where
former is shorter than latter.
2007-09-26 Paul Jakma <paul.jakma@sun.com>
* aspath_test.c: Test AS4_PATH reconcilation where length
of AS_PATH and AS4_PATH is same.
2007-09-25 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (peek_for_as4_capability) Fix to work.
* bgp_packet.c: (bgp_open_receive) Fix sanity check of as4.
* tests/bgp_capability_test.c: (general) Extend tests to validate
peek_for_as4_capability.
Add test of full OPEN Option block, with multiple capabilities,
both as a series of Option, and a single option.
Add some crap to beginning of stream, to prevent code depending
on getp == 0.
2007-09-18 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (bgp_capability_as4) debug printf inline with others.
(peek_for_as4_capability) There's no need to signal failure, as
failure is better dealt with through full capability parser -
just return the AS4, simpler.
* bgp_packet.c: (bgp_open_receive) Update to match
peek_for_as4_capability change.
Allow use of BGP_AS_TRANS by 2b speakers.
Use NOTIFY_OPEN_ERR rather than CEASE for OPEN parsing errors.
(bgp_capability_msg_parse) missing argument to debug print
(bgp_capability_receive) missing return values.
* tests/bgp_capability_test.c: (parse_test) update for changes to
peek_for_as4_capability
2007-07-25 Paul Jakma <paul.jakma@sun.com>
* Remove 2-byte size macros, just make existing macros take
argument to indicate which size to use.
Adjust all users - typically they want '1'.
* bgp_aspath.c: (aspath_has_as4) New, return 1 if there are any
as4's in a path.
(aspath_put) Return the number of bytes actually written, to
fix the bug Juergen noted: Splitting of segments will change
the number of bytes written from that already written to the
AS_PATH header.
(aspath_snmp_pathseg) Pass 2-byte flag to aspath_put. SNMP
is still defined as 2b.
(aspath_aggregate) fix latent bug.
(aspath_reconcile_as4) AS_PATH+NEW_AS_PATH reconciliation
function.
(aspath_key_make) Hash the AS_PATH string, rather than
just taking the addition of assegment ASes as the hash value,
hopefully sligthly more collision resistant.
(bgp_attr_munge_as4_attrs) Collide the NEW_ attributes
together with the OLD 2-byte forms, code Juergen
had in bgp_attr_parse but re-organised a bit.
(bgp_attr_parse) Bunch of code from Juergen moves
to previous function.
(bgp_packet_attribute) Compact significantly by
just /always/ using extended-length attr header.
Fix bug Juergen noted, by using aspath_put's
(new) returned size value for the attr header rather
than the (guesstimate) of aspath_size() - the two could
differ when aspath_put had to split large segments, unlikely
this bug was ever hit in the 'wild'.
(bgp_dump_routes_attr) Always use extended-len and
use aspath_put return for header length. Output 4b ASN
for AS_PATH and AGGREGATOR.
* bgp_ecommunity.c: (ecommunity_{hash_make,cmp}) fix
hash callback declarations to match prototypes.
(ecommunity_gettoken) Updated for ECOMMUNITY_ENCODE_AS4,
complete rewrite of Juergen's changes (no asdot support)
* bgp_open.c: (bgp_capability_as4) New, does what it says
on the tin.
(peek_for_as4_capability) Rewritten to use streams and
bgp_capability_as4.
* bgp_packet.c: (bgp_open_send) minor edit
checked (in the abstract at least) with Juergen.
Changes are to be more accepting, e.g, allow AS_TRANS on
a 2-byte session.
* (general) Update all commands to use CMD_AS_RANGE.
* bgp_vty.c: (bgp_clear) Fix return vals to use CMD_..
Remove stuff replicated by VTY_GET_LONG
(bgp_clear_vty) Return bgp_clear directly to vty.
* tests/aspath_test.c: Exercise 32bit parsing. Test reconcile
function.
* tests/ecommunity_test.c: New, test AS4 ecommunity changes,
positive test only at this time, error cases not tested yet.
2007-07-25 Juergen Kammer <j.kammer@eurodata.de>
* (general) AS4 support.
* bgpd.h: as_t changes to 4-bytes.
* bgp_aspath.h: Add BGP_AS4_MAX and BGP_AS_TRANS defines.
* bgp_aspath.c: AS_VALUE_SIZE becomes 4-byte, AS16_VALUE_SIZE
added for 2-byte.
Add AS16 versions of length calc macros.
(aspath_count_numas) New, count number of ASes.
(aspath_has_as4) New, return 1 if there are any as4's in a
path.
(assegments_parse) Interpret assegment as 4 or 2 byte,
according to how the caller instructs us, with a new
argument.
(aspath_parse) Add use32bit argument to pass to
assegments_parse. Adjust all its callers to pass 1, unless
otherwise noted.
(assegment_data_put) Adjust to be able to write 2 or 4 byte
AS, according to new use32bit argument.
(aspath_put) Adjust to write 2 or 4.
(aspath_gettoken) Use a long for passed in asno.
* bgp_attr.c: (attr_str) Add BGP_ATTR_AS4_PATH and
BGP_ATTR_AS4_AGGREGATOR.
(bgp_attr_aspath) Call aspath_parse with right 2/4 arg, as
determined by received-capability flag.
(bgp_attr_aspath_check) New, code previously in attr_aspath
but moved to new func so it can be run after NEW_AS_PATH
reconciliation.
(bgp_attr_as4_path) New, handle NEW_AS_PATH.
(bgp_attr_aggregator) Adjust to cope with 2/4 byte ASes.
(bgp_attr_as4_aggregator) New, read NEW_AGGREGATOR.
(bgp_attr_parse) Add handoffs to previous parsers for the two
new AS4 NEW_ attributes.
Various checks added for NEW/OLD reconciliation.
(bgp_packet_attribute) Support 2/4 for AS_PATH and
AGGREGATOR, detect when NEW_ attrs need to be sent.
* bgp_debug.{c,h}: Add 'debug bgp as4'.
* bgp_dump.c: MRTv2 support, unconditionally enabled, which
supports AS4. Based on patches from Erik (RIPE?).
* bgp_ecommunity.c: (ecommunity_ecom2str) ECOMMUNITY_ENCODE_AS4
support.
* bgp_open.c: (peek_for_as4_capability) New, peek for AS4
capability prior to full capability parsing, so we know which
ASN to use for struct peer lookup.
(bgp_open_capability) Always send AS4 capability.
* bgp_packet.c: (bgp_open_send) AS4 handling for AS field
(bgp_open_receive) Peek for AS4 capability first, and figure
out which AS to believe.
* bgp_vty.c: (bgp_show_peer) Print AS4 cap
* tests/aspath_test.c: Support asn32 changes, call aspath_parse
with 16 bit.
* vtysh/extract.pl: AS4 compatibility for router bgp ASNUMBER
* vtysh/extract.pl.in: AS4 compatibility for router bgp ASNUMBER
* vtysh/vtysh.c: AS4 compatibility for router bgp ASNUMBER
2007-10-15 00:32:21 +02:00
|
|
|
|
int wantedlen = 6;
|
2007-05-04 22:15:47 +02:00
|
|
|
|
struct attr_extra *attre = bgp_attr_extra_get (attr);
|
|
|
|
|
|
[bgpd] Merge AS4 support
2007-10-14 Paul Jakma <paul.jakma@sun.com>
* NEWS: Note that MRT dumps are now version 2
* (general) Merge in Juergen Kammer's AS4 patch.
2007-09-27 Paul Jakma <paul.jakma@sun.com>
* bgp_aspath.c: (assegment_normalise) remove duplicates from
from sets.
(aspath_reconcile_as4) disregard a broken part of the RFC around
error handling in path reconciliation.
* aspath_test.c: Test dupe-weeding from sets.
Test that reconciliation merges AS_PATH and AS4_PATH where
former is shorter than latter.
2007-09-26 Paul Jakma <paul.jakma@sun.com>
* aspath_test.c: Test AS4_PATH reconcilation where length
of AS_PATH and AS4_PATH is same.
2007-09-25 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (peek_for_as4_capability) Fix to work.
* bgp_packet.c: (bgp_open_receive) Fix sanity check of as4.
* tests/bgp_capability_test.c: (general) Extend tests to validate
peek_for_as4_capability.
Add test of full OPEN Option block, with multiple capabilities,
both as a series of Option, and a single option.
Add some crap to beginning of stream, to prevent code depending
on getp == 0.
2007-09-18 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (bgp_capability_as4) debug printf inline with others.
(peek_for_as4_capability) There's no need to signal failure, as
failure is better dealt with through full capability parser -
just return the AS4, simpler.
* bgp_packet.c: (bgp_open_receive) Update to match
peek_for_as4_capability change.
Allow use of BGP_AS_TRANS by 2b speakers.
Use NOTIFY_OPEN_ERR rather than CEASE for OPEN parsing errors.
(bgp_capability_msg_parse) missing argument to debug print
(bgp_capability_receive) missing return values.
* tests/bgp_capability_test.c: (parse_test) update for changes to
peek_for_as4_capability
2007-07-25 Paul Jakma <paul.jakma@sun.com>
* Remove 2-byte size macros, just make existing macros take
argument to indicate which size to use.
Adjust all users - typically they want '1'.
* bgp_aspath.c: (aspath_has_as4) New, return 1 if there are any
as4's in a path.
(aspath_put) Return the number of bytes actually written, to
fix the bug Juergen noted: Splitting of segments will change
the number of bytes written from that already written to the
AS_PATH header.
(aspath_snmp_pathseg) Pass 2-byte flag to aspath_put. SNMP
is still defined as 2b.
(aspath_aggregate) fix latent bug.
(aspath_reconcile_as4) AS_PATH+NEW_AS_PATH reconciliation
function.
(aspath_key_make) Hash the AS_PATH string, rather than
just taking the addition of assegment ASes as the hash value,
hopefully sligthly more collision resistant.
(bgp_attr_munge_as4_attrs) Collide the NEW_ attributes
together with the OLD 2-byte forms, code Juergen
had in bgp_attr_parse but re-organised a bit.
(bgp_attr_parse) Bunch of code from Juergen moves
to previous function.
(bgp_packet_attribute) Compact significantly by
just /always/ using extended-length attr header.
Fix bug Juergen noted, by using aspath_put's
(new) returned size value for the attr header rather
than the (guesstimate) of aspath_size() - the two could
differ when aspath_put had to split large segments, unlikely
this bug was ever hit in the 'wild'.
(bgp_dump_routes_attr) Always use extended-len and
use aspath_put return for header length. Output 4b ASN
for AS_PATH and AGGREGATOR.
* bgp_ecommunity.c: (ecommunity_{hash_make,cmp}) fix
hash callback declarations to match prototypes.
(ecommunity_gettoken) Updated for ECOMMUNITY_ENCODE_AS4,
complete rewrite of Juergen's changes (no asdot support)
* bgp_open.c: (bgp_capability_as4) New, does what it says
on the tin.
(peek_for_as4_capability) Rewritten to use streams and
bgp_capability_as4.
* bgp_packet.c: (bgp_open_send) minor edit
checked (in the abstract at least) with Juergen.
Changes are to be more accepting, e.g, allow AS_TRANS on
a 2-byte session.
* (general) Update all commands to use CMD_AS_RANGE.
* bgp_vty.c: (bgp_clear) Fix return vals to use CMD_..
Remove stuff replicated by VTY_GET_LONG
(bgp_clear_vty) Return bgp_clear directly to vty.
* tests/aspath_test.c: Exercise 32bit parsing. Test reconcile
function.
* tests/ecommunity_test.c: New, test AS4 ecommunity changes,
positive test only at this time, error cases not tested yet.
2007-07-25 Juergen Kammer <j.kammer@eurodata.de>
* (general) AS4 support.
* bgpd.h: as_t changes to 4-bytes.
* bgp_aspath.h: Add BGP_AS4_MAX and BGP_AS_TRANS defines.
* bgp_aspath.c: AS_VALUE_SIZE becomes 4-byte, AS16_VALUE_SIZE
added for 2-byte.
Add AS16 versions of length calc macros.
(aspath_count_numas) New, count number of ASes.
(aspath_has_as4) New, return 1 if there are any as4's in a
path.
(assegments_parse) Interpret assegment as 4 or 2 byte,
according to how the caller instructs us, with a new
argument.
(aspath_parse) Add use32bit argument to pass to
assegments_parse. Adjust all its callers to pass 1, unless
otherwise noted.
(assegment_data_put) Adjust to be able to write 2 or 4 byte
AS, according to new use32bit argument.
(aspath_put) Adjust to write 2 or 4.
(aspath_gettoken) Use a long for passed in asno.
* bgp_attr.c: (attr_str) Add BGP_ATTR_AS4_PATH and
BGP_ATTR_AS4_AGGREGATOR.
(bgp_attr_aspath) Call aspath_parse with right 2/4 arg, as
determined by received-capability flag.
(bgp_attr_aspath_check) New, code previously in attr_aspath
but moved to new func so it can be run after NEW_AS_PATH
reconciliation.
(bgp_attr_as4_path) New, handle NEW_AS_PATH.
(bgp_attr_aggregator) Adjust to cope with 2/4 byte ASes.
(bgp_attr_as4_aggregator) New, read NEW_AGGREGATOR.
(bgp_attr_parse) Add handoffs to previous parsers for the two
new AS4 NEW_ attributes.
Various checks added for NEW/OLD reconciliation.
(bgp_packet_attribute) Support 2/4 for AS_PATH and
AGGREGATOR, detect when NEW_ attrs need to be sent.
* bgp_debug.{c,h}: Add 'debug bgp as4'.
* bgp_dump.c: MRTv2 support, unconditionally enabled, which
supports AS4. Based on patches from Erik (RIPE?).
* bgp_ecommunity.c: (ecommunity_ecom2str) ECOMMUNITY_ENCODE_AS4
support.
* bgp_open.c: (peek_for_as4_capability) New, peek for AS4
capability prior to full capability parsing, so we know which
ASN to use for struct peer lookup.
(bgp_open_capability) Always send AS4 capability.
* bgp_packet.c: (bgp_open_send) AS4 handling for AS field
(bgp_open_receive) Peek for AS4 capability first, and figure
out which AS to believe.
* bgp_vty.c: (bgp_show_peer) Print AS4 cap
* tests/aspath_test.c: Support asn32 changes, call aspath_parse
with 16 bit.
* vtysh/extract.pl: AS4 compatibility for router bgp ASNUMBER
* vtysh/extract.pl.in: AS4 compatibility for router bgp ASNUMBER
* vtysh/vtysh.c: AS4 compatibility for router bgp ASNUMBER
2007-10-15 00:32:21 +02:00
|
|
|
|
/* peer with AS4 will send 4 Byte AS, peer without will send 2 Byte */
|
|
|
|
|
if ( CHECK_FLAG (peer->cap, PEER_CAP_AS4_RCV ) )
|
|
|
|
|
wantedlen = 8;
|
|
|
|
|
|
|
|
|
|
if (length != wantedlen)
|
2002-12-13 21:15:29 +01:00
|
|
|
|
{
|
[bgpd] Merge AS4 support
2007-10-14 Paul Jakma <paul.jakma@sun.com>
* NEWS: Note that MRT dumps are now version 2
* (general) Merge in Juergen Kammer's AS4 patch.
2007-09-27 Paul Jakma <paul.jakma@sun.com>
* bgp_aspath.c: (assegment_normalise) remove duplicates from
from sets.
(aspath_reconcile_as4) disregard a broken part of the RFC around
error handling in path reconciliation.
* aspath_test.c: Test dupe-weeding from sets.
Test that reconciliation merges AS_PATH and AS4_PATH where
former is shorter than latter.
2007-09-26 Paul Jakma <paul.jakma@sun.com>
* aspath_test.c: Test AS4_PATH reconcilation where length
of AS_PATH and AS4_PATH is same.
2007-09-25 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (peek_for_as4_capability) Fix to work.
* bgp_packet.c: (bgp_open_receive) Fix sanity check of as4.
* tests/bgp_capability_test.c: (general) Extend tests to validate
peek_for_as4_capability.
Add test of full OPEN Option block, with multiple capabilities,
both as a series of Option, and a single option.
Add some crap to beginning of stream, to prevent code depending
on getp == 0.
2007-09-18 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (bgp_capability_as4) debug printf inline with others.
(peek_for_as4_capability) There's no need to signal failure, as
failure is better dealt with through full capability parser -
just return the AS4, simpler.
* bgp_packet.c: (bgp_open_receive) Update to match
peek_for_as4_capability change.
Allow use of BGP_AS_TRANS by 2b speakers.
Use NOTIFY_OPEN_ERR rather than CEASE for OPEN parsing errors.
(bgp_capability_msg_parse) missing argument to debug print
(bgp_capability_receive) missing return values.
* tests/bgp_capability_test.c: (parse_test) update for changes to
peek_for_as4_capability
2007-07-25 Paul Jakma <paul.jakma@sun.com>
* Remove 2-byte size macros, just make existing macros take
argument to indicate which size to use.
Adjust all users - typically they want '1'.
* bgp_aspath.c: (aspath_has_as4) New, return 1 if there are any
as4's in a path.
(aspath_put) Return the number of bytes actually written, to
fix the bug Juergen noted: Splitting of segments will change
the number of bytes written from that already written to the
AS_PATH header.
(aspath_snmp_pathseg) Pass 2-byte flag to aspath_put. SNMP
is still defined as 2b.
(aspath_aggregate) fix latent bug.
(aspath_reconcile_as4) AS_PATH+NEW_AS_PATH reconciliation
function.
(aspath_key_make) Hash the AS_PATH string, rather than
just taking the addition of assegment ASes as the hash value,
hopefully sligthly more collision resistant.
(bgp_attr_munge_as4_attrs) Collide the NEW_ attributes
together with the OLD 2-byte forms, code Juergen
had in bgp_attr_parse but re-organised a bit.
(bgp_attr_parse) Bunch of code from Juergen moves
to previous function.
(bgp_packet_attribute) Compact significantly by
just /always/ using extended-length attr header.
Fix bug Juergen noted, by using aspath_put's
(new) returned size value for the attr header rather
than the (guesstimate) of aspath_size() - the two could
differ when aspath_put had to split large segments, unlikely
this bug was ever hit in the 'wild'.
(bgp_dump_routes_attr) Always use extended-len and
use aspath_put return for header length. Output 4b ASN
for AS_PATH and AGGREGATOR.
* bgp_ecommunity.c: (ecommunity_{hash_make,cmp}) fix
hash callback declarations to match prototypes.
(ecommunity_gettoken) Updated for ECOMMUNITY_ENCODE_AS4,
complete rewrite of Juergen's changes (no asdot support)
* bgp_open.c: (bgp_capability_as4) New, does what it says
on the tin.
(peek_for_as4_capability) Rewritten to use streams and
bgp_capability_as4.
* bgp_packet.c: (bgp_open_send) minor edit
checked (in the abstract at least) with Juergen.
Changes are to be more accepting, e.g, allow AS_TRANS on
a 2-byte session.
* (general) Update all commands to use CMD_AS_RANGE.
* bgp_vty.c: (bgp_clear) Fix return vals to use CMD_..
Remove stuff replicated by VTY_GET_LONG
(bgp_clear_vty) Return bgp_clear directly to vty.
* tests/aspath_test.c: Exercise 32bit parsing. Test reconcile
function.
* tests/ecommunity_test.c: New, test AS4 ecommunity changes,
positive test only at this time, error cases not tested yet.
2007-07-25 Juergen Kammer <j.kammer@eurodata.de>
* (general) AS4 support.
* bgpd.h: as_t changes to 4-bytes.
* bgp_aspath.h: Add BGP_AS4_MAX and BGP_AS_TRANS defines.
* bgp_aspath.c: AS_VALUE_SIZE becomes 4-byte, AS16_VALUE_SIZE
added for 2-byte.
Add AS16 versions of length calc macros.
(aspath_count_numas) New, count number of ASes.
(aspath_has_as4) New, return 1 if there are any as4's in a
path.
(assegments_parse) Interpret assegment as 4 or 2 byte,
according to how the caller instructs us, with a new
argument.
(aspath_parse) Add use32bit argument to pass to
assegments_parse. Adjust all its callers to pass 1, unless
otherwise noted.
(assegment_data_put) Adjust to be able to write 2 or 4 byte
AS, according to new use32bit argument.
(aspath_put) Adjust to write 2 or 4.
(aspath_gettoken) Use a long for passed in asno.
* bgp_attr.c: (attr_str) Add BGP_ATTR_AS4_PATH and
BGP_ATTR_AS4_AGGREGATOR.
(bgp_attr_aspath) Call aspath_parse with right 2/4 arg, as
determined by received-capability flag.
(bgp_attr_aspath_check) New, code previously in attr_aspath
but moved to new func so it can be run after NEW_AS_PATH
reconciliation.
(bgp_attr_as4_path) New, handle NEW_AS_PATH.
(bgp_attr_aggregator) Adjust to cope with 2/4 byte ASes.
(bgp_attr_as4_aggregator) New, read NEW_AGGREGATOR.
(bgp_attr_parse) Add handoffs to previous parsers for the two
new AS4 NEW_ attributes.
Various checks added for NEW/OLD reconciliation.
(bgp_packet_attribute) Support 2/4 for AS_PATH and
AGGREGATOR, detect when NEW_ attrs need to be sent.
* bgp_debug.{c,h}: Add 'debug bgp as4'.
* bgp_dump.c: MRTv2 support, unconditionally enabled, which
supports AS4. Based on patches from Erik (RIPE?).
* bgp_ecommunity.c: (ecommunity_ecom2str) ECOMMUNITY_ENCODE_AS4
support.
* bgp_open.c: (peek_for_as4_capability) New, peek for AS4
capability prior to full capability parsing, so we know which
ASN to use for struct peer lookup.
(bgp_open_capability) Always send AS4 capability.
* bgp_packet.c: (bgp_open_send) AS4 handling for AS field
(bgp_open_receive) Peek for AS4 capability first, and figure
out which AS to believe.
* bgp_vty.c: (bgp_show_peer) Print AS4 cap
* tests/aspath_test.c: Support asn32 changes, call aspath_parse
with 16 bit.
* vtysh/extract.pl: AS4 compatibility for router bgp ASNUMBER
* vtysh/extract.pl.in: AS4 compatibility for router bgp ASNUMBER
* vtysh/vtysh.c: AS4 compatibility for router bgp ASNUMBER
2007-10-15 00:32:21 +02:00
|
|
|
|
zlog (peer->log, LOG_ERR, "Aggregator length is not %d [%d]", wantedlen, length);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
|
|
bgp_notify_send (peer,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ERR,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ATTR_LENG_ERR);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
[bgpd] Merge AS4 support
2007-10-14 Paul Jakma <paul.jakma@sun.com>
* NEWS: Note that MRT dumps are now version 2
* (general) Merge in Juergen Kammer's AS4 patch.
2007-09-27 Paul Jakma <paul.jakma@sun.com>
* bgp_aspath.c: (assegment_normalise) remove duplicates from
from sets.
(aspath_reconcile_as4) disregard a broken part of the RFC around
error handling in path reconciliation.
* aspath_test.c: Test dupe-weeding from sets.
Test that reconciliation merges AS_PATH and AS4_PATH where
former is shorter than latter.
2007-09-26 Paul Jakma <paul.jakma@sun.com>
* aspath_test.c: Test AS4_PATH reconcilation where length
of AS_PATH and AS4_PATH is same.
2007-09-25 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (peek_for_as4_capability) Fix to work.
* bgp_packet.c: (bgp_open_receive) Fix sanity check of as4.
* tests/bgp_capability_test.c: (general) Extend tests to validate
peek_for_as4_capability.
Add test of full OPEN Option block, with multiple capabilities,
both as a series of Option, and a single option.
Add some crap to beginning of stream, to prevent code depending
on getp == 0.
2007-09-18 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (bgp_capability_as4) debug printf inline with others.
(peek_for_as4_capability) There's no need to signal failure, as
failure is better dealt with through full capability parser -
just return the AS4, simpler.
* bgp_packet.c: (bgp_open_receive) Update to match
peek_for_as4_capability change.
Allow use of BGP_AS_TRANS by 2b speakers.
Use NOTIFY_OPEN_ERR rather than CEASE for OPEN parsing errors.
(bgp_capability_msg_parse) missing argument to debug print
(bgp_capability_receive) missing return values.
* tests/bgp_capability_test.c: (parse_test) update for changes to
peek_for_as4_capability
2007-07-25 Paul Jakma <paul.jakma@sun.com>
* Remove 2-byte size macros, just make existing macros take
argument to indicate which size to use.
Adjust all users - typically they want '1'.
* bgp_aspath.c: (aspath_has_as4) New, return 1 if there are any
as4's in a path.
(aspath_put) Return the number of bytes actually written, to
fix the bug Juergen noted: Splitting of segments will change
the number of bytes written from that already written to the
AS_PATH header.
(aspath_snmp_pathseg) Pass 2-byte flag to aspath_put. SNMP
is still defined as 2b.
(aspath_aggregate) fix latent bug.
(aspath_reconcile_as4) AS_PATH+NEW_AS_PATH reconciliation
function.
(aspath_key_make) Hash the AS_PATH string, rather than
just taking the addition of assegment ASes as the hash value,
hopefully sligthly more collision resistant.
(bgp_attr_munge_as4_attrs) Collide the NEW_ attributes
together with the OLD 2-byte forms, code Juergen
had in bgp_attr_parse but re-organised a bit.
(bgp_attr_parse) Bunch of code from Juergen moves
to previous function.
(bgp_packet_attribute) Compact significantly by
just /always/ using extended-length attr header.
Fix bug Juergen noted, by using aspath_put's
(new) returned size value for the attr header rather
than the (guesstimate) of aspath_size() - the two could
differ when aspath_put had to split large segments, unlikely
this bug was ever hit in the 'wild'.
(bgp_dump_routes_attr) Always use extended-len and
use aspath_put return for header length. Output 4b ASN
for AS_PATH and AGGREGATOR.
* bgp_ecommunity.c: (ecommunity_{hash_make,cmp}) fix
hash callback declarations to match prototypes.
(ecommunity_gettoken) Updated for ECOMMUNITY_ENCODE_AS4,
complete rewrite of Juergen's changes (no asdot support)
* bgp_open.c: (bgp_capability_as4) New, does what it says
on the tin.
(peek_for_as4_capability) Rewritten to use streams and
bgp_capability_as4.
* bgp_packet.c: (bgp_open_send) minor edit
checked (in the abstract at least) with Juergen.
Changes are to be more accepting, e.g, allow AS_TRANS on
a 2-byte session.
* (general) Update all commands to use CMD_AS_RANGE.
* bgp_vty.c: (bgp_clear) Fix return vals to use CMD_..
Remove stuff replicated by VTY_GET_LONG
(bgp_clear_vty) Return bgp_clear directly to vty.
* tests/aspath_test.c: Exercise 32bit parsing. Test reconcile
function.
* tests/ecommunity_test.c: New, test AS4 ecommunity changes,
positive test only at this time, error cases not tested yet.
2007-07-25 Juergen Kammer <j.kammer@eurodata.de>
* (general) AS4 support.
* bgpd.h: as_t changes to 4-bytes.
* bgp_aspath.h: Add BGP_AS4_MAX and BGP_AS_TRANS defines.
* bgp_aspath.c: AS_VALUE_SIZE becomes 4-byte, AS16_VALUE_SIZE
added for 2-byte.
Add AS16 versions of length calc macros.
(aspath_count_numas) New, count number of ASes.
(aspath_has_as4) New, return 1 if there are any as4's in a
path.
(assegments_parse) Interpret assegment as 4 or 2 byte,
according to how the caller instructs us, with a new
argument.
(aspath_parse) Add use32bit argument to pass to
assegments_parse. Adjust all its callers to pass 1, unless
otherwise noted.
(assegment_data_put) Adjust to be able to write 2 or 4 byte
AS, according to new use32bit argument.
(aspath_put) Adjust to write 2 or 4.
(aspath_gettoken) Use a long for passed in asno.
* bgp_attr.c: (attr_str) Add BGP_ATTR_AS4_PATH and
BGP_ATTR_AS4_AGGREGATOR.
(bgp_attr_aspath) Call aspath_parse with right 2/4 arg, as
determined by received-capability flag.
(bgp_attr_aspath_check) New, code previously in attr_aspath
but moved to new func so it can be run after NEW_AS_PATH
reconciliation.
(bgp_attr_as4_path) New, handle NEW_AS_PATH.
(bgp_attr_aggregator) Adjust to cope with 2/4 byte ASes.
(bgp_attr_as4_aggregator) New, read NEW_AGGREGATOR.
(bgp_attr_parse) Add handoffs to previous parsers for the two
new AS4 NEW_ attributes.
Various checks added for NEW/OLD reconciliation.
(bgp_packet_attribute) Support 2/4 for AS_PATH and
AGGREGATOR, detect when NEW_ attrs need to be sent.
* bgp_debug.{c,h}: Add 'debug bgp as4'.
* bgp_dump.c: MRTv2 support, unconditionally enabled, which
supports AS4. Based on patches from Erik (RIPE?).
* bgp_ecommunity.c: (ecommunity_ecom2str) ECOMMUNITY_ENCODE_AS4
support.
* bgp_open.c: (peek_for_as4_capability) New, peek for AS4
capability prior to full capability parsing, so we know which
ASN to use for struct peer lookup.
(bgp_open_capability) Always send AS4 capability.
* bgp_packet.c: (bgp_open_send) AS4 handling for AS field
(bgp_open_receive) Peek for AS4 capability first, and figure
out which AS to believe.
* bgp_vty.c: (bgp_show_peer) Print AS4 cap
* tests/aspath_test.c: Support asn32 changes, call aspath_parse
with 16 bit.
* vtysh/extract.pl: AS4 compatibility for router bgp ASNUMBER
* vtysh/extract.pl.in: AS4 compatibility for router bgp ASNUMBER
* vtysh/vtysh.c: AS4 compatibility for router bgp ASNUMBER
2007-10-15 00:32:21 +02:00
|
|
|
|
|
|
|
|
|
if ( CHECK_FLAG (peer->cap, PEER_CAP_AS4_RCV ) )
|
|
|
|
|
attre->aggregator_as = stream_getl (peer->ibuf);
|
|
|
|
|
else
|
|
|
|
|
attre->aggregator_as = stream_getw (peer->ibuf);
|
2007-05-04 22:15:47 +02:00
|
|
|
|
attre->aggregator_addr.s_addr = stream_get_ipv4 (peer->ibuf);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
|
|
/* Set atomic aggregate flag. */
|
|
|
|
|
attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_AGGREGATOR);
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
[bgpd] Merge AS4 support
2007-10-14 Paul Jakma <paul.jakma@sun.com>
* NEWS: Note that MRT dumps are now version 2
* (general) Merge in Juergen Kammer's AS4 patch.
2007-09-27 Paul Jakma <paul.jakma@sun.com>
* bgp_aspath.c: (assegment_normalise) remove duplicates from
from sets.
(aspath_reconcile_as4) disregard a broken part of the RFC around
error handling in path reconciliation.
* aspath_test.c: Test dupe-weeding from sets.
Test that reconciliation merges AS_PATH and AS4_PATH where
former is shorter than latter.
2007-09-26 Paul Jakma <paul.jakma@sun.com>
* aspath_test.c: Test AS4_PATH reconcilation where length
of AS_PATH and AS4_PATH is same.
2007-09-25 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (peek_for_as4_capability) Fix to work.
* bgp_packet.c: (bgp_open_receive) Fix sanity check of as4.
* tests/bgp_capability_test.c: (general) Extend tests to validate
peek_for_as4_capability.
Add test of full OPEN Option block, with multiple capabilities,
both as a series of Option, and a single option.
Add some crap to beginning of stream, to prevent code depending
on getp == 0.
2007-09-18 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (bgp_capability_as4) debug printf inline with others.
(peek_for_as4_capability) There's no need to signal failure, as
failure is better dealt with through full capability parser -
just return the AS4, simpler.
* bgp_packet.c: (bgp_open_receive) Update to match
peek_for_as4_capability change.
Allow use of BGP_AS_TRANS by 2b speakers.
Use NOTIFY_OPEN_ERR rather than CEASE for OPEN parsing errors.
(bgp_capability_msg_parse) missing argument to debug print
(bgp_capability_receive) missing return values.
* tests/bgp_capability_test.c: (parse_test) update for changes to
peek_for_as4_capability
2007-07-25 Paul Jakma <paul.jakma@sun.com>
* Remove 2-byte size macros, just make existing macros take
argument to indicate which size to use.
Adjust all users - typically they want '1'.
* bgp_aspath.c: (aspath_has_as4) New, return 1 if there are any
as4's in a path.
(aspath_put) Return the number of bytes actually written, to
fix the bug Juergen noted: Splitting of segments will change
the number of bytes written from that already written to the
AS_PATH header.
(aspath_snmp_pathseg) Pass 2-byte flag to aspath_put. SNMP
is still defined as 2b.
(aspath_aggregate) fix latent bug.
(aspath_reconcile_as4) AS_PATH+NEW_AS_PATH reconciliation
function.
(aspath_key_make) Hash the AS_PATH string, rather than
just taking the addition of assegment ASes as the hash value,
hopefully sligthly more collision resistant.
(bgp_attr_munge_as4_attrs) Collide the NEW_ attributes
together with the OLD 2-byte forms, code Juergen
had in bgp_attr_parse but re-organised a bit.
(bgp_attr_parse) Bunch of code from Juergen moves
to previous function.
(bgp_packet_attribute) Compact significantly by
just /always/ using extended-length attr header.
Fix bug Juergen noted, by using aspath_put's
(new) returned size value for the attr header rather
than the (guesstimate) of aspath_size() - the two could
differ when aspath_put had to split large segments, unlikely
this bug was ever hit in the 'wild'.
(bgp_dump_routes_attr) Always use extended-len and
use aspath_put return for header length. Output 4b ASN
for AS_PATH and AGGREGATOR.
* bgp_ecommunity.c: (ecommunity_{hash_make,cmp}) fix
hash callback declarations to match prototypes.
(ecommunity_gettoken) Updated for ECOMMUNITY_ENCODE_AS4,
complete rewrite of Juergen's changes (no asdot support)
* bgp_open.c: (bgp_capability_as4) New, does what it says
on the tin.
(peek_for_as4_capability) Rewritten to use streams and
bgp_capability_as4.
* bgp_packet.c: (bgp_open_send) minor edit
checked (in the abstract at least) with Juergen.
Changes are to be more accepting, e.g, allow AS_TRANS on
a 2-byte session.
* (general) Update all commands to use CMD_AS_RANGE.
* bgp_vty.c: (bgp_clear) Fix return vals to use CMD_..
Remove stuff replicated by VTY_GET_LONG
(bgp_clear_vty) Return bgp_clear directly to vty.
* tests/aspath_test.c: Exercise 32bit parsing. Test reconcile
function.
* tests/ecommunity_test.c: New, test AS4 ecommunity changes,
positive test only at this time, error cases not tested yet.
2007-07-25 Juergen Kammer <j.kammer@eurodata.de>
* (general) AS4 support.
* bgpd.h: as_t changes to 4-bytes.
* bgp_aspath.h: Add BGP_AS4_MAX and BGP_AS_TRANS defines.
* bgp_aspath.c: AS_VALUE_SIZE becomes 4-byte, AS16_VALUE_SIZE
added for 2-byte.
Add AS16 versions of length calc macros.
(aspath_count_numas) New, count number of ASes.
(aspath_has_as4) New, return 1 if there are any as4's in a
path.
(assegments_parse) Interpret assegment as 4 or 2 byte,
according to how the caller instructs us, with a new
argument.
(aspath_parse) Add use32bit argument to pass to
assegments_parse. Adjust all its callers to pass 1, unless
otherwise noted.
(assegment_data_put) Adjust to be able to write 2 or 4 byte
AS, according to new use32bit argument.
(aspath_put) Adjust to write 2 or 4.
(aspath_gettoken) Use a long for passed in asno.
* bgp_attr.c: (attr_str) Add BGP_ATTR_AS4_PATH and
BGP_ATTR_AS4_AGGREGATOR.
(bgp_attr_aspath) Call aspath_parse with right 2/4 arg, as
determined by received-capability flag.
(bgp_attr_aspath_check) New, code previously in attr_aspath
but moved to new func so it can be run after NEW_AS_PATH
reconciliation.
(bgp_attr_as4_path) New, handle NEW_AS_PATH.
(bgp_attr_aggregator) Adjust to cope with 2/4 byte ASes.
(bgp_attr_as4_aggregator) New, read NEW_AGGREGATOR.
(bgp_attr_parse) Add handoffs to previous parsers for the two
new AS4 NEW_ attributes.
Various checks added for NEW/OLD reconciliation.
(bgp_packet_attribute) Support 2/4 for AS_PATH and
AGGREGATOR, detect when NEW_ attrs need to be sent.
* bgp_debug.{c,h}: Add 'debug bgp as4'.
* bgp_dump.c: MRTv2 support, unconditionally enabled, which
supports AS4. Based on patches from Erik (RIPE?).
* bgp_ecommunity.c: (ecommunity_ecom2str) ECOMMUNITY_ENCODE_AS4
support.
* bgp_open.c: (peek_for_as4_capability) New, peek for AS4
capability prior to full capability parsing, so we know which
ASN to use for struct peer lookup.
(bgp_open_capability) Always send AS4 capability.
* bgp_packet.c: (bgp_open_send) AS4 handling for AS field
(bgp_open_receive) Peek for AS4 capability first, and figure
out which AS to believe.
* bgp_vty.c: (bgp_show_peer) Print AS4 cap
* tests/aspath_test.c: Support asn32 changes, call aspath_parse
with 16 bit.
* vtysh/extract.pl: AS4 compatibility for router bgp ASNUMBER
* vtysh/extract.pl.in: AS4 compatibility for router bgp ASNUMBER
* vtysh/vtysh.c: AS4 compatibility for router bgp ASNUMBER
2007-10-15 00:32:21 +02:00
|
|
|
|
/* New Aggregator attribute */
|
|
|
|
|
static int
|
|
|
|
|
bgp_attr_as4_aggregator (struct peer *peer, bgp_size_t length,
|
|
|
|
|
struct attr *attr, as_t *as4_aggregator_as,
|
|
|
|
|
struct in_addr *as4_aggregator_addr)
|
|
|
|
|
{
|
|
|
|
|
if (length != 8)
|
|
|
|
|
{
|
|
|
|
|
zlog (peer->log, LOG_ERR, "New Aggregator length is not 8 [%d]", length);
|
|
|
|
|
|
|
|
|
|
bgp_notify_send (peer,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ERR,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ATTR_LENG_ERR);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
*as4_aggregator_as = stream_getl (peer->ibuf);
|
|
|
|
|
as4_aggregator_addr->s_addr = stream_get_ipv4 (peer->ibuf);
|
|
|
|
|
|
|
|
|
|
attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_AS4_AGGREGATOR);
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Munge Aggregator and New-Aggregator, AS_PATH and NEW_AS_PATH.
|
|
|
|
|
*/
|
|
|
|
|
static int
|
|
|
|
|
bgp_attr_munge_as4_attrs (struct peer *peer, struct attr *attr,
|
|
|
|
|
struct aspath *as4_path, as_t as4_aggregator,
|
|
|
|
|
struct in_addr *as4_aggregator_addr)
|
|
|
|
|
{
|
|
|
|
|
int ignore_as4_path = 0;
|
|
|
|
|
struct aspath *newpath;
|
|
|
|
|
struct attr_extra *attre = attr->extra;
|
|
|
|
|
|
|
|
|
|
if ( CHECK_FLAG (peer->cap, PEER_CAP_AS4_RCV) )
|
|
|
|
|
{
|
|
|
|
|
/* peer can do AS4, so we ignore AS4_PATH and AS4_AGGREGATOR
|
|
|
|
|
* if given.
|
|
|
|
|
* It is worth a warning though, because the peer really
|
|
|
|
|
* should not send them
|
|
|
|
|
*/
|
|
|
|
|
if (BGP_DEBUG(as4, AS4))
|
|
|
|
|
{
|
|
|
|
|
if (attr->flag & (ATTR_FLAG_BIT(BGP_ATTR_AS4_PATH)))
|
|
|
|
|
zlog_debug ("[AS4] %s %s AS4_PATH",
|
|
|
|
|
peer->host, "AS4 capable peer, yet it sent");
|
|
|
|
|
|
|
|
|
|
if (attr->flag & (ATTR_FLAG_BIT(BGP_ATTR_AS4_AGGREGATOR)))
|
|
|
|
|
zlog_debug ("[AS4] %s %s AS4_AGGREGATOR",
|
|
|
|
|
peer->host, "AS4 capable peer, yet it sent");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (attr->flag & ( ATTR_FLAG_BIT( BGP_ATTR_AS4_PATH))
|
|
|
|
|
&& !(attr->flag & ( ATTR_FLAG_BIT( BGP_ATTR_AS_PATH))))
|
|
|
|
|
{
|
|
|
|
|
/* Hu? This is not supposed to happen at all!
|
|
|
|
|
* got as4_path and no aspath,
|
|
|
|
|
* This should already
|
|
|
|
|
* have been handled by 'well known attributes missing'
|
|
|
|
|
* But... yeah, paranoia
|
|
|
|
|
* Take this as a "malformed attribute"
|
|
|
|
|
*/
|
|
|
|
|
zlog (peer->log, LOG_ERR,
|
|
|
|
|
"%s BGP not AS4 capable peer sent AS4_PATH but"
|
|
|
|
|
" no AS_PATH, cant do anything here", peer->host);
|
|
|
|
|
bgp_notify_send (peer,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ERR,
|
|
|
|
|
BGP_NOTIFY_UPDATE_MAL_ATTR);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* We have a asn16 peer. First, look for AS4_AGGREGATOR
|
|
|
|
|
* because that may override AS4_PATH
|
|
|
|
|
*/
|
|
|
|
|
if (attr->flag & (ATTR_FLAG_BIT (BGP_ATTR_AS4_AGGREGATOR) ) )
|
|
|
|
|
{
|
|
|
|
|
if ( attr->flag & (ATTR_FLAG_BIT (BGP_ATTR_AGGREGATOR) ) )
|
|
|
|
|
{
|
2007-12-22 17:49:52 +01:00
|
|
|
|
assert (attre);
|
|
|
|
|
|
[bgpd] Merge AS4 support
2007-10-14 Paul Jakma <paul.jakma@sun.com>
* NEWS: Note that MRT dumps are now version 2
* (general) Merge in Juergen Kammer's AS4 patch.
2007-09-27 Paul Jakma <paul.jakma@sun.com>
* bgp_aspath.c: (assegment_normalise) remove duplicates from
from sets.
(aspath_reconcile_as4) disregard a broken part of the RFC around
error handling in path reconciliation.
* aspath_test.c: Test dupe-weeding from sets.
Test that reconciliation merges AS_PATH and AS4_PATH where
former is shorter than latter.
2007-09-26 Paul Jakma <paul.jakma@sun.com>
* aspath_test.c: Test AS4_PATH reconcilation where length
of AS_PATH and AS4_PATH is same.
2007-09-25 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (peek_for_as4_capability) Fix to work.
* bgp_packet.c: (bgp_open_receive) Fix sanity check of as4.
* tests/bgp_capability_test.c: (general) Extend tests to validate
peek_for_as4_capability.
Add test of full OPEN Option block, with multiple capabilities,
both as a series of Option, and a single option.
Add some crap to beginning of stream, to prevent code depending
on getp == 0.
2007-09-18 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (bgp_capability_as4) debug printf inline with others.
(peek_for_as4_capability) There's no need to signal failure, as
failure is better dealt with through full capability parser -
just return the AS4, simpler.
* bgp_packet.c: (bgp_open_receive) Update to match
peek_for_as4_capability change.
Allow use of BGP_AS_TRANS by 2b speakers.
Use NOTIFY_OPEN_ERR rather than CEASE for OPEN parsing errors.
(bgp_capability_msg_parse) missing argument to debug print
(bgp_capability_receive) missing return values.
* tests/bgp_capability_test.c: (parse_test) update for changes to
peek_for_as4_capability
2007-07-25 Paul Jakma <paul.jakma@sun.com>
* Remove 2-byte size macros, just make existing macros take
argument to indicate which size to use.
Adjust all users - typically they want '1'.
* bgp_aspath.c: (aspath_has_as4) New, return 1 if there are any
as4's in a path.
(aspath_put) Return the number of bytes actually written, to
fix the bug Juergen noted: Splitting of segments will change
the number of bytes written from that already written to the
AS_PATH header.
(aspath_snmp_pathseg) Pass 2-byte flag to aspath_put. SNMP
is still defined as 2b.
(aspath_aggregate) fix latent bug.
(aspath_reconcile_as4) AS_PATH+NEW_AS_PATH reconciliation
function.
(aspath_key_make) Hash the AS_PATH string, rather than
just taking the addition of assegment ASes as the hash value,
hopefully sligthly more collision resistant.
(bgp_attr_munge_as4_attrs) Collide the NEW_ attributes
together with the OLD 2-byte forms, code Juergen
had in bgp_attr_parse but re-organised a bit.
(bgp_attr_parse) Bunch of code from Juergen moves
to previous function.
(bgp_packet_attribute) Compact significantly by
just /always/ using extended-length attr header.
Fix bug Juergen noted, by using aspath_put's
(new) returned size value for the attr header rather
than the (guesstimate) of aspath_size() - the two could
differ when aspath_put had to split large segments, unlikely
this bug was ever hit in the 'wild'.
(bgp_dump_routes_attr) Always use extended-len and
use aspath_put return for header length. Output 4b ASN
for AS_PATH and AGGREGATOR.
* bgp_ecommunity.c: (ecommunity_{hash_make,cmp}) fix
hash callback declarations to match prototypes.
(ecommunity_gettoken) Updated for ECOMMUNITY_ENCODE_AS4,
complete rewrite of Juergen's changes (no asdot support)
* bgp_open.c: (bgp_capability_as4) New, does what it says
on the tin.
(peek_for_as4_capability) Rewritten to use streams and
bgp_capability_as4.
* bgp_packet.c: (bgp_open_send) minor edit
checked (in the abstract at least) with Juergen.
Changes are to be more accepting, e.g, allow AS_TRANS on
a 2-byte session.
* (general) Update all commands to use CMD_AS_RANGE.
* bgp_vty.c: (bgp_clear) Fix return vals to use CMD_..
Remove stuff replicated by VTY_GET_LONG
(bgp_clear_vty) Return bgp_clear directly to vty.
* tests/aspath_test.c: Exercise 32bit parsing. Test reconcile
function.
* tests/ecommunity_test.c: New, test AS4 ecommunity changes,
positive test only at this time, error cases not tested yet.
2007-07-25 Juergen Kammer <j.kammer@eurodata.de>
* (general) AS4 support.
* bgpd.h: as_t changes to 4-bytes.
* bgp_aspath.h: Add BGP_AS4_MAX and BGP_AS_TRANS defines.
* bgp_aspath.c: AS_VALUE_SIZE becomes 4-byte, AS16_VALUE_SIZE
added for 2-byte.
Add AS16 versions of length calc macros.
(aspath_count_numas) New, count number of ASes.
(aspath_has_as4) New, return 1 if there are any as4's in a
path.
(assegments_parse) Interpret assegment as 4 or 2 byte,
according to how the caller instructs us, with a new
argument.
(aspath_parse) Add use32bit argument to pass to
assegments_parse. Adjust all its callers to pass 1, unless
otherwise noted.
(assegment_data_put) Adjust to be able to write 2 or 4 byte
AS, according to new use32bit argument.
(aspath_put) Adjust to write 2 or 4.
(aspath_gettoken) Use a long for passed in asno.
* bgp_attr.c: (attr_str) Add BGP_ATTR_AS4_PATH and
BGP_ATTR_AS4_AGGREGATOR.
(bgp_attr_aspath) Call aspath_parse with right 2/4 arg, as
determined by received-capability flag.
(bgp_attr_aspath_check) New, code previously in attr_aspath
but moved to new func so it can be run after NEW_AS_PATH
reconciliation.
(bgp_attr_as4_path) New, handle NEW_AS_PATH.
(bgp_attr_aggregator) Adjust to cope with 2/4 byte ASes.
(bgp_attr_as4_aggregator) New, read NEW_AGGREGATOR.
(bgp_attr_parse) Add handoffs to previous parsers for the two
new AS4 NEW_ attributes.
Various checks added for NEW/OLD reconciliation.
(bgp_packet_attribute) Support 2/4 for AS_PATH and
AGGREGATOR, detect when NEW_ attrs need to be sent.
* bgp_debug.{c,h}: Add 'debug bgp as4'.
* bgp_dump.c: MRTv2 support, unconditionally enabled, which
supports AS4. Based on patches from Erik (RIPE?).
* bgp_ecommunity.c: (ecommunity_ecom2str) ECOMMUNITY_ENCODE_AS4
support.
* bgp_open.c: (peek_for_as4_capability) New, peek for AS4
capability prior to full capability parsing, so we know which
ASN to use for struct peer lookup.
(bgp_open_capability) Always send AS4 capability.
* bgp_packet.c: (bgp_open_send) AS4 handling for AS field
(bgp_open_receive) Peek for AS4 capability first, and figure
out which AS to believe.
* bgp_vty.c: (bgp_show_peer) Print AS4 cap
* tests/aspath_test.c: Support asn32 changes, call aspath_parse
with 16 bit.
* vtysh/extract.pl: AS4 compatibility for router bgp ASNUMBER
* vtysh/extract.pl.in: AS4 compatibility for router bgp ASNUMBER
* vtysh/vtysh.c: AS4 compatibility for router bgp ASNUMBER
2007-10-15 00:32:21 +02:00
|
|
|
|
/* received both.
|
|
|
|
|
* if the as_number in aggregator is not AS_TRANS,
|
|
|
|
|
* then AS4_AGGREGATOR and AS4_PATH shall be ignored
|
|
|
|
|
* and the Aggregator shall be taken as
|
|
|
|
|
* info on the aggregating node, and the AS_PATH
|
|
|
|
|
* shall be taken as the AS_PATH
|
|
|
|
|
* otherwise
|
|
|
|
|
* the Aggregator shall be ignored and the
|
|
|
|
|
* AS4_AGGREGATOR shall be taken as the
|
|
|
|
|
* Aggregating node and the AS_PATH is to be
|
|
|
|
|
* constructed "as in all other cases"
|
|
|
|
|
*/
|
|
|
|
|
if ( attre->aggregator_as != BGP_AS_TRANS )
|
|
|
|
|
{
|
|
|
|
|
/* ignore */
|
|
|
|
|
if ( BGP_DEBUG(as4, AS4))
|
|
|
|
|
zlog_debug ("[AS4] %s BGP not AS4 capable peer"
|
|
|
|
|
" send AGGREGATOR != AS_TRANS and"
|
|
|
|
|
" AS4_AGGREGATOR, so ignore"
|
|
|
|
|
" AS4_AGGREGATOR and AS4_PATH", peer->host);
|
|
|
|
|
ignore_as4_path = 1;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
/* "New_aggregator shall be taken as aggregator" */
|
|
|
|
|
attre->aggregator_as = as4_aggregator;
|
|
|
|
|
attre->aggregator_addr.s_addr = as4_aggregator_addr->s_addr;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
/* We received a AS4_AGGREGATOR but no AGGREGATOR.
|
|
|
|
|
* That is bogus - but reading the conditions
|
|
|
|
|
* we have to handle AS4_AGGREGATOR as if it were
|
|
|
|
|
* AGGREGATOR in that case
|
|
|
|
|
*/
|
|
|
|
|
if ( BGP_DEBUG(as4, AS4))
|
|
|
|
|
zlog_debug ("[AS4] %s BGP not AS4 capable peer send"
|
|
|
|
|
" AS4_AGGREGATOR but no AGGREGATOR, will take"
|
|
|
|
|
" it as if AGGREGATOR with AS_TRANS had been there", peer->host);
|
2007-12-22 17:49:52 +01:00
|
|
|
|
(attre = bgp_attr_extra_get (attr))->aggregator_as = as4_aggregator;
|
[bgpd] Merge AS4 support
2007-10-14 Paul Jakma <paul.jakma@sun.com>
* NEWS: Note that MRT dumps are now version 2
* (general) Merge in Juergen Kammer's AS4 patch.
2007-09-27 Paul Jakma <paul.jakma@sun.com>
* bgp_aspath.c: (assegment_normalise) remove duplicates from
from sets.
(aspath_reconcile_as4) disregard a broken part of the RFC around
error handling in path reconciliation.
* aspath_test.c: Test dupe-weeding from sets.
Test that reconciliation merges AS_PATH and AS4_PATH where
former is shorter than latter.
2007-09-26 Paul Jakma <paul.jakma@sun.com>
* aspath_test.c: Test AS4_PATH reconcilation where length
of AS_PATH and AS4_PATH is same.
2007-09-25 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (peek_for_as4_capability) Fix to work.
* bgp_packet.c: (bgp_open_receive) Fix sanity check of as4.
* tests/bgp_capability_test.c: (general) Extend tests to validate
peek_for_as4_capability.
Add test of full OPEN Option block, with multiple capabilities,
both as a series of Option, and a single option.
Add some crap to beginning of stream, to prevent code depending
on getp == 0.
2007-09-18 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (bgp_capability_as4) debug printf inline with others.
(peek_for_as4_capability) There's no need to signal failure, as
failure is better dealt with through full capability parser -
just return the AS4, simpler.
* bgp_packet.c: (bgp_open_receive) Update to match
peek_for_as4_capability change.
Allow use of BGP_AS_TRANS by 2b speakers.
Use NOTIFY_OPEN_ERR rather than CEASE for OPEN parsing errors.
(bgp_capability_msg_parse) missing argument to debug print
(bgp_capability_receive) missing return values.
* tests/bgp_capability_test.c: (parse_test) update for changes to
peek_for_as4_capability
2007-07-25 Paul Jakma <paul.jakma@sun.com>
* Remove 2-byte size macros, just make existing macros take
argument to indicate which size to use.
Adjust all users - typically they want '1'.
* bgp_aspath.c: (aspath_has_as4) New, return 1 if there are any
as4's in a path.
(aspath_put) Return the number of bytes actually written, to
fix the bug Juergen noted: Splitting of segments will change
the number of bytes written from that already written to the
AS_PATH header.
(aspath_snmp_pathseg) Pass 2-byte flag to aspath_put. SNMP
is still defined as 2b.
(aspath_aggregate) fix latent bug.
(aspath_reconcile_as4) AS_PATH+NEW_AS_PATH reconciliation
function.
(aspath_key_make) Hash the AS_PATH string, rather than
just taking the addition of assegment ASes as the hash value,
hopefully sligthly more collision resistant.
(bgp_attr_munge_as4_attrs) Collide the NEW_ attributes
together with the OLD 2-byte forms, code Juergen
had in bgp_attr_parse but re-organised a bit.
(bgp_attr_parse) Bunch of code from Juergen moves
to previous function.
(bgp_packet_attribute) Compact significantly by
just /always/ using extended-length attr header.
Fix bug Juergen noted, by using aspath_put's
(new) returned size value for the attr header rather
than the (guesstimate) of aspath_size() - the two could
differ when aspath_put had to split large segments, unlikely
this bug was ever hit in the 'wild'.
(bgp_dump_routes_attr) Always use extended-len and
use aspath_put return for header length. Output 4b ASN
for AS_PATH and AGGREGATOR.
* bgp_ecommunity.c: (ecommunity_{hash_make,cmp}) fix
hash callback declarations to match prototypes.
(ecommunity_gettoken) Updated for ECOMMUNITY_ENCODE_AS4,
complete rewrite of Juergen's changes (no asdot support)
* bgp_open.c: (bgp_capability_as4) New, does what it says
on the tin.
(peek_for_as4_capability) Rewritten to use streams and
bgp_capability_as4.
* bgp_packet.c: (bgp_open_send) minor edit
checked (in the abstract at least) with Juergen.
Changes are to be more accepting, e.g, allow AS_TRANS on
a 2-byte session.
* (general) Update all commands to use CMD_AS_RANGE.
* bgp_vty.c: (bgp_clear) Fix return vals to use CMD_..
Remove stuff replicated by VTY_GET_LONG
(bgp_clear_vty) Return bgp_clear directly to vty.
* tests/aspath_test.c: Exercise 32bit parsing. Test reconcile
function.
* tests/ecommunity_test.c: New, test AS4 ecommunity changes,
positive test only at this time, error cases not tested yet.
2007-07-25 Juergen Kammer <j.kammer@eurodata.de>
* (general) AS4 support.
* bgpd.h: as_t changes to 4-bytes.
* bgp_aspath.h: Add BGP_AS4_MAX and BGP_AS_TRANS defines.
* bgp_aspath.c: AS_VALUE_SIZE becomes 4-byte, AS16_VALUE_SIZE
added for 2-byte.
Add AS16 versions of length calc macros.
(aspath_count_numas) New, count number of ASes.
(aspath_has_as4) New, return 1 if there are any as4's in a
path.
(assegments_parse) Interpret assegment as 4 or 2 byte,
according to how the caller instructs us, with a new
argument.
(aspath_parse) Add use32bit argument to pass to
assegments_parse. Adjust all its callers to pass 1, unless
otherwise noted.
(assegment_data_put) Adjust to be able to write 2 or 4 byte
AS, according to new use32bit argument.
(aspath_put) Adjust to write 2 or 4.
(aspath_gettoken) Use a long for passed in asno.
* bgp_attr.c: (attr_str) Add BGP_ATTR_AS4_PATH and
BGP_ATTR_AS4_AGGREGATOR.
(bgp_attr_aspath) Call aspath_parse with right 2/4 arg, as
determined by received-capability flag.
(bgp_attr_aspath_check) New, code previously in attr_aspath
but moved to new func so it can be run after NEW_AS_PATH
reconciliation.
(bgp_attr_as4_path) New, handle NEW_AS_PATH.
(bgp_attr_aggregator) Adjust to cope with 2/4 byte ASes.
(bgp_attr_as4_aggregator) New, read NEW_AGGREGATOR.
(bgp_attr_parse) Add handoffs to previous parsers for the two
new AS4 NEW_ attributes.
Various checks added for NEW/OLD reconciliation.
(bgp_packet_attribute) Support 2/4 for AS_PATH and
AGGREGATOR, detect when NEW_ attrs need to be sent.
* bgp_debug.{c,h}: Add 'debug bgp as4'.
* bgp_dump.c: MRTv2 support, unconditionally enabled, which
supports AS4. Based on patches from Erik (RIPE?).
* bgp_ecommunity.c: (ecommunity_ecom2str) ECOMMUNITY_ENCODE_AS4
support.
* bgp_open.c: (peek_for_as4_capability) New, peek for AS4
capability prior to full capability parsing, so we know which
ASN to use for struct peer lookup.
(bgp_open_capability) Always send AS4 capability.
* bgp_packet.c: (bgp_open_send) AS4 handling for AS field
(bgp_open_receive) Peek for AS4 capability first, and figure
out which AS to believe.
* bgp_vty.c: (bgp_show_peer) Print AS4 cap
* tests/aspath_test.c: Support asn32 changes, call aspath_parse
with 16 bit.
* vtysh/extract.pl: AS4 compatibility for router bgp ASNUMBER
* vtysh/extract.pl.in: AS4 compatibility for router bgp ASNUMBER
* vtysh/vtysh.c: AS4 compatibility for router bgp ASNUMBER
2007-10-15 00:32:21 +02:00
|
|
|
|
/* sweep it under the carpet and simulate a "good" AGGREGATOR */
|
|
|
|
|
attr->flag |= (ATTR_FLAG_BIT (BGP_ATTR_AGGREGATOR));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* need to reconcile NEW_AS_PATH and AS_PATH */
|
|
|
|
|
if ( !ignore_as4_path && (attr->flag & ( ATTR_FLAG_BIT( BGP_ATTR_AS4_PATH))) )
|
|
|
|
|
{
|
|
|
|
|
newpath = aspath_reconcile_as4 (attr->aspath, as4_path);
|
|
|
|
|
aspath_unintern (attr->aspath);
|
|
|
|
|
attr->aspath = aspath_intern (newpath);
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
|
/* Community attribute. */
|
2005-06-28 14:44:16 +02:00
|
|
|
|
static int
|
2002-12-13 21:15:29 +01:00
|
|
|
|
bgp_attr_community (struct peer *peer, bgp_size_t length,
|
|
|
|
|
struct attr *attr, u_char flag)
|
|
|
|
|
{
|
|
|
|
|
if (length == 0)
|
2007-09-07 16:24:55 +02:00
|
|
|
|
{
|
|
|
|
|
attr->community = NULL;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
else
|
|
|
|
|
{
|
2004-06-04 19:58:18 +02:00
|
|
|
|
attr->community =
|
|
|
|
|
community_parse ((u_int32_t *)stream_pnt (peer->ibuf), length);
|
2005-02-09 16:51:56 +01:00
|
|
|
|
stream_forward_getp (peer->ibuf, length);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_COMMUNITIES);
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Originator ID attribute. */
|
2005-06-28 14:44:16 +02:00
|
|
|
|
static int
|
2002-12-13 21:15:29 +01:00
|
|
|
|
bgp_attr_originator_id (struct peer *peer, bgp_size_t length,
|
|
|
|
|
struct attr *attr, u_char flag)
|
|
|
|
|
{
|
|
|
|
|
if (length != 4)
|
|
|
|
|
{
|
|
|
|
|
zlog (peer->log, LOG_ERR, "Bad originator ID length %d", length);
|
|
|
|
|
|
|
|
|
|
bgp_notify_send (peer,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ERR,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ATTR_LENG_ERR);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
2007-05-04 22:15:47 +02:00
|
|
|
|
(bgp_attr_extra_get (attr))->originator_id.s_addr
|
|
|
|
|
= stream_get_ipv4 (peer->ibuf);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
|
|
attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID);
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Cluster list attribute. */
|
2005-06-28 14:44:16 +02:00
|
|
|
|
static int
|
2002-12-13 21:15:29 +01:00
|
|
|
|
bgp_attr_cluster_list (struct peer *peer, bgp_size_t length,
|
|
|
|
|
struct attr *attr, u_char flag)
|
|
|
|
|
{
|
|
|
|
|
/* Check length. */
|
|
|
|
|
if (length % 4)
|
|
|
|
|
{
|
|
|
|
|
zlog (peer->log, LOG_ERR, "Bad cluster list length %d", length);
|
|
|
|
|
|
|
|
|
|
bgp_notify_send (peer,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ERR,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ATTR_LENG_ERR);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
2007-05-04 22:15:47 +02:00
|
|
|
|
(bgp_attr_extra_get (attr))->cluster
|
|
|
|
|
= cluster_parse ((struct in_addr *)stream_pnt (peer->ibuf), length);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
2005-02-09 16:51:56 +01:00
|
|
|
|
stream_forward_getp (peer->ibuf, length);;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
|
|
attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_CLUSTER_LIST);
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Multiprotocol reachability information parse. */
|
2008-06-07 22:37:10 +02:00
|
|
|
|
int
|
2002-12-13 21:15:29 +01:00
|
|
|
|
bgp_mp_reach_parse (struct peer *peer, bgp_size_t length, struct attr *attr,
|
|
|
|
|
struct bgp_nlri *mp_update)
|
|
|
|
|
{
|
|
|
|
|
u_int16_t afi;
|
|
|
|
|
u_char safi;
|
|
|
|
|
bgp_size_t nlri_len;
|
2007-04-10 21:36:48 +02:00
|
|
|
|
size_t start;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
int ret;
|
|
|
|
|
struct stream *s;
|
2007-05-04 22:15:47 +02:00
|
|
|
|
struct attr_extra *attre = bgp_attr_extra_get(attr);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
|
|
/* Set end of packet. */
|
2007-04-10 21:36:48 +02:00
|
|
|
|
s = BGP_INPUT(peer);
|
|
|
|
|
start = stream_get_getp(s);
|
|
|
|
|
|
|
|
|
|
/* safe to read statically sized header? */
|
|
|
|
|
#define BGP_MP_REACH_MIN_SIZE 5
|
2008-06-07 22:37:10 +02:00
|
|
|
|
#define LEN_LEFT (length - (stream_get_getp(s) - start))
|
2007-04-10 21:36:48 +02:00
|
|
|
|
if ((length > STREAM_READABLE(s)) || (length < BGP_MP_REACH_MIN_SIZE))
|
2008-06-07 22:37:10 +02:00
|
|
|
|
{
|
|
|
|
|
zlog_info ("%s: %s sent invalid length, %lu",
|
|
|
|
|
__func__, peer->host, (unsigned long)length);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
2007-04-10 21:36:48 +02:00
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
|
/* Load AFI, SAFI. */
|
|
|
|
|
afi = stream_getw (s);
|
|
|
|
|
safi = stream_getc (s);
|
|
|
|
|
|
|
|
|
|
/* Get nexthop length. */
|
2007-05-04 22:15:47 +02:00
|
|
|
|
attre->mp_nexthop_len = stream_getc (s);
|
2007-04-10 21:36:48 +02:00
|
|
|
|
|
2008-06-07 22:37:10 +02:00
|
|
|
|
if (LEN_LEFT < attre->mp_nexthop_len)
|
|
|
|
|
{
|
|
|
|
|
zlog_info ("%s: %s, MP nexthop length, %u, goes past end of attribute",
|
|
|
|
|
__func__, peer->host, attre->mp_nexthop_len);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
2007-04-10 21:36:48 +02:00
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
|
/* Nexthop length check. */
|
2007-05-04 22:15:47 +02:00
|
|
|
|
switch (attre->mp_nexthop_len)
|
2002-12-13 21:15:29 +01:00
|
|
|
|
{
|
|
|
|
|
case 4:
|
2007-05-04 22:15:47 +02:00
|
|
|
|
stream_get (&attre->mp_nexthop_global_in, s, 4);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
break;
|
|
|
|
|
case 12:
|
|
|
|
|
{
|
|
|
|
|
u_int32_t rd_high;
|
|
|
|
|
u_int32_t rd_low;
|
|
|
|
|
|
|
|
|
|
rd_high = stream_getl (s);
|
|
|
|
|
rd_low = stream_getl (s);
|
2007-05-04 22:15:47 +02:00
|
|
|
|
stream_get (&attre->mp_nexthop_global_in, s, 4);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
#ifdef HAVE_IPV6
|
|
|
|
|
case 16:
|
2007-05-04 22:15:47 +02:00
|
|
|
|
stream_get (&attre->mp_nexthop_global, s, 16);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
break;
|
|
|
|
|
case 32:
|
2007-05-04 22:15:47 +02:00
|
|
|
|
stream_get (&attre->mp_nexthop_global, s, 16);
|
|
|
|
|
stream_get (&attre->mp_nexthop_local, s, 16);
|
|
|
|
|
if (! IN6_IS_ADDR_LINKLOCAL (&attre->mp_nexthop_local))
|
2002-12-13 21:15:29 +01:00
|
|
|
|
{
|
|
|
|
|
char buf1[INET6_ADDRSTRLEN];
|
|
|
|
|
char buf2[INET6_ADDRSTRLEN];
|
|
|
|
|
|
|
|
|
|
if (BGP_DEBUG (update, UPDATE_IN))
|
2004-12-08 20:59:11 +01:00
|
|
|
|
zlog_debug ("%s got two nexthop %s %s but second one is not a link-local nexthop", peer->host,
|
2007-05-04 22:15:47 +02:00
|
|
|
|
inet_ntop (AF_INET6, &attre->mp_nexthop_global,
|
2002-12-13 21:15:29 +01:00
|
|
|
|
buf1, INET6_ADDRSTRLEN),
|
2007-05-04 22:15:47 +02:00
|
|
|
|
inet_ntop (AF_INET6, &attre->mp_nexthop_local,
|
2002-12-13 21:15:29 +01:00
|
|
|
|
buf2, INET6_ADDRSTRLEN));
|
|
|
|
|
|
2007-05-04 22:15:47 +02:00
|
|
|
|
attre->mp_nexthop_len = 16;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
#endif /* HAVE_IPV6 */
|
|
|
|
|
default:
|
2008-06-07 22:37:10 +02:00
|
|
|
|
zlog_info ("%s: (%s) Wrong multiprotocol next hop length: %d",
|
|
|
|
|
__func__, peer->host, attre->mp_nexthop_len);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
2008-06-07 22:37:10 +02:00
|
|
|
|
if (!LEN_LEFT)
|
|
|
|
|
{
|
|
|
|
|
zlog_info ("%s: (%s) Failed to read SNPA and NLRI(s)",
|
|
|
|
|
__func__, peer->host);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
2007-04-10 21:36:48 +02:00
|
|
|
|
{
|
|
|
|
|
u_char val;
|
|
|
|
|
if ((val = stream_getc (s)))
|
|
|
|
|
zlog_warn ("%s sent non-zero value, %u, for defunct SNPA-length field",
|
|
|
|
|
peer->host, val);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* must have nrli_len, what is left of the attribute */
|
2008-06-07 22:37:10 +02:00
|
|
|
|
nlri_len = LEN_LEFT;
|
2007-04-10 21:36:48 +02:00
|
|
|
|
if ((!nlri_len) || (nlri_len > STREAM_READABLE(s)))
|
2008-06-07 22:37:10 +02:00
|
|
|
|
{
|
|
|
|
|
zlog_info ("%s: (%s) Failed to read NLRI",
|
|
|
|
|
__func__, peer->host);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
|
|
if (safi != BGP_SAFI_VPNV4)
|
|
|
|
|
{
|
|
|
|
|
ret = bgp_nlri_sanity_check (peer, afi, stream_pnt (s), nlri_len);
|
2008-06-07 22:37:10 +02:00
|
|
|
|
if (ret < 0)
|
|
|
|
|
{
|
|
|
|
|
zlog_info ("%s: (%s) NLRI doesn't pass sanity check",
|
|
|
|
|
__func__, peer->host);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mp_update->afi = afi;
|
|
|
|
|
mp_update->safi = safi;
|
|
|
|
|
mp_update->nlri = stream_pnt (s);
|
|
|
|
|
mp_update->length = nlri_len;
|
|
|
|
|
|
2005-02-09 16:51:56 +01:00
|
|
|
|
stream_forward_getp (s, nlri_len);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
|
|
return 0;
|
2008-06-07 22:37:10 +02:00
|
|
|
|
#undef LEN_LEFT
|
2002-12-13 21:15:29 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Multiprotocol unreachable parse */
|
2008-06-07 22:37:10 +02:00
|
|
|
|
int
|
2007-04-10 21:36:48 +02:00
|
|
|
|
bgp_mp_unreach_parse (struct peer *peer, bgp_size_t length,
|
2002-12-13 21:15:29 +01:00
|
|
|
|
struct bgp_nlri *mp_withdraw)
|
|
|
|
|
{
|
|
|
|
|
struct stream *s;
|
|
|
|
|
u_int16_t afi;
|
|
|
|
|
u_char safi;
|
|
|
|
|
u_int16_t withdraw_len;
|
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
|
|
s = peer->ibuf;
|
2007-04-10 21:36:48 +02:00
|
|
|
|
|
|
|
|
|
#define BGP_MP_UNREACH_MIN_SIZE 3
|
|
|
|
|
if ((length > STREAM_READABLE(s)) || (length < BGP_MP_UNREACH_MIN_SIZE))
|
|
|
|
|
return -1;
|
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
|
afi = stream_getw (s);
|
|
|
|
|
safi = stream_getc (s);
|
2007-04-10 21:36:48 +02:00
|
|
|
|
|
|
|
|
|
withdraw_len = length - BGP_MP_UNREACH_MIN_SIZE;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
|
|
if (safi != BGP_SAFI_VPNV4)
|
|
|
|
|
{
|
|
|
|
|
ret = bgp_nlri_sanity_check (peer, afi, stream_pnt (s), withdraw_len);
|
|
|
|
|
if (ret < 0)
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mp_withdraw->afi = afi;
|
|
|
|
|
mp_withdraw->safi = safi;
|
|
|
|
|
mp_withdraw->nlri = stream_pnt (s);
|
|
|
|
|
mp_withdraw->length = withdraw_len;
|
|
|
|
|
|
2005-02-09 16:51:56 +01:00
|
|
|
|
stream_forward_getp (s, withdraw_len);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Extended Community attribute. */
|
2005-06-28 14:44:16 +02:00
|
|
|
|
static int
|
2002-12-13 21:15:29 +01:00
|
|
|
|
bgp_attr_ext_communities (struct peer *peer, bgp_size_t length,
|
|
|
|
|
struct attr *attr, u_char flag)
|
|
|
|
|
{
|
|
|
|
|
if (length == 0)
|
2007-05-04 22:15:47 +02:00
|
|
|
|
{
|
|
|
|
|
if (attr->extra)
|
|
|
|
|
attr->extra->ecommunity = NULL;
|
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
else
|
|
|
|
|
{
|
2007-05-04 22:15:47 +02:00
|
|
|
|
(bgp_attr_extra_get (attr))->ecommunity =
|
2004-06-04 19:58:18 +02:00
|
|
|
|
ecommunity_parse ((u_int8_t *)stream_pnt (peer->ibuf), length);
|
2005-02-09 16:51:56 +01:00
|
|
|
|
stream_forward_getp (peer->ibuf, length);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
}
|
|
|
|
|
attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_EXT_COMMUNITIES);
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* BGP unknown attribute treatment. */
|
2005-06-28 14:44:16 +02:00
|
|
|
|
static int
|
2002-12-13 21:15:29 +01:00
|
|
|
|
bgp_attr_unknown (struct peer *peer, struct attr *attr, u_char flag,
|
|
|
|
|
u_char type, bgp_size_t length, u_char *startp)
|
|
|
|
|
{
|
|
|
|
|
bgp_size_t total;
|
|
|
|
|
struct transit *transit;
|
2007-05-04 22:15:47 +02:00
|
|
|
|
struct attr_extra *attre;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
2005-02-01 21:13:16 +01:00
|
|
|
|
if (BGP_DEBUG (normal, NORMAL))
|
|
|
|
|
zlog_debug ("%s Unknown attribute is received (type %d, length %d)",
|
|
|
|
|
peer->host, type, length);
|
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
|
if (BGP_DEBUG (events, EVENTS))
|
2004-12-08 20:59:11 +01:00
|
|
|
|
zlog (peer->log, LOG_DEBUG,
|
2002-12-13 21:15:29 +01:00
|
|
|
|
"Unknown attribute type %d length %d is received", type, length);
|
|
|
|
|
|
|
|
|
|
/* Forward read pointer of input stream. */
|
2005-02-09 16:51:56 +01:00
|
|
|
|
stream_forward_getp (peer->ibuf, length);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
|
|
/* Adjest total length to include type and length. */
|
|
|
|
|
total = length + (CHECK_FLAG (flag, BGP_ATTR_FLAG_EXTLEN) ? 4 : 3);
|
|
|
|
|
|
|
|
|
|
/* If any of the mandatory well-known attributes are not recognized,
|
|
|
|
|
then the Error Subcode is set to Unrecognized Well-known
|
|
|
|
|
Attribute. The Data field contains the unrecognized attribute
|
|
|
|
|
(type, length and value). */
|
|
|
|
|
if (! CHECK_FLAG (flag, BGP_ATTR_FLAG_OPTIONAL))
|
|
|
|
|
{
|
|
|
|
|
/* Adjust startp to do not include flag value. */
|
|
|
|
|
bgp_notify_send_with_data (peer,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ERR,
|
|
|
|
|
BGP_NOTIFY_UPDATE_UNREC_ATTR,
|
|
|
|
|
startp, total);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Unrecognized non-transitive optional attributes must be quietly
|
|
|
|
|
ignored and not passed along to other BGP peers. */
|
|
|
|
|
if (! CHECK_FLAG (flag, BGP_ATTR_FLAG_TRANS))
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
/* If a path with recognized transitive optional attribute is
|
|
|
|
|
accepted and passed along to other BGP peers and the Partial bit
|
|
|
|
|
in the Attribute Flags octet is set to 1 by some previous AS, it
|
|
|
|
|
is not set back to 0 by the current AS. */
|
|
|
|
|
SET_FLAG (*startp, BGP_ATTR_FLAG_PARTIAL);
|
|
|
|
|
|
|
|
|
|
/* Store transitive attribute to the end of attr->transit. */
|
2007-05-04 22:15:47 +02:00
|
|
|
|
if (! ((attre = bgp_attr_extra_get(attr))->transit) )
|
2008-08-18 23:13:29 +02:00
|
|
|
|
attre->transit = XCALLOC (MTYPE_TRANSIT, sizeof (struct transit));
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
2007-05-04 22:15:47 +02:00
|
|
|
|
transit = attre->transit;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
|
|
if (transit->val)
|
|
|
|
|
transit->val = XREALLOC (MTYPE_TRANSIT_VAL, transit->val,
|
|
|
|
|
transit->length + total);
|
|
|
|
|
else
|
|
|
|
|
transit->val = XMALLOC (MTYPE_TRANSIT_VAL, total);
|
|
|
|
|
|
|
|
|
|
memcpy (transit->val + transit->length, startp, total);
|
|
|
|
|
transit->length += total;
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Read attribute of update packet. This function is called from
|
|
|
|
|
bgp_update() in bgpd.c. */
|
|
|
|
|
int
|
|
|
|
|
bgp_attr_parse (struct peer *peer, struct attr *attr, bgp_size_t size,
|
|
|
|
|
struct bgp_nlri *mp_update, struct bgp_nlri *mp_withdraw)
|
|
|
|
|
{
|
|
|
|
|
int ret;
|
|
|
|
|
u_char flag;
|
[bgpd] Merge AS4 support
2007-10-14 Paul Jakma <paul.jakma@sun.com>
* NEWS: Note that MRT dumps are now version 2
* (general) Merge in Juergen Kammer's AS4 patch.
2007-09-27 Paul Jakma <paul.jakma@sun.com>
* bgp_aspath.c: (assegment_normalise) remove duplicates from
from sets.
(aspath_reconcile_as4) disregard a broken part of the RFC around
error handling in path reconciliation.
* aspath_test.c: Test dupe-weeding from sets.
Test that reconciliation merges AS_PATH and AS4_PATH where
former is shorter than latter.
2007-09-26 Paul Jakma <paul.jakma@sun.com>
* aspath_test.c: Test AS4_PATH reconcilation where length
of AS_PATH and AS4_PATH is same.
2007-09-25 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (peek_for_as4_capability) Fix to work.
* bgp_packet.c: (bgp_open_receive) Fix sanity check of as4.
* tests/bgp_capability_test.c: (general) Extend tests to validate
peek_for_as4_capability.
Add test of full OPEN Option block, with multiple capabilities,
both as a series of Option, and a single option.
Add some crap to beginning of stream, to prevent code depending
on getp == 0.
2007-09-18 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (bgp_capability_as4) debug printf inline with others.
(peek_for_as4_capability) There's no need to signal failure, as
failure is better dealt with through full capability parser -
just return the AS4, simpler.
* bgp_packet.c: (bgp_open_receive) Update to match
peek_for_as4_capability change.
Allow use of BGP_AS_TRANS by 2b speakers.
Use NOTIFY_OPEN_ERR rather than CEASE for OPEN parsing errors.
(bgp_capability_msg_parse) missing argument to debug print
(bgp_capability_receive) missing return values.
* tests/bgp_capability_test.c: (parse_test) update for changes to
peek_for_as4_capability
2007-07-25 Paul Jakma <paul.jakma@sun.com>
* Remove 2-byte size macros, just make existing macros take
argument to indicate which size to use.
Adjust all users - typically they want '1'.
* bgp_aspath.c: (aspath_has_as4) New, return 1 if there are any
as4's in a path.
(aspath_put) Return the number of bytes actually written, to
fix the bug Juergen noted: Splitting of segments will change
the number of bytes written from that already written to the
AS_PATH header.
(aspath_snmp_pathseg) Pass 2-byte flag to aspath_put. SNMP
is still defined as 2b.
(aspath_aggregate) fix latent bug.
(aspath_reconcile_as4) AS_PATH+NEW_AS_PATH reconciliation
function.
(aspath_key_make) Hash the AS_PATH string, rather than
just taking the addition of assegment ASes as the hash value,
hopefully sligthly more collision resistant.
(bgp_attr_munge_as4_attrs) Collide the NEW_ attributes
together with the OLD 2-byte forms, code Juergen
had in bgp_attr_parse but re-organised a bit.
(bgp_attr_parse) Bunch of code from Juergen moves
to previous function.
(bgp_packet_attribute) Compact significantly by
just /always/ using extended-length attr header.
Fix bug Juergen noted, by using aspath_put's
(new) returned size value for the attr header rather
than the (guesstimate) of aspath_size() - the two could
differ when aspath_put had to split large segments, unlikely
this bug was ever hit in the 'wild'.
(bgp_dump_routes_attr) Always use extended-len and
use aspath_put return for header length. Output 4b ASN
for AS_PATH and AGGREGATOR.
* bgp_ecommunity.c: (ecommunity_{hash_make,cmp}) fix
hash callback declarations to match prototypes.
(ecommunity_gettoken) Updated for ECOMMUNITY_ENCODE_AS4,
complete rewrite of Juergen's changes (no asdot support)
* bgp_open.c: (bgp_capability_as4) New, does what it says
on the tin.
(peek_for_as4_capability) Rewritten to use streams and
bgp_capability_as4.
* bgp_packet.c: (bgp_open_send) minor edit
checked (in the abstract at least) with Juergen.
Changes are to be more accepting, e.g, allow AS_TRANS on
a 2-byte session.
* (general) Update all commands to use CMD_AS_RANGE.
* bgp_vty.c: (bgp_clear) Fix return vals to use CMD_..
Remove stuff replicated by VTY_GET_LONG
(bgp_clear_vty) Return bgp_clear directly to vty.
* tests/aspath_test.c: Exercise 32bit parsing. Test reconcile
function.
* tests/ecommunity_test.c: New, test AS4 ecommunity changes,
positive test only at this time, error cases not tested yet.
2007-07-25 Juergen Kammer <j.kammer@eurodata.de>
* (general) AS4 support.
* bgpd.h: as_t changes to 4-bytes.
* bgp_aspath.h: Add BGP_AS4_MAX and BGP_AS_TRANS defines.
* bgp_aspath.c: AS_VALUE_SIZE becomes 4-byte, AS16_VALUE_SIZE
added for 2-byte.
Add AS16 versions of length calc macros.
(aspath_count_numas) New, count number of ASes.
(aspath_has_as4) New, return 1 if there are any as4's in a
path.
(assegments_parse) Interpret assegment as 4 or 2 byte,
according to how the caller instructs us, with a new
argument.
(aspath_parse) Add use32bit argument to pass to
assegments_parse. Adjust all its callers to pass 1, unless
otherwise noted.
(assegment_data_put) Adjust to be able to write 2 or 4 byte
AS, according to new use32bit argument.
(aspath_put) Adjust to write 2 or 4.
(aspath_gettoken) Use a long for passed in asno.
* bgp_attr.c: (attr_str) Add BGP_ATTR_AS4_PATH and
BGP_ATTR_AS4_AGGREGATOR.
(bgp_attr_aspath) Call aspath_parse with right 2/4 arg, as
determined by received-capability flag.
(bgp_attr_aspath_check) New, code previously in attr_aspath
but moved to new func so it can be run after NEW_AS_PATH
reconciliation.
(bgp_attr_as4_path) New, handle NEW_AS_PATH.
(bgp_attr_aggregator) Adjust to cope with 2/4 byte ASes.
(bgp_attr_as4_aggregator) New, read NEW_AGGREGATOR.
(bgp_attr_parse) Add handoffs to previous parsers for the two
new AS4 NEW_ attributes.
Various checks added for NEW/OLD reconciliation.
(bgp_packet_attribute) Support 2/4 for AS_PATH and
AGGREGATOR, detect when NEW_ attrs need to be sent.
* bgp_debug.{c,h}: Add 'debug bgp as4'.
* bgp_dump.c: MRTv2 support, unconditionally enabled, which
supports AS4. Based on patches from Erik (RIPE?).
* bgp_ecommunity.c: (ecommunity_ecom2str) ECOMMUNITY_ENCODE_AS4
support.
* bgp_open.c: (peek_for_as4_capability) New, peek for AS4
capability prior to full capability parsing, so we know which
ASN to use for struct peer lookup.
(bgp_open_capability) Always send AS4 capability.
* bgp_packet.c: (bgp_open_send) AS4 handling for AS field
(bgp_open_receive) Peek for AS4 capability first, and figure
out which AS to believe.
* bgp_vty.c: (bgp_show_peer) Print AS4 cap
* tests/aspath_test.c: Support asn32 changes, call aspath_parse
with 16 bit.
* vtysh/extract.pl: AS4 compatibility for router bgp ASNUMBER
* vtysh/extract.pl.in: AS4 compatibility for router bgp ASNUMBER
* vtysh/vtysh.c: AS4 compatibility for router bgp ASNUMBER
2007-10-15 00:32:21 +02:00
|
|
|
|
u_char type = 0;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
bgp_size_t length;
|
|
|
|
|
u_char *startp, *endp;
|
|
|
|
|
u_char *attr_endp;
|
|
|
|
|
u_char seen[BGP_ATTR_BITMAP_SIZE];
|
[bgpd] Merge AS4 support
2007-10-14 Paul Jakma <paul.jakma@sun.com>
* NEWS: Note that MRT dumps are now version 2
* (general) Merge in Juergen Kammer's AS4 patch.
2007-09-27 Paul Jakma <paul.jakma@sun.com>
* bgp_aspath.c: (assegment_normalise) remove duplicates from
from sets.
(aspath_reconcile_as4) disregard a broken part of the RFC around
error handling in path reconciliation.
* aspath_test.c: Test dupe-weeding from sets.
Test that reconciliation merges AS_PATH and AS4_PATH where
former is shorter than latter.
2007-09-26 Paul Jakma <paul.jakma@sun.com>
* aspath_test.c: Test AS4_PATH reconcilation where length
of AS_PATH and AS4_PATH is same.
2007-09-25 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (peek_for_as4_capability) Fix to work.
* bgp_packet.c: (bgp_open_receive) Fix sanity check of as4.
* tests/bgp_capability_test.c: (general) Extend tests to validate
peek_for_as4_capability.
Add test of full OPEN Option block, with multiple capabilities,
both as a series of Option, and a single option.
Add some crap to beginning of stream, to prevent code depending
on getp == 0.
2007-09-18 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (bgp_capability_as4) debug printf inline with others.
(peek_for_as4_capability) There's no need to signal failure, as
failure is better dealt with through full capability parser -
just return the AS4, simpler.
* bgp_packet.c: (bgp_open_receive) Update to match
peek_for_as4_capability change.
Allow use of BGP_AS_TRANS by 2b speakers.
Use NOTIFY_OPEN_ERR rather than CEASE for OPEN parsing errors.
(bgp_capability_msg_parse) missing argument to debug print
(bgp_capability_receive) missing return values.
* tests/bgp_capability_test.c: (parse_test) update for changes to
peek_for_as4_capability
2007-07-25 Paul Jakma <paul.jakma@sun.com>
* Remove 2-byte size macros, just make existing macros take
argument to indicate which size to use.
Adjust all users - typically they want '1'.
* bgp_aspath.c: (aspath_has_as4) New, return 1 if there are any
as4's in a path.
(aspath_put) Return the number of bytes actually written, to
fix the bug Juergen noted: Splitting of segments will change
the number of bytes written from that already written to the
AS_PATH header.
(aspath_snmp_pathseg) Pass 2-byte flag to aspath_put. SNMP
is still defined as 2b.
(aspath_aggregate) fix latent bug.
(aspath_reconcile_as4) AS_PATH+NEW_AS_PATH reconciliation
function.
(aspath_key_make) Hash the AS_PATH string, rather than
just taking the addition of assegment ASes as the hash value,
hopefully sligthly more collision resistant.
(bgp_attr_munge_as4_attrs) Collide the NEW_ attributes
together with the OLD 2-byte forms, code Juergen
had in bgp_attr_parse but re-organised a bit.
(bgp_attr_parse) Bunch of code from Juergen moves
to previous function.
(bgp_packet_attribute) Compact significantly by
just /always/ using extended-length attr header.
Fix bug Juergen noted, by using aspath_put's
(new) returned size value for the attr header rather
than the (guesstimate) of aspath_size() - the two could
differ when aspath_put had to split large segments, unlikely
this bug was ever hit in the 'wild'.
(bgp_dump_routes_attr) Always use extended-len and
use aspath_put return for header length. Output 4b ASN
for AS_PATH and AGGREGATOR.
* bgp_ecommunity.c: (ecommunity_{hash_make,cmp}) fix
hash callback declarations to match prototypes.
(ecommunity_gettoken) Updated for ECOMMUNITY_ENCODE_AS4,
complete rewrite of Juergen's changes (no asdot support)
* bgp_open.c: (bgp_capability_as4) New, does what it says
on the tin.
(peek_for_as4_capability) Rewritten to use streams and
bgp_capability_as4.
* bgp_packet.c: (bgp_open_send) minor edit
checked (in the abstract at least) with Juergen.
Changes are to be more accepting, e.g, allow AS_TRANS on
a 2-byte session.
* (general) Update all commands to use CMD_AS_RANGE.
* bgp_vty.c: (bgp_clear) Fix return vals to use CMD_..
Remove stuff replicated by VTY_GET_LONG
(bgp_clear_vty) Return bgp_clear directly to vty.
* tests/aspath_test.c: Exercise 32bit parsing. Test reconcile
function.
* tests/ecommunity_test.c: New, test AS4 ecommunity changes,
positive test only at this time, error cases not tested yet.
2007-07-25 Juergen Kammer <j.kammer@eurodata.de>
* (general) AS4 support.
* bgpd.h: as_t changes to 4-bytes.
* bgp_aspath.h: Add BGP_AS4_MAX and BGP_AS_TRANS defines.
* bgp_aspath.c: AS_VALUE_SIZE becomes 4-byte, AS16_VALUE_SIZE
added for 2-byte.
Add AS16 versions of length calc macros.
(aspath_count_numas) New, count number of ASes.
(aspath_has_as4) New, return 1 if there are any as4's in a
path.
(assegments_parse) Interpret assegment as 4 or 2 byte,
according to how the caller instructs us, with a new
argument.
(aspath_parse) Add use32bit argument to pass to
assegments_parse. Adjust all its callers to pass 1, unless
otherwise noted.
(assegment_data_put) Adjust to be able to write 2 or 4 byte
AS, according to new use32bit argument.
(aspath_put) Adjust to write 2 or 4.
(aspath_gettoken) Use a long for passed in asno.
* bgp_attr.c: (attr_str) Add BGP_ATTR_AS4_PATH and
BGP_ATTR_AS4_AGGREGATOR.
(bgp_attr_aspath) Call aspath_parse with right 2/4 arg, as
determined by received-capability flag.
(bgp_attr_aspath_check) New, code previously in attr_aspath
but moved to new func so it can be run after NEW_AS_PATH
reconciliation.
(bgp_attr_as4_path) New, handle NEW_AS_PATH.
(bgp_attr_aggregator) Adjust to cope with 2/4 byte ASes.
(bgp_attr_as4_aggregator) New, read NEW_AGGREGATOR.
(bgp_attr_parse) Add handoffs to previous parsers for the two
new AS4 NEW_ attributes.
Various checks added for NEW/OLD reconciliation.
(bgp_packet_attribute) Support 2/4 for AS_PATH and
AGGREGATOR, detect when NEW_ attrs need to be sent.
* bgp_debug.{c,h}: Add 'debug bgp as4'.
* bgp_dump.c: MRTv2 support, unconditionally enabled, which
supports AS4. Based on patches from Erik (RIPE?).
* bgp_ecommunity.c: (ecommunity_ecom2str) ECOMMUNITY_ENCODE_AS4
support.
* bgp_open.c: (peek_for_as4_capability) New, peek for AS4
capability prior to full capability parsing, so we know which
ASN to use for struct peer lookup.
(bgp_open_capability) Always send AS4 capability.
* bgp_packet.c: (bgp_open_send) AS4 handling for AS field
(bgp_open_receive) Peek for AS4 capability first, and figure
out which AS to believe.
* bgp_vty.c: (bgp_show_peer) Print AS4 cap
* tests/aspath_test.c: Support asn32 changes, call aspath_parse
with 16 bit.
* vtysh/extract.pl: AS4 compatibility for router bgp ASNUMBER
* vtysh/extract.pl.in: AS4 compatibility for router bgp ASNUMBER
* vtysh/vtysh.c: AS4 compatibility for router bgp ASNUMBER
2007-10-15 00:32:21 +02:00
|
|
|
|
/* we need the as4_path only until we have synthesized the as_path with it */
|
|
|
|
|
/* same goes for as4_aggregator */
|
|
|
|
|
struct aspath *as4_path = NULL;
|
|
|
|
|
as_t as4_aggregator = 0;
|
|
|
|
|
struct in_addr as4_aggregator_addr = { 0 };
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
|
|
/* Initialize bitmap. */
|
|
|
|
|
memset (seen, 0, BGP_ATTR_BITMAP_SIZE);
|
|
|
|
|
|
|
|
|
|
/* End pointer of BGP attribute. */
|
|
|
|
|
endp = BGP_INPUT_PNT (peer) + size;
|
|
|
|
|
|
|
|
|
|
/* Get attributes to the end of attribute length. */
|
|
|
|
|
while (BGP_INPUT_PNT (peer) < endp)
|
|
|
|
|
{
|
|
|
|
|
/* Check remaining length check.*/
|
|
|
|
|
if (endp - BGP_INPUT_PNT (peer) < BGP_ATTR_MIN_LEN)
|
|
|
|
|
{
|
2004-12-09 15:46:46 +01:00
|
|
|
|
/* XXX warning: long int format, int arg (arg 5) */
|
2002-12-13 21:15:29 +01:00
|
|
|
|
zlog (peer->log, LOG_WARNING,
|
2007-08-06 17:24:51 +02:00
|
|
|
|
"%s error BGP attribute length %lu is smaller than min len",
|
[bgpd] Merge AS4 support
2007-10-14 Paul Jakma <paul.jakma@sun.com>
* NEWS: Note that MRT dumps are now version 2
* (general) Merge in Juergen Kammer's AS4 patch.
2007-09-27 Paul Jakma <paul.jakma@sun.com>
* bgp_aspath.c: (assegment_normalise) remove duplicates from
from sets.
(aspath_reconcile_as4) disregard a broken part of the RFC around
error handling in path reconciliation.
* aspath_test.c: Test dupe-weeding from sets.
Test that reconciliation merges AS_PATH and AS4_PATH where
former is shorter than latter.
2007-09-26 Paul Jakma <paul.jakma@sun.com>
* aspath_test.c: Test AS4_PATH reconcilation where length
of AS_PATH and AS4_PATH is same.
2007-09-25 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (peek_for_as4_capability) Fix to work.
* bgp_packet.c: (bgp_open_receive) Fix sanity check of as4.
* tests/bgp_capability_test.c: (general) Extend tests to validate
peek_for_as4_capability.
Add test of full OPEN Option block, with multiple capabilities,
both as a series of Option, and a single option.
Add some crap to beginning of stream, to prevent code depending
on getp == 0.
2007-09-18 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (bgp_capability_as4) debug printf inline with others.
(peek_for_as4_capability) There's no need to signal failure, as
failure is better dealt with through full capability parser -
just return the AS4, simpler.
* bgp_packet.c: (bgp_open_receive) Update to match
peek_for_as4_capability change.
Allow use of BGP_AS_TRANS by 2b speakers.
Use NOTIFY_OPEN_ERR rather than CEASE for OPEN parsing errors.
(bgp_capability_msg_parse) missing argument to debug print
(bgp_capability_receive) missing return values.
* tests/bgp_capability_test.c: (parse_test) update for changes to
peek_for_as4_capability
2007-07-25 Paul Jakma <paul.jakma@sun.com>
* Remove 2-byte size macros, just make existing macros take
argument to indicate which size to use.
Adjust all users - typically they want '1'.
* bgp_aspath.c: (aspath_has_as4) New, return 1 if there are any
as4's in a path.
(aspath_put) Return the number of bytes actually written, to
fix the bug Juergen noted: Splitting of segments will change
the number of bytes written from that already written to the
AS_PATH header.
(aspath_snmp_pathseg) Pass 2-byte flag to aspath_put. SNMP
is still defined as 2b.
(aspath_aggregate) fix latent bug.
(aspath_reconcile_as4) AS_PATH+NEW_AS_PATH reconciliation
function.
(aspath_key_make) Hash the AS_PATH string, rather than
just taking the addition of assegment ASes as the hash value,
hopefully sligthly more collision resistant.
(bgp_attr_munge_as4_attrs) Collide the NEW_ attributes
together with the OLD 2-byte forms, code Juergen
had in bgp_attr_parse but re-organised a bit.
(bgp_attr_parse) Bunch of code from Juergen moves
to previous function.
(bgp_packet_attribute) Compact significantly by
just /always/ using extended-length attr header.
Fix bug Juergen noted, by using aspath_put's
(new) returned size value for the attr header rather
than the (guesstimate) of aspath_size() - the two could
differ when aspath_put had to split large segments, unlikely
this bug was ever hit in the 'wild'.
(bgp_dump_routes_attr) Always use extended-len and
use aspath_put return for header length. Output 4b ASN
for AS_PATH and AGGREGATOR.
* bgp_ecommunity.c: (ecommunity_{hash_make,cmp}) fix
hash callback declarations to match prototypes.
(ecommunity_gettoken) Updated for ECOMMUNITY_ENCODE_AS4,
complete rewrite of Juergen's changes (no asdot support)
* bgp_open.c: (bgp_capability_as4) New, does what it says
on the tin.
(peek_for_as4_capability) Rewritten to use streams and
bgp_capability_as4.
* bgp_packet.c: (bgp_open_send) minor edit
checked (in the abstract at least) with Juergen.
Changes are to be more accepting, e.g, allow AS_TRANS on
a 2-byte session.
* (general) Update all commands to use CMD_AS_RANGE.
* bgp_vty.c: (bgp_clear) Fix return vals to use CMD_..
Remove stuff replicated by VTY_GET_LONG
(bgp_clear_vty) Return bgp_clear directly to vty.
* tests/aspath_test.c: Exercise 32bit parsing. Test reconcile
function.
* tests/ecommunity_test.c: New, test AS4 ecommunity changes,
positive test only at this time, error cases not tested yet.
2007-07-25 Juergen Kammer <j.kammer@eurodata.de>
* (general) AS4 support.
* bgpd.h: as_t changes to 4-bytes.
* bgp_aspath.h: Add BGP_AS4_MAX and BGP_AS_TRANS defines.
* bgp_aspath.c: AS_VALUE_SIZE becomes 4-byte, AS16_VALUE_SIZE
added for 2-byte.
Add AS16 versions of length calc macros.
(aspath_count_numas) New, count number of ASes.
(aspath_has_as4) New, return 1 if there are any as4's in a
path.
(assegments_parse) Interpret assegment as 4 or 2 byte,
according to how the caller instructs us, with a new
argument.
(aspath_parse) Add use32bit argument to pass to
assegments_parse. Adjust all its callers to pass 1, unless
otherwise noted.
(assegment_data_put) Adjust to be able to write 2 or 4 byte
AS, according to new use32bit argument.
(aspath_put) Adjust to write 2 or 4.
(aspath_gettoken) Use a long for passed in asno.
* bgp_attr.c: (attr_str) Add BGP_ATTR_AS4_PATH and
BGP_ATTR_AS4_AGGREGATOR.
(bgp_attr_aspath) Call aspath_parse with right 2/4 arg, as
determined by received-capability flag.
(bgp_attr_aspath_check) New, code previously in attr_aspath
but moved to new func so it can be run after NEW_AS_PATH
reconciliation.
(bgp_attr_as4_path) New, handle NEW_AS_PATH.
(bgp_attr_aggregator) Adjust to cope with 2/4 byte ASes.
(bgp_attr_as4_aggregator) New, read NEW_AGGREGATOR.
(bgp_attr_parse) Add handoffs to previous parsers for the two
new AS4 NEW_ attributes.
Various checks added for NEW/OLD reconciliation.
(bgp_packet_attribute) Support 2/4 for AS_PATH and
AGGREGATOR, detect when NEW_ attrs need to be sent.
* bgp_debug.{c,h}: Add 'debug bgp as4'.
* bgp_dump.c: MRTv2 support, unconditionally enabled, which
supports AS4. Based on patches from Erik (RIPE?).
* bgp_ecommunity.c: (ecommunity_ecom2str) ECOMMUNITY_ENCODE_AS4
support.
* bgp_open.c: (peek_for_as4_capability) New, peek for AS4
capability prior to full capability parsing, so we know which
ASN to use for struct peer lookup.
(bgp_open_capability) Always send AS4 capability.
* bgp_packet.c: (bgp_open_send) AS4 handling for AS field
(bgp_open_receive) Peek for AS4 capability first, and figure
out which AS to believe.
* bgp_vty.c: (bgp_show_peer) Print AS4 cap
* tests/aspath_test.c: Support asn32 changes, call aspath_parse
with 16 bit.
* vtysh/extract.pl: AS4 compatibility for router bgp ASNUMBER
* vtysh/extract.pl.in: AS4 compatibility for router bgp ASNUMBER
* vtysh/vtysh.c: AS4 compatibility for router bgp ASNUMBER
2007-10-15 00:32:21 +02:00
|
|
|
|
peer->host,
|
|
|
|
|
(unsigned long) (endp - STREAM_PNT (BGP_INPUT (peer))));
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
|
|
bgp_notify_send (peer,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ERR,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ATTR_LENG_ERR);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Fetch attribute flag and type. */
|
|
|
|
|
startp = BGP_INPUT_PNT (peer);
|
|
|
|
|
flag = stream_getc (BGP_INPUT (peer));
|
|
|
|
|
type = stream_getc (BGP_INPUT (peer));
|
|
|
|
|
|
2007-12-22 17:49:52 +01:00
|
|
|
|
/* Check whether Extended-Length applies and is in bounds */
|
|
|
|
|
if (CHECK_FLAG (flag, BGP_ATTR_FLAG_EXTLEN)
|
|
|
|
|
&& ((endp - startp) < (BGP_ATTR_MIN_LEN + 1)))
|
|
|
|
|
{
|
|
|
|
|
zlog (peer->log, LOG_WARNING,
|
2008-07-22 21:56:56 +02:00
|
|
|
|
"%s Extended length set, but just %lu bytes of attr header",
|
2007-12-22 17:49:52 +01:00
|
|
|
|
peer->host,
|
|
|
|
|
(unsigned long) (endp - STREAM_PNT (BGP_INPUT (peer))));
|
|
|
|
|
|
|
|
|
|
bgp_notify_send (peer,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ERR,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ATTR_LENG_ERR);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
|
/* Check extended attribue length bit. */
|
|
|
|
|
if (CHECK_FLAG (flag, BGP_ATTR_FLAG_EXTLEN))
|
|
|
|
|
length = stream_getw (BGP_INPUT (peer));
|
|
|
|
|
else
|
|
|
|
|
length = stream_getc (BGP_INPUT (peer));
|
|
|
|
|
|
|
|
|
|
/* If any attribute appears more than once in the UPDATE
|
|
|
|
|
message, then the Error Subcode is set to Malformed Attribute
|
|
|
|
|
List. */
|
|
|
|
|
|
|
|
|
|
if (CHECK_BITMAP (seen, type))
|
|
|
|
|
{
|
|
|
|
|
zlog (peer->log, LOG_WARNING,
|
|
|
|
|
"%s error BGP attribute type %d appears twice in a message",
|
|
|
|
|
peer->host, type);
|
|
|
|
|
|
|
|
|
|
bgp_notify_send (peer,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ERR,
|
|
|
|
|
BGP_NOTIFY_UPDATE_MAL_ATTR);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Set type to bitmap to check duplicate attribute. `type' is
|
|
|
|
|
unsigned char so it never overflow bitmap range. */
|
|
|
|
|
|
|
|
|
|
SET_BITMAP (seen, type);
|
|
|
|
|
|
|
|
|
|
/* Overflow check. */
|
|
|
|
|
attr_endp = BGP_INPUT_PNT (peer) + length;
|
|
|
|
|
|
|
|
|
|
if (attr_endp > endp)
|
|
|
|
|
{
|
|
|
|
|
zlog (peer->log, LOG_WARNING,
|
|
|
|
|
"%s BGP type %d length %d is too large, attribute total length is %d. attr_endp is %p. endp is %p", peer->host, type, length, size, attr_endp, endp);
|
|
|
|
|
bgp_notify_send (peer,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ERR,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ATTR_LENG_ERR);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* OK check attribute and store it's value. */
|
|
|
|
|
switch (type)
|
|
|
|
|
{
|
|
|
|
|
case BGP_ATTR_ORIGIN:
|
|
|
|
|
ret = bgp_attr_origin (peer, length, attr, flag, startp);
|
|
|
|
|
break;
|
|
|
|
|
case BGP_ATTR_AS_PATH:
|
|
|
|
|
ret = bgp_attr_aspath (peer, length, attr, flag, startp);
|
|
|
|
|
break;
|
[bgpd] Merge AS4 support
2007-10-14 Paul Jakma <paul.jakma@sun.com>
* NEWS: Note that MRT dumps are now version 2
* (general) Merge in Juergen Kammer's AS4 patch.
2007-09-27 Paul Jakma <paul.jakma@sun.com>
* bgp_aspath.c: (assegment_normalise) remove duplicates from
from sets.
(aspath_reconcile_as4) disregard a broken part of the RFC around
error handling in path reconciliation.
* aspath_test.c: Test dupe-weeding from sets.
Test that reconciliation merges AS_PATH and AS4_PATH where
former is shorter than latter.
2007-09-26 Paul Jakma <paul.jakma@sun.com>
* aspath_test.c: Test AS4_PATH reconcilation where length
of AS_PATH and AS4_PATH is same.
2007-09-25 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (peek_for_as4_capability) Fix to work.
* bgp_packet.c: (bgp_open_receive) Fix sanity check of as4.
* tests/bgp_capability_test.c: (general) Extend tests to validate
peek_for_as4_capability.
Add test of full OPEN Option block, with multiple capabilities,
both as a series of Option, and a single option.
Add some crap to beginning of stream, to prevent code depending
on getp == 0.
2007-09-18 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (bgp_capability_as4) debug printf inline with others.
(peek_for_as4_capability) There's no need to signal failure, as
failure is better dealt with through full capability parser -
just return the AS4, simpler.
* bgp_packet.c: (bgp_open_receive) Update to match
peek_for_as4_capability change.
Allow use of BGP_AS_TRANS by 2b speakers.
Use NOTIFY_OPEN_ERR rather than CEASE for OPEN parsing errors.
(bgp_capability_msg_parse) missing argument to debug print
(bgp_capability_receive) missing return values.
* tests/bgp_capability_test.c: (parse_test) update for changes to
peek_for_as4_capability
2007-07-25 Paul Jakma <paul.jakma@sun.com>
* Remove 2-byte size macros, just make existing macros take
argument to indicate which size to use.
Adjust all users - typically they want '1'.
* bgp_aspath.c: (aspath_has_as4) New, return 1 if there are any
as4's in a path.
(aspath_put) Return the number of bytes actually written, to
fix the bug Juergen noted: Splitting of segments will change
the number of bytes written from that already written to the
AS_PATH header.
(aspath_snmp_pathseg) Pass 2-byte flag to aspath_put. SNMP
is still defined as 2b.
(aspath_aggregate) fix latent bug.
(aspath_reconcile_as4) AS_PATH+NEW_AS_PATH reconciliation
function.
(aspath_key_make) Hash the AS_PATH string, rather than
just taking the addition of assegment ASes as the hash value,
hopefully sligthly more collision resistant.
(bgp_attr_munge_as4_attrs) Collide the NEW_ attributes
together with the OLD 2-byte forms, code Juergen
had in bgp_attr_parse but re-organised a bit.
(bgp_attr_parse) Bunch of code from Juergen moves
to previous function.
(bgp_packet_attribute) Compact significantly by
just /always/ using extended-length attr header.
Fix bug Juergen noted, by using aspath_put's
(new) returned size value for the attr header rather
than the (guesstimate) of aspath_size() - the two could
differ when aspath_put had to split large segments, unlikely
this bug was ever hit in the 'wild'.
(bgp_dump_routes_attr) Always use extended-len and
use aspath_put return for header length. Output 4b ASN
for AS_PATH and AGGREGATOR.
* bgp_ecommunity.c: (ecommunity_{hash_make,cmp}) fix
hash callback declarations to match prototypes.
(ecommunity_gettoken) Updated for ECOMMUNITY_ENCODE_AS4,
complete rewrite of Juergen's changes (no asdot support)
* bgp_open.c: (bgp_capability_as4) New, does what it says
on the tin.
(peek_for_as4_capability) Rewritten to use streams and
bgp_capability_as4.
* bgp_packet.c: (bgp_open_send) minor edit
checked (in the abstract at least) with Juergen.
Changes are to be more accepting, e.g, allow AS_TRANS on
a 2-byte session.
* (general) Update all commands to use CMD_AS_RANGE.
* bgp_vty.c: (bgp_clear) Fix return vals to use CMD_..
Remove stuff replicated by VTY_GET_LONG
(bgp_clear_vty) Return bgp_clear directly to vty.
* tests/aspath_test.c: Exercise 32bit parsing. Test reconcile
function.
* tests/ecommunity_test.c: New, test AS4 ecommunity changes,
positive test only at this time, error cases not tested yet.
2007-07-25 Juergen Kammer <j.kammer@eurodata.de>
* (general) AS4 support.
* bgpd.h: as_t changes to 4-bytes.
* bgp_aspath.h: Add BGP_AS4_MAX and BGP_AS_TRANS defines.
* bgp_aspath.c: AS_VALUE_SIZE becomes 4-byte, AS16_VALUE_SIZE
added for 2-byte.
Add AS16 versions of length calc macros.
(aspath_count_numas) New, count number of ASes.
(aspath_has_as4) New, return 1 if there are any as4's in a
path.
(assegments_parse) Interpret assegment as 4 or 2 byte,
according to how the caller instructs us, with a new
argument.
(aspath_parse) Add use32bit argument to pass to
assegments_parse. Adjust all its callers to pass 1, unless
otherwise noted.
(assegment_data_put) Adjust to be able to write 2 or 4 byte
AS, according to new use32bit argument.
(aspath_put) Adjust to write 2 or 4.
(aspath_gettoken) Use a long for passed in asno.
* bgp_attr.c: (attr_str) Add BGP_ATTR_AS4_PATH and
BGP_ATTR_AS4_AGGREGATOR.
(bgp_attr_aspath) Call aspath_parse with right 2/4 arg, as
determined by received-capability flag.
(bgp_attr_aspath_check) New, code previously in attr_aspath
but moved to new func so it can be run after NEW_AS_PATH
reconciliation.
(bgp_attr_as4_path) New, handle NEW_AS_PATH.
(bgp_attr_aggregator) Adjust to cope with 2/4 byte ASes.
(bgp_attr_as4_aggregator) New, read NEW_AGGREGATOR.
(bgp_attr_parse) Add handoffs to previous parsers for the two
new AS4 NEW_ attributes.
Various checks added for NEW/OLD reconciliation.
(bgp_packet_attribute) Support 2/4 for AS_PATH and
AGGREGATOR, detect when NEW_ attrs need to be sent.
* bgp_debug.{c,h}: Add 'debug bgp as4'.
* bgp_dump.c: MRTv2 support, unconditionally enabled, which
supports AS4. Based on patches from Erik (RIPE?).
* bgp_ecommunity.c: (ecommunity_ecom2str) ECOMMUNITY_ENCODE_AS4
support.
* bgp_open.c: (peek_for_as4_capability) New, peek for AS4
capability prior to full capability parsing, so we know which
ASN to use for struct peer lookup.
(bgp_open_capability) Always send AS4 capability.
* bgp_packet.c: (bgp_open_send) AS4 handling for AS field
(bgp_open_receive) Peek for AS4 capability first, and figure
out which AS to believe.
* bgp_vty.c: (bgp_show_peer) Print AS4 cap
* tests/aspath_test.c: Support asn32 changes, call aspath_parse
with 16 bit.
* vtysh/extract.pl: AS4 compatibility for router bgp ASNUMBER
* vtysh/extract.pl.in: AS4 compatibility for router bgp ASNUMBER
* vtysh/vtysh.c: AS4 compatibility for router bgp ASNUMBER
2007-10-15 00:32:21 +02:00
|
|
|
|
case BGP_ATTR_AS4_PATH:
|
|
|
|
|
ret = bgp_attr_as4_path (peer, length, attr, &as4_path );
|
|
|
|
|
break;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
case BGP_ATTR_NEXT_HOP:
|
|
|
|
|
ret = bgp_attr_nexthop (peer, length, attr, flag, startp);
|
|
|
|
|
break;
|
|
|
|
|
case BGP_ATTR_MULTI_EXIT_DISC:
|
|
|
|
|
ret = bgp_attr_med (peer, length, attr, flag, startp);
|
|
|
|
|
break;
|
|
|
|
|
case BGP_ATTR_LOCAL_PREF:
|
|
|
|
|
ret = bgp_attr_local_pref (peer, length, attr, flag);
|
|
|
|
|
break;
|
|
|
|
|
case BGP_ATTR_ATOMIC_AGGREGATE:
|
|
|
|
|
ret = bgp_attr_atomic (peer, length, attr, flag);
|
|
|
|
|
break;
|
|
|
|
|
case BGP_ATTR_AGGREGATOR:
|
|
|
|
|
ret = bgp_attr_aggregator (peer, length, attr, flag);
|
|
|
|
|
break;
|
[bgpd] Merge AS4 support
2007-10-14 Paul Jakma <paul.jakma@sun.com>
* NEWS: Note that MRT dumps are now version 2
* (general) Merge in Juergen Kammer's AS4 patch.
2007-09-27 Paul Jakma <paul.jakma@sun.com>
* bgp_aspath.c: (assegment_normalise) remove duplicates from
from sets.
(aspath_reconcile_as4) disregard a broken part of the RFC around
error handling in path reconciliation.
* aspath_test.c: Test dupe-weeding from sets.
Test that reconciliation merges AS_PATH and AS4_PATH where
former is shorter than latter.
2007-09-26 Paul Jakma <paul.jakma@sun.com>
* aspath_test.c: Test AS4_PATH reconcilation where length
of AS_PATH and AS4_PATH is same.
2007-09-25 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (peek_for_as4_capability) Fix to work.
* bgp_packet.c: (bgp_open_receive) Fix sanity check of as4.
* tests/bgp_capability_test.c: (general) Extend tests to validate
peek_for_as4_capability.
Add test of full OPEN Option block, with multiple capabilities,
both as a series of Option, and a single option.
Add some crap to beginning of stream, to prevent code depending
on getp == 0.
2007-09-18 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (bgp_capability_as4) debug printf inline with others.
(peek_for_as4_capability) There's no need to signal failure, as
failure is better dealt with through full capability parser -
just return the AS4, simpler.
* bgp_packet.c: (bgp_open_receive) Update to match
peek_for_as4_capability change.
Allow use of BGP_AS_TRANS by 2b speakers.
Use NOTIFY_OPEN_ERR rather than CEASE for OPEN parsing errors.
(bgp_capability_msg_parse) missing argument to debug print
(bgp_capability_receive) missing return values.
* tests/bgp_capability_test.c: (parse_test) update for changes to
peek_for_as4_capability
2007-07-25 Paul Jakma <paul.jakma@sun.com>
* Remove 2-byte size macros, just make existing macros take
argument to indicate which size to use.
Adjust all users - typically they want '1'.
* bgp_aspath.c: (aspath_has_as4) New, return 1 if there are any
as4's in a path.
(aspath_put) Return the number of bytes actually written, to
fix the bug Juergen noted: Splitting of segments will change
the number of bytes written from that already written to the
AS_PATH header.
(aspath_snmp_pathseg) Pass 2-byte flag to aspath_put. SNMP
is still defined as 2b.
(aspath_aggregate) fix latent bug.
(aspath_reconcile_as4) AS_PATH+NEW_AS_PATH reconciliation
function.
(aspath_key_make) Hash the AS_PATH string, rather than
just taking the addition of assegment ASes as the hash value,
hopefully sligthly more collision resistant.
(bgp_attr_munge_as4_attrs) Collide the NEW_ attributes
together with the OLD 2-byte forms, code Juergen
had in bgp_attr_parse but re-organised a bit.
(bgp_attr_parse) Bunch of code from Juergen moves
to previous function.
(bgp_packet_attribute) Compact significantly by
just /always/ using extended-length attr header.
Fix bug Juergen noted, by using aspath_put's
(new) returned size value for the attr header rather
than the (guesstimate) of aspath_size() - the two could
differ when aspath_put had to split large segments, unlikely
this bug was ever hit in the 'wild'.
(bgp_dump_routes_attr) Always use extended-len and
use aspath_put return for header length. Output 4b ASN
for AS_PATH and AGGREGATOR.
* bgp_ecommunity.c: (ecommunity_{hash_make,cmp}) fix
hash callback declarations to match prototypes.
(ecommunity_gettoken) Updated for ECOMMUNITY_ENCODE_AS4,
complete rewrite of Juergen's changes (no asdot support)
* bgp_open.c: (bgp_capability_as4) New, does what it says
on the tin.
(peek_for_as4_capability) Rewritten to use streams and
bgp_capability_as4.
* bgp_packet.c: (bgp_open_send) minor edit
checked (in the abstract at least) with Juergen.
Changes are to be more accepting, e.g, allow AS_TRANS on
a 2-byte session.
* (general) Update all commands to use CMD_AS_RANGE.
* bgp_vty.c: (bgp_clear) Fix return vals to use CMD_..
Remove stuff replicated by VTY_GET_LONG
(bgp_clear_vty) Return bgp_clear directly to vty.
* tests/aspath_test.c: Exercise 32bit parsing. Test reconcile
function.
* tests/ecommunity_test.c: New, test AS4 ecommunity changes,
positive test only at this time, error cases not tested yet.
2007-07-25 Juergen Kammer <j.kammer@eurodata.de>
* (general) AS4 support.
* bgpd.h: as_t changes to 4-bytes.
* bgp_aspath.h: Add BGP_AS4_MAX and BGP_AS_TRANS defines.
* bgp_aspath.c: AS_VALUE_SIZE becomes 4-byte, AS16_VALUE_SIZE
added for 2-byte.
Add AS16 versions of length calc macros.
(aspath_count_numas) New, count number of ASes.
(aspath_has_as4) New, return 1 if there are any as4's in a
path.
(assegments_parse) Interpret assegment as 4 or 2 byte,
according to how the caller instructs us, with a new
argument.
(aspath_parse) Add use32bit argument to pass to
assegments_parse. Adjust all its callers to pass 1, unless
otherwise noted.
(assegment_data_put) Adjust to be able to write 2 or 4 byte
AS, according to new use32bit argument.
(aspath_put) Adjust to write 2 or 4.
(aspath_gettoken) Use a long for passed in asno.
* bgp_attr.c: (attr_str) Add BGP_ATTR_AS4_PATH and
BGP_ATTR_AS4_AGGREGATOR.
(bgp_attr_aspath) Call aspath_parse with right 2/4 arg, as
determined by received-capability flag.
(bgp_attr_aspath_check) New, code previously in attr_aspath
but moved to new func so it can be run after NEW_AS_PATH
reconciliation.
(bgp_attr_as4_path) New, handle NEW_AS_PATH.
(bgp_attr_aggregator) Adjust to cope with 2/4 byte ASes.
(bgp_attr_as4_aggregator) New, read NEW_AGGREGATOR.
(bgp_attr_parse) Add handoffs to previous parsers for the two
new AS4 NEW_ attributes.
Various checks added for NEW/OLD reconciliation.
(bgp_packet_attribute) Support 2/4 for AS_PATH and
AGGREGATOR, detect when NEW_ attrs need to be sent.
* bgp_debug.{c,h}: Add 'debug bgp as4'.
* bgp_dump.c: MRTv2 support, unconditionally enabled, which
supports AS4. Based on patches from Erik (RIPE?).
* bgp_ecommunity.c: (ecommunity_ecom2str) ECOMMUNITY_ENCODE_AS4
support.
* bgp_open.c: (peek_for_as4_capability) New, peek for AS4
capability prior to full capability parsing, so we know which
ASN to use for struct peer lookup.
(bgp_open_capability) Always send AS4 capability.
* bgp_packet.c: (bgp_open_send) AS4 handling for AS field
(bgp_open_receive) Peek for AS4 capability first, and figure
out which AS to believe.
* bgp_vty.c: (bgp_show_peer) Print AS4 cap
* tests/aspath_test.c: Support asn32 changes, call aspath_parse
with 16 bit.
* vtysh/extract.pl: AS4 compatibility for router bgp ASNUMBER
* vtysh/extract.pl.in: AS4 compatibility for router bgp ASNUMBER
* vtysh/vtysh.c: AS4 compatibility for router bgp ASNUMBER
2007-10-15 00:32:21 +02:00
|
|
|
|
case BGP_ATTR_AS4_AGGREGATOR:
|
|
|
|
|
ret = bgp_attr_as4_aggregator (peer, length, attr, &as4_aggregator, &as4_aggregator_addr);
|
|
|
|
|
break;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
case BGP_ATTR_COMMUNITIES:
|
|
|
|
|
ret = bgp_attr_community (peer, length, attr, flag);
|
|
|
|
|
break;
|
|
|
|
|
case BGP_ATTR_ORIGINATOR_ID:
|
|
|
|
|
ret = bgp_attr_originator_id (peer, length, attr, flag);
|
|
|
|
|
break;
|
|
|
|
|
case BGP_ATTR_CLUSTER_LIST:
|
|
|
|
|
ret = bgp_attr_cluster_list (peer, length, attr, flag);
|
|
|
|
|
break;
|
|
|
|
|
case BGP_ATTR_MP_REACH_NLRI:
|
|
|
|
|
ret = bgp_mp_reach_parse (peer, length, attr, mp_update);
|
|
|
|
|
break;
|
|
|
|
|
case BGP_ATTR_MP_UNREACH_NLRI:
|
|
|
|
|
ret = bgp_mp_unreach_parse (peer, length, mp_withdraw);
|
|
|
|
|
break;
|
|
|
|
|
case BGP_ATTR_EXT_COMMUNITIES:
|
|
|
|
|
ret = bgp_attr_ext_communities (peer, length, attr, flag);
|
|
|
|
|
break;
|
2007-08-06 17:24:51 +02:00
|
|
|
|
case BGP_ATTR_AS_PATHLIMIT:
|
|
|
|
|
ret = bgp_attr_aspathlimit (peer, length, attr, flag, startp);
|
|
|
|
|
break;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
default:
|
|
|
|
|
ret = bgp_attr_unknown (peer, attr, flag, type, length, startp);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* If error occured immediately return to the caller. */
|
|
|
|
|
if (ret < 0)
|
2007-04-10 21:36:48 +02:00
|
|
|
|
{
|
|
|
|
|
zlog (peer->log, LOG_WARNING,
|
|
|
|
|
"%s: Attribute %s, parse error",
|
|
|
|
|
peer->host,
|
|
|
|
|
LOOKUP (attr_str, type));
|
|
|
|
|
bgp_notify_send (peer,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ERR,
|
|
|
|
|
BGP_NOTIFY_UPDATE_MAL_ATTR);
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
|
|
/* Check the fetched length. */
|
|
|
|
|
if (BGP_INPUT_PNT (peer) != attr_endp)
|
|
|
|
|
{
|
|
|
|
|
zlog (peer->log, LOG_WARNING,
|
2007-04-10 21:36:48 +02:00
|
|
|
|
"%s: BGP attribute %s, fetch error",
|
|
|
|
|
peer->host, LOOKUP (attr_str, type));
|
2002-12-13 21:15:29 +01:00
|
|
|
|
bgp_notify_send (peer,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ERR,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ATTR_LENG_ERR);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Check final read pointer is same as end pointer. */
|
|
|
|
|
if (BGP_INPUT_PNT (peer) != endp)
|
|
|
|
|
{
|
|
|
|
|
zlog (peer->log, LOG_WARNING,
|
2007-04-10 21:36:48 +02:00
|
|
|
|
"%s BGP attribute %s, length mismatch",
|
|
|
|
|
peer->host, LOOKUP (attr_str, type));
|
2002-12-13 21:15:29 +01:00
|
|
|
|
bgp_notify_send (peer,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ERR,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ATTR_LENG_ERR);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
[bgpd] Merge AS4 support
2007-10-14 Paul Jakma <paul.jakma@sun.com>
* NEWS: Note that MRT dumps are now version 2
* (general) Merge in Juergen Kammer's AS4 patch.
2007-09-27 Paul Jakma <paul.jakma@sun.com>
* bgp_aspath.c: (assegment_normalise) remove duplicates from
from sets.
(aspath_reconcile_as4) disregard a broken part of the RFC around
error handling in path reconciliation.
* aspath_test.c: Test dupe-weeding from sets.
Test that reconciliation merges AS_PATH and AS4_PATH where
former is shorter than latter.
2007-09-26 Paul Jakma <paul.jakma@sun.com>
* aspath_test.c: Test AS4_PATH reconcilation where length
of AS_PATH and AS4_PATH is same.
2007-09-25 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (peek_for_as4_capability) Fix to work.
* bgp_packet.c: (bgp_open_receive) Fix sanity check of as4.
* tests/bgp_capability_test.c: (general) Extend tests to validate
peek_for_as4_capability.
Add test of full OPEN Option block, with multiple capabilities,
both as a series of Option, and a single option.
Add some crap to beginning of stream, to prevent code depending
on getp == 0.
2007-09-18 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (bgp_capability_as4) debug printf inline with others.
(peek_for_as4_capability) There's no need to signal failure, as
failure is better dealt with through full capability parser -
just return the AS4, simpler.
* bgp_packet.c: (bgp_open_receive) Update to match
peek_for_as4_capability change.
Allow use of BGP_AS_TRANS by 2b speakers.
Use NOTIFY_OPEN_ERR rather than CEASE for OPEN parsing errors.
(bgp_capability_msg_parse) missing argument to debug print
(bgp_capability_receive) missing return values.
* tests/bgp_capability_test.c: (parse_test) update for changes to
peek_for_as4_capability
2007-07-25 Paul Jakma <paul.jakma@sun.com>
* Remove 2-byte size macros, just make existing macros take
argument to indicate which size to use.
Adjust all users - typically they want '1'.
* bgp_aspath.c: (aspath_has_as4) New, return 1 if there are any
as4's in a path.
(aspath_put) Return the number of bytes actually written, to
fix the bug Juergen noted: Splitting of segments will change
the number of bytes written from that already written to the
AS_PATH header.
(aspath_snmp_pathseg) Pass 2-byte flag to aspath_put. SNMP
is still defined as 2b.
(aspath_aggregate) fix latent bug.
(aspath_reconcile_as4) AS_PATH+NEW_AS_PATH reconciliation
function.
(aspath_key_make) Hash the AS_PATH string, rather than
just taking the addition of assegment ASes as the hash value,
hopefully sligthly more collision resistant.
(bgp_attr_munge_as4_attrs) Collide the NEW_ attributes
together with the OLD 2-byte forms, code Juergen
had in bgp_attr_parse but re-organised a bit.
(bgp_attr_parse) Bunch of code from Juergen moves
to previous function.
(bgp_packet_attribute) Compact significantly by
just /always/ using extended-length attr header.
Fix bug Juergen noted, by using aspath_put's
(new) returned size value for the attr header rather
than the (guesstimate) of aspath_size() - the two could
differ when aspath_put had to split large segments, unlikely
this bug was ever hit in the 'wild'.
(bgp_dump_routes_attr) Always use extended-len and
use aspath_put return for header length. Output 4b ASN
for AS_PATH and AGGREGATOR.
* bgp_ecommunity.c: (ecommunity_{hash_make,cmp}) fix
hash callback declarations to match prototypes.
(ecommunity_gettoken) Updated for ECOMMUNITY_ENCODE_AS4,
complete rewrite of Juergen's changes (no asdot support)
* bgp_open.c: (bgp_capability_as4) New, does what it says
on the tin.
(peek_for_as4_capability) Rewritten to use streams and
bgp_capability_as4.
* bgp_packet.c: (bgp_open_send) minor edit
checked (in the abstract at least) with Juergen.
Changes are to be more accepting, e.g, allow AS_TRANS on
a 2-byte session.
* (general) Update all commands to use CMD_AS_RANGE.
* bgp_vty.c: (bgp_clear) Fix return vals to use CMD_..
Remove stuff replicated by VTY_GET_LONG
(bgp_clear_vty) Return bgp_clear directly to vty.
* tests/aspath_test.c: Exercise 32bit parsing. Test reconcile
function.
* tests/ecommunity_test.c: New, test AS4 ecommunity changes,
positive test only at this time, error cases not tested yet.
2007-07-25 Juergen Kammer <j.kammer@eurodata.de>
* (general) AS4 support.
* bgpd.h: as_t changes to 4-bytes.
* bgp_aspath.h: Add BGP_AS4_MAX and BGP_AS_TRANS defines.
* bgp_aspath.c: AS_VALUE_SIZE becomes 4-byte, AS16_VALUE_SIZE
added for 2-byte.
Add AS16 versions of length calc macros.
(aspath_count_numas) New, count number of ASes.
(aspath_has_as4) New, return 1 if there are any as4's in a
path.
(assegments_parse) Interpret assegment as 4 or 2 byte,
according to how the caller instructs us, with a new
argument.
(aspath_parse) Add use32bit argument to pass to
assegments_parse. Adjust all its callers to pass 1, unless
otherwise noted.
(assegment_data_put) Adjust to be able to write 2 or 4 byte
AS, according to new use32bit argument.
(aspath_put) Adjust to write 2 or 4.
(aspath_gettoken) Use a long for passed in asno.
* bgp_attr.c: (attr_str) Add BGP_ATTR_AS4_PATH and
BGP_ATTR_AS4_AGGREGATOR.
(bgp_attr_aspath) Call aspath_parse with right 2/4 arg, as
determined by received-capability flag.
(bgp_attr_aspath_check) New, code previously in attr_aspath
but moved to new func so it can be run after NEW_AS_PATH
reconciliation.
(bgp_attr_as4_path) New, handle NEW_AS_PATH.
(bgp_attr_aggregator) Adjust to cope with 2/4 byte ASes.
(bgp_attr_as4_aggregator) New, read NEW_AGGREGATOR.
(bgp_attr_parse) Add handoffs to previous parsers for the two
new AS4 NEW_ attributes.
Various checks added for NEW/OLD reconciliation.
(bgp_packet_attribute) Support 2/4 for AS_PATH and
AGGREGATOR, detect when NEW_ attrs need to be sent.
* bgp_debug.{c,h}: Add 'debug bgp as4'.
* bgp_dump.c: MRTv2 support, unconditionally enabled, which
supports AS4. Based on patches from Erik (RIPE?).
* bgp_ecommunity.c: (ecommunity_ecom2str) ECOMMUNITY_ENCODE_AS4
support.
* bgp_open.c: (peek_for_as4_capability) New, peek for AS4
capability prior to full capability parsing, so we know which
ASN to use for struct peer lookup.
(bgp_open_capability) Always send AS4 capability.
* bgp_packet.c: (bgp_open_send) AS4 handling for AS field
(bgp_open_receive) Peek for AS4 capability first, and figure
out which AS to believe.
* bgp_vty.c: (bgp_show_peer) Print AS4 cap
* tests/aspath_test.c: Support asn32 changes, call aspath_parse
with 16 bit.
* vtysh/extract.pl: AS4 compatibility for router bgp ASNUMBER
* vtysh/extract.pl.in: AS4 compatibility for router bgp ASNUMBER
* vtysh/vtysh.c: AS4 compatibility for router bgp ASNUMBER
2007-10-15 00:32:21 +02:00
|
|
|
|
/*
|
|
|
|
|
* At this place we can see whether we got AS4_PATH and/or
|
|
|
|
|
* AS4_AGGREGATOR from a 16Bit peer and act accordingly.
|
|
|
|
|
* We can not do this before we've read all attributes because
|
|
|
|
|
* the as4 handling does not say whether AS4_PATH has to be sent
|
|
|
|
|
* after AS_PATH or not - and when AS4_AGGREGATOR will be send
|
|
|
|
|
* in relationship to AGGREGATOR.
|
|
|
|
|
* So, to be defensive, we are not relying on any order and read
|
|
|
|
|
* all attributes first, including these 32bit ones, and now,
|
|
|
|
|
* afterwards, we look what and if something is to be done for as4.
|
|
|
|
|
*/
|
|
|
|
|
if (bgp_attr_munge_as4_attrs (peer, attr, as4_path,
|
|
|
|
|
as4_aggregator, &as4_aggregator_addr))
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
/* At this stage, we have done all fiddling with as4, and the
|
|
|
|
|
* resulting info is in attr->aggregator resp. attr->aspath
|
|
|
|
|
* so we can chuck as4_aggregator and as4_path alltogether in
|
|
|
|
|
* order to save memory
|
|
|
|
|
*/
|
|
|
|
|
if ( as4_path )
|
|
|
|
|
{
|
|
|
|
|
aspath_unintern( as4_path ); /* unintern - it is in the hash */
|
|
|
|
|
as4_path = NULL;
|
|
|
|
|
/* The flag that we got this is still there, but that does not
|
|
|
|
|
* do any trouble
|
|
|
|
|
*/
|
|
|
|
|
}
|
|
|
|
|
/*
|
|
|
|
|
* The "rest" of the code does nothing with as4_aggregator.
|
|
|
|
|
* there is no memory attached specifically which is not part
|
|
|
|
|
* of the attr.
|
|
|
|
|
* so ignoring just means do nothing.
|
|
|
|
|
*/
|
|
|
|
|
/*
|
|
|
|
|
* Finally do the checks on the aspath we did not do yet
|
|
|
|
|
* because we waited for a potentially synthesized aspath.
|
|
|
|
|
*/
|
|
|
|
|
if ( attr->flag & ( ATTR_FLAG_BIT( BGP_ATTR_AS_PATH)))
|
|
|
|
|
{
|
|
|
|
|
ret = bgp_attr_aspath_check( peer, attr );
|
|
|
|
|
if ( ret < 0 )
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
|
/* Finally intern unknown attribute. */
|
2007-05-04 22:15:47 +02:00
|
|
|
|
if (attr->extra && attr->extra->transit)
|
|
|
|
|
attr->extra->transit = transit_intern (attr->extra->transit);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Well-known attribute check. */
|
|
|
|
|
int
|
|
|
|
|
bgp_attr_check (struct peer *peer, struct attr *attr)
|
|
|
|
|
{
|
|
|
|
|
u_char type = 0;
|
|
|
|
|
|
|
|
|
|
if (! CHECK_FLAG (attr->flag, ATTR_FLAG_BIT (BGP_ATTR_ORIGIN)))
|
|
|
|
|
type = BGP_ATTR_ORIGIN;
|
|
|
|
|
|
|
|
|
|
if (! CHECK_FLAG (attr->flag, ATTR_FLAG_BIT (BGP_ATTR_AS_PATH)))
|
|
|
|
|
type = BGP_ATTR_AS_PATH;
|
|
|
|
|
|
|
|
|
|
if (! CHECK_FLAG (attr->flag, ATTR_FLAG_BIT (BGP_ATTR_NEXT_HOP)))
|
|
|
|
|
type = BGP_ATTR_NEXT_HOP;
|
|
|
|
|
|
|
|
|
|
if (peer_sort (peer) == BGP_PEER_IBGP
|
|
|
|
|
&& ! CHECK_FLAG (attr->flag, ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF)))
|
|
|
|
|
type = BGP_ATTR_LOCAL_PREF;
|
|
|
|
|
|
|
|
|
|
if (type)
|
|
|
|
|
{
|
|
|
|
|
zlog (peer->log, LOG_WARNING,
|
|
|
|
|
"%s Missing well-known attribute %d.",
|
|
|
|
|
peer->host, type);
|
|
|
|
|
bgp_notify_send_with_data (peer,
|
|
|
|
|
BGP_NOTIFY_UPDATE_ERR,
|
|
|
|
|
BGP_NOTIFY_UPDATE_MISS_ATTR,
|
|
|
|
|
&type, 1);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int stream_put_prefix (struct stream *, struct prefix *);
|
|
|
|
|
|
|
|
|
|
/* Make attribute packet. */
|
|
|
|
|
bgp_size_t
|
|
|
|
|
bgp_packet_attribute (struct bgp *bgp, struct peer *peer,
|
|
|
|
|
struct stream *s, struct attr *attr, struct prefix *p,
|
|
|
|
|
afi_t afi, safi_t safi, struct peer *from,
|
2006-05-04 09:52:12 +02:00
|
|
|
|
struct prefix_rd *prd, u_char *tag)
|
2002-12-13 21:15:29 +01:00
|
|
|
|
{
|
2005-09-10 Paul Jakma <paul.jakma@sun.com>
* Makefile.am: bgpd shouldn't list libgp's sources as its own.
Use LDADD.
* bgp_aspath.h:
(struct assegment) New struct, abstract representation of a
list of AS_PATH segments and the contained ASNs.
(struct aspath) Remove the raw-data related
fields, reference the abstract struct assegment instead.
Remove several other computed fields, it's just a
headache to maintain them and they're cheap to compute from
struct assegment.
(aspath_parse) parse a stream, not a pointer to raw data.
(aspath_count_{hops,confeds,size}) helpers to access
information formerly directly contained in struct aspath.
(aspath_snmp_pathseg) Helper for SNMP, BGP MIB wants
to be able to output hex representation of raw data.
* bgp_aspath.c: (general) partial-rewrite. Store aspath data
as an abstract singly-linked list of abstract segments,
rather than storing the raw data, and parsing it each and
every time. Remove several count/size fields which are cheap
to compute from the abstract segment structure.
(global) Include stream.h, needed for aspath_parse, and
others. Couple of helper macros added.
(struct assegment_header) Just the header, and only the
header.
(assegment_data_{new,free}) convenience functions for
AS_SEG_DATA allocation, the dynamic, per-segment array of
ASNs.
(assegment_{new,free,free_all,dup,dup_all}) convenience
functions for creating struct assegments. The _all forms will
follow the entire chain of segments from the given segment.
(assegment_prepend_asns) new function, prepend an ASN N times
to segment.
(assegment_append_asns) Append a list (array) of ASNs to
segment.
(int_cmp) convenience function for the aspath hash.
(assegment_normalise) new function. Normalise the given
segment chain to meet expectations of Quagga, and to
eliminate differing raw representations of the same paths.
Merge 'runs' of SEQUENCEs into one segment as our internal
segment is not limited by the protocol AS_PATH segment
length. Sort ASNs in SETs.
(aspath_new) Take void argument to quell warnings. Use the
assegment convenience functions.
(assegment_count_{asns,confeds,hops}) new functions to
compute at runtime values previously held in struct aspath.
(aspath_size) ditto.
(aspath_make_str_count) rewritten to stringify new
representation, and to be slightly easier to understand
hopefully.
(aspath_str_update) convenience function, update the aspath
str. Should investigate removing maintained string from
struct aspath, just run-time compute it, as per other fields.
It's just a maintenance headache, would save noticeable
amount of RAM with possibly not much extra run-time cost.
(aspath_dup) use the assegment dup functions.
(aspath_hash_alloc) Take void * argument to satisfy gcc. Use
the proper helper functions to dup data.
(assegments_parse) new function. parse raw AS_PATH data into
struct assegments. Normalise and return the head of the list.
(aspath_parse) Parse a stream, not pointer to raw data and
use assegments_parse to do it.
(assegment_data_put) Write out a single segment data in protocol
form to stream.
(assegment_header_put) ditto but for segment header.
(aspath_put) new function. As per previous but for an entire
struct aspath.
(aspath_snmp_pathseg) wrapper around aspath_put for
bgp_snmp.c. Uses a static buffer sadly.
(aspath_aggregate_as_set_add) rewritten to use assegments.
(aspath_aggregate) ditto
(aspath_{firstas,loop,private_as}_check) ditto
(aspath_{merge,prepend,add_one_as}) ditto
(aspath_cmp_left{_confed}) ditto
(aspath_delete_confed_seq) ditto, plus fixed to properly
delete all leading confed segments.
(aspath_as_add) Just use assegment_append_asns.
(aspath_segment_add) updated to use assegments.
(enum as_token) Add values for confeds
(aspath_gettoken) Add support for confeds
(aspath_str2aspath) ditto
(aspath_key_make) updated to use as_segments. Also, add
segment type into the hash value as appropriate.
(aspath_cmp) updated to use as_segments.
(aspath_print) don't segfault on NULL argument.
* bgp_attr.c: (bgp_attr_aspath) aspath_parse wants the stream
now. No need for manual forwarding of stream.
(bgp_packet_attribute) empty aspath is now denoted by NULL
segment field, length is gone.
Use aspath_size() to determine size.
(bgp_attr_init) Fix declaration, explicitely specify void
arg.
(bgp_dump_routes_attr) Use aspath_size() to determine size.
* bgp_route.c: (bgp_info_cmp) use the aspath_count_* functions.
(bgp_rib_withdraw) remove unused variable. Use
aspath_count_hops.
* bgp_snmp.c: (bgp4PathAttrTable) raw data is gone, use
aspath_snmp_pathseg to get the representation.
2005-09-10 18:55:02 +02:00
|
|
|
|
size_t cp;
|
[bgpd] Merge AS4 support
2007-10-14 Paul Jakma <paul.jakma@sun.com>
* NEWS: Note that MRT dumps are now version 2
* (general) Merge in Juergen Kammer's AS4 patch.
2007-09-27 Paul Jakma <paul.jakma@sun.com>
* bgp_aspath.c: (assegment_normalise) remove duplicates from
from sets.
(aspath_reconcile_as4) disregard a broken part of the RFC around
error handling in path reconciliation.
* aspath_test.c: Test dupe-weeding from sets.
Test that reconciliation merges AS_PATH and AS4_PATH where
former is shorter than latter.
2007-09-26 Paul Jakma <paul.jakma@sun.com>
* aspath_test.c: Test AS4_PATH reconcilation where length
of AS_PATH and AS4_PATH is same.
2007-09-25 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (peek_for_as4_capability) Fix to work.
* bgp_packet.c: (bgp_open_receive) Fix sanity check of as4.
* tests/bgp_capability_test.c: (general) Extend tests to validate
peek_for_as4_capability.
Add test of full OPEN Option block, with multiple capabilities,
both as a series of Option, and a single option.
Add some crap to beginning of stream, to prevent code depending
on getp == 0.
2007-09-18 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (bgp_capability_as4) debug printf inline with others.
(peek_for_as4_capability) There's no need to signal failure, as
failure is better dealt with through full capability parser -
just return the AS4, simpler.
* bgp_packet.c: (bgp_open_receive) Update to match
peek_for_as4_capability change.
Allow use of BGP_AS_TRANS by 2b speakers.
Use NOTIFY_OPEN_ERR rather than CEASE for OPEN parsing errors.
(bgp_capability_msg_parse) missing argument to debug print
(bgp_capability_receive) missing return values.
* tests/bgp_capability_test.c: (parse_test) update for changes to
peek_for_as4_capability
2007-07-25 Paul Jakma <paul.jakma@sun.com>
* Remove 2-byte size macros, just make existing macros take
argument to indicate which size to use.
Adjust all users - typically they want '1'.
* bgp_aspath.c: (aspath_has_as4) New, return 1 if there are any
as4's in a path.
(aspath_put) Return the number of bytes actually written, to
fix the bug Juergen noted: Splitting of segments will change
the number of bytes written from that already written to the
AS_PATH header.
(aspath_snmp_pathseg) Pass 2-byte flag to aspath_put. SNMP
is still defined as 2b.
(aspath_aggregate) fix latent bug.
(aspath_reconcile_as4) AS_PATH+NEW_AS_PATH reconciliation
function.
(aspath_key_make) Hash the AS_PATH string, rather than
just taking the addition of assegment ASes as the hash value,
hopefully sligthly more collision resistant.
(bgp_attr_munge_as4_attrs) Collide the NEW_ attributes
together with the OLD 2-byte forms, code Juergen
had in bgp_attr_parse but re-organised a bit.
(bgp_attr_parse) Bunch of code from Juergen moves
to previous function.
(bgp_packet_attribute) Compact significantly by
just /always/ using extended-length attr header.
Fix bug Juergen noted, by using aspath_put's
(new) returned size value for the attr header rather
than the (guesstimate) of aspath_size() - the two could
differ when aspath_put had to split large segments, unlikely
this bug was ever hit in the 'wild'.
(bgp_dump_routes_attr) Always use extended-len and
use aspath_put return for header length. Output 4b ASN
for AS_PATH and AGGREGATOR.
* bgp_ecommunity.c: (ecommunity_{hash_make,cmp}) fix
hash callback declarations to match prototypes.
(ecommunity_gettoken) Updated for ECOMMUNITY_ENCODE_AS4,
complete rewrite of Juergen's changes (no asdot support)
* bgp_open.c: (bgp_capability_as4) New, does what it says
on the tin.
(peek_for_as4_capability) Rewritten to use streams and
bgp_capability_as4.
* bgp_packet.c: (bgp_open_send) minor edit
checked (in the abstract at least) with Juergen.
Changes are to be more accepting, e.g, allow AS_TRANS on
a 2-byte session.
* (general) Update all commands to use CMD_AS_RANGE.
* bgp_vty.c: (bgp_clear) Fix return vals to use CMD_..
Remove stuff replicated by VTY_GET_LONG
(bgp_clear_vty) Return bgp_clear directly to vty.
* tests/aspath_test.c: Exercise 32bit parsing. Test reconcile
function.
* tests/ecommunity_test.c: New, test AS4 ecommunity changes,
positive test only at this time, error cases not tested yet.
2007-07-25 Juergen Kammer <j.kammer@eurodata.de>
* (general) AS4 support.
* bgpd.h: as_t changes to 4-bytes.
* bgp_aspath.h: Add BGP_AS4_MAX and BGP_AS_TRANS defines.
* bgp_aspath.c: AS_VALUE_SIZE becomes 4-byte, AS16_VALUE_SIZE
added for 2-byte.
Add AS16 versions of length calc macros.
(aspath_count_numas) New, count number of ASes.
(aspath_has_as4) New, return 1 if there are any as4's in a
path.
(assegments_parse) Interpret assegment as 4 or 2 byte,
according to how the caller instructs us, with a new
argument.
(aspath_parse) Add use32bit argument to pass to
assegments_parse. Adjust all its callers to pass 1, unless
otherwise noted.
(assegment_data_put) Adjust to be able to write 2 or 4 byte
AS, according to new use32bit argument.
(aspath_put) Adjust to write 2 or 4.
(aspath_gettoken) Use a long for passed in asno.
* bgp_attr.c: (attr_str) Add BGP_ATTR_AS4_PATH and
BGP_ATTR_AS4_AGGREGATOR.
(bgp_attr_aspath) Call aspath_parse with right 2/4 arg, as
determined by received-capability flag.
(bgp_attr_aspath_check) New, code previously in attr_aspath
but moved to new func so it can be run after NEW_AS_PATH
reconciliation.
(bgp_attr_as4_path) New, handle NEW_AS_PATH.
(bgp_attr_aggregator) Adjust to cope with 2/4 byte ASes.
(bgp_attr_as4_aggregator) New, read NEW_AGGREGATOR.
(bgp_attr_parse) Add handoffs to previous parsers for the two
new AS4 NEW_ attributes.
Various checks added for NEW/OLD reconciliation.
(bgp_packet_attribute) Support 2/4 for AS_PATH and
AGGREGATOR, detect when NEW_ attrs need to be sent.
* bgp_debug.{c,h}: Add 'debug bgp as4'.
* bgp_dump.c: MRTv2 support, unconditionally enabled, which
supports AS4. Based on patches from Erik (RIPE?).
* bgp_ecommunity.c: (ecommunity_ecom2str) ECOMMUNITY_ENCODE_AS4
support.
* bgp_open.c: (peek_for_as4_capability) New, peek for AS4
capability prior to full capability parsing, so we know which
ASN to use for struct peer lookup.
(bgp_open_capability) Always send AS4 capability.
* bgp_packet.c: (bgp_open_send) AS4 handling for AS field
(bgp_open_receive) Peek for AS4 capability first, and figure
out which AS to believe.
* bgp_vty.c: (bgp_show_peer) Print AS4 cap
* tests/aspath_test.c: Support asn32 changes, call aspath_parse
with 16 bit.
* vtysh/extract.pl: AS4 compatibility for router bgp ASNUMBER
* vtysh/extract.pl.in: AS4 compatibility for router bgp ASNUMBER
* vtysh/vtysh.c: AS4 compatibility for router bgp ASNUMBER
2007-10-15 00:32:21 +02:00
|
|
|
|
size_t aspath_sizep;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
struct aspath *aspath;
|
[bgpd] Merge AS4 support
2007-10-14 Paul Jakma <paul.jakma@sun.com>
* NEWS: Note that MRT dumps are now version 2
* (general) Merge in Juergen Kammer's AS4 patch.
2007-09-27 Paul Jakma <paul.jakma@sun.com>
* bgp_aspath.c: (assegment_normalise) remove duplicates from
from sets.
(aspath_reconcile_as4) disregard a broken part of the RFC around
error handling in path reconciliation.
* aspath_test.c: Test dupe-weeding from sets.
Test that reconciliation merges AS_PATH and AS4_PATH where
former is shorter than latter.
2007-09-26 Paul Jakma <paul.jakma@sun.com>
* aspath_test.c: Test AS4_PATH reconcilation where length
of AS_PATH and AS4_PATH is same.
2007-09-25 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (peek_for_as4_capability) Fix to work.
* bgp_packet.c: (bgp_open_receive) Fix sanity check of as4.
* tests/bgp_capability_test.c: (general) Extend tests to validate
peek_for_as4_capability.
Add test of full OPEN Option block, with multiple capabilities,
both as a series of Option, and a single option.
Add some crap to beginning of stream, to prevent code depending
on getp == 0.
2007-09-18 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (bgp_capability_as4) debug printf inline with others.
(peek_for_as4_capability) There's no need to signal failure, as
failure is better dealt with through full capability parser -
just return the AS4, simpler.
* bgp_packet.c: (bgp_open_receive) Update to match
peek_for_as4_capability change.
Allow use of BGP_AS_TRANS by 2b speakers.
Use NOTIFY_OPEN_ERR rather than CEASE for OPEN parsing errors.
(bgp_capability_msg_parse) missing argument to debug print
(bgp_capability_receive) missing return values.
* tests/bgp_capability_test.c: (parse_test) update for changes to
peek_for_as4_capability
2007-07-25 Paul Jakma <paul.jakma@sun.com>
* Remove 2-byte size macros, just make existing macros take
argument to indicate which size to use.
Adjust all users - typically they want '1'.
* bgp_aspath.c: (aspath_has_as4) New, return 1 if there are any
as4's in a path.
(aspath_put) Return the number of bytes actually written, to
fix the bug Juergen noted: Splitting of segments will change
the number of bytes written from that already written to the
AS_PATH header.
(aspath_snmp_pathseg) Pass 2-byte flag to aspath_put. SNMP
is still defined as 2b.
(aspath_aggregate) fix latent bug.
(aspath_reconcile_as4) AS_PATH+NEW_AS_PATH reconciliation
function.
(aspath_key_make) Hash the AS_PATH string, rather than
just taking the addition of assegment ASes as the hash value,
hopefully sligthly more collision resistant.
(bgp_attr_munge_as4_attrs) Collide the NEW_ attributes
together with the OLD 2-byte forms, code Juergen
had in bgp_attr_parse but re-organised a bit.
(bgp_attr_parse) Bunch of code from Juergen moves
to previous function.
(bgp_packet_attribute) Compact significantly by
just /always/ using extended-length attr header.
Fix bug Juergen noted, by using aspath_put's
(new) returned size value for the attr header rather
than the (guesstimate) of aspath_size() - the two could
differ when aspath_put had to split large segments, unlikely
this bug was ever hit in the 'wild'.
(bgp_dump_routes_attr) Always use extended-len and
use aspath_put return for header length. Output 4b ASN
for AS_PATH and AGGREGATOR.
* bgp_ecommunity.c: (ecommunity_{hash_make,cmp}) fix
hash callback declarations to match prototypes.
(ecommunity_gettoken) Updated for ECOMMUNITY_ENCODE_AS4,
complete rewrite of Juergen's changes (no asdot support)
* bgp_open.c: (bgp_capability_as4) New, does what it says
on the tin.
(peek_for_as4_capability) Rewritten to use streams and
bgp_capability_as4.
* bgp_packet.c: (bgp_open_send) minor edit
checked (in the abstract at least) with Juergen.
Changes are to be more accepting, e.g, allow AS_TRANS on
a 2-byte session.
* (general) Update all commands to use CMD_AS_RANGE.
* bgp_vty.c: (bgp_clear) Fix return vals to use CMD_..
Remove stuff replicated by VTY_GET_LONG
(bgp_clear_vty) Return bgp_clear directly to vty.
* tests/aspath_test.c: Exercise 32bit parsing. Test reconcile
function.
* tests/ecommunity_test.c: New, test AS4 ecommunity changes,
positive test only at this time, error cases not tested yet.
2007-07-25 Juergen Kammer <j.kammer@eurodata.de>
* (general) AS4 support.
* bgpd.h: as_t changes to 4-bytes.
* bgp_aspath.h: Add BGP_AS4_MAX and BGP_AS_TRANS defines.
* bgp_aspath.c: AS_VALUE_SIZE becomes 4-byte, AS16_VALUE_SIZE
added for 2-byte.
Add AS16 versions of length calc macros.
(aspath_count_numas) New, count number of ASes.
(aspath_has_as4) New, return 1 if there are any as4's in a
path.
(assegments_parse) Interpret assegment as 4 or 2 byte,
according to how the caller instructs us, with a new
argument.
(aspath_parse) Add use32bit argument to pass to
assegments_parse. Adjust all its callers to pass 1, unless
otherwise noted.
(assegment_data_put) Adjust to be able to write 2 or 4 byte
AS, according to new use32bit argument.
(aspath_put) Adjust to write 2 or 4.
(aspath_gettoken) Use a long for passed in asno.
* bgp_attr.c: (attr_str) Add BGP_ATTR_AS4_PATH and
BGP_ATTR_AS4_AGGREGATOR.
(bgp_attr_aspath) Call aspath_parse with right 2/4 arg, as
determined by received-capability flag.
(bgp_attr_aspath_check) New, code previously in attr_aspath
but moved to new func so it can be run after NEW_AS_PATH
reconciliation.
(bgp_attr_as4_path) New, handle NEW_AS_PATH.
(bgp_attr_aggregator) Adjust to cope with 2/4 byte ASes.
(bgp_attr_as4_aggregator) New, read NEW_AGGREGATOR.
(bgp_attr_parse) Add handoffs to previous parsers for the two
new AS4 NEW_ attributes.
Various checks added for NEW/OLD reconciliation.
(bgp_packet_attribute) Support 2/4 for AS_PATH and
AGGREGATOR, detect when NEW_ attrs need to be sent.
* bgp_debug.{c,h}: Add 'debug bgp as4'.
* bgp_dump.c: MRTv2 support, unconditionally enabled, which
supports AS4. Based on patches from Erik (RIPE?).
* bgp_ecommunity.c: (ecommunity_ecom2str) ECOMMUNITY_ENCODE_AS4
support.
* bgp_open.c: (peek_for_as4_capability) New, peek for AS4
capability prior to full capability parsing, so we know which
ASN to use for struct peer lookup.
(bgp_open_capability) Always send AS4 capability.
* bgp_packet.c: (bgp_open_send) AS4 handling for AS field
(bgp_open_receive) Peek for AS4 capability first, and figure
out which AS to believe.
* bgp_vty.c: (bgp_show_peer) Print AS4 cap
* tests/aspath_test.c: Support asn32 changes, call aspath_parse
with 16 bit.
* vtysh/extract.pl: AS4 compatibility for router bgp ASNUMBER
* vtysh/extract.pl.in: AS4 compatibility for router bgp ASNUMBER
* vtysh/vtysh.c: AS4 compatibility for router bgp ASNUMBER
2007-10-15 00:32:21 +02:00
|
|
|
|
int send_as4_path = 0;
|
|
|
|
|
int send_as4_aggregator = 0;
|
|
|
|
|
int use32bit = (CHECK_FLAG (peer->cap, PEER_CAP_AS4_RCV)) ? 1 : 0;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
|
|
if (! bgp)
|
|
|
|
|
bgp = bgp_get_default ();
|
|
|
|
|
|
|
|
|
|
/* Remember current pointer. */
|
2005-02-09 16:51:56 +01:00
|
|
|
|
cp = stream_get_endp (s);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
|
|
/* Origin attribute. */
|
|
|
|
|
stream_putc (s, BGP_ATTR_FLAG_TRANS);
|
|
|
|
|
stream_putc (s, BGP_ATTR_ORIGIN);
|
|
|
|
|
stream_putc (s, 1);
|
|
|
|
|
stream_putc (s, attr->origin);
|
|
|
|
|
|
|
|
|
|
/* AS path attribute. */
|
|
|
|
|
|
|
|
|
|
/* If remote-peer is EBGP */
|
|
|
|
|
if (peer_sort (peer) == BGP_PEER_EBGP
|
|
|
|
|
&& (! CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_AS_PATH_UNCHANGED)
|
2005-09-10 Paul Jakma <paul.jakma@sun.com>
* Makefile.am: bgpd shouldn't list libgp's sources as its own.
Use LDADD.
* bgp_aspath.h:
(struct assegment) New struct, abstract representation of a
list of AS_PATH segments and the contained ASNs.
(struct aspath) Remove the raw-data related
fields, reference the abstract struct assegment instead.
Remove several other computed fields, it's just a
headache to maintain them and they're cheap to compute from
struct assegment.
(aspath_parse) parse a stream, not a pointer to raw data.
(aspath_count_{hops,confeds,size}) helpers to access
information formerly directly contained in struct aspath.
(aspath_snmp_pathseg) Helper for SNMP, BGP MIB wants
to be able to output hex representation of raw data.
* bgp_aspath.c: (general) partial-rewrite. Store aspath data
as an abstract singly-linked list of abstract segments,
rather than storing the raw data, and parsing it each and
every time. Remove several count/size fields which are cheap
to compute from the abstract segment structure.
(global) Include stream.h, needed for aspath_parse, and
others. Couple of helper macros added.
(struct assegment_header) Just the header, and only the
header.
(assegment_data_{new,free}) convenience functions for
AS_SEG_DATA allocation, the dynamic, per-segment array of
ASNs.
(assegment_{new,free,free_all,dup,dup_all}) convenience
functions for creating struct assegments. The _all forms will
follow the entire chain of segments from the given segment.
(assegment_prepend_asns) new function, prepend an ASN N times
to segment.
(assegment_append_asns) Append a list (array) of ASNs to
segment.
(int_cmp) convenience function for the aspath hash.
(assegment_normalise) new function. Normalise the given
segment chain to meet expectations of Quagga, and to
eliminate differing raw representations of the same paths.
Merge 'runs' of SEQUENCEs into one segment as our internal
segment is not limited by the protocol AS_PATH segment
length. Sort ASNs in SETs.
(aspath_new) Take void argument to quell warnings. Use the
assegment convenience functions.
(assegment_count_{asns,confeds,hops}) new functions to
compute at runtime values previously held in struct aspath.
(aspath_size) ditto.
(aspath_make_str_count) rewritten to stringify new
representation, and to be slightly easier to understand
hopefully.
(aspath_str_update) convenience function, update the aspath
str. Should investigate removing maintained string from
struct aspath, just run-time compute it, as per other fields.
It's just a maintenance headache, would save noticeable
amount of RAM with possibly not much extra run-time cost.
(aspath_dup) use the assegment dup functions.
(aspath_hash_alloc) Take void * argument to satisfy gcc. Use
the proper helper functions to dup data.
(assegments_parse) new function. parse raw AS_PATH data into
struct assegments. Normalise and return the head of the list.
(aspath_parse) Parse a stream, not pointer to raw data and
use assegments_parse to do it.
(assegment_data_put) Write out a single segment data in protocol
form to stream.
(assegment_header_put) ditto but for segment header.
(aspath_put) new function. As per previous but for an entire
struct aspath.
(aspath_snmp_pathseg) wrapper around aspath_put for
bgp_snmp.c. Uses a static buffer sadly.
(aspath_aggregate_as_set_add) rewritten to use assegments.
(aspath_aggregate) ditto
(aspath_{firstas,loop,private_as}_check) ditto
(aspath_{merge,prepend,add_one_as}) ditto
(aspath_cmp_left{_confed}) ditto
(aspath_delete_confed_seq) ditto, plus fixed to properly
delete all leading confed segments.
(aspath_as_add) Just use assegment_append_asns.
(aspath_segment_add) updated to use assegments.
(enum as_token) Add values for confeds
(aspath_gettoken) Add support for confeds
(aspath_str2aspath) ditto
(aspath_key_make) updated to use as_segments. Also, add
segment type into the hash value as appropriate.
(aspath_cmp) updated to use as_segments.
(aspath_print) don't segfault on NULL argument.
* bgp_attr.c: (bgp_attr_aspath) aspath_parse wants the stream
now. No need for manual forwarding of stream.
(bgp_packet_attribute) empty aspath is now denoted by NULL
segment field, length is gone.
Use aspath_size() to determine size.
(bgp_attr_init) Fix declaration, explicitely specify void
arg.
(bgp_dump_routes_attr) Use aspath_size() to determine size.
* bgp_route.c: (bgp_info_cmp) use the aspath_count_* functions.
(bgp_rib_withdraw) remove unused variable. Use
aspath_count_hops.
* bgp_snmp.c: (bgp4PathAttrTable) raw data is gone, use
aspath_snmp_pathseg to get the representation.
2005-09-10 18:55:02 +02:00
|
|
|
|
|| attr->aspath->segments == NULL)
|
2004-09-13 Jose Luis Rubio <jrubio@dit.upm.es>
(at Technical University of Madrid as part of Euro6ix Project)
Enhanced Route Server functionality and Route-Maps:
* bgpd/bgpd.h: Modified 'struct peer' and 'struct bgp_filter' to
support rs-clients. A 'struct bgp_table *rib' has been added to the
first (to mantain a separated RIB for each rs-client) and two new
route-maps have been added to the last (for import/export policies).
Added the following #defines: RMAP_{IN|OUT|IMPORT|EXPORT|MAX},
PEER_RMAP_TYPE_{IMPORT|EXPORT} and BGP_CLEAR_SOFT_RSCLIENT.
* bgpd/bgpd.c: Modified the functions that create/delete/etc peers in
order to consider the new fields included in 'struct peer' for
supporting rs-clients, i.e. the import/export route-maps and the
'struct bgp_table'.
* bgpd/bgp_route.{ch}: Modified several functions related with
receiving/sending announces in order to support the new Route Server
capabilities.
Function 'bgp_process' has been reorganized, creating an auxiliar
function for best path selection ('bgp_best_selection').
Modified 'bgp_show' and 'bgp_show_route' for displaying information
about any RIB (and not only the main bgp RIB).
Added commands for displaying information about RS-clients RIBs:
'show bgp rsclient (A.B.C.D|X:X::X:X)', 'show bgp rsclient
(A.B.C.D|X:X::X:X) X:X::X:X/M', etc
* bgpd/bgp_table.{ch}: The structure 'struct bgp_table' now has two
new fields: type (which can take the values BGP_TABLE_{MAIN|RSCLIENT})
and 'void *owner' which points to 'struct bgp' or 'struct peer' which
owns the table.
When creating a new bgp_table by default 'type=BGP_TABLE_MAIN' is set.
* bgpd/bgp_vty.c: The commands 'neighbor ... route-server-client' and
'no neighbor ... route-server-client' now not only set/unset the flag
PEER_FLAG_RSERVER_CLIENT, but they create/destroy the 'struct
bgp_table' of the peer. Special actions are taken for peer_groups.
Command 'neighbor ... route-map WORD (in|out)' now also supports two
new kinds of route-map: 'import' and 'export'.
Added commands 'clear bgp * rsclient', etc. These commands allow a new
kind of soft_reconfig which affects only the RIB of the specified
RS-client.
Added commands 'show bgp rsclient summary', etc which display a
summary of the rs-clients configured for the corresponding address
family.
* bgpd/bgp_routemap.c: A new match statement is available,
'match peer (A.B.C.D|X:X::X:X)'. This statement can only be used in
import/export route-maps, and it matches when the peer who announces
(when used in an import route-map) or is going to receive (when used
in an export route-map) the route is the same than the one specified
in the statement.
For peer-groups the statement matches if the specified peer is member
of the peer-group.
A special version of the command, 'match peer local', matches with
routes originated by the Route Server (defined with 'network ...',
redistributed routes and default-originate).
* lib/routemap.{ch}: Added a new clause 'call NAME' for use in
route-maps. It jumps into the specified route-map and when it returns
the first route-map ends if the called RM returns DENY_MATCH, or
continues in other case.
2004-09-13 07:12:46 +02:00
|
|
|
|
&& (! CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT)))
|
2002-12-13 21:15:29 +01:00
|
|
|
|
{
|
|
|
|
|
aspath = aspath_dup (attr->aspath);
|
|
|
|
|
|
|
|
|
|
if (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION))
|
|
|
|
|
{
|
|
|
|
|
/* Strip the confed info, and then stuff our path CONFED_ID
|
|
|
|
|
on the front */
|
|
|
|
|
aspath = aspath_delete_confed_seq (aspath);
|
|
|
|
|
aspath = aspath_add_seq (aspath, bgp->confed_id);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
aspath = aspath_add_seq (aspath, peer->local_as);
|
|
|
|
|
if (peer->change_local_as)
|
|
|
|
|
aspath = aspath_add_seq (aspath, peer->change_local_as);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (peer_sort (peer) == BGP_PEER_CONFED)
|
|
|
|
|
{
|
|
|
|
|
/* A confed member, so we need to do the AS_CONFED_SEQUENCE thing */
|
|
|
|
|
aspath = aspath_dup (attr->aspath);
|
|
|
|
|
aspath = aspath_add_confed_seq (aspath, peer->local_as);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
aspath = attr->aspath;
|
|
|
|
|
|
[bgpd] Merge AS4 support
2007-10-14 Paul Jakma <paul.jakma@sun.com>
* NEWS: Note that MRT dumps are now version 2
* (general) Merge in Juergen Kammer's AS4 patch.
2007-09-27 Paul Jakma <paul.jakma@sun.com>
* bgp_aspath.c: (assegment_normalise) remove duplicates from
from sets.
(aspath_reconcile_as4) disregard a broken part of the RFC around
error handling in path reconciliation.
* aspath_test.c: Test dupe-weeding from sets.
Test that reconciliation merges AS_PATH and AS4_PATH where
former is shorter than latter.
2007-09-26 Paul Jakma <paul.jakma@sun.com>
* aspath_test.c: Test AS4_PATH reconcilation where length
of AS_PATH and AS4_PATH is same.
2007-09-25 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (peek_for_as4_capability) Fix to work.
* bgp_packet.c: (bgp_open_receive) Fix sanity check of as4.
* tests/bgp_capability_test.c: (general) Extend tests to validate
peek_for_as4_capability.
Add test of full OPEN Option block, with multiple capabilities,
both as a series of Option, and a single option.
Add some crap to beginning of stream, to prevent code depending
on getp == 0.
2007-09-18 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (bgp_capability_as4) debug printf inline with others.
(peek_for_as4_capability) There's no need to signal failure, as
failure is better dealt with through full capability parser -
just return the AS4, simpler.
* bgp_packet.c: (bgp_open_receive) Update to match
peek_for_as4_capability change.
Allow use of BGP_AS_TRANS by 2b speakers.
Use NOTIFY_OPEN_ERR rather than CEASE for OPEN parsing errors.
(bgp_capability_msg_parse) missing argument to debug print
(bgp_capability_receive) missing return values.
* tests/bgp_capability_test.c: (parse_test) update for changes to
peek_for_as4_capability
2007-07-25 Paul Jakma <paul.jakma@sun.com>
* Remove 2-byte size macros, just make existing macros take
argument to indicate which size to use.
Adjust all users - typically they want '1'.
* bgp_aspath.c: (aspath_has_as4) New, return 1 if there are any
as4's in a path.
(aspath_put) Return the number of bytes actually written, to
fix the bug Juergen noted: Splitting of segments will change
the number of bytes written from that already written to the
AS_PATH header.
(aspath_snmp_pathseg) Pass 2-byte flag to aspath_put. SNMP
is still defined as 2b.
(aspath_aggregate) fix latent bug.
(aspath_reconcile_as4) AS_PATH+NEW_AS_PATH reconciliation
function.
(aspath_key_make) Hash the AS_PATH string, rather than
just taking the addition of assegment ASes as the hash value,
hopefully sligthly more collision resistant.
(bgp_attr_munge_as4_attrs) Collide the NEW_ attributes
together with the OLD 2-byte forms, code Juergen
had in bgp_attr_parse but re-organised a bit.
(bgp_attr_parse) Bunch of code from Juergen moves
to previous function.
(bgp_packet_attribute) Compact significantly by
just /always/ using extended-length attr header.
Fix bug Juergen noted, by using aspath_put's
(new) returned size value for the attr header rather
than the (guesstimate) of aspath_size() - the two could
differ when aspath_put had to split large segments, unlikely
this bug was ever hit in the 'wild'.
(bgp_dump_routes_attr) Always use extended-len and
use aspath_put return for header length. Output 4b ASN
for AS_PATH and AGGREGATOR.
* bgp_ecommunity.c: (ecommunity_{hash_make,cmp}) fix
hash callback declarations to match prototypes.
(ecommunity_gettoken) Updated for ECOMMUNITY_ENCODE_AS4,
complete rewrite of Juergen's changes (no asdot support)
* bgp_open.c: (bgp_capability_as4) New, does what it says
on the tin.
(peek_for_as4_capability) Rewritten to use streams and
bgp_capability_as4.
* bgp_packet.c: (bgp_open_send) minor edit
checked (in the abstract at least) with Juergen.
Changes are to be more accepting, e.g, allow AS_TRANS on
a 2-byte session.
* (general) Update all commands to use CMD_AS_RANGE.
* bgp_vty.c: (bgp_clear) Fix return vals to use CMD_..
Remove stuff replicated by VTY_GET_LONG
(bgp_clear_vty) Return bgp_clear directly to vty.
* tests/aspath_test.c: Exercise 32bit parsing. Test reconcile
function.
* tests/ecommunity_test.c: New, test AS4 ecommunity changes,
positive test only at this time, error cases not tested yet.
2007-07-25 Juergen Kammer <j.kammer@eurodata.de>
* (general) AS4 support.
* bgpd.h: as_t changes to 4-bytes.
* bgp_aspath.h: Add BGP_AS4_MAX and BGP_AS_TRANS defines.
* bgp_aspath.c: AS_VALUE_SIZE becomes 4-byte, AS16_VALUE_SIZE
added for 2-byte.
Add AS16 versions of length calc macros.
(aspath_count_numas) New, count number of ASes.
(aspath_has_as4) New, return 1 if there are any as4's in a
path.
(assegments_parse) Interpret assegment as 4 or 2 byte,
according to how the caller instructs us, with a new
argument.
(aspath_parse) Add use32bit argument to pass to
assegments_parse. Adjust all its callers to pass 1, unless
otherwise noted.
(assegment_data_put) Adjust to be able to write 2 or 4 byte
AS, according to new use32bit argument.
(aspath_put) Adjust to write 2 or 4.
(aspath_gettoken) Use a long for passed in asno.
* bgp_attr.c: (attr_str) Add BGP_ATTR_AS4_PATH and
BGP_ATTR_AS4_AGGREGATOR.
(bgp_attr_aspath) Call aspath_parse with right 2/4 arg, as
determined by received-capability flag.
(bgp_attr_aspath_check) New, code previously in attr_aspath
but moved to new func so it can be run after NEW_AS_PATH
reconciliation.
(bgp_attr_as4_path) New, handle NEW_AS_PATH.
(bgp_attr_aggregator) Adjust to cope with 2/4 byte ASes.
(bgp_attr_as4_aggregator) New, read NEW_AGGREGATOR.
(bgp_attr_parse) Add handoffs to previous parsers for the two
new AS4 NEW_ attributes.
Various checks added for NEW/OLD reconciliation.
(bgp_packet_attribute) Support 2/4 for AS_PATH and
AGGREGATOR, detect when NEW_ attrs need to be sent.
* bgp_debug.{c,h}: Add 'debug bgp as4'.
* bgp_dump.c: MRTv2 support, unconditionally enabled, which
supports AS4. Based on patches from Erik (RIPE?).
* bgp_ecommunity.c: (ecommunity_ecom2str) ECOMMUNITY_ENCODE_AS4
support.
* bgp_open.c: (peek_for_as4_capability) New, peek for AS4
capability prior to full capability parsing, so we know which
ASN to use for struct peer lookup.
(bgp_open_capability) Always send AS4 capability.
* bgp_packet.c: (bgp_open_send) AS4 handling for AS field
(bgp_open_receive) Peek for AS4 capability first, and figure
out which AS to believe.
* bgp_vty.c: (bgp_show_peer) Print AS4 cap
* tests/aspath_test.c: Support asn32 changes, call aspath_parse
with 16 bit.
* vtysh/extract.pl: AS4 compatibility for router bgp ASNUMBER
* vtysh/extract.pl.in: AS4 compatibility for router bgp ASNUMBER
* vtysh/vtysh.c: AS4 compatibility for router bgp ASNUMBER
2007-10-15 00:32:21 +02:00
|
|
|
|
/* If peer is not AS4 capable, then:
|
|
|
|
|
* - send the created AS_PATH out as AS4_PATH (optional, transitive),
|
|
|
|
|
* but ensure that no AS_CONFED_SEQUENCE and AS_CONFED_SET path segment
|
|
|
|
|
* types are in it (i.e. exclude them if they are there)
|
|
|
|
|
* AND do this only if there is at least one asnum > 65535 in the path!
|
|
|
|
|
* - send an AS_PATH out, but put 16Bit ASnums in it, not 32bit, and change
|
|
|
|
|
* all ASnums > 65535 to BGP_AS_TRANS
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
stream_putc (s, BGP_ATTR_FLAG_TRANS|BGP_ATTR_FLAG_EXTLEN);
|
|
|
|
|
stream_putc (s, BGP_ATTR_AS_PATH);
|
|
|
|
|
aspath_sizep = stream_get_endp (s);
|
|
|
|
|
stream_putw (s, 0);
|
|
|
|
|
stream_putw_at (s, aspath_sizep, aspath_put (s, aspath, use32bit));
|
|
|
|
|
|
|
|
|
|
/* OLD session may need NEW_AS_PATH sent, if there are 4-byte ASNs
|
|
|
|
|
* in the path
|
|
|
|
|
*/
|
|
|
|
|
if (!use32bit && aspath_has_as4 (aspath))
|
|
|
|
|
send_as4_path = 1; /* we'll do this later, at the correct place */
|
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
|
/* Nexthop attribute. */
|
|
|
|
|
if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_NEXT_HOP) && afi == AFI_IP)
|
|
|
|
|
{
|
|
|
|
|
stream_putc (s, BGP_ATTR_FLAG_TRANS);
|
|
|
|
|
stream_putc (s, BGP_ATTR_NEXT_HOP);
|
|
|
|
|
stream_putc (s, 4);
|
|
|
|
|
if (safi == SAFI_MPLS_VPN)
|
|
|
|
|
{
|
|
|
|
|
if (attr->nexthop.s_addr == 0)
|
|
|
|
|
stream_put_ipv4 (s, peer->nexthop.v4.s_addr);
|
|
|
|
|
else
|
|
|
|
|
stream_put_ipv4 (s, attr->nexthop.s_addr);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
stream_put_ipv4 (s, attr->nexthop.s_addr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* MED attribute. */
|
|
|
|
|
if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
|
|
|
|
|
{
|
|
|
|
|
stream_putc (s, BGP_ATTR_FLAG_OPTIONAL);
|
|
|
|
|
stream_putc (s, BGP_ATTR_MULTI_EXIT_DISC);
|
|
|
|
|
stream_putc (s, 4);
|
|
|
|
|
stream_putl (s, attr->med);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Local preference. */
|
|
|
|
|
if (peer_sort (peer) == BGP_PEER_IBGP ||
|
|
|
|
|
peer_sort (peer) == BGP_PEER_CONFED)
|
|
|
|
|
{
|
|
|
|
|
stream_putc (s, BGP_ATTR_FLAG_TRANS);
|
|
|
|
|
stream_putc (s, BGP_ATTR_LOCAL_PREF);
|
|
|
|
|
stream_putc (s, 4);
|
|
|
|
|
stream_putl (s, attr->local_pref);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Atomic aggregate. */
|
|
|
|
|
if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE))
|
|
|
|
|
{
|
|
|
|
|
stream_putc (s, BGP_ATTR_FLAG_TRANS);
|
|
|
|
|
stream_putc (s, BGP_ATTR_ATOMIC_AGGREGATE);
|
|
|
|
|
stream_putc (s, 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Aggregator. */
|
|
|
|
|
if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_AGGREGATOR))
|
|
|
|
|
{
|
2007-05-04 22:15:47 +02:00
|
|
|
|
assert (attr->extra);
|
[bgpd] Merge AS4 support
2007-10-14 Paul Jakma <paul.jakma@sun.com>
* NEWS: Note that MRT dumps are now version 2
* (general) Merge in Juergen Kammer's AS4 patch.
2007-09-27 Paul Jakma <paul.jakma@sun.com>
* bgp_aspath.c: (assegment_normalise) remove duplicates from
from sets.
(aspath_reconcile_as4) disregard a broken part of the RFC around
error handling in path reconciliation.
* aspath_test.c: Test dupe-weeding from sets.
Test that reconciliation merges AS_PATH and AS4_PATH where
former is shorter than latter.
2007-09-26 Paul Jakma <paul.jakma@sun.com>
* aspath_test.c: Test AS4_PATH reconcilation where length
of AS_PATH and AS4_PATH is same.
2007-09-25 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (peek_for_as4_capability) Fix to work.
* bgp_packet.c: (bgp_open_receive) Fix sanity check of as4.
* tests/bgp_capability_test.c: (general) Extend tests to validate
peek_for_as4_capability.
Add test of full OPEN Option block, with multiple capabilities,
both as a series of Option, and a single option.
Add some crap to beginning of stream, to prevent code depending
on getp == 0.
2007-09-18 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (bgp_capability_as4) debug printf inline with others.
(peek_for_as4_capability) There's no need to signal failure, as
failure is better dealt with through full capability parser -
just return the AS4, simpler.
* bgp_packet.c: (bgp_open_receive) Update to match
peek_for_as4_capability change.
Allow use of BGP_AS_TRANS by 2b speakers.
Use NOTIFY_OPEN_ERR rather than CEASE for OPEN parsing errors.
(bgp_capability_msg_parse) missing argument to debug print
(bgp_capability_receive) missing return values.
* tests/bgp_capability_test.c: (parse_test) update for changes to
peek_for_as4_capability
2007-07-25 Paul Jakma <paul.jakma@sun.com>
* Remove 2-byte size macros, just make existing macros take
argument to indicate which size to use.
Adjust all users - typically they want '1'.
* bgp_aspath.c: (aspath_has_as4) New, return 1 if there are any
as4's in a path.
(aspath_put) Return the number of bytes actually written, to
fix the bug Juergen noted: Splitting of segments will change
the number of bytes written from that already written to the
AS_PATH header.
(aspath_snmp_pathseg) Pass 2-byte flag to aspath_put. SNMP
is still defined as 2b.
(aspath_aggregate) fix latent bug.
(aspath_reconcile_as4) AS_PATH+NEW_AS_PATH reconciliation
function.
(aspath_key_make) Hash the AS_PATH string, rather than
just taking the addition of assegment ASes as the hash value,
hopefully sligthly more collision resistant.
(bgp_attr_munge_as4_attrs) Collide the NEW_ attributes
together with the OLD 2-byte forms, code Juergen
had in bgp_attr_parse but re-organised a bit.
(bgp_attr_parse) Bunch of code from Juergen moves
to previous function.
(bgp_packet_attribute) Compact significantly by
just /always/ using extended-length attr header.
Fix bug Juergen noted, by using aspath_put's
(new) returned size value for the attr header rather
than the (guesstimate) of aspath_size() - the two could
differ when aspath_put had to split large segments, unlikely
this bug was ever hit in the 'wild'.
(bgp_dump_routes_attr) Always use extended-len and
use aspath_put return for header length. Output 4b ASN
for AS_PATH and AGGREGATOR.
* bgp_ecommunity.c: (ecommunity_{hash_make,cmp}) fix
hash callback declarations to match prototypes.
(ecommunity_gettoken) Updated for ECOMMUNITY_ENCODE_AS4,
complete rewrite of Juergen's changes (no asdot support)
* bgp_open.c: (bgp_capability_as4) New, does what it says
on the tin.
(peek_for_as4_capability) Rewritten to use streams and
bgp_capability_as4.
* bgp_packet.c: (bgp_open_send) minor edit
checked (in the abstract at least) with Juergen.
Changes are to be more accepting, e.g, allow AS_TRANS on
a 2-byte session.
* (general) Update all commands to use CMD_AS_RANGE.
* bgp_vty.c: (bgp_clear) Fix return vals to use CMD_..
Remove stuff replicated by VTY_GET_LONG
(bgp_clear_vty) Return bgp_clear directly to vty.
* tests/aspath_test.c: Exercise 32bit parsing. Test reconcile
function.
* tests/ecommunity_test.c: New, test AS4 ecommunity changes,
positive test only at this time, error cases not tested yet.
2007-07-25 Juergen Kammer <j.kammer@eurodata.de>
* (general) AS4 support.
* bgpd.h: as_t changes to 4-bytes.
* bgp_aspath.h: Add BGP_AS4_MAX and BGP_AS_TRANS defines.
* bgp_aspath.c: AS_VALUE_SIZE becomes 4-byte, AS16_VALUE_SIZE
added for 2-byte.
Add AS16 versions of length calc macros.
(aspath_count_numas) New, count number of ASes.
(aspath_has_as4) New, return 1 if there are any as4's in a
path.
(assegments_parse) Interpret assegment as 4 or 2 byte,
according to how the caller instructs us, with a new
argument.
(aspath_parse) Add use32bit argument to pass to
assegments_parse. Adjust all its callers to pass 1, unless
otherwise noted.
(assegment_data_put) Adjust to be able to write 2 or 4 byte
AS, according to new use32bit argument.
(aspath_put) Adjust to write 2 or 4.
(aspath_gettoken) Use a long for passed in asno.
* bgp_attr.c: (attr_str) Add BGP_ATTR_AS4_PATH and
BGP_ATTR_AS4_AGGREGATOR.
(bgp_attr_aspath) Call aspath_parse with right 2/4 arg, as
determined by received-capability flag.
(bgp_attr_aspath_check) New, code previously in attr_aspath
but moved to new func so it can be run after NEW_AS_PATH
reconciliation.
(bgp_attr_as4_path) New, handle NEW_AS_PATH.
(bgp_attr_aggregator) Adjust to cope with 2/4 byte ASes.
(bgp_attr_as4_aggregator) New, read NEW_AGGREGATOR.
(bgp_attr_parse) Add handoffs to previous parsers for the two
new AS4 NEW_ attributes.
Various checks added for NEW/OLD reconciliation.
(bgp_packet_attribute) Support 2/4 for AS_PATH and
AGGREGATOR, detect when NEW_ attrs need to be sent.
* bgp_debug.{c,h}: Add 'debug bgp as4'.
* bgp_dump.c: MRTv2 support, unconditionally enabled, which
supports AS4. Based on patches from Erik (RIPE?).
* bgp_ecommunity.c: (ecommunity_ecom2str) ECOMMUNITY_ENCODE_AS4
support.
* bgp_open.c: (peek_for_as4_capability) New, peek for AS4
capability prior to full capability parsing, so we know which
ASN to use for struct peer lookup.
(bgp_open_capability) Always send AS4 capability.
* bgp_packet.c: (bgp_open_send) AS4 handling for AS field
(bgp_open_receive) Peek for AS4 capability first, and figure
out which AS to believe.
* bgp_vty.c: (bgp_show_peer) Print AS4 cap
* tests/aspath_test.c: Support asn32 changes, call aspath_parse
with 16 bit.
* vtysh/extract.pl: AS4 compatibility for router bgp ASNUMBER
* vtysh/extract.pl.in: AS4 compatibility for router bgp ASNUMBER
* vtysh/vtysh.c: AS4 compatibility for router bgp ASNUMBER
2007-10-15 00:32:21 +02:00
|
|
|
|
|
|
|
|
|
/* Common to BGP_ATTR_AGGREGATOR, regardless of ASN size */
|
2002-12-13 21:15:29 +01:00
|
|
|
|
stream_putc (s, BGP_ATTR_FLAG_OPTIONAL|BGP_ATTR_FLAG_TRANS);
|
|
|
|
|
stream_putc (s, BGP_ATTR_AGGREGATOR);
|
[bgpd] Merge AS4 support
2007-10-14 Paul Jakma <paul.jakma@sun.com>
* NEWS: Note that MRT dumps are now version 2
* (general) Merge in Juergen Kammer's AS4 patch.
2007-09-27 Paul Jakma <paul.jakma@sun.com>
* bgp_aspath.c: (assegment_normalise) remove duplicates from
from sets.
(aspath_reconcile_as4) disregard a broken part of the RFC around
error handling in path reconciliation.
* aspath_test.c: Test dupe-weeding from sets.
Test that reconciliation merges AS_PATH and AS4_PATH where
former is shorter than latter.
2007-09-26 Paul Jakma <paul.jakma@sun.com>
* aspath_test.c: Test AS4_PATH reconcilation where length
of AS_PATH and AS4_PATH is same.
2007-09-25 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (peek_for_as4_capability) Fix to work.
* bgp_packet.c: (bgp_open_receive) Fix sanity check of as4.
* tests/bgp_capability_test.c: (general) Extend tests to validate
peek_for_as4_capability.
Add test of full OPEN Option block, with multiple capabilities,
both as a series of Option, and a single option.
Add some crap to beginning of stream, to prevent code depending
on getp == 0.
2007-09-18 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (bgp_capability_as4) debug printf inline with others.
(peek_for_as4_capability) There's no need to signal failure, as
failure is better dealt with through full capability parser -
just return the AS4, simpler.
* bgp_packet.c: (bgp_open_receive) Update to match
peek_for_as4_capability change.
Allow use of BGP_AS_TRANS by 2b speakers.
Use NOTIFY_OPEN_ERR rather than CEASE for OPEN parsing errors.
(bgp_capability_msg_parse) missing argument to debug print
(bgp_capability_receive) missing return values.
* tests/bgp_capability_test.c: (parse_test) update for changes to
peek_for_as4_capability
2007-07-25 Paul Jakma <paul.jakma@sun.com>
* Remove 2-byte size macros, just make existing macros take
argument to indicate which size to use.
Adjust all users - typically they want '1'.
* bgp_aspath.c: (aspath_has_as4) New, return 1 if there are any
as4's in a path.
(aspath_put) Return the number of bytes actually written, to
fix the bug Juergen noted: Splitting of segments will change
the number of bytes written from that already written to the
AS_PATH header.
(aspath_snmp_pathseg) Pass 2-byte flag to aspath_put. SNMP
is still defined as 2b.
(aspath_aggregate) fix latent bug.
(aspath_reconcile_as4) AS_PATH+NEW_AS_PATH reconciliation
function.
(aspath_key_make) Hash the AS_PATH string, rather than
just taking the addition of assegment ASes as the hash value,
hopefully sligthly more collision resistant.
(bgp_attr_munge_as4_attrs) Collide the NEW_ attributes
together with the OLD 2-byte forms, code Juergen
had in bgp_attr_parse but re-organised a bit.
(bgp_attr_parse) Bunch of code from Juergen moves
to previous function.
(bgp_packet_attribute) Compact significantly by
just /always/ using extended-length attr header.
Fix bug Juergen noted, by using aspath_put's
(new) returned size value for the attr header rather
than the (guesstimate) of aspath_size() - the two could
differ when aspath_put had to split large segments, unlikely
this bug was ever hit in the 'wild'.
(bgp_dump_routes_attr) Always use extended-len and
use aspath_put return for header length. Output 4b ASN
for AS_PATH and AGGREGATOR.
* bgp_ecommunity.c: (ecommunity_{hash_make,cmp}) fix
hash callback declarations to match prototypes.
(ecommunity_gettoken) Updated for ECOMMUNITY_ENCODE_AS4,
complete rewrite of Juergen's changes (no asdot support)
* bgp_open.c: (bgp_capability_as4) New, does what it says
on the tin.
(peek_for_as4_capability) Rewritten to use streams and
bgp_capability_as4.
* bgp_packet.c: (bgp_open_send) minor edit
checked (in the abstract at least) with Juergen.
Changes are to be more accepting, e.g, allow AS_TRANS on
a 2-byte session.
* (general) Update all commands to use CMD_AS_RANGE.
* bgp_vty.c: (bgp_clear) Fix return vals to use CMD_..
Remove stuff replicated by VTY_GET_LONG
(bgp_clear_vty) Return bgp_clear directly to vty.
* tests/aspath_test.c: Exercise 32bit parsing. Test reconcile
function.
* tests/ecommunity_test.c: New, test AS4 ecommunity changes,
positive test only at this time, error cases not tested yet.
2007-07-25 Juergen Kammer <j.kammer@eurodata.de>
* (general) AS4 support.
* bgpd.h: as_t changes to 4-bytes.
* bgp_aspath.h: Add BGP_AS4_MAX and BGP_AS_TRANS defines.
* bgp_aspath.c: AS_VALUE_SIZE becomes 4-byte, AS16_VALUE_SIZE
added for 2-byte.
Add AS16 versions of length calc macros.
(aspath_count_numas) New, count number of ASes.
(aspath_has_as4) New, return 1 if there are any as4's in a
path.
(assegments_parse) Interpret assegment as 4 or 2 byte,
according to how the caller instructs us, with a new
argument.
(aspath_parse) Add use32bit argument to pass to
assegments_parse. Adjust all its callers to pass 1, unless
otherwise noted.
(assegment_data_put) Adjust to be able to write 2 or 4 byte
AS, according to new use32bit argument.
(aspath_put) Adjust to write 2 or 4.
(aspath_gettoken) Use a long for passed in asno.
* bgp_attr.c: (attr_str) Add BGP_ATTR_AS4_PATH and
BGP_ATTR_AS4_AGGREGATOR.
(bgp_attr_aspath) Call aspath_parse with right 2/4 arg, as
determined by received-capability flag.
(bgp_attr_aspath_check) New, code previously in attr_aspath
but moved to new func so it can be run after NEW_AS_PATH
reconciliation.
(bgp_attr_as4_path) New, handle NEW_AS_PATH.
(bgp_attr_aggregator) Adjust to cope with 2/4 byte ASes.
(bgp_attr_as4_aggregator) New, read NEW_AGGREGATOR.
(bgp_attr_parse) Add handoffs to previous parsers for the two
new AS4 NEW_ attributes.
Various checks added for NEW/OLD reconciliation.
(bgp_packet_attribute) Support 2/4 for AS_PATH and
AGGREGATOR, detect when NEW_ attrs need to be sent.
* bgp_debug.{c,h}: Add 'debug bgp as4'.
* bgp_dump.c: MRTv2 support, unconditionally enabled, which
supports AS4. Based on patches from Erik (RIPE?).
* bgp_ecommunity.c: (ecommunity_ecom2str) ECOMMUNITY_ENCODE_AS4
support.
* bgp_open.c: (peek_for_as4_capability) New, peek for AS4
capability prior to full capability parsing, so we know which
ASN to use for struct peer lookup.
(bgp_open_capability) Always send AS4 capability.
* bgp_packet.c: (bgp_open_send) AS4 handling for AS field
(bgp_open_receive) Peek for AS4 capability first, and figure
out which AS to believe.
* bgp_vty.c: (bgp_show_peer) Print AS4 cap
* tests/aspath_test.c: Support asn32 changes, call aspath_parse
with 16 bit.
* vtysh/extract.pl: AS4 compatibility for router bgp ASNUMBER
* vtysh/extract.pl.in: AS4 compatibility for router bgp ASNUMBER
* vtysh/vtysh.c: AS4 compatibility for router bgp ASNUMBER
2007-10-15 00:32:21 +02:00
|
|
|
|
|
|
|
|
|
if (use32bit)
|
|
|
|
|
{
|
|
|
|
|
/* AS4 capable peer */
|
|
|
|
|
stream_putc (s, 8);
|
|
|
|
|
stream_putl (s, attr->extra->aggregator_as);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
/* 2-byte AS peer */
|
|
|
|
|
stream_putc (s, 6);
|
|
|
|
|
|
|
|
|
|
/* Is ASN representable in 2-bytes? Or must AS_TRANS be used? */
|
|
|
|
|
if ( attr->extra->aggregator_as > 65535 )
|
|
|
|
|
{
|
|
|
|
|
stream_putw (s, BGP_AS_TRANS);
|
|
|
|
|
|
|
|
|
|
/* we have to send AS4_AGGREGATOR, too.
|
|
|
|
|
* we'll do that later in order to send attributes in ascending
|
|
|
|
|
* order.
|
|
|
|
|
*/
|
|
|
|
|
send_as4_aggregator = 1;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
stream_putw (s, (u_int16_t) attr->extra->aggregator_as);
|
|
|
|
|
}
|
2007-05-04 22:15:47 +02:00
|
|
|
|
stream_put_ipv4 (s, attr->extra->aggregator_addr.s_addr);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Community attribute. */
|
|
|
|
|
if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SEND_COMMUNITY)
|
|
|
|
|
&& (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_COMMUNITIES)))
|
|
|
|
|
{
|
|
|
|
|
if (attr->community->size * 4 > 255)
|
|
|
|
|
{
|
|
|
|
|
stream_putc (s, BGP_ATTR_FLAG_OPTIONAL|BGP_ATTR_FLAG_TRANS|BGP_ATTR_FLAG_EXTLEN);
|
|
|
|
|
stream_putc (s, BGP_ATTR_COMMUNITIES);
|
|
|
|
|
stream_putw (s, attr->community->size * 4);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
stream_putc (s, BGP_ATTR_FLAG_OPTIONAL|BGP_ATTR_FLAG_TRANS);
|
|
|
|
|
stream_putc (s, BGP_ATTR_COMMUNITIES);
|
|
|
|
|
stream_putc (s, attr->community->size * 4);
|
|
|
|
|
}
|
|
|
|
|
stream_put (s, attr->community->val, attr->community->size * 4);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Route Reflector. */
|
|
|
|
|
if (peer_sort (peer) == BGP_PEER_IBGP
|
|
|
|
|
&& from
|
|
|
|
|
&& peer_sort (from) == BGP_PEER_IBGP)
|
|
|
|
|
{
|
|
|
|
|
/* Originator ID. */
|
|
|
|
|
stream_putc (s, BGP_ATTR_FLAG_OPTIONAL);
|
|
|
|
|
stream_putc (s, BGP_ATTR_ORIGINATOR_ID);
|
|
|
|
|
stream_putc (s, 4);
|
|
|
|
|
|
|
|
|
|
if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
|
2007-05-04 22:15:47 +02:00
|
|
|
|
stream_put_in_addr (s, &attr->extra->originator_id);
|
2006-05-13 01:25:37 +02:00
|
|
|
|
else
|
|
|
|
|
stream_put_in_addr (s, &from->remote_id);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
|
|
/* Cluster list. */
|
|
|
|
|
stream_putc (s, BGP_ATTR_FLAG_OPTIONAL);
|
|
|
|
|
stream_putc (s, BGP_ATTR_CLUSTER_LIST);
|
|
|
|
|
|
2007-08-30 15:36:17 +02:00
|
|
|
|
if (attr->extra && attr->extra->cluster)
|
2002-12-13 21:15:29 +01:00
|
|
|
|
{
|
2007-05-04 22:15:47 +02:00
|
|
|
|
stream_putc (s, attr->extra->cluster->length + 4);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
/* If this peer configuration's parent BGP has cluster_id. */
|
|
|
|
|
if (bgp->config & BGP_CONFIG_CLUSTER_ID)
|
|
|
|
|
stream_put_in_addr (s, &bgp->cluster_id);
|
|
|
|
|
else
|
|
|
|
|
stream_put_in_addr (s, &bgp->router_id);
|
2007-05-04 22:15:47 +02:00
|
|
|
|
stream_put (s, attr->extra->cluster->list,
|
|
|
|
|
attr->extra->cluster->length);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
stream_putc (s, 4);
|
|
|
|
|
/* If this peer configuration's parent BGP has cluster_id. */
|
|
|
|
|
if (bgp->config & BGP_CONFIG_CLUSTER_ID)
|
|
|
|
|
stream_put_in_addr (s, &bgp->cluster_id);
|
|
|
|
|
else
|
|
|
|
|
stream_put_in_addr (s, &bgp->router_id);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_IPV6
|
|
|
|
|
/* If p is IPv6 address put it into attribute. */
|
|
|
|
|
if (p->family == AF_INET6)
|
|
|
|
|
{
|
|
|
|
|
unsigned long sizep;
|
2007-05-04 22:15:47 +02:00
|
|
|
|
struct attr_extra *attre = attr->extra;
|
|
|
|
|
|
|
|
|
|
assert (attr->extra);
|
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
|
stream_putc (s, BGP_ATTR_FLAG_OPTIONAL);
|
|
|
|
|
stream_putc (s, BGP_ATTR_MP_REACH_NLRI);
|
2005-02-09 16:51:56 +01:00
|
|
|
|
sizep = stream_get_endp (s);
|
2007-05-04 22:15:47 +02:00
|
|
|
|
stream_putc (s, 0); /* Marker: Attribute length. */
|
2002-12-13 21:15:29 +01:00
|
|
|
|
stream_putw (s, AFI_IP6); /* AFI */
|
|
|
|
|
stream_putc (s, safi); /* SAFI */
|
|
|
|
|
|
2007-05-04 22:15:47 +02:00
|
|
|
|
stream_putc (s, attre->mp_nexthop_len);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
2007-05-04 22:15:47 +02:00
|
|
|
|
if (attre->mp_nexthop_len == 16)
|
|
|
|
|
stream_put (s, &attre->mp_nexthop_global, 16);
|
|
|
|
|
else if (attre->mp_nexthop_len == 32)
|
2002-12-13 21:15:29 +01:00
|
|
|
|
{
|
2007-05-04 22:15:47 +02:00
|
|
|
|
stream_put (s, &attre->mp_nexthop_global, 16);
|
|
|
|
|
stream_put (s, &attre->mp_nexthop_local, 16);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* SNPA */
|
|
|
|
|
stream_putc (s, 0);
|
|
|
|
|
|
|
|
|
|
/* Prefix write. */
|
|
|
|
|
stream_put_prefix (s, p);
|
|
|
|
|
|
|
|
|
|
/* Set MP attribute length. */
|
2005-02-09 16:51:56 +01:00
|
|
|
|
stream_putc_at (s, sizep, (stream_get_endp (s) - sizep) - 1);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
}
|
|
|
|
|
#endif /* HAVE_IPV6 */
|
|
|
|
|
|
|
|
|
|
if (p->family == AF_INET && safi == SAFI_MULTICAST)
|
|
|
|
|
{
|
|
|
|
|
unsigned long sizep;
|
|
|
|
|
|
|
|
|
|
stream_putc (s, BGP_ATTR_FLAG_OPTIONAL);
|
|
|
|
|
stream_putc (s, BGP_ATTR_MP_REACH_NLRI);
|
2005-02-09 16:51:56 +01:00
|
|
|
|
sizep = stream_get_endp (s);
|
2007-05-04 22:15:47 +02:00
|
|
|
|
stream_putc (s, 0); /* Marker: Attribute Length. */
|
2002-12-13 21:15:29 +01:00
|
|
|
|
stream_putw (s, AFI_IP); /* AFI */
|
|
|
|
|
stream_putc (s, SAFI_MULTICAST); /* SAFI */
|
|
|
|
|
|
|
|
|
|
stream_putc (s, 4);
|
|
|
|
|
stream_put_ipv4 (s, attr->nexthop.s_addr);
|
|
|
|
|
|
|
|
|
|
/* SNPA */
|
|
|
|
|
stream_putc (s, 0);
|
|
|
|
|
|
|
|
|
|
/* Prefix write. */
|
|
|
|
|
stream_put_prefix (s, p);
|
|
|
|
|
|
|
|
|
|
/* Set MP attribute length. */
|
2005-02-09 16:51:56 +01:00
|
|
|
|
stream_putc_at (s, sizep, (stream_get_endp (s) - sizep) - 1);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (p->family == AF_INET && safi == SAFI_MPLS_VPN)
|
|
|
|
|
{
|
|
|
|
|
unsigned long sizep;
|
|
|
|
|
|
|
|
|
|
stream_putc (s, BGP_ATTR_FLAG_OPTIONAL);
|
|
|
|
|
stream_putc (s, BGP_ATTR_MP_REACH_NLRI);
|
2005-02-09 16:51:56 +01:00
|
|
|
|
sizep = stream_get_endp (s);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
stream_putc (s, 0); /* Length of this attribute. */
|
|
|
|
|
stream_putw (s, AFI_IP); /* AFI */
|
|
|
|
|
stream_putc (s, BGP_SAFI_VPNV4); /* SAFI */
|
|
|
|
|
|
|
|
|
|
stream_putc (s, 12);
|
|
|
|
|
stream_putl (s, 0);
|
|
|
|
|
stream_putl (s, 0);
|
2007-05-04 22:15:47 +02:00
|
|
|
|
stream_put (s, &attr->extra->mp_nexthop_global_in, 4);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
|
|
/* SNPA */
|
|
|
|
|
stream_putc (s, 0);
|
|
|
|
|
|
|
|
|
|
/* Tag, RD, Prefix write. */
|
|
|
|
|
stream_putc (s, p->prefixlen + 88);
|
|
|
|
|
stream_put (s, tag, 3);
|
|
|
|
|
stream_put (s, prd->val, 8);
|
|
|
|
|
stream_put (s, &p->u.prefix, PSIZE (p->prefixlen));
|
|
|
|
|
|
|
|
|
|
/* Set MP attribute length. */
|
2005-02-09 16:51:56 +01:00
|
|
|
|
stream_putc_at (s, sizep, (stream_get_endp (s) - sizep) - 1);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Extended Communities attribute. */
|
|
|
|
|
if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SEND_EXT_COMMUNITY)
|
|
|
|
|
&& (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_EXT_COMMUNITIES)))
|
|
|
|
|
{
|
2007-05-04 22:15:47 +02:00
|
|
|
|
struct attr_extra *attre = attr->extra;
|
|
|
|
|
|
|
|
|
|
assert (attre);
|
|
|
|
|
|
|
|
|
|
if (peer_sort (peer) == BGP_PEER_IBGP
|
|
|
|
|
|| peer_sort (peer) == BGP_PEER_CONFED)
|
2002-12-13 21:15:29 +01:00
|
|
|
|
{
|
2007-05-04 22:15:47 +02:00
|
|
|
|
if (attre->ecommunity->size * 8 > 255)
|
2004-05-20 12:20:02 +02:00
|
|
|
|
{
|
|
|
|
|
stream_putc (s, BGP_ATTR_FLAG_OPTIONAL|BGP_ATTR_FLAG_TRANS|BGP_ATTR_FLAG_EXTLEN);
|
|
|
|
|
stream_putc (s, BGP_ATTR_EXT_COMMUNITIES);
|
2007-05-04 22:15:47 +02:00
|
|
|
|
stream_putw (s, attre->ecommunity->size * 8);
|
2004-05-20 12:20:02 +02:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
stream_putc (s, BGP_ATTR_FLAG_OPTIONAL|BGP_ATTR_FLAG_TRANS);
|
|
|
|
|
stream_putc (s, BGP_ATTR_EXT_COMMUNITIES);
|
2007-05-04 22:15:47 +02:00
|
|
|
|
stream_putc (s, attre->ecommunity->size * 8);
|
2004-05-20 12:20:02 +02:00
|
|
|
|
}
|
2007-05-04 22:15:47 +02:00
|
|
|
|
stream_put (s, attre->ecommunity->val, attre->ecommunity->size * 8);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2004-06-04 19:58:18 +02:00
|
|
|
|
u_int8_t *pnt;
|
2004-05-20 12:20:02 +02:00
|
|
|
|
int tbit;
|
|
|
|
|
int ecom_tr_size = 0;
|
|
|
|
|
int i;
|
|
|
|
|
|
2007-05-04 22:15:47 +02:00
|
|
|
|
for (i = 0; i < attre->ecommunity->size; i++)
|
2004-05-20 12:20:02 +02:00
|
|
|
|
{
|
2007-05-04 22:15:47 +02:00
|
|
|
|
pnt = attre->ecommunity->val + (i * 8);
|
2004-05-20 12:20:02 +02:00
|
|
|
|
tbit = *pnt;
|
|
|
|
|
|
|
|
|
|
if (CHECK_FLAG (tbit, ECOMMUNITY_FLAG_NON_TRANSITIVE))
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
ecom_tr_size++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (ecom_tr_size)
|
|
|
|
|
{
|
|
|
|
|
if (ecom_tr_size * 8 > 255)
|
|
|
|
|
{
|
|
|
|
|
stream_putc (s, BGP_ATTR_FLAG_OPTIONAL|BGP_ATTR_FLAG_TRANS|BGP_ATTR_FLAG_EXTLEN);
|
|
|
|
|
stream_putc (s, BGP_ATTR_EXT_COMMUNITIES);
|
|
|
|
|
stream_putw (s, ecom_tr_size * 8);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
stream_putc (s, BGP_ATTR_FLAG_OPTIONAL|BGP_ATTR_FLAG_TRANS);
|
|
|
|
|
stream_putc (s, BGP_ATTR_EXT_COMMUNITIES);
|
|
|
|
|
stream_putc (s, ecom_tr_size * 8);
|
|
|
|
|
}
|
|
|
|
|
|
2007-05-04 22:15:47 +02:00
|
|
|
|
for (i = 0; i < attre->ecommunity->size; i++)
|
2004-05-20 12:20:02 +02:00
|
|
|
|
{
|
2007-05-04 22:15:47 +02:00
|
|
|
|
pnt = attre->ecommunity->val + (i * 8);
|
2004-05-20 12:20:02 +02:00
|
|
|
|
tbit = *pnt;
|
|
|
|
|
|
|
|
|
|
if (CHECK_FLAG (tbit, ECOMMUNITY_FLAG_NON_TRANSITIVE))
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
stream_put (s, pnt, 8);
|
|
|
|
|
}
|
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
}
|
|
|
|
|
}
|
[bgpd] Merge AS4 support
2007-10-14 Paul Jakma <paul.jakma@sun.com>
* NEWS: Note that MRT dumps are now version 2
* (general) Merge in Juergen Kammer's AS4 patch.
2007-09-27 Paul Jakma <paul.jakma@sun.com>
* bgp_aspath.c: (assegment_normalise) remove duplicates from
from sets.
(aspath_reconcile_as4) disregard a broken part of the RFC around
error handling in path reconciliation.
* aspath_test.c: Test dupe-weeding from sets.
Test that reconciliation merges AS_PATH and AS4_PATH where
former is shorter than latter.
2007-09-26 Paul Jakma <paul.jakma@sun.com>
* aspath_test.c: Test AS4_PATH reconcilation where length
of AS_PATH and AS4_PATH is same.
2007-09-25 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (peek_for_as4_capability) Fix to work.
* bgp_packet.c: (bgp_open_receive) Fix sanity check of as4.
* tests/bgp_capability_test.c: (general) Extend tests to validate
peek_for_as4_capability.
Add test of full OPEN Option block, with multiple capabilities,
both as a series of Option, and a single option.
Add some crap to beginning of stream, to prevent code depending
on getp == 0.
2007-09-18 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (bgp_capability_as4) debug printf inline with others.
(peek_for_as4_capability) There's no need to signal failure, as
failure is better dealt with through full capability parser -
just return the AS4, simpler.
* bgp_packet.c: (bgp_open_receive) Update to match
peek_for_as4_capability change.
Allow use of BGP_AS_TRANS by 2b speakers.
Use NOTIFY_OPEN_ERR rather than CEASE for OPEN parsing errors.
(bgp_capability_msg_parse) missing argument to debug print
(bgp_capability_receive) missing return values.
* tests/bgp_capability_test.c: (parse_test) update for changes to
peek_for_as4_capability
2007-07-25 Paul Jakma <paul.jakma@sun.com>
* Remove 2-byte size macros, just make existing macros take
argument to indicate which size to use.
Adjust all users - typically they want '1'.
* bgp_aspath.c: (aspath_has_as4) New, return 1 if there are any
as4's in a path.
(aspath_put) Return the number of bytes actually written, to
fix the bug Juergen noted: Splitting of segments will change
the number of bytes written from that already written to the
AS_PATH header.
(aspath_snmp_pathseg) Pass 2-byte flag to aspath_put. SNMP
is still defined as 2b.
(aspath_aggregate) fix latent bug.
(aspath_reconcile_as4) AS_PATH+NEW_AS_PATH reconciliation
function.
(aspath_key_make) Hash the AS_PATH string, rather than
just taking the addition of assegment ASes as the hash value,
hopefully sligthly more collision resistant.
(bgp_attr_munge_as4_attrs) Collide the NEW_ attributes
together with the OLD 2-byte forms, code Juergen
had in bgp_attr_parse but re-organised a bit.
(bgp_attr_parse) Bunch of code from Juergen moves
to previous function.
(bgp_packet_attribute) Compact significantly by
just /always/ using extended-length attr header.
Fix bug Juergen noted, by using aspath_put's
(new) returned size value for the attr header rather
than the (guesstimate) of aspath_size() - the two could
differ when aspath_put had to split large segments, unlikely
this bug was ever hit in the 'wild'.
(bgp_dump_routes_attr) Always use extended-len and
use aspath_put return for header length. Output 4b ASN
for AS_PATH and AGGREGATOR.
* bgp_ecommunity.c: (ecommunity_{hash_make,cmp}) fix
hash callback declarations to match prototypes.
(ecommunity_gettoken) Updated for ECOMMUNITY_ENCODE_AS4,
complete rewrite of Juergen's changes (no asdot support)
* bgp_open.c: (bgp_capability_as4) New, does what it says
on the tin.
(peek_for_as4_capability) Rewritten to use streams and
bgp_capability_as4.
* bgp_packet.c: (bgp_open_send) minor edit
checked (in the abstract at least) with Juergen.
Changes are to be more accepting, e.g, allow AS_TRANS on
a 2-byte session.
* (general) Update all commands to use CMD_AS_RANGE.
* bgp_vty.c: (bgp_clear) Fix return vals to use CMD_..
Remove stuff replicated by VTY_GET_LONG
(bgp_clear_vty) Return bgp_clear directly to vty.
* tests/aspath_test.c: Exercise 32bit parsing. Test reconcile
function.
* tests/ecommunity_test.c: New, test AS4 ecommunity changes,
positive test only at this time, error cases not tested yet.
2007-07-25 Juergen Kammer <j.kammer@eurodata.de>
* (general) AS4 support.
* bgpd.h: as_t changes to 4-bytes.
* bgp_aspath.h: Add BGP_AS4_MAX and BGP_AS_TRANS defines.
* bgp_aspath.c: AS_VALUE_SIZE becomes 4-byte, AS16_VALUE_SIZE
added for 2-byte.
Add AS16 versions of length calc macros.
(aspath_count_numas) New, count number of ASes.
(aspath_has_as4) New, return 1 if there are any as4's in a
path.
(assegments_parse) Interpret assegment as 4 or 2 byte,
according to how the caller instructs us, with a new
argument.
(aspath_parse) Add use32bit argument to pass to
assegments_parse. Adjust all its callers to pass 1, unless
otherwise noted.
(assegment_data_put) Adjust to be able to write 2 or 4 byte
AS, according to new use32bit argument.
(aspath_put) Adjust to write 2 or 4.
(aspath_gettoken) Use a long for passed in asno.
* bgp_attr.c: (attr_str) Add BGP_ATTR_AS4_PATH and
BGP_ATTR_AS4_AGGREGATOR.
(bgp_attr_aspath) Call aspath_parse with right 2/4 arg, as
determined by received-capability flag.
(bgp_attr_aspath_check) New, code previously in attr_aspath
but moved to new func so it can be run after NEW_AS_PATH
reconciliation.
(bgp_attr_as4_path) New, handle NEW_AS_PATH.
(bgp_attr_aggregator) Adjust to cope with 2/4 byte ASes.
(bgp_attr_as4_aggregator) New, read NEW_AGGREGATOR.
(bgp_attr_parse) Add handoffs to previous parsers for the two
new AS4 NEW_ attributes.
Various checks added for NEW/OLD reconciliation.
(bgp_packet_attribute) Support 2/4 for AS_PATH and
AGGREGATOR, detect when NEW_ attrs need to be sent.
* bgp_debug.{c,h}: Add 'debug bgp as4'.
* bgp_dump.c: MRTv2 support, unconditionally enabled, which
supports AS4. Based on patches from Erik (RIPE?).
* bgp_ecommunity.c: (ecommunity_ecom2str) ECOMMUNITY_ENCODE_AS4
support.
* bgp_open.c: (peek_for_as4_capability) New, peek for AS4
capability prior to full capability parsing, so we know which
ASN to use for struct peer lookup.
(bgp_open_capability) Always send AS4 capability.
* bgp_packet.c: (bgp_open_send) AS4 handling for AS field
(bgp_open_receive) Peek for AS4 capability first, and figure
out which AS to believe.
* bgp_vty.c: (bgp_show_peer) Print AS4 cap
* tests/aspath_test.c: Support asn32 changes, call aspath_parse
with 16 bit.
* vtysh/extract.pl: AS4 compatibility for router bgp ASNUMBER
* vtysh/extract.pl.in: AS4 compatibility for router bgp ASNUMBER
* vtysh/vtysh.c: AS4 compatibility for router bgp ASNUMBER
2007-10-15 00:32:21 +02:00
|
|
|
|
|
|
|
|
|
if ( send_as4_path )
|
|
|
|
|
{
|
|
|
|
|
/* If the peer is NOT As4 capable, AND */
|
|
|
|
|
/* there are ASnums > 65535 in path THEN
|
|
|
|
|
* give out AS4_PATH */
|
|
|
|
|
|
|
|
|
|
/* Get rid of all AS_CONFED_SEQUENCE and AS_CONFED_SET
|
|
|
|
|
* path segments!
|
|
|
|
|
* Hm, I wonder... confederation things *should* only be at
|
|
|
|
|
* the beginning of an aspath, right? Then we should use
|
|
|
|
|
* aspath_delete_confed_seq for this, because it is already
|
|
|
|
|
* there! (JK)
|
|
|
|
|
* Folks, talk to me: what is reasonable here!?
|
|
|
|
|
*/
|
|
|
|
|
aspath = aspath_delete_confed_seq (aspath);
|
|
|
|
|
|
|
|
|
|
stream_putc (s, BGP_ATTR_FLAG_TRANS|BGP_ATTR_FLAG_OPTIONAL|BGP_ATTR_FLAG_EXTLEN);
|
|
|
|
|
stream_putc (s, BGP_ATTR_AS4_PATH);
|
|
|
|
|
aspath_sizep = stream_get_endp (s);
|
|
|
|
|
stream_putw (s, 0);
|
|
|
|
|
stream_putw_at (s, aspath_sizep, aspath_put (s, aspath, 1));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (aspath != attr->aspath)
|
|
|
|
|
aspath_free (aspath);
|
|
|
|
|
|
|
|
|
|
if ( send_as4_aggregator )
|
|
|
|
|
{
|
|
|
|
|
assert (attr->extra);
|
|
|
|
|
|
|
|
|
|
/* send AS4_AGGREGATOR, at this place */
|
|
|
|
|
/* this section of code moved here in order to ensure the correct
|
|
|
|
|
* *ascending* order of attributes
|
|
|
|
|
*/
|
|
|
|
|
stream_putc (s, BGP_ATTR_FLAG_OPTIONAL|BGP_ATTR_FLAG_TRANS);
|
|
|
|
|
stream_putc (s, BGP_ATTR_AS4_AGGREGATOR);
|
|
|
|
|
stream_putc (s, 8);
|
|
|
|
|
stream_putl (s, attr->extra->aggregator_as);
|
|
|
|
|
stream_put_ipv4 (s, attr->extra->aggregator_addr.s_addr);
|
|
|
|
|
}
|
2007-08-06 17:24:51 +02:00
|
|
|
|
|
|
|
|
|
/* AS-Pathlimit */
|
|
|
|
|
if (attr->pathlimit.ttl)
|
|
|
|
|
{
|
|
|
|
|
u_int32_t as = attr->pathlimit.as;
|
|
|
|
|
|
|
|
|
|
/* should already have been done in announce_check(),
|
|
|
|
|
* but just in case..
|
|
|
|
|
*/
|
|
|
|
|
if (!as)
|
|
|
|
|
as = peer->local_as;
|
|
|
|
|
|
|
|
|
|
stream_putc (s, BGP_ATTR_FLAG_OPTIONAL|BGP_ATTR_FLAG_TRANS);
|
|
|
|
|
stream_putc (s, BGP_ATTR_AS_PATHLIMIT);
|
|
|
|
|
stream_putc (s, 5);
|
|
|
|
|
stream_putc (s, attr->pathlimit.ttl);
|
|
|
|
|
stream_putl (s, as);
|
|
|
|
|
}
|
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
|
/* Unknown transit attribute. */
|
2007-05-04 22:15:47 +02:00
|
|
|
|
if (attr->extra && attr->extra->transit)
|
|
|
|
|
stream_put (s, attr->extra->transit->val, attr->extra->transit->length);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
|
|
/* Return total size of attribute. */
|
2005-02-09 16:51:56 +01:00
|
|
|
|
return stream_get_endp (s) - cp;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bgp_size_t
|
|
|
|
|
bgp_packet_withdraw (struct peer *peer, struct stream *s, struct prefix *p,
|
|
|
|
|
afi_t afi, safi_t safi, struct prefix_rd *prd,
|
2006-05-04 09:52:12 +02:00
|
|
|
|
u_char *tag)
|
2002-12-13 21:15:29 +01:00
|
|
|
|
{
|
|
|
|
|
unsigned long cp;
|
|
|
|
|
unsigned long attrlen_pnt;
|
|
|
|
|
bgp_size_t size;
|
|
|
|
|
|
2005-02-09 16:51:56 +01:00
|
|
|
|
cp = stream_get_endp (s);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
|
|
stream_putc (s, BGP_ATTR_FLAG_OPTIONAL);
|
|
|
|
|
stream_putc (s, BGP_ATTR_MP_UNREACH_NLRI);
|
|
|
|
|
|
2005-02-09 16:51:56 +01:00
|
|
|
|
attrlen_pnt = stream_get_endp (s);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
stream_putc (s, 0); /* Length of this attribute. */
|
|
|
|
|
|
|
|
|
|
stream_putw (s, family2afi (p->family));
|
|
|
|
|
|
|
|
|
|
if (safi == SAFI_MPLS_VPN)
|
|
|
|
|
{
|
|
|
|
|
/* SAFI */
|
|
|
|
|
stream_putc (s, BGP_SAFI_VPNV4);
|
|
|
|
|
|
|
|
|
|
/* prefix. */
|
|
|
|
|
stream_putc (s, p->prefixlen + 88);
|
|
|
|
|
stream_put (s, tag, 3);
|
|
|
|
|
stream_put (s, prd->val, 8);
|
|
|
|
|
stream_put (s, &p->u.prefix, PSIZE (p->prefixlen));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
/* SAFI */
|
|
|
|
|
stream_putc (s, safi);
|
|
|
|
|
|
|
|
|
|
/* prefix */
|
|
|
|
|
stream_put_prefix (s, p);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Set MP attribute length. */
|
2005-02-09 16:51:56 +01:00
|
|
|
|
size = stream_get_endp (s) - attrlen_pnt - 1;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
stream_putc_at (s, attrlen_pnt, size);
|
|
|
|
|
|
2005-02-09 16:51:56 +01:00
|
|
|
|
return stream_get_endp (s) - cp;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Initialization of attribute. */
|
|
|
|
|
void
|
2005-09-10 Paul Jakma <paul.jakma@sun.com>
* Makefile.am: bgpd shouldn't list libgp's sources as its own.
Use LDADD.
* bgp_aspath.h:
(struct assegment) New struct, abstract representation of a
list of AS_PATH segments and the contained ASNs.
(struct aspath) Remove the raw-data related
fields, reference the abstract struct assegment instead.
Remove several other computed fields, it's just a
headache to maintain them and they're cheap to compute from
struct assegment.
(aspath_parse) parse a stream, not a pointer to raw data.
(aspath_count_{hops,confeds,size}) helpers to access
information formerly directly contained in struct aspath.
(aspath_snmp_pathseg) Helper for SNMP, BGP MIB wants
to be able to output hex representation of raw data.
* bgp_aspath.c: (general) partial-rewrite. Store aspath data
as an abstract singly-linked list of abstract segments,
rather than storing the raw data, and parsing it each and
every time. Remove several count/size fields which are cheap
to compute from the abstract segment structure.
(global) Include stream.h, needed for aspath_parse, and
others. Couple of helper macros added.
(struct assegment_header) Just the header, and only the
header.
(assegment_data_{new,free}) convenience functions for
AS_SEG_DATA allocation, the dynamic, per-segment array of
ASNs.
(assegment_{new,free,free_all,dup,dup_all}) convenience
functions for creating struct assegments. The _all forms will
follow the entire chain of segments from the given segment.
(assegment_prepend_asns) new function, prepend an ASN N times
to segment.
(assegment_append_asns) Append a list (array) of ASNs to
segment.
(int_cmp) convenience function for the aspath hash.
(assegment_normalise) new function. Normalise the given
segment chain to meet expectations of Quagga, and to
eliminate differing raw representations of the same paths.
Merge 'runs' of SEQUENCEs into one segment as our internal
segment is not limited by the protocol AS_PATH segment
length. Sort ASNs in SETs.
(aspath_new) Take void argument to quell warnings. Use the
assegment convenience functions.
(assegment_count_{asns,confeds,hops}) new functions to
compute at runtime values previously held in struct aspath.
(aspath_size) ditto.
(aspath_make_str_count) rewritten to stringify new
representation, and to be slightly easier to understand
hopefully.
(aspath_str_update) convenience function, update the aspath
str. Should investigate removing maintained string from
struct aspath, just run-time compute it, as per other fields.
It's just a maintenance headache, would save noticeable
amount of RAM with possibly not much extra run-time cost.
(aspath_dup) use the assegment dup functions.
(aspath_hash_alloc) Take void * argument to satisfy gcc. Use
the proper helper functions to dup data.
(assegments_parse) new function. parse raw AS_PATH data into
struct assegments. Normalise and return the head of the list.
(aspath_parse) Parse a stream, not pointer to raw data and
use assegments_parse to do it.
(assegment_data_put) Write out a single segment data in protocol
form to stream.
(assegment_header_put) ditto but for segment header.
(aspath_put) new function. As per previous but for an entire
struct aspath.
(aspath_snmp_pathseg) wrapper around aspath_put for
bgp_snmp.c. Uses a static buffer sadly.
(aspath_aggregate_as_set_add) rewritten to use assegments.
(aspath_aggregate) ditto
(aspath_{firstas,loop,private_as}_check) ditto
(aspath_{merge,prepend,add_one_as}) ditto
(aspath_cmp_left{_confed}) ditto
(aspath_delete_confed_seq) ditto, plus fixed to properly
delete all leading confed segments.
(aspath_as_add) Just use assegment_append_asns.
(aspath_segment_add) updated to use assegments.
(enum as_token) Add values for confeds
(aspath_gettoken) Add support for confeds
(aspath_str2aspath) ditto
(aspath_key_make) updated to use as_segments. Also, add
segment type into the hash value as appropriate.
(aspath_cmp) updated to use as_segments.
(aspath_print) don't segfault on NULL argument.
* bgp_attr.c: (bgp_attr_aspath) aspath_parse wants the stream
now. No need for manual forwarding of stream.
(bgp_packet_attribute) empty aspath is now denoted by NULL
segment field, length is gone.
Use aspath_size() to determine size.
(bgp_attr_init) Fix declaration, explicitely specify void
arg.
(bgp_dump_routes_attr) Use aspath_size() to determine size.
* bgp_route.c: (bgp_info_cmp) use the aspath_count_* functions.
(bgp_rib_withdraw) remove unused variable. Use
aspath_count_hops.
* bgp_snmp.c: (bgp4PathAttrTable) raw data is gone, use
aspath_snmp_pathseg to get the representation.
2005-09-10 18:55:02 +02:00
|
|
|
|
bgp_attr_init (void)
|
2002-12-13 21:15:29 +01:00
|
|
|
|
{
|
|
|
|
|
aspath_init ();
|
|
|
|
|
attrhash_init ();
|
|
|
|
|
community_init ();
|
|
|
|
|
ecommunity_init ();
|
|
|
|
|
cluster_init ();
|
|
|
|
|
transit_init ();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Make attribute packet. */
|
|
|
|
|
void
|
2003-10-18 03:30:50 +02:00
|
|
|
|
bgp_dump_routes_attr (struct stream *s, struct attr *attr,
|
|
|
|
|
struct prefix *prefix)
|
2002-12-13 21:15:29 +01:00
|
|
|
|
{
|
|
|
|
|
unsigned long cp;
|
|
|
|
|
unsigned long len;
|
[bgpd] Merge AS4 support
2007-10-14 Paul Jakma <paul.jakma@sun.com>
* NEWS: Note that MRT dumps are now version 2
* (general) Merge in Juergen Kammer's AS4 patch.
2007-09-27 Paul Jakma <paul.jakma@sun.com>
* bgp_aspath.c: (assegment_normalise) remove duplicates from
from sets.
(aspath_reconcile_as4) disregard a broken part of the RFC around
error handling in path reconciliation.
* aspath_test.c: Test dupe-weeding from sets.
Test that reconciliation merges AS_PATH and AS4_PATH where
former is shorter than latter.
2007-09-26 Paul Jakma <paul.jakma@sun.com>
* aspath_test.c: Test AS4_PATH reconcilation where length
of AS_PATH and AS4_PATH is same.
2007-09-25 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (peek_for_as4_capability) Fix to work.
* bgp_packet.c: (bgp_open_receive) Fix sanity check of as4.
* tests/bgp_capability_test.c: (general) Extend tests to validate
peek_for_as4_capability.
Add test of full OPEN Option block, with multiple capabilities,
both as a series of Option, and a single option.
Add some crap to beginning of stream, to prevent code depending
on getp == 0.
2007-09-18 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (bgp_capability_as4) debug printf inline with others.
(peek_for_as4_capability) There's no need to signal failure, as
failure is better dealt with through full capability parser -
just return the AS4, simpler.
* bgp_packet.c: (bgp_open_receive) Update to match
peek_for_as4_capability change.
Allow use of BGP_AS_TRANS by 2b speakers.
Use NOTIFY_OPEN_ERR rather than CEASE for OPEN parsing errors.
(bgp_capability_msg_parse) missing argument to debug print
(bgp_capability_receive) missing return values.
* tests/bgp_capability_test.c: (parse_test) update for changes to
peek_for_as4_capability
2007-07-25 Paul Jakma <paul.jakma@sun.com>
* Remove 2-byte size macros, just make existing macros take
argument to indicate which size to use.
Adjust all users - typically they want '1'.
* bgp_aspath.c: (aspath_has_as4) New, return 1 if there are any
as4's in a path.
(aspath_put) Return the number of bytes actually written, to
fix the bug Juergen noted: Splitting of segments will change
the number of bytes written from that already written to the
AS_PATH header.
(aspath_snmp_pathseg) Pass 2-byte flag to aspath_put. SNMP
is still defined as 2b.
(aspath_aggregate) fix latent bug.
(aspath_reconcile_as4) AS_PATH+NEW_AS_PATH reconciliation
function.
(aspath_key_make) Hash the AS_PATH string, rather than
just taking the addition of assegment ASes as the hash value,
hopefully sligthly more collision resistant.
(bgp_attr_munge_as4_attrs) Collide the NEW_ attributes
together with the OLD 2-byte forms, code Juergen
had in bgp_attr_parse but re-organised a bit.
(bgp_attr_parse) Bunch of code from Juergen moves
to previous function.
(bgp_packet_attribute) Compact significantly by
just /always/ using extended-length attr header.
Fix bug Juergen noted, by using aspath_put's
(new) returned size value for the attr header rather
than the (guesstimate) of aspath_size() - the two could
differ when aspath_put had to split large segments, unlikely
this bug was ever hit in the 'wild'.
(bgp_dump_routes_attr) Always use extended-len and
use aspath_put return for header length. Output 4b ASN
for AS_PATH and AGGREGATOR.
* bgp_ecommunity.c: (ecommunity_{hash_make,cmp}) fix
hash callback declarations to match prototypes.
(ecommunity_gettoken) Updated for ECOMMUNITY_ENCODE_AS4,
complete rewrite of Juergen's changes (no asdot support)
* bgp_open.c: (bgp_capability_as4) New, does what it says
on the tin.
(peek_for_as4_capability) Rewritten to use streams and
bgp_capability_as4.
* bgp_packet.c: (bgp_open_send) minor edit
checked (in the abstract at least) with Juergen.
Changes are to be more accepting, e.g, allow AS_TRANS on
a 2-byte session.
* (general) Update all commands to use CMD_AS_RANGE.
* bgp_vty.c: (bgp_clear) Fix return vals to use CMD_..
Remove stuff replicated by VTY_GET_LONG
(bgp_clear_vty) Return bgp_clear directly to vty.
* tests/aspath_test.c: Exercise 32bit parsing. Test reconcile
function.
* tests/ecommunity_test.c: New, test AS4 ecommunity changes,
positive test only at this time, error cases not tested yet.
2007-07-25 Juergen Kammer <j.kammer@eurodata.de>
* (general) AS4 support.
* bgpd.h: as_t changes to 4-bytes.
* bgp_aspath.h: Add BGP_AS4_MAX and BGP_AS_TRANS defines.
* bgp_aspath.c: AS_VALUE_SIZE becomes 4-byte, AS16_VALUE_SIZE
added for 2-byte.
Add AS16 versions of length calc macros.
(aspath_count_numas) New, count number of ASes.
(aspath_has_as4) New, return 1 if there are any as4's in a
path.
(assegments_parse) Interpret assegment as 4 or 2 byte,
according to how the caller instructs us, with a new
argument.
(aspath_parse) Add use32bit argument to pass to
assegments_parse. Adjust all its callers to pass 1, unless
otherwise noted.
(assegment_data_put) Adjust to be able to write 2 or 4 byte
AS, according to new use32bit argument.
(aspath_put) Adjust to write 2 or 4.
(aspath_gettoken) Use a long for passed in asno.
* bgp_attr.c: (attr_str) Add BGP_ATTR_AS4_PATH and
BGP_ATTR_AS4_AGGREGATOR.
(bgp_attr_aspath) Call aspath_parse with right 2/4 arg, as
determined by received-capability flag.
(bgp_attr_aspath_check) New, code previously in attr_aspath
but moved to new func so it can be run after NEW_AS_PATH
reconciliation.
(bgp_attr_as4_path) New, handle NEW_AS_PATH.
(bgp_attr_aggregator) Adjust to cope with 2/4 byte ASes.
(bgp_attr_as4_aggregator) New, read NEW_AGGREGATOR.
(bgp_attr_parse) Add handoffs to previous parsers for the two
new AS4 NEW_ attributes.
Various checks added for NEW/OLD reconciliation.
(bgp_packet_attribute) Support 2/4 for AS_PATH and
AGGREGATOR, detect when NEW_ attrs need to be sent.
* bgp_debug.{c,h}: Add 'debug bgp as4'.
* bgp_dump.c: MRTv2 support, unconditionally enabled, which
supports AS4. Based on patches from Erik (RIPE?).
* bgp_ecommunity.c: (ecommunity_ecom2str) ECOMMUNITY_ENCODE_AS4
support.
* bgp_open.c: (peek_for_as4_capability) New, peek for AS4
capability prior to full capability parsing, so we know which
ASN to use for struct peer lookup.
(bgp_open_capability) Always send AS4 capability.
* bgp_packet.c: (bgp_open_send) AS4 handling for AS field
(bgp_open_receive) Peek for AS4 capability first, and figure
out which AS to believe.
* bgp_vty.c: (bgp_show_peer) Print AS4 cap
* tests/aspath_test.c: Support asn32 changes, call aspath_parse
with 16 bit.
* vtysh/extract.pl: AS4 compatibility for router bgp ASNUMBER
* vtysh/extract.pl.in: AS4 compatibility for router bgp ASNUMBER
* vtysh/vtysh.c: AS4 compatibility for router bgp ASNUMBER
2007-10-15 00:32:21 +02:00
|
|
|
|
size_t aspath_lenp;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
struct aspath *aspath;
|
|
|
|
|
|
|
|
|
|
/* Remember current pointer. */
|
2005-02-09 16:51:56 +01:00
|
|
|
|
cp = stream_get_endp (s);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
|
|
/* Place holder of length. */
|
|
|
|
|
stream_putw (s, 0);
|
|
|
|
|
|
|
|
|
|
/* Origin attribute. */
|
|
|
|
|
stream_putc (s, BGP_ATTR_FLAG_TRANS);
|
|
|
|
|
stream_putc (s, BGP_ATTR_ORIGIN);
|
|
|
|
|
stream_putc (s, 1);
|
|
|
|
|
stream_putc (s, attr->origin);
|
|
|
|
|
|
|
|
|
|
aspath = attr->aspath;
|
[bgpd] Merge AS4 support
2007-10-14 Paul Jakma <paul.jakma@sun.com>
* NEWS: Note that MRT dumps are now version 2
* (general) Merge in Juergen Kammer's AS4 patch.
2007-09-27 Paul Jakma <paul.jakma@sun.com>
* bgp_aspath.c: (assegment_normalise) remove duplicates from
from sets.
(aspath_reconcile_as4) disregard a broken part of the RFC around
error handling in path reconciliation.
* aspath_test.c: Test dupe-weeding from sets.
Test that reconciliation merges AS_PATH and AS4_PATH where
former is shorter than latter.
2007-09-26 Paul Jakma <paul.jakma@sun.com>
* aspath_test.c: Test AS4_PATH reconcilation where length
of AS_PATH and AS4_PATH is same.
2007-09-25 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (peek_for_as4_capability) Fix to work.
* bgp_packet.c: (bgp_open_receive) Fix sanity check of as4.
* tests/bgp_capability_test.c: (general) Extend tests to validate
peek_for_as4_capability.
Add test of full OPEN Option block, with multiple capabilities,
both as a series of Option, and a single option.
Add some crap to beginning of stream, to prevent code depending
on getp == 0.
2007-09-18 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (bgp_capability_as4) debug printf inline with others.
(peek_for_as4_capability) There's no need to signal failure, as
failure is better dealt with through full capability parser -
just return the AS4, simpler.
* bgp_packet.c: (bgp_open_receive) Update to match
peek_for_as4_capability change.
Allow use of BGP_AS_TRANS by 2b speakers.
Use NOTIFY_OPEN_ERR rather than CEASE for OPEN parsing errors.
(bgp_capability_msg_parse) missing argument to debug print
(bgp_capability_receive) missing return values.
* tests/bgp_capability_test.c: (parse_test) update for changes to
peek_for_as4_capability
2007-07-25 Paul Jakma <paul.jakma@sun.com>
* Remove 2-byte size macros, just make existing macros take
argument to indicate which size to use.
Adjust all users - typically they want '1'.
* bgp_aspath.c: (aspath_has_as4) New, return 1 if there are any
as4's in a path.
(aspath_put) Return the number of bytes actually written, to
fix the bug Juergen noted: Splitting of segments will change
the number of bytes written from that already written to the
AS_PATH header.
(aspath_snmp_pathseg) Pass 2-byte flag to aspath_put. SNMP
is still defined as 2b.
(aspath_aggregate) fix latent bug.
(aspath_reconcile_as4) AS_PATH+NEW_AS_PATH reconciliation
function.
(aspath_key_make) Hash the AS_PATH string, rather than
just taking the addition of assegment ASes as the hash value,
hopefully sligthly more collision resistant.
(bgp_attr_munge_as4_attrs) Collide the NEW_ attributes
together with the OLD 2-byte forms, code Juergen
had in bgp_attr_parse but re-organised a bit.
(bgp_attr_parse) Bunch of code from Juergen moves
to previous function.
(bgp_packet_attribute) Compact significantly by
just /always/ using extended-length attr header.
Fix bug Juergen noted, by using aspath_put's
(new) returned size value for the attr header rather
than the (guesstimate) of aspath_size() - the two could
differ when aspath_put had to split large segments, unlikely
this bug was ever hit in the 'wild'.
(bgp_dump_routes_attr) Always use extended-len and
use aspath_put return for header length. Output 4b ASN
for AS_PATH and AGGREGATOR.
* bgp_ecommunity.c: (ecommunity_{hash_make,cmp}) fix
hash callback declarations to match prototypes.
(ecommunity_gettoken) Updated for ECOMMUNITY_ENCODE_AS4,
complete rewrite of Juergen's changes (no asdot support)
* bgp_open.c: (bgp_capability_as4) New, does what it says
on the tin.
(peek_for_as4_capability) Rewritten to use streams and
bgp_capability_as4.
* bgp_packet.c: (bgp_open_send) minor edit
checked (in the abstract at least) with Juergen.
Changes are to be more accepting, e.g, allow AS_TRANS on
a 2-byte session.
* (general) Update all commands to use CMD_AS_RANGE.
* bgp_vty.c: (bgp_clear) Fix return vals to use CMD_..
Remove stuff replicated by VTY_GET_LONG
(bgp_clear_vty) Return bgp_clear directly to vty.
* tests/aspath_test.c: Exercise 32bit parsing. Test reconcile
function.
* tests/ecommunity_test.c: New, test AS4 ecommunity changes,
positive test only at this time, error cases not tested yet.
2007-07-25 Juergen Kammer <j.kammer@eurodata.de>
* (general) AS4 support.
* bgpd.h: as_t changes to 4-bytes.
* bgp_aspath.h: Add BGP_AS4_MAX and BGP_AS_TRANS defines.
* bgp_aspath.c: AS_VALUE_SIZE becomes 4-byte, AS16_VALUE_SIZE
added for 2-byte.
Add AS16 versions of length calc macros.
(aspath_count_numas) New, count number of ASes.
(aspath_has_as4) New, return 1 if there are any as4's in a
path.
(assegments_parse) Interpret assegment as 4 or 2 byte,
according to how the caller instructs us, with a new
argument.
(aspath_parse) Add use32bit argument to pass to
assegments_parse. Adjust all its callers to pass 1, unless
otherwise noted.
(assegment_data_put) Adjust to be able to write 2 or 4 byte
AS, according to new use32bit argument.
(aspath_put) Adjust to write 2 or 4.
(aspath_gettoken) Use a long for passed in asno.
* bgp_attr.c: (attr_str) Add BGP_ATTR_AS4_PATH and
BGP_ATTR_AS4_AGGREGATOR.
(bgp_attr_aspath) Call aspath_parse with right 2/4 arg, as
determined by received-capability flag.
(bgp_attr_aspath_check) New, code previously in attr_aspath
but moved to new func so it can be run after NEW_AS_PATH
reconciliation.
(bgp_attr_as4_path) New, handle NEW_AS_PATH.
(bgp_attr_aggregator) Adjust to cope with 2/4 byte ASes.
(bgp_attr_as4_aggregator) New, read NEW_AGGREGATOR.
(bgp_attr_parse) Add handoffs to previous parsers for the two
new AS4 NEW_ attributes.
Various checks added for NEW/OLD reconciliation.
(bgp_packet_attribute) Support 2/4 for AS_PATH and
AGGREGATOR, detect when NEW_ attrs need to be sent.
* bgp_debug.{c,h}: Add 'debug bgp as4'.
* bgp_dump.c: MRTv2 support, unconditionally enabled, which
supports AS4. Based on patches from Erik (RIPE?).
* bgp_ecommunity.c: (ecommunity_ecom2str) ECOMMUNITY_ENCODE_AS4
support.
* bgp_open.c: (peek_for_as4_capability) New, peek for AS4
capability prior to full capability parsing, so we know which
ASN to use for struct peer lookup.
(bgp_open_capability) Always send AS4 capability.
* bgp_packet.c: (bgp_open_send) AS4 handling for AS field
(bgp_open_receive) Peek for AS4 capability first, and figure
out which AS to believe.
* bgp_vty.c: (bgp_show_peer) Print AS4 cap
* tests/aspath_test.c: Support asn32 changes, call aspath_parse
with 16 bit.
* vtysh/extract.pl: AS4 compatibility for router bgp ASNUMBER
* vtysh/extract.pl.in: AS4 compatibility for router bgp ASNUMBER
* vtysh/vtysh.c: AS4 compatibility for router bgp ASNUMBER
2007-10-15 00:32:21 +02:00
|
|
|
|
|
|
|
|
|
stream_putc (s, BGP_ATTR_FLAG_TRANS|BGP_ATTR_FLAG_EXTLEN);
|
|
|
|
|
stream_putc (s, BGP_ATTR_AS_PATH);
|
|
|
|
|
aspath_lenp = stream_get_endp (s);
|
|
|
|
|
stream_putw (s, 0);
|
|
|
|
|
|
|
|
|
|
stream_putw_at (s, aspath_lenp, aspath_put (s, aspath, 1));
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
|
|
/* Nexthop attribute. */
|
2003-10-18 03:30:50 +02:00
|
|
|
|
/* If it's an IPv6 prefix, don't dump the IPv4 nexthop to save space */
|
|
|
|
|
if(prefix != NULL
|
|
|
|
|
#ifdef HAVE_IPV6
|
|
|
|
|
&& prefix->family != AF_INET6
|
|
|
|
|
#endif /* HAVE_IPV6 */
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
stream_putc (s, BGP_ATTR_FLAG_TRANS);
|
|
|
|
|
stream_putc (s, BGP_ATTR_NEXT_HOP);
|
|
|
|
|
stream_putc (s, 4);
|
|
|
|
|
stream_put_ipv4 (s, attr->nexthop.s_addr);
|
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
|
|
/* MED attribute. */
|
|
|
|
|
if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
|
|
|
|
|
{
|
|
|
|
|
stream_putc (s, BGP_ATTR_FLAG_OPTIONAL);
|
|
|
|
|
stream_putc (s, BGP_ATTR_MULTI_EXIT_DISC);
|
|
|
|
|
stream_putc (s, 4);
|
|
|
|
|
stream_putl (s, attr->med);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Local preference. */
|
|
|
|
|
if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
|
|
|
|
|
{
|
|
|
|
|
stream_putc (s, BGP_ATTR_FLAG_TRANS);
|
|
|
|
|
stream_putc (s, BGP_ATTR_LOCAL_PREF);
|
|
|
|
|
stream_putc (s, 4);
|
|
|
|
|
stream_putl (s, attr->local_pref);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Atomic aggregate. */
|
|
|
|
|
if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE))
|
|
|
|
|
{
|
|
|
|
|
stream_putc (s, BGP_ATTR_FLAG_TRANS);
|
|
|
|
|
stream_putc (s, BGP_ATTR_ATOMIC_AGGREGATE);
|
|
|
|
|
stream_putc (s, 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Aggregator. */
|
|
|
|
|
if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_AGGREGATOR))
|
|
|
|
|
{
|
2007-05-04 22:15:47 +02:00
|
|
|
|
assert (attr->extra);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
stream_putc (s, BGP_ATTR_FLAG_OPTIONAL|BGP_ATTR_FLAG_TRANS);
|
|
|
|
|
stream_putc (s, BGP_ATTR_AGGREGATOR);
|
[bgpd] Merge AS4 support
2007-10-14 Paul Jakma <paul.jakma@sun.com>
* NEWS: Note that MRT dumps are now version 2
* (general) Merge in Juergen Kammer's AS4 patch.
2007-09-27 Paul Jakma <paul.jakma@sun.com>
* bgp_aspath.c: (assegment_normalise) remove duplicates from
from sets.
(aspath_reconcile_as4) disregard a broken part of the RFC around
error handling in path reconciliation.
* aspath_test.c: Test dupe-weeding from sets.
Test that reconciliation merges AS_PATH and AS4_PATH where
former is shorter than latter.
2007-09-26 Paul Jakma <paul.jakma@sun.com>
* aspath_test.c: Test AS4_PATH reconcilation where length
of AS_PATH and AS4_PATH is same.
2007-09-25 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (peek_for_as4_capability) Fix to work.
* bgp_packet.c: (bgp_open_receive) Fix sanity check of as4.
* tests/bgp_capability_test.c: (general) Extend tests to validate
peek_for_as4_capability.
Add test of full OPEN Option block, with multiple capabilities,
both as a series of Option, and a single option.
Add some crap to beginning of stream, to prevent code depending
on getp == 0.
2007-09-18 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (bgp_capability_as4) debug printf inline with others.
(peek_for_as4_capability) There's no need to signal failure, as
failure is better dealt with through full capability parser -
just return the AS4, simpler.
* bgp_packet.c: (bgp_open_receive) Update to match
peek_for_as4_capability change.
Allow use of BGP_AS_TRANS by 2b speakers.
Use NOTIFY_OPEN_ERR rather than CEASE for OPEN parsing errors.
(bgp_capability_msg_parse) missing argument to debug print
(bgp_capability_receive) missing return values.
* tests/bgp_capability_test.c: (parse_test) update for changes to
peek_for_as4_capability
2007-07-25 Paul Jakma <paul.jakma@sun.com>
* Remove 2-byte size macros, just make existing macros take
argument to indicate which size to use.
Adjust all users - typically they want '1'.
* bgp_aspath.c: (aspath_has_as4) New, return 1 if there are any
as4's in a path.
(aspath_put) Return the number of bytes actually written, to
fix the bug Juergen noted: Splitting of segments will change
the number of bytes written from that already written to the
AS_PATH header.
(aspath_snmp_pathseg) Pass 2-byte flag to aspath_put. SNMP
is still defined as 2b.
(aspath_aggregate) fix latent bug.
(aspath_reconcile_as4) AS_PATH+NEW_AS_PATH reconciliation
function.
(aspath_key_make) Hash the AS_PATH string, rather than
just taking the addition of assegment ASes as the hash value,
hopefully sligthly more collision resistant.
(bgp_attr_munge_as4_attrs) Collide the NEW_ attributes
together with the OLD 2-byte forms, code Juergen
had in bgp_attr_parse but re-organised a bit.
(bgp_attr_parse) Bunch of code from Juergen moves
to previous function.
(bgp_packet_attribute) Compact significantly by
just /always/ using extended-length attr header.
Fix bug Juergen noted, by using aspath_put's
(new) returned size value for the attr header rather
than the (guesstimate) of aspath_size() - the two could
differ when aspath_put had to split large segments, unlikely
this bug was ever hit in the 'wild'.
(bgp_dump_routes_attr) Always use extended-len and
use aspath_put return for header length. Output 4b ASN
for AS_PATH and AGGREGATOR.
* bgp_ecommunity.c: (ecommunity_{hash_make,cmp}) fix
hash callback declarations to match prototypes.
(ecommunity_gettoken) Updated for ECOMMUNITY_ENCODE_AS4,
complete rewrite of Juergen's changes (no asdot support)
* bgp_open.c: (bgp_capability_as4) New, does what it says
on the tin.
(peek_for_as4_capability) Rewritten to use streams and
bgp_capability_as4.
* bgp_packet.c: (bgp_open_send) minor edit
checked (in the abstract at least) with Juergen.
Changes are to be more accepting, e.g, allow AS_TRANS on
a 2-byte session.
* (general) Update all commands to use CMD_AS_RANGE.
* bgp_vty.c: (bgp_clear) Fix return vals to use CMD_..
Remove stuff replicated by VTY_GET_LONG
(bgp_clear_vty) Return bgp_clear directly to vty.
* tests/aspath_test.c: Exercise 32bit parsing. Test reconcile
function.
* tests/ecommunity_test.c: New, test AS4 ecommunity changes,
positive test only at this time, error cases not tested yet.
2007-07-25 Juergen Kammer <j.kammer@eurodata.de>
* (general) AS4 support.
* bgpd.h: as_t changes to 4-bytes.
* bgp_aspath.h: Add BGP_AS4_MAX and BGP_AS_TRANS defines.
* bgp_aspath.c: AS_VALUE_SIZE becomes 4-byte, AS16_VALUE_SIZE
added for 2-byte.
Add AS16 versions of length calc macros.
(aspath_count_numas) New, count number of ASes.
(aspath_has_as4) New, return 1 if there are any as4's in a
path.
(assegments_parse) Interpret assegment as 4 or 2 byte,
according to how the caller instructs us, with a new
argument.
(aspath_parse) Add use32bit argument to pass to
assegments_parse. Adjust all its callers to pass 1, unless
otherwise noted.
(assegment_data_put) Adjust to be able to write 2 or 4 byte
AS, according to new use32bit argument.
(aspath_put) Adjust to write 2 or 4.
(aspath_gettoken) Use a long for passed in asno.
* bgp_attr.c: (attr_str) Add BGP_ATTR_AS4_PATH and
BGP_ATTR_AS4_AGGREGATOR.
(bgp_attr_aspath) Call aspath_parse with right 2/4 arg, as
determined by received-capability flag.
(bgp_attr_aspath_check) New, code previously in attr_aspath
but moved to new func so it can be run after NEW_AS_PATH
reconciliation.
(bgp_attr_as4_path) New, handle NEW_AS_PATH.
(bgp_attr_aggregator) Adjust to cope with 2/4 byte ASes.
(bgp_attr_as4_aggregator) New, read NEW_AGGREGATOR.
(bgp_attr_parse) Add handoffs to previous parsers for the two
new AS4 NEW_ attributes.
Various checks added for NEW/OLD reconciliation.
(bgp_packet_attribute) Support 2/4 for AS_PATH and
AGGREGATOR, detect when NEW_ attrs need to be sent.
* bgp_debug.{c,h}: Add 'debug bgp as4'.
* bgp_dump.c: MRTv2 support, unconditionally enabled, which
supports AS4. Based on patches from Erik (RIPE?).
* bgp_ecommunity.c: (ecommunity_ecom2str) ECOMMUNITY_ENCODE_AS4
support.
* bgp_open.c: (peek_for_as4_capability) New, peek for AS4
capability prior to full capability parsing, so we know which
ASN to use for struct peer lookup.
(bgp_open_capability) Always send AS4 capability.
* bgp_packet.c: (bgp_open_send) AS4 handling for AS field
(bgp_open_receive) Peek for AS4 capability first, and figure
out which AS to believe.
* bgp_vty.c: (bgp_show_peer) Print AS4 cap
* tests/aspath_test.c: Support asn32 changes, call aspath_parse
with 16 bit.
* vtysh/extract.pl: AS4 compatibility for router bgp ASNUMBER
* vtysh/extract.pl.in: AS4 compatibility for router bgp ASNUMBER
* vtysh/vtysh.c: AS4 compatibility for router bgp ASNUMBER
2007-10-15 00:32:21 +02:00
|
|
|
|
stream_putc (s, 8);
|
|
|
|
|
stream_putl (s, attr->extra->aggregator_as);
|
2007-05-04 22:15:47 +02:00
|
|
|
|
stream_put_ipv4 (s, attr->extra->aggregator_addr.s_addr);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Community attribute. */
|
|
|
|
|
if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_COMMUNITIES))
|
|
|
|
|
{
|
|
|
|
|
if (attr->community->size * 4 > 255)
|
|
|
|
|
{
|
|
|
|
|
stream_putc (s, BGP_ATTR_FLAG_OPTIONAL|BGP_ATTR_FLAG_TRANS|BGP_ATTR_FLAG_EXTLEN);
|
|
|
|
|
stream_putc (s, BGP_ATTR_COMMUNITIES);
|
|
|
|
|
stream_putw (s, attr->community->size * 4);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
stream_putc (s, BGP_ATTR_FLAG_OPTIONAL|BGP_ATTR_FLAG_TRANS);
|
|
|
|
|
stream_putc (s, BGP_ATTR_COMMUNITIES);
|
|
|
|
|
stream_putc (s, attr->community->size * 4);
|
|
|
|
|
}
|
|
|
|
|
stream_put (s, attr->community->val, attr->community->size * 4);
|
|
|
|
|
}
|
|
|
|
|
|
2003-10-18 03:30:50 +02:00
|
|
|
|
#ifdef HAVE_IPV6
|
|
|
|
|
/* Add a MP_NLRI attribute to dump the IPv6 next hop */
|
2007-05-04 22:15:47 +02:00
|
|
|
|
if (prefix != NULL && prefix->family == AF_INET6 && attr->extra &&
|
|
|
|
|
(attr->extra->mp_nexthop_len == 16 || attr->extra->mp_nexthop_len == 32) )
|
2003-10-18 03:30:50 +02:00
|
|
|
|
{
|
|
|
|
|
int sizep;
|
2007-05-04 22:15:47 +02:00
|
|
|
|
struct attr_extra *attre = attr->extra;
|
|
|
|
|
|
2003-10-18 03:30:50 +02:00
|
|
|
|
stream_putc(s, BGP_ATTR_FLAG_OPTIONAL);
|
|
|
|
|
stream_putc(s, BGP_ATTR_MP_REACH_NLRI);
|
2005-02-09 16:51:56 +01:00
|
|
|
|
sizep = stream_get_endp (s);
|
2003-10-18 03:30:50 +02:00
|
|
|
|
|
|
|
|
|
/* MP header */
|
2007-05-04 22:15:47 +02:00
|
|
|
|
stream_putc (s, 0); /* Marker: Attribute length. */
|
2003-10-18 03:30:50 +02:00
|
|
|
|
stream_putw(s, AFI_IP6); /* AFI */
|
|
|
|
|
stream_putc(s, SAFI_UNICAST); /* SAFI */
|
|
|
|
|
|
|
|
|
|
/* Next hop */
|
2007-05-04 22:15:47 +02:00
|
|
|
|
stream_putc(s, attre->mp_nexthop_len);
|
|
|
|
|
stream_put(s, &attre->mp_nexthop_global, 16);
|
|
|
|
|
if (attre->mp_nexthop_len == 32)
|
|
|
|
|
stream_put(s, &attre->mp_nexthop_local, 16);
|
2003-10-18 03:30:50 +02:00
|
|
|
|
|
|
|
|
|
/* SNPA */
|
|
|
|
|
stream_putc(s, 0);
|
|
|
|
|
|
|
|
|
|
/* Prefix */
|
|
|
|
|
stream_put_prefix(s, prefix);
|
|
|
|
|
|
|
|
|
|
/* Set MP attribute length. */
|
2005-02-09 16:51:56 +01:00
|
|
|
|
stream_putc_at (s, sizep, (stream_get_endp (s) - sizep) - 1);
|
2003-10-18 03:30:50 +02:00
|
|
|
|
}
|
|
|
|
|
#endif /* HAVE_IPV6 */
|
|
|
|
|
|
2007-08-06 17:24:51 +02:00
|
|
|
|
/* AS-Pathlimit */
|
|
|
|
|
if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_AS_PATHLIMIT))
|
|
|
|
|
{
|
|
|
|
|
stream_putc (s, BGP_ATTR_FLAG_OPTIONAL|BGP_ATTR_FLAG_TRANS);
|
|
|
|
|
stream_putc (s, BGP_ATTR_AS_PATHLIMIT);
|
|
|
|
|
stream_putc (s, 5);
|
|
|
|
|
stream_putc (s, attr->pathlimit.ttl);
|
|
|
|
|
stream_putl (s, attr->pathlimit.as);
|
|
|
|
|
}
|
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
|
/* Return total size of attribute. */
|
2005-02-09 16:51:56 +01:00
|
|
|
|
len = stream_get_endp (s) - cp - 2;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
stream_putw_at (s, cp, len);
|
|
|
|
|
}
|