| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The objective is to (as gracefully as possible) deal with outgoing UPDATE
messages which simply do not in the maximum size BGP message. This can
happen if very large AS_PATH or Community attributes come in, and are
then extended. (Sending an UPDATE to an AS2 speaking peer can create
a complete second copy of the AS_PATH !) Previous versions of Quagga
would crash under these circumstances.
Recent version were changed to tolerate and detect oversize messages.
Any oversize message is logged as an error and discarded.
This version will also withdraw prefixes if the selected route simply
cannot be advertised.
This version also corrects the handling of messages which are limited to
the maximum BGP message size -- in particular UPDATE messages which
carry a large number of IPv4/Unicast prefixes. (This was broken by the
earlier efforts to handle oversize messages.)
Changes in this commit:
* update version to 0.99.20ex24b
* where a set of attributes is too big to fit into a BGP message, or
so big that not even one prefix will also fit into a BGP message,
the following steps are now taken:
- the BGP message is discarded and an error logged (as in other
recent versions -- Quagga does not crash).
- any prefixes which should have been advertised with the (broken)
attributes will be withdrawn, if they have been advertised earlier
with valid attributes.
A further error is logged, listing the affected prefixes.
- prefixes which are suppressed in this way are not counted as
having been sent.
At present there is no "show" command which will show which prefixes have
been suppress -- TBA.
* for all AFI/SAFI announce as many withdrawn prefixes as will fit in a
BGP message.
Previously, all AFI/SAFI other than IPv4/Unicast would send one withdrawn
prefix per message.
(This is still the case for announcements. It seems unlikely that
many IPv6 prefixes will have the same attributes... so this does not
seem worth fixing immediately.)
* ensure that NOTIFICATION message cannot exceed the maximum length of a
BGP message, no matter how much data is sent (!).
* where IPv4/Unicast prefixes share the same attributes, they are now
announced in the order received.
Previously, when prefixes were added to the list hung off the
'struct bgp_advertise_attr', they were in LIFO order.
* add SAFI name table.
* log pthread attributes when creating a pthread.
* fix scheduling of withdrawn prefixes to reduce number of BGP messages
generated.
Bug fixes:
* fix discard of invalid IPv6 link-local nexthop (recent bug).
* where amount of information that is put into a BGP message is limited by
the maximum message size, fix so that this works again. (This was
broken recently.)
* set "Bottom of Stack" bit in MPLS VPN "tag" in MP_REACH and MP_UNREACH
outgoing attributes.
|
|
|
|
|
|
|
|
|
| |
Changed order of initialisation, so that pthread_getcpuclockid() is
done *after* has daemonised. It seems that the clockid for the
main pthread before daemonisation is not the same as the clockid
for the same pthread after !
Removed configure-quagga which had somehow leaked out.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Error handling now:
* gives name of mutex when fails.
* if clock_gettime() fails, this is fatal for CLOCK_REALTIME
and CLOCK_MONOTONIC (as before) but not for any other
clock (new behaviour).
* log errors (and other anomalies) in pthread_getcpuclockid(),
but do not abort.
Remove a couple of warnings about variable "format" values for
printf-like functions.
Fix bug in new vtysh/extract.pl -- change mechanics of extracting
CMD_INSTALL_TABLE entries, so that deals better with #if etc
between entries.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
gcc 4.6.1 picked up a couple of (spurious) "may be used unitialised"
variables -- fixed.
For reasons unknown FreeBSD unistd.h declares
_POSIX_THREAD_SAFE_FUNCTIONS as -1... which tripped a CONFIRM().
_POSIX_SPIN_LOCKS is declared 200112, and according to POSIX-2004
_POSIX_SPIN_LOCKS => _POSIX_THREAD_SAFE_FUNCTIONS -- so it is a
bit of a surprise (though the statement in POSIX is in the context
of support for "Advanced Realtime Threads", which includes
_POSIX_SPIN_LOCKS)... Recast to warn instead of generate
compilation error.
Fixed test-prefix.c to work with uint8_t sa_family_t !
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Added -W command line argument to bgpd to start watch-dog:
-W99[,[+]path]
where: 99 is the watch-dog interval, eg. 2 or 5
path is file that watch-dog writes to -- default is
stderr.
if '+' is given, will append to the file.
Watch-Dog looks out for:
* not being woken up when expected.
* CLOCK_REALTIME and CLOCK_MONOTONIC not advancing together.
* pthreads stalling.
* mutexes being locked for long periods.
* CPU consumption by each pthread in each watch-dog interval.
If pthreads are locking up or going into a flat spin, the
Watch-Dog should spot it.
Pro tem: outputs pthread properties to stderr at start-up.
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Turns out that _POSIX_REENTRANT_FUNCTIONS is not a POSIX feature
test macro... name notwithstanding.
It appears to be quite well known, but in some cases appears to be a
feature request, and in others a feature test :-( So, since it adds
no value -- and breaks FreeBSD -- the CONFIRM is removed.
Further work in progress for Watch-Dog -- all known mutexes are held
in an all known mutexes list, complete with name of mutex for diagnostic
purposes.
|
|
|
|
|
|
|
|
| |
FreeBSB has not heard of clock_nanosleep(). Happily it has heard
of nanosleep() -- from POSIX-2001.
Recast code to expect nanosleep() and removed glibc feature test
macros.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
For "debug bgp update out" log the dispatch of UPDATE messages by
the BGP Engine -- so the logging shows what the Routing Engine
decided to send, and the BGP Engine show what was actually written
away.
[In passing, in bgp_connection_write_action() treat a zero return
from write() and an EAGAIN/EWOULDBLOCK.]
Watch-Dog now tracks the CPU utilisation for each nexus, and checks
that each one runs at least once between watch-do runs.
The pthread_getcpuclockid() may or may not be supported, and that
must be determined at run-time. So, some changes made to the
qlib_init_first_stage() to capture this.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
-Wunused-but-set-variable throws up a number of errors, this patch
removes some of thos in bgpd, lib and zebra.
Fix crash in vty when using ">*" /dev/null output pipe.
Work in Progress (WIP):
1) adding "Watch-Dog" pthread to keep an eye on all other pthreads
and state of mutexes etc.
2) creation of Integrated Configuration in vtysh.
|
|
|
|
|
|
|
| |
Avoids gcc-ism and replaces passing 16 byte structure by passing address
of same. Compiled code appears very similar to previous state.
Fixed all calls of ip6_masklen() to suit.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The "misc.h" #includes <features.h> because that was found to give consistent
values for the many macros that control GNU, many flavours of POSIX, and
Standard C/C99 library behaviour -- for glibc.
Sadly, this broke compilation where <features.h> is absent, ie when glibc is
not used.
To fix this made changes to configure.ac to create HAVE_FEATURES_H, so that
the #include can be skipped.
At the same time, added AC_FUNC_STRERROR_R and removed the *horrible* kludge
which to date has supported use of strerror_r.
Tidied up and re-tested use of strerror_r().
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* lib/memory.c, show_memory_summary_info()
Call of mem_mt_get_stats() (under HAVE_MALLINFO skip) needed
an extra parameter.
* lib/vty_io.c
POSIX standard header for wait stuff is <sys/wait.h>
* lib/vty_io_file.c, uty_pipe_exec_prepare()
F_DUPFD_CLOEXEC is POSIX-2008 (Issue 7) but FreeBSD 9.0 is not.
Since this is not vital, recast slightly to avoid the need.
* /lib/vty_io_vtysh.c, sock_unix_set_path()
Fix complete nonsense under HAVE_STRUCT_SOCKADDR_UN_SUN_LEN skip.
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
C99 requires uint64_t, so seems reasonable to use those where possible.
Reduces most IPv6 functions to operations on one or two 64-bit parts.
For native 32-bit processors, we leave it to the compiler to optimise the
operation on pairs of 32-bit values -- and look forward to such processors
being phased out.
For maximum performance requires a __builtin_bswap64() or equivalant to be
added.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
A few instructions are probably better than a large table and
cache misses.
Uses __builtin_clz() if __GNUC__ or ffs() if not.
Handling IPv6 addresses as four uint32_t improves some code and
allows some code sharing between IPv4 and IPv6.
Updated test-prefix.c to test apply_mask_ipv4() and
apply_mask_ipv6() which were affected by these changes, and added
more random trailing rubbish for the test of test_prefix_common_bits()
which is more sensitive to that if not __GNUC__.
Under -Os gcc may not inline some functions if they are used often
enough -- even when explicitly declared inline. You have to be
firm with it and use __attribute__((always_inline)).
|
|\
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
v0.99.20ex23b -- Quagga 'master' as at 23-Mar-2012
Conflicts:
bgpd/bgp_attr.c
bgpd/bgp_attr.h
Difference between 'master' and 0.99.20.1 is in these files.
Handling of attributes has been worked over again to common up
checks of the flags, and to use a common parsing structure,
which reduces the clutter of parameters for the individual
attribute parsing functions.
bgpd/bgp_open.c
bgpd/bgp_packet.c
lib/thread.c
ospfd/ospf_packet.c
These were artifacts, caused by common patches in master and
0.99.20.1 -- and some twitchy-ness about whitespace !
|
| |
| |
| |
| |
| | |
Protocol version checks fits ospf_packet_examin() better (like it is
implemented in ospf6d), and packet type check is already there.
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
The old ospf_check_auth() function did two different jobs depending on
AuType. For Null and Simple cases it actually authenticated the packet,
but for Cryptographic case it only checked declared packet size (not
taking the actual number of bytes on wire into account). The calling
function, ospf_verify_header(), had its own set of MD5/checksum checks
dispatched depending on AuType.
This commit makes the packet size check work against the real number of
bytes and moves it to ospf_packet_examine(). All MD5/checksum
verification is now performed in ospf_check_auth() function.
* ospf_packet.c
* ospf_packet_examin(): check length with MD5 bytes in mind
* ospf_verify_header(): remove all AuType-specific code
* ospf_check_auth(): completely rewrite
|
| | |
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
An OSPFv2 packet with trailing data blocks (authentication and/or
link-local signaling) failed the recently implemented packet length
check, because trailing data length isn't counted in the packet header
"length" field. This commit fixes respective check conditions.
* ospf_packet.c
* ospf_packet_examin(): use "bytesdeclared" instead of "bytesonwire"
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
This commit ports more packet checks to OSPFv2, in particular, LSA size
verification and Router-LSA link blocks verification.
* ospf_lsa.h: add LSA size macros
* ospf_packet.h: add struct ospf_ls_update
* ospf_packet.c
* ospf_lsa_minlen[]: a direct equivalent of ospf6_lsa_minlen[]
* ospf_router_lsa_links_examin(): new function, verifies trailing
part of a Router-LSA
* ospf_lsa_examin(): new function like ospf6_lsa_examin()
* ospf_lsaseq_examin(): new function like ospf6_lsaseq_examin()
* ospf_packet_examin(): add type-specific deeper level checks
|
| |
| |
| |
| |
| | |
Rewrite some pointer arithmetics without the additional variables and
move byte order conversion inside the function.
|
| |
| |
| |
| |
| |
| |
| |
| |
| | |
1. The only purpose of "ibuf" argument was to get stream size, which
was always equal to OSPF_MAX_PACKET_SIZE + 1, exactly as initialized
in ospf_new().
2. Fix the packet size check condition, which was incorrect for very
large packets, at least in theory.
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
This commit ports some of the OSPFv3 packet reception checks
to OSPFv2.
* ospf_packet.c
* ospf_packet_minlen[]: a direct equivalent of ospf6_packet_minlen[]
* ospf_packet_examin(): new function designed after the first part
of ospf6_packet_examin()
* ospf_read(): verify received packet with ospf_packet_examin()
* ospf_packet.h: add convenience macros
|
| | |
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
* ospf_packet.h: add proper str/max extern declarations
* ospf_packet.c
* ospf_packet_type_str: rewrite in "struct message", add max value
* ospf_packet_add(): use LOOKUP()
* ospf_write(): ditto
* ospf_hello(): ditto
* ospf_read(): ditto
* ospf_dump.h: the declaration does not belong here
* ospf_dump.c
* ospf_header_dump(): use LOOKUP()
* show_debugging_ospf(): ditto
|
| |
| |
| |
| |
| | |
* basic.texi: @asis isn't legal with @itemize apparently, should be @w
according to docs, but @w{} seems to be needed. Fixes doc build error.
|
| |
| |
| |
| |
| |
| |
| | |
* configure.ac: Check for latexmk and pdflatex
* Makefile.am: Add a conditional target to build HACKING.pdf, as a convenience
* HACKING.tex: A slightly more structured HACKING, is readable on its own.
* HACKING: removed
|
| | |
|
| | |
|
| |\ |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
* bgp_packet.c: (bgp_open_receive) Errors from bgp_open_option_parse are
detected, and the code will stop processing the OPEN and return. However
it does so without calling bgp_notify_send to send a NOTIFY - which means
the peer FSM doesn't get stopped, and bgp_read will be called again later.
Because it returns, it doesn't go through the code near the end of the
function that removes the current message from the peer input streaam.
Thus the next call to bgp_read will try to parse a half-parsed stream as
if it were a new BGP message, leading to an assert later in the code when
it tries to read stuff that isn't there. Add the required call to
bgp_notify_send before returning.
* bgp_open.c: (bgp_capability_as4) Be a bit stricter, check the length field
corresponds to the only value it can be, which is the amount we're going to
read off the stream. And make sure the capability flag gets set, so
callers can know this capability was read, regardless.
(peek_for_as4_capability) Let bgp_capability_as4 do the length check.
|
| | |
| | |
| | |
| | |
| | | |
* tools/multiple-bgpd: Make PREV more general and correct. Add comment
to route-map about why rt/soo sets are there - cause it's still broken.
|
| | | |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
* bgp_attr.h: (struct bgp_attr_parser_args) Attribute parsing context,
containing common arguments.
* bgp_attr.c: (general) Move the bgp_attr_flag_invalid flag-check calls up,
out of each individual attr parser function, to be done once in attr_parse.
Similarly move the calculation of the 'total' attribute length field up
to attr_parse.
Bundle together common arguments to attr-parsing functions and helpers
into (struct bgp_attr_parser_args), so it can be passed by reference down
the stack & also de-clutter the argument lists & make it easier to
add/modify the context for attr-parsing - add local const aliases to avoid
modifying body of code too much. This also should help avoid cut & paste
errors, where calls to helpers with hard-coded attribute types are pasted
to other functions but the code isn't changed.
(bgp_attr_flags_diagnose) as above.
(bgp_attr_flag_invalid) as above.
(bgp_attr_{origin,aspath,as4_path,nexthop,med,local_pref,atomic}) as above.
(bgp_attr_{aggregator,as4_aggregator,community,originator_id}) as above
(bgp_attr_{cluster_list,ext_communities},bgp_mp_{un,}reach_parse) as above
(bgp_attr_unknown) as above.
(bgp_attr_malformed) as above. Also, startp and length have to be
special-cased, because whether or not to send attribute data depends
on the particular error - a separate length argument, distinct from
args->length, indicates whether or not the attribute data should be sent
in the NOTIFY.
(bgp_attr_aspath_check) Call to bgp_attr_malformed is wrong here, there is
no attribute parsing context - e.g. the 'flag' argument is unlikely to be
right, remove it. Explicitly handle the error instead.
(bgp_attr_munge_as4_attrs) Flag argument is pointless.
As the comment notes, the check here is pointless as AS_PATH presence
already checked elsewhere.
(bgp_attr_parse) Do bgp_attr_flag_invalid call here.
Use (struct bgp_attr_parser_args) for args to attr parser functions.
Remove out-of-context 'flag' argument to as4 checking functions.
|
| |/
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
* bgpd/bgp_attr.c: (attr_flags_values []) array of required flags for
attributes, EXTLEN & PARTIAL masked off as "dont care" as appropriate.
(bgp_attr_flag_invalid) check if flags may be invalid, according to
the above table & RFC rules.
(bgp_attr_*) Use bgp_attr_flag_invalid.
(bgp_attr_as4_aggregator) ditto, also take startp argument for the
NOTIFY data.
(bgp_attr_parse) pass startp to bgp_attr_as4_aggregator
|
| |
| |
| |
| |
| |
| | |
* thread.c: (thread_timer_process,thread_process) thread_list_delete nulls
thread->next. Loops need to save next first, or will only process the head.
Problem noted by Lou Berger <lberger@labn.net>.
|
|\ \
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
v0.99.20ex22b
Conflicts:
bgpd/bgp_open.c
bgpd/bgp_packet.c
The bpp_open.c code has been replaced by code in bgp_open_state.c, so
these changes have no effect on the euro_ix branch, which already
rejects invalid OPEN with a NOTIFY.
Otherwise:
modified: ospfd/ospf_dump.c
modified: ospfd/ospf_dump.h
modified: ospfd/ospf_lsa.h
modified: ospfd/ospf_packet.c
modified: ospfd/ospf_packet.h
|
| | |
| | |
| | |
| | | |
* configure.ac: Bump to 0.99.20.1
|
| | |
| | |
| | |
| | |
| | | |
Protocol version checks fits ospf_packet_examin() better (like it is
implemented in ospf6d), and packet type check is already there.
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
The old ospf_check_auth() function did two different jobs depending on
AuType. For Null and Simple cases it actually authenticated the packet,
but for Cryptographic case it only checked declared packet size (not
taking the actual number of bytes on wire into account). The calling
function, ospf_verify_header(), had its own set of MD5/checksum checks
dispatched depending on AuType.
This commit makes the packet size check work against the real number of
bytes and moves it to ospf_packet_examine(). All MD5/checksum
verification is now performed in ospf_check_auth() function.
* ospf_packet.c
* ospf_packet_examin(): check length with MD5 bytes in mind
* ospf_verify_header(): remove all AuType-specific code
* ospf_check_auth(): completely rewrite
|
| | | |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
An OSPFv2 packet with trailing data blocks (authentication and/or
link-local signaling) failed the recently implemented packet length
check, because trailing data length isn't counted in the packet header
"length" field. This commit fixes respective check conditions.
* ospf_packet.c
* ospf_packet_examin(): use "bytesdeclared" instead of "bytesonwire"
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
This commit ports more packet checks to OSPFv2, in particular, LSA size
verification and Router-LSA link blocks verification.
* ospf_lsa.h: add LSA size macros
* ospf_packet.h: add struct ospf_ls_update
* ospf_packet.c
* ospf_lsa_minlen[]: a direct equivalent of ospf6_lsa_minlen[]
* ospf_router_lsa_links_examin(): new function, verifies trailing
part of a Router-LSA
* ospf_lsa_examin(): new function like ospf6_lsa_examin()
* ospf_lsaseq_examin(): new function like ospf6_lsaseq_examin()
* ospf_packet_examin(): add type-specific deeper level checks
|
| | |
| | |
| | |
| | |
| | | |
Rewrite some pointer arithmetics without the additional variables and
move byte order conversion inside the function.
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
1. The only purpose of "ibuf" argument was to get stream size, which
was always equal to OSPF_MAX_PACKET_SIZE + 1, exactly as initialized
in ospf_new().
2. Fix the packet size check condition, which was incorrect for very
large packets, at least in theory.
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
This commit ports some of the OSPFv3 packet reception checks
to OSPFv2.
* ospf_packet.c
* ospf_packet_minlen[]: a direct equivalent of ospf6_packet_minlen[]
* ospf_packet_examin(): new function designed after the first part
of ospf6_packet_examin()
* ospf_read(): verify received packet with ospf_packet_examin()
* ospf_packet.h: add convenience macros
|
| | | |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
* ospf_packet.h: add proper str/max extern declarations
* ospf_packet.c
* ospf_packet_type_str: rewrite in "struct message", add max value
* ospf_packet_add(): use LOOKUP()
* ospf_write(): ditto
* ospf_hello(): ditto
* ospf_read(): ditto
* ospf_dump.h: the declaration does not belong here
* ospf_dump.c
* ospf_header_dump(): use LOOKUP()
* show_debugging_ospf(): ditto
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
* bgp_packet.c: (bgp_open_receive) Errors from bgp_open_option_parse are
detected, and the code will stop processing the OPEN and return. However
it does so without calling bgp_notify_send to send a NOTIFY - which means
the peer FSM doesn't get stopped, and bgp_read will be called again later.
Because it returns, it doesn't go through the code near the end of the
function that removes the current message from the peer input streaam.
Thus the next call to bgp_read will try to parse a half-parsed stream as
if it were a new BGP message, leading to an assert later in the code when
it tries to read stuff that isn't there. Add the required call to
bgp_notify_send before returning.
* bgp_open.c: (bgp_capability_as4) Be a bit stricter, check the length field
corresponds to the only value it can be, which is the amount we're going to
read off the stream. And make sure the capability flag gets set, so
callers can know this capability was read, regardless.
(peek_for_as4_capability) Let bgp_capability_as4 do the length check.
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
* bgp_peer_index
replace unused bgp_peer_index_reset() by bgp_peer_index_finish()
and call same at bgp shut-down.
discard unused bgp_peer_index_mutex_free() and replace
bgp_peer_index_mutex_init() by bgp_peer_index_init_r().
* lib/command.c and command_parse.c
add cmd_parser_finish() to discard store of "words" and arrange to
call same in cmd_table_terminate().
* reset vector of files in qps_selection_ream(), so that frees the
vector body -- which it should have been doing !
* add mem_mt_show_stderr() for debug (for all the use it may be).
* fix qpt_mutex_destroy(), qpt_cond_destroy() and qpt_spin_destroy()
so that if fail when !qpthreads_active will log the error (and not
crash). Sweeps issues under the carpet, but does not hide same.
|