* Falk Brockerhoff <[EMAIL PROTECTED]> [2006-03-29 12:38]:
> Hello,
> 
> I'm just playing around with OpenBGP on OpenBSD3.8. My BGP Session  
> comes up, MD5 works fine. OpenBGP is a intuitiv tool and works fine. :)
> 
> But I didn't find any documentation for migrating some parts of my  
> cisco config to openbgpd. I configured internal BGP between my core- 
> router and an openbgp border-router. The session comes up and  
> openbgpd receives all my prefixes from the core-router, multiple /32  
> addresses, some /29-networks and so on. But I want only to be  
> specified networks announced to my external bgp-neighbor. On my Cisco  
> border-router I done this with an "aggregate-address 192.168.0.0  
> 255.255.255.0"-Statement.
> 
> I take a look on the documentation, searched the source-code for  
> anything spelled like aggregate or something like this, but I wasn't  
> lucky. The network-Statement isn't doing aggregating, is it?

njet. we don't have any aggregate code, and you're the first one ever 
to ask :)

> The second problem is, that I want to announce an external full-feed,  
> received with openbgpd, to my core-router. This works fine, but the  
> next-hop is the ip-adress of my external bgp-neighbor. But it should  
> be the ip-address of the border-router. 

of course! you should have an IBGP that makes your other routes have a 
route to that... like OpenOSPFD :)

> On Cisco I configured   
> "neighbor 10.0.0.2 next-hop-self", but how to do this with openbgp?

that, again, is sth nobody ever asked for or missed :)
however, the (completely untested except for compilation) diff below 
should add "set nexthop self".

