)]}'
{
  "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": "758fb8f99a7bfac3d31c419fd1a5694fc5f33f6a",
      "tree": "4aa860a2b96ec03622376bf3753840155ab478fe",
      "parents": [
        "d6cf5134c05a7890738411852d9357ee5bb322f3"
      ],
      "author": {
        "name": "Feng Lu",
        "email": "lu.feng@6wind.com",
        "time": "Thu Jul 03 18:23:09 2014 +0800"
      },
      "committer": {
        "name": "Nicolas Dichtel",
        "email": "nicolas.dichtel@6wind.com",
        "time": "Wed Jun 03 10:23:32 2015 +0200"
      },
      "message": "zebra, lib/memtypes.c: the netlink sockets work per VRF\n\nThis patch lets the netlink sockets work per VRF.\n\n* The definition of \"struct nlsock\" is moved into zebra/rib.h.\n\n* The previous global variables \"netlink\" and \"netlink_cmd\" now\n  become the members of \"struct zebra_vrf\", and are initialized\n  in zebra_vrf_alloc().\n\n* All relative functions now work for a specific VRF, by adding\n  a new parameter which specifies the working VRF, except those\n  functions in which the VRF ID can be obtained from the interface.\n\n* kernel_init(), interface_list() and route_read() are now also\n  working per VRF, and moved from main() to zebra_vrf_enable().\n\n* A new function kernel_terminate() is added to release the\n  netlink sockets. It is called from zebra_vrf_disable().\n\n* Correct VRF ID, instead of the previous VRF_DEFAULT, are now\n  passed to the functions of processing interfaces or route\n  entries.\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": "ac19a449261bf69e83827f4bb0c6e5526277b41b",
      "tree": "a93cc7cde55a9c0c65da4b09fc309b503807ffda",
      "parents": [
        "7aaf4ea990398335bd40b56cc9586ab6a7178a4f"
      ],
      "author": {
        "name": "Feng Lu",
        "email": "lu.feng@6wind.com",
        "time": "Fri May 22 11:40:07 2015 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Jun 02 07:48:34 2015 +0200"
      },
      "message": "zebra: maintain the router-id per VRF\n\nA router may need different identifier among the VRFs. So move the\nmaintenance of router-id per VRF.\n\n* rib.h:\n\n  Move the previous global variables in router-id.c into the\n  \"struct zebra_vrf\":\n  - struct list _rid_all_sorted_list/*rid_all_sorted_list\n  - struct list _rid_lo_sorted_list/*rid_lo_sorted_list\n  - struct prefix rid_user_assigned\n\n* router-id.c/router-id.h:\n\n  A new parameter \"vrf_id\" is added to all the router-id APIs.\n  Their operations are done only within the specified VRF.\n\n  A new command \"router-id A.B.C.D vrf N\" is added to allow\n  manual router-id for any VRF.\n\n  The old router_id_init() function is splitted into two:\n  - router_id_cmd_init(): it only installs the commands\n  - router_id_init(): this new one initializes the variables for\n                      a specified VRF\n\n* zebra_rib.c: Add new functions zebra_vrf_get/lookup() called\n               from router-id.c.\n\n* main.c: Replace router_id_init() with router_id_cmd_init() and\n          call the new router_id_init() in zebra_vrf_new().\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": "9665856e3718e42068e7d897f5e2468e77fb8c17",
      "tree": "264cd6e05ee23bcf46d1ce42c38ffa228b5035f1",
      "parents": [
        "fa4094ac49b4cc23589f5c5b7e608c4b4ee6ca04"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@diac24.net",
        "time": "Fri Apr 20 17:23:39 2012 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@diac24.net",
        "time": "Fri Apr 20 17:29:31 2012 +0200"
      },
      "message": "Revert \"zebra: clean up client routes when client goes away\"\n\nThis reverts commit af56d404cd56d94ad3b2ec3f159650eb72baef0a,\nwhich was accidentally duplicating functionality from commit\n2ea1ab1 \"zebra: ZEBRA_HELLO and mopping up routes (BZ#448)\"\n\nConflicts:\n\n\tzebra/zebra_rib.c\n\nSigned-off-by: David Lamparter \u003cequinox@diac24.net\u003e\n"
    },
    {
      "commit": "14d2bbaa3f4aa53152472694c29f336808e47313",
      "tree": "e39bdddef4ea53207dd8fb61e1fd6b54d8c7721d",
      "parents": [
        "51d4ef832c1e58150325630e25c442866e5a6cf5",
        "e96b312150d8e376c1ef463793d1929eca3618d5"
      ],
      "author": {
        "name": "Avneesh Sachdev",
        "email": "avneesh@opensourcerouting.org",
        "time": "Wed Apr 11 23:51:08 2012 -0700"
      },
      "committer": {
        "name": "Avneesh Sachdev",
        "email": "avneesh@opensourcerouting.org",
        "time": "Wed Apr 11 23:51:08 2012 -0700"
      },
      "message": "Merge quagga mainline into the google ISIS code.\n\nThe steps were:\n\n  $ git checkout google-is-is\n  $ git merge quagga\n  $ git checkout google-is-is -- isisd\n\n  # Resolve conflicts in the following:\n  lib/md5.h\n  zebra/rt_netlink.c\n  zebra/zebra_rib.c\n  zebra/zserv.c\n\nNote that the content in the isisd directory is left unchanged in the\nmerge. As a result, changes made to isisd as part of the following\ncommits on the quagga mainline are dropped.\n\n  # 8ced4e82 is the merge base, e96b3121 is the current quagga master\n  $ git log --oneline --reverse 8ced4e82..e96b3121 -- isisd\n  5574999 isisd: fix crash on \"no router isis\" (BZ#536)\n  8998075 isisd: raise hello rate for DIS (BZ#539)\n  306ca83 isisd: include hash.h, not hash.c\n  b82cdeb delete CVS keywords\n  2f65867 isisd: indent longopts array\n  b511468 quagga: option \"-z\" (\"--socket \u003cpath\u003e\") added\n  05e54ee build: delete .cvsignore files\n  b4e45f6 fix zebra protocol after MP-BGP changes\n  7fd6cd8 isisd: fix circuit state machine\n  907fd95 isisd: send proper LSP after DIS election\n  d034aa0 isisd: fix wrong next-hops from SPF\n  c25eaff isisd: unexpected kernel routing table (BZ#544)\n  e6b03b7 isisd: implement MD5 circuit authentication\n"
    },
    {
      "commit": "af56d404cd56d94ad3b2ec3f159650eb72baef0a",
      "tree": "2d923b385dd21a5f0ced95d2430b4c998af18f94",
      "parents": [
        "fc328ac9d3d49b871c1139f36deb702a254c0d4f"
      ],
      "author": {
        "name": "Josh Bailey",
        "email": "joshb@google.com",
        "time": "Wed Mar 21 18:47:51 2012 -0700"
      },
      "committer": {
        "name": "Avneesh Sachdev",
        "email": "avneesh@opensourcerouting.org",
        "time": "Sun Apr 08 00:28:50 2012 -0700"
      },
      "message": "zebra: clean up client routes when client goes away\n\n  * zebra/zebra_rib.c: Add code to clean up routes added by a client\n    (as identfied by \u0027rib type\u0027).\n\n  * zebra/zserv.[ch]: Maintain the type of the routes added by a\n    client on the \u0027zserv\u0027 structure -- assume that a given client uses\n    a single route type for now.\n\n    Clean up routes from a client when the client goes away (in\n    zebra_client_close()).\n\nFrom: Josh Bailey \u003cjoshb@google.com\u003e\nSigned-off-by: Avneesh Sachdev \u003cavneesh@opensourcerouting.org\u003e\nSigned-off-by: David Lamparter \u003cequinox@diac24.net\u003e\n"
    },
    {
      "commit": "b51146856e660bcec723f535c17dc1c38b2f6efc",
      "tree": "8f501c98b3714e1d5ed381bd4d82fece4106aa8c",
      "parents": [
        "2f658673fa477b58ed38caf94c156c95948de382"
      ],
      "author": {
        "name": "Vyacheslav Trushkin",
        "email": "me@dogonthesun.net",
        "time": "Fri Nov 25 18:51:48 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Tue Dec 13 14:26:28 2011 +0400"
      },
      "message": "quagga: option \"-z\" (\"--socket \u003cpath\u003e\") added\n\nAll daemons modified to support custom path to zserv\nsocket.\n\nlib: generalize a zclient connection\n\nzclient_socket_connect added. zclient_socket and\nzclient_socket_un were hidden under static expression.\n\"zclient_serv_path_set\" modified.\n"
    },
    {
      "commit": "97be79f9d38b07214d5ad9b437e1a852c594a985",
      "tree": "dbc8513b7f58c4f603ea1eed87efe9dbf4d7897e",
      "parents": [
        "5b40b1b57e1fad1caf579e032adf4e111128e486"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "pilot@etcnet.org",
        "time": "Fri Jul 24 20:45:31 2009 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "pilot@etcnet.org",
        "time": "Fri Jul 24 20:45:31 2009 +0400"
      },
      "message": "[zebra] do not touch socket before pidfile locking\n\nMove zserv socket creation code into zebra_zserv_socket_init() and\ncall it only after pidfile lock has been acquired exclusively. This\nkeeps subsequent zebra daemons from deleting the working socket of\nan already running process (bug #403).\n"
    },
    {
      "commit": "e96f92034dad1a70c92ad4ad863a5259c122cecb",
      "tree": "c3b9bebef0fe2059182b31b43243289b5c7248e3",
      "parents": [
        "a15cfd16fcdec39588ce2f780671ba7c6de0b919"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "linux@pilot.org.ua",
        "time": "Mon Jun 02 12:03:22 2008 +0000"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "linux@pilot.org.ua",
        "time": "Mon Jun 02 12:03:22 2008 +0000"
      },
      "message": "+ initial edition of meta-queue for RIB updates processing (bug #431)\n"
    },
    {
      "commit": "96934e6ac6ec9ff6e67131cc8324741b771d5e0d",
      "tree": "7cb90f6a03e1b33e2e0045cc50185b16dfe00df8",
      "parents": [
        "91b7351d4e150bbc60786f0facb911fa2c598553"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "linux@pilot.org.ua",
        "time": "Fri Sep 14 14:56:28 2007 +0000"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "linux@pilot.org.ua",
        "time": "Fri Sep 14 14:56:28 2007 +0000"
      },
      "message": "+ sayonara old_pid!\n"
    },
    {
      "commit": "7514fb7739f74311830e9ddd1381d0d228224f61",
      "tree": "4d4b9a4fdfcea4cb6fa496085327f1aae9a9a380",
      "parents": [
        "5fa05099567bbe42aae87a9bef8fd630b3666a4d"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Wed May 02 16:05:35 2007 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Wed May 02 16:05:35 2007 +0000"
      },
      "message": "[zebra] Routemap support on received routes, with \u0027set src\u0027 command (linux)\n\n2007-05-01 David L Stevens \u003cdlstevens@us.ibm.com\u003e\n\n\t* (general) These changes collectively add route-map and\n\t  prefix-list support to zebra and fix a bug in \"show\n\t  route-map\" (with no argument).\n\t* doc/main.texi: added route-map, prefix-list, ip protocol\n\t  and set src documentation\n\t* lib/command.h: added PROTOCOL_NODE type\n\t* lib/log.c: (proto_name2num) new function, protocol name to\n\t  number translation.\n\t* lib/routemap.c: (vty_show_route_map) fixed \"show route-map\"\n\t  without route-map name\n\t* lib/routemap.h: added RMAP_ZEBRA type\n\t* lib/zebra.h: added proto_name2num() prototype\n\t* vtysh/extract.pl.in: added VTYSH_ZEBRA flag for route-map and\n\t  plist\n\t* vtysh/Makefile.am: added zebra_routemap.c\n\t* vtysh/vtysh.h: added VTYSH_ZEBRA flag to VTYSH_RMAP\n\t* zebra/connected.c: (connected_up_ipv4) added src preference argument\n\t  to rib_add_ipv4()\n\t* zebra/kernel_socket.c: (rtm_read) ditto\n\t* zebra/main.c: added prefix list initialization\n\t* zebra/Makefile.am: added zebra_routemap.c source file\n\t* zebra/rib.h: added generic address union \"g_addr\" and use in\n\t  existing places that had an explicit union.\n\t  Added \"src\" to struct nexthop.\n\t  Added preferred src arg to nexthop_ipv4_add and rib_add_ipv4.\n\t* zebra/rt_netlink.c: (netlink_routing_table) set preferred source on\n\t  netlink messages.\n\t  (netlink_route_change) ditto\n\t  (netlink_route_multipath) ditto.\n\t* zebra/rtread_getmsg.c: (handle_route_entry) added (NULL) src to\n\t  rib_add_ipv4() call.\n\t* zebra/rtread_proc.c: (proc_route_read) ditto\n\t* zebra/zebra_rib.c: (nexthop_ipv4_add) add src argument.\n\t  (nexthop_ipv4_ifindex_add) ditto\n\t  (rib_add_ipv4) ditto\n\t  (nexthop_active_check) Add route-map processing.\n\t* zebra/zebra_routemap.c: new file for zebra route-map commands.\n\t* zebra/zebra_vty.c: (ip_protocol_cmd) Apply route-map to protocol\n\t  (vty_show_ip_route_detail) added \"src\" printing\n\t  (vty_show_ip_route) ditto\n\t  (show_ip_protocol_cmd) new command, list routemaps.\n\t  (config_write_protocol) write out routemap protocl config.\n\t  (zebra_vty_init) Install the new routemap protocol commands.\n\t* zebra/zserv.c: (zread_ipv4_add) added (NULL) src arg\n\t  (zebra_init) init zebra route-maps.\n\t* zebra/zserv.h: add zebra_route_map_init\n"
    },
    {
      "commit": "ec1a428343cad343969d569c56acbe6b02ab8f4f",
      "tree": "ed693dcea011eccbef34113da3e340ec1290e7b3",
      "parents": [
        "b6026073584b855d47a8e2033d2aa3413a3394e9"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Thu Nov 24 15:15:17 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Thu Nov 24 15:15:17 2005 +0000"
      },
      "message": "[zebra] Fix mistake in previous commit and further compile warnings/errors.\n\n2005-11-24 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* kernel_socket.h: New header for functions exported to sysctl\n\t  methods.\n\t* kernel_socket.c: include previous.\n\t  Remove static qualifier from couple of functions which are\n\t  used by sysctl methods, incorrectly added in previous commit.\n\t  Add a workaround for a bogus gcc warning to the RTA_ macros.\n\t* Makefile.am: Add kernel_socket.h to noinst_HEADERS\n\t* if_sysctl.c: include rt.h and kernel_socket.h and remove\n\t  redundant prototypes.\n\t* rtread_sysctl.c: ditto.\n\t  (route_read) fix mismatch of return values.\n\t* {rt,zserv,rib}.h: Include lib headers depended on.\n"
    },
    {
      "commit": "6eb8827d669b06d7b38357860d23fa33e0c0078e",
      "tree": "bab69ac40c857fd6a6e7b447166df7e9ae08989d",
      "parents": [
        "7907c6c9d34a4f19dd7d4d8d81c3c8ae5000ee07"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Jul 29 14:36:00 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Jul 29 14:36:00 2005 +0000"
      },
      "message": "2005-07-29 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* interface.c: (if_delete_update) should always be available, not\n\t  just on RTM_IFANNOUNCE/NETLINK systems.\n\t* kernel_socket.c: (ifan_read) only call if_delete_update when\n\t  interface departs, dont if_delete, because we wish to retain\n\t  interface configuration state even when interfaces are removed.\n\t  (ifm_read) If we dont have RTM_IFANNOUNCE, then transitioning\n\t  to down state is only chance we have to clean up interface in case\n\t  it is deleted (eg Solaris down -\u003e unplumb -\u003e plumb up).\n\t* redistribute.c: (zebra_interface_delete_update) should always be\n\t  available, we /will/ call it now on all systems, via\n\t  if_delete_update.\n\t* zserv.c: (zsend_interface_delete) ditto\n\t  (zsend_interface_address) Update the call-flow diagramme, to\n\t  reflect that if_delete_update /is/ now called on all systems,\n\t  potentially.\n\t* zserv.h: (zsend_interface_delete) unconditionally exported, as\n\t  above.\n"
    },
    {
      "commit": "a1ac18c4d5b4f8f4f279efb2ae12b46258f22282",
      "tree": "e37732ef4b00ae98d1be693e721b01cc2566ba39",
      "parents": [
        "94f2b3923e9663d0355a829f22e4e31cf68ee7b8"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Tue Jun 28 17:17:12 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Tue Jun 28 17:17:12 2005 +0000"
      },
      "message": "2005-06-28 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* (global) Extern and static\u0027ification, with related fixups\n\t  of declarations, ensuring files include their own headers, etc.\n\t  if_ioctl.c: (interface_info_ioctl) fix obvious arg mis-order in\n\t  list loop\n"
    },
    {
      "commit": "69e10adaf28d4e116c38db2648786557fe131828",
      "tree": "4e00214ef16ba68f9d9b6a3fa8ff5c66a1a54d93",
      "parents": [
        "8cc4198f9fabe5f10f5a773de1503d82f33a01fb"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Fri May 06 21:27:33 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Fri May 06 21:27:33 2005 +0000"
      },
      "message": "2005-05-06 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* zserv.h: Remove ZEBRA_PORT definition, its in lib/zebra.h now\n"
    },
    {
      "commit": "4d38fdb421ee04430ac2f4d4e8ef4a4e27c1020b",
      "tree": "a7bdb41cd18be9f612c54531efef5a5ccaab36f1",
      "parents": [
        "8b70d0b04f6bba2f30827d71084dd74fd00808b3"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Thu Apr 28 17:35:14 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Thu Apr 28 17:35:14 2005 +0000"
      },
      "message": "2005-04-28 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* rib.h: (struct rib) Add lock field for refcounting.\n\t* zserv.h: (struct zebra_t) Add a ribq workqueue to the zebra\n\t  \u0027master\u0027 struct.\n\t* zserv.c: (zread_ipv4_add) XMALLOC then memset should be XCALLOC.\n\t* zebra_rib.c: Clean up refcounting of route_node, make struct rib\n\t  refcounted and convert rib_process to work-queue. In general,\n\t  rib\u0027s should be rib_addnode\u0027d and delnode\u0027d to route_nodes, and\n\t  these symmetrical functions will manage the locking of referenced\n\t  route_node and freeing of struct rib - rather than having users\n\t  manage each seperately - with much scope for bugs..\n\t  (newrib_free) removed and replaced with rib_lock\n\t  (rib_lock) new function, check state of lock and increment.\n\t  (rib_unlock) new function, check lock state and decrement. Free\n\t  struct rib if refcount hits 0, freeing struct nexthop\u0027s, as\n\t  newrib_free did.\n\t  (rib_addnode) Add RIB to route_node, locking both.\n\t  (rib_delnode) Delete RIB from route_node, unlocking each.\n\t  (rib_process) Converted to a work-queue work function.\n\t  Functional changes are minimal, just arguments, comments and\n\t  whitespace.\n\t  (rib_queue_add_qnode) Helper function to setup a ribq item.\n\t  (rib_queue_add) Helper function, same arguments as old\n\t  rib_process, to replace in callers of rib_process.\n\t  (rib_queue_qnode_del) ribq deconstructor.\n\t  (rib_queue_init) Create the ribq.\n\t  (rib_init) call rib_queue_init.\n\t  (remainder) Sanitise refcounting of route_node\u0027s. Convert to\n\t  rib_queue_add, rib_addnode and rib_delnode. Change XMALLOC/memset\n\t  to XCALLOC. Remove calls to nexthop_delete and nexthop_free.\n"
    },
    {
      "commit": "719e97414a7ca1a4d49d72816b9e1bd2155d157d",
      "tree": "6c3d4456e89d1a837322566eee065e492b325e6c",
      "parents": [
        "27da3988c30c333cd75cffc5565682366bb99513"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Mon Feb 28 20:52:15 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Mon Feb 28 20:52:15 2005 +0000"
      },
      "message": "2005-02-28 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* zserv.c: Must include network.h and buffer.h for non-blocking I/O.\n\t  Remove global message_queue and t_write (need separate buffering for\n\t  each client).\n\t  (zebra_server_dequeue,zebra_server_enqueue) Remove functions\n\t  related to old buggy buffering code.\n\t  (zserv_delayed_close) New thread callback function to delete a client.\n\t  (zserv_flush_data) New thread callback function to flush buffered\n\t  data to client.\n\t  (zebra_server_send_message) Rewritten to use buffer_write (so\n\t  buffering of writes and non-blocking I/O work properly).\n\t  (zsend_interface_add,zsend_interface_delete,zsend_interface_address,\n\t  zsend_interface_update) Return 0 instead of -1 if !client-\u003eifinfo\n\t  (this is not really an error).  Return value from\n\t  zebra_server_send_message.\n\t  (zsend_route_multipath,zsend_ipv4_nexthop_lookup,\n\t  zsend_ipv4_import_lookup) Return value from zebra_server_send_message.\n\t  (zsend_ipv6_nexthop_lookup) Fix scope to static, and return value\n\t  from zebra_server_send_message.\n\t  (zsend_router_id_update) Must use zebra_server_send_message instead\n\t  of deprecated writen function.  Return 0 instead of -1 if this client\n\t  is not subscribed to router-id updates (since this is not really\n\t  an error).\n\t  (zread_interface_add) Change type to static int.  If\n\t  zsend_interface_add fails or zsend_interface_address fails, return -1\n\t  immediately (since the client has had an I/O error).\n\t  (zread_interface_delete,zread_ipv4_add,zread_ipv4_delete,\n\t  zread_ipv6_add,zread_ipv6_delete,zread_router_id_delete) Return 0\n\t  to indicate success.\n\t  (zread_ipv4_nexthop_lookup) Return value from\n\t  zsend_ipv4_nexthop_lookup.\n\t  (zread_ipv4_import_lookup) Return value from zsend_ipv4_import_lookup.\n\t  (zebra_read_ipv6) Remove unused function.\n\t  (zread_ipv6_nexthop_lookup) Return value from\n\t  zsend_ipv6_nexthop_lookup.\n\t  (zread_router_id_add) Return value from zsend_router_id_update.\n\t  (zebra_client_close) Call buffer_free(client-\u003ewb) and\n\t  thread_cancel(client-\u003et_suicide).\n\t  (zebra_client_create) Allocate client-\u003ewb using buffer_new.\n\t  (zebra_client_read) Support non-blocking I/O by using stream_read_try.\n\t  Use ZEBRA_HEADER_SIZE instead of 3.\n\t  (zebra_accept) Fix bug: reset accept thread at top.  Make client\n\t  socket non-blocking using the set_nonblocking function.\n\t  (config_write_forwarding) Fix scope to static.\n\t  (zebra_init) Remove initialization code for old buggy write buffering.\n\t* zserv.h: Add 2 new fields to struct zserv: struct buffer *wb\n\t  (to enable buffered writes with non-blocking I/), and\n\t  struct thread *t_suicide to support delayed close on I/O\n\t  errors.\n\t* router-id.h: Remove prototypes for zread_router_id_add and\n\t  zread_router_id_delete (their scope should be static to zserv.c).\n"
    },
    {
      "commit": "18a6dce6f83dd20caf1f36c8e840868ff0bf6dbd",
      "tree": "ff832cbf6fe2b239bde06268820587bec671ae6d",
      "parents": [
        "a49c0ff6771975eeb1bd7da923a9dc830200cf65"
      ],
      "author": {
        "name": "hasso",
        "email": "hasso",
        "time": "Sun Oct 03 18:18:34 2004 +0000"
      },
      "committer": {
        "name": "hasso",
        "email": "hasso",
        "time": "Sun Oct 03 18:18:34 2004 +0000"
      },
      "message": "Common router id.\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": "5b73a671aac22a75cc90657aa4a924d199f2284b",
      "tree": "8716d34430c239cb994ba286db18efb24eb09319",
      "parents": [
        "1470bafb7aa179dad7dc4bdc998d68c14752f824"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Jul 23 15:26:14 2004 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Jul 23 15:26:14 2004 +0000"
      },
      "message": "2004-07-23 Sowmini Varadhan \u003cSowmini.Varadhan@Sun.COM\u003e\n\n        * if_ioctl_solaris.c: HAVE_IPV6 ifdef fixups\n        * zserv.c: ditto\n        * ioctl_solaris.c: ditto.\n        * interface.c: cast for LLADDR\n        * interface.h: Add guards, include redistribute.h and remove\n          extraneous definitions of zebra_interface_{up,down}_update\n        * ioctl.h: Add AF_IOCTL define for non SOLARIS_IPV6\n        * redistribute.h: include dependent header, zserv.h\n        * zserv.h: include dependent header, rib.h\n"
    },
    {
      "commit": "b9df2d25fc8d06ca63fa792d162d97656361338b",
      "tree": "53ec5975f608983b5cb95ee38ca112934db5e609",
      "parents": [
        "0a5893596774554f039222c481d235de0f35d99e"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Sun May 09 09:09:59 2004 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Sun May 09 09:09:59 2004 +0000"
      },
      "message": "2004-05-09 Paul Jakma \u003cpaul@dishone.st\u003e\n\n\t* zserv.c: (zsend_route_multipath) Set the nexthop_num\n\t  field correctly. Add NEXTHOP_TYPE_IPV6_IFNAME for v6.\n\t  Conditionally set ZAPI_MESSAGE_METRIC flag - only for adds.\n\t  (zsend_ipv4_add) cruft, deleted.\n\t  (zsend_ipv4_delete) ditto.\n\t  (zsend_ipv6_add) ditto.\n\t  (zsend_ipv6_delete) ditto.\n\n2004-05-09 Sowmini Varadhan \u003csowmini.varadhan@sun.com\u003e\n\n\t* zserv.c: (zsend_ipv{4,6}_{add,delete}_multipath) collapsed\n\t  into single zsend_route_multipath function.\n\t  (zsend_interface_{up,down}) collapsed into zsend_interface_update.\n\t  (zsend_interface_address_{add,delete}) collapsed into\n\t  zsend_interface_address.\n\t  (zsend_interface_add) send mtu6.\n\t  (zsend_interface_delete) ditto.\n\t  (zebra_write) remove unused function.\n\t  (various) Apply static qualifier. Add comments.\n\t* zserv.h: Definitions changed as per above.\n\t* redistribute.c: Changes as per zserv.c.\n"
    },
    {
      "commit": "b21b19c5785487f2ff4a6ce38f45c2e6c35f4363",
      "tree": "c79f90ce7bd798b3f1391010153d9fdf7c7418f0",
      "parents": [
        "0e4f190ebf5a26e4b66fb49cd74ae0ff0c7e0863"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Sun Jun 15 01:28:29 2003 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Sun Jun 15 01:28:29 2003 +0000"
      },
      "message": "2003-06-15 Paul Jakma \u003cpaul@dishone.st\u003e\n\n\t* lib/vty.{c,h}: Remove vty layer depending on a \u0027master\u0027 global,\n\t  pass the thread master in explicitly to vty_init. Sort out some\n\t  header dependency problems with lib/command.h\n\t* zebra/: Move globals to struct zebrad. Update vty_init().\n\t* (.*)/\\1_main.c: update call to vty_init().\n"
    },
    {
      "commit": "726f9b2bbdd5a607f7b0a10a64547739b807e361",
      "tree": "9c46a6ce71cf4ea96553a85a231e38b462b3dee0",
      "parents": [
        "71c0fb50fe75928f8fbe1bbff1995d9d91b3702b"
      ],
      "author": {
        "name": "hasso",
        "email": "hasso",
        "time": "Sun May 25 21:04:54 2003 +0000"
      },
      "committer": {
        "name": "hasso",
        "email": "hasso",
        "time": "Sun May 25 21:04:54 2003 +0000"
      },
      "message": "Last fixes from 6Wind patch.\n"
    },
    {
      "commit": "23bd12c31d701376d45ab45aa8c838e9fb5e409c",
      "tree": "d8d6b789194b372dcf067bc1bc5169f0ff284e8d",
      "parents": [
        "3a6440d756863b602cfaaf0259b71950e67b2a6e"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Mon Apr 07 06:11:09 2003 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Mon Apr 07 06:11:09 2003 +0000"
      },
      "message": "[zebra 18626] move zebra socket paths to configure.ac\n\nmoved definition of the various socket paths from the\nper daemon header files into configure.ac. it will set the paths to\nbe in the directory specified by --localstatedir\u003d\u003cprefix\u003e or\notherwise will try to guess as best it can ( a la pid file path\ndetection - which probably should try reference ${prefix} too).\n\nthe present hardcoded socket path, /tmp, isnt really correct. should\nbe in /var somewhere really.\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"
    }
  ]
}
