In the future we are going to have a rule_notify_owner
so make the distinction between the two types of notification
clearer.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
1) strlen(buf) on an uninted value is the wrong thing to do
we should be getting sizeof(buf)
2) tlv is not freed in this error case, so let's free it up.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
Some of the deprecated stream.h macros see such little use that we may
as well just remove them and use the non-deprecated macros.
Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
EIGRP must not advertise routes that have failed to install.
This commit turns on the notification for EIGRP. We still
need to start handling this correctly.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
Allow the higher level protocol to specify if it would
like to receive notifications about it's routes that
it has installed.
I've purposely made it part of zclient_new_notify because
we need to track the routes on a per daemon basis only.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
When we send a query if we have more queries than we
can fit in one packet, allow the packet to be broken
up into multiple packets to be sent to our neighbor.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
1) Create #defines for TLV SIZE and use them
2) Speed up prefix length by using a switch statement
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
When we are writing a packet if we have gotten ourselves
into a bad situation, note it and move on. Hopefully
dumping enough information so that we can find the offending
reason.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
When we receive a reply for a prefix we no longer
have we should note the issue and move on instead
of crashing eigrp.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
A past commit modified the change value to an enum
but did not bother to fix all the places where
change was used. Fix this.
Additionally add some more output to the fsm prefix
string about the change.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
Ignore the return value of some functions in the places we know they
can't fail, and other small fixes.
Regarding the change in bgpd/rfapi/rfapi_rib.c, asserting that
rfapiRaddr2Qprefix() didn't fail is the common idiom inside the rfapi
code.
Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
The EIGRP topology list is an extremely inefficient
way to store data about the known routes. Convert
to using a table.
Signed-off-by: Donald Sharp <sharpd@cumulusnetorks.com>
This improves code readability and also future-proofs our codebase
against new changes in the data structure used to store interfaces.
The FOR_ALL_INTERFACES_ADDRESSES macro was also moved to lib/ but
for now only babeld is using it.
Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
Performance tests showed that, when running on a system with a large
number of interfaces, some daemons would spend a considerable amount
of time in the if_lookup_by_index() function. Introduce a new rb-tree
to solve this problem.
With this change, we need to use the if_set_index() function whenever
we want to change the ifindex of an interface. This is necessary to
ensure that the 'ifaces_by_index' rb-tree is updated accordingly. The
return value of all insert/remove operations in the interface rb-trees
is checked to ensure that an error is logged if a corruption is
detected.
Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
This is an important optimization for users running FRR on systems with
a large number of interfaces (e.g. thousands of tunnels). Red-black
trees scale much better than sorted linked-lists and also store the
elements in an ordered way (contrary to hash tables).
This is a big patch but the interesting bits are all in lib/if.[ch].
Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
Make use of strnlen() and strlcpy() so we can get rid of these
convoluted if_*_by_name_len() functions.
Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
ei shall never be NULL once we do the lookup. If it is NULL
bad things could happen.
For instance ei->t_distribute may not be a valid reference.
Signed-off-by: Vincent Jardin <vincent.jardin@6wind.com>
nbr cannot be NULL. Doing such test does confuse clang since
we do not have execution case if nbr == NULL.
Signed-off-by: Vincent Jardin <vincent.jardin@6wind.com>
list_free is occassionally being used to delete the
list and accidently not deleting all the nodes.
We keep running across this usage pattern. Let's
remove the temptation and only allow list_delete
to handle list deletion.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
Convert the list_delete(struct list *) function to use
struct list **. This is to allow the list pointer to be nulled.
I keep running into uses of this list_delete function where we
forget to set the returned pointer to NULL and attempt to use
it and then experience a crash, usually after the developer
has long since left the building.
Let's make the api explicit in it setting the list pointer
to null.
Cynical Prediction: This code will expose a attempt
to use the NULL'ed list pointer in some obscure bit
of code.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
We need one struct eigrp_interface per ifp structure
not a ifp->info structure with a ei per connected.
Some minor code cleanup as well with macros and
their weird usage.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
The EIGRP interface handling code created 2 levels
of interface information, the ei( created per *connected*
address?????) and the ifp->info pointer.
Start the combination of pushing these together and
cleaning up the weirdness that is these two data
structures.
This commit probably breaks eigrp's handling of
interfaces.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This is a fallout from PR #1022 (zapi consolidation). In the early days,
the client daemons would allocate enough memory to send all nexthops
to zebra. Then zebra would add all nexthops to the RIB and respect
MULTIPATH_NUM only when installing the routes in the kernel. Now things
are different and the client daemons can send at most MULTIPATH_NUM
nexthops to zebra, and failure to respect that will result in a buffer
overflow. The MULTIPATH_NUM limit in the new zebra API is a small price
we pay to avoid allocating memory for each route sent to zebra.
Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
Signed-off-by: Daniel Walton <dwalton@cumulusnetworks.com>
If the user configures some command that is already in the config we
should return CMD_WARNING instead of CMD_WARNING_CONFIG_FAILED
Using the previously-added vty_frame() support, this gets rid of all the
pointless empty "interface XYZ" blocks that get added for any interface
that shows up in the system (e.g. dummys, tunnels, etc.)
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
The struct 'eigrp_neighbor_entry' really represents
a nexthop for a prefix. Rename the structure to
better represent what we are representing.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
Problem noticed where we were not sending the correct metric values
to our peers for connected interfaces. Found that we were not storing
these values on the structure used to send the update packets.
Signed-off-by: Don Slice <dslice@cumulusnetworks.com>
There was allot of code cut-n-pasting to
apply the prefix/access lists. Refactor
to simplify code.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
Lots of multiple pointer dereferences that made the
code lines really long, so let's properly setup
the pointers in a way that makes it easier to read.
No need to lookup the eigrp pointer because we already
have it, so let's use this( this will be good for the
future too when we have VRF's).
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
Use eigrp pointer passed in instead of looking it up,
additionally we should actually look at the correct
access list.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
Add the RMAP_COMPILE_SUCCESS and switch over to using it.
Refactoring allows a removal of a if statement to just
use the switch statement already in place. Additionally
the reworking cleans up memory freeing in a couple of spots.
In one spot we no longer will leak memory too.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
1) Handle key value not found on interface
2) Handle various NULL pointer possibilities
3) Fix possible integer overflow
4) Fix memory leak
5) Check return codes on sscanf
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
The distance comparison for when we received an
internal and we already had an internal was
overriding the metrics of the connected.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
There exists a case where a switch already has
a eigrp_prefix_entry for a interface that is
coming up.
In this situation, we need to use the FSM
to let the connected route take precedence
instead of blindly just updating the world
about it.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
If the new nexthop is external while the previous
best was Internal or Connected, it should always loose.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
We need to eventually be able to handle multiple
data types to figure out if the distance is better
worse.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
The FSM was never freeing the msg. Since we
do not have a special queue for it, just don't
allocate the memory. In the future we can put
this back.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
EIGRP was not handling split-horizon. This code starts
down the path of properly considering it. There still
exists situations where we are not properly handling it
though.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
Some differences compared to the old API:
* Now the redistributed routes are sent using address-family
independent messages (ZEBRA_REDISTRIBUTE_ROUTE_ADD and
ZEBRA_REDISTRIBUTE_ROUTE_DEL). This allows us to unify the ipv4/ipv6
zclient callbacks in the client daemons and thus remove a lot of
duplicate code;
* Now zebra sends all nexthops of the redistributed routes to the client
daemons, not only the first one. This shouldn't have any noticeable
performance implications and will allow us to remove an ugly exception
we had for ldpd (which needs to know all nexthops of the redistributed
routes). The other client daemons can simply ignore the nexthops if
they want or consult just the first one (e.g. ospfd/ospf6d/ripd/ripngd).
Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
When an external route is received, eigrpd will crash. For now,
quietly discard the TLV. Work must be done to handle tlv
processing and changes needed to FSM so it understands an
external should not be chooses if an internal exist.
Signed-off-by: Donnie Savage <diivious@hotmail.com>
Send to our peer the major/minor version of FRR that we are
working with. I decided to use FRR instead of the os major/minor
because the os itself doesn't tell you what version of EIGRP
you are actually using.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
Modify code to allow the eigrp_update_send function to
recognize that we have a full packet and to do the right
thing from there.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
When we send packets to a nbr, make a duplicate copy
as that each packet sent is assumed to be a complete
to itself.
Also clean up indentation in loop over figuring out
what to send.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
When we generate update packets to go to our neighbor, Only
put one packet at a time on the send queue.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
When we have received an ack for the last reliable
packet we must only put 1 packet onto the send
queue.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
The FIFO really was a LIFO for some reason.
Push new packets onto the top, always pull from the bottom.
This allows eigrp neighbors to come up. Topotests
eigrp-topo1( in a topotest PR ) now form neighbors
with itself. With this commit.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
Change all callers of IPV4_ADDR_SAME() to pass a pointer to a struct in_addr
Use assignment and comparison instead of memcpy() and memcmp(). Avoids function
calls. Faster.
Signed-off-by: Jorge Boncompte <jbonor@gmail.com>
EIGRP schedules and builds packets to send in the future.
Before those packets are being sent, we are receiving
update information from our peer. At that time we
need to reach into the built packet and reset the
outgoing ack to a better value.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
Store the neighbor information( if available ) in the packet
data that we are sending. This will allow in a future commit
the ability to fixup the outgoing ack we are sending.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
Cleanup eigrp_topology_update_distance to
return an enum of whether or not the metric
has changed or not.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This allows modules to register their own additional hooks on interface
creation/deletion.
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>