)]}'
{
  "log": [
    {
      "commit": "6dbb58c04078c31ca3f43e9754b498aa3be6518b",
      "tree": "aa3e45faeb5fd7979a4026550382f0feb95def26",
      "parents": [
        "c876b0b27e398c7d733966ce8636c26dd7a8e6eb"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@jakma.org",
        "time": "Wed Feb 08 15:05:06 2017 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Thu Feb 23 12:31:00 2017 +0000"
      },
      "message": "zebra: Make the --nl-bufsize arg set the input parse buffer too\n\n* See bug #887. Existing statically sized NL_PKT_BUF_SIZE input parse buffer\n  in netlink_parse_info may not be enough. As an initial hacky fix, at least\n  give admins a runtime way to change this buffer, with the existing\n  --nl-bufsize argument to zebra.\n* rt_netlink.c: (nl_rcvbuf) static input buffer and length.\n  (netlink_parse_info) replace the local fixed size buffer with nl_rcvbuf.\n  Improve warning on MSG_TRUNC to advise admin on what to do.\n  (kernel_init) Dynamically allocate nl_rcvbuf input parse buffer to\n  at least 2 pages, or nl_rcvbufsize argument, whichever is greater.\n\nBased on the debugging and investigation of:\n\n  Konstantin \u003ctempest921@gmail.com\u003e\n"
    },
    {
      "commit": "f408fa2c81a8e5873cb0a8c37fe44e389f65d50e",
      "tree": "24f9a28e1373e61fa03f09c20784874ccfe6f24f",
      "parents": [
        "2d81a7a8e425dcc4ca0cda411e73915f7ec3c1c9"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Mon Apr 25 15:50:31 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Jan 27 14:53:31 2017 +0000"
      },
      "message": "lib: Add a trivial sockunion_get_port helper function\n"
    },
    {
      "commit": "23426d21d5ceccec47d80288e8cf411e44f59e58",
      "tree": "c87efeadacf02c0a454e28f75285172e2e1b8aea",
      "parents": [
        "7fa7acb4926f2a0d1fb5eb0834ae6c60b8ba5147"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@jakma.org",
        "time": "Mon Jan 23 10:55:55 2017 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Jan 27 14:53:30 2017 +0000"
      },
      "message": "lib: routemap.h depends on prefix.h\n"
    },
    {
      "commit": "3334bab0d96b2d7064111e025ff6294d6a32d026",
      "tree": "665e079e1643db0ae957acadfa5e5497f0f645ac",
      "parents": [
        "f2a4b8fffb1f771371d6bfc425e7a69a14057b06"
      ],
      "author": {
        "name": "Job Snijders",
        "email": "job@instituut.net",
        "time": "Fri Jan 20 14:47:12 2017 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Jan 27 14:53:20 2017 +0000"
      },
      "message": "bgpd: Add support for BGP Large Communities\n\nAs described by Michael Lambert \u003clambert@psc.edu\u003e  to the list:\n\n  Traditional communities are four-octet entities to support two-octet ASNs\n  and are usually represented as \u003casn\u003e:\u003cdata\u003e.  Large communities are an\n  enhancement to support four-octet ASNs and are 12 octets long, represented\n  as \u003casn\u003e:\u003cdata-1\u003e:\u003cdata-2\u003e.\n\n  This issue has been tracked in quagga bugzilla ticket #875, which documents\n  some of the usage and indicates that some testing has been done.\n\nTODO: Documentation - update doc/bgpd.texi.\n\n* bgp_attr.{c,h}: Add BGP_ATTR_LARGE_COMMUNITIES codepoint. Add\n  (struct lcommunity *) to (struct bgp_attr_extra).\n* bgp_clist.{c,h}: Large community codepoints and routines.\n* bgp_route.c: Display support.\n* bgp_routemap.c: \u0027match lcommunity\u0027, \u0027set large-community\u0027 and\n  \u0027set large-comm-list\u0027\n* bgp_vty.c: Peer configuration, add \u0027large\u0027 to \u0027neighbor send-community ..\u0027.\n  Add \"show ip bgp large-community\", \"\"ip large-community-list ...\".\n\nAuthors: Keyur Patel \u003ckeyur@arrcus.com\u003e\n         Job Snijders \u003cjob@instituut.net\u003e\n"
    },
    {
      "commit": "a2f0db2be27385211f033271d8b83e9caf362236",
      "tree": "15de9347d92427dd99d7566ccfcf7a787b12dc61",
      "parents": [
        "366bb4ab851137e669a2e7db7a45d73b39090249"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Thu Feb 25 16:41:56 2016 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 23 18:51:59 2017 +0000"
      },
      "message": "lib: track worst case # of cycles and don\u0027t allow granularity to go above\n\n* The workqueue code at present errs towards optimising the granularity\n  for throughput of queue items in runs.  This perhaps is at the cost\n  of risking excessive delays at times.  Make the workqueue take\n  worst-cases into account.\n\n* thread.c: (thread_should_yield) When thread should yield, we can\n  return the time taken for free, as it might be useful to caller.\n  work_queue_run\n\n* workqueue.h: (struct work_queue) Add fields for worst # of cycles,\n  and (independently) worst time taken.\n\n* workqueue.c: (work_queue_new) Worst starts high.\n\n  (work_queue_run) Track the worst number of cycles taken, where a\n  queue run had to yield before clearing out the queue.  Use this as an\n  upper-bound on the granularity, so the granulity can never increase.\n\n  Track the worst-case delay per work-queue, where it had to yield, thanks\n  to the thread_should_yield return value change.  Note that \"show thread\n  cpu\" already shows stats for the work_queue_run function, inc average and\n  worst cases.\n\nDeficiencies:\n\n- A spurious outside delay (e.g.  process not run in ages) could cause\n  \u0027worst\u0027 to be very low in some particular invocation of a process,\n  and it will stay that way for life of process.\n\n- The whole thing of trying to calculate suitable granularities is just\n  fragile and impossible to get 100% right.\n"
    },
    {
      "commit": "867946bb8802c02049bf68a4e97843d777cbcb68",
      "tree": "572fbcb0edcdb3fd53a0ad6d8f9d402be43dd266",
      "parents": [
        "0c175f82a812c6e86eeb2c11b7f3f96bf46459fa"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Mon Dec 21 13:39:33 2015 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 23 18:51:58 2017 +0000"
      },
      "message": "lib: vty_prefix_list_install should validate afi/safi\n\n* lib/plist.c: (vty_prefix_list_install) Check afi/safi is supported and warn\n  if not, as a safeguard and to ensure the user is warned, if somehow that\n  code is ever called for non-IP AFI.\n"
    },
    {
      "commit": "ddc160cce1767ef006a812f5213cabfb24e3cd4d",
      "tree": "6e4aa078fb897d77edcb7ef16282471c518440b4",
      "parents": [
        "5958b8f790f0049f980b74b3e2916979850e5d09"
      ],
      "author": {
        "name": "Christian Franke",
        "email": "chris@opensourcerouting.org",
        "time": "Sat Oct 01 20:42:34 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 23 18:51:56 2017 +0000"
      },
      "message": "*: Port Christians tweaks for 32-bit route tags\n\nPort over Christian\u0027s tweaks from his port of my commit widening the\nroute-tag field width to 32-bit.  Commit dc9ffce8786844\n \"*: Consistently support 32-bit route tags\".\n\nwith \"changes which make this actually useful for all the daemons\".\n\nThis is missing the zebra route-map changes.\n"
    },
    {
      "commit": "dafa05e65fe4b3b3ed5525443f554215ba14f42c",
      "tree": "77d152b32b3fc3766f1813927b0eb40efa36425e",
      "parents": [
        "56ae5c4847f53f10e2151039556ec76a7a94c7fb"
      ],
      "author": {
        "name": "Timo Teräs",
        "email": "timo.teras@iki.fi",
        "time": "Thu Jan 19 17:27:01 2017 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 23 18:51:55 2017 +0000"
      },
      "message": "nhrpd: implement next hop resolution protocol\n\nThis provides DMVPN support and integrates to strongSwan. Please read\nREADME.nhrpd and README.kernel for more details.\n"
    },
    {
      "commit": "be987c2804730f39828e2e047fb09f05ebd9915a",
      "tree": "f13703cdc26dd6cf78184228cd1b1209ed6838f9",
      "parents": [
        "99f567205357570091ba109caad126b7bafcf8ce"
      ],
      "author": {
        "name": "Quentin Young",
        "email": "qlyoung@cumulusnetworks.com",
        "time": "Thu Jun 16 11:26:44 2016 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 23 18:51:55 2017 +0000"
      },
      "message": "lib: Clean command.c\n\nRemoved dead code paths and fixed a typo.\n\nSigned-off-by: Quentin Young \u003cqlyoung@cumulusnetworks.com\u003e\nSigned-off-by: Quentin Young \u003cqlyoung@cumulusnetworks.com\u003e\nTested-by: NetDEF CI System \u003ccisystem@netdef.org\u003e\n"
    },
    {
      "commit": "cfb4826340ab177b3cfbce4f138187f41860b68e",
      "tree": "ae45c07809bbb976e42b34e1b5966879065ba2c5",
      "parents": [
        "47fb0a8eb8138572a9117156223259413a956e81"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Mon Jun 13 17:29:14 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 23 18:51:54 2017 +0000"
      },
      "message": "lib: AgentX: use threads instead of eventloop hack\n\nAgentX fd/timeout handling is rather hackishly monkeyed into thread.c.\nReplace with code that uses plain thread_* functions.\n\nNB: Net-SNMP\u0027s API rivals Quagga\u0027s in terms of age and absence of\ndocumentation.  netsnmp_check_outstanding_agent_requests() in particular\nseems to be unused and is therefore untested.\n\nThe most useful documentation on this is actually the blog post Vincent\nBernat wrote when he originally integrated this into lldpd and Quagga:\nhttps://vincent.bernat.im/en/blog/2012-snmp-event-loop.html\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "47fb0a8eb8138572a9117156223259413a956e81",
      "tree": "e5653fd70a24b908b63509d5721e66a15d1ea157",
      "parents": [
        "449b29e8bd9fb1ae2e57cea7074e1b9778343455"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Mon Jun 13 17:29:13 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 23 18:51:53 2017 +0000"
      },
      "message": "lib: add thread_add_timer_tv (struct timeval)\n\nAnother zoo extension, this adds a timer scheduling function that takes\na struct timeval argument (which is actually what the wrappers boil down\nto, yet it\u0027s not exposed...)\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "449b29e8bd9fb1ae2e57cea7074e1b9778343455",
      "tree": "0f4d1897e1b17123a50f7351c74006badbd232da",
      "parents": [
        "c96e78dde1f118eaee4269aa2c91ef70850e5423"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Mon Jun 13 17:29:12 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 23 18:51:53 2017 +0000"
      },
      "message": "lib: linklist: add listnode_add_before()\n\nThis utility function, to join the zoo that the Quagga linked-list\nimplementation has accumulated, does an insert-before while returning\nthe newly allocated node.\n\nIt is similar to:\n- listnode_add_after(), but\n  - complementary direction\n  - returns allocated node\n- list_add_node_prev(), but\n  - supports before \u003d\u003d NULL\n  - returns allocated node\n\nIn general, the entire linked-list implementation is in bad shape, and\nwhile it needs a cleanup / rewrite / replacement, this would both cause\nsignificant conflicts and block other cleanups...\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "dc633bd1833c4b9df44df27135ce12fef884b53f",
      "tree": "96e7a64e4b664b7ac7f64eb35782d92a4817fa9a",
      "parents": [
        "95509a6f55c63b72541fa390f7dda7fab2fa3210"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@jakma.org",
        "time": "Mon Dec 26 17:25:26 2016 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 23 18:51:52 2017 +0000"
      },
      "message": "lib/stream: Add stream_discard, to discard read data from a stream\n\n* stream.c: (stream_discard) Discard the already data from a stream, as\n  indicated by the getp. Move remaining, unread data, to the beginning of\n  the stream. get and end stream pointers are updated as appropriate.\n\n  If all data has been consumed, then this behaves identically to\n  stream_reset.\n"
    },
    {
      "commit": "9ed99f040f0dd14d0aca82e159f67d27e64042ae",
      "tree": "d6b41a1731532d9258e3ad0638675b6191edaa82",
      "parents": [
        "64f8c7d80fd9685936613f6c564b9572dd28561d"
      ],
      "author": {
        "name": "Baruch Siach",
        "email": "baruch@tkos.co.il",
        "time": "Sun Aug 21 09:23:05 2016 +0300"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 23 18:51:51 2017 +0000"
      },
      "message": "lib/memory: fix indirect static link with zlib\n\nquagga SNMP support depends on netsnmp, that optionally depends on OpenSSL,\nwhich in turn requires zlib. zlib exports the \u0027zcalloc\u0027 symbol, which collides\nwith a function of the same name in memory.c. This is not a problem when\nlinking dynamically, since quagga does not use zlib directly. But static\nlinking fails with the error:\n\n  CCLD     ospfd\n.../output/host/usr/mips64el-buildroot-linux-uclibc/sysroot/usr/lib/libz.a(zutil.o): In function `zcalloc\u0027:\nzutil.c:(.text+0x48): multiple definition of `zcalloc\u0027\n.../output/build/quagga-1.0.20160315/lib/.libs/libzebra.a(memory.o):memory.c:(.text+0x1a0): first defined here\n\nRename \u0027zcalloc\u0027 to \u0027zzcalloc\u0027 to avoid symbol collision.\n\nSigned-off-by: Baruch Siach \u003cbaruch@tkos.co.il\u003e\nSigned-off-by: Baruch Siach \u003cbaruch@tkos.co.il\u003e\n"
    },
    {
      "commit": "126b0e7c2915fb7ec3e5f72e625433a83568c7d6",
      "tree": "c864b9af705854b133a96a417057b5605ff4b37d",
      "parents": [
        "f5a4488a0dda521f19e96f2615f4a8b134c5878b"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Nov 18 14:40:41 2016 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 23 17:20:51 2017 +0000"
      },
      "message": "vty: Add ctrl-v \u003cliteral\u003e to allow, e.g., \u0027?\u0027 to be input for regex\n\n* Support the standard ctrl-v \u003cliteral\u003e control sequence. Otherwise there\n  is no way to do this from the venerable telnet vty. vtysh supports this\n  (configurably) via readline.\n* lib/vty.c: (VTY_ESC_LITERAL) New mode, for ctrl-v.\n  (vty_read) Additional mode to go ctrl-v -\u003e VTY_ESC_LITERAL, and\n  always insert next char.\n\nAcked-by: Vincent.Jardin@6wind.com\n"
    },
    {
      "commit": "71e0ba780bd7ba1a6fdc71ff673e3ef5aee61e08",
      "tree": "f7d95da993316c23f1a8f751fc9cafff01eedcf9",
      "parents": [
        "a64c66b105929b0f0fc19743f34dc29c760df967"
      ],
      "author": {
        "name": "Nick Hilliard",
        "email": "nick@foobar.org",
        "time": "Tue Dec 27 22:51:51 2016 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 23 17:20:50 2017 +0000"
      },
      "message": "vtysh: make warnings about node installs a non-default compile-time option\n\n* lib/command.c: (install_element) Suppress duplicate command install warnings\n  for vtysh\n"
    },
    {
      "commit": "99e00a19bb8afcf081d1551b886c6d85188e6c60",
      "tree": "37bd6710fcb40e44b6e2f8e53b22c4cb81f77efb",
      "parents": [
        "7d66284a5817a1613b1e4d64a0775ec04fdf8c01"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@jakma.org",
        "time": "Mon Jan 23 14:47:32 2017 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 23 17:20:50 2017 +0000"
      },
      "message": "lib: Bump library version-info\n"
    },
    {
      "commit": "7d66284a5817a1613b1e4d64a0775ec04fdf8c01",
      "tree": "263bc1ad86743e45f14c74e83cddef326330b578",
      "parents": [
        "b7ceefea77a246fe5c1dcd1b91bf6079d1b97c02"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@jakma.org",
        "time": "Thu Jan 19 10:39:23 2017 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 23 17:19:39 2017 +0000"
      },
      "message": "lib: ensure vty buf is nul terminated and wrap puts to it with checks\n\n* vty.c: Fix str* overruns in previous commit, which I reported to the\n  author. Add bit more checking of updates to vty buffer.\n  Swap VTY_BUFSIZ over to vty-\u003emax, as that should be the external API.\n* vty.c: (vty_buf_assert) conditions that should always be assertable for\n  vty buffer.\n  (vty_buf_put) little wrapper to check char puts to vty input buffer,\n  and unconditionally write nul at very end of buffer as guard.\n  Won\u0027t always work, as some places use mem* to manipulate.\n  (vty_self_insert{,_overwrite}) Length check needs to leave room for nul.\n  Use vty_buf_put.\n  (vty_insert_word_overwrite) Length check needs to leave room for nul.\n  (*) Add vty_buf_assert calls.\n\nMerging in fixes from Quentin Young \u003cqlyoung@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "b7ceefea77a246fe5c1dcd1b91bf6079d1b97c02",
      "tree": "a67ab3ef89e499e8ff7d8d044f6ee2837ca75f0d",
      "parents": [
        "5477ee7b9d8d24d2bb61335c62f3d6c5e99fc901"
      ],
      "author": {
        "name": "Quentin Young",
        "email": "qlyoung@cumulusnetworks.com",
        "time": "Tue Jan 10 23:33:50 2017 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Jan 20 12:25:22 2017 +0000"
      },
      "message": "lib: limit size of vty buffer to 4096 bytes\n\nThis removes the automatic resizing of the vty input buffer and places a\nhard size cap of 4096 bytes. It also fixes a potentially unsafe strcpy.\n\n[Edits by Paul Jakma, paul@jakma.org]\n"
    },
    {
      "commit": "4c7efde6db75229069be72b34a93f279fe57d23b",
      "tree": "fb3850cefcb7024fef5f16cc9e056e137d814b04",
      "parents": [
        "988a50c54dbd20290c085a36d4c2893f3d515803"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Mon Nov 16 18:19:18 2015 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Oct 04 13:07:51 2016 +0100"
      },
      "message": "zebra: Add check to notice when an interface is unnumbered\n\nIf an interface is not a loopback and it\u0027s prefixlen \u003d\u003d 32\nassume that it is unnumbered.\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "988a50c54dbd20290c085a36d4c2893f3d515803",
      "tree": "def010434d1cf49f61ccbb73dd53f862fef53c82",
      "parents": [
        "9e518dd52b1fbf7d395a6bb49a101d632ced5e5b"
      ],
      "author": {
        "name": "Daniel Walton",
        "email": "dwalton@cumulusnetworks.com",
        "time": "Tue May 19 17:58:11 2015 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Oct 04 13:07:51 2016 +0100"
      },
      "message": "bgpd, lib: Clarify the different permutations of soft clearing a peer\n\nCleanup vtysh output for the soft clearing of a bgp peer so\nthat it is clearer what is going to happen.\n\nSigned-off-by: Daniel Walton \u003cdwalton@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "96d1060a704d88e04fcd446cce078a6131c3f6db",
      "tree": "89a6f1285550a2d2f149479cc272450e63294ebc",
      "parents": [
        "3b4fb574b414e7b7776b581688f189f2fc736a38"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Jul 01 14:23:45 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Oct 04 13:07:50 2016 +0100"
      },
      "message": "*: Widen width of Zserv routing tag field.\n\n* lib/zebra.h: Introduce a route_tag_t type for route tags generally,\n  and make it 4 bytes wide - so it can directly hold things like an ASN, or\n  the OSPF ASE-LSA tag.\n* zebra/rib.h: Use route_tag_t instead of u_short.\n* *: Update \u0027u_short (*)?(tag|tmp)\u0027 to use route_tag_t instead of u_short.\n  Update stream_{get,put} to l instead of w.\n* ospf_zebra.c: (ospf_zebra_add) test OSPF tag within range of ROUTE_TAG_MAX.\n"
    },
    {
      "commit": "eefddcc78abcc91d1d88633a3c6d5a438fe58790",
      "tree": "1f5faa31c5070770c55e3f2c52911121fa095efe",
      "parents": [
        "de24f82d0ea7eadd0db7d5c0d340a0579312237c"
      ],
      "author": {
        "name": "Piotr Chytła",
        "email": "pch@packetconsulting.pl",
        "time": "Tue Dec 01 09:48:02 2015 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Oct 04 13:07:49 2016 +0100"
      },
      "message": "bgpd, lib, ospfd, zebra: Add ability to read/write tag value\n\nModify zebra to pass the tag value to and from the\nvarious protocols.\n\n[forward ported by Cumulus]\n\nSigned-off-by: Daniel Walton \u003cdwalton@cumulusnetworks.com\u003e\nSigned-off-by: Piotr Chytla \u003cpch@packetconsulting.pl\u003e\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\nEdits: Paul Jakma \u003cpaul.jakma@hpe.com\u003e rebase conflicts in bgp_zebra.c\n"
    },
    {
      "commit": "af309fa58f41457eed226d6650d0b780c053c4d8",
      "tree": "a11a111ef50ad82b73dbf2ab6a172c7db97bbc5f",
      "parents": [
        "a4f40293db1055387d5b901fe0dbb556226b2024"
      ],
      "author": {
        "name": "Pradosh Mohapatra",
        "email": "pmohapat@cumulusnetworks.com",
        "time": "Mon Nov 09 20:21:47 2015 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:45 2016 +0100"
      },
      "message": "bgpd: Show more meaningful outq value in \u0027show ip bgp summary\u0027 output.\n\n\u0027outq\u0027 field in \u0027show ip bgp sum\u0027 displays the number of formatted packets\nto a peer. Since the route announcement follows an input-buffered pattern\n(i.e. adj-rib-out is a separate queue of routes per peer and packets are\nformatted from the routes at the time of TCP write), the outq field doesn\u0027t\nshow any interesting data worth watching.\n\nThe patch is to display the adj-rib-out queue depth instead.\n\nsigned-off-by: pmohapat@cumulusnetworks.com\nreviewed-by: dwalton@cumulusnetworks.com\n"
    },
    {
      "commit": "0f2f7a3fa5d55e682d0739d586da021cbd43bc3c",
      "tree": "a8bdff569d71a784e2ba4ab154ce6ab70103638a",
      "parents": [
        "94627e670d661f95217521ef0bfba141e5e37e68"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Thu Jun 16 15:40:02 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:44 2016 +0100"
      },
      "message": "*: Fix duplicate commands from view/enable node consolidation\n"
    },
    {
      "commit": "60cc95921ae663de325ca3e76e8c05d8224986ab",
      "tree": "7d78102aa9650da4bba1355b2a6601135d687b37",
      "parents": [
        "4feb0d02c029e2e4f229f6283f579b8673b0ac11"
      ],
      "author": {
        "name": "Pradosh Mohapatra",
        "email": "pmohapat@cumulusnetworks.com",
        "time": "Mon Nov 09 20:21:41 2015 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:44 2016 +0100"
      },
      "message": "bgpd, doc, lib, zebra: nexthop-tracking in zebra\n\n0. Introduction\n\nThis is the design specification for next hop tracking feature in\nQuagga.\n\n1. Background\n\nRecursive routes are of the form:\n\n   p/m --\u003e n\n  [Ex: 1.1.0.0/16 --\u003e 2.2.2.2]\n\nwhere \u0027n\u0027 itself is resolved through another route as follows:\n\n   p2/m --\u003e h, interface\n  [Ex: 2.2.2.0/24 --\u003e 3.3.3.3, eth0]\n\nUsually, BGP routes are recursive in nature and BGP nexthops get\nresolved through an IGP route. IGP usually adds its routes pointing to\nan interface (these are called non-recursive routes).\n\nWhen BGP receives a recursive route from a peer, it needs to validate\nthe nexthop. The path is marked valid or invalid based on the\nreachability status of the nexthop.  Nexthop validation is also\nimportant for BGP decision process as the metric to reach the nexthop\nis a parameter to best path selection process.\n\nAs it goes with routing, this is a dynamic process. Route to the\nnexthop can change. The nexthop can become unreachable or\nreachable. In the current BGP implementation, the nexthop validation\nis done periodically in the scanner run. The default scanner run\ninterval is one minute. Every minute, the scanner task walks the\nentire BGP table. It checks the validity of each nexthop with Zebra\n(the routing table manager) through a request and response message\nexchange between BGP and Zebra process. BGP process is blocked for\nthat duration. The mechanism has two major drawbacks:\n\n(1) The scanner task runs to completion. That can potentially starve\n    the other tasks for long periods of time, based on the BGP table\n    size and number of nexthops.\n\n(2) Convergence around routing changes that affect the nexthops can be\n    long (around a minute with the default intervals). The interval\n    can be shortened to achieve faster reaction time, but it makes the\n    first problem worse, with the scanner task consuming most of the\n    CPU resources.\n\n\"Next hop tracking\" feature makes this process event-driven. It\neliminates periodic nexthop validation and introduces an asynchronous\ncommunication path between BGP and Zebra for route change notifications\nthat can then be acted upon.\n\n2. Goal\n\nStating the obvious, the main goal is to remove the two limitations we\ndiscussed in the previous section. The goals, in a constructive tone,\nare the following:\n\n- fairness: the scanner run should not consume an unjustly high amount\n  of CPU time. This should give an overall good performance and\n  response time to other events (route changes, session events,\n  IO/user interface).\n\n- convergence: BGP must react to nexthop changes instantly and provide\n  sub-second convergence. This may involve diverting the routes from\n  one nexthop to another.\n\n3. Overview of the changes\n\nThe changes are in both BGP and Zebra modules.  The short summary is\nthe following:\n\n- Zebra implements a registration mechanism by which clients can\n   register for next hop notification. Consequently, it maintains a\n   separate table, per (VRF, AF) pair, of next hops and interested\n   client-list per next hop.\n\n- When the main routing table changes in Zebra, it evaluates the next\n   hop table: for each next hop, it checks if the route table\n   modifications have changed its state. If so, it notifies the\n   interested clients.\n\n- BGP is one such client. It registers the next hops corresponding to\n   all of its received routes/paths. It also threads the paths against\n   each nexthop structure.\n\n- When BGP receives a next hop notification from Zebra, it walks the\n   corresponding path list. It makes them valid or invalid depending\n   on the next hop notification. It then re-computes best path for the\n   corresponding destination. This may result in re-announcing those\n   destinations to peers.\n\n4. Design\n\n4.1. Modules\n\nThe core design introduces an \"nht\" (next hop tracking) module in BGP\nand \"rnh\" (recursive nexthop) module in Zebra. The \"nht\" module\nprovides the following APIs:\n\nbgp_find_or_add_nexthop() : find or add a nexthop in BGP nexthop table\nbgp_find_nexthop() : find a nexthop in BGP nexthop table\nbgp_parse_nexthop_update() : parse a nexthop update message coming\n                              from zebra\n\nThe \"rnh\" module provides the following APIs:\n\nzebra_add_rnh() : add a recursive nexthop\nzebra_delete_rnh() : delete a recursive nexthop\nzebra_lookup_rnh() : lookup a recursive nexthop\n\nzebra_add_rnh_client() : register a client for nexthop notifications\n                         against a recursive nexthop\n\nzebra_remove_rnh_client(): remove the client registration for a\n                            recursive nexthop\n\nzebra_evaluate_rnh_table(): (re)evaluate the recursive nexthop table\n                            (most probably because the main routing\n                            table has changed).\n\nzebra_cleanup_rnh_client(): Cleanup a client from the \"rnh\" module\n                            data structures (most probably because the\n                            client is going away).\n\n4.2. Control flow\n\nThe next hop registration control flow is the following:\n\n\u003c\u003d\u003d\u003d\u003d      BGP Process       \u003d\u003d\u003d\u003d\u003e|\u003c\u003d\u003d\u003d\u003d      Zebra Process      \u003d\u003d\u003d\u003d\u003e\n                                  |\nreceive module     nht module     |  zserv module        rnh module\n----------------------------------------------------------------------\n              |                   |                  |\nbgp_update_   |                   |                  |\n      main()  | bgp_find_or_add_  |                  |\n              |        nexthop()  |                  |\n              |                   |                  |\n              |                   | zserv_nexthop_   |\n              |                   |       register() |\n              |                   |                  | zebra_add_rnh()\n              |                   |                  |\n\nThe next hop notification control flow is the following:\n\n\u003c\u003d\u003d\u003d\u003d     Zebra Process    \u003d\u003d\u003d\u003d\u003e|\u003c\u003d\u003d\u003d\u003d      BGP Process       \u003d\u003d\u003d\u003d\u003e\n                                |\nrib module         rnh module   |     zebra module        nht module\n----------------------------------------------------------------------\n              |                 |                   |\nmeta_queue_   |                 |                   |\n    process() | zebra_evaluate_ |                   |\n              |     rnh_table() |                   |\n              |                 |                   |\n              |                 | bgp_read_nexthop_ |\n              |                 |          update() |\n              |                 |                   | bgp_parse_\n              |                 |                   | nexthop_update()\n              |                 |                   |\n\n4.3. zclient message format\n\nZEBRA_NEXTHOP_REGISTER and ZEBRA_NEXTHOP_UNREGISTER messages are\nencoded in the following way:\n\n/*\n *     0                   1                   2                   3\n *  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * |     AF                        |  prefix len   |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * .      Nexthop prefix                                           .\n * .                                                               .\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * .                                                               .\n * .                                                               .\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * |     AF                        |  prefix len   |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * .      Nexthop prefix                                           .\n * .                                                               .\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n */\n\nZEBRA_NEXTHOP_UPDATE message is encoded as follows:\n\n/*\n *     0                   1                   2                   3\n *  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * |     AF                        |  prefix len   |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * .      Nexthop prefix getting resolved                          .\n * .                                                               .\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * |        metric                                                 |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * |  #nexthops    |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * | nexthop type  |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * .      resolving Nexthop details                                .\n * .                                                               .\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * .                                                               .\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * | nexthop type  |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * .      resolving Nexthop details                                .\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n */\n\n4.4. BGP data structure\n\nLegend:\n\n/\\   struct bgp_node: a BGP destination/route/prefix\n\\/\n\n[ ]  struct bgp_info: a BGP path (e.g. route received from a peer)\n\n _\n(_)  struct bgp_nexthop_cache: a BGP nexthop\n\n   /\\         NULL\n   \\/--+        ^\n       |        :\n       +--[ ]--[ ]--[ ]--\u003e NULL\n   /\\           :\n   \\/--+        :\n       |        :\n       +--[ ]--[ ]--\u003e NULL\n                :\n  _             :\n (_).............\n\n4.5. Zebra data structure\n\nrnh table:\n\n           O\n          / \\\n         O   O\n            / \\\n           O   O\n\n        struct rnh\n        {\n          u_char flags;\n          struct rib *state;\n          struct list *client_list;\n          struct route_node *node;\n        };\n\n5. User interface changes\n\nquagga# show ip nht\n3.3.3.3\n resolved via kernel\n via 11.0.0.6, swp1\n Client list: bgp(fd 12)\n11.0.0.10\n resolved via connected\n is directly connected, swp2\n Client list: bgp(fd 12)\n11.0.0.18\n resolved via connected\n is directly connected, swp4\n Client list: bgp(fd 12)\n11.11.11.11\n resolved via kernel\n via 10.0.1.2, eth0\n Client list: bgp(fd 12)\n\nquagga# show ip bgp nexthop\nCurrent BGP nexthop cache:\n 3.3.3.3 valid [IGP metric 0], #paths 3\n  Last update: Wed Oct 16 04:43:49 2013\n\n 11.0.0.10 valid [IGP metric 1], #paths 1\n  Last update: Wed Oct 16 04:43:51 2013\n\n 11.0.0.18 valid [IGP metric 1], #paths 2\n  Last update: Wed Oct 16 04:43:47 2013\n\n 11.11.11.11 valid [IGP metric 0], #paths 1\n  Last update: Wed Oct 16 04:43:47 2013\n\nquagga# show ipv6 nht\nquagga# show ip bgp nexthop detail\n\nquagga# debug bgp nht\nquagga# debug zebra nht\n\n6. Sample test cases\n\n     r2----r3\n    /  \\  /\n  r1----r4\n\n- Verify that a change in IGP cost triggers NHT\n  + shutdown the r1-r4 and r2-r4 links\n  + no shut the r1-r4 and r2-r4 links and wait for OSPF to come back\n    up\n  + We should be back to the original nexthop via r4 now\n- Verify that a NH becoming unreachable triggers NHT\n  + Shutdown all links to r4\n- Verify that a NH becoming reachable triggers NHT\n  + no shut all links to r4\n\n7. Future work\n\n- route-policy for next hop validation (e.g. ignore default route)\n- damping for rapid next hop changes\n- prioritized handling of nexthop changes ((un)reachability vs. metric\n  changes)\n- handling recursion loop, e.g.\n   11.11.11.11/32 -\u003e 12.12.12.12\n   12.12.12.12/32 -\u003e 11.11.11.11\n   11.0.0.0/8 -\u003e \u003cinterface\u003e\n- better statistics\nAddresses upstream comments.\n\n\"show ip bgp nexthop detail\" couldn\u0027t display multiple NHs due to a bug.\nFix that.\n\nFix reference counts for the nexthop cache entries\n\nSigned-off-by: Pradosh Mohapatra \u003cpmohapat@cumulusnetworks.com\u003e\nSigned-off-by: Daniel Walton \u003cdwalton@cumulusnetworks.com\u003e\nSigned-off-by: Dinesh Dutt \u003cddutt@cumulusnetworks.com\u003e\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\nSigned-off-by: Vivek Venkatraman \u003cvivek@cumulusnetworks.com\u003e\n\nFix reference counts for the nexthop cache entries.\n\nSigned-off-by: Vivek Venkatraman \u003cvivek@cumulusnetworks.com\u003e\n\nEdited-by: Paul Jakma \u003cpaul.jakma@hpe.com\u003e\n- Fix nexthop_ipv6_add defs in rib.h not having been modified with rib_ prefix.\n- Remove rib_lookup_and_pushup, appears not to be used except for\n  !HAVE_NETLINK \u0026\u0026 HAVE_STRUCT_IFALIASREQ case of ioctl.c::if_set_prefix,\n  so it\u0027s not being used at all on platform with most testing of RIB.\n"
    },
    {
      "commit": "8f4269ddff1becca94687252b9571b096cb45b43",
      "tree": "1fa611b63988898d448c14efa617ae8b63c6a20a",
      "parents": [
        "a6d400c9158b10207cde40a428ebf2c27f105c0a"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@jakma.org",
        "time": "Fri Sep 18 11:50:33 2015 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:43 2016 +0100"
      },
      "message": "zebra: Add command to configure default for link-state, and make it sticky\n\n* Provide a way for the user to specify their own preference for the default\n  behaviour of link-detect, independent of the compiled in default.\n\n  Add a global \"default link-detect (on|off)\" command to zebra, to set\n  the default policy for link-detect accordingly.  The command is \"sticky\" -\n  when set it will stay set and always be written out, regardless of how it\n  compares to the baked-in, compile-time default.\n\n  The per-interface \"link-detect\" command is similarly made sticky.\n\n* zebra/interface.h: (zebra_if_linkdetect;) enum for link-detect configured\n  state.\n  (struct zebra_if_defaults) Global link-detect default\n  (struct zebra_if) Add field for per-iface link-detect default.\n* lib/if.c: (if_create_vrf) Remove the default flag setting on if-create\n  here, it\u0027s a zebra flag so do it in zebra\u0027s if_zebra_new_hook\n* zebra/interface.c: Add static storage for global defaults.\n  (if_zebra_new_hook) Set the link-detect flag on new ifaces according to the\n  baked in default or else the configured global default.\n  (config_write_zebra_if_defaults,default_linkdetect_cmd) global link-detect\n  command and config write out machinery.\n  (linkdetect_cmd) Set the configuration state rather than the flag.\n  The new hook will then set the interface flag when the if comes up.\n  (if_config_write) Write config according to configured state, not the\n  low-level flag.\n  (zebra_if_init) add new commands.\n"
    },
    {
      "commit": "a6d400c9158b10207cde40a428ebf2c27f105c0a",
      "tree": "1d9d4854da1a23d9e9c175dc9b7c2daebfe352dd",
      "parents": [
        "3bccb4f3df0530bb4d8961b0867ea04c1bca065f"
      ],
      "author": {
        "name": "Dinesh G Dutt",
        "email": "ddutt@cumulusnetworks.com",
        "time": "Fri Sep 18 08:32:56 2015 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:42 2016 +0100"
      },
      "message": "zebra: Set link-detect on by default\n\nSigned-off-by: Roopa Prabhu \u003croopa@cumulusnetworks.com\u003e\nReviewed-by: Dinesh G Dutt \u003cddutt at cumulusnetworks.com\u003e\nReviewed-by: Scott Feldman \u003csfeldma at cumulusnetworks.com\u003e\n\nEdited by Christian Franke: Fix OSPF Virtual Links\nEdited by Donald Sharp: Add NEWS notification\n\nSigned-off-by: Christian Franke \u003cchris@opensourcerouting.org\u003e\nAcked-By: paul@jakma.org\n"
    },
    {
      "commit": "d83b8d6d73021815a87e000c50863a105af80226",
      "tree": "5f9c20043869eea56971eb4d8fad1b161a29d0fe",
      "parents": [
        "ee5fbe26f2b7561457a1d0c8b5ce72b512638cb0"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue May 17 07:10:41 2016 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:40 2016 +0100"
      },
      "message": "lib: add AF_ETHERNET/AFI_ETHER\n"
    },
    {
      "commit": "ee5fbe26f2b7561457a1d0c8b5ce72b512638cb0",
      "tree": "0808f78d99050d18afad8662e41e6d30cb0e2a4d",
      "parents": [
        "b8cb7c3fd44cfd0781a5e80a369ecb19eee9a4a7"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue May 17 07:10:38 2016 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:40 2016 +0100"
      },
      "message": "lib: dump memory stats on core\n"
    },
    {
      "commit": "b8cb7c3fd44cfd0781a5e80a369ecb19eee9a4a7",
      "tree": "f9a8872017a8c4b84c9041ed25c6495dd964a0b6",
      "parents": [
        "93b493a2b010df4f67c7173c0928c8f86d9e1aa2"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue May 17 07:10:33 2016 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:40 2016 +0100"
      },
      "message": "lib: fix memory leak in zprivs_caps_init\n"
    },
    {
      "commit": "3676cb0c029c8f8f06ab703dd441c1e23e5ef333",
      "tree": "613e8f2a7c7b2b9e2d334830ce994f50611e9d4e",
      "parents": [
        "481986950290323e2f5d1e774a666d4b7ed510d6"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Jul 29 13:39:37 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:39 2016 +0100"
      },
      "message": "*: Remove some for statement declarations\n\nWe generally require C99.  Some compilers, e.g.  gcc, barf on\n\u0027for\u0027 statement declared variables, if std\u003d{gnu,c}99 or higher is not\ngiven - even while seemingly accepting other C99 constructs.\n\nAs it\u0027s trivial, remove these.\n"
    },
    {
      "commit": "ae51c9d510fb7d9cc41ead8803af916c1f4b34ca",
      "tree": "069b3a1b5d674d215a7520211e32d314d865e17f",
      "parents": [
        "7e49a4f99273858887806c6251d958e1e664bedf"
      ],
      "author": {
        "name": "Olivier Dugeon",
        "email": "olivier.dugeon@orange.com",
        "time": "Tue Apr 19 16:21:46 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:38 2016 +0100"
      },
      "message": "lib: Add new if_link_params structure\n\nThis new structure is the basis to get new link parameters for\nTraffic Engineering from Zebra/interface layer to OSPFD and ISISD\nfor the support of Traffic Engineering\n\n* lib/if.[c,h]: link parameters struture and get/set functions\n* lib/command.[c,h]: creation of a new link-node\n* lib/zclient.[c,h]: modification to the ZBUS message to convey the\n  link parameters structure\n* lib/zebra.h: New ZBUS message\n* lib/memtypes.c: Add new memory type for Traffic Engineering support\n\nSigned-off-by: Olivier Dugeon \u003colivier.dugeon@orange.com\u003e\n"
    },
    {
      "commit": "7e49a4f99273858887806c6251d958e1e664bedf",
      "tree": "35279e730589b0a460211eeb73279bdff1978102",
      "parents": [
        "a3b161bb72d7fdb58e79afd0f706849601f77fe2"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Aug 02 13:36:03 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:38 2016 +0100"
      },
      "message": "build: Test for features.h and move include to lib/zebra.h\n\n* configure.ac: Check for features.h, which is needed to get Clang to\n  define __STDC_IEC_559__.\n* lib/{stream.c,zebra.h}: move the features.h include to zebra.h, so\n  lib/network.c also gets it.\n"
    },
    {
      "commit": "a3b161bb72d7fdb58e79afd0f706849601f77fe2",
      "tree": "d7a9e5323ec658fc144306c44e0783d7c0f4db92",
      "parents": [
        "4359501e1a427159c9b49f3041889837aaaf2eb3"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Mon Aug 01 15:13:58 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:38 2016 +0100"
      },
      "message": "lib: IEC559 tests are fragile, reduce to warning rather than error.\n\n* {network,stream}.c: Weaken the compile time tests for IEEE754 / IEC-559\n  binary floating point format from an error to a warning when not detected.\n\n  I can\u0027t think of any platforms that are not IEEE-754 format, and as the\n  testing for the defines appears to be fragile (often not set) the error\n  just gives false positives.\n\n  Even the warnings may be too much.  Those should probably be moved\n  to some configure test.  Will do for now though, to fix compilation\n  on CentOS and some BSDs.\n"
    },
    {
      "commit": "4359501e1a427159c9b49f3041889837aaaf2eb3",
      "tree": "a9f2a5b71e75a61f84100446f90d9339e6152587",
      "parents": [
        "d41e7b975b901f109608471b77c46718c1fb5b45"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@opensourcerouting.org",
        "time": "Tue May 19 18:50:49 2015 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:38 2016 +0100"
      },
      "message": "lib: consolidate ntohf/htonf from ospfd/isisd TE to lib/network\n\n* lib/network.{c,h}: Consolidate the ntohf/htonf functions used in ospfd\n  TE to here, using the value-passing variant that fits with existing\n  ntoh/hton functions.\n* ospfd/ospf_opaque.c: Remove its variants.\n* ospfd/ospf_te.c: Update to use the consolidated, by-value variant.\n"
    },
    {
      "commit": "d41e7b975b901f109608471b77c46718c1fb5b45",
      "tree": "8db478bd5cd56ab041ba8e7251b3849954abd922",
      "parents": [
        "581ecbfe91d23791c116a8e3790208a17c1a5983"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@opensourcerouting.org",
        "time": "Tue May 19 15:38:43 2015 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:38 2016 +0100"
      },
      "message": "lib/stream: add float/double \u003c-\u003e IEEE-754 single/double mux/demuxers\n\n* stream.{c,h}: Add stream_get{f,d} and stream_put{f,d}) demux and muxers to\n  safely convert between big-endian IEEE-754 single and double binary\n  format, as used in IETF RFCs, and C99.  Implementation depends on host\n  using __STDC_IEC_559__, which should be everything we care about.  Should\n  correctly error out otherwise.\n\n  Thanks to Aidan Delaney \u003caidan@phoric.eu\u003e and Olivier Dugeon for pointing\n  out the __STDC_IEC_559__ macro.\n\n  Update: GCC does not per se set __STDC_IEC_559__, so also test for\n  __GCC_IEC_559 \u003e\u003d 1.\n"
    },
    {
      "commit": "00667cea1fbd088900f7909f2044da2a7e26270d",
      "tree": "33044643861697f51f026938d24d87056ef5f37f",
      "parents": [
        "880e31ca2d8a8a8fcbc28bfeac9bd13fc76dd2c1"
      ],
      "author": {
        "name": "Christian Franke",
        "email": "nobody@nowhere.ws",
        "time": "Tue May 03 19:59:42 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:37 2016 +0100"
      },
      "message": "lib: add event_counter\n\nSigned-off-by: Christian Franke \u003cchris@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "880e31ca2d8a8a8fcbc28bfeac9bd13fc76dd2c1",
      "tree": "bcaadd39adfb96a286d1ece6cc5bf8b27f0dad5d",
      "parents": [
        "2ab67a7591d7693bb726dd82795017c8c3f52d99"
      ],
      "author": {
        "name": "Christian Franke",
        "email": "nobody@nowhere.ws",
        "time": "Tue May 03 19:59:40 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:37 2016 +0100"
      },
      "message": "lib: use constant to replace magic value for length of quagga_timestamp\n\nSigned-off-by: Christian Franke \u003cchris@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "811577eaede8b6a7ea6ba3731c82eed1c4d07500",
      "tree": "b6b5ac6a5bc2248830e47e6a4ed044d7098cc38f",
      "parents": [
        "985c3556921fa669f86fe5e62130fbeb93d94ca9"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Thu Mar 10 20:16:48 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:37 2016 +0100"
      },
      "message": "lib: Remove unnecessary parentheses\n\nThe freebsd compiler complains that there is an extra set of ()\u0027s\naround the if statement.\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "54406ac4c6883725f8a337bdc4f15fb015926b0f",
      "tree": "0044c1865642f3ad55f6b597f107167ca1b79e6d",
      "parents": [
        "1ad00b07a10eb8b3f5c94348488735fb08f28717"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Fri Mar 04 15:28:57 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:37 2016 +0100"
      },
      "message": "lib: Refactor thread_process_fd\n\nthread_process_fd is looping over the read and write\nfd\u0027s separately.  There is no need to do this individually.\nloop over both the read and write fdset\u0027s at the same time.\nThis will improve select processing performance, especially\nfor large data sets.\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "1ad00b07a10eb8b3f5c94348488735fb08f28717",
      "tree": "a17cbf06ebd0dc639ca46a63de7727ac7c5c56ee",
      "parents": [
        "e0b8324deb490c52834775d2b805cbb57e003ce0"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Wed Jul 13 11:02:38 2016 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:37 2016 +0100"
      },
      "message": "lib: Fix regression in thread.c\n\n* Fix regression introduced with merging of\n\n    \u0027lib: Refactor read/write functionality\u0027\n"
    },
    {
      "commit": "e0b8324deb490c52834775d2b805cbb57e003ce0",
      "tree": "4f4055d192a73ac02ce258fb00be829036923ca3",
      "parents": [
        "19be18a929c3afa343ac5435dba25f522e294d9b"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Fri Mar 04 15:28:56 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:37 2016 +0100"
      },
      "message": "lib: Refactor read/write functionality\n\nBoth the read and write functions used the same code\nslightly modified for reading and writing.  Combine this\ncode together.\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n\nEdited-by: Paul Jakma \u003cpaul.jakma@hpe.com\u003e to retain the\nexternal library symbols, for ease of merging.\n"
    },
    {
      "commit": "19be18a929c3afa343ac5435dba25f522e294d9b",
      "tree": "ca2b656c0e8d24a9b3f50e482f65cb5fbc0cbf0e",
      "parents": [
        "6bcee414a487024e7865fb29d4e583870406d914"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Fri Mar 04 15:28:55 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:37 2016 +0100"
      },
      "message": "lib: Abstract fd set operations\n\nAbstract FD set operations so that we can eventually\nchoose what type of select/poll operation that\nwe want to use.\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetowkrs.com\u003e\n"
    },
    {
      "commit": "6bcee414a487024e7865fb29d4e583870406d914",
      "tree": "ae207533d9edeaec7277a2a3ae4768586e04879e",
      "parents": [
        "921936652359fe72728eb196aa9107310f02a4d4"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Sat Mar 12 19:58:09 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:37 2016 +0100"
      },
      "message": "lib: fix MIN/MAX macros to not double-eval\n\ncf. https://gcc.gnu.org/onlinedocs/gcc/Typeof.html\n(Works on all compilers on Quagga\u0027s compiler support list in\ndoc/overview.texi)\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\nTested-by: NetDEF CI System \u003ccisystem@netdef.org\u003e\nAcked-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "921936652359fe72728eb196aa9107310f02a4d4",
      "tree": "76bfc9865bc9ee26e4f73999bcecf424dd649598",
      "parents": [
        "41de629c1fe88f9ea95d0400af6896f3c84a0dff"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Thu Jun 16 15:53:26 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:36 2016 +0100"
      },
      "message": "lib: keep hash of node\u0027s commands to detect duplicate installs\n\n* command.h: (struct cmd_node) Add a hash, so duplicate installs of\n  a cmd_element to a command node can be detected.  To help catch\n  strays from the VIEW/ENABLE node consolidation particularly\n  (installs to VIEW automatically install to ENABLE too now).\n* command.c: (cmd_hash_{key,cmp}) helpers for the hash - just directly\n  on the pointer value is sufficient to catch the main problem.\n  (install_node) setup the hash for the command node.\n  (install_element) check for duplicate installs.\n  The assert on the cmd_parse_format seems misplaced.\n  (install_default_basic) separate the basic, VIEW, node default commands\n  to here.\n  (cmd_init) get rid of dupes, given consolidation.\n  (cmd_terminate) clean up the node command hash.\n\nNot done: The (struct cmd_node)\u0027s vector could be replaced with the\ncmd hash, however much of the command parser depends heavily on the\nvector and it\u0027s a lot of work to change.  A vector_lookup_value could\nalso work, particularly if vector could be backed by a hash.\n\nThe duplicate check could be disabled in releases - but useful in\ndevelopment.  It\u0027s a little extra overhead at startup.  The command\ninitialisation overhead is already something that bites in\nmicro-benchmarks - makes it easy for other implementations to show\nhow much faster they are with benchmarks where other load is low\nenough that startup time is a factor.\n"
    },
    {
      "commit": "41de629c1fe88f9ea95d0400af6896f3c84a0dff",
      "tree": "5120035dc611715809cef786d4166ec0f8023016",
      "parents": [
        "68b45cc592d5d61e748e8d99ec9f84e63aa73213"
      ],
      "author": {
        "name": "Christian Franke",
        "email": "nobody@nowhere.ws",
        "time": "Tue May 03 19:59:41 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:36 2016 +0100"
      },
      "message": "lib: add api method to read current config path\n\nSigned-off-by: Christian Franke \u003cchris@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "68b45cc592d5d61e748e8d99ec9f84e63aa73213",
      "tree": "eb1008834813757b86e5f4bc439e7b2b3188adbf",
      "parents": [
        "b9ac2f320922542e0320ceeced4aa7264564e98a"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Fri Mar 11 14:27:13 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jul 20 12:58:33 2016 +0100"
      },
      "message": "*: Consolidate all double VIEW_NODE and ENABLE_NODE\u0027s\n\nIf a command is put into the VIEW_NODE, it is going into the\nENABLE_NODE as well.  This is especially true for show commands.\nAs such if a command is in both consolidate it down to VIEW_NODE.\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "b9ac2f320922542e0320ceeced4aa7264564e98a",
      "tree": "a5309dda6b12175879f99aa68b351b367ea8af08",
      "parents": [
        "4ab273bb60606ed681bee1be6fb2c8bb31dc26a7"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Fri Mar 11 14:27:12 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jul 20 12:58:33 2016 +0100"
      },
      "message": "lib: Consolidate VIEW_NODE to be ENABLE_NODE as well\n\nIf you are in VIEW_NODE, the command should exist in ENABLE_NODE\nas well.  This is being done to reduce chances of code being\nadded to one but not the other NODE.\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "4ab273bb60606ed681bee1be6fb2c8bb31dc26a7",
      "tree": "0742982d0f484826bf983c1789ffb0cd080fe56b",
      "parents": [
        "0744040564ece3f4b9fe39fcf857e466a5f68a72"
      ],
      "author": {
        "name": "Denil Vira",
        "email": "denil@cumulusnetworks.com",
        "time": "Fri Mar 04 15:28:54 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jul 20 12:58:33 2016 +0100"
      },
      "message": "lib: Replace lists with arrays to store read and write threads\n\nWith arrays, a thread corresponding to given fd is looked up in constant time\nversus the linear time taken for list traversals.\n\nSigned-off-by: Denil Vira \u003cdenil@cumulusnetworks.com\u003e\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "23757db11c5378521b7948847e17691f4fc35e0a",
      "tree": "5b62d70b558c89ab751626e5b3f1a028a0be431e",
      "parents": [
        "7bd31774cf2c1cfaf74bca87f57f698e20a07e65"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed Feb 24 06:26:02 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jul 20 12:58:32 2016 +0100"
      },
      "message": "*: get rid of \"MTYPE 0\"\n\nA few places are using 0 in place of the MTYPE_* argument.  The\nfollowing rewrite of the alloc tracking won\u0027t deal with that, so let\u0027s\nuse MTYPE_TMP instead.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\nAcked-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "687bea20fa61d8fc7cf48c0b227f16d0b324778c",
      "tree": "14621b8d6c3e43e751b9f8ff166ad7490a2c1114",
      "parents": [
        "9145f0e4cf776bd3156620da6c8a772fee4d4383"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Mon Jan 25 14:56:26 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jul 20 12:58:31 2016 +0100"
      },
      "message": "lib: Allow zclient do-over of connect on initial attempt\n\nWhen a protocol is attempting to connect to the zebra daemon\nthrough it\u0027s socket.  If the inital attempt fails, give it a\nfew more attempts before giving up and leaving the daemon in\na bizarre state.\n\nThis problem was found by Ashley Penney, and Ashley was of\nimmense help in debugging and testing the fix for this issue.\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\nTested-by: Ashley Penney \u003capenney@ntoggle.com\u003e\nTested-by: NetDEF CI System \u003ccisystem@netdef.org\u003e\n"
    },
    {
      "commit": "df2ef24fb73c83a6e733be9eb8cac3e0df8467f8",
      "tree": "0d208e09a57754656de13c222d321ed8a8c47b05",
      "parents": [
        "543e791be9257e60d4d02abd0cdac7337a31636a"
      ],
      "author": {
        "name": "Matthieu Boutier",
        "email": "boutier@pps.univ-paris-diderot.fr",
        "time": "Wed Sep 10 16:50:45 2014 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jul 20 12:58:31 2016 +0100"
      },
      "message": "lib: Make distribute.c accepts both v4 and v6.\n\ndistribute.c doesn\u0027t allow to manage both v4 and v6 distribute lists.  This\npatch fix this problem by having 4 DISTRIBUTE* values in the enumeration instead\nof two. The code in all daemons using distribute.c is adapted.\n"
    },
    {
      "commit": "2074d6752d1dafcd6511677e2bdc9bbe0b73c388",
      "tree": "bbbd02c455ae093426a6c478034471b6cf85cf7d",
      "parents": [
        "a3936d04942795bb92f04fefd25957c327e31c20"
      ],
      "author": {
        "name": "Matthieu Boutier",
        "email": "boutier@pps.univ-paris-diderot.fr",
        "time": "Wed Sep 10 16:50:42 2014 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jul 20 12:58:30 2016 +0100"
      },
      "message": "lib: simplify distribute.c\u0027s code.\n\nUse loops and variables instead of doing each cases by hand.\nUse static functions instead of rewriting code.\n"
    },
    {
      "commit": "d8f7f86a64842fcc6200c2fa4f560b9aa7a279bb",
      "tree": "90da2b249a53228d99fed940373e3aa6b5039416",
      "parents": [
        "a0a661f982c4a9726573faf28817d77d3e7cdad5"
      ],
      "author": {
        "name": "Roman Hoog Antink",
        "email": "rha@open.ch",
        "time": "Wed Mar 05 09:13:43 2014 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jul 20 12:58:30 2016 +0100"
      },
      "message": "ospf6d: implement admin distance\n\nUntil today the admin distance cannot be configured for any IPv6\nrouting protocol. This patch implements it for ospf6.\n\nSigned-off-by: Maitane Zotes \u003cmaz@open.ch\u003e\n"
    },
    {
      "commit": "a343cf8d74920752ba0e35142e23a3ca56620755",
      "tree": "1e74cf6e6d6216c8a9d3ea9c0a9fad5c4a4568a4",
      "parents": [
        "d319a3abbf6e6c310b6b6a6891ebe1957592f9a9"
      ],
      "author": {
        "name": "Christian Franke",
        "email": "chris@opensourcerouting.org",
        "time": "Mon Jan 14 23:41:57 2013 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jul 20 12:58:29 2016 +0100"
      },
      "message": "lib: update Solaris multicast API (BZ#725)\n\nOn OpenIndiana/Solaris the build fails with \"unsupported multicast API\".\nIt\u0027s only in the IPv4 part where setsockopt IP_MULTICAST_IF needs a\nlocal address and not the index (IPv6 wants the index).\nThe following code walks the list of interfaces until it finds the matching\nindex and uses the interface\u0027s local address for the setsockopt call.\nI don\u0027t know if it works on Solaris \u003c 10 (I guess yes, but I don\u0027t have\nany machine to verify it).\n\n[NB: this breaks unnumbered setups that use the same IPv4 address on\nmultiple interfaces. -- equinox@opensourcerouting.org]\n\nReported-by: Brian Utterback \u003cbrian.utterback@oracle.com\u003e\nSigned-off-by: Christian Franke \u003cchris@opensourcerouting.org\u003e\n\nPatchwork #762\n"
    },
    {
      "commit": "86b2a0a12ace817e64e8e4a719b1ba9a8e6af253",
      "tree": "d077de18b7d595f88dc4fb423a5dba91f8650741",
      "parents": [
        "f53585d59b62b12d68282154af346796b75c7f2f"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue May 17 12:19:51 2016 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jul 20 12:58:29 2016 +0100"
      },
      "message": "lib: change command logging to be off by default\n\n* lib/vty.c: add \u0027log_command\u0027 to enable logging of vty commands executed.\n  Default command logging to off.\n"
    },
    {
      "commit": "e6ec2d6d18dadb119b93284ef2f5f5b5440d6f66",
      "tree": "96202e2ff5a78834986e3dd35dce947bbca1f335",
      "parents": [
        "190591f0fe3388c746ea48f69a439f4bd0b49834"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Fri Apr 08 19:30:51 2016 -0400"
      },
      "committer": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Fri Apr 22 08:38:54 2016 -0400"
      },
      "message": "lib: Fix priviledge modification for vty group specified\n\nWhen attempting to switch runtime permissions over to\nthe correct group specified for the vty group, if the\nuser specified to run as does not have that vty group\nthen do warn about the issue and stop running\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\nReported-by: Thomas Martin \u003ctmartincpp@gmail.com\u003e\nTested-by: NetDEF CI System \u003ccisystem@netdef.org\u003e\n"
    },
    {
      "commit": "a3ee120fcf2b2b205e3e15f544eb4090653e7bff",
      "tree": "695c9f4c16934d2621736ef73bed6ee46b58a32c",
      "parents": [
        "370b7e59170acf853ca3357c71dd5ab0d85e763c"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed Dec 16 19:38:23 2015 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Mar 08 17:53:22 2016 +0000"
      },
      "message": "lib: fix vrf_bitmap leak in zclient_free()\n\nzclient_stop(), which is used as antagonist to zclient_init(), needs to\nundo the vrf_bitmap allocation.  Otherwise zclient_init() will leak the\nallocated memory, for example when zclient_reset() is used.\n\nReported-by: Lou Berger \u003clberger@labn.net\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "bf83fa25f1bddec6f09ad879cba5e975a3ae5495",
      "tree": "a01a0137a4193d2d33d61bb43c113afef3e421a6",
      "parents": [
        "2db962760426ddb9e266f9a4bc0b274584c819cc"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Feb 09 15:23:03 2016 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Mar 08 17:53:22 2016 +0000"
      },
      "message": "lib: Check prefix length from zebra is sensible\n\n* zclient.c: prefix length on router-id and interface address add\n  messages not sanity checked.  fix.\n\n* */*_zebra.c: Prefix length on zebra route read was not checked, and\n  clients use it to write to storage.  An evil zebra could overflow\n  client structures by sending overly long prefixlen.\n\nPrompted by discussions with:\n\nDonald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "2db962760426ddb9e266f9a4bc0b274584c819cc",
      "tree": "406ea2dc4196e9904ab9832a7dae548f4cdcf91d",
      "parents": [
        "405e9e19eb6ce62fa4f3f39a1f73990db9e146b7"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Mon Feb 08 14:46:28 2016 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Mar 08 17:53:22 2016 +0000"
      },
      "message": "lib: zclient can overflow (struct interface) hw_addr if zebra is evil\n\n* lib/zclient.c: (zebra_interface_if_set_value) The hw_addr_len field\n  is used as trusted input to read off the hw_addr and write to the\n  INTERFACE_HWADDR_MAX sized hw_addr field.  The read from the stream is\n  bounds-checked by the stream abstraction, however the write out to the\n  heap can not be.\n\n  Tighten the supplied length to stream_get used to do the write.\n\n  Impact: a malicious zebra can overflow the heap of clients using the ZServ\n  IPC.  Note that zebra is already fairly trusted within Quagga.\n\nReported-by: Kostya Kortchinsky \u003ckostyak@google.com\u003e\n"
    },
    {
      "commit": "b2a2fd788f34a4f5d1bbd92a283e47704f05ae8f",
      "tree": "60c789a8376edf88f1d0206ece1be43451c7a9cd",
      "parents": [
        "91ce87aacfd8718b5a52fb0f4453e9f72d8bdb53"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Wed Dec 09 08:24:46 2015 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:47 2016 +0000"
      },
      "message": "lib: Add CMD_RANGE_STR macro to command.h\n\nAllow the auto-generation of a \"\u003cX-Y\u003e\" string for cli handline.\nWhere X or Y can be a #define.\n\nCMD_RANGE_STR(LOW, HIGH) translates to:\n\"\u003c4-99\u003e\"\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "9099f9b2a66e86f8a90d7fe18f61bd2bb1bc6744",
      "tree": "1ce5d2e4ecff6b57eb00d40b1a91b3f363ff35fe",
      "parents": [
        "954c7d6bcd04c2cf037965adda0f9d11afdcd165"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Mon Jan 18 10:12:10 2016 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:46 2016 +0000"
      },
      "message": "*: use an ifindex_t type, defined in lib/if.h, for ifindex values\n"
    },
    {
      "commit": "954c7d6bcd04c2cf037965adda0f9d11afdcd165",
      "tree": "707ba870b0989d08a98e6b969fc1e2388f09e1c0",
      "parents": [
        "4d3ae716ce86c28e3979c9ae57c4e717ac5e27e4"
      ],
      "author": {
        "name": "Timo Teräs",
        "email": "timo.teras@iki.fi",
        "time": "Fri Jan 15 17:36:33 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:46 2016 +0000"
      },
      "message": "lib, zebra: unify link layer type and hardware address handling\n\nThis removes the BSD specific usage of struct sockaddr_dl\nhardware address. This unifies to use explict hw_addr member for\nthe address, and zebra specific enumeration for the link layer\ntype.\n\nAdditionally the zapi is updated to never send platform specific\nstructures over the wire, but the ll_type along with hw_addr_len\nand hw_addr are now sent for all platforms.\n\nBased on initial work by Paul Jakma.\n\nSigned-off-by: Timo Teräs \u003ctimo.teras@iki.fi\u003e\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "325823a5f07d6850318e52f6e66691eca59d24fe",
      "tree": "9be443652c5c0734b6761a84f44980be7958b708",
      "parents": [
        "82a6635ca580ccd3c31551c960ec3de816b6c15d"
      ],
      "author": {
        "name": "Timo Teräs",
        "email": "timo.teras@iki.fi",
        "time": "Fri Jan 15 17:36:31 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:46 2016 +0000"
      },
      "message": "zebra: support FIB override routes\n\nFIB override routes are for routing protocols that establish\nshortcut routes, or establish point-to-point routes that should\nnot be redistributed. Namely this is useful NHRP daemon to come.\n\nZebra is extended to select two entries from RIB the \"best\" entry\nfrom routing protocols, and the FIB entry to install to kernel.\nFIB override routes are never selected as best entry, and thus\nare never adverticed to other routing daemons. The best FIB\noverride, or if it does not exist the otherwise best RIB is\nselected as FIB entry to be installed.\n\nSigned-off-by: Timo Teräs \u003ctimo.teras@iki.fi\u003e\nAcked-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "b0d02889624eaafa0984873dcd78c086418bdf13",
      "tree": "8f15cb8a76935d04c0a18d28a647bc0915d7d86a",
      "parents": [
        "205e6744f2dc2909dd494c9ce8acb82821459f1f"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Fri Jan 08 07:37:14 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:45 2016 +0000"
      },
      "message": "lib, bgpd: Remove \u0027struct fifo\u0027 from lib/zebra.h\n\nThe \u0027struct fifo\u0027 and it\u0027s accompanying #defines do not\nbelong in lib/zebra.h.  Move them into their own header.\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "a3fda886cdd48b6d8c421ebb1401142fa9ee93b0",
      "tree": "42a5e6fda0978185128544fd199caf8ed93e58a3",
      "parents": [
        "637035710a2f8e1e5944ee714135b7f88ac15ac4"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue Jan 12 13:42:04 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:44 2016 +0000"
      },
      "message": "bgpd, lib, vtysh: hook up bgp ENCAP CLI node\n\nSigned-off-by: Lou Berger \u003clberger@labn.net\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "c3741789530ee824693fd606356acac2ad695f83",
      "tree": "ad68a56ed567517367a3916ff4372f420b139326",
      "parents": [
        "5a81fc9ae610ff343902ebabc12237d6e40d91cb"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue Jan 12 13:42:01 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:43 2016 +0000"
      },
      "message": "bgpd: encap: add attribute handling\n\nSigned-off-by: Lou Berger \u003clberger@labn.net\u003e\nReviewed-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "13c378d96a57017f5995b2e0df46cfc31123f0e8",
      "tree": "6b4669bf22264a816ef451f3058cd8f59872eab5",
      "parents": [
        "9da04bca0e994ec92b9242159bf27d89c6743354"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue Jan 12 13:41:56 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:43 2016 +0000"
      },
      "message": "bgpd, lib, vtysh: hook up bgp VPNv6 CLI node\n\nSigned-off-by: Lou Berger \u003clberger@labn.net\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "2daf7f3a8d69213f35b16a04dbe300957481a811",
      "tree": "13a66fd8d74fd79db772307361b4af1738fd95fe",
      "parents": [
        "c7f7e49a4f68c92152384582ff70d64609858170"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue Jan 12 13:41:50 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:42 2016 +0000"
      },
      "message": "lib: add SAFI_ENCAP type, safi2str prefix utility\n\nSigned-off-by: Lou Berger \u003clberger@labn.net\u003e\n"
    },
    {
      "commit": "c7f7e49a4f68c92152384582ff70d64609858170",
      "tree": "44838e385af5ac715247037db1e6e1b48a500707",
      "parents": [
        "f9ec4190f1eaf2dba355a9808bca8d7148bc8a55"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue Jan 12 13:41:49 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:42 2016 +0000"
      },
      "message": "lib: add facility to log all CLI commands\n\nSigned-off-by: Lou Berger \u003clberger@labn.net\u003e\n"
    },
    {
      "commit": "f9ec4190f1eaf2dba355a9808bca8d7148bc8a55",
      "tree": "de588e9501d2f43c347356fe346c409d6a33c6fd",
      "parents": [
        "9248b61f54955e56212f3ae4c8a7ab704f7ad01c"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue Jan 12 13:41:48 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:41 2016 +0000"
      },
      "message": "lib: add \"show commandtree\" CLI command\n\nSigned-off-by: Lou Berger \u003clberger@labn.net\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "9248b61f54955e56212f3ae4c8a7ab704f7ad01c",
      "tree": "d97f0d05991233191a400e6acaa6a164594a2d59",
      "parents": [
        "672900382d47137638086bd8351b2678f589a546"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue Jan 12 13:41:47 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:41 2016 +0000"
      },
      "message": "lib: treat realloc of null pointer as alloc Now use zalloc rather than alloc with null. Fixes issue seen in bgp check tests.\n\nSigned-off-by: Lou Berger \u003clberger@labn.net\u003e\n"
    },
    {
      "commit": "672900382d47137638086bd8351b2678f589a546",
      "tree": "c6b482ed46f8dc8f0be79144173ccae152a3a726",
      "parents": [
        "40278bd4c51939ccf8ec06ef1f33aedf8f05e86c"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue Jan 12 13:41:46 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:41 2016 +0000"
      },
      "message": "lib: fix bookkeeping for libreadline malloc()s\n\nWhen libreadline is used, we mistakenly mix in strdup() done in\nlibreadline with Quagga\u0027s lib/memory bookkeeping/counting, leading to\ncounter underflows on MTYPE_TMP.\n\nSigned-off-by: Lou Berger \u003clberger@labn.net\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "0490729cc033a3483fc6b0ed45085ee249cac779",
      "tree": "fb2822462801e3bc82ae1425d065d3d5e4d71954",
      "parents": [
        "7748fdc757a2181649dd4956f2767545673ef28d"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Thu Jan 07 10:03:01 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:40 2016 +0000"
      },
      "message": "lib, bgpd, tests: Refactor FILTER_X in zebra.h\n\nlib/zebra.h has FILTER_X #define\u0027s.  These do not belong there.\nPut them in lib/filter.h where they belong.\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "f3cfc46450cccc5ac035a5a97c5a1a5484205705",
      "tree": "3ae512da65c1b4962363c038b8b2c94e27decf65",
      "parents": [
        "d5062d218994885710fe02f516f0c06025b4fc9a"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Thu Jan 07 09:33:28 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:40 2016 +0000"
      },
      "message": "lib, bgpd: Fixup afi_t to be an enum and cleanup zebra.h\n\nThis code change does two things:\n\n1) Removes ZEBRA_AFI_XXX #defines since they were redundant information\n2) Switches afi_t to an enumerated type so that the compiler\ncan do a bit more compile time checking.\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "76764ddcf53fa4840993c395fdf383a47ad61e8e",
      "tree": "f2c0a5b808f404071ce5c023eb26650671911de9",
      "parents": [
        "642577340cfb7ad66d021ab2b86d72f7cdde03bc"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Fri Nov 20 09:05:46 2015 -0500"
      },
      "committer": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Tue Dec 08 14:16:19 2015 -0500"
      },
      "message": "isisd, lib: Fix some more compiler warnings\n\nA couple compiler warnings snuck in from the last\nround of work being looked at.  This cleans them up\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "acf9865f7fcec6a8d47df6ed7946a5e8ca398918",
      "tree": "fac7d9ce2d2b6d984bde675641556e5063e8f655",
      "parents": [
        "9dfcca6122c9f4f3642241ff50029d7669af3999"
      ],
      "author": {
        "name": "Christian Franke",
        "email": "chris@opensourcerouting.org",
        "time": "Thu Nov 12 14:24:22 2015 +0100"
      },
      "committer": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Tue Dec 08 14:12:50 2015 -0500"
      },
      "message": "isisd: add support to import routes from other protocols\n\nSigned-off-by: Christian Franke \u003cchris@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "abfd40d68202882696260617729518a6d2c99302",
      "tree": "40b0c4b62c079adce8692a3b078b081e2facbdb2",
      "parents": [
        "dbe99e0c407bcb383d0be0c0010fefccc5b46866"
      ],
      "author": {
        "name": "Christian Franke",
        "email": "chris@opensourcerouting.org",
        "time": "Tue Nov 10 18:04:42 2015 +0100"
      },
      "committer": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Tue Dec 08 14:12:49 2015 -0500"
      },
      "message": "lib: don\u0027t have log functions change errno\n\nSigned-off-by: Christian Franke \u003cchris@opensourcerouting.org\u003e\nAcked-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "76fbc64c5d82c6f540cb4a1ac855f9f098fa6c5f",
      "tree": "ce0d45193a3924fd23851ff81210beb320cf0afb",
      "parents": [
        "1ca8d40f996c0760a1a8931f54044dd7ca9e3f9c"
      ],
      "author": {
        "name": "Christian Franke",
        "email": "chris@opensourcerouting.org",
        "time": "Tue Nov 10 18:04:41 2015 +0100"
      },
      "committer": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Tue Dec 08 14:12:40 2015 -0500"
      },
      "message": "lib: add function to get precise remaining time of timer thread\n\nSigned-off-by: Christian Franke \u003cchris@opensourcerouting.org\u003e\nAcked-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "d4c27d656d072fbd81003a71c4f3391c96852c60",
      "tree": "27f40829775ca271f6a7d7b5031284b264c0f479",
      "parents": [
        "b11f3b54c842117e22e2f5cf1561ea34eee8dfcc"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Wed Nov 04 13:26:35 2015 -0500"
      },
      "committer": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Tue Dec 08 14:12:10 2015 -0500"
      },
      "message": "zebra: Collapse struct static_ipv[4|6] into struct static_route\n\nThe \u0027struct static_ipv4\u0027 and \u0027struct static_ipv6\u0027 structures\nare essentially the same.  Collapse them into one data structure\n\u0027struct static_route\u0027.\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "b11f3b54c842117e22e2f5cf1561ea34eee8dfcc",
      "tree": "c31f9893baa2a05db24ea72d1370fb6b11f59c20",
      "parents": [
        "7eb6136b2732d4782360f9f376336c6d4f667ff0"
      ],
      "author": {
        "name": "Timo Teräs",
        "email": "timo.teras@iki.fi",
        "time": "Mon Nov 02 16:50:07 2015 +0200"
      },
      "committer": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Tue Dec 08 14:12:10 2015 -0500"
      },
      "message": "zebra: implement per-route mtu handling\n\nThis commits allow overriding MTU using netlink attributes on\nper-route basis. This is useful for routing protocols that can\nadvertice prefix specific MTUs between routers (e.g. NHRP).\n\nSigned-off-by: Timo Teräs \u003ctimo.teras@iki.fi\u003e\n"
    },
    {
      "commit": "7eb6136b2732d4782360f9f376336c6d4f667ff0",
      "tree": "5e77b44139cf542a18a949d1204ace4316b474f1",
      "parents": [
        "929a26a7cf80b2df9981595e6bcfcfc4a970052a"
      ],
      "author": {
        "name": "Timo Teräs",
        "email": "timo.teras@iki.fi",
        "time": "Mon Nov 02 16:50:05 2015 +0200"
      },
      "committer": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Tue Dec 08 14:12:10 2015 -0500"
      },
      "message": "zebra: make ZEBRA_FLAG_CHANGED internal status\n\nThis flag is used internally in zebra only. And it makes no sense\nto expose it over the zclient API, as having it set from client\ncould corrupt the internal state.\n\nSigned-off-by: Timo Teräs \u003ctimo.teras@iki.fi\u003e\nAcked-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "929a26a7cf80b2df9981595e6bcfcfc4a970052a",
      "tree": "7be5a0c2750044002a9577e85a2736248aa48d7e",
      "parents": [
        "0d7435f2138955b4b8aa9044eefbaff31ec33248"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Wed Oct 28 19:59:30 2015 -0400"
      },
      "committer": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Tue Dec 08 14:12:10 2015 -0500"
      },
      "message": "lib: Memory reporting fails over 2GB\n\nThe old style mallinfo() function uses an \u0027int\u0027 to\nreport memory usage data to the program.  Unfortunately\nmodern architectures can chew through 2gb of memory like a\nbuzz saw hitting some warm butter, especially in the case\nof a memory leak or memory fragmentation.\n\nWhen a daemon uses more than 2gb of memory, just indicate it\u0027s\ngotten large and we don\u0027t know anymore.\n\nPre-change behavior:\nRobot-1# show memory\nSystem allocator statistics:\nTotal heap allocated: 16777216 TiB\nHolding block headers: 1288 KiB\nUsed small blocks: 0 bytes\nUsed ordinary blocks: 535 MiB\nFree small blocks: 768 bytes\nFree ordinary blocks: 16777216 TiB\nOrdinary blocks: 266107\nSmall blocks: 24\nHolding blocks: 2\n\nPost-change behavior:\nRobot-1# show memory\nSystem allocator statistics:\n  Total heap allocated:  1572 KiB\n  Holding block headers: \u003e 2GB\n  Used small blocks:     0 bytes\n  Used ordinary blocks:  1443 KiB\n  Free small blocks:     32 bytes\n  Free ordinary blocks:  129 KiB\n  Ordinary blocks:       2\n  Small blocks:          1\n  Holding blocks:        2\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "c8af680df5beb613fd50c265773a6beb0f1768c9",
      "tree": "e46da907fe4b493085d8e4bcb51d775cc32ef05b",
      "parents": [
        "363c903435b154e989f0544d12d4ac8d50174c0b"
      ],
      "author": {
        "name": "Daniel Walton",
        "email": "dwalton@cumulusnetworks.com",
        "time": "Wed Oct 21 06:56:44 2015 -0700"
      },
      "committer": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Tue Dec 08 14:11:14 2015 -0500"
      },
      "message": "lib: Add zlog_hexdump() for debugging\n\nSigned-off-by: Daniel Walton \u003cdwalton@cumulusnetworks.com\u003e\nReviewed-by:   Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "92e62e06ba9e03c4603538b3138298b274e3c167",
      "tree": "97cddcb06259dfd27ac7e46eae78ba963bd33d54",
      "parents": [
        "f89b09be92bed03b1e5add55dc14ef92e94c52e1"
      ],
      "author": {
        "name": "Daniel Walton",
        "email": "dwalton@cumulusnetworks.com",
        "time": "Wed Oct 21 06:42:53 2015 -0700"
      },
      "committer": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Tue Dec 08 14:11:06 2015 -0500"
      },
      "message": "ospfd: Lower the default OSPF spf timers to \u00270 50 5000\u0027\n\nSigned-off-by: Daniel Walton \u003cdwalton@cumulusnetworks.com\u003e\nReviewed-by:   Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "283596fd6d49a5b2861a6923db9a88628ef0eca4",
      "tree": "1b461a1fea8840efaafd1250f729831be91fea9f",
      "parents": [
        "be62b17c736ea06181f2788e3011066830555610",
        "fc1c114aab24fe47bc6a1976c1c602d507fa4e69"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@jakma.org",
        "time": "Wed Oct 28 14:25:06 2015 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Oct 28 14:25:06 2015 +0000"
      },
      "message": "Merge \u0027patch-tracking/4/proposed/netdef-solaris\u0027 into accepted\n"
    },
    {
      "commit": "056f3760cd311faf088d6f5fe06498960788c8c7",
      "tree": "6098f68402cefc8dbf0b832636390c453802a245",
      "parents": [
        "5c1791f28e2e831e4e9b92c3c2f7d8ed832cb968"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Wed Apr 10 12:30:04 2013 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue Oct 27 11:00:29 2015 +0000"
      },
      "message": "bgpd, lib: memory cleanups for valgrind, plus debug changes\n\nDescription:\n    We use valgrind memcheck quite a bit to spot leaks in\n    our work with bgpd. In order to eliminate false positives,\n    we added code in the exit path to release the remaining\n    allocated memory.\n\n    Bgpd startup log message now includes pid.\n\nSome little tweaks by Paul Jakma \u003cpaul.jakma@hpe.com\u003e:\n\n* bgp_mplsvpn.c: (str2prefix_rd) do the cleanup in common code at the end\n  and goto it.\n"
    },
    {
      "commit": "eeef0db2e9260fe76acb328a339025c432eb7c22",
      "tree": "48bc6b2b1e3e71658fcf345ed381d3d4bf10c8c4",
      "parents": [
        "ee162617ead116ebcda93b145a043231647b3380"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Wed Oct 14 08:50:38 2015 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue Oct 27 10:53:22 2015 +0000"
      },
      "message": "lib: Fix duplicate variable name in smux.c and vty.c\n\nBoth smux.c and vty.c have the same:\nstatic struct thread_master *master;\n\nas global variables for the file.  This can and will lead to confusion\nname the variables something appropriate for the file it is in.\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "d8aa4beab72cdd2c2d78f9e624fd4b704eec488f",
      "tree": "b2f1db2c50ce548175240b9621df6df936cf44a6",
      "parents": [
        "7125293d65d73a451ec203c8c1630c236171f5a3"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Mon Sep 28 20:10:40 2015 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue Oct 27 10:53:21 2015 +0000"
      },
      "message": "vtysh: Fix Quagga.conf file read in.\n\nThere exists a sequence of cli commands that are successfully read in by bgpd.conf, but\nnot by a consolidated Quagga.conf.\n\nThis issue stems from the fact that the consolidated config file attempts to match the\ncurrent node + 1 node up the tree, while the individual config file searches for matches\nall the way up the tree.\n\nQuagga.conf read-in relies on vtysh_cmd.c command parsing which puts all nodes\nat CONFIG_NODE and if a match is found CMD_SUCCESS_DAEMON is returned.  This signals to\nthe parser to call the appropriate daemon with the comamnd.\n\nbgp as an example has three levels of config node\u0027s.  If you are reading in a config node\nat the 3rd level(say address-family ipv6) then transition to another node under bgp it will\nnot work in Quagga.conf because the code only looked up one node and was at CONFIG_BGP when it failed\nto find a match.\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\nReviewed-by: Daniel Walton \u003cdwalton@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "7125293d65d73a451ec203c8c1630c236171f5a3",
      "tree": "f9d118c9a8f8374d69fb9c75c87531a2ca478fb2",
      "parents": [
        "fd1c1a133af47ae5533a5ed41b73ff62e7aa1058"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Thu Sep 24 09:25:19 2015 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue Oct 27 10:53:21 2015 +0000"
      },
      "message": "lib: zclient.c remove extern struct thread_master *\n\nzclient.c depended upon link time inclusion of a\nextern struct thread_master *master.  This is a violation of the\nnamespace of the calling daemon.  If a library needs the pointer\npass it in and save it for future use.\n\nThis code change also makes the zclient code consistent with\nthe other lib functions that need to schedule work on your behalf\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "12bbd62112724483f72c4040a4c4b585aff8eb54",
      "tree": "74a4bca406b97b8f7b1ff015bbe8559bdafbb7cb",
      "parents": [
        "d8d5c60ecfab4dd609a07b4baa00d735f59002b9"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Sep 15 02:26:44 2015 -0700"
      },
      "committer": {
        "name": "Martin Winter",
        "email": "mwinter@opensourcerouting.org",
        "time": "Fri Oct 16 23:50:46 2015 -0700"
      },
      "message": "lib: add getgrouplist() for Solaris\n\nOf course Solaris doesn\u0027t have getgrouplist()...\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "089e5eb7310683be6806726dbf7b7c94b1b66bfb",
      "tree": "15e431679f2fa9dc9880e9690bb9a11f9545a428",
      "parents": [
        "821df2cf18e5978cc7ab532a8695444380d08270"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Sep 15 02:03:36 2015 -0700"
      },
      "committer": {
        "name": "Martin Winter",
        "email": "mwinter@opensourcerouting.org",
        "time": "Fri Oct 16 23:50:46 2015 -0700"
      },
      "message": "build/solaris: drop duplicate __EXTENSION__ define\n\n__EXTENSION__ is already defined in config.h by autoconf; drop the\nduplicate from zebra.h.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "821df2cf18e5978cc7ab532a8695444380d08270",
      "tree": "f306ad0e31d572c44193b5d709b4b3915ea89d90",
      "parents": [
        "ca8ec20b017393dbe91ff9e5ae2b7ff12872f869"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Sep 15 01:53:09 2015 -0700"
      },
      "committer": {
        "name": "Martin Winter",
        "email": "mwinter@opensourcerouting.org",
        "time": "Fri Oct 16 23:50:45 2015 -0700"
      },
      "message": "*: make sure zebra.h is always included first\n\nzebra.h pulls in config.h, which results in fiddling with things like\n__FILE_OFFSET_BITS. It must always be included first, in order to set\nflags that influence the compiler via \u003cfeatures.h\u003e.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "04a3aabf58d95d01c4c8168eeff43cf9d9892eee",
      "tree": "c810fdc3ff48d185bb34ce73e986a2c88da3780f",
      "parents": [
        "0bc874b88cf86fca4b18f3672a441ed142fc499d"
      ],
      "author": {
        "name": "Nicolas Dichtel",
        "email": "nicolas.dichtel@6wind.com",
        "time": "Thu Sep 03 10:47:43 2015 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Thu Sep 24 15:26:45 2015 +0100"
      },
      "message": "vrf: add a runtime check before playing with netns\n\nThis patch adds a runtime check to determine if netns are available. Some\nsystems like OpenWRT have the system call setns() but don\u0027t have the kernel\noption CONFIG_NET_NS enabled.\n\nReported-by: Christian Franke \u003cchris@opensourcerouting.org\u003e\nSigned-off-by: Nicolas Dichtel \u003cnicolas.dichtel@6wind.com\u003e\nTested-by: Christian Franke \u003cchris@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "fbc3e97d747862fd47f711c9f15b8166bdf94b18",
      "tree": "1474fb1b2c1210231731bfdbc195da31fd3d7c02",
      "parents": [
        "4fdb5f401eb277fa54d80e99d241bd9b03895a6a"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Wed Aug 12 14:32:47 2015 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Thu Sep 24 15:26:44 2015 +0100"
      },
      "message": "lib: Remove unused \u0027show memory XXX\u0027 functionality\n\nThe \u0027show memory XXXX\u0027 functionality is not used at all.\nThis removes the unused code\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "4fdb5f401eb277fa54d80e99d241bd9b03895a6a",
      "tree": "9048bb26214861b9bef418c7d5bee5f213bf5d6f",
      "parents": [
        "a9d4cb33faa6af622240190a80f41c4672374925"
      ],
      "author": {
        "name": "Denil Vira",
        "email": "denil@cumulusnetworks.com",
        "time": "Thu Jul 23 06:52:16 2015 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Thu Sep 24 15:26:44 2015 +0100"
      },
      "message": "lib: Fix Free Pointer dereference in lib/filter.c\n\nCoverity Scan ID 23056. access is accessed after free in access_list_delete\n\nSigned-off-by: Denil Vira \u003cdenil@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "a9d4cb33faa6af622240190a80f41c4672374925",
      "tree": "9590bb1715d7418b50a742a3c83363d4e4b67755",
      "parents": [
        "f733280419f18b1a0e3b06ec3681781689d57053"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Thu Sep 17 10:54:25 2015 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Thu Sep 24 15:26:44 2015 +0100"
      },
      "message": "lib/zclient: Consolidate error reporting for zclient_read_header\n\nAll functions that call zclient_read_header immediately turn around\nand check to ensure that the version and marker fields are correct\nMove this code into zclient_read_header\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "f733280419f18b1a0e3b06ec3681781689d57053",
      "tree": "95e34d98165eac4245f5b51cb2727a6b57f88259",
      "parents": [
        "e675678789b11d175a08a9e0be73917aa8f23a15"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Fri Jul 17 22:36:57 2015 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Thu Sep 24 15:26:44 2015 +0100"
      },
      "message": "lib/command: Fix optional arguments with description interactions\n\nIf you have a cli like this:\n\"neighbor WORD interface {v6only}\"\n\nWhen in the cli you hit ? after entering v6only you get this:\n\ntor-11(config-router)# neighbor swp1 interface v6only\n% There is no matched command.\ntor-11(config-router)# neighbor swp1 interface v6only\n\nWith this fix we now see:\ntor-22(config-router)# neighbor swp1 interface v6only\n  \u003ccr\u003e\ntor-22(config-router)# neighbor swp1 interface v6only\n\nThis behavior is now consistent with non-optional last\narguments.\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "13c2a3db503fde67f647fa58fd4e1077517ebb5c",
      "tree": "506bead8b2040e9c216f18e76df3091a5924a31f",
      "parents": [
        "e8441a81f6c9f73bc8a25669003abffb40066703"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@jakma.org",
        "time": "Tue Sep 15 16:16:42 2015 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Thu Sep 24 15:26:42 2015 +0100"
      },
      "message": "lib/workqueue: Add trivial work_queue_is_scheduled helper\n"
    }
  ],
  "next": "e8441a81f6c9f73bc8a25669003abffb40066703"
}
