)]}'
{
  "log": [
    {
      "commit": "78deec450cfa5ddcad290c13b36dd1d187da213e",
      "tree": "bf6e811b78c726db3fe00b168b35a67e9aa586c1",
      "parents": [
        "0915bb0ce2ca6b5fee2cd214be4499eeeaf1c9af"
      ],
      "author": {
        "name": "Avneesh Sachdev",
        "email": "avneesh@opensourcerouting.org",
        "time": "Tue Nov 13 22:48:56 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Fri Nov 30 21:41:17 2012 +0100"
      },
      "message": "zebra: extern/extract some functions from rt_netlink.c\n\n* zebra/{rib.h,zebra_rib.c}\n\n    Add nexthop_type_to_str(), which returns a human-readable string\n    corresponding to a nexthop type.\n\n  * zebra/rt_netlink.[hc]\n\n    - Add new header file that exposes some existing and new\n      netlink-related functions from rt_netlink.c to the rest of\n      zebra.\n\n        addattr32\n        addattr_l\n        rta_addattr_l\n        nl_msg_type_to_str (new)\n        nl_rtproto_to_str (new)\n\n    - Use nexthop_type_to_str() instead of the static array\n      \u0027nexthop_types_desc\u0027.\n\nSigned-off-by: Avneesh Sachdev \u003cavneesh@opensourcerouting.org\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "0915bb0ce2ca6b5fee2cd214be4499eeeaf1c9af",
      "tree": "eb3cb410ed0dd341e2e565e71d74bba81c0dbf8a",
      "parents": [
        "1b5ed1b054b955275bb7cf0f80fb7767094bc28b"
      ],
      "author": {
        "name": "Avneesh Sachdev",
        "email": "avneesh@opensourcerouting.org",
        "time": "Tue Nov 13 22:48:55 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Fri Nov 30 21:41:16 2012 +0100"
      },
      "message": "zebra: add iterator for walking all tables in RIB\n\n* lib/zebra.h\n\n    Add macro ZEBRA_NUM_OF, which returns the number of elements in a\n    static array.\n\n  * zebra/rib.h\n\n    Add the rib_tables_iter_t structure and associated functions,\n    which allow one to walk all tables in the rib.\n\n  * zebra/zebra_rib.c\n\n    - Add vrf_id_get_next() to retrieve the first VRF id (if any) that\n      is greater than a given VRF id.\n\n    - Add rib_tables_iter_next().\n\nSigned-off-by: Avneesh Sachdev \u003cavneesh@opensourcerouting.org\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "1b5ed1b054b955275bb7cf0f80fb7767094bc28b",
      "tree": "b8d886b85615f1b05679e6879c961e5dcb1496c4",
      "parents": [
        "9fd92e3c4bdcc78e0f0d94d53a2d4c7b0e893fcb"
      ],
      "author": {
        "name": "Avneesh Sachdev",
        "email": "avneesh@opensourcerouting.org",
        "time": "Tue Nov 13 22:48:54 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Fri Nov 30 21:41:16 2012 +0100"
      },
      "message": "zebra: add way to determine VRF/AFI/SAFI of table\n\nAdd some code that allows us to determine which VRF and AFI/SAFI a\ngiven RIB table corresponds to.\n\n  * zebra/rib.h\n\n    Add rib_table_info_t structure, which contains information about\n    the VRF, AFI and SAFI that a table is for.\n\n  * zebra/zebra_rib.c\n\n    - Add the vrf_table_create() function, which creates a table and\n      sets its \u0027info\u0027 pointer to a newly created rib_table_info_t.\n      The \u0027info\u0027 pointer allows us to go from a route_node or a table\n      to the associated vrf.\n\n    - vrf_alloc(): Use vrf_create_table() to create tables.\n\n  * lib/memtypes.c\n\n    Add memory type for rib_table_info_t.\n\nSigned-off-by: Avneesh Sachdev \u003cavneesh@opensourcerouting.org\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "9fd92e3c4bdcc78e0f0d94d53a2d4c7b0e893fcb",
      "tree": "a3adf090e5ef776b8c6dc6223890a2640217a95b",
      "parents": [
        "5aebb9c77fc2257c9d9df72db66668fabb24fc52"
      ],
      "author": {
        "name": "Avneesh Sachdev",
        "email": "avneesh@opensourcerouting.org",
        "time": "Tue Nov 13 22:48:53 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Fri Nov 30 21:41:16 2012 +0100"
      },
      "message": "zebra: add structure to hold per-prefix state in RIB\n\nAdd the rib_dest_t structure to hold per-prefix state in the routing\ninformation base. This gives us an appropriate place to maintain the\nqueueing state of a route_node. Queuing state was previously being\nstored on the first rib in the list of ribs hanging off the\nroute_node.\n\n  * zebra/rib.h\n\n    - Add new structure rib_dest_t.\n\n    - Remove the rn_status field from \u0027struct rib\u0027, it is no longer\n      required.\n\n    - Add macros (RNODE_FOREACH_RIB, RNODE_FOREACH_RIB_SAFE) for\n      walking all \u0027struct ribs\u0027 corresponding to a route_node. These\n      hide the fact that there is an intermediate rib_dest_t\n      structure.\n\n    - Add a few utility inlines to go between a rib_dest_t and\n      associated structures.\n\n  * zebra/zebra_rib.c\n\n    - rib_link()/rib_unlink()\n\n      Tweak for new behavior, where the \u0027info\u0027 pointer of a route_node\n      points to a rib_dest_t. The list of ribs for a prefix now hangs\n      off of the dest.\n\n      Change the way we ref count route_nodes. We now hold a single\n      ref count on a route_node if there is a corresponding\n      rib_dest_t.\n\n    - Maintain the queuing state of a route_node on the flags field of\n      the rib_dest_t.\n\n    - Add the rib_gc_dest() function, which deletes a rib_dest_t if it\n      is no longer required. A rib_dest_t can be deleted iff there are\n      no struct ribs hanging off of it.\n\n    - Call rib_gc_dest() any time we unlink a rib from the\n      rib_dest_t. Currently we only need to call it once, just before\n      we return from rib_process().\n\n  * zebra/{redistribute,zebra_rib,zebra_snmp,zebra_vty}.c\n\n    Use new macros to walk over route_node ribs.\n\n  * lib/memtypes.c\n\n    Add memory type for rib_dest_t.\n\nSigned-off-by: Avneesh Sachdev \u003cavneesh@opensourcerouting.org\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "5aebb9c77fc2257c9d9df72db66668fabb24fc52",
      "tree": "eb6964198f32c3196710ba1812902c43ef87f1b4",
      "parents": [
        "8b366b9cfd1f3ec1a45e0f82db7fdb27e3bb3594"
      ],
      "author": {
        "name": "Andrew Certain",
        "email": "certain@amazon.com",
        "time": "Wed Nov 07 23:50:09 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Fri Nov 30 21:10:51 2012 +0100"
      },
      "message": "bgpd: document bgp neighbor local-as peer command\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "8b366b9cfd1f3ec1a45e0f82db7fdb27e3bb3594",
      "tree": "855e826ba80328b0fa106bfd8e1f826357806406",
      "parents": [
        "9d3f9705d8b386ccf006c106967c700141e5d049"
      ],
      "author": {
        "name": "Andrew Certain",
        "email": "certain@amazon.com",
        "time": "Wed Nov 07 23:50:08 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Fri Nov 30 21:10:25 2012 +0100"
      },
      "message": "bgpd: Fixed out-of-date comment\n\nWhen going through the code to write the documentation for local-as,\nI discovered that one of the comments was out-of-date.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "9d3f9705d8b386ccf006c106967c700141e5d049",
      "tree": "9edfe2653741fa0f49ffef15bd66f5a522dcd025",
      "parents": [
        "3b96b78136d04ddb7e39d86577cad75acb25237a"
      ],
      "author": {
        "name": "Andrew Certain",
        "email": "certain@amazon.com",
        "time": "Wed Nov 07 23:50:07 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Fri Nov 30 21:10:00 2012 +0100"
      },
      "message": "bgpd: add replace-as modifier for BGP neighbor\n\nAdded replace-as modifier for BGP neighbors when using\nlocal-as. If the replace-as modifier is specified, only the\nreplacement AS as specified by the local-as modifier is\nprepended to the AS_PATH, not the process\u0027s AS.\n\nIn bgp_attr.c, I decided that\n\nif (peer-\u003echange_local_as) {\n  /* If replace-as is specified, we only use the change_local_as when\n     advertising routes. */\n  if( ! CHECK_FLAG (peer-\u003eflags, PEER_FLAG_LOCAL_AS_REPLACE_AS) ) {\n    aspath \u003d aspath_add_seq (aspath, peer-\u003elocal_as);\n  }\n  aspath \u003d aspath_add_seq (aspath, peer-\u003echange_local_as);\n} else {\n  aspath \u003d aspath_add_seq (aspath, peer-\u003elocal_as);\n}\n\nwas clearer than the alternative that didn\u0027t duplicate the prepending of the\nprocess\u0027s AS:\n\n/* First, append the process local AS unless we have an alternate local_as\n * and we\u0027re replacing it (as opposed to just prepending it). */\nif (! (peer-\u003echange_local_as\n       \u0026\u0026 CHECK_FLAG (peer-\u003eflags, PEER_FLAG_LOCAL_AS_REPLACE_AS) ) ) {\n  aspath \u003d aspath_add_seq (aspath, peer-\u003elocal_as);\n}\n\nif (peer-\u003echange_local_as)\n  aspath \u003d aspath_add_seq (aspath, peer-\u003echange_local_as);\n}\n\nBut I could be convinced otherwise.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "3b96b78136d04ddb7e39d86577cad75acb25237a",
      "tree": "a056f89d771aa6706816b0b8507fc4b44028d865",
      "parents": [
        "43057bf22a4240b5e163c30a1f66deb702ce746e"
      ],
      "author": {
        "name": "Hasso Tepper",
        "email": "hasso.tepper@gmail.com",
        "time": "Thu Oct 11 11:31:54 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Mon Nov 05 15:16:53 2012 -0500"
      },
      "message": "lib: Implement monotonically increasing clock for Darwin.\n\nThere is no Posix CLOCK_MONOTONIC in Darwin, but monotonically\nincreasing clock can be implemented using mach_absolute_time().\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "43057bf22a4240b5e163c30a1f66deb702ce746e",
      "tree": "d5b4d164efa3034ae8006020d6d1ae5e314a867c",
      "parents": [
        "8c9ed279852393804c26e3c8c556a13d08654907"
      ],
      "author": {
        "name": "Hasso Tepper",
        "email": "hasso.tepper@gmail.com",
        "time": "Thu Oct 11 11:19:51 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Mon Nov 05 15:16:53 2012 -0500"
      },
      "message": "isisd: clock_gettime() -\u003e quagga_gettime() conversion.\n\n* isisd/isis_spf.c: Use portable quagga_gettime() like the rest of\n    the Quagga code.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "8c9ed279852393804c26e3c8c556a13d08654907",
      "tree": "540dfd742339845bac1079b89122a4a7b33aaba0",
      "parents": [
        "9234b382735b690f403ce018ce392316b2ad6e38"
      ],
      "author": {
        "name": "Hasso Tepper",
        "email": "hasso.tepper@gmail.com",
        "time": "Thu Oct 11 11:15:18 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Mon Nov 05 15:15:57 2012 -0500"
      },
      "message": "ospfd: remove some buggy extra \u0027;\u0027 symbols.\n\n * ospfd/ospf_apiserver.c: extra ; causing lookup to fail always\n * ospfd/ospf_lsa.c: extra ; causing debug output even when disabled\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "9234b382735b690f403ce018ce392316b2ad6e38",
      "tree": "291a65a85584a3435453676bd8ed1ab0f70123ab",
      "parents": [
        "a05df8fd279e4af0f077de181fb6c4e7d7174267"
      ],
      "author": {
        "name": "Doug VanLeuven",
        "email": "roamdad@sonic.net",
        "time": "Wed Oct 10 16:12:32 2012 -0700"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Mon Nov 05 11:22:24 2012 -0500"
      },
      "message": "build: check actually-used BSD link state fields\n\nifi_link_state missing in OS X. There could be other *BSD\u0027s that haven\u0027t\nimplemented it and possibly affects older implementations.\n\nThe existing HAVE_BSD_LINK_DETECT configure.ac check is only confirming\nthe link state detection using ifmediareq.ifm_status found in\n\u003cnet/if_media.h\u003e. This is the link state detection used in\nzebra/ioctl.c. Later, *BSD redefined struct if_data in \u003cnet/if.h\u003e and\nincluded link state detection. This is the method used in\nzebra/kernel_socket.c\n\nAdditional test defined in config.ac to test for member struct\nif_data.ifi_link_state defined in \u003cnet/if.h\u003e separate from test for\n\u003cnet/if_media.h\u003e ifmediareq.ifm_status\n\nFixed #ifdef\u0027s in zebra/kernel_socket.c to use the new #define\nNo impact on older function calls in zebra/ioctl.c\n\nTested on 64bit OS X 10.7, FreeBSD 9.0 amd64 \u0026 i386 (32bit)\nusing gcc \u0026 clang. Tested on linux 64bit.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "a05df8fd279e4af0f077de181fb6c4e7d7174267",
      "tree": "3b29c8d00b70dfbf9f9ff8ab90c29b970d0aea33",
      "parents": [
        "3b33de676ac8e84b82f40520ecd0f4722e16b349"
      ],
      "author": {
        "name": "Doug VanLeuven",
        "email": "roamdad@sonic.net",
        "time": "Wed Oct 10 16:11:36 2012 -0700"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Mon Nov 05 11:12:08 2012 -0500"
      },
      "message": "zebra: kernel_socket: fix overflow in RTA_ADDR \u0026 RTA_ATTR\n\nIn zebra/kernel_socket.c, copying sockaddr from *_msghdr:\n\nThere are really 2 different lengths that need to be determined.\n  1) the length required to point to the next sockaddr in the mesg\n     buffer which might include any required padding and\n  2) the actual length of the sockaddr data that needs to be copied\n     into the destination field.\nThey may or may not be the same value.\n\nSizeof sockaddr_in6 is 28, which to pad for alignment purposes on 32\nbit systems with a long of 4 bytes is evenly divided and requires\nno padding. On 64 bit systems, with a long of 8 it is padded with 4\nextra bytes.So the current RTA_* macros are copying 32 bytes into a 28\nbyte field on 64 bitsystems, where the field overflow did not occur\non the 32 bit systems.\n\nSince using sa_len required the use of an #ifdef which couldn\u0027t be used\ndirectly inside a #define, it made sense to move the copy into the\nfunction to allow typdef checking throughout and eliminate the hack\nto suppress compiler warnings.\n\nFixed declaration of cp in ifm_read after compiler noticed type mismatch.\n\nTested on 64bit OS X 10.7, FreeBSD 9.0 amd64 \u0026 i386 (32bit)\nusing gcc \u0026 clang\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "3b33de676ac8e84b82f40520ecd0f4722e16b349",
      "tree": "28b0d91a6d3946ac244f7784274196a43c8fe0b9",
      "parents": [
        "7d50ad444ffadd4110152113cc9583db96b3ad67"
      ],
      "author": {
        "name": "Doug VanLeuven",
        "email": "roamdad@sonic.net",
        "time": "Wed Oct 10 22:10:14 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Mon Nov 05 11:11:36 2012 -0500"
      },
      "message": "zebra: kernel_socket: fix 64bit MacOS X alignment\n\nIn OS X 10.7 zebra crashed on invalid execution address.\n\nsockaddr padding in *_msghdr is observed to be 4 bytes in 64bit OS X.\n\nThe ROUNDUP macro assumed alignment on sizeof(long) which\nallocates 8 bytes on 64bit systems, 4 bytes on 32bit systems\nwhich is true for BSD generally.\n\nTest for Apple and use sizeof(int) which allocates 4 bytes on 32 \u0026 64bit\nsystems.\n\nTested on 64bit OS X 10.7, FreeBSD 9.0 amd64 \u0026 i386 (32bit)\nusing gcc \u0026 clang\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "7d50ad444ffadd4110152113cc9583db96b3ad67",
      "tree": "ace068bdeae6075c6aeac71884e2cf3c8e73ddc4",
      "parents": [
        "e2b1580cbc450b55491efd2cf03c967e53e63f5f"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Sat Nov 03 11:19:52 2012 -0700"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Sat Nov 03 11:21:31 2012 -0700"
      },
      "message": "doc: update installation instructions\n\nconfigure parameters have changed quite a bit, several options are\nenabled by default now and there\u0027s --disable-tests.  Update\ndocumentation to match.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "e2b1580cbc450b55491efd2cf03c967e53e63f5f",
      "tree": "111f0d828b16071d69b989c46788efbedaadabcd",
      "parents": [
        "326fe3df2c659d62fc76f8579a414ba271e7f3e9"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Sat Nov 03 09:14:29 2012 -0700"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Sat Nov 03 09:51:21 2012 -0700"
      },
      "message": "build: compile tests/ by default\n\nBroke the tests again... let\u0027s just build them by default so it\u0027s easier\nto notice.  If anyone doesn\u0027t want to build tests, there\u0027s\n--disable-tests.\n\nNB: tests will be neither run nor installed.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "326fe3df2c659d62fc76f8579a414ba271e7f3e9",
      "tree": "aa493a2e7b7d487749e2109de47b1b88b16ce3fb",
      "parents": [
        "fe9bb6459afe0d55e56619cdc5061d8407cd1f15"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Sat Nov 03 09:13:23 2012 -0700"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Sat Nov 03 09:13:23 2012 -0700"
      },
      "message": "tests: fix missing array_size() include\n\n * tests/test-sig.c: add #include \"lib/memory.h\" to get array_size()\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "fe9bb6459afe0d55e56619cdc5061d8407cd1f15",
      "tree": "0de65deb7260c93592625348219f8933efbc1d04",
      "parents": [
        "d1d3ac9bad0caf7a9c465bb382b924009f0d9168"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Thu Apr 19 20:34:13 2012 +0400"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu Nov 01 23:07:15 2012 -0700"
      },
      "message": "bgpd: CVE-2012-1820, DoS in bgp_capability_orf()\n\nAn ORF (code 3) capability TLV is defined to contain exactly one\nAFI/SAFI block. Function bgp_capability_orf(), which parses ORF\ncapability TLV, uses do-while cycle to call its helper function\nbgp_capability_orf_entry(), which actually processes the AFI/SAFI data\nblock. The call is made at least once and repeated as long as the input\nbuffer has enough data for the next call.\n\nThe helper function, bgp_capability_orf_entry(), uses \"Number of ORFs\"\nfield of the provided AFI/SAFI block to verify, if it fits the input\nbuffer. However, the check is made based on the total length of the ORF\nTLV regardless of the data already consumed by the previous helper\nfunction call(s). This way, the check condition is only valid for the\nfirst AFI/SAFI block inside an ORF capability TLV.\n\nFor the subsequent calls of the helper function, if any are made, the\ncheck condition may erroneously tell, that the current \"Number of ORFs\"\nfield fits the buffer boundary, where in fact it does not. This makes it\npossible to trigger an assertion by feeding an OPEN message with a\nspecially-crafted malformed ORF capability TLV.\n\nThis commit fixes the vulnerability by making the implementation follow\nthe spec.\n"
    },
    {
      "commit": "d1d3ac9bad0caf7a9c465bb382b924009f0d9168",
      "tree": "ee76b87f2b3b18ac109bf8b4268bfa5251ac3b34",
      "parents": [
        "b07458a055493dd37cb955ae90f11ae8bc334d3a"
      ],
      "author": {
        "name": "Avneesh Sachdev",
        "email": "avneesh@opensourcerouting.org",
        "time": "Thu Oct 04 16:21:34 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu Nov 01 23:03:24 2012 -0700"
      },
      "message": "build: reorder libraries to address linker error\n\nThe linker on some systems (for example, Ubuntu 12.04 LTS x86_64)\nappears to be sensitive to the order in which libraries are\nspecified. On these systems, if a library \u0027A\u0027 depends on a library\n\u0027B\u0027, it has to be specified before \u0027B\u0027 when linking an executable.\n\n  * zebra/Makefile.am: Make sure LIBCAP comes after libzebra.\n\n  * tests/Makefile.am: Ensure libm comes after libbgp.\n\nSigned-off-by: Avneesh Sachdev \u003cavneesh@opensourcerouting.org\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "b07458a055493dd37cb955ae90f11ae8bc334d3a",
      "tree": "d0bc403501b7cc8f7be805da9dd5d6d29846af20",
      "parents": [
        "3f0bfc9e82e0d735be2cb06d5c4a3028650637bf"
      ],
      "author": {
        "name": "Daniel Kozlowski",
        "email": "dkozlowski@sevone.com",
        "time": "Wed Sep 26 12:01:24 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu Nov 01 22:58:38 2012 -0700"
      },
      "message": "bgpd: flock() dump files (BZ#742)\n\nflock()ing the BGP dump files helps consumers determine when they\u0027re\nsafe to read.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "3f0bfc9e82e0d735be2cb06d5c4a3028650637bf",
      "tree": "1d923623eaecc1cd05fdc285f1e7874ad638985c",
      "parents": [
        "837d16ccbe0fca413f8927da6a34b1e97ccada8a"
      ],
      "author": {
        "name": "Doug VanLeuven",
        "email": "roamdad@sonic.net",
        "time": "Wed Sep 26 12:01:23 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu Nov 01 22:58:36 2012 -0700"
      },
      "message": "lib: treat OSX as BSD for IP_HDRINCL (BZ#739)\n\nMac OS X needs HAVE_IP_HDRINCL_BSD_ORDER defined like BSD. If it\u0027s not\ndefined, it\u0027ll fail like this:\n\n  *** sendmsg in ospf_write failed to 224.0.0.5, id 0, off 0, len 64,\n  interface en0, mtu 1500: Invalid argument\n\nWhich is caused by reordering iph-\u003eip_len in\nsockopt_iphdrincl_swab_htosys.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "837d16ccbe0fca413f8927da6a34b1e97ccada8a",
      "tree": "7aed5a517b619c03d11bf567f6a14cda6f8f5efe",
      "parents": [
        "655071f44aab42e89bcece3a93da456fdd0d913a"
      ],
      "author": {
        "name": "Balaji.G",
        "email": "balajig81@gmail.com",
        "time": "Wed Sep 26 14:09:10 2012 +0530"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu Oct 25 10:15:59 2012 -0700"
      },
      "message": "*: use array_size() helper macro\n\nUse the array_size() helper macro.  Replaces several instances of local\nmacros with the same definition.\n\nReviewed-by: Scott Feldman \u003csfeldma@cumulusnetworks.com\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "655071f44aab42e89bcece3a93da456fdd0d913a",
      "tree": "85c195b18df1d6e64c59a5193791d2ae7333c4a0",
      "parents": [
        "80a21dc60fa007bb00437fdc047c3e059232639f"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 08 13:32:53 2012 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu Oct 25 10:15:59 2012 -0700"
      },
      "message": "isisd: don\u0027t overrun list of protocols\n\nisisd currently has a list of supported protocols as a fixed array of\nsize 4.  this can be overran, leading to an overwrite of the ipv4_addrs\npointer.\n\n  * isisd/isis_pdu.c: don\u0027t accept more protocols than there\u0027s space for\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "80a21dc60fa007bb00437fdc047c3e059232639f",
      "tree": "884fad4cd756c73e36232b6182e46d85ba64e229",
      "parents": [
        "f02a09925db53d3e1d29b1917ebbcaa8edf72c12"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 08 13:32:12 2012 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu Oct 25 10:15:59 2012 -0700"
      },
      "message": "lib: add array_size() helper\n\nimplement array_size as sizeof(array) / sizeof(array element)\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "f02a09925db53d3e1d29b1917ebbcaa8edf72c12",
      "tree": "8c8fefac30fa372f4e04c6a9f8ceed6569f55570",
      "parents": [
        "948b6bef7f9cf841a98fe3ea40419696500c8c4c"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 08 13:15:45 2012 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu Oct 25 10:15:59 2012 -0700"
      },
      "message": "isisd: don\u0027t process invalid prefixes from TLVs\n\nit\u0027s possible to feed invalid prefixes (1.2.3.4/40 or dead::beef/200) on\nIS-IS.  if this is not checked, it will later cause an assert in\nprocessing.  let\u0027s simply abort processing the TLV if the prefix is\ninvalid.\n\n  * isisd/isis_tlv.c: check prefix lengths for validity\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "948b6bef7f9cf841a98fe3ea40419696500c8c4c",
      "tree": "9dbdadff242010472e298b624e20e52bd5625328",
      "parents": [
        "0fece074e8c9e282ae2cecf9a0a79dc6c930cfb1"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 08 06:27:04 2012 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu Oct 25 10:15:59 2012 -0700"
      },
      "message": "isisd: pull up invalid prefix assert()\n\nprocessing invalid prefixes causes isisd to assert() or otherwise\nmisbehave in ip_masklen/apply_mask.  pull up the assert() to indicate\nbetter there\u0027s broken data in isisd\u0027s LSDB.\n\n  * isisd/isis_spf.c: assert() prefix lengths\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "0fece074e8c9e282ae2cecf9a0a79dc6c930cfb1",
      "tree": "57807d45aaa0869b6b90291eedd30c084891274b",
      "parents": [
        "a22ab5a560c7a46f6ecc6feb874c0dbbde9699c6"
      ],
      "author": {
        "name": "Avneesh Sachdev",
        "email": "avneesh@opensourcerouting.org",
        "time": "Sun May 06 00:03:07 2012 -0700"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu Oct 25 10:15:59 2012 -0700"
      },
      "message": "isisd: fix null pointer dereference in send_lsp()\n\n  * isisd/isis_pdu.c: (send_lsp) Handle case where there are no LSPs\n    on the LSP transmission queue. This can happen if, for instance,\n    the queue is cleared because of protocol events before the\n    send_lsp thread gets a chance to run.\n"
    },
    {
      "commit": "a22ab5a560c7a46f6ecc6feb874c0dbbde9699c6",
      "tree": "0f2eb80dc14b21ef14e0de45e1f32d581c7186c0",
      "parents": [
        "4effc29fb1c33a87a8d386de39c20d36a6956645"
      ],
      "author": {
        "name": "Avneesh Sachdev",
        "email": "avneesh@opensourcerouting.org",
        "time": "Sat May 05 23:50:30 2012 -0700"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu Oct 25 10:15:59 2012 -0700"
      },
      "message": "isisd: tighten checks on ISIS pdu length\n\n  * isisd/isis_pdu.c: Fix problem where isisd would crash if it\n    received a LAN IIH with the \u0027pdu length\u0027 field set to zero.\n    Similar problems can occur in parsing other ISIS PDUs as well --\n    check that the PDU length in an ISIS hello, LSP or SNP packet is\n    at least as big as the size of the respective fixed header.\n"
    },
    {
      "commit": "4effc29fb1c33a87a8d386de39c20d36a6956645",
      "tree": "73e57392e4227aeae3ca3ef1db54e227f46909e6",
      "parents": [
        "b4154c145a2d1d0679983130413b81d44fbb04ab"
      ],
      "author": {
        "name": "Avneesh Sachdev",
        "email": "avneesh@opensourcerouting.org",
        "time": "Sat May 05 17:42:43 2012 -0700"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu Oct 25 10:15:58 2012 -0700"
      },
      "message": "lib: improve sanity checks in stream_set_endp()\n\n  * lib/stream.c: (stream_set_endp) Add checks to make sure that the\n    supplied \u0027endp\u0027 is within the \u0027size\u0027 of the stream, and that the\n    current read pointer \u0027getp\u0027 is not beyond the specified \u0027endp\u0027.\n"
    },
    {
      "commit": "b4154c145a2d1d0679983130413b81d44fbb04ab",
      "tree": "f46031cc4f632315fd7ebb71737c971faeb635f4",
      "parents": [
        "821755530e328182c885c98891af799926bd56bd"
      ],
      "author": {
        "name": "JR Rivers",
        "email": "jrrivers@cumulusnetworks.com",
        "time": "Mon Sep 24 17:26:53 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu Oct 25 10:15:58 2012 -0700"
      },
      "message": "ospfd: respect max-metric over configured cost for summary LSAs\n\nISSUE\n\nWhen max-metric router-lsa administrative is invoked on an ABR created with...\narea \u003carea\u003e range \u003caddr/mask\u003e\nthe summary LSAs are sent out with 65535 (max-metric) added to the normal cost.\n\nWhen max-metric router-lsa administrative is invoked on an ABR created with...\narea \u003carea\u003e range \u003caddr/mask\u003e cost \u003ccost\u003e\nthe summary LSAs are sent out with \u003ccost\u003e (the max-metric is ignored).  This\nsecond behavior effectively incapacitates the max-metric function.\n\nPATCH\n\nThis patch evaluates the state of the router and if it\u0027s isolated as a stub\nrouter (rfc3137) via `max-metric router-lsa`, we unconditionally uses the\nvalue of 0xff0000 when advertising summary LSAs.\n\nSigned-off-by: JR Rivers \u003cjrrivers@cumulusnetworks.com\u003e\nSigned-off-by: Scott Feldman \u003csfeldma@cumulusnetworks.com\u003e\nReviewed-by: Ayan Banerjee \u003cayan@cumulusnetworks.com\u003e\nReviewed-by: Dinesh Dutt \u003cddutt@cumulusnetworks.com\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "821755530e328182c885c98891af799926bd56bd",
      "tree": "5227803e0f5cd089a41c1fc06a47cef18612b6a7",
      "parents": [
        "8fc9e007ee752a982fe47311702d7ff3b9c5b5cd"
      ],
      "author": {
        "name": "JR Rivers",
        "email": "jrrivers@cumulusnetworks.com",
        "time": "Mon Sep 24 17:26:50 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu Oct 25 10:15:58 2012 -0700"
      },
      "message": "ospfd: ABR algorithm not propagating MAXAGE LSAs into area\n\nWhen a range (or sub-range) is deleted, the area is notified by propagating a\nMAXAGE LSA.  This LSA stays in the database for a while to both insure\npropagation as well as in the off chance that it\u0027s useful in the near future.\n\nUnfortunately, the ABR algorithm was treating these MAXAGE LSAs as unchanged and\nnot propagating them within the areas.\n\nSigned-off-by: JR Rivers \u003cjrrivers@cumulusnetworks.com\u003e\nSigned-off-by: Scott Feldman \u003csfeldma@cumulusnetworks.com\u003e\nReviewed-by: Dinesh Dutt \u003cddutt@cumulusnetworks.com\u003e\nReviewed-by: Shrijeet Mukherjee \u003cshm@cumulusnetworks.com\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "8fc9e007ee752a982fe47311702d7ff3b9c5b5cd",
      "tree": "8dd5ef95e303d34f1045afe538f44a07dab017d3",
      "parents": [
        "d8a4e42b7d19a87eacc00c825e913907a58f39ee"
      ],
      "author": {
        "name": "JR Rivers",
        "email": "jrrivers@cumulusnetworks.com",
        "time": "Mon Sep 24 17:26:46 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu Oct 25 10:15:58 2012 -0700"
      },
      "message": "ospfd: blackhole route removal for area range\n\nISSUE\n\nWhen an area range is created in which there the sub-area has routes that are\nsmaller than the range, an ABR creates a blackhole route to cover the range.\nWhen the range is removed, the blackhole route is not removed.\n\n--A----B----C---\n\nB is an ABR with A in area 1 and C in area 0.  If A advertises `10.2.0.0/30` and\n`10.2.0.4/30` and B is configured with `area 0.0.0.1 range 10.2.0.0/29` a\nblackhole is created on B (`blackhole 10.2.0.0/29 proto zebra`).  When the\narea/range is removed via the command line, the blackhole remains in existence\neven though the \"range\" route is removed from area 0 and the individual routes\nare propagated.\n\nPATCH\n\nThe reason for this behavior is that, prior to this patch, the range is deleted\nfrom the area\u0027s list, so when ospf_abr_manage_discard_routes() gets called,\nthere is nothing to clean up.  The patch removes the discard route as part of\nthe processing of the command line (ospf_area_range_unset()).\n\nSigned-off-by: JR Rivers \u003cjrrivers@cumulusnetworks.com\u003e\nSigned-off-by: Scott Feldman \u003csfeldma@cumulusnetworks.com\u003e\nReviewed-by: Shrijeet Mukherjee \u003cshm@cumulusnetworks.com\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "d8a4e42b7d19a87eacc00c825e913907a58f39ee",
      "tree": "2d0777bfbef0e77ca1722fe0e7b2591ef89d4102",
      "parents": [
        "b0145ddb4bf75d2c8853aa3d0bc7c522f4f17531"
      ],
      "author": {
        "name": "JR Rivers",
        "email": "jrrivers@cumulusnetworks.com",
        "time": "Thu Sep 13 17:17:36 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu Oct 25 10:15:58 2012 -0700"
      },
      "message": "lib: improve fletcher checksum validation\n\nOVERVIEW\n\nThe checksum used in OSPF (rfc2328) is specified in rc905 annex B.  There is an\nsample implementation in rfc1008 which forms the basis of the quagga\nimplementation.  This algorithm works perfectly when generating a checksum;\nhowever, validation is a bit problematic.\n\nThe following LSA (generated by a non-quagga implementation) is received by\nquagga and marked with an invalid checksum; however, it passes both the rfc905\nand rfc1008 validation checks.\n\nstatic uint8_t lsa_10_121_233_29[] \u003d {\n   0x0e, 0x10, 0x02, 0x03,\n   0x09, 0x00, 0x35, 0x40,\n   0x0a, 0x79, 0xe9, 0x1d,\n   0x80, 0x00, 0x00, 0x03,\n   0x00, 0x8a, 0x00, 0x1c,\n   0xff, 0xff, 0xff, 0xe0,\n   0x00, 0x00, 0x36, 0xb0\n};\n\nLS Type: Summary-LSA (IP network)\n   LS Age: 3600 seconds\n   Do Not Age: False\n   Options: 0x02 (E)\n   Link-State Advertisement Type: Summary-LSA (IP network) (3)\n   Link State ID: 9.0.53.64\n   Advertising Router: 10.121.233.29 (10.121.233.29)\n   LS Sequence Number: 0x80000003\n   LS Checksum: 0x008a\n   Length: 28\n   Netmask: 255.255.255.224\n   Metric: 14000\n\nYou\u0027ll note that one byte of the checksum is 0x00; quagga would calculate the\nchecksum as 0xff8a.\n\nIt can be argued that the sourcing implementation generates an incorrect\nchecksum; however, rfc905 indicates that, for 1\u0027s complement arithmetic, the\nvalue 255 shall be regarded as 0, thus either values are valid.\n\nEXPLANATION\n\nThe quagga ospfd and ospf6d implementations operate by copying the PDU\u0027s\nexisting checksum in a holding variable, calculating the checksum, and comparing\nthe resulting checksum to the original.  As a note, this implementation has the\nside effect of modifying the contents of the PDU.\n\nEvaluation of both rfc905 and rfc1008 shows that checksum validation should\ninvolve calculating the sum over the PDU and checking that both resulting C0 and\nC1 values are zero.  This behavior is enacted in the rfc1008 implementation by\ncalling encodecc with k \u003d 0 (checksum offset); however, this functionality had\nbeen omitted from the quagga implementation.\n\nPATCH\n\nThis patch adds the ability to call the quagga\u0027s fletcher_checksum() with a\nchecksum offset value of 0xffff (aka FLETCHER_CHECKSUM_VALIDATE) which returns\nthe sum over the buffer (a value of 0 indicates a valid checksum).  This is\nsimilar to the mechanism in rfc1008 when called with k \u003d 0.  The patch also\nintroduces ospf_lsa_checksum_valid().\n\nospf6d had it\u0027s own implementation of the fletcher checksum in\nospf6_lsa_checksum(); it\u0027s the same algorithm as in fletcher_checksum().  This\npatch removes the local implementation in favor of the library\u0027s as well as creates\nand uses ospf6_lsa_checksum_valid().\n\nquagga\u0027s ISIS implementation suffers from the same problem; however, I do not\nhave the facilities to validate a fix to ISIS, thus this change has been left to\nthe ISIS maintainers.  The function iso_csum_verify() should be reduced to\nrunning the fletcher checksum over the buffer using an offset of 0.\n\nSigned-off-by: JR Rivers \u003cjrrivers@cumulusnetworks.com\u003e\nReviewed-by: Scott Feldman \u003csfeldma@cumulusnetworks.com\u003e\nReviewed-by: Nolan Leake \u003cnolan@cumulusnetworks.com\u003e\nReviewed-by: Ayan Banerjee \u003cayan@cumulusnetworks.com\u003e\nReviewed-by: Shrijeet Mukherjee \u003cshm@cumulusnetworks.com\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "b0145ddb4bf75d2c8853aa3d0bc7c522f4f17531",
      "tree": "01df97d02a64742e9dbd4238f77d627c9f08eee7",
      "parents": [
        "945ea293399af6c9ff3efd07686ff30c3d2a3e8b"
      ],
      "author": {
        "name": "Nolan Leake",
        "email": "nolan@cumulusnetworks.com",
        "time": "Thu Sep 13 17:17:31 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu Oct 25 10:15:58 2012 -0700"
      },
      "message": "zebra: make static routes respect table setting\n\nMake static routes respect non-default routing tables.\n\nBEFORE PATCH\n------------\n\n! in zebra.conf\ntable 1\n\n! add static route\nvtysh\u003e ip route 10.0.0.0/30 eth0\n\ncumulus@net-top0:~$ ip route\ndefault via 192.168.0.2 dev eth0\n10.0.0.0/30 dev eth0  proto zebra\n192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.15\n\n! nothing in table 1\ncumulus@net-top0:~$ ip route show table 1\n\nAFTER PATCH\n-----------\n\n! in zebra.conf\ntable 1\n\n! add static route\nvtysh\u003e ip route 10.0.0.0/30 eth0\n\ncumulus@net-top0:~$ ip route\ndefault via 192.168.0.2 dev eth0\n192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.15\n\n! static route in table 1\ncumulus@net-top0:~$ ip route show table 1\n10.0.0.0/30 dev eth0  proto zebra\n\nSigned-off-by: Nolan Leake \u003cnolan@cumulusnetworks.com\u003e\nReviewed-by: Scott Feldman \u003csfeldma@cumulusnetworks.com\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "945ea293399af6c9ff3efd07686ff30c3d2a3e8b",
      "tree": "81f039e5b13b1f008a20e534e27c738b970c1874",
      "parents": [
        "28971c8cb1138700e87dc7da673e59b5596bb51b"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Aug 06 12:17:12 2012 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Oct 19 11:49:09 2012 +0100"
      },
      "message": "Revert \"ospfd: Do not fall back to intervening router.\"\n\nThis reverts commit 9289c6ff55cd96c943d23e43fc9e5f987aa965ed.\n\nThe commit reverted an earlier change which was fixed a bug that caused\nblack-holes to remote destinations with multiple paths, that could occur\nduring convergence. Overall, the previous code is more correct.\n"
    },
    {
      "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": "f9c1b7bb9b98342f1f3b0bfe3af01844f364dce9",
      "tree": "350c8e0d98e4dcc53b126c6ce1c7568c440fcb06",
      "parents": [
        "3eb8ef37bc463f88bfa36bd26fd43f7f6ad36c20"
      ],
      "author": {
        "name": "Avneesh Sachdev",
        "email": "avneesh@opensourcerouting.org",
        "time": "Fri Aug 17 08:19:48 2012 -0700"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed Sep 26 21:48:49 2012 +0200"
      },
      "message": "lib: prepare table code for reuse by bgp_table\n\n  * lib/table.[ch]\n\n    - Add a macro (ROUTE_NODE_FIELDS) that expands to all the fields\n      of a route_node structure.\n\n    - Add the route_table_delegate_t structure, a function vector\n      which allows clients to customize the behavior of one or more\n      tables.\n\n      The delegate currently contains the \u0027create_node\u0027 and\n      \u0027destroy_node\u0027 functions, and hence enables a table to use an\n      alternative node structure. The alternative node is expected to\n      embed the fields of a route_node using ROUTE_NODE_FIELDS.\n\n    - Add route_table_init_with_delegate() to create a new table with\n      a given delegate.\n\n    - Make route_table_init() a thin wrapper around\n      route_table_init_with_delegate(). The delegate it passes in\n      simply creates/destroys route_node structures as before.\n\n    - Add a user data pointer (info) to the route_table\n      structure. This can be used by a client to keep per-table state.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "3eb8ef37bc463f88bfa36bd26fd43f7f6ad36c20",
      "tree": "6238a10b945d98b5b06f5bf4620406579d687aa6",
      "parents": [
        "ed6e297972318a0070ad4d973401fbc6e0def558"
      ],
      "author": {
        "name": "Avneesh Sachdev",
        "email": "avneesh@opensourcerouting.org",
        "time": "Fri Aug 17 08:19:47 2012 -0700"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed Sep 26 21:48:48 2012 +0200"
      },
      "message": "lib: bring some changes over from bgp_table to table\n\n  * lib/table.c\n\n    - Maintain table node count. Expose it via the route_table_count()\n      function (from revision cbdfbaa5).\n\n    - route_unlock_node(): Add assertion (from revision 228da428).\n\n    - route_table_free(): Make static and fix up cleanup code (from\n      revision 228da428).\n\n    - route_node_delete(): Change to be static.\n\n    - Add \u0027const\u0027 qualifier in a couple places.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "ed6e297972318a0070ad4d973401fbc6e0def558",
      "tree": "cc544ec6f62a22cb2281e7665a39d469b377cc63",
      "parents": [
        "bb2315f2878da685fae094aece13409667d21f97"
      ],
      "author": {
        "name": "Serj Kalichev",
        "email": "serj.kalichev@gmail.com",
        "time": "Fri Sep 07 13:29:42 2012 +0400"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Sep 25 06:07:03 2012 +0200"
      },
      "message": "build: fix extract.pl for cross compilation\n\nextract.pl should invoke the C preprocessor for the target system, not the\nhost.\n\n* vtysh/extract.pl.in: use @CPP@ to get target cpp\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "bb2315f2878da685fae094aece13409667d21f97",
      "tree": "b8625a91196bc54e4f4f253711c611bd9212e638",
      "parents": [
        "1b54f798d3cc359bec036db83c1c9bfab75d1244"
      ],
      "author": {
        "name": "Nick Hilliard",
        "email": "nick@inex.ie",
        "time": "Sat Aug 18 15:10:57 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Sep 25 06:03:46 2012 +0200"
      },
      "message": "ripd: clear sockaddr_in before using\n\nripd_create_socket() failed in bind() on Mac OS X 10.7 since there was garbage\nin unused fields of struct sockaddr_in.\n\n* ripd/ripd.c: zero out struct sockaddr_sin from before filling.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "1b54f798d3cc359bec036db83c1c9bfab75d1244",
      "tree": "b9a63cbff8cbea31b3972cc011aca1253a526fc1",
      "parents": [
        "4bed21c402fa1079301d47811a4579985997c881"
      ],
      "author": {
        "name": "Brad Smith",
        "email": "brad@comstyle.com",
        "time": "Thu Aug 09 00:44:28 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Sep 25 05:56:04 2012 +0200"
      },
      "message": "build: fix autoconf multicast check on OpenBSD\n\nFix the \"BSD struct ip_mreq hack\" autoconf test to work with OpenBSD.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "4bed21c402fa1079301d47811a4579985997c881",
      "tree": "977e18bc3403395a33de2d5fef1d5d738fa42cf7",
      "parents": [
        "9289c6ff55cd96c943d23e43fc9e5f987aa965ed"
      ],
      "author": {
        "name": "Brad Smith",
        "email": "brad@comstyle.com",
        "time": "Thu Aug 09 00:40:09 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Sep 25 05:56:00 2012 +0200"
      },
      "message": "build: correct libtool parameter used within Makefiles\n\nThis corrects the parameters passed to libtool when linking\nthe shared libraries. The paramter name is -version-info not\n-version.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "9289c6ff55cd96c943d23e43fc9e5f987aa965ed",
      "tree": "b971fa4b0ce15e02abd27a62548d53371e4cc0b2",
      "parents": [
        "ba281d3d04053b7c59ecdfdbea91a62c09e9f8a4"
      ],
      "author": {
        "name": "Joakim Tjernlund",
        "email": "Joakim.Tjernlund@transmode.se",
        "time": "Sat Jul 07 17:06:14 2012 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed Jul 25 18:07:45 2012 +0200"
      },
      "message": "ospfd: Do not fall back to intervening router.\n\nThe patch in bug 330 did two things. It add a return value\nwhether ospf_nexthop_calculation() failed or not and also\nmoved the return stmt for 16.1.1 para 5 so now SPF\nwill fallback to the intervening router when no back links are found\nby 16.1.1 para 5. This is wrong and can potentially create black holes\nor routing loops according to Dave Katz and Acee Lindem at ospf@ietf.org\n\nEven if the current code could be proved to be harmless in all cases,\nit adds substantial extra processing and memory allocations.\n\nSigned-off-by: Joakim Tjernlund \u003cJoakim.Tjernlund@transmode.se\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "ba281d3d04053b7c59ecdfdbea91a62c09e9f8a4",
      "tree": "3ada2bf381bef8a571776a3e54879c8d1aa8f149",
      "parents": [
        "c963c20346c0e3cd75735b88beded98389607cd5"
      ],
      "author": {
        "name": "Joakim Tjernlund",
        "email": "Joakim.Tjernlund@transmode.se",
        "time": "Sat Jul 07 17:06:13 2012 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed Jul 25 18:07:45 2012 +0200"
      },
      "message": "ospfd: use ZEBRA_NEXTHOP_IPV4_IFINDEX\n\nOSPF really needs to specify interface in its routes. Otherwise\nospf may change the wrong route.\n\nSigned-off-by: Joakim Tjernlund \u003cJoakim.Tjernlund@transmode.se\u003e\n[fixed up some whitespace errors, split patch in two]\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "c963c20346c0e3cd75735b88beded98389607cd5",
      "tree": "24973f9f7859e03fafdbaec0921d5c279597a1f2",
      "parents": [
        "57c639f01ec6be70ac858f412d32b638a9756bed"
      ],
      "author": {
        "name": "Joakim Tjernlund",
        "email": "Joakim.Tjernlund@transmode.se",
        "time": "Sat Jul 07 17:06:13 2012 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed Jul 25 18:07:44 2012 +0200"
      },
      "message": "zebra: Add support for ZEBRA_NEXTHOP_IPV4_IFINDEX\n\nActually implement the IPV4_IFINDEX nexthop type that has been drifting\naround as a definition forever (without any warning about it being a\nplaceholder).\n\nSigned-off-by: Joakim Tjernlund \u003cJoakim.Tjernlund@transmode.se\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "57c639f01ec6be70ac858f412d32b638a9756bed",
      "tree": "cd415e8d098b827d69dcfdf3d3b22f5df11cc4c9",
      "parents": [
        "c81ee5c94f5b34375f3ef276fdb9bde9098e7ecb"
      ],
      "author": {
        "name": "Joakim Tjernlund",
        "email": "Joakim.Tjernlund@transmode.se",
        "time": "Sat Jul 07 17:06:12 2012 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed Jul 25 18:07:37 2012 +0200"
      },
      "message": "ospf_spf_process_stubs: use LSA pos to find OSFP interface\n\nThis is better than a prefix lookup as prefixes may not be\nunique, that is, the same prefix can exist on several interfaces.\n\nSigned-off-by: Joakim Tjernlund \u003cJoakim.Tjernlund@transmode.se\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "c81ee5c94f5b34375f3ef276fdb9bde9098e7ecb",
      "tree": "dad1ab0d81b72a7c7a869bc7dc051b703deec9be",
      "parents": [
        "7b92589c225ae46417fc3fa0714a1b6f53f19c51"
      ],
      "author": {
        "name": "Joakim Tjernlund",
        "email": "Joakim.Tjernlund@transmode.se",
        "time": "Sat Jul 07 17:06:11 2012 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed Jul 25 18:07:30 2012 +0200"
      },
      "message": "ospfd: Optimize and improve SPF nexthop calculation\n\nMaintain router LSA positions in OSPF interface.\nFind the OSPF interface in nexthop_calculation using\nthe position in the router LSA. This is possible because\nthe only time nexthop_calculation needs to look up interfaces\nis when dealing with its own Router LSA.\n\nThis has the following advantages:\n - Multiple PtP interfaces with the same IP address between two routers.\n - Use Unnumbered PtP on just one end of the link.\n - Faster OI lookup for the OSPF interface and only\n   done once for PtoP links.\n\n*ospf_interface.h: (struct ospf_interface) Add storage for\n\t\t   storing router LSA position.\n\n*ospf_interface.c: (ospf_if_lookup_by_lsa_pos)\n\t\t   lookup OSPF I/F in an area using LSA position.\n\n*ospf_lsa.c: (router_lsa_link_set) record Router LSA position.\n\n*ospf_spf.c: (ospf_spf_next) Count and pass along lsa position.\n\t     (ospf_nexthop_calculation) Add lsa position argument.\n\t     call ospf_if_lookup_by_lsa_pos() for OSFP interface handle.\n\t     Clean up and remove all calls ospf_if_is_configured() the\n\t     rest. Adjust a few debug logs.\n\nSigned-off-by: Joakim Tjernlund \u003cJoakim.Tjernlund@transmode.se\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "7b92589c225ae46417fc3fa0714a1b6f53f19c51",
      "tree": "38e1add198ee857211684250858a3b946c05c6a9",
      "parents": [
        "aa5cf24b9de96245f2166ef1c4e9612890ced1b3"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Mon Jul 23 18:17:57 2012 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed Jul 25 18:02:31 2012 +0200"
      },
      "message": "ospfd: avoid exhausting memory with OSPF vertices (BZ#476)\n\nThis was found in scale testing at OSR;  ospfd is adding the same link\nover and over again to the SPF tree.  This fix prevents the resulting\nmemory corruption from happening and adds a debug message to track\noccurence of this issue and/or confirm a proper fix.\n\n(This version was improved by Scott Feldman over the earlier RFC.)\n\n* ospfd/ospf_spf.c: (ospf_spf_add_parent) loop over existing vertices\n  and refuse to add duplicates.\n\nTested-by: Martin Winter \u003cmwinter@opensourcerouting.org\u003e\nSigned-off-by: Scott Feldman \u003csfeldma@cumulusnetworks.com\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "aa5cf24b9de96245f2166ef1c4e9612890ced1b3",
      "tree": "fc8a8895286c635764e2d409b7ab6567a5b9ee6f",
      "parents": [
        "ee1ac2d52a6656e589ca2fb4feb3ec5fd366ecb7"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu Jul 19 16:11:50 2012 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu Jul 19 16:15:50 2012 +0200"
      },
      "message": "lib: make IPv6 prefix parser slightly more strict\n\nThis makes it possible to have both \"show babel route A.B.C.D/M\"\nand \"show babel route X:X::X:X/M\" commands at the same time without\nthe parser complaining about ambiguity.\n\n* lib/command.c: only accept STATE_DOT after : was seen.\n\nReported-by: Juliusz Chroboczek \u003cjch@pps.jussieu.fr\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "ee1ac2d52a6656e589ca2fb4feb3ec5fd366ecb7",
      "tree": "164ab37de3c091f9bcb18f07d82c01d41d345238",
      "parents": [
        "7f062c217b262e362a3362c677dea6c5e820adf1"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu Jul 19 12:58:59 2012 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu Jul 19 13:00:29 2012 +0200"
      },
      "message": "build: fix isisd topology out of tree build\n\nisisd got the include directory wrong on building with a separate build\ndirectory.\n\n  * configure.ac: adjust ISIS_TOPOLOGY_INCLUDES\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "7f062c217b262e362a3362c677dea6c5e820adf1",
      "tree": "a74cb6fa04df4af9f60d770de5e485c37ba2866d",
      "parents": [
        "1080c13f5d3979149c1950a1c46f45e2d4bd0dc8"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@diac24.net",
        "time": "Mon Feb 01 16:41:26 2010 +0100"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Fri Jul 13 18:54:09 2012 +0200"
      },
      "message": "zebra: lingering IP address after deletion (BZ#486)\n\nzebra address bookkeeping is a mess. this is just a workaround to have\nIPv4 address deletion somewhat working on Linux.\n\nthe if_unset_prefix call is synchronous, when it returns success the\naddress deletion completed successfully. this is either signaled by a\nnetlink ACK or by an OK return value from ioctl().\n\nThis version is wrapped by #ifdef HAVE_NETLINK so we don\u0027t touch the\nBSDs for now.\n\n* zebra/interface.c: On Linux, update zebra internal state after\n  deleting an address.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "1080c13f5d3979149c1950a1c46f45e2d4bd0dc8",
      "tree": "8f2147dfed3514607041e2167d4facab620c8643",
      "parents": [
        "f710888ddd413730f6025ed5d9a89b124836cde6"
      ],
      "author": {
        "name": "Joachim Nilsson",
        "email": "troglobit@gmail.com",
        "time": "Wed May 30 08:15:48 2012 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Fri Jul 13 18:53:53 2012 +0200"
      },
      "message": "configure: Add --with-pkg-extra-version\u003dVER for packagers/distributions.\n\nThis change adds a --with-pkg-extra-version option to ./configure to allow\npackagers and distributions to fine tune the version displayed to the end\nuser to assist in support. It is also very useful when reporting bugs on\nthe official Quagga mailing lists.\n\nThere are two ways of utilsing this functionality:\n\n      a) ./configure --with-pkg-extra-version\u003d-wmo1\n      b) EXTRAVERSION\u003d-wmo1 ./configure\n\nThe latter is a common way for many distributions to add extra version\nstrings to signify their own patch level to a given package.\n\nAlso, minor whitespace fix in configure summary.\n\nSigned-off-by: Joachim Nilsson \u003cjoachim.nilsson@westermo.se\u003e\nSigned-off-by: Joachim Nilsson \u003ctroglobit@gmail.com\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "f710888ddd413730f6025ed5d9a89b124836cde6",
      "tree": "be0dd0aaec834c52372b6914f4f87260acb2b219",
      "parents": [
        "18a4e3715f89337ac8b70f6f63cc131c3218c82c",
        "0402ca4e92fa0904d5ee0926482ebca08ffd5c81"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Fri Jul 13 14:05:55 2012 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Fri Jul 13 14:05:58 2012 +0200"
      },
      "message": "Merge remote branch \u0027vincentbernat/feature/ospfv3-mib\u0027\n"
    },
    {
      "commit": "18a4e3715f89337ac8b70f6f63cc131c3218c82c",
      "tree": "1b38b2eae4e1cee042f96a42217b14647159bf0f",
      "parents": [
        "a47c5838e9f445ab887ad927706b11ccbb181364",
        "8046ba6ec4d6e87bf8da6563c0f3e5e66c4652b3"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Fri Jul 13 14:05:36 2012 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Fri Jul 13 14:05:40 2012 +0200"
      },
      "message": "Merge remote branch \u0027vincentbernat/feature/agentx\u0027\n"
    },
    {
      "commit": "0402ca4e92fa0904d5ee0926482ebca08ffd5c81",
      "tree": "be0dd0aaec834c52372b6914f4f87260acb2b219",
      "parents": [
        "bf836661ef8ef880350bc41f0a82566ed5075066"
      ],
      "author": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Tue Jul 10 09:27:57 2012 +0200"
      },
      "committer": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Tue Jul 10 09:27:57 2012 +0200"
      },
      "message": "ospf6d: fix segfault when requesting inexistant interfaces or areas\n"
    },
    {
      "commit": "bf836661ef8ef880350bc41f0a82566ed5075066",
      "tree": "09fe0cfd070a3984860b1ffc89020caba892eff4",
      "parents": [
        "c349bb86927d1f5fc8aa8ebc6f553786f8e70634"
      ],
      "author": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Mon Jun 04 14:36:12 2012 +0200"
      },
      "committer": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Mon Jun 25 19:05:17 2012 +0200"
      },
      "message": "ospf6d: add SNMP notifications/traps support\n\nOnly implement ospfv3NbrStateChange and ospfv3IfStateChange.\n"
    },
    {
      "commit": "c349bb86927d1f5fc8aa8ebc6f553786f8e70634",
      "tree": "5560db37b8512a550dd33a7217577b54bf1cad15",
      "parents": [
        "3bc4f84efe147ebc65fccbe898b81d78341c542b"
      ],
      "author": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Mon Jun 04 12:59:20 2012 +0200"
      },
      "committer": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Mon Jun 25 19:05:17 2012 +0200"
      },
      "message": "ospf6d: add SNMP support for ospfv3*LsdbTable\n\nThis includes:\n - ospfv3AsLsdbTable\n - ospfv3AreaLsdbTable\n - ospfv3LinkLsdbTable\n"
    },
    {
      "commit": "3bc4f84efe147ebc65fccbe898b81d78341c542b",
      "tree": "cfe0f904c134fdb7659f6a47897aff88208d2ddd",
      "parents": [
        "ea86e4042b7459fbf5d96835c509cb743bf013c0"
      ],
      "author": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Mon Jun 04 11:40:04 2012 +0200"
      },
      "committer": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Mon Jun 25 19:05:17 2012 +0200"
      },
      "message": "ospf6d: add SNMP implementation of ospfv3IfTable\n"
    },
    {
      "commit": "ea86e4042b7459fbf5d96835c509cb743bf013c0",
      "tree": "7cf527b8084fd7ede72503d6aad273eaf73261e6",
      "parents": [
        "2c5f148065c074d51ff10808a2b6ac2b3296a828"
      ],
      "author": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Mon Jun 04 10:29:49 2012 +0200"
      },
      "committer": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Mon Jun 25 19:05:17 2012 +0200"
      },
      "message": "ospf6d: complete SNMP implementation of ospfv3AreaTable\n"
    },
    {
      "commit": "2c5f148065c074d51ff10808a2b6ac2b3296a828",
      "tree": "ef554e9c520765f8f38bea807753aef77c88f541",
      "parents": [
        "061bc735b4fb3b8768fa5f52295d85838ed55770"
      ],
      "author": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Fri Jun 01 11:38:34 2012 +0200"
      },
      "committer": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Mon Jun 25 19:05:16 2012 +0200"
      },
      "message": "ospf6d: complete SNMP implementation for scalar objects\n"
    },
    {
      "commit": "061bc735b4fb3b8768fa5f52295d85838ed55770",
      "tree": "80f74a55bfbd93d9111d5b49676bcea11a91285e",
      "parents": [
        "0f0ab5180877559e92b71daacb8a106a815a5ade"
      ],
      "author": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Thu May 31 20:21:15 2012 +0200"
      },
      "committer": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Mon Jun 25 19:05:16 2012 +0200"
      },
      "message": "ospf6d: add SNMP support for ospfv3NbrTable\n"
    },
    {
      "commit": "0f0ab5180877559e92b71daacb8a106a815a5ade",
      "tree": "2553d47180fceebc1e3180f33645410d21173233",
      "parents": [
        "8046ba6ec4d6e87bf8da6563c0f3e5e66c4652b3"
      ],
      "author": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Tue May 22 13:34:24 2012 +0200"
      },
      "committer": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Mon Jun 25 19:05:16 2012 +0200"
      },
      "message": "snmp: fix OSPFV3-MIB implementation\n\nUse the real MIB from RFC 5643. Fix used ASN1 types. Indexes are not\nexported any more (they are \"no access\"). Fix some endian\nissues. Also, ID are just integers, not IPv4 addresses.\n\nNo additional OID are supported in this commit.\n"
    },
    {
      "commit": "8046ba6ec4d6e87bf8da6563c0f3e5e66c4652b3",
      "tree": "1b38b2eae4e1cee042f96a42217b14647159bf0f",
      "parents": [
        "0ff4b9c96793898429052de576d8da368e48997e"
      ],
      "author": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Thu May 31 13:30:28 2012 +0200"
      },
      "committer": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Mon Jun 25 19:03:23 2012 +0200"
      },
      "message": "snmp: let handlers accept OID from a lesser prefix\n\nMost table handlers do not expect to be given an OID whose prefix is\noutside what they can handle. This is not a problem with the SMUX\nimplementation since it always correct the OID such that the prefix\nmatches. However, this is not the case for the AgentX\nimplementation. A new function, smux_header_table() is used to do this\nnormalization.\n"
    },
    {
      "commit": "0ff4b9c96793898429052de576d8da368e48997e",
      "tree": "17a95f8a3182bc57cc3f00e92ade41ba49223b72",
      "parents": [
        "b7c0d0651cd64f644d02ef5e4d1b82febe7e57d8"
      ],
      "author": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Fri May 25 12:04:51 2012 +0200"
      },
      "committer": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Mon Jun 25 19:03:23 2012 +0200"
      },
      "message": "agentx: add appropriate documentation\n"
    },
    {
      "commit": "b7c0d0651cd64f644d02ef5e4d1b82febe7e57d8",
      "tree": "5480eff7b8581e1168d23657da0f30e23100d7bc",
      "parents": [
        "b8cf46b715b2c21db5dce8118c70b4dd9b5255a3"
      ],
      "author": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Fri May 25 11:17:01 2012 +0200"
      },
      "committer": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Mon Jun 25 19:03:23 2012 +0200"
      },
      "message": "agentx: handle SNMP traps\n\nsmux_trap() signature has been changed to provide appropriate level\ninformation to send SNMPv2 notifications. This includes the addition\nof the enterprise OID to use (from which is derived the SNMP trap OID)\nand the MIB registry to locate the appropriate function for variable\nbindings provided by the trap.\n\nThe SMUX implementation has been updated but ignore the provided\nenterprise OID. Instead, it still uses the SMUX peer OID to keep\ncompatibility with previous versions of Quagga. The SMUX\nimplementation also ignores the provided MIB registry since it uses\nsmux_get() function to grab the appropriate values. This is not\npossible with the AgentX implementation since there is no such\nfunction provided by NetSNMP.\n"
    },
    {
      "commit": "b8cf46b715b2c21db5dce8118c70b4dd9b5255a3",
      "tree": "61fea7fd6d75345f5224e36d8ca33badc9d39b17",
      "parents": [
        "4b89e45d928d41bb5d32a00ba7b402d6a3bbdf44"
      ],
      "author": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Fri May 25 08:56:44 2012 +0200"
      },
      "committer": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Mon Jun 25 19:03:23 2012 +0200"
      },
      "message": "smux: drop findVar element from trap object struct\n\nThis element was not unused.\n"
    },
    {
      "commit": "4b89e45d928d41bb5d32a00ba7b402d6a3bbdf44",
      "tree": "7471ad396e285ff5b0ca3d85600f3c184f43dd2c",
      "parents": [
        "d6be5fb9bc41ea77547204eeedd12132b26ad662"
      ],
      "author": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Thu May 24 21:22:01 2012 +0200"
      },
      "committer": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Mon Jun 25 19:03:23 2012 +0200"
      },
      "message": "smux: remove `tick` argument from smux_trap()\n\nsmux_trap() contains an argument whose use appears to be to set\nsysUpTime.0/timestamp field in SNMP trap. However, this value is not\nused in smux_trap(). Moreover, it is expected that this field is the\nvalue of sysUpTime.0 when the trap was sent and not any other time\nrelated to the trap. To avoid any confusion, we remove this field from\nthe signature of the function.\n"
    },
    {
      "commit": "d6be5fb9bc41ea77547204eeedd12132b26ad662",
      "tree": "dfe0f2a92faf6bd7d5b5b5f7b8006014a03e5469",
      "parents": [
        "3a4c96885ec878ae4631b0fb7bb7839578725976"
      ],
      "author": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Thu May 24 09:44:43 2012 +0200"
      },
      "committer": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Mon Jun 25 19:03:23 2012 +0200"
      },
      "message": "agentx: add AgentX support to Quagga.\n\n--enable-snmp will enable AgentX support in Quagga. SMUX is still here\nand can be enabled with --enable-snmp\u003dsmux. AgentX support can be\nenabled with \"agentx\" in configuration file. As for SMUX, this command\nis not understood by vtysh. It can be disabled with \"no agentx\",\nthough there is no real use of this since this command cannot be used\nwith vtysh.\n\nIf \"agentx\" and \"no agentx\" command were added to vtysh, it would not\nbe possible to disable agentx support after enabling it because\nNetSNMP does not expose the appropriate methods for this.\n\nThe internals of AgentX are hidden by NetSNMP. Therefore, we don\u0027t\nhave a file descriptor to add to the threading system. We do not have\nthe timers to set either. Therefore, the event loop is modified to\nmake use of snmp_select_info() from NetSNMP.\n\nTraps are not supported yet.\n"
    },
    {
      "commit": "3a4c96885ec878ae4631b0fb7bb7839578725976",
      "tree": "0b0334f9b6b7fce2bc2ebe2fac0c51350c1838de",
      "parents": [
        "08d7f6533ecc0f935a76918c462982004534864d"
      ],
      "author": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Wed May 23 00:52:46 2012 +0200"
      },
      "committer": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Mon Jun 25 19:03:23 2012 +0200"
      },
      "message": "smux: isolate SMUX implementation from SNMP implementation\n\nlib/snmp.c gets OID related helper functions that can be used with\nanother SNMP interface. smux.h is cleaned of SMUX specific bits to\nonly expose functions that may be used by an alternative\nimplementation. We also do not redefine functions already present in\nNetSNMP. Just use the appropriate headers.\n"
    },
    {
      "commit": "08d7f6533ecc0f935a76918c462982004534864d",
      "tree": "0e67590a8a2aba551439c46bfa8b33d7fba4feb7",
      "parents": [
        "6b1e37f8537fa2a4560de32e83ca5089763e2d39"
      ],
      "author": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Tue May 22 22:29:17 2012 +0200"
      },
      "committer": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Mon Jun 25 19:03:23 2012 +0200"
      },
      "message": "build: use net-snmp-config to configure NetSNMP\n\nThe correct method to link to NetSNMP is to use net-snmp-config (which\nis like pkg-config). Explicit link to libcrypto is also dropped\n(NetSNMP libs are linked to libcrypto, no need to link Quagga to\nit). Moreover, @SNMP_INCLUDES@ is dropped because useless. Due to a\nbug in configure.ac, it was properly populated.\n"
    },
    {
      "commit": "6b1e37f8537fa2a4560de32e83ca5089763e2d39",
      "tree": "941dfbfbe62981ec214ac1e5a3f607368f4bf1d4",
      "parents": [
        "9e7a548ce421660b0d22bfeb90c2b2b53742aac7"
      ],
      "author": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Tue May 22 22:15:20 2012 +0200"
      },
      "committer": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Mon Jun 25 19:03:23 2012 +0200"
      },
      "message": "build: only define HAVE_SNMP\n\nNetSNMP is the only SNMP implementation for Quagga. We don\u0027t need two\ndifferent symbols.\n"
    },
    {
      "commit": "9e7a548ce421660b0d22bfeb90c2b2b53742aac7",
      "tree": "4c962403808f98806781fb4ad15594152bc1effa",
      "parents": [
        "a47c5838e9f445ab887ad927706b11ccbb181364"
      ],
      "author": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Tue May 22 14:32:22 2012 +0200"
      },
      "committer": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Mon Jun 25 19:03:23 2012 +0200"
      },
      "message": "build: allow configure and build in a separate directory\n\nSome .h files in lib/ are autogenerated. The search path should\ninclude the build directory and the source directory. They usually\nmatch but sometimes, they may be different. For example:\n\n $ mkdir build\n $ cd build\n $ ../configure\n $ make\n"
    },
    {
      "commit": "a47c5838e9f445ab887ad927706b11ccbb181364",
      "tree": "a11b4e361978c0c342806c0bb59fbcc6ae325227",
      "parents": [
        "bb782fb50efcd972d4357f9a7164de2c317d2eef"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu Jun 21 09:55:38 2012 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu Jun 21 09:57:54 2012 +0200"
      },
      "message": "isisd: fix typo in topology generator (BZ#731)\n\nThere was a \"lsp-\u003e\" missing before \"level\" in line 2416.\n(introduced by git commit e38e0df)\n\nReported-by: Seblu \u003cseblu@seblu.net\u003e\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": "e2c38e6c9767e30d5683022653b1cf91b186f9d4",
      "tree": "692f274468ac2075d70a7da87888935ab545a44b",
      "parents": [
        "c9e4f8623642fc005c97830256000bef5680aa26"
      ],
      "author": {
        "name": "Jorge Boncompte [DTI2]",
        "email": "jorge@dti2.net",
        "time": "Wed Jun 20 17:45:50 2012 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu Jun 21 09:48:56 2012 +0200"
      },
      "message": "bgpd: Fix for commit 6a4677b7, fixes BZ#729\n\n  The timers are rearmed after events processing. After 6a4677b7 we\ndo not generate events that can rearm the holdtime timer.\n\n  Fix it\u0027s to call bgp_timer_set() directly as it\u0027s done from bgp_event().\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": "c9e4f8623642fc005c97830256000bef5680aa26",
      "tree": "00a40a75d31cf30727c6dabf8066054e72092647",
      "parents": [
        "cccbc0151883cfb4f43d6fa0a4a3caedc27e6cf5"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Thu Jun 14 10:42:39 2012 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue Jun 19 13:40:22 2012 +0100"
      },
      "message": "tests: BGP unit tests to set BGP_OPT_NO_LISTEN so they can run\n\nBGP tests had been broken by auto-creation of listen socket. This allows\nthem to run at least, though at least 1 test seems to have other breakage,\naspath_test.\n"
    },
    {
      "commit": "cccbc0151883cfb4f43d6fa0a4a3caedc27e6cf5",
      "tree": "0c0296eb09551c556717e93250e5492fc1c7c85f",
      "parents": [
        "2fb2a455263c569119ca32be59b0337a3d8cd9b3"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Thu Jun 14 10:40:26 2012 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Thu Jun 14 17:30:14 2012 +0100"
      },
      "message": "bgpd: Add \"no listen\" socket option for the BGP master configuration\n\n* bgpd.h: add a BGP_OPT_NO_LISTEN option for the master BGP configuration,\n  to prevent any listen socket being created automatically. Allows code\n  to be used outside of BGP daemon settings.\n* bgpd.c: (bgp_get) honour above the flag, suppress auto-creation of listen\n  socket on first BGP instance if set.\n  (bgp_option_set) whitelist BGP_OPT_NO_LISTEN\n"
    },
    {
      "commit": "2fb2a455263c569119ca32be59b0337a3d8cd9b3",
      "tree": "79f895f78cd4adb43dde3ba3996e8a04a8deac42",
      "parents": [
        "ad12dde6f9596997337ebc210dd2d4593438556b"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Thu Jun 14 10:37:40 2012 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Thu Jun 14 10:37:40 2012 +0100"
      },
      "message": "lib: Add back sockunion_str2su\n\n* sockunion.h: Add back sockunion_str2su, its removal breaks things needlessly\n  (e.g. our own unit tests).\n* sockunion.c: (sockunion_str2su) implement on top of str2sockunion.\n"
    },
    {
      "commit": "ad12dde6f9596997337ebc210dd2d4593438556b",
      "tree": "661e013c488b2f7003b8b817d680fa9d03f4eb30",
      "parents": [
        "22714f99c4ffeb4d1bade7ad6374adeba0e06e4c"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jun 13 22:50:07 2012 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jun 13 22:50:07 2012 +0100"
      },
      "message": "Revert \"bgpd: Make socket init separate, so unit tests work again.\"\n\nThis reverts commit 7621f336e2f346edee43227f0b1ef93fe769720b. See bug #727\n"
    },
    {
      "commit": "22714f99c4ffeb4d1bade7ad6374adeba0e06e4c",
      "tree": "43b6e720bc05ad1bc5748d8d8a08c725a7fe6a90",
      "parents": [
        "64018324d5e5071eea3b3f72f939d91dc7aef029"
      ],
      "author": {
        "name": "Jorge Boncompte [DTI2]",
        "email": "jorge@dti2.net",
        "time": "Mon May 07 16:53:14 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 22 20:50:14 2012 +0200"
      },
      "message": "lib: do not allocate/free thread funcnames\n\n  This avoids memory heap fragmentation and imposses less load on the\nsystem memory allocator.\n\n* thread.h: FUNCNAME_LEN defined to 64 (ISO C99 says max 63)\n\nSigned-off-by: Jorge Boncompte [DTI2] \u003cjorge@dti2.net\u003e\n[changed FUNCNAME_LEN to a less arbitrary value]\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "64018324d5e5071eea3b3f72f939d91dc7aef029",
      "tree": "faa7378fe45c6a11cf5198ba182f9bf54f3022f5",
      "parents": [
        "41af338ecd56b9891d996f0fc850e02318b0c01a"
      ],
      "author": {
        "name": "Jorge Boncompte [DTI2]",
        "email": "jorge@dti2.net",
        "time": "Mon May 07 16:53:13 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 22 20:35:51 2012 +0200"
      },
      "message": "lib: micro-op for thread_get()\n\nthread_trim_head() already checks that the list is not empty.\n\nSigned-off-by: Jorge Boncompte [DTI2] \u003cjorge@dti2.net\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "41af338ecd56b9891d996f0fc850e02318b0c01a",
      "tree": "8543da475e3e82e6a63a8e2c8d8f0175bc447c2d",
      "parents": [
        "47d3b6078a6c885e03d28bae3397b71a827473f5"
      ],
      "author": {
        "name": "Jorge Boncompte [DTI2]",
        "email": "jorge@dti2.net",
        "time": "Mon May 07 16:53:12 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 22 20:35:51 2012 +0200"
      },
      "message": "lib: remove RUSAGE_T from struct thread\n\n* thread.c: It\u0027s only temporarily used in thread_call() to calculate the\n  diffs. Saves 80 bytes per copy.\n\nSigned-off-by: Jorge Boncompte [DTI2] \u003cjorge@dti2.net\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "47d3b6078a6c885e03d28bae3397b71a827473f5",
      "tree": "b3a6a1de537c9be50c839cf088be89ee91c6b38e",
      "parents": [
        "f018db83a0746f9336d04e50dd06f3bbf6565f1c"
      ],
      "author": {
        "name": "Jorge Boncompte [DTI2]",
        "email": "jorge@dti2.net",
        "time": "Mon May 07 16:53:11 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 22 20:35:51 2012 +0200"
      },
      "message": "micro-op bgp_node_[get|lookup]() and route_node_[get|lookup]()\n\n  Reduce indirection for values that doesn\u0027t change in the loop.\n\nSigned-off-by: Jorge Boncompte [DTI2] \u003cjorge@dti2.net\u003e\n[adjusted after dropping previous patch]\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": "6a4677b723b6f79997ca15ee202c36d528d3dfcf",
      "tree": "d1928cd0835791b91870bfb9e4fb9eea3c75b07b",
      "parents": [
        "577ac57b78e0ee3cbc5afdb5f54a660bd0126136"
      ],
      "author": {
        "name": "Jorge Boncompte [DTI2]",
        "email": "jorge@dti2.net",
        "time": "Mon May 07 16:53:07 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 22 20:35:47 2012 +0200"
      },
      "message": "bgpd: optimize holdtime timer cancelling\n\n* bgp_packet.c: (bgp_update_receive) for every update received we queue\n  an event just to cancel the holdtime timer, done in bgp_fsm_update().\n  Instead cancel the timer directly an avoid a scheduling pass.\n\n  This incidently fixes another problem found on a slow box, where thousands\nof events threads were queued, and run, but never freed, because they are\nmoved to the unused list that grows without bounds.\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": "489d005a9ad94675f40dc7bceff6176cfad36d45",
      "tree": "c11edc9588fc1fd4ccef33f168a7367d0a34db65",
      "parents": [
        "6182d65b23fc0362b173e2a9314fa4551523a1c2"
      ],
      "author": {
        "name": "Jorge Boncompte [DTI2]",
        "email": "jorge@dti2.net",
        "time": "Mon May 07 16:53:03 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 22 20:25:49 2012 +0200"
      },
      "message": "bgpd: use on stack struct attr_extra in bgp_update_receive()\n\nReduce memory heap fragmentation and pressure on the memory allocator.\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": "b9f1dca10f9a9bf853a9999a117c8cdeec5b7b69",
      "tree": "b6382403ba177cb56f0ca6054db1ce32428fd7f2",
      "parents": [
        "1a2fd7078f943e2207ee0f1b0dafdcd2d9c81925"
      ],
      "author": {
        "name": "Jorge Boncompte [DTI2]",
        "email": "jorge@dti2.net",
        "time": "Mon May 07 16:53:01 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 22 20:25:49 2012 +0200"
      },
      "message": "bgpd: use on stack struct attr_extra in bgp_attr_unintern()\n\n  Reduce memory heap fragmentation and pressure on the memory allocator.\n\nSigned-off-by: Jorge Boncompte [DTI2] \u003cjorge@dti2.net\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "1a2fd7078f943e2207ee0f1b0dafdcd2d9c81925",
      "tree": "da0852c5c4019c6c1893dec384e9f20df26cea29",
      "parents": [
        "938ef3a22535292dd36c250e5329f97d977e51df"
      ],
      "author": {
        "name": "Jorge Boncompte [DTI2]",
        "email": "jorge@dti2.net",
        "time": "Mon May 07 16:53:00 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 22 20:25:49 2012 +0200"
      },
      "message": "bgpd: cleanup bgp_attr_unintern()\n\nSigned-off-by: Jorge Boncompte [DTI2] \u003cjorge@dti2.net\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "938ef3a22535292dd36c250e5329f97d977e51df",
      "tree": "a854c21dd840e7558a482bf4812b857583da3591",
      "parents": [
        "7fb0cd82c26492004a106bec7ca4afdf4684fabb"
      ],
      "author": {
        "name": "Jorge Boncompte [DTI2]",
        "email": "jorge@dti2.net",
        "time": "Mon May 07 16:52:59 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 22 20:25:49 2012 +0200"
      },
      "message": "bgpd: use on stack struct attr_extra on bgp_attr_aggregate_intern()\n\nReduce memory heap fragmentation and pressure on the memory allocator.\n\nSigned-off-by: Jorge Boncompte [DTI2] \u003cjorge@dti2.net\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "7fb0cd82c26492004a106bec7ca4afdf4684fabb",
      "tree": "1f901bbc121337b9c421eb48d7bcc413ad140753",
      "parents": [
        "e16a413313cf985ae2b8d2f1a9e8fd0ab6f5b9fc"
      ],
      "author": {
        "name": "Jorge Boncompte [DTI2]",
        "email": "jorge@dti2.net",
        "time": "Mon May 07 16:52:58 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 22 20:25:49 2012 +0200"
      },
      "message": "bgpd: reduce attrhash_make_key() indirections\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": "c76275ee960c708408646d8a680b201b27cb9c1a",
      "tree": "59daf9a650950d35aa5350270118cd94e4a1fde3",
      "parents": [
        "6d85b15bbb2fd3c263d5d4b402c88ff348af877b"
      ],
      "author": {
        "name": "Jorge Boncompte [DTI2]",
        "email": "jorge@dti2.net",
        "time": "Mon May 07 16:52:55 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 22 20:25:44 2012 +0200"
      },
      "message": "bgpd: optimize loops on [e]community_hash_make()\n\n  This change reduces loop count. Less jumps.\n\n* bgp_community.c: One loop per community.\n* bgp_ecommunity.c: One loop per ecommunity.\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": "14542f3edaa43113880e8bb69612c553f02bdf22",
      "tree": "247dd2b8ef6e1cea2d91d39989a943fddfb481ca",
      "parents": [
        "10f9bf3f2021f874e574e4ebae9413bee982ed2b"
      ],
      "author": {
        "name": "Jorge Boncompte [DTI2]",
        "email": "jorge@dti2.net",
        "time": "Mon May 07 16:52:53 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 22 20:25:10 2012 +0200"
      },
      "message": "bgpd: debug buffers cleanup and optimization\n\nJust the first change pushes bgp_update_receive() from 6th to ~14th on a\nfull internet table load profiling session.\n\n* bgp_debug.c: (bgp_update_receive) The attrstr initialization is expensive,\n  moved under the debug conditional where it is used and just initialize the\n  first char to NULL.\n  (bgp_update_default_send) Initialize attrstr needed for bgp_dump_attr().\n  Moved some buffers used for printing IP[4|6] addresses under the debug\n  conditionals that use them and reduced its size.\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"
    }
  ],
  "next": "f669f7d25f0f491d5e487897227ff434aef20406"
}
