)]}'
{
  "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",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "09b4695166b25554a47cee85804d99257f916714",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_mpath.c",
      "new_id": "af1c342c62ed688b6ece79e233a8c86b04025c4b",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_mpath.c"
    },
    {
      "type": "modify",
      "old_id": "de6461fda19e942973a294b7fecd1e85c8520542",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_mpath.h",
      "new_id": "1dc2687e22baf326a693793fbce16c62010ece8f",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_mpath.h"
    },
    {
      "type": "modify",
      "old_id": "718e25fff6d99357bb13479eb459229e241e056b",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_route.c",
      "new_id": "ec17dc61296b29ab22087c7a8aec66c3aec4835a",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_route.c"
    },
    {
      "type": "modify",
      "old_id": "3e5285965588aece04c1f33fa7b2bab31759c6ae",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_route.h",
      "new_id": "45e8d2e80b53a3e0d6eabd490a623739a11fe999",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_route.h"
    },
    {
      "type": "modify",
      "old_id": "5902067182dc7aa7126f5c3a3cd657f5ddea1123",
      "old_mode": 33188,
      "old_path": "lib/memtypes.c",
      "new_id": "dca32caa024944c7c1bf7390d1d01f526465f0c9",
      "new_mode": 33188,
      "new_path": "lib/memtypes.c"
    },
    {
      "type": "modify",
      "old_id": "4d51ddb880786fa9ae140ca5dab139dd71e145ab",
      "old_mode": 33188,
      "old_path": "tests/bgp_mpath_test.c",
      "new_id": "15e450a20ba7098f2fd71de40bd1903d83101acd",
      "new_mode": 33188,
      "new_path": "tests/bgp_mpath_test.c"
    }
  ]
}
