This brings the network code more in line with what regular update
processing does. It adds the prefix to Adj-RIB-In and if "log update" is
set it will also log the addition and removal of a prefix.
To make the output of log update nicer I pimped peerself and also
initialize the remote address to the bgp ID (which should be a local
address of the router).

OK?
-- 
:wq Claudio

Index: rde.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde.c,v
retrieving revision 1.403
diff -u -p -r1.403 rde.c
--- rde.c       31 Jul 2018 08:04:49 -0000      1.403
+++ rde.c       31 Jul 2018 08:16:10 -0000
@@ -1336,10 +1336,9 @@ rde_update_withdraw(struct rde_peer *pee
        for (i = RIB_LOC_START; i < rib_size; i++) {
                if (*ribs[i].name == '\0')
                        break;
-               if (prefix_remove(&ribs[i].rib, peer, prefix, prefixlen, 0)) {
+               if (prefix_remove(&ribs[i].rib, peer, prefix, prefixlen, 0))
                        rde_update_log("withdraw", i, peer, NULL, prefix,
                            prefixlen);
-               }
        }
 
        /* remove original path form the Adj-RIB-In */
@@ -2724,6 +2723,9 @@ rde_reload_done(void)
        peerself->remote_bgpid = ntohl(conf->bgpid);
        peerself->conf.local_as = conf->as;
        peerself->conf.remote_as = conf->as;
+       peerself->conf.remote_addr.aid = AID_INET;
+       peerself->conf.remote_addr.v4.s_addr = conf->bgpid;
+       peerself->conf.remote_masklen = 32;
        peerself->short_as = conf->short_as;
 
        /* apply new set of rdomain, sync will be done later */
@@ -3423,9 +3425,16 @@ network_add(struct network_config *nc, i
        if (vpnset)
                rde_apply_set(vpnset, &state, nc->prefix.aid, peerself,
                    peerself);
+
+       if (path_update(&ribs[RIB_ADJ_IN].rib, peerself, &state, &nc->prefix,
+                   nc->prefixlen, 0))
+               peerself->prefix_cnt++;
        for (i = RIB_LOC_START; i < rib_size; i++) {
                if (*ribs[i].name == '\0')
                        break;
+               rde_update_log("announce", i, peerself,
+                   state.nexthop ? &state.nexthop->exit_nexthop : NULL,
+                   &nc->prefix, nc->prefixlen);
                path_update(&ribs[i].rib, peerself, &state, &nc->prefix,
                    nc->prefixlen, 0);
        }
@@ -3475,9 +3484,15 @@ network_delete(struct network_config *nc
        for (i = RIB_LOC_START; i < rib_size; i++) {
                if (*ribs[i].name == '\0')
                        break;
-               prefix_remove(&ribs[i].rib, peerself, &nc->prefix,
-                   nc->prefixlen, flags);
+               if (prefix_remove(&ribs[i].rib, peerself, &nc->prefix,
+                   nc->prefixlen, flags))
+                       rde_update_log("withdraw announce", i, peerself,
+                           NULL, &nc->prefix, nc->prefixlen);
+
        }
+       if (prefix_remove(&ribs[RIB_ADJ_IN].rib, peerself, &nc->prefix,
+           nc->prefixlen, flags))
+               peerself->prefix_cnt--; 
 }
 
 void

Reply via email to