Age | Commit message (Collapse) | Author |
|
* bgp_packet.c: (bgp_notify_receive) justify the difference between
BGP_NOTIFY_OPEN_UNSUP_PARAM and BGP_NOTIFY_OPEN_UNSUP_CAPBL cases, as
it is explained in RFC5492, page 3, paragraph 1.
"Unsupported Capability" error does not mean, that the peer doesn't
support capabilities advertisement -- quite the opposite (if the peer
would not support capabilities advertisement, the code would be
"Unsupported Optional Parameter"). Thus there is no reason to mark
the peer as one non-supporting capabilities advertisement.
Example: suppose the peer is in fact IPv6-only, but we didn't configure
anything address-family specific for it. Then, the peer would refuse
the session with "Unsupported Capability" code. If we internally set
the peer as non-supporting capabilities advertisement after that, we
will not be able to establish the session with it ever, even with a
fixed configuration -- IPv6-only BGP session cannot be established
without capabilities.
In practice an edge case would be seen as the same IPv6 peer working
with its "neighbor" block read from bgpd.conf, but not working, when
slowly input in "conf t" mode.
|
|
* ospf6_spf.c: Don't replace a node with another node with a lower
number of hops, instead get them from the queue in the correct
order. (Actually, the replacement crashed the ospf6d daemon
rather than worked.)
|
|
* ospf_lsa.h: (struct ospf_lsa) remove oi pointer
* ospf_lsa.c: (ospf_network_lsa_refresh) instead of keeping a pointer, just
lookup the oi when it's needed. This decouples network LSA from oi lifetime
and avoids having to invalidate pointers in LSAs when an oi changes,
simplifying the code.
|
|
* ospf_lsa.c: (various) unregister LSAs from refresher before flushing.
|
|
2006-05-30 Paul Jakma <paul.jakma@sun.com>
* (general) Fix confusion around MaxAge-ing and problem with
high-latency networks. Analysis and suggested fixes by
Phillip Spagnolo, in [quagga-dev 4132], on which this commit
expands slightly.
* ospf_flood.{c,h}: (ospf_lsa_flush) new function.
Scope-general form of existing flush functions, essentially
the dormant ospf_maxage_flood() but without the ambiguity of
whether it is responsible for flooding.
* ospf_lsa.c: (ospf_lsa_maxage) Role minimised to simply setup
LSA on the Maxage list and schedule removal - no more.
ospf_lsa_flush* being the primary way to kick-off flushes
of LSAs.
Don't hardcode the remover-timer value, which was too
short for very high-latency networks.
(ospf_maxage_lsa_remover) Just do what needs to be done to
remove maxage LSAs from the maxage list, remove the call
to ospf_flood_through().
Don't hardcode remove-timer value.
(ospf_lsa_{install,flush_schedule}) ospf_lsa_flush is the correct
entrypoint to flushing maxaged LSAs.
(lsa_header_set) Use a define for the initial age, useful for
testing.
* ospf_opaque.c: (ospf_opaque_lsa_refresh) ditto.
(ospf_opaque_lsa_flush_schedule) ditto.
* ospfd.h: ({struct ospf,ospf_new}) Add maxage_delay parameter,
interval to wait before running the maxage_remover. Supply a
suitable default.
Add a define for OSPF_LSA_INITIAL_AGE, see lsa_header_set().
|
|
* (general) Get rid of the router and network LSA specific refresh timers
and make the general refresher do this instead. Get rid of the twiddling
of timers for router/network LSA that was spread across the code.
This lays the foundations for future, general LSA refresh improvements,
such as making sequence rollover work, and having generic LSA delays.
* ospfd.h: (struct ospf) Bye bye to the router-lsa update timer thread
pointer.
(struct ospf_area) and to the router-lsa refresh timer.
* ospf_interface.h: Remove the network_lsa_self timer thread pointer
* ospf_lsa.h: (struct ospf_lsa) oi field should always be there, for benefit
of type-2/network LSA processing.
(ospf_{router,network}_lsa_{update_timer,timer_add}) no timers for these
more
(ospf_{router,network}_lsa_update) more generic functions to indicate that some
router/network LSAs need updating
(ospf_router_lsa_update_area) update router lsa in a particular area alone.
(ospf_{summary,summary_asbr,network}_lsa_refresh) replaced by the general
ospf_lsa_refresh function.
(ospf_lsa_refresh) general LSA refresh function
|
|
* ospf_interface.h: (struct ospf_if_params) add field for saved network LSA
seqnum
* ospf_interfa.c: (ospf_new_if_params) init network_lsa_seqnum field to
initial seqnum - doesnt matter though.
* ospf_lsa.c: (ospf_network_lsa_new) check for any saved sequence number,
and use if it exists. Save the result back. This should help avoid needless
round of LSUpdate/LSRequests when a neighbour has to tell the originator
"uhm, i have something newer than that already".
* ospf_vty.c: (show_ip_ospf_interface_sub) Show the saved network LSA seqnum
|
|
* It's possible for the packet output buffer to be filled up with a long
series of non-Hello packets in between Hellos packets, such that the
router's neighbours don't receive the Hello packet in time, even though
the hello-timer ran at about the right time. Fix this by prioritising
Hello packets, letting them skip the queue and go ahead of any packets
already on the queue.
This problem can occur when there are lots of LSAs and slow links.
* ospf_packet.h: (ospf_hello_send_sub) not used outside of ospf_packet.c
* ospf_packet.c: (ospf_fifo_push_head) add packet to head of fifo (so its
no longer really a fifo, but hey)
(ospf_packet_add_top) add packet to top of the packet output queue.
(ospf_hello_send_sub) Put Hello's at the top of the packet output queue.
make it take in_addr_t parameter, so that this
ospf_hello_send can re-use this code too.
(ospf_hello_send) consolidate code by using ospf_hello_send_sub
(ospf_poll_send,ospf_hello_reply_timer) adjust for ospf_hello_send_sub.
|
|
* The hello protocol monitors connectivity in 2 different ways:
a) local -> remote
b) remote -> local
Connectivity is required in both directions (2-way) for adjacencies to
form.
The first requires a round-trip to detect, and is done by advertising
which other hosts a router knows about in its hello messages. This allows
a host to detect which other routers are and are not receiving its
message. If a remote neighbour delists the local router, then the local
router raises a "1-Way Received" event.
The latter is straight-forward, and is detected by setting a timer for the
neighbour. If another Hello packet is not received within this time then
the neighbour is dead, and a separate "Inactive" event is raised.
These are 2 different and relatively independent measures.
Knowing that we can optimise the 2nd, remote->local measure and reset
the timer when /any/ packet arrives from that neighbour. For any packet
is as good as a Hello packet. This can help in marginal situations, where
the number of protocol messages that must be sent sometimes can exceed
the capacity of the network to transmit the messages within the configured
dead-time. I.e. an OSPF network with lots of LSAs, slow links and/or
slow hosts (e.g. O(10k) LSAs, O(100kbit) links, embedded CPUs, and O(10s)
dead-times).
This optimisation allows an OSPF network to run closer to this margin,
and/or allows networks to perhaps better cope with rare periods of
exceptional load, where otherwise they would not.
It's fully compatible with plain OSPF implementations and doesn't
prejudice dead-neighbour detection.
* ospf_nsm.h: Rename HelloReceived event to PacketReceived.
* ospf_nsm.c: (nsm_hello_received) -> nsm_packet_received
* ospf_packet.c: Schedule PacketReceived whenever a valid message is
received.
|
|
|
|
* ospf_ase.c: (ospf_ase_calculate_route) Fix compiler warning about eval
needing brackets.
(various) add defensive asserts.
* ospf_lsdb.c: (ospf_lsdb_add) add missing node unlock if same lsa already
was indexed.
(ospf_lsdb_delete) check it's actually the same as specified lsa before
deleting
(ospf_lsdb_lookup_by_id_next) fix another corner case - no result =>
don't go on.
|
|
* ospf_lsa.c: (ospf_lsa_refresh_walker) fix an "unlock before use" bug
(various) add asserts for lsa refcounting.
|
|
* ospf_interface.c: (ospf_if_{new,cleanup}) don't touch the network_lsa_self,
ISM and NSM take care of cleaning it up if needs be + we want to keep
network_lsa_self around when possible for the the seqnum.
This shouldn't really make much difference though, particularly as we have
a separate sequence number memory mechanism.
|
|
* ospf_packet.c: (ospf_ls_upd) the corresponding test on the arrival side
in (ospf_flood) is <, so this should be >=, not >, purely for consistency.
There is no practical effect here though.
|
|
* ospf_interface.c: (ospf_if_free) events with dangling pointers left
scheduled can be seriously bad for ospfd's health. Cancel the event.
|
|
* ospf_{ism,network}.c: Certain oft-repeated but trivial messages should be
debug log level, not info, to avoid spamming 'terminal monitor'
|
|
* lib/table.c: (route_node_match) fix overshoot that was causing this
function to go 1 bit too far and thus reading past end of prefix.
(route_node_lookup) be defensive - don't assume others will clean up
leaves when removing info.
|
|
* lib/prefix.c: (prefix_match) nano-optimisation, let it return early
without copying pointers.
|
|
* workqueue.c: (work_queue_run) Err more on the side of keeping granularity
down, by being more conservative about increasing it.
Also, fix mispelling.
|
|
* (general) this can be useful when investigating thread latency problems,
when you don't want to have to restart a daemon between tests.
* thread.c: (cpu_record_(hash_)clear) wipe the stored thread cpu history
data, according to the filter, similar to the vty print code.
(clear_thread_cpu_cmd) new command to clear data.
* thread.h: export new command
* command.c: install it
|
|
* thread.c: (thread_fetch) the current scheduler will service events
indefinitely, ignoring I/O and timers, so long as there are events.
In other words, events can crowd out I/O and timers. In theory this
shouldn't be a huge problem as events are generated only by timers
and I/O, however in practice it means normal-load behaviour is not as
useful a predictor of high-load behaviour as it should be.
Fix this by considering all the kinds of threads, in every run of the
scheduler. For any given run, we prioritise events, however across
runs the scheduler should be fair.
This has been observed to give more stable inter-packet times in
testing of ospfd (i.e. lower std-dev).
(thread_process) new heler to queue all the given threads onto the ready
list
|
|
* thread.h: (struct cpu_thread_history.funcname) malloc gets called on this
so it should not be const
* thread.c: (cpu_record_print) cast the (const char *) to (char *), this
function knows what it's doing (free wont be called on it).
|
|
* bgp_route.c: (bgp_process_queue_init) rsclient wasn't getting all the
same things initialised as the main queue. Simplify to make it more robust.
|
|
* bgp_vty.c: (community_list_perror, show_ip_community_list_arg,
show_ip_extcommunity_list_arg) fix spelling
|
|
* HACKING: Express notion that a published git repository is
preferred. Fold request for commit message into patch section.
Express desire for comments in code explaining correctness of
post-commit state, and for commit message to explain correctness of
the change.
|
|
HACKING: Whitespace changes only.
|
|
Note 54/72 line length rules, and that this is intended to play nice
with "git log --oneline".
|
|
Tom's repo is now a clone of the official repo and has an mttr branch
off of 0.99.17.
|
|
* bgp_route.c: (route_vty_out_detail) calculate time value
in a way, which works regardless of monotonic clock
being used or not
|
|
If router-id is not specified in ospf6d.conf, ospf6d will get it from
the zebra daemon. But ospf6d originates Link LSAs before the router-id
is returned by zebra, thus this router's Link LSAs will be flooded
with AdvRouter set to 0.
* zclient.c: zclient_start(): send ZEBRA_INTERFACE_ADD message after
ZEBRA_ROUTER_ID_ADD, not before
|
|
* bgpd/bgp_attr.c, bgpd/bgp_open.h, bgpd/bgp_route.c, lib/prefix.c,
lib/prefix.h: Various integer types were being used where, if we
had strict type checking, afi_t and safi_t would be required.
Signed-off-by: G.Balaji <balajig81@gmail.com>
(cherry picked from commit c8af35ffa2dc79ff7d7ff00b1b61f1f50a100ab6)
|
|
|
|
Signed-off-by: G.Balaji <balajig81@gmail.com>
|
|
lib/memory.c:z{a,c,re}alloc, zfree, zdup: add requires/effects
comments.
|
|
Balaji has been accumulating patches from the mailing list and
pre-screening them and spiffing up commit messages.
|
|
bgpd/bgp_packet.c:bgp_update_packet(): When extracting the peer, don't
fail to extract it because "binfo->extra" is NULL. While one should
certainly avoid dereferencing binfo->extra, that's not a good reason
not to use binfo->peer.
Fixes https://bugzilla.quagga.net/show_bug.cgi?id=497.
Patch by Eric Sobocinksi.
|
|
This looks like a bug in original code from misunderstanding
of C rules of evaluation.
|
|
* configure.ac: bump up version number
|
|
* bgpd/bgp_aspath.c
* assegments_parse(): add handling of AS4_PATH input, update bounds
checks, add check for AS segment type
* aspath_parse(): add handling of AS4_PATH input, expect
assegments_parse() to do length checking
* aspath_empty(): update for the new function prototype
* bgpd/bgp_aspath.h: ditto
* tests/aspath_test.c: ditto
* bgpd/bgp_attr.c
* bgp_attr_aspath(): add handling of AS4_PATH input, update flags
checks, change returned type
* bgp_attr_as4_path(): discard, superseded by bgp_attr_aspath()
* bgp_attr_parse(): update respectively
|
|
* bgp_packet.c: (bgp_route_refresh_receive) add validation of
"Length" (RFC5292) field value, check input stream bounds
each time bytes are pulled from it
|
|
|
|
When deleting a VLAN interface after flushing its
addresses, zebra uses 100% CPU time and freezes.
* interface.c: The while loop in line 407 that
should clean up connected routes never hits one
of the 2 lines "last = node;" and thus loops
forever.
Signed-off-by: Roman Hoog Antink <rha@open.ch>
|
|
|
|
these are autogenerated by autoreconf, drop them from git.
|
|
this fixes warnings from vtysh extract.pl by making sure the isis method
files always 'work'. (previously, extract.pl would grab unselected isis
method sources and then complain about missing headers)
|
|
startup-config
* ospf6_interface.c: When '[no] ipv6 ospf6 advertise prefix-list'
appears in the startup configuration for ospf6d, a crash occurs,
because ospf6d attempts to schedule LSAs when the 'oi->area'
structure has not yet been initialized.
Now, when the command above is issued (either in the startup
configuration or at runtime), ospf6d will only schedule LSAs if
the 'oi->area' structure has been initalized. A similar test is
already used when handling the commands 'ipv6 ospf6 priority'
and 'ipv6 ospf6 cost'.
|
|
|
|
* ospf_zebra.c: (ospf_distribute_list_update_timer) forces a
refresh of default route each time it finds a default prefix.
This is suboptimal, just record that it needs to be done and
do it once.
Signed-off-by: Joakim Tjernlund <Joakim.Tjernlund@transmode.se>
|
|
* ospf_zebra.c: (ospf_distribute_list_update_timer)
If there are updates to the distribute list every 5 second or less,
ospf_distribute_list_update_timer() will never run as the timer gets
rearmed for each update. This fixes it by never rearming an active
distribute list timer.
Signed-off-by: Joakim Tjernlund <Joakim.Tjernlund@transmode.se>
|
|
Roman Hoog Antink <rha@open.ch> reports:
When adding a connected route (using vtysh, without restart) to the
redistribution access list of ospfd, while static routes already exist,
the update timer ospf_distribute_list_update_timer() is being run for
static routes only. That way, the connected route never appears in the
OSPF database, until quagga is completely restarted.
The update timer for connected routes is cancelled in
ospfd/ospfd_zebra.c:ospf_distribute_list_update():976, were a new timer
is scheduled for static routes, caused by the loop in ospf_filter_update().
* ospf_zebra.c: (ospf_distribute_list_update_timer) make it
refresh all external routes. This fixes the problem
reported by Roman.
Signed-off-by: Joakim Tjernlund <Joakim.Tjernlund@transmode.se>
|