Hi everyone.
I want to report this "strange case" to your attention.
I have 4 BGP Router connected into ring topology in iBGP session. (and eBGP session to another AS each one)
- Router1 and Router2 send the eBGP routing entry learned to the other router and viceversa.
- Router2 (that already have Router 1 entry) and Router3 share their routing entry one to another; Router2 advertise also the Router1 entry to Router3.
But Over an iBGP session, a router advertises only its best routes learned over eBGP sessions.
A route learned over an iBGP session is never advertised over another iBGP session.
When a BGP speaker receives an UPDATE message from an internal peer,
the receiving BGP speaker SHALL NOT re-distribute the routing
information contained in that UPDATE message to other internal peers
(unless the speaker acts as a BGP Route Reflector [RFC2796]).
I checked the "BGPRouting::updateSendProcess" method line 402 of this BGRRouting.cc on github
if ((_BGPSessions[sessionIndex]->getType() == IGP && (elem).second->getType() == EGP) ||
_BGPSessions[sessionIndex]->getType() == EGP ||
type == ROUTE_DESTINATION_CHANGED ||
type == NEW_SESSION_ESTABLISHED) <-------------------------------
Router2 decide to send learned entry from Router1 to Router3 because of this line.
Correctly not sended for this other query into the first if:
((elem).first == sessionIndex && type != NEW_SESSION_ESTABLISHED) ||
(type == NEW_SESSION_ESTABLISHED && (elem).first != sessionIndex) ||
I cannot "delete" the
type == NEW_SESSION_ESTABLISHED because otherwise it will not send the query, and other EBGP session will not receive the entry.
Some ideas to fix it?
thx