Import Upstream version 1.2.2 upstream/1.2.2
authorBrett Parker <brettp@mythic-beasts.com>
Sat, 17 Mar 2018 14:58:46 +0000 (14:58 +0000)
committerBrett Parker <brettp@mythic-beasts.com>
Sat, 17 Mar 2018 14:58:46 +0000 (14:58 +0000)
788 files changed:
.gitignore [new file with mode: 0644]
AUTHORS [new file with mode: 0644]
COPYING [new file with mode: 0644]
COPYING.LIB [new file with mode: 0644]
ChangeLog [new file with mode: 0644]
HACKING.md [new file with mode: 0644]
HACKING.pending [new file with mode: 0644]
INSTALL.quagga.txt [new file with mode: 0644]
Makefile.am [new file with mode: 0644]
NEWS [new file with mode: 0644]
README [new file with mode: 0644]
README.NetBSD [new file with mode: 0755]
REPORTING-BUGS [new file with mode: 0644]
SERVICES [new file with mode: 0644]
TODO [new file with mode: 0644]
bgpd/.gitignore [new file with mode: 0644]
bgpd/BGP4-MIB.txt [new file with mode: 0644]
bgpd/IMPLEMENTATION.txt [new file with mode: 0644]
bgpd/Makefile.am [new file with mode: 0644]
bgpd/bgp_advertise.c [new file with mode: 0644]
bgpd/bgp_advertise.h [new file with mode: 0644]
bgpd/bgp_aspath.c [new file with mode: 0644]
bgpd/bgp_aspath.h [new file with mode: 0644]
bgpd/bgp_attr.c [new file with mode: 0644]
bgpd/bgp_attr.h [new file with mode: 0644]
bgpd/bgp_btoa.c [new file with mode: 0644]
bgpd/bgp_clist.c [new file with mode: 0644]
bgpd/bgp_clist.h [new file with mode: 0644]
bgpd/bgp_community.c [new file with mode: 0644]
bgpd/bgp_community.h [new file with mode: 0644]
bgpd/bgp_damp.c [new file with mode: 0644]
bgpd/bgp_damp.h [new file with mode: 0644]
bgpd/bgp_debug.c [new file with mode: 0644]
bgpd/bgp_debug.h [new file with mode: 0644]
bgpd/bgp_dump.c [new file with mode: 0644]
bgpd/bgp_dump.h [new file with mode: 0644]
bgpd/bgp_ecommunity.c [new file with mode: 0644]
bgpd/bgp_ecommunity.h [new file with mode: 0644]
bgpd/bgp_encap.c [new file with mode: 0644]
bgpd/bgp_encap.h [new file with mode: 0644]
bgpd/bgp_encap_tlv.c [new file with mode: 0644]
bgpd/bgp_encap_tlv.h [new file with mode: 0644]
bgpd/bgp_encap_types.h [new file with mode: 0644]
bgpd/bgp_filter.c [new file with mode: 0644]
bgpd/bgp_filter.h [new file with mode: 0644]
bgpd/bgp_fsm.c [new file with mode: 0644]
bgpd/bgp_fsm.h [new file with mode: 0644]
bgpd/bgp_fsm_4271.dot [new file with mode: 0644]
bgpd/bgp_fsm_quagga.dot [new file with mode: 0644]
bgpd/bgp_lcommunity.c [new file with mode: 0644]
bgpd/bgp_lcommunity.h [new file with mode: 0644]
bgpd/bgp_main.c [new file with mode: 0644]
bgpd/bgp_mpath.c [new file with mode: 0644]
bgpd/bgp_mpath.h [new file with mode: 0644]
bgpd/bgp_mplsvpn.c [new file with mode: 0644]
bgpd/bgp_mplsvpn.h [new file with mode: 0644]
bgpd/bgp_network.c [new file with mode: 0644]
bgpd/bgp_network.h [new file with mode: 0644]
bgpd/bgp_nexthop.c [new file with mode: 0644]
bgpd/bgp_nexthop.h [new file with mode: 0644]
bgpd/bgp_nht.c [new file with mode: 0644]
bgpd/bgp_nht.h [new file with mode: 0644]
bgpd/bgp_open.c [new file with mode: 0644]
bgpd/bgp_open.h [new file with mode: 0644]
bgpd/bgp_packet.c [new file with mode: 0644]
bgpd/bgp_packet.h [new file with mode: 0644]
bgpd/bgp_regex.c [new file with mode: 0644]
bgpd/bgp_regex.h [new file with mode: 0644]
bgpd/bgp_route.c [new file with mode: 0644]
bgpd/bgp_route.h [new file with mode: 0644]
bgpd/bgp_routemap.c [new file with mode: 0644]
bgpd/bgp_snmp.c [new file with mode: 0644]
bgpd/bgp_snmp.h [new file with mode: 0644]
bgpd/bgp_table.c [new file with mode: 0644]
bgpd/bgp_table.h [new file with mode: 0644]
bgpd/bgp_vty.c [new file with mode: 0644]
bgpd/bgp_vty.h [new file with mode: 0644]
bgpd/bgp_zebra.c [new file with mode: 0644]
bgpd/bgp_zebra.h [new file with mode: 0644]
bgpd/bgpd.c [new file with mode: 0644]
bgpd/bgpd.conf.sample [new file with mode: 0644]
bgpd/bgpd.conf.sample2 [new file with mode: 0644]
bgpd/bgpd.h [new file with mode: 0644]
bootstrap.sh [new file with mode: 0755]
buildtest.sh [new file with mode: 0755]
common.am [new file with mode: 0644]
configure.ac [new file with mode: 0755]
doc/.gitignore [new file with mode: 0644]
doc/BGP-TypeCode [new file with mode: 0644]
doc/Makefile.am [new file with mode: 0644]
doc/appendix.texi [new file with mode: 0644]
doc/basic.texi [new file with mode: 0644]
doc/bgpd.8 [new file with mode: 0644]
doc/bgpd.texi [new file with mode: 0644]
doc/defines.texi [new file with mode: 0644]
doc/draft-zebra-00.ms [new file with mode: 0644]
doc/fig-normal-processing.dia [new file with mode: 0644]
doc/fig-normal-processing.png [new file with mode: 0644]
doc/fig-normal-processing.txt [new file with mode: 0644]
doc/fig-rs-processing.dia [new file with mode: 0644]
doc/fig-rs-processing.png [new file with mode: 0644]
doc/fig-rs-processing.txt [new file with mode: 0644]
doc/fig_topologies_full.txt [new file with mode: 0644]
doc/fig_topologies_rs.txt [new file with mode: 0644]
doc/filter.texi [new file with mode: 0644]
doc/install.texi [new file with mode: 0644]
doc/ipv6.texi [new file with mode: 0644]
doc/isisd.8 [new file with mode: 0644]
doc/isisd.texi [new file with mode: 0644]
doc/kernel.texi [new file with mode: 0644]
doc/main.texi [new file with mode: 0644]
doc/mpls/.gitignore [new file with mode: 0644]
doc/mpls/ChangeLog.opaque.txt [new file with mode: 0644]
doc/mpls/cli_summary.txt [new file with mode: 0644]
doc/mpls/opaque_lsa.txt [new file with mode: 0644]
doc/mpls/ospfd.conf [new file with mode: 0644]
doc/next-hop-tracking.txt [new file with mode: 0644]
doc/nhrpd.8 [new file with mode: 0644]
doc/nhrpd.texi [new file with mode: 0644]
doc/ospf6d.8 [new file with mode: 0644]
doc/ospf6d.texi [new file with mode: 0644]
doc/ospf_fundamentals.texi [new file with mode: 0644]
doc/ospfclient.8 [new file with mode: 0644]
doc/ospfd.8 [new file with mode: 0644]
doc/ospfd.texi [new file with mode: 0644]
doc/overview.texi [new file with mode: 0644]
doc/pimd.8 [new file with mode: 0644]
doc/protocol.texi [new file with mode: 0644]
doc/quagga.texi [new file with mode: 0644]
doc/ripd.8 [new file with mode: 0644]
doc/ripd.texi [new file with mode: 0644]
doc/ripngd.8 [new file with mode: 0644]
doc/ripngd.texi [new file with mode: 0644]
doc/routemap.texi [new file with mode: 0644]
doc/routeserver.texi [new file with mode: 0644]
doc/snmp.texi [new file with mode: 0644]
doc/snmptrap.texi [new file with mode: 0644]
doc/texinfo.css [new file with mode: 0644]
doc/texinfo.tex [new file with mode: 0644]
doc/vtysh.1 [new file with mode: 0644]
doc/vtysh.texi [new file with mode: 0644]
doc/watchquagga.8 [new file with mode: 0644]
doc/zebra.8 [new file with mode: 0644]
fpm/.gitignore [new file with mode: 0644]
fpm/Makefile.am [new file with mode: 0644]
fpm/fpm.h [new file with mode: 0644]
fpm/fpm.proto [new file with mode: 0644]
fpm/fpm_pb.c [new file with mode: 0644]
fpm/fpm_pb.h [new file with mode: 0644]
gdb/lib.txt [new file with mode: 0644]
gdb/ospf.txt [new file with mode: 0644]
infra/buildbot/master/master.cfg [new file with mode: 0644]
infra/buildbot/master/pass.cfg [new file with mode: 0644]
infra/buildbot/worker/buildbot-slave.service [new file with mode: 0644]
infra/buildbot/worker/buildbot-slave.xml [new file with mode: 0644]
infra/patchwork/pass.py [new file with mode: 0644]
infra/patchwork/production.py [new file with mode: 0644]
infra/patchwork/systemd/patchwork-delivery.socket [new file with mode: 0644]
infra/patchwork/systemd/patchwork-delivery@.service [new file with mode: 0644]
infra/patchwork/systemd/patchwork.service [new file with mode: 0644]
init/.gitignore [new file with mode: 0644]
isisd/.gitignore [new file with mode: 0644]
isisd/AUTHORS [new file with mode: 0644]
isisd/Makefile.am [new file with mode: 0644]
isisd/README [new file with mode: 0644]
isisd/dict.c [new file with mode: 0644]
isisd/dict.h [new file with mode: 0644]
isisd/include-netbsd/.gitignore [new file with mode: 0644]
isisd/include-netbsd/clnp.h [new file with mode: 0644]
isisd/include-netbsd/esis.h [new file with mode: 0644]
isisd/include-netbsd/iso.h [new file with mode: 0644]
isisd/isis_adjacency.c [new file with mode: 0644]
isisd/isis_adjacency.h [new file with mode: 0644]
isisd/isis_bpf.c [new file with mode: 0644]
isisd/isis_circuit.c [new file with mode: 0644]
isisd/isis_circuit.h [new file with mode: 0644]
isisd/isis_common.h [new file with mode: 0644]
isisd/isis_constants.h [new file with mode: 0644]
isisd/isis_csm.c [new file with mode: 0644]
isisd/isis_csm.h [new file with mode: 0644]
isisd/isis_dlpi.c [new file with mode: 0644]
isisd/isis_dr.c [new file with mode: 0644]
isisd/isis_dr.h [new file with mode: 0644]
isisd/isis_dynhn.c [new file with mode: 0644]
isisd/isis_dynhn.h [new file with mode: 0644]
isisd/isis_events.c [new file with mode: 0644]
isisd/isis_events.h [new file with mode: 0644]
isisd/isis_flags.c [new file with mode: 0644]
isisd/isis_flags.h [new file with mode: 0644]
isisd/isis_lsp.c [new file with mode: 0644]
isisd/isis_lsp.h [new file with mode: 0644]
isisd/isis_main.c [new file with mode: 0644]
isisd/isis_misc.c [new file with mode: 0644]
isisd/isis_misc.h [new file with mode: 0644]
isisd/isis_network.h [new file with mode: 0644]
isisd/isis_pdu.c [new file with mode: 0644]
isisd/isis_pdu.h [new file with mode: 0644]
isisd/isis_pfpacket.c [new file with mode: 0644]
isisd/isis_redist.c [new file with mode: 0644]
isisd/isis_redist.h [new file with mode: 0644]
isisd/isis_route.c [new file with mode: 0644]
isisd/isis_route.h [new file with mode: 0644]
isisd/isis_routemap.c [new file with mode: 0644]
isisd/isis_routemap.h [new file with mode: 0644]
isisd/isis_spf.c [new file with mode: 0644]
isisd/isis_spf.h [new file with mode: 0644]
isisd/isis_te.c [new file with mode: 0644]
isisd/isis_te.h [new file with mode: 0644]
isisd/isis_tlv.c [new file with mode: 0644]
isisd/isis_tlv.h [new file with mode: 0644]
isisd/isis_vty.c [new file with mode: 0644]
isisd/isis_zebra.c [new file with mode: 0644]
isisd/isis_zebra.h [new file with mode: 0644]
isisd/isisd.c [new file with mode: 0644]
isisd/isisd.conf.sample [new file with mode: 0644]
isisd/isisd.h [new file with mode: 0644]
isisd/iso_checksum.c [new file with mode: 0644]
isisd/iso_checksum.h [new file with mode: 0644]
isisd/topology/.gitignore [new file with mode: 0644]
isisd/topology/Makefile.am [new file with mode: 0644]
isisd/topology/random.c [new file with mode: 0644]
isisd/topology/spacyc.c [new file with mode: 0644]
isisd/topology/spgrid.c [new file with mode: 0644]
isisd/topology/spgrid.h [new file with mode: 0644]
isisd/topology/sprand.c [new file with mode: 0644]
lib/.gitignore [new file with mode: 0644]
lib/Makefile.am [new file with mode: 0644]
lib/agentx.c [new file with mode: 0644]
lib/buffer.c [new file with mode: 0644]
lib/buffer.h [new file with mode: 0644]
lib/checksum.c [new file with mode: 0644]
lib/checksum.h [new file with mode: 0644]
lib/command.c [new file with mode: 0644]
lib/command.h [new file with mode: 0644]
lib/daemon.c [new file with mode: 0644]
lib/distribute.c [new file with mode: 0644]
lib/distribute.h [new file with mode: 0644]
lib/event_counter.c [new file with mode: 0644]
lib/event_counter.h [new file with mode: 0644]
lib/fifo.h [new file with mode: 0644]
lib/filter.c [new file with mode: 0644]
lib/filter.h [new file with mode: 0644]
lib/getopt.c [new file with mode: 0644]
lib/getopt.h [new file with mode: 0644]
lib/getopt1.c [new file with mode: 0644]
lib/gitversion.pl [new file with mode: 0644]
lib/hash.c [new file with mode: 0644]
lib/hash.h [new file with mode: 0644]
lib/if.c [new file with mode: 0644]
lib/if.h [new file with mode: 0644]
lib/if_rmap.c [new file with mode: 0644]
lib/if_rmap.h [new file with mode: 0644]
lib/jhash.c [new file with mode: 0644]
lib/jhash.h [new file with mode: 0644]
lib/keychain.c [new file with mode: 0644]
lib/keychain.h [new file with mode: 0644]
lib/libospf.h [new file with mode: 0644]
lib/linklist.c [new file with mode: 0644]
lib/linklist.h [new file with mode: 0644]
lib/log.c [new file with mode: 0644]
lib/log.h [new file with mode: 0644]
lib/md5.c [new file with mode: 0644]
lib/md5.h [new file with mode: 0644]
lib/memory.c [new file with mode: 0644]
lib/memory.h [new file with mode: 0644]
lib/memtypes.awk [new file with mode: 0644]
lib/memtypes.c [new file with mode: 0644]
lib/network.c [new file with mode: 0644]
lib/network.h [new file with mode: 0644]
lib/nexthop.c [new file with mode: 0644]
lib/nexthop.h [new file with mode: 0644]
lib/pid_output.c [new file with mode: 0644]
lib/plist.c [new file with mode: 0644]
lib/plist.h [new file with mode: 0644]
lib/plist_int.h [new file with mode: 0644]
lib/pqueue.c [new file with mode: 0644]
lib/pqueue.h [new file with mode: 0644]
lib/prefix.c [new file with mode: 0644]
lib/prefix.h [new file with mode: 0644]
lib/privs.c [new file with mode: 0644]
lib/privs.h [new file with mode: 0644]
lib/queue.h [new file with mode: 0644]
lib/regex-gnu.h [new file with mode: 0644]
lib/regex.c [new file with mode: 0644]
lib/route_types.pl [new file with mode: 0755]
lib/route_types.txt [new file with mode: 0644]
lib/routemap.c [new file with mode: 0644]
lib/routemap.h [new file with mode: 0644]
lib/sigevent.c [new file with mode: 0644]
lib/sigevent.h [new file with mode: 0644]
lib/smux.c [new file with mode: 0644]
lib/smux.h [new file with mode: 0644]
lib/snmp.c [new file with mode: 0644]
lib/sockopt.c [new file with mode: 0644]
lib/sockopt.h [new file with mode: 0644]
lib/sockunion.c [new file with mode: 0644]
lib/sockunion.h [new file with mode: 0644]
lib/str.c [new file with mode: 0644]
lib/str.h [new file with mode: 0644]
lib/stream.c [new file with mode: 0644]
lib/stream.h [new file with mode: 0644]
lib/table.c [new file with mode: 0644]
lib/table.h [new file with mode: 0644]
lib/thread.c [new file with mode: 0644]
lib/thread.h [new file with mode: 0644]
lib/vector.c [new file with mode: 0644]
lib/vector.h [new file with mode: 0644]
lib/version.h.in [new file with mode: 0644]
lib/vrf.c [new file with mode: 0644]
lib/vrf.h [new file with mode: 0644]
lib/vty.c [new file with mode: 0644]
lib/vty.h [new file with mode: 0644]
lib/workqueue.c [new file with mode: 0644]
lib/workqueue.h [new file with mode: 0644]
lib/zassert.h [new file with mode: 0644]
lib/zclient.c [new file with mode: 0644]
lib/zclient.h [new file with mode: 0644]
lib/zebra.h [new file with mode: 0644]
m4/.gitignore [new file with mode: 0644]
m4/Makefile.am [new file with mode: 0644]
m4/README.txt [new file with mode: 0644]
m4/ax_sys_weak_alias.m4 [new file with mode: 0644]
nhrpd/Makefile.am [new file with mode: 0644]
nhrpd/README.kernel [new file with mode: 0644]
nhrpd/README.nhrpd [new file with mode: 0644]
nhrpd/debug.h [new file with mode: 0644]
nhrpd/linux.c [new file with mode: 0644]
nhrpd/list.h [new file with mode: 0644]
nhrpd/netlink.h [new file with mode: 0644]
nhrpd/netlink_arp.c [new file with mode: 0644]
nhrpd/netlink_gre.c [new file with mode: 0644]
nhrpd/nhrp-events.lua [new file with mode: 0755]
nhrpd/nhrp_cache.c [new file with mode: 0644]
nhrpd/nhrp_event.c [new file with mode: 0644]
nhrpd/nhrp_interface.c [new file with mode: 0644]
nhrpd/nhrp_main.c [new file with mode: 0644]
nhrpd/nhrp_nhs.c [new file with mode: 0644]
nhrpd/nhrp_packet.c [new file with mode: 0644]
nhrpd/nhrp_peer.c [new file with mode: 0644]
nhrpd/nhrp_protocol.h [new file with mode: 0644]
nhrpd/nhrp_route.c [new file with mode: 0644]
nhrpd/nhrp_shortcut.c [new file with mode: 0644]
nhrpd/nhrp_vc.c [new file with mode: 0644]
nhrpd/nhrp_vty.c [new file with mode: 0644]
nhrpd/nhrpd.h [new file with mode: 0644]
nhrpd/os.h [new file with mode: 0644]
nhrpd/reqid.c [new file with mode: 0644]
nhrpd/resolver.c [new file with mode: 0644]
nhrpd/vici.c [new file with mode: 0644]
nhrpd/vici.h [new file with mode: 0644]
nhrpd/zbuf.c [new file with mode: 0644]
nhrpd/zbuf.h [new file with mode: 0644]
nhrpd/znl.c [new file with mode: 0644]
nhrpd/znl.h [new file with mode: 0644]
ospf6d/.gitignore [new file with mode: 0644]
ospf6d/Makefile.am [new file with mode: 0644]
ospf6d/OSPFv3-MIB.txt [new file with mode: 0644]
ospf6d/README [new file with mode: 0644]
ospf6d/ospf6_abr.c [new file with mode: 0644]
ospf6d/ospf6_abr.h [new file with mode: 0644]
ospf6d/ospf6_area.c [new file with mode: 0644]
ospf6d/ospf6_area.h [new file with mode: 0644]
ospf6d/ospf6_asbr.c [new file with mode: 0644]
ospf6d/ospf6_asbr.h [new file with mode: 0644]
ospf6d/ospf6_flood.c [new file with mode: 0644]
ospf6d/ospf6_flood.h [new file with mode: 0644]
ospf6d/ospf6_interface.c [new file with mode: 0644]
ospf6d/ospf6_interface.h [new file with mode: 0644]
ospf6d/ospf6_intra.c [new file with mode: 0644]
ospf6d/ospf6_intra.h [new file with mode: 0644]
ospf6d/ospf6_lsa.c [new file with mode: 0644]
ospf6d/ospf6_lsa.h [new file with mode: 0644]
ospf6d/ospf6_lsdb.c [new file with mode: 0644]
ospf6d/ospf6_lsdb.h [new file with mode: 0644]
ospf6d/ospf6_main.c [new file with mode: 0644]
ospf6d/ospf6_message.c [new file with mode: 0644]
ospf6d/ospf6_message.h [new file with mode: 0644]
ospf6d/ospf6_neighbor.c [new file with mode: 0644]
ospf6d/ospf6_neighbor.h [new file with mode: 0644]
ospf6d/ospf6_network.c [new file with mode: 0644]
ospf6d/ospf6_network.h [new file with mode: 0644]
ospf6d/ospf6_proto.c [new file with mode: 0644]
ospf6d/ospf6_proto.h [new file with mode: 0644]
ospf6d/ospf6_route.c [new file with mode: 0644]
ospf6d/ospf6_route.h [new file with mode: 0644]
ospf6d/ospf6_snmp.c [new file with mode: 0644]
ospf6d/ospf6_snmp.h [new file with mode: 0644]
ospf6d/ospf6_spf.c [new file with mode: 0644]
ospf6d/ospf6_spf.h [new file with mode: 0644]
ospf6d/ospf6_top.c [new file with mode: 0644]
ospf6d/ospf6_top.h [new file with mode: 0644]
ospf6d/ospf6_zebra.c [new file with mode: 0644]
ospf6d/ospf6_zebra.h [new file with mode: 0644]
ospf6d/ospf6d.c [new file with mode: 0644]
ospf6d/ospf6d.conf.sample [new file with mode: 0644]
ospf6d/ospf6d.h [new file with mode: 0644]
ospfclient/.gitignore [new file with mode: 0644]
ospfclient/AUTHORS [new file with mode: 0644]
ospfclient/COPYING [new file with mode: 0644]
ospfclient/INSTALL [new file with mode: 0644]
ospfclient/Makefile.am [new file with mode: 0644]
ospfclient/NEWS [new file with mode: 0644]
ospfclient/README [new file with mode: 0644]
ospfclient/ospf_apiclient.c [new file with mode: 0644]
ospfclient/ospf_apiclient.h [new file with mode: 0644]
ospfclient/ospfclient.c [new file with mode: 0644]
ospfd/.gitignore [new file with mode: 0644]
ospfd/ChangeLog.opaque.txt [new file with mode: 0644]
ospfd/Makefile.am [new file with mode: 0644]
ospfd/OSPF-ALIGNMENT.txt [new file with mode: 0644]
ospfd/OSPF-MIB.txt [new file with mode: 0644]
ospfd/OSPF-TRAP-MIB.txt [new file with mode: 0644]
ospfd/ospf_abr.c [new file with mode: 0644]
ospfd/ospf_abr.h [new file with mode: 0644]
ospfd/ospf_api.c [new file with mode: 0644]
ospfd/ospf_api.h [new file with mode: 0644]
ospfd/ospf_apiserver.c [new file with mode: 0644]
ospfd/ospf_apiserver.h [new file with mode: 0644]
ospfd/ospf_asbr.c [new file with mode: 0644]
ospfd/ospf_asbr.h [new file with mode: 0644]
ospfd/ospf_ase.c [new file with mode: 0644]
ospfd/ospf_ase.h [new file with mode: 0644]
ospfd/ospf_dump.c [new file with mode: 0644]
ospfd/ospf_dump.h [new file with mode: 0644]
ospfd/ospf_flood.c [new file with mode: 0644]
ospfd/ospf_flood.h [new file with mode: 0644]
ospfd/ospf_ia.c [new file with mode: 0644]
ospfd/ospf_ia.h [new file with mode: 0644]
ospfd/ospf_interface.c [new file with mode: 0644]
ospfd/ospf_interface.h [new file with mode: 0644]
ospfd/ospf_ism.c [new file with mode: 0644]
ospfd/ospf_ism.h [new file with mode: 0644]
ospfd/ospf_lsa.c [new file with mode: 0644]
ospfd/ospf_lsa.h [new file with mode: 0644]
ospfd/ospf_lsdb.c [new file with mode: 0644]
ospfd/ospf_lsdb.h [new file with mode: 0644]
ospfd/ospf_main.c [new file with mode: 0644]
ospfd/ospf_neighbor.c [new file with mode: 0644]
ospfd/ospf_neighbor.h [new file with mode: 0644]
ospfd/ospf_network.c [new file with mode: 0644]
ospfd/ospf_network.h [new file with mode: 0644]
ospfd/ospf_nsm.c [new file with mode: 0644]
ospfd/ospf_nsm.h [new file with mode: 0644]
ospfd/ospf_opaque.c [new file with mode: 0644]
ospfd/ospf_opaque.h [new file with mode: 0644]
ospfd/ospf_packet.c [new file with mode: 0644]
ospfd/ospf_packet.h [new file with mode: 0644]
ospfd/ospf_ri.c [new file with mode: 0644]
ospfd/ospf_ri.h [new file with mode: 0644]
ospfd/ospf_route.c [new file with mode: 0644]
ospfd/ospf_route.h [new file with mode: 0644]
ospfd/ospf_routemap.c [new file with mode: 0644]
ospfd/ospf_snmp.c [new file with mode: 0644]
ospfd/ospf_snmp.h [new file with mode: 0644]
ospfd/ospf_spf.c [new file with mode: 0644]
ospfd/ospf_spf.h [new file with mode: 0644]
ospfd/ospf_te.c [new file with mode: 0644]
ospfd/ospf_te.h [new file with mode: 0644]
ospfd/ospf_vty.c [new file with mode: 0644]
ospfd/ospf_vty.h [new file with mode: 0644]
ospfd/ospf_zebra.c [new file with mode: 0644]
ospfd/ospf_zebra.h [new file with mode: 0644]
ospfd/ospfd.c [new file with mode: 0644]
ospfd/ospfd.conf.sample [new file with mode: 0644]
ospfd/ospfd.h [new file with mode: 0644]
pimd/.gitignore [new file with mode: 0644]
pimd/AUTHORS [new file with mode: 0644]
pimd/CAVEATS [new file with mode: 0644]
pimd/COMMANDS [new file with mode: 0644]
pimd/COPYING [new file with mode: 0644]
pimd/DEBUG [new file with mode: 0644]
pimd/LINUX_KERNEL_MROUTE_MFC [new file with mode: 0644]
pimd/Makefile.am [new file with mode: 0644]
pimd/README [new file with mode: 0644]
pimd/TODO [new file with mode: 0644]
pimd/TROUBLESHOOTING [new file with mode: 0644]
pimd/WHY_SSM [new file with mode: 0644]
pimd/pim_assert.c [new file with mode: 0644]
pimd/pim_assert.h [new file with mode: 0644]
pimd/pim_cmd.c [new file with mode: 0644]
pimd/pim_cmd.h [new file with mode: 0644]
pimd/pim_hello.c [new file with mode: 0644]
pimd/pim_hello.h [new file with mode: 0644]
pimd/pim_iface.c [new file with mode: 0644]
pimd/pim_iface.h [new file with mode: 0644]
pimd/pim_ifchannel.c [new file with mode: 0644]
pimd/pim_ifchannel.h [new file with mode: 0644]
pimd/pim_igmp.c [new file with mode: 0644]
pimd/pim_igmp.h [new file with mode: 0644]
pimd/pim_igmp_join.c [new file with mode: 0644]
pimd/pim_igmp_join.h [new file with mode: 0644]
pimd/pim_igmpv3.c [new file with mode: 0644]
pimd/pim_igmpv3.h [new file with mode: 0644]
pimd/pim_int.c [new file with mode: 0644]
pimd/pim_int.h [new file with mode: 0644]
pimd/pim_join.c [new file with mode: 0644]
pimd/pim_join.h [new file with mode: 0644]
pimd/pim_macro.c [new file with mode: 0644]
pimd/pim_macro.h [new file with mode: 0644]
pimd/pim_main.c [new file with mode: 0644]
pimd/pim_mroute.c [new file with mode: 0644]
pimd/pim_mroute.h [new file with mode: 0644]
pimd/pim_msg.c [new file with mode: 0644]
pimd/pim_msg.h [new file with mode: 0644]
pimd/pim_neighbor.c [new file with mode: 0644]
pimd/pim_neighbor.h [new file with mode: 0644]
pimd/pim_oil.c [new file with mode: 0644]
pimd/pim_oil.h [new file with mode: 0644]
pimd/pim_pim.c [new file with mode: 0644]
pimd/pim_pim.h [new file with mode: 0644]
pimd/pim_routemap.c [new file with mode: 0644]
pimd/pim_rpf.c [new file with mode: 0644]
pimd/pim_rpf.h [new file with mode: 0644]
pimd/pim_signals.c [new file with mode: 0644]
pimd/pim_signals.h [new file with mode: 0644]
pimd/pim_sock.c [new file with mode: 0644]
pimd/pim_sock.h [new file with mode: 0644]
pimd/pim_ssmpingd.c [new file with mode: 0644]
pimd/pim_ssmpingd.h [new file with mode: 0644]
pimd/pim_static.c [new file with mode: 0644]
pimd/pim_static.h [new file with mode: 0644]
pimd/pim_str.c [new file with mode: 0644]
pimd/pim_str.h [new file with mode: 0644]
pimd/pim_time.c [new file with mode: 0644]
pimd/pim_time.h [new file with mode: 0644]
pimd/pim_tlv.c [new file with mode: 0644]
pimd/pim_tlv.h [new file with mode: 0644]
pimd/pim_upstream.c [new file with mode: 0644]
pimd/pim_upstream.h [new file with mode: 0644]
pimd/pim_util.c [new file with mode: 0644]
pimd/pim_util.h [new file with mode: 0644]
pimd/pim_version.c [new file with mode: 0644]
pimd/pim_version.h [new file with mode: 0644]
pimd/pim_vty.c [new file with mode: 0644]
pimd/pim_vty.h [new file with mode: 0644]
pimd/pim_zebra.c [new file with mode: 0644]
pimd/pim_zebra.h [new file with mode: 0644]
pimd/pim_zlookup.c [new file with mode: 0644]
pimd/pim_zlookup.h [new file with mode: 0644]
pimd/pimd.c [new file with mode: 0644]
pimd/pimd.conf.sample [new file with mode: 0644]
pimd/pimd.h [new file with mode: 0644]
pimd/test_igmpv3_join.c [new file with mode: 0644]
pkgsrc/.gitignore [new file with mode: 0644]
pkgsrc/Makefile.am [new file with mode: 0644]
pkgsrc/README.txt [new file with mode: 0644]
pkgsrc/bgpd.sh.in [new file with mode: 0644]
pkgsrc/ospf6d.sh.in [new file with mode: 0644]
pkgsrc/ospfd.sh.in [new file with mode: 0644]
pkgsrc/ripd.sh.in [new file with mode: 0644]
pkgsrc/ripngd.sh.in [new file with mode: 0644]
pkgsrc/zebra.sh.in [new file with mode: 0644]
ports/.gitignore [new file with mode: 0644]
ports/Makefile [new file with mode: 0644]
ports/README [new file with mode: 0644]
ports/files/.gitignore [new file with mode: 0644]
ports/files/md5 [new file with mode: 0644]
ports/pkg/.gitignore [new file with mode: 0644]
ports/pkg/COMMENT [new file with mode: 0644]
ports/pkg/DESCR [new file with mode: 0644]
ports/pkg/PLIST [new file with mode: 0644]
qpb/.gitignore [new file with mode: 0644]
qpb/Makefile.am [new file with mode: 0644]
qpb/README.txt [new file with mode: 0644]
qpb/linear_allocator.h [new file with mode: 0644]
qpb/qpb.c [new file with mode: 0644]
qpb/qpb.h [new file with mode: 0644]
qpb/qpb.proto [new file with mode: 0644]
qpb/qpb_allocator.c [new file with mode: 0644]
qpb/qpb_allocator.h [new file with mode: 0644]
redhat/.gitignore [new file with mode: 0644]
redhat/Makefile.am [new file with mode: 0644]
redhat/README.rpm_build.md [new file with mode: 0644]
redhat/bgpd.init [new file with mode: 0644]
redhat/bgpd.service [new file with mode: 0644]
redhat/isisd.init [new file with mode: 0644]
redhat/isisd.service [new file with mode: 0644]
redhat/nhrpd.service [new file with mode: 0644]
redhat/ospf6d.init [new file with mode: 0644]
redhat/ospf6d.service [new file with mode: 0644]
redhat/ospfd.init [new file with mode: 0644]
redhat/ospfd.service [new file with mode: 0644]
redhat/pimd.init [new file with mode: 0644]
redhat/pimd.service [new file with mode: 0644]
redhat/quagga-filter-perl-requires.sh [new file with mode: 0755]
redhat/quagga-tmpfs.conf [new file with mode: 0644]
redhat/quagga.logrotate [new file with mode: 0644]
redhat/quagga.pam [new file with mode: 0644]
redhat/quagga.spec.in [new file with mode: 0644]
redhat/quagga.sysconfig [new file with mode: 0644]
redhat/ripd.init [new file with mode: 0644]
redhat/ripd.service [new file with mode: 0644]
redhat/ripngd.init [new file with mode: 0644]
redhat/ripngd.service [new file with mode: 0644]
redhat/watchquagga.init [new file with mode: 0644]
redhat/zebra.init [new file with mode: 0644]
redhat/zebra.service [new file with mode: 0644]
release.sh [new file with mode: 0755]
ripd/.gitignore [new file with mode: 0644]
ripd/Makefile.am [new file with mode: 0644]
ripd/RIPv2-MIB.txt [new file with mode: 0644]
ripd/rip_debug.c [new file with mode: 0644]
ripd/rip_debug.h [new file with mode: 0644]
ripd/rip_interface.c [new file with mode: 0644]
ripd/rip_interface.h [new file with mode: 0644]
ripd/rip_main.c [new file with mode: 0644]
ripd/rip_offset.c [new file with mode: 0644]
ripd/rip_peer.c [new file with mode: 0644]
ripd/rip_routemap.c [new file with mode: 0644]
ripd/rip_snmp.c [new file with mode: 0644]
ripd/rip_zebra.c [new file with mode: 0644]
ripd/ripd.c [new file with mode: 0644]
ripd/ripd.conf.sample [new file with mode: 0644]
ripd/ripd.h [new file with mode: 0644]
ripngd/.gitignore [new file with mode: 0644]
ripngd/Makefile.am [new file with mode: 0644]
ripngd/ripng_debug.c [new file with mode: 0644]
ripngd/ripng_debug.h [new file with mode: 0644]
ripngd/ripng_interface.c [new file with mode: 0644]
ripngd/ripng_main.c [new file with mode: 0644]
ripngd/ripng_nexthop.c [new file with mode: 0644]
ripngd/ripng_nexthop.h [new file with mode: 0644]
ripngd/ripng_offset.c [new file with mode: 0644]
ripngd/ripng_peer.c [new file with mode: 0644]
ripngd/ripng_route.c [new file with mode: 0644]
ripngd/ripng_route.h [new file with mode: 0644]
ripngd/ripng_routemap.c [new file with mode: 0644]
ripngd/ripng_zebra.c [new file with mode: 0644]
ripngd/ripngd.c [new file with mode: 0644]
ripngd/ripngd.conf.sample [new file with mode: 0644]
ripngd/ripngd.h [new file with mode: 0644]
solaris/.gitignore [new file with mode: 0644]
solaris/Makefile.am [new file with mode: 0644]
solaris/README.txt [new file with mode: 0644]
solaris/depend.daemons.in [new file with mode: 0644]
solaris/depend.dev.in [new file with mode: 0644]
solaris/depend.doc.in [new file with mode: 0644]
solaris/depend.libs.in [new file with mode: 0644]
solaris/depend.smf.in [new file with mode: 0644]
solaris/pkginfo.daemons.tmpl.in [new file with mode: 0644]
solaris/pkginfo.dev.tmpl.in [new file with mode: 0644]
solaris/pkginfo.doc.tmpl.in [new file with mode: 0644]
solaris/pkginfo.libs.tmpl.in [new file with mode: 0644]
solaris/pkginfo.smf.tmpl.in [new file with mode: 0644]
solaris/pkginfo.tmpl.in [new file with mode: 0644]
solaris/prototype.daemons.in [new file with mode: 0644]
solaris/prototype.dev.in [new file with mode: 0644]
solaris/prototype.doc.in [new file with mode: 0644]
solaris/prototype.libs.in [new file with mode: 0644]
solaris/prototype.smf.in [new file with mode: 0644]
solaris/quagga.init.in [new file with mode: 0755]
solaris/quagga.xml.in [new file with mode: 0644]
stamp-h.in [new file with mode: 0644]
tests/.gitignore [new file with mode: 0644]
tests/Makefile.am [new file with mode: 0644]
tests/aspath_test.c [new file with mode: 0644]
tests/bgp_capability_test.c [new file with mode: 0644]
tests/bgp_mp_attr_test.c [new file with mode: 0644]
tests/bgp_mpath_test.c [new file with mode: 0644]
tests/bgpd.tests/Makefile.am [new file with mode: 0644]
tests/bgpd.tests/aspathtest.exp [new file with mode: 0644]
tests/bgpd.tests/ecommtest.exp [new file with mode: 0644]
tests/bgpd.tests/testbgpcap.exp [new file with mode: 0644]
tests/bgpd.tests/testbgpmpath.exp [new file with mode: 0644]
tests/bgpd.tests/testbgpmpattr.exp [new file with mode: 0644]
tests/common-cli.c [new file with mode: 0644]
tests/common-cli.h [new file with mode: 0644]
tests/config/unix.exp [new file with mode: 0644]
tests/ecommunity_test.c [new file with mode: 0644]
tests/global-conf.exp [new file with mode: 0644]
tests/heavy-thread.c [new file with mode: 0644]
tests/heavy-wq.c [new file with mode: 0644]
tests/heavy.c [new file with mode: 0644]
tests/lib/bgpd.exp [new file with mode: 0644]
tests/lib/libzebra.exp [new file with mode: 0644]
tests/libzebra.tests/Makefile.am [new file with mode: 0644]
tests/libzebra.tests/tabletest.exp [new file with mode: 0644]
tests/libzebra.tests/test-timer-correctness.exp [new file with mode: 0644]
tests/libzebra.tests/testcli.exp [new file with mode: 0644]
tests/libzebra.tests/testcommands.exp [new file with mode: 0644]
tests/libzebra.tests/testnexthopiter.exp [new file with mode: 0644]
tests/libzebra.tests/teststream.exp [new file with mode: 0644]
tests/main.c [new file with mode: 0644]
tests/prng.c [new file with mode: 0644]
tests/prng.h [new file with mode: 0644]
tests/table_test.c [new file with mode: 0644]
tests/test-buffer.c [new file with mode: 0644]
tests/test-checksum.c [new file with mode: 0644]
tests/test-cli.c [new file with mode: 0644]
tests/test-commands.c [new file with mode: 0644]
tests/test-memory.c [new file with mode: 0644]
tests/test-nexthop-iter.c [new file with mode: 0644]
tests/test-privs.c [new file with mode: 0644]
tests/test-segv.c [new file with mode: 0644]
tests/test-sig.c [new file with mode: 0644]
tests/test-stream.c [new file with mode: 0644]
tests/test-timer-correctness.c [new file with mode: 0644]
tests/test-timer-performance.c [new file with mode: 0644]
tests/testcli.in [new file with mode: 0644]
tests/testcli.refout [new file with mode: 0644]
tests/testcommands.in [new file with mode: 0644]
tests/testcommands.refout [new file with mode: 0644]
tests/tests.h [new file with mode: 0644]
tools/.gitignore [new file with mode: 0644]
tools/mrlg.txt [new file with mode: 0644]
tools/multiple-bgpd.sh [new file with mode: 0644]
tools/zebra.el [new file with mode: 0644]
update-autotools [new file with mode: 0755]
vtysh/.gitignore [new file with mode: 0644]
vtysh/Makefile.am [new file with mode: 0644]
vtysh/extract.pl.in [new file with mode: 0755]
vtysh/vtysh.c [new file with mode: 0644]
vtysh/vtysh.conf.sample [new file with mode: 0644]
vtysh/vtysh.h [new file with mode: 0644]
vtysh/vtysh_config.c [new file with mode: 0644]
vtysh/vtysh_main.c [new file with mode: 0644]
vtysh/vtysh_user.c [new file with mode: 0644]
vtysh/vtysh_user.h [new file with mode: 0644]
watchquagga/.gitignore [new file with mode: 0644]
watchquagga/Makefile.am [new file with mode: 0644]
watchquagga/watchquagga.c [new file with mode: 0644]
zebra/.gitignore [new file with mode: 0644]
zebra/GNOME-PRODUCT-ZEBRA-MIB [new file with mode: 0644]
zebra/GNOME-SMI [new file with mode: 0644]
zebra/Makefile.am [new file with mode: 0644]
zebra/client_main.c [new file with mode: 0644]
zebra/connected.c [new file with mode: 0644]
zebra/connected.h [new file with mode: 0644]
zebra/debug.c [new file with mode: 0644]
zebra/debug.h [new file with mode: 0644]
zebra/if_ioctl.c [new file with mode: 0644]
zebra/if_ioctl_solaris.c [new file with mode: 0644]
zebra/if_netlink.c [new file with mode: 0644]
zebra/if_sysctl.c [new file with mode: 0644]
zebra/interface.c [new file with mode: 0644]
zebra/interface.h [new file with mode: 0644]
zebra/ioctl.c [new file with mode: 0644]
zebra/ioctl.h [new file with mode: 0644]
zebra/ioctl_null.c [new file with mode: 0644]
zebra/ioctl_solaris.c [new file with mode: 0644]
zebra/ioctl_solaris.h [new file with mode: 0644]
zebra/ipforward.h [new file with mode: 0644]
zebra/ipforward_proc.c [new file with mode: 0644]
zebra/ipforward_solaris.c [new file with mode: 0644]
zebra/ipforward_sysctl.c [new file with mode: 0644]
zebra/irdp.h [new file with mode: 0644]
zebra/irdp_interface.c [new file with mode: 0644]
zebra/irdp_main.c [new file with mode: 0644]
zebra/irdp_packet.c [new file with mode: 0644]
zebra/kernel_netlink.c [new file with mode: 0644]
zebra/kernel_null.c [new file with mode: 0644]
zebra/kernel_socket.c [new file with mode: 0644]
zebra/kernel_socket.h [new file with mode: 0644]
zebra/main.c [new file with mode: 0644]
zebra/misc_null.c [new file with mode: 0644]
zebra/redistribute.c [new file with mode: 0644]
zebra/redistribute.h [new file with mode: 0644]
zebra/redistribute_null.c [new file with mode: 0644]
zebra/rib.h [new file with mode: 0644]
zebra/router-id.c [new file with mode: 0644]
zebra/router-id.h [new file with mode: 0644]
zebra/rt.h [new file with mode: 0644]
zebra/rt_netlink.c [new file with mode: 0644]
zebra/rt_netlink.h [new file with mode: 0644]
zebra/rt_socket.c [new file with mode: 0644]
zebra/rtadv.c [new file with mode: 0644]
zebra/rtadv.h [new file with mode: 0644]
zebra/rtread_getmsg.c [new file with mode: 0644]
zebra/rtread_netlink.c [new file with mode: 0644]
zebra/rtread_sysctl.c [new file with mode: 0644]
zebra/test_main.c [new file with mode: 0644]
zebra/testrib.conf [new file with mode: 0644]
zebra/zebra.conf.sample [new file with mode: 0644]
zebra/zebra_fpm.c [new file with mode: 0644]
zebra/zebra_fpm.h [new file with mode: 0644]
zebra/zebra_fpm_dt.c [new file with mode: 0644]
zebra/zebra_fpm_netlink.c [new file with mode: 0644]
zebra/zebra_fpm_private.h [new file with mode: 0644]
zebra/zebra_fpm_protobuf.c [new file with mode: 0644]
zebra/zebra_rib.c [new file with mode: 0644]
zebra/zebra_rnh.c [new file with mode: 0644]
zebra/zebra_rnh.h [new file with mode: 0644]
zebra/zebra_rnh_null.c [new file with mode: 0644]
zebra/zebra_routemap.c [new file with mode: 0644]
zebra/zebra_snmp.c [new file with mode: 0644]
zebra/zebra_vty.c [new file with mode: 0644]
zebra/zserv.c [new file with mode: 0644]
zebra/zserv.h [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..a8da62f
--- /dev/null
@@ -0,0 +1,45 @@
+compile
+config.log
+config.h
+config.cache
+config.status
+config.guess
+config.sub
+ltmain.sh
+stamp-h
+stamp-h[0-9]*
+*-stamp
+Makefile
+INSTALL
+.deps
+depcomp
+missing
+install-sh
+mkinstalldirs
+autom4te*.cache
+configure.lineno
+configure
+config.h.in
+aclocal.m4
+Makefile.in
+zebra-[0-9.][0-9.][0-9.]*.tar.gz
+quagga-[0-9.][0-9.][0-9.]*.tar.gz
+quagga-[0-9.][0-9.][0-9.]*.tar.gz.asc
+.nfs*
+libtool
+.libs
+.arch-inventory
+.arch-ids
+{arch}
+build
+.msg
+.rebase-*
+*~
+*.o
+*.loT
+m4/*.m4
+!m4/ax_sys_weak_alias.m4
+cscope.*
+*.pb.h
+*.pb-c.h
+*.pb-c.c
diff --git a/AUTHORS b/AUTHORS
new file mode 100644 (file)
index 0000000..61867a8
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,6 @@
+Kunihiro Ishiguro <kunihiro@zebra.org>
+Toshiaki Takada <takada@zebra.org>
+Yasuhiro Ohara <yasu@sfc.wide.ad.jp>
+Alex D. Zinin <azinin@hotmail.com>
+Gleb Natapov <gleb@nbase.co.il>
+Akihiro Mizutani <mizutani@dml.com>
diff --git a/COPYING b/COPYING
new file mode 100644 (file)
index 0000000..b8cf3a1
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,339 @@
+                   GNU GENERAL PUBLIC LICENSE
+                      Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                          675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                           Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                   GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                           NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                    END OF TERMS AND CONDITIONS
+
+       Appendix: How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) 19yy  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) 19yy name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/COPYING.LIB b/COPYING.LIB
new file mode 100644 (file)
index 0000000..2b4628e
--- /dev/null
@@ -0,0 +1,482 @@
+                 GNU LIBRARY GENERAL PUBLIC LICENSE
+                      Version 2, June 1991
+
+ Copyright (C) 1991 Free Software Foundation, Inc.
+ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the library GPL.  It is
+ numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+                           Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Library General Public License, applies to some
+specially designated Free Software Foundation software, and to any
+other libraries whose authors decide to use it.  You can use it for
+your libraries, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if
+you distribute copies of the library, or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link a program with the library, you must provide
+complete object files to the recipients so that they can relink them
+with the library, after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  Our method of protecting your rights has two steps: (1) copyright
+the library, and (2) offer you this license which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  Also, for each distributor's protection, we want to make certain
+that everyone understands that there is no warranty for this free
+library.  If the library is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original
+version, so that any problems introduced by others will not reflect on
+the original authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that companies distributing free
+software will individually obtain patent licenses, thus in effect
+transforming the program into proprietary software.  To prevent this,
+we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+  Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License, which was designed for utility programs.  This
+license, the GNU Library General Public License, applies to certain
+designated libraries.  This license is quite different from the ordinary
+one; be sure to read it in full, and don't assume that anything in it is
+the same as in the ordinary license.
+
+  The reason we have a separate public license for some libraries is that
+they blur the distinction we usually make between modifying or adding to a
+program and simply using it.  Linking a program with a library, without
+changing the library, is in some sense simply using the library, and is
+analogous to running a utility program or application program.  However, in
+a textual and legal sense, the linked executable is a combined work, a
+derivative of the original library, and the ordinary General Public License
+treats it as such.
+
+  Because of this blurred distinction, using the ordinary General
+Public License for libraries did not effectively promote software
+sharing, because most developers did not use the libraries.  We
+concluded that weaker conditions might promote sharing better.
+
+  However, unrestricted linking of non-free programs would deprive the
+users of those programs of all benefit from the free status of the
+libraries themselves.  This Library General Public License is intended to
+permit developers of non-free programs to use free libraries, while
+preserving your freedom as a user of such programs to change the free
+libraries that are incorporated in them.  (We have not seen how to achieve
+this as regards changes in header files, but we have achieved it as regards
+changes in the actual functions of the Library.)  The hope is that this
+will lead to faster development of free libraries.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, while the latter only
+works together with the library.
+
+  Note that it is possible for a library to be covered by the ordinary
+General Public License rather than by this special one.
+
+                 GNU LIBRARY GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library which
+contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Library
+General Public License (also called "this License").  Each licensee is
+addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also compile or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    c) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    d) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the source code distributed need not include anything that is normally
+distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Library General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+                           NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                    END OF TERMS AND CONDITIONS
+
+     Appendix: How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public
+    License along with this library; if not, write to the Free
+    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+    MA 02111-1307, USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/ChangeLog b/ChangeLog
new file mode 100644 (file)
index 0000000..2ed5061
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,4 @@
+ChangeLog information for Quagga is now recorded in our source-code
+management system. Please see:
+
+       http://www.quagga.net/devel.php
diff --git a/HACKING.md b/HACKING.md
new file mode 100644 (file)
index 0000000..078de60
--- /dev/null
@@ -0,0 +1,741 @@
+---
+title: Conventions for working on Quagga 
+papersize: a4paper
+geometry: a4paper,scale=0.82
+fontsize: 11pt
+toc: true
+date: \today
+include-before: 
+  \large This is a living document describing the processes and guidelines
+   for working on Quagga. You *must* read Section
+   ["REQUIRED READING"](#sec:required), before contributing to Quagga.
+
+   Suggestions for updates, via the
+  [quagga-dev list](http://lists.quagga.net/mailman/listinfo/quagga-dev),
+  are welcome. \newpage
+...
+
+\newpage
+
+OBJECTIVES {#sec:goals}
+==========
+
+The objectives of the Quagga project are to develop and implement high
+quality routing protocols and related software, maximising:
+
+* Free software:
+    * Quagga is and will remain a copyleft, free software project
+    * Some non-core parts may be available under compatible, permissive
+      licenses to facilitate code sharing, where contributors agree.
+    * The test and integration orchestration infrastructure shall be free
+      software, developed similarly to the rest of Quagga. Proprietary
+      conformance suites may be among the test tools orchestrated.
+* Openness and transparency
+    * The business of the project shall be conducted on its public email
+      lists, to the greatest extent possible.
+    * The design of the software will be governed by open discussion on
+      the public email lists.
+    * Participants shall endeavour to be transparent about their interests
+      in the project, and any associations likely to be relevant.
+* Ethical behaviour:
+    * The licenses of all copyright holders will be respected, and the
+      project will err in their favour where there is reasonable doubt or
+      legal advice to that effect.
+    * Participants will behave with respect for others, and in a manner that
+      builds and maintains the trust needed for productive collaboration.
+
+See also the Section on [CODE OF CONDUCT](#sec:codeconduct).
+
+Governance {#sec:governance}
+==========
+
+Quagga is a Sociocracy, as it has been since its earliest days.
+
+Quagga was forked from GNU Zebra by Paul Jakma, who holds the domain name. 
+Governance was soon devolved to a collective group, the maintainers,
+consisting of those who regularly contributed and reviewed code.  The
+details can easily be changed.
+
+You are free to use reason to _persuade_ others to adopt some alternative. 
+If, after that, you truly can not abide by what is mutually agreeable, you
+are asked to do the honourable thing: take your copy of the code, make your
+apologies, and be on your way with good grace.
+
+Those who repeatedly violate the [Code of Conduct](#sec:codeconduct) will be
+asked to leave.
+
+Holding of project assets
+-------------------------
+
+One or more mature, independent trustees, with technical and free software
+experience, will be appointed as the executor(s) for key assets of the
+project to ensure continuity, such as the domain name.
+
+Should a corporate vehicle ever be created to hold such assets it __must__:
+
+* Publish up to date accounts on a regular business.
+* Generally operate openly and transparently.
+* Have control distributed, with a significant degree of control held
+  independent of any contributors with business interests in the software.
+* Carry out no other business itself that may be seen to conflict or compete
+  with the business of others in the community.
+* Have all officers disclose all interests that could be
+  seen to have a bearing on the project, as far as is reasonable.
+
+It not clear at this time that the overheads and potential liabilities of
+such a vehicle would be appropriate for this project.  These principles
+should though still be applied, where possible, to any non-corporate body
+formed around the project.
+
+CODE OF CONDUCT {#sec:codeconduct}
+===============
+
+Participants will treat each other with respect and integrity.  Participants
+will build and treasure the trust that is required for parties to
+successfully collaborate together on free software.  Particularly when those
+parties may have competing interests.  The following principles and
+guidelines should be followed to foster that trust:
+
+* Participants should be open about their goals, and their interests.
+    - Business associations with other participants should be disclosed,
+      so far as is reasonable and where applicable. E.g., if there is voting
+      on matters, or in endorsements or objections to contributions.
+    - Other associations and interests that may be relevant should be
+      disclosed, to the degree necessary to avoid any perception
+      by others of conflicts of interests or of deception.
+    - Be open about your goals, so as to maximise the common understanding
+      and minimise any misunderstandings and disputes.
+* Design should be done in the open
+    -  Do your design on list, ahead of significant implementation.  Avoid
+      "Surprise!" development where possible.
+    - Where significant implementation work must be done behind closed
+      doors, accept that you may be asked to rework it, potentially from
+      scratch once you take it public.
+    - Get "buy in" from others ahead of time, to avoid disappointment.
+* Interaction 
+    - Feedback on design should be constructive, thoughtful and 
+      understanding.
+    - Avoid personalising matters. Discuss the idea, the code, the abstract
+      subject and avoid unnecessary personal pronouns.
+    - Avoid language that paints either party into a corner. Leave some room
+      for doubt. Ask questions, rather than make assertions, where possible.
+* Disputes should be resolved through calm, analytic discussion
+    - Separate out as much of the matter under dispute into principles that
+      can be agreed on, and into the objective domain (by measurement or
+      logic). 
+    - Seek ways to resolve any remaining subjective differences by alternate
+      paths that can accommodate both sides, e.g., through abstraction or
+      modularisation.
+    - Aim for Win-Win.
+* Respect others
+    - Avoid passive-aggressive behaviours. E.g., tit-for-tat
+      non-constructive behaviour. Be explicit.
+    - It is acceptable for management to allocate resources on development
+      according to their need.  It is not acceptable to try use external,
+      management intervention to over-turn positions held by participants.
+
+REQUIRED READING {#sec:required}
+================
+
+Note well: By proposing a change to Quagga, by whatever means, you are
+implicitly agreeing:
+                                                                              
+-   To licence your contribution according to the licence of any files in
+    Quagga being modified, _and_ according to the COPYING file in the
+    top-level directory of Quagga, other than where the contribution
+    explicitly and clearly indicates otherwise.
+
+-   That it is your responsibility to ensure you hold whatever rights are
+    required to be able to contribute your changes under the licenses of the
+    files in Quagga being modified, and the top-level COPYING file.
+                                                                              
+-   That it is your responsibility to give with the contribution a full
+    account of all interests held and claims in the contribution; such as
+    through copyright, trademark and patent laws or otherwise; that are known
+    to you or your associates (e.g.  your employer).
+
+Before contributing to Quagga, you *must*  also read 
+[Section COMMIT MESSAGES](#sec:commit-messages).  
+
+You _should_ ideally read the entire document, as it contains useful
+information on the community norms and how to implement them.
+
+Please note that authorship and any relevant other rights information should
+be _explicitly_ stated with the contribution.  A "Signed-off-by" line is
+_not_ sufficient.  The "Signed-off-by" line is not used by the Quagga
+project.
+
+You may document applicable copyright claims to files being modified or
+added by your contribution.  For new files, the standard way is to add a
+string in the following format near the beginning of the file:
+
+    Copyright (C) <Year> <name of person/entity>[, optional contact details]
+
+When adding copyright claims for modifications to an existing file, please
+preface the claim with "Portions: " on a line before it and indent the
+"Copyright ..." string. If such a case already exists, add your indented
+claim immediately after. E.g.:
+
+    Portions:
+      Copyright (C) <Year> <Entity A> ....
+      Copyright (C) <Year> <Your details> [optional brief change description]
+
+
+GUIDELINES FOR HACKING ON QUAGGA {#sec:guidelines}
+================================
+
+GNU coding standards apply.  Indentation follows the result of
+invoking GNU indent (as of 2.2.8a) with the -–nut argument.
+
+Originally, tabs were used instead of spaces, with tabs are every 8 columns. 
+However, tab’s interoperability issues mean space characters are now preferred for
+new changes. We generally only clean up whitespace when code is unmaintainable
+due to whitespace issues, to minimise merging conflicts.
+
+Be particularly careful not to break platforms/protocols that you
+cannot test.
+
+Parsers or packet-writers of data from untrusted parties, particularly
+remote ones, *MUST* use the lib/stream bounded-buffer abstraction, and use
+its checked getters and putters.  Twiddling of pointers based on contents of
+untrusted data is _strongly_ discouraged - any such code is not acceptable,
+unless there are very good reasons (e.g.  compatibility with external or old
+code that is not easily rewritten).
+
+New code should have good comments, which explain why the code is correct.
+Changes to existing code should in many cases upgrade the comments when
+necessary for a reviewer to conclude that the change has no unintended
+consequences.
+
+Each file in the Git repository should have a git format-placeholder (like
+an RCS Id keyword), somewhere very near the top, commented out appropriately
+for the file type. The placeholder used for Quagga (replacing \<dollar\>
+with \$) is:
+
+`$QuaggaId: <dollar>Format:%an, %ai, %h<dollar> $`
+
+See line 2 of HACKING.tex, the source for this document, for an example.
+
+This placeholder string will be expanded out by the ‘git archive’ commands,
+which is used to generate the tar archives for snapshots and releases.
+
+Please document fully the proper use of a new function in the header file
+in which it is declared.  And please consult existing headers for
+documentation on how to use existing functions.  In particular, please consult
+these header files:
+
+<span>lib/log.h</span> logging levels and usage guidance
+
+<span>[more to be added]</span>
+
+If changing an exported interface, please try to deprecate the interface in
+an orderly manner. If at all possible, try to retain the old deprecated
+interface as is, or functionally equivalent. Make a note of when the
+interface was deprecated and guard the deprecated interface definitions in
+the header file, i.e.:
+
+    /* Deprecated: 20050406 */
+    #if !defined(QUAGGA_NO_DEPRECATED_INTERFACES)
+    #warning "Using deprecated <libname> (interface(s)|function(s))"
+    ...
+    #endif /* QUAGGA_NO_DEPRECATED_INTERFACES */
+
+This is to ensure that the core Quagga sources do not use the deprecated
+interfaces (you should update Quagga sources to use new interfaces, if
+applicable), while allowing external sources to continue to build. 
+Deprecated interfaces should be excised in the next unstable cycle.
+
+Note: If you wish, you can test for GCC and use a function
+marked with the ’deprecated’ attribute.  However, you must provide the
+warning for other compilers.
+
+If changing or removing a command definition, *ensure* that you
+properly deprecate it - use the \_DEPRECATED form of the appropriate DEFUN
+macro. This is *critical*.  Even if the command can no longer
+function, you *MUST* still implement it as a do-nothing stub.
+
+Failure to follow this causes grief for systems administrators, as an
+upgrade may cause daemons to fail to start because of unrecognised commands. 
+Deprecated commands should be excised in the next unstable cycle.  A list of
+deprecated commands should be collated for each release.
+
+See also [Section SHARED LIBRARY VERSIONING](#sec:dll-versioning) below.
+
+YOUR FIRST CONTRIBUTIONS
+========================
+
+Routing protocols can be very complex sometimes. Then, working with an
+Opensource community can be complex too, but usually friendly with
+anyone who is ready to be willing to do it properly.
+
+-   First, start doing simple tasks. Quagga’s patchwork is a good place
+    to start with. Pickup some patches, apply them on your git trie,
+    review them and send your ack’t or review comments. Then, a
+    maintainer will apply the patch if ack’t or the author will have to
+    provide a new update. It help a lot to drain the patchwork queues.
+    See <http://patchwork.quagga.net/project/quagga/list/>
+
+-   The more you’ll review patches from patchwork, the more the Quagga’s
+    maintainers will be willing to consider some patches you will be
+    sending.
+
+-   start using git clone, pwclient
+    <http://patchwork.quagga.net/help/pwclient/>
+
+        $ pwclient list -s new
+        ID    State        Name
+        --    -----        ----
+        179   New          [quagga-dev,6648] Re: quagga on FreeBSD 4.11 (gcc-2.95)
+        181   New          [quagga-dev,6660] proxy-arp patch
+        [...]
+
+        $ pwclient git-am 1046
+
+HANDY GUIDELINES FOR MAINTAINERS
+================================
+
+Get your cloned trie:
+
+      git clone vjardin@git.sv.gnu.org:/srv/git/quagga.git
+
+Apply some ack’t patches:
+
+      pwclient git-am 1046
+        Applying patch #1046 using 'git am'
+        Description: [quagga-dev,11595] zebra: route_unlock_node is missing in "show ip[v6] route <prefix>" commands
+        Applying: zebra: route_unlock_node is missing in "show ip[v6] route <prefix>" commands
+
+Run a quick review. If the ack’t was not done properly, you know who you have
+to blame.
+
+Push the patches:
+
+      git push
+
+Set the patch to accepted on patchwork
+
+      pwclient update -s Accepted 1046
+
+COMPILE-TIME CONDITIONAL CODE
+=============================
+
+Please think very carefully before making code conditional at compile time,
+as it increases maintenance burdens and user confusion. In particular,
+please avoid gratuitous -–enable-… switches to the configure script -
+typically code should be good enough to be in Quagga, or it shouldn’t be
+there at all.
+
+When code must be compile-time conditional, try have the compiler make it
+conditional rather than the C pre-processor - so that it will still be
+checked by the compiler, even if disabled. I.e.  this:
+
+        if (SOME_SYMBOL)
+          frobnicate();
+
+rather than:
+
+      #ifdef SOME_SYMBOL
+      frobnicate ();
+      #endif /* SOME_SYMBOL */
+
+Note that the former approach requires ensuring that SOME\_SYMBOL will
+be defined (watch your AC\_DEFINEs).
+
+COMMIT MESSAGES {#sec:commit-messages}
+======================================
+
+The commit message requirements are:
+
+-   The message *MUST* provide a suitable one-line summary followed by a
+    blank line as the very first line of the message, in the form:
+
+    `topic: high-level, one line summary`
+
+    Where topic would tend to be name of a subdirectory, and/or daemon, unless
+    there’s a more suitable topic (e.g. ’build’). This topic is used to
+    organise change summaries in release announcements.
+
+-   It should have a suitable “body”, which tries to address the
+    following areas, so as to help reviewers and future browsers of the
+    code-base understand why the change is correct (note also the code
+    comment requirements):
+
+    -   The motivation for the change (does it fix a bug, if so which?
+        add a feature?)
+
+    -   The general approach taken, and trade-offs versus any other
+        approaches.
+
+    -   Any testing undertaken or other information affecting the confidence
+        that can be had in the change.
+
+    -   Information to allow reviewers to be able to tell which specific
+        changes to the code are intended (and hence be able to spot any accidental
+        unintended changes).
+
+-   The commit message *must* give details of all the authors of the change,
+    beyond the person listed in the Author field.  Any and all affiliations
+    which may have a bearing on copyright in any way should be clearly
+    stated, unless those affiliations are already obvious from other
+    details, e.g.  from the email address.  This would cover employment and
+    contracting obligations (give details).
+
+    Note: Do not rely on "Signed-off-by" for this, be explicit.
+    
+-   If the change introduces a new dependency on any code or other
+    copyrighted material, please explicitly note this.  Give details of what
+    that external material is, the copyright licence the material may be
+    used under, and the nature of the dependency.
+
+The one-line summary must be limited to 54 characters, and all other
+lines to 72 characters.
+
+Commit message bodies in the Quagga project have typically taken the
+following form:
+
+-   An optional introduction, describing the change generally.
+
+-   A short description of each specific change made, preferably:
+
+    -   file by file
+
+        -   function by function (use of “ditto”, or globs is allowed)
+
+Contributors are strongly encouraged to follow this form.
+
+This itemised commit messages allows reviewers to have confidence that the
+author has self-reviewed every line of the patch, as well as providing
+reviewers a clear index of which changes are intended, and descriptions for
+them (C-to-english descriptions are not desirable - some discretion is
+useful).  For short patches, a per-function/file break-down may be
+redundant.  For longer patches, such a break-down may be essential.  A
+contrived example (where the general discussion is obviously somewhat
+redundant, given the one-line summary):
+
+>     zebra: Enhance frob FSM to detect loss of frob
+>
+>     Add a new DOWN state to the frob state machine to allow the barinator to
+>     detect loss of frob.
+>
+>     * frob.h: (struct frob) Add DOWN state flag.
+>     * frob.c: (frob_change) set/clear DOWN appropriately on state change.
+>     * bar.c: (barinate) Check frob for DOWN state.
+
+Please have a look at the git commit logs to get a feel for what the norms
+are.
+
+Note that the commit message format follows git norms, so that “git log
+–oneline” will have useful output.
+
+HACKING THE BUILD SYSTEM
+========================
+
+If you change or add to the build system (configure.ac, any Makefile.am,
+etc.), please heck that the following things still work:
+
+-   make dist
+
+-   resulting dist tarball builds
+
+-   out-of-tree builds
+
+This can be achieved by running 'make distcheck'
+
+The quagga.net site relies on make dist to work to generate snapshots. It
+must work. Common problems are to forget to have some additional file
+included in the dist, or to have a make rule refer to a source file without
+using the srcdir variable.
+
+RELEASE PROCEDURE
+=================
+
+To make a release:
+
+-   Edit configure.ac, bump the version and commit the change with
+    a "release: <version" subject.
+
+The 'release.sh' script should then be used. It should be run with 2
+arguments, the release tag for the release to be carried, and the tag of the
+previous release, e.g.:
+
+       release.sh quagga-1.1.1 quagga-1.1.0
+
+The 'release.sh' will carry out these steps for you:
+
+-   Tag the appropriate commit with a release tag (follow existing
+    conventions), with:
+
+       git tag -u <release signing key id> <quagga-release-tag>
+
+-   Create a fresh tar archive of the quagga.net repository, and do a
+    test build.  Use git archive to ensure it consists of files in the
+    repository, and to carry out the keyword expansions.  Do NOT do this in
+    a subdirectory of the Quagga sources, autoconf will think it’s a
+    sub-package and fail to include neccessary files.
+
+            git archive ... <quagga-release-tag> | tar xC ..
+
+            autoreconf -i && ./configure && make && make dist-gzip
+
+-   Similarly test the dist tarball produced. This is the tarball to be
+    released. This is important.
+
+-   Sign the dist tarball to be released
+            
+           gpg -u 54CD2E60 -a --detach-sign quagga-0.99.99.99.tar
+
+The 'release.sh' script, if finishes successfully,  will print out
+instructions on the files it has created and the details on remaining steps
+to be carried out to complete the release. Which roughly are:
+
+-   Upload the release tarball, its PGP signature, and the full changelog
+    to the public release area on Savannah
+
+-   Add the version number on https://bugzilla.quagga.net/, under
+    Administration, Products, “Quagga”, Edit versions, Add a version.
+
+-   Post a news entry on Savannah
+
+-   Send a mail to quagga-dev and quagga-users
+
+If any errors occur, move tags as needed and start over again with the
+release.sh script.  Do not try to append stuff to tarballs, as this has
+produced non-standards-conforming tarballs in the past.
+
+[TODO: collation of a list of deprecated commands. Possibly can be
+scripted to extract from vtysh/vtysh\_cmd.c]
+
+TOOL VERSIONS
+=============
+
+Require versions of support tools are listed in INSTALL.quagga.txt.
+Required versions should only be done with due deliberation, as it can
+cause environments to no longer be able to compile quagga.
+
+SHARED LIBRARY VERSIONING {#sec:dll-versioning}
+=========================
+
+[this section is at the moment just gdt’s opinion]
+
+Quagga builds several shared libaries (lib/libzebra, ospfd/libospf,
+ospfclient/libsopfapiclient).  These may be used by external programs,
+e.g. a new routing protocol that works with the zebra daemon, or
+ospfapi clients.  The libtool info pages (node Versioning) explain
+when major and minor version numbers should be changed.  These values
+are set in Makefile.am near the definition of the library.  If you
+make a change that requires changing the shared library version,
+please update Makefile.am.
+
+libospf exports far more than it should, and is needed by ospfapi
+clients.  Only bump libospf for changes to functions for which it is
+reasonable for a user of ospfapi to call, and please err on the side
+of not bumping.
+
+There is no support intended for installing part of zebra.  The core
+library libzebra and the included daemons should always be built and
+installed together.
+
+GIT COMMIT SUBMISSION {#sec:git-submission}
+=====================
+
+The preferred method for submitting changes is to provide git commits via a
+publicly-accessible git repository, which the maintainers can easily pull.
+
+The commits should be in a branch based off the Quagga.net master - a
+“feature branch”.  Ideally there should be no commits to this branch other
+than those in master, and those intended to be submitted.  However, merge
+commits to this branch from the Quagga master are permitted, though strongly
+discouraged - use another (potentially local and throw-away) branch to test
+merge with the latest Quagga master.
+
+Recommended practice is to keep different logical sets of changes on
+separate branches - “topic” or “feature” branches.  This allows you to still
+merge them together to one branch (potentially local and/or “throw-away”)
+for testing or use, while retaining smaller, independent branches that are
+easier to merge.
+
+All content guidelines in [Section PATCH SUBMISSION](#sec:patch-submission)
+apply.
+
+PATCH SUBMISSION {#sec:patch-submission}
+================
+
+-   For complex changes, contributors are strongly encouraged to first
+    start a design discussion on the quagga-dev list *before* starting
+    any coding.
+
+-   Send a clean diff against the ’master’ branch of the quagga.git
+    repository, in unified diff format, preferably with the ’-p’
+    argument to show C function affected by any chunk, and with the -w
+    and -b arguments to minimise changes. E.g:
+
+    git diff -up mybranch..remotes/quagga.net/master
+
+    It is preferable to use git format-patch, and even more preferred to
+    publish a git repository (see 
+    [Section GIT COMMIT SUBMISSION](#sec:git-submission)).
+
+    If not using git format-patch, Include the commit message in the
+    email.
+
+-   After a commit, code should have comments explaining to the reviewer
+    why it is correct, without reference to history. The commit message
+    should explain why the change is correct.
+
+-   Include NEWS entries as appropriate.
+
+-   Include only one semantic change or group of changes per patch.
+
+-   Do not make gratuitous changes to whitespace. See the w and b
+    arguments to diff.
+
+-   Changes should be arranged so that the least controversial and most
+    trivial are first, and the most complex or more controversial are
+    last. This will maximise how many the Quagga maintainers can merge,
+    even if some other commits need further work.
+
+-   Providing a unit-test is strongly encouraged. Doing so will make it
+    much easier for maintainers to have confidence that they will be
+    able to support your change.
+
+-   New code should be arranged so that it easy to verify and test. E.g.
+    stateful logic should be separated out from functional logic as much
+    as possible: wherever possible, move complex logic out to smaller
+    helper functions which access no state other than their arguments.
+
+-   State on which platforms and with what daemons the patch has been
+    tested. Understand that if the set of testing locations is small,
+    and the patch might have unforeseen or hard to fix consequences that
+    there may be a call for testers on quagga-dev, and that the patch
+    may be blocked until test results appear.
+
+    If there are no users for a platform on quagga-dev who are able and
+    willing to verify -current occasionally, that platform may be
+    dropped from the “should be checked” list.
+
+PATCH APPLICATION
+=================
+
+-   Only apply patches that meet the submission guidelines.
+
+-   If the patch might break something, issue a call for testing on the
+    mailing-list.
+
+-   Give an appropriate commit message (see above), and use the –author
+    argument to git-commit, if required, to ensure proper attribution
+    (you should still be listed as committer)
+
+-   Immediately after commiting, double-check (with git-log and/or
+    gitk). If there’s a small mistake you can easily fix it with ‘git
+    commit –amend ..’
+
+-   When merging a branch, always use an explicit merge commit. Giving
+    –no-ff ensures a merge commit is created which documents “this human
+    decided to merge this branch at this time”.
+
+STABLE PLATFORMS AND DAEMONS
+============================
+
+The list of platforms that should be tested follow.  This is a list
+derived from what quagga is thought to run on and for which
+maintainers can test or there are people on quagga-dev who are able
+and willing to verify that -current does or does not work correctly.
+
+-   BSD (Free, Net or Open, any platform)
+
+-   GNU/Linux (any distribution, i386)
+
+-   Solaris (strict alignment, any platform)
+
+-   future: NetBSD/sparc64
+
+The list of daemons that are thought to be stable and that should be
+tested are:
+
+-   zebra
+
+-   bgpd
+
+-   ripd
+
+-   ospfd
+
+-   ripngd
+
+Daemons which are in a testing phase are
+
+-   ospf6d
+
+-   isisd
+
+-   watchquagga
+
+USEFUL URLs
+===========
+
+*   The project homepage is at:
+
+    <https://www.quagga.net>
+
+
+*   Bugs can be reported via Bugzilla at:
+
+    <https://bugzilla.quagga.net>
+
+*   Buildbot runs CI tests, and is at:
+
+    <https://buildbot.quagga.net>
+
+    It tests commits and  jobs submitted on local changes via
+    'buildbot try ...' for developers.
+
+*   Patchwork tracks any patches emailed to the quagga-dev list, and is at:
+
+    <https://patchwork.quagga.net/project/quagga/list/>
+
+
+BUILDBOT
+========
+
+The buildbot client can be used to test changes before committing, with
+"buildbot try".
+
+-   Ask for a buildbot account
+
+-   Install the buildbot client
+
+-   Configure it, e.g.:
+
+    ~~~~~
+    $ cat ~/.buildbot/options
+    try_master = 'radia.quagga.net:8031'
+    try_username = 'paul'
+    try_password = 'password123'
+    try_vc = 'git'
+    try_branch = 'master'
+    try_wait = True
+    $ buildbot try -c pb --get-builder-names
+    using 'pb' connect method
+    The following builders are available for the try scheduler: 
+    build-fedora-24
+    ...
+    ~~~~~
+
+-   You can then submit your local changes to try build:
+
+    ~~~~
+    $ buildbot try -c pb
+    ~~~~
+
+    or use the -b argument to limit to a specific builder (recommended).
+
+    ~~~~~
+    $ buildbot try -c pb -b build-distcheck
+    ~~~~~
+
+-  To test a series of locally committed change use git diff:
+
+    ~~~~
+    git diff <base rev>.. | buildbot try -c pb --vc git \
+        -b build-centos-7  --branch=volatile/next --diff=- -p 1
+    ~~~~
\ No newline at end of file
diff --git a/HACKING.pending b/HACKING.pending
new file mode 100644 (file)
index 0000000..73d3194
--- /dev/null
@@ -0,0 +1,12 @@
+This file contains pointers to work done on quagga that is not in the
+quagga git repository or quagga bugzilla.
+
+* public git repositories
+
+** git remote add mtr http://github.com/tomhenderson/quagga-mtr.git
+
+Tom Henderson of Boeing has created a repository to work on
+multi-topology routing support for OSPF.  Work on this repository
+takes place on the branch mtr, which has a branch point of 0.99.17
+
+* posted patches
diff --git a/INSTALL.quagga.txt b/INSTALL.quagga.txt
new file mode 100644 (file)
index 0000000..11c85b1
--- /dev/null
@@ -0,0 +1,112 @@
+--------------------------------------------------------------------------
+Building and Installing Quagga from releases or snapshots:
+
+The 'INSTALL' file contains generic instructions on how to use 'configure'
+scripts.
+
+Quagga requires a C compiler (and associated header files and
+libraries) supporting the C99 standard.
+
+Quagga requires a reasonable make.  It is considered a bug if quagga
+does not compile with the system make on recent FreeBSD, NetBSD or
+OpenBSD, and a very serious bug if it does not compile with GNU make.
+
+Quagga expects a POSIX.2 compliant system, more or less.  Clean
+workarounds for POSIX non-compliance are welcome.
+
+It is considered a bug if Quagga fails to build and run on any of the
+following systems (where .x indicates the most recent release), or
+such systems "-current" versions.  Or, it might be that this list is
+out of date and will be updated.  (Note that considering it a bug is
+not a guarantee of support, merely "we agree that it is broken".)
+
+  Dragonfly ?
+  FreeBSD (stable branches currently supported, plus perhaps one)
+  FreeBSD-current
+  Linux [kernel/distribution information needed]
+  NetBSD 4.x
+  NetBSD 5.x
+  NetBSD 6.x
+  NetBSD-current
+  OpenBSD ? [info needed on what should work]
+  Solaris (modern/supported versions, including OpenSolaris forks) 
+
+On BSD systems, installing libexecinfo is strongly recommended in order
+to get backtrace support.
+
+For further Quagga specific information on 'configure' and build-time
+configuration of the software, please read the Quagga info
+documentation, (doc/quagga.info).  To read the info page included with
+the Quagga sources without first installing Quagga:
+
+  cd doc
+  # one of the following, depending on your info viewer preferences
+  info quagga.info
+  pinfo -r quagga.info
+  emacs -eval '(info "quagga.info")'
+
+The Quagga website (http://www.quagga.net) currently has the info
+files available in various formats.
+
+--------------------------------------------------------------------------
+Building Quagga from git checkouts:
+
+In order to build from git, you will need recent versions of several GNU
+tools, particularly autoconf, automake, libtool, GNU awk and texinfo.  Note
+that the CVS snapshots on the Quagga website should not require these tools;
+everything is already setup ready to run 'configure'.  If you have trouble
+building from CVS checkout it is recommended that you try a CVS snapshot
+instead.
+
+We declare that the following versions should work for building from
+CVS checkouts.  Earlier versions may work, but failure to do so is not
+a bug.  Required versions can be moved earlier if no problems, or
+later after a judgement that a system without a higher version is
+deficient is made.
+
+       [TODO: this list is out of date as of 2013-07]
+       automake:       1.9.6 (released 2005-07-10)
+       autoconf:       2.59 (2.60 on 2006-06-26 is too recent to require)
+       libtool:        1.5.22 (released 2005-12-18)
+       texinfo:        4.7 (released 2004-04-10; 4.8 is not yet common)
+       GNU AWK:        3.1.5 (released 2005-08-12)
+
+For running tests, one also needs:
+
+       DejaGnu:
+
+[TODO: texinfo 4.6 is now ancient and this should be revisited/fixed]
+Because some systems provide texinfo 4.6 (4.7 is new), quagga.info is
+checked in so that texinfo will generally not be invoked.  When
+texinfo 4.7 is widespread, quagga.info will be removed from CVS and
+texinfo will become required again.  (4.7 has figure support, needed
+for the route server docs, which is why 4.6 doesn't work.)
+
+In order to create PostScript or PDF versions of the Texinfo documentation,
+you will need the convert utility, from the ImageMagick toolset installed,
+and epstopdf from the TeTeX suite.
+
+To create the required autotools files (Makefile.in, configure, etc.),
+run "./bootstrap.sh".  After this you may run configure as for a
+snapshot or release.
+
+Please refer to "Building and Installing Quagga" above for further
+instructions.
+
+--------------------------------------------------------------------------
+Notes on required versions:
+
+The general goal is to use a modern baseline of tools, while not
+imposing pain on those tracking supported (or almost supported) stable
+distributions.  The notes below explain what versions are present in
+various environments.
+
+NetBSD 4 provides texinfo 4.7.
+NetBSD 5 and 6 provides texinfo 4.8
+
+Fedora Core ? provides autoconf 2.59.
+
+OpenBSD 3.6 provides texinfo 4.2.
+OpenBSD [3.6] ports provides automake 1.4-p6 autoconf 2.5.9 libtool 1.5.8
+
+--------------------------------------------------------------------------
diff --git a/Makefile.am b/Makefile.am
new file mode 100644 (file)
index 0000000..3c3b65e
--- /dev/null
@@ -0,0 +1,26 @@
+## Process this file with automake to produce Makefile.in.
+
+SUBDIRS = lib qpb fpm @ZEBRA@ @BGPD@ @RIPD@ @RIPNGD@ @OSPFD@ @OSPF6D@ @NHRPD@ \
+         @ISISD@ @PIMD@ @WATCHQUAGGA@ @VTYSH@ @OSPFCLIENT@ @DOC@ m4 @pkgsrcdir@ \
+         redhat @SOLARIS@ tests
+
+DIST_SUBDIRS = lib qpb fpm zebra bgpd ripd ripngd ospfd ospf6d nhrpd \
+         isisd watchquagga vtysh ospfclient doc m4 pkgsrc redhat tests \
+         solaris pimd
+
+EXTRA_DIST = aclocal.m4 SERVICES TODO REPORTING-BUGS INSTALL.quagga.txt \
+       update-autotools \
+       vtysh/Makefile.in vtysh/Makefile.am \
+       tools/zebra.el tools/multiple-bgpd.sh
+
+if HAVE_PANDOC
+
+HACKING.pdf: HACKING.md
+       pandoc -o $@ $<
+
+clean-local:
+       -$(LATEXMK) -C HACKING.tex
+
+endif
+
+ACLOCAL_AMFLAGS = -I m4
diff --git a/NEWS b/NEWS
new file mode 100644 (file)
index 0000000..6db831e
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,2594 @@
+Note: this file lists major user-visible changes only.
+
+* Changes in Quagga []
+
+- [zebra] "no link-detect" is no longer the default.  
+
+    The previous release of Quagga always explicitly writes-out the
+    link-detect configuration state.  Therefore, to retain current behavior
+    save your config with the prior release before updating.
+
+    Otherwise, review your configuration.  Note, most users will generally
+    want to have link-detect enabled, and so can just remove 'no
+    link-detect' from their interface configuration.
+
+    This release also adds a global configuration to specify the default,
+    which can be specified in the zebra configuration as:
+
+      default link-detect (on|off)
+
+    This will then apply to any interface which does not have link-detect
+    explicitly configured.
+
+* Changes in Quagga 0.99.24
+
+User-visible changes:
+- [pimd] New daemon: pimd provides IPv4 PIM-SSM multicast routing.
+- [bgpd] New feature: "next-hop-self all" to override nexthop on iBGP route
+    reflector setups.
+- [bgpd] route-maps have a new action "set ipv6 next-hop peer-address"
+- [bgpd] route-maps have a new action "set as-path prepend last-as"
+- [bgpd] Update validity checking (particularly MP-BGP / IPv6 routes) was
+    touched up significantly.  Please report possible bugs.
+- [ripd] New feature: RIP for IPv4 now supports equal-cost multipath (ECMP)
+- [zebra] Multicast RIB support has been extended.  It still is IPv4 only.
+- [zebra] "no link-detect" is now printed in configurations since it won't
+    be the default anymore soon.  To retain current behaviour, re-save your
+    configuration after updating to 0.99.24.
+
+Distributor-visible changes:
+- --enable-pimd is added to enable pimd.  It is considered experimental, though
+    unless the distribution target is embedded systems with little flash, there
+    is no reason to not include it in packages.
+- --disable-ipv6 no longer exists as an option.  It's 2015, your C library
+    really needs to have IPv6 support by now.
+- --disable-netlink no longer exists as an option.  It didn't work anyway.
+- --disable-solaris no longer exists as an option.  It only controlled some
+    init scripts.
+- --enable-isisd is now the default.
+- mrlg.cgi is no longer included (it was severely outdated).  It can be found
+    independently at http://mrlg.op-sec.us/
+- build on Linux with the musl C library should now work
+
+* Changes in Quagga 0.99.23
+
+Known issues:
+- [bgpd] setting an extcommunity in a route map on a route that already has
+  an extcommunity attribute will cause bgpd to crash.  This issue will be
+  fixed in a followup minor release.
+
+User-visible changes:
+- [lib] Performance enhancements on hashes and timers.
+- [bgpd] New feature: iBGP TTL security.
+- [bgpd] New feature: relaxed bestpath criteria for multipath and improved
+  display of multipath routes in "show ip bgp".  Scripts parsing this output
+  may need to be updated.
+- [bgpd] Multiprotocol peerings over IPv6 now try to find a more appropriate
+  IPv4 nexthop by looking at the interface.
+- [ospf6d] A large amount of changes has been merged for ospf6d.  Careful
+  evaluation prior to deployment is recommended.
+- [zebra] Recursive route support has been overhauled.  Scripts parsing
+  "show ip route" output may need adaptation.
+- [zebra] IPv6 address management has been improved regarding tentative
+  addresses.  This is visible in that a freshly configured address will not
+  immediately be marked as usable.
+- [*] a lot of bugs have been fixed, please refer to the git log
+
+* Changes in Quagga 0.99.22
+
+- [bgpd] The semantics of default-originate route-map have changed.
+  The route-map is now used to advertise the default route conditionally.
+  The old behaviour which allowed to set attributes on the originated
+  default route is no longer supported.
+- [bgpd] There is now a replace-as option to neighbor ... local-as ...
+  no-prepend.  For details, refer to the user documentation.
+- [zebra] An FPM interface has been added.  This provides an alternate
+  interface to routing information and is geared at OpenFlow & co.
+- [snmp] AgentX is now supported;  the old smux backend is considered
+  deprecated.  ospf6d has also had OSPFV3-MIB added.
+- [*] several issues with configuration save/load/apply have been fixed,
+  in particular on ospf "max-metric router-lsa administrative" and
+  "distribute-list", bgpd "no neighbor activate", isisd "metric-style",
+- [*] a lot of bugs have been fixed, please refer to the git log
+
+* Changes in Quagga 0.99.21
+
+- [bgpd] BGP multipath support has been merged
+- [bgpd] SAFI (Multicast topology) support has been extended to propagate
+  the topology to zebra.
+- [bgpd] AS path limit functionality has been removed
+- [babeld] a new routing daemon implementing the BABEL ad-hoc mesh routing
+  protocol has been merged.
+- [isisd] a major overhaul has been picked up. Please note that isisd is
+  STILL NOT SUITABLE FOR PRODUCTION USE.
+- [*] a lot of bugs have been fixed, please refer to the git log
+
+* Changes in Quagga 0.99.10
+
+- [bgpd] 4-byte AS support added
+- [bgpd] MRT format changes to version 2. Those relying on
+  bgpd MRT table dumps may need to update their tools.
+- [bgpd] Added new route-map set statement: "as-path exclude"
+- Zebra RIB updates queue has evolved into a multi-level
+  structure to address RIB consistency issues.
+
+* Changes in Quagga 0.99.2
+
+- [bgpd] Work queues added to bgpd to split up update processing,
+  particularly beneficial when a peer session goes down. AS_PATH
+  parsing rewritten to be clearer, more robust and ready for 4-byte.
+
+- [ripd] Simple authentication is no longer the default authentication
+  mode for ripd. The default is now no-authentication. Any setups which
+  used simple authentication will probably need to update their
+  configuration manually.
+
+- [ospfd] 1s dead-interval with sub-second Hellos feature added.
+  SPF timers now specified in milliseconds, and with adaptive
+  hold-time support. RFC3137 Stub-router support added. Default ABR
+  type is now 'cisco'.
+
+- Solaris least privileges support added.
+
+* Changes in Quagga 0.99.1
+
+- Zserv is now buffered via threads and non-blocking in most cases for both
+  clients and zebra, which should improve responsiveness of daemons when
+  they must send many messages to zebra.
+
+- 'show thread cpu' now displays both cpu+system and wall-clock time,
+  where getrusage() is available.
+
+- Background threads added and workqueue API added, with a
+  'show work-queues' command. Thread scheduling improved slightly.
+
+- Zebra now has a work-queue for RIB processing. See 'show work-queues' in
+  the zebra daemon vty.
+
+- Support for interface renaming on Linux netlink systems.
+
+- GNU Zebra bgpd merges, including BGP Graceful-restart and "match ip
+  route-source" command.
+
+- Automatic logging of backtraces should daemons crash to assist in
+  diagnosis. See the documentation for more information on configuring
+  logging correctly, and set --enable-gcc-rdynamic if compiling with gcc.
+
+* Changes in Quagga 0.98.0
+
+- Logging facilities upgraded.  One can now specify a severity level
+  for each logging destination.  And a new "show logging" command gives
+  thorough information on the current logging system configuration.
+
+- Watchquagga daemon added.  This is not well tested yet.  Please try
+  monitor mode first before enabling restart features.  It is important
+  to make sure that the various timers are configured with appropriate
+  values for your site.
+
+- BGP route-server support added. See the texinfo documentation.
+
+- OSPF API initialisation is disabled by default even if compiled in. You
+  can enable it with -a/--apiserver command line switch.
+
+- "write-config integrated" vtysh command replaced with "service
+  integrated-vtysh-config" command.
+
+- Router id is now handled by zebra daemon and all daemons receive changes
+  from it. Router id can be overriden in daemons' configurations of course.
+  To fix common router id in zebra daemon you can either install non-127
+  address on loopback or use "router-id x.x.x.x" command.
+
+- "secondary" keyword is removed from ip address configuration. All
+  supported OS'es have their own vision what's secondary address and
+  how to handle it.
+
+- Zebra no longer enables forwarding by default. If you rely on zebra to
+  enable forwarding make sure to add '<ip|ip6> forwarding' statements
+  to your zebra configuration file.
+
+- All libraries are built and used shared, on platforms where libtool
+  supports shared libraries.
+
+- Router advertisement syntax is changed. In usual cases (if you didn't do
+  any fancy stuff) it's enough to change lines in configuration from:
+  "ipv6 nd prefix-advertisement X:X:X:X::/X 2592000 604800 autoconfig on-link"
+  to:
+  "ipv6 nd prefix X:X:X:X::/X"
+
+  All router advertisement options are documented in texi documentation.
+
+- --enable-nssa configure switch is removed. NSSA support is stable enough.
+
+- Daemons don't look at current directory for config file any more.
+
+* Changes in Quagga 0.96.5
+
+- include files are installed in $(prefix)/include/quagga.  Programs
+  building against these includes should -I$(prefix)/include and e.g.
+  #include <quagga/routemap.h>
+
+- New option --enable-exampledir puts example files in a separate
+  directory from $(sysconfdir), easing NetBSD pkgsrc hierarchy rules
+  compliance.
+
+- New configure options --enable-configfile-mask and
+  --enable-logfile-mask to set umask values for config and log
+  values.  Masks default to 0600, matching previous behavior.
+
+- Import current CVS isisd from SourceForge, then merge it with
+  the Quagga's Framework.
+
+* Changes in Quagga 0.96.4
+
+- Further fixes to ospfd, some relating to the PtP revert. Interface
+lookups should be a lot more robust now. 
+
+- Fix for a remote triggerable crash in vty layer.
+
+- Improvements to ripd, and addition of split horizon support.
+
+- Improved bgpd table support, now dumps at time of day intervals rather
+than time from startup intervals. Much improved support for IPv6 table
+dumps. show commands for views improved.
+
+* Changes in Quagga 0.96.3
+
+- revert the 'generic PtP' patch. Means Quagga will no longer work with
+FreeSWAN, however, on the plus side this gets rid of a lot of niggly bugs
+which the PtP patch introduced.
+
+* Changes in Quagga 0.96.2
+
+- Fix crash in ospfd
+
+* Changes in Quagga 0.96.1
+
+- Iron out problem with the privileges definitions
+
+* Changes in Quagga 0.96
+
+- Privilege support, daemons now run with the minimal privileges needed, see
+  the documentation for details.
+  
+- NSSA ABR support in ospfd.
+
+- OSPF-API support merged in.
+
+- 6WIND patch merged in.
+
+* Changes in zebra-0.93
+
+* Changes in bgpd
+
+** Configuration is changed to new format.
+
+* Changes in ospfd
+
+** Crush bugs which reported on Zebra ML is fixed.
+
+** Opaque LSA and TE LSA support is added by KDD R&D Laboratories,
+   Inc.
+
+* Chages in ospf6d
+
+** Many bugs are fixed.
+
+* Changes in zebra-0.92a
+
+* Changes in bgpd
+
+** Fix "^$" community list bug.
+
+** Below command's Address Family specific configurations are added
+
+  nexthop-self
+  route-reflector-client
+  route-server-client
+  soft-reconfiguration inbound
+
+* Changes in zebra
+
+** Treat kernel type routes as EGP routes.
+
+* Changes in zebra-0.92
+
+** Overall security is improved.  Default umask is 0077.
+
+* Changes in ripd
+
+** If output interface is in simple password authentication mode,
+substruct one from rtemax.
+
+* Changes in bgpd
+
+** IPv4 multicast and IPv6 unicast configuration is changed to so
+called new config.  All of AFI and SAFI specific configuration is
+moved to "address-family" node.  When you have many IPv6 only
+configuration, you will see many "no neighbor X:X::X:X activate" line
+in your configuration to disable IPv4 unicast NLRI exchange.  In that
+case please use "no bgp default ipv4-unicast" command to suppress the
+output.  Until zebra-0.93, old config is still left for compatibility.
+
+Old config
+==========
+router bgp 7675
+ bgp router-id 10.0.0.1
+ redistribute connected
+ network 192.168.0.0/24
+ neighbor 10.0.0.2 remote-as 7675
+ ipv6 bgp network 3ffe:506::/33
+ ipv6 bgp network 3ffe:1800:e800::/40
+ ipv6 bgp aggregate-address 3ffe:506::/32
+ ipv6 bgp redistribute connected
+ ipv6 bgp neighbor 3ffe:506:1000::2 remote-as 1
+
+New config
+==========
+router bgp 7675
+ bgp router-id 10.0.0.1
+ network 192.168.0.0/24
+ redistribute connected
+ neighbor 10.0.0.2 remote-as 7675
+ neighbor 3ffe:506:1000::2 remote-as 1
+ no neighbor 3ffe:506:1000::2 activate
+!
+ address-family ipv6
+  network 3ffe:506::/33
+  network 3ffe:1800:e800::/40
+  aggregate-address 3ffe:506::/32
+  redistribute connected
+  neighbor 3ffe:506:1000::2 activate
+ exit-address-family
+
+* Changes in ospfd
+
+** Internal interface treatment is changed.  Now ospfd can handle
+multiple IP address for an interface.
+
+** Redistribution of loopback interface's address works fine.
+
+* Changes in zebra-0.91
+
+** --enable-oldrib configure option is removed.
+
+** HAVE_IF_PSEUDO part is removed.  Same feature is now supported by
+default.
+
+* Changes in ripd
+
+** When redistributed route is withdrawn, perform poisoned reverse.
+
+* Changes in zebra
+
+** When interface's address is removed, kernel route pointing out to
+the address is removed.
+
+** IPv6 RIB is now based upon new RIB code.
+
+** zebra can handle same connected route to one interface.
+
+** New command for interface address.  Currently this commands are
+only supported on GNU/Linux with netlink interface.
+
+"ip address A.B.C.D secondary"
+"ip address A.B.C.D label LABEL"
+
+* Changes in bgpd
+
+** BGP flap dampening bugs are fixed.
+
+** BGP non-blocking TCP connection bug is fixed.
+
+** "show ip bgp summary" shows AS path and community entry number.
+
+** New commands have been added.
+  "show ip bgp cidr-only"
+  "show ip bgp ipv4 (unicast|multicast) cidr-only"
+  "show ip bgp A.B.C.D/M longer-prefixes"
+  "show ip bgp ipv4 (unicast|multicast) A.B.C.D/M longer-prefixes"
+  "show ipv6 bgp X:X::X:X/M longer-prefixes"
+  "show ipv6 mbgp X:X::X:X/M longer-prefixes"
+
+** IPv6 IBGP nexthop change is monitored.
+
+** Unknown transitive attribute is passed with partial flag bit on.
+
+* Changes in ospfd
+
+** Fix bug of LSA MaxAge flood.
+
+** Fix bug of NSSA codes.
+
+* Changes in zebra-0.90
+
+** From this beta release, --enable-unixdomain and --enable-newrib
+becomes default.  So both options are removed from configure.in.  To
+revert old behavior please specify below option.
+
+--enable-tcp-zebra # TCP/IP socket is used for protocol daemon and zebra.
+--enable-oldrib    # Turn on old RIB implementation.
+
+Old RIB implementation will be removed in zebra-0.91.
+
+** From this beta release --enable-multipath is supported.  This
+option is only effective on GNU/Linux kernel with
+CONFIG_IP_ADVANCED_ROUTER and CONFIG_IP_ROUTE_MULTIPATH is set.
+
+--enable-multipath=ARG  # ARG must be digit.  When ARG is 0 unlimit multipath number.
+
+** From this release we do not include guile files.
+
+* Changes in lib
+
+** newlist.[ch] is merged with linklist.[ch].
+
+** Now Zebra works on MacOS X public beta.
+
+** Access-list can have remark.  "access-list WORD remark LINE" define
+remark for specified access-list.
+
+** Key of key-chain is sorted by it's idetifier value.
+
+** prefix-list rule is slightly changed.  The rule of "len <= ge-value
+<= le-value" is changed to "len < ge-value <= le-value".
+
+** According to above prefix-list rule change, add automatic
+conversion function of an old rule. ex.) 10.0.0.0/8 ge 8 -> 10.0.0.0/8
+le 32
+
+** SMUX can handle SNMP trap.
+
+** In our event library, event thread is executed before any other
+thread like timer, read and write event.
+
+** Robust method for writing configuration file and recover from
+backing up config file.
+
+** Display "end" at the end of configuration.
+
+** Fix memory leak in vtysh_read().
+
+** Fix memroy leak about access-list and prefix-list name.
+
+* Changes in zebra
+
+** UNIX domain socket server of zebra protocol is added.
+
+** Fix PointoPoint interface network bug.  The destination network
+should be installed into routing table instead of local network.
+
+** Metric value is reflected to kernel routing table.
+
+** "show ip route" display uptime of RIP,OSPF,BGP routes.
+
+** New RIB implementation is added.
+
+Now we have enhanced RIB (routing information base) implementation in
+zebra.  New RIB has many new features and fixed some bugs which exist
+in old RIB code.
+
+*** Static route with distance value
+
+    Static route can be specified with administrative distance.  The
+  distance value 255 means it is not installed into the kernel.
+  Default value of distance for static route is 1.
+  
+    ip route A.B.C.D/M A.B.C.D <1-255>
+    ip route A.B.C.D/M IFNAME <1-255>
+  
+    If the least distance value's route's nexthop are unreachable,
+  select the least distance value route which has reachable nexthop is
+  selected.
+  
+    ip route 0.0.0.0/0 10.0.0.1
+    ip route 0.0.0.0/0 11.0.0.1 2
+  
+    In this case, when 10.0.0.1 is unreachable and 11.0.0.1 is
+  reachable.  The route with nexthop 11.0.0.1 will be installed into
+  forwarding table.
+  
+    zebra> show ip route
+    S>* 0.0.0.0/0 [2/0] via 11.0.0.1
+    S   0.0.0.0/0 [1/0] via 10.0.0.1 inactive
+  
+    If the nexthop is unreachable "inactive" is displayed.  You can
+  specify any string to IFNAME.  There is no need of the interface is
+  there when you configure the route.
+  
+    ip route 1.1.1.1/32 ppp0
+  
+  When ppp0 comes up, the route is installed properly.
+
+*** Multiple nexthop routes for one prefix
+
+    Multiple nexthop routes can be specified for one prefix.  Even the
+  kernel support only one nexthop for one prefix user can configure
+  multiple nexthop.
+  
+    When you configure routes like below, prefix 10.0.0.1 has three
+  nexthop.
+  
+    ip route 10.0.0.1/32 10.0.0.2
+    ip route 10.0.0.1/32 10.0.0.3
+    ip route 10.0.0.1/32 eth0
+  
+    If there is no route to 10.0.0.2 and 10.0.0.3.  And interface eth0
+    is reachable, then the last route is installed into the kernel.
+  
+    zebra> show ip route
+    S>  10.0.0.1/32 [1/0] via 10.0.0.2 inactive
+                          via 10.0.0.3 inactive
+      *                   is directly connected, eth0
+  
+    '*' means this nexthop is installed into the kernel. 
+
+*** Multipath (more than one nexthop for one prefix) can be installed into the kernel.
+
+    When the kernel support multipath, zebra can install multipath
+  routes into the kernel.  Before doing that please make it sure that
+  setting --enable-multipath=ARG to configure script.  ARG must be digit
+  value.  When specify 0 to ARG, there is no limitation of the number
+  of the multipath.  Currently only GNU/Linux with netlink interface is
+  supported.
+  
+    ip route 10.0.0.1/32 10.0.0.2
+    ip route 10.0.0.1/32 10.0.0.3
+    ip route 10.0.0.1/32 eth0
+  
+    zebra> show ip route
+    S>* 10.0.0.1/32 [1/0] via 10.0.0.2
+      *                   via 10.0.0.3
+                          is directly connected, eth0
+
+*** Kernel message delete installed route.
+
+    After zebra install static or dynamic route into the kernel.
+  
+    R>* 0.0.0.0/0 [120/3] via 10.0.0.1
+  
+    If you delete this route outside zebra, old zebra does not reinstall
+  route again.  Now the route is re-processed and properly reinstall the
+  static or dynamic route into the kernel.
+
+** GNU/Linux netlink socket handling is improved to fix race condition
+between kernel message and user command responce.
+
+* Changes in bgpd
+
+** Add show neighbor's routes command.
+
+  "show ip bgp neighbors (A.B.C.D|X:X::X:X) routes"
+  "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X) routes"
+  "show ipv6 bgp neighbors (A.B.C.D|X:X::X:X) routes"
+  "show ipv6 mbgp neighbors (A.B.C.D|X:X::X:X) routes"
+
+** BGP passive peer support problem is fixed.
+
+** Redistributed IGP nexthop is passed to BGP nexthop.
+
+** On multiaccess media, if the nexthop is reachable nexthop is passed
+as it is.
+
+** Remove zebra-0.88 compatibility commands.
+
+  "match ip prefix-list WORD"
+  "match ipv6 prefix-list WORD"
+
+  Instead of above please use below commands.
+
+  "match ip address prefix-list WORD"
+  "match ipv6 address prefix-list WORD"
+
+** Fix bug of holdtimer is not reset when bgp cleared.
+
+** "show ip bgp summary" display peer establish/drop count.
+
+** Change "match ip next-hop" argument from IP address to access-list
+name.
+
+** When "bgp enforce-first-as" is enabled, check EBGP peer's update
+has it's AS number in the first AS number in AS sequence.
+
+** New route-map command "set community-delete COMMUNITY-LIST" is
+added.  Community matched the CoMMUNITY-LIST is removed from the
+community.
+
+** BGP-MIB implementation is finished.
+
+** When BGP connection comes from unconfigured IP address, close
+socket immediately.
+
+** Do not compare router ID when the routes comes from EBGP peer.
+When originator ID is same, take shorter cluster-list route.  If
+cluster-list is same take smaller IP address neighbor's route.
+
+** Add "bgp bestpath as-path ignore" command.  When this option is
+set, do not concider AS path length when route selection.
+
+** Add "bgp bestpath compare-routerid".  When this option is set,
+compare router ID when the routes comes from EBGP peer.
+
+** Add "bgp deterministic-med" process.
+
+** BGP flap dampening feature is added.
+
+** When IBGP nexthop is changed, it is reflected to RIB.
+
+** Change "neighbor route-refresh" command to "neighbor capability
+route-refresh".
+
+* Changes in ripd
+
+** Change "match ip next-hop" argument from IP address to access-list
+name.
+
+** "no ip rip (send|receive)" command accept version number argument.
+
+** Memory leak related classfull network generation is fixed.
+
+** When a route is in garbage collection process (invalid with metric
+16) and a router receives the same route with valid metric then route
+was not installed into zebra rib, but only into ripd rib. Moreover ,
+it will never get into zebra rib, because ripd wrongly assumes it's
+already there.
+
+* Change in ospfd
+
+** Fix bug of refreshing default route.
+
+** --enable-nssa turn on undergoing NSSA feature.
+
+** Fix bug of Hello packet's option is not properly set when interface
+comes up.
+
+** Reduce unconditional logging.
+
+** Add nexthop to OSPF path only when it is not there.
+
+** When there is no DR on network (suppose you have only one router
+with interface priority 0). It's router LSA does not contain the link
+information about this network.
+
+** When you change a priority of interface from/to 0
+ISM_NeighborChange event should be scheduled in order to elect new
+DR/BDR on the network.
+
+** When we add some LSA into retransmit list we need to check whether
+the present old LSA in retransmit list is not more recent than the new
+one.
+
+** In states Loading and Full the slave must resend its last Database
+Description packet in response to duplicate Database Description
+packets received from the master.  For this reason the slave must wait
+RouterDeadInterval seconds before freeing the last Database
+Description packet. Reception of a Database Description packet from
+the master after this interval will generate a SeqNumberMismatch
+neighbor event. RFC2328 Section 10.8
+
+** Virtual link can not configured in stub area.
+
+** Clear a ls_upd_queue queue of the interface when interface goes
+down.
+
+** "no router ospf" unregister redistribution requests from zebra.
+
+** New command for virtual-link configuration is added.
+
+  "area A.B.C.D virtual-link A.B.C.D"
+  "area A.B.C.D virtual-link A.B.C.D hello-interval <1-65535> retransmit-interval <3-65535> transmit-delay <1-65535> dead-interval <1-65535>"
+  "area A.B.C.D virtual-link A.B.C.D hello-interval <1-65535> retransmit-interval <3-65535> transmit-delay <1-65535> dead-interval <1-65535> authentication-key AUTH_KEY"
+  "area A.B.C.D virtual-link A.B.C.D authentication-key AUTH_KEY"
+  "area A.B.C.D virtual-link A.B.C.D hello-interval <1-65535> retransmit-interval <3-65535> transmit-delay <1-65535> dead-interval <1-65535> message-digest-key <1-255> md5 KEY"
+  "area A.B.C.D virtual-link A.B.C.D message-digest-key <1-255> md5 KEY"
+
+** Clear cryptographic sequence number when neighbor status is changed
+to NSM down.
+
+** Make Summary LSA's origination and refreshment as same as other
+type of LSA.
+
+** New OSPF pakcet read method. Now maximum packet length may be 65535
+bytes (maximum IP packet length).
+
+** Checking the age of the found LSA and if the LSA is MAXAGE we
+should call refresh instead of originate.
+
+** Install multipath information to zebra.
+
+** Fix socket descriptor leak when system call failed.
+
+* Changes in ospf6d
+
+** Whole functionality has been rewritten as new code. new command
+"show ipv6 ospf6 spf node", "show ipv6 ospf6 spf tree", "show ipv6
+ospf6 spf table" has been added.
+
+** Change to do not send garbage route whose nexthop is not linklocal
+address.
+
+** "redistribute ospf6" was generated in "router ospf6" in config
+file. It is fixed.
+
+** LSDB sync bug is fixed.
+
+** Fix bug of using unavailable route.
+
+* Changes in vtysh
+
+** route-map and access-list configuration is merged into one
+configuration.
+
+** /usr/local/etc/Zebra.conf is integrated configuration file.  "write
+memory" in vtysh will write whole configuration to this file.
+
+** When -b option is specified to vtysh, vtysh read
+/usr/local/etc/Zebra.conf file then pass the confuguration to proper
+protocol daemon.  So make all protocol daemon's configuration file
+empty then invoke all daemon.  After that vtysh -b will setup saved
+configuration.
+
+zebrastart.sh
+=============
+/usr/local/sbin/zebra -d
+/usr/local/sbin/ripd -d
+/usr/local/sbin/ospfd -d
+/usr/local/sbin/bgpd -d
+/usr/local/bin/vtysh -b
+
+* Changes in zebra-0.89
+
+* Changes in lib
+
+** distribute-list can set all interface's access-list and prefix-list
+configuration.
+
+* Changes in ripd
+
+** "show ip protocols" display proper distribute-list settings and
+distance settings.
+
+** When metric infinity route received withdraw the route from kernel
+immediately it used to be wait garbage collection.
+
+** key-chain can be used for simple password authentication.
+
+** RIPv2 MIB getnext interface bug is fixed.
+
+* Changes in vtysh
+
+** --with-libpam enable PAM authentication for vtysh.
+
+** Now vtysh read vtysh.conf.  This file should be
+${SYSCONFDIR}/etc/vtysh.conf for security reason.  Usually it is
+/usr/local/etc/vtysh.conf.
+
+** "username WORD nopassword" command is added to vtysh.
+
+* Chagees in ospfd
+
+** NBMA interface support is added.
+
+** OSPF area is sorted by area ID.
+
+** New implementation of OSPF refreesh.
+
+** OSPF-MIB read function is partly added.
+
+* Changes in bgpd
+
+** When the peering is done by ebgp-multihop, nexthop is looked up
+like IBGP routes.
+
+** "show ip mbgp" commands are changed to "show ip bgp ipv4
+multicast".
+
+** New terminal commands are added.
+  "show ip bgp ipv4 (unicast|multicast) filter-list WORD"
+  "show ip bgp ipv4 (unicast|multicast) community"
+  "show ip bgp ipv4 (unicast|multicast) community-list WORD"
+  "show ip bgp ipv4 (unicast|multicast) community-list WORD exact-match"
+
+** MBGP soft-reconfiguration command is added.
+  "clear ip bgp x.x.x.x ipv4 (unicast|multicast) in"
+  "clear ip bgp x.x.x.x ipv4 (unicast|multicast) out"
+  "clear ip bgp x.x.x.x ipv4 (unicast|multicast) soft"
+  "clear ip bgp <1-65535> ipv4 (unicast|multicast) in"
+  "clear ip bgp <1-65535> ipv4 (unicast|multicast) out"
+  "clear ip bgp <1-65535> ipv4 (unicast|multicast) soft"
+  "clear ip bgp * ipv4 (unicast|multicast) in"
+  "clear ip bgp * ipv4 (unicast|multicast) out"
+  "clear ip bgp * ipv4 (unicast|multicast) soft"
+
+** MED related commands are added.
+  "bgp deterministic-med"
+  "bgp bestpath med confed"
+  "bgp bestpath med missing-as-worst"
+
+** "bgp default local-preference" command is added.
+
+** BGP confederation peer's routes are passed to zebra like IBGP route.
+
+** Community match command is added.
+  "show ip bgp community <val>"
+  "show ip bgp community <val> exact-match"
+
+** EBGP multihop route treatment bug is fixed.  Now nexthop is
+resolved by IGP routes.
+
+** Some commands are added to show routes by filter-list and community
+value.
+  "show ip bgp ipv4 (unicast|multicast) filter-list WORD"
+  "show ip bgp ipv4 (unicast|multicast) community"
+  "show ip bgp ipv4 (unicast|multicast) community-list WORD"
+  "show ip bgp ipv4 (unicast|multicast) community-list WORD exact-match"
+
+* Changes in zebra
+
+** zebra read interface's address information using getifaddrs() when
+it is available.
+
+** Reflect IPv6 interface's address change to protocol daemons.
+
+* Changes in zebra-0.88
+
+* Changes in lib
+
+** "exact-match" option is added to "access-list" and "ipv6
+access-list" command.  If this option is specified, the prefix and
+prefix length is compared as exact match mode.
+
+* Changes in zebra
+
+** New Zebra message ZEBRA_REDISTRIBUTE_DEFAULT_ADD and
+ZEBRA_REDISTRIBUTE_DEFAULT_DELTE are added.
+
+** Default administrative distance value is changed.
+
+            Old         New
+------------------------------------------
+system      10           0
+kernel      20           0
+connected   30           0
+static      40           1
+rip         50         120
+ripng       50         120
+ospf        60         110
+ospf6       49         110
+bgp         70         200(iBGP)  20(eBGP)
+------------------------------------------
+
+** Distance value can be passed from protocol daemon to zebra.
+
+** "show ip route" shows [metric/distance] value pair.
+
+** Zebra Protocol is changed to support multi-path route and distance
+value.
+
+* Changes in ospfd
+
+** "default-information originate [always]" command is added.
+
+** "default-metric <0-16777214>" command is added.
+
+** "show ip ospf database" command is integrated.  LS-ID and AdvRouter can
+   be specifed.  The commands are
+
+   show ip ospf database TYPE LS-ID
+   show ip ospf database TYPE LS-ID ADV-ROUTER
+   show ip ospf database TYPE LS-ID self-originate
+   show ip ospf database TYPE self-originate
+
+** route-map support for `redistribute' command are added.
+   Supported `match' statements are
+
+   match interface
+   match ip address
+   match next-hop
+
+   Supported `set' statements are
+
+   set metric
+   set metric-type
+
+** Pass OSPF metric value to zebra daemon.
+
+* Changes in ripd
+
+** When specified route-map does not exist, it means all deny.
+
+** "default-metric <1-16>" command is added.
+
+** "offset-list ACCESS-LIST-NAME <0-16>" and "offset-list
+ACCESS-LIST-NAME <0-16> IFNAME" commands are added.
+
+** "redistribute ROUTE-TYPE metric <0-16>" command is added.
+
+** "default-information originate" command is added.
+
+** "ip split-horizon" and "no ip split-horizon" is added to interface
+configuration.
+
+** "no router rip" command is added.
+
+** "ip rip authentication mode (md5|text)" is added to interface
+configuration.
+
+** "ip rip authentication key-chain KEY-CHAIN" is added to interface
+configuration.
+
+** Pass RIP metric value to zebra daemon.
+
+** Distance manipulation functions are added.
+
+* Changes in bgpd
+
+** Fix bug of next hop treatment for MPLS-VPN route exchange.
+
+** BGP peer MIB is updated.
+
+** Aggregated route has origin IGP, atomic-aggregate and proper
+aggregator attribute.
+
+** Suppressed route now installed into BGP table.  It is only
+suppressed from announcement.
+
+** BGP router-id is properly set after "no router bgp ASN" and "router
+bgp ASN".
+
+** Add check for nexthop is accessible or not for IBGP routes.
+
+** Add cehck for nexthop is on connected or not for EBGP routes.
+
+** "dump bgp route" command is changed to "dump bgp route-mrt" for
+generating MRT compatible dump output.
+
+** Soft reconfiguration inbound and outbound is supported.
+
+** Route refresh feature is supported.
+
+* Changes in vtysh
+
+** VTY shell is now included into the distribution.
+
+* Changes in zebra-0.87
+
+* Changes in lib
+
+** "show startup-config" command is added.
+
+** "show history" command is added.
+
+** Memory statistics command is changed.  New command
+
+   show memory all
+   show memory lib
+   show memory rip
+   show memory ospf
+   show memory bgp
+
+are added.
+
+** Filters can be removed only specify it's name.  New command
+
+   no access-list NAME
+   no ip community-list NAME
+   no ip as-path access-list NAME
+   no route-map NAME
+
+are added.
+
+** At any node, user can view/save user configuration.
+
+   write terminal
+   write file
+   wirte memory
+
+are added to every node in default.
+
+** LCD completion is added.  For example both "ip" and "ipv6" command
+are exist, "i" then press TAB will be expanded to "ip".
+
+* Changes in bgpd
+
+** "show ip bgp" family shows total number of prefixes.
+
+** "no bgp default ipv4-unicast" command is added.
+
+** Extended Communities support is added.
+
+** "no neighbor PEER send-community extended" command is added.
+
+** MPLS-VPN PE-RR support is added.
+
+ New address family vpnv4 unicast is introduced.
+
+  !
+  address-family vpnv4 unicast
+   neighobr PEER activate
+   network A.B.C.D rd RD tag TAG
+  exit-address-family
+  !
+
+ To make it route-reflector, please configure it under normal router
+bgp ASN.
+
+  !
+  router bgp 7675
+   no bgp default ipv4-unicast
+   bgp router-id 10.0.0.100
+   bgp cluster-id 10.0.0.100
+   neighbor 10.0.0.1 remote-as 65535
+   neighbor 10.0.0.1 route-reflector-client
+   neighbor 10.0.0.2 remote-as 65535
+   neighbor 10.0.0.2 route-reflector-client
+   neighbor 10.0.0.3 remote-as 65535
+   neighbor 10.0.0.3 route-reflector-client
+  !
+  address-family vpnv4 unicast
+   neighbor 10.0.0.1 activate
+   neighbor 10.0.0.2 activate
+   neighbor 10.0.0.3 activate
+  exit-address-family
+  !
+
+* Changes in ospfd
+
+** Many many bugs are fixed.
+
+* Changes in ripd
+
+** Better interface up/down event handle.
+
+* Changes in zebra
+
+** Better interface up/down event handle.
+
+* Changes in zebra-0.86
+
+* Changes in lib
+
+** Fix bug of exec-timeout command which may cause crush.
+
+** Multiple same policy for "access-list", "ip prefix-list, "as-path
+access-list", "ip community-list" is not duplicated.
+
+** It used to be "ip prefix-list A.B.C.D/M" match routes which mask >=
+M.  Now default behavior is exact match so it only match routes which
+mask == M.
+
+* Changes in bgpd
+
+** "match ip address prefix-list" is added to route-map.
+
+** A route without local preference is evaluated as 100 local preference.
+
+** Select smaller router-id route when other values are same.
+
+** Compare MED only both routes comes from same neighboring AS.
+
+** "bgp always-compare-med" command is added.
+
+** Now MED value is passed to IBGP peer.
+
+** When neighbor's filter is configured with non-existent access-list,
+as-path access-list, ip prefix-list, route-map.  The behavior is
+changed from all permit to all deny.
+
+* Changes in ospfd
+
+** Fix bug of external route tag byte order.
+
+** OSPF Neighbor deletion bug which cause crush is fixed.
+
+** Some route calculation bug are fixed.
+
+** Add sanity check with router        routing table.
+
+** Fix bug of memory leak about linklist.
+
+** Fix bug of 1-WayReceived in NSM.
+
+** Take care of BIGENDIAN architecture.
+
+** Fix bug of NSM state flapping between ExStart and Exchange.
+
+** Fix bug of Network-LSA originated in stub network.
+
+** Fix bug of MS flag unset.
+
+** Add to schedule router_lsa origination when the interface cost
+changes.
+
+** Increment LS age by configured interface transmit_delay.
+
+** distribute-list is reimplemented.
+
+** Fix bug of refresh never occurs.
+
+** Fix bug of summary-LSAs reorigination.  Correctly copy
+OSPF_LSA_APPROVED flag to new LSA. when summary-LSA is reoriginatd.
+
+** Fix bug of re-origination when a neighbor disappears.
+
+** Fix bug of segmentation fault with DD retransmission.
+
+** Fix network-LSA re-origination problem.
+
+** Fix problem of remaining withdrawn routes on zebra.
+
+* Changes in ripd
+
+** Do not leave from multicast group when interface goes down bug is
+fixed.
+
+* Changes in zebra
+
+** Remove client structure when client dies.
+
+** Take care static route when interface goes up/down.
+
+* Changes in zebra-0.85
+
+* Changes in bgpd
+
+** "transparent-nexthop" and "transparenet-as" commands are added.
+
+** Route reflector's originator-id bug is fixed.
+
+* Changes in ospfd
+
+** Fix bug of OSPF LSA memory leak.
+
+** Fix bug of OSPF external route memory leak.
+
+** AS-external-LSA origination bug was fixed.
+
+** LS request treatment is completely rewritten.  Now performance is
+drastically improved.
+
+* Changes in ripd
+
+** RIPv1 update is done by class-full manner.
+
+* Changes in zebra-0.84b
+
+* Changes in lib
+
+** Fix bug of inet_pton return value handling
+
+* Changes in bgpd
+
+** Fix bug of BGP-4+ link-local address nexthop check for IBGP peer.
+
+** Don't allocate whole buffer for displaying "show ip bgp".  Now it
+consume only one screen size memory.
+
+* Changes in ripd
+
+** Fix debug output string.
+
+** Add RIP peer handling.  RIP peer are shown by "show ip protocols".
+
+* Changes in zebra-0.84a
+
+* Changes in bgpd
+
+** Fix serious bug of BGP-4+ peering under IPv6 link-local address.
+   Due to the bug BGP-4+ peering may not be established.
+
+* Changes in zebra-0.84
+
+* Changes in lib
+
+** IPv6 address and prefix parser is added to VTY by Toshiaki Takada
+   <takada@zebra.org>.  DEFUN string is "X:X::X:X" for IPv6 address,
+   "X:X::X:X/M" for IPv6 prefix.  You can use it like this.
+
+   DEFUN (func, cmd, "neighbor (A.B.C.D|X:X::X:X) remote-as <1-65535>")
+
+** VTY configuration is locked during configuration.  This is for
+   avoiding unconditional crush from two terminals modify the
+   configuration at the same time.  "who" command shows which termnal
+   lock the configuration.  VTY which has '*' character at the head of
+   line is locking the configuration.
+
+** Old logging functions are removed.  Functions like
+   log_open,log_close,openlog are deleted.  Instead of that please use
+   zlog_* functions.  zvlog_* used in ospf6d are deleted also.
+
+** "terminal monitor" command is added.  "no terminal monitor" is for
+   disabling.  This command simply display logging information to the
+   VTY.
+
+** dropline.[ch] files are deleted.
+
+* Changes in bgpd
+
+** BGP neighbor configuration are sorted by it's IP address.
+
+** BGP peer configuration and actual peer is separated.  This is
+   preparation for Route Server support.
+
+** "no neighbor PEER" command is added. You can delete neighbor
+   without specifying AS number.
+
+** "no neighbor ebgp-multihop" command is added.
+
+** "no neighbor port PORT" command is added.
+
+** To conform RFC1771, "neighbor PEER send-community" is default
+   behavior.  If you want to disable sending community attribute,
+   please specify "no neighbor PEER send-community" to the peer.
+
+** "neighbor maximum-prefix NUMBER" command is added.
+
+** Multi-protocol extention NLRI is proceeded only when the peer is
+   configured proper Address Family and Subsequent Address Family.  If
+   not, those NLRI are simply ignored.
+
+** Aggregate-address support is improved.  Currently below commands
+   works.
+
+  "aggregate-address"
+  "aggregate-address summary-only"
+  "no aggregate-address"
+  "no aggregate-address summary-only"
+
+  "ipv6 bgp aggregate-address"
+  "ipv6 bgp aggregate-address summary-only"
+  "no ipv6 bgp aggregate-address"
+  "no ipv6 bgp aggregate-address summary-only"
+
+** redistribute route-map bug is fixed.
+
+** MBGP support becomes default.  "configure" option --enable-mbgp is
+   removed.
+
+** New command "neighbor PEER timers connect <1-65535>" is added.
+
+** New command "neighbor PEER override-capability" is added.
+
+** New command "show ip bgp neighbor A.B.C.D advertised-route" is added.
+
+** New command "show ip bgp neighbor A.B.C.D routes" is added.  To use
+   this command, you have to configure neighbor with
+   "neighbor A.B.C.D soft-reconfiguration inbound" beforehand.
+   
+
+* Changes in zebra-0.83
+
+* bgpd
+
+** Serious bug fix about fetching global and link-local address at the
+same time.  Due to this bug, corrupted IPv6 prefix is generated.  If
+you uses bgpd for BGP-4+ please update to this version.  The bug is
+introduced in zebra-0.82.
+
+** When bgpd send Notify message, don't use thread manager.  It is now
+send to neighbor immediately.
+
+* Changes in zebra-0.82
+
+** Solaris 2.6 support is added by Michael Handler
+<handler@sub-rosa.com>.
+
+** MBGP support is added by Robert Olsson <Robert.Olsson@data.slu.se>.
+Please specify --enable-mbgp to configure script.  This option will be
+removed in the future and MBGP support will be default.
+
+* Changes in zebra
+
+** When interface goes down, withdraw connected routes from routing
+table.  When interface goes up, restore the routes to the routing
+table.
+
+** `show interface' show interface's statistics on Linux and BSD with
+routing socket.
+
+** Now zebra can get MTU value on BSDI/OS.
+
+* Changes in bgpd
+
+** Add capability option support based upon
+draft-ietf-idr-bgp4-cap-neg-04.txt.
+
+** Add `show ipv6 bgp prefix-list' command.
+
+** Check self AS appeared in received routes.
+
+** redistribute route-map support is added.
+
+** BGP packet dump feature compatible with MRT.
+
+* Changes in ripd
+
+** Fix bug of `timers basic' command's argument format.
+
+* Changes in ripngd
+
+** Calculate max RTE using interface's MTU value.
+
+* Changes in ospfd
+
+** Some correction to LSU processing.
+
+** Add check for lsa->refresh_list.
+
+* Changes in ospf6d
+
+** Many debug feature is added.
+
+* Changes in zebra-0.81
+
+** SNMP support is disabled in default.--enable-snmp option is added
+to configure script.
+
+* Changes in bgpd
+
+** Fix FSM bug which introduced in zebra-0.80.
+
+* Changes in zebra-0.80
+
+* access-list
+
+  New access-list name space `ipv6 access-list' is added.  At the same
+  time, `access-list' statemant only accepts IPv4 prefix.  Please be
+  careful if you use IPv6 filtering.  You will need to change your
+  configuration.  For IPv6 filtering please use `ipv6 access-list'.
+  
+  As of zebra-0.7x, user can use `access-list' for both IPv4 and IPv6
+  filtering.
+  
+  ! zebra-0.7x
+  access-list DML-net permit 203.181.89.0/24
+  access-list DML-net permit 3ffe:506::0/32
+  access-list DML-net deny any
+  !
+  
+  Above configuration is not valid for zebra-08x.  Please add `ipv6'
+  before 'access-list' when you configure IPv6 filtering.
+  
+  ! zebra-0.8x
+  access-list DML-net permit 203.181.89.0/24
+  access-list DML-net deny any
+  !
+  ipv6 access-list DML-net permit 3ffe:506::0/32
+  ipv6 access-list DML-net deny any
+  !
+
+* prefix-list
+
+  And also new prefix-list name space `ipv6 prefix-list' is added.  It
+  is the same as the change of `access-list'. `ip prefix-list' now only
+  accept IPv4 prefix.  It was source of confusion that `ip prefix-list'
+  can be used both IPv4 and IPv6 filtering.  Now name space is separated
+  to clear the meaning of the filter.
+  
+  If you use `ip prefix-list' for IPv6 filtering, please change the
+  stetement.
+  
+  ! zebra-0.7x
+  ip prefix-list 6bone-filter seq 5 permit 3ffe::/17 le 24 ge 24
+  ip prefix-list 6bone-filter seq 10 permit 3ffe:8000::/17 le 28 ge 28
+  ip prefix-list 6bone-filter seq 12 deny 3ffe::/16
+  ip prefix-list 6bone-filter seq 15 permit 2000::/3 le 16 ge 16
+  ip prefix-list 6bone-filter seq 20 permit 2001::/16 le 35 ge 35
+  ip prefix-list 6bone-filter seq 30 deny any
+  !
+  
+  Now user can explicitly configure it as IPv6 prefix-list.
+  
+  ! zebra-0.8x
+  ipv6 prefix-list 6bone-filter seq 5 permit 3ffe::/17 le 24 ge 24
+  ipv6 prefix-list 6bone-filter seq 10 permit 3ffe:8000::/17 le 28 ge 28
+  ipv6 prefix-list 6bone-filter seq 12 deny 3ffe::/16
+  ipv6 prefix-list 6bone-filter seq 15 permit 2000::/3 le 16 ge 16
+  ipv6 prefix-list 6bone-filter seq 20 permit 2001::/16 le 35 ge 35
+  ipv6 prefix-list 6bone-filter seq 30 deny any
+  !
+
+* RIP configuration
+
+  If you want to filter only default route (0.0.0.0/0) and permit other
+  routes, it was hard to do that.  Now `ip prefix-list' can be used for
+  RIP route filtering.
+  
+  New statement:
+  
+  `distribute-list prefix PLIST_NAME (in|out) IFNAME'
+  
+  is added to ripd.  So you can configure on eth0 interface accept all
+  routes other than default routes.
+  
+  !
+  router rip
+   distribute-list prefix filter-default in eth0
+  !
+  ip prefix-list filter-default deny 0.0.0.0/0 le 0
+  ip prefix-list filter-default permit any
+  !
+
+* RIPng configuration
+
+  Same change is done for ripngd.  You can use `ipv6 prefix-list' for
+  filtering.
+  
+  !
+  router ripng
+   distribute-list prefix filter-default in eth0
+  !
+  ipv6 prefix-list filter-default deny ::/0 le 0
+  ipv6 prefix-list filter-default permit any
+  !
+
+* BGP configuration
+
+  So far, Multiprotocol Extensions for BGP-4 (RFC2283) configuration is
+  done with traditional IPv4 peering statement like blow.
+  
+  !
+  router bgp 7675
+   neighbor 3ffe:506::1 remote-as 2500
+   neighbor 3ffe:506::1 prefix-list 6bone-filter out
+  !
+  
+  For separating configuration IPv4 and IPv6, and for retaining Cisco
+  configuration compatibility, now IPv6 configuration is done by IPv6
+  specific statement.  IPv6 BGP configuration is done by statement which
+  start from `ipv6 bgp'.
+  
+  !
+  router bgp 7675
+  !
+  ipv6 bgp neighbor 3ffe:506::1 remote-as 2500
+  ipv6 bgp neighbor 3ffe:506::1 prefix-list 6bone-filter out
+  !
+  
+  At the same time some IPv6 specific commands are deleted from IPv4
+  configuration.
+  
+  o redistribute ripng
+  o redistribute ospf6
+  o neighbor PEER version BGP_VERSION
+  o neighbor PEER interface IFNAME
+  
+  Those commands are only accepted as like below.
+  
+  o ipv6 bgp redistribute ripng
+  o ipv6 bgp redistribute ospf6
+  o ipv6 bgp neighbor PEER version BGP_VERSION
+  o ipv6 bgp neighbor PEER interface IFNAME
+  
+  And below new commands are added.
+  
+  o ipv6 bgp network IPV6_PREFIX
+  o ipv6 bgp redistribute static
+  o ipv6 bgp redistribute connected
+  o ipv6 bgp neighbor PEER remote-as <1-65535> [passive]
+  o ipv6 bgp neighbor PEER ebgp-multihop [TTL]
+  o ipv6 bgp neighbor PEER description DESCRIPTION
+  o ipv6 bgp neighbor PEER shutdown
+  o ipv6 bgp neighbor PEER route-reflector-client
+  o ipv6 bgp neighbor PEER update-source IFNAME
+  o ipv6 bgp neighbor PEER next-hop-self
+  o ipv6 bgp neighbor PEER timers holdtime <0-65535>
+  o ipv6 bgp neighbor PEER timers keepalive <0-65535>
+  o ipv6 bgp neighbor PEER send-community
+  o ipv6 bgp neighbor PEER weight <0-65535>
+  o ipv6 bgp neighbor PEER default-originate
+  o ipv6 bgp neighbor PEER filter-list FILTER_LIST_NAME (in|out)
+  o ipv6 bgp neighbor PEER prefix-list PREFIX_LIST_NAME (in|out)
+  o ipv6 bgp neighbor PEER distribute-list AS_LIST_NAME (in|out)
+  o ipv6 bgp neighbor PEER route-map ROUTE_MAP_NAME (in|out)
+  
+  And some utility commands are introduced.
+  
+  o clear ipv6 bgp [PEER]
+  o show ipv6 bgp neighbors [PEER]
+  o show ipv6 bgp summary
+  
+  I hope these changes are easy to understand for current Zebra users...
+
+* To restrict connection to VTY interface.
+
+  It used to be both IPv4 and IPv6 filter can be specified with one
+  access-list.  Then the access-list can be appried to VTY interface
+  with `access-class' stetement in `line vty' node.  Below is example in
+  zebra-0.7x.
+  
+  !
+  access-list local-only permit 127.0.0.1/32
+  access-list local-only permit ::1/128
+  access-list local-only deny any
+  !
+  line vty
+   access-class local-only
+  !
+  
+  Now IPv4 and IPv6 filter have each name space.  It is not possible to
+  specify IPv4 and IPv6 filter with one access-list.  For setting IPv6
+  access-list in `line vty', `ipv6 access-class' statement is
+  introduced.  Let me show the configuration in zebra-0.8x.
+  
+  !
+  access-list local-only permit 127.0.0.1/32
+  access-list local-only deny any
+  !
+  ipv6 access-list local-only permit ::1/128
+  ipv6 access-list local-only dny any
+  !
+  line vty
+   access-class local-only
+   ipv6 access-class local-only
+  !
+
+* route-map
+
+  New IPv6 related route-map match commands are added.
+  
+  o match ipv6 address
+  o match ipv6 next-hop
+  
+  Please change your configuration if you use IP match statement for
+  IPv6 route.
+  
+  zebra-0.7x config
+  =================
+  !
+  access-list all permit any
+  !
+  route-map set-nexthop permit 10
+   match ip address all
+   set ipv6 next-hop global 3ffe:506::1
+   set ipv6 next-hop local fe80::cbb5:591a
+  !
+  
+  zebra-0.8x config
+  =================
+  !
+  ipv6 access-list all permit any
+  !
+  route-map set-nexthop permit 10
+   match ipv6 address all
+   set ipv6 next-hop global 3ffe:506::1
+   set ipv6 next-hop local fe80::cbb5:591a
+  !
+
+* zebra connection
+
+  Protocol daemon such as ripd, bgpd, ospfd will reconnect zebra daemon
+  when the connection fail.  Those daemons try to connect zebra every 10
+  seconds first three trial, then the interval changed to 60 seconds.
+  After all, if ten connections are fail, protocol daemon give up the
+  connection to the zebra daemon.
+
+* SNMP support (is not yet finished)
+
+  Zebra uses SMUX protocol (RFC1227) for making communication with SNMP
+  agent.  Currently lib/smux.c can be compiled only with ucd-snmp-4.0.1
+  and http://ucd-snmp.ucdavis.edu/patches/012.patch.  It can not be
+  compiled with ucd-snmp-3.6.2.
+  
+  After applying the patch to ucd-snmp-4.0.1, please configure it with
+  SMUX module.
+  
+  % configure --with-mib-modules=smux
+  
+  After compile & install ucd-snmp-4.0.1, you will need to configure
+  smuxpeer.  I'm now using below configuration.
+  
+  /usr/local/share/snmp/snmpd.conf
+  ================================
+  smuxpeer 1.3.6.1.6.3.1 test
+  
+  Above 1.3.6.1.6.3.1 and test is temporary configuration which is hard
+  coded in lib/smux.c. Yes, I know it is bad, I'll change it ASAP.
+
+* HUP signal treatment
+
+  From zebra-0.80, ripd will reload it's configuration file when ripd
+  receives HUP signal.  Other daemon such as bgpd, ospfd will support
+  HUP signal treatment soon.
+
+* Changes in zebra-0.79
+
+* Changes in zebra
+
+** Broadcast address setting on Linux box bug is fixed.
+
+** Protocol daemon can install connected IPv6 route into the kernel.
+
+** Now zebra can handle blackhole route.
+
+* Changes in ripd
+
+** Add route-map feature for RIP protocol.
+
+** In case of RIP version 2 routing table entry has IPv4 address and
+netmask pair which host part bit is on, ignore the entry.
+
+* Changes in ripngd
+
+** Change CMSG_DATA cast from (u_char *) to (int *).  (u_char *) does
+not work for NetBSD-currnet on SparcStation 10.
+
+* Changes in ospfd
+
+** MaxAge LSA treatment is added.
+
+** ABR/ASBR functionality is added.
+
+** Virtual Link funtionality is added.
+
+** ABR behaviors IBM/Cisco/Shortcut is added.
+
+* Changes in ospf6d
+
+** Enclosed KAME specific part with #ifdef #endif
+
+* Changes in zebra-0.78
+
+* Changes in lib
+
+** SNMP support is started.
+
+** Now Zebra can work on BSD/OS 4.X.
+
+** Now Zebra can compiled on vanilla OpenBSD 2.5 but not yet working correcltly.
+
+* Changes in zebra
+
+** Interface index detection using ioctl() bug is fixed.
+
+** Interface information protocol is changed.  Now interface
+addition/deletion and interface's address addition/deletion is
+separated.
+
+* Changes in bgpd
+
+** BGP hold timer bug is fixed.
+
+** BGP keepavlie timer becomes configurable.
+
+* Changes in ripd
+
+** When making reply to rip's REQUEST message, fill in
+RIP_METRIC_INFINITY with network byte order using htonl ().
+
+** Pass host byte order address to IN_CLASSC and IN_CLASSB macro.
+
+* Changes in ospfd
+
+** LSA flooding works.
+
+** Fix bug of DD processing.
+
+** Fix bug of originating router-LSA bug is fixed.
+
+** LSA structure is changed to support LSA aging.
+
+* Changes in ospf6d
+
+** `ip6' statement in configuration is changed to `ipv6'.
+
+* Changes in zebra-0.77
+
+* Changes in lib
+
+** SIGUSR1 reopen logging file.
+
+** route-map is extended to support multi-protocol routing
+information.
+
+** When compiling under GNU libc 2.1 environment don't use inet6-apps.
+
+* Changes in zebra
+
+** Basic IPv6 router advertisement codes added.  It is not yet usable.
+
+** Fix IPv6 route addition/deletion bug is fixed.
+
+** `show ip route A.B.C.D' works
+
+* Changes in bgpd
+
+** When invalid unfeasible routes length comes, bgpd send notify then
+continue to process the packet.  Now bgpd stop parsing invalid packet
+then return to main loop.
+
+** BGP-4+ withdrawn routes parse bug is fixed.
+
+** When BGP-4+ information passed to non shared network's peer, trim
+link-local next-hop information.
+
+** `no redistribute ROUTE_TYPE' withdraw installed routes from BGP
+routing information.
+
+** `show ipv6 route IPV6ADDR' command added.
+
+** BGP start timer has jitter.
+
+** Holdtimer configuration bug is fixed.  Now configuration does not
+show unconfigured hold time value.
+
+* Changes in ripngd
+
+** Now update timer (default 30 seconds) has +/- 50% jitter value.
+
+** Add timers basic command.
+
+** `network' configuration is dynamically reflected.
+
+** `timers basic <update> <timeout> <garbage>' added.
+
+* Changes in ripd
+
+** Reconstruct almost codes.
+
+** `network' configuration is dynamically reflected.
+
+** RIP timers now conforms to RFC2453.  So user can configure update,
+timeout, garbage timer.
+
+** `timers basic <update> <timeout> <garbage>' works.
+
+* Changes in ospfd
+
+** Bug of originating network LSA is fixed.
+
+** `no router ospf' core dump bug is fixed.
+
+* Changes in ospf6d
+
+** Redistribute route works.
+
+* Changes in zebra-0.76
+
+* Changes in lib
+
+** configure.in Linux IPv6 detection problem is fixed.
+
+** Include SERVICES file to the distribution
+
+** Update zebra.texi to zebra-0.76.
+
+* Changes in zebra-0.75
+
+* Changes in lib
+
+** `termnal length 0' bug is fixed.
+
+* Changes in zebra
+
+** When zebra starts up, sweep all zebra installed routes.  If -k or
+--keep_kernel option is specified to zebra dameon.  This function is
+not performed.
+
+* Changes in ripngd
+
+** Aggreagte address command supported.  In router ripngd,
+`aggregate-address IPV6PREFIX' works.
+
+* Changes in bgpd
+
+** Input route-map's bug which cause segmentation violation is fixed.
+
+** route-map method improved.
+
+** BGP-4+ nexthop detection improved.
+
+** BGP-4+ route re-selection bug is fixed.
+
+** BGP-4+ iBGP route's nexthop calculation works.
+
+** After connection Established `show ip bgp neighbor' display BGP TCP
+connection's source and destination address.
+
+** In case of BGP-4+ `show ip bgp neighbor' display BGP-4+ global and
+local nexthop which used for originated route.  This address will be
+used when `next-hop-self'.
+
+* Changes in ospfd
+
+** Fix bug of DR election.
+
+** Set IP precedence field with IPTOS_PREC_INTERNET_CONTROL.
+
+** Schedule NeighborChange event if NSM status change.
+
+** Never include a neighbor in Hello packet, when the neighbor goes
+down.
+
+* Changes in zebra-0.74
+
+* Changes in lib
+
+** Now `terminal length 0' means no line output control.
+
+** `line LINES' command deleted.  Instead of this please use `terminal
+length <0-512>'.
+
+** `terminal length <0-512>' is each vty specific configuration so it
+can not be configured in the configuration file.  If you want to
+configure system wide line control, please use `service
+terminal-length <0-512>'.  This configuration affects to the all vty
+interface.
+
+* Changes in zebra
+
+** Installation of IPv6 route bug is fixed.
+
+* Changes in bgpd
+
+** Very serious bug of bgp_stop () is fixed. When multiple route to
+the same destination exist, bgpd try to announce the information to
+stopped peer.  Then add orphan write thread is added.  This cause
+many strange behavior of bgpd.
+
+** Router-id parsing bug is fixed.
+
+** With BGP-4+ nexthop installation was done with global address but
+it should be link-local address.  This bug is fixed now.
+
+** When incoming route-map prepend AS, old AS path remained.  Now bgpd
+free old AS path.
+
+** `neighbor PEER weight <0-65535>' command added.
+
+* Changes in ripngd
+
+** Almost codes are rewritten to conform to RFC2080.
+
+* Changes in ospfd
+
+** SPF calculation timer is added.  Currently it is set to 30 seconds.
+
+** SPF calculation works now.
+
+** OSPF routing table codes are added.
+
+** OSPF's internal routes installed into the kernel routing table.
+
+** Now `ospfd' works as non-area, non-external route support OSPF
+router.
+
+** Call of log_rotate() is removed.
+
+* Changes in ospf6d
+
+** LSA data structure is changed.
+
+** Call of log_rotate() is removed.
+
+* Changes in zebra-0.73
+
+* Changes in lib
+
+** `config terminal' is changed to `configure terminal'.
+
+** `terminal length <0-512>' command is added.
+
+** Variable length argument was specified by `...'.  Now all strings
+started with character `.' is variable length argument.
+
+* Changes in zebra
+
+** Internal route (such as iBGP, internal OSPF route) handling works
+correctly.
+
+** In interface node, `ipv6 address' and `no ipv6 address' works.
+
+** Interface's address remain after `no ip address' bug is fixed.
+
+** Host route such as IPv4 with /32 mask and IPv6 with /128 mask
+didn't set RTF_GATEWAY even it has gateway.  This bug if fixed now.
+
+* Changes in bgpd
+
+** `match as-path' argument is used to be specify AS PATH value itself
+directly (e.g. ^$).  But it is changed to specify `ip as-apth
+access-list' name.
+
+** iBGP route handle works without getting error from the kernel.
+
+** `set aggregator as AS A.B.C.D' command is added to route-map.
+
+** `set atomic-aggregate' command is added to bgpd's routemap.
+
+** Announcement of atomic aggregate attribute and aggregator attribute
+works.
+
+** `update-source' bug is fixed.
+
+** When a route learned from eBGP is announced to iBGP, local
+preference was set to zero.  But now it set to
+DEFAULT_LOCAL_PREF(100).
+
+* Changes in ripd
+
+** RIPv1 route filter bug is fixed.
+
+** Some memory leak is fixed.
+
+* Changes in ospfd
+
+** Fix bug of DR Election.
+
+** Fix bug of adjacency forming.
+
+* Changes in ospf6d
+
+** Clean up logging message.
+
+** Reflect routing information to zebra daemon.
+
+* Changes in zebra-0.72
+
+* Changes in lib
+
+** When getsockname return IPv4 mapped IPv6 address.  Convert it to
+IPv4 address.
+
+* Changes in bgpd
+
+** Change route-map's next-hop related settings.
+
+set ip nexthop          -> set ip next-hop
+set ipv6 nexthop global -> set ipv6 next-hop global
+set ipv6 nexthop local  -> set ipv6 next-hop local
+
+** Add `next-hop-self' command.
+
+* Changes in ospfd
+
+** Fix bug of multiple `network area' directive crashes.
+
+* Changes in zebra-0.71
+
+* Changes in lib
+
+** `log syslog' command is added.
+
+** Use getaddrinfo function to bind IPv4/IPv6 server socket.
+
+** `no banner motd' will suppress motd output when user connect to VTY.
+
+** Bind `quit' command to major nodes.
+
+* Changes in zebra
+
+** Point-to-point link address handling bug is fixed.
+
+* Changes in bgpd
+
+** AS path validity check is added.  If malformed AS path is received
+NOTIFY Malformed AS path is send to the peer.
+
+** Use getaddrinfo function to bind IPv4/IPv6 server socket.
+
+* Changes in ripd
+
+** Connected network announcement bug is fixed.
+
+** `broadcast' command is deleted.
+
+** `network' command is added.
+
+** `neighbor' command is added.
+
+** `redistribute' command is added.
+
+** `timers basic' command is added.
+
+** `route' command is added.
+
+* Changes in ripngd
+
+** Fix metric calculation bug.
+
+* Changes in ospfd
+
+** Check sum bug is fixed.
+
+* Chanegs in ospf6d
+
+** Routing table code is rewritten.
+
+* Changes in zebra-0.70
+
+* Changes in zebra
+
+** Critical routing information base calculation bug check is fixed.
+
+** zebra ipv4 message is extended to support external/internal route
+flavor.
+
+** Now if internal route doesn't has direct connected nexthop, then
+nexthop is calculated by looking up IGP routing table.
+
+* Changes in bgpd
+
+** `neighbor PEER update-source IFNAME' command added as ALIAS to
+`neighbor PEER interface IFNAME'.
+
+* Changes in ospfd
+
+** DD null pointer bug is fixed.
+
+* Changes in zebra-0.69
+
+* Changes in zebra
+
+** zebra redistirbution supports dynamic notification of the route
+change.  If you add static route while running zebra, it will be
+reflected to other protocol daemon which set `redistribute static'.
+
+** If static route installation is failed due to the error.  The
+static route is not added to the configuration and zebra routing
+table.
+
+** zebra sets forwarding flag to on when it starts up.
+
+** `no ip forwarding' turn off IPv4 forwarding.
+
+** `no ipv6 forwarding' turn off IPv6 forwarding.
+
+** Change `show ipforward' command to `show ip forwarding'.
+
+** Change `show ipv6forward' command to `show ipv6 forwarding'.
+
+** `ip route A.B.C.D/M INTERFACE' works.  So you can set `ip route
+10.0.0.0/8 eth0'.
+
+* Changes in bgpd
+
+** `neighbor PEER send-community' command is added.  If the option is
+set, bgpd will send community attribute to the peer.
+
+** When a BGP route has no-export community attribute and
+send-community is set to the peer, the route is not announced to the
+peer.
+
+* Changes in ripngd
+
+** When ripngd terminates, delete all installed route.
+
+** `redistribute static', `redistribute connected' works.
+
+** Change `debug ripng event' to `debug ripng events'.
+
+** Change `show debug ripng' to `show debugging ripng'.
+
+** Bug of static route deletion is fixed.
+
+* Changes in ospfd
+
+** LS request and LS update can be send and received.
+
+* Changes in zebra-0.68
+
+* Changes in lib
+
+** DEFUN() is extended to support (a|b|c) statement.
+
+** Input buffer overflow bug is fixed.
+
+* Changes in bgpd
+
+** `ip community-list' is added.
+
+** set community and match community is added to route-map statement.
+
+** aggregate-address A.B.C.D/M partly works.  Now it works only
+summary-only mode.
+
+* Changes in zebra
+
+** IPv6 network address delete bug is fixed.
+
+* Changes in ospfd
+
+** DR election bug fixed.
+
+** Now Database Description can be send or received.
+
+** Neighbor State Machine goes to Full state.
+
+* Changes in ospf6d
+
+** router zebra related bug is fixed.
+
+* Changes in zebra-0.67
+
+* Changes in lib
+
+** `service password-encryption' is added for encrypted password.
+
+* Changes in bgpd
+
+** `set as-path prepend ASPATH' is added to route-map command.
+
+** `set weight WEIGHT' is added to route-map command.
+
+** `no set ipv6 nexthop global' and `no set ipv6 nexthop local'
+command is added to route-map.
+
+** `neighbor IP_ADDR version BGP_VERSION' command's BGP_VERSION
+argument changed.
+
+Old               New
+=====================
+bgp4              4
+bgp4+             4+
+bgp4+-draft-00    4-
+=====================
+
+If you want to peer with old draft version of BGP-4+, please configure
+like below:
+
+router bgp ASN
+ neighbor PEER version 4-
+
+** Some AS path isn't correctly compared during route selection.  Now
+it is fixed.
+
+* Changes in ospfd
+
+** `router zebra' is default behavior.
+
+* Changes in ospf6d
+
+** `router zebra' is default behavior.
+
+* Changes in zebra-0.66
+
+* Changes in zebra
+
+** When other daemon such as gated install routes into the kernel then
+zebra blocks.  This is only occur with netlink socket.  Now socket is
+set as NONBLOCKING and problem is fixed.  Reported and fixed by
+Patrick Koppen <koppen@rhrk.uni-kl.de>
+
+* Changes in bgpd
+
+** Now `router zebra' is not needed to insert BGP routes into the
+kernel.  It is default behavior.  If you don't want to install the BGP
+routes to the kernel, please configure like below:
+
+!
+router zebra
+ no redistribute bgp
+!
+
+** redistribute connected works.
+
+** redistribute static now filter local loopback routes and link local
+network.
+
+* Changes in ripd
+
+** Some network check is added.  Patch is done by Carlos Alberto
+Barcenilla <barce@frlp.utn.edu.ar>
+
+* Changes in ripngd
+
+** Sometimes ripngd install wrong nexthop into the kernel.  This bug
+is fixed now.
+
+** Now `router zebra' is not needed to insert RIPng routes into the
+kernel.  It is default behavior. If you don't want to install the BGP
+routes to the kernel, please configure like below:
+
+!
+router zebra
+ no redistribute ripng
+!
+
+* Changes in zebra-0.65
+
+* Changes in lib
+
+** `C-c' changes current node to ENABLE_NODE.  Previously it doesn't.
+
+** In ENABLE_NODE, `exit' command close vty connection.
+
+** `service advanced-vty' enable advanced vty function.  If this
+service is specified one can directly connect to ENABLE_NODE when
+enable password is not set.
+
+** `lines LINES' command is added by Stephen R. van den Berg
+<srb@cuci.nl>.
+
+* Changes in zebra
+
+** Basic Linux policy based routing table support is added by Stephen
+R. van den Berg <srb@cuci.nl>.
+
+* Changes in bgpd
+
+** route-map command is improved:
+  `match ip next-hop': New command.
+  `match metric': New command.
+  `set metric': Doc fixed.
+  `set local-preference': DEFUN added.
+
+* Changes in ripd
+
+** Check of announced network is added.  Now multicast address is
+filtered.  Reported by Carlos Alberto Barcenilla
+<barce@frlp.utn.edu.ar>
+
+** Check of network 127 is added.  Reported by Carlos Alberto
+Barcenilla <barce@frlp.utn.edu.ar>
+
+* Changes in ripngd
+
+** Aging route bug is fixed.
+
+** `router zebra' semantics changed.  ripngd automatically connect to
+zebra.
+
+* Changes in ospfd
+
+** `no router ospf' works.
+
+* Changes in ospf6d
+
+** Bug fix about network vertex.
+
+* Changes in zebra-0.64.1.
+
+This is bug fix release.
+
+* Changes in lib
+
+** Add check of sin6_scope_id in struct sockaddr_in6.  For compilation
+on implementation which doesn't have sin6_scope_id.  Reported by Wim
+Biemolt <Wim.Biemolt@ipv6.surfnet.nl>.
+
+* Changes in zebra
+
+** Fix bug of display BGP routes as "O" instead of "B".  Reported by
+"William F. Maton" <wmaton@enterprise.ic.gc.ca> and Dave Hartzell
+<hartzell@greatplains.net>.
+
+* Changes in bgpd
+
+** `no network IPV6_NETWORK' statement and `no neighbor IP_ADDR timers
+holdtime [TIMER]' statement doesn't work. Reported by Georg Hitsch
+<georg@atnet.at>.  Now both statement work.
+
+* Changes in ospfd
+
+** Last interface is not updated by ospf_if_update().  Reported by
+Dave Hartzell <hartzell@greatplains.net>.
+
+* Changes in ospf6d
+
+** Byte order of ifid is changed.  Due to this change, this code will
+not work with previous version, sorry.
+
+** Fix `show ip route' route type mismatch.
+
+** Fix bug of no network IPV6_NETWORK.
+
+** Important bug fix about intra-area-prefix-lsa.
+
+* Changes in zebra-0.64.
+
+* Changes in lib
+
+** prefix-list based filtering routine is added.  Currently used in
+bgpd but it will be in other daemons.
+
+* Changes in bgpd
+
+** `no router bgp' works.  But network statement is not cleared.  This
+should be fixed in next beta.
+
+** Route reflector related statement is added.
+
+  router bgp ASN
+    bgp cluster-id a.b.c.d
+    neighbor a.b.c.d route-reflector-client
+
+  is added.
+
+** Prefix list based filtering is added.
+
+  router bgp ASN
+    neighbor a.b.c.d prefix-list PREFIX_LIST_NAME
+
+** Prefix list based routing display works.
+
+  show ip bgp prefix-list PREFIX_LIST_NAME
+
+* Changes in ripd
+
+** Fix route metric check bug.  Reported from Mr. Carlos Alberto
+Barcenilla.
+
+* Changes in ospf6d
+
+** There are many changes.  If you have interested in ospf6d please
+visit ospf6d/README file.
+
+* Changes in zebra-0.63 first beta package.
+
+* Changes in lib
+
+** `copy running-config stgartup-config' command is added.
+
+** prefix length check bug is fixed.  Thanks Marlos Barcenilla
+<barce@frip.utn.edu.ar>.
+
+* Changes in ospfd
+
+** DR and BDR election works.
+
+** OSPF Hello simple authentication works.
+
+* Changes in ospf6d
+
+** Now ospf6d can be compiled on both Linux and *BSD system.
+
+* Changes in zebra-19990420 snapshot
+
+** `make dist' at top directory works now.
+
+* Changes in lib
+
+** VTY has now access-class to restrict remote connection.
+Implemented by Alex Bligh <amb@gxn.net>.
+
+!
+line vty
+  access-class ACCESS-LIST-NAME
+!
+
+** `show version' command added.  Implemented by Carlos Alberto
+Barcenilla <barce@frlp.utn.edu.ar>
+
+* Changes in zebra
+
+** `ip address' command on *BSD bug is fixed.
+
+** `no ip address' works now for IPv4 address.
+
+** Now `write terminal' display `ip address' configuration.
+
+* Changes in bgpd
+
+** Redistribute static works now.  Please run both zebra and bgpd.
+bgpd.conf should be like this:
+
+!
+router zebra
+!
+router bgp ASN
+  redisitribute static
+!
+
+* Changes in guile
+
+** configure --enable-guile turns on zebra-guile build.
+
+** (router-bgp ASN) allocates real bgp structre.
+
+* Changes in zebra-19990416 snapshot
+
+** Set version to 0.60 for preparation of beta release.
+
+** New directory guile is added for linking with guile interpreter.
+
+* Changes in zebra
+
+** On GNU/Linux Kernel 2.2.x (with netlink support), zebra detects
+asynchronous routing updates.  *BSD support is not yet finished.
+
+* Changes in bgpd
+
+** `show ip bgp regexp ASPATH_REGEX' uses CISCO like regular expression 
+instead of RPSL like regular expression.  I'm planing to provide RPSL
+like regular expression with `show ip bgp rpsl' or something.
+
+* Changes in lib
+
+** Press '?' at variable mandatory argument, vty prints nothing.  Now
+vty outputs description about the argument.  Fixed by Alex Bligh
+<amb@gxn.net>
+
+** buffer.c has some ugly bugs.  Due to the bug, vty interface hangs
+when large output date exists.  This bug is fixed. Reported by Alex
+Bligh <amb@gxn.net>.
+
+* Changes in ospfd
+
+** DR and BDR information is shown by `show ip ospf interface' command.
+
+* Changes in zebra-19990408 snapshot
+
+* Changes in bgpd
+
+** Old BGP-4+ specification (described in old draft) treatment bug is
+fixed.  It seems that mrtd uses this format as default.  So if you
+have problem peering with mrtd and want to use old draft format please
+use version statement like this.
+
+neighbor PEER_ADDRESS remote-as ASN
+neighbor PEER_ADDRESS version bgp4+-draft-00
+
+** When AS path is epmty (routes generated by bgpd), SEGV is occur
+when announce the routes to eBGP peer.  Reported by
+kad@gibson.skif.net.
+
+** ip as-path access-list command is added.
+
+** neighbor PEER_ADDRESS filter-list AS_LIST [in|out] command is added.
+
+** neighbor PEER_ADDRESS timers holdtimer TIMER command is added.
+
+* Changes in all daemons
+
+** With KAME stack, terminal interface is now bind AF_INET socket
+instead of AF_INET6 one.
+
+* Changes in zebra-19990403 snapshot
+
+* Changes in bgpd
+
+** When bgpd has 'router zebra', bgpd automatically select it's router
+ID as most highest interface's IP Address.
+
+** When AS path is empty (in case of iBGP), it doesn't include any AS
+segment.  This change is for announcement to gated under iBGP.
+
+* Changes in ospfd
+
+** OSPF hello packet send/receive works.
+
+* Changes in ospf6d
+
+** Yasuhiro Ohara's ospf6d codes is imported.  It is under development
+and can't be compiled on any platform.
+
+* Changes in zebra-19990327 snapshot
+
+* Changes in bgpd
+
+** When BGP-4+ connection is done by IPv6 link-local address.  One
+have to specify interface index for the connection.  So I've added
+interface statement to the neighbor commmand.  Please specify
+interface name for getting interface index like below.  This statement
+only works on GNU/Linux.  I'll support BSD ASAP.
+
+router bgp 7675
+ neighbor fe80::200:f8ff:fe01:5fd3 remote-as 2500
+ neighbor fe80::200:f8ff:fe01:5fd3 interface sit3
+
+** For disable BGP peering `shutdown' command is added.
+
+router bgp 7675
+ neighbor 10.0.0.1 shutdown
+
+** `description' command is added to neighbor statement.
+
+router bgp 7675
+ neighbor 10.0.0.1 description peering with Norway.
+
+** `show ip bgp regexp AS-REGEXP' works again.
+
+show ip bgp regexp AS7675
+
+will show routes which include AS7675.
+
+** When a route which is made from `network' statement is send to
+neighbor.  Set it's nexthop to self.  So 10.0.0.0/8 is announced to
+the peer A with source address 192.168.1.1.  The routes nexthop is set
+to 192.168.1.1.
+
+* Changes in zebra
+
+** In zebra/rtread_sysctl.c, function rtm_read() may overrun allocated
+buffer when the address family is not supported and the length is big
+(i.e link address).  Reported Achim Patzner <ap@bnc.net>.
+
+* Changes in ospfd
+
+** Now ospfd receive OSPF packet.
+
+* Changes in zebra-19990319 snapshot
+
+* Changes in configuration and libraries
+
+** User can disable IPv6 feature and/or pthread feature by configure
+   option.
+
+  To disable IPv6:    configure --disable-ipv6
+  To disable pthread: configure --disable-pthread
+
+** User can disable specified daemon by configure option.
+
+  Don't make zebra:  configure --disable-zebra
+  Don't make bgpd:   configure --disable-bgpd
+  Don't make ripd:   configure --disable-ripd
+  Don't make ripngd: configure --disable-ripngd
+  Don't make ospfd:  configure --disable-ospfd
+  Don't make ospf6d: configure --disable-ospf6d
+
+** Sample configuration files are installed as 600 file flag.
+   Suggested by Jeroen Ruigrok/Asmodai <asmodai@wxs.nl>.
+
+** syslog logging feature is added by Peter Galbavy
+   <Peter.Galbavy@knowledge.com>
+
+** Inclusion of standard header files is reworked by Peter Galbavy
+   <Peter.Galbavy@knowledge.com>
+
+** Change description from GNU/Linux 2.1.X to GNU/Linux 2.2.X
+
+** If daemon function exists in standard C library use it.
+
+** To generate configure script we upgrade autoconf to 2.13.  To
+generate Makefile.in we upgrade automake to 1.4.
+
+** doc/texinfo.tex is added to distribution.
+
+** Update ports/pkg/DESCR description.
+
+** Update doc/zebra.texi.
+
+** logfile FILENAME statement deleted.  Instead of that please use log
+file FILENAME.
+
+* Changes in zebra
+
+* Changes in bgpd
+
+** Communication between zebra and bgpd works now.  So if there is
+   `router zebra' line in bgpd.conf, selected route is installed
+   into kernel routing table.
+
+** Delete all routes which inserted by bgpd when bgpd dies.  If you
+want to retain routes even bgpd dies please specify [-r|--retain]
+option to bgpd.
+
+** BGP announcement code is reworked.  Now bgpd announce selected
+   routes to other peer.
+
+** All output bgp packet is buffered.  It's written to the socket when
+   it gets ready.
+
+** Output route-map works now.  You can specify output route-map by:
+
+   neighbor IP_ADDR route-map ROUTE_MAP_NAME out
+
+** New route-map command added.
+
+   set ip nexthop IP_ADDR
+   set ipv6 nexthop global IP_ADDR
+
+** Fix bug about unlock of the route_node structure.
+
+** BGP-4+ support is added.  bgpd can listen and speak BGP-4+ packet
+specified in RFC2283. You can view IPv6 bgp table by: `show ipv6 bgp'.
+
+** Meny packet overflow check is added.
+
+* Changes in ripd
+
+* Changes in ripngd
+
+* Changes in ospfd
+
+** ospfd work is started by Toshiaki Takada <takada@zebra.org>.  Now
+several files are included in ospfd directory.
+
+** ospf6d codes are merged from Yasuhiro Ohara <yasu@sfc.wide.ad.jp>'s
+ospfd work.  Now codes are located in ospf6d directory.
+
+
+Local variables:
+mode: outline
+paragraph-separate: "[         ]*$"
+end:
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..f1b25d8
--- /dev/null
+++ b/README
@@ -0,0 +1,11 @@
+Quagga is free software that manages various IPv4 and IPv6 routing
+protocols.
+
+Currently Quagga supports BGP4, BGP4+, OSPFv2, OSPFv3, RIPv1,
+RIPv2, and RIPng as well as very early support for IS-IS.
+  
+See the file INSTALL.quagga.txt for building and installation instructions.
+  
+See the file REPORTING-BUGS to report bugs.
+  
+Quagga is free software. See the file COPYING for copying conditions.
diff --git a/README.NetBSD b/README.NetBSD
new file mode 100755 (executable)
index 0000000..6bbc680
--- /dev/null
@@ -0,0 +1,48 @@
+#!/bin/sh
+
+# $QuaggaId: Format:%an, %ai, %h$ $
+
+# This file is helpful for building quagga from cvs on NetBSD, and
+# probably on any system using pkgsrc.  
+# One should have readline installed already (pkgsrc/devel/readline).
+
+MAKE=make
+# Quagga is currently documented not to require GNU make, but sometimes
+# BSD make fails.  Enable this if statement as a workaround.
+if false; then
+    MAKE=gmake
+    echo "WARNING: using gmake to work around nonportable makefiles"
+fi
+
+# Use /usr/quagga to be independent, and /usr/pkg to overwrite pkgsrc.
+PREFIX=/usr/pkg
+
+case $1 in
+
+    build)
+       # Omitted because it is now default:
+       #   --enable-opaque-lsa
+       ./bootstrap.sh
+       LDFLAGS="-L/usr/pkg/lib -R/usr/pkg/lib" CPPFLAGS="-I/usr/pkg/include" \
+       ./configure --prefix=${PREFIX} \
+           --sysconfdir=/etc/zebra --localstatedir=/var/run/zebra \
+           --enable-exampledir=${PREFIX}/share/examples/zebra \
+           --enable-pkgsrcrcdir=${PREFIX}/etc/rc.d \
+           --enable-vtysh
+       ${MAKE}
+       ;;
+
+    install)
+       ${MAKE} install
+       ;;
+
+    clean)
+       ${MAKE} clean
+       ;;
+
+    *)
+       echo "Usage: README.NetBSD (build|install|clean)"
+       exit 1
+       ;;
+
+esac
diff --git a/REPORTING-BUGS b/REPORTING-BUGS
new file mode 100644 (file)
index 0000000..83f4eb9
--- /dev/null
@@ -0,0 +1,34 @@
+This file describes the procedure for reporting Quagga bugs. You are not
+obliged to follow this format, but it would be great help for Quagga developers
+if you report a bug as described below.
+
+Bugs submitted with woefully incomplete information may be summarily
+closed.  Submitters of bugs against old versions may be asked to
+retest against the latest release.  Submitters may be asked for
+additional information.  Bugs may be closed after 30 days of
+non-response to requests to reconfirm or supply additional
+information.
+
+Report bugs http://bugzilla.quagga.net
+
+Please supply the following information:
+1. Your Quagga version or if it is from git then the  commit reference.
+   Please try to report bugs against git master or the latest release.
+2. Quagga daemons you run e.g. bgpd or ripd and full name of your OS. Any
+   specific options you compiled Quagga with. 
+3. Problem description. Copy and paste relative commands and their output to
+   describe your network setup e.g. "zebra>show ip route".
+   Please, also give your simple network layout and output of relative OS
+   commands (e.g., ifconfig (BSD) or ip (Linux)).
+4. All Quagga configuration files you use. If you don't want to publish your
+   network numbers change 2 middle bytes in IPv4 address to be XXX (e.g.
+   192.XXX.XXX.32/24). Similar could be done with IPv6.
+5. If any Quagga daemon core dumped, please, supply stack trace using the
+   following commands: host> gdb exec_file core_file , (gdb) bt .
+6. Run all Quagga daemons with full debugging on (see documentation on
+   debugging) and send _only_ part of logs which are relative to your problem.
+7. If the problem is difficult to reproduce please send a shell script to
+   reproduce it.
+8. Patches, workarounds, fixes are always welcome.
+
+Thank You.
diff --git a/SERVICES b/SERVICES
new file mode 100644 (file)
index 0000000..0322d45
--- /dev/null
+++ b/SERVICES
@@ -0,0 +1,21 @@
+# As long as this software is in alpha testing it is not yet included
+# in /etc/services files. This means that you may need to add the following
+# lines into your /etc/services file on your hosts.
+# 
+# --- Please add this to your /etc/services ---
+
+#
+# GNU Zebra services
+#
+
+zebrasrv       2600/tcp
+zebra          2601/tcp
+ripd           2602/tcp
+ripng          2603/tcp
+ospfd          2604/tcp
+bgpd           2605/tcp
+ospf6d         2606/tcp
+ospfapi                2607/tcp
+isisd          2608/tcp
+pimd           2611/tcp
+nhrpd          2612/tcp
diff --git a/TODO b/TODO
new file mode 100644 (file)
index 0000000..246cc25
--- /dev/null
+++ b/TODO
@@ -0,0 +1,209 @@
+
+                          Quagga TODO list
+                             2013-03-29
+
+
+This is the Quagga primary TODO list.  It is on git because that way changes
+pass through the usual process just like code does, therefore they will have
+the same visibility.
+
+If you are working on something beyond a simple fix, to avoid double work it
+is a good idea to submit a patch to this TODO list when you are starting,
+listing what you're doing.  Also, as others may have done just that, check
+the list before starting.
+
+Google Summer of Code 2013 note:  this list double-serves as idea list for the
+Summer of Code.  Ideas considered suitable for students are marked with a star
+after the number, like this: "[Q999*] achieve world peace".  They will also
+have extended descriptions.  Nevertheless, if you'd like to do something else,
+just write a mail to the mailing list: quagga-dev@lists.quagga.net
+
+"GSoC-Mentors:" listings are preliminary at this point.
+
+
+Overall
+=======
+
+[Q000] improve unit test architecture
+
+[Q001] kick invalid runtime tests from configure.ac, use list of supported
+               OSes and their APIs instead.
+       Priority: low
+       State: patch half-done 2013-03-29 David Lamparter
+
+[Q002*] clean up zebra IPC, remove code duplication, align to common API
+       Priority: high
+       GSoC-Mentors: David Lamparter, Christian Franke
+
+       Quagga posesses an IPC mechanism to exchange route information among
+       the different daemons and Zebra, the kernel-interface.  This mechanism
+       is implemented in libzebra, but is currently used in all sorts of
+       different ways in the individual protocol daemons.  Also, in the future
+       the entire protocol needs to be redone in an extensible way, so we're
+       able to support MPLS, BFD, Multi-Topology/Instance, VRFs, ...
+
+       This TODO entry only refers to the first-step API cleanup.  All the
+       daemons need to use a single, well-defined libzebra API.  Only after
+       this has been addressed can we look upon changing the protocol itself,
+       since by then it will be encapsulated inside libzebra.
+
+[Q003] add multi-instance / multi-topology support to the individual protocols
+
+[Q004] MPLS support
+       State: work in progress 2013-03-29 Renato Westphal, Timo Teräs
+
+[Q005] BFD support
+       State: two old implementations exist, contact Hasso Tepper
+
+
+library
+=======
+
+[L000] improve route_table speed, eg strided lookups for common prefix depths.
+
+[L001] ipv6 addresses need concept of valid/preferred
+
+[L002] implement a generic daemon access/control protocol (eg D-Bus like?
+               simplified SNMP-a-like?  NETCONF?)
+
+[L003] extend vty command definitions to allow them to be self-documenting
+               i18n command help strings
+
+[L004] create a common libspf (for ospfd, ospf6d and possibly isisd and more).
+               cf. TODO item [O000] for the ospfd/ospf6d specific variant
+
+[L005] stabilise the API (possibly including symbol/library versioning voodoo)
+
+[L006] Document the exported API (DocBook/Doxygen?)
+
+[LE00] incorporate library changes from Euro-IX branch, except threading
+
+[LE01] incorporate threading library support from Euro-IX branch
+
+
+zebra
+=====
+
+[Z000] Pointopoint address configuration.
+       Priority: low
+       State: patch done & tested 2013-03-29 David Lamparter
+
+[Z001] Add support for valid and preferred lifetimes to IPv6 addresses
+
+[Z002] proper support for (at least) 1-level recursive routes
+       Priority: high
+
+[Z003] Ability to set src on routes, where systems support it.
+
+[Z004] Ability to apply route-maps to daemon route updates.
+
+
+bgpd
+====
+
+[B000] HUP signal support (reload configuration file).
+
+[B001*] BGP multi-path extension, relaxed mode
+       Priority: medium
+       Implemented, patch will be sent shortly
+       Pradosh Mohapatra, Cumulus Networks
+
+[B002] move FSM state to be per-connection, not per-peer.
+
+[B003] Add support for internal and minimum-metric MED setting
+
+
+ripd
+====
+
+[R000] Multipath support.
+
+
+ospfd/ospf6d
+============
+
+[O000] move SPF to common code
+
+[O001] extend code sharing between ospfd and ospf6d beyond SPF
+
+[O002*] OSPF testing replay tool
+       Priority: medium
+       GSoC-Mentors: Martin Winter, Christian Franke, David Lamparter
+
+       In order to extensively test OSPF implementations, a tool to fake an
+       OSPF neighbor is immensely useful.  This tool needs to be capable of
+       forming an adjacency and pushing LSAs to the device to be tested.  To
+       maintain the adjacency, some minimal state tracking is useful.
+
+       In total, the tool needs to form an adjacency, read and push LSAs, and
+       output received LSAs.  Additional tools to generate LSAs from
+       specifications as well as verify received LSA correctness can then be
+       built on top of that.
+
+       The tool needs to support IPv4 and IPv6, possibly split into 2 tools
+       with some code sharing.
+
+ospfd:
+
+[O400] Demand circuits.
+       Priority: very low
+
+[O401] Multiple instances.
+       Priority: medium
+
+[O402] HUP signal treatment.
+       Priority: medium
+       State: patch on ML needs review 2012-06-04 Mattias Walström
+
+ospf6d:
+
+[O600*] fix ospf6d in general
+       Priority: high
+       State: patches tickling in from Cumulus Networks 2013-03-29 Dinesh Dutt
+        Implemented: p2p link support, ABR, Stub area/Totally Stubby area,
+        SPF throttling, Improving state machine to get performance/scale,
+        max-metric support, Improving ECMP to be > 4, Various other bug fixes
+
+
+[O601*] OSPFv3 autoconfiguration, prefix assignment and sourcedest routing
+       Priority: medium
+       State: work in progress 2013-03-29 Edward Seabrook
+       GSoC-Mentors: David Lamparter
+
+       OSPFv3 application in the homenet is being designed to use several
+       extensions to the base protocol.  In order of dependency,
+       autoconfiguration, prefix assignment and sourcedest routing should
+       be implemented.
+
+       This task requires a good level of OSPF understanding plus proper
+       ability to follow IETF discussion about these points.  Also, since work
+       has already started on this, improvements must obviously build on top
+       of that.
+
+isisd
+=====
+
+[I000] reassess isisd TODO
+
+[I001*] IS-IS testing replay tool
+       Priority: medium
+       GSoC-Mentors: Martin Winter, Christian Franke, David Lamparter
+
+       see [O002*].
+
+[I002] Mesh groups (RFC2973)
+
+[I003] Crypto authentication (RFC3567)
+
+
+vtysh
+=====
+
+[V000] untangle readline specific bits
+
+[V001] add a vtyd with a vty (ie telnet) frontend (as opposed to readline)
+
+[V002] (=> [L002]) use daemon control protocol
+
+[V003] better AAA support than just PAM, eg krb5, SASL, LDAP...
+
diff --git a/bgpd/.gitignore b/bgpd/.gitignore
new file mode 100644 (file)
index 0000000..105be22
--- /dev/null
@@ -0,0 +1,18 @@
+Makefile
+Makefile.in
+*.o
+bgpd
+bgp_btoa
+bgpd.conf
+tags
+TAGS
+.deps
+.nfs*
+*.lo
+*.la
+*.a
+*.libs
+.arch-inventory
+.arch-ids
+*~
+*.loT
diff --git a/bgpd/BGP4-MIB.txt b/bgpd/BGP4-MIB.txt
new file mode 100644 (file)
index 0000000..c911316
--- /dev/null
@@ -0,0 +1,929 @@
+    BGP4-MIB DEFINITIONS ::= BEGIN
+
+        IMPORTS
+            MODULE-IDENTITY, OBJECT-TYPE, NOTIFICATION-TYPE,
+            IpAddress, Integer32, Counter32, Gauge32, mib-2
+                FROM SNMPv2-SMI
+            MODULE-COMPLIANCE, OBJECT-GROUP, NOTIFICATION-GROUP
+                FROM SNMPv2-CONF;
+
+        bgp MODULE-IDENTITY
+            LAST-UPDATED "9902100000Z"
+            ORGANIZATION "IETF IDR Working Group"
+            CONTACT-INFO "E-mail:  idr@merit.net
+
+                          Susan Hares  (Editor)
+                          Merit Network
+                          4251 Plymouth Road
+                          Suite C
+                          Ann Arbor, MI 48105-2785
+                          Tel: +1 734 936 2095
+                          Fax: +1 734 647 3185
+                          E-mail: skh@merit.edu
+
+                          Jeff Johnson (Editor)
+                          RedBack Networks, Inc.
+                          1389 Moffett Park Drive
+                          Sunnyvale, CA  94089-1134
+                          Tel: +1 408 548 3516
+                          Fax: +1 408 548 3599
+                          E-mail: jeff@redback.com"
+            DESCRIPTION
+                    "The MIB module for BGP-4."
+            REVISION    "9902100000Z"
+            DESCRIPTION
+                    "Corrected duplicate OBJECT IDENTIFIER
+                     assignment in the conformance information."
+            REVISION    "9601080000Z"
+            DESCRIPTION
+                    "1) Fixed the definitions of the traps to
+                     make them equivalent to their initial
+                     definition in RFC 1269.
+                     2) Added compliance and conformance info."
+            ::= { mib-2 15 }
+
+        bgpVersion OBJECT-TYPE
+            SYNTAX     OCTET STRING (SIZE (1..255))
+            MAX-ACCESS read-only
+            STATUS     current
+            DESCRIPTION
+                    "Vector of supported BGP protocol version
+                    numbers.  Each peer negotiates the version
+                    from this vector.  Versions are identified
+                    via the string of bits contained within this
+                    object.  The first octet contains bits 0 to
+                    7, the second octet contains bits 8 to 15,
+                    and so on, with the most significant bit
+                    referring to the lowest bit number in the
+                    octet (e.g., the MSB of the first octet
+                    refers to bit 0).  If a bit, i, is present
+                    and set, then the version (i+1) of the BGP
+                    is supported."
+            ::= { bgp 1 }
+
+        bgpLocalAs OBJECT-TYPE
+            SYNTAX     INTEGER (0..65535)
+            MAX-ACCESS read-only
+            STATUS     current
+            DESCRIPTION
+                    "The local autonomous system number."
+            ::= { bgp 2 }
+
+
+
+        -- BGP Peer table.  This table contains, one entry per BGP
+        -- peer, information about the BGP peer.
+
+        bgpPeerTable OBJECT-TYPE
+            SYNTAX     SEQUENCE OF BgpPeerEntry
+            MAX-ACCESS not-accessible
+            STATUS     current
+            DESCRIPTION
+                    "BGP peer table.  This table contains,
+                    one entry per BGP peer, information about the
+                    connections with BGP peers."
+            ::= { bgp 3 }
+
+        bgpPeerEntry OBJECT-TYPE
+            SYNTAX     BgpPeerEntry
+            MAX-ACCESS not-accessible
+            STATUS     current
+            DESCRIPTION
+                    "Entry containing information about the
+                    connection with a BGP peer."
+            INDEX { bgpPeerRemoteAddr }
+            ::= { bgpPeerTable 1 }
+
+        BgpPeerEntry ::= SEQUENCE {
+                bgpPeerIdentifier
+                    IpAddress,
+                bgpPeerState
+                    INTEGER,
+                bgpPeerAdminStatus
+                    INTEGER,
+                bgpPeerNegotiatedVersion
+                    Integer32,
+                bgpPeerLocalAddr
+                    IpAddress,
+                bgpPeerLocalPort
+                    INTEGER,
+                bgpPeerRemoteAddr
+                    IpAddress,
+                bgpPeerRemotePort
+                    INTEGER,
+                bgpPeerRemoteAs
+                    INTEGER,
+                bgpPeerInUpdates
+                    Counter32,
+                bgpPeerOutUpdates
+                    Counter32,
+                bgpPeerInTotalMessages
+                    Counter32,
+                bgpPeerOutTotalMessages
+                    Counter32,
+                bgpPeerLastError
+                    OCTET STRING,
+                bgpPeerFsmEstablishedTransitions
+                    Counter32,
+                bgpPeerFsmEstablishedTime
+                    Gauge32,
+                bgpPeerConnectRetryInterval
+                    INTEGER,
+                bgpPeerHoldTime
+                    INTEGER,
+                bgpPeerKeepAlive
+                    INTEGER,
+                bgpPeerHoldTimeConfigured
+                    INTEGER,
+                bgpPeerKeepAliveConfigured
+                    INTEGER,
+                bgpPeerMinASOriginationInterval
+                    INTEGER,
+                bgpPeerMinRouteAdvertisementInterval
+                    INTEGER,
+                bgpPeerInUpdateElapsedTime
+                    Gauge32
+                }
+
+        bgpPeerIdentifier OBJECT-TYPE
+            SYNTAX     IpAddress
+            MAX-ACCESS read-only
+            STATUS     current
+            DESCRIPTION
+                    "The BGP Identifier of this entry's BGP peer."
+            ::= { bgpPeerEntry 1 }
+
+        bgpPeerState OBJECT-TYPE
+            SYNTAX     INTEGER {
+                                idle(1),
+                                connect(2),
+                                active(3),
+                                opensent(4),
+                                openconfirm(5),
+                                established(6)
+                       }
+            MAX-ACCESS read-only
+            STATUS     current
+            DESCRIPTION
+                    "The BGP peer connection state."
+            ::= { bgpPeerEntry 2 }
+
+        bgpPeerAdminStatus OBJECT-TYPE
+            SYNTAX     INTEGER {
+                                stop(1),
+                                start(2)
+                       }
+            MAX-ACCESS read-write
+            STATUS     current
+            DESCRIPTION
+                    "The desired state of the BGP connection.  A
+                    transition from 'stop' to 'start' will cause
+                    the BGP Start Event to be generated.  A
+                    transition from 'start' to 'stop' will cause
+                    the BGP Stop Event to be generated.  This
+                    parameter can be used to restart BGP peer
+                    connections.  Care should be used in providing
+                    write access to this object without adequate
+                    authentication."
+            ::= { bgpPeerEntry 3 }
+
+        bgpPeerNegotiatedVersion OBJECT-TYPE
+            SYNTAX     Integer32
+            MAX-ACCESS read-only
+            STATUS     current
+            DESCRIPTION
+                    "The negotiated version of BGP running between
+                    the two peers."
+            ::= { bgpPeerEntry 4 }
+
+        bgpPeerLocalAddr OBJECT-TYPE
+            SYNTAX     IpAddress
+            MAX-ACCESS read-only
+            STATUS     current
+            DESCRIPTION
+                    "The local IP address of this entry's BGP
+                    connection."
+            ::= { bgpPeerEntry 5 }
+
+        bgpPeerLocalPort OBJECT-TYPE
+            SYNTAX     INTEGER (0..65535)
+            MAX-ACCESS read-only
+            STATUS     current
+            DESCRIPTION
+                    "The local port for the TCP connection between
+                    the BGP peers."
+            ::= { bgpPeerEntry 6 }
+
+        bgpPeerRemoteAddr OBJECT-TYPE
+            SYNTAX     IpAddress
+            MAX-ACCESS read-only
+            STATUS     current
+            DESCRIPTION
+                    "The remote IP address of this entry's BGP
+                    peer."
+            ::= { bgpPeerEntry 7 }
+
+        bgpPeerRemotePort OBJECT-TYPE
+            SYNTAX     INTEGER (0..65535)
+            MAX-ACCESS read-only
+            STATUS     current
+            DESCRIPTION
+                    "The remote port for the TCP connection between
+                    the BGP peers.  Note that the objects
+                    bgpPeerLocalAddr, bgpPeerLocalPort,
+                    bgpPeerRemoteAddr and bgpPeerRemotePort
+                    provide the appropriate reference to the
+                    standard MIB TCP connection table."
+            ::= { bgpPeerEntry 8 }
+
+        bgpPeerRemoteAs OBJECT-TYPE
+            SYNTAX     INTEGER (0..65535)
+            MAX-ACCESS read-only
+            STATUS     current
+            DESCRIPTION
+                    "The remote autonomous system number."
+            ::= { bgpPeerEntry 9 }
+
+        bgpPeerInUpdates OBJECT-TYPE
+            SYNTAX     Counter32
+            MAX-ACCESS read-only
+            STATUS     current
+            DESCRIPTION
+                    "The number of BGP UPDATE messages received on
+                    this connection.  This object should be
+                    initialized to zero (0) when the connection is
+                    established."
+            ::= { bgpPeerEntry 10 }
+
+        bgpPeerOutUpdates OBJECT-TYPE
+            SYNTAX     Counter32
+            MAX-ACCESS read-only
+            STATUS     current
+            DESCRIPTION
+                    "The number of BGP UPDATE messages transmitted
+                    on this connection.  This object should be
+                    initialized to zero (0) when the connection is
+                    established."
+            ::= { bgpPeerEntry 11 }
+
+        bgpPeerInTotalMessages OBJECT-TYPE
+            SYNTAX     Counter32
+            MAX-ACCESS read-only
+            STATUS     current
+            DESCRIPTION
+                    "The total number of messages received from the
+                    remote peer on this connection.  This object
+                    should be initialized to zero when the
+                    connection is established."
+            ::= { bgpPeerEntry 12 }
+
+        bgpPeerOutTotalMessages OBJECT-TYPE
+            SYNTAX     Counter32
+            MAX-ACCESS read-only
+            STATUS     current
+            DESCRIPTION
+                    "The total number of messages transmitted to
+                    the remote peer on this connection.  This object
+                    should be initialized to zero when the
+                    connection is established."
+            ::= { bgpPeerEntry 13 }
+
+        bgpPeerLastError OBJECT-TYPE
+            SYNTAX     OCTET STRING (SIZE (2))
+            MAX-ACCESS read-only
+            STATUS     current
+            DESCRIPTION
+                    "The last error code and subcode seen by this
+                    peer on this connection.  If no error has
+                    occurred, this field is zero.  Otherwise, the
+                    first byte of this two byte OCTET STRING
+                    contains the error code, and the second byte
+                    contains the subcode."
+            ::= { bgpPeerEntry 14 }
+
+        bgpPeerFsmEstablishedTransitions OBJECT-TYPE
+            SYNTAX     Counter32
+            MAX-ACCESS read-only
+            STATUS     current
+            DESCRIPTION
+                    "The total number of times the BGP FSM
+                    transitioned into the established state."
+            ::= { bgpPeerEntry 15 }
+
+        bgpPeerFsmEstablishedTime OBJECT-TYPE
+            SYNTAX     Gauge32
+            MAX-ACCESS read-only
+            STATUS     current
+            DESCRIPTION
+                    "This timer indicates how long (in seconds) this
+                    peer has been in the Established state or how long
+                    since this peer was last in the Established state.
+                    It is set to zero when a new peer is configured or
+                    the router is booted."
+            ::= { bgpPeerEntry 16 }
+
+        bgpPeerConnectRetryInterval OBJECT-TYPE
+            SYNTAX     INTEGER (1..65535)
+            MAX-ACCESS read-write
+            STATUS     current
+            DESCRIPTION
+                    "Time interval in seconds for the ConnectRetry
+                    timer.  The suggested value for this timer is
+                    120 seconds."
+            ::= { bgpPeerEntry 17 }
+
+        bgpPeerHoldTime OBJECT-TYPE
+            SYNTAX     INTEGER  ( 0 | 3..65535 )
+            MAX-ACCESS read-only
+            STATUS     current
+            DESCRIPTION
+                    "Time interval in seconds for the Hold Timer
+                    established with the peer.  The value of this
+                    object is calculated by this BGP speaker by
+                    using the smaller of the value in
+                    bgpPeerHoldTimeConfigured and the Hold Time
+                    received in the OPEN message.  This value
+                    must be at lease three seconds if it is not
+                    zero (0) in which case the Hold Timer has
+                    not been established with the peer, or, the
+                    value of bgpPeerHoldTimeConfigured is zero (0)."
+            ::= { bgpPeerEntry 18 }
+
+        bgpPeerKeepAlive OBJECT-TYPE
+            SYNTAX     INTEGER ( 0 | 1..21845 )
+            MAX-ACCESS read-only
+            STATUS     current
+            DESCRIPTION
+                    "Time interval in seconds for the KeepAlive
+                    timer established with the peer.  The value of
+                    this object is calculated by this BGP speaker
+                    such that, when compared with bgpPeerHoldTime,
+                    it has the same proportion as what
+                    bgpPeerKeepAliveConfigured has when compared
+                    with bgpPeerHoldTimeConfigured.  If the value
+                    of this object is zero (0), it indicates that
+                    the KeepAlive timer has not been established
+                    with the peer, or, the value of
+                    bgpPeerKeepAliveConfigured is zero (0)."
+            ::= { bgpPeerEntry 19 }
+
+        bgpPeerHoldTimeConfigured OBJECT-TYPE
+            SYNTAX     INTEGER ( 0 | 3..65535 )
+            MAX-ACCESS read-write
+            STATUS     current
+            DESCRIPTION
+                    "Time interval in seconds for the Hold Time
+                    configured for this BGP speaker with this peer.
+                    This value is placed in an OPEN message sent to
+                    this peer by this BGP speaker, and is compared
+                    with the Hold Time field in an OPEN message
+                    received from the peer when determining the Hold
+                    Time (bgpPeerHoldTime) with the peer.  This value
+                    must not be less than three seconds if it is not
+                    zero (0) in which case the Hold Time is NOT to be
+                    established with the peer.  The suggested value for
+                    this timer is 90 seconds."
+            ::= { bgpPeerEntry 20 }
+
+        bgpPeerKeepAliveConfigured OBJECT-TYPE
+            SYNTAX     INTEGER ( 0 | 1..21845 )
+            MAX-ACCESS read-write
+            STATUS     current
+            DESCRIPTION
+                    "Time interval in seconds for the KeepAlive timer
+                    configured for this BGP speaker with this peer.
+                    The value of this object will only determine the
+                    KEEPALIVE messages' frequency relative to the value
+                    specified in bgpPeerHoldTimeConfigured; the actual
+                    time interval for the KEEPALIVE messages is
+                    indicated by bgpPeerKeepAlive.  A reasonable
+                    maximum value for this timer would be configured to
+                    be one third of that of bgpPeerHoldTimeConfigured.
+                    If the value of this object is zero (0), no
+                    periodical KEEPALIVE messages are sent to the peer
+                    after the BGP connection has been established.  The
+                    suggested value for this timer is 30 seconds."
+            ::= { bgpPeerEntry 21 }
+
+        bgpPeerMinASOriginationInterval OBJECT-TYPE
+            SYNTAX     INTEGER (1..65535)
+            MAX-ACCESS read-write
+            STATUS     current
+            DESCRIPTION
+                    "Time interval in seconds for the
+                    MinASOriginationInterval timer.
+                    The suggested value for this timer is 15 seconds."
+            ::= { bgpPeerEntry 22 }
+
+        bgpPeerMinRouteAdvertisementInterval OBJECT-TYPE
+            SYNTAX     INTEGER (1..65535)
+            MAX-ACCESS read-write
+            STATUS     current
+            DESCRIPTION
+                    "Time interval in seconds for the
+                    MinRouteAdvertisementInterval timer.
+                    The suggested value for this timer is 30 seconds."
+            ::= { bgpPeerEntry 23 }
+
+        bgpPeerInUpdateElapsedTime OBJECT-TYPE
+            SYNTAX     Gauge32
+            MAX-ACCESS read-only
+            STATUS     current
+            DESCRIPTION
+                    "Elapsed time in seconds since the last BGP
+                    UPDATE message was received from the peer.
+                    Each time bgpPeerInUpdates is incremented,
+                    the value of this object is set to zero (0)."
+            ::= { bgpPeerEntry 24 }
+
+
+
+        bgpIdentifier OBJECT-TYPE
+            SYNTAX     IpAddress
+            MAX-ACCESS read-only
+            STATUS     current
+            DESCRIPTION
+                    "The BGP Identifier of local system."
+            ::= { bgp 4 }
+
+
+
+        -- Received Path Attribute Table.  This table contains,
+        -- one entry per path to a network, path attributes
+        -- received from all peers running BGP version 3 or less.
+        -- This table is obsolete, having been replaced in
+        -- functionality with the bgp4PathAttrTable.
+
+        bgpRcvdPathAttrTable OBJECT-TYPE
+            SYNTAX     SEQUENCE OF BgpPathAttrEntry
+            MAX-ACCESS not-accessible
+            STATUS     obsolete
+            DESCRIPTION
+                    "The BGP Received Path Attribute Table contains
+                    information about paths to destination networks
+                    received from all peers running BGP version 3 or
+                    less."
+            ::= { bgp 5 }
+
+        bgpPathAttrEntry OBJECT-TYPE
+            SYNTAX     BgpPathAttrEntry
+            MAX-ACCESS not-accessible
+            STATUS     obsolete
+            DESCRIPTION
+                    "Information about a path to a network."
+            INDEX { bgpPathAttrDestNetwork,
+                    bgpPathAttrPeer        }
+            ::= { bgpRcvdPathAttrTable 1 }
+
+        BgpPathAttrEntry ::= SEQUENCE {
+            bgpPathAttrPeer
+                 IpAddress,
+            bgpPathAttrDestNetwork
+                 IpAddress,
+            bgpPathAttrOrigin
+                 INTEGER,
+            bgpPathAttrASPath
+                 OCTET STRING,
+            bgpPathAttrNextHop
+                 IpAddress,
+            bgpPathAttrInterASMetric
+                 Integer32
+        }
+
+        bgpPathAttrPeer OBJECT-TYPE
+            SYNTAX     IpAddress
+            MAX-ACCESS read-only
+            STATUS     obsolete
+            DESCRIPTION
+                    "The IP address of the peer where the path
+                    information was learned."
+            ::= { bgpPathAttrEntry 1 }
+
+        bgpPathAttrDestNetwork OBJECT-TYPE
+            SYNTAX     IpAddress
+            MAX-ACCESS read-only
+            STATUS     obsolete
+            DESCRIPTION
+                    "The address of the destination network."
+            ::= { bgpPathAttrEntry 2 }
+
+        bgpPathAttrOrigin OBJECT-TYPE
+            SYNTAX     INTEGER {
+                           igp(1),-- networks are interior
+                           egp(2),-- networks learned via EGP
+                           incomplete(3) -- undetermined
+                       }
+            MAX-ACCESS read-only
+            STATUS     obsolete
+            DESCRIPTION
+                 "The ultimate origin of the path information."
+            ::= { bgpPathAttrEntry 3 }
+
+        bgpPathAttrASPath OBJECT-TYPE
+            SYNTAX     OCTET STRING (SIZE (2..255))
+            MAX-ACCESS read-only
+            STATUS     obsolete
+            DESCRIPTION
+                    "The set of ASs that must be traversed to reach
+                    the network.  This object is probably best
+                    represented as SEQUENCE OF INTEGER.  For SMI
+                    compatibility, though, it is represented as
+                    OCTET STRING.  Each AS is represented as a pair
+                    of octets according to the following algorithm:
+
+                        first-byte-of-pair = ASNumber / 256;
+                        second-byte-of-pair = ASNumber & 255;"
+            ::= { bgpPathAttrEntry 4 }
+
+        bgpPathAttrNextHop OBJECT-TYPE
+            SYNTAX     IpAddress
+            MAX-ACCESS read-only
+            STATUS     obsolete
+            DESCRIPTION
+                    "The address of the border router that should
+                    be used for the destination network."
+            ::= { bgpPathAttrEntry 5 }
+
+        bgpPathAttrInterASMetric OBJECT-TYPE
+            SYNTAX     Integer32
+            MAX-ACCESS read-only
+            STATUS     obsolete
+            DESCRIPTION
+                    "The optional inter-AS metric.  If this
+                    attribute has not been provided for this route,
+                    the value for this object is 0."
+            ::= { bgpPathAttrEntry 6 }
+
+
+
+        -- BGP-4 Received Path Attribute Table.  This table contains,
+        -- one entry per path to a network, path attributes
+        -- received from all peers running BGP-4.
+
+        bgp4PathAttrTable OBJECT-TYPE
+            SYNTAX     SEQUENCE OF Bgp4PathAttrEntry
+            MAX-ACCESS not-accessible
+            STATUS     current
+            DESCRIPTION
+                    "The BGP-4 Received Path Attribute Table contains
+                    information about paths to destination networks
+                    received from all BGP4 peers."
+            ::= { bgp 6 }
+
+        bgp4PathAttrEntry OBJECT-TYPE
+            SYNTAX     Bgp4PathAttrEntry
+            MAX-ACCESS not-accessible
+            STATUS     current
+            DESCRIPTION
+                    "Information about a path to a network."
+            INDEX { bgp4PathAttrIpAddrPrefix,
+                    bgp4PathAttrIpAddrPrefixLen,
+                    bgp4PathAttrPeer            }
+            ::= { bgp4PathAttrTable 1 }
+
+        Bgp4PathAttrEntry ::= SEQUENCE {
+            bgp4PathAttrPeer
+                 IpAddress,
+            bgp4PathAttrIpAddrPrefixLen
+                 INTEGER,
+            bgp4PathAttrIpAddrPrefix
+                 IpAddress,
+            bgp4PathAttrOrigin
+                 INTEGER,
+            bgp4PathAttrASPathSegment
+                 OCTET STRING,
+            bgp4PathAttrNextHop
+                 IpAddress,
+            bgp4PathAttrMultiExitDisc
+                 INTEGER,
+            bgp4PathAttrLocalPref
+                 INTEGER,
+            bgp4PathAttrAtomicAggregate
+                 INTEGER,
+            bgp4PathAttrAggregatorAS
+                 INTEGER,
+            bgp4PathAttrAggregatorAddr
+                 IpAddress,
+            bgp4PathAttrCalcLocalPref
+                 INTEGER,
+            bgp4PathAttrBest
+                 INTEGER,
+            bgp4PathAttrUnknown
+                 OCTET STRING
+        }
+
+        bgp4PathAttrPeer OBJECT-TYPE
+            SYNTAX     IpAddress
+            MAX-ACCESS read-only
+            STATUS     current
+            DESCRIPTION
+                    "The IP address of the peer where the path
+                    information was learned."
+            ::= { bgp4PathAttrEntry 1 }
+        bgp4PathAttrIpAddrPrefixLen OBJECT-TYPE
+            SYNTAX     INTEGER (0..32)
+            MAX-ACCESS read-only
+            STATUS     current
+            DESCRIPTION
+                    "Length in bits of the IP address prefix in the
+                    Network Layer Reachability Information field."
+            ::= { bgp4PathAttrEntry 2 }
+
+        bgp4PathAttrIpAddrPrefix OBJECT-TYPE
+            SYNTAX     IpAddress
+            MAX-ACCESS read-only
+            STATUS     current
+            DESCRIPTION
+                    "An IP address prefix in the Network Layer
+                    Reachability Information field.  This object
+                    is an IP address containing the prefix with
+                    length specified by bgp4PathAttrIpAddrPrefixLen.
+                    Any bits beyond the length specified by
+                    bgp4PathAttrIpAddrPrefixLen are zeroed."
+            ::= { bgp4PathAttrEntry 3 }
+
+        bgp4PathAttrOrigin OBJECT-TYPE
+            SYNTAX     INTEGER {
+                                 igp(1),-- networks are interior
+                                 egp(2),-- networks learned via EGP
+                                 incomplete(3) -- undetermined
+                               }
+            MAX-ACCESS read-only
+            STATUS     current
+            DESCRIPTION
+                    "The ultimate origin of the path information."
+            ::= { bgp4PathAttrEntry 4 }
+
+        bgp4PathAttrASPathSegment OBJECT-TYPE
+            SYNTAX     OCTET STRING (SIZE (2..255))
+            MAX-ACCESS read-only
+            STATUS     current
+            DESCRIPTION
+                    "The sequence of AS path segments.  Each AS
+                    path segment is represented by a triple
+                    <type, length, value>.
+
+                    The type is a 1-octet field which has two
+                    possible values:
+                         1      AS_SET: unordered set of ASs a
+                                     route in the UPDATE message
+                                     has traversed
+                         2      AS_SEQUENCE: ordered set of ASs
+                                     a route in the UPDATE message
+                                     has traversed.
+
+                    The length is a 1-octet field containing the
+                    number of ASs in the value field.
+
+                    The value field contains one or more AS
+                    numbers, each AS is represented in the octet
+                    string as a pair of octets according to the
+                    following algorithm:
+
+                        first-byte-of-pair = ASNumber / 256;
+                        second-byte-of-pair = ASNumber & 255;"
+            ::= { bgp4PathAttrEntry 5 }
+
+        bgp4PathAttrNextHop OBJECT-TYPE
+            SYNTAX     IpAddress
+            MAX-ACCESS read-only
+            STATUS     current
+            DESCRIPTION
+                    "The address of the border router that should
+                    be used for the destination network."
+            ::= { bgp4PathAttrEntry 6 }
+
+        bgp4PathAttrMultiExitDisc OBJECT-TYPE
+            SYNTAX     INTEGER (-1..2147483647)
+            MAX-ACCESS read-only
+            STATUS     current
+            DESCRIPTION
+                    "This metric is used to discriminate between
+                    multiple exit points to an adjacent autonomous
+                    system.  A value of -1 indicates the absence of
+                    this attribute."
+            ::= { bgp4PathAttrEntry 7 }
+
+        bgp4PathAttrLocalPref OBJECT-TYPE
+            SYNTAX     INTEGER (-1..2147483647)
+            MAX-ACCESS read-only
+            STATUS     current
+            DESCRIPTION
+                    "The originating BGP4 speaker's degree of
+                    preference for an advertised route.  A value of
+                    -1 indicates the absence of this attribute."
+            ::= { bgp4PathAttrEntry 8 }
+
+        bgp4PathAttrAtomicAggregate OBJECT-TYPE
+            SYNTAX     INTEGER {
+                           lessSpecificRrouteNotSelected(1),
+                           lessSpecificRouteSelected(2)
+                       }
+            MAX-ACCESS read-only
+            STATUS     current
+            DESCRIPTION
+                    "Whether or not a system has selected
+                    a less specific route without selecting a
+                    more specific route."
+            ::= { bgp4PathAttrEntry 9 }
+
+        bgp4PathAttrAggregatorAS OBJECT-TYPE
+            SYNTAX     INTEGER (0..65535)
+            MAX-ACCESS read-only
+            STATUS     current
+            DESCRIPTION
+                    "The AS number of the last BGP4 speaker that
+                    performed route aggregation.  A value of zero (0)
+                    indicates the absence of this attribute."
+            ::= { bgp4PathAttrEntry 10 }
+
+        bgp4PathAttrAggregatorAddr OBJECT-TYPE
+            SYNTAX     IpAddress
+            MAX-ACCESS read-only
+            STATUS     current
+            DESCRIPTION
+                    "The IP address of the last BGP4 speaker that
+                     performed route aggregation.  A value of
+                     0.0.0.0 indicates the absence of this attribute."
+            ::= { bgp4PathAttrEntry 11 }
+
+        bgp4PathAttrCalcLocalPref OBJECT-TYPE
+            SYNTAX     INTEGER (-1..2147483647)
+            MAX-ACCESS read-only
+            STATUS     current
+            DESCRIPTION
+                    "The degree of preference calculated by the
+                    receiving BGP4 speaker for an advertised route.
+                    A value of -1 indicates the absence of this
+                    attribute."
+            ::= { bgp4PathAttrEntry 12 }
+
+        bgp4PathAttrBest OBJECT-TYPE
+            SYNTAX     INTEGER {
+                           false(1),-- not chosen as best route
+                           true(2) -- chosen as best route
+                       }
+            MAX-ACCESS read-only
+            STATUS     current
+            DESCRIPTION
+                    "An indication of whether or not this route
+                    was chosen as the best BGP4 route."
+            ::= { bgp4PathAttrEntry 13 }
+
+        bgp4PathAttrUnknown OBJECT-TYPE
+            SYNTAX     OCTET STRING (SIZE(0..255))
+            MAX-ACCESS read-only
+            STATUS     current
+            DESCRIPTION
+                    "One or more path attributes not understood
+                     by this BGP4 speaker.  Size zero (0) indicates
+                     the absence of such attribute(s).  Octets
+                     beyond the maximum size, if any, are not
+                     recorded by this object."
+            ::= { bgp4PathAttrEntry 14 }
+
+
+        -- Traps.
+
+        -- note that in RFC 1657, bgpTraps was incorrectly
+        -- assigned a value of { bgp 7 }, and each of the
+        -- traps had the bgpPeerRemoteAddr object inappropriately
+        -- removed from their OBJECTS clause.  The following
+        -- definitions restore the semantics of the traps as
+        -- they were initially defined in RFC 1269.
+
+        -- { bgp 7 } is unused
+
+        bgpTraps          OBJECT IDENTIFIER ::= { bgp 0 }
+
+        bgpEstablished NOTIFICATION-TYPE
+            OBJECTS { bgpPeerRemoteAddr,
+                      bgpPeerLastError,
+                      bgpPeerState      }
+            STATUS  current
+            DESCRIPTION
+                    "The BGP Established event is generated when
+                    the BGP FSM enters the ESTABLISHED state."
+            ::= { bgpTraps 1 }
+
+        bgpBackwardTransition NOTIFICATION-TYPE
+            OBJECTS { bgpPeerRemoteAddr,
+                      bgpPeerLastError,
+                      bgpPeerState      }
+            STATUS  current
+            DESCRIPTION
+                    "The BGPBackwardTransition Event is generated
+                    when the BGP FSM moves from a higher numbered
+                    state to a lower numbered state."
+            ::= { bgpTraps 2 }
+
+        -- conformance information
+
+        bgpMIBConformance OBJECT IDENTIFIER ::= { bgp 8 }
+        bgpMIBCompliances OBJECT IDENTIFIER ::= { bgpMIBConformance 1 }
+        bgpMIBGroups      OBJECT IDENTIFIER ::= { bgpMIBConformance 2 }
+
+        -- compliance statements
+
+        bgpMIBCompliance MODULE-COMPLIANCE
+            STATUS  current
+            DESCRIPTION
+                    "The compliance statement for entities which
+                     implement the BGP4 mib."
+            MODULE  -- this module
+                MANDATORY-GROUPS { bgp4MIBGlobalsGroup,
+                                   bgp4MIBPeerGroup,
+                                   bgp4MIBPathAttrGroup,
+                                   bgp4MIBNotificationGroup }
+            ::= { bgpMIBCompliances 1 }
+
+        -- units of conformance
+
+        bgp4MIBGlobalsGroup OBJECT-GROUP
+            OBJECTS { bgpVersion,
+                      bgpLocalAs,
+                      bgpIdentifier }
+            STATUS  current
+            DESCRIPTION
+                    "A collection of objects providing information
+                     on global BGP state."
+            ::= { bgpMIBGroups 1 }
+
+        bgp4MIBPeerGroup OBJECT-GROUP
+            OBJECTS { bgpPeerIdentifier,
+                      bgpPeerState,
+                      bgpPeerAdminStatus,
+                      bgpPeerNegotiatedVersion,
+                      bgpPeerLocalAddr,
+                      bgpPeerLocalPort,
+                      bgpPeerRemoteAddr,
+                      bgpPeerRemotePort,
+                      bgpPeerRemoteAs,
+                      bgpPeerInUpdates,
+                      bgpPeerOutUpdates,
+                      bgpPeerInTotalMessages,
+                      bgpPeerOutTotalMessages,
+                      bgpPeerLastError,
+                      bgpPeerFsmEstablishedTransitions,
+                      bgpPeerFsmEstablishedTime,
+                      bgpPeerConnectRetryInterval,
+                      bgpPeerHoldTime,
+                      bgpPeerKeepAlive,
+                      bgpPeerHoldTimeConfigured,
+                      bgpPeerKeepAliveConfigured,
+                      bgpPeerMinASOriginationInterval,
+                      bgpPeerMinRouteAdvertisementInterval,
+                      bgpPeerInUpdateElapsedTime }
+            STATUS  current
+            DESCRIPTION
+                    "A collection of objects for managing
+                     BGP peers."
+            ::= { bgpMIBGroups 2 }
+
+        bgp4MIBRcvdPathAttrGroup OBJECT-GROUP
+            OBJECTS { bgpPathAttrPeer,
+                      bgpPathAttrDestNetwork,
+                      bgpPathAttrOrigin,
+                      bgpPathAttrASPath,
+                      bgpPathAttrNextHop,
+                      bgpPathAttrInterASMetric }
+            STATUS  obsolete
+            DESCRIPTION
+                    "A collection of objects for managing BGP
+                     path entries.
+
+                     This conformance group is obsolete,
+                     replaced by bgp4MIBPathAttrGroup."
+            ::= { bgpMIBGroups 3 }
+
+        bgp4MIBPathAttrGroup OBJECT-GROUP
+            OBJECTS { bgp4PathAttrPeer,
+                      bgp4PathAttrIpAddrPrefixLen,
+                      bgp4PathAttrIpAddrPrefix,
+                      bgp4PathAttrOrigin,
+                      bgp4PathAttrASPathSegment,
+                      bgp4PathAttrNextHop,
+                      bgp4PathAttrMultiExitDisc,
+                      bgp4PathAttrLocalPref,
+                      bgp4PathAttrAtomicAggregate,
+                      bgp4PathAttrAggregatorAS,
+                      bgp4PathAttrAggregatorAddr,
+                      bgp4PathAttrCalcLocalPref,
+                      bgp4PathAttrBest,
+                      bgp4PathAttrUnknown }
+            STATUS  current
+            DESCRIPTION
+                    "A collection of objects for managing
+                     BGP path entries."
+            ::= { bgpMIBGroups 4 }
+
+        bgp4MIBNotificationGroup NOTIFICATION-GROUP
+            NOTIFICATIONS { bgpEstablished,
+                            bgpBackwardTransition }
+            STATUS  current
+            DESCRIPTION
+                    "A collection of notifications for signaling
+                    changes in BGP peer relationships."
+            ::= { bgpMIBGroups 5 }
+
+    END
diff --git a/bgpd/IMPLEMENTATION.txt b/bgpd/IMPLEMENTATION.txt
new file mode 100644 (file)
index 0000000..fff360a
--- /dev/null
@@ -0,0 +1,169 @@
+$Id: IMPLEMENTATION.txt,v 1.2 2005/02/15 17:10:03 gdt Exp $
+
+This file contains notes about the internals of the BGP
+implementation.  The initial impetus is understanding the memory usage
+of Quagga'a BGP implementation.  There may be some inaccuracies; it is
+in the repository in the hopes that it will be significantly more
+helpful than not.
+
+* FILES
+
+bgp_advertise.[hc]:
+  data structures: advertised prefixes, attributes
+
+bgp_aspath.[hc]:
+  struct aspath:
+    These are stored in a hash, apparently in wire format.
+bgp_attr.[hc]:
+  struct attr: contains all attributes
+    size(ILP32) 26 words/104 bytes (poor packing, v6/multicast is 10)
+
+  bgp_attr_parse: origin, aspath, next hop probably most of interest
+  bgp_attr_origin: set flag bit
+  bgp_attr_aspath: put in refcounted hash table, so share pointer
+  bgp_attr_nexthop: store in attribute structure
+
+bgp_btoa.c: ? test program
+
+bgp_clist.[hc]:
+  data structures: community lists (including permit/deny state)
+
+bgp_community.[hc]:
+  data structures: community atttributes (multiple communities per struct)
+
+bgp_damp.[hc]:
+  per-route damping data, and damping control information
+
+bgp_debug.[hc]:
+  debugging support (vty config, dump of packets)
+
+bgp_dump.[hc]:
+  MRT-compatible dump format routines
+
+bgp_ecommunity.[hc]:
+  Extended communities attributes (multiple ecommmunities per struct)
+
+bgp_filter.[hc]:
+  AS path access list filtering
+
+bgp_fsm.[hc]:
+  Per-peer state machine for TCP connection, hold time, etc.
+
+bgp_main.c:
+  Daemon startup.
+
+bgp_mplsvpn.[hc]:
+  parsing of attribute structures for MPLS VPNs [need better description]
+
+bgp_network.[hc]:
+  Opening and binding of sockets, finding addresses for interfaces
+
+bgp_nexthop.[hc]:
+  data structures: Nexthop cache [not clear how used, if truly cache
+  in sense of memoization, or something else]
+
+  importing EGP routes into IGP (thread created)
+  "scanning" (thread created)
+  bgp_scan: has useful clues to data structure complexity.  Scanning
+  process iterates over database of received advertisements, and
+  builds 'cache' structure.
+bgp_open.[ch]:
+  Open messages, and capability negotiation
+
+bgp_packet.[hc]
+  sending and receiving of UPDATE/WITHDRAW
+  collision resolution for simultanteous opens
+  bgp_read: top-level read routine: reads whole packet (nonblocking)
+    and dispatches to per-message-type receive
+
+  bgp_update_receive:
+    calls bgp_attr_parse
+    reads nrli into struct bgp_nrli update
+
+    uninterning of aspath, community, ecommmunity, cluster,
+    transit which were interned in bgp_attr_parse
+
+bgp_regex.[ch]:
+  Glue to convert BGP regexps to standard (_ means many things).
+
+bgp_route.[hc]:
+  data structures: routes as received, static routes
+  Application of filters.  Lots of route processing.
+  bgp_nlri_parse:
+    sanity checks, then calls bgp_update with peer, prefix, attributes pointer
+
+  bgp_update: bgp_update_main, then RS processing
+
+  bgp_update_main:
+    find 'struct bgp_node *' for this afi/safi
+    look for route in table, then 'intern' attributes
+    ** interning is process of
+      looking for data in hash table, and putting there if missing, refcnt
+      using pointer to existing data
+    many validity checks
+    get new struct bgp_info (10 words/40 bytes)
+    call bgp_info_add with rn and bgp_info
+    call bgp_process
+
+bgp_routemap.c
+  implementation of route maps (match and set)
+
+bgp_snmp.c
+  SNMP glue.  Not particularly interesting except to add variables or
+  debug SNMP.
+
+bgp_table.[hc]
+  data structures: struct bgp_table, struct bgp_node
+  allocation/lookup/utility operations - not a lot of protocol processin
+
+bgp_vty.[hc]
+  protocol-wide vty hooks
+
+bgp_zebra.[hc]
+  Processing interface events from zebra, redistribution of routes.
+
+bgpd.h
+  struct bgp_master: daemon main data structure 
+  struct bgp: per-instance structure
+  struct peer_group
+  struct bgp_notify: (in-core representation of wire format?)
+  struct bgp_nexthop: (v4 and v6 addresses, *ifp)
+  struct bgp_rd: router distinguisher: 8 octects
+  struct bgp_filter: distribute, prefix, aslist, route_maps
+  struct peer: neighbor structure (very rich/complex)
+  struct bgp_nlri: reference to wire format
+  #define of protocol constants
+    attribute type codes
+  fsm states/events
+  timer values
+
+bgpd.c
+  instance/peer allocation
+  configuration
+  initialization/termination
+
+* DATA STRUCTURE SIZES
+
+Question: How much memory does quagga's bgpd use as a function of
+state received from peers?
+
+It seems that a struct bgp_info is kept for each prefix.  The "struct
+attr *" is interned, and variables within that are interned.  So, 40
+bytes are kept per received prefix, plus interned shared values.  This
+could be 36 if 'int suppress' where changed to a u_char and moved to
+be with the other u_chars.  Without MPLS, this could be 32 bytes.
+Note that 8 bytes of this is linked list overhead, meaning that 24
+bytes are the raw per-prefix storage requirements.
+
+Also, a struct bgp_damp_info is apparently maintained per route; this
+is fairly large (about 44 bytes).
+
+[TODO: the role of struct bgp_node.]
+
+* TIME COMPLEXITY
+
+It appears that received prefixes from each peer are stored in a
+linked list.
diff --git a/bgpd/Makefile.am b/bgpd/Makefile.am
new file mode 100644 (file)
index 0000000..753b679
--- /dev/null
@@ -0,0 +1,41 @@
+## Process this file with automake to produce Makefile.in.
+
+AM_CPPFLAGS = -I.. -I$(top_srcdir) -I$(top_srcdir)/lib -I$(top_builddir)/lib
+DEFS = @DEFS@ -DSYSCONFDIR=\"$(sysconfdir)/\"
+INSTALL_SDATA=@INSTALL@ -m 600
+
+AM_CFLAGS = $(WERROR)
+
+noinst_LIBRARIES = libbgp.a
+sbin_PROGRAMS = bgpd
+bin_PROGRAMS = bgp_btoa
+
+libbgp_a_SOURCES = \
+       bgpd.c bgp_fsm.c bgp_aspath.c bgp_community.c bgp_attr.c \
+       bgp_debug.c bgp_route.c bgp_zebra.c bgp_open.c bgp_routemap.c \
+       bgp_packet.c bgp_network.c bgp_filter.c bgp_regex.c bgp_clist.c \
+       bgp_dump.c bgp_snmp.c bgp_ecommunity.c bgp_lcommunity.c \
+       bgp_mplsvpn.c bgp_nexthop.c \
+       bgp_damp.c bgp_table.c bgp_advertise.c bgp_vty.c bgp_mpath.c \
+       bgp_encap.c bgp_encap_tlv.c bgp_nht.c
+
+noinst_HEADERS = \
+       bgp_aspath.h bgp_attr.h bgp_community.h bgp_debug.h bgp_fsm.h \
+       bgp_network.h bgp_open.h bgp_packet.h bgp_regex.h bgp_route.h \
+       bgpd.h bgp_filter.h bgp_clist.h bgp_dump.h bgp_zebra.h \
+       bgp_ecommunity.h bgp_lcommunity.h \
+       bgp_mplsvpn.h bgp_nexthop.h bgp_damp.h bgp_table.h \
+       bgp_advertise.h bgp_snmp.h bgp_vty.h bgp_mpath.h \
+       bgp_encap.h bgp_encap_tlv.h bgp_encap_types.h bgp_nht.h
+
+bgpd_SOURCES = bgp_main.c
+bgpd_LDADD = libbgp.a ../lib/libzebra.la @LIBCAP@ @LIBM@
+
+bgp_btoa_SOURCES = bgp_btoa.c
+bgp_btoa_LDADD = libbgp.a ../lib/libzebra.la @LIBCAP@ @LIBM@
+
+examplesdir = $(exampledir)
+dist_examples_DATA = bgpd.conf.sample bgpd.conf.sample2
+
+EXTRA_DIST = BGP4-MIB.txt
+
diff --git a/bgpd/bgp_advertise.c b/bgpd/bgp_advertise.c
new file mode 100644 (file)
index 0000000..1b17b66
--- /dev/null
@@ -0,0 +1,423 @@
+/* BGP advertisement and adjacency
+   Copyright (C) 1996, 97, 98, 99, 2000 Kunihiro Ishiguro
+
+This file is part of GNU Zebra.
+
+GNU Zebra is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version.
+
+GNU Zebra is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Zebra; see the file COPYING.  If not, write to the Free
+Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA.  */
+
+#include <zebra.h>
+
+#include "command.h"
+#include "memory.h"
+#include "prefix.h"
+#include "hash.h"
+#include "thread.h"
+#include "filter.h"
+
+#include "bgpd/bgpd.h"
+#include "bgpd/bgp_table.h"
+#include "bgpd/bgp_route.h"
+#include "bgpd/bgp_advertise.h"
+#include "bgpd/bgp_attr.h"
+#include "bgpd/bgp_aspath.h"
+#include "bgpd/bgp_packet.h"
+#include "bgpd/bgp_fsm.h"
+#include "bgpd/bgp_mplsvpn.h"
+
+/* BGP advertise attribute is used for pack same attribute update into
+   one packet.  To do that we maintain attribute hash in struct
+   peer.  */
+static struct bgp_advertise_attr *
+baa_new (void)
+{
+  return (struct bgp_advertise_attr *)
+    XCALLOC (MTYPE_BGP_ADVERTISE_ATTR, sizeof (struct bgp_advertise_attr));
+}
+
+static void
+baa_free (struct bgp_advertise_attr *baa)
+{
+  XFREE (MTYPE_BGP_ADVERTISE_ATTR, baa);
+}
+
+static void *
+baa_hash_alloc (void *p)
+{
+  struct bgp_advertise_attr * ref = (struct bgp_advertise_attr *) p;
+  struct bgp_advertise_attr *baa;
+
+  baa = baa_new ();
+  baa->attr = ref->attr;
+  return baa;
+}
+
+static unsigned int
+baa_hash_key (void *p)
+{
+  struct bgp_advertise_attr * baa = (struct bgp_advertise_attr *) p;
+
+  return attrhash_key_make (baa->attr);
+}
+
+static int
+baa_hash_cmp (const void *p1, const void *p2)
+{
+  const struct bgp_advertise_attr * baa1 = p1;
+  const struct bgp_advertise_attr * baa2 = p2;
+
+  return attrhash_cmp (baa1->attr, baa2->attr);
+}
+
+/* BGP update and withdraw information is stored in BGP advertise
+   structure.  This structure is referred from BGP adjacency
+   information.  */
+static struct bgp_advertise *
+bgp_advertise_new (void)
+{
+  return (struct bgp_advertise *) 
+    XCALLOC (MTYPE_BGP_ADVERTISE, sizeof (struct bgp_advertise));
+}
+
+static void
+bgp_advertise_free (struct bgp_advertise *adv)
+{
+  if (adv->binfo)
+    bgp_info_unlock (adv->binfo); /* bgp_advertise bgp_info reference */
+  XFREE (MTYPE_BGP_ADVERTISE, adv);
+}
+
+static void
+bgp_advertise_add (struct bgp_advertise_attr *baa,
+                  struct bgp_advertise *adv)
+{
+  adv->next = baa->adv;
+  if (baa->adv)
+    baa->adv->prev = adv;
+  baa->adv = adv;
+}
+
+static void
+bgp_advertise_delete (struct bgp_advertise_attr *baa,
+                     struct bgp_advertise *adv)
+{
+  if (adv->next)
+    adv->next->prev = adv->prev;
+  if (adv->prev)
+    adv->prev->next = adv->next;
+  else
+    baa->adv = adv->next;
+}
+
+static struct bgp_advertise_attr *
+bgp_advertise_intern (struct hash *hash, struct attr *attr)
+{
+  struct bgp_advertise_attr ref;
+  struct bgp_advertise_attr *baa;
+
+  ref.attr = bgp_attr_intern (attr);
+  baa = (struct bgp_advertise_attr *) hash_get (hash, &ref, baa_hash_alloc);
+  baa->refcnt++;
+
+  return baa;
+}
+
+static void
+bgp_advertise_unintern (struct hash *hash, struct bgp_advertise_attr *baa)
+{
+  if (baa->refcnt)
+    baa->refcnt--;
+
+  if (baa->refcnt && baa->attr)
+    bgp_attr_unintern (&baa->attr);
+  else
+    {
+      if (baa->attr)
+       {
+         hash_release (hash, baa);
+         bgp_attr_unintern (&baa->attr);
+       }
+      baa_free (baa);
+    }
+}
+
+/* BGP adjacency keeps minimal advertisement information.  */
+static void
+bgp_adj_out_free (struct bgp_adj_out *adj)
+{
+  peer_unlock (adj->peer); /* adj_out peer reference */
+  XFREE (MTYPE_BGP_ADJ_OUT, adj);
+}
+
+int
+bgp_adj_out_lookup (struct peer *peer, struct prefix *p,
+                   afi_t afi, safi_t safi, struct bgp_node *rn)
+{
+  struct bgp_adj_out *adj;
+
+  for (adj = rn->adj_out; adj; adj = adj->next)
+    if (adj->peer == peer)
+      break;
+
+  if (! adj)
+    return 0;
+
+  return (adj->adv 
+         ? (adj->adv->baa ? 1 : 0)
+         : (adj->attr ? 1 : 0));
+}
+
+struct bgp_advertise *
+bgp_advertise_clean (struct peer *peer, struct bgp_adj_out *adj,
+                    afi_t afi, safi_t safi)
+{
+  struct bgp_advertise *adv;
+  struct bgp_advertise_attr *baa;
+  struct bgp_advertise *next;
+  struct bgp_advertise_fifo *fhead;
+
+  adv = adj->adv;
+  baa = adv->baa;
+  next = NULL;
+  fhead = (struct bgp_advertise_fifo *)&peer->sync[afi][safi]->withdraw;
+
+  if (baa)
+    {
+      /* Unlink myself from advertise attribute FIFO.  */
+      bgp_advertise_delete (baa, adv);
+
+      /* Fetch next advertise candidate. */
+      next = baa->adv;
+
+      /* Unintern BGP advertise attribute.  */
+      bgp_advertise_unintern (peer->hash[afi][safi], baa);
+
+      fhead = (struct bgp_advertise_fifo *)&peer->sync[afi][safi]->update;
+    }
+
+  /* Unlink myself from advertisement FIFO.  */
+  BGP_ADV_FIFO_DEL (fhead, adv);
+
+  /* Free memory.  */
+  bgp_advertise_free (adj->adv);
+  adj->adv = NULL;
+
+  return next;
+}
+
+void
+bgp_adj_out_set (struct bgp_node *rn, struct peer *peer, struct prefix *p,
+                struct attr *attr, afi_t afi, safi_t safi,
+                struct bgp_info *binfo)
+{
+  struct bgp_adj_out *adj = NULL;
+  struct bgp_advertise *adv;
+
+  if (DISABLE_BGP_ANNOUNCE)
+    return;
+
+  /* Look for adjacency information. */
+  if (rn)
+    {
+      for (adj = rn->adj_out; adj; adj = adj->next)
+       if (adj->peer == peer)
+         break;
+    }
+
+  if (! adj)
+    {
+      adj = XCALLOC (MTYPE_BGP_ADJ_OUT, sizeof (struct bgp_adj_out));
+      adj->peer = peer_lock (peer); /* adj_out peer reference */
+      
+      if (rn)
+        {
+          BGP_ADJ_OUT_ADD (rn, adj);
+          bgp_lock_node (rn);
+        }
+    }
+
+  if (adj->adv)
+    bgp_advertise_clean (peer, adj, afi, safi);
+  
+  adj->adv = bgp_advertise_new ();
+
+  adv = adj->adv;
+  adv->rn = rn;
+  
+  assert (adv->binfo == NULL);
+  adv->binfo = bgp_info_lock (binfo); /* bgp_info adj_out reference */
+  
+  if (attr)
+    adv->baa = bgp_advertise_intern (peer->hash[afi][safi], attr);
+  else
+    adv->baa = baa_new ();
+  adv->adj = adj;
+
+  /* Add new advertisement to advertisement attribute list. */
+  bgp_advertise_add (adv->baa, adv);
+
+  BGP_ADV_FIFO_ADD (&peer->sync[afi][safi]->update, &adv->fifo);
+}
+
+void
+bgp_adj_out_unset (struct bgp_node *rn, struct peer *peer, struct prefix *p, 
+                  afi_t afi, safi_t safi)
+{
+  struct bgp_adj_out *adj;
+  struct bgp_advertise *adv;
+
+  if (DISABLE_BGP_ANNOUNCE)
+    return;
+
+  /* Lookup existing adjacency, if it is not there return immediately.  */
+  for (adj = rn->adj_out; adj; adj = adj->next)
+    if (adj->peer == peer)
+      break;
+
+  if (! adj)
+    return;
+
+  /* Clearn up previous advertisement.  */
+  if (adj->adv)
+    bgp_advertise_clean (peer, adj, afi, safi);
+
+  if (adj->attr)
+    {
+      /* We need advertisement structure.  */
+      adj->adv = bgp_advertise_new ();
+      adv = adj->adv;
+      adv->rn = rn;
+      adv->adj = adj;
+
+      /* Add to synchronization entry for withdraw announcement.  */
+      BGP_ADV_FIFO_ADD (&peer->sync[afi][safi]->withdraw, &adv->fifo);
+
+      /* Schedule packet write. */
+      BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
+    }
+  else
+    {
+      /* Remove myself from adjacency. */
+      BGP_ADJ_OUT_DEL (rn, adj);
+      
+      /* Free allocated information.  */
+      bgp_adj_out_free (adj);
+
+      bgp_unlock_node (rn);
+    }
+}
+
+void
+bgp_adj_out_remove (struct bgp_node *rn, struct bgp_adj_out *adj, 
+                   struct peer *peer, afi_t afi, safi_t safi)
+{
+  if (adj->attr)
+    bgp_attr_unintern (&adj->attr);
+
+  if (adj->adv)
+    bgp_advertise_clean (peer, adj, afi, safi);
+
+  BGP_ADJ_OUT_DEL (rn, adj);
+  bgp_adj_out_free (adj);
+}
+
+void
+bgp_adj_in_set (struct bgp_node *rn, struct peer *peer, struct attr *attr)
+{
+  struct bgp_adj_in *adj;
+
+  for (adj = rn->adj_in; adj; adj = adj->next)
+    {
+      if (adj->peer == peer)
+       {
+         if (adj->attr != attr)
+           {
+             bgp_attr_unintern (&adj->attr);
+             adj->attr = bgp_attr_intern (attr);
+           }
+         return;
+       }
+    }
+  adj = XCALLOC (MTYPE_BGP_ADJ_IN, sizeof (struct bgp_adj_in));
+  adj->peer = peer_lock (peer); /* adj_in peer reference */
+  adj->attr = bgp_attr_intern (attr);
+  BGP_ADJ_IN_ADD (rn, adj);
+  bgp_lock_node (rn);
+}
+
+void
+bgp_adj_in_remove (struct bgp_node *rn, struct bgp_adj_in *bai)
+{
+  bgp_attr_unintern (&bai->attr);
+  BGP_ADJ_IN_DEL (rn, bai);
+  peer_unlock (bai->peer); /* adj_in peer reference */
+  XFREE (MTYPE_BGP_ADJ_IN, bai);
+}
+
+int
+bgp_adj_in_unset (struct bgp_node *rn, struct peer *peer)
+{
+  struct bgp_adj_in *adj;
+
+  for (adj = rn->adj_in; adj; adj = adj->next)
+    if (adj->peer == peer)
+      break;
+
+  if (! adj)
+    return 0;
+
+  bgp_adj_in_remove (rn, adj);
+  bgp_unlock_node (rn);
+  return 1;
+}
+
+void
+bgp_sync_init (struct peer *peer)
+{
+  afi_t afi;
+  safi_t safi;
+  struct bgp_synchronize *sync;
+
+  for (afi = AFI_IP; afi < AFI_MAX; afi++)
+    for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
+      {
+       sync = XCALLOC (MTYPE_BGP_SYNCHRONISE, 
+                       sizeof (struct bgp_synchronize));
+       BGP_ADV_FIFO_INIT (&sync->update);
+       BGP_ADV_FIFO_INIT (&sync->withdraw);
+       BGP_ADV_FIFO_INIT (&sync->withdraw_low);
+       peer->sync[afi][safi] = sync;
+       peer->hash[afi][safi] = hash_create (baa_hash_key, baa_hash_cmp);
+      }
+}
+
+void
+bgp_sync_delete (struct peer *peer)
+{
+  afi_t afi;
+  safi_t safi;
+
+  for (afi = AFI_IP; afi < AFI_MAX; afi++)
+    for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
+      {
+       if (peer->sync[afi][safi])
+         XFREE (MTYPE_BGP_SYNCHRONISE, peer->sync[afi][safi]);
+       peer->sync[afi][safi] = NULL;
+       
+       if (peer->hash[afi][safi])
+         hash_free (peer->hash[afi][safi]);
+       peer->hash[afi][safi] = NULL;
+      }
+}
diff --git a/bgpd/bgp_advertise.h b/bgpd/bgp_advertise.h
new file mode 100644 (file)
index 0000000..e2857a3
--- /dev/null
@@ -0,0 +1,173 @@
+/* BGP advertisement and adjacency
+   Copyright (C) 1996, 97, 98, 99, 2000 Kunihiro Ishiguro
+
+This file is part of GNU Zebra.
+
+GNU Zebra is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version.
+
+GNU Zebra is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Zebra; see the file COPYING.  If not, write to the Free
+Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA.  */
+
+#ifndef _QUAGGA_BGP_ADVERTISE_H
+#define _QUAGGA_BGP_ADVERTISE_H
+
+#include <lib/fifo.h>
+
+/* BGP advertise FIFO.  */
+struct bgp_advertise_fifo
+{
+  struct bgp_advertise *next;
+  struct bgp_advertise *prev;
+  u_int32_t count;
+};
+
+/* BGP advertise attribute.  */
+struct bgp_advertise_attr
+{
+  /* Head of advertisement pointer. */
+  struct bgp_advertise *adv;
+
+  /* Reference counter.  */
+  unsigned long refcnt;
+
+  /* Attribute pointer to be announced.  */
+  struct attr *attr;
+};
+
+struct bgp_advertise
+{
+  /* FIFO for advertisement.  */
+  struct fifo fifo;
+
+  /* Link list for same attribute advertise.  */
+  struct bgp_advertise *next;
+  struct bgp_advertise *prev;
+
+  /* Prefix information.  */
+  struct bgp_node *rn;
+
+  /* Reference pointer.  */
+  struct bgp_adj_out *adj;
+
+  /* Advertisement attribute.  */
+  struct bgp_advertise_attr *baa;
+
+  /* BGP info.  */
+  struct bgp_info *binfo;
+};
+
+/* BGP adjacency out.  */
+struct bgp_adj_out
+{
+  /* Lined list pointer.  */
+  struct bgp_adj_out *next;
+  struct bgp_adj_out *prev;
+
+  /* Advertised peer.  */
+  struct peer *peer;
+
+  /* Advertised attribute.  */
+  struct attr *attr;
+
+  /* Advertisement information.  */
+  struct bgp_advertise *adv;
+};
+
+/* BGP adjacency in. */
+struct bgp_adj_in
+{
+  /* Linked list pointer.  */
+  struct bgp_adj_in *next;
+  struct bgp_adj_in *prev;
+
+  /* Received peer.  */
+  struct peer *peer;
+
+  /* Received attribute.  */
+  struct attr *attr;
+};
+
+/* BGP advertisement list.  */
+struct bgp_synchronize
+{
+  struct fifo update;
+  struct fifo withdraw;
+  struct fifo withdraw_low;
+};
+
+#define BGP_ADV_FIFO_HEAD(F) ((struct bgp_advertise *)FIFO_HEAD(F))
+
+/* BGP adjacency linked list.  */
+#define BGP_INFO_ADD(N,A,TYPE)                        \
+  do {                                                \
+    (A)->prev = NULL;                                 \
+    (A)->next = (N)->TYPE;                            \
+    if ((N)->TYPE)                                    \
+      (N)->TYPE->prev = (A);                          \
+    (N)->TYPE = (A);                                  \
+  } while (0)
+
+#define BGP_INFO_DEL(N,A,TYPE)                        \
+  do {                                                \
+    if ((A)->next)                                    \
+      (A)->next->prev = (A)->prev;                    \
+    if ((A)->prev)                                    \
+      (A)->prev->next = (A)->next;                    \
+    else                                              \
+      (N)->TYPE = (A)->next;                          \
+  } while (0)
+
+#define BGP_ADJ_IN_ADD(N,A)    BGP_INFO_ADD(N,A,adj_in)
+#define BGP_ADJ_IN_DEL(N,A)    BGP_INFO_DEL(N,A,adj_in)
+#define BGP_ADJ_OUT_ADD(N,A)   BGP_INFO_ADD(N,A,adj_out)
+#define BGP_ADJ_OUT_DEL(N,A)   BGP_INFO_DEL(N,A,adj_out)
+
+#define BGP_ADV_FIFO_ADD(F, N)                 \
+  do {                                         \
+    FIFO_ADD((F), (N));                                \
+    (F)->count++;                               \
+  } while (0)
+
+#define BGP_ADV_FIFO_DEL(F, N)                 \
+  do {                                         \
+    FIFO_DEL((N));                             \
+    (F)->count--;                              \
+  } while (0)
+
+#define BGP_ADV_FIFO_INIT(F)                   \
+  do {                                         \
+    FIFO_INIT((F));                            \
+    (F)->count = 0;                            \
+  } while (0)
+
+/* Prototypes.  */
+extern void bgp_adj_out_set (struct bgp_node *, struct peer *, struct prefix *,
+                     struct attr *, afi_t, safi_t, struct bgp_info *);
+extern void bgp_adj_out_unset (struct bgp_node *, struct peer *, struct prefix *,
+                       afi_t, safi_t);
+extern void bgp_adj_out_remove (struct bgp_node *, struct bgp_adj_out *, 
+                        struct peer *, afi_t, safi_t);
+extern int bgp_adj_out_lookup (struct peer *, struct prefix *, afi_t, safi_t,
+                       struct bgp_node *);
+
+extern void bgp_adj_in_set (struct bgp_node *, struct peer *, struct attr *);
+extern int bgp_adj_in_unset (struct bgp_node *, struct peer *);
+extern void bgp_adj_in_remove (struct bgp_node *, struct bgp_adj_in *);
+
+extern struct bgp_advertise *
+bgp_advertise_clean (struct peer *, struct bgp_adj_out *, afi_t, safi_t);
+
+extern void bgp_sync_init (struct peer *);
+extern void bgp_sync_delete (struct peer *);
+
+#endif /* _QUAGGA_BGP_ADVERTISE_H */
diff --git a/bgpd/bgp_aspath.c b/bgpd/bgp_aspath.c
new file mode 100644 (file)
index 0000000..d813bfb
--- /dev/null
@@ -0,0 +1,2076 @@
+/* AS path management routines.
+   Copyright (C) 1996, 97, 98, 99 Kunihiro Ishiguro
+   Copyright (C) 2005 Sun Microsystems, Inc.
+
+This file is part of GNU Zebra.
+
+GNU Zebra is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version.
+
+GNU Zebra is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Zebra; see the file COPYING.  If not, write to the Free
+Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA.  */
+
+#include <zebra.h>
+
+#include "hash.h"
+#include "memory.h"
+#include "vector.h"
+#include "vty.h"
+#include "str.h"
+#include "log.h"
+#include "stream.h"
+#include "jhash.h"
+#include "filter.h"
+
+#include "bgpd/bgpd.h"
+#include "bgpd/bgp_aspath.h"
+#include "bgpd/bgp_debug.h"
+#include "bgpd/bgp_attr.h"
+
+/* Attr. Flags and Attr. Type Code. */
+#define AS_HEADER_SIZE        2         
+
+/* Now FOUR octets are used for AS value. */
+#define AS_VALUE_SIZE         sizeof (as_t)
+/* This is the old one */
+#define AS16_VALUE_SIZE              sizeof (as16_t)
+
+/* Maximum protocol segment length value */
+#define AS_SEGMENT_MAX         255
+
+/* The following length and size macros relate specifically to Quagga's
+ * internal representation of AS-Segments, not per se to the on-wire
+ * sizes and lengths.  At present (200508) they sort of match, however
+ * the ONLY functions which should now about the on-wire syntax are
+ * aspath_put, assegment_put and assegment_parse.
+ *
+ * aspath_put returns bytes written, the only definitive record of
+ * size of wire-format attribute..
+ */
+
+/* Calculated size in bytes of ASN segment data to hold N ASN's */
+#define ASSEGMENT_DATA_SIZE(N,S) \
+       ((N) * ( (S) ? AS_VALUE_SIZE : AS16_VALUE_SIZE) )
+
+/* Calculated size of segment struct to hold N ASN's */
+#define ASSEGMENT_SIZE(N,S)  (AS_HEADER_SIZE + ASSEGMENT_DATA_SIZE (N,S))
+
+/* AS segment octet length. */
+#define ASSEGMENT_LEN(X,S) ASSEGMENT_SIZE((X)->length,S)
+
+/* AS_SEQUENCE segments can be packed together */
+/* Can the types of X and Y be considered for packing? */
+#define ASSEGMENT_TYPES_PACKABLE(X,Y) \
+  ( ((X)->type == (Y)->type) \
+   && ((X)->type == AS_SEQUENCE))
+/* Types and length of X,Y suitable for packing? */
+#define ASSEGMENTS_PACKABLE(X,Y) \
+  ( ASSEGMENT_TYPES_PACKABLE( (X), (Y)) \
+   && ( ((X)->length + (Y)->length) <= AS_SEGMENT_MAX ) )
+
+/* As segment header - the on-wire representation 
+ * NOT the internal representation!
+ */
+struct assegment_header
+{
+  u_char type;
+  u_char length;
+};
+
+/* Hash for aspath.  This is the top level structure of AS path. */
+static struct hash *ashash;
+
+/* Stream for SNMP. See aspath_snmp_pathseg */
+static struct stream