)]}'
{
  "log": [
    {
      "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": "2b2e38c3169ae0221645e4dd9b40388660ce3f68",
      "tree": "4201eb0ecd250b8da03ec7c129ef80a77007ee4a",
      "parents": [
        "eefddcc78abcc91d1d88633a3c6d5a438fe58790"
      ],
      "author": {
        "name": "Piotr Chytła",
        "email": "pch@packetconsulting.pl",
        "time": "Tue Dec 01 10:10:41 2015 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Oct 04 13:07:49 2016 +0100"
      },
      "message": "ospfd, vtysh: Add support for Route tags\n\n[Forward ported by Cumulus]\n\nCredit\n------\nA huge amount of credit for this patch goes to Piotr Chytla for\ntheir \u0027route tags support\u0027 patch that was submitted to quagga-dev\nin June 2007.\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\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"
    },
    {
      "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": "de24f82d0ea7eadd0db7d5c0d340a0579312237c",
      "tree": "8538c0c863445588c7402672e1cb30596933f66a",
      "parents": [
        "147a812ed15e171d1db882ac96f0f15723bf8b8f"
      ],
      "author": {
        "name": "Piotr Chytła",
        "email": "pch@packetconsulting.pl",
        "time": "Thu Jun 28 00:09:28 2007 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Oct 04 13:07:49 2016 +0100"
      },
      "message": "zebra: Add internal support for route tags\n\nAdd internal support for a route tag to be applied to routes.\nAt this point in time, tags are not being used.\n\n[forward ported by Cumulus]\n\nSigned-off-by: Daniel Walton \u003cdwalton@cumulusnetworks.com\u003e\nSigned-off-by: Piotr Chytła \u003cpch@packetconsulting.pl\u003e\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\nEdited-by: Paul Jakma \u003cpaul.jakma@hpe.com\u003e - rebase conflicts\n"
    },
    {
      "commit": "147a812ed15e171d1db882ac96f0f15723bf8b8f",
      "tree": "d394af3adcf89b7eae806693cba7ae5ee5eea7e7",
      "parents": [
        "768d9098a526841d22a8f0b740a919bd6eccee47"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Thu May 21 16:06:21 2015 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Oct 04 13:07:48 2016 +0100"
      },
      "message": "vtysh: service integrated-vtysh-config not being written to file\n\nThe vtysh commands:\nservice integrated-vtysh-config\nhostname XXXX\n\nwere not being written to the /etc/quagga/Quagga.conf file with a wr mem\nwhen service integrated-vtysh-config was issued.  This patch fixes this\nissue\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "768d9098a526841d22a8f0b740a919bd6eccee47",
      "tree": "adcc88e6c578b62f04933d8741a02245150ebbdb",
      "parents": [
        "d8c5f27777051b3ea32f8b5979ecd9bb7b9475b9"
      ],
      "author": {
        "name": "Dinesh Dutt",
        "email": "ddutt@cumulusnetworks.com",
        "time": "Tue May 19 18:04:13 2015 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Oct 04 13:07:48 2016 +0100"
      },
      "message": "zebra: Suppress displaying default config as part of running config\n\nQuagga doesn\u0027t display default config as part of the running config, only\nwhat is different from the default. However, in the case of rtadv, every\nlink displays the default \"ipv6 nd suppress-ra\" as part of running config.\nThis patch fixes that.\n\nSigned-off-by: Dinesh Dutt \u003cddutt@cumulusnetworks.com\u003e\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": "743219e9abe79e8a3828fc00de679098061960bb",
      "tree": "5daff5c2b13c5e5fd9372269c1d74e24d25f0472",
      "parents": [
        "fa2e78677bde6926dc7cfa29e14925eb6d8e87b3"
      ],
      "author": {
        "name": "Daniel Walton",
        "email": "dwalton@cumulusnetworks.com",
        "time": "Tue May 19 18:03:57 2015 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Oct 04 13:07:48 2016 +0100"
      },
      "message": "ospfd: \"show ip ospf neighbor\" header spacing\n\nThe column headers for displaying OSPF neighbors are not aligned,\nthis patch addresses this issue\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": "7d39125ea4d54624a4865dd272df5041ccac655e",
      "tree": "5948b8421015af9e47885179d87ef727d79196b8",
      "parents": [
        "8c075ef01d64cba7dd52bdc642ccee22a8538b62"
      ],
      "author": {
        "name": "Vipin Kumar",
        "email": "vipin@cumulusnetworks.com",
        "time": "Tue May 19 18:03:53 2015 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Oct 04 13:07:48 2016 +0100"
      },
      "message": "ospf6d: Adding the initialization check in ospfv3_clean()\n\nThis is to avoid a crash triggered by process termination\nwhen ospf6d daemon is running and \u0027router ospf6\u0027 config has not been done yet.\n\nSigned-off-by: Vipin Kumar \u003cvipin@cumulusnetworks.com\u003e\nReviewed-by: Daniel Walton \u003cdwalton@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "8c075ef01d64cba7dd52bdc642ccee22a8538b62",
      "tree": "fb49387b6d69cf5ccc7550ae3c93f982f2916a71",
      "parents": [
        "f1b9611821bb73b6bc664afa263cdaa851e09d34"
      ],
      "author": {
        "name": "Vipin Kumar",
        "email": "vipin@cumulusnetworks.com",
        "time": "Tue May 19 18:03:53 2015 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Oct 04 13:07:48 2016 +0100"
      },
      "message": "ospf6d: Fixing a couple of issues with ospf6_route_remove () routine.\n\nWhen a route_node has multiple ospf6_routes under it (common subnet case),\nthen the current implementation has an issue in adjusting the route_node-\u003einfo\non a ospf6_route_remove() call.\n\nThe main reason is that it ends up using exact match to determine if the next\nospf6_route belongs to the same route_node or not. Fixing that part to use\nrnode (the existing back-pointer to the route_node) from the ospf6_route to\ndetermine that.\n\nAlso fixing some of the walks to turn them safe so that the route deletion is\nfine.\n\nSigned-off-by: Vipin Kumar \u003cvipin@cumulusnetworks.com\u003e\nReviewed-by: Vivek Venkatraman \u003cvivek@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "f1b9611821bb73b6bc664afa263cdaa851e09d34",
      "tree": "e848a1f724143670b5e09531e74c85e364a99466",
      "parents": [
        "f687b62b14dd4e79528e9ba607da1ebdc44cf28d"
      ],
      "author": {
        "name": "Vipin Kumar",
        "email": "vipin@cumulusnetworks.com",
        "time": "Tue May 19 18:03:51 2015 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Oct 04 13:07:47 2016 +0100"
      },
      "message": "ospf6d: LA (local-address) bit related inter-op fix.\n\nAs per the RFC, when the NU bit is set, prefix should be ignored.\nHowever, the code is currently ignoring prefix with LA bit too.\n\nFixing that part.\n\nIn future, we should also set LA bit for the loopback addresses. Not doing this\npart right away, as quagga wont be backward compatible with its own previous\nreleases. Maybe after a release or so, we should start setting LA bit too.\n\nSigned-off-by: Vipin Kumar \u003cvipin@cumulusnetworks.com\u003e\nReviewed-by: Daniel Walton \u003cdwalton@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "f687b62b14dd4e79528e9ba607da1ebdc44cf28d",
      "tree": "8cf2a5934f0ed6069aaa1e0ebe2dcec5e7d75fc9",
      "parents": [
        "24521e24c739b130c247e864d22b734daa4281d1"
      ],
      "author": {
        "name": "Dinesh Dutt",
        "email": "ddutt@cumulusnetworks.com",
        "time": "Tue May 19 18:03:50 2015 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Oct 04 13:06:48 2016 +0100"
      },
      "message": "ospfd: Don\u0027t wait for state change to Exchange to start LSReq\n\nANVL test 17.5. The current implementation wouldn\u0027t start sending LSReq unti\nthe DB Desc packets have all been received (no M bit). This caused the test\nchoke up. RFC 2328 allows for sending LSReq on receiving the first DbDesc\npacket as long as the nbr state is Exchange. This patch fixes that.\n\nSigned-off-by: Dinesh Dutt \u003cddutt@cumulusnetworks.com\u003e\n\nEdited-by: Paul Jakma \u003cpaul.jakma@hpe.com\u003e to start the sending of LsReq\nfrom the nsm_negotiation_done FSM transition function for ExStart-\u003eExchange,\nrather than tacking the call to ospf_ls_req_send to the bottom of the DD\ndesc processing function.\n"
    },
    {
      "commit": "24521e24c739b130c247e864d22b734daa4281d1",
      "tree": "87c1101c1cf0057598051440ec248e39ea82284c",
      "parents": [
        "45af55a70379da6e1534185ffa20238aa6026d52"
      ],
      "author": {
        "name": "Daniel Walton",
        "email": "dwalton@cumulusnetworks.com",
        "time": "Tue May 19 18:03:48 2015 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:47 2016 +0100"
      },
      "message": "ospfd: Fix no ip ospf hello-interval\n\nOSPF silently ignores \u0027no ip ospf hello-interval X\u0027 and \u0027no ip ospf hello-interval X\u0027\n\nSigned-off-by: Daniel Walton \u003cdwalton@cumulusnetworks.com\u003e\nReviewed-by: Dinesh G Dutt \u003cddutt@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "45af55a70379da6e1534185ffa20238aa6026d52",
      "tree": "c7b7f526bb1806dbcd87dc2da6fab5b52f2d5acf",
      "parents": [
        "e2a0ebf26c640822c3488e6f371a043a91fdcc1b"
      ],
      "author": {
        "name": "Vipin Kumar",
        "email": "vipin@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": "ospfd: Make destination of p2p to multicast for LS-ACKS\n\nISSUE:\n\nLSAcks (for directed acks) are being sent to neighbor\u0027s unicast address.\n\nRFC 2328 says:\n\n\"The IP destination address for the packet is selected as\n follows.  On physical point-to-point networks, the IP\n destination is always set to the address AllSPFRouters\"\n\nFix is to unconditionally set the destination address for LSAcks over\npoint-to-point links as AllSPFRouters. Quagga OSPF already has similar\nchange for OSPF DBD, LSUpdate and LSrequest packets.\n\nSigned-off-by: Vipin Kumar \u003cvipin@cumulusnetworks.com\u003e\nReviewed-by: Daniel Walton \u003cdwalton@cumulusnetworks.com\u003e\nReviewed-by: Dinesh G Dutt \u003cddutt@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": "69424be09ccf7233b184b89bb7bd6e98f72d252b",
      "tree": "51d6c07ce0e9e3a6ba2ad12f87c0417d3e8d5c8f",
      "parents": [
        "f972dec83308986082b04711c8915e13c0a5e1c1"
      ],
      "author": {
        "name": "Daniel Walton",
        "email": "dwalton@cumulusnetworks.com",
        "time": "Tue May 19 18:03:41 2015 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:47 2016 +0100"
      },
      "message": "ospf6d: We should accept long form of \"no redistribute\"\n\nWhen turning off redistribution in ospf6, allow the\nuser to specify the full form of the command entered.\n\nSigned-off-by: Daniel Walton \u003cdwalton@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "f972dec83308986082b04711c8915e13c0a5e1c1",
      "tree": "beac1b5a2aa6553bc4fc51b421d6d984d8c00283",
      "parents": [
        "e87f8083ff677b569048ce7560169b64daee0c57"
      ],
      "author": {
        "name": "Vipin Kumar",
        "email": "vipin@cumulusnetworks.com",
        "time": "Tue May 19 18:03:41 2015 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:47 2016 +0100"
      },
      "message": "ospf6d: Add the missing ospf6 running check in show cmds\n\nSYMPTOM:\n\nIf some of the ospfv3 commands like \u0027show ipv6 ospf6 route\u0027 are executed\nwith ospf6d daemon running but before having any ospfv3 configuration, then\nospf6d crash is seen.\n\nISSUE:\n\nThere are a few show commands, which are (unlike others) not checking if\nospf6 instance is initialized already.\n\nFIX:\n\nAdd the missing checks, by using OSPF6_CMD_CHECK_RUNNING() in the commands\nwhere its needed and not yet used.\n\nSigned-off-by: Vipin Kumar \u003cvipin@cumulusnetworks.com\u003e\nReviewed-by: Pradosh Mohapatra \u003cpmohapat@cumulusnetworks.com\u003e\n             Dinesh Dutt \u003cddutt@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "e87f8083ff677b569048ce7560169b64daee0c57",
      "tree": "f55fbeeb8ef6f66f0feb55cab9ce1cc5dc28196b",
      "parents": [
        "e509af86e3579944b7cde942ca3ee3427db1936a"
      ],
      "author": {
        "name": "Vipin Kumar",
        "email": "vipin@cumulusnetworks.com",
        "time": "Tue May 19 18:03:40 2015 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:47 2016 +0100"
      },
      "message": "ospf6d: Support for \u0027clear ipv6 ospf6 interface [ifname]\n\nClear interface commands for ospfv3.  Allow the user\nto clear all peers out the specified interface.\n\nSigned-off-by: Vipin Kumar \u003cvipin@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "e509af86e3579944b7cde942ca3ee3427db1936a",
      "tree": "d707edff140eeae0371e89d912a295bb8978d978",
      "parents": [
        "a90dc8752723ef6bad6fc5a7d5180ab313b0317c"
      ],
      "author": {
        "name": "Vipin Kumar",
        "email": "vipin@cumulusnetworks.com",
        "time": "Tue May 19 18:03:40 2015 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:47 2016 +0100"
      },
      "message": "opsf6d: Update router-LSA when nbr\u0027s interface-ID changes\n\nThis is a fix to make sure router-LSA is updated when neighbor\u0027s interface\nID change is received in hello packet.\n\nSigned-off-by: Vipin Kumar \u003cvipin@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "a90dc8752723ef6bad6fc5a7d5180ab313b0317c",
      "tree": "ba4bafa307695614b1def0e2223d9f6ae3ba6cec",
      "parents": [
        "59fe0eecd3498f28ec1b1cdb2de5dcc7c507f83f"
      ],
      "author": {
        "name": "Vipin Kumar",
        "email": "vipin@cumulusnetworks.com",
        "time": "Tue May 19 17:58:13 2015 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:46 2016 +0100"
      },
      "message": "ospfd: Support for \u0027clear ip ospf interface [IFNAME]\u0027\n\nAllow the user to enter the \u0027clear ip ospf interface [IFNAME]\u0027 command\nthis resets the connection between ospf and any peers out the\nspecified interface.\n\nSigned-off-by: Vipin Kumar \u003cvipin@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": "62f936e7960a7c08f4ae42ad43726d8d6e8e949d",
      "tree": "53dbbf703d51c38e0bf41cc979434b32c3b5d430",
      "parents": [
        "92992c69afd0095b183a3b905598d194115b27a7"
      ],
      "author": {
        "name": "Daniel Walton",
        "email": "dwalton@cumulusnetworks.com",
        "time": "Mon Nov 09 20:21:59 2015 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:45 2016 +0100"
      },
      "message": "ospf6d, ripd, vtysh: Fix \"no set metric\" for ospf6 and RIP\n\nAllow the user to actually turn off the set metric command\nin ospf6d and rip.\n\nSigned-off-by: Daniel Walton \u003cdwalton@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "92992c69afd0095b183a3b905598d194115b27a7",
      "tree": "ebe6c8bb20afd1b7ee9de87e5de281bc05a98022",
      "parents": [
        "083e5e2d7bc8098b92572792ab807da381db95ea"
      ],
      "author": {
        "name": "James Li",
        "email": "jli@cumulusnetworks.com",
        "time": "Mon Nov 09 20:21:57 2015 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:45 2016 +0100"
      },
      "message": "zebra: Dissallow outside programs to delete Quagga routes\n\nDo not allow a program outside Quagga to delete a Quagga route from the kernel.\nTo delete a Quagga route, do it inside Quagga.\n\nSigned-off-by: James Li \u003cjli@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": "a4f40293db1055387d5b901fe0dbb556226b2024",
      "tree": "09ac6cebe377c249426a3760d008b031c84b1be5",
      "parents": [
        "0f2f7a3fa5d55e682d0739d586da021cbd43bc3c"
      ],
      "author": {
        "name": "vivek",
        "email": "vivek@cumulusnetworks.com",
        "time": "Mon Nov 09 20:21:46 2015 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:44 2016 +0100"
      },
      "message": "vtysh: Make ipv6 unicast/multicast address-family work\n\nIn the absence of this patch, attempting to type \"address-family ipv6 unicast\"\nwould result in an \"Ambiguous command\" error and in the case of\n\"address-family ipv6 multicast\", the command would silently fail, without the\nprompt dropping into the address-family mode.\n\nThe cause is how the parse tree is constructed for ipv6 address family. There\nwas an error in extract.pl.in script and in vtysh.c files which assumed that\nthere was only address family ipv6 command, without unicast or multicast and\nso the command was failing.\n\nSigned-off-by: vivek \u003cvivek@cumulusnetworks.com\u003e\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": "34c5d89fed6e8e91ae3cde478f1f4816d69bf09e",
      "tree": "2bb502e14677feb9db54f4986bf0934a0b7a66db",
      "parents": [
        "6f235418ad911040c5a6252d11b05cef5984fd8e"
      ],
      "author": {
        "name": "Ayan Banerjee",
        "email": "ayan@cumulusnetworks.com",
        "time": "Mon Nov 09 20:14:53 2015 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:43 2016 +0100"
      },
      "message": "zebra: ipv6 multipath support\n\nThis patch enables support for multipath for IPV6. The nexthop information\nfrom the protocols have ifindices and nexthop addresses in two different\nstructures. This patch combines them to ensure that the correct APIs can\nbe called. Also, given that IPV6 Linux implementation does not support the\nrta_XXX APIs for multipath, the communication with the kernel is in terms\nof a single nh/ifindex pair.\n\nSigned-off-by: Ayan Banerjee \u003cayan@cumulusnetworks.com\u003e\nSigned-off-by: Dinesh Dutt \u003cddutt@cumulusnetworks.com\u003e\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "6f235418ad911040c5a6252d11b05cef5984fd8e",
      "tree": "7471ac66ae42c0f1c5d10cc592dac768e375ae77",
      "parents": [
        "c7c5b02480a506c6d687bf0d3a0c2a7d3e7cfbf6"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Apr 05 13:21:20 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:43 2016 +0100"
      },
      "message": "zebra: *addattr should use size_t len args, quell signed v unsigned warning\n"
    },
    {
      "commit": "c7c5b02480a506c6d687bf0d3a0c2a7d3e7cfbf6",
      "tree": "fbcd2aafea751978d47459ddbeee945f5f62699b",
      "parents": [
        "3b847ef4e81c6f1a5d4994680d530045765fd053"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Mon Apr 04 15:19:37 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:43 2016 +0100"
      },
      "message": "vtysh: auto-generated vtysh_cmd.c file should depend on its creator\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": "7f39242bf44c85bb651506214666b3ebdd78b928",
      "tree": "45f21653fcc61151cca7548ba5c2096961bea461",
      "parents": [
        "23cd586eac3cde789e02c13a1236a4fe33dfc5d9"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Wed Aug 24 15:53:36 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:43 2016 +0100"
      },
      "message": "*: Remove C99ism, CI system runs builds with CFLAGS and compilers that barf\n"
    },
    {
      "commit": "23cd586eac3cde789e02c13a1236a4fe33dfc5d9",
      "tree": "21ff063298c34db06b946dc70eb4fc6ba3862d20",
      "parents": [
        "8f4269ddff1becca94687252b9571b096cb45b43"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Wed Apr 06 14:03:33 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:43 2016 +0100"
      },
      "message": "zebra: Update news with the status of link-detect and the global default\n"
    },
    {
      "commit": "8f4269ddff1becca94687252b9571b096cb45b43",
      "tree": "1fa611b63988898d448c14efa617ae8b63c6a20a",
      "parents": [
        "a6d400c9158b10207cde40a428ebf2c27f105c0a"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@jakma.org",
        "time": "Fri Sep 18 11:50:33 2015 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:43 2016 +0100"
      },
      "message": "zebra: Add command to configure default for link-state, and make it sticky\n\n* Provide a way for the user to specify their own preference for the default\n  behaviour of link-detect, independent of the compiled in default.\n\n  Add a global \"default link-detect (on|off)\" command to zebra, to set\n  the default policy for link-detect accordingly.  The command is \"sticky\" -\n  when set it will stay set and always be written out, regardless of how it\n  compares to the baked-in, compile-time default.\n\n  The per-interface \"link-detect\" command is similarly made sticky.\n\n* zebra/interface.h: (zebra_if_linkdetect;) enum for link-detect configured\n  state.\n  (struct zebra_if_defaults) Global link-detect default\n  (struct zebra_if) Add field for per-iface link-detect default.\n* lib/if.c: (if_create_vrf) Remove the default flag setting on if-create\n  here, it\u0027s a zebra flag so do it in zebra\u0027s if_zebra_new_hook\n* zebra/interface.c: Add static storage for global defaults.\n  (if_zebra_new_hook) Set the link-detect flag on new ifaces according to the\n  baked in default or else the configured global default.\n  (config_write_zebra_if_defaults,default_linkdetect_cmd) global link-detect\n  command and config write out machinery.\n  (linkdetect_cmd) Set the configuration state rather than the flag.\n  The new hook will then set the interface flag when the if comes up.\n  (if_config_write) Write config according to configured state, not the\n  low-level flag.\n  (zebra_if_init) add new commands.\n"
    },
    {
      "commit": "a6d400c9158b10207cde40a428ebf2c27f105c0a",
      "tree": "1d9d4854da1a23d9e9c175dc9b7c2daebfe352dd",
      "parents": [
        "3bccb4f3df0530bb4d8961b0867ea04c1bca065f"
      ],
      "author": {
        "name": "Dinesh G Dutt",
        "email": "ddutt@cumulusnetworks.com",
        "time": "Fri Sep 18 08:32:56 2015 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:42 2016 +0100"
      },
      "message": "zebra: Set link-detect on by default\n\nSigned-off-by: Roopa Prabhu \u003croopa@cumulusnetworks.com\u003e\nReviewed-by: Dinesh G Dutt \u003cddutt at cumulusnetworks.com\u003e\nReviewed-by: Scott Feldman \u003csfeldma at cumulusnetworks.com\u003e\n\nEdited by Christian Franke: Fix OSPF Virtual Links\nEdited by Donald Sharp: Add NEWS notification\n\nSigned-off-by: Christian Franke \u003cchris@opensourcerouting.org\u003e\nAcked-By: paul@jakma.org\n"
    },
    {
      "commit": "3bccb4f3df0530bb4d8961b0867ea04c1bca065f",
      "tree": "828d3df7e320019acee4e7df40bc26cdd1f0f6a9",
      "parents": [
        "7e4025cb65f79d584911042d3e19eee787b9115b"
      ],
      "author": {
        "name": "Avneesh Sachdev",
        "email": "avneesh@sproute.com",
        "time": "Fri Mar 11 12:21:26 2016 -0800"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:42 2016 +0100"
      },
      "message": "zebra: add developer test functions for FPM code\n\nAdd test functions for the zebra code that interfaces with the\nForwarding Plane Manager. These functions can be invoked in a\ndevelopment build via the recently-added \u0027invoke\u0027 command.\n\nFor example:\n\n  # invoke zebra function zfpm_dt_benchmark_protobuf_encode 100000\n\nChanges:\n\n  * zebra/zebra_fpm_dt.c\n\n    Add the following functions. Each function encodes or decodes a\n    route in a particular FPM format a specified number of times.\n\n    - zfpm_dt_benchmark_netlink_encode()\n    - zfpm_dt_benchmark_protobuf_encode()\n    - zfpm_dt_benchmark_protobuf_decode()\n\n  * zebra/Makefile.am\n\n    Compile zebra_fpm_dt when building a development build.\n\nSigned-off-by: Avneesh Sachdev \u003cavneesh@sproute.com\u003e\n"
    },
    {
      "commit": "7e4025cb65f79d584911042d3e19eee787b9115b",
      "tree": "153d7956cc8719fa0ef0d39bf4c4198db8ddf924",
      "parents": [
        "6112d11a978af54f87ac55daa9e965d949cb0041"
      ],
      "author": {
        "name": "Avneesh Sachdev",
        "email": "avneesh@sproute.com",
        "time": "Fri Mar 11 12:21:24 2016 -0800"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:42 2016 +0100"
      },
      "message": "build: support for \"development build\"\n\n* configure.ac\n\n    Add the --enable-dev-build flag. It controls the DEV_BUILD\n    define for autoconf and automake, which can be used to\n    conditionally build in code that is only intended for development..\n\nSigned-off-by: Avneesh Sachdev \u003cavneesh@sproute.com\u003e\n"
    },
    {
      "commit": "6112d11a978af54f87ac55daa9e965d949cb0041",
      "tree": "3cffda401e4fdebce481b463bfe09345ed400efd",
      "parents": [
        "5779fda137803a4b1e534f6ba70781681baf3fda"
      ],
      "author": {
        "name": "Avneesh Sachdev",
        "email": "avneesh@sproute.com",
        "time": "Mon Apr 04 10:54:59 2016 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:42 2016 +0100"
      },
      "message": "doc: add blurb on use of protobuf with FPM\n\nAdd text about using protobuf as an alternative format for the FPM\ninterface.\n\nSigned-off-by: Avneesh Sachdev \u003cavneesh@sproute.com\u003e\n"
    },
    {
      "commit": "5779fda137803a4b1e534f6ba70781681baf3fda",
      "tree": "8529f38977a19590ac5ecbb273c6629aec0b83da",
      "parents": [
        "b8ae330cd3c65808044d344b24f0917b312c4fb9"
      ],
      "author": {
        "name": "Avneesh Sachdev",
        "email": "avneesh@sproute.com",
        "time": "Mon Apr 04 10:54:58 2016 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:42 2016 +0100"
      },
      "message": "zebra: optionally use protobuf with FPM\n\nChange zebra so that it can optionally use protobuf serialization when\ncommunicating with a Forwarding Plane Manager component.\n\n  * zebra/main.c\n\n    Add the --fpm-format/-F command line option. This allows the user\n    to control the format (protbuf|netlink) that is used to\n    communicate with the FPM.\n\n  * zebra/zebra_fpm.c\n\n    - zebra_init_msg_format(),\n\n      This new function is invoked on process startup to determine the\n      FPM format that should be used.\n\n    - zfpm_init()\n\n      Change to accept any \u0027FPM message format\u0027 specified by the user\n      (via the new command line flag).\n\n    - zebra_encode_route()\n\n      Tweak to use the selected FPM format.\n\n  * zebra_fpm_protobuf.c\n\n    New code to build protobuf messages to be sent to the FPM.\n\n  * zebra/Makefile.am\n\n    - Include common.am\n\n    - Build new file zebra_fpm_protobuf.c when protobuf is available.\n\n    - Link with the fpm_pb library.\n\nSigned-off-by: Avneesh Sachdev \u003cavneesh@sproute.com\u003e\n"
    },
    {
      "commit": "b8ae330cd3c65808044d344b24f0917b312c4fb9",
      "tree": "092dd842454bb360f81a38ecfa5b283c5d173427",
      "parents": [
        "ef20ef7de9fe52931e7a5ce07b8228e87f7f52b6"
      ],
      "author": {
        "name": "Avneesh Sachdev",
        "email": "avneesh@sproute.com",
        "time": "Thu Jul 14 09:59:30 2016 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:42 2016 +0100"
      },
      "message": "Use only the ISC license for .proto files.\n\nSimplify licensing for protobuf files based on discussion on the\nquagga-dev mailing list.\n\nPreviously, users could choose between the GPL and the ISC license.\n\nSigned-off-by: Avneesh Sachdev \u003cavneesh@sproute.com\u003e\nSigned-off-by: Avneesh Sachdev \u003cavneesh@sproute.com\u003e\n"
    },
    {
      "commit": "ef20ef7de9fe52931e7a5ce07b8228e87f7f52b6",
      "tree": "b9aabfbf06546079bcddee105fd8be7e3fadc6f6",
      "parents": [
        "b2624487659d8148ca253147fd7e63560a439c8b"
      ],
      "author": {
        "name": "Avneesh Sachdev",
        "email": "avneesh@sproute.com",
        "time": "Mon Apr 04 10:54:57 2016 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:42 2016 +0100"
      },
      "message": "fpm: Add protobuf support for FPM.\n\nCode that allows a client to convey routes to a Forwarding Plane\nManager component using protobuf instead of netlink..\n\n  * fpm/fpm.proto\n\n    Protobuf definitions pertaining to the Forwarding Plane Manager.\n    In particular, this file defines the AddRoute and DeleteRoute\n    messages.\n\n  * fpm/fpm.h\n\n    Tweak FPM message header definition to also allow messages to be\n    encoded in protobuf format.\n\n  * fpm/{fpm_pb.h,.gitignore,.Makefile.am}\n\n    Add the fpm_pb library, which contains code for interfacing with\n    the FPM using protobuf.\n\n  * configure.ac\n\n    Generate fpm/Makefile.\n\n  * Makefile.am\n\n    Add fpm subdirectory to build.\n\n  * common.am\n\n    Add flags to be used by clients of the fpm_pb library.\n\nSigned-off-by: Avneesh Sachdev \u003cavneesh@sproute.com\u003e\n"
    },
    {
      "commit": "b2624487659d8148ca253147fd7e63560a439c8b",
      "tree": "b82b51cf2968aeaedb67ec647ca87ed983b56ffb",
      "parents": [
        "07e5b645059167a37ccf1079a125114339c0df9e"
      ],
      "author": {
        "name": "Avneesh Sachdev",
        "email": "avneesh@sproute.com",
        "time": "Mon Apr 04 10:54:56 2016 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:42 2016 +0100"
      },
      "message": "build: turn off automake portability warnings\n\nModify configure.ac to disable portability warnings for automake --\nour automake code (in particular common.am) uses some constructs\nspecific to gmake.\n\nSigned-off-by: Avneesh Sachdev \u003cavneesh@sproute.com\u003e\n"
    },
    {
      "commit": "07e5b645059167a37ccf1079a125114339c0df9e",
      "tree": "f77f6d914078f8bfb5271c17d2d9e4cc46a78dcf",
      "parents": [
        "cbd976b54d51fea2f3d532e8d5aac66d6294acc2"
      ],
      "author": {
        "name": "Avneesh Sachdev",
        "email": "avneesh@sproute.com",
        "time": "Mon Apr 04 10:54:55 2016 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:42 2016 +0100"
      },
      "message": "qpb: Add support for protobuf.\n\nInfrastructure that allows protocol buffers to be used in Quagga. The\nchanges below comprise of:\n\n  - Build hooks\n\n  - Protobuf definitions for common types.\n\n  - Library routines for working with protobuf, including functions\n    that help translate between common quagga types and their protobuf\n    equivalents.\n\nChanges:\n\n  * qpb/{Makefile.am,README.txt,qpb.h,.gitignore}\n\n    Add the qpb library, which provides shared code and definitions\n    for using protocol buffers in quagga code.\n\n  * qpb/qpb.proto\n\n    Protobuf definitions that can be shared by all of quagga.\n\n  * qpb/linear_allocator.h\n\n    An allocator that allocates memory by walking down towards the end\n    of a buffer. This is used to cheaply allocate/deallocate memory on\n    the stack for protobuf operations.\n\n  * qpb/qpb_allocator.[ch]\n\n    Thin layer that allows a linear allocator to be used with the\n    protobuf-c library.\n\n  * common.am\n\n    This is an automake fragment that is intended to be shared by\n    Makefile.am files in the tree. It currently includes definitions\n    related to protobuf.\n\n  * configure.ac\n\n    - Add logic to optionally build protobuf code.\n\n      By default, protobuf support is enabled if the protobuf C\n      compiler (protoc-c) is available, and the associated header\n      files/library can be found.\n\n      The user can choose to override this behavior via the new\n      --disable-protobuf/--enable-protobuf flags.\n\n    - Include the quagga protobuf library (qpb) in the build.\n\n  * .gitignore\n\n    Ignore source code generated by protobuf compiler.\n\n  * Makefile.am\n\n    Add \u0027qpb\u0027 to the list of subdirectories.\n\nSigned-off-by: Avneesh Sachdev \u003cavneesh@sproute.com\u003e\n\nEdited: Paul Jakma \u003cpaul.jakma@hpe.com\u003e: Change the sense of the\n        configure enable option to require explicit specifying, as\n        an experimental feature.\n"
    },
    {
      "commit": "cbd976b54d51fea2f3d532e8d5aac66d6294acc2",
      "tree": "9a073c273e3d15c3da0d0693683cd71c93191d12",
      "parents": [
        "57439bf2dd0e2aa9c5a4c95919503dae1e360a19"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@jakma.org",
        "time": "Fri Feb 26 10:34:01 2016 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:41 2016 +0100"
      },
      "message": "HACKING: Document how to add standard copyright claims to files\n\n* (REQUIRED READING) Copyright claims may be documented in the standard way,\n   with a \"Copyright ...\" line near the beginning of the file.\n\nIncorporating suggestions and refinements from:\n\nLou Berger \u003clberger@labn.net\u003e\n"
    },
    {
      "commit": "57439bf2dd0e2aa9c5a4c95919503dae1e360a19",
      "tree": "ad98008c1eed0bd766bc888cd46d7022a02fc438",
      "parents": [
        "d1aa80f04d12c096b10ba0862edbe6c30b5f7ebb"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 05 14:46:58 2016 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:41 2016 +0100"
      },
      "message": "HACKING: New code _MUST_ use a bounded-buffer in handling untrusted data.\n\n* Guidelines: New code must use a bounded-buffer abstraction that provides\n  at least some level of sanity checks on accesses.  Direct pointer\n  twiddling based on untrustable buffers is not generally acceptable in new\n  code in Quagga.\nTested-by: NetDEF CI System \u003ccisystem@netdef.org\u003e\n"
    },
    {
      "commit": "d1aa80f04d12c096b10ba0862edbe6c30b5f7ebb",
      "tree": "72e2473e753f2d166fbffa51ca62cdb564483cf4",
      "parents": [
        "d3cf6c689a64ab83ba574e7df2472129603f1875"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@jakma.org",
        "time": "Tue Jan 26 14:00:12 2016 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:41 2016 +0100"
      },
      "message": "HACKING: Note that \"Signed-off-by\" not used for authorship/rights info\n\n* \"Signed-off-by\" is overloaded, and possibly not even well understood.\n  As per the text, it should not be used to indicate authorship or other\n  rights information, within Quagga.\n"
    },
    {
      "commit": "d3cf6c689a64ab83ba574e7df2472129603f1875",
      "tree": "a26287954a7a895ec79dd6f2606040b8c63e1e03",
      "parents": [
        "2f6aa36e8d72d712738fad2c53ab95f7fcbefc61"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@jakma.org",
        "time": "Tue Jan 26 14:00:11 2016 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:41 2016 +0100"
      },
      "message": "HACKING: Add required reading section \u0026 commit should give full rights details\n\n* HACKING.tex: (COMMIT MESSAGES) It\u0027s pretty critical that commit messages\n  give all the detail required to figure out what authorship/copyright\n  claims might come into play.\n\n  (REQUIRED READING) Add a section on what people are implicitly agreeing to\n  when they contribute.  It\u0027s fairly obvious, common sense stuff.  Spell it\n  out though.  Note that COMMIT MESSAGES are also required reading.\n\n  (Cover page) Draw attention to REQUIRED READING.\n\nA previous version was:\nAcked-by: Vincent Jardin \u003cvincent.jardin@6wind.com\u003e\n"
    },
    {
      "commit": "2f6aa36e8d72d712738fad2c53ab95f7fcbefc61",
      "tree": "df3a88f894784e068d9c9968b42de12e2d06b35d",
      "parents": [
        "3affb6c04881f99aafbbb12de76bdde1dbea0408"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@jakma.org",
        "time": "Tue Jan 26 14:00:10 2016 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:41 2016 +0100"
      },
      "message": "HACKING: Fix internal section links\n\nSeems when pandoc converts tex to markdown it doesn\u0027t output internal\nreference links in a format it recognises itself. Fix.\n"
    },
    {
      "commit": "3affb6c04881f99aafbbb12de76bdde1dbea0408",
      "tree": "c3c1f7be9d8f571543c59bd91fdf3efbc3bd6d89",
      "parents": [
        "f458d88e57e982e8f00a3d2db35a2c6e0bb331fa"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@jakma.org",
        "time": "Tue Jan 26 14:34:41 2016 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:41 2016 +0100"
      },
      "message": "HACKING: Update HACKING with anything relevant from pending and prune\n\n* HACKING.md: Add USEFUL URLs section, add link to patchwork\n* HACKING.pending: Prune out stuff moved to HACKING or well out of date or\n  unreachable.\nTested-by: NetDEF CI System \u003ccisystem@netdef.org\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": "d83b8d6d73021815a87e000c50863a105af80226",
      "tree": "5f9c20043869eea56971eb4d8fad1b161a29d0fe",
      "parents": [
        "ee5fbe26f2b7561457a1d0c8b5ce72b512638cb0"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue May 17 07:10:41 2016 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:40 2016 +0100"
      },
      "message": "lib: add AF_ETHERNET/AFI_ETHER\n"
    },
    {
      "commit": "ee5fbe26f2b7561457a1d0c8b5ce72b512638cb0",
      "tree": "0808f78d99050d18afad8662e41e6d30cb0e2a4d",
      "parents": [
        "b8cb7c3fd44cfd0781a5e80a369ecb19eee9a4a7"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue May 17 07:10:38 2016 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:40 2016 +0100"
      },
      "message": "lib: dump memory stats on core\n"
    },
    {
      "commit": "b8cb7c3fd44cfd0781a5e80a369ecb19eee9a4a7",
      "tree": "f9a8872017a8c4b84c9041ed25c6495dd964a0b6",
      "parents": [
        "93b493a2b010df4f67c7173c0928c8f86d9e1aa2"
      ],
      "author": {
        "name": "Lou Berger",
        "email": "lberger@labn.net",
        "time": "Tue May 17 07:10:33 2016 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:40 2016 +0100"
      },
      "message": "lib: fix memory leak in zprivs_caps_init\n"
    },
    {
      "commit": "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": "06de82eaeb11a1c84798cc222af77cdb07af2e4e",
      "tree": "10bc9180cb3526b167629956514a64de734fc1f2",
      "parents": [
        "220355df533f9c127c32de296513fae180c1568d"
      ],
      "author": {
        "name": "Jafar Al-Gharaibeh",
        "email": "jafar@atcorp.com",
        "time": "Mon May 09 15:18:56 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:40 2016 +0100"
      },
      "message": "pimd: send pim prune via correct interface when rpf upstream interface for a source changes\n\nWhen the rpf upstream interface for a joined source changes, a prune was\nbeing sent out the new rpf upstream interface that was intended for the old\nupstream router.  The prune should be sent out the old rpf upstream\ninterface so that the old route for the multicast source is pruned.\n\nReviewed-by: Jafar Al-Gharaibeh \u003cjafar@atcorp.com\u003e\nSigned-off-by: Taylor Bouvin \u003ctbouvin@atcorp.com\u003e\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": "0ffd69a9bf58ab2e0105336f10753293230a4360",
      "tree": "4754dc8d7e943c17145d201c29a0c5eb3b4a1ff8",
      "parents": [
        "3676cb0c029c8f8f06ab703dd441c1e23e5ef333"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Wed Aug 03 15:22:39 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:39 2016 +0100"
      },
      "message": "doc: Add isisd.texi to quagga_TEXINFOS so it gets in dist tarball\n"
    },
    {
      "commit": "3676cb0c029c8f8f06ab703dd441c1e23e5ef333",
      "tree": "613e8f2a7c7b2b9e2d334830ce994f50611e9d4e",
      "parents": [
        "481986950290323e2f5d1e774a666d4b7ed510d6"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Jul 29 13:39:37 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:39 2016 +0100"
      },
      "message": "*: Remove some for statement declarations\n\nWe generally require C99.  Some compilers, e.g.  gcc, barf on\n\u0027for\u0027 statement declared variables, if std\u003d{gnu,c}99 or higher is not\ngiven - even while seemingly accepting other C99 constructs.\n\nAs it\u0027s trivial, remove these.\n"
    },
    {
      "commit": "481986950290323e2f5d1e774a666d4b7ed510d6",
      "tree": "bf6c499c2bbdf39af42f85679820b38038ad3ffe",
      "parents": [
        "ec04b9faf9ec55ccf7d5bb16cf17a85051fc8270"
      ],
      "author": {
        "name": "Olivier Dugeon",
        "email": "olivier.dugeon@orange.com",
        "time": "Tue Apr 19 19:21:17 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:39 2016 +0100"
      },
      "message": "ospfd: Add support Router Capabilities support to OSPF\n\nThis is an implementation of RFC4970 (Router Information) and\nRFC5088 (PCE Capabilities announcement)\n\n* ospfd/Makefile.am: Add new file ospf_ri.c and ospf_ri.h\n* ospfd/ospf_opaque.c: Add new Router Capabilities code point\n* ospfd/ospf_ri.[c,h]: Implementation of RFC4970 \u0026 RFC5088\n\nSigned-off-by: Olivier Dugeon \u003colivier.dugeon@orange.com\u003e\n"
    },
    {
      "commit": "ec04b9faf9ec55ccf7d5bb16cf17a85051fc8270",
      "tree": "3966ebeaf299c3400079a8b3bf4a396f2e454e47",
      "parents": [
        "4f593574c41deb598cbbefde5c6d938799e81d5a"
      ],
      "author": {
        "name": "Olivier Dugeon",
        "email": "olivier.dugeon@orange.com",
        "time": "Tue Apr 19 19:18:18 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:39 2016 +0100"
      },
      "message": "doc: Update documentation for Traffic Engineering\n\nSigned-off-by: Olivier Dugeon \u003colivier.dugeon@orange.com\u003e\n"
    },
    {
      "commit": "4f593574c41deb598cbbefde5c6d938799e81d5a",
      "tree": "755b7fb742265b2dc4fe086e059f1ac6b060e6f9",
      "parents": [
        "29a1401706a762541b366c7844507efe2bc1345d"
      ],
      "author": {
        "name": "Olivier Dugeon",
        "email": "olivier.dugeon@orange.com",
        "time": "Tue Apr 19 19:03:05 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:39 2016 +0100"
      },
      "message": "isisd: Add support of Traffic Engineering\n\nThese patches is an implementation of RFC5305 that enable the\nsupport of Traffic Engineering in IS-IS\n\n* isisd/Makefile.am: Add new files isis_te.c and isis_te.h\n\n* isisd/isis_circuit.[c,h]: Add new mpls_te_circuit structure to\n  isis_circuit structure to handle new Traffic Engineering TLVs\n* isisd/isis_lsp.c: Update LSP handler to mux/demux Traffic Engineering TLVs\n* isisd/isis_main.c: Add initialisation of ISIS TE\n* isisd/isis_pdu.c: Update function process_p2p_hello() to retrieve remote\n  IP address to populate Traffic Engineering TLV.\n* isisd/isis_te.[c,]: Implementation of RFC5305\n* isisd/isis_tlv.[c,h]: Update TLV definition and function to handle\n  Traffic Engineering ones\n* isisd/isis_zebra.c: Add new function isis_zebra_link_params() to retrieve\n  the link parameters of interfaces from ZBus to populate the Traffic\n  Engineering TLVs\n* isisd/isisd.[c,h]: Add Traffic Engineering support with new debug command\n\nSigned-off-by: Olivier Dugeon \u003colivier.dugeon@orange.com\u003e\n"
    },
    {
      "commit": "29a1401706a762541b366c7844507efe2bc1345d",
      "tree": "d7e7c770f90cca5ad3748e167bc8028a6084f7f1",
      "parents": [
        "ac10d30c03091eace3c0405aa8ccb7d3c09e7bd2"
      ],
      "author": {
        "name": "Olivier Dugeon",
        "email": "olivier.dugeon@orange.com",
        "time": "Tue Apr 19 18:42:40 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:39 2016 +0100"
      },
      "message": "ospfd: Update Traffic Engineering support\n\nThese patches update original code to RFC3630 (OSPF-TE) and add support of\nRFC5392 (Inter-AS v2) \u0026 RFC7471 (TE metric extensions) and partial support\nof RFC6827 (ASON - GMPLS).\n\n* ospfd/ospf_dump.[c,h]: Add new dump functions for Traffic Engineering\n* ospfd/ospf_opaque.[c,h]: Add new TLV code points for RFC5392\n* ospfd/ospf_packet.c: Update checking of OSPF_OPTION\n* ospfd/ospf_vty.[c,h]: Update ospf_str2area_id\n* ospfd/ospf_zebra.c: Add new function ospf_interface_link_params() to get\n  Link Parameters information from the interface to populate Traffic\n  Engineering metrics\n* ospfd/ospfd.[c,h]: Update OSPF_OPTION flags (T -\u003e MT and new DN)\n* ospfd/ospf_te.[c,h]: Major modifications to update the code to new\n  link parameters structure and new RFCs\n\nSigned-off-by: Olivier Dugeon \u003colivier.dugeon@orange.com\u003e\n"
    },
    {
      "commit": "ac10d30c03091eace3c0405aa8ccb7d3c09e7bd2",
      "tree": "b855b841903149f68f518068fe99b120f94c0712",
      "parents": [
        "15773a87ce652da5b02ca14dc0088408899ea007"
      ],
      "author": {
        "name": "Olivier Dugeon",
        "email": "olivier.dugeon@orange.com",
        "time": "Tue Apr 19 18:33:42 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:38 2016 +0100"
      },
      "message": "vtysh: Add support of new link-params CLI\n\nIn vtysh_config.c/vtysh_config_parse_line(), it is not possible to continue\nto use the ordered version for adding line i.e. config_add_line_uniq() to print\nInterface CLI commands as it completely break the new LINK_PARAMS_NODE.\n\nSigned-off-by: Olivier Dugeon \u003colivier.dugeon@orange.com\u003e\n"
    },
    {
      "commit": "15773a87ce652da5b02ca14dc0088408899ea007",
      "tree": "0c4d6ceab9ca1d8183382f40601265133b15f68b",
      "parents": [
        "ae51c9d510fb7d9cc41ead8803af916c1f4b34ca"
      ],
      "author": {
        "name": "Olivier Dugeon",
        "email": "olivier.dugeon@orange.com",
        "time": "Tue Apr 19 18:29:55 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:38 2016 +0100"
      },
      "message": "zebra: Add link parameters support to Zebra\n\n* zebra/interface.c:\n   - Add new link-params CLI commands\n   - Add new functions to set/get link parameters for interface\n* zebra/redistribute.[c,h]: Add new function to propagate link parameters\n  to routing daemon (essentially OSPFD and ISISD) for Traffic Engineering.\n* zebra/redistribute_null.c: Add new function\n  zebra_interface_parameters_update()\n* zebra/zserv.[c,h]: Add new functions to send link parameters\n\nSigned-off-by: Olivier Dugeon \u003colivier.dugeon@orange.com\u003e\n"
    },
    {
      "commit": "ae51c9d510fb7d9cc41ead8803af916c1f4b34ca",
      "tree": "069b3a1b5d674d215a7520211e32d314d865e17f",
      "parents": [
        "7e49a4f99273858887806c6251d958e1e664bedf"
      ],
      "author": {
        "name": "Olivier Dugeon",
        "email": "olivier.dugeon@orange.com",
        "time": "Tue Apr 19 16:21:46 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:38 2016 +0100"
      },
      "message": "lib: Add new if_link_params structure\n\nThis new structure is the basis to get new link parameters for\nTraffic Engineering from Zebra/interface layer to OSPFD and ISISD\nfor the support of Traffic Engineering\n\n* lib/if.[c,h]: link parameters struture and get/set functions\n* lib/command.[c,h]: creation of a new link-node\n* lib/zclient.[c,h]: modification to the ZBUS message to convey the\n  link parameters structure\n* lib/zebra.h: New ZBUS message\n* lib/memtypes.c: Add new memory type for Traffic Engineering support\n\nSigned-off-by: Olivier Dugeon \u003colivier.dugeon@orange.com\u003e\n"
    },
    {
      "commit": "7e49a4f99273858887806c6251d958e1e664bedf",
      "tree": "35279e730589b0a460211eeb73279bdff1978102",
      "parents": [
        "a3b161bb72d7fdb58e79afd0f706849601f77fe2"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Aug 02 13:36:03 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:38 2016 +0100"
      },
      "message": "build: Test for features.h and move include to lib/zebra.h\n\n* configure.ac: Check for features.h, which is needed to get Clang to\n  define __STDC_IEC_559__.\n* lib/{stream.c,zebra.h}: move the features.h include to zebra.h, so\n  lib/network.c also gets it.\n"
    },
    {
      "commit": "a3b161bb72d7fdb58e79afd0f706849601f77fe2",
      "tree": "d7a9e5323ec658fc144306c44e0783d7c0f4db92",
      "parents": [
        "4359501e1a427159c9b49f3041889837aaaf2eb3"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Mon Aug 01 15:13:58 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:38 2016 +0100"
      },
      "message": "lib: IEC559 tests are fragile, reduce to warning rather than error.\n\n* {network,stream}.c: Weaken the compile time tests for IEEE754 / IEC-559\n  binary floating point format from an error to a warning when not detected.\n\n  I can\u0027t think of any platforms that are not IEEE-754 format, and as the\n  testing for the defines appears to be fragile (often not set) the error\n  just gives false positives.\n\n  Even the warnings may be too much.  Those should probably be moved\n  to some configure test.  Will do for now though, to fix compilation\n  on CentOS and some BSDs.\n"
    },
    {
      "commit": "4359501e1a427159c9b49f3041889837aaaf2eb3",
      "tree": "a9f2a5b71e75a61f84100446f90d9339e6152587",
      "parents": [
        "d41e7b975b901f109608471b77c46718c1fb5b45"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@opensourcerouting.org",
        "time": "Tue May 19 18:50:49 2015 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:38 2016 +0100"
      },
      "message": "lib: consolidate ntohf/htonf from ospfd/isisd TE to lib/network\n\n* lib/network.{c,h}: Consolidate the ntohf/htonf functions used in ospfd\n  TE to here, using the value-passing variant that fits with existing\n  ntoh/hton functions.\n* ospfd/ospf_opaque.c: Remove its variants.\n* ospfd/ospf_te.c: Update to use the consolidated, by-value variant.\n"
    },
    {
      "commit": "d41e7b975b901f109608471b77c46718c1fb5b45",
      "tree": "8db478bd5cd56ab041ba8e7251b3849954abd922",
      "parents": [
        "581ecbfe91d23791c116a8e3790208a17c1a5983"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@opensourcerouting.org",
        "time": "Tue May 19 15:38:43 2015 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:38 2016 +0100"
      },
      "message": "lib/stream: add float/double \u003c-\u003e IEEE-754 single/double mux/demuxers\n\n* stream.{c,h}: Add stream_get{f,d} and stream_put{f,d}) demux and muxers to\n  safely convert between big-endian IEEE-754 single and double binary\n  format, as used in IETF RFCs, and C99.  Implementation depends on host\n  using __STDC_IEC_559__, which should be everything we care about.  Should\n  correctly error out otherwise.\n\n  Thanks to Aidan Delaney \u003caidan@phoric.eu\u003e and Olivier Dugeon for pointing\n  out the __STDC_IEC_559__ macro.\n\n  Update: GCC does not per se set __STDC_IEC_559__, so also test for\n  __GCC_IEC_559 \u003e\u003d 1.\n"
    },
    {
      "commit": "581ecbfe91d23791c116a8e3790208a17c1a5983",
      "tree": "c6087fe822be69a1b424b2453aa87ac30014ec5e",
      "parents": [
        "00667cea1fbd088900f7909f2044da2a7e26270d"
      ],
      "author": {
        "name": "Christian Franke",
        "email": "nobody@nowhere.ws",
        "time": "Tue May 03 19:59:43 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:38 2016 +0100"
      },
      "message": "zebra: count iface up/down events and keep last time of their occurrence\n\nIt is quite useful to be able to assert whether specific interfaces have\nflapped or also to verify that specific interfaces have not flapped.\n\nBy having counters for those events and storing the last time of their\noccurrence, this is made possible.\n\nSigned-off-by: Christian Franke \u003cchris@opensourcerouting.org\u003e\nTested-by: NetDEF CI System \u003ccisystem@netdef.org\u003e\n"
    },
    {
      "commit": "00667cea1fbd088900f7909f2044da2a7e26270d",
      "tree": "33044643861697f51f026938d24d87056ef5f37f",
      "parents": [
        "880e31ca2d8a8a8fcbc28bfeac9bd13fc76dd2c1"
      ],
      "author": {
        "name": "Christian Franke",
        "email": "nobody@nowhere.ws",
        "time": "Tue May 03 19:59:42 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:37 2016 +0100"
      },
      "message": "lib: add event_counter\n\nSigned-off-by: Christian Franke \u003cchris@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "880e31ca2d8a8a8fcbc28bfeac9bd13fc76dd2c1",
      "tree": "bcaadd39adfb96a286d1ece6cc5bf8b27f0dad5d",
      "parents": [
        "2ab67a7591d7693bb726dd82795017c8c3f52d99"
      ],
      "author": {
        "name": "Christian Franke",
        "email": "nobody@nowhere.ws",
        "time": "Tue May 03 19:59:40 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:37 2016 +0100"
      },
      "message": "lib: use constant to replace magic value for length of quagga_timestamp\n\nSigned-off-by: Christian Franke \u003cchris@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "2ab67a7591d7693bb726dd82795017c8c3f52d99",
      "tree": "06b055b1e565c2e61f80f57d7a56dcb0af48b355",
      "parents": [
        "811577eaede8b6a7ea6ba3731c82eed1c4d07500"
      ],
      "author": {
        "name": "Pawel Wieczorkiewicz",
        "email": "pwieczorkiewicz@suse.de",
        "time": "Fri Apr 01 12:54:38 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:37 2016 +0100"
      },
      "message": "build: detect and create AM_SILENT_RULES macro if needed\n\nOlder libs have problem with that:\nconfigure.ac:17: warning: macro `AM_SILENT_RULES\u0027\n  not found in library\n...\nconfigure.ac:24: error: possibly undefined macro:\n   AM_SILENT_RULES\nTested-by: NetDEF CI System \u003ccisystem@netdef.org\u003e\n"
    },
    {
      "commit": "811577eaede8b6a7ea6ba3731c82eed1c4d07500",
      "tree": "b6b5ac6a5bc2248830e47e6a4ed044d7098cc38f",
      "parents": [
        "985c3556921fa669f86fe5e62130fbeb93d94ca9"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Thu Mar 10 20:16:48 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:37 2016 +0100"
      },
      "message": "lib: Remove unnecessary parentheses\n\nThe freebsd compiler complains that there is an extra set of ()\u0027s\naround the if statement.\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "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": "54406ac4c6883725f8a337bdc4f15fb015926b0f",
      "tree": "0044c1865642f3ad55f6b597f107167ca1b79e6d",
      "parents": [
        "1ad00b07a10eb8b3f5c94348488735fb08f28717"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Fri Mar 04 15:28:57 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:37 2016 +0100"
      },
      "message": "lib: Refactor thread_process_fd\n\nthread_process_fd is looping over the read and write\nfd\u0027s separately.  There is no need to do this individually.\nloop over both the read and write fdset\u0027s at the same time.\nThis will improve select processing performance, especially\nfor large data sets.\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "1ad00b07a10eb8b3f5c94348488735fb08f28717",
      "tree": "a17cbf06ebd0dc639ca46a63de7727ac7c5c56ee",
      "parents": [
        "e0b8324deb490c52834775d2b805cbb57e003ce0"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Wed Jul 13 11:02:38 2016 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:37 2016 +0100"
      },
      "message": "lib: Fix regression in thread.c\n\n* Fix regression introduced with merging of\n\n    \u0027lib: Refactor read/write functionality\u0027\n"
    },
    {
      "commit": "e0b8324deb490c52834775d2b805cbb57e003ce0",
      "tree": "4f4055d192a73ac02ce258fb00be829036923ca3",
      "parents": [
        "19be18a929c3afa343ac5435dba25f522e294d9b"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Fri Mar 04 15:28:56 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:37 2016 +0100"
      },
      "message": "lib: Refactor read/write functionality\n\nBoth the read and write functions used the same code\nslightly modified for reading and writing.  Combine this\ncode together.\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n\nEdited-by: Paul Jakma \u003cpaul.jakma@hpe.com\u003e to retain the\nexternal library symbols, for ease of merging.\n"
    },
    {
      "commit": "19be18a929c3afa343ac5435dba25f522e294d9b",
      "tree": "ca2b656c0e8d24a9b3f50e482f65cb5fbc0cbf0e",
      "parents": [
        "6bcee414a487024e7865fb29d4e583870406d914"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Fri Mar 04 15:28:55 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:37 2016 +0100"
      },
      "message": "lib: Abstract fd set operations\n\nAbstract FD set operations so that we can eventually\nchoose what type of select/poll operation that\nwe want to use.\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetowkrs.com\u003e\n"
    },
    {
      "commit": "6bcee414a487024e7865fb29d4e583870406d914",
      "tree": "ae207533d9edeaec7277a2a3ae4768586e04879e",
      "parents": [
        "921936652359fe72728eb196aa9107310f02a4d4"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Sat Mar 12 19:58:09 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:37 2016 +0100"
      },
      "message": "lib: fix MIN/MAX macros to not double-eval\n\ncf. https://gcc.gnu.org/onlinedocs/gcc/Typeof.html\n(Works on all compilers on Quagga\u0027s compiler support list in\ndoc/overview.texi)\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\nTested-by: NetDEF CI System \u003ccisystem@netdef.org\u003e\nAcked-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "921936652359fe72728eb196aa9107310f02a4d4",
      "tree": "76bfc9865bc9ee26e4f73999bcecf424dd649598",
      "parents": [
        "41de629c1fe88f9ea95d0400af6896f3c84a0dff"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Thu Jun 16 15:53:26 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:36 2016 +0100"
      },
      "message": "lib: keep hash of node\u0027s commands to detect duplicate installs\n\n* command.h: (struct cmd_node) Add a hash, so duplicate installs of\n  a cmd_element to a command node can be detected.  To help catch\n  strays from the VIEW/ENABLE node consolidation particularly\n  (installs to VIEW automatically install to ENABLE too now).\n* command.c: (cmd_hash_{key,cmp}) helpers for the hash - just directly\n  on the pointer value is sufficient to catch the main problem.\n  (install_node) setup the hash for the command node.\n  (install_element) check for duplicate installs.\n  The assert on the cmd_parse_format seems misplaced.\n  (install_default_basic) separate the basic, VIEW, node default commands\n  to here.\n  (cmd_init) get rid of dupes, given consolidation.\n  (cmd_terminate) clean up the node command hash.\n\nNot done: The (struct cmd_node)\u0027s vector could be replaced with the\ncmd hash, however much of the command parser depends heavily on the\nvector and it\u0027s a lot of work to change.  A vector_lookup_value could\nalso work, particularly if vector could be backed by a hash.\n\nThe duplicate check could be disabled in releases - but useful in\ndevelopment.  It\u0027s a little extra overhead at startup.  The command\ninitialisation overhead is already something that bites in\nmicro-benchmarks - makes it easy for other implementations to show\nhow much faster they are with benchmarks where other load is low\nenough that startup time is a factor.\n"
    },
    {
      "commit": "41de629c1fe88f9ea95d0400af6896f3c84a0dff",
      "tree": "5120035dc611715809cef786d4166ec0f8023016",
      "parents": [
        "68b45cc592d5d61e748e8d99ec9f84e63aa73213"
      ],
      "author": {
        "name": "Christian Franke",
        "email": "nobody@nowhere.ws",
        "time": "Tue May 03 19:59:41 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:36 2016 +0100"
      },
      "message": "lib: add api method to read current config path\n\nSigned-off-by: Christian Franke \u003cchris@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "68b45cc592d5d61e748e8d99ec9f84e63aa73213",
      "tree": "eb1008834813757b86e5f4bc439e7b2b3188adbf",
      "parents": [
        "b9ac2f320922542e0320ceeced4aa7264564e98a"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Fri Mar 11 14:27:13 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jul 20 12:58:33 2016 +0100"
      },
      "message": "*: Consolidate all double VIEW_NODE and ENABLE_NODE\u0027s\n\nIf a command is put into the VIEW_NODE, it is going into the\nENABLE_NODE as well.  This is especially true for show commands.\nAs such if a command is in both consolidate it down to VIEW_NODE.\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    }
  ],
  "next": "b9ac2f320922542e0320ceeced4aa7264564e98a"
}