Index: bgpd.h
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/bgpd.h,v
retrieving revision 1.195
diff -u -p -r1.195 bgpd.h
--- bgpd.h      22 Mar 2006 13:30:35 -0000      1.195
+++ bgpd.h      29 Mar 2006 12:08:44 -0000
@@ -598,6 +598,7 @@ enum action_types {
        ACTION_SET_NEXTHOP_REJECT,
        ACTION_SET_NEXTHOP_BLACKHOLE,
        ACTION_SET_NEXTHOP_NOMODIFY,
+       ACTION_SET_NEXTHOP_SELF,
        ACTION_SET_COMMUNITY,
        ACTION_DEL_COMMUNITY,
        ACTION_PFTABLE,
Index: parse.y
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/parse.y,v
retrieving revision 1.184
diff -u -p -r1.184 parse.y
--- parse.y     22 Mar 2006 13:30:35 -0000      1.184
+++ parse.y     29 Mar 2006 12:08:44 -0000
@@ -159,7 +159,7 @@ typedef struct {
 %token FROM TO ANY
 %token CONNECTED STATIC
 %token PREFIX PREFIXLEN SOURCEAS TRANSITAS COMMUNITY DELETE
-%token SET LOCALPREF MED METRIC NEXTHOP REJECT BLACKHOLE NOMODIFY
+%token SET LOCALPREF MED METRIC NEXTHOP REJECT BLACKHOLE NOMODIFY SELF
 %token PREPEND_SELF PREPEND_PEER PFTABLE WEIGHT RTLABEL
 %token ERROR
 %token IPSEC ESP AH SPI IKE
@@ -1386,6 +1386,11 @@ filter_set_opt   : LOCALPREF number              {
                                fatal(NULL);
                        $$->type = ACTION_SET_NEXTHOP_NOMODIFY;
                }
+               | NEXTHOP SELF          {
+                       if (($$ = calloc(1, sizeof(struct filter_set))) == NULL)
+                               fatal(NULL);
+                       $$->type = ACTION_SET_NEXTHOP_SELF;
+               }
                | PREPEND_SELF number           {
                        if (($$ = calloc(1, sizeof(struct filter_set))) == NULL)
                                fatal(NULL);
@@ -1599,6 +1604,7 @@ lookup(char *s)
                { "route-reflector",    REFLECTOR},
                { "router-id",          ROUTERID},
                { "rtlabel",            RTLABEL},
+               { "self",               SELF},
                { "set",                SET},
                { "softreconfig",       SOFTRECONFIG},
                { "source-as",          SOURCEAS},
@@ -2505,6 +2511,7 @@ get_rule(enum action_types type)
        switch (type) {
        case ACTION_SET_PREPEND_SELF:
        case ACTION_SET_NEXTHOP_NOMODIFY:
+       case ACTION_SET_NEXTHOP_SELF:
                out = 1;
                break;
        default:
Index: printconf.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/printconf.c,v
retrieving revision 1.54
diff -u -p -r1.54 printconf.c
--- printconf.c 22 Mar 2006 13:30:35 -0000      1.54
+++ printconf.c 29 Mar 2006 12:08:45 -0000
@@ -114,6 +114,9 @@ print_set(struct filter_set_head *set)
                case ACTION_SET_NEXTHOP_NOMODIFY:
                        printf("nexthop no-modify ");
                        break;
+               case ACTION_SET_NEXTHOP_SELF:
+                       printf("nexthop self ");
+                       break;
                case ACTION_SET_PREPEND_SELF:
                        printf("prepend-self %u ", s->action.prepend);
                        break;
Index: rde.h
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde.h,v
retrieving revision 1.90
diff -u -p -r1.90 rde.h
--- rde.h       22 Mar 2006 10:18:49 -0000      1.90
+++ rde.h       29 Mar 2006 12:08:45 -0000
@@ -150,9 +150,10 @@ LIST_HEAD(prefix_head, prefix);
 #define        F_NEXTHOP_REJECT        0x0200
 #define        F_NEXTHOP_BLACKHOLE     0x0400
 #define        F_NEXTHOP_NOMODIFY      0x0800
-#define        F_ATTR_LINKED           0x1000
-#define        F_LOCAL                 0x2000  /* Local-RIB */
-#define        F_ORIGINAL              0x4000  /* Adj-RIB-In */
+#define F_NEXTHOP_SELF         0x1000
+#define        F_ATTR_LINKED           0x2000
+#define        F_LOCAL                 0x4000  /* Local-RIB */
+#define        F_ORIGINAL              0x8000  /* Adj-RIB-In */
 
 
 #define ORIGIN_IGP             0
Index: rde_filter.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde_filter.c,v
retrieving revision 1.46
diff -u -p -r1.46 rde_filter.c
--- rde_filter.c        9 Feb 2006 21:05:09 -0000       1.46
+++ rde_filter.c        29 Mar 2006 12:08:45 -0000
@@ -160,6 +160,7 @@ rde_apply_set(struct rde_aspath *asp, st
                case ACTION_SET_NEXTHOP_REJECT:
                case ACTION_SET_NEXTHOP_BLACKHOLE:
                case ACTION_SET_NEXTHOP_NOMODIFY:
+               case ACTION_SET_NEXTHOP_SELF:
                        nexthop_modify(asp, &set->action.nexthop, set->type,
                            af);
                        break;
@@ -512,6 +513,7 @@ filterset_equal(struct filter_set_head *
                case ACTION_SET_NEXTHOP_BLACKHOLE:
                case ACTION_SET_NEXTHOP_REJECT:
                case ACTION_SET_NEXTHOP_NOMODIFY:
+               case ACTION_SET_NEXTHOP_SELF:
                        if (a->type == b->type)
                                continue;
                        break;
Index: rde_rib.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde_rib.c,v
retrieving revision 1.84
diff -u -p -r1.84 rde_rib.c
--- rde_rib.c   15 Mar 2006 15:37:40 -0000      1.84
+++ rde_rib.c   29 Mar 2006 12:08:45 -0000
@@ -880,6 +880,10 @@ nexthop_modify(struct rde_aspath *asp, s
                asp->flags |= F_NEXTHOP_NOMODIFY;
                return;
        }
+       if (type == ACTION_SET_NEXTHOP_SELF) {
+               asp->flags |= F_NEXTHOP_SELF;
+               return;
+       }
        if (af != nexthop->af)
                return;
 
Index: rde_update.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde_update.c,v
retrieving revision 1.49
diff -u -p -r1.49 rde_update.c
--- rde_update.c        13 Jan 2006 13:04:33 -0000      1.49
+++ rde_update.c        29 Mar 2006 12:08:45 -0000
@@ -513,7 +513,9 @@ up_get_nexthop(struct rde_peer *peer, st
                        return (peer->local_v4_addr.v4.s_addr);
                else
                        return (a->nexthop->exit_nexthop.v4.s_addr);
-       } else if (!peer->conf.ebgp) {
+       } else if (a->flags & F_NEXTHOP_SELF)
+               return (peer->local_v4_addr.v4.s_addr);
+       else if (!peer->conf.ebgp) {
                /*
                 * If directly connected use peer->local_v4_addr
                 * this is only true for announced networks.


-- 
BS Web Services, http://www.bsws.de/
OpenBSD-based Webhosting, Mail Services, Managed Servers, ...
Unix is very simple, but it takes a genius to understand the simplicity.
(Dennis Ritchie)

Reply via email to