)]}'
{
  "commit": "e97c31aafc013b8b9a0e61cb79ee97a5f1e419bf",
  "tree": "d90728aedb147abf0bfa3fe5d4110f8bfa5526cc",
  "parents": [
    "54b88cac24f335414caa875b390d2d78ff4bf9e0"
  ],
  "author": {
    "name": "Feng Lu",
    "email": "lu.feng@6wind.com",
    "time": "Fri May 22 11:39:53 2015 +0200"
  },
  "committer": {
    "name": "David Lamparter",
    "email": "equinox@opensourcerouting.org",
    "time": "Wed May 27 21:52:08 2015 +0200"
  },
  "message": "ripngd: add ECMP support\n\n* Each node in the routing table is changed into a list, holding\n  the multiple equal-cost paths.\n\n* If one of the multiple entries gets less-preferred (greater\n  metric or greater distance), it will be directly deleted instead\n  of starting a garbage-collection timer for it.\n  The garbage-collection timer is started only when the last entry\n  in the list gets INFINITY.\n\n* Some new functions are used to maintain the ECMP list. And hence\n  ripng_route_process(), ripng_redistribute_add() and ripng_timeout()\n  are significantly simplified.\n\n* ripng_zebra_ipv6_add() and ripng_zebra_ipv6_delete() now can share\n  the common code. The common part is moved to ripng_zebra_ipv6_send().\n\nSigned-off-by: Feng Lu \u003clu.feng@6wind.com\u003e\nReviewed-by: Alain Ritoux \u003calain.ritoux@6wind.com\u003e\nSigned-off-by: Nicolas Dichtel \u003cnicolas.dichtel@6wind.com\u003e\nAcked-by: Vincent Jardin \u003cvincent.jardin@6wind.com\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "8717bfb0e25a32788f17e29c896f513d67c078e0",
      "old_mode": 33188,
      "old_path": "ripngd/ripng_interface.c",
      "new_id": "35884634690999e814a5ef6b35e87934b25595fd",
      "new_mode": 33188,
      "new_path": "ripngd/ripng_interface.c"
    },
    {
      "type": "modify",
      "old_id": "d4bf0262ba4df19c19093cb2e4eb3a4501c8755b",
      "old_mode": 33188,
      "old_path": "ripngd/ripng_route.c",
      "new_id": "f26302e884a14db0ccefb81302a36ffdc85739a8",
      "new_mode": 33188,
      "new_path": "ripngd/ripng_route.c"
    },
    {
      "type": "modify",
      "old_id": "2f5b757542b441ccfece96b4f444ba22cb870068",
      "old_mode": 33188,
      "old_path": "ripngd/ripng_route.h",
      "new_id": "fe65c8836375659f9f6f12c9eeeebd5a25c75f04",
      "new_mode": 33188,
      "new_path": "ripngd/ripng_route.h"
    },
    {
      "type": "modify",
      "old_id": "68f37be324c4d224bdb484169a1985beb3fdd994",
      "old_mode": 33188,
      "old_path": "ripngd/ripng_zebra.c",
      "new_id": "b5cf445dd01520ff200c250e8e95f2bcf90eb53f",
      "new_mode": 33188,
      "new_path": "ripngd/ripng_zebra.c"
    },
    {
      "type": "modify",
      "old_id": "4c0b67dfc927ca2bcc920c454efd9dd78a8d5c97",
      "old_mode": 33188,
      "old_path": "ripngd/ripngd.c",
      "new_id": "21e45b6ea20e1a8d43d45f1c88bf1ecc8d964fc8",
      "new_mode": 33188,
      "new_path": "ripngd/ripngd.c"
    },
    {
      "type": "modify",
      "old_id": "ab06d81bfdeb350a6a6a5a9b49f3c0dfcde6887c",
      "old_mode": 33188,
      "old_path": "ripngd/ripngd.h",
      "new_id": "75c5dfa0e810d1a35ea1b0df9cc70764e116a3e4",
      "new_mode": 33188,
      "new_path": "ripngd/ripngd.h"
    }
  ]
}
