)]}'
{
  "log": [
    {
      "commit": "c99f3481a598e9cadd1de96714f6b5df9ad85c4a",
      "tree": "aac6df566f28c13fce5c9f02275f159fab73a24d",
      "parents": [
        "758fb8f99a7bfac3d31c419fd1a5694fc5f33f6a"
      ],
      "author": {
        "name": "Feng Lu",
        "email": "lu.feng@6wind.com",
        "time": "Thu Oct 16 09:52:36 2014 +0800"
      },
      "committer": {
        "name": "Nicolas Dichtel",
        "email": "nicolas.dichtel@6wind.com",
        "time": "Wed Jun 03 10:24:12 2015 +0200"
      },
      "message": "*: add VRF ID in the API message header\n\nThe API messages are used by zebra to exchange the interfaces, addresses,\nroutes and router-id information with its clients. To distinguish which\nVRF the information belongs to, a new field \"VRF ID\" is added in the\nmessage header. And hence the message version is increased to 3.\n\n* The new field \"VRF ID\" in the message header:\n\n    Length    (2 bytes)\n    Marker    (1 byte)\n    Version   (1 byte)\n    VRF ID    (2 bytes, newly added)\n    Command   (2 bytes)\n\n  - Client side:\n\n    - zclient_create_header() adds the VRF ID in the message header.\n    - zclient_read() extracts and validates the VRF ID from the header,\n      and passes the VRF ID to the callback functions registered to\n      the API messages.\n    - All relative functions are appended with a new parameter \"vrf_id\",\n      including all the callback functions.\n    - \"vrf_id\" is also added to \"struct zapi_ipv4\" and \"struct zapi_ipv6\".\n      Clients need to correctly set the VRF ID when using the API\n      functions zapi_ipv4_route() and zapi_ipv6_route().\n    - Till now all messages sent from a client have the default VRF ID\n      \"0\" in the header.\n    - The HELLO message is special, which is used as the heart-beat of\n      a client, and has no relation with VRF. The VRF ID in the HELLO\n      message header will always be 0 and ignored by zebra.\n\n  - Zebra side:\n\n    - zserv_create_header() adds the VRF ID in the message header.\n    - zebra_client_read() extracts and validates the VRF ID from the\n      header, and passes the VRF ID to the functions which process\n      the received messages.\n    - All relative functions are appended with a new parameter \"vrf_id\".\n\n* Suppress the messages in a VRF which a client does not care:\n\n  Some clients may not care about the information in the VRF X, and\n  zebra should not send the messages in the VRF X to those clients.\n\n  Extra flags are used to indicate which VRF is registered by a client,\n  and a new message ZEBRA_VRF_UNREGISTER is introduced to let a client\n  can unregister a VRF when it does not need any information in that\n  VRF.\n\n  A client sends any message other than ZEBRA_VRF_UNREGISTER in a VRF\n  will automatically register to that VRF.\n\n  - lib/vrf:\n\n    A new utility \"VRF bit-map\" is provided to manage the flags for\n    VRFs, one bit per VRF ID.\n\n    - Use vrf_bitmap_init()/vrf_bitmap_free() to initialize/free a\n      bit-map;\n    - Use vrf_bitmap_set()/vrf_bitmap_unset() to set/unset a flag\n      in the given bit-map, corresponding to the given VRF ID;\n    - Use vrf_bitmap_check() to test whether the flag, in the given\n      bit-map and for the given VRF ID, is set.\n\n  - Client side:\n\n    - In \"struct zclient\", the following flags are changed from\n      \"u_char\" to \"vrf_bitmap_t\":\n          redist[ZEBRA_ROUTE_MAX]\n          default_information\n      These flags are extended for each VRF, and controlled by the\n      clients themselves (or with the help of zclient_redistribute()\n      and zclient_redistribute_default()).\n\n  - Zebra side:\n\n    - In \"struct zserv\", the following flags are changed from\n      \"u_char\" to \"vrf_bitmap_t\":\n          redist[ZEBRA_ROUTE_MAX]\n          redist_default\n          ifinfo\n          ridinfo\n\n      These flags are extended for each VRF, as the VRF registration\n      flags. They are maintained on receiving a ZEBRA_XXX_ADD or\n      ZEBRA_XXX_DELETE message.\n\n      When sending an interface/address/route/router-id message in\n      a VRF to a client, if the corresponding VRF registration flag\n      is not set, this message will not be dropped by zebra.\n\n    - A new function zread_vrf_unregister() is introduced to process\n      the new command ZEBRA_VRF_UNREGISTER. All the VRF registration\n      flags are cleared for the requested VRF.\n\n  Those clients, who support only the default VRF, will never receive\n  a message in a non-default VRF, thanks to the filter in zebra.\n\n* New callback for the event of successful connection to zebra:\n\n  - zclient_start() is splitted, keeping only the code of connecting\n    to zebra.\n\n  - Now zclient_init()\u003d\u003ezclient_connect()\u003d\u003ezclient_start() operations\n    are purely dealing with the connection to zbera.\n\n  - Once zebra is successfully connected, at the end of zclient_start(),\n    a new callback is used to inform the client about connection.\n\n  - Till now, in the callback of connect-to-zebra event, all clients\n    send messages to zebra to request the router-id/interface/routes\n    information in the default VRF.\n\n    Of corse in future the client can do anything it wants in this\n    callback. For example, it may send requests for both default VRF\n    and some non-default VRFs.\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: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "126215c1238eb42cc92d23aefbe1fac3b204438f",
      "tree": "22910b50f39003e297efc6236711581cbf3b2ada",
      "parents": [
        "2fc97f6335dd5d7df2c285b363c6ef56bb98dcf8"
      ],
      "author": {
        "name": "Feng Lu",
        "email": "lu.feng@6wind.com",
        "time": "Fri May 22 11:39:58 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Jun 02 06:58:12 2015 +0200"
      },
      "message": "*: call if_init()/if_terminate() from vrf_init()/vrf_terminate()\n\nLater, an interface will belong to a specific VRF, and the interface\ninitialization will be a part of the VRF initialization. So now call\nif_init() from vrf_init(), and if_terminate() from vrf_terminate().\n\nDaemons have the according changes:\n- if if_init() was called or \"iflist\" was initialized, now call\n  vrf_init() instead;\n- if if_terminate() was called or \"iflist\" was destroyed, now call\n  vrf_terminate() instead.\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"
    },
    {
      "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"
    },
    {
      "commit": "6b0655a25194c7c0331154edaa6124cf783e5e5e",
      "tree": "c0c7d479f2684531249668210da27a60322ba395",
      "parents": [
        "fdb913aedb5a9807ad60715e8badb4f25d57acea"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed Jun 04 06:53:35 2014 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed Jun 04 06:58:02 2014 +0200"
      },
      "message": "*: nuke ^L (page feed)\n\nQuagga sources have inherited a slew of Page Feed (^L, \\xC) characters\nfrom ancient history.  Among other things, these break patchwork\u0027s\nXML-RPC API because \\xC is not a valid character in XML documents.\n\nNuke them from high orbit.\n\nPatches can be adapted simply by:\n\tsed -e \u0027s%^L%%\u0027 -i filename.patch\n(you can type page feeds in some environments with Ctrl-V Ctrl-L)\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "5eb9d11bf6bbe99ce47f929a14ac03351f21fe27",
      "tree": "79e72d2cace42a33b7c742c10319808b7837a36b",
      "parents": [
        "ab0f61552622084a13ede59adefc4c54b5513d7b"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "shemminger@vyatta.com",
        "time": "Thu Dec 10 15:52:33 2009 +0300"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Thu Dec 10 15:52:33 2009 +0300"
      },
      "message": "ripngd: compiler warnings cleanup\n\n* ripngd/ripng_interface.c\n  * ripng_check_max_mtu(): unused, sayonara\n  * ripng_interface_down(): cast flag arguments to logging function\n  * ripng_interface_add(): idem\n  * ripng_interface_delete(): idem\n* ripngd/ripngd.c\n  * ripng_recv_packet(): avoid aliasing warning dereferencing pointer\n"
    },
    {
      "commit": "30d205909c5a81cc306b161c16abff0fd7f566a7",
      "tree": "6f7532a4336cf601bbeab07d2669639a05409dfd",
      "parents": [
        "d023aec49f70156d2ed894a8fba65bcfa221ff02"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "shemminger@vyatta.com",
        "time": "Tue Jul 28 11:58:51 2009 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue Jul 28 11:58:51 2009 +0100"
      },
      "message": "[global] interface flags format warnings\n\n*/*: ifp-\u003eflags is 64 bit unsigned which can not be handled by %l on 32\n     bit architectures - requires %ll and the appropriate cast.\n"
    },
    {
      "commit": "7fc626de5f618133ad2a478d13defa3a110b89ea",
      "tree": "432ff0e4672eabc2ec6b0dcffc22dcc0aee532c8",
      "parents": [
        "66e5cd87194ae6fdd51061a91b4698bc0a652f6b"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "stephen.hemminger@vyatta.com",
        "time": "Mon Dec 01 11:10:34 2008 -0800"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Jun 12 17:10:29 2009 +0100"
      },
      "message": "[cleanup] Make command nodes static\n\nThe cmd_nodes used to configure vty, can mostly be static so\n(basic data hiding 101).\n"
    },
    {
      "commit": "6ac29a51075def99217a4ab1015635db3b3e83ed",
      "tree": "1152b55eb3a2099c67a0ba8e62d7e41f07e00135",
      "parents": [
        "1423c809cc4ddc2e013ba6264c49a11e5719c6f2"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Fri Aug 15 13:45:30 2008 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Aug 22 19:52:58 2008 +0100"
      },
      "message": "[trivia] finish off static\u0027ification of ospf6d and ripngd\n\n2008-08-15 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* {ospf6d,ripngd}/*: Finish job of marking functions as static, or\n\t  exporting declarations for them, to quell warning noise with\n\t  Quagga\u0027s GCC default high-level of warning flags. Thus allowing\n\t  remaining, more useful warnings to be more easily seen.\n"
    },
    {
      "commit": "995b96515b7075fec77ab51dfe8be7788abd838d",
      "tree": "9b1c6f590868955c37fe7e9c9ad64cad441f1404",
      "parents": [
        "f371b1fb2bd0c615d44653d56a26df8f7245481d"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Thu May 11 13:20:47 2006 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Thu May 11 13:20:47 2006 +0000"
      },
      "message": "[ripngd] CID #72, remove unneeded NULL check\n\n2006-05-11 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* ripng_interface.c: (ripng_interface_address_add) Remove\n\t  unneeded NULL check, Coverity CID #72.\n"
    },
    {
      "commit": "3a2ce6a14e3e302c3fdca2ff99143cfd06b145e6",
      "tree": "f27ec1418be4c3e9a123e67ef22ca090bca28906",
      "parents": [
        "528bed4a9a997216ba95e3ae445efa79436cc551"
      ],
      "author": {
        "name": "hasso",
        "email": "hasso",
        "time": "Fri Apr 08 01:30:51 2005 +0000"
      },
      "committer": {
        "name": "hasso",
        "email": "hasso",
        "time": "Fri Apr 08 01:30:51 2005 +0000"
      },
      "message": "\t* prefix.[hc]: Pass argument to the inet6_ntoa by value making it more\n\t  inet_ntoa alike.\n\t* ripngd.[hc], ripng_interface.c, ripng_peer.c: inet6_ntoa() takes\n\t  argument now by value.\n"
    },
    {
      "commit": "1eb8ef2584833f18fb674e127d59cb5a7f771482",
      "tree": "f5b09d4781de9a9b08839fefb6530e64d2d2ec31",
      "parents": [
        "5920990fecba7e2430af3cfaa8bcbaed40d0ba1a"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Thu Apr 07 07:30:20 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Thu Apr 07 07:30:20 2005 +0000"
      },
      "message": "2005-04-07 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* (global): Fix up list loops to match changes in lib/linklist,\n\t  and some basic auditing of usage.\n\t* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES\n\t* HACKING: Add notes about deprecating interfaces and commands.\n\t* lib/linklist.h: Add usage comments.\n\t  Rename getdata macro to listgetdata.\n\t  Rename nextnode to listnextnode and fix its odd behaviour to be\n\t  less dangerous.\n\t  Make listgetdata macro assert node is not null, NULL list entries\n          should be bug condition.\n          ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use\n          with for loop, Suggested by Jim Carlson of Sun.\n          Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the\n          \"safety\" of previous macro.\n\t  LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to\n\t  distinguish from the similarly named functions, and reflect their\n\t  effect better.\n\t  Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section\n\t  with the old defines which were modified above,\n\t  for backwards compatibility - guarded to prevent Quagga using it..\n\t* lib/linklist.c: fix up for linklist.h changes.\n\t* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single\n\t  scan of the area list, rather than scanning all areas first for\n\t  INTER_ROUTER and then again for INTER_NETWORK. According to\n\t  16.2, the scan should be area specific anyway, and further\n\t  ospf6d does not seem to implement 16.3 anyway.\n"
    },
    {
      "commit": "5920990fecba7e2430af3cfaa8bcbaed40d0ba1a",
      "tree": "d91dd49e4ed2c03cd0c007660232716f11172a56",
      "parents": [
        "6a52470660000bb6ddba971dc5c40b3422ab49bc"
      ],
      "author": {
        "name": "hasso",
        "email": "hasso",
        "time": "Tue Apr 05 14:36:49 2005 +0000"
      },
      "committer": {
        "name": "hasso",
        "email": "hasso",
        "time": "Tue Apr 05 14:36:49 2005 +0000"
      },
      "message": "\t* lib/prefix.[hc]: inet6_ntoa utility function copied from\n\t  ripngd/ripngd.c (inet6_ntop).\n\t* ripngd.[hc]: Remove inet6_ntop() and any usage of it. inet6_ntoa()\n\t  from lib is used now.\n\t* ripng_interface.c: inet6_ntop() -\u003e inet6_ntoa().\n\t* ripng_peer.c: inet6_ntop() -\u003e inet6_ntoa().\n"
    },
    {
      "commit": "d2fc88962a9a494ecb34167871bb9e7273a25d33",
      "tree": "304a1c1a744972bc10b1f677a134907c404b361d",
      "parents": [
        "386e61502d391adb985ac1487825349ec85e6a8c"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Sat Apr 02 18:38:43 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Sat Apr 02 18:38:43 2005 +0000"
      },
      "message": "2005-04-02 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\tFix problems when netlink interfaces are renamed (same ifindex used\n\tfor a new interface).  Start cleaning up some problems with the way\n\tinterface names are handled.\n\t* interface.c: (if_new_intern_ifindex) Remove obsolete function.\n\t  (if_delete_update) After distributing the interface deletion message,\n\t  set ifp-\u003eifindex to IFINDEX_INTERNAL.\n\t  (if_dump_vty) Detect pseudo interface by checking if ifp-\u003eifindex is\n\t  IFINDEX_INTERNAL.\n\t  (zebra_interface) Check return code from interface_cmd.func.\n\t  Do not set internal ifindex values to if_new_intern_ifindex(),\n\t  since we now use IFINDEX_INTERNAL for all pseudo interfaces.\n\t* kernel_socket.c: (ifm_read) Fix code and comments to reflect that\n\t  all internal interfaces now have ifp-\u003eifindex set to IFINDEX_INTERNAL.\n        * rt_netlink.c: (set_ifindex) New function used to update ifp-\u003eifindex.\n\t  Detects interface rename events by checking if that ifindex is already\n\t  being used.  If it is, delete the old interface before assigning\n\t  the ifindex to the new interface.\n\t  (netlink_interface, netlink_link_change) Call set_ifindex to update\n\t  the ifindex.\n\t* if.h: Remove define for IFINDEX_INTERNBASE and add define\n\t  IFINDEX_INTERNAL 0, since all internal (i.e. non-kernel) pseudo-\n\t  interfaces should have ifindex set to 0.\n\t  (if_new) Remove function.\n\t  (if_delete_retain) New function to delete an interface without\n\t  removing from iflist and freeing the structure.\n\t  (ifname2ifindex) New function.\n\t* if.c: (if_new) Remove function (absorb into if_create).\n\t  (if_create) Replace function if_new with call to calloc.\n\t  Set ifp-\u003eifindex to IFINDEX_INTERNAL.  Fix off-by-one error\n\t  in assert to check length of interface name.  Add error message\n\t  if interface with this name already exists.\n\t  (if_delete_retain) New function to delete an interface without\n\t  removing from iflist and freeing the structure.\n\t  (if_delete) Implement with help of if_delete_retain.\n\t  (ifindex2ifname) Reimplement using if_lookup_by_index.\n\t  (ifname2ifindex) New function to complement ifindex2ifname.\n\t  (interface) The interface command should check the name length\n\t  and fail with a warning message if it is too long.\n\t  (no_interface) Fix spelling in warning message.\n\t  (if_nametoindex) Reimplement using if_lookup_by_name.\n\t  (if_indextoname, ifaddr_ipv4_lookup) Reimplement using\n\t  if_lookup_by_index.\n\t* bgp_zebra.c: (bgp_interface_delete) After deleting, set ifp-\u003eifindex\n\t  to IFINDEX_INTERNAL.\n\t* isis_zebra.c: (isis_zebra_if_del) Call if_delete_retain instead\n\t  of if_delete, since it is generally not safe to remove interface\n\t  structures.  After deleting, set ifp-\u003eifindex to IFINDEX_INTERNAL.\n\t  (zebra_interface_if_lookup) Tighten up code.\n\t* ospf6_zebra.c: (ospf6_zebra_if_del) Previously, this whole function\n\t  was commented out.  But this is not safe: we should at least update\n\t  the ifindex when the interface is deleted.  So the new version\n\t  updates the interface status and sets ifp-\u003eifindex to\n\t  IFINDEX_INTERNAL.\n\t  (ospf6_zebra_route_update) Use if_indextoname properly.\n\t* ospf_vty.c: (show_ip_ospf_interface_sub) Show ifindex and interface\n\t  flags to help with debugging.\n\t* ospf_zebra.c: (ospf_interface_delete) After deleting, set ifp-\u003eifindex\n\t  to IFINDEX_INTERNAL.\n\t  (zebra_interface_if_lookup) Make function static.  Tighten up code.\n\t* rip_interface.c: (rip_interface_delete) After deleting, set\n\t  ifp-\u003eifindex to IFINDEX_INTERNAL.\n\t* ripng_interface.c: (ripng_interface_delete) After deleting, set\n\t  ifp-\u003eifindex to IFINDEX_INTERNAL.\n"
    },
    {
      "commit": "55468c86040081320f557b696e509b76ddfd6c83",
      "tree": "3ee726f155f8776d4a220997681d14c0b09addd0",
      "parents": [
        "909a215508fd42473fcbe4f5292a59404e5473af"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Mon Mar 14 20:19:01 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Mon Mar 14 20:19:01 2005 +0000"
      },
      "message": "2005-03-14 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* (global) update all c files to match the lib/vector.h rename of\n\t  (struct vector).active to max, and vector_max macro to\n\t  vector_active.\n\t* lib/vector.h: Rename to (struct vector).max to slightly less\n\t  confusing active, for the number of active slots, distinct from\n\t  allocated or active-and-not-empty. Rename vector_max to\n\t  vector_active for same reason.\n"
    },
    {
      "commit": "656b4eeec1fb30402ad2001976c05c6f44fafb34",
      "tree": "6455936be51648bd711d9caf25af49acdc35e604",
      "parents": [
        "798534576c2525476141628ac14ecc83fd775a5a"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Sun Jan 30 18:08:12 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Sun Jan 30 18:08:12 2005 +0000"
      },
      "message": "2005-01-30 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* ripng_interface.c: (ripng_multicast_join) Save errno before calling\n\t  ripngd_privs.change.\n"
    },
    {
      "commit": "2e23ab2e41c299bd8d070183bb1c31628ab582f9",
      "tree": "a75ae3080585b2832deb209cb5d97dc5f27becaa",
      "parents": [
        "5d6c37798317cece827dca7f4b539fa0387b5eb9"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Wed Dec 08 19:46:50 2004 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Wed Dec 08 19:46:50 2004 +0000"
      },
      "message": "2004-12-08 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* *.c: Change level of debug messages to LOG_DEBUG.\n"
    },
    {
      "commit": "6099b3b56956322567323c11fd698b2328c6826b",
      "tree": "fa537bd0eaa9f7d824f39445eabc928db59050ca",
      "parents": [
        "ae5e24d8678f1e3a60dde58d3382c5ba73d6bb27"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Sat Nov 20 02:06:59 2004 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Sat Nov 20 02:06:59 2004 +0000"
      },
      "message": "2004-11-19 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* global: Replace strerror with safe_strerror.  And vtysh/vtysh.c\n\t  needs to include \"log.h\" to pick up the declaration.\n"
    },
    {
      "commit": "98b718a9d2aa7a3324c553944e26914fe090b87a",
      "tree": "13a7002a3265a2debfa411a2a2c544dbde972f0a",
      "parents": [
        "a149411b85bbe74cde47d82193026b9401b29de0"
      ],
      "author": {
        "name": "hasso",
        "email": "hasso",
        "time": "Mon Oct 11 12:57:57 2004 +0000"
      },
      "committer": {
        "name": "hasso",
        "email": "hasso",
        "time": "Mon Oct 11 12:57:57 2004 +0000"
      },
      "message": "Sync with changes in lib. Make more strings const.\n"
    },
    {
      "commit": "7a1d583c02253c53605f310d1afcc9f1c8e15b7b",
      "tree": "38652398c60620d195bb6b74f97ad4770af559e5",
      "parents": [
        "27a43a81004b620e571f71aa1ea4db182c607862"
      ],
      "author": {
        "name": "hasso",
        "email": "hasso",
        "time": "Fri Oct 08 06:32:23 2004 +0000"
      },
      "committer": {
        "name": "hasso",
        "email": "hasso",
        "time": "Fri Oct 08 06:32:23 2004 +0000"
      },
      "message": "Only warning left is the known lvalue problem in ripng_nexthop.c.\n"
    },
    {
      "commit": "52dc7ee65f8d887b0730abc0a5d44d27fc6ecafd",
      "tree": "a557339540c56dd3953c29a50ca0e48c1911efc8",
      "parents": [
        "44983cf8a9c587dfbcad294b9dfe4dccbb68ba98"
      ],
      "author": {
        "name": "hasso",
        "email": "hasso",
        "time": "Thu Sep 23 19:18:23 2004 +0000"
      },
      "committer": {
        "name": "hasso",
        "email": "hasso",
        "time": "Thu Sep 23 19:18:23 2004 +0000"
      },
      "message": "Remove usage of evil list and listnode typedefs.\n"
    },
    {
      "commit": "1203e1c07c444df615605168c72852389e20340c",
      "tree": "2b00b78fe71fc2840837c0ffdb1c308192ceedf4",
      "parents": [
        "b219dea8d67b58db58755f94ea7cb44aa9774f0d"
      ],
      "author": {
        "name": "hasso",
        "email": "hasso",
        "time": "Fri Jul 23 21:34:27 2004 +0000"
      },
      "committer": {
        "name": "hasso",
        "email": "hasso",
        "time": "Fri Jul 23 21:34:27 2004 +0000"
      },
      "message": "Use ifp-\u003emtu6 in ospf6d and ripngd.\n"
    },
    {
      "commit": "4d4653afe362d6ea549c6e21b27afe01fb8b8aac",
      "tree": "933f0445306c6a6c5904485e4991bc208de6e407",
      "parents": [
        "79683de8c645ca46395280049f240cfbe71f9e35"
      ],
      "author": {
        "name": "gdt",
        "email": "gdt",
        "time": "Thu Jul 01 19:26:33 2004 +0000"
      },
      "committer": {
        "name": "gdt",
        "email": "gdt",
        "time": "Thu Jul 01 19:26:33 2004 +0000"
      },
      "message": "2004-07-01  Greg Troxel  \u003cgdt@fnord.ir.bbn.com\u003e\n\n        * ripng_interface.c (ripng_multicast_join): Use privs to do join,\n        to work around bug on gif(4) on NetBSD 1.6.2.\n"
    },
    {
      "commit": "0a5893596774554f039222c481d235de0f35d99e",
      "tree": "065ba74422d21193637d6e3f8b52c0eaa09a13bf",
      "parents": [
        "225282994d74f767058886475d80fee95d450eae"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Sat May 08 11:48:26 2004 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Sat May 08 11:48:26 2004 +0000"
      },
      "message": "2004-05-08 Paul Jakma \u003cpaul@dishone.st\u003e\n\n       * bgp_zebra.c: (bgp_interface_address_add) sync to zclient changes\n         (bgp_interface_address_delete) ditto.\n         (bgp_zebra_announce) ditto.\n         (bgp_zebra_withdraw) ditto.\n       * isis_zebra.c: Sync with zclient changes.\n       * zclient.c (zapi_ipv4_route) Follow Sowmini\u0027s lead and describe\n         message format.\n       * ospf6_zebra.c: Sync to zclient changes\n       * ospf_zebra.c: Sync with lib/zclient changes\n       * rip_zebra.c: sync with zclient changes.\n       * rip_interface.c: ditto.\n       * ripng_{interface,zebra}.c: sync with zclient changes\n\n\n2004-05-08 Sowmini Varadhan \u003csowmini.varadhan@sun.com\u003e\n\n       * zclient.c: (zapi_ipv4_add) collapsed into zapi_ipv4_route\n         (zapi_ipv4_delete) ditto.\n         (zapi_ipv4_route) add/delete a route by way of cmd arg.\n         (zapi_ipv6_add) collapsed into zapi_ipv6_route.\n         (zapi_ipv6_delete) ditto.\n         (zapi_ipv6_route) add/delete a route by way of cmd arg.\n         (zebra_interface_address_delete_read) collapsed into\n         zebra_interface_address_read.\n         (zebra_interface_address_delete_read) ditto.\n         (zebra_interface_address_read) read address add/delete messages\n         by way of type argument. Describe command message format.\n         (zebra_interface_add_read) Unconditionally read new ifmtu6 field.\n         Describe command message format.\n         (zebra_interface_state_read) Unconditionally read new ifmtu6 field.\n         (zclient_redistribute_set) Collapsed into zclient_redistribute\n         (zclient_redistribute_unset) ditto\n         (zclient_redistribute) set/unset redistribution.\n         (zclient_redistribute_default_set) Collapsed into\n         zclient_redistribute_default.\n         (zclient_redistribute_default_unset) ditto.\n         (zclient_redistribute_default) Redistribute default set/unset.\n       * zclient.h: delete zapi_ipv{4,6}_add, zapi_ipv{4,6}_delete. Add\n         zapi_ipv{4,6}_route. delete zclient_redistribute_set/unset. Add\n         zclient_redistribute. Ditto for\n         zclient_redistribute_default_{set/unset}.\n"
    },
    {
      "commit": "ddf1c26ca3cfd31ed11a40909bdadc6b823f0697",
      "tree": "e536e458dc628c11a50a756020a2c99d2d6e2533",
      "parents": [
        "efc1e725778b55917962092ee9d0f735c9ef54dc"
      ],
      "author": {
        "name": "gdt",
        "email": "gdt",
        "time": "Sun Jan 04 01:02:55 2004 +0000"
      },
      "committer": {
        "name": "gdt",
        "email": "gdt",
        "time": "Sun Jan 04 01:02:55 2004 +0000"
      },
      "message": "Really ripngd should either leave groups on down interfaces, or keep\ntrack of on which interfaces joins have occurred.  This is complicated\nby the possible lack of a clear behavior spec on whether interfaces\nkeep their joined group lists across a down/up/down transition.  (On\nNetBSD, they do.)\n\n2004-01-03  Greg Troxel  \u003cgdt@ahi.ir.bbn.com\u003e\n\n        * ripng_interface.c (ripng_multicast_join): If IPV6_JOIN_GROUP\n        returns EADDRINUSE, consider the join successful.  This happens\n        when an interface goes down and comes back because\n        ripng_multicast_leave does not invoke the LEAVE_GROUP operation if\n        the interface is down.  Solves problem of ripng stopping working\n        on an interface which goes down and then comes back up (on NetBSD).\n"
    },
    {
      "commit": "a94434b69197e074569d7579126074e9cb7212a5",
      "tree": "b63c34ee20e8e6b57796ee591d4569407140047d",
      "parents": [
        "dd55f9eb73347cb2bb7f8dc0f8108b21a733c9b4"
      ],
      "author": {
        "name": "hasso",
        "email": "hasso",
        "time": "Sun May 25 17:10:12 2003 +0000"
      },
      "committer": {
        "name": "hasso",
        "email": "hasso",
        "time": "Sun May 25 17:10:12 2003 +0000"
      },
      "message": "Ripngd part of 6Wind patch.\n"
    },
    {
      "commit": "32d2463ca26529ad4700af6d5748f927e1305694",
      "tree": "9f8dc5d94e1fb11a86585864e45401f552ecf2dd",
      "parents": [
        "7515cffe5e11fdfbc437c02b7af8b0f7b4d36fce"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Fri May 23 09:25:20 2003 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Fri May 23 09:25:20 2003 +0000"
      },
      "message": "From: Hasso Tepper \u003chasso@estpak.ee\u003e\n\nAdd the \u0027no interface\u0027 command to all the daemons and vtysh. now it\u0027s\npossible to delete interface from routeing daemons as well only if it\ndoesn\u0027t exist in os.\n\nhttp://hasso.linux.ee/zebra/ht-no_interface_fix.patch\n"
    },
    {
      "commit": "7515cffe5e11fdfbc437c02b7af8b0f7b4d36fce",
      "tree": "9acbaf0a01080920f25cf1107465a7f79ee7e2f8",
      "parents": [
        "1921e6f8965701040fe1b4f27619b2d7f3fec254"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Fri May 23 09:21:46 2003 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Fri May 23 09:21:46 2003 +0000"
      },
      "message": "Undo Hasso last patch, about to apply a slightly updated patch.\n"
    },
    {
      "commit": "68f43848fa0f8ac16c768bafb8891495dcf232ae",
      "tree": "8121fe0ee7c19001dd3c37c798e8368681a59493",
      "parents": [
        "8d6b00e4f34dfb6f627b49713bf80b0745b50abc"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Fri May 23 06:58:44 2003 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Fri May 23 06:58:44 2003 +0000"
      },
      "message": "From: Hasso Tepper \u003chasso@estpak.ee\u003e\n\nhttp://hasso.linux.ee/zebra/ht-no_interface-23052003.patch\n\nAdd the \u0027no interface\u0027 command to all the daemons and vtysh.\n"
    },
    {
      "commit": "718e3744195351130f4ce7dbe0613f4b3e23df93",
      "tree": "bac2ad39971cd43f31241ef123bd4e470f695ac9",
      "parents": [],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Dec 13 20:15:29 2002 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Dec 13 20:15:29 2002 +0000"
      },
      "message": "Initial revision\n"
    }
  ]
}
