)]}'
{
  "log": [
    {
      "commit": "d023f9ffae4b040335d12c1aa7409a9a15b7a3ac",
      "tree": "81b4d13e6a5bec9e4716aebc393225c468c54d57",
      "parents": [
        "5a0c1be698a044bc838f3e6c8b259fa52cf9981c"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Sep 16 15:13:43 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Jan 27 14:53:32 2017 +0000"
      },
      "message": "bgpd: Rollback \"always send OPEN\" a little, to workaround test suite issues\n\n* \"bgpd: Send OPEN immediately on inbound connections\" doesn\u0027t play well with\n  some partial BGP implementations, test and conformance suites e.g., which\n  have rigid expectations about ordering and don\u0027t implement much of CD.\n\n  roll back, but only a little, by deferring OPEN sending on outbound till\n  receive.\n\n* bgpd.h: (struct peer) add PEER_STATUS_OPEN_DEFERRED status flag.\n  Kind of a sub-fsm.  Main FSM does not allow transition functions to\n  signal next-state - next-state is inflexibly fixed in the table -\n  so can\u0027t handle it cleanly at that level.\n* bgp_fsm.c: (bgp_connect_success) Defer sending open if the peer is\n  an accept-peer/inbound and there appears to be an outbound connection\n  in progress. Set PEER_STATUS_OPEN_DEFERRED to signal to bgp_open_receive\n  that an OPEN still must be sent.\n* bgp_packet.c: (bgp_open_receive) Send the OPEN here, when deferred.\n"
    },
    {
      "commit": "5a0c1be698a044bc838f3e6c8b259fa52cf9981c",
      "tree": "5390c9c2b32eccfb66bf4c2e54109efe58ab48a2",
      "parents": [
        "c79862373cd310dba8c0a51ff94ddce48be0099e"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Thu Sep 15 17:13:16 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Jan 27 14:53:32 2017 +0000"
      },
      "message": "bgpd: Config state related to OPEN must now be copied to accept peer.\n\n* bgp_network.c: (bgp_accept) OPEN is now sent on accept peer, due to\n  \"Send OPEN immediately on inbound connections\", so configuration state\n  that affects OPEN also has to be copied for.\n\n  Fixes failure with Martin Winter / NetDEFs test cases, where bgpd was\n  failing to advertise configured AFI/SAFIs.\n"
    },
    {
      "commit": "c79862373cd310dba8c0a51ff94ddce48be0099e",
      "tree": "92ac28cb287f39b2ed364edbc740e3f9fa6c8689",
      "parents": [
        "1ebafb61a4a2059fdd50aeefd27780d6358dd488"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Wed Sep 21 17:42:37 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Jan 27 14:53:31 2017 +0000"
      },
      "message": "bgpd: Better/more debug for collisions, inc. logging port of NOTIFYs.\n"
    },
    {
      "commit": "1ebafb61a4a2059fdd50aeefd27780d6358dd488",
      "tree": "5172fa876077c854d080ba4b2d639b1933ce932a",
      "parents": [
        "ac278ea6b770fd0bf74b3e718c2e6a4d84fcba3a"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Wed Apr 27 09:55:21 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Jan 27 14:53:31 2017 +0000"
      },
      "message": "bgpd: collision detection assumes \u0027new\u0027 peer is the inbound connection\n\n* bgp_packet.c: (bgp_collision_detect) for a long time, this has assumed\n  the \u0027new\u0027 peer argument on which an OPEN has just been received must be\n  an \u0027inbound\u0027 connection, and the looked up \u0027peer\u0027 the outbound. However,\n  this doesn\u0027t seem a robust assumption. It seems possible it could be the\n  other way around.\n\n  The consequences are that collision detection could behave inconsistently\n  with other implementations, and result in both sides closing the same\n  connection.\n\n  Fix to follow the RFC.\n"
    },
    {
      "commit": "ac278ea6b770fd0bf74b3e718c2e6a4d84fcba3a",
      "tree": "9b06caebfce2f3041a2d4ed9f08f0864c4152698",
      "parents": [
        "f408fa2c81a8e5873cb0a8c37fe44e389f65d50e"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Apr 26 11:46:34 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Jan 27 14:53:31 2017 +0000"
      },
      "message": "bgpd: collision-detect should retain Established peers + tidy logic + logs\n\n* bgp_network.c: (bgp_accept) We should also reject connections where\n  the main peer is in \u003eEstablished state.\n  Could potentially also reject connections for main peer \u003d\u003d Established\n  here too.\n\n  Log the port number too, so it\u0027s easier to reconcile logs with\n  network dumps.\n\n* bgp_packet.c: (bgp_collision_detect) Try factor out some of the\n  conditionals controlling the action of the loop to the top, for\n  readability.\n\n  Handle existing Established session, by closing the new one, favouring\n  stability and as per RFC, except for GR.\n\n  (bgp_open_receive) Tidy up the logic a bit for readability, making each\n  case distinct in the main body of the loop.\n"
    },
    {
      "commit": "2d81a7a8e425dcc4ca0cda411e73915f7ec3c1c9",
      "tree": "76d8a1e2cfdfa2832a90212514daa7a62aa22c66",
      "parents": [
        "a04d836427dcea903edf3d6aea3c0978b8ba1300"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Wed Apr 20 14:05:20 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Jan 27 14:53:31 2017 +0000"
      },
      "message": "bgpd: Send OPEN immediately on inbound connections\n\n* bgpd_fsm.c: (bgp_connect_success) This is the transition function\n  called when TCP_connection_open occurs in Connect or Active.  It\n  sends OPEN, but only for a !ACCEPT_PEER.  I.e.  only on the local\n  bgpd\u0027s outbound connection.\n\n  This means OPEN will never be sent on a received connection, until\n  OPEN is received on it.  Which means if the remote peer delays\n  sending its OPEN on such an inbound connection, the local peer might\n  hit a timer (e.g.  connectretry) before then and reset.\n\n  There should be no harm in sending OPEN ASAP on any new connection\n  with any conforming implementation, indeed this is supposed to be the\n  behaviour.  It should speed up things, decrease the window in which\n  collision detection could be hit, and make things more robust.  So do\n  so.\n\n* bgp_packet.c: (bgp_open_receive) Update the comment.\n  Do not send bgp_open_send on the ACCEPT_PEER connection that has just\n  been transferred over, that\u0027s now done in bgp_connect_success, as it\n  should be.\n\n  The accept peer\u0027s output fifo must also be transferred over, to\n  ensure the Open gets sent, if not already, and the write thread state\n  replicated accordingly.\n\n* bgp_network.c: (bgp_accept) local AS config needs to set, so we can\n  send Open early on ACCEPT_PEER connections.\n\nNote: The Cumulus \"Fix FSM to handle active/passive connections better\"\npatch also makes this change, amongst other things.\n"
    },
    {
      "commit": "7fa7acb4926f2a0d1fb5eb0834ae6c60b8ba5147",
      "tree": "e0f86d036d9a5bbd9c3d7d8ee28b71260c64cbcc",
      "parents": [
        "3334bab0d96b2d7064111e025ff6294d6a32d026"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@jakma.org",
        "time": "Fri Jan 20 18:16:04 2017 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Jan 27 14:53:30 2017 +0000"
      },
      "message": "bgpd: Fix unhandled enum warning for AFI_ETHER\n\n* bgp_open.c: (bgp_afi_safi_valid_indices) We have AFI_ETHER defined, but\n  don\u0027t handle it at this point.\n"
    },
    {
      "commit": "3334bab0d96b2d7064111e025ff6294d6a32d026",
      "tree": "665e079e1643db0ae957acadfa5e5497f0f645ac",
      "parents": [
        "f2a4b8fffb1f771371d6bfc425e7a69a14057b06"
      ],
      "author": {
        "name": "Job Snijders",
        "email": "job@instituut.net",
        "time": "Fri Jan 20 14:47:12 2017 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Jan 27 14:53:20 2017 +0000"
      },
      "message": "bgpd: Add support for BGP Large Communities\n\nAs described by Michael Lambert \u003clambert@psc.edu\u003e  to the list:\n\n  Traditional communities are four-octet entities to support two-octet ASNs\n  and are usually represented as \u003casn\u003e:\u003cdata\u003e.  Large communities are an\n  enhancement to support four-octet ASNs and are 12 octets long, represented\n  as \u003casn\u003e:\u003cdata-1\u003e:\u003cdata-2\u003e.\n\n  This issue has been tracked in quagga bugzilla ticket #875, which documents\n  some of the usage and indicates that some testing has been done.\n\nTODO: Documentation - update doc/bgpd.texi.\n\n* bgp_attr.{c,h}: Add BGP_ATTR_LARGE_COMMUNITIES codepoint. Add\n  (struct lcommunity *) to (struct bgp_attr_extra).\n* bgp_clist.{c,h}: Large community codepoints and routines.\n* bgp_route.c: Display support.\n* bgp_routemap.c: \u0027match lcommunity\u0027, \u0027set large-community\u0027 and\n  \u0027set large-comm-list\u0027\n* bgp_vty.c: Peer configuration, add \u0027large\u0027 to \u0027neighbor send-community ..\u0027.\n  Add \"show ip bgp large-community\", \"\"ip large-community-list ...\".\n\nAuthors: Keyur Patel \u003ckeyur@arrcus.com\u003e\n         Job Snijders \u003cjob@instituut.net\u003e\n"
    },
    {
      "commit": "86d87e018bd8f9249986be4e6b713ab918fa5e0b",
      "tree": "09cee0a38a890f7b13f6b5d2c4223dc773855c92",
      "parents": [
        "b8f8ba1bb24295a47758cb0e0b3072e017e52280"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Wed Apr 20 14:04:22 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 23 18:51:59 2017 +0000"
      },
      "message": "bgpd: Graphviz dot files for the BGP FSM\n\n* bgp_fsm_{quagga,4271}.dot: Graphviz DOT files to document the BGP FSM\n  somewhat, for both Quagga and the basics of 4271.  May contain\n  errors, and could do with more work, but hopefully a useful start.\n"
    },
    {
      "commit": "b8f8ba1bb24295a47758cb0e0b3072e017e52280",
      "tree": "8eb9389293d05edd11560440ab76e90a7be33476",
      "parents": [
        "b1b1579bf16e6c3a21216d7f68b1b175ab1303bd"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Wed Sep 28 16:54:48 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 23 18:51:59 2017 +0000"
      },
      "message": "bgpd: Make the exponential backoff on BGP stop_with_error slower\n\n* bgp_fsm.c: (bgp_stop_with_error) peer-\u003ev_start * 2^x exponential back\n  off, up to max of 120s, ramps up fast. Use a slower back off, implemented\n  via a helper.\n  (back_off_exp2) The original 2^x back off.\n  (back_off_exp2_bias) Exp back-off, but biased down by the initial value to\n  slow the rampup initially.\n"
    },
    {
      "commit": "b1b1579bf16e6c3a21216d7f68b1b175ab1303bd",
      "tree": "74c239199590b805879524aadc5f3d54bb56a292",
      "parents": [
        "5a9f13a4a0df45c72dc425cc930e5e5682ba59ae"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Wed Sep 21 18:50:23 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 23 18:51:59 2017 +0000"
      },
      "message": "bgpd: consolidate start timer backoff via a \u0027BGP_Stop_with_error\u0027 FSM event\n\n* Exponential increase/back-off on the peer start timer is replicated in\n  a few places. Consolidate by adding a \"BGP_Stop_with_error\" event\n  so places outside FSM can just raise that event.\n* bgpd.h: Add BGP_Stop_with_error\n* bgp_fsm.c: (bgp_event_str[]) Add text for BGP_Stop_with_error.\n  FSM table: Handle BGP_Stop_with_error, identical to bgp_stop\n  in nearly all cases.\n* bgp_packet.c: (bgp_write,bgp_write_notify) can just raise new event now.\n"
    },
    {
      "commit": "5a9f13a4a0df45c72dc425cc930e5e5682ba59ae",
      "tree": "611a01c6c70e1320edd289b0fcab722f15e5b738",
      "parents": [
        "3dda6b3eccb9a2a88d607372c83c04c796e7daac"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Oct 04 13:00:00 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 23 18:51:59 2017 +0000"
      },
      "message": "bgpd: Remove change that makes NHT tickle BGP FSM.\n\n* bgpd NHT patch makes NHT tickle FSM to restart session attempts that\n  are still very early, pre sending of messages.  Not really necessary,\n  and conceptually it may be nicer to just keep these two pieces\n  separate from each other.\n* bgpd.h: Remove NHT_Update FSM event\n* bgp_fsm.c: Remove NHT_Update event action from the FSM.\n* bgp_nht.c: Remove NHT_Update event.\n"
    },
    {
      "commit": "3dda6b3eccb9a2a88d607372c83c04c796e7daac",
      "tree": "24fb970719d0565acd47e9f826c818eb53626aa1",
      "parents": [
        "05c9075b09bea9e2328980df7138da5fd8157dc3"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 06 16:57:40 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 23 18:51:59 2017 +0000"
      },
      "message": "bgpd: Rejiggle exported nht function names and consolidate some code\n\n* bgp_nht.h: Tweak the API a bit to simplify and make names a bit clearer on\n  function. Remove AFI argument, it\u0027s implied in both bgp_infos and peers.\n\n  (bgp_find_nexthop) this doesn\u0027t so much find a bnc, as check the bnc\n  for the given bgp_info is valid. Rename to (bgp_nexthop_check).\n\n  (bgp_find_or_add_nexthop) This ensures a bnc exists, so call it\n  (bgp_ensure_nexthop).\n\n  (bgp_unlink_nexthop_by_peer) Remove via peer.\n\n* bgp_nht.c: Adjust to above.\n  (bgp_get_nexthop_rn) helper to get the rn.\n  (bgp_find_nexthop) further helper to get the bnc for path or peer.\n  (bgp_unlink_nexthop_check) helper to check whether a bnc should go.\n  (bgp_ensure_nexthop) Use the helpers.\n\n* bgp_{route,fsm}.c: s/bgp_find_or_add_nexthop/bgp_ensure_nexthop/\n"
    },
    {
      "commit": "05c9075b09bea9e2328980df7138da5fd8157dc3",
      "tree": "89db8427d6133250d80e20b00a6d9b209c7933a9",
      "parents": [
        "a2f0db2be27385211f033271d8b83e9caf362236"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue May 17 13:28:16 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 23 18:51:59 2017 +0000"
      },
      "message": "bgpd: Modernise BGP defaults for MRAI and connect time\n\nQuagga uses historic BGP defaults for its minimum route advertisement\ninterval (MRAI) timers, and its ConnectRetry timer.  It uses 30s and\n5s for the eBGP and iBGP MRAIs, and 120s for the ConnectRetry timer.\nThese values are quite high, and delay convergence and session\nestablishment, and are unlikely to be desirable in modern networks.\n\nThe MRAI can, without a doubt, be significantly reduced.  The optimal\nMRAI is related to the size of the network, its diameter in terms of\nBGP propagation latency particularly.  Prior research suggests values\nof 5s to 15s for Internet BGP, as reasonably conservative values.\nFurther, other implementations have long shipped with 1s or even 0s\nMRAI values.\n\nA too low MRAI, e.g.  a 0 MRAI, can greatly increase the number of\nBGP messages a speaker sends, and hence the bandwidth and even CPU it\nmight use.  I.e.  some MRAI is better than no MRAI, with current BGP,\nor it is prone to excessive - even extreme - chattiness.\n\nThe ConnectRetry timer default also should be set much lower.\n\nLowering the MRAI had previously been suggested by:\n\n   \"Lower the default MRAI timer for iBGP peers to 0\n\n    Signed-off-by: Daniel Walton \u003cdwalton@cumulusnetworks.com\u003e\n    Reviewed-by:   Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\"\n\n* bgpd/bgpd.h: Set defaults to:\n  - 3s for the eBGP MRAI\n  - 1s for iBGP MRAI (lower, but non-0, would be nice for this)\n  - 5s for the ConnectRetry timer\n"
    },
    {
      "commit": "5bc62ca9561fa01a989e386cbf6e71cbdef77a3c",
      "tree": "280eb7047661122253bfbcce62cac8445eba4acd",
      "parents": [
        "40fc3dda2b7a345e447d2ef355108c987e59ed13"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Mon Jul 11 16:21:23 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 23 18:51:58 2017 +0000"
      },
      "message": "isisd,ospf6d,bgpd: Fix GCC 6 warnings on indentation not matching control flow\n\nGCC 6 can now give warnings when the indentation of code does not\nalign with the scope of prior control flow statement(s).  I.e., where\nthe code visually suggests one kind of control flow, but in actuality\nfollows another.\n\nFix warnings found. They all seem to be simple cases of the indentation being\ndeceptive, but the existing flow being correct.\n"
    },
    {
      "commit": "574e5007d5155ee261a4da39fc18502f76e40a30",
      "tree": "616090a448fda07f137f18a7513fb3eb1e4e689f",
      "parents": [
        "670f3dba6721a500418b5793a2b00579198d2bd7"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue May 17 13:33:11 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 23 18:51:57 2017 +0000"
      },
      "message": "bgpd: Add route count from neighbours \u0026 established sessions to bgp summary\n\n* bgp_vty.c: (bgp_show_summary) The sum of the routes received from\n  each neighbour can be interesting/useful.  Add a line with this to\n  end of \u0027show ...  bgp ...  summary\u0027. Also, add a count of the number of\n  established sessions.\n\n  Note, the route count is also available from \u0027show bgp \u003cafi\u003e \u003csafi\u003e\n  statistics\u0027, along with more.\n"
    },
    {
      "commit": "670f3dba6721a500418b5793a2b00579198d2bd7",
      "tree": "6ad3c568371acfc18e96883644f76ecdedd34d07",
      "parents": [
        "4d48bb360db5148b18524d06616555b06342fa68"
      ],
      "author": {
        "name": "Renato Westphal",
        "email": "renato@opensourcerouting.org",
        "time": "Mon Nov 28 16:47:13 2016 -0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 23 18:51:57 2017 +0000"
      },
      "message": "bgpd: fix invalid memory access in peer_free()\n\nWe shoult not call bgp_unlock() before calling\nbgp_delete_connected_nexthop() in the peer_free() function. Otherwise,\nif bgp-\u003elock reaches zero, bgp_free() is called and peer-\u003ebgp becomes\nan invalid pointer in the bgp_delete_connected_nexthop() function.\n\nTo fix this, move the call to bgp_unlock() to the end of peer_free().\n"
    },
    {
      "commit": "4d48bb360db5148b18524d06616555b06342fa68",
      "tree": "82ed5fecb41cb5d52e4f6c52e088148b3e44a66b",
      "parents": [
        "2c0adbf9bc0c2425f567848ba7f790059d18b253"
      ],
      "author": {
        "name": "Daniel Walton",
        "email": "dwalton@cumulusnetworks.com",
        "time": "Tue Nov 29 12:47:12 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 23 18:51:57 2017 +0000"
      },
      "message": "bgpd: fix \"show ip bgp\" column alignment\n\nThe \"Weight\" column is off:\n\nBGP table version is 0, local router ID is 10.1.1.1\nStatus codes: s suppressed, d damped, h history, * valid, \u003e best, \u003d\nmultipath,\n              i internal, r RIB-failure, S Stale, R Removed\nOrigin codes: i - IGP, e - EGP, ? - incomplete\n   Network          Next Hop            Metric LocPrf Weight Path\n*\u003e 4.1.1.2/32       9.9.9.2                  0          32768 ?\n*\u003e 4.1.1.4/32       9.9.9.2                  0          32768 ?\nDisplayed  2 out of 2 total prefixes\n\nReviewed-by:   Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "ddc160cce1767ef006a812f5213cabfb24e3cd4d",
      "tree": "6e4aa078fb897d77edcb7ef16282471c518440b4",
      "parents": [
        "5958b8f790f0049f980b74b3e2916979850e5d09"
      ],
      "author": {
        "name": "Christian Franke",
        "email": "chris@opensourcerouting.org",
        "time": "Sat Oct 01 20:42:34 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 23 18:51:56 2017 +0000"
      },
      "message": "*: Port Christians tweaks for 32-bit route tags\n\nPort over Christian\u0027s tweaks from his port of my commit widening the\nroute-tag field width to 32-bit.  Commit dc9ffce8786844\n \"*: Consistently support 32-bit route tags\".\n\nwith \"changes which make this actually useful for all the daemons\".\n\nThis is missing the zebra route-map changes.\n"
    },
    {
      "commit": "c8e80972d5b99fb8baaa367a726f1dc36a840744",
      "tree": "470029d31433fef22dbd1cd538173a1cc396a163",
      "parents": [
        "32e41f75fd1735071e0fa0bdd918e9b1241d1837"
      ],
      "author": {
        "name": "Christian Franke",
        "email": "nobody@nowhere.ws",
        "time": "Tue Jun 14 20:07:01 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 23 18:51:54 2017 +0000"
      },
      "message": "bgpd: fix memory leaks in show commands\n\nsockunion_str2su allocates a struct sockunion that used to be leaked\nin the show commands. Use str2sockunion and keep the information\non the stack instead.\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\nSigned-off-by: Philippe Guibert \u003cphilippe.guibert@6wind.com\u003e\n"
    },
    {
      "commit": "32e41f75fd1735071e0fa0bdd918e9b1241d1837",
      "tree": "d9f46afc41cdda2413bac46268ccd53f66a0590c",
      "parents": [
        "708ea62f82f34c8674042b369ee8cba5d7b34c02"
      ],
      "author": {
        "name": "Christian Franke",
        "email": "nobody@nowhere.ws",
        "time": "Tue Jun 14 20:06:59 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 23 18:51:54 2017 +0000"
      },
      "message": "bgpd: don\u0027t leak memory in community_regexp_include\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": "708ea62f82f34c8674042b369ee8cba5d7b34c02",
      "tree": "86d4105d340426a86b53dcc47b013e8720b0b195",
      "parents": [
        "5cb81ce51d5c2ed6b6f7ce51dcfa5388b1836c27"
      ],
      "author": {
        "name": "Christian Franke",
        "email": "nobody@nowhere.ws",
        "time": "Tue Jun 14 20:06:57 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 23 18:51:54 2017 +0000"
      },
      "message": "bgpd: check return value of zebra_interface_state_read\n\nzebra_interface_state_read can return NULL in cornercases. The other\ndaemons check for this, so should bgpd.\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": "5cb81ce51d5c2ed6b6f7ce51dcfa5388b1836c27",
      "tree": "d07cac62092a01a19f1a065d5a6b8be89a484997",
      "parents": [
        "cfb4826340ab177b3cfbce4f138187f41860b68e"
      ],
      "author": {
        "name": "Christian Franke",
        "email": "nobody@nowhere.ws",
        "time": "Tue Jun 14 20:06:56 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 23 18:51:54 2017 +0000"
      },
      "message": "bgpd: setting nexthop doesn\u0027t need inet_pton\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": "c0a613f3a2be8e40265704fd00166cd5342ca409",
      "tree": "22e57cbb8df2c245a00ae2dc4ab11f9acf37fbc0",
      "parents": [
        "51b45a52adf944ac391c0e90f86597454ab4d657"
      ],
      "author": {
        "name": "Christian Franke",
        "email": "nobody@nowhere.ws",
        "time": "Mon Jun 06 22:22:15 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 23 18:51:53 2017 +0000"
      },
      "message": "bgpd: fix potential crash in community_list_dup_check\n\nextcommunity_list_set may set the -\u003econfig for an entry\nto NULL. In this case, the old code in community_list_dup_check\nwould cause a NULL pointer dereference.\n\nAdjust the code so it behaves the same in the absence of NULL\npointers and otherwise checks if both are NULL to determine\nequality.\n\nSigned-off-by: Christian Franke \u003cchris@opensourcerouting.org\u003e\nSigned-off-by: Christian Franke \u003cchris@opensourcerouting.org\u003e\nTested-by: NetDEF CI System \u003ccisystem@netdef.org\u003e\nAcked-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "95509a6f55c63b72541fa390f7dda7fab2fa3210",
      "tree": "697673cf127fd4b48b5147ffdf65893158b2d8b5",
      "parents": [
        "9ed99f040f0dd14d0aca82e159f67d27e64042ae"
      ],
      "author": {
        "name": "Thorvald Natvig",
        "email": "thorvald@medallia.com",
        "time": "Thu Sep 29 10:25:35 2016 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 23 18:51:51 2017 +0000"
      },
      "message": "Extend BGP_SEND_ASPATH_CHECK to cover confederations\n\nExtend the check for BGP_SEND_ASPATH_CHECK to also cover confederations.\n"
    },
    {
      "commit": "e3443a21552b6a3cd6ebdbb98336eede217a478f",
      "tree": "7465134a450f779b9fc314819aa1f1e1c5c956e3",
      "parents": [
        "c9cc52af9edf0f23a1434c944812064de220a7bf"
      ],
      "author": {
        "name": "Timo Teräs",
        "email": "timo.teras@iki.fi",
        "time": "Wed Oct 19 16:02:34 2016 +0300"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 23 18:51:51 2017 +0000"
      },
      "message": "bgpd: simplify ebgp-multihop and ttl-security handling\n\nChange to track configured value in -\u003ettl and -\u003egtsm_hops;\nnot the value set to sockopt. Instead, setting of socket\u0027s ttl\nand minttl options are now merged to one function which calculates\nit on demand. This greatly simplifies the code.\n"
    },
    {
      "commit": "c9cc52af9edf0f23a1434c944812064de220a7bf",
      "tree": "0d74b412ef0e02ebbcfdadc21dcf3a8067369073",
      "parents": [
        "b41bb62e039454f53e54959b2c3f7eea816e6422"
      ],
      "author": {
        "name": "Timo Teräs",
        "email": "timo.teras@iki.fi",
        "time": "Wed Oct 19 16:02:33 2016 +0300"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 23 18:51:51 2017 +0000"
      },
      "message": "bgpd: honor disable-connected-check option with next hop tracking\n\nMake bgpd ignore connected state again if configured to do so.\n"
    },
    {
      "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"
    }
  ],
  "next": "9099f9b2a66e86f8a90d7fe18f61bd2bb1bc6744"
}
