)]}'
{
  "log": [
    {
      "commit": "28971c8cb1138700e87dc7da673e59b5596bb51b",
      "tree": "0e55c3f830681449cd96bb36eb04a6a1293d8b44",
      "parents": [
        "67174041d2d9d8908f8b2c915bc0d186d8442c68"
      ],
      "author": {
        "name": "Avneesh Sachdev",
        "email": "avneesh@opensourcerouting.org",
        "time": "Fri Aug 17 08:19:50 2012 -0700"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed Sep 26 21:50:48 2012 +0200"
      },
      "message": "lib/table: add route_table_get_next() and iterator\n\n  * lib/table.[ch]\n\n    - Add a function (route_table_get_next()) to get the route_node in\n      a tree that succeeds a given prefix in iteration order.\n\n      This allows one to reliably walk nodes in a tree while allowing\n      modifications, and is useful for achieving scale and\n      performance. Other approaches are also possible -- the main plus\n      point of this one is that it does not require any state about\n      the walk to be maintained in the table data structures.\n\n    - Add an iterator for walking the nodes in a tree. This introduces\n      a new structure (route_table_iter_t) and the following main\n      functions.\n\n        route_table_iter_init()\n        route_table_iter_pause()\n        route_table_iter_next()\n        route_table_iter_cleanup()\n\n      The iterator normally uses node pointers and the existing\n      route_next() function to walk nodes efficiently. When an\n      iteration is \u0027paused\u0027 with route_table_iter_pause(), it stores\n      the last prefix processed. The next call to\n      route_table_iter_next() transparently invokes\n      route_table_get_next() with the prefix to resume iteration.\n\n  * bgpd/bgp_table.[ch]\n\n    Add wrappers for the new table features described above.\n\n  * tests/table_test.c\n\n    Add tests for the new table code.\n\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": "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": "851a1a5c146b346d8b8f58fe3924baa5c208f865",
      "tree": "38817ea92885b4274ca63ad2fc502da7a92c058d",
      "parents": [
        "0df7c91f048f2116610d6bdfce3ab6cad1981802"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Tue Jul 22 19:56:56 2008 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Tue Jul 22 19:56:56 2008 +0000"
      },
      "message": "[bgpd] fix a couple of trivial compiler warnings\n\n2008-07-22 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* bgp_community.c: (community_str2com) assigns defaults to local\n\t  vars\n\t* bgp_attr.c: (bgp_attr_parse) match format specifier to arg\n\t* bgp_table.{c,h}: (bgp_table_top) can take a * to a const, quelling\n\t  warning in bgp_route.c\n"
    },
    {
      "commit": "b608d5b5ac469d47072aedd573e5d3475f4d9cf4",
      "tree": "a6e130a1dee11accfbffffd154c592d49e4312dc",
      "parents": [
        "0b3f3d47b21ddf175bfdd549ba33fbcd34801244"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Wed Jul 02 02:12:07 2008 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Wed Jul 02 02:12:07 2008 +0000"
      },
      "message": "[bgpd] Fix double-free crash in bgp_table_finish, seen with rs-client\n\n2008-07-02 Stephen Hemminger \u003cstephen.hemminger@vyatta.com\u003e\n\n\t* bgp_table.{c,h}: (bgp_table_finish) Take a double pointer and\n\t  scrub pointer in caller, so fixing double-free crashes seen\n\t  with route-server-client configuration.\n\t* *.c: Adjust all callers of bgp_table_finish\n\n2008-07-02 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* bgp_table.{c,h}: (bgp_node_delete, bgp_table_free) shouldn\u0027t be\n\t  exported.\n"
    },
    {
      "commit": "cbdfbaa51b600c7b217968b99a9b5a8fbf04bec4",
      "tree": "bb8ce6ac1da775d34796315b1c5ac82e477bbd13",
      "parents": [
        "478ccfd61bd61fd6925c84811c2c0e893a38a38b"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Thu Mar 30 13:20:48 2006 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Thu Mar 30 13:20:48 2006 +0000"
      },
      "message": "[bgpd] rearrange some structs for less padding, stats for table/attrs.\n\n2006-03-12 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* bgp_attr.h: (struct attr) rearrange fields to avoid\n\t  wasted padding between them as much as possible.\n\t  (attr_count,attr_unknown_count) export new functions to\n\t  return number of counts of cached attributes.\n\t* bgp_attr.c: (attr_count,attr_unknown_count) new functions to\n\t  return number of counts of cached attributes.\n\t* bgp_route.h: (struct bgp_info) rearrange fields to avoid\n\t  wasted padding.\n\t* bgp_table.h: (struct bgp_table) Add a count field, of number\n\t  of nodes in the table.\n\t  (struct bgp_node)  rearrange fields to avoid\n\t  wasted padding between them, though I don\u0027t think there\n\t  was any in this case.\n\t* bgp_table.c: (bgp_node_{delete,get}) Maintain the table node count.\n\t  (bgp_table_count) new function to access the table count.\n"
    },
    {
      "commit": "64e580a72deaa268e46559516663808503f347ec",
      "tree": "7b11b71858334f07a72d3885e00f63dd5c8efcf7",
      "parents": [
        "e24f0638e6fc7256580c185a631cbe5549bf7db3"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Tue Feb 21 01:09:01 2006 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Tue Feb 21 01:09:01 2006 +0000"
      },
      "message": "[bgpd] Record afi/safi in bgp_table. Serialise peer clear with FSM.\n\n2006-02-21 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* bgpd.h: move the clear_node_queue to be peer specific.\n\t  Add a new peer status flag, PEER_STATUS_CLEARING.\n\t* bgp_table.h: (struct bgp_table) Add fields to record afi,\n          safi of the table.\n          (bgp_table_init) Take afi and safi to create table for.\n        * bgp_table.c: (bgp_table_init) record the afi and safi.\n        * bgp_nexthop.c: Update all calls to bgp_table_init.\n        * bgp_vty.c: ditto.\n        * bgpd.c: ditto.\n        * bgp_fsm.c: (bgp_timer_set) dont bring up a session which is\n\t  clearing.\n        * bgp_route.c: (general) Update all bgp_table_init calls.\n          (bgp_process_{rsclient,main}) clear_node is serialised\n          via PEER_STATUS_CLEARING and fsm now.\n          (struct bgp_clear_node_queue) can be removed. struct bgp_node\n          can be the queue item data directly, as struct peer can be\n          kept in the new wq global user data and afi/safi can be\n          retrieved via bgp_node -\u003e bgp_table.\n          (bgp_clear_route_node) fix to get peer via wq-\u003espec.data,\n          afi/safi via bgp_node-\u003ebgp_table.\n          (bgp_clear_node_queue_del) no more item data to delete, only\n          unlock the bgp_node.\n          (bgp_clear_node_complete) only need to unset CLEARING flag\n          and unlock struct peer.\n          (bgp_clear_node_queue_init) queue attaches to struct peer\n          now. record peer name as queue name.\n          (bgp_clear_route_table) If queue transitions to active,\n          serialise clearing by setting PEER_STATUS_CLEARING rather\n          than plugging process queue, and lock peer while queue\n          active.\n          Update to pass only bgp_node as per-queue-item specific data.\n"
    },
    {
      "commit": "94f2b3923e9663d0355a829f22e4e31cf68ee7b8",
      "tree": "59c0291a76b1c97fbb089abb479307f19cdfd4c1",
      "parents": [
        "7cad40007b9714dba65065916ea68577f9d3d6dd"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Tue Jun 28 12:44:16 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Tue Jun 28 12:44:16 2005 +0000"
      },
      "message": "2005-06-28 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* (global) The great bgpd extern and static\u0027ification.\n\t* bgp_routemap.c: remove unused ROUTE_MATCH_ASPATH_OLD code\n\t  (route_set_metric_compile) fix u_int32_t to ULONG_MAX comparison\n\t  warnings.\n\t* bgp_route.h: (bgp_process, bgp_withdraw, bgp_update) export these\n\t  used by various files which had their own private declarations,\n\t  in the case of mplsvpn - incorrect.\n"
    },
    {
      "commit": "200df115ea0ba6f54151d60fe5e9a7f6948de7c3",
      "tree": "2aedc0af80d2e805cdf2cefd50432423d2871216",
      "parents": [
        "b31b813671d96ea9e96801508442a90f0ef503fa"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Wed Jun 01 11:17:05 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Wed Jun 01 11:17:05 2005 +0000"
      },
      "message": "2005-06-01 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* bgpd/(general) refcount struct peer and bgp_info, hence allowing us\n\t  add work_queues for bgp_process.\n\t* bgpd/bgp_route.h: (struct bgp_info) Add \u0027lock\u0027 field for refcount.\n\t  Add bgp_info_{lock,unlock} helper functions.\n\t  Add bgp_info_{add,delete} helpers, to remove need for\n\t  users managing locking/freeing of bgp_info and bgp_node\u0027s.\n\t* bgpd/bgp_table.h: (struct bgp_node) Add a flags field, and\n\t  BGP_NODE_PROCESS_SCHEDULED to merge redundant processing of\n\t  nodes.\n\t* bgpd/bgp_fsm.h: Make the ON/OFF/ADD/REMOVE macros lock and unlock\n\t  peer reference as appropriate.\n\t* bgpd/bgp_damp.c: Remove its internal prototypes for\n\t  bgp_info_delete/free. Just use bgp_info_delete.\n\t* bgpd/bgpd.h: (struct bgp_master) Add work_queue pointers.\n\t  (struct peer) Add reference count \u0027lock\u0027\n\t  (peer_lock,peer_unlock) New helpers to take/release reference\n\t  on struct peer.\n\t* bgpd/bgp_advertise.c: (general) Add peer and bgp_info refcounting\n\t  and balance how references are taken and released.\n\t  (bgp_advertise_free) release bgp_info reference, if appropriate\n\t  (bgp_adj_out_free) unlock peer\n\t  (bgp_advertise_clean) leave the adv references alone, or else\n\t  call bgp_advertise_free cant unlock them.\n\t  (bgp_adj_out_set) lock the peer on new adj\u0027s, leave the reference\n\t  alone otherwise. lock the new bgp_info reference.\n\t  (bgp_adj_in_set) lock the peer reference\n\t  (bgp_adj_in_remove) and unlock it here\n\t  (bgp_sync_delete) make hash_free on peer conditional, just in\n\t  case.\n\t* bgpd/bgp_fsm.c: (general) document that the timers depend on\n\t  bgp_event to release a peer reference.\n\t  (bgp_fsm_change_status) moved up the file, unchanged.\n\t  (bgp_stop) Decrement peer lock as many times as cancel_event\n\t  canceled - shouldnt be needed but just in case.\n\t  stream_fifo_clean of obuf made conditional, just in case.\n\t  (bgp_event) always unlock the peer, regardless of return value\n\t  of bgp_fsm_change_status.\n\t* bgpd/bgp_packet.c: (general) change several bgp_stop\u0027s to BGP_EVENT\u0027s.\n\t  (bgp_read) Add a mysterious extra peer_unlock for ACCEPT_PEERs\n\t  along with a comment on it.\n\t* bgpd/bgp_route.c: (general) Add refcounting of bgp_info, cleanup\n\t  some of the resource management around bgp_info. Refcount peer.\n\t  Add workqueues for bgp_process and clear_table.\n\t  (bgp_info_new) make static\n\t  (bgp_info_free) Ditto, and unlock the peer reference.\n\t  (bgp_info_lock,bgp_info_unlock) new exported functions\n\t  (bgp_info_add) Add a bgp_info to a bgp_node in correct fashion,\n\t  taking care of reference counts.\n\t  (bgp_info_delete) do the opposite of bgp_info_add.\n\t  (bgp_process_rsclient) Converted into a work_queue work function.\n\t  (bgp_process_main) ditto.\n\t  (bgp_processq_del) process work queue item deconstructor\n\t  (bgp_process_queue_init) process work queue init\n\t  (bgp_process) call init function if required, set up queue item\n\t  and add to queue, rather than calling process functions directly.\n\t  (bgp_rib_remove) let bgp_info_delete manage bgp_info refcounts\n\t  (bgp_rib_withdraw) ditto\n\t  (bgp_update_rsclient) let bgp_info_add manage refcounts\n\t  (bgp_update_main) ditto\n\t  (bgp_clear_route_node) clear_node_queue work function, does\n\t  per-node aspects of what bgp_clear_route_table did previously\n\t  (bgp_clear_node_queue_del) clear_node_queue item delete function\n\t  (bgp_clear_node_complete) clear_node_queue completion function,\n\t  it unplugs the process queues, which have to be blocked while\n\t  clear_node_queue is being processed to prevent a race.\n\t  (bgp_clear_node_queue_init) init function for clear_node_queue\n\t  work queues\n\t  (bgp_clear_route_table) Sets up items onto a workqueue now, rather\n\t  than clearing each node directly. Plugs both process queues to\n\t  avoid potential race.\n\t  (bgp_static_withdraw_rsclient) let bgp_info_{add,delete} manage\n\t  bgp_info refcounts.\n\t  (bgp_static_update_rsclient) ditto\n\t  (bgp_static_update_main) ditto\n\t  (bgp_static_update_vpnv4) ditto, remove unneeded cast.\n\t  (bgp_static_withdraw) see bgp_static_withdraw_rsclient\n\t  (bgp_static_withdraw_vpnv4) ditto\n\t  (bgp_aggregate_{route,add,delete}) ditto\n\t  (bgp_redistribute_{add,delete,withdraw}) ditto\n\t* bgpd/bgp_vty.c: (peer_rsclient_set_vty) lock rsclient list peer\n\t  reference\n\t  (peer_rsclient_unset_vty) ditto, but unlock same reference\n\t* bgpd/bgpd.c: (peer_free) handle frees of info to be kept for lifetime\n\t  of struct peer.\n\t  (peer_lock,peer_unlock) peer refcount helpers\n\t  (peer_new) add initial refcounts\n\t  (peer_create,peer_create_accept) lock peer as appropriate\n\t  (peer_delete) unlock as appropriate, move out some free\u0027s to\n\t  peer_free.\n\t  (peer_group_bind,peer_group_unbind) peer refcounting as\n\t  appropriate.\n\t  (bgp_create) check CALLOC return value.\n\t  (bgp_terminate) free workqueues too.\n\t* lib/memtypes.c: Add MTYPE_BGP_PROCESS_QUEUE and\n\t  MTYPE_BGP_CLEAR_NODE_QUEUE\n"
    },
    {
      "commit": "00d252cb5ff21ecc537ab40385316b41622a95e2",
      "tree": "c0132f4be53d8ae251ecb1dd8c39816f8734d08f",
      "parents": [
        "269d74fdc39a612da8f627bf97628c68d25a16ab"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Mon May 23 14:19:54 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Mon May 23 14:19:54 2005 +0000"
      },
      "message": "2005-05-23 Paul Jakma \u003cpaul@dishone.st\u003e\n\n\t* bgp_fsm.h: Add extern qualifier to exported functions\n\t* bgp_nexthop.c: add static to nexthop specific globals\n\t* *.h: Add guard defines\n"
    },
    {
      "commit": "fee0f4c629412f422fc9a857e097ef335c2c576c",
      "tree": "14703e303ea2cecaee7728d9ee27075b0590a679",
      "parents": [
        "0e82d0e1204e45ecce773a7e19f7d64140f7a66a"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Mon Sep 13 05:12:46 2004 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Mon Sep 13 05:12:46 2004 +0000"
      },
      "message": "2004-09-13 Jose Luis Rubio \u003cjrubio@dit.upm.es\u003e\n           (at Technical University of Madrid as part of Euro6ix Project)\n\n        Enhanced Route Server functionality and Route-Maps:\n\n        * bgpd/bgpd.h: Modified \u0027struct peer\u0027 and \u0027struct bgp_filter\u0027 to\n        support rs-clients. A \u0027struct bgp_table *rib\u0027 has been added to the\n        first (to mantain a separated RIB for each rs-client) and two new\n        route-maps have been added to the last (for import/export policies).\n        Added the following #defines: RMAP_{IN|OUT|IMPORT|EXPORT|MAX},\n        PEER_RMAP_TYPE_{IMPORT|EXPORT} and BGP_CLEAR_SOFT_RSCLIENT.\n\n        * bgpd/bgpd.c: Modified the functions that create/delete/etc peers in\n        order to consider the new fields included in \u0027struct peer\u0027 for\n        supporting rs-clients, i.e. the import/export route-maps and the\n        \u0027struct bgp_table\u0027.\n\n        * bgpd/bgp_route.{ch}: Modified several functions related with\n        receiving/sending announces in order to support the new Route Server\n        capabilities.\n        Function \u0027bgp_process\u0027 has been reorganized, creating an auxiliar\n        function for best path selection (\u0027bgp_best_selection\u0027).\n        Modified \u0027bgp_show\u0027 and \u0027bgp_show_route\u0027 for displaying information\n        about any RIB (and not only the main bgp RIB).\n        Added commands for displaying information about RS-clients RIBs:\n        \u0027show bgp rsclient (A.B.C.D|X:X::X:X)\u0027, \u0027show bgp rsclient\n        (A.B.C.D|X:X::X:X) X:X::X:X/M\u0027, etc\n\n        * bgpd/bgp_table.{ch}: The structure \u0027struct bgp_table\u0027 now has two\n        new fields: type (which can take the values BGP_TABLE_{MAIN|RSCLIENT})\n        and \u0027void *owner\u0027 which points to \u0027struct bgp\u0027 or \u0027struct peer\u0027 which\n        owns the table.\n        When creating a new bgp_table by default \u0027type\u003dBGP_TABLE_MAIN\u0027 is set.\n\n        * bgpd/bgp_vty.c: The commands \u0027neighbor ... route-server-client\u0027 and\n        \u0027no neighbor ... route-server-client\u0027 now not only set/unset the flag\n        PEER_FLAG_RSERVER_CLIENT, but they create/destroy the \u0027struct\n        bgp_table\u0027 of the peer. Special actions are taken for peer_groups.\n        Command \u0027neighbor ... route-map WORD (in|out)\u0027 now also supports two\n        new kinds of route-map: \u0027import\u0027 and \u0027export\u0027.\n        Added commands \u0027clear bgp * rsclient\u0027, etc. These commands allow a new\n        kind of soft_reconfig which affects only the RIB of the specified\n        RS-client.\n        Added commands \u0027show bgp rsclient summary\u0027, etc which display a\n        summary of the rs-clients configured for the corresponding address\n        family.\n\n        * bgpd/bgp_routemap.c: A new match statement is available,\n        \u0027match peer (A.B.C.D|X:X::X:X)\u0027. This statement can only be used in\n        import/export route-maps, and it matches when the peer who announces\n        (when used in an import route-map) or is going to receive (when used\n        in an export route-map) the route is the same than the one specified\n        in the statement.\n        For peer-groups the statement matches if the specified peer is member\n        of the peer-group.\n        A special version of the command, \u0027match peer local\u0027, matches with\n        routes originated by the Route Server (defined with \u0027network ...\u0027,\n        redistributed routes and default-originate).\n\n        * lib/routemap.{ch}: Added a new clause \u0027call NAME\u0027 for use in\n        route-maps. It jumps into the specified route-map and when it returns\n        the first route-map ends if the called RM returns DENY_MATCH, or\n        continues in other case.\n"
    },
    {
      "commit": "718e3744195351130f4ce7dbe0613f4b3e23df93",
      "tree": "bac2ad39971cd43f31241ef123bd4e470f695ac9",
      "parents": [],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Dec 13 20:15:29 2002 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Dec 13 20:15:29 2002 +0000"
      },
      "message": "Initial revision\n"
    }
  ]
}
