)]}'
{
  "log": [
    {
      "commit": "4584c239201037648abf1a6615186f9cdeb86b23",
      "tree": "1af059ebcc0b9229aa78c9e775120ae8ae4a8c2f",
      "parents": [
        "e30677a5537f67e37938954cf7347e9a9c0b922d"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Mon Apr 13 09:50:00 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 05 15:05:34 2015 +0200"
      },
      "message": "bgpd: speed up \"no-hit\" withdraws for routeservers\n\nThis accelerates handling of incoming Withdraw messages for routes that\ndon\u0027t exist in the table to begin with.  Cisco IOS 12.4(24)T4 has a bug\nin this regard - it sends withdraws instead of doing nothing for\nprefixes that are filtered.\n\nPulling up the adj_in removal in Quagga should have no ill effect, but\nwe can avoid the costly iteration over all rsclients if there was no\nadj_in entry.\n\nPerformance impact of this change on routeserver with 3 buggy peers,\nstartup/sync time:\n\nbefore patch:  143.12 seconds (user cpu)\nafter patch:     7.01 seconds (user cpu)\n\nMany thanks to Nick Hilliard \u0026 INEX for providing real-world test data!\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\nAcked-by: Paul Jakma \u003cpaul@jakma.org\u003e\n"
    },
    {
      "commit": "dc684eb9976f8a1170312be42d142effce26b568",
      "tree": "1d1354118bc0b063e7048c86154339aa2f141d1c",
      "parents": [
        "06bd420d4646333bc7ed9964e348f19a942fcfe2",
        "e691c3bb972c0baf610d9e210ce20ea6546e1de0"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu Apr 23 13:31:17 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu Apr 23 13:36:08 2015 +0200"
      },
      "message": "Merge branch \u0027volatile/fix_warnings\u0027\n\nThanks to Donald Sharp and Greg Troxel for providing feedback!\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "94bad67cd8fe7ad023a40547a1153a414d70fa0a",
      "tree": "548a50421210ac372b2183f372cda2ff5e6928bc",
      "parents": [
        "d43f8b39b075fe60e0c8fdb33b07b284d3fae503"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Mar 03 08:52:22 2015 +0100"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Apr 21 10:18:02 2015 +0200"
      },
      "message": "bgpd: don\u0027t use #ifdef inside macro args\n\nUsing #ifdef inside preprocessor macro argument lists is not guaranteed\nto work.  In reality it mostly does, but we don\u0027t need these ifdefs for\nHAVE_IPV6 anymore, so let\u0027s get rid of the warning nonetheless.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "d43f8b39b075fe60e0c8fdb33b07b284d3fae503",
      "tree": "8c98dce915aaaabd0707a12c2c08199d0bfdec2e",
      "parents": [
        "b1672ce858cc9c16fd7cc67b673aa241d9583a59"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Mar 03 08:54:54 2015 +0100"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Apr 21 10:18:01 2015 +0200"
      },
      "message": "bgpd, zebra: fix struct/pointer sizeof mixups\n\nTwo places were taking sizeof(pointer) instead of the sizeof(struct),\nwhile performing operations on the struct.  Both are initialisation\nfunctions;  I guess we haven\u0027t seen fallout since they weren\u0027t critical.\nFix anyway.\n\n[v2: fix mistake that actually broke bgpd RS workqueue init]\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "aa7dbb1067b7d02e1354fe1e5664ccb7d259d649",
      "tree": "43cc4818319a53e49a26f330952b37b417d44af9",
      "parents": [
        "941789e470199df4f612368f669ecc0fd096fb9a"
      ],
      "author": {
        "name": "Balaji",
        "email": "balajig81@gmail.com",
        "time": "Mon Mar 16 16:55:26 2015 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Apr 14 12:04:29 2015 +0200"
      },
      "message": "bgpd: Configured suppress value cannot be less than the reuse value in bgp dampening\n\nRFC 2439, Section 4.2; the values pair up for hysteresis.\n\nSigned-off-by: Balaji.G \u003cbalajig81@gmail.com\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "7aa9dcef80b2ce50ecaa77653d87c8b84e009c49",
      "tree": "bd4a8d881336a1551146725d7ae06b3e68553e4d",
      "parents": [
        "010ebbbca6396f272cc2d50d147dd922dda68213"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@opensourcerouting.org",
        "time": "Fri Sep 19 14:42:23 2014 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue Sep 23 16:32:34 2014 +0100"
      },
      "message": "Fix most compiler warnings in default GCC build.\n\nFix lots of warnings. Some const and type-pun breaks strict-aliasing\nwarnings left but much reduced.\n\n* bgp_advertise.h: (struct bgp_advertise_fifo) is functionally identical to\n  (struct fifo), so just use that.  Makes it clearer the beginning of\n  (struct bgp_advertise) is compatible with with (struct fifo), which seems\n  to be enough for gcc.\n  Add a BGP_ADV_FIFO_HEAD macro to contain the right cast to try shut up\n  type-punning breaks strict aliasing warnings.\n* bgp_packet.c: Use BGP_ADV_FIFO_HEAD.\n  (bgp_route_refresh_receive) fix an interesting logic error in\n  (!ok || (ret !\u003d BLAH)) where ret is only well-defined if ok.\n* bgp_vty.c: Peer commands should use bgp_vty_return to set their return.\n* jhash.{c,h}: Can take const on * args without adding issues \u0026 fix warnings.\n* libospf.h: LSA sequence numbers use the unsigned range of values, and\n  constants need to be set to unsigned, or it causes warnings in ospf6d.\n* md5.h: signedness of caddr_t is implementation specific, change to an\n  explicit (uint_8 *), fix sign/unsigned comparison warnings.\n* vty.c: (vty_log_fixed) const on level is well-intentioned, but not going\n  to fly given iov_base.\n* workqueue.c: ALL_LIST_ELEMENTS_RO tests for null pointer, which is always\n  true for address of static variable.  Correct but pointless warning in\n  this case, but use a 2nd pointer to shut it up.\n* ospf6_route.h: Add a comment about the use of (struct prefix) to stuff 2\n  different 32 bit IDs into in (struct ospf6_route), and the resulting\n  type-pun strict-alias breakage warnings this causes.  Need to use 2\n  different fields to fix that warning?\n\ngeneral:\n\n* remove unused variables, other than a few cases where they serve a\n  sufficiently useful documentary purpose (e.g.  for code that needs\n  fixing), or they\u0027re required dummies.  In those cases, try mark them as\n  unused.\n* Remove dead code that can\u0027t be reached.\n* Quite a few \u0027no ...\u0027 forms of vty commands take arguments, but do not\n  check the argument matches the command being negated.  E.g., should\n  \u0027distance X \u003cprefix\u003e\u0027 succeed if previously \u0027distance Y \u003cprefix\u003e\u0027 was set?\n  Or should it be required that the distance match the previously configured\n  distance for the prefix?\n  Ultimately, probably better to be strict about this.  However, changing\n  from slack to strict might expose problems in command aliases and tools.\n* Fix uninitialised use of variables.\n* Fix sign/unsigned comparison warnings by making signedness of types consistent.\n* Mark functions as static where their use is restricted to the same compilation\n  unit.\n* Add required headers\n* Move constants defined in headers into code.\n* remove dead, unused functions that have no debug purpose.\n"
    },
    {
      "commit": "052573ee2319b21657a79e1b76a5c801701fa38c",
      "tree": "32a731414c3b0a70516461befd9c22baf77b0587",
      "parents": [
        "0ff692ed59696c534e6bfd0f9d6e83706fbbec4a",
        "f57000c0dbdd0e30e71b6651022392f284201e19"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Sun Jun 29 12:52:52 2014 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Sun Jun 29 12:52:52 2014 +0200"
      },
      "message": "*: merge branch stable/0.99.23\n\nbgp extcommunity fixes from stable branch\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "c460e5720c1101a6da53e5b753b736ac2c7981af",
      "tree": "a60baf501e16e92a472e50bc2383bfd937ba0bfd",
      "parents": [
        "a4b5665f76d9e907a547c85c9c4a7a656c568b9d"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed Jun 04 00:54:58 2014 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Sun Jun 29 12:47:21 2014 +0200"
      },
      "message": "bgpd: fix some bgp_update_main() attribute leaks\n\nbgp_update_main() wasn\u0027t doing anything to release attribute values\nset from route maps for two of its error paths.  To fix, pull up the\nappropriate cleanup from further down and apply it here.\n\nbgp_update_rsclient() doesn\u0027t have the issue since it immediately\ndoes bgp_attr_intern() on the results from bgp_{export,import}_modifier.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "9e7a53c179f6897128b24435452b5d3d0f8c715a",
      "tree": "80a5cc6e9e6dc411587764d865a2bf5f489000ba",
      "parents": [
        "2aa640bd78b64821bde9a53ecdd1e96e91b20ae4"
      ],
      "author": {
        "name": "Timo Teräs",
        "email": "timo.teras@iki.fi",
        "time": "Thu Apr 24 10:22:37 2014 +0300"
      },
      "committer": {
        "name": "Timo Teräs",
        "email": "timo.teras@iki.fi",
        "time": "Wed Jun 25 21:20:20 2014 +0300"
      },
      "message": "bgpd: implement \"next-hop-self all\"\n\nAs specified in:\nhttp://www.cisco.com/c/en/us/td/docs/ios-xml/ios/iproute_bgp/command/irg-cr-book/bgp-m1.html#wp4972925610\n\nThis allows overriding next-hop for ibgp learned routes on an\nRR for reflected routes.\n\nEspecially useful for using iBGP in DMVPN setups. See:\nhttp://blog.ipspace.net/2014/04/changes-in-ibgp-next-hop-processing.html\n\nSigned-off-by: Timo Teräs \u003ctimo.teras@iki.fi\u003e\n"
    },
    {
      "commit": "6b0655a25194c7c0331154edaa6124cf783e5e5e",
      "tree": "c0c7d479f2684531249668210da27a60322ba395",
      "parents": [
        "fdb913aedb5a9807ad60715e8badb4f25d57acea"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed Jun 04 06:53:35 2014 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed Jun 04 06:58:02 2014 +0200"
      },
      "message": "*: nuke ^L (page feed)\n\nQuagga sources have inherited a slew of Page Feed (^L, \\xC) characters\nfrom ancient history.  Among other things, these break patchwork\u0027s\nXML-RPC API because \\xC is not a valid character in XML documents.\n\nNuke them from high orbit.\n\nPatches can be adapted simply by:\n\tsed -e \u0027s%^L%%\u0027 -i filename.patch\n(you can type page feeds in some environments with Ctrl-V Ctrl-L)\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "2c13299a05e5544a5e79c2a970256a21f488a3fa",
      "tree": "1d277afb9b346388e1aa244484c3af41dcd6a72e",
      "parents": [
        "66d2ead7df2db9144605c973fcd80b88df33f81b"
      ],
      "author": {
        "name": "Pradosh Mohapatra",
        "email": "pmohapat@cumulusnetworks.com",
        "time": "Sat Sep 07 07:07:20 2013 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Jun 03 15:08:08 2014 +0200"
      },
      "message": "bgpd: don\u0027t compare next-hop to router-id\n\nWhile announcing a path to a peer, the code currently compares the path\u0027s\nnext-hop with the peer\u0027s router-id. This can lead to problems as the router\nIDs are unique only within an AS. Suppose AS 1 sends route with next-hop\n10.1.1.1. It is possible that the speaker has an established BGP peering\nwith a router in AS 2 with router ID 10.1.1.1. The route will not be\nadvertised to that peer in AS 2.\n\nThe patch removes this check.\n\nSigned-off-by: Pradosh Mohapatra \u003cpmohapat@cumulusnetworks.com\u003e\nReviewed-by: Dinesh G Dutt \u003cddutt@cumulusnetworks.com\u003e\nReviewed-by: Shrijeet Mukherjee \u003cshm@cumulusnetworks.com\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "000e157c852653288c5a1e6d0dee821c1765d315",
      "tree": "28a654105d50b5f55c9e865a223ba93366fe3839",
      "parents": [
        "5d804b439a4138c77f81de30c64f923e2b5c1340"
      ],
      "author": {
        "name": "Milan Kocian",
        "email": "milon@wq.cz",
        "time": "Fri Oct 18 07:59:38 2013 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Mon May 19 23:51:19 2014 +0200"
      },
      "message": "bgpd: Fix condition allowas-in in rsclient code\n\nCurrently when you set neighbour\u0027s \u0027allowas-in\u0027 option on route server side\nyou get redistribution of the prefixes from this neighbour\u0027s table into all\nneighbour\u0027s tables which have the same AS number. I think that wanted behaviour\nis to allow import prefixes from neighbour\u0027s tables with the same AS num\ninto neighbour which has \u0027allowas-in\u0027 option set.\n\nSigned-off-by: Milan Kocian \u003cmilon@wq.cz\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "b366b518401e0b0652cd70d297d3fb67b4803db0",
      "tree": "5f05079e281f0ec503ee408b1f7502cc49cad82e",
      "parents": [
        "689bb66c6a92d238bed1a8b0920438c5a2271966"
      ],
      "author": {
        "name": "Boian Bonev",
        "email": "bbonev@ipacct.com",
        "time": "Mon Sep 09 16:41:35 2013 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu May 15 19:23:36 2014 +0200"
      },
      "message": "bgpd: display multipath status in \"show ip bgp\"\n\nThe output of \"show ip bg\" does not show whether and which routes are\ninstalled as multipath routes along the best route:\n\nBGP table version is 0, local router ID is 10.10.100.209\nStatus codes: s suppressed, d damped, h history, * valid, \u003e best, i - internal,\n              r RIB-failure, S Stale, R Removed\nOrigin codes: i - IGP, e - EGP, ? - incomplete\n\n   Network          Next Hop            Metric LocPrf Weight Path\n*\u003ei1.0.0.0/24       10.10.100.1              1    111      0 15169 i\n* i                 10.10.100.2              1    111      0 15169 i\n* i                 10.10.100.3              1    111      0 65100 15169 i\n\nThis patch adds a new status code that is showing exactly which routes\nare used as multipath:\n\nBGP table version is 0, local router ID is 10.10.100.209\nStatus codes: s suppressed, d damped, h history, * valid, \u003e best, \u003d multipath,\n              i internal, r RIB-failure, S Stale, R Removed\nOrigin codes: i - IGP, e - EGP, ? - incomplete\n\n   Network          Next Hop            Metric LocPrf Weight Path\n*\u003ei1.0.0.0/24       10.10.100.1              1    111      0 15169 i\n*\u003di                 10.10.100.2              1    111      0 15169 i\n* i                 10.10.100.3              1    111      0 65100 15169 i\n\nThe inconsistency in the status code legend (\"i - internal\" vs. \"i internal\")\ninherent from old IOS was fixed. It had to be touched anyways.\n\nSigned-off-by: Boian Bonev \u003cbbonev at ipacct.com\u003e\n[DL: rewrap long line, clean whitespace in same chunk]\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "689bb66c6a92d238bed1a8b0920438c5a2271966",
      "tree": "4cf3ee1be6acdb4cf3b85d3da83e09cb64d29ba9",
      "parents": [
        "2fdd455cfd1f758b7aa2e6c8e3d185098b93908c"
      ],
      "author": {
        "name": "Pradosh Mohapatra",
        "email": "pmohapat@cumulusnetworks.com",
        "time": "Sat Sep 07 07:13:37 2013 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu May 15 19:15:45 2014 +0200"
      },
      "message": "bgpd: track correct originator-id in reflected routes\n\nISSUE:\n\nSuppose route1 and route2 received from route-reflector-client1 and client2\nrespectively have identical attributes. The current logic of creating the\nadj-rib-out for a peer threads the \u0027adv\u0027 structures for both routes against\nthe same attribute. This results in \u0027bgp_update_packet()\u0027 to pack those\nroutes in the same UPDATE message with one attr structure formatted. The\noriginator-id is thus set according to the first route\u0027s received router id.\nThis is incorrect.\n\nPATCH:\n\nFix bgp_announce_check() function to set the originator-id in the\nadvertising attr structure. Also, fix the attribute hash function and\ncompare function to consider originator-id. Otherwise attributes where all\nfields except the originator-id are identical get merged into one memory\nlocation.\n\nSigned-off-by: Pradosh Mohapatra \u003cpmohapat at cumulusnetworks.com\u003e\nReviewed-by: Scott Feldman \u003csfeldma at cumulusnetworks.com\u003e\nReviewed-by: Ken Yin \u003ckyin at cumulusnetworks.com\u003e\n[DL: whitespace changes dropped]\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "2fdd455cfd1f758b7aa2e6c8e3d185098b93908c",
      "tree": "3b2d28c7b389228cc6c1e3809660c4f7f22c3f18",
      "parents": [
        "d92a2f39b46f1990052d2db046b47edf7bb21ebb"
      ],
      "author": {
        "name": "Pradosh Mohapatra",
        "email": "pmohapat@cumulusnetworks.com",
        "time": "Sat Sep 07 07:02:36 2013 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu May 15 19:15:22 2014 +0200"
      },
      "message": "bgpd: add \u0027bgp bestpath as-path multipath-relax\u0027\n\nCompute multipath in BGP based on AS_PATH hop count match. If the knob\nis turned on, it is not required to have an exact match of AS_PATHs\n(provided other multipath conditions are met, of course).\n\nSigned-off-by: Pradosh Mohapatra \u003cpmohapat at cumulusnetworks.com\u003e\nReviewed-by: Dinesh G Dutt \u003cddutt at cumulusnetworks.com\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "2b00515a9b639fd1e057f3ebf10ded2dde920764",
      "tree": "1167cb145764208a132599e5d83980708501bac4",
      "parents": [
        "f7bf41534e885c7bc077529c591a1bce24a5f1e9"
      ],
      "author": {
        "name": "Christian Franke",
        "email": "chris@opensourcerouting.org",
        "time": "Mon Sep 30 12:27:49 2013 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Apr 01 17:32:49 2014 +0200"
      },
      "message": "bgpd, ospfd, zebra: fix some DEFUN definitions\n\nFixup some DEFUNS with incorrect command strings or mixed up helpstrings.\n\nSigned-off-by: Christian Franke \u003cchris@opensourcerouting.org\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "d53d8fda42e1ce43852d3b4cff914ce79b5c6785",
      "tree": "65fabd06d7388d593c1260c18558acd29c82b523",
      "parents": [
        "aeef13b0d5b50a90f293c93eb5a34c2a099d140b"
      ],
      "author": {
        "name": "Christian Franke",
        "email": "chris@opensourcerouting.org",
        "time": "Mon Jan 28 07:14:43 2013 +0100"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Fri Feb 01 17:55:04 2013 +0100"
      },
      "message": "bgpd: fix crash in soft-reconfiguration\n\nCommit 8692c50652 introduced a bug where bgpd would crash on\nsoft-reconfiguration.\n\nThis happens e.g. when there are filtered unicast routes because\nrn-\u003einfo is NULL in that case, which the code did not account for.\n\nReported-by: Paweł Staszewski \u003cpstaszewski@itcare.pl\u003e\nSigned-off-by: Christian Franke \u003cchris@opensourcerouting.org\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "dcab1bb822161d55795aad59b14c5c5d79b71e1f",
      "tree": "0e55397d41d91f613123c6c812bc8691caa02b27",
      "parents": [
        "86998bc2bc9506841250c8d49dd2df2464660a18"
      ],
      "author": {
        "name": "Christian Franke",
        "email": "chris@opensourcerouting.org",
        "time": "Fri Dec 07 16:45:52 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed Jan 16 01:45:57 2013 +0100"
      },
      "message": "bgpd: conditional default-originate using route-map\n\nIncorporate a patch by Svetozar Mihailov which implements\ndefault-originate route-maps to behave as expected, i.e. allowing\nthe default route to be advertised conditionally, depending on a\ncriterion given by the route-map.\n\nI am aware that the performance attributes of the following implementation\nare far from optimal. However, this affects only code paths belonging to\na feature that is broken without this patch, therefore, it seems reasonable\nto me to have this in the mainline for now.\n\nCc: Svetozar Mihailov \u003cquagga@j.zarhi.com\u003e\nReported-by: Sébastien Cramatte \u003cscramatte@gmail.com\u003e\nSigned-off-by: Christian Franke \u003cchris@opensourcerouting.org\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "07ff4dc4d29f6f8db77e0e73da5d59e864ae2e66",
      "tree": "b631ce8f75ae8e932eac212d454dd8c27fe6b4d7",
      "parents": [
        "1e0ce7caa622f07c20bb74414a4a5b4cbd732c75"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "shemminger@vyatta.com",
        "time": "Fri Jan 04 22:29:20 2013 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Jan 15 17:49:41 2013 +0100"
      },
      "message": "bgpd: mark route nodes scheduled into work queue\n\nThe flag bit BGP_NODE_PROCESS_SCHEDULED is checked but never set.\nThis causes route node to be scheduled multiple times under load.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "24e50f2013e64a73b1f7ecdbd5688360002d09f7",
      "tree": "3c53b418e2f91f703ee79fd4b224e157b25218b3",
      "parents": [
        "ebbb5fca5ca899a9a125aa2770d3fdf857186bac"
      ],
      "author": {
        "name": "Jorge Boncompte [DTI2]",
        "email": "jorge@dti2.net",
        "time": "Mon May 07 15:17:33 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Mon Jan 14 14:43:51 2013 +0100"
      },
      "message": "bgpd: avoid heap fragmentation in bgp_clear_route_table\n\nIn bgp_clear_route_table, moved cleanup code before the allocation\nof the work queue items. This returns the memory to the system\nallocator before allocating new and might therefore help avoiding\nheap fragmentation.\n\n* bgp_route.c: (bgp_clear_route_table) moved code blocks.\n\nSigned-off-by: Jorge Boncompte [DTI2] \u003cjorge@dti2.net\u003e\nReviewed-by: Leonid Rosenboim \u003cLeonid.Rosenboim@windriver.com\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "ebbb5fca5ca899a9a125aa2770d3fdf857186bac",
      "tree": "b2e5f525e5dc30a378dc4ace24f5feca70c33e71",
      "parents": [
        "a5c851c7ff41ef846e83d62394176ac1753ebf45"
      ],
      "author": {
        "name": "Jorge Boncompte [DTI2]",
        "email": "jorge@dti2.net",
        "time": "Mon May 07 15:17:33 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Mon Jan 14 14:42:38 2013 +0100"
      },
      "message": "bgpd: fix for leaked struct bgp_adj_[in|out] on peer shutdown\n\n    If a peer with soft-reconfiguration configured is cleared, the\nfunction bgp_clear_route_table() doesn\u0027t free the bgp_adj_in and bgp_adj_out\nstructures of route nodes that for some reason, ej. denied by a filter,\ndon\u0027t have routes attached \"rn-\u003einfo \u003d\u003d NULL\".\n\nSigned-off-by: Jorge Boncompte [DTI2] \u003cjorge@dti2.net\u003e\nReviewed-by: Leonid Rosenboim \u003cLeonid.Rosenboim@windriver.com\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "67174041d2d9d8908f8b2c915bc0d186d8442c68",
      "tree": "b57edeae37701055c3c21b79ce51fcbc5069e704",
      "parents": [
        "f9c1b7bb9b98342f1f3b0bfe3af01844f364dce9"
      ],
      "author": {
        "name": "Avneesh Sachdev",
        "email": "avneesh@opensourcerouting.org",
        "time": "Fri Aug 17 08:19:49 2012 -0700"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed Sep 26 21:50:48 2012 +0200"
      },
      "message": "bgpd: make bgp_table a wrapper around table library\n\nMake the BGP table code a thin wrapper around the table implementation\nin libzebra.\n\n  * bgpd/bgp_table.[ch]\n\n    - Use the ROUTE_NODE_FIELDS macro to embed the fields of a\n      route_node in the bgp_node structure.\n\n    - Add a route_table field to the bgp_table structure.\n\n      Initialize the route_table with a delegate, such that the nodes\n      in the table are bgp_node structures.\n\n    - Add inline wrappers that call route_table functions underneath,\n      and accept/return the correct BGP types.\n\n  * bgpd/bgp_route.c\n\n    Change some code to use inline wrappers instead of accessing\n    fields of nodes/tables directly. The latter does not always work\n    because the types of some fields need to be translated now.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "bb782fb50efcd972d4357f9a7164de2c317d2eef",
      "tree": "4f17b1f789945f6d47894be1ba93ca283be2f314",
      "parents": [
        "e2c38e6c9767e30d5683022653b1cf91b186f9d4"
      ],
      "author": {
        "name": "Jorge Boncompte [DTI2]",
        "email": "jorge@dti2.net",
        "time": "Wed Jun 20 16:34:01 2012 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu Jun 21 09:49:15 2012 +0200"
      },
      "message": "bgpd: Partially revert f018db8, fixes BZ#730\n\n  The change from bgp_node_get() to bgp_node_lookup() broke aggregation.\n\nSigned-off-by: Jorge Boncompte [DTI2] \u003cjorge@dti2.net\u003e\nTested-by: Martin Winter \u003cmwinter@opensourcerouting.org\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "f018db83a0746f9336d04e50dd06f3bbf6565f1c",
      "tree": "4c2ba0e661abd2651ee6fa1bd7be9157c8859411",
      "parents": [
        "343aa82219c0cab0315e29267eb303127215caea"
      ],
      "author": {
        "name": "Jorge Boncompte [DTI2]",
        "email": "jorge@dti2.net",
        "time": "Mon May 07 16:53:10 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 22 20:35:50 2012 +0200"
      },
      "message": "bgpd: optimize bgp_aggregate_[increment|decrement]()\n\n  If there were no aggregates configured this functions were allocating\nand freeing a struct bgp_node for every call, and it\u0027s called for every\nprefix received.\n\n* bgp_route.c: Bail out early if the there are no aggregates configured.\n  Change from bgp_node_get() to bgp_node_lookup() that does not allocate\n  a new struct bgp_node if not found.\n\nSigned-off-by: Jorge Boncompte [DTI2] \u003cjorge@dti2.net\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "343aa82219c0cab0315e29267eb303127215caea",
      "tree": "17e6b77072657a1a8ae04aeacb715652de1c4ddb",
      "parents": [
        "6a4677b723b6f79997ca15ee202c36d528d3dfcf"
      ],
      "author": {
        "name": "Jorge Boncompte [DTI2]",
        "email": "jorge@dti2.net",
        "time": "Mon May 07 16:53:08 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 22 20:35:50 2012 +0200"
      },
      "message": "bgpd: optimize bgp_update_main() in the soft_reconfig case\n\nAvoids 3 checks per call.\n\nSigned-off-by: Jorge Boncompte [DTI2] \u003cjorge@dti2.net\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "577ac57b78e0ee3cbc5afdb5f54a660bd0126136",
      "tree": "ec891bb869f46e7a4cd30c1163dfbc768587002b",
      "parents": [
        "558d1fec11749d3257e32561d45b5c1ec0622cf4"
      ],
      "author": {
        "name": "Jorge Boncompte [DTI2]",
        "email": "jorge@dti2.net",
        "time": "Mon May 07 16:53:06 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 22 20:25:50 2012 +0200"
      },
      "message": "bgpd: Remove useless initialization\n\nIt\u0027s initialized below\n\nSigned-off-by: Jorge Boncompte [DTI2] \u003cjorge@dti2.net\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "558d1fec11749d3257e32561d45b5c1ec0622cf4",
      "tree": "4570b1643db6446dc9f14f9c0bf7fd64a3325117",
      "parents": [
        "489d005a9ad94675f40dc7bceff6176cfad36d45"
      ],
      "author": {
        "name": "Jorge Boncompte [DTI2]",
        "email": "jorge@dti2.net",
        "time": "Mon May 07 16:53:05 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 22 20:25:50 2012 +0200"
      },
      "message": "bgpd: reduce struct attr_extra allocations/freeing\n\nTry to use on stack structs for temporary uses.\n\nSigned-off-by: Jorge Boncompte [DTI2] \u003cjorge@dti2.net\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "6182d65b23fc0362b173e2a9314fa4551523a1c2",
      "tree": "fb99eb9565f5ea8aa6a8b88eb9c4c05dc7cf364a",
      "parents": [
        "b9f1dca10f9a9bf853a9999a117c8cdeec5b7b69"
      ],
      "author": {
        "name": "Jorge Boncompte [DTI2]",
        "email": "jorge@dti2.net",
        "time": "Mon May 07 16:53:02 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 22 20:25:49 2012 +0200"
      },
      "message": "bgpd: fix struct attr_extra leak in bgp_default_originate()\n\n  The call to bgp_attr_default_set() above creates the attr_extra struct,\nbut the attr.extra \u003d NULL initialization was leaking it.\n\nSigned-off-by: Jorge Boncompte [DTI2] \u003cjorge@dti2.net\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "e16a413313cf985ae2b8d2f1a9e8fd0ab6f5b9fc",
      "tree": "e6810289e60312da431a8f992903275d952d0e6b",
      "parents": [
        "8ff56318a8bd188cfcc1cdab689c46c326b50d38"
      ],
      "author": {
        "name": "Jorge Boncompte [DTI2]",
        "email": "jorge@dti2.net",
        "time": "Mon May 07 16:52:57 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 22 20:25:49 2012 +0200"
      },
      "message": "bgpd: remove some useless initializations\n\n* bgp_attr.c: (bgp_attr_default_intern) bgp_attr_default_set() already\n  initializes the memory. Fixes a struct attr_extra leak.\n* bgp_route.c: Remove useless on stack struct initializations.\n\nSigned-off-by: Jorge Boncompte [DTI2] \u003cjorge@dti2.net\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "8ff56318a8bd188cfcc1cdab689c46c326b50d38",
      "tree": "6b7b718166aa6fe3b7264d3efba9c39750f5917b",
      "parents": [
        "c76275ee960c708408646d8a680b201b27cb9c1a"
      ],
      "author": {
        "name": "Jorge Boncompte [DTI2]",
        "email": "jorge@dti2.net",
        "time": "Mon May 07 16:52:56 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 22 20:25:49 2012 +0200"
      },
      "message": "bgpd: optimize bgp_info_cmp()\n\n* bgp_route.c: (bgp_info_cmp) Reduce indirections, precalculate some\n  values that are used several times, reduce conditionals.\n\nSigned-off-by: Jorge Boncompte [DTI2] \u003cjorge@dti2.net\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "6d85b15bbb2fd3c263d5d4b402c88ff348af877b",
      "tree": "c8be5e782f4425840ee93e167eb8d7c1ed3f4e4c",
      "parents": [
        "14542f3edaa43113880e8bb69612c553f02bdf22"
      ],
      "author": {
        "name": "Jorge Boncompte [DTI2]",
        "email": "jorge@dti2.net",
        "time": "Mon May 07 16:52:54 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 22 20:25:10 2012 +0200"
      },
      "message": "bgpd: remove calls to peer_sort() from fast-path\n\n  peer_sort() it\u0027s called so much as to be annoying. In the assumption\nthat the \u0027sort\u0027 of the peer doesn\u0027t change during an established session,\nI have changed all calls to peer_sort() in the \u0027fast-path\u0027 to only check\nthe \u0027sort\u0027. All the calls from the vty and such still recalculate the sort\nand store it in the peer.\n\n  There\u0027s a lot of other calls to peer_sort() that could be changed but some\nmaube tricky, someone more knowledgeable may try to reduce them.\n\n  This hits peer_sort() from 5th out of the stadium^H^H list on a full\ninternet table loading profiling session.\n\nSigned-off-by: Jorge Boncompte [DTI2] \u003cjorge@dti2.net\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "10f9bf3f2021f874e574e4ebae9413bee982ed2b",
      "tree": "5102a98c91d7d60380c07c08d0aaa32aa19cdbdf",
      "parents": [
        "f669f7d25f0f491d5e487897227ff434aef20406"
      ],
      "author": {
        "name": "Jorge Boncompte [DTI2]",
        "email": "jorge@dti2.net",
        "time": "Mon May 07 16:52:52 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 22 20:25:07 2012 +0200"
      },
      "message": "bgpd: optimize bgp_nexthop_self()\n\n  This function scores 2nd, profiling a full internet table load. It\u0027s called\nfor every prefix received.\n  Instead of looping in the interface lists comparing addresses use a hash\nto mantain them.\n\n* bgpd.c: Init the own address hash.\n* bgp_nexthop.c: Introduce methods to maintain an own address hash.\n  (bgp_connected_add) add addresses to the hash.\n  (bgp_connected_delete) delete addresses from the hash.\n  (bgp_nexthop_self) lookup addresses in the hash. Removed the unused afi_t\n  parameter.\n* bgp_route.c: (bgp_update_main) Micro-optimization, rearranged condition to\n  not lookup the hash for bogus nexthops (0.0.0.0 or a class D/E address)\n\nSigned-off-by: Jorge Boncompte [DTI2] \u003cjorge@dti2.net\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "8692c506520f6b268525b80890702432c95f13c4",
      "tree": "0446939f0c84705bc0da3f23b45e97fd21886269",
      "parents": [
        "1b79fcb646f66682a62cf34f3cc343b1a9706699"
      ],
      "author": {
        "name": "Jorge Boncompte [DTI2]",
        "email": "jorge@dti2.net",
        "time": "Mon May 07 15:17:34 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Mon May 21 15:48:30 2012 +0200"
      },
      "message": "bgpd: fix crash with vpnv4 soft-reconfiguration\n\nbgp_afi_node_get() expects a non-NULL prd for a SAFI_MPLS_VPN prefix.\n\n* bgp_route.c: pass down the struct prefix_rd from bgp_soft_reconfig_in()\n  and bgp_soft_reconfig_rsclient().\n\nSigned-off-by: Jorge Boncompte [DTI2] \u003cjorge@dti2.net\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "c63b83fe8d1addecc949258479b8d54180c4da60",
      "tree": "fbc58da3014db1cf74a2f8a91a33fe941968815d",
      "parents": [
        "d227617a972bb20a974be68bea5032e692a0970f"
      ],
      "author": {
        "name": "Jorge Boncompte [DTI2]",
        "email": "jorge@dti2.net",
        "time": "Tue Apr 10 16:57:24 2012 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@diac24.net",
        "time": "Wed May 02 17:03:27 2012 +0200"
      },
      "message": "bgpd: Fix memory leak of some \"show ip bgp neighbor\" commands\n\nsockunion_str2su() use is prone to memory leaks. Remove it\u0027s use all over\nthe code.\n\nAt least these commands leaked a sockunion union:\n    - show ip bgp vpnv4 ... routes\n    - show ip bgp ... received prefix-filter\n\nSigned-off-by: Jorge Boncompte [DTI2] \u003cjorge@dti2.net\u003e\nSigned-off-by: David Lamparter \u003cequinox@diac24.net\u003e\n"
    },
    {
      "commit": "ddc943dec3c017583f81cce388c7d453293156c7",
      "tree": "a36d2bca91b1f3a7545a135b3bafccc40d0ca47b",
      "parents": [
        "8794e8d229dc9fe29ea31424883433d4880ef408"
      ],
      "author": {
        "name": "Jorge Boncompte [DTI2]",
        "email": "jorge@dti2.net",
        "time": "Fri Apr 13 13:46:07 2012 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@diac24.net",
        "time": "Wed May 02 17:03:21 2012 +0200"
      },
      "message": "bgpd, zebra: Fix format for some metric outputs\n\nMetrics are unsigned values.\n\n  * bgpd/bgp_{debug,route,vty}.c,\n  * zebra/zebra_vty.c: replace %d with %u for metrics \u0026 distances\n\nSigned-off-by: Jorge Boncompte [DTI2] \u003cjorge@dti2.net\u003e\n[reworded commit message]\nSigned-off-by: David Lamparter \u003cequinox@diac24.net\u003e\n"
    },
    {
      "commit": "3cf6c2b4e43f44a977d218c96c26250654ae333e",
      "tree": "e017cde2015fbf3ef6c250327428d7c6152aa8f7",
      "parents": [
        "01d7ff0a2166a422c56bd26f04fc22832a9e690b",
        "e96b312150d8e376c1ef463793d1929eca3618d5"
      ],
      "author": {
        "name": "Avneesh Sachdev",
        "email": "avneesh@opensourcerouting.org",
        "time": "Mon Apr 09 00:25:15 2012 -0700"
      },
      "committer": {
        "name": "Avneesh Sachdev",
        "email": "avneesh@opensourcerouting.org",
        "time": "Mon Apr 09 00:25:15 2012 -0700"
      },
      "message": "Merge branch \u0027quagga\u0027 into google-bgp-multipath\n\nConflicts:\n\tbgpd/bgp_route.c\n"
    },
    {
      "commit": "73bfe0bd9adb8e4dfcee7239e56a425c6d58f4e9",
      "tree": "e2f5dd3fc170a28d9aff622a8c5af77f3ebf7e45",
      "parents": [
        "f768f367bcd1f37a53c563495176a5a134caf234"
      ],
      "author": {
        "name": "G.Balaji",
        "email": "balajig81@gmail.com",
        "time": "Fri Sep 23 22:36:20 2011 +0530"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Mon Jan 23 14:31:05 2012 +0400"
      },
      "message": "bgpd: Addition of ipv6 network command in Multicast address family mode.\n\n      The patch adds the ipv6 network command in the BGP multicast address\n      family mode.\n"
    },
    {
      "commit": "5a616c08ce089e25dc0e8da920727af4d11279bf",
      "tree": "4b5650d6602d06d0188102469e3b402abe81f16a",
      "parents": [
        "6ae93c058725991df5a9ae35cefec368919b5fea"
      ],
      "author": {
        "name": "G.Balaji",
        "email": "balajig81@gmail.com",
        "time": "Sat Nov 26 21:58:42 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Mon Jan 23 14:30:33 2012 +0400"
      },
      "message": "bgpd: IPv4 MP-BGP Routes addition and deletion\n\nThis patch contains the following:\n1. Addition of IPv4 SAFI_MULTICAST BGP routes into the BGP Multicast RIB.\n2. Deletion of IPv4 SAFI_MULTICAST BGP routes from the BGP Multicast RIB.\n"
    },
    {
      "commit": "8e80bdf20f493a71bcf74262ed3aa3a2437f4df6",
      "tree": "b1ebddbda4b8f12a28c3ce6299ebe931105a25b6",
      "parents": [
        "23be94ea00fadace0007b6ffa6c9107124249e91"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Fri Aug 05 18:52:52 2011 +0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sun Jan 08 11:30:55 2012 +0000"
      },
      "message": "bgpd: touch nexthop handling code\n\nbgp_nexthop_lookup_ipv6(): declare variables where they are actually\nused, drop no-op initialization (the field is already 0)\nbgp_nexthop_lookup(): ditto\nbgp_nexthop_check_ebgp(): rename to bgp_nexthop_onlink()\nbgp_nexthop_cache_changed(): rename to bgp_nexthop_cache_different()\n"
    },
    {
      "commit": "733cd9e5792648de50da3c00805aacb51cb27048",
      "tree": "606ec20aa51f16b7a49fd9f5ede27893bee9ace9",
      "parents": [
        "de5ccb96023181765c9904ab40e645c397f536d6"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Sat Dec 17 19:39:30 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Mon Jan 02 18:37:42 2012 +0400"
      },
      "message": "bgpd: justify checks for IPv4 class D/E\n\n* lib/prefix.h\n  * IPV4_CLASS_DE(): make consistent with counterpart macros\n* bgp_packet.c\n  * bgp_open_receive(): test using macro instead of \"\u003e\u003d\"\n* bgp_route.c\n  * bgp_update_rsclient(): idem\n  * bgp_update_main(): idem\n"
    },
    {
      "commit": "9206f9ecd5526778bf449bbb12f056d681d3b040",
      "tree": "cd11853fe47a30bb2a28838f6ad8f8d49300b4fa",
      "parents": [
        "b48cebbba0dc01ad7d1fbd7cbcc39a11e1ae972d"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "shemminger@vyatta.com",
        "time": "Sun Dec 18 19:43:40 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Sun Dec 18 20:21:21 2011 +0400"
      },
      "message": "fix set never used warnings\n\n(This patch was modified to leave calls to stream_getl() in place, they\nare necessary for the stream\u0027s internal pointer to advance to the\ncorrect position. -- Denis)\n\nSigned-off-by: Denis Ovsienko \u003cinfrastation@yandex.ru\u003e\n\nFix gcc warnings about varables that are set but never used.\n\n* bgpd/bgp_attr.c\n  * cluster_unintern(): ret\n  * transit_unintern(): ret\n  * bgp_attr_default_intern(): attre\n  * bgp_mp_reach_parse(): rd_high, rd_low\n* bgpd/bgp_route.c\n  * bgp_announce_check_rsclient(): bgp\n* bgpd/bgp_zebra.c\n  * zebra_read_ipv4(): ifindex\n  * zebra_read_ipv6(): ifindex\n* bgpd/bgpd.c\n  * bgp_config_write_peer(): filter\n* lib/distribute.c\n  * distribute_list_all(): dist\n  * distribute_list(): dist\n  * distribute_list_prefix_all(): dist\n  * distribute_list_prefix(): dist\n* lib/if_rmap.c\n  * if_rmap(): if_rmap\n* lib/vty.c\n  * vty_accept(): vty\n* lib/zclient.c\n  * zclient_read(): ret\n* zebra/irdp_interface.c\n  * if_group(): zi\n* zebra/rt_netlink.c\n  * kernel_read(): ret, sock\n"
    },
    {
      "commit": "f04a80a5d209dbb54f6fec5d0149b7c0e489d29e",
      "tree": "aaf8378930b524b1bfc9c5326d738a172c255b4b",
      "parents": [
        "fb01f87f4f50744206222343a780721af19fe56c"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "shemminger@vyatta.com",
        "time": "Tue Dec 06 14:51:10 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Tue Dec 06 15:03:00 2011 +0400"
      },
      "message": "bgpd: store nexthop info for redistributed IPV6 routes\n\nBGP was ignoring nexthop info for static and other redistributed\nroutes for IPv6.  Build extra attribute info to store the nexthop.\nSee also:\n  https://bugzilla.vyatta.com/show_bug.cgi?id\u003d6073\n"
    },
    {
      "commit": "42e6d745d105018a9469dabad65bd4cf942dcf3c",
      "tree": "9e653fe2e44d2e3f8510fcb8451931e3b6153ebc",
      "parents": [
        "beb1ca03bfe707d6d1fcad21fcbaa63af49c82f8"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Thu Jul 14 12:36:19 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Thu Sep 29 22:14:11 2011 +0400"
      },
      "message": "bgpd: more SAFI fixes\n\n(with resolved conflict in bgpd/bgp_packet.c)\n\nTwo macros resolving to the same integer constant broke a case block and\na more thorough merge of BGP_SAFI_VPNV4 and BGP_SAFI_VPNV6 was\nperformed.\n\n* bgpd.h: MPLS-labeled VPN SAFI is AFI-independent, switch to single\n* macro\n* bgp_capability_test.c: update test data\n* bgp_mp_attr_test.c: idem\n* bgp_route.c: (bgp_maximum_prefix_overflow, bgp_table_stats_vty) update\n  macro and check conditions (where appropriate)\n* bgp_packet.c: (bgp_route_refresh_send, bgp_capability_send,\n  bgp_update_receive, bgp_route_refresh_receive): idem\n* bgp_open.c: (bgp_capability_vty_out, bgp_afi_safi_valid_indices,\n  bgp_open_capability_orf, bgp_open_capability): idem\n* bgp_attr.c: (bgp_mp_reach_parse, bgp_packet_attribute,\n  bgp_packet_withdraw): idem\n"
    },
    {
      "commit": "beb1ca03bfe707d6d1fcad21fcbaa63af49c82f8",
      "tree": "78ffcd5ec7e9bb80e92c108f5ca0268ec6cff262",
      "parents": [
        "48f99b0c2bfed8d3880732d188e1d5964f575ee4"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Wed Jul 13 16:53:13 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Thu Sep 29 22:07:54 2011 +0400"
      },
      "message": "bgpd: fix SAFI for for MPLS labeled VPN-IPv6\n\n* bgpd.h: change value of BGP_SAFI_VPNV6 to 128 (RFC4659, BZ#659)\n* bgp_route.c: (bgp_table_stats_vty) fix length argument to strncmp()\n"
    },
    {
      "commit": "036a6e6cf63a1046ab260d090719b305069288eb",
      "tree": "638b920464ce82b188e32013f768d6f5d7b1a6dd",
      "parents": [
        "8dd1a8daae0b15065d54c46f82d44d21aa7a2320",
        "b881c7074bb698aeb1b099175b325734fc6e44d2"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Jul 29 18:16:25 2011 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Jul 29 18:16:25 2011 +0100"
      },
      "message": "Merge branch \u0027attr-errors\u0027\n\nContains BGP fixes:\n\n- set extcommunity crash: tihs patch tries to make the refcounting more robust\n  but does not fully solve the problem, sadly.\n- BGP attribute error handling: Little testing.\n"
    },
    {
      "commit": "0b597ef00ec7c7eebd836e2b1d5a266efcd60005",
      "tree": "818852fc775358cadb0178c15226af63cfb06759",
      "parents": [
        "6918e74b97fd40f947ebd2eded9ab24b8569d3b8"
      ],
      "author": {
        "name": "Josh Bailey",
        "email": "joshb@google.com",
        "time": "Wed Jul 20 20:49:11 2011 -0700"
      },
      "committer": {
        "name": "Josh Bailey",
        "email": "joshb@google.com",
        "time": "Wed Jul 20 20:49:11 2011 -0700"
      },
      "message": "bgpd: When advertising a multipath route, the attribute set to be\nadvertised is based on the bestpath attribute set, but the\nfollowing attributes are aggregated from the attribute sets\nof the multipath constituents:\n- AS_PATH\n- ORIGIN\n- COMMUNITIES\n- EXTENDED COMMUNITIES\n\nIn addition the route is advertised with the NEXT_HOP set\nto the router\u0027s interface IP address, instead of the NEXT_HOP\nof the best path. This is to ensure that traffic will go to this\nrouter so it can be fanned out via the multipath route.\n\n* bgpd/ecommunity.c\n  * ecommunity_uniq_sort(): Make this function externally accessible\n* bgpd/ecommunity.h\n  * Add external declaration for ecommunity_uniq_sort()\n* bgpd/bgp_mpath.c\n  * bgp_info_nexthop_cmp(): Replace calls to bgp_attr_extra_get()\n    to avoid unwanted memory allocation\n  * bgp_info_mpath_free(): Free aggregate attribute for multipath\n  * bgp_info_mpath_attr(): Lookup aggregate attribute of a multipath route\n  * bgp_info_mpath_attr_set(): Set aggregate attribute of a multipath route\n  * bgp_info_mpath_aggregate_update(): Update the aggregate attribute\n    of a multipath route\n* bgpd/bgp_mpath.h\n  * bgp_info_mpath: Add pointer to hold aggregate attribute of a multipath\n  * Add external declarations for new functions\n* bgpd/bgp_route.c\n  * bgp_announce_check(): Use aggregate attribute when announcing multipath\n    route\n  * bgp_announce_check_rsclient(): Use aggregate attribute when announcing\n    multipath route\n  * bgp_best_selection(): After updating multipath set, update the\n    multipath aggregate attribute\n"
    },
    {
      "commit": "6918e74b97fd40f947ebd2eded9ab24b8569d3b8",
      "tree": "e7d5e43b25eaf963065016d3998a78e5e5568111",
      "parents": [
        "8196f13d2ab7f3b09150c00328228f90391acb7c"
      ],
      "author": {
        "name": "Josh Bailey",
        "email": "joshb@google.com",
        "time": "Wed Jul 20 20:48:20 2011 -0700"
      },
      "committer": {
        "name": "Josh Bailey",
        "email": "joshb@google.com",
        "time": "Wed Jul 20 20:48:20 2011 -0700"
      },
      "message": "bgpd: For deterministic MED build a multipath set for each peer AS as the\nfirst stage of the best path calculation. The second stage then\nselects a winner from each peer AS\u0027s best path. In the second stage we\nclear multipath set of the non-selected best paths via\nbgp_mp_dmed_deselect(). Since the multipath set is already marked up\nfor the winning path, we don\u0027t call bgp_info_mpath_update() after the\nsecond stage calculation.\n\n* bgpd/bgp_mpath.c\n  * bgp_mp_dmed_deselect(): New function to cleanup the multipath\n    markup if a DMED selected path loses in stage 2 of the best path\n    calculation\n* bgpd/bgp_mpath.h\n  * Add external declaration of bgp_mp_dmed_deselect()\n* bgpd/bgp_route.c\n  * bgp_best_selection(): If multipath is enabled, build up the mp_list\n    for the current peer AS, and do the RIB markup the best path from\n    that AS. In the second stage, clear the RIB markup for the DMED\n    selected path if it is not selected as best. Only call\n    bgp_info_mpath_update() in the second stage when not doing\n    deterministic MED.\n"
    },
    {
      "commit": "8196f13d2ab7f3b09150c00328228f90391acb7c",
      "tree": "18c0dcfac4f07cc4cf532cd134a41cfd1d03bc55",
      "parents": [
        "de8d5dff1523bb9fe47d54f31c9e5322bd805b44"
      ],
      "author": {
        "name": "Josh Bailey",
        "email": "joshb@google.com",
        "time": "Wed Jul 20 20:47:07 2011 -0700"
      },
      "committer": {
        "name": "Josh Bailey",
        "email": "joshb@google.com",
        "time": "Wed Jul 20 20:47:07 2011 -0700"
      },
      "message": "bgpd: Modify the BGP to zebra route announcement to support multipath\nroutes. Use a growable buffer (bgp_nexthop_buf) to collect nexthops\nthat are included in the announcement. Use the BGP_INFO_MULTIPATH_CHG\nflag to trigger zebra announcement so zebra will be updated if the\nmultipath set changes. Display all multipath nexthops in\n\u0027debug bgp zebra\u0027 output.\n\n* bgpd/bgp_main.c\n  * bgp_exit(): Free bgp_nexthop_buf when exiting\n* bgpd/bgp_route.c\n  * bgp_process_rsclient(): Clear BGP_INFO_MULTIPATH_CHG after processing\n  * bgp_process_main(): Check BGP_INFO_MULTIPATH_CHG to trigger zebra\n    announcement and clear aftr processing\n* bgpd/bgp_zebra.c\n  * bgp_nexthop_buf: Growable buffer used to collect nexthops for zebra\n    announcement\n  * bgp_zebra_announce(): Grow bgp_nexthop_buf if needed. Include\n    multipath count in zebra announcement and add all nexthops to\n    bgp_nexthop_buf. Pass bgp_nexthop_buf data to zebra announcement.\n    Added nexthops to debug output.\n  * bgp_zebra_init(): Initialize bgp_nexthop_buf at startup\n* bgpd/bgp_zebra.h\n  * BGP_NEXTHOP_BUF_SIZE: Default initial bgp_nexthop_buf size has room\n    for 8 nexthops\n"
    },
    {
      "commit": "de8d5dff1523bb9fe47d54f31c9e5322bd805b44",
      "tree": "95d71dffb32d9e67a2f892ac5689a884117dcbcd",
      "parents": [
        "96450faf3385a6ed9f4dd5c2c58776c4a664a8da"
      ],
      "author": {
        "name": "Josh Bailey",
        "email": "joshb@google.com",
        "time": "Wed Jul 20 20:46:01 2011 -0700"
      },
      "committer": {
        "name": "Josh Bailey",
        "email": "joshb@google.com",
        "time": "Wed Jul 20 20:46:01 2011 -0700"
      },
      "message": "bgpd: Adds support to mark up the BGP rib table entry with multipath\ninformation based on the multipath list (mp_list) generated during\nthe best path calculation. Display \"multipath\" for paths that are\nmultipath and also on bestpath if the route is multipath. Flag a\nbest path with the BGP_INFO_MULTIPATH_CHG if the multipath\nset has changed since the last update. This can be used to trigger\nupdates to zebra and peers.\n\nThe multipath markup is a lazily allocated bgp_info_mpath structure\nthat is added to the best path and any multipaths. The mpath structures\nare linked together with the best path element at the head and the\nother elements ordered by nexthop and then by peer address. This\nmarkup scheme is updated by calling bgp_info_mpath_update() and passing\nin a new mp_list the the current multipath set. There are additional\nAPI\u0027s for walking the multipath set, querying the count of multipaths,\nand for cleaning up the multipath markup information when freeing path\ninformation.\n\n* bgpd/bgp_mpath.c\n  * bgp_info_mpath_new(): Allocation of new mpath element\n  * bgp_info_mpath_free(): Release memory for mpath element\n  * bgp_info_mpath_get(): Access mpath element of path. Allocate memory\n    on-demand\n  * bgp_info_mpath_enqueue(): Enqueue a path onto the multipath list\n  * bgp_info_mpath_dequeue(): Remove a path from the multipath list\n  * bgp_info_mpath_first(): Return first path on the multipath list\n  * bgp_info_mpath_next(): Return next path on the multipath list\n  * bgp_info_mpath_count(): Return the number of paths on the multipath list\n  * bgp_info_mpath_count_set(): Set the number of paths on the multipath list\n  * bgp_info_mpath_update(): Update multipath markup on bgp route table entry\n    and flag any changes. Emit \u0027debug bgp event\u0027 output on any multipath\n    change.\n* bgpd/bgp_mpath.h\n  * struct bgp_info_mpath: Information added to a bgp_info path to record\n    multipath information\n  * External declarations for new functions in bgp_mpath.c\n* bgpd/bgp_route.c\n  * bgp_info_free(): Free mpath memory when freeing path information\n  * bgp_info_reap(): Dequeue path from multipath queue before deleting it\n  * bgp_best_selection(): Calls bgp_info_mpath_update() with latest\n    mp_list to mark-up rib table entry\n  * bgp_vty_out_detail(): Add display of multipath flag for a path. Also\n    display \u0027multipath\u0027 for bestpath if it is a multipath route\n* bgpd/bgp_route.h\n  * struct bgp_info: Add pointer to bgp_info_mpath information\n  * Add flags to mark a path as multipath (BGP_INFO_MULTIPATH) and\n    to mark bestpath if multipath information has changed\n    (BGP_INFO_MULTIPATH_CHG)\n* lib/memtypes.c\n  * Add MTYPE_BGP_MPATH_INFO for allocating memory for bgp_info_mpath\n* tests/bgp_mpath_test.c\n  * Add test case for bgp_info_mpath_update() and supporting functions\n"
    },
    {
      "commit": "96450faf3385a6ed9f4dd5c2c58776c4a664a8da",
      "tree": "26c56a71548686a7d6797b79377ccc5e25730186",
      "parents": [
        "42ea68512fc4d04b500def45e8f899321f4081e7"
      ],
      "author": {
        "name": "Josh Bailey",
        "email": "joshb@google.com",
        "time": "Wed Jul 20 20:45:12 2011 -0700"
      },
      "committer": {
        "name": "Josh Bailey",
        "email": "joshb@google.com",
        "time": "Wed Jul 20 20:45:12 2011 -0700"
      },
      "message": "bgpd: Adds equal-paths check to path comparison. Paths that are\nequal to the best path are accumulated onto an ordered list (mp_list)\nif maximum-paths is configured. A future commit will add the\nmultipath markup to the BGP rib table based on the mp_list. Add\nunit test for the added mp_list functions.\n\nDeterministic MED is not supported in this commit, it will be\nadded later.\n\n* bgpd/bgp_aspath.c\n  * Make aspath_cmp() an external symbol so it can be used in\n    equivalent paths check\n* bgpd/bgp_aspath.h\n  * Add extern declaration of aspath_cmp()\n* bgpd/bgp_mpath.c\n  * bgp_info_nexthop_cmp(): Compares nexthops of two paths\n  * bgp_info_mpath_cmp(): Compare function to order multipaths by\n    nexthop and then by peer address\n  * bgp_mp_list_init(): Initialize a list with the multipath order function\n  * bgp_mp_list_clear(): Clear out the mp_list\n  * bgp_mp_list_add(): Add a multipath to mp_list\n* bgpd/bgp_mpath.h\n  * External declarations for above added functions in bgp_mpath.c\n* bgpd/bgp_route.c\n  * bgp_info_cmp(): Add equivalent paths result (paths_eq). If eBGP\n    paths are equal down to IGP metric check, flag as equal if peer AS\n    matches. Similarly for iBGP paths but compare full AS_PATH.\n  * bgp_best_selection(): If multipath is enabled, accumulate equivalent paths\n    in mp_list. Add debug bgp event output to see result (will be filtered\n    later to display only when change occurs)\n  * bgp_process_rsclient(): Pass multipath config to bgp_best_selection()\n  * bgp_process_main(): Pass multipath config to bgp_best_selection()\n* tests/bgp_mpath_test.c\n  * Add unit test case for bgp_mp_list functions\n"
    },
    {
      "commit": "3bde17f1af635c9ca19df0b3516cb8ad0376e6d3",
      "tree": "a963755de10136b6d8670bee5d577a49c0f0f984",
      "parents": [
        "98e30f5db6dea65a5d6a176065cd0b60eb7bb001"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Mar 23 10:30:30 2011 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Mar 23 10:30:30 2011 +0000"
      },
      "message": "bgpd: Fix compile failure if IPv6 build was disabled.\n\n* bgp_route.c: ({no_,}ipv6_bgp_network_ttl_cmd) depends on ipv6_bgp_network\n  which is HAVE_IPV6, so these should be too.\n  (bgp_route_init) and the installs should be similarly ifdefed\n"
    },
    {
      "commit": "95cbbd2ace2f88019a7a54e67b4b12aaeda177f7",
      "tree": "b3a43ef5d9da20802df0dba9c72814354eb84267",
      "parents": [
        "d8509631b47aba867c59eb463bb346d7ae5b91c7"
      ],
      "author": {
        "name": "Michael Lambert",
        "email": "lambert@psc.edu",
        "time": "Fri Jul 23 14:43:04 2010 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Mar 21 17:30:52 2011 +0000"
      },
      "message": "bgpd: New show commands for improved view and address family support\n\nMany show commands do not have support for multiple views and do not\ntreat different address families uniformly.  The following changes add\na number of commands with support for views and rationalized treatment\nof IPv4 v IPv6 and unicast v multicast (such as in JUNOS, IOS XR and\nmore recent versions of IOS).\n\n* bgp_route.c: (bgp_show_community) Inserted a new second argument (the\n  name of the view) and the code to look up that name in the BGP structure.\n  The NULL argument in the call to bgp_show (indicating the default view)\n  was replaced by the specified view.  The existing calls to\n  bgp_show_community had a NULL second argument inserted to make clear\n  that they refer to the default view.\n\n  (top level) Added new functions via the DEFUN and/or ALIAS macros (and\n  the associated command table entries) to add the commands\n\n    show bgp ipv4 (unicast|multicast)\n    show bgp ipv4 (unicast|multicast) A.B.C.D\n    show bgp ipv4 (unicast|multicast) A.B.C.D/M\n    show bgp ipv6 (unicast|multicast)\n    show bgp ipv6 (unicast|multicast) X:X::X:X\n    show bgp ipv6 (unicast|multicast) X:X::X:X/M\n\n      These show either the full BGP table or the specified route or\n      prefix for the given address family.\n\n    show bgp view WORD (ipv4|ipv6) (unicast|multicast) community\n    show bgp view WORD (ipv4|ipv6) (unicast|multicast) community \\\n            (AA:NN|local-AS|no-advertise|no-export){1,4}\n\n      For the specified view and address family, these show entries\n      matching any community or the specified communit(y)(ies).\n\n    show bgp view WORD (ipv4|ipv6) (unicast|multicast) neighbors \\\n            (A.B.C.D|X:X::X:X) (advertised-routes|received-routes)\n\n      For the specified view and address family, show the routes\n      advertised to or received from the given BGP neighbor.\n\n    show bgp [view WORD] ipv4 (unicast|multicast) \\\n            rsclient (A.B.C.D|X:X::X:X)\n    show bgp [view WORD] ipv4 (unicast|multicast) \\\n            rsclient (A.B.C.D|X:X::X:X) A.B.C.D\n    show bgp [view WORD] ipv4 (unicast|multicast) \\\n            rsclient (A.B.C.D|X:X::X:X) A.B.C.D/M\n    show bgp [view WORD] ipv6 (unicast|multicast) \\\n            rsclient (A.B.C.D|X:X::X:X)\n    show bgp [view WORD] ipv6 (unicast|multicast) \\\n            rsclient (A.B.C.D|X:X::X:X) X:X::X:X\n    show bgp [view WORD] ipv6 (unicast|multicast) \\\n            rsclient (A.B.C.D|X:X::X:X) X:X::X:X/M\n\n      For the specifed (optional) view and address family, show either\n      the full BGP table or the specified route or prefix for the given\n      route server client peer.\n\n* bgp_vty.c: (top level) Added new functions via the DEFUN and/or ALIAS\n  macros (and the associated command table entries) to add the commands\n\n    show bgp [view WORD] (ipv4|ipv6) (unicast|multicast) summary\n    show bgp [view WORD] (ipv4|ipv6) (unicast|multicast) rsclient summary\n\n      For the specified (optional) view and address family, display\n      either the normal summary table for BGP peers, or the route server\n      client table showing the import and export policies.\n"
    },
    {
      "commit": "c8f3fe3063cb9ff193b13011cfbda3e605395340",
      "tree": "42713ac0369f0ef372c657ded091b00dbe6a019b",
      "parents": [
        "0c46638122f10019a12ae9668aec91691cf2e017"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sun Dec 05 20:28:02 2010 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Mar 21 13:51:14 2011 +0000"
      },
      "message": "bgpd: Remove AS Path limit/TTL functionality\n\n* draft-ietf-idr-as-pathlimit doesn\u0027t seem to have gone anywhere, and its\n  author does not think it will make progress in IDR. Remove all support\n  introduced for it, but leave stubs for the commands to avoid breaking\n  any configurations.\n\n  Basically reverts cecab5e9725792e60a5e4b473e238a14cd85815d.\n"
    },
    {
      "commit": "f6f434b2822c453f898552537180a812538bd19e",
      "tree": "81f5de3c1eeb6679635e7363396c08b807b04ad9",
      "parents": [
        "50ef565e4e689ba653b9709be4d28a01f6cca885"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue Nov 23 21:28:03 2010 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Mar 21 13:51:14 2011 +0000"
      },
      "message": "bgpd: Try fix extcommunity resource allocation probs, particularly with \u0027set extcom..\u0027\n\n* Extended communities has some kind of resource allocation problem which\n  causes a double-free if the \u0027set extcommunity ...\u0027 command is used.\n  Try fix by properly interning extcommunities.\n\n  Also, more generally, make unintern functions take a double pointer\n  so they can NULL out callers references - a usefully defensive programming\n  pattern for functions which make refs invalid.\n\n  Sadly, this patch doesn\u0027t fix the problem entirely - crashes still\n  occur on session clear.\n\n* bgp_ecommunity.h: (ecommunity_{free,unintern}) take double pointer\n  args.\n* bgp_community.h: (community_unintern) ditto\n* bgp_attr.h: (bgp_attr_intern) ditto\n* bgp_aspath.h: (bgp_aspath.h) ditto\n* (general) update all callers of above\n* bgp_routemap.c: (route_set_ecommunity_{rt,soo}) intern the new extcom added\n  to the attr, and unintern any old one.\n  (route_set_ecommunity_{rt,soo}_compile) intern the extcom to be used\n  for the route-map set.\n  (route_set_ecommunity_*_free) unintern to match, instead of free\n  (route_set_ecommunity_soo) Do as _rt does and don\u0027t just leak\n  any pre-existing community, add to it (is additive right though?)\n"
    },
    {
      "commit": "c099baf6f0a6509d70fb62a8d6341432abb50d91",
      "tree": "2fb2449dbf00789ca69cbd6a9dd9bb3f65d5bc1f",
      "parents": [
        "7badc26301c8063dc2c6f171c11f9af4f3d0df20"
      ],
      "author": {
        "name": "Wataru Tanitsu",
        "email": "wataru@ate-mahoroba.jp",
        "time": "Fri Sep 10 09:47:56 2010 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Mar 21 13:15:32 2011 +0000"
      },
      "message": "bgpd: Fix display of unsigned attributes\n\n* bgp_route.c: (route_vty_out*) The local prefix, metric and weight values\n  are all stored as uint32_t.  Change the format to %u so that large values\n  are not displayed as negative integers.\n"
    },
    {
      "commit": "7badc26301c8063dc2c6f171c11f9af4f3d0df20",
      "tree": "32ccf03522bacb163529e00c10df4798e5365808",
      "parents": [
        "368473f6120ff295253bcc0d774c6bd75d8cf98b"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "shemminger@vyatta.com",
        "time": "Thu Aug 05 10:26:31 2010 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Mar 21 13:15:32 2011 +0000"
      },
      "message": "bgpd: fix use of free memory by update_rsclient\n\n* bgp_route.c: (bgp_static_update_rsclient) BGP sometimes crashes when\n  removing route server client because of use after free.\n\n  The code to update rsclient created a local static copy of bgp attributes\n  but neglected to handle the extra information pointer.  The extra\n  information was getting freed by bgp_attr_unintern() and reused later when\n  the copy was passed to bgp_attr_intern().\n\n  The fix is to use the attr_dup function to create a copy of the extra\n  information, then clean it up.\n"
    },
    {
      "commit": "368473f6120ff295253bcc0d774c6bd75d8cf98b",
      "tree": "2c8663378a82c107a6feb2955a10e61e06f5b869",
      "parents": [
        "f6269b4f7a2faddc44d03ff0a0e4d141562c67ee"
      ],
      "author": {
        "name": "Robert Bays",
        "email": "rbays@vyatta.com",
        "time": "Thu Aug 05 10:26:29 2010 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Mar 21 13:15:32 2011 +0000"
      },
      "message": "bgpd: unlock node on aggregate error\n\n* bgp_route.c: (bgp_aggregate_set) make sure to unlock BGP node if failure\n"
    },
    {
      "commit": "f6269b4f7a2faddc44d03ff0a0e4d141562c67ee",
      "tree": "6a1b638f032f7bb49888b8582451b2420ae4da9f",
      "parents": [
        "fac9c6b63aa74b34a22c89f005f7241d65a1765a"
      ],
      "author": {
        "name": "Robert Bays",
        "email": "rbays@vyatta.com",
        "time": "Thu Aug 05 10:26:28 2010 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Mar 21 13:15:32 2011 +0000"
      },
      "message": "bgpd: fix errors in aggregate address command\n\n* bgpd: (bgp_aggregate_{set,unset,delete}) This fixes locking and other\n  issues with aggregate set/unset command\n"
    },
    {
      "commit": "6c88b44dcb26b60bb1f93e5c387aa102019ed849",
      "tree": "772aacb2702dd635ca271ceca966986e38ecb3be",
      "parents": [
        "cca85d27a59c31e1b20e4c4adc7d9bb57606e584"
      ],
      "author": {
        "name": "Chris Caputo",
        "email": "ccaputo@alt.net",
        "time": "Tue Jul 27 16:28:55 2010 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Mar 21 13:15:32 2011 +0000"
      },
      "message": "bgpd: fix bgp_node locking issues\n\n* bgpd: Connected table locks were being locked but not unlocked, such that\n  eventually a lock would exceed 2^31 and become negative, thus triggering\n  an assert later on.\n* bgp_main.c: (bgp_exit) delete connected elements along with ifp\u0027s.\n* bgp_nexthop.c: (bgp_nexthop_lookup{,_ipv6}) add missing unlocks\n  (bgp_multiaccess_check_v4) ditto\n  (bgp_connected_{add,delete}) Use a distinct memtype for bgp_connected_ref.\n  (bgp_scan_finish) reset the nexthop cache to clean it up when bgpd exits\n* bgp_route.c: fix missing bgp_node unlocks\n* lib/memtype.c: (memory_list_bgp) add MTYPE_BGP_CONN\n* testing: has been tested for almost 2 months now.\n"
    },
    {
      "commit": "d1de1c25962b5470f3825bc82d15e4dd29e1f842",
      "tree": "9e9b3c6ed51a0fdc78e0eb8900fad8f7e7598b98",
      "parents": [
        "4dd87df5af8a59174362e44f83df11f12457c8b4",
        "e6844aa5d23cf56dd1f31afc96e8145ab188953f"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sun Mar 20 22:08:02 2011 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sun Mar 20 22:09:15 2011 +0000"
      },
      "message": "Merge paul/ospfd/201012-review ospfd and lib/ fixes and performance improvements\n"
    },
    {
      "commit": "30b0017696dfe300b6ea630a6b6c91ea440d7828",
      "tree": "0438c379abb3c2a779e82de2cbcb20ebb59d31ce",
      "parents": [
        "b016e9def4255a7406f5633c6edb820e13c9088e"
      ],
      "author": {
        "name": "John Kemp",
        "email": "kemp@network-services.uoregon.edu",
        "time": "Fri Mar 18 17:52:18 2011 +0300"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Fri Mar 18 17:52:18 2011 +0300"
      },
      "message": "bgpd: improve \"monotonic\" uptime correction\n\nOlder versions of Quagga/Zebra would output a value in MRT table\ndump files for \"uptime\" aka \"ORIGINATED\" that was a WALL clock\nvalue.  Given that uptime is now internally a bgp_clock MONOTONIC\nvalue, the output in the MRT files is showing up as monotonic.\n\nNote: time of MRT dump is still recorded correctly as a\ntime() based value, so we haven\u0027t lost that value.\n\nProposal is to correct the uptime output on the vty and in the\nMRT files to again display something more akin to WALL time.\n\n* bgp_dump.c: (bgp_dump_routes_func) add conditional correction\n* bgp_route.c: (route_vty_out_detail) make correction conditional, move\n  variable declaration to beginning of the function\n"
    },
    {
      "commit": "838bbde0426e562132d22fb11932ea413aebf928",
      "tree": "cce6161171685df013c932beb8366f55bebc417c",
      "parents": [
        "5195e17f8b49dc720252526a21afd7840240137b"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Jan 08 14:05:32 2010 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Dec 08 16:53:08 2010 +0000"
      },
      "message": "bgpd: Simplify process queue init\n\n* bgp_route.c: (bgp_process_queue_init) rsclient wasn\u0027t getting all the\n  same things initialised as the main queue. Simplify to make it more robust.\n"
    },
    {
      "commit": "213b6cd9fb24381563d6d44c7ddc4700abfae676",
      "tree": "9ea3fcf3e773144f136c47db3236ecdd5d9a5e12",
      "parents": [
        "08a7a91646a1ee317c402b421e3a7036a640bcf4"
      ],
      "author": {
        "name": "Vladimir L Ivanov",
        "email": "wawa@yandex-team.ru",
        "time": "Thu Oct 21 14:59:54 2010 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Thu Oct 21 14:59:54 2010 +0400"
      },
      "message": "bgpd: fix printed value of last-update timestamp\n\n* bgp_route.c: (route_vty_out_detail) calculate time value\n    in a way, which works regardless of monotonic clock\n    being used or not\n"
    },
    {
      "commit": "4c9641ba4df276080c670e03f65b1d442660a50f",
      "tree": "15085df8068d8a3864224937eaa407c0484ff57f",
      "parents": [
        "11d3fe9b9a327b3218a76b2b9001ace50c08de8c"
      ],
      "author": {
        "name": "Michael Lambert",
        "email": "lambert@psc.edu",
        "time": "Thu Jul 22 13:20:55 2010 -0400"
      },
      "committer": {
        "name": "Greg Troxel",
        "email": "gdt@ir.bbn.com",
        "time": "Wed Oct 06 12:33:05 2010 -0400"
      },
      "message": "bgpd, lib: adopt afi_t and safi_t in several places\n\n* bgpd/bgp_attr.c, bgpd/bgp_open.h, bgpd/bgp_route.c, lib/prefix.c,\n  lib/prefix.h: Various integer types were being used where, if we\n  had strict type checking, afi_t and safi_t would be required.\n\nSigned-off-by: G.Balaji \u003cbalajig81@gmail.com\u003e\n(cherry picked from commit c8af35ffa2dc79ff7d7ff00b1b61f1f50a100ab6)\n"
    },
    {
      "commit": "65957886bfd0dd9d95360d8b015781fc82cc09be",
      "tree": "71352e214bd59277a50a43779bb2cbafbace6cc3",
      "parents": [
        "2cd754de60210748e61069fed2c9d4086d24c21e"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "shemminger@vyatta.com",
        "time": "Fri Jan 15 16:22:10 2010 +0300"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Fri Jan 15 16:22:10 2010 +0300"
      },
      "message": "bgp: use monotonic clock for time of day\n\nBGP uses time() to get system time of day; but that value\nfluctuates with time adjustments from NTP. This can cause premature\nflapping of peer sessions and other failures.\n\nUse the system monotonic clock supported by Quagga thread library\nto avoid issue.\n\nSee: http://bugzilla.vyatta.com/show_bug.cgi?id\u003d4467\n\n* bgpd/bgp_fsm.c\n  * bgp_uptime_reset(): dismiss function\n* bgpd/bgpd.c\n  * bgp_clock(): new function\n* bgpd/bgp_damp.c\n  * bgp_reuse_timer(): employ bgp_clock() instead of time(NULL)\n  * bgp_damp_withdraw(): idem\n  * bgp_damp_update(): idem\n  * bgp_damp_scan(): idem\n  * bgp_damp_info_vty(): idem\n  * bgp_damp_reuse_time_vty(): idem\n* bgpd/bgp_fsm.c\n  * bgp_routeadv_timer(): idem\n  * bgp_stop(): idem\n  * bgp_establish(): idem\n* bgpd/bgp_packet.c\n  * bgp_update_receive(): idem\n* bgpd/bgp_route.c\n  * bgp_update_rsclient(): idem\n  * bgp_update_main(): idem\n  * bgp_static_update_rsclient(): idem\n  * bgp_static_update_main(): idem\n  * bgp_static_update_vpnv4(): idem\n  * bgp_aggregate_route(): idem\n  * bgp_aggregate_add(): idem\n  * bgp_redistribute_add(): idem\n* bgpd/bgp_snmp.c\n  * bgpPeerTable(): idem\n  * bgpTrapEstablished(): idem\n  * bgpTrapBackwardTransition(): idem\n* bgpd/bgpd.c\n  * peer_create(): idem\n  * peer_uptime(): idem\n  * bgp_master_init(): idem\n"
    },
    {
      "commit": "9e4ca89c3678431560a8259c75f8b5874d83d351",
      "tree": "178ca0de4c6fe5ecba90b51c5fb29c3e0b720cdb",
      "parents": [
        "cc2dd9280c4456586080d1cf4537d26c02fa9a36"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "shemminger@vyatta.com",
        "time": "Thu Dec 10 11:57:05 2009 +0300"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Thu Dec 10 11:57:05 2009 +0300"
      },
      "message": "bgpd: compile warnings cleanup\n\n* bgpd/bgp_fsm.c\n  * bgp_clearing_completed(): only used in one file, can be static\n* bgpd/bgp_packet.c\n  * afi2str(): sayonara\n  * safi2str(): sayonara\n* bgpd/bgp_route.c\n  * bgp_distance_reset(): sayonara\n* bgpd/bgp_zebra.c\n  * bgp_ifindex_by_nexthop(): sayonara\n"
    },
    {
      "commit": "638b70ba9893705bb3268aa00c25b8cb0e060b32",
      "tree": "51eaabdcfba4bfd4b5aa54c7a1b20298c9e2fc2a",
      "parents": [
        "a294365797da8b72e51507cbf92dbc6940e5103b"
      ],
      "author": {
        "name": "Vasilis Tsiligiannis",
        "email": "b_tsiligiannis@silverton.gr",
        "time": "Mon Jul 20 01:25:16 2009 +0300"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue Jul 21 14:44:41 2009 +0100"
      },
      "message": "[bgp] Fix nexthop reachability check on confederations\n\n* bgp_route.c: (bgp_update_main) Nexthop reachability should be checked for\n  confederations too in case a prefix is received from more than one\n  confederation peers.\n"
    },
    {
      "commit": "a294365797da8b72e51507cbf92dbc6940e5103b",
      "tree": "618569bcf8a1a5d4f7a0a8192692c5d3e27bbb02",
      "parents": [
        "e8eb000e15e2bbe63467d7c056f2b21b72ba7bd6"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue Jul 21 14:02:04 2009 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue Jul 21 14:02:04 2009 +0100"
      },
      "message": "[bgpd] fix typo made by paul in previous commit\n"
    },
    {
      "commit": "e7cc3b383e5e9190aa7784554c605a3a661ebe2b",
      "tree": "3f7b254d2e47805d4a39c43bd0c6f459e512732a",
      "parents": [
        "67b9467f6cad5097a3e4c6e49348be4d6c17a5bb"
      ],
      "author": {
        "name": "Nick Hilliard",
        "email": "nick@inex.ie",
        "time": "Tue Mar 17 22:14:25 2009 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue Jul 21 11:34:27 2009 +0100"
      },
      "message": "[bgpd] Small buffer overrun in bgp_clear_node_queue_init\n\n* bgp_route.c: (bgp_clear_node_queue_init) fix buffer\n  overrun.\n"
    },
    {
      "commit": "228da42898c4f7bd72d9c1ee4135108e8d40d860",
      "tree": "a780ed018bfeb97c174958f188c770c74a48bad9",
      "parents": [
        "54a15182e05ca757db3bb90a4135e9f8fd3c84f2"
      ],
      "author": {
        "name": "Chris Caputo",
        "email": "ccaputo@alt.net",
        "time": "Sat Jul 18 05:44:03 2009 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sun Jul 19 18:28:08 2009 +0100"
      },
      "message": "[bgpd] Stability fixes including bugs 397, 492\n\nI\u0027ve spent the last several weeks working on stability fixes to bgpd.\nThese patches fix all of the numerous crashes, assertion failures, memory\nleaks and memory stomping I could find.  Valgrind was used extensively.\n\nAdded new function bgp_exit() to help catch problems.  If \"debug bgp\" is\nconfigured and bgpd exits with status of 0, statistics on remaining\nlib/memory.c allocations are printed to stderr.  It is my hope that other\ndevelopers will use this to stay on top of memory issues.\n\nExample questionable exit:\n\n  bgpd: memstats: Current memory utilization in module LIB:\n  bgpd: memstats:  Link List                     :          6\n  bgpd: memstats:  Link Node                     :          5\n  bgpd: memstats:  Hash                          :          8\n  bgpd: memstats:  Hash Bucket                   :          2\n  bgpd: memstats:  Hash Index                    :          8\n  bgpd: memstats:  Work queue                    :          3\n  bgpd: memstats:  Work queue item               :          2\n  bgpd: memstats:  Work queue name string        :          3\n  bgpd: memstats: Current memory utilization in module BGP:\n  bgpd: memstats:  BGP instance                  :          1\n  bgpd: memstats:  BGP peer                      :          1\n  bgpd: memstats:  BGP peer hostname             :          1\n  bgpd: memstats:  BGP attribute                 :          1\n  bgpd: memstats:  BGP extra attributes          :          1\n  bgpd: memstats:  BGP aspath                    :          1\n  bgpd: memstats:  BGP aspath str                :          1\n  bgpd: memstats:  BGP table                     :         24\n  bgpd: memstats:  BGP node                      :          1\n  bgpd: memstats:  BGP route                     :          1\n  bgpd: memstats:  BGP synchronise               :          8\n  bgpd: memstats:  BGP Process queue             :          1\n  bgpd: memstats:  BGP node clear queue          :          1\n  bgpd: memstats: NOTE: If configuration exists, utilization may be expected.\n\nExample clean exit:\n\n  bgpd: memstats: No remaining tracked memory utilization.\n\nThis patch fixes bug #397: \"Invalid free in bgp_announce_check()\".\n\nThis patch fixes bug #492: \"SIGBUS in bgpd/bgp_route.c:\nbgp_clear_route_node()\".\n\nMy apologies for not separating out these changes into individual patches.\nThe complexity of doing so boggled what is left of my brain.  I hope this\nis all still useful to the community.\n\nThis code has been production tested, in non-route-server-client mode, on\na linux 32-bit box and a 64-bit box.\n\nRelease/reset functions, used by bgp_exit(), added to:\n\n  bgpd/bgp_attr.c,h\n  bgpd/bgp_community.c,h\n  bgpd/bgp_dump.c,h\n  bgpd/bgp_ecommunity.c,h\n  bgpd/bgp_filter.c,h\n  bgpd/bgp_nexthop.c,h\n  bgpd/bgp_route.c,h\n  lib/routemap.c,h\n\nFile by file analysis:\n\n* bgpd/bgp_aspath.c: Prevent re-use of ashash after it is released.\n\n* bgpd/bgp_attr.c: #if removed uncalled cluster_dup().\n\n* bgpd/bgp_clist.c,h: Allow community_list_terminate() to be called from\n  bgp_exit().\n\n* bgpd/bgp_filter.c: Fix aslist-\u003ename use without allocation check, and\n  also fix memory leak.\n\n* bgpd/bgp_main.c: Created bgp_exit() exit routine.  This function frees\n  allocations made as part of bgpd initialization and, to some extent,\n  configuration.  If \"debug bgp\" is configured, memory stats are printed\n  as described above.\n\n* bgpd/bgp_nexthop.c: zclient_new() already allocates stream for\n  ibuf/obuf, so bgp_scan_init() shouldn\u0027t do it too.  Also, made it so\n  zlookup is global so bgp_exit() can use it.\n\n* bgpd/bgp_packet.c: bgp_capability_msg_parse() call to bgp_clear_route()\n  adjusted to use new BGP_CLEAR_ROUTE_NORMAL flag.\n\n* bgpd/bgp_route.h: Correct reference counter \"lock\" to be signed.\n  bgp_clear_route() now accepts a bgp_clear_route_type of either\n  BGP_CLEAR_ROUTE_NORMAL or BGP_CLEAR_ROUTE_MY_RSCLIENT.\n\n* bgpd/bgp_route.c:\n  - bgp_process_rsclient(): attr was being zero\u0027ed and then\n    bgp_attr_extra_free() was being called with it, even though it was\n    never filled with valid data.\n\n  - bgp_process_rsclient(): Make sure rsclient-\u003egroup is not NULL before\n    use.\n\n  - bgp_processq_del(): Add call to bgp_table_unlock().\n\n  - bgp_process(): Add call to bgp_table_lock().\n\n  - bgp_update_rsclient(): memset clearing of new_attr not needed since\n    declarationw with \"\u003d { 0 }\" does it.  memset was already commented\n    out.\n\n  - bgp_update_rsclient(): Fix screwed up misleading indentation.\n\n  - bgp_withdraw_rsclient(): Fix screwed up misleading indentation.\n\n  - bgp_clear_route_node(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT.\n\n  - bgp_clear_node_queue_del(): Add call to bgp_table_unlock() and also\n    free struct bgp_clear_node_queue used for work item.\n\n  - bgp_clear_node_complete(): Do peer_unlock() after BGP_EVENT_ADD() in\n    case peer is released by peer_unlock() call.\n\n  - bgp_clear_route_table(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT.  Use\n    struct bgp_clear_node_queue to supply data to worker.  Add call to\n    bgp_table_lock().\n\n  - bgp_clear_route(): Add support for BGP_CLEAR_ROUTE_NORMAL or\n    BGP_CLEAR_ROUTE_MY_RSCLIENT.\n\n  - bgp_clear_route_all(): Use BGP_CLEAR_ROUTE_NORMAL.\n\n  Bug 397 fixes:\n\n    - bgp_default_originate()\n    - bgp_announce_table()\n\n* bgpd/bgp_table.h:\n  - struct bgp_table: Added reference count.  Changed type of owner to be\n    \"struct peer *\" rather than \"void *\".\n\n  - struct bgp_node: Correct reference counter \"lock\" to be signed.\n\n* bgpd/bgp_table.c:\n  - Added bgp_table reference counting.\n\n  - bgp_table_free(): Fixed cleanup code.  Call peer_unlock() on owner if\n    set.\n\n  - bgp_unlock_node(): Added assertion.\n\n  - bgp_node_get(): Added call to bgp_lock_node() to code path that it was\n    missing from.\n\n* bgpd/bgp_vty.c:\n  - peer_rsclient_set_vty(): Call peer_lock() as part of peer assignment\n    to owner.  Handle failure gracefully.\n\n  - peer_rsclient_unset_vty(): Add call to bgp_clear_route() with\n    BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.\n\n* bgpd/bgp_zebra.c: Made it so zclient is global so bgp_exit() can use it.\n\n* bgpd/bgpd.c:\n  - peer_lock(): Allow to be called when status is \"Deleted\".\n\n  - peer_deactivate(): Supply BGP_CLEAR_ROUTE_NORMAL purpose to\n    bgp_clear_route() call.\n\n  - peer_delete(): Common variable listnode pn.  Fix bug in which rsclient\n    was only dealt with if not part of a peer group.  Call\n    bgp_clear_route() for rsclient, if appropriate, and do so with\n    BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.\n\n  - peer_group_get(): Use XSTRDUP() instead of strdup() for conf-\u003ehost.\n\n  - peer_group_bind(): Call bgp_clear_route() for rsclient, and do so with\n    BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.\n\n  - bgp_create(): Use XSTRDUP() instead of strdup() for peer_self-\u003ehost.\n\n  - bgp_delete(): Delete peers before groups, rather than after.  And then\n    rather than deleting rsclients, verify that there are none at this\n    point.\n\n  - bgp_unlock(): Add assertion.\n\n  - bgp_free(): Call bgp_table_finish() rather than doing XFREE() itself.\n\n* lib/command.c,h: Compiler warning fixes.  Add cmd_terminate().  Fixed\n  massive leak in install_element() in which cmd_make_descvec() was being\n  called more than once for the same cmd-\u003estrvec/string/doc.\n\n* lib/log.c: Make closezlog() check fp before calling fclose().\n\n* lib/memory.c: Catch when alloc count goes negative by using signed\n  counts.  Correct #endif comment.  Add log_memstats_stderr().\n\n* lib/memory.h: Add log_memstats_stderr().\n\n* lib/thread.c: thread-\u003efuncname was being accessed in thread_call() after\n  it had been freed.  Rearranged things so that thread_call() frees\n  funcname.  Also made it so thread_master_free() cleans up cpu_record.\n\n* lib/vty.c,h: Use global command_cr.  Add vty_terminate().\n\n* lib/zclient.c,h: Re-enable zclient_free().\n"
    },
    {
      "commit": "650f76c2e1b0b12e1c46fdd3be22c5f505245d83",
      "tree": "43322ab134a9e79ee65ca0300f2106f690b5c925",
      "parents": [
        "439c52f19007badffc6707673121f5a76784e728"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Thu Jun 25 18:06:31 2009 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Jun 26 16:12:19 2009 +0100"
      },
      "message": "[bgpd] Log a debug/update warning if filters are configured but don\u0027t exist\n\n* bgp_route.c: (bgp_{input,output}_filter) Log a debug warning if a route is\n  received or sent and a filter name is configured for a prefix, as or\n  distribute list but none is found - guaranteed configuration mistake.\n"
    },
    {
      "commit": "2a71e9ce89c6f76c099dea67dddbe8da454d9de7",
      "tree": "8c53b6694e72751330fab48c02a793d67f2df24c",
      "parents": [
        "014b670e02cc1f38e8e4e786269fc1787412f9b7"
      ],
      "author": {
        "name": "Tomasz Pala",
        "email": "gotar@pld-linux.org",
        "time": "Wed Jun 24 21:36:50 2009 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jun 24 21:36:50 2009 +0100"
      },
      "message": "[bgpd] Add \u0027show ip bgp view WORD neighbors IP (advertised|received)-routes\u0027\n\n* bgp_route.c: Was missing these commands.\n"
    },
    {
      "commit": "50aef6f3b0e36b56cfa9f3d374be0c1d25c30c45",
      "tree": "5dce97de6229713c6c209cbb72abc1093fa1be58",
      "parents": [
        "6e79f8bba438823d84b7464a9acc1e6fc9126a27"
      ],
      "author": {
        "name": "Chris Caputo",
        "email": "ccaputo@alt.net",
        "time": "Tue Jun 23 06:06:49 2009 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue Jun 23 14:25:20 2009 +0100"
      },
      "message": "Fix \"show ip bgp dampened-paths\" garbage output.\n\n* bgpd/bgp_damp.c: Make bgp_damp_reuse_time_vty() accept a buffer and\n  length, rather than returning a local var buffer whose contents can get\n  trounced.  Remove duplicate BGP_UPTIME_LEN define.\n* bgpd/bgp_damp.h: bgp_damp_reuse_time_vty() prototype change.\n* bgpd/bgp_route.c: Provide bgp_damp_reuse_time_vty() with a buffer and\n  length.  Remove duplicate BGP_UPTIME_LEN define.\n\nThis problem was noticed in 2005...\n\n  http://hibernia.jakma.org/~paul/patches/quagga-test.diff\n\n...but the fix didn\u0027t make it into the code.\n\nSigned-off-by: Chris Caputo \u003cccaputo@alt.net\u003e\n"
    },
    {
      "commit": "0088b5dc55a91d27e572484e61df71b8ca2eddf4",
      "tree": "f93714f98d12890f961794cd026b6bf2de75105e",
      "parents": [
        "dde7258666fd73878b4cc10b4b5b7c07e9be049e"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "shemminger@vyatta.com",
        "time": "Thu May 21 08:51:03 2009 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Thu Jun 18 20:18:28 2009 +0100"
      },
      "message": "[bgpd] reference count the BGP instance\n\nWhen a BGP instance is deleted with lots of routes and neighbors\nit is possible for the peer rsclient queue to run after\nbgp_delete has been called. This would lead to bgpd crashing,\nsee https://bugzilla.vyatta.com/show_bug.cgi?id\u003d3436\n\nThe fix is to add reference counting to the BGP instance and defer\nactual freeing until all references are gone.\n\nThis patch also fixes a memory leak where the self-reference\npeer instance was being created but never freed.\n\nThe check in bgp_clear_route is no longer valid because it is possible\nfor it to be called when peer is in Deleted state during cleanup.\n"
    },
    {
      "commit": "dde7258666fd73878b4cc10b4b5b7c07e9be049e",
      "tree": "9275ed492957279eaf8bfa0c02fc141247309c09",
      "parents": [
        "9607d98cb04e5dff34cb2f6fb6434455c6841ab8"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "stephen.hemminger@vyatta.com",
        "time": "Fri May 08 15:19:07 2009 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Thu Jun 18 20:18:28 2009 +0100"
      },
      "message": "[bgpd] Make declarations match\n\nThese variables are const.\n"
    },
    {
      "commit": "66e5cd87194ae6fdd51061a91b4698bc0a652f6b",
      "tree": "659d31f9a7dfb8d9ad9a51f37ff0853054a45399",
      "parents": [
        "cedd7f2fa6823bca9ddcfb062f97ed83b11a80dd"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "stephen.hemminger@vyatta.com",
        "time": "Mon Feb 09 10:14:16 2009 -0800"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Jun 12 17:09:03 2009 +0100"
      },
      "message": "[cleanup] functions taking no args should be declared with void args\n\nUse Ansi-C prototypes rather than old K\u0026R method of declaring\nfunction without arguments\n"
    },
    {
      "commit": "393deb9bd663361e6b110d579a8b1d4c22667068",
      "tree": "e93ebf2f57bf92ff7a9cd045764b3cdbb99a07e5",
      "parents": [
        "3453a7122c1d585ad789ed0f63deb90cc5e89fae"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "stephen.hemminger@vyatta.com",
        "time": "Mon Aug 18 14:13:29 2008 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Jun 12 17:07:49 2009 +0100"
      },
      "message": "[cleanup] Convert XMALLOC/memset to XCALLOC\n\nSimple conversion of XMALLOC/memset to XCALLOC\n"
    },
    {
      "commit": "aea339f72807c34a7916d8614e030069815e144c",
      "tree": "7b0ab93dcfec82736f05ac39106096360e4ceeb5",
      "parents": [
        "c540835eaf0cb59921969537d8e94cc83bb717f5"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "pilot@etcnet.org",
        "time": "Thu Apr 30 17:16:22 2009 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "pilot@etcnet.org",
        "time": "Thu Apr 30 17:16:22 2009 +0400"
      },
      "message": "[bgpd] AS4 bugfix by Chris Caputo \u003cccaputo@alt.net\u003e\n\n* bgpd/bgp_aspath.c: (aspath_make_str_count) \"assert (len \u003c str_size)\" was\n  getting hit under certain 4-byte ASN conditions. New realloc strategy.\n* bgpd/bgp_aspath.c: (aspath_key_make) const warning fix.\n\n\"%d\" -\u003e \"%u\" 4-byte ASN corrections.  Prevent negative number when ASN is\nabove 2^31.\n"
    },
    {
      "commit": "a8bf6f526ee578a894c72eabae733f0b60abca63",
      "tree": "855f05041c4ef5a4f201ef2d3fe869b68b95542d",
      "parents": [
        "6e687d74f74f36bc9d503e29377e7d42f3427221"
      ],
      "author": {
        "name": "Michael Lambert",
        "email": "lambert@psc.edu",
        "time": "Wed Sep 24 17:23:11 2008 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Sep 24 17:23:11 2008 +0100"
      },
      "message": "[bgpd] Fix definition of an rsclient command\n\n* bgp_route.c: (show_ip_bgp_view_rsclient_route_cmd) Add the missing \"ip\"\n  to the command string.\n\nSigned-off-by: Paul Jakma \u003cpaul@quagga.net\u003e\n"
    },
    {
      "commit": "62687ff1cd3d4460cdbd4b0fbf1e3298fe277ad2",
      "tree": "6bea5c1cf07d9d702c95fabe356fcec418b91398",
      "parents": [
        "b38309a4ee831a440ef78f8a27db584f2f8e8276"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Sat Aug 23 14:27:06 2008 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sat Aug 23 14:27:06 2008 +0100"
      },
      "message": "[vty] Add support for a \u0027restricted mode\u0027 with anonymous vty connections\n\n\t* lib/command.h: Add a RESTRICTED_NODE, intended for use with\n\t  anonymous, \u0027no login\u0027 vtys, to provide a subset of \u0027view\u0027 mode\n\t  commands.\n\t* lib/command.c: Add RESTRICTED_NODE bits, nothing special, just\n\t  following VIEW_NODE.\n\t* lib/vty.c: (vty_auth) enable authentication should fall back to\n\t  restricted/view node as appropriate.\n\t  (vty_create) init vty\u0027s to restricted/view node as appropriate,\n\t  for the \u0027no login\u0027 case.\n\t  (vty_{no_,}restricted_mode_cmd) config commands to enable\n\t  \u0027anonymous restricted\u0027 in vty configuration.\n\t  (vty_config_write) \u0027anonymous restricted\u0027 config.\n\t  (vty_init) Install some commands to restricted mode, and the\n\t  \u0027anonymous restricted\u0027 config commands into VTY_NODE.\n\t* bgpd/*.c: Install some of the safe(r) BGP commands into\n\t  \u0027restricted mode\u0027, i.e. lookup commands of non-sensitive data.\n\t  Useful with looking-glass route-servers.\n"
    },
    {
      "commit": "30a2231a4881f53deca61ef7a62b225a43dab4c5",
      "tree": "f26dff922a4f85d302fa67bbd9a120108db41c44",
      "parents": [
        "f5612dd382d9c0f4089b08ec164c25a8082d9f89"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Fri Aug 15 14:05:22 2008 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Aug 22 19:52:59 2008 +0100"
      },
      "message": "[warnings] Fix various SOS warnings\n\n2008-08-15 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* */*: Fix various problems flagged by Sun Studio compiler.\n\t  - \u0027\u003cqualifier\u003e \u003cstorage\u003e\u0027 obsolescent in declarations\n\t  - empty statements (\u0027;\u0027 after ALIAS definitions)\n\t  - implicit declarations (e.g printstack in lib/log.c)\n\t  - \"\\%\" in printf string instead of \"%%\"\n\t  - loops that return on the first iteration (legitimately, but\n \t    compiler can\u0027t really know), e.g. bgp_routemap.c\n \t  - internal declarations which mask prototypes.\n"
    },
    {
      "commit": "750e814693050bc97391eec618aad9db798ee5e8",
      "tree": "03d3e27a68b0593002d8f73609235919c030e426",
      "parents": [
        "851a1a5c146b346d8b8f58fe3924baa5c208f865"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Tue Jul 22 21:11:48 2008 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Tue Jul 22 21:11:48 2008 +0000"
      },
      "message": "[bgpd] Fix triggerable crash when compiled with --disable-bgp-announce\n\n2008-07-22 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* HACKING: Document preference for compiler conditional code, over\n\t  cpp conditional.\n\t* configure.ac: DISABLE_BGP_ANNOUNCE always should be defined.\n\t* bgp_{packet,route,advertise}.c: change to compiler testing of\n\t  DISABLE_BGP_ANNOUNCE, rather than cpp.\n\n2008-07-22 MIYAJIMA Mitsuharu \u003cmiyajima.mitsuharu@anchor.jp\u003e\n\n\t* bgp_packet.c: (bgp_update_packet_eor) Fix crash triggerable\n\t  if a bgpd was compiled with --disable-bgp-announce and if GR is\n\t  advertised by peer.\n"
    },
    {
      "commit": "841f7a57b13b8cba4efd51db4e7ac13fd403b17b",
      "tree": "27179c9db7a6d8e7e3dc2d13eb82efda4d9c4eb1",
      "parents": [
        "693b67b2b20510e0faee87a0950595832ce71054"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "linux@pilot.org.ua",
        "time": "Thu Apr 10 11:47:45 2008 +0000"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "linux@pilot.org.ua",
        "time": "Thu Apr 10 11:47:45 2008 +0000"
      },
      "message": "+ [bgpd] Added new route-map set statement: \"as-path ignore\"\n"
    },
    {
      "commit": "9eda90ce8094683a5315007fbd0f9249a284f36f",
      "tree": "1d861050148c03dc4c37a1266c4567b24e9e6da1",
      "parents": [
        "6d134fb4defecb16591adbf4acb020acd165a75a"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Thu Aug 30 13:36:17 2007 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Thu Aug 30 13:36:17 2007 +0000"
      },
      "message": "[bgpd] bug #398 Bogus free on out route-map, and assert() with rsclients\n\n2007-08-27 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* bgp_route.c: (bgp_announce_check) Fix bug #398, slight\n\t  modification of Vladimir Ivanov\u0027s suggested fix - to keep\n\t  memory alloc conditional.\n\t  (bgp_process_announce_selected) Don\u0027t take struct attr as\n\t  argument, none of the callers need it and it needlessly\n\t  distances allocation from use.\n\t  Free the extended attr, the attr itself is on the stack.\n\t  Fix bad indentation.\n\t* bgp_attr.c: (bgp_packet_attribute) Remove incorrect assert,\n\t  and adjust conditional to test attr-\u003eextra, diagnosis by\n\t  Vladimir Ivanov in bug #398.\n\n2007-08-27 Vladimir Ivanov \u003cwawa@yandex-team.ru\u003e\n\n\t* bgp_route.c: (bgp_announce_check_rsclient) copy of\n\t  ri-\u003eattr is no longer deep enough, due to addition of\n\t  attr-\u003eextra. It should use bgp_attr_dup, as\n\t  bgp_announce_check() does.\n"
    },
    {
      "commit": "41367172d812354c05b11818346f0d49c2245aef",
      "tree": "eb8f83ec0e93cb5a1d8470afd5c79ce55bc853da",
      "parents": [
        "6d58272b4cf96f0daa846210dd2104877900f921"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Mon Aug 06 15:24:51 2007 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Mon Aug 06 15:24:51 2007 +0000"
      },
      "message": "[bgpd] Add support for AS_PATHLIMIT / draft-ietf-idr-as-pathlimit\n\n2007-07-31 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* (general) Support for draft-ietf-idr-as-pathlimit-03.\n\t* bgp_attr.h: (struct attr) Add pathlimit struct\n          bgp_attr.c: (attr_str) Add BGP_ATTR_AS_PATHLIMIT string.\n          (attrhash_key_make) tally pathlimit too\n          (attrhash_cmp) cmp pathlimit attr\n          (bgp_attr_aspathlimit) New, parse AS_PATHLIMIT attr.\n          (bgp_attr_parse) ditto\n          (bgp_packet_attribute) Write out AS_PATHLIMIT when set\n          (bgp_dump_routes_attr) ditto\n         * bgp_route.h: (struct bgp_static) Add TTL field\n         * bgp_route.c: (bgp_announce_check) Drop paths that are over\n           their hop-count TTL before sending via EBGP.\n           Mangle ASN in pathlimit for confeds/private as best we can.\n           (bgp_static_update_{rsclient,main}) Add any configure pathlimit\n           information.\n           (bgp_pathlimit_update_parents) New, update atomic-aggr setting for\n           parents of an aspathlimit\u0027ed static.\n           (bgp_static_set) Add TTL argument, for all the \u0027bgp network\u0027\n           commands.\n           Call previous for TTL changed statics.\n           (bgp_static_unset) Call pathlimit_update_parents.\n           (various bgp network commands) Add \u0027pathlimit \u003c0-255\u003e\u0027 qualifier\n           to all the various forms, bar route-map - which can set ttl\n           itself.\n         * bgp_routemap.c: (general) Add support for \u0027set pathlimit ttl\u0027 and\n           \u0027match pathlimit as\u0027.\n         * doc/bgpd.texi: Document \u0027network ... pathlimit \u003cttl\u003e\u0027\n"
    },
    {
      "commit": "b24970241aa19c780a00f0e9c865b98c239a27f2",
      "tree": "f04b9c6a50a944edd461d66da8f65d226437d964",
      "parents": [
        "e733f949448e1cf9fa27e8b618c56a0e4badc1af"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Thu Jun 14 11:17:58 2007 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Thu Jun 14 11:17:58 2007 +0000"
      },
      "message": "[bgpd] bug #370, default-originate was broken by a silly thinko\n\n2007-05-25 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* bgp_route.c: (bgp_default_originate) Sanity check added\n\t  previously was broken and always failed, thus this function\n\t  never could run, bug #370.\n"
    },
    {
      "commit": "fb982c25aa771b7c7425a3c3cce0a2cda0a715de",
      "tree": "74aa4dc86b04365d90a1030682796421b0eff011",
      "parents": [
        "5921ef9aae3b5d6ff8663298f649fb9d76594acd"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Fri May 04 20:15:47 2007 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Fri May 04 20:15:47 2007 +0000"
      },
      "message": "[bgpd] Trim memory usage of BGP routes\n\n2007-05-03 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* bgp_route.h: (struct info) Move less frequently used\n\t  fields to a lazily allocated struct info_extra.\n\t  Export bgp_info_extra_get\n\t* bgp_route.c: (bgp_info_extra_new) allocate extra\n\t  (bgp_info_extra_free) Free damp info and the info_extra.\n\t  (bgp_info_extra_get) Retrieve the info_extra of a struct\n\t  info, allocating as required.\n\t  (generally) adjust to use info-\u003eextra\n\t* bgp_damp.c: (generally) use bgp_info_extra_get to access\n\t  dampinfo\n\t* bgp_attr.h: Move rarely allocated attributes from struct attr\n\t  to a struct attr_extra, for a substantial saving in size of\n\t  struct attr.\n\t* bgp_attr.c: (bgp_attr_extra_{new,free}), new, self-explanatory.\n\t  (bgp_attr_extra_get) Get the attr_extra for a given struct\n\t  attr, allocating it if needs be.\n\t  (bgp_attr_dup) Shallow copy the struct attr and its attr_extra.\n\t  (generally) adjust to know about attr-\u003eextra.\n\t* bgp_debug.c: (bgp_dump_attr) ditto\n\t* bgp_vty.c: (show_bgp_memory) print attr and info extra sizes.\n\t* bgp_nexthop.c: (generally) adjust to know about attr-\u003eextra\n\t  and info-\u003eextra.\n\t* bgp_{packet,routemap,snmp,zebra}.c: ditto\n\t* lib/memtypes.c: Add MTYPE_ATTR_EXTRA and MTYPE_BGP_ROUTE_EXTRA\n"
    },
    {
      "commit": "16d2e2410d6e8cf53fac05b956f3e7ee53bc7234",
      "tree": "4679c5ed9d1ec64d41da13a44c1fcad76e4da9be",
      "parents": [
        "d9a18f1113b915dd0d2a4883a9149f06dd61352e"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Tue Apr 10 19:32:10 2007 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Tue Apr 10 19:32:10 2007 +0000"
      },
      "message": "[bgpd] V. quick route flap gets mistaken for duplicate, route is then ignored\n\n2007-04-08 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* bgp_route.c: (general) Same bug as fixed on 2006-11-28 by ajs for\n\t  bgp static routes, but for main BGP RIB: Quick \u0027flap\u0027 of routes\n\t  can cause bgpd to mistake a new route for a duplicate route,\n\t  due to presence of removed, but not yet processed BGP RIB entry.\n\t  (bgp_update_rsclient) Ignore REMOVED bgp_info for duplicate,\n\t  restore route instead.\n\t  (bgp_update_main) Ditto.\n"
    },
    {
      "commit": "f2c31acb6f97688af0f368211536829324145919",
      "tree": "6f9887992eeb0890fdf673f9c0794e7d1384edbb",
      "parents": [
        "553bdfe376c49886cbdc2d306fea7b003bead31f"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Thu Feb 22 17:48:42 2007 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Thu Feb 22 17:48:42 2007 +0000"
      },
      "message": "[bgpd] Peer delete can race with reconfig leading to crash\n\n2007-02-22 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* bgp_fsm.c: (bgp_fsm_change_status) Handle state change into\n\t  clearing or greater here. Simpler.\n\t  (bgp_event) Clearing state change work moved to previous\n\t* bgp_route.c: (bgp_clear_route_node) Clearing adj-in here\n\t  is too late, as it leaves a race between a peer being deleted\n\t  and an identical peer being configured before clearing\n\t  completes, leading to a crash.\n\t  Simplest fix is to clean peers Adj-in up-front, rather than\n\t  queueing such work.\n\t  (bgp_clear_route_table) Clear peer\u0027s Adj-In and Adj-Out\n\t  up-front here, rather than queueing such work.\n\t  Extensive comment added on the various bits of indexed data\n\t  that exist and how they need to be dealt with.\n\t  (bgp_clear_route) Update comment.\n"
    },
    {
      "commit": "8d45210e7c9e221b519d975825cb83aea5ebe47e",
      "tree": "62629c7693b24c3b4a8e37eed7abe51e5695417d",
      "parents": [
        "435408866187f3bc3c49b26f11bc83c374e55dd5"
      ],
      "author": {
        "name": "Andrew J. Schorr",
        "email": "ajschorr@alumni.princeton.edu",
        "time": "Tue Nov 28 19:50:46 2006 +0000"
      },
      "committer": {
        "name": "Andrew J. Schorr",
        "email": "ajschorr@alumni.princeton.edu",
        "time": "Tue Nov 28 19:50:46 2006 +0000"
      },
      "message": "[bgpd] Fix bug where a deleted route that was quickly re-added was being lost\n\n2006-11-28 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* bgp_route.c: (bgp_info_restore) New function that undoes\n\t  the effects of a previous call to bgp_info_delete.  This is\n\t  used when a route is deleted and quickly re-added before the\n\t  deletion has been processed.\n\t  (bgp_static_update_rsclient, bgp_static_update_main,\n\t  bgp_redistribute_add) Check whether a pre-existing route\n\t  has the BGP_INFO_REMOVED set, and, if so, we need to call\n\t  bgp_info_restore to resurrect it.\n"
    },
    {
      "commit": "56395af70588c8fda89bf5ef327df64b5efbeb67",
      "tree": "d3289e371b8296bc8e09d5e3464e331a040c31c6",
      "parents": [
        "8fb8a504e2c7c216b34c58e5658d84cb7dbe79b0"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Fri Oct 27 16:58:20 2006 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Fri Oct 27 16:58:20 2006 +0000"
      },
      "message": "[bgpd] trivial: non C99 u_int.._t should be uint.._t\n\n2006-10-27 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* bgp_route.c: (bgp_table_stats) oops, u_intXX_t should be\n\t  uintXX_t\n"
    },
    {
      "commit": "6f58544db526b4dfb09d45f8507926b0ae5fe12b",
      "tree": "f73d22b4ff92eaef337a6d9af8a1923d730e9a21",
      "parents": [
        "ed3ebfa36b45fe487015e1918e848f0ff4500bff"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Sun Oct 22 19:13:07 2006 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Sun Oct 22 19:13:07 2006 +0000"
      },
      "message": "[bgpd] struct peer must have bgp field valid (redistribute crash)\n\n2006-10-19 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* bgpd.c: (peer_new) bgp element of peer absolutely must be\n\t  filled in, make peer_new() require it as argument and update\n\t  all callers. Fixes a crash reported by Jan \u0027yanek\u0027 Bortl and\n\t  Andrew Schorr where bgpd would crash in bgp_pcount_adjust\n\t  trying to dereference the bgp member of bgp-\u003epeer_self,\n\t  triggered through redistribution.\n\t* bgp_route.c: (bgp_pcount_adjust) assert sanity of arguments.\n"
    },
    {
      "commit": "53d9f67a18dc59fd688fce999cb35653010a54fb",
      "tree": "8412f230b56f658361b99f773395157703bcad7d",
      "parents": [
        "dcdf399fbc7420d3edc230c9646f720825fcecda"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Sun Oct 15 23:41:16 2006 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Sun Oct 15 23:41:16 2006 +0000"
      },
      "message": "[bgpd] CID#73, potential crash in bgp statistics if called for AFI/SAFI with emtpy table\n\n2006-10-15 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* bgp_route.c: (bgp_table_stats_walker) NULL deref if table is\n\t  empty, bgp_table_top may return NULL, Coverity CID#73.\n"
    },
    {
      "commit": "09dd561eb444ab009103b2dde62db212eae7064a",
      "tree": "e7763c690dec621ca81370721f6c7b6cd38a5b10",
      "parents": [
        "8383a9bd2721dbd8fb1b657269a2cdc40b4226e1"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Thu Sep 14 03:38:16 2006 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Thu Sep 14 03:38:16 2006 +0000"
      },
      "message": "[bgpd] reduce the process queue hold time to something more sensible\n\n2006-09-14 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* bgp_route.c: (bgp_process_queue_init) process queue hold time\n\t  too high, adds extra memory load. Change to be much lower,\n\t  until such time as it\u0027s made configurable.\n"
    },
    {
      "commit": "8383a9bd2721dbd8fb1b657269a2cdc40b4226e1",
      "tree": "573d50347b4b45eabebbcc30263c4bb45a61bb2f",
      "parents": [
        "9fde6624fc480995449d8243fe85602d89927eb6"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Thu Sep 14 03:06:54 2006 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Thu Sep 14 03:06:54 2006 +0000"
      },
      "message": "[bgpd] RIB statistics address space size shouldnt double count space\n\n2006-09-14 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* bgp_route.c: (bgp_table_stats_walker) Address space announced\n\t  should only count top-level unaggregateable prefixes, to\n\t  avoid falling afoul of anti-dodgy-accounting regulations\n\t  in various jurisdictions.. ;)\n"
    },
    {
      "commit": "ca058a30b1ea57f83871ab4cf1c9a91ea4064d52",
      "tree": "ab38ab59bad607c9b41a093cb8b35bec766f30b3",
      "parents": [
        "2815e61ffbbf9c362896f3912d925cf78e125ee1"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Thu Sep 14 02:58:49 2006 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Thu Sep 14 02:58:49 2006 +0000"
      },
      "message": "[bgpd] Fix 0.99 shutdown regression, introduce Clearing and Deleted states\n\n2006-09-14 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* (general) Fix some niggly issues around \u0027shutdown\u0027 and clearing\n\t  by adding a Clearing FSM wait-state and a hidden \u0027Deleted\u0027\n\t  FSM state, to allow deleted peers to \u0027cool off\u0027 and hit 0\n\t  references. This introduces a slow memory leak of struct peer,\n\t  however that\u0027s more a testament to the fragility of the\n\t  reference counting than a bug in this patch, cleanup of\n\t  reference counting to fix this is to follow.\n\t* bgpd.h: Add Clearing, Deleted states and Clearing_Completed\n\t  and event.\n\t* bgp_debug.c: (bgp_status_msg[]) Add strings for Clearing and\n\t  Deleted.\n\t* bgp_fsm.h: Don\u0027t allow timer/event threads to set anything\n\t  for Deleted peers.\n\t* bgp_fsm.c: (bgp_timer_set) Add Clearing and Deleted. Deleted\n\t  needs to stop everything.\n\t  (bgp_stop) Remove explicit fsm_change_status call, the\n\t  general framework handles the transition.\n\t  (bgp_start) Log a warning if a start is attempted on a peer\n\t  that should stay down, trying to start a peer.\n\t  (struct .. FSM) Add Clearing_Completed\n\t  events, has little influence except when in state\n\t  Clearing to signal wait-state can end.\n\t  Add Clearing and Deleted states, former is a wait-state,\n\t  latter is a placeholder state to allow peers to disappear\n\t  quietly once refcounts settle.\n\t  (bgp_event) Try reduce verbosity of FSM state-change debug,\n\t  changes to same state are not interesting (Established-\u003eEstablished)\n\t  Allow NULL action functions in FSM.\n\t* bgp_packet.c: (bgp_write) Use FSM events, rather than trying\n\t  to twiddle directly with FSM state behind the back of FSM.\n\t  (bgp_write_notify) ditto.\n\t  (bgp_read) Remove the vague ACCEPT_PEER peer_unlock, or else\n\t  this patch crashes, now it leaks instead.\n\t* bgp_route.c: (bgp_clear_node_complete) Clearing_Completed\n\t  event, to end clearing.\n\t  (bgp_clear_route) See extensive comments.\n\t* bgpd.c: (peer_free) should only be called while in Deleted,\n\t  peer refcounting controls when peer_free is called.\n\t  bgp_sync_delete should be here, not in peer_delete.\n\t  (peer_delete) Initiate delete.\n\t  Transition to Deleted state manually.\n\t  When removing peer from indices that provide visibility of it,\n\t  take great care to be idempotent wrt the reference counting\n\t  of struct peer through those indices.\n\t  Use bgp_timer_set, rather than replicating.\n\t  Call to bgp_sync_delete isn\u0027t appropriate here, sync can be\n\t  referenced while shutting down and finishing deletion.\n\t  (peer_group_bind) Take care to be idempotent wrt list references\n\t  indexing peers.\n"
    },
    {
      "commit": "2815e61ffbbf9c362896f3912d925cf78e125ee1",
      "tree": "8cc9c2cc857f12e3c22813f756fb8fd674757e1b",
      "parents": [
        "9458b8191563eb5569f341172484a234ef2f743e"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Thu Sep 14 02:56:07 2006 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Thu Sep 14 02:56:07 2006 +0000"
      },
      "message": "[bgpd] Add RIB reporting commands, show bgp ... statistics\n\n2006-09-13 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* bgp_aspath.c: (aspath_highest) new, return highest ASN in an\n\t  aspath.\n\t* bgp_route.c: (bgp_peer_count_walker) new, do the walk done\n\t  in bgp_peer_counts as a thread.\n\t  (bgp_peer_counts) move walk to previous and call it via\n\t  thread_execute so this RIB walk shows up in thread stats.\n\t  (bgp_table_stats) New, gather some statistics for a given\n\t  RIB.\n\t  (bgp_table_stats_walker) New, RIB walker thread for former.\n\t  (bgp_table_stats_vty) Parsing front-end for \u0027show bgp ...\u0027,\n\t  useful model for future rationalisation of \u0027show ... bgp\u0027.\n\t  (bgp_route_init) Add new RIB stats commands.\n"
    },
    {
      "commit": "1a392d46db1917dfca2ddd06d7f0021396f8ecfa",
      "tree": "8dec4a2e583c9a1890fd62d647dcd5a27d14bde1",
      "parents": [
        "ff7924f6c0437e2f3cc3710570414ae87a828724"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Thu Sep 07 00:24:49 2006 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Thu Sep 07 00:24:49 2006 +0000"
      },
      "message": "[bgpd] Handle pcount as flags are changed, fixing pcount issues\n\n2006-09-06 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* (general) Squash any and all prefix-count issues by\n\t  abstracting route flag changes, and maintaining count as and\n\t  when flags are modified (rather than relying on explicit\n\t  modifications of count being sprinkled in just the right\n\t  places throughout the code).\n\t* bgp_route.c: (bgp_pcount_{dec,inc}rement) removed.\n\t  (bgp_pcount_adjust) new, update prefix count as\n\t  needed for a given route.\n\t  (bgp_info_{uns,s}et_flag) set/unset a BGP_INFO route status\n\t  flag, calling previous function when appropriate.\n\t  (general) Update all set/unsets of flags to use previous.\n\t  Remove pcount_{dec,inc}rement calls.\n\t  No need to unset BGP_INFO_VALID in places where\n\t  bgp_info_delete is called, it does that anyway.\n\t* bgp_{damp,nexthop}.c: Update to use bgp_info_{un,}set_flag.\n\t* bgp_route.h: Export bgp_info_{un,}set_flag.\n\t  Add a \u0027meta\u0027 BGP_INFO flag, BGP_INFO_UNUSEABLE.\n\t  Move BGP_INFO_HOLDDOWN macro to here from bgpd.h\n"
    },
    {
      "commit": "ff7924f6c0437e2f3cc3710570414ae87a828724",
      "tree": "e7e7e1910839845b37b4fa3f7ebc3d935ff9de99",
      "parents": [
        "b5aeb4410ae3722a5f331850acbc84c39e3fcd9f"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Mon Sep 04 01:10:36 2006 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Mon Sep 04 01:10:36 2006 +0000"
      },
      "message": "[bgpd] Add \u0027show ... neighbor .... prefix-counts\u0027 command\n\n2006-09-03 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* bgp_route.c: Add \u0027show ... bgp ... \u003cneighbour\u003e prefix-count\u0027\n\t  commands, to provide detailed counts of prefixes for a peer.\n\t  Informative, and should help pin down to pfxcnt drift\n\t  problems.\n"
    },
    {
      "commit": "b2518c1e884cb8b4f4502f8b90b1c368e1a352ec",
      "tree": "7099a9dd8bf20d560ed9565b8ecc9eaaf50bd203",
      "parents": [
        "06e110f9372f61bea23c2eaa25e7850b254bbd1a"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Fri May 12 23:48:40 2006 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Fri May 12 23:48:40 2006 +0000"
      },
      "message": "[bgpd] CID #4,#5,#9,#10, simplify aspath_print_vty usage\n\n2006-05-12 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* bgp_aspath.{c,h}: (aspath_print_vty) take a format string,\n\t  so as to reduce burden on callers, all in bgp_route.c\n\t* bgp_route.c: (route_vty_out{,tmp}) Update to match\n\t  aspath_print_vty, simplifying checks needed to get spacing\n\t  right. CID #4,#5.\n\t  ({damp,flap}_route_vty_out) Ditto, CID #9, #10\n"
    }
  ],
  "next": "06e110f9372f61bea23c2eaa25e7850b254bbd1a"
}
