)]}'
{
  "log": [
    {
      "commit": "f669f7d25f0f491d5e487897227ff434aef20406",
      "tree": "4b040b835be1d47b7eca7240b7d7aa4b9e6f177b",
      "parents": [
        "8692c506520f6b268525b80890702432c95f13c4"
      ],
      "author": {
        "name": "Jorge Boncompte [DTI2]",
        "email": "jorge@dti2.net",
        "time": "Mon May 07 16:52:51 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 22 20:25:02 2012 +0200"
      },
      "message": "bgpd: optimize aspath string representation and assegments handling\n\n* bgp_aspath.h: Add str_len to struct aspath.\n* bgp_aspath.c: Save the aspath string representation length and use it\n  instead of strlen().\n  (aspath_make_str_count) assign the string buffer directly for\n  consistency with the string length and change the return type to void.\n  (aspath_dup) use str_len and copy the string instead of calling\n  aspath_make_str_count().\n  (assegment_data_new) change from XCALLOC to XMALLOC. All users initialize\n  the memory before use.\n  (assegment_data_free) unused, removed.\n  (aspath_intern) check that there\u0027s always a -\u003estr pointer.\n  (aspath_hash_alloc) reuse assegments and string representation instead of\n  copying them.\n  (aspath_parse) now aspath_hash_alloc does not dupes memory, free the\n  temporary structures only if the aspath it is in the hash.\n  (aspath_cmp_left) remove useless NULL initialization.\n\nSigned-off-by: Jorge Boncompte [DTI2] \u003cjorge@dti2.net\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\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": "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": "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": "ab005298526f4b14126cae1a6461ad3d700af29c",
      "tree": "8b27b97dc351ae1c89c943750e8ad53d4781de44",
      "parents": [
        "c8f3fe3063cb9ff193b13011cfbda3e605395340"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sat Nov 27 22:48:34 2010 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Mar 21 13:51:14 2011 +0000"
      },
      "message": "bgpd: Rollback some of the changes made for invalid AS_PATH segment fix\n\nSome of the changes made in commit cddb8112b80fa9867156c637d63e6e79eeac67bb\ndon\u0027t work particularly well for other changes that need to be made to\naddress BGP attribute error handling problems. In particular, returning\na pointer from complex attribute data parsing functions will not suffice\nto express the require range of return status conditions.\n\n* bgp_aspath.c: (assegments_parse) Rollback to a more minimal set of\n  changes to fix the original problem.\n  (aspath_parse) Slightly needless pushing around of code, and taking\n  2 parameters to say whether ot use 2 or 4 byte encoding seems unnecessary.\n* bgp_attr.c: (bgp_attr_as{,4}path) Rollback, in preparation for BGP\n  attribute error handling update.\n"
    },
    {
      "commit": "cddb8112b80fa9867156c637d63e6e79eeac67bb",
      "tree": "c8d8b4cb9d0ba1c2a7681c6da580874cf5a2b48e",
      "parents": [
        "d64379e8f3c0636df53ed08d5b2f1946cfedd0e3"
      ],
      "author": {
        "name": "Chris Hall",
        "email": "chris.hall@highwayman.com",
        "time": "Mon Aug 09 22:31:37 2010 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Mon Aug 09 22:31:37 2010 +0400"
      },
      "message": "bgpd: fix handling of AS path data\n\n* bgpd/bgp_aspath.c\n  * assegments_parse(): add handling of AS4_PATH input, update bounds\n    checks, add check for AS segment type\n  * aspath_parse(): add handling of AS4_PATH input, expect\n    assegments_parse() to do length checking\n  * aspath_empty(): update for the new function prototype\n* bgpd/bgp_aspath.h: ditto\n* tests/aspath_test.c: ditto\n* bgpd/bgp_attr.c\n  * bgp_attr_aspath(): add handling of AS4_PATH input, update flags\n    checks, change returned type\n  * bgp_attr_as4_path(): discard, superseded by bgp_attr_aspath()\n  * bgp_attr_parse(): update respectively\n"
    },
    {
      "commit": "da88ea82acd70adf3bab641b2300ee24319da422",
      "tree": "81151de47e55067c4b7d9cd718c0e6c8ab07aa50",
      "parents": [
        "2c2397059d4d4177ed4636c08aa476a138425dc8"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "shemminger@vyatta.com",
        "time": "Thu Dec 17 13:14:28 2009 +0300"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Thu Dec 17 13:14:28 2009 +0300"
      },
      "message": "bgpd: code cleanup\n\n* bgpd/bgp_aspath.c\n  * ashash: only used in one file, make static\n  * aspath_count_numas(): dead code, sayonara\n* bgpd/bgpd.c\n  * peer_nsf_stop(): only used in one file, make static\n* bgpd/bgp_packet.h\n  * bgp_capability_receive(): add missing prototype for a\n    global function\n"
    },
    {
      "commit": "ca87e1d37b3c30648e9bacb476a3c89729512f6d",
      "tree": "d0911b72e7d4c3c94c88a65233ee8a7fa8a4c950",
      "parents": [
        "30d205909c5a81cc306b161c16abff0fd7f566a7"
      ],
      "author": {
        "name": "Vasilis Tsiligiannis",
        "email": "b_tsiligiannis@silverton.gr",
        "time": "Mon Jul 20 01:28:35 2009 +0300"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue Jul 28 14:49:33 2009 +0100"
      },
      "message": "bgpd: Implement BGP confederation error handling (RFC5065, Par. 5)\n\nThis patch implements BGP confederation error handling in Quagga as described\nin RFC5065, paragraph 5.\n\n* bgp_aspath.c: (aspath_confed_check, aspath_left_confed_check) new functions\n* bgp_attr.c: (bgp_attr_aspath_check) apply previous and NOTIFY if there\u0027s\n  a problem.\n"
    },
    {
      "commit": "ffe11cfb0a808ae514193438616dfabc512b4cf6",
      "tree": "94452dba2c1a49d6e6a0782c6513acb36823cefc",
      "parents": [
        "9fd4958a4eef88c536e4a5aeefce302e10ee8ee6"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "stephen.hemminger@vyatta.com",
        "time": "Thu Aug 14 16:25:25 2008 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Aug 22 19:52:58 2008 +0100"
      },
      "message": "[lib] hash compare function arguments ought to be const qualified\n\n2008-08-14 Stephen Hemminger \u003cstephen.hemminger@vyatta.com\u003e\n\n\t* lib/hash.h: (struct hash) Hash comparator callback really\n\t  ought to treat storage behind arguments as constant - a compare\n\t  function with side-effects would be evil.\n\t* */*.c: Adjust comparator functions similarly, thus fixing at least\n\t  a few compiler warnings about const qualifier being dropped.\n\nSigned-off-by: Paul Jakma \u003cpaul@quagga.net\u003e\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": "0b2aa3a0a8b095bdef1eddda117d173af75dede2",
      "tree": "29201cb2beec187409e842b4078ed8a8047d3f11",
      "parents": [
        "7593fddfa1558d086e3142ad96cf2790007f5d84"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Sun Oct 14 22:32:21 2007 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Sun Oct 14 22:32:21 2007 +0000"
      },
      "message": "[bgpd] Merge AS4 support\n\n2007-10-14 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* NEWS: Note that MRT dumps are now version 2\n\t* (general) Merge in Juergen Kammer\u0027s AS4 patch.\n\n2007-09-27 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* bgp_aspath.c: (assegment_normalise) remove duplicates from\n\t  from sets.\n\t  (aspath_reconcile_as4) disregard a broken part of the RFC around\n\t  error handling in path reconciliation.\n\t* aspath_test.c: Test dupe-weeding from sets.\n\t  Test that reconciliation merges AS_PATH and AS4_PATH where\n\t  former is shorter than latter.\n\n2007-09-26 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* aspath_test.c: Test AS4_PATH reconcilation where length\n\t  of AS_PATH and AS4_PATH is same.\n\n2007-09-25 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* bgp_open.c: (peek_for_as4_capability) Fix to work.\n\t* bgp_packet.c: (bgp_open_receive) Fix sanity check of as4.\n\t* tests/bgp_capability_test.c: (general) Extend tests to validate\n\t  peek_for_as4_capability.\n\t  Add test of full OPEN Option block, with multiple capabilities,\n\t  both as a series of Option, and a single option.\n\t  Add some crap to beginning of stream, to prevent code depending\n\t  on getp \u003d\u003d 0.\n\n2007-09-18 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* bgp_open.c: (bgp_capability_as4) debug printf inline with others.\n\t  (peek_for_as4_capability) There\u0027s no need to signal failure, as\n\t  failure is better dealt with through full capability parser -\n\t  just return the AS4, simpler.\n\t* bgp_packet.c: (bgp_open_receive) Update to match\n\t  peek_for_as4_capability change.\n\t  Allow use of BGP_AS_TRANS by 2b speakers.\n\t  Use NOTIFY_OPEN_ERR rather than CEASE for OPEN parsing errors.\n\t  (bgp_capability_msg_parse) missing argument to debug print\n\t  (bgp_capability_receive) missing return values.\n\t* tests/bgp_capability_test.c: (parse_test) update for changes to\n\t  peek_for_as4_capability\n\n2007-07-25 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* Remove 2-byte size macros, just make existing macros take\n\t  argument to indicate which size to use.\n\t  Adjust all users - typically they want \u00271\u0027.\n\t* bgp_aspath.c: (aspath_has_as4) New, return 1 if there are any\n\t  as4\u0027s in a path.\n\t  (aspath_put) Return the number of bytes actually written, to\n\t  fix the bug Juergen noted: Splitting of segments will change\n\t  the number of bytes written from that already written to the\n\t  AS_PATH header.\n\t  (aspath_snmp_pathseg) Pass 2-byte flag to aspath_put. SNMP\n\t  is still defined as 2b.\n\t  (aspath_aggregate) fix latent bug.\n\t  (aspath_reconcile_as4) AS_PATH+NEW_AS_PATH reconciliation\n\t  function.\n\t  (aspath_key_make) Hash the AS_PATH string, rather than\n\t  just taking the addition of assegment ASes as the hash value,\n\t  hopefully sligthly more collision resistant.\n\t  (bgp_attr_munge_as4_attrs) Collide the NEW_ attributes\n\t  together with the OLD 2-byte forms, code Juergen\n\t  had in bgp_attr_parse but re-organised a bit.\n\t  (bgp_attr_parse) Bunch of code from Juergen moves\n\t  to previous function.\n\t  (bgp_packet_attribute) Compact significantly by\n\t  just /always/ using extended-length attr header.\n\t  Fix bug Juergen noted, by using aspath_put\u0027s\n\t  (new) returned size value for the attr header rather\n\t  than the (guesstimate) of aspath_size() - the two could\n\t  differ when aspath_put had to split large segments, unlikely\n\t  this bug was ever hit in the \u0027wild\u0027.\n\t  (bgp_dump_routes_attr) Always use extended-len and\n\t  use aspath_put return for header length. Output 4b ASN\n\t  for AS_PATH and AGGREGATOR.\n\t* bgp_ecommunity.c: (ecommunity_{hash_make,cmp}) fix\n\t  hash callback declarations to match prototypes.\n\t  (ecommunity_gettoken) Updated for ECOMMUNITY_ENCODE_AS4,\n\t  complete rewrite of Juergen\u0027s changes (no asdot support)\n\t* bgp_open.c: (bgp_capability_as4) New, does what it says\n\t  on the tin.\n\t  (peek_for_as4_capability) Rewritten to use streams and\n\t  bgp_capability_as4.\n\t* bgp_packet.c: (bgp_open_send) minor edit\n\t  checked (in the abstract at least) with Juergen.\n\t  Changes are to be more accepting, e.g, allow AS_TRANS on\n\t  a 2-byte session.\n\t* (general) Update all commands to use CMD_AS_RANGE.\n\t* bgp_vty.c: (bgp_clear) Fix return vals to use CMD_..\n\t  Remove stuff replicated by VTY_GET_LONG\n\t  (bgp_clear_vty) Return bgp_clear directly to vty.\n\t* tests/aspath_test.c: Exercise 32bit parsing. Test reconcile\n\t  function.\n\t* tests/ecommunity_test.c: New, test AS4 ecommunity changes,\n\t  positive test only at this time, error cases not tested yet.\n\n2007-07-25 Juergen Kammer \u003cj.kammer@eurodata.de\u003e\n\n\t* (general) AS4 support.\n\t* bgpd.h: as_t changes to 4-bytes.\n\t* bgp_aspath.h: Add BGP_AS4_MAX and BGP_AS_TRANS defines.\n\t* bgp_aspath.c: AS_VALUE_SIZE becomes 4-byte, AS16_VALUE_SIZE\n\t  added for 2-byte.\n\t  Add AS16 versions of length calc macros.\n\t  (aspath_count_numas) New, count number of ASes.\n\t  (aspath_has_as4) New, return 1 if there are any as4\u0027s in a\n\t  path.\n\t  (assegments_parse) Interpret assegment as 4 or 2 byte,\n\t  according to how the caller instructs us, with a new\n\t  argument.\n\t  (aspath_parse) Add use32bit argument to pass to\n\t  assegments_parse. Adjust all its callers to pass 1, unless\n\t  otherwise noted.\n\t  (assegment_data_put) Adjust to be able to write 2 or 4 byte\n\t  AS, according to new use32bit argument.\n\t  (aspath_put) Adjust to write 2 or 4.\n\t  (aspath_gettoken) Use a long for passed in asno.\n\t* bgp_attr.c: (attr_str) Add BGP_ATTR_AS4_PATH and\n\t  BGP_ATTR_AS4_AGGREGATOR.\n\t  (bgp_attr_aspath) Call aspath_parse with right 2/4 arg, as\n\t  determined by received-capability flag.\n\t  (bgp_attr_aspath_check) New, code previously in attr_aspath\n\t  but moved to new func so it can be run after NEW_AS_PATH\n\t  reconciliation.\n\t  (bgp_attr_as4_path) New, handle NEW_AS_PATH.\n\t  (bgp_attr_aggregator) Adjust to cope with 2/4 byte ASes.\n\t  (bgp_attr_as4_aggregator) New, read NEW_AGGREGATOR.\n\t  (bgp_attr_parse) Add handoffs to previous parsers for the two\n\t  new AS4 NEW_ attributes.\n\t  Various checks added for NEW/OLD reconciliation.\n\t  (bgp_packet_attribute) Support 2/4 for AS_PATH and\n\t  AGGREGATOR, detect when NEW_ attrs need to be sent.\n\t* bgp_debug.{c,h}: Add \u0027debug bgp as4\u0027.\n\t* bgp_dump.c: MRTv2 support, unconditionally enabled, which\n\t  supports AS4. Based on patches from Erik (RIPE?).\n\t* bgp_ecommunity.c: (ecommunity_ecom2str) ECOMMUNITY_ENCODE_AS4\n\t  support.\n\t* bgp_open.c: (peek_for_as4_capability) New, peek for AS4\n\t  capability prior to full capability parsing, so we know which\n\t  ASN to use for struct peer lookup.\n\t  (bgp_open_capability) Always send AS4 capability.\n\t* bgp_packet.c: (bgp_open_send) AS4 handling for AS field\n\t  (bgp_open_receive) Peek for AS4 capability first, and figure\n\t  out which AS to believe.\n\t* bgp_vty.c: (bgp_show_peer) Print AS4 cap\n\t* tests/aspath_test.c: Support asn32 changes, call aspath_parse\n\t  with 16 bit.\n\t* vtysh/extract.pl: AS4 compatibility for router bgp ASNUMBER\n\t* vtysh/extract.pl.in: AS4 compatibility for router bgp ASNUMBER\n\t* vtysh/vtysh.c: AS4 compatibility for router bgp ASNUMBER\n"
    },
    {
      "commit": "923de654c8d251d6714a6f9da2e93c236e935042",
      "tree": "473cc25308810340efb82724101bd428af352958",
      "parents": [
        "e8eb8340c14f53194786b766992f61cc0abf7a8e"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Sun Apr 29 18:25:17 2007 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Sun Apr 29 18:25:17 2007 +0000"
      },
      "message": "[bgpd] Fix warnings: hash callbacks should match hash API declarations\n\n2007-04-22 Sebastien Tandel \u003csebastien@tandel.be\u003e\n\n\t* bgp_advertise.c : (baa_hash_alloc, baa_hash_key, baa_hash_cmp)\n\t  conforms to quagga hash API. Defines _hash_[alloc|key|cmp] with\n\t  void * arguments as defined by the API.\n\t* bgp_aspath.c,h : (aspath_key_make) conforms to quagga hash API.\n\t  Defines _hash_[alloc|key|cmp] with void * arguments as defined by\n\t  the API.\n\t* bgp_attr.c,h : (cluster_hash_alloc, cluster_hash_key_make,\n\t  cluster_hash_cmp, transit_hash_alloc, transit_hash_key_make,\n\t  transit_hash_cmp, attrhash_key_make, attrhash_cmp,\n\t  bgp_attr_hash_alloc) conforms to quagga hash API. Defines\n\t  _hash_[alloc|key|cmp] with void * arguments as defined by the API.\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": "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"
    },
    {
      "commit": "8fdc32ab9a81cb80296d322346867c8c3d2b2b37",
      "tree": "bed62ebe30b81035f9ee9f5f605c1f443ad01c25",
      "parents": [
        "02335429e8cf2afc191fd518a3b55564bf6e5b2c"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Mon Jan 16 12:01:29 2006 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Mon Jan 16 12:01:29 2006 +0000"
      },
      "message": "[bgpd] add aspath_finish, static resource cleanup function.\n\n2006-01-16 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* bgp_aspath.c:\n\t  (aspath_snmp_pathseg) move the static stream pointer out to\n\t  file scope, so it can be freed.\n\t  (aspath_finish) new function, free aspath resources.\n\t* bgp_aspath.h: (aspath_finish) export.\n"
    },
    {
      "commit": "fe69a505f7be4357bf8523e3bbdced9c95590f3a",
      "tree": "6d2450016eb19f30b153b2439d06ade68d1b8f12",
      "parents": [
        "1f8ae70b7b86d132b95a18f0c824deb248987afc"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Sat Sep 10 16:55:02 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Sat Sep 10 16:55:02 2005 +0000"
      },
      "message": "2005-09-10 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* Makefile.am: bgpd shouldn\u0027t list libgp\u0027s sources as its own.\n\t  Use LDADD.\n\t* bgp_aspath.h:\n\t  (struct assegment) New struct, abstract representation of a\n\t  list of AS_PATH segments and the contained ASNs.\n\t  (struct aspath) Remove the raw-data related\n\t  fields, reference the abstract struct assegment instead.\n\t  Remove several other computed fields, it\u0027s just a\n\t  headache to maintain them and they\u0027re cheap to compute from\n\t  struct assegment.\n\t  (aspath_parse) parse a stream, not a pointer to raw data.\n\t  (aspath_count_{hops,confeds,size}) helpers to access\n\t  information formerly directly contained in struct aspath.\n\t  (aspath_snmp_pathseg) Helper for SNMP, BGP MIB wants\n\t  to be able to output hex representation of raw data.\n\t* bgp_aspath.c: (general) partial-rewrite. Store aspath data\n\t  as an abstract singly-linked list of abstract segments,\n          rather than storing the raw data, and parsing it each and\n\t  every time. Remove several count/size fields which are cheap\n\t  to compute from the abstract segment structure.\n\t  (global) Include stream.h, needed for aspath_parse, and\n\t  others. Couple of helper macros added.\n\t  (struct assegment_header) Just the header, and only the\n\t  header.\n\t  (assegment_data_{new,free}) convenience functions for\n\t  AS_SEG_DATA allocation, the dynamic, per-segment array of\n\t  ASNs.\n\t  (assegment_{new,free,free_all,dup,dup_all}) convenience\n\t  functions for creating struct assegments. The _all forms will\n\t  follow the entire chain of segments from the given segment.\n\t  (assegment_prepend_asns) new function, prepend an ASN N times\n\t  to segment.\n \t  (assegment_append_asns) Append a list (array) of ASNs to\n\t  segment.\n\t  (int_cmp) convenience function for the aspath hash.\n\t  (assegment_normalise) new function. Normalise the given\n\t  segment chain to meet expectations of Quagga, and to\n\t  eliminate differing raw representations of the same paths.\n\t  Merge \u0027runs\u0027 of SEQUENCEs into one segment as our internal\n\t  segment is not limited by the protocol AS_PATH segment\n\t  length. Sort ASNs in SETs.\n\t  (aspath_new) Take void argument to quell warnings. Use the\n\t  assegment convenience functions.\n\t  (assegment_count_{asns,confeds,hops}) new functions to\n\t  compute at runtime values previously held in struct aspath.\n\t  (aspath_size) ditto.\n\t  (aspath_make_str_count) rewritten to stringify new\n\t  representation, and to be slightly easier to understand\n\t  hopefully.\n\t  (aspath_str_update) convenience function, update the aspath\n\t  str. Should investigate removing maintained string from\n\t  struct aspath, just run-time compute it, as per other fields.\n\t  It\u0027s just a maintenance headache, would save noticeable\n\t  amount of RAM with possibly not much extra run-time cost.\n\t  (aspath_dup) use the assegment dup functions.\n\t  (aspath_hash_alloc) Take void * argument to satisfy gcc. Use\n\t  the proper helper functions to dup data.\n\t  (assegments_parse) new function. parse raw AS_PATH data into\n\t  struct assegments. Normalise and return the head of the list.\n\t  (aspath_parse) Parse a stream, not pointer to raw data and\n\t  use assegments_parse to do it.\n\t  (assegment_data_put) Write out a single segment data in protocol\n\t  form to stream.\n\t  (assegment_header_put) ditto but for segment header.\n\t  (aspath_put) new function. As per previous but for an entire\n\t  struct aspath.\n\t  (aspath_snmp_pathseg) wrapper around aspath_put for\n\t  bgp_snmp.c. Uses a static buffer sadly.\n\t  (aspath_aggregate_as_set_add) rewritten to use assegments.\n\t  (aspath_aggregate) ditto\n\t  (aspath_{firstas,loop,private_as}_check) ditto\n\t  (aspath_{merge,prepend,add_one_as}) ditto\n\t  (aspath_cmp_left{_confed}) ditto\n\t  (aspath_delete_confed_seq) ditto, plus fixed to properly\n\t  delete all leading confed segments.\n\t  (aspath_as_add) Just use assegment_append_asns.\n\t  (aspath_segment_add) updated to use assegments.\n\t  (enum as_token) Add values for confeds\n\t  (aspath_gettoken) Add support for confeds\n\t  (aspath_str2aspath) ditto\n\t  (aspath_key_make) updated to use as_segments. Also, add\n\t  segment type into the hash value as appropriate.\n\t  (aspath_cmp) updated to use as_segments.\n\t  (aspath_print) don\u0027t segfault on NULL argument.\n\t* bgp_attr.c: (bgp_attr_aspath) aspath_parse wants the stream\n\t  now. No need for manual forwarding of stream.\n\t  (bgp_packet_attribute) empty aspath is now denoted by NULL\n\t  segment field, length is gone.\n\t  Use aspath_size() to determine size.\n\t  (bgp_attr_init) Fix declaration, explicitely specify void\n\t  arg.\n\t  (bgp_dump_routes_attr) Use aspath_size() to determine size.\n\t* bgp_route.c: (bgp_info_cmp) use the aspath_count_* functions.\n\t  (bgp_rib_withdraw) remove unused variable. Use\n\t  aspath_count_hops.\n\t* bgp_snmp.c: (bgp4PathAttrTable) raw data is gone, use\n\t  aspath_snmp_pathseg to get the representation.\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": "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": "6811845b67999861388cf00d3ca0ee8471d29876",
      "tree": "1f7f08f171164b1a75b66a45093ccb44217dff12",
      "parents": [
        "4a8164e5b310094315e2c50d73aeea489766a48a"
      ],
      "author": {
        "name": "hasso",
        "email": "hasso",
        "time": "Fri Apr 08 15:40:36 2005 +0000"
      },
      "committer": {
        "name": "hasso",
        "email": "hasso",
        "time": "Fri Apr 08 15:40:36 2005 +0000"
      },
      "message": "\t* bgpd.texi: Document new \"bgp bestpath as-path confed\" command.\n\t* bgp_aspath.[ch], bgp_route.c, bgp_vty.c, bgpd.[ch]: Allow to enable\n\t  the length of confederation path segments to be included during the\n\t  as-path length check in the best path decision.\n"
    },
    {
      "commit": "fd79ac918b8feaacebe9719adaac97dffb69137a",
      "tree": "d0665eb68e60da9d6e364414cdb61830f19f33d3",
      "parents": [
        "39db97e4e02eae08a1e18528367b6e9b07eb6a93"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Wed Oct 13 05:06:08 2004 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Wed Oct 13 05:06:08 2004 +0000"
      },
      "message": "2004-10-13 Paul Jakma \u003cpaul@dishone.st\u003e\n\n\t* (global) more const\u0027ification and fixups of types to clean up code.\n\t* bgp_mplsvpn.{c,h}: (str2tag) fix abuse. Still not perfect,\n          should use something like the VTY_GET_INTEGER macro, but without\n          the vty_out bits..\n        * bgp_routemap.c: (set_aggregator_as) use VTY_GET_INTEGER_RANGE\n          (no_set_aggregator_as) ditto.\n        * bgpd.c: (peer_uptime) fix unlikely bug, where no buffer is\n          returned, add comments about troublesome return value.\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"
    }
  ]
}
