)]}'
{
  "log": [
    {
      "commit": "6d4742bef722e6fab45fb6eb22ed2c7b7570a2e6",
      "tree": "5f448656a3f81e684df289e42cc3bd051850e17f",
      "parents": [
        "91b9e8547a7c5697d5d7481f9476778077024019"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Wed Nov 25 17:14:37 2015 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Thu Feb 18 15:54:45 2016 +0000"
      },
      "message": "bgpd: make bgp_info_cmp and multiple-path decision logic more regular\n\n* bgp_route.c: (bgp_info_cmp) This function is supposed to return a\n  preference between the given paths, and does so as binary either or.  When\n  mpath was added, the binary return value was left as is and instead an out\n  parameter \u0027paths_eq\u0027 was added to indicate the mpath-equality case.  It\u0027s\n  a bit odd, as is the resulting logic in the caller.\n\n  Regularise things again by making the function return a strcmp like\n  trinary return value of -1,0,1.  Get rid of the mpath specific arguments,\n  but pass in afi/safi as part of the general context - that plus the\n  (struct bgp *) is enough to access configuration.\n\n  Update the return values.\n\n  The mpath check was testing the IGP metric for equality, even though\n  previous to the mpath changes (and consistent with the behaviour of all\n  the other tests bar the end), equality results in continuing through to\n  the next comparison. Just go back to the previous way - each test finds a\n  preference to return, or continues on to let further tests have a go.\n\n  (bgp_best_selection) Get rid of the (struct bgp_maxpaths_cfg *) arg, we\n  can\u0027t add state for every optional feature to the argument list - they\n  have to look it up as needed. Do pass through the very general afi/safi\n  context though (saves several lookups through the route_node).\n\n  Adjust for the new trinary bgp_info_cmp return value and updated args.\n  Do the mpath clearing/accumulation in one place, in each loop.\n\n  Call to bgp_info_mpath_update similarly gets updated, as there\u0027s no cfg to\n  pass.\n\n  (bgp_process_{rsclient,main}) match bgp_best_selection changes.\n* bgp_mpath.c: (bgp_mpath_is_configured_sort) Helper for whether mpath is\n  enabled by peer sort.\n  (bgp_mpath_is_configured) ditto, generally.\n  (bgp_info_mpath_update) caller no longer has the cfg to pass in, look it\n  up.\n* bgp_mpath.h: Export the above and Match .c changes.\n\nRequires commit:\n \"bgpd: bgp_scan shouldn\u0027t queue up route_nodes with no routes for processing\"\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "0b597ef00ec7c7eebd836e2b1d5a266efcd60005",
      "tree": "818852fc775358cadb0178c15226af63cfb06759",
      "parents": [
        "6918e74b97fd40f947ebd2eded9ab24b8569d3b8"
      ],
      "author": {
        "name": "Josh Bailey",
        "email": "joshb@google.com",
        "time": "Wed Jul 20 20:49:11 2011 -0700"
      },
      "committer": {
        "name": "Josh Bailey",
        "email": "joshb@google.com",
        "time": "Wed Jul 20 20:49:11 2011 -0700"
      },
      "message": "bgpd: When advertising a multipath route, the attribute set to be\nadvertised is based on the bestpath attribute set, but the\nfollowing attributes are aggregated from the attribute sets\nof the multipath constituents:\n- AS_PATH\n- ORIGIN\n- COMMUNITIES\n- EXTENDED COMMUNITIES\n\nIn addition the route is advertised with the NEXT_HOP set\nto the router\u0027s interface IP address, instead of the NEXT_HOP\nof the best path. This is to ensure that traffic will go to this\nrouter so it can be fanned out via the multipath route.\n\n* bgpd/ecommunity.c\n  * ecommunity_uniq_sort(): Make this function externally accessible\n* bgpd/ecommunity.h\n  * Add external declaration for ecommunity_uniq_sort()\n* bgpd/bgp_mpath.c\n  * bgp_info_nexthop_cmp(): Replace calls to bgp_attr_extra_get()\n    to avoid unwanted memory allocation\n  * bgp_info_mpath_free(): Free aggregate attribute for multipath\n  * bgp_info_mpath_attr(): Lookup aggregate attribute of a multipath route\n  * bgp_info_mpath_attr_set(): Set aggregate attribute of a multipath route\n  * bgp_info_mpath_aggregate_update(): Update the aggregate attribute\n    of a multipath route\n* bgpd/bgp_mpath.h\n  * bgp_info_mpath: Add pointer to hold aggregate attribute of a multipath\n  * Add external declarations for new functions\n* bgpd/bgp_route.c\n  * bgp_announce_check(): Use aggregate attribute when announcing multipath\n    route\n  * bgp_announce_check_rsclient(): Use aggregate attribute when announcing\n    multipath route\n  * bgp_best_selection(): After updating multipath set, update the\n    multipath aggregate attribute\n"
    },
    {
      "commit": "6918e74b97fd40f947ebd2eded9ab24b8569d3b8",
      "tree": "e7d5e43b25eaf963065016d3998a78e5e5568111",
      "parents": [
        "8196f13d2ab7f3b09150c00328228f90391acb7c"
      ],
      "author": {
        "name": "Josh Bailey",
        "email": "joshb@google.com",
        "time": "Wed Jul 20 20:48:20 2011 -0700"
      },
      "committer": {
        "name": "Josh Bailey",
        "email": "joshb@google.com",
        "time": "Wed Jul 20 20:48:20 2011 -0700"
      },
      "message": "bgpd: For deterministic MED build a multipath set for each peer AS as the\nfirst stage of the best path calculation. The second stage then\nselects a winner from each peer AS\u0027s best path. In the second stage we\nclear multipath set of the non-selected best paths via\nbgp_mp_dmed_deselect(). Since the multipath set is already marked up\nfor the winning path, we don\u0027t call bgp_info_mpath_update() after the\nsecond stage calculation.\n\n* bgpd/bgp_mpath.c\n  * bgp_mp_dmed_deselect(): New function to cleanup the multipath\n    markup if a DMED selected path loses in stage 2 of the best path\n    calculation\n* bgpd/bgp_mpath.h\n  * Add external declaration of bgp_mp_dmed_deselect()\n* bgpd/bgp_route.c\n  * bgp_best_selection(): If multipath is enabled, build up the mp_list\n    for the current peer AS, and do the RIB markup the best path from\n    that AS. In the second stage, clear the RIB markup for the DMED\n    selected path if it is not selected as best. Only call\n    bgp_info_mpath_update() in the second stage when not doing\n    deterministic MED.\n"
    },
    {
      "commit": "de8d5dff1523bb9fe47d54f31c9e5322bd805b44",
      "tree": "95d71dffb32d9e67a2f892ac5689a884117dcbcd",
      "parents": [
        "96450faf3385a6ed9f4dd5c2c58776c4a664a8da"
      ],
      "author": {
        "name": "Josh Bailey",
        "email": "joshb@google.com",
        "time": "Wed Jul 20 20:46:01 2011 -0700"
      },
      "committer": {
        "name": "Josh Bailey",
        "email": "joshb@google.com",
        "time": "Wed Jul 20 20:46:01 2011 -0700"
      },
      "message": "bgpd: Adds support to mark up the BGP rib table entry with multipath\ninformation based on the multipath list (mp_list) generated during\nthe best path calculation. Display \"multipath\" for paths that are\nmultipath and also on bestpath if the route is multipath. Flag a\nbest path with the BGP_INFO_MULTIPATH_CHG if the multipath\nset has changed since the last update. This can be used to trigger\nupdates to zebra and peers.\n\nThe multipath markup is a lazily allocated bgp_info_mpath structure\nthat is added to the best path and any multipaths. The mpath structures\nare linked together with the best path element at the head and the\nother elements ordered by nexthop and then by peer address. This\nmarkup scheme is updated by calling bgp_info_mpath_update() and passing\nin a new mp_list the the current multipath set. There are additional\nAPI\u0027s for walking the multipath set, querying the count of multipaths,\nand for cleaning up the multipath markup information when freeing path\ninformation.\n\n* bgpd/bgp_mpath.c\n  * bgp_info_mpath_new(): Allocation of new mpath element\n  * bgp_info_mpath_free(): Release memory for mpath element\n  * bgp_info_mpath_get(): Access mpath element of path. Allocate memory\n    on-demand\n  * bgp_info_mpath_enqueue(): Enqueue a path onto the multipath list\n  * bgp_info_mpath_dequeue(): Remove a path from the multipath list\n  * bgp_info_mpath_first(): Return first path on the multipath list\n  * bgp_info_mpath_next(): Return next path on the multipath list\n  * bgp_info_mpath_count(): Return the number of paths on the multipath list\n  * bgp_info_mpath_count_set(): Set the number of paths on the multipath list\n  * bgp_info_mpath_update(): Update multipath markup on bgp route table entry\n    and flag any changes. Emit \u0027debug bgp event\u0027 output on any multipath\n    change.\n* bgpd/bgp_mpath.h\n  * struct bgp_info_mpath: Information added to a bgp_info path to record\n    multipath information\n  * External declarations for new functions in bgp_mpath.c\n* bgpd/bgp_route.c\n  * bgp_info_free(): Free mpath memory when freeing path information\n  * bgp_info_reap(): Dequeue path from multipath queue before deleting it\n  * bgp_best_selection(): Calls bgp_info_mpath_update() with latest\n    mp_list to mark-up rib table entry\n  * bgp_vty_out_detail(): Add display of multipath flag for a path. Also\n    display \u0027multipath\u0027 for bestpath if it is a multipath route\n* bgpd/bgp_route.h\n  * struct bgp_info: Add pointer to bgp_info_mpath information\n  * Add flags to mark a path as multipath (BGP_INFO_MULTIPATH) and\n    to mark bestpath if multipath information has changed\n    (BGP_INFO_MULTIPATH_CHG)\n* lib/memtypes.c\n  * Add MTYPE_BGP_MPATH_INFO for allocating memory for bgp_info_mpath\n* tests/bgp_mpath_test.c\n  * Add test case for bgp_info_mpath_update() and supporting functions\n"
    },
    {
      "commit": "96450faf3385a6ed9f4dd5c2c58776c4a664a8da",
      "tree": "26c56a71548686a7d6797b79377ccc5e25730186",
      "parents": [
        "42ea68512fc4d04b500def45e8f899321f4081e7"
      ],
      "author": {
        "name": "Josh Bailey",
        "email": "joshb@google.com",
        "time": "Wed Jul 20 20:45:12 2011 -0700"
      },
      "committer": {
        "name": "Josh Bailey",
        "email": "joshb@google.com",
        "time": "Wed Jul 20 20:45:12 2011 -0700"
      },
      "message": "bgpd: Adds equal-paths check to path comparison. Paths that are\nequal to the best path are accumulated onto an ordered list (mp_list)\nif maximum-paths is configured. A future commit will add the\nmultipath markup to the BGP rib table based on the mp_list. Add\nunit test for the added mp_list functions.\n\nDeterministic MED is not supported in this commit, it will be\nadded later.\n\n* bgpd/bgp_aspath.c\n  * Make aspath_cmp() an external symbol so it can be used in\n    equivalent paths check\n* bgpd/bgp_aspath.h\n  * Add extern declaration of aspath_cmp()\n* bgpd/bgp_mpath.c\n  * bgp_info_nexthop_cmp(): Compares nexthops of two paths\n  * bgp_info_mpath_cmp(): Compare function to order multipaths by\n    nexthop and then by peer address\n  * bgp_mp_list_init(): Initialize a list with the multipath order function\n  * bgp_mp_list_clear(): Clear out the mp_list\n  * bgp_mp_list_add(): Add a multipath to mp_list\n* bgpd/bgp_mpath.h\n  * External declarations for above added functions in bgp_mpath.c\n* bgpd/bgp_route.c\n  * bgp_info_cmp(): Add equivalent paths result (paths_eq). If eBGP\n    paths are equal down to IGP metric check, flag as equal if peer AS\n    matches. Similarly for iBGP paths but compare full AS_PATH.\n  * bgp_best_selection(): If multipath is enabled, accumulate equivalent paths\n    in mp_list. Add debug bgp event output to see result (will be filtered\n    later to display only when change occurs)\n  * bgp_process_rsclient(): Pass multipath config to bgp_best_selection()\n  * bgp_process_main(): Pass multipath config to bgp_best_selection()\n* tests/bgp_mpath_test.c\n  * Add unit test case for bgp_mp_list functions\n"
    },
    {
      "commit": "165b5fff9dde5536d9cb1f850b36c17bf5654f0f",
      "tree": "b02e2b71e2142348bce920f5c4a7ef5bd4708f3e",
      "parents": [
        "8ced4e82e6f417b13f4bfc09018fc51fd31058e2"
      ],
      "author": {
        "name": "Josh Bailey",
        "email": "joshb@google.com",
        "time": "Wed Jul 20 20:43:22 2011 -0700"
      },
      "committer": {
        "name": "Josh Bailey",
        "email": "joshb@google.com",
        "time": "Wed Jul 20 20:43:22 2011 -0700"
      },
      "message": "bgpd: Add new configuration cli for eBGP and iBGP multipath.\nThere is support to configure this for each (AFI,SAFI), but\ncurrently this configuration is only present for IPv4 unicast:\n\n maximum-paths [ibgp] \u003c1-255\u003e\n no maximum-paths [ibgp] [\u003c1-255\u003e]\n\n* bgpd/Makefile.am\n  * Add bgp_mpath.h and bgp_mpath.c to build\n* bgpd/bgp_mpath.h\n  * New file for bgp multipath declarations\n  * define BGP_DEFAULT_MAXPATHS\n* bgpd/bgp_mpath.c\n  * bgp_maximum_paths_set(): Configure maximum paths for the given\n    afi, safi and bgp instance\n  * bgp_maximum_paths_unset(): Return maximum paths configuration to\n    the default setting for the given afi, safi and bgp instance\n* bgpd/bgp_vty.c\n  * Define command strings for above CLI\n  * bgp_config_write_maxpaths(): Outputs configuration for the given\n    afi, safi and bgp instance\n  * Install command elements for IPv4 unicast\n* bgpd/bgp_zebra.h\n  * bgp_config_write_maxpaths(): External declaration\n* bgpd/bgpd.c\n  * bgp_create(): Initialize bgp instance to default maximum paths setting\n  * bgp_config_write_family(): Output maximum paths configuration\n    for the given address family\n  * bgp_config_write(): Output maximum paths configuration for\n    IPv4 unicast address family\n* bgpd/bgpd.h\n  * struct bgp: Add storage for maximum paths configuration for\n    each afi, safi\n"
    }
  ]
}
