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