Chris Caputo [Tue, 2 Jun 2009 17:37:11 +0000 (18:37 +0100)]
[smux] 64-bit fix for lib/smux.h SNMP_INTEGER() macro
Macro SNMP_INTEGER() prepares data which is eventually processed
by asn_build_int(). SNMP_INTEGER() was using "int32_t" whereas
asn_build_int() uses "long". On 32-bit systems these are the
same, both 4 bytes, but on x86 64-bit systems "long" is 8 bytes.
asn_build_int()'s reaction to an improperly sized value is to return
a NULL pointer. Quagga's smux.c would eventually get this NULL
pointer and use it in calculations to determine how much data to send
over the smux connection, resulting in garbage being sent to the
SNMP agent.
Corrected SNMP_INTEGER() to use "long".
Tested on 32-bit and 64-bit x86 Linux 2.6.27.10 systems running
Quagga 0.99.11 with bgpd smux.
[ripd] Fix metrix in call to rip_zebra_ipv4_delete
Fix a potential problem (most probably not triggering a real problem, at
least on Linux). When an interface goes down and ripd tries to delete the
corresponding route it errorneously passes the interface's index instead of
the metric to zebra.
Steve Hill [Tue, 2 Jun 2009 13:28:16 +0000 (14:28 +0100)]
[bgp] Fix crash on SIGHUP, deref of freed workqueues
* lib/workqueue.c: free-ing workqueues had never been tested obviously,
queue's thread was not being stopped
* bgpd/bgpd.c: null out freed workqueues, to prevent acting on freed
workqueues
When bgp calls getaddrinfo, it gets both ipv6 and ipv4 addresses.
Unless IPV6_ONLY is set on Linux, only the ipv6 bind will succeed,
and the IPV4 connections will come in as mapped connections on the
IPV6 socket.
[bgpd] AS4 bugfix by Chris Caputo <ccaputo@alt.net>
* bgpd/bgp_aspath.c: (aspath_make_str_count) "assert (len < str_size)" was
getting hit under certain 4-byte ASN conditions. New realloc strategy.
* bgpd/bgp_aspath.c: (aspath_key_make) const warning fix.
"%d" -> "%u" 4-byte ASN corrections. Prevent negative number when ASN is
above 2^31.
Joakim Tjernlund [Mon, 10 Nov 2008 08:33:30 +0000 (09:33 +0100)]
[lib] Fix timer precision.
Whenever a thread adds an timer funcname_thread_add_timer_timeval() gets called
to add the timer. Before adding the timer a quagga_gettimeofday() call
is made to do some time house keeping. However quagga_gettimeofday() only
updates recent_time, not relative_time that is used to calculate
the alarm_time. Replace with quagga_get_relative (NULL)
Joakim Tjernlund [Mon, 17 Nov 2008 10:22:25 +0000 (11:22 +0100)]
[lib] Move type cast in Fletcher checksum
The int type cast should be on the whole expression
passed to the mod operator. Otherwise it won't work
when/if c0/c1 is unsigned.
Making c0/c1 unsigned makes it possible to use 5802
as MODX value.
Paul Jakma [Sun, 16 Nov 2008 18:34:19 +0000 (18:34 +0000)]
[lib] Switch Fletcher checksum back to old ospfd version
* lib/checksum.c: (fletcher_checksum) Switch the second phase of the checksum
back to the old ospfd logic.
The isisd-derived version:
a) is very hard to follow
b) had some kind of subtle bug that caused it be wrong when c0=0 and c1=254
(potentially fixable by doing the mods before adjusting x and y)
Additionally:
- explicitely cast expressions using non-internal variables to int, to ensure
the result is signed.
- defensively change the length argument to 'size_t', to ensure the code
works with that argument being unsigned..
Thanks to Joakim Tjernlund for the investigative work into this bug.
* tests/test-checksum.c: new file to exercise the checksum code.
[ospfd] Fix SEGV during startup introduced in recent commit
* ospfd/ospfd.c: (opsf_if_update) Check if ospf_lookup() returns NULL.
Fixes bug introduced with recent ospf_network_run changes in a49eb30a, where SEGV will happen if not the "router ospf" command has
been executed before the first interfaces are reported by zebra.
Paul Jakma [Tue, 9 Sep 2008 20:17:04 +0000 (21:17 +0100)]
[lib] re-enable conversion of v6mapped INET6 sockunions to regular INET
* lib/sockunion.c: Re-enable conversion of v6mapped INET6 sockunions to
regular INET sockunions, which was disabled in 0df7c9, as it leads to
failures in sockunion_cmp.
(sockunion_normalise_mapped) consolidate here
(sockunion_accept) remove conversion code altogether here - no sockunion
is created
(sockunion_get{sockname,peername}) normalise newly created sockunion.
Paul Jakma [Tue, 9 Sep 2008 16:14:33 +0000 (17:14 +0100)]
[bgpd] Allow accepted peers to progress even if realpeer is in Connect
* bgpd/bgp_packet.c: (bgp_open_receive) Try fix the little race in the FSM,
where a accept-peer that progress faster than realpeer gets closed down if
realpeer is still just in Connect, by allowing the realpeer to be
bgp_stop'ed and doing the regular swapping-of-FSM state.
Paul Jakma [Sat, 6 Sep 2008 12:09:35 +0000 (13:09 +0100)]
[bgpd] Document the FSM dummy-peer race that sometimes afflicts session setup
* bgp_packet.c: (bgp_open_receive) the accept-peer hack can sometimes
cause a race between two peers that try to establish sessions to each other,
causing session setup to fail when it should have succeeded. In the worst
case, the race can 'loop', causing prolonged failure to establish sessions.
Paul Jakma [Thu, 4 Sep 2008 12:52:07 +0000 (13:52 +0100)]
[ospfd] Minor enhancements to recent self-host-routes suppression patch
* ospf_spf.c: (ospf_spf_process_stubs) Track whether
parent router vertex is the root, so that the host-route
suppression logic need only be activated for such vertices.
Move the actual logic to ospf_intra_add_stub.
* ospf_route.c: (ospf_intra_add_stub) Main test of link moved
here, notionally more appropriate.
[ospfd] Restructure opsf_if_update() and ospf_network_run()
Add an struct interface paramenter and adjust the affected
code accordingly.
The old code was a mess looping over all interfaces several times
when one interface was added/changed.
* ospfd/ospfd.h: Add struct interface parameter to ospf_if_update()
* ospfd/ospf_zebra.c: Add ifp arg to ospf_if_update() calls.
(ospf_interface_address_delete) delete ospf_if_update() call,
redundant as function calls ospf_if_free() itself.
* ospfd/ospfd.c: (ospf_network_unset) handle deconfiguration here,
rather than ospf_if_update.
(ospf_network_run_interface) ospf_network_run, for
any given interface.
(ospf_network_run) move guts to previous, and use it.
(ospf_if_update) Adjust to take struct interface as argument, as
all callers have a specific ifp in mind.
Iterate over ifp's connected list and call ospf_network_run_interface
instead of ospf_network_run, turning this path into O(nm) rather
than O(n^2).
Adjust all code dealing with opsf_if_update and ospf_network_run to
pass the new struct interface * arg.
(some minor modifications and bug-additions by Paul Jakma).
Joakim Tjernlund [Fri, 30 May 2008 14:04:39 +0000 (16:04 +0200)]
Set destination for PtP links to OSPF_ALLSPFROUTERS.
Update ospf_db_desc_send(), ospf_ls_upd_queue_send() and ospf_ls_req_send()
to always use OSPF_ALLSPFROUTERS for PtP links.
See RFC 2328, chap 8.1 for details:
"The IP destination address for the packet is selected as
follows. On physical point-to-point networks, the IP
destination is always set to the address AllSPFRouters."
Without this, it won't be possible to establish adjacencies on
multiple unnumbered links to the same router.
ChangeLog:
2008-07-25 Joakim Tjernlund <Joakim.Tjernlund@transmode.se>
* ospfd/ospf_packet.c: Set destination for PtP links to
OSPF_ALLSPFROUTERS.
Paul Jakma [Sat, 23 Aug 2008 13:27:06 +0000 (14:27 +0100)]
[vty] Add support for a 'restricted mode' with anonymous vty connections
* lib/command.h: Add a RESTRICTED_NODE, intended for use with
anonymous, 'no login' vtys, to provide a subset of 'view' mode
commands.
* lib/command.c: Add RESTRICTED_NODE bits, nothing special, just
following VIEW_NODE.
* lib/vty.c: (vty_auth) enable authentication should fall back to
restricted/view node as appropriate.
(vty_create) init vty's to restricted/view node as appropriate,
for the 'no login' case.
(vty_{no_,}restricted_mode_cmd) config commands to enable
'anonymous restricted' in vty configuration.
(vty_config_write) 'anonymous restricted' config.
(vty_init) Install some commands to restricted mode, and the
'anonymous restricted' config commands into VTY_NODE.
* bgpd/*.c: Install some of the safe(r) BGP commands into
'restricted mode', i.e. lookup commands of non-sensitive data.
Useful with looking-glass route-servers.
2008-08-17 Stephen Hemminger <stephen.hemminger@vyatta.com>
* zebra_rib.c: When doing a RIB update, routes in process of removal
should be ignored. This fixes bugs where a route is removed but a
recursive route is not changed.
[zebra:linux] netlink: no need to change privs for receive
2008-06-17 Stephen Hemminger <stephen.hemminger@vyatta.com>
* rt_netlink.c: (netlink_parse_info) Linux doesn't check privledges
on receive, so avoid the overhead of lowering and raising the
priviledges on each received message
2008-06-17 Stephen Hemminger <stephen.hemminger@vyatta.com>
* rt_netlink.c: (netlink_parse_info) There can be harmless races
such as adding an existing route, or deleting an already deleted
route. Don't bother logging these unless debugging is turned on.
[zebra:linux] netlink buffer size tweaking only needed on receive socket
2008-08-16 Stephen Hemminger <stephen.hemminger@vyatta.com>
* rt_netlink.c: (netlink_recvbuf) consolidate recvbuf setting
(netlink_socket) no need to set receive buffer on netlink sockets
generally
(kernel_init) set recvbuffer on the listen socket
2008-08-16 Stephen Hemminger <stephen.hemminger@vyatta.com>
* configure.ac: If netlink is available, then that is how the
initial routes and interfaces should be read, rather than through
/proc, so don't set IF_PROC.
[zebra:linux] clean up blocking setting of netlink sockets
2008-08-16 Stephen Hemminger <stephen.hemminger@vyatta.com>
* zebra/rt_netlink.c: This change removes the overhead of twiddling
the socket twice on every route change. The netlink support has
two sockets, one is used for request/response and should always
block. The other is used for asynchronous notification and should
always be non-blocking.
Paul Jakma [Fri, 15 Aug 2008 13:05:22 +0000 (14:05 +0100)]
[warnings] Fix various SOS warnings
2008-08-15 Paul Jakma <paul.jakma@sun.com>
* */*: Fix various problems flagged by Sun Studio compiler.
- '<qualifier> <storage>' obsolescent in declarations
- empty statements (';' after ALIAS definitions)
- implicit declarations (e.g printstack in lib/log.c)
- "\%" in printf string instead of "%%"
- loops that return on the first iteration (legitimately, but
compiler can't really know), e.g. bgp_routemap.c
- internal declarations which mask prototypes.
Paul Jakma [Fri, 15 Aug 2008 12:45:30 +0000 (13:45 +0100)]
[trivia] finish off static'ification of ospf6d and ripngd
2008-08-15 Paul Jakma <paul.jakma@sun.com>
* {ospf6d,ripngd}/*: Finish job of marking functions as static, or
exporting declarations for them, to quell warning noise with
Quagga's GCC default high-level of warning flags. Thus allowing
remaining, more useful warnings to be more easily seen.
[lib] hash compare function arguments ought to be const qualified
2008-08-14 Stephen Hemminger <stephen.hemminger@vyatta.com>
* lib/hash.h: (struct hash) Hash comparator callback really
ought to treat storage behind arguments as constant - a compare
function with side-effects would be evil.
* */*.c: Adjust comparator functions similarly, thus fixing at least
a few compiler warnings about const qualifier being dropped.
Timo Teräs [Wed, 13 Aug 2008 16:37:14 +0000 (17:37 +0100)]
[zebra:netlink] Set proto/scope on all route update messages
2008-08-13 Timo Teräs <timo.teras@iki.fi>
* zebra/rt_netlink.c: (netlink_route{,_multipath) Set protocol and
scope appropriately for both NEW and DELROUTE messages, to avoid
wiping out non-zebra routes on delete.
[build] Test for GNU-style PIE support in toolchain and enable
2008-08-13 Paul P Komkoff Jr <i@stingr.net>
* configure.ac: add a configure flag and autoconf macro, which will
determine if your toolchain supports PIE.
* */Makefile.am: add corresponding CFLAGS and LDFLAGS into
appropriate places.
Paul Jakma [Fri, 31 Aug 2007 13:27:37 +0000 (14:27 +0100)]
[bgpd] Add 'bgp open-accept' option, to send OPEN immediately on accepted conns
2007-08-31 Paul Jakma <paul.jakma@sun.com>
* (general) Add 'bgp open-accept' option, to allow bgpd to send OPEN
on accepted connections, i.e. to not wait till after
collision-detect to send OPEN, which appears to be allowed in
RFC4271. This may help speed up establishing sessions, or help
avoid FSM problems with sessions to certain peers. Not enabled by
default though.
Paul Jakma [Tue, 22 Jul 2008 21:11:48 +0000 (21:11 +0000)]
[bgpd] Fix triggerable crash when compiled with --disable-bgp-announce
2008-07-22 Paul Jakma <paul.jakma@sun.com>
* HACKING: Document preference for compiler conditional code, over
cpp conditional.
* configure.ac: DISABLE_BGP_ANNOUNCE always should be defined.
* bgp_{packet,route,advertise}.c: change to compiler testing of
DISABLE_BGP_ANNOUNCE, rather than cpp.
Paul Jakma [Tue, 22 Jul 2008 19:56:56 +0000 (19:56 +0000)]
[bgpd] fix a couple of trivial compiler warnings
2008-07-22 Paul Jakma <paul.jakma@sun.com>
* bgp_community.c: (community_str2com) assigns defaults to local
vars
* bgp_attr.c: (bgp_attr_parse) match format specifier to arg
* bgp_table.{c,h}: (bgp_table_top) can take a * to a const, quelling
warning in bgp_route.c
Paul Jakma [Mon, 21 Jul 2008 21:02:49 +0000 (21:02 +0000)]
[bgpd] TCP-MD5: password vty configuration and initial Linux support
2008-07-21 Paul Jakma <paul.jakma@sun.com>
* bgp_packet.c: (bgp_open_receive) fix warning in a zlog call
* bgp_vty.c: (bgp_vty_return) add return code
* bgpd.c: (bgp_master_init) setup the socket list.
* bgp_network.c: Remove the dual IPv4/6 socket thing for now, which
was implemented by Michael, until such time as its clear its
required for Linux (see sockopt comments). IPv6 support, including
IPv4 sessions on AF_INET6 sockets, therefore is broken, and the
'-l 0.0.0.0' arguments would need to be given to bgpd to make
things work here.
2008-07-21 Michael H. Warfield <mhw@wittsend.com>
YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Tomohiko Kusuda <kusuda@inetcore.com>
Leigh Brown <leigh@solinno.co.uk>
* bgp_network.c: (bgp_md5_set_one) shim between libzebra tcp-md5
sockopt and bgpd.
(bgp_md5_set_socket) Helper for bgp_connect
(bgp_md5_set) setup TCP-MD5SIG for the given peer.
(bgp_connect) call out to bgp_md5_set_socket for the outgoing
connect socket.
(bgp_socket) save references to the listen sockets, needed if
TCP-MD5SIG is applied later or changed.
* bgp_vty.c: (*neighbor_password_cmd) New 'neighbor ... password'
commands.
* bgpd.c: (peer_{new,delete) manage TCP-MD5 password
(peer_group2peer_config_copy) inherit TCP-MD5 password
(peer_password_{un,}set) orchestrate the whole add/remove of TCP-MD5
passwords: applying checks, stopping peers, and trying to return
errors to UI, etc.
(bgp_config_write_peer) save password.
Fix missing newline in writeout of neighbor ... port.
2008-07-21 Paul Jakma <paul.jakma@sun.com>
* sockunion.c: ifdef out various places that converted
v4mapped sockets to pure v4. Doesn't seem necessary at all,
presumably a workaround for now historical inet_ntop bugs (?)
2008-07-21 Michael H. Warfield <mhw@wittsend.com>
YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Paul Jakma [Thu, 3 Jul 2008 20:41:08 +0000 (20:41 +0000)]
[solaris] Sync SMF bits with OpenSolaris SFW
2008-07-03 Paul Jakma <paul.jakma@sun.com>
* quagga.{xml,init}.in: Sync with OpenSolaris SFW. This changes the
SMF schema used, from the SMF schema supplied initially with
Quagga, to the version which was approved by the Sun PSARC for
inclusion into Solaris. This change is incompatible. Settings,
such as vty_port, etc. will not transfer over. The Sun schema is
however supported by Sun, and supports running Quagga in a zone
with IP instances, and configuration via the routeadm utility.
Paul Jakma [Wed, 2 Jul 2008 02:12:07 +0000 (02:12 +0000)]
[bgpd] Fix double-free crash in bgp_table_finish, seen with rs-client
2008-07-02 Stephen Hemminger <stephen.hemminger@vyatta.com>
* bgp_table.{c,h}: (bgp_table_finish) Take a double pointer and
scrub pointer in caller, so fixing double-free crashes seen
with route-server-client configuration.
* *.c: Adjust all callers of bgp_table_finish
2008-07-02 Paul Jakma <paul.jakma@sun.com>
* bgp_table.{c,h}: (bgp_node_delete, bgp_table_free) shouldn't be
exported.
Paul Jakma [Tue, 1 Jul 2008 18:24:58 +0000 (18:24 +0000)]
[zebra] Make BSD link-state deal more gracefully with GIFMEDIA ioctl error
2008-07-01 Paul Jakma <paul.jakma@sun.com>
* ioctl.c: (if_get_flags) Deal more gracefully with failure
of the BSD link-state SIOCGIFMEDIA ioctl, as some interfaces
apparently don't implement it (e.g. tun).
Also, make BSD link-state checking be conditional on the
'link-detect' interface configuration flag, as it should be.
Fixes bug #465.
Paul Jakma [Sat, 7 Jun 2008 20:37:10 +0000 (20:37 +0000)]
[bgpd] minor changes to bgp_mp_reach_parse
2008-06-07 Paul Jakma <paul@jakma.org>
* bgp_attr.{c,h}: (bgp_mp_{un,}reach_parse) export, for unit tests.
* bgp_attr.c: (bgp_mp_reach_parse) Add logging. Tighten length test
to bounds check against the attribute length rather than the
stream length..
* bgp_attr.c: (bgp_attr_aspathlimit) fix silly bug in flags check
that was causing BGP to drop sessions if it received a
aspath-limit with partial set. Fixes bug #419.