edb12a94da
This pkg includes modifications to implement 4byte (32bit) AS number extensions to BGP. the original FreeBSD port descr is appended below. -george OpenBGPD is a FREE implementation of the Border Gateway Protocol, Version 4. It allows ordinary machines to be used as routers exchanging routes with other systems speaking the BGP protocol. WWW: http://www.openbgp.org/ - Florent Thoumie flz@xbsd.org
99 lines
3.1 KiB
Text
99 lines
3.1 KiB
Text
--- bgpd/rde_update.c.orig 2007-01-11 15:02:39.000000000 +1000
|
|
+++ bgpd/rde_update.c 2007-01-11 16:40:09.000000000 +1000
|
|
@@ -22,6 +22,8 @@
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
+#include <stdio.h>
|
|
+
|
|
#include "bgpd.h"
|
|
#include "rde.h"
|
|
|
|
@@ -285,7 +287,7 @@
|
|
}
|
|
|
|
if (peer->conf.ebgp && !aspath_loopfree(p->aspath->aspath,
|
|
- peer->conf.remote_as)) {
|
|
+ peer->conf.remote_as,4)) {
|
|
/*
|
|
* Do not send routes back to sender which would
|
|
* cause an aspath loop.
|
|
@@ -466,7 +468,7 @@
|
|
return;
|
|
|
|
asp = path_get();
|
|
- asp->aspath = aspath_get(NULL, 0);
|
|
+ asp->aspath = aspath_get(NULL, 0, 4);
|
|
asp->origin = ORIGIN_IGP;
|
|
/* the other default values are OK, nexthop is once again NULL */
|
|
|
|
@@ -619,12 +621,16 @@
|
|
struct rde_aspath *a, sa_family_t af)
|
|
{
|
|
struct aspath *path;
|
|
+ struct aspath *oasp;
|
|
struct attr *oa;
|
|
u_int32_t tmp32;
|
|
in_addr_t nexthop;
|
|
int r, ismp = 0;
|
|
u_int16_t len = sizeof(up_attr_buf), wlen = 0;
|
|
u_int8_t l;
|
|
+ /****/
|
|
+ char *buf;
|
|
+ /****/
|
|
|
|
/* origin */
|
|
if ((r = attr_write(up_attr_buf + wlen, len, ATTR_WELL_KNOWN,
|
|
@@ -633,13 +639,52 @@
|
|
wlen += r; len -= r;
|
|
|
|
/* aspath */
|
|
+ /****/
|
|
+ aspath_asprint(&buf,a->aspath->data,a->aspath->len,4) ;
|
|
+ fprintf(stderr,"ASPATH: a->aspath (4byte) ascnt = %d, len=%d, path=%s\n",a->aspath->ascnt, a->aspath->len,buf) ;
|
|
+ free(buf);
|
|
+ /****/
|
|
+
|
|
if (!peer->conf.ebgp ||
|
|
rde_decisionflags() & BGPD_FLAG_DECISION_TRANS_AS)
|
|
path = aspath_prepend(a->aspath, rde_local_as(), 0);
|
|
else
|
|
path = aspath_prepend(a->aspath, rde_local_as(), 1);
|
|
|
|
+ /****/
|
|
+ aspath_asprint(&buf,path->data,path->len,4) ;
|
|
+ fprintf(stderr,"ASPATH: path (4byte) ascnt = %d, len=%d, path=%s\n",path->ascnt, path->len,buf) ;
|
|
+ free(buf);
|
|
+ /****/
|
|
+
|
|
+ /* if this is a 2 byte peer then the as path will been to be translated
|
|
+ into a 2byte version and this 4byte path written out as ATTR_NEW_ASPATH */
|
|
+ if (!(peer->capa_received.as_4bytes)) {
|
|
+ if ((oasp = aspath_convert(path)) == NULL)
|
|
+ return(-1) ;
|
|
+
|
|
+ /****/
|
|
+ aspath_asprint(&buf,oasp->data,oasp->len,2) ;
|
|
+ fprintf(stderr,"ASPATHCONVERT: oasp (2byte) ascnt = %d, len=%d, path=%s\n",oasp->ascnt, oasp->len,buf) ;
|
|
+ free(buf);
|
|
+ /****/
|
|
+
|
|
if ((r = attr_write(up_attr_buf + wlen, len, ATTR_WELL_KNOWN,
|
|
+ ATTR_ASPATH, oasp->data, oasp->len)) == -1)
|
|
+ return (-1);
|
|
+ aspath_put(oasp);
|
|
+ wlen += r; len -= r;
|
|
+ /* the AS_CONFED_SET and AS_CONFED_SEQUENCE attrs should be stripped here */
|
|
+ if ((r = attr_write(up_attr_buf + wlen, len, (ATTR_TRANSITIVE | ATTR_OPTIONAL),
|
|
+ ATTR_NEW_ASPATH, path->data, path->len)) == -1)
|
|
+ return (-1);
|
|
+ /****/
|
|
+ aspath_asprint(&buf,path->data,path->len,4) ;
|
|
+ fprintf(stderr,"NEW_ASPATH: path (4byte) ascnt = %d, len=%d, path=%s\n",path->ascnt, path->len,buf) ;
|
|
+ free(buf);
|
|
+ /****/
|
|
+ }
|
|
+ else if ((r = attr_write(up_attr_buf + wlen, len, ATTR_WELL_KNOWN,
|
|
ATTR_ASPATH, path->data, path->len)) == -1)
|
|
return (-1);
|
|
aspath_put(path);
|