)]}'
{
  "log": [
    {
      "commit": "0d8b32a5ee43ccc4a67dd87ab21a4ab553e3bf44",
      "tree": "866250b3e2c949344bfce2f104b8820a752834ca",
      "parents": [
        "bb04351973bd369623a0fbed3ef59e7b4fd0bd05"
      ],
      "author": {
        "name": "Christian Franke",
        "email": "nobody@nowhere.ws",
        "time": "Tue Jun 14 20:07:00 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Mon Oct 17 17:41:36 2016 +0100"
      },
      "message": "bgpd: fix off-by-one in attribute flags handling\n\nbgp_attr_flag_invalid can access beyond the last element of attr_flags_values.\nFix this by initializing attr_flags_values_max to the correct value.\n\nSigned-off-by: Christian Franke \u003cchris@opensourcerouting.org\u003e\nSigned-off-by: Christian Franke \u003cchris@opensourcerouting.org\u003e\nAcked-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "bb04351973bd369623a0fbed3ef59e7b4fd0bd05",
      "tree": "0bc7a8213129c88bd1cfe0c33caadb9255ebf702",
      "parents": [
        "e33545cb9d7a8c7875f18b6d44bf75d320ccedfb"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Mon Oct 10 11:56:52 2016 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Oct 11 12:00:00 2016 +0100"
      },
      "message": "bgp: restore missing check from original ignore NHT change\n"
    },
    {
      "commit": "e33545cb9d7a8c7875f18b6d44bf75d320ccedfb",
      "tree": "be90abff85648955fbfc00d6ea0310b49caba452",
      "parents": [
        "68bfb6190e19898adc0e420b6346cf4778705e60"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Mon Oct 10 09:50:58 2016 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Oct 11 11:59:22 2016 +0100"
      },
      "message": "bgp: fix warning in bgp_nht.c\n"
    },
    {
      "commit": "68bfb6190e19898adc0e420b6346cf4778705e60",
      "tree": "fbccbc160a94c245abee2696fef805da7f620b4b",
      "parents": [
        "743dd42b3f5d4bc5f9a86b91364c67217f42c6d1"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Thu Oct 06 09:59:32 2016 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Oct 07 10:53:15 2016 +0100"
      },
      "message": "bgp: ignore NHT when bgpd has never connected zebra\n"
    },
    {
      "commit": "743dd42b3f5d4bc5f9a86b91364c67217f42c6d1",
      "tree": "365a266a5e8b3602e359aeadfb921133a2c70c22",
      "parents": [
        "af177b245ef3f092ecd0ae75cb75c2d797a7b139"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Sep 30 13:55:47 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Oct 04 13:07:56 2016 +0100"
      },
      "message": "bgpd: Fix NHT race with Connect leading to test tool issues\n\n* The NHT change:\n\n   \"bgpd, zebra: Use next hop tracking for connected routes too\"\n\n  introduces a race where bgp_connect_check can be called on a peer in\n  Connect state before the TCP handshake has completed. If this happens,\n  then the SO_ERROR sockopt to check the state of the socket is undefined\n  or at least does not return a useful result - it returns 0, as with\n  a connected socket. SO_ERROR should only be called on non-block sockets\n  after the socket has been ready for writing.\n\n  The net result is that bgpd can then incorrectly advance the peer FSM for\n  the socket (also the main \u0027peer\u0027), to OpenSent. As part of which, any\n  incoming connection from the peer will pass through collision_detect and\n  may be (incorrectly) closed, depending on the RIDs.\n\n  This race is reliably hit with testing tools which wait to listen for\n  incoming BGP connections from the RUT to know it is in Connect/Active, and\n  which ignore the TCP connection (no SYN|ACK, no RST), and then launch their\n  own connection.\n\n  The fix is to better integrate the BGP FSM and the NHT update, to ensure\n  connect_check is not called on peers in Connect state.\n\n  Note: There may be no need at all for NHT to tickle FSM.\n\n* bgpd.h: Add NHT_Update FSM event for NHT valid.\n\n* bgp_fsm.c: (bgp_fsm_nht_update) There is no need to have a separate\n  switch based FSM with its own event via an exported function.  Have\n  NHT raise the NHT_Update even on the peer, instead of calling a\n  side-channel function into a sub-FSM in the FSM.  No need to have\n  code for BGP_Start, FSM can call that.  Actions for Connect and\n  Active are the same and just lead to ConnectRetry_timer_expired\n  event - so FSM can just call same transition func as that.\n\n  No need to call bgp_connect_check on Connect, as Connect implies no\n  connection.\n\n  (FSM) Handle the NHT_Update event, replacing bgp_fsm_nht_update.\n  Idle -\u003e bgp_start, Connect and Active were doing the same as\n  ConnectRetry_timer_expired so replicate those. Rest are No-Ops.\n\n* bgp_nht.c: (evaluate_paths) Raise NHT_Update FSM event. Always valid.\n* bgp_packet.{c,h}: (bgp_connect_check) NHT change now unnecessary, revert.\n"
    },
    {
      "commit": "b4e011985232f28d98e4df88c7cb13ee8f95ef46",
      "tree": "08645e444b7e7f5177ced9b880587e7184c56e2b",
      "parents": [
        "810ab34c56a9b9b8870b961bc96986e6b8550863"
      ],
      "author": {
        "name": "Evgeny Uskov",
        "email": "eu@qrator.net",
        "time": "Wed Jan 13 13:58:00 2016 +0300"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Oct 04 13:07:53 2016 +0100"
      },
      "message": "bgpd: Fix buffer overflow error in bgp_dump_routes_func\n\nNow if the number of entries for some prefix is too large, multiple\nTABLE_DUMP_V2 records are created.  In the previous version in such\nsituation bgpd crashed with SIGABRT.\n"
    },
    {
      "commit": "810ab34c56a9b9b8870b961bc96986e6b8550863",
      "tree": "0b533fe031845ea162dbb6f54339f5b4124eebbd",
      "parents": [
        "19e6c193db0c74ed08dbb5cd30dfa8f6a4377af0"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Mon Sep 05 12:18:15 2016 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Oct 04 13:07:53 2016 +0100"
      },
      "message": "bgp: bgp_nexthop init/free AFI_ETHER related NH tables\n"
    },
    {
      "commit": "19e6c193db0c74ed08dbb5cd30dfa8f6a4377af0",
      "tree": "8b0b2a80222c2785f84ff3a0d30462d6c274ad8d",
      "parents": [
        "c365b534623279049bc4cc0c5d03fdbcd2d466b0"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 06 17:23:48 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Oct 04 13:07:53 2016 +0100"
      },
      "message": "bgpd: bgp_nexthop_cache not deleted with peers\n\n* Fix mild leak, bgp_nexthop_caches were not deleted when their peer was.\n  Not a huge one, but makes valgrinding for other leaks noisier.\n\n  Credit to Lou Berger \u003clberger@labn.net\u003e for doing the hard work of\n  debugging and pinning down the leak, and supplying an initial fix.\n  That one didn\u0027t quite get the refcounting right, it seemed, hence\n  this version.\n\n  This version also keeps bncs pinned so long as the peer is defined, where\n  Lou\u0027s tried to delete whenever the peer went through bgp_stop. That causes\n  lots of zebra traffic if down peers go Active-\u003eConnect-\u003eActive, etc., so\n  leaving bnc\u0027s in place until peer_delete seemed better.\n\n* bgp_nht.c: (bgp_unlink_nexthop_by_peer) similar to bgp_unlink_nexthop, but\n  by peer.\n* bgp_nht.c: (bgp_unlink_nexthop_check) helper to consolidate checking\n  if a bnc should be deleted.\n  (bgp_unlink_nexthop_by_peer) ensure the bnc-\u003enht_info peer reference\n  is removed, and hence allow bncs to be removed by previous.\n* bgpd.c: (peer_delete) cleanup the peer\u0027s bnc.\n"
    },
    {
      "commit": "c365b534623279049bc4cc0c5d03fdbcd2d466b0",
      "tree": "89e61557d1f172386a5b9c2f5f0ad194789f2115",
      "parents": [
        "4b502fdb64db6fcad5359973e3ff7e7c88e93a7d"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue Jul 26 10:58:53 2016 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Oct 04 13:07:53 2016 +0100"
      },
      "message": "bgpd: Remove unused and leaking code\n"
    },
    {
      "commit": "789dfc9fe07e23e6c73a299ecbbcbb6d3d411391",
      "tree": "dd0b1fbd41a83a3e18f6e2adc7e53b90f5bd428c",
      "parents": [
        "d9ab53ab40dcba66f34ca75695dc930e6093f789"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 06 11:20:27 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Oct 04 13:07:52 2016 +0100"
      },
      "message": "bgpd: Fix crash in \u0027show ip bgp nexthop\u0027\n\n* bgp_nexthop.c: (show_ip_bgp_nexthop_table) the AFIs are sparse, and start\n  from 1, check there\u0027s a table before derefing so as not to crash.\n"
    },
    {
      "commit": "d9ab53ab40dcba66f34ca75695dc930e6093f789",
      "tree": "552f537b8f5decf1b74d8fc98b96ef3e65a01051",
      "parents": [
        "5bcd754ff8d7947978acb44e77dcab323973fb1e"
      ],
      "author": {
        "name": "Dinesh Dutt",
        "email": "ddutt@cumulusnetworks.com",
        "time": "Tue May 19 17:47:21 2015 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Oct 04 13:07:52 2016 +0100"
      },
      "message": "bgpd, zebra: Use next hop tracking for connected routes too\n\nAllow next hop tracking to work with connected routes\nAnd cleanup obsolete code in bgp_scan and bgp_import.\n\nSigned-off-by: Dinesh Dutt \u003cddutt@cumulusnetworks.com\u003e\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\nEdits: Paul Jakma \u003cpaul.jakma@hpe.com\u003e Rebase re-ordering conflicts with\n       NHT route-map, potential errors.\n"
    },
    {
      "commit": "5bcd754ff8d7947978acb44e77dcab323973fb1e",
      "tree": "75fab09b53d3d810d327d8569e0f1e289550f941",
      "parents": [
        "6c6c1bf0fc66713cb0b3448a4323042f44016502"
      ],
      "author": {
        "name": "Daniel Walton",
        "email": "dwalton@cumulusnetworks.com",
        "time": "Tue May 19 17:58:10 2015 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Oct 04 13:07:52 2016 +0100"
      },
      "message": "bgpd: crash if attributes alone consume \u003e 4096 bytes\n\nThis patch fixes a crash if attributes on a patch consume\nmore than 4096 bytes.\n\nSigned-off-by: Daniel Walton \u003cdwalton@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "6c6c1bf0fc66713cb0b3448a4323042f44016502",
      "tree": "500f40a63728f968a8198db0300e8945131fb5b8",
      "parents": [
        "e25a9741fb1ba52a69833687caa01f13cd4d1320"
      ],
      "author": {
        "name": "Daniel Walton",
        "email": "dwalton@cumulusnetworks.com",
        "time": "Mon Nov 09 20:21:56 2015 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Oct 04 13:07:52 2016 +0100"
      },
      "message": "bgpd: Improve peer scaling\n\nReduce the amount of time it takes to bring up a large number of peers.\n\nThis is accomplished by removing jitter and reducing the number\nof seconds to wait before connecting to a peer.\n\nSigned-off-by: Daniel Walton \u003cdwalton@cumulusnetworks.com\u003e\n\nEdited-by: Paul Jakma \u003cpaul.jakma@hpe.com\u003e for rebase conflicts, and to add\n           jitter on connect timer back in. Can be removed in an update.\n"
    },
    {
      "commit": "e25a9741fb1ba52a69833687caa01f13cd4d1320",
      "tree": "bc3eb6ea0e14e142095ada9a0dc44a3447dc009a",
      "parents": [
        "cb9ed1d867f6ac9e0bad85c47aabeb10b94be2e5"
      ],
      "author": {
        "name": "Daniel Walton",
        "email": "dwalton@cumulusnetworks.com",
        "time": "Mon Nov 09 20:21:50 2015 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Oct 04 13:07:52 2016 +0100"
      },
      "message": "bgpd: don\u0027t count a route with an unreachable nexthop in PfxRcd\n\nWhen a route is received from a peer that we cannot\nreach do not count that route as a received route.\n\nSigned-off-by: Daniel Walton \u003cdwalton@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "c69698704806a9ac5035521b1820057097919227",
      "tree": "51f9b001c139c75f0ac3088a172f2a6c23bab4a8",
      "parents": [
        "cb37de4c6863c772b654a851c9fe3eeb1f677692"
      ],
      "author": {
        "name": "Daniel Walton",
        "email": "dwalton@cumulusnetworks.com",
        "time": "Tue May 19 18:03:43 2015 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Oct 04 13:07:51 2016 +0100"
      },
      "message": "bgpd: Correct a few fuzz failures in BGP\n\nTesting revealed some issues with handling data input.\nThis patch fixes those issues.\n\nSigned-off-by: Daniel Walton \u003cdwalton@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "2153090340f059eb787d72ba973ea55e150e9dec",
      "tree": "42fa35eb7553402425ce6e836bed00aa828a7ef6",
      "parents": [
        "4c7efde6db75229069be72b34a93f279fe57d23b"
      ],
      "author": {
        "name": "Daniel Walton",
        "email": "dwalton@cumulusnetworks.com",
        "time": "Tue May 19 18:03:38 2015 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Oct 04 13:07:51 2016 +0100"
      },
      "message": "bgpd: Fix BGP_INFO_ATTR_CHANGED being cleared incorrectly\n\nback to back route refreshes can set BGP_INFO_ATTR_CHANGED\non the first route refresh but then clear it on the second\n\nSigned-off-by: Daniel Walton \u003cdwalton@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": "9e518dd52b1fbf7d395a6bb49a101d632ced5e5b",
      "tree": "8cd92e6b61e0d3643b9000444fe252e0b781b8bd",
      "parents": [
        "9ae8552c7341071ffac34aec9902fa3dd7dc8fdf"
      ],
      "author": {
        "name": "Daniel Walton",
        "email": "dwalton@cumulusnetworks.com",
        "time": "Tue May 19 17:47:26 2015 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Oct 04 13:07:50 2016 +0100"
      },
      "message": "bgpd: Alow gracefull shutdown of peers\n\nSend CEASE NOTIFICATIONS to all peers on \"no router bgp\"\n\nSigned-off-by: Daniel Walton \u003cdwalton@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "c7f25b90902d4be39132b1174440746b571220ce",
      "tree": "b66ca69885ba36884b09473700f08cc3909cfea3",
      "parents": [
        "f2eb9caac6425473af8d6d15534439fe715f7426"
      ],
      "author": {
        "name": "Daniel Walton",
        "email": "dwalton@cumulusnetworks.com",
        "time": "Tue May 19 17:47:22 2015 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Oct 04 13:07:50 2016 +0100"
      },
      "message": "bgpd, ospfd, ospf6d, ripd, ripngd, zebra: \u0027set metric -12\u0027 is broken in the parser\n\nSigned-off-by: Daniel Walton \u003cdwalton@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "f2eb9caac6425473af8d6d15534439fe715f7426",
      "tree": "17ee9ab41bc5afee212825a7fb0c6caeceb4b7bd",
      "parents": [
        "96d1060a704d88e04fcd446cce078a6131c3f6db"
      ],
      "author": {
        "name": "Daniel Walton",
        "email": "dwalton@cumulusnetworks.com",
        "time": "Tue May 19 17:47:21 2015 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Oct 04 13:07:50 2016 +0100"
      },
      "message": "bgpd: atomic-aggregate is lost when we aggregate another aggregate that has atomic-aggregate\n\nThis patch ensures that we don\u0027t accidently loose the atomic-aggregate\nwhen we aggregate another aggregate that also has atomic-aggregates.\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": "605aa331d814b0977dd8435168dca5b2b7928996",
      "tree": "c33e213e83b219b61e19aa3dc8edec34dae962c7",
      "parents": [
        "2b2e38c3169ae0221645e4dd9b40388660ce3f68"
      ],
      "author": {
        "name": "Piotr Chytła",
        "email": "pch@packetconsulting.pl",
        "time": "Tue Dec 01 10:03:54 2015 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Oct 04 13:07:49 2016 +0100"
      },
      "message": "bgpd, vtysh: Add support for route tags\n\n[Forward ported by Cumulus]\n\nDocumentation\n-------------\nAll ipv4 and ipv6 static route commands now have a \"tag\" option\nwhich allows the user to set a tag between 1 and 65535.\n\nquagga(config)# ip route 1.1.1.1/32 10.1.1.1 tag ?\n  \u003c1-65535\u003e  Tag value\nquagga(config)# ip route 1.1.1.1/32 10.1.1.1 tag 40\nquagga(config)#\n\nquagga# show ip route 1.1.1.1/32\nRouting entry for 1.1.1.1/32\n  Known via \"static\", distance 1, metric 0, tag 40, best\n  * 10.1.1.1, via swp1\n\nquagga#\n\nThe route-map parser supports matching on tags and setting tags\n!\nroute-map MATCH_TAG_18 permit 10\n match tag 18\n!\n\n!\nroute-map SET_TAG_22 permit 10\n set tag 22\n!\n\nBGP and OSPF support:\n- matching on tags when redistribing routes from the RIB into BGP/OSPF.\n- setting tags when redistribing routes from the RIB into BGP/OSPF.\n\nBGP also supports setting a tag via a table-map, when installing BGP\nroutes into the RIB.\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\n\nEdits by: Paul Jakma \u003cpaul.jakma@hpe.com - conflicts on re-ordering with the\nrmap-event and table-map patches, those will now need to update the tags stuff.\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": "d8c5f27777051b3ea32f8b5979ecd9bb7b9475b9",
      "tree": "9a88ac0011a029b6c7ba5efe02d11e3a1339c4e7",
      "parents": [
        "743219e9abe79e8a3828fc00de679098061960bb"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Wed Mar 16 08:10:56 2016 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Oct 04 13:07:48 2016 +0100"
      },
      "message": "bgpd: flag paths for multipath if we RX link-local and global nexthops\n\nPaths with global and link-local nexthops should be considered for multipath\n\nSigned-off-by: Daniel Walton \u003cdwalton@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "fa2e78677bde6926dc7cfa29e14925eb6d8e87b3",
      "tree": "5d46321c69cf4ac0d97e3411799fbe3bb6c7de49",
      "parents": [
        "7d39125ea4d54624a4865dd272df5041ccac655e"
      ],
      "author": {
        "name": "Vivek Venkatraman",
        "email": "vivek@cumulusnetworks.com",
        "time": "Tue May 19 18:03:54 2015 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Oct 04 13:07:48 2016 +0100"
      },
      "message": "bgpd: Make source interface selection in BGP for nexthop determination more robust\n\nEnsure that if \u0027update-source \u003cinterface\u003e\u0027 is specified, that interface is\nchosen as the source for the local nexthops. Otherwise, do a complete\nmatch on the local IP address of the connection to determine the source\ninterface for the local nexthops; this will handle scenarios where there\nis an overlap of subnets between interfaces (e.g., loopback and another\ninterface).\n\nSigned-off-by: Vivek Venkatraman \u003cvivek@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "e2a0ebf26c640822c3488e6f371a043a91fdcc1b",
      "tree": "2132335499fb8a3f3460958f01fcb2cd4a8289d8",
      "parents": [
        "69424be09ccf7233b184b89bb7bd6e98f72d252b"
      ],
      "author": {
        "name": "Daniel Walton",
        "email": "dwalton@cumulusnetworks.com",
        "time": "Tue May 19 18:03:43 2015 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:47 2016 +0100"
      },
      "message": "bgpd: Display BGP paths with unreachable nexthops as invalid\n\nIf a BGP path has an unreachable nexthop display that path as invalid\n\nSigned-off-by: Daniel Walton \u003cdwalton@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "59fe0eecd3498f28ec1b1cdb2de5dcc7c507f83f",
      "tree": "15f342a0a8955f0414133ef856c2509b7d92ef53",
      "parents": [
        "325fcfb6d83c9add415e24e786035b67b00fd719"
      ],
      "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 Sep 13 10:36:46 2016 +0100"
      },
      "message": "bgpd: Add [bestpath|multipath] option to \u0027show ip bgp x.x.x.x\u0027\n\nWhen showing a prefix in bgp allow user to specify output\nbased upon the bestpath chosen, multipath information of all\ninformation about a prefix(the default)\n\nSigned-off-by: Daniel Walton \u003cdwalton@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "325fcfb6d83c9add415e24e786035b67b00fd719",
      "tree": "f8608273e8b41d31888dd9112e978a5b0af21075",
      "parents": [
        "76a7280ddebd94b20c545e93d9773e7ad4db91de"
      ],
      "author": {
        "name": "Daniel Walton",
        "email": "dwalton@cumulusnetworks.com",
        "time": "Tue May 19 17:58:10 2015 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:46 2016 +0100"
      },
      "message": "bgpd: Add clear command to force a bestpath recalculation and re-advertisement of a prefix\n\nAdd these commands to bgp:\n\nclear ip bgp prefix A.B.C.D/M\nclear bgp ipv6 (unicast|multicast) prefix X:X::X:X/M\n\nThese two commands forces a bestpath calculation to happen again if\nnecessary to re-advertise the prefix.\n\nSigned-off-by: Daniel Walton \u003cdwalton@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "76a7280ddebd94b20c545e93d9773e7ad4db91de",
      "tree": "e23a452ad18059aa890731eb2cfdf6ec8c511562",
      "parents": [
        "78243040fc60babf83ef02572ad7966ebd20192e"
      ],
      "author": {
        "name": "Daniel Walton",
        "email": "dwalton@cumulusnetworks.com",
        "time": "Tue May 19 17:47:24 2015 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:46 2016 +0100"
      },
      "message": "bgpd: Fix aggregation issues found via ANVL\n\nThere were various failures in ANVL\u0027s aggregation tests, this\npatch fixes those issues found\n\nSigned-off-by: Daniel Walton \u003cdwalton@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "78243040fc60babf83ef02572ad7966ebd20192e",
      "tree": "3f75137aa154ba159ed9e220b4b6e121bbec3344",
      "parents": [
        "d0aa6e8b222f44949b0a190d8ff70d90333b775c"
      ],
      "author": {
        "name": "Daniel Walton",
        "email": "dwalton@cumulusnetworks.com",
        "time": "Tue May 19 17:47:23 2015 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:46 2016 +0100"
      },
      "message": "bgpd: iBGP multipath is broken if \u0027bgp deterministic-med\u0027 is enabled.\n\nAS_PATH comparison is broken if CONFED_AS_SEQ are present.\nThis patch fixes this issue\n\nSigned-off-by: Daniel Walton \u003cdwalton@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "d0aa6e8b222f44949b0a190d8ff70d90333b775c",
      "tree": "023b3155124dbd19260e0886e1582da65889ec5e",
      "parents": [
        "5552da8f9abd786fb76019135277003f489626d6"
      ],
      "author": {
        "name": "Daniel Walton",
        "email": "dwalton@cumulusnetworks.com",
        "time": "Fri Jun 17 14:45:42 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:46 2016 +0100"
      },
      "message": "bgpd: Make aspath_highest 4-byte compatible for private AS\n\n* bgp_aspath.h: Add BGP_AS_IS_PRIVATE macro.\n* bgp_aspath.c: (aspath_highest) use said macro to also ensure 4-byte private\n  AS range is ignored in calculating highest public ASN.\n  (aspath_private_as_check) consolidate to use said macro.\n\nNote: Extracted from \u0027bgpd: Add replace-as option to remove-private-as\u0027\nby paul@jakma.org.\n"
    },
    {
      "commit": "5552da8f9abd786fb76019135277003f489626d6",
      "tree": "c5dad1170dd671a48e949b92073afff78671a69e",
      "parents": [
        "dcc21851aa5f284bf57ccb2b662f4ff5b5a44321"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Jun 17 11:36:59 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:46 2016 +0100"
      },
      "message": "bgpd: Fix use after free in aspath_prepend with confeds\n\n* bgp_aspath.c: (aspath_prepend) aspath_delete_confed_seq may result\n  in as2 being updated, and seg2 becoming invalid. E.g. if the first\n  segment of of as2 is confeds. However, code there after unconditionally\n  reads from seg2.\n\n  Reset seg2, and re-do the empty check on it.\n\n  Caught by valgrinding tools/aspathtest.\n"
    },
    {
      "commit": "dcc21851aa5f284bf57ccb2b662f4ff5b5a44321",
      "tree": "531f26413dcc89db8b25dcb90cf154f6960b2bf8",
      "parents": [
        "c0a4cc74ef6994f9b4e4c1351d67a55a684faf38"
      ],
      "author": {
        "name": "Vipin Kumar",
        "email": "vipin@cumulusnetworks.com",
        "time": "Tue May 19 17:47:20 2015 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:45 2016 +0100"
      },
      "message": "bgpd: Make the private AS number check 4 byte compatible.\n\nSigned-off-by: Vipin Kumar \u003cvipin@cumulusnetworks.com\u003e\nReviewed-by: Dinesh Dutt \u003cddutt@cumulusnetworks.com\u003e\nReviewed-by: Daniel Walton \u003cdwalton@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "c0a4cc74ef6994f9b4e4c1351d67a55a684faf38",
      "tree": "17c22ef80e7ecfc7f34e07e99eee66de2394388c",
      "parents": [
        "62f936e7960a7c08f4ae42ad43726d8d6e8e949d"
      ],
      "author": {
        "name": "Daniel Walton",
        "email": "dwalton@cumulusnetworks.com",
        "time": "Mon Nov 09 20:22:00 2015 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:45 2016 +0100"
      },
      "message": "bgpd: Make \"no redistribute\" always remove the redistribute statement\n\nSigned-off-by: Daniel Walton \u003cdwalton@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "083e5e2d7bc8098b92572792ab807da381db95ea",
      "tree": "740c756c2d0483b194f801bbef763f4483a489d1",
      "parents": [
        "5cf768a3f53029ecc482367a1ceaf7578237b06a"
      ],
      "author": {
        "name": "Dinesh Dutt",
        "email": "ddutt@cumulusnetworks.com",
        "time": "Mon Nov 09 20:21:54 2015 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:45 2016 +0100"
      },
      "message": "bgpd, doc: Allow route-map policy modifications to also affect route reflectors.\n\nBy default, attribute modification via route-map policy out is ignored on\nreflected routes. This patch provides an option to allow this modification\nto occur. Once enabled, it affects all reflected routes.\n\nSigned-off-by: Dinesh G Dutt \u003cddutt@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "5cf768a3f53029ecc482367a1ceaf7578237b06a",
      "tree": "9cff44b2582ae8dcdf37749cbb5055b156d04488",
      "parents": [
        "af309fa58f41457eed226d6650d0b780c053c4d8"
      ],
      "author": {
        "name": "Dinesh Dutt",
        "email": "ddutt@cumulusnetworks.com",
        "time": "Mon Nov 09 20:21:53 2015 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:45 2016 +0100"
      },
      "message": "bgpd: Support matching on local preference in route-map\n\nThis patch adds support for matching on local preference in\nBGP route-map.\n\nSigned-off-by: Dinesh Dutt \u003cddutt@cumulusnetworks.com\u003e\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": "94627e670d661f95217521ef0bfba141e5e37e68",
      "tree": "660d32856e15a4e2d9868cdd87d0937e20f0e9e5",
      "parents": [
        "60cc95921ae663de325ca3e76e8c05d8224986ab"
      ],
      "author": {
        "name": "Pradosh Mohapatra",
        "email": "pmohapat@cumulusnetworks.com",
        "time": "Mon Nov 09 20:21:45 2015 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:44 2016 +0100"
      },
      "message": "bgpd: Add a null check in bgp_address_del() function when connected addresses are removed.\n\nWhen you flap an interface repeatedly, you can get into situations where\nthe code has not quite finished cleaning up before the next event happens.\nGracefully prevent a NULL dereference.\n\nSigned-off-by: Pradosh Mohapatra \u003cpmohapat@cumulusnetworks.com\u003e\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": "4feb0d02c029e2e4f229f6283f579b8673b0ac11",
      "tree": "739e7e060eb6f3488f38dd38ea669304cfe68e9e",
      "parents": [
        "b8d1f713ba6bc91138debe9f895621b8f91a43c7"
      ],
      "author": {
        "name": "Dinesh Dutt",
        "email": "ddutt@cumulusnetworks.com",
        "time": "Mon Nov 09 20:14:55 2015 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:44 2016 +0100"
      },
      "message": "bgpd: IPv6 Multipath broken with nexthop global address\n\nIPv6 multipath is broken in BGP if nexthop contains only global address.\nIPv6 always uses both nextop IPv6 address and ifIndex in sending routes down to\nzebra. In cases where only the global IPv6 address is present in the nexthop\ninformation, the existing code doesn\u0027t set the ifIndex. An example of such a\ncase is when a route-map isused with \"set ipv6 next-hop\" and only global\naddress is specified. This code causes the ifIndex to be determined and\nset thereby fixing the multipath programming.\n\nSigned-off-by: Dinesh G Dutt \u003cddutt@cumulusnetworks.com\u003e\nReviewed-by: Shrijeet Mukherjee \u003cshm@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "b8d1f713ba6bc91138debe9f895621b8f91a43c7",
      "tree": "c838c06bf87cdf7460ade9f8c1c3febb283ae8c9",
      "parents": [
        "34c5d89fed6e8e91ae3cde478f1f4816d69bf09e"
      ],
      "author": {
        "name": "Ayan Banerjee",
        "email": "ayan@cumulusnetworks.com",
        "time": "Mon Nov 09 20:14:54 2015 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:43 2016 +0100"
      },
      "message": "bgpd: Enable support for BGP IPV6 multipath.\n\nThis commit adds these two commands:\nmaximum-paths \u003c1-MULTIPATH_NUM\u003e\nmaximum-paths ibgp \u003c1-MULTIPATH_NUM\u003e\n\nunder address-family ipv6 mode.  In addition adding the ability\nto pass multiple paths down into zebra from bgp.\n\nSigned-off-by: Ayan Banerjee \u003cayan@cumulusnetworks.com\u003e\nSigned-off-by: Dinesh G Dutt \u003cddutt@cumulusnetworks.com\u003e\nReviewed-by: Scott Feldman \u003csfeldma@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "3b847ef4e81c6f1a5d4994680d530045765fd053",
      "tree": "04fcd0f852e384ba862d815de4aef88b6a4505e8",
      "parents": [
        "7f39242bf44c85bb651506214666b3ebdd78b928"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Apr 22 12:48:49 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:43 2016 +0100"
      },
      "message": "bgpd: Squash spurious \"unknown afi\" log messages\n\n* bgp_packet.c: (bgp_update_receive) doesn\u0027t differentiate between NLRIs that\n  are 0 AFI/SAFI cause they weren\u0027t set, and those because a peer sent a\n  bogus AFI/SAFI, before sending sending what may be a misleading, spurious\n  log message.  Check the .nlri pointer is set and avoid this.\n\nIncorporating a suggestion from: G. Paul Ziemba \u003cunp@ziemba.us\u003e\n"
    },
    {
      "commit": "f458d88e57e982e8f00a3d2db35a2c6e0bb331fa",
      "tree": "e9aeb1c68e02cfe1751b71d5b22d3d14fafb843b",
      "parents": [
        "584083d50511e19b228cce1e4a1cbcb28fae6b49"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 24 18:58:09 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:41 2016 +0100"
      },
      "message": "bgpd: ditch unused bgp_node_*() functions\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\nTested-by: NetDEF CI System \u003ccisystem@netdef.org\u003e\n"
    },
    {
      "commit": "584083d50511e19b228cce1e4a1cbcb28fae6b49",
      "tree": "58d6f9bf006083287d212ea0a09892c16d9d1b66",
      "parents": [
        "dfb9bd7aaadc2f5abb9bc9aecbd73b9d8b3a788c"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 24 18:58:08 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:41 2016 +0100"
      },
      "message": "bgpd: divorce router-id logic from CLI \u0026 zebra\n\nLogic for determining the router-id was spread out over bgp_zebra.c and\nbgp_vty.c.  Move to bgpd/bgpd.c and have these two call more properly\nencapsulated functions.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "dfb9bd7aaadc2f5abb9bc9aecbd73b9d8b3a788c",
      "tree": "5fdaeee00ed73a504721d3144849394e6e3110ea",
      "parents": [
        "4afa3ddd17464ecce91b6ed9df27b1231fb3e939"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 24 18:58:07 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:40 2016 +0100"
      },
      "message": "bgpd: minor header/API clean up\n\nAdds \"const\" on:\n- peer_update_source_addr_set()\n- peer_description_set()\nAdds parameter names on:\n- bgp_timers_set()\n  (really confusing, this one, with 2 unexplained args of same type)\nAdds new setter:\n- peer_afc_set(), calling peer_activate/peer_deactivate.\n  (intended for API consumers, matches peer-\u003eafc)\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "4afa3ddd17464ecce91b6ed9df27b1231fb3e939",
      "tree": "b56af31b7ce732f085f3a99f2ce10f4c1d738695",
      "parents": [
        "d83b8d6d73021815a87e000c50863a105af80226"
      ],
      "author": {
        "name": "Philippe Guibert",
        "email": "philippe.guibert@6wind.com",
        "time": "Tue May 24 16:52:02 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:40 2016 +0100"
      },
      "message": "bgpd: Add new configuration cli for graceful restart.\n\nThere is support to configure graceful restart timer. This is the\ntime to wait to delete stale routes before a BGP open message is\nreceived.\n\nbgp graceful-restart restart-time \u003c1-3600\u003e\nno bgp graceful-restart [\u003c1-255\u003e]\n\n* bgpd/bgp_vty.c\n  * Define command strings for above CLI\n* bgpd/bgpd.c\n  * bgp_config_write(): Output graceful restart-time configuration\n\nSigned-off-by: Philippe Guibert \u003cphilippe.guibert@6wind.com\u003e\nTested-by: NetDEF CI System \u003ccisystem@netdef.org\u003e\n"
    },
    {
      "commit": "93b493a2b010df4f67c7173c0928c8f86d9e1aa2",
      "tree": "062ad8527bbbc79e30b52df7a741e13030b7358d",
      "parents": [
        "49c370b74df11832239408f68119bd0a0a19a6e8"
      ],
      "author": {
        "name": "Igor Ryzhov",
        "email": "iryzhov@nfware.com",
        "time": "Wed May 11 15:26:39 2016 +0300"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:40 2016 +0100"
      },
      "message": "bgpd: fix wrong help strings of \"match peer\" and \"no match peer\" commands\n\nSigned-off-by: Igor Ryzhov \u003ciryzhov@nfware.com\u003e\nTested-by: NetDEF CI System \u003ccisystem@netdef.org\u003e\n"
    },
    {
      "commit": "49c370b74df11832239408f68119bd0a0a19a6e8",
      "tree": "c4a613673e1b1a4ec9f66845e699ebe75357f313",
      "parents": [
        "06de82eaeb11a1c84798cc222af77cdb07af2e4e"
      ],
      "author": {
        "name": "Colin Petrie",
        "email": "cpetrie@ripe.net",
        "time": "Wed May 11 11:56:58 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:40 2016 +0100"
      },
      "message": "bgpd: fix MRT table dumps for locally-originated routes\n\nI\u0027ve been working on a small patch to correct an issue in the BGP MRT\ntable dump code. It\u0027s a quick\u0027n\u0027easy fix initially, and I\u0027d appreciate\nany feedback on making it better :)\n\nIssue:\n\nWhen the BGP table dump code runs, it generates the peer_index_table.\nThis walks the list of peers, and dumps out their IP, ASN, address\nfamily, etc. It also sets the peer index number in the peer struct.\n\nThen the code walks the RIB, and for each prefix, writes out RIB\nentries, that refer to the peer index number.\n\nHowever, when it finds prefixes that are locally originated, the\nassociated peer is the \u0027self\u0027 peer, which wasn\u0027t in the list of peers,\nnever gets an index number assigned, but because it is calloc\u0027d, the\nindex number is set to 0.\n\nEnd result: locally-originated routes are associated with whichever peer\nhappens to be first in the list of remote peers in the index table :)\n\nExample (from one of our route collectors) - these are two of our\noriginated prefixes (bgpdump output):\nTABLE_DUMP2|1457568002|B|12.0.1.63|7018|84.205.80.0/24||IGP|193.0.4.28|0|0||NAG|64512\n10.255.255.255|\nTABLE_DUMP2|1457568006|B|12.0.1.63|7018|2001:7fb:ff00::/48||IGP|::|0|0||NAG||\n\nThe prefixes are announced by us (note it has an empty AS PATH (the\nfield after the prefix)) but also looks like it was received from AS7018\n(12.0.1.63). In fact, the AS7018 peer just happens to be the first peer\nin the index table.\n\nFix:\n\nThe simplest fix (which is also the method adopted by both OpenBGPd and\nthe BIRD mrtdump branch) is to create an empty placeholder \u0027peer\u0027 at the\nstart of the peer index table, for all the routes which are locally\noriginated to refer to.\n\nI\u0027ve attached a patch for this.\nHere\u0027s a resulting bgpdump output after the patch:\nTABLE_DUMP2|1458828539|B|0.0.0.0|0|93.175.150.0/24||IGP|0.0.0.0|0|0||NAG||\nNow it is more obvious that the prefix is locally originated.\n\nThere are more complicated potential ways of fixing it\n1) skip the local routes when dumping the RIB. This leads to questions\nabout what an MRT table dump *should* contain :)\n2) include the \u0027self\u0027 peer in the list of peers used to generate the\nindex table.\netc etc.\n\nBut I\u0027m quite happy with my \u0027create a fake peer, and associate local\nroutes with it\u0027 method :)\n\nYour thoughts and feedback are welcome!\n\nRegards,\n\nColin Petrie\nSystems Engineer\nRIPE NCC RIS Project\nTested-by: NetDEF CI System \u003ccisystem@netdef.org\u003e\n"
    },
    {
      "commit": "220355df533f9c127c32de296513fae180c1568d",
      "tree": "bab73ee3a0a7dbef15f1631f05568677bc3a6f10",
      "parents": [
        "0ffd69a9bf58ab2e0105336f10753293230a4360"
      ],
      "author": {
        "name": "Andrej Ota",
        "email": "andrej@ota.si",
        "time": "Mon May 09 20:49:01 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:39 2016 +0100"
      },
      "message": "bgpd: fix BGP IPv6 route map error\n\nBGP refactoring in commit f3cfc46450cccc5ac035a5a97c5a1a5484205705\nintroduced an error which broke route map processing for IPv6 where\nAFI_IP was used instead of AFI_IP6.\n\nThis patch fixes the typo.\n\nSigned-off-by: Andrej Ota \u003candrej@ota.si\u003e\nTested-by: NetDEF CI System \u003ccisystem@netdef.org\u003e\n"
    },
    {
      "commit": "985c3556921fa669f86fe5e62130fbeb93d94ca9",
      "tree": "0db825e0fbb0b0e1452e0169c6b36cd04c23b6cd",
      "parents": [
        "54406ac4c6883725f8a337bdc4f15fb015926b0f"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Thu Mar 10 20:16:47 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:37 2016 +0100"
      },
      "message": "bgpd: Fix code path that leads to uninitialized variables\n\nsubtype and sublength are not initialized and if on Line 1877\nBGP_ATTR_ENCAP !\u003d type we will not set subtype and sublength,\nbut these variables are used immediately below that if statement.\n\nThis issue was discovered via the freebsd compiler.\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\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": "071cfcd2e315499f0a4fa8c23779468eacc20033",
      "tree": "51ff82f6cd34c3a9ec2e6418830676f9c03c9558",
      "parents": [
        "9514fee4b37a9043738aa16ca8684993a1b572ad"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Tue Feb 02 21:02:42 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jul 20 12:58:32 2016 +0100"
      },
      "message": "bgpd: Removed unused variable from \u0027struct attr_extra\u0027\n\nThe mp_nexthop_local_in variable is never used.  Remove it\nfrom the code base.\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\nTested-by: NetDEF CI System \u003ccisystem@netdef.org\u003e\n"
    },
    {
      "commit": "9514fee4b37a9043738aa16ca8684993a1b572ad",
      "tree": "715d5bfb6824dc213a3f0c98cf149bfb5e104ea7",
      "parents": [
        "3c964045459f66921f8a3dc33fe4c028e6b0b141"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Tue Jan 26 11:44:14 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jul 20 12:58:32 2016 +0100"
      },
      "message": "bgpd, ripngd, zebra: Remove duplicate PSIZE define\n\nThe PSIZE macro is defined the same in multiple places.  Remove\nthe duplicates.\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\nTested-by: NetDEF CI System \u003ccisystem@netdef.org\u003e\n"
    },
    {
      "commit": "3c964045459f66921f8a3dc33fe4c028e6b0b141",
      "tree": "e965c083d34feb5be294a51e2f0e18ff7d4fc527",
      "parents": [
        "687bea20fa61d8fc7cf48c0b227f16d0b324778c"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Mon Jan 25 23:38:53 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jul 20 12:58:31 2016 +0100"
      },
      "message": "bgpd: Fix \u0027show bgp ipv4 vpnv4 statistics\u0027 cli.\n\nWhen attempting to use the \u0027show bgp ipv4 vpnv4 statistics\u0027 cli, the safi\nchoosen is BGP_MPLS_LABELED_VPN which is #defined to 128.  The afi/safi\ncombination is fed to bgp-\u003erib, which limits the size of the safi to BGP_SAFI_MAX\nwhich is #defined to 5.   The correct value to use is BGP_MPLS_VPN\n\nThe bgp code differentiates between the actual safi value for BGP_MPLS_LABELED_VPN\nused defined by RFC 4364, to a internal SAFI value used to limit array size.\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\nTested-by: NetDEF CI System \u003ccisystem@netdef.org\u003e\n"
    },
    {
      "commit": "9145f0e4cf776bd3156620da6c8a772fee4d4383",
      "tree": "9b8d99185c5755a5324ab859da422448ab88b6de",
      "parents": [
        "9c52caeaf40e32701ff79a721f0fee52cfcbd77c"
      ],
      "author": {
        "name": "Balaji",
        "email": "balajig81@gmail.com",
        "time": "Wed Jan 20 22:59:27 2016 +0530"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jul 20 12:58:31 2016 +0100"
      },
      "message": "bgpd: Addition of bgp dampening configuration commands under IPv4/multicast\n\nSigned-off-by: Balaji Gurudoss \u003cbalajig81@gmail.com\u003e\nTested-by: NetDEF CI System \u003ccisystem@netdef.org\u003e\n"
    },
    {
      "commit": "9c52caeaf40e32701ff79a721f0fee52cfcbd77c",
      "tree": "60b3defc89ed5610e13eab46edb997d17e276be1",
      "parents": [
        "df2ef24fb73c83a6e733be9eb8cac3e0df8467f8"
      ],
      "author": {
        "name": "Balaji",
        "email": "balajig81@gmail.com",
        "time": "Wed Jan 20 22:59:26 2016 +0530"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jul 20 12:58:31 2016 +0100"
      },
      "message": "bgpd: Addition of dampening show commands under v4 unicast/multicast tree\n\nPatch contains addition of show ip bgp ipv4 (unicast| multicast)\ndampening tree.\n\nSigned-off-by: Balaji Gurudoss \u003cbalajig81@gmail.com\u003e\n"
    },
    {
      "commit": "a3936d04942795bb92f04fefd25957c327e31c20",
      "tree": "1d75c7ed70aa655c4cc0429264bfb1832afe8636",
      "parents": [
        "6184c39e27d4b6f3721b8c4dc3df1b968e09606a"
      ],
      "author": {
        "name": "Boian Bonev",
        "email": "bbonev@ipacct.com",
        "time": "Wed Jun 25 20:26:44 2014 +0300"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jul 20 12:58:30 2016 +0100"
      },
      "message": "bgpd: add aspath_aggregate_mpath that preserves path length\n\nIssue - when two aspaths are aggregated the result will be with\ndifferent length if the two paths do not share common prefix.\n\nE.g.: aggregation of 100 101 400 500 and 200 201 400 500 currently\nwill result in {100,101,200,201,400,500} which is of much shorter\nlength and is not ok to be readvertised becase may create shortest\npath on the internet and cause infinite flapping.\n\naspath_aggregate_mpath will construct the followin path for the\nabove example: {100,200} {101,201} 400 500\n\nSigned-off-by: Boian Bonev \u003cbbonev at ipacct.com\u003e\n\npatchwork #994: http://patchwork.quagga.net/patch/994/\n"
    },
    {
      "commit": "6184c39e27d4b6f3721b8c4dc3df1b968e09606a",
      "tree": "2307896d8cbec453b3d2c829c1b299d3d3f996e1",
      "parents": [
        "d8f7f86a64842fcc6200c2fa4f560b9aa7a279bb"
      ],
      "author": {
        "name": "Roman Hoog Antink",
        "email": "rha@open.ch",
        "time": "Mon Mar 17 14:01:42 2014 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jul 20 12:58:30 2016 +0100"
      },
      "message": "bgpd: implement admin distance\n\nUntil today the admin distance cannot be configured for any IPv6\nrouting protocol. This patch implements it for bgp.\n\nSigned-off-by: Maitane Zotes \u003cmaz@open.ch\u003e\n\npatchwork #993: http://patchwork.quagga.net/patch/993/\n"
    },
    {
      "commit": "f53585d59b62b12d68282154af346796b75c7f2f",
      "tree": "23c84a60e16058427c069f0a406ff8f44f73b19b",
      "parents": [
        "ac6ff4643645315db648604771926218aa4ead2d"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue May 17 07:10:36 2016 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jul 20 12:58:29 2016 +0100"
      },
      "message": "bgp: add \"debug bgp allow-martians\" next hops and related code/commands\n"
    },
    {
      "commit": "ac6ff4643645315db648604771926218aa4ead2d",
      "tree": "39a8c4f4910060019b2d6df9c944eb456f1d9579",
      "parents": [
        "5f678889843fb9bc3f07d05eebc2f8fb35584a91"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue May 17 07:10:37 2016 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jul 20 12:58:29 2016 +0100"
      },
      "message": "bgpd: Add flag to not change e{u,g}id on startup and run as unprivileged user\n\n* bgp_main.c: add -S / --skip_runas flag to not change effective user/group\n  on start up.  Enables bgpd to be run by unprivileged user.\n"
    },
    {
      "commit": "5e57b5fc621300427d3818f0723b8cd8d5e5ca6a",
      "tree": "738345e0c3121f329266e8b8faaa88661e7cdb2e",
      "parents": [
        "e3f623be8b6556db9d70c2fc5d3c2b152f36dc1d"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Fri Mar 11 16:28:34 2016 -0500"
      },
      "committer": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Fri Mar 11 18:29:14 2016 -0500"
      },
      "message": "quagga: Remove double read of stream\n\nThe addition of a MIN(X,Y) with a stream_getc in the Y\ncauses a double read of the stream due to the way that\nMIN is defined.\n\nThis fix removes a crash in all protocols.\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "c0cb90c608f7dcb0807e05c70050d2e238d6c4e9",
      "tree": "b66b70468004343789d532b1dc757e71177b0966",
      "parents": [
        "d849e23b1c6b7278aef2f460723ac17cdc63e1a7"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Mar 08 18:14:50 2016 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Mar 08 18:16:47 2016 +0000"
      },
      "message": "Revert \"bgpd: Lower BGP\u0027s default keepalive/holdtime to 3s/9s\"\n\nThis reverts commit f89b09be92bed03b1e5add55dc14ef92e94c52e1.\n\nMartin Winter has reported reliability issues in testing on some platforms.\nWe need a more comprehensive way to deal with defaults and updating them, e.g.\nprofiles of some kind.\n\nDefer this change till after next release.\n"
    },
    {
      "commit": "370b7e59170acf853ca3357c71dd5ab0d85e763c",
      "tree": "24cd286ecd47f6c6439e1c5971a1abbacb9e5c3a",
      "parents": [
        "bf83fa25f1bddec6f09ad879cba5e975a3ae5495"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Thu Feb 04 21:29:49 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Mar 08 17:53:22 2016 +0000"
      },
      "message": "bgpd: Fix crash reported by NetDEF CI\n\nThis patch is part of the previously submitted\n patch set on VPN and Encap SAFIs.  It fixes\n an issue identified by NetDEF CI.\n\n Ensure temp stack structures are initialized\n Add protection against double frees / post\n free access to bgp_attr_flush\n\n    Signed-off-by: Lou Berger \u003clberger@labn.net\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": "405e9e19eb6ce62fa4f3f39a1f73990db9e146b7",
      "tree": "e3e6c66af5ed0a6d7270a842986487ba5e8c8c26",
      "parents": [
        "518a4b7eadcba567f01061e6659d8179380efcdf"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Thu Feb 04 17:00:18 2016 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Mar 08 17:53:22 2016 +0000"
      },
      "message": "bgpd: Remove the double-pass parsing of NLRIs\n\n* bgpd parses NLRIs twice, a first pass \"sanity check\" and then a second pass\n  that changes actual state. For most AFI/SAFIs this is done by\n  bgp_nlri_sanity_check and bgp_nlri_parse, which are almost identical.\n\n  As the required action on a syntactic error in an NLRI is to NOTIFY and\n  shut down the session, it should be acceptable to just do a one pass\n  parse.  There is no need to atomically handle the NLRIs.\n\n* bgp_route.h: (bgp_nlri_sanity_check) Delete\n* bgp_route.c: (bgp_nlri_parse) Make the prefixlen size check more general\n  and don\u0027t hard-code AFI/SAFI details, e.g. use prefix_blen library function.\n\n  Add error logs consistent with bgp_nlri_sanity_check as much as possible.\n\n  Add a \"defense in depth\" type check of the prefixlen against the sizeof\n  the (struct prefix) storage - ala bgp_nlri_parse_vpn.\n  Update standards text from draft RFC4271 to the actual RFC4271 text.\n\n  Extend the semantic consistency test of IPv6. E.g. it should skip mcast\n  NLRIs for unicast safi as v4 does.\n\n* bgp_mplsvpn.{c,h}: Delete bgp_nlri_sanity_check_vpn and make\n  bgp_nlri_parse_vpn_body the bgp_nlri_parse_vpn function again.\n\n  (bgp_nlri_parse_vpn) Remove the notifies.  The sanity checks were\n  responsible for this, but bgp_update_receive handles sending NOTIFY\n  generically for bgp_nlri_parse.\n\n* bgp_attr.c: (bgp_mp_reach_parse,bgp_mp_unreach_parse) Delete sanity check.\n  NLRI parsing done after attr parsing by bgp_update_receive.\n\nArising out of discussions on the need for two-pass NLRI parse with:\n\nLou Berger \u003clberger@labn.net\u003e\nDonald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "518a4b7eadcba567f01061e6659d8179380efcdf",
      "tree": "0bc751d4e0024954e1bf3bf5a7e0ce84b219ba1f",
      "parents": [
        "18ab08b71e6b29e67b36df5e2261569d381b1708"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Thu Feb 04 13:27:04 2016 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Mar 08 17:53:21 2016 +0000"
      },
      "message": "bgpd: Regularise bgp_update_receive, add missing notifies and checks\n\n* bgp_packet.c: (bgp_update_receive) Lots of repeated code, doing same\n  thing for each AFI/SAFI.  Except when it doesn\u0027t, e.g.  the IPv4/VPN\n  case was missing the EoR bgp_clear_stale_route call - the only action\n  really needed for EoR.\n\n  Make this function a lot more regular, using common, AFI/SAFI\n  independent blocks so far as possible.\n\n  Replace the 4 separate bgp_nlris with an array, indexed by an enum.\n\n  The distinct blocks that handle calling bgp_nlri_parse for each\n  different AFI/SAFI can now be replaced with a loop.\n\n  Transmogrify the nlri SAFI from the SAFI_MPLS_LABELED_VPN code-point\n  used on the wire, to the SAFI_MPLS_VPN safi_t enum we use internally\n  as early as possible.\n\n  The existing code was not necessarily sending a NOTIFY for NLRI\n  parsing errors, if they arose via bgp_nlri_sanity_check.  Send the\n  correct NOTIFY - INVAL_NETWORK for the classic NLRIs and OPT_ATTR_ERR\n  for the MP ones.\n\n  EoR can now be handled in one block.  The existing code seemed broken\n  for EoR recognition in a number of ways:\n\n  1.  A v4/unicast EoR should be an empty UPDATE.  However, it seemed\n     to be treating an UPDATE with attributes, inc.  MP REACH/UNREACH,\n     but no classic NLRIs, as a v4/uni EoR.\n\n  2.  For other AFI/SAFIs, it was treating UPDATEs with no classic\n     withraw and with a zero-length MP withdraw as EoRs.  However, that\n     would mean an UPDATE packet _with_ update NLRIs and a 0-len MP\n     withdraw could be classed as an EoR.\n\n  This seems to be loose coding leading to ambiguous protocol\n  situations and likely incorrect behaviour, rather than simply being\n  liberal.  Be more strict about checking that an UPDATE really is an\n  EoR and definitely is not trying to update any NLRIs.\n\n  This same loose EoR parsing was noted by Chris Hall previously on\n  list.\n\n  (bgp_nlri_parse) Front end NLRI parse function, to fan-out to the correct\n  parser for the AFI/SAFI.\n\n* bgp_route.c: (bgp_nlri_sanity_check) We try convert NLRI safi to\n  internal code-point ASAP, adjust switch for that.  Leave the wire\n  code point in for defensive coding.\n\n  (bgp_nlri_parse) rename to bgp_nlri_parse_ip.\n\n* tests/bgp_mp_attr_test.c: Can just use bgp_nlri_parse frontend.\n"
    },
    {
      "commit": "18ab08b71e6b29e67b36df5e2261569d381b1708",
      "tree": "1160aff3b43a6e0bdf5e8b553425ad5bea12640f",
      "parents": [
        "c49a2747f6a6199dba27c0c413f4de6112fa649e"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Wed Jan 27 16:37:33 2016 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Mar 08 17:53:10 2016 +0000"
      },
      "message": "bgpd: Regularise BGP NLRI sanity checks a bit\n\n* bgp_route.h: (bgp_nlri_sanity_check) The bulk of the args are equivalent\n  to a (struct bgp_nlri), consolidate.\n* bgp_route.c: (bgp_nlri_sanity_check) Make this a frontend for all afi/safis.\n  Including SAFI_MPLS_LABELED_VPN.\n  (bgp_nlri_sanity_check_ip) Regular IP NLRI sanity check based on the\n  existing code, and adjusted for (struct bgp_nlri *) arg.\n* bgp_attr.c: (bgp_mp_reach_parse) Adjust for passing (struct bgp_nlri *)\n  to bgp_nlri_sanity_check.\n  Get rid of special-casing to not sanity check VPN.\n  (bgp_mp_unreach_parse) Ditto.\n\n* bgp_mplsvpn.c: Use the same VPN parsing code for both the sanity\n  check and the actual parse.\n\n  (bgp_nlri_parse_vpn) renamed to bgp_nlri_parse_vpn_body and made\n  internal.\n\n  (bgp_nlri_parse_vpn_body) Added (bool) argument to control whether it\n  is sanity checking or whether it should update routing state for each\n  NLRI.  Send a NOTIFY and reset the session, if there\u0027s a parsing\n  error, as bgp_nlri_sanity_check_ip does, and as is required by the\n  RFC.\n\n  (bgp_nlri_parse_vpn) now a wrapper to call _body with update.\n\n  (bgp_nlri_sanity_check_vpn) wrapper to call parser without\n  updating.\n\n* bgp_mplsvpn.h: (bgp_nlri_sanity_check_vpn) export for\n  bgp_nlri_sanity_check.\n\n* bgp_packet.c: (bgp_update_receive) Adjust for bgp_nlri_sanity_check\n  argument changes.\n\n* test/bgp_mp_attr_test.c: Extend to also test the NLRI parsing functions,\n  if the initial MP-attr parsing has succeeded.  Fix the NLRI in the\n  VPN cases.  Add further VPN tests.\n\n* tests/bgpd.tests/testbgpmpattr.exp: Add the new test cases.\n\nThis commit a joint effort of:\n\nLou Berger \u003clberger@labn.net\u003e\nDonald Sharp \u003csharpd@cumulusnetworks.com\u003e\nPaul Jakma \u003cpaul.jakma@hpe.com\u003e / \u003cpaul@jakma.org\u003e\n"
    },
    {
      "commit": "c49a2747f6a6199dba27c0c413f4de6112fa649e",
      "tree": "27bc97363bf8e3f25535f39c030e6da7b37e4a0e",
      "parents": [
        "e98dce60cea213a4155a0db60b463e40c67aa77f"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 05 14:57:17 2016 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:48 2016 +0000"
      },
      "message": "bgpd: make bgp_nlri_parse_encap conform with other nlri_parse funcs\n\n* bgp_encap.{c,h} (bgp_nlri_parse_encap) afi is already in the NLRI argument.\n  update or withdraw is signalled by attr being non-NULL or NULL.\n\n* bgp_packet.c: (update_receive) fixup to match, and also make the attr\n  argument conform with NLRI_ATTR_ARG for correct error handling on\n  optional, transitive, partial, attributes.\n"
    },
    {
      "commit": "e98dce60cea213a4155a0db60b463e40c67aa77f",
      "tree": "bd9704ae2d834fef5882eb094d6df90fb4097dba",
      "parents": [
        "ecc1a136e10e0717761b6f436d299938a05a1309"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Wed Jan 20 07:53:51 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:47 2016 +0000"
      },
      "message": "bgpd: Fix Null pointer dereference in bgp_info_mpath_update\n\nbgp_info_mpath_update is called with new_best \u003d\u003d NULL, this\ncauses the dereference of new_best in order to get at the mpath_cfg.\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "ecc1a136e10e0717761b6f436d299938a05a1309",
      "tree": "b2158970126f59d00e76dba8029441ac7738608f",
      "parents": [
        "b2a2fd788f34a4f5d1bbd92a283e47704f05ae8f"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Wed Dec 09 08:24:47 2015 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:47 2016 +0000"
      },
      "message": "bgpd: Modify maxpaths cli\u0027s to use MULTIPATH_NUM for range\n\nModify the various maxpath commands to use MULTIPATH_NUM\nas the upper limit of allowed max paths in BGP.  There\nis no point in allowing a number of maximum paths greater\nthan what Quagga is compiled for.\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\nTested-by: NetDEF CI System \u003ccisystem@netdef.org\u003e\n"
    },
    {
      "commit": "91ce87aacfd8718b5a52fb0f4453e9f72d8bdb53",
      "tree": "8abce3edf10e5874aa342090810adcfbf2380053",
      "parents": [
        "d18396369ff85517cd4b0b7abe96f6f706710dc7"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Wed Dec 09 08:24:45 2015 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:47 2016 +0000"
      },
      "message": "zebra, bgpd: Fixup MULTIPATH_NUM usage to not consider 0\n\nThe code has spots where MULTIPATH_NUM set to 0 is equal to 64.\nNow that MULTIPATH_NUM is set from the makefile to never be 0,\nremove the code that depends on this.\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "d18396369ff85517cd4b0b7abe96f6f706710dc7",
      "tree": "748597138dba3b393808782c8767fdf886b603f4",
      "parents": [
        "693da6096a28eef5eadeea699771265987b3ec0c"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Wed Dec 09 08:24:44 2015 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:47 2016 +0000"
      },
      "message": "build: Rework how MULTIPATH_NUM is delivered to build\n\nChanges made here:\n\n1) MULTIPATH_NUM will never be 0.  If user specifies --enable-multipath\u003d0\nthen this translates to MULTIPATH_NUM being set to 64 inside of the build\nsystem.\n\n2) Move MULTIPATH_NUM from a Makefile construct to a config.h construct.\n\n3) Allowed MULTIPATH_NUM to be a number \u003e 99 but \u003c 1000\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": "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": "205e6744f2dc2909dd494c9ce8acb82821459f1f",
      "tree": "a996419a840766d2ffa1025805e1be84a2dacdf4",
      "parents": [
        "544ec70f66d0ec081dadde79bec1f25c2241f57f"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue Jan 12 13:42:11 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:45 2016 +0000"
      },
      "message": "bgpd: remove HAVE_IPV6 conditionals\n\nSigned-off-by: Lou Berger \u003clberger@labn.net\u003e\nTested-by: NetDEF CI System \u003ccisystem@netdef.org\u003e\n"
    },
    {
      "commit": "f9b6c3938642090ffa1cae8b7125abff2b1e9fb0",
      "tree": "f6e9632134c3d8bb81b681b28e635eefd167dd46",
      "parents": [
        "bf1ae6c683a53d7f43c273afb55d52ccc233296b"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue Jan 12 13:42:09 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:45 2016 +0000"
      },
      "message": "bgpd: Add back old forms of \u0027show \u003cafi\u003e \u003csafi\u003e\u0027 for compatibility\n\nSigned-off-by: Lou Berger \u003clberger@labn.net\u003e\n"
    },
    {
      "commit": "bf1ae6c683a53d7f43c273afb55d52ccc233296b",
      "tree": "3224355a90930170b47cccfafbeabe6bb9f27d09",
      "parents": [
        "651b402d32b52ecf7ea1d979bf83b88ff799e134"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue Jan 12 13:42:08 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:45 2016 +0000"
      },
      "message": "bgpd: drop machineparse / random \"show\" improvements\n\nSigned-off-by: Lou Berger \u003clberger@labn.net\u003e\n"
    },
    {
      "commit": "651b402d32b52ecf7ea1d979bf83b88ff799e134",
      "tree": "57af25243a7523908a2f76c1832267dd2708e364",
      "parents": [
        "35c36863f42e3c3e61a0cae400ffa80905c96d45"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue Jan 12 13:42:07 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:44 2016 +0000"
      },
      "message": "bgpd: encap show commands\n\nSigned-off-by: Lou Berger \u003clberger@labn.net\u003e\n"
    },
    {
      "commit": "35c36863f42e3c3e61a0cae400ffa80905c96d45",
      "tree": "0bfe81796a7fa5887b797c89f6c558e5ee70f278",
      "parents": [
        "135ca1502cc54d9ad00b60b3410a0932bfeceb29"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue Jan 12 13:42:06 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:44 2016 +0000"
      },
      "message": "bgpd: VPNv6 show commands\n\nSigned-off-by: Lou Berger \u003clberger@labn.net\u003e\n"
    },
    {
      "commit": "135ca1502cc54d9ad00b60b3410a0932bfeceb29",
      "tree": "5bffa5f6cc373e3c5d4522768a52973b6bb8973c",
      "parents": [
        "a3fda886cdd48b6d8c421ebb1401142fa9ee93b0"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue Jan 12 13:42:05 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:44 2016 +0000"
      },
      "message": "bgpd: cleanup vty bgp_node_afi/safi utils\n\nSigned-off-by: Lou Berger \u003clberger@labn.net\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": "637035710a2f8e1e5944ee714135b7f88ac15ac4",
      "tree": "857f655fcd45e10f2947457f66e3a0d293c89955",
      "parents": [
        "298cc2f688dbadf0a447fcd06ae8e20fa5006ce4"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue Jan 12 13:42:03 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:44 2016 +0000"
      },
      "message": "bgp: Reorg cleanup to align process and bgp instance init/destroy\n\nSigned-off-by: Lou Berger \u003clberger@labn.net\u003e\n"
    },
    {
      "commit": "298cc2f688dbadf0a447fcd06ae8e20fa5006ce4",
      "tree": "50a27a17c45edc4e6a0b200617db0f066bb42fc2",
      "parents": [
        "c3741789530ee824693fd606356acac2ad695f83"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue Jan 12 13:42:02 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:44 2016 +0000"
      },
      "message": "bgpd: encap: add encap SAFI (RFC5512)\n\nAdds RFC5512 and Encapsulation Attribute.\n\nSigned-off-by: Lou Berger \u003clberger@labn.net\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": "5a81fc9ae610ff343902ebabc12237d6e40d91cb",
      "tree": "734cdcaca446bf42934bb2fce98c1799c88c1bfb",
      "parents": [
        "050defe816e4bd4cac7b028f69e45cb1974ca96d"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue Jan 12 13:42:00 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:43 2016 +0000"
      },
      "message": "bgpd: encap: extend extcommunity handling\n\nAdd code to print ENCAP communities.\n\nSigned-off-by: Lou Berger \u003clberger@labn.net\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "050defe816e4bd4cac7b028f69e45cb1974ca96d",
      "tree": "212e07eb351c8ebd2282e4798d493cf2e64492c9",
      "parents": [
        "d5d5e3e04fc41b9a89b7ce9049fd322bdbde2e4d"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue Jan 12 13:41:59 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:43 2016 +0000"
      },
      "message": "bgpd: general MP/SAFI improvements\n\nThis fixes some minor mixups particularly in MPLS-related SAFIs, as well\nas doing some stylistic changes \u0026 adding comments.\n\nSigned-off-by: Lou Berger \u003clberger@labn.net\u003e\nReviewed-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "d5d5e3e04fc41b9a89b7ce9049fd322bdbde2e4d",
      "tree": "7199aaf51bd89a8532b46cff042316ed00a2d6ad",
      "parents": [
        "82dd707988b7481e203cab058c92f0b3041dd558"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue Jan 12 13:41:58 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:43 2016 +0000"
      },
      "message": "bgpd: tests - add null pointer protection to fix bgp test failures\n\nSigned-off-by: Lou Berger \u003clberger@labn.net\u003e\n"
    },
    {
      "commit": "82dd707988b7481e203cab058c92f0b3041dd558",
      "tree": "01923f2a1a5b0ca381e9eb7b093f467ca4cc942b",
      "parents": [
        "13c378d96a57017f5995b2e0df46cfc31123f0e8"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue Jan 12 13:41:57 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:43 2016 +0000"
      },
      "message": "bgpd: improve cleanup in bgp_delete()\n\nSigned-off-by: Lou Berger \u003clberger@labn.net\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": "9da04bca0e994ec92b9242159bf27d89c6743354",
      "tree": "3c38048088082749e2ba7f03f15bdbff19234f0c",
      "parents": [
        "a03bd16eedc5077e98716509b8918ed365227e02"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue Jan 12 13:41:55 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:42 2016 +0000"
      },
      "message": "bgpd: wire up VPNv6 protocol processing\n\nThere wasn\u0027t much missing for VPNv6 to begin with; just a few bits of\nde- \u0026 encoding and a few lists to be updated.\n\nSigned-off-by: Lou Berger \u003clberger@labn.net\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n\n[Editorial note: Signed-off-by may imply an authorship claim, but need not]\n\nEdited-by: Paul Jakma \u003cpaul.jakma@hpe.com\u003e / \u003cpaul@jakma.org\u003e\n"
    },
    {
      "commit": "a03bd16eedc5077e98716509b8918ed365227e02",
      "tree": "ce2cdce1e28a98318bd4605e7f70c43267cc5eb7",
      "parents": [
        "a76d9ca3584c1751a592457c167c1e146648ceb6"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue Jan 12 13:41:54 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:42 2016 +0000"
      },
      "message": "bgpd: handle AS4 and EOI route distinguishers\n\nSigned-off-by: Lou Berger \u003clberger@labn.net\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "a76d9ca3584c1751a592457c167c1e146648ceb6",
      "tree": "6415cbd12e4f1cfeadc552b05f6ac06da10d51f6",
      "parents": [
        "4d80560a2b064182191371fd7e4304bf829a4d9f"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue Jan 12 13:41:53 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:42 2016 +0000"
      },
      "message": "bgpd: make _vpnv4 static handling SAFI-agnostic\n\nThis changes the existing _vpnv4 functions for MPLS-VPN into\nSAFI-agnostic functions, renaming them from *_vpnv4 to *_safi.\n\nAlso adds route-map support while at it.\n\nSigned-off-by: Lou Berger \u003clberger@labn.net\u003e\nReviewed-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "4d80560a2b064182191371fd7e4304bf829a4d9f",
      "tree": "d99a5c6f87bc92e0201afa263b4bd853e07a26b1",
      "parents": [
        "3e841d3b49bdb475ce793eee5d82e5137dff57d3"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue Jan 12 13:41:52 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:42 2016 +0000"
      },
      "message": "bgpd: kill unused variable in bgp_socket()\n\nSigned-off-by: Lou Berger \u003clberger@labn.net\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "3e841d3b49bdb475ce793eee5d82e5137dff57d3",
      "tree": "6d3d9a0dde3bcd83631b2abd7764e13d7485b9ae",
      "parents": [
        "2daf7f3a8d69213f35b16a04dbe300957481a811"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue Jan 12 13:41:51 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:42 2016 +0000"
      },
      "message": "bgpd: add nexthop length to AF macro\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": "7748fdc757a2181649dd4956f2767545673ef28d",
      "tree": "b101c98aefe861b23515b9314b611ace7b87531f",
      "parents": [
        "f3cfc46450cccc5ac035a5a97c5a1a5484205705"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Wed Feb 10 14:24:00 2016 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:40 2016 +0000"
      },
      "message": "bgpd: Fix graceful restart capability minsize\n\n* bgp_open.c: cap_minsize should be CAPABILITY_CODE_RESTART_LEN for RESTART\n  not 6.\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": "6d4742bef722e6fab45fb6eb22ed2c7b7570a2e6",
      "tree": "5f448656a3f81e684df289e42cc3bd051850e17f",
      "parents": [
        "91b9e8547a7c5697d5d7481f9476778077024019"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Wed Nov 25 17:14:37 2015 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Thu Feb 18 15:54:45 2016 +0000"
      },
      "message": "bgpd: make bgp_info_cmp and multiple-path decision logic more regular\n\n* bgp_route.c: (bgp_info_cmp) This function is supposed to return a\n  preference between the given paths, and does so as binary either or.  When\n  mpath was added, the binary return value was left as is and instead an out\n  parameter \u0027paths_eq\u0027 was added to indicate the mpath-equality case.  It\u0027s\n  a bit odd, as is the resulting logic in the caller.\n\n  Regularise things again by making the function return a strcmp like\n  trinary return value of -1,0,1.  Get rid of the mpath specific arguments,\n  but pass in afi/safi as part of the general context - that plus the\n  (struct bgp *) is enough to access configuration.\n\n  Update the return values.\n\n  The mpath check was testing the IGP metric for equality, even though\n  previous to the mpath changes (and consistent with the behaviour of all\n  the other tests bar the end), equality results in continuing through to\n  the next comparison. Just go back to the previous way - each test finds a\n  preference to return, or continues on to let further tests have a go.\n\n  (bgp_best_selection) Get rid of the (struct bgp_maxpaths_cfg *) arg, we\n  can\u0027t add state for every optional feature to the argument list - they\n  have to look it up as needed. Do pass through the very general afi/safi\n  context though (saves several lookups through the route_node).\n\n  Adjust for the new trinary bgp_info_cmp return value and updated args.\n  Do the mpath clearing/accumulation in one place, in each loop.\n\n  Call to bgp_info_mpath_update similarly gets updated, as there\u0027s no cfg to\n  pass.\n\n  (bgp_process_{rsclient,main}) match bgp_best_selection changes.\n* bgp_mpath.c: (bgp_mpath_is_configured_sort) Helper for whether mpath is\n  enabled by peer sort.\n  (bgp_mpath_is_configured) ditto, generally.\n  (bgp_info_mpath_update) caller no longer has the cfg to pass in, look it\n  up.\n* bgp_mpath.h: Export the above and Match .c changes.\n\nRequires commit:\n \"bgpd: bgp_scan shouldn\u0027t queue up route_nodes with no routes for processing\"\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "91b9e8547a7c5697d5d7481f9476778077024019",
      "tree": "e1cf2b9d29c4dcfd0b3d429551e50f0d6f7848cf",
      "parents": [
        "321d4130a615445d0f49f41c909c92d5401fd5ff"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Dec 01 14:32:11 2015 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Thu Feb 18 11:46:24 2016 +0000"
      },
      "message": "bgpd: bgp_scan shouldn\u0027t queue up route_nodes with no routes for processing\n\n* bgp_nexthop.c: (bgp_scan) There is little point queueing an rn with no routing\n  information for processing.\n* bgp_route.c: (bgp_process) Do nothing on rn\u0027s with no routes. Add an assert\n  for now, to try catch any other cases, but prob should be removed.\n  (bgp_best_selection) rn with no routes \u003d\u003d finish early.\n"
    }
  ],
  "next": "4078f2eb7a3a94ddb30cfd8b76b054e790aab524"
}
