)]}'
{
  "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",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "8d5fa741a882ddaab1355be3f3c1c85ef38f87dc",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_ecommunity.c",
      "new_id": "244ffd1601f35fa5d6468a9822310b730be2fbde",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_ecommunity.c"
    },
    {
      "type": "modify",
      "old_id": "942fdc73305f546c51bc5ee528b89c929d8d3ba9",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_ecommunity.h",
      "new_id": "1a2252709466fb63aaea589151812d51e2962fd1",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_ecommunity.h"
    },
    {
      "type": "modify",
      "old_id": "7944c55fc46631e2de857d479ad9a3a08d63e439",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_mpath.c",
      "new_id": "44823c4baa249fbb2acc9f0d3a580cf03d0eff72",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_mpath.c"
    },
    {
      "type": "modify",
      "old_id": "3712493ed67d080a6ceb51e8290833558cc5dc83",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_mpath.h",
      "new_id": "37b9ac8b7e217fc50673a661a9a3e1c6722af080",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_mpath.h"
    },
    {
      "type": "modify",
      "old_id": "5c4ab266634de4170ad68f03ad61acf6c8f38748",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_route.c",
      "new_id": "a4923f57bb529d56e9ad2744d0c6e75e73ca4c35",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_route.c"
    }
  ]
}
