)]}'
{
  "log": [
    {
      "commit": "9487b4fcfc0754109e49240214e283fd58756843",
      "tree": "fba1723ffa40f3d9749b764056166e355542f7eb",
      "parents": [
        "cd557c3d766a7233490b8cf7325219ffa1398ef2"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Sat May 23 18:16:50 2015 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jul 29 21:44:07 2015 +0100"
      },
      "message": "watchquagga.c does not compile without warnings\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "cd557c3d766a7233490b8cf7325219ffa1398ef2",
      "tree": "b69b7c4a2639e5acc6bdc457bbfa4752732afc28",
      "parents": [
        "08d95905acd0cbb810831429b638ac2d1604ca37"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Wed May 27 17:40:46 2015 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jul 29 21:44:02 2015 +0100"
      },
      "message": "pim: \u0027show debugging\u0027 collision\n\nThe \u0027show debugging\u0027 cli as setup by pim collided with \u0027show debugging isis\u0027.\nFix that and clean up cli help commands to actually display correctly.\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "08d95905acd0cbb810831429b638ac2d1604ca37",
      "tree": "c756e8f530aaaa2b24a3b1f50196895401eed218",
      "parents": [
        "4de398e3b676bcf041984e285dba12f229215419"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Wed May 27 17:57:31 2015 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jul 29 21:43:51 2015 +0100"
      },
      "message": "Fixup of redhat control files to properly start pimd\n"
    },
    {
      "commit": "4de398e3b676bcf041984e285dba12f229215419",
      "tree": "e06791bda93d63d30f9187c5df8064f0f1fa9f29",
      "parents": [
        "4eaecdc403461fe59026e1ce3a217526d75eca25"
      ],
      "author": {
        "name": "Joakim Tjernlund",
        "email": "Joakim.Tjernlund@transmode.se",
        "time": "Mon Mar 08 13:58:14 2010 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jul 29 21:43:08 2015 +0100"
      },
      "message": "ospfd: ospf_nbr_nbma_set()/ospf_snmp_vl_add() add unlock\n\nSigned-off-by: Joakim Tjernlund \u003cJoakim.Tjernlund@transmode.se\u003e\nAcked-by: Feng Lu \u003clu.feng@6wind.com\u003e\n"
    },
    {
      "commit": "4eaecdc403461fe59026e1ce3a217526d75eca25",
      "tree": "fcb6ae38db620f25a5931a1867c48c0396d5d564",
      "parents": [
        "fc363cd8a02ad1ac8a6ca57013fd8c531d45926a"
      ],
      "author": {
        "name": "Joakim Tjernlund",
        "email": "Joakim.Tjernlund@transmode.se",
        "time": "Mon Mar 08 13:58:13 2010 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jul 29 21:43:03 2015 +0100"
      },
      "message": "ospfd: ospf_ls_upd_send() add missing unlock.\n\nSigned-off-by: Joakim Tjernlund \u003cJoakim.Tjernlund@transmode.se\u003e\nAcked-by: Feng Lu \u003clu.feng@6wind.com\u003e\n"
    },
    {
      "commit": "fc363cd8a02ad1ac8a6ca57013fd8c531d45926a",
      "tree": "fc821d3992d87c8b85d244ceece7f004f8a06f72",
      "parents": [
        "d5643f5a477e099a3dcae4a707ccb5ca66bfee66"
      ],
      "author": {
        "name": "Joakim Tjernlund",
        "email": "Joakim.Tjernlund@transmode.se",
        "time": "Mon Mar 08 13:58:12 2010 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jul 29 21:42:58 2015 +0100"
      },
      "message": "ospfd: ospf_ase.c, external_lsa locking fixes.\n\nSigned-off-by: Joakim Tjernlund \u003cJoakim.Tjernlund@transmode.se\u003e\nAcked-by: Feng Lu \u003clu.feng@6wind.com\u003e\n"
    },
    {
      "commit": "d5643f5a477e099a3dcae4a707ccb5ca66bfee66",
      "tree": "9c82ee88bc3173ca327f392e13862300d76f6148",
      "parents": [
        "fbb6c8650344fe72d39f538c681659e8b76a39d0"
      ],
      "author": {
        "name": "Joakim Tjernlund",
        "email": "Joakim.Tjernlund@transmode.se",
        "time": "Mon Mar 08 13:58:10 2010 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jul 29 21:42:54 2015 +0100"
      },
      "message": "ospfd: Move route_unlock_node() in ospf_ase_incremental_update()\n\nSigned-off-by: Joakim Tjernlund \u003cJoakim.Tjernlund@transmode.se\u003e\nAcked-by: Feng Lu \u003clu.feng@6wind.com\u003e\n"
    },
    {
      "commit": "fbb6c8650344fe72d39f538c681659e8b76a39d0",
      "tree": "0b896f15681a030f69d42ab7b8c061c0ee3627b5",
      "parents": [
        "94266fa822baf9b9c9e10ac03ccec8ccf3ce0c98"
      ],
      "author": {
        "name": "Joakim Tjernlund",
        "email": "Joakim.Tjernlund@transmode.se",
        "time": "Mon Mar 08 13:58:09 2010 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jul 29 21:42:45 2015 +0100"
      },
      "message": "ospfd: add missing unlock for ospf_interface_address_delete()\n\nSigned-off-by: Joakim Tjernlund \u003cJoakim.Tjernlund@transmode.se\u003e\nAcked-by: Feng Lu \u003clu.feng@6wind.com\u003e\n"
    },
    {
      "commit": "94266fa822baf9b9c9e10ac03ccec8ccf3ce0c98",
      "tree": "61cc2746b57155d6ba932aa6bdde44a40cb8d4e8",
      "parents": [
        "7f56743f7d4b3dcdae329de2de2aba820368c3d9"
      ],
      "author": {
        "name": "Joakim Tjernlund",
        "email": "Joakim.Tjernlund@transmode.se",
        "time": "Thu Nov 19 15:27:30 2009 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jul 29 21:40:32 2015 +0100"
      },
      "message": "ospfd: Self nbrs needs to be rebuilt when router ID changes.\n\nSome self nbrs are identified by router_id, these needs\nto be rebuilt instead of just resetting router ID.\nPossibly one could optimize for !(virtual | ptop) links\nby doing oi-\u003enbr_self-\u003erouter_id \u003d router_id instead.\n\nRouter ID will change once after startup config has been\nread and zebra reports router ID, unless router ID has\nbeen configured in ospf.\n"
    },
    {
      "commit": "7f56743f7d4b3dcdae329de2de2aba820368c3d9",
      "tree": "22f257e60e1bf6361f35b89307d51a82554e2339",
      "parents": [
        "b1891fb9705b6085f81269dec0795f2065442047"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Fri Jun 12 17:47:26 2015 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sun Jun 21 14:56:56 2015 +0100"
      },
      "message": "pimd assert when no route to source from a new igmp join\n\nWhen pim_upstream_new is called the code looks up the nexthop.\nIf there is no route to the source, the code silently ignored\nthe error returned.  When the nexthop lookup fails don\u0027t create\nthe \u0027struct pim_stream *\u0027 to return.\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "b1891fb9705b6085f81269dec0795f2065442047",
      "tree": "002bccbf21caf38ec1dab8f36020b3eab7356a30",
      "parents": [
        "1934e7895ded8d9d7a76ab3f482c381bf5f6725c"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Tue Jun 09 20:22:42 2015 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sun Jun 21 14:56:55 2015 +0100"
      },
      "message": "Add code to extract.pl.in to prevent further cli function overwrites\n\nCurrently extract.pl.in is used to build the vtysh cli.  When two\ndifferent cli\u0027s collide with the same command name, the original\ncli is never called, because it is dropped.  This code notes the\nsilent drop and tracks the number of drops.  If they change then\nthe code will fail the build.  The current number of drops was\nfigured out by running extract.pl and counting up the drops\nthen adding code to compare the numbers returned.\n\nIf you have added to the problem, the solution is to fix your cli\ncommand to not stomp on someone else\u0027s command.  If you have removed\na stomp, safely modify extract.pl.in as part of your commit.\n\nSigned-off-by: Donald Sharp \u003csharpd at cumulusnetworks.com\u003e\nAcked-by: Vincent Jardin \u003cvincent.jardin@6wind.com\u003e\n"
    },
    {
      "commit": "1934e7895ded8d9d7a76ab3f482c381bf5f6725c",
      "tree": "96631dc7dc52c9ed6f2143675d0e95885df8fcfc",
      "parents": [
        "f31bab4fbf367a4417784ba9873e524d42242036"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Fri Jun 05 12:15:44 2015 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sun Jun 21 14:56:16 2015 +0100"
      },
      "message": "pim_mroute.h has a different version of code than linux/mroute.h provides\n\nlinux/mroutes.h and pim_mroute.h both have copies of the same structures.\nThis is causing failures in setsockopt(..., MRT_ADD_MFC,...) because\nof data structure incompatibilities between the kernel and what\npim_mroute.h was providing.  Modify the code to check for mroute.h\nand include it if necessary.  I did not modify the non linux/mroute.h\npath because I do not have other systems to test on easily.\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "f31bab4fbf367a4417784ba9873e524d42242036",
      "tree": "c624feca43613e738e4756ad6b3b555c1402e465",
      "parents": [
        "771626860adfc30c00f70d993ccb8f4d7c0c0c63"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Fri Jun 19 19:26:19 2015 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sun Jun 21 14:39:26 2015 +0100"
      },
      "message": "Quagga: Fix code to use srandom/random\n\nQuagga was using a mix of srand/rand and srandom/random.\nConsolidate to use srandom/random which are the POSIX\nversions of random number generators\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "771626860adfc30c00f70d993ccb8f4d7c0c0c63",
      "tree": "86335b9708c5d88c1709c36386bf72d04843d6ec",
      "parents": [
        "1ed8ce47b922b71f3b3cdd661e647bbe7ed2eca7"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Fri Jun 19 19:26:18 2015 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sun Jun 21 14:39:22 2015 +0100"
      },
      "message": "PIMD: Fix code to use srandom/random\n\npimd rolled it\u0027s own solution to random #\u0027s, that was not\nterribly random.  Rely on the underlying system to generate\nrandom #\u0027s for us\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "1ed8ce47b922b71f3b3cdd661e647bbe7ed2eca7",
      "tree": "8991923fd48342254db78275f2776480b824e18d",
      "parents": [
        "84c3840c7157438b5cb2e324d184ca08ac07fb41"
      ],
      "author": {
        "name": "Wenjian Ma",
        "email": "ytmwjian@163.com",
        "time": "Fri Jun 19 10:53:26 2015 +0800"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sun Jun 21 12:32:29 2015 +0100"
      },
      "message": "lib, stream: fix stream sanity checks\n\nBecause  operator \"!\" has higher priority  than \"\u0026\u0026\",\nSo we put the \"\u0026\u0026\" expression in \"()\" to check both getp and endp.\nAcked-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "84c3840c7157438b5cb2e324d184ca08ac07fb41",
      "tree": "1022dc746e3c2f6498ebc94a632ce3f4f2f0c32e",
      "parents": [
        "55cfa2f190620f7c711944637659bc208970324d"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@opensourcerouting.org",
        "time": "Tue May 26 15:19:38 2015 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sun Jun 21 12:31:53 2015 +0100"
      },
      "message": "bgpd: peer_uptime overflows after 1 year\n\n* bgpd.c: (peer_uptime) Wraps after 1 year, and doesn\u0027t indicate years.\n  Fix. Assume a year is 365 days, for an easy life.\n\nFixes: Bug #836\nReported-by: Rolf Hanßen\nAcked-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "55cfa2f190620f7c711944637659bc208970324d",
      "tree": "13e8a607e6e552da0f4218b4a8473dbcd738845b",
      "parents": [
        "c99f3481a598e9cadd1de96714f6b5df9ad85c4a"
      ],
      "author": {
        "name": "Feng Lu",
        "email": "lu.feng@6wind.com",
        "time": "Thu Jul 03 18:24:34 2014 +0800"
      },
      "committer": {
        "name": "Nicolas Dichtel",
        "email": "nicolas.dichtel@6wind.com",
        "time": "Wed Jun 03 17:26:27 2015 +0200"
      },
      "message": "lib, vtysh: support multiple VRFs by using linux netns\n\nWe realize VRFs with linux netns by default. The main job is\nto associate a VRF with a netns. Currently this is done by\nthe configuration:\n\n  [no] vrf N netns \u003cnetns-name\u003e\n\nThis command is also available in vtysh and goes to only\nzebra, because presently only zebra supports multiple VRF.\n\nA file descriptor is added to \"struct vrf\". This is for the\nassociated netns file. Once the command \"vrf N netns NAME\"\nis executed, the specified file is opened and the file\ndescriptor is stored in the VRF N. In this way the\nassociation is formed.\n\nIn vrf_socket(), we first switch to the specified VRF by\nusing the stored file descriptor, and then can allocate\na socket which is working in the associated netns.\n\nSigned-off-by: Feng Lu \u003clu.feng@6wind.com\u003e\nReviewed-by: Alain Ritoux \u003calain.ritoux@6wind.com\u003e\nSigned-off-by: Nicolas Dichtel \u003cnicolas.dichtel@6wind.com\u003e\n"
    },
    {
      "commit": "c99f3481a598e9cadd1de96714f6b5df9ad85c4a",
      "tree": "aac6df566f28c13fce5c9f02275f159fab73a24d",
      "parents": [
        "758fb8f99a7bfac3d31c419fd1a5694fc5f33f6a"
      ],
      "author": {
        "name": "Feng Lu",
        "email": "lu.feng@6wind.com",
        "time": "Thu Oct 16 09:52:36 2014 +0800"
      },
      "committer": {
        "name": "Nicolas Dichtel",
        "email": "nicolas.dichtel@6wind.com",
        "time": "Wed Jun 03 10:24:12 2015 +0200"
      },
      "message": "*: add VRF ID in the API message header\n\nThe API messages are used by zebra to exchange the interfaces, addresses,\nroutes and router-id information with its clients. To distinguish which\nVRF the information belongs to, a new field \"VRF ID\" is added in the\nmessage header. And hence the message version is increased to 3.\n\n* The new field \"VRF ID\" in the message header:\n\n    Length    (2 bytes)\n    Marker    (1 byte)\n    Version   (1 byte)\n    VRF ID    (2 bytes, newly added)\n    Command   (2 bytes)\n\n  - Client side:\n\n    - zclient_create_header() adds the VRF ID in the message header.\n    - zclient_read() extracts and validates the VRF ID from the header,\n      and passes the VRF ID to the callback functions registered to\n      the API messages.\n    - All relative functions are appended with a new parameter \"vrf_id\",\n      including all the callback functions.\n    - \"vrf_id\" is also added to \"struct zapi_ipv4\" and \"struct zapi_ipv6\".\n      Clients need to correctly set the VRF ID when using the API\n      functions zapi_ipv4_route() and zapi_ipv6_route().\n    - Till now all messages sent from a client have the default VRF ID\n      \"0\" in the header.\n    - The HELLO message is special, which is used as the heart-beat of\n      a client, and has no relation with VRF. The VRF ID in the HELLO\n      message header will always be 0 and ignored by zebra.\n\n  - Zebra side:\n\n    - zserv_create_header() adds the VRF ID in the message header.\n    - zebra_client_read() extracts and validates the VRF ID from the\n      header, and passes the VRF ID to the functions which process\n      the received messages.\n    - All relative functions are appended with a new parameter \"vrf_id\".\n\n* Suppress the messages in a VRF which a client does not care:\n\n  Some clients may not care about the information in the VRF X, and\n  zebra should not send the messages in the VRF X to those clients.\n\n  Extra flags are used to indicate which VRF is registered by a client,\n  and a new message ZEBRA_VRF_UNREGISTER is introduced to let a client\n  can unregister a VRF when it does not need any information in that\n  VRF.\n\n  A client sends any message other than ZEBRA_VRF_UNREGISTER in a VRF\n  will automatically register to that VRF.\n\n  - lib/vrf:\n\n    A new utility \"VRF bit-map\" is provided to manage the flags for\n    VRFs, one bit per VRF ID.\n\n    - Use vrf_bitmap_init()/vrf_bitmap_free() to initialize/free a\n      bit-map;\n    - Use vrf_bitmap_set()/vrf_bitmap_unset() to set/unset a flag\n      in the given bit-map, corresponding to the given VRF ID;\n    - Use vrf_bitmap_check() to test whether the flag, in the given\n      bit-map and for the given VRF ID, is set.\n\n  - Client side:\n\n    - In \"struct zclient\", the following flags are changed from\n      \"u_char\" to \"vrf_bitmap_t\":\n          redist[ZEBRA_ROUTE_MAX]\n          default_information\n      These flags are extended for each VRF, and controlled by the\n      clients themselves (or with the help of zclient_redistribute()\n      and zclient_redistribute_default()).\n\n  - Zebra side:\n\n    - In \"struct zserv\", the following flags are changed from\n      \"u_char\" to \"vrf_bitmap_t\":\n          redist[ZEBRA_ROUTE_MAX]\n          redist_default\n          ifinfo\n          ridinfo\n\n      These flags are extended for each VRF, as the VRF registration\n      flags. They are maintained on receiving a ZEBRA_XXX_ADD or\n      ZEBRA_XXX_DELETE message.\n\n      When sending an interface/address/route/router-id message in\n      a VRF to a client, if the corresponding VRF registration flag\n      is not set, this message will not be dropped by zebra.\n\n    - A new function zread_vrf_unregister() is introduced to process\n      the new command ZEBRA_VRF_UNREGISTER. All the VRF registration\n      flags are cleared for the requested VRF.\n\n  Those clients, who support only the default VRF, will never receive\n  a message in a non-default VRF, thanks to the filter in zebra.\n\n* New callback for the event of successful connection to zebra:\n\n  - zclient_start() is splitted, keeping only the code of connecting\n    to zebra.\n\n  - Now zclient_init()\u003d\u003ezclient_connect()\u003d\u003ezclient_start() operations\n    are purely dealing with the connection to zbera.\n\n  - Once zebra is successfully connected, at the end of zclient_start(),\n    a new callback is used to inform the client about connection.\n\n  - Till now, in the callback of connect-to-zebra event, all clients\n    send messages to zebra to request the router-id/interface/routes\n    information in the default VRF.\n\n    Of corse in future the client can do anything it wants in this\n    callback. For example, it may send requests for both default VRF\n    and some non-default VRFs.\n\nSigned-off-by: Feng Lu \u003clu.feng@6wind.com\u003e\nReviewed-by: Alain Ritoux \u003calain.ritoux@6wind.com\u003e\nSigned-off-by: Nicolas Dichtel \u003cnicolas.dichtel@6wind.com\u003e\nAcked-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "758fb8f99a7bfac3d31c419fd1a5694fc5f33f6a",
      "tree": "4aa860a2b96ec03622376bf3753840155ab478fe",
      "parents": [
        "d6cf5134c05a7890738411852d9357ee5bb322f3"
      ],
      "author": {
        "name": "Feng Lu",
        "email": "lu.feng@6wind.com",
        "time": "Thu Jul 03 18:23:09 2014 +0800"
      },
      "committer": {
        "name": "Nicolas Dichtel",
        "email": "nicolas.dichtel@6wind.com",
        "time": "Wed Jun 03 10:23:32 2015 +0200"
      },
      "message": "zebra, lib/memtypes.c: the netlink sockets work per VRF\n\nThis patch lets the netlink sockets work per VRF.\n\n* The definition of \"struct nlsock\" is moved into zebra/rib.h.\n\n* The previous global variables \"netlink\" and \"netlink_cmd\" now\n  become the members of \"struct zebra_vrf\", and are initialized\n  in zebra_vrf_alloc().\n\n* All relative functions now work for a specific VRF, by adding\n  a new parameter which specifies the working VRF, except those\n  functions in which the VRF ID can be obtained from the interface.\n\n* kernel_init(), interface_list() and route_read() are now also\n  working per VRF, and moved from main() to zebra_vrf_enable().\n\n* A new function kernel_terminate() is added to release the\n  netlink sockets. It is called from zebra_vrf_disable().\n\n* Correct VRF ID, instead of the previous VRF_DEFAULT, are now\n  passed to the functions of processing interfaces or route\n  entries.\n\nSigned-off-by: Feng Lu \u003clu.feng@6wind.com\u003e\nReviewed-by: Alain Ritoux \u003calain.ritoux@6wind.com\u003e\nSigned-off-by: Nicolas Dichtel \u003cnicolas.dichtel@6wind.com\u003e\nAcked-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "d6cf5134c05a7890738411852d9357ee5bb322f3",
      "tree": "d39b1880b82497d68b1d44623278eec27f4ef349",
      "parents": [
        "49f76097fc191761db8482aa3bf6e6322c52c647"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Jun 02 08:31:38 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Jun 02 08:31:38 2015 +0200"
      },
      "message": "zebra: fix VRF code for *BSD\n\nThere seems to be no rtm_table in struct rt_msghdr, at least on the\nsystems I have access to...\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "49f76097fc191761db8482aa3bf6e6322c52c647",
      "tree": "c7aef97b17e3dd41b19fa53535ecf1a9ca8aafb9",
      "parents": [
        "267ceb2ce3adf4ce1357deb7ce48f151d6c58b92"
      ],
      "author": {
        "name": "Feng Lu",
        "email": "lu.feng@6wind.com",
        "time": "Fri May 22 11:40:10 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Jun 02 07:48:34 2015 +0200"
      },
      "message": "zebra: maintain RTADV per VRF\n\nThis moves the global variable \"rtadv\" into the \"struct zebra_vrf\",\nso that RTADV feature can work per VRF.\n\n* rtadv.c/rtadv.h:\n\n  Add a proper parameter to the functions so that the entity of the\n  \"struct zebra_vrf\" and interfaces can be obtained from the specified\n  VRF.\n\n  The old rtadv_init() is splitted into:\n  - rtadv_cmd_init(): it installs the RTADV commands; is called from\n                      main();\n  - new rtadv_init(): it creates the socket; is called from\n                      zebra_vrf_enable().\n\n  rtadv_terminate() is added to stop the threads, close the socket and\n  clear the counters. It is called from zebra_vrf_disable().\n\n  rtadv_make_socket() now calls vrf_socket() to create a socket in\n  the VRF.\n\n* interface.h and rib.h: define the macro RTADV.\n* main.c: according changes, refer to rtadv.c.\n\nSigned-off-by: Feng Lu \u003clu.feng@6wind.com\u003e\nReviewed-by: Alain Ritoux \u003calain.ritoux@6wind.com\u003e\nSigned-off-by: Nicolas Dichtel \u003cnicolas.dichtel@6wind.com\u003e\nAcked-by: Vincent JARDIN \u003cvincent.jardin@6wind.com\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "267ceb2ce3adf4ce1357deb7ce48f151d6c58b92",
      "tree": "0b86ed01d5d2ea61f0bb509a60cad32916de061e",
      "parents": [
        "fb2bfc1ba2416c1561bc9bfb30dfb5adf3e65616"
      ],
      "author": {
        "name": "Feng Lu",
        "email": "lu.feng@6wind.com",
        "time": "Fri May 22 11:40:09 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Jun 02 07:48:34 2015 +0200"
      },
      "message": "zebra: add hooks upon enabling / disabling a VRF\n\nzebra_vrf_enable() is the callback for VRF_ENABLE_HOOK.\nIt presently needs do nothing.\n\nzebra_vrf_disable() is the callback for VRF_DISABLE_HOOK.\nIt presently withdraws routes, shuts down interfaces, and\nclears the router-id candidates in that VRF.\n\nSigned-off-by: Feng Lu \u003clu.feng@6wind.com\u003e\nReviewed-by: Alain Ritoux \u003calain.ritoux@6wind.com\u003e\nSigned-off-by: Nicolas Dichtel \u003cnicolas.dichtel@6wind.com\u003e\nAcked-by: Vincent JARDIN \u003cvincent.jardin@6wind.com\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "fb2bfc1ba2416c1561bc9bfb30dfb5adf3e65616",
      "tree": "361484e61445a5e7efc9dfab2d6c47cd4c63846c",
      "parents": [
        "ac19a449261bf69e83827f4bb0c6e5526277b41b"
      ],
      "author": {
        "name": "Feng Lu",
        "email": "lu.feng@6wind.com",
        "time": "Fri May 22 11:40:08 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Jun 02 07:48:34 2015 +0200"
      },
      "message": "lib/vrf: enable / disable a VRF\n\nA new API vrf_is_enabled() is defined to check whether a VRF is ready\nto use, that is, to allocate resources in that VRF. Currently there\u0027s\nonly one type of resource: socket.\n\nTwo new hooks VRF_ENABLE_HOOK/VRF_DISABLE_HOOK are introduced to tell\nthe user when a VRF gets ready or to be unavailable.\n\nThe VRF_ENABLE_HOOK callback is called in the new function vrf_enable(),\nwhich is used to let the VRF be ready to use. Till now, only the default\nVRF can be enabled, and we need do nothing to enable the default, except\ncalling the hook.\n\nThe VRF_DISABLE_HOOK callback is called in the new function\nvrf_disable(), which is used to let the VRF be unusable. Till now,\nit is called only when the VRF is to be deleted.\n\nA new utility vrf_socket() is defined to provide a socket in a given\nVRF to the user.\n\nTill now before introducing a way of VRF realization, only the default\nVRF is enabled since its birth, and vrf_socket() creates socket for\nonly the default VRF.\n\nThis patch defines the framework of the VRF APIs. The way they serve\nthe users is:\n- vrf_is_enabled() is used to tell the user whether a VRF is usable;\n- users are informed by the VRF_ENABLE_HOOK that a VRF gets usable;\n  they can allocate resources after that;\n- users are informed by the VRF_DISABLE_HOOK that a VRF is to be\n  unavailable, and they must release the resources instantly;\n- vrf_socket() is used to provide a socket in a given VRF.\n\nSigned-off-by: Feng Lu \u003clu.feng@6wind.com\u003e\nReviewed-by: Alain Ritoux \u003calain.ritoux@6wind.com\u003e\nSigned-off-by: Nicolas Dichtel \u003cnicolas.dichtel@6wind.com\u003e\nAcked-by: Vincent JARDIN \u003cvincent.jardin@6wind.com\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "ac19a449261bf69e83827f4bb0c6e5526277b41b",
      "tree": "a93cc7cde55a9c0c65da4b09fc309b503807ffda",
      "parents": [
        "7aaf4ea990398335bd40b56cc9586ab6a7178a4f"
      ],
      "author": {
        "name": "Feng Lu",
        "email": "lu.feng@6wind.com",
        "time": "Fri May 22 11:40:07 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Jun 02 07:48:34 2015 +0200"
      },
      "message": "zebra: maintain the router-id per VRF\n\nA router may need different identifier among the VRFs. So move the\nmaintenance of router-id per VRF.\n\n* rib.h:\n\n  Move the previous global variables in router-id.c into the\n  \"struct zebra_vrf\":\n  - struct list _rid_all_sorted_list/*rid_all_sorted_list\n  - struct list _rid_lo_sorted_list/*rid_lo_sorted_list\n  - struct prefix rid_user_assigned\n\n* router-id.c/router-id.h:\n\n  A new parameter \"vrf_id\" is added to all the router-id APIs.\n  Their operations are done only within the specified VRF.\n\n  A new command \"router-id A.B.C.D vrf N\" is added to allow\n  manual router-id for any VRF.\n\n  The old router_id_init() function is splitted into two:\n  - router_id_cmd_init(): it only installs the commands\n  - router_id_init(): this new one initializes the variables for\n                      a specified VRF\n\n* zebra_rib.c: Add new functions zebra_vrf_get/lookup() called\n               from router-id.c.\n\n* main.c: Replace router_id_init() with router_id_cmd_init() and\n          call the new router_id_init() in zebra_vrf_new().\n\nSigned-off-by: Feng Lu \u003clu.feng@6wind.com\u003e\nReviewed-by: Alain Ritoux \u003calain.ritoux@6wind.com\u003e\nSigned-off-by: Nicolas Dichtel \u003cnicolas.dichtel@6wind.com\u003e\nAcked-by: Vincent JARDIN \u003cvincent.jardin@6wind.com\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "7aaf4ea990398335bd40b56cc9586ab6a7178a4f",
      "tree": "12800739e1a926cff27d4d676323be35318ef8ac",
      "parents": [
        "8970f74ec77f93eb862ab8803d9d7c76c7128940"
      ],
      "author": {
        "name": "Feng Lu",
        "email": "lu.feng@6wind.com",
        "time": "Fri May 22 11:40:06 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Jun 02 07:48:34 2015 +0200"
      },
      "message": "zebra: configure static routes in any VRF\n\nIntroduce new commands to configure static routes in any VRF, by\nappending the old static route commands with a new parameter\n\"vrf N\".\n\nA new parameter \"const char *vrf_id_str\" is added to the functions\nzebra_static_ipv4() and static_ipv6_func() to get the configured\nVRF ID.\n\nA new member \"vrf_id\" is added to the \"struct static_ipv4\" and\n\"struct static_ipv6\", indicating which VRF this static route is\nconfigured in.\n\nBut till now, no interface can exist in any non-default VRF. So\nthese static routes in non-default VRFs are kept inactive.\n\nSigned-off-by: Feng Lu \u003clu.feng@6wind.com\u003e\nReviewed-by: Alain Ritoux \u003calain.ritoux@6wind.com\u003e\nSigned-off-by: Nicolas Dichtel \u003cnicolas.dichtel@6wind.com\u003e\nAcked-by: Vincent JARDIN \u003cvincent.jardin@6wind.com\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "8970f74ec77f93eb862ab8803d9d7c76c7128940",
      "tree": "9659720ad515d0aea454ab42bc424ea34150f7b9",
      "parents": [
        "1885d0a5274cd78e46ad6c22171a5240a2f27f64"
      ],
      "author": {
        "name": "Feng Lu",
        "email": "lu.feng@6wind.com",
        "time": "Fri May 22 11:40:05 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Jun 02 07:48:34 2015 +0200"
      },
      "message": "zebra: lookup the address in all VRFs when set the route-map rule \"set src\"\n\nWhen configuring the route-map rule \"set src A.B.C.D\", it checked\nwhether the source address exists on some interface.\n\nNow it checks the source address throughout all VRFs.\n\nSigned-off-by: Feng Lu \u003clu.feng@6wind.com\u003e\nReviewed-by: Alain Ritoux \u003calain.ritoux@6wind.com\u003e\nSigned-off-by: Nicolas Dichtel \u003cnicolas.dichtel@6wind.com\u003e\nAcked-by: Vincent JARDIN \u003cvincent.jardin@6wind.com\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "1885d0a5274cd78e46ad6c22171a5240a2f27f64",
      "tree": "acaf9496dcdd722400d5634e58180f17350cc0b6",
      "parents": [
        "4364ee5b6f65008fe19225f05e489ad8257a7df8"
      ],
      "author": {
        "name": "Feng Lu",
        "email": "lu.feng@6wind.com",
        "time": "Fri May 22 11:40:04 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Jun 02 07:48:34 2015 +0200"
      },
      "message": "zebra: let the route-map rule \"match interface\" work for VRFs\n\nIntroduce a new \"struct nexthop_vrfid\" to specify a nexthop together\nwith the VRF ID it belongs to.\n\nThus in route_match_interface(), we can lookup the interface from\nthe correct VRF.\n\nSigned-off-by: Feng Lu \u003clu.feng@6wind.com\u003e\nReviewed-by: Alain Ritoux \u003calain.ritoux@6wind.com\u003e\nSigned-off-by: Nicolas Dichtel \u003cnicolas.dichtel@6wind.com\u003e\nAcked-by: Vincent JARDIN \u003cvincent.jardin@6wind.com\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "4364ee5b6f65008fe19225f05e489ad8257a7df8",
      "tree": "dd6b5e9e5e5e7cf5c212b3b9182d6231d8166e97",
      "parents": [
        "0d0686f98e64017415071e590bde262f0ab5a4c9"
      ],
      "author": {
        "name": "Feng Lu",
        "email": "lu.feng@6wind.com",
        "time": "Fri May 22 11:40:03 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Jun 02 07:48:30 2015 +0200"
      },
      "message": "zebra: show routes in a specified VRF or all VRFs\n\nThe present \"show ip[v6] [m]route [xxx]\" and \"show ip rpf [xxx]\"\ncommands now show routes only in the default VRF.\n\nA new option is introduced to show routes in a specified VRF:\n    show ip[v6] [m]route [xxx] vrf N\n    show ip rpf [xxx] vrf N\n\nand a new option is used to show routes through all VRFs:\n    show ip[v6] [m]route [xxx] vrf all\n    show ip rpf [xxx] vrf all\n\nSigned-off-by: Feng Lu \u003clu.feng@6wind.com\u003e\nReviewed-by: Alain Ritoux \u003calain.ritoux@6wind.com\u003e\nSigned-off-by: Nicolas Dichtel \u003cnicolas.dichtel@6wind.com\u003e\nAcked-by: Vincent JARDIN \u003cvincent.jardin@6wind.com\u003e\n[DL: conflicts resolved]\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "0d0686f98e64017415071e590bde262f0ab5a4c9",
      "tree": "a8ffef2548d24ce9a7662a20573d2a26a8e17142",
      "parents": [
        "a2854770ff839553c9444193e84a1593645fa848"
      ],
      "author": {
        "name": "Feng Lu",
        "email": "lu.feng@6wind.com",
        "time": "Fri May 22 11:40:02 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Jun 02 07:46:17 2015 +0200"
      },
      "message": "zebra: let FIB stand for its respective VRF\n\nA new member \"vrf_id\" is added to \"struct rib\", reflecting the VRF\nwhich it belongs to.\n\nA new parameter \"vrf_id\" is added to the relative functions where\nneed, except those:\n- which already have the parameter \"vrf_id\"; or\n- which have a parameter in type of \"struct rib\"; or\n- which have a parameter in type of \"struct interface\".\n\nAll incoming routes are set to default VRF.\n\nIn fact, all routes in FIB are kept in default VRF. And the logic\nis not changed.\n\nSigned-off-by: Feng Lu \u003clu.feng@6wind.com\u003e\nReviewed-by: Alain Ritoux \u003calain.ritoux@6wind.com\u003e\nSigned-off-by: Nicolas Dichtel \u003cnicolas.dichtel@6wind.com\u003e\nAcked-by: Vincent JARDIN \u003cvincent.jardin@6wind.com\u003e\n[DL: conflicts fixed + compile warning fix]\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "a2854770ff839553c9444193e84a1593645fa848",
      "tree": "f10e20591ccf74ae1e5a9015cb9dd6aadfecd67d",
      "parents": [
        "471ea39ce54537194ff2f22420589ddec5ef5ada"
      ],
      "author": {
        "name": "Feng Lu",
        "email": "lu.feng@6wind.com",
        "time": "Fri May 22 11:40:01 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Jun 02 07:22:58 2015 +0200"
      },
      "message": "zebra: show interfaces in a specified VRF or all VRFs\n\nThe following commands only show interfaces in the default VRF:\n    show interface\n    show interface IFNAME\n    show interface description\n\nNew options are introduced to show interfaces in a specified VRF:\n    show interface vrf N\n    show interface IFNAME vrf N\n    show interface description vrf N\n\nor all VRFs:\n    show interface vrf all\n    show interface IFNAME vrf all\n    show interface description vrf all\n\nSigned-off-by: Feng Lu \u003clu.feng@6wind.com\u003e\nReviewed-by: Alain Ritoux \u003calain.ritoux@6wind.com\u003e\nSigned-off-by: Nicolas Dichtel \u003cnicolas.dichtel@6wind.com\u003e\nAcked-by: Vincent JARDIN \u003cvincent.jardin@6wind.com\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "471ea39ce54537194ff2f22420589ddec5ef5ada",
      "tree": "65b04ef42d4ece7e4a44d230fcc0a15f388755c4",
      "parents": [
        "5a5702fac5458d63d7a099c4db7ac387afefd2de"
      ],
      "author": {
        "name": "Feng Lu",
        "email": "lu.feng@6wind.com",
        "time": "Fri May 22 11:40:00 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Jun 02 06:59:36 2015 +0200"
      },
      "message": "lib, zebra, vtysh: configure an interface in non-default VRF\n\nIntroduce a new command \"interface IFNAME vrf N\" to configure an\ninterface in the non-default VRF.\n\nTill now, only zebra uses this command. Other daemons will install\nthe command when they support multiple VRFs.\n\nSigned-off-by: Feng Lu \u003clu.feng@6wind.com\u003e\nReviewed-by: Alain Ritoux \u003calain.ritoux@6wind.com\u003e\nSigned-off-by: Nicolas Dichtel \u003cnicolas.dichtel@6wind.com\u003e\nAcked-by: Vincent JARDIN \u003cvincent.jardin@6wind.com\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "5a5702fac5458d63d7a099c4db7ac387afefd2de",
      "tree": "0547fea145cb10fb9ed6d9493963d374556eb65f",
      "parents": [
        "126215c1238eb42cc92d23aefbe1fac3b204438f"
      ],
      "author": {
        "name": "Feng Lu",
        "email": "lu.feng@6wind.com",
        "time": "Fri May 22 11:39:59 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Jun 02 06:59:28 2015 +0200"
      },
      "message": "lib: move the interface list into \"struct vrf\"\n\nAn interface belongs to a specific VRF. So move the interface list\ninto the \"struct vrf\".\n\n* vrf.c/vrf.h:\n  - add a new member \"struct list *iflist\" to the the \"struct vrf\";\n  - call if_init() in vrf_new();\n  - call if_terminate() in vrf_delete();\n  - add utilities to access the interface list and VRF ID in the\n    specified VRF.\n\n* if.c/if.h:\n  - the global \"iflist\" now only exists for the default VRF;\n  - the global \"if_master\" is initialized on the definition;\n  - in if_create(), the interface is added into the list in the\n    specified VRF; if the VRF does not exist, create one;\n  - add parameters to if_init()/if_terminate() so that the\n    interface list in the VRF can be initialized/destroyed;\n  - in if_dump_all() scan the interfaces in all the VRFs;\n  - add a command \"show address vrf N\" to show addresses in a\n    specified VRF;\n  - add a command \"show address vrf all\" to show addresses in all\n    VRFs;\n  - new APIs ifxxx_vrf() are added to access an interface in a\n    specified VRF.\n\nThe old interface APIs (the global variable \"iflist\" and the API\nfunctions) are not changed to keep the backward compatibility.\nThe new APIs are used in the daemons which support multiple VRFs\n(till now only zebra).\n\nSigned-off-by: Feng Lu \u003clu.feng@6wind.com\u003e\nReviewed-by: Alain Ritoux \u003calain.ritoux@6wind.com\u003e\nSigned-off-by: Nicolas Dichtel \u003cnicolas.dichtel@6wind.com\u003e\nAcked-by: Vincent JARDIN \u003cvincent.jardin@6wind.com\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "126215c1238eb42cc92d23aefbe1fac3b204438f",
      "tree": "22910b50f39003e297efc6236711581cbf3b2ada",
      "parents": [
        "2fc97f6335dd5d7df2c285b363c6ef56bb98dcf8"
      ],
      "author": {
        "name": "Feng Lu",
        "email": "lu.feng@6wind.com",
        "time": "Fri May 22 11:39:58 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Jun 02 06:58:12 2015 +0200"
      },
      "message": "*: call if_init()/if_terminate() from vrf_init()/vrf_terminate()\n\nLater, an interface will belong to a specific VRF, and the interface\ninitialization will be a part of the VRF initialization. So now call\nif_init() from vrf_init(), and if_terminate() from vrf_terminate().\n\nDaemons have the according changes:\n- if if_init() was called or \"iflist\" was initialized, now call\n  vrf_init() instead;\n- if if_terminate() was called or \"iflist\" was destroyed, now call\n  vrf_terminate() instead.\n\nSigned-off-by: Feng Lu \u003clu.feng@6wind.com\u003e\nReviewed-by: Alain Ritoux \u003calain.ritoux@6wind.com\u003e\nSigned-off-by: Nicolas Dichtel \u003cnicolas.dichtel@6wind.com\u003e\nAcked-by: Vincent JARDIN \u003cvincent.jardin@6wind.com\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "2fc97f6335dd5d7df2c285b363c6ef56bb98dcf8",
      "tree": "22361093e3faf9587d055474c1163796aae94194",
      "parents": [
        "41f44a23e86a65a5cad7e5e8cafd7e935f153232"
      ],
      "author": {
        "name": "Feng Lu",
        "email": "lu.feng@6wind.com",
        "time": "Fri May 22 11:39:57 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Jun 02 06:58:12 2015 +0200"
      },
      "message": "lib, zebra: add \"vrf_id\" into the \"struct interface\"\n\nLater, an interface will belong to a specific VRF. Now we add a\nproperty \"vrf_id\" to the \"struct interface\", and keep it as the\ndefault value 0.\n\nThis property is shown when displaying interfaces information.\nIt is also added in some logs.\n\nThis is just the preparation to move the interace list into the\n\"struct vrf\". The main logic is not changed.\n\nSigned-off-by: Feng Lu \u003clu.feng@6wind.com\u003e\nReviewed-by: Alain Ritoux \u003calain.ritoux@6wind.com\u003e\nSigned-off-by: Nicolas Dichtel \u003cnicolas.dichtel@6wind.com\u003e\nAcked-by: Vincent JARDIN \u003cvincent.jardin@6wind.com\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "41f44a23e86a65a5cad7e5e8cafd7e935f153232",
      "tree": "1fcffa568b188ae66e5f18df09f6960522dfe564",
      "parents": [
        "395828eea809e8b2b8c5824d3639cefedd7aa9f0"
      ],
      "author": {
        "name": "Feng Lu",
        "email": "lu.feng@6wind.com",
        "time": "Fri May 22 11:39:56 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Jun 02 06:58:12 2015 +0200"
      },
      "message": "lib, zebra: move \"struct vrf\" to be a lib module\n\nPreviously \"struct vrf\" is defined locally in zebra. Now it is moved\nto be a lib module.\n\nThis is the first step to support multi-VRF in quagga. The\nimplementation is splitted into small patches for the purpose of\neasy review.\n\n* lib:\n    \"struct vrf\" with basic members is defined in vrf.c. The member\n    \"void *info\" is for user data.\n\n    Some basic functions are defined in vrf.c for adding/deleting/\n    looking up a VRF, scanning the VRF table and initializing the\n    VRF module.\n\n    The type \"vrf_id_t\" is defined specificly for VRF ID.\n\n* zebra:\n    The previous \"struct vrf\" is re-defined as \"struct zebra_vrf\";\n    and previous \"vrf\" variables are renamed to \"zvrf\".\n\n    The previous \"struct vrf\" related functions are removed from\n    zbera_rib.c. New functions are defined to maintain the new\n    \"struct zebra_vrf\".\n\n    The names vrf_xxx are reserved for the functions in VRF module.\n    So:\n    - the previous vrf_table() are renamed to zebra_vrf_table();\n    - the previous vrf_static_table() are renamed to\n      zebra_vrf_static_table().\n\n    The main logic is not changed.\n\n    BTW: Add a statement to zebra_snmp.c telling that the SNMP is\n         running only for the MIBs in the default VRF.\n\nSigned-off-by: Feng Lu \u003clu.feng@6wind.com\u003e\nReviewed-by: Alain Ritoux \u003calain.ritoux@6wind.com\u003e\nSigned-off-by: Nicolas Dichtel \u003cnicolas.dichtel@6wind.com\u003e\nAcked-by: Vincent JARDIN \u003cvincent.jardin@6wind.com\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "395828eea809e8b2b8c5824d3639cefedd7aa9f0",
      "tree": "61341d0667a67d8645455fad7029cc916eb9a3e2",
      "parents": [
        "be6335d682c5ee1b6930345193eda875705fbab2"
      ],
      "author": {
        "name": "Feng Lu",
        "email": "lu.feng@6wind.com",
        "time": "Fri May 22 11:39:55 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Jun 02 06:58:12 2015 +0200"
      },
      "message": "ospf6d, bgpd: avoid calling if_nametoindex\n\nAs the comments in if.h, it is better to call ifname2ifindex()\ninstead of if_nametoindex().\n\nAnd ifname2ifindex() can work for VRF by appending a parameter\nwhile if_nametoindex() can not.\n\nSigned-off-by: Feng Lu \u003clu.feng@6wind.com\u003e\nReviewed-by: Alain Ritoux \u003calain.ritoux@6wind.com\u003e\nSigned-off-by: Nicolas Dichtel \u003cnicolas.dichtel@6wind.com\u003e\nAcked-by: Vincent JARDIN \u003cvincent.jardin@6wind.com\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "be6335d682c5ee1b6930345193eda875705fbab2",
      "tree": "2107740224a8a6b3f44241ba71d9be562f138232",
      "parents": [
        "53a5c39c705f917567d5b1764f1fe12ad5c5e577"
      ],
      "author": {
        "name": "Timo Teräs",
        "email": "timo.teras@iki.fi",
        "time": "Sat May 23 11:08:41 2015 +0300"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Mon Jun 01 16:50:58 2015 +0200"
      },
      "message": "zebra: use prefix2str for logging where possible\n\nThis makes code more robust, consice and readable.\n\nSigned-off-by: Timo Teräs \u003ctimo.teras@iki.fi\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "53a5c39c705f917567d5b1764f1fe12ad5c5e577",
      "tree": "fd116539e632b8c5a0cbdd0312134767e1966f78",
      "parents": [
        "41eb9a4305fbcb206c900a18af7df7115d857d60"
      ],
      "author": {
        "name": "Timo Teräs",
        "email": "timo.teras@iki.fi",
        "time": "Sat May 23 11:08:40 2015 +0300"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Mon Jun 01 16:31:21 2015 +0200"
      },
      "message": "zebra/vty: use prefix2str and unify show ip/ipv6 route code\n\nUse prefix2str where possible. As now ip/ipv6 are practically\nidentical, they are merged removing unneeded code duplication.\n\nSigned-off-by: Timo Teräs \u003ctimo.teras@iki.fi\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "41eb9a4305fbcb206c900a18af7df7115d857d60",
      "tree": "d132fa1a4e113aa5d0bcf84d60933b36383b182d",
      "parents": [
        "53009d387a633997b16d32224b50451b5c81b61a"
      ],
      "author": {
        "name": "Timo Teräs",
        "email": "timo.teras@iki.fi",
        "time": "Sat May 23 11:08:39 2015 +0300"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Mon Jun 01 16:31:14 2015 +0200"
      },
      "message": "lib: make prefix2str simpler to use, and use it in zclient\n\nReturning the buffer allows using it in the logging functions\nin easier way. This also makes the API consistent with sockunion.\n\nAdd also PREFIX_STRLEN to be the generic buffer length required\nfor any prefix string representation.\n\nSigned-off-by: Timo Teräs \u003ctimo.teras@iki.fi\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "53009d387a633997b16d32224b50451b5c81b61a",
      "tree": "171f2b9a92011209c353d9173133ff10907bec4b",
      "parents": [
        "3293bc280f15d8e3c04e0bf9b0a8d54d342a87a9"
      ],
      "author": {
        "name": "Timo Teräs",
        "email": "timo.teras@iki.fi",
        "time": "Sat May 23 11:08:38 2015 +0300"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Mon Jun 01 16:31:10 2015 +0200"
      },
      "message": "lib: make sockunion2str safer to use\n\nIt\u0027s mostly used for logging, and the return value is never\nchecked, so try to make it valid.\n\nSigned-off-by: Timo Teräs \u003ctimo.teras@iki.fi\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "3293bc280f15d8e3c04e0bf9b0a8d54d342a87a9",
      "tree": "cbc3dc09016553de6bf9d97c641a4d9caaa40fda",
      "parents": [
        "f85592e05ae6463727433893e61afd1081fcf7e0"
      ],
      "author": {
        "name": "Timo Teräs",
        "email": "timo.teras@iki.fi",
        "time": "Fri May 22 13:41:01 2015 +0300"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Fri May 29 07:31:02 2015 +0200"
      },
      "message": "route table: constify some APIs\n\nSigned-off-by: Timo Teräs \u003ctimo.teras@iki.fi\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "f85592e05ae6463727433893e61afd1081fcf7e0",
      "tree": "2a87863a6f00342334d260a25d02ccda99128a89",
      "parents": [
        "483abc037b0ac4b3ed168c4810bb14ea338fa80c"
      ],
      "author": {
        "name": "Timo Teräs",
        "email": "timo.teras@iki.fi",
        "time": "Fri May 22 13:41:00 2015 +0300"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Fri May 29 07:31:01 2015 +0200"
      },
      "message": "zebra: simplify redistribution code\n\nMerge the conditionals as one to avoid code duplication.\n\nSigned-off-by: Timo Teräs \u003ctimo.teras@iki.fi\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "483abc037b0ac4b3ed168c4810bb14ea338fa80c",
      "tree": "7bfbab894161fcd5852deaf96d7f2208fdb91b9b",
      "parents": [
        "c1c69e43cda64122b599746df4d1c6c5d8b52e37"
      ],
      "author": {
        "name": "Timo Teräs",
        "email": "timo.teras@iki.fi",
        "time": "Fri May 22 13:40:59 2015 +0300"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Fri May 29 07:30:46 2015 +0200"
      },
      "message": "sockunion: add accessors for sockunion address\n\nUpcoming nhrp code will use this, and it can be used to remove\nthe sockunion2ip(X) macro.\n\nSigned-off-by: Timo Teräs \u003ctimo.teras@iki.fi\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "c1c69e43cda64122b599746df4d1c6c5d8b52e37",
      "tree": "cccc035647931b79657438087f92bc6a387aae96",
      "parents": [
        "80c9354835bb924983d12b0efad957e78f219287"
      ],
      "author": {
        "name": "Timo Teräs",
        "email": "timo.teras@iki.fi",
        "time": "Fri May 22 13:40:57 2015 +0300"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Fri May 29 07:30:44 2015 +0200"
      },
      "message": "lib: allow caller to provide prefix storage in sockunion2hostprefix\n\nAvoids a dynamic allocation which is usually freed immediate afterwards.\n\nSigned-off-by: Timo Teräs \u003ctimo.teras@iki.fi\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "80c9354835bb924983d12b0efad957e78f219287",
      "tree": "679ed5f44a7cdfb20ef856a9bb90f5204516e9f9",
      "parents": [
        "d79668fb440ae2689b54f52c076dbd79a8689135"
      ],
      "author": {
        "name": "Timo Teräs",
        "email": "timo.teras@iki.fi",
        "time": "Fri May 22 13:40:56 2015 +0300"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Fri May 29 07:29:25 2015 +0200"
      },
      "message": "privs: fix privilege dropping to use system defined groups\n\nIt may be requred for quagga process to belong to additional\ngroups. E.g. nhrp module will need to talk to strongSwan using\nvici and may require additional permissions. Initialize groups\nfrom the system group database.\n\nSigned-off-by: Timo Teräs \u003ctimo.teras@iki.fi\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "d79668fb440ae2689b54f52c076dbd79a8689135",
      "tree": "d93c62249206b3199aeeaba766ce64a4bc6753e6",
      "parents": [
        "db93eec18d8f1e840b32ba2cdf8baf2510f6e1a5"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu May 14 14:47:05 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed May 27 23:37:48 2015 +0200"
      },
      "message": "tests: add testcli reference in/out \u0026 do DejaGNU\n\nThis adds reference in \u0026 output for the previously added testcli tool,\nto check basic CLI parsing/help functions.  Unlike \"testcommands\", this\none doesn\u0027t depend on compile-time system details.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "db93eec18d8f1e840b32ba2cdf8baf2510f6e1a5",
      "tree": "1118c5e17cb6e4104f84e7fda909428686a7bb3e",
      "parents": [
        "05a69d2f3833c285b399558ba7ab4a57f194a88d"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 05 11:04:59 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed May 27 23:37:47 2015 +0200"
      },
      "message": "tests: add CLI dummy command-exec tool\n\nThis adds some common CLI testtool code as well as a tool that has a\nbunch of commands to be poked for their correct processing.\n\nThe tool doesn\u0027t work correctly from a script at stdin at this point\nbecause the vty code will throw away all buffered when it sees EOF, so\nthe tail end of the input file is lost.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "05a69d2f3833c285b399558ba7ab4a57f194a88d",
      "tree": "5c897f789ec473225d03017bd57e6809d240e7fc",
      "parents": [
        "72855b16b72e9ad2c7eb0c0bfd8f5985f779608f"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed May 27 22:15:37 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed May 27 22:16:32 2015 +0200"
      },
      "message": "Revert \"lib: wrong #define used for IPV6_MINHOPCOUNT\"\n\nThis reverts commit 54b88cac24f335414caa875b390d2d78ff4bf9e0.\n\nUnfortunately, this breaks the build on systems where linux/in6.h and\nnetinet/in.h can\u0027t both be included, such as Ubuntu 14.04 and Debian\nJessie.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "72855b16b72e9ad2c7eb0c0bfd8f5985f779608f",
      "tree": "308f4e057157ded800b1c3e188a5eadf77e693cb",
      "parents": [
        "e97c31aafc013b8b9a0e61cb79ee97a5f1e419bf"
      ],
      "author": {
        "name": "Feng Lu",
        "email": "lu.feng@6wind.com",
        "time": "Fri May 22 11:39:54 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed May 27 21:52:25 2015 +0200"
      },
      "message": "ripngd: allow to enable/disable the ECMP feature\n\nIntroduce a new command \"[no] allow-ecmp\" to enable/disable the\nECMP feature in RIPng. By default, ECMP is not allowed.\n\nOnce ECMP is disabled, only one route entry can exist in the list.\n\n* ripng_zebra.c: adjust a debugging information, which shows the number\n                 of nexthops according to whether ECMP is enabled.\n* ripngd.c: ripng_ecmp_add() will reject the new route if ECMP is not\n            allowed and some entry already exists.\n            A new configurable command \"allow-ecmp\" is added to control\n            whether ECMP is allowed.\n            When ECMP is disabled, ripng_ecmp_disable() is called to\n            remove the multiple nexthops.\n* ripngd.h: Add a new member \"ecmp\" to \"struct ripng\", indicating whether\n            ECMP is allowed or not.\n\nSigned-off-by: Feng Lu \u003clu.feng@6wind.com\u003e\nReviewed-by: Alain Ritoux \u003calain.ritoux@6wind.com\u003e\nSigned-off-by: Nicolas Dichtel \u003cnicolas.dichtel@6wind.com\u003e\nAcked-by: Vincent Jardin \u003cvincent.jardin@6wind.com\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "e97c31aafc013b8b9a0e61cb79ee97a5f1e419bf",
      "tree": "d90728aedb147abf0bfa3fe5d4110f8bfa5526cc",
      "parents": [
        "54b88cac24f335414caa875b390d2d78ff4bf9e0"
      ],
      "author": {
        "name": "Feng Lu",
        "email": "lu.feng@6wind.com",
        "time": "Fri May 22 11:39:53 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed May 27 21:52:08 2015 +0200"
      },
      "message": "ripngd: add ECMP support\n\n* Each node in the routing table is changed into a list, holding\n  the multiple equal-cost paths.\n\n* If one of the multiple entries gets less-preferred (greater\n  metric or greater distance), it will be directly deleted instead\n  of starting a garbage-collection timer for it.\n  The garbage-collection timer is started only when the last entry\n  in the list gets INFINITY.\n\n* Some new functions are used to maintain the ECMP list. And hence\n  ripng_route_process(), ripng_redistribute_add() and ripng_timeout()\n  are significantly simplified.\n\n* ripng_zebra_ipv6_add() and ripng_zebra_ipv6_delete() now can share\n  the common code. The common part is moved to ripng_zebra_ipv6_send().\n\nSigned-off-by: Feng Lu \u003clu.feng@6wind.com\u003e\nReviewed-by: Alain Ritoux \u003calain.ritoux@6wind.com\u003e\nSigned-off-by: Nicolas Dichtel \u003cnicolas.dichtel@6wind.com\u003e\nAcked-by: Vincent Jardin \u003cvincent.jardin@6wind.com\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "54b88cac24f335414caa875b390d2d78ff4bf9e0",
      "tree": "be4834daa2e1df592b61493ec18a084c4ccefa10",
      "parents": [
        "a5d589dfbf2c563868d944376155cd4a5998722f"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Wed May 13 20:34:46 2015 -0400"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed May 27 20:48:33 2015 +0200"
      },
      "message": "lib: wrong #define used for IPV6_MINHOPCOUNT\n\nThe #define IPV6_MINHOPCNT define is never defined on any unix platform.\n\u003eFrom what I can tell the original implementation on the linux platform\nwas IPV6_MINHOPCNT, when it got accepted into the mainstream kernel\nit was transformed into IPV6_MINHOPCOUNT.  Since we test for the\ndefine before attempting to use the code it was silently doing nothing\nfor a long time.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "a5d589dfbf2c563868d944376155cd4a5998722f",
      "tree": "77dee816875a287b74a164b393839308cfe62313",
      "parents": [
        "3065777ece6d14c6acd04f8b2b693a15c9f2f37c"
      ],
      "author": {
        "name": "Christian Franke",
        "email": "nobody@nowhere.ws",
        "time": "Wed May 13 13:59:18 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed May 27 20:39:40 2015 +0200"
      },
      "message": "lib/privs: Don\u0027t use CAP_NET_BROADCAST\n\nFrom what I can tell, CAP_NET_BROADCAST has never been required for any\nfunctionality in the Linux kernel, so we do not really need it.\n\nHowever, it causes breakage in contexts where Quagga is started with a\nlimited set of capabilities, e.g. in Docker, because these may not\ninclude CAP_NET_BROADCAST and in the case of Docker do not even support\nadding CAP_NET_BROADCAST.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "3065777ece6d14c6acd04f8b2b693a15c9f2f37c",
      "tree": "5e8d9c5880ea7540a3e4dd6a7228b45330e5a0e8",
      "parents": [
        "19ed526eab33728723e25f2727f60f41d3533503"
      ],
      "author": {
        "name": "Christian Franke",
        "email": "nobody@nowhere.ws",
        "time": "Wed May 13 13:59:17 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed May 27 20:39:04 2015 +0200"
      },
      "message": "lib/privs: display more info if cap_set_proc fails.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "19ed526eab33728723e25f2727f60f41d3533503",
      "tree": "6b3dcfd5ee8be8148e0a85454305ae4ef0867adf",
      "parents": [
        "90d313578f035110422799ca2e188d745ceb3733"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed May 20 19:06:12 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed May 27 20:34:41 2015 +0200"
      },
      "message": "isisd: always print adj-\u003esysid (clang 3.6 warning)\n\nAs any new compiler version, clang 3.6 has new warnings, one of these\nbeing that it now warns for testing whether the address of an array will\nbe true.\n\nOf course there is no point in this check for the sysid, so let\u0027s always\njust print the sysid.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "90d313578f035110422799ca2e188d745ceb3733",
      "tree": "9ec0ef3c8cca4cb52dc5d1340f2a3cb8191ae586",
      "parents": [
        "464ccf36b4aa1b942cad413ea30267b4bf9e6315"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu May 14 14:24:06 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed May 27 20:34:41 2015 +0200"
      },
      "message": "lib/vty: don\u0027t clear output buffer on input EOF\n\nA VTY\u0027s input can be closed without the output becoming unavailable.\nThis happens both on stdio when stdin ends, as well as over TCP when an\nunidirectional input shutdown() happens.\n\nIn such a case, resetting the output buffer is not appropriate since\nthere might still be data to be successfully written.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "464ccf36b4aa1b942cad413ea30267b4bf9e6315",
      "tree": "1d0a46df5f2b00e5a4cfe81e0fcce5d94ee4abab",
      "parents": [
        "ba53a8fdecef07577dcc4109e5c82bb124d49c58"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 12 21:56:18 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed May 27 20:34:41 2015 +0200"
      },
      "message": "lib/vty: add vty_stdio at-close hook\n\nThis is intended to be used for either \"exit on close\", \"fork on close\"\nor \"reopen vty on close\" functionality for the stdio vty.  Which of\nthese options to take depends on the context, the use case right now is\ntest programs exiting on EOF.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "ba53a8fdecef07577dcc4109e5c82bb124d49c58",
      "tree": "82b3cd36a4812e4f34baaeac106bb28ad0f49bb8",
      "parents": [
        "ba5dc5ebb4dba56cb3a64acc21e71aa34df375d9"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 05 11:04:46 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed May 27 20:34:40 2015 +0200"
      },
      "message": "lib/vty: put stdin in raw mode for vty\n\nThe interactive CLI actually works just fine, if we just put the\nterminal in raw mode to get keystrokes as they come.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "ba5dc5ebb4dba56cb3a64acc21e71aa34df375d9",
      "tree": "af180446cdaaa0bdab5171630249fd1db9fd5b86",
      "parents": [
        "4715a53b4d390e72a06c864a6a505971841e3dc9"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@diac24.net",
        "time": "Thu May 30 16:33:45 2013 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed May 27 20:34:40 2015 +0200"
      },
      "message": "lib/vty: add vty_stdio()\n\nthis introduces a new public/API function to the vty code for opening a\nVTY on stdin/stdout.  Intended for unrestricted use by the individual\ndaemons, i.e. \"offical API\".\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "4715a53b4d390e72a06c864a6a505971841e3dc9",
      "tree": "a7618f437bd55b6695c9f8e4b03a252a0513f6d5",
      "parents": [
        "ee53c8b9f7979c79beada960746ca35046016a45"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@diac24.net",
        "time": "Thu May 30 16:31:49 2013 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed May 27 20:34:40 2015 +0200"
      },
      "message": "lib/vty: add separate output fd support to VTYs\n\nto be used with stdin/stdout terminals, this adds support for writing to\na different FD than we\u0027re reading from.  Also fixes error messages from\nconfig load being written to stdin.\n\n[v2: fixed config write]\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "ee53c8b9f7979c79beada960746ca35046016a45",
      "tree": "4a1df05c8bb9b72e6508a11300dbdbccda419600",
      "parents": [
        "ec38711852abdcaa0e7001e6a1e957052a0e723d"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Sat May 23 05:45:59 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed May 27 20:28:19 2015 +0200"
      },
      "message": "vtysh: fix the fix for babeld removal... (5460bae)\n\nCommit 5460bae (\"*: fix \u0027babeld: Remove babeld from Quagga\u0027 (336724d)\")\nunfortunately removed the BABEL_NODE from vtysh, which now no longer\nstarts.\n\nFix by restoring the node (even though it won\u0027t be accessible).\n\nReported-by: Nicolas Dichtel \u003cnicolas.dichtel@6wind.com\u003e\nFixes: 5460bae (\"*: fix \u0027babeld: Remove babeld from Quagga\u0027 (336724d)\")\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "ec38711852abdcaa0e7001e6a1e957052a0e723d",
      "tree": "c06db4d3a0d1020ce22d268e7128ee5a770ce7e5",
      "parents": [
        "9196caf16e30e938f4bc3c05d96f55195af7caff"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed May 20 22:34:56 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed May 20 22:44:56 2015 +0200"
      },
      "message": "lib: fix \"sockunion: add hash function\" for BSD (9196caf)\n\nThe sockunion_hash() function uses s6_addr32, which is not defined on\nBSD systems.  (It only works on glibc because we set _GNU_SOURCE)\n\nripngd/ripng_nexthop.h already contains a workaround for this.  Bump\nworkaround to prefix.h so it\u0027s available everywhere.\n\nReported-by: NetDEF CI System \u003cmwinter@netdef.org\u003e\nFixes: 9196caf (\"sockunion: add hash function\")\nCc: Timo Teräs \u003ctimo.teras@iki.fi\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "9196caf16e30e938f4bc3c05d96f55195af7caff",
      "tree": "1fdd133a1740a33380fd5f1981c736ad92ac476f",
      "parents": [
        "ef757700d0fd51dc0b46df9d3631208919f9b779"
      ],
      "author": {
        "name": "Timo Teräs",
        "email": "timo.teras@iki.fi",
        "time": "Wed Apr 29 09:43:05 2015 +0300"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed May 20 18:53:54 2015 +0200"
      },
      "message": "sockunion: add hash function\n\nSigned-off-by: Timo Teräs \u003ctimo.teras@iki.fi\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "ef757700d0fd51dc0b46df9d3631208919f9b779",
      "tree": "722b3898fc1793cda897fa685df7128df4dfbc56",
      "parents": [
        "6b2672f3c9493aef3495192e113f95a7db4b65bc"
      ],
      "author": {
        "name": "Timo Teräs",
        "email": "timo.teras@iki.fi",
        "time": "Wed Apr 29 09:43:04 2015 +0300"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed May 20 18:52:22 2015 +0200"
      },
      "message": "bgpd: allow using rtt in route-map\u0027s set metric\n\nUseful when the BGP neighbors are over tunnels that have large\ndifferences in geographic distances and RTTs. Especially useful\nfor DMVPN setups to allow preferring closes hub.\n\nThe parameter is added as new alias command as otherwise it seems\nthe command parser is not able to match it properly (it seems\nmerging is done for the various \u0027set metric\u0027 route-map objects in\ndifferent routing engines). For same reason also they are listed\nas three separate options: optional +/- seems not possibly easily.\n\nRelated research papers:\nhttp://www.pps.univ-paris-diderot.fr/~jch/research/delay-based.pdf\nhttp://arxiv.org/pdf/1309.0632.pdf\n\nPaper on similar extension to Babel:\nhttp://www.pps.univ-paris-diderot.fr/~jch/research/rapport-jonglez-2013.pdf\n\nSigned-off-by: Timo Teräs \u003ctimo.teras@iki.fi\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "6b2672f3c9493aef3495192e113f95a7db4b65bc",
      "tree": "6cd9affdd144ed6a714a93b16f6c888a21616f8b",
      "parents": [
        "38f22ab07c8e1f0f12e23c2e2d0a3e1f71bef695"
      ],
      "author": {
        "name": "Timo Teräs",
        "email": "timo.teras@iki.fi",
        "time": "Wed Apr 29 09:43:03 2015 +0300"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed May 20 18:50:56 2015 +0200"
      },
      "message": "sockopt: add support for querying tcp round-trip-time\n\nSigned-off-by: Timo Teräs \u003ctimo.teras@iki.fi\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "38f22ab07c8e1f0f12e23c2e2d0a3e1f71bef695",
      "tree": "fdb9d52bea1f2105885182aef92691a5bf01e47a",
      "parents": [
        "5460baef7f0014f2d0c3459aa9c4180da19d6850"
      ],
      "author": {
        "name": "Timo Teräs",
        "email": "timo.teras@iki.fi",
        "time": "Wed Apr 29 09:43:02 2015 +0300"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed May 20 18:50:21 2015 +0200"
      },
      "message": "bgpd: refactor route-map objects modifying integer values\n\nUse common code to parse, validate and adjust the route-map\nobjects that contain a simple integer value. This also allows\ncompiling the add/sub format metric object.\n\nSigned-off-by: Timo Teräs \u003ctimo.teras@iki.fi\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "5460baef7f0014f2d0c3459aa9c4180da19d6850",
      "tree": "43c44fde298e4fbaf1de87a6dc287b0c82a4f515",
      "parents": [
        "336724d628be71022f80cfe3dfb34274ad95ec14"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 19 00:35:04 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed May 20 00:34:21 2015 +0200"
      },
      "message": "*: fix \"babeld: Remove babeld from Quagga\" (336724d)\n\nThis removes some more bits of babeld, particularly from:\n- buildtest.sh\n- redhat/ build files\n- vtysh integration (which actively broke the build)\n\nThe memtype and zclient/route type are kept in place since these don\u0027t\nbreak anything and -theoretically- make it possible to build babeld\nwith some Quagga integration externally.\n(Keeping vtysh integration is unfortunately not as easy.)\n\nReported-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\nFixes: 336724d (\"babeld: Remove babeld from Quagga\")\nAcked-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\nAcked-by: Paul Jakma \u003cpaul@quagga.net\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "336724d628be71022f80cfe3dfb34274ad95ec14",
      "tree": "aa6b11c1c89d5f84d57f3baf3a8df7fa086d852c",
      "parents": [
        "219cdc95d93eda93240d472814ef4aa8bd36b039"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon May 11 15:13:31 2015 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri May 15 16:41:57 2015 +0100"
      },
      "message": "babeld: Remove babeld from Quagga\n\nThis commit removes babeld from Quagga because the Quagga project is unable\nto meet the wishes of the babeld authors.\n"
    },
    {
      "commit": "219cdc95d93eda93240d472814ef4aa8bd36b039",
      "tree": "9f39dc298398ff012dc2243ec40a9a4bd4af3d05",
      "parents": [
        "f1fc327c7eb00634d2c2b08c2a6f6e44a626ef04"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@opensourcerouting.org",
        "time": "Fri Jan 23 16:43:49 2015 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Thu May 14 18:09:55 2015 +0100"
      },
      "message": "ospfd: Remove another odd flooding hack in opaque LSA code\n\n* ospf_opaque.c: (ospf_opaque_adjust_lsreq) Odd hack to general OSPF\n  database exchange but made to act only on opaque LSAs. It\u0027s either covering\n  up bugs in the flooding code or its wrong. If it\u0027s covering up bugs, those\n  would affect all LSAs and should be fixed at a lower layer in ospfd, indeed\n  perhaps those bugs are long fixed anyway (?). Alternatively, it\u0027s just plain\n  wrong. Nuke.\n  (ospf_opaque_exclude_lsa_from_lsreq) helper to above, nuke.\n* ospf_packet.c: Nuke call to ospf_opaque_adjust_lsreq.\n\nTested-by: olivier.dugeon@orange.com\n"
    },
    {
      "commit": "f1fc327c7eb00634d2c2b08c2a6f6e44a626ef04",
      "tree": "4a14fc6fd695e76a77db703880fb300e079eb8cc",
      "parents": [
        "1416293f9d8f09cb792ce0ff9b734bff71697909"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed May 13 12:44:50 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu May 14 14:31:06 2015 +0200"
      },
      "message": "lib: assert(0) still needs a return\n\nassert(0) is not guaranteed to not return since assert() in general can\nbe optimised out when building without debug / with optimisation.  This\nbreaks the build in clang, which warns/errors about the missing return.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "1416293f9d8f09cb792ce0ff9b734bff71697909",
      "tree": "32f87dd85aa3b0d58fb45bbef60591ee7c43dce8",
      "parents": [
        "c9c06d0d8cbc766374c43328e91b7a87f93e9c62"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 12 17:18:04 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu May 14 14:26:30 2015 +0200"
      },
      "message": "lib: fix \"reduce strcmp in CLI\" fallout (10bac801)\n\nIn \"lib/cli: reduce strcmp in CLI hot paths\", I failed to notice that\nCMD_VARIABLE as a boolean test covers a superset of the other types of\nvariables.  Thus, the patch broke processing of IP/IPv6/Integer range\nparameters in the CLI.\n\nFix by some reordering and introducing TERMINAL_RECORD macro (which\nmarks whether a given terminal type is a parameter) to be used in places\nwhere the check is really for all kinds of variables.\n\nReported-by: Timo Teräs \u003ctimo.teras@iki.fi\u003e\nTested-by: Martin Winter \u003cmwinter@netdef.org\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "c9c06d0d8cbc766374c43328e91b7a87f93e9c62",
      "tree": "7079c5e07ab0941949373d901bbd672066b9e4c6",
      "parents": [
        "e66cbd10d52a79fd61acab9d615683eebdbf1df5"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Mon Apr 13 10:21:35 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 05 15:07:45 2015 +0200"
      },
      "message": "lib: straighten out ORF prefix list support\n\nBGP ORF prefix lists are in a separate namespace; this was previously\nhooked up with a special-purpose AFI value.  This is a little kludgy for\nextension, hence this splits it off.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\nAcked-by: Paul Jakma \u003cpaul@jakma.org\u003e\n"
    },
    {
      "commit": "e66cbd10d52a79fd61acab9d615683eebdbf1df5",
      "tree": "e81be2319e7b2c485354283f025e090bb56c8754",
      "parents": [
        "4584c239201037648abf1a6615186f9cdeb86b23"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Mon Apr 13 10:21:34 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 05 15:06:22 2015 +0200"
      },
      "message": "lib: hide internal prefix list structures\n\nThese are about to be touched and there\u0027s no point in other code\ntouching into prefix list\u0027s internas.  Add some isolation.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "4584c239201037648abf1a6615186f9cdeb86b23",
      "tree": "1af059ebcc0b9229aa78c9e775120ae8ae4a8c2f",
      "parents": [
        "e30677a5537f67e37938954cf7347e9a9c0b922d"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Mon Apr 13 09:50:00 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 05 15:05:34 2015 +0200"
      },
      "message": "bgpd: speed up \"no-hit\" withdraws for routeservers\n\nThis accelerates handling of incoming Withdraw messages for routes that\ndon\u0027t exist in the table to begin with.  Cisco IOS 12.4(24)T4 has a bug\nin this regard - it sends withdraws instead of doing nothing for\nprefixes that are filtered.\n\nPulling up the adj_in removal in Quagga should have no ill effect, but\nwe can avoid the costly iteration over all rsclients if there was no\nadj_in entry.\n\nPerformance impact of this change on routeserver with 3 buggy peers,\nstartup/sync time:\n\nbefore patch:  143.12 seconds (user cpu)\nafter patch:     7.01 seconds (user cpu)\n\nMany thanks to Nick Hilliard \u0026 INEX for providing real-world test data!\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\nAcked-by: Paul Jakma \u003cpaul@jakma.org\u003e\n"
    },
    {
      "commit": "e30677a5537f67e37938954cf7347e9a9c0b922d",
      "tree": "0fe90b1574293ff61d3088aef2e6b3b1b03170a0",
      "parents": [
        "e1bcd4741c24ff990a9413ead9a9e37b80153046"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@opensourcerouting.org",
        "time": "Tue Jan 20 15:45:36 2015 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue May 05 13:02:11 2015 +0100"
      },
      "message": "ospfd: Remove the blocking of opaque LSAs origination \u0026 flooding \u0027optimisation\u0027\n\n* Opaque support contains some kind of hack/optimisation to\n  origination/flooding to suppress some origins/floods until an opaque LS\n  Acks are received.  Previous versions of the code have already been shown\n  to have bugs in them (see e16fd8a5, e.g.). It seems over-complex and fragile,\n  plus its conceptually the wrong place to try implement flooding hacks that,\n  AFAICT, do not depend particularly on the semantics of opaque LSA.\n\n  Nuke.\n\nTested-by: Olivier Dugeon \u003colivier.dugeon@orange.com\u003e\n"
    },
    {
      "commit": "e1bcd4741c24ff990a9413ead9a9e37b80153046",
      "tree": "945ee904f65bc18eb3c2d03f6dd225e9d3b25938",
      "parents": [
        "10bac80195cf5a781da6e4415e6580fd7080f734"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@opensourcerouting.org",
        "time": "Fri Sep 19 16:41:10 2014 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue May 05 12:51:43 2015 +0100"
      },
      "message": "ospfd: Make ospf_passive_interface_update calls friendly to static analysis\n\n* ospf_vty.c: ({no_}ospf_passive_interface_addr_cmd) To a static analyser,\n  the call to ospf_passive_interface_update can look like uninitialised memory\n  in addr might be read from. It won\u0027t be, as ospf_passive_interface_update\n  only reads addr if params !\u003d IF_DEF_PARAMS, but not clear. Split up the\n  helper into the two cases to make it clear.\n"
    },
    {
      "commit": "10bac80195cf5a781da6e4415e6580fd7080f734",
      "tree": "440ed474bc54a2a5d355369e928b4bd8bc315e97",
      "parents": [
        "81b139bdd530adda045d22a4daf0054b89703dab"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 05 11:10:20 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 05 11:10:42 2015 +0200"
      },
      "message": "lib/cli: reduce strcmp in CLI hot paths\n\nEr, no idea how anyone could ever have thought that it would be a good\nidea to have a zillion of strcmp() calls in the CLI\u0027s active paths, just\nto compare against things like \"A.B.C.D\".\n\nReduces 40k prefix list load time from 1.65s to 1.23s (1.34:1).\n\nAcked-by: Paul Jakma \u003cpaul@jakma.org\u003e\n[v2: killed CMDS_* macros]\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "81b139bdd530adda045d22a4daf0054b89703dab",
      "tree": "15a73adc88a1d3282ae06f572feae0fca4695377",
      "parents": [
        "b40e178af12570467f0116d6b1684cb1b961e407"
      ],
      "author": {
        "name": "Timo Teräs",
        "email": "timo.teras@iki.fi",
        "time": "Wed Apr 29 09:43:01 2015 +0300"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 05 09:39:58 2015 +0200"
      },
      "message": "lib: constify sockunion api\n\nAdd const to read-only api calls.\n\nSigned-off-by: Timo Teräs \u003ctimo.teras@iki.fi\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "b40e178af12570467f0116d6b1684cb1b961e407",
      "tree": "652143a283cdfaa1f9d735b29798b2f09fb3633a",
      "parents": [
        "e38545bb2cd155306fd78223e0c579117fcfae90"
      ],
      "author": {
        "name": "Timo Teräs",
        "email": "timo.teras@iki.fi",
        "time": "Wed Apr 29 09:43:00 2015 +0300"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 05 09:38:03 2015 +0200"
      },
      "message": "zebra: fix rtadv check for non-glibc linux\n\nDefault RTADV enabled for non-glibc linux (fixes check for musl libc).\n\nSigned-off-by: Timo Teräs \u003ctimo.teras@iki.fi\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "e38545bb2cd155306fd78223e0c579117fcfae90",
      "tree": "d9cd5f1b36d67d081e564314c7b3f2b6a0bc5547",
      "parents": [
        "491417ac6383e2ea557951b24eb7bd3fffb69394"
      ],
      "author": {
        "name": "Timo Teräs",
        "email": "timo.teras@iki.fi",
        "time": "Wed Apr 29 09:42:59 2015 +0300"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 05 09:37:55 2015 +0200"
      },
      "message": "zebra: fix build with rtadv disabled\n\nOtherwise we get warning on rtadv_init() prototype not being\ndefined when compiling rtadv.c (as dummy stub is provided always).\n\nSigned-off-by: Timo Teräs \u003ctimo.teras@iki.fi\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "491417ac6383e2ea557951b24eb7bd3fffb69394",
      "tree": "4f5c961345e190d4683eb3bcb41409244788b72d",
      "parents": [
        "4da670b7a9aacf552aa11c4d4f6d994b312ada89"
      ],
      "author": {
        "name": "Amritha Nambiar",
        "email": "amritha.nambiar@intel.com",
        "time": "Thu Apr 23 15:36:55 2015 -0700"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 05 09:06:56 2015 +0200"
      },
      "message": "isisd: fix crash on processing own p2p hello\n\nisis_pdu.c :\nisisd crashes if router\u0027s own p2p hello packets get processed\nthereby creating an adjacecncy with itself. Asserts at\nisis_find_vertex. So discard own p2p IIH PDU and avoid\ncreating adjacency with self. This would also fix duplicate\nsystemID on an interface. These checks already exists for IS-IS\nLAN Level 1/2 Hello PDU in process_lan_hello, but not for\npoint-to-point IIH PDUs.\n\nSigned-off-by: Amritha Nambiar \u003camritha.nambiar@intel.com\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "4da670b7a9aacf552aa11c4d4f6d994b312ada89",
      "tree": "c754baa8c63867456794e45ba04e24846ec560ac",
      "parents": [
        "f0996123fe12a0b5ea66b00475066474f48c84a0"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@opensourcerouting.org",
        "time": "Mon Oct 27 15:14:06 2014 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Apr 27 15:58:41 2015 +0100"
      },
      "message": "HACKING: Use space char for indentation.\n\n* HACKING.tex: Whitespace/indent section is probably out of date. Rephrase.\n  Remove the editor recommendations, as I don\u0027t know what would be correct.\n\nAcked-by: Vincent Jardin \u003cvincent.jardin@6wind.com\u003e\n"
    },
    {
      "commit": "f0996123fe12a0b5ea66b00475066474f48c84a0",
      "tree": "0591a691a09f99ac615fa86b777978707914ed0b",
      "parents": [
        "5bcbc3f58870bd28ab1deadfff75bf59d62db021"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@opensourcerouting.org",
        "time": "Mon Oct 27 15:09:38 2014 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Apr 27 15:58:41 2015 +0100"
      },
      "message": "HACKING: Fix spelling mistakes\n\nAcked-by: Vincent Jardin \u003cvincent.jardin@6wind.com\u003e\n"
    },
    {
      "commit": "5bcbc3f58870bd28ab1deadfff75bf59d62db021",
      "tree": "f73ac5adc1856f4492eb352aa4d7aff774062248",
      "parents": [
        "dc684eb9976f8a1170312be42d142effce26b568"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@opensourcerouting.org",
        "time": "Wed Oct 29 10:33:17 2014 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sun Apr 26 18:07:30 2015 +0100"
      },
      "message": "gdb: Add a directory of files with gdb macros\n\n* gdb/: Directory to contain files with GDB macros. Organised by topic into\n  separate files.\n* gdb/lib.txt: General OS API and Quagga lib macros:\n  (def_ntohs) convert big-endian short to host order.\n  (def_ntohl) convert big-endian long to host order.\n  (walk_route_table_next) Walk to next route_node in a table, according\n  to given top and current node arguments.\n  (walk_route_table) walk the given route table dumping non-null info pointers,\n  from the given root node.\n  (dump_timeval) timeval to human readable output\n  (dump_s_addr) Print IP address of given pointer to a (struct in_addr).s_addr\n  (dump_s6_addr) Ditto for IPv6.\n  (dump_prefix4) Dump a Quagga (struct prefix_ipv4 *)\n  (dump_prefix6) Dump (struct prefix_ipv6 *)\n  (dump_prefix) Dump a (struct prefix *).\n  (rn_next_{down,up}) left-down and up-and-right walks of a route_table\n  from a given route_node.\n* gdb/ospfd.txt: ospfd specific gdb macros, depends on gdb/lib.txt\n  (dump_ospf_lsa_flags) LSA flags to text.\n  (dump_ospf_lsa_data) dump the data of a (struct lsa_header *) argument.\n  (dump_ospf_lsa) Dump the details of a (struct ospf_lsa *)\n  (walk_ospf_lsdb) Go through an LSDB, rooted at the\n  given (struct route_node *), and dump LSA details.\n  (ospf_backbone_lsdb_top) Get the LSDB top pointer for the given LSA type.\n"
    },
    {
      "commit": "dc684eb9976f8a1170312be42d142effce26b568",
      "tree": "1d1354118bc0b063e7048c86154339aa2f141d1c",
      "parents": [
        "06bd420d4646333bc7ed9964e348f19a942fcfe2",
        "e691c3bb972c0baf610d9e210ce20ea6546e1de0"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu Apr 23 13:31:17 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu Apr 23 13:36:08 2015 +0200"
      },
      "message": "Merge branch \u0027volatile/fix_warnings\u0027\n\nThanks to Donald Sharp and Greg Troxel for providing feedback!\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "e691c3bb972c0baf610d9e210ce20ea6546e1de0",
      "tree": "a3e83b01ecd4fe9e739a24dc77c61a46fd0531a2",
      "parents": [
        "193e78f2460a537695e34368a29fc5cd02e4e1f5"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Apr 21 10:46:13 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Apr 21 10:46:19 2015 +0200"
      },
      "message": "*: assorted warning fixes\n\nA few warnings slipped through the cracks...\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "193e78f2460a537695e34368a29fc5cd02e4e1f5",
      "tree": "50f23a15fd6847b8f39b8d003b0a6a6ff716a706",
      "parents": [
        "6ed810d986df5d843c89166fee6b73a71222b7bd"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Apr 21 10:42:30 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Apr 21 10:44:57 2015 +0200"
      },
      "message": "zebra: fix NetBSD interface stats printf\n\n\"format \u0027%qu\u0027 expects type \u0027long long unsigned int\u0027, but argument 3 has\ntype \u0027__uint64_t\u0027\"\n\nMove to %llu, which is more standard.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "6ed810d986df5d843c89166fee6b73a71222b7bd",
      "tree": "86ac070fc69ae3e62fc6bf5d8750990bf0fa6c3e",
      "parents": [
        "c313895dec3c176584d99f7b8684ddc3f9141d88"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Apr 21 10:13:07 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Apr 21 10:44:56 2015 +0200"
      },
      "message": "*: fix more initialisers (for BSD)\n\nFreeBSD and NetBSD spew a few more warnings about variable initialisers.\nFound with OSR\u0027s/NetDEF\u0027s fancy new CI system.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "c313895dec3c176584d99f7b8684ddc3f9141d88",
      "tree": "88c4715a57bfec3b9f0411ae30fc2fd69bc7c1ba",
      "parents": [
        "4b6c33282973c9e1545a519f2a51bda3cf42ae21"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Apr 21 10:02:23 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Apr 21 10:44:52 2015 +0200"
      },
      "message": "tests: fix warnings\n\nWhile I don\u0027t see -Werror being used on tests anytime soon, there\u0027s no\nreason to keep the warnings in tests unfixed.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "4b6c33282973c9e1545a519f2a51bda3cf42ae21",
      "tree": "1feeb189ff45197527e7a45d24976a27f44596c1",
      "parents": [
        "940b19911209d8ad2ea326c4a46e0fb044568edc"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Apr 21 09:47:57 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Apr 21 10:20:18 2015 +0200"
      },
      "message": "zebra: silence zebra_serv_un unused warning\n\nzebra_serv_un() is unused if --enable-tcp-zebra is given.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "940b19911209d8ad2ea326c4a46e0fb044568edc",
      "tree": "a973032a6ab9fc47a93e0102bb37e3e22f2c6f43",
      "parents": [
        "c0bedebfe9ca1a1ded02f1f481762dd41defa63e"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Apr 21 09:45:06 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Apr 21 10:19:47 2015 +0200"
      },
      "message": "pimd: fix out of tree build\n\npimd/Makefile.am was missing srcdir/lib from its include paths, breaking\nout-of-tree build regarding route_types.h\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "c0bedebfe9ca1a1ded02f1f481762dd41defa63e",
      "tree": "9c040f71733fb7509c03457bc146373e65e95536",
      "parents": [
        "3a7e83c2387885075c9ecf1912dd6c9399c6947a"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Mar 03 10:00:43 2015 +0100"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Apr 21 10:19:33 2015 +0200"
      },
      "message": "build: add --enable-werror\n\nThis allows enabling -Werror in a consistent way.  Note that this is\ndifferent from just specifiying it in CFLAGS, since that would either\nbreak configure tests (if done on ./configure), or would override\nconfigure\u0027s CFLAGS (if done on make).\n\nUsing --enable-werror instead provides a new WERROR variable that is\nadditionally used during make with a consistent set of warning flags.\n\nThe tests/ directory is exempt.  (Rationale being, better to have more\ntests than pedantically complain about them.)\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "3a7e83c2387885075c9ecf1912dd6c9399c6947a",
      "tree": "2a6d6fde62d16507bc836626fb83a8db6b0c32d3",
      "parents": [
        "53780e30c90ae393467afaf3ccff9e3791df5133"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Mar 03 09:55:51 2015 +0100"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Apr 21 10:19:24 2015 +0200"
      },
      "message": "build: determine CFLAGS more intelligently\n\nInstead of hardcoding some compiler detection, this just checks which\nCFLAGS actually work with the compiler specified by the user.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "53780e30c90ae393467afaf3ccff9e3791df5133",
      "tree": "a02c36b3e1740c457bd3a5a6fd93847d8aaead9f",
      "parents": [
        "d689d1a0c69726330d69b2dd412fdb8dcb23394b"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Mar 03 09:07:09 2015 +0100"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Apr 21 10:19:19 2015 +0200"
      },
      "message": "bgpd: drop unused static variable\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "d689d1a0c69726330d69b2dd412fdb8dcb23394b",
      "tree": "ff0d7e24363df5021d9a51bd79c04728398c82c6",
      "parents": [
        "dfee58f1d41a2e36c7f5f38a3ef5712224131824"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Mar 03 13:54:30 2015 +0100"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Apr 21 10:19:14 2015 +0200"
      },
      "message": "bgpd: fix SNMP write support\n\nThis code - dating back to the initial import in 2002 - probably never\nworked.  Calling asn_parse_int seems to always have been wrong, and in\nthe meantime, there no longer is a \"struct variable *\" argument for\nwrite_method.  If anyone tried to use it, it\u0027d probably have crashed.\n(I didn\u0027t try.)\n\nFix this up so it actually works.  It\u0027s the only place in Quagga where a\nSNMP write is actually supported, so it\u0027s an odd one out anyway, but\nheh.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "dfee58f1d41a2e36c7f5f38a3ef5712224131824",
      "tree": "10e588443180a85a6ac019db1ded6b1144f32a7c",
      "parents": [
        "6769f43de9d595b935f2ebf1cae1428e1d1a3a5f"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed Mar 04 06:44:57 2015 +0100"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Apr 21 10:19:10 2015 +0200"
      },
      "message": "snmp: fix warnings\n\nbatch-fix all warnings that come up when enabling AgentX SNMP support.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "6769f43de9d595b935f2ebf1cae1428e1d1a3a5f",
      "tree": "564d37a5c20e0511189d54c245faf7dab955d9b6",
      "parents": [
        "a9eb9063071437f5cde3b78adf273b428c49d378"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed Mar 04 07:18:24 2015 +0100"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Apr 21 10:19:06 2015 +0200"
      },
      "message": "vtysh: drop unused variables \u0026 RETSIGTYPE\n\nDrop unused return values in vtysh.  Also gets rid of the rather funny\nprototyping of signal setup in vtysh - which as a side effect makes it\nnot need AC_TYPE_SIGNAL in configure.ac anymore.  It wasn\u0027t used\nsensibly to begin with...\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "a9eb9063071437f5cde3b78adf273b428c49d378",
      "tree": "9585ab44c0662bab068a7fa820c7713ffa4443a4",
      "parents": [
        "a91a3bac14976c04bf22b20c7e4bada787ec79b1"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed Mar 04 07:07:01 2015 +0100"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Apr 21 10:19:04 2015 +0200"
      },
      "message": "vtysh: fix function prototypes\n\nThis makes a whole bunch of vtysh functions static, fixes prototypes for\na few more, and masks user_free() and user_write_config() (both unused.)\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "a91a3bac14976c04bf22b20c7e4bada787ec79b1",
      "tree": "1c16b21c785b22c4f7c093e80dcf2c2af20243d1",
      "parents": [
        "3cf4053a9e832408fad33a8246ecbd189f23a956"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Mar 03 09:06:51 2015 +0100"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Apr 21 10:19:01 2015 +0200"
      },
      "message": "vtysh: don\u0027t use \u0027\\0\u0027 as NULL\n\nfor some reason, the vty code was using \u0027\\0\u0027 in place of NULL.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "3cf4053a9e832408fad33a8246ecbd189f23a956",
      "tree": "c55451f64ca56d5df10cbedb66b3aa1e3928ba8a",
      "parents": [
        "72c69d434840598a158747ba9f69dad536f96cea"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Sun Apr 19 14:54:03 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Apr 21 10:19:01 2015 +0200"
      },
      "message": "ospf6d: fix pointer arithmetic warning\n\ncaddr_t was signed; this buffer size comparison is better done in\nunsigned.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "72c69d434840598a158747ba9f69dad536f96cea",
      "tree": "e03e73f818cc2497bc991ae133a990e67358d136",
      "parents": [
        "0de0138a9146074f268245193e45c9376d998722"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Mar 03 09:08:20 2015 +0100"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Apr 21 10:18:58 2015 +0200"
      },
      "message": "ospf6d: oi-\u003ecost is uint32, not short\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    }
  ],
  "next": "0de0138a9146074f268245193e45c9376d998722"
}
