)]}'
{
  "log": [
    {
      "commit": "f452d5409a5eb275ee4d5dd24e67461231dc425a",
      "tree": "85a23917cf04a9a30d936fb5ae2daa5e3cb13679",
      "parents": [
        "d023f9ffae4b040335d12c1aa7409a9a15b7a3ac"
      ],
      "author": {
        "name": "Jim Carroll",
        "email": "jim@carroll.com",
        "time": "Fri Jan 27 16:08:59 2017 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue Feb 07 11:53:26 2017 +0000"
      },
      "message": "ripd: Fix restriction on default RTE that\u0027s incompatible with CIDR\n\n* ripd.c: (rip_response_process) A 0 address can still easily have a\n  non-zero netmask.  E.g., 0/1 to complement 128/1.  These should be allowed\n  through. See bug #903.\n\n  Modify to check for malformed pseudo-default routes, where the netmask is\n  0 but the address is non-0, and warn and drop such routes instead.\n"
    },
    {
      "commit": "b174a58467d155b8609f1b5a1f6e27f22afdb81c",
      "tree": "68352a6b3fc37427690708937cccfbfd337d4a55",
      "parents": [
        "5bc62ca9561fa01a989e386cbf6e71cbdef77a3c"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@jakma.org",
        "time": "Mon Jan 23 10:55:26 2017 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 23 18:51:58 2017 +0000"
      },
      "message": "ripd: Fix GCC6 warning on misleading indentation\n"
    },
    {
      "commit": "2bbacea824300be05f46094a4d156cb12c0dca13",
      "tree": "2e0e1b3ef91215068ea89eba2ba4a409bd151b42",
      "parents": [
        "7ae2b609875756663e0a7d677609d04baa04b613"
      ],
      "author": {
        "name": "Christian Franke",
        "email": "chris@opensourcerouting.org",
        "time": "Sat Oct 01 21:43:17 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 23 18:51:56 2017 +0000"
      },
      "message": "ripd: add support for route tags\n"
    },
    {
      "commit": "ddc160cce1767ef006a812f5213cabfb24e3cd4d",
      "tree": "6e4aa078fb897d77edcb7ef16282471c518440b4",
      "parents": [
        "5958b8f790f0049f980b74b3e2916979850e5d09"
      ],
      "author": {
        "name": "Christian Franke",
        "email": "chris@opensourcerouting.org",
        "time": "Sat Oct 01 20:42:34 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 23 18:51:56 2017 +0000"
      },
      "message": "*: Port Christians tweaks for 32-bit route tags\n\nPort over Christian\u0027s tweaks from his port of my commit widening the\nroute-tag field width to 32-bit.  Commit dc9ffce8786844\n \"*: Consistently support 32-bit route tags\".\n\nwith \"changes which make this actually useful for all the daemons\".\n\nThis is missing the zebra route-map changes.\n"
    },
    {
      "commit": "93ad10e27beebb0416cf33d2f0acf96425064a48",
      "tree": "37439c2626b6fea2eded6943a65ecafa1aac0300",
      "parents": [
        "d1da1e9d18f46d80da4e91fdabafb03fa4272a01"
      ],
      "author": {
        "name": "Christian Franke",
        "email": "nobody@nowhere.ws",
        "time": "Tue Jun 14 20:07:08 2016 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 23 18:51:55 2017 +0000"
      },
      "message": "ripd: print md5 auth digest correctly\n\nThe dump of the md5 hash was missing one byte of the hash.\n\nSigned-off-by: Christian Franke \u003cchris@opensourcerouting.org\u003e\nSigned-off-by: Christian Franke \u003cchris@opensourcerouting.org\u003e\nAcked-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "c7f25b90902d4be39132b1174440746b571220ce",
      "tree": "b66ca69885ba36884b09473700f08cc3909cfea3",
      "parents": [
        "f2eb9caac6425473af8d6d15534439fe715f7426"
      ],
      "author": {
        "name": "Daniel Walton",
        "email": "dwalton@cumulusnetworks.com",
        "time": "Tue May 19 17:47:22 2015 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Oct 04 13:07:50 2016 +0100"
      },
      "message": "bgpd, ospfd, ospf6d, ripd, ripngd, zebra: \u0027set metric -12\u0027 is broken in the parser\n\nSigned-off-by: Daniel Walton \u003cdwalton@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "96d1060a704d88e04fcd446cce078a6131c3f6db",
      "tree": "89a6f1285550a2d2f149479cc272450e63294ebc",
      "parents": [
        "3b4fb574b414e7b7776b581688f189f2fc736a38"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Jul 01 14:23:45 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Oct 04 13:07:50 2016 +0100"
      },
      "message": "*: Widen width of Zserv routing tag field.\n\n* lib/zebra.h: Introduce a route_tag_t type for route tags generally,\n  and make it 4 bytes wide - so it can directly hold things like an ASN, or\n  the OSPF ASE-LSA tag.\n* zebra/rib.h: Use route_tag_t instead of u_short.\n* *: Update \u0027u_short (*)?(tag|tmp)\u0027 to use route_tag_t instead of u_short.\n  Update stream_{get,put} to l instead of w.\n* ospf_zebra.c: (ospf_zebra_add) test OSPF tag within range of ROUTE_TAG_MAX.\n"
    },
    {
      "commit": "3b4fb574b414e7b7776b581688f189f2fc736a38",
      "tree": "1ee9f627cef3a59b8e21f0a476a75ca4db43b883",
      "parents": [
        "fb214471c88616d67ece3734128ef04ed4a8ed86"
      ],
      "author": {
        "name": "Piotr Chytła",
        "email": "pch@packetconsulting.pl",
        "time": "Tue Dec 01 10:16:02 2015 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Oct 04 13:07:49 2016 +0100"
      },
      "message": "ripd, ripngd: add support for route tags\n\n[Forward ported by Cumulus]\n\nDocumentation\n-------------\nAll ipv4 and ipv6 static route commands now have a \"tag\" option\nwhich allows the user to set a tag between 1 and 65535.\n\nquagga(config)# ip route 1.1.1.1/32 10.1.1.1 tag ?\n  \u003c1-65535\u003e  Tag value\nquagga(config)# ip route 1.1.1.1/32 10.1.1.1 tag 40\nquagga(config)#\n\nquagga# show ip route 1.1.1.1/32\nRouting entry for 1.1.1.1/32\n  Known via \"static\", distance 1, metric 0, tag 40, best\n  * 10.1.1.1, via swp1\n\nquagga#\n\nThe route-map parser supports matching on tags and setting tags\n!\nroute-map MATCH_TAG_18 permit 10\n  match tag 18\n!\n\n!\nroute-map SET_TAG_22 permit 10\n  set tag 22\n!\n\nBGP and OSPF support:\n- matching on tags when redistribing routes from the RIB into BGP/OSPF.\n- setting tags when redistribing routes from the RIB into BGP/OSPF.\n\nBGP also supports setting a tag via a table-map, when installing BGP\nroutes into the RIB.\n\nSigned-off-by: Daniel Walton \u003cdwalton@cumulusnetworks.com\u003e\nSigned-off-by: Piotr Chytla \u003cpch@packetconsulting.pl\u003e\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "62f936e7960a7c08f4ae42ad43726d8d6e8e949d",
      "tree": "53dbbf703d51c38e0bf41cc979434b32c3b5d430",
      "parents": [
        "92992c69afd0095b183a3b905598d194115b27a7"
      ],
      "author": {
        "name": "Daniel Walton",
        "email": "dwalton@cumulusnetworks.com",
        "time": "Mon Nov 09 20:21:59 2015 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:45 2016 +0100"
      },
      "message": "ospf6d, ripd, vtysh: Fix \"no set metric\" for ospf6 and RIP\n\nAllow the user to actually turn off the set metric command\nin ospf6d and rip.\n\nSigned-off-by: Daniel Walton \u003cdwalton@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "68b45cc592d5d61e748e8d99ec9f84e63aa73213",
      "tree": "eb1008834813757b86e5f4bc439e7b2b3188adbf",
      "parents": [
        "b9ac2f320922542e0320ceeced4aa7264564e98a"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Fri Mar 11 14:27:13 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jul 20 12:58:33 2016 +0100"
      },
      "message": "*: Consolidate all double VIEW_NODE and ENABLE_NODE\u0027s\n\nIf a command is put into the VIEW_NODE, it is going into the\nENABLE_NODE as well.  This is especially true for show commands.\nAs such if a command is in both consolidate it down to VIEW_NODE.\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "df2ef24fb73c83a6e733be9eb8cac3e0df8467f8",
      "tree": "0d208e09a57754656de13c222d321ed8a8c47b05",
      "parents": [
        "543e791be9257e60d4d02abd0cdac7337a31636a"
      ],
      "author": {
        "name": "Matthieu Boutier",
        "email": "boutier@pps.univ-paris-diderot.fr",
        "time": "Wed Sep 10 16:50:45 2014 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jul 20 12:58:31 2016 +0100"
      },
      "message": "lib: Make distribute.c accepts both v4 and v6.\n\ndistribute.c doesn\u0027t allow to manage both v4 and v6 distribute lists.  This\npatch fix this problem by having 4 DISTRIBUTE* values in the enumeration instead\nof two. The code in all daemons using distribute.c is adapted.\n"
    },
    {
      "commit": "fafa899b4e84c7b9fd07b076517744d9351aaa6b",
      "tree": "bc6f6e0d4f60df5cb3eb41695f490ef62b570608",
      "parents": [
        "2074d6752d1dafcd6511677e2bdc9bbe0b73c388"
      ],
      "author": {
        "name": "Matthieu Boutier",
        "email": "boutier@pps.univ-paris-diderot.fr",
        "time": "Wed Sep 10 16:50:43 2014 +0200"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jul 20 12:58:30 2016 +0100"
      },
      "message": "ripd: code simplification for redistribution.\n\nUse loops and variables instead of doing each cases by hand.\nUse boolean instead of having 2 almost identical functions.\n"
    },
    {
      "commit": "d319a3abbf6e6c310b6b6a6891ebe1957592f9a9",
      "tree": "44c54674d263c78032cd217a57a12350882a380d",
      "parents": [
        "86b2a0a12ace817e64e8e4a719b1ba9a8e6af253"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@jakma.org",
        "time": "Wed May 25 14:47:00 2016 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jul 20 12:58:29 2016 +0100"
      },
      "message": "ripd: split-horizon default differed between rip_interface_new and _reset\n\n* rip_interface.c: Default for split_horizon_default differed between\n  rip_interface_new and rip_interface_reset, causing at least some issues\n  after interface events. See patchwork #604. Fix, and consolidate code.\n\n  (rip_interface_{reset,clean}) rename these to \u0027interface\u0027, as that\u0027s more\n  appropriate.  Spin the ri specific bodies of these functions out to\n  rip_interface_{reset,clean} helpers.  Factor out the overlaps, so\n  rip_interface_reset uses rip_interface_clean.\n\n  (rip_interface_new) just use rip_interface_reset.\n\n* ripd.h: Update for (rip_interface_{reset,clean})\n\nReported by xufeng zhang, with a suggested fix on which this commit expands.\nSee patchwork #604.  This commit addresses only the split-horizon\ndiscrepency, issue #2.  The other issue they reported, #1, is not addressed,\nthough suggested fix seems inappropriate.\n\nCc: xufeng.zhang@windriver.com\n"
    },
    {
      "commit": "7e7a101dde5969f62074801d84bb4cc75e50f548",
      "tree": "ac1ba465edce3956ba12ef87f1f3dd7c60be9322",
      "parents": [
        "e7207098c0fa88af6899c1b1483e3ddb19f5336a"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Fri Apr 08 22:03:22 2016 -0400"
      },
      "committer": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Fri Apr 22 08:35:33 2016 -0400"
      },
      "message": "ripd: Fix Null pointer dereference\n\nThe rip_output_process function dereferenced a NULL\npointer.  Core file examination showed that tmp_rinfo\nwas NULL on line 2435.  Looking at the last diff\nassociated with this commit, it was obvious that\na formating mistake had been made in the loop over\nthe route nodes list of possible paths.\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\nReported-by: Sebastian Kricner \u003csebastian.kricner@tuxwave.net\u003e\nTested-by: NetDEF CI System \u003ccisystem@netdef.org\u003e\n"
    },
    {
      "commit": "5e57b5fc621300427d3818f0723b8cd8d5e5ca6a",
      "tree": "738345e0c3121f329266e8b8faaa88661e7cdb2e",
      "parents": [
        "e3f623be8b6556db9d70c2fc5d3c2b152f36dc1d"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Fri Mar 11 16:28:34 2016 -0500"
      },
      "committer": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Fri Mar 11 18:29:14 2016 -0500"
      },
      "message": "quagga: Remove double read of stream\n\nThe addition of a MIN(X,Y) with a stream_getc in the Y\ncauses a double read of the stream due to the way that\nMIN is defined.\n\nThis fix removes a crash in all protocols.\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "bf83fa25f1bddec6f09ad879cba5e975a3ae5495",
      "tree": "a01a0137a4193d2d33d61bb43c113afef3e421a6",
      "parents": [
        "2db962760426ddb9e266f9a4bc0b274584c819cc"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Feb 09 15:23:03 2016 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Mar 08 17:53:22 2016 +0000"
      },
      "message": "lib: Check prefix length from zebra is sensible\n\n* zclient.c: prefix length on router-id and interface address add\n  messages not sanity checked.  fix.\n\n* */*_zebra.c: Prefix length on zebra route read was not checked, and\n  clients use it to write to storage.  An evil zebra could overflow\n  client structures by sending overly long prefixlen.\n\nPrompted by discussions with:\n\nDonald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "9099f9b2a66e86f8a90d7fe18f61bd2bb1bc6744",
      "tree": "1ce5d2e4ecff6b57eb00d40b1a91b3f363ff35fe",
      "parents": [
        "954c7d6bcd04c2cf037965adda0f9d11afdcd165"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Mon Jan 18 10:12:10 2016 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Fri Feb 26 14:11:46 2016 +0000"
      },
      "message": "*: use an ifindex_t type, defined in lib/if.h, for ifindex values\n"
    },
    {
      "commit": "1ca8d40f996c0760a1a8931f54044dd7ca9e3f9c",
      "tree": "df3274ac9d9d3731894cd5123eb8118ff6a7d8f5",
      "parents": [
        "c1900e09a7fdd70437f3ba0329868f1eee3f5a1a"
      ],
      "author": {
        "name": "Christian Franke",
        "email": "chris@opensourcerouting.org",
        "time": "Tue Nov 10 17:45:03 2015 +0100"
      },
      "committer": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Tue Dec 08 14:12:10 2015 -0500"
      },
      "message": "ripd, isisd: fix warnings that make the build fail\n\nThese issues have been found by running buildtest.sh\nusing GCC 5.2.0 and Clang 3.7.0\n\nFixes pointer checks that can never be null\n\nSigned-off-by: Christian Franke \u003cchris@opensourcerouting.org\u003e\nTested-by: NetDEF CI System \u003ccisystem@netdef.org\u003e\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "26a18eb223d26011ac4f1d608f6775ed7ebf8efb",
      "tree": "116460f0d57e4e0e7f2cfa20ea6a9b30be19a16f",
      "parents": [
        "d8aa4beab72cdd2c2d78f9e624fd4b704eec488f"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Tue Sep 29 09:25:10 2015 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue Oct 27 10:53:21 2015 +0000"
      },
      "message": "quagga: Additional centos 6 -enable-werror fixes\n\nThis commit fixes these warnings:\n\n1) bgpd/bgp_nexthop.c - dereferencing pointer \u0027X\u0027 does break strict-aliasing rules\n2) pimd/pim_igmp_join.c - dereferencing pointer \u0027X\u0027 does break strict-aliasing rules\n3) ripd/ripd.c - \u0027ifaddr.prefixlen\u0027 may be used uninitialized in this function\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "7125293d65d73a451ec203c8c1630c236171f5a3",
      "tree": "f9d118c9a8f8374d69fb9c75c87531a2ca478fb2",
      "parents": [
        "fd1c1a133af47ae5533a5ed41b73ff62e7aa1058"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Thu Sep 24 09:25:19 2015 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue Oct 27 10:53:21 2015 +0000"
      },
      "message": "lib: zclient.c remove extern struct thread_master *\n\nzclient.c depended upon link time inclusion of a\nextern struct thread_master *master.  This is a violation of the\nnamespace of the calling daemon.  If a library needs the pointer\npass it in and save it for future use.\n\nThis code change also makes the zclient code consistent with\nthe other lib functions that need to schedule work on your behalf\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "52c0bc739b1184621525e64720b944268d6b0eeb",
      "tree": "a556a51ef56f6ccaa63c942c9880c684fc4b3bae",
      "parents": [
        "c8ee940cc695cbcf9c0156ee6f72730f1fff9814"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@jakma.org",
        "time": "Thu Aug 20 21:30:17 2015 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Thu Sep 03 16:44:48 2015 +0100"
      },
      "message": "build: Remove the old PIC/PIE patch, let libtool sort it out\n\n* Remove the old change from \u002708 to add in PIE arguments at automake level.\n  Versions of libtool since then know how to deal with -fpie and do the right\n  thing according to whether its building shared or executable objects.\n  So just pass \u0027-fpie\u0027 as CFLAG and let libtool do its thing.\n"
    },
    {
      "commit": "f31bab4fbf367a4417784ba9873e524d42242036",
      "tree": "c624feca43613e738e4756ad6b3b555c1402e465",
      "parents": [
        "771626860adfc30c00f70d993ccb8f4d7c0c0c63"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Fri Jun 19 19:26:19 2015 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sun Jun 21 14:39:26 2015 +0100"
      },
      "message": "Quagga: Fix code to use srandom/random\n\nQuagga was using a mix of srand/rand and srandom/random.\nConsolidate to use srandom/random which are the POSIX\nversions of random number generators\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "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": "c0bedebfe9ca1a1ded02f1f481762dd41defa63e",
      "tree": "9c040f71733fb7509c03457bc146373e65e95536",
      "parents": [
        "3a7e83c2387885075c9ecf1912dd6c9399c6947a"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Mar 03 10:00:43 2015 +0100"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Apr 21 10:19:33 2015 +0200"
      },
      "message": "build: add --enable-werror\n\nThis allows enabling -Werror in a consistent way.  Note that this is\ndifferent from just specifiying it in CFLAGS, since that would either\nbreak configure tests (if done on ./configure), or would override\nconfigure\u0027s CFLAGS (if done on make).\n\nUsing --enable-werror instead provides a new WERROR variable that is\nadditionally used during make with a consistent set of warning flags.\n\nThe tests/ directory is exempt.  (Rationale being, better to have more\ntests than pedantically complain about them.)\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "dfee58f1d41a2e36c7f5f38a3ef5712224131824",
      "tree": "10e588443180a85a6ac019db1ded6b1144f32a7c",
      "parents": [
        "6769f43de9d595b935f2ebf1cae1428e1d1a3a5f"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed Mar 04 06:44:57 2015 +0100"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Apr 21 10:19:10 2015 +0200"
      },
      "message": "snmp: fix warnings\n\nbatch-fix all warnings that come up when enabling AgentX SNMP support.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "237aac56960575f6ad2451ba2796d94bd5ae4b33",
      "tree": "f23c49fa32bc6b706bd5f37a9a3a45ce27adf15d",
      "parents": [
        "b6fa76098d127f5641a7dda0dee21f06ca167edb"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Sat Jun 28 22:23:10 2014 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Sat Feb 14 19:19:14 2015 +0100"
      },
      "message": "build: get rid of INCLUDES, use AM_CPPFLAGS\n\nINCLUDES in configure.ac was not used at all, and INCLUDES in\nMakefile.am is supposed to be AM_CPPFLAGS these days.\n\nReduces warnings spewed during bootstrap/autoreconf.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\nAcked-by: Greg Troxel \u003cgdt@ir.bbn.com\u003e\nAcked-by: Feng Lu \u003clu.feng@6wind.com\u003e\nAcked-by: Paul Jakma \u003cpaul@jakma.org\u003e\n"
    },
    {
      "commit": "88d37b902bc8127379d3293b9671aa6a11479c23",
      "tree": "33ff1c38d47bfb7f940d56c53727aa9db31ddb40",
      "parents": [
        "9511633e08ff15c23608983fdc1bc735d427332e"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "stephen@networkplumber.org",
        "time": "Mon Nov 03 01:20:09 2014 +0000"
      },
      "committer": {
        "name": "Vincent JARDIN",
        "email": "vincent.jardin@6wind.com",
        "time": "Mon Nov 03 06:51:10 2014 +0100"
      },
      "message": "make some structures constant.\n\nThese pre-initialized arrays are not modified.\n\nSigned-off-by: Stephen Hemminger \u003cstephen@networkplumber.org\u003e\nAcked-by: Feng Lu \u003clu.feng@6wind.com\u003e\n"
    },
    {
      "commit": "7aa9dcef80b2ce50ecaa77653d87c8b84e009c49",
      "tree": "bd4a8d881336a1551146725d7ae06b3e68553e4d",
      "parents": [
        "010ebbbca6396f272cc2d50d147dd922dda68213"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@opensourcerouting.org",
        "time": "Fri Sep 19 14:42:23 2014 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue Sep 23 16:32:34 2014 +0100"
      },
      "message": "Fix most compiler warnings in default GCC build.\n\nFix lots of warnings. Some const and type-pun breaks strict-aliasing\nwarnings left but much reduced.\n\n* bgp_advertise.h: (struct bgp_advertise_fifo) is functionally identical to\n  (struct fifo), so just use that.  Makes it clearer the beginning of\n  (struct bgp_advertise) is compatible with with (struct fifo), which seems\n  to be enough for gcc.\n  Add a BGP_ADV_FIFO_HEAD macro to contain the right cast to try shut up\n  type-punning breaks strict aliasing warnings.\n* bgp_packet.c: Use BGP_ADV_FIFO_HEAD.\n  (bgp_route_refresh_receive) fix an interesting logic error in\n  (!ok || (ret !\u003d BLAH)) where ret is only well-defined if ok.\n* bgp_vty.c: Peer commands should use bgp_vty_return to set their return.\n* jhash.{c,h}: Can take const on * args without adding issues \u0026 fix warnings.\n* libospf.h: LSA sequence numbers use the unsigned range of values, and\n  constants need to be set to unsigned, or it causes warnings in ospf6d.\n* md5.h: signedness of caddr_t is implementation specific, change to an\n  explicit (uint_8 *), fix sign/unsigned comparison warnings.\n* vty.c: (vty_log_fixed) const on level is well-intentioned, but not going\n  to fly given iov_base.\n* workqueue.c: ALL_LIST_ELEMENTS_RO tests for null pointer, which is always\n  true for address of static variable.  Correct but pointless warning in\n  this case, but use a 2nd pointer to shut it up.\n* ospf6_route.h: Add a comment about the use of (struct prefix) to stuff 2\n  different 32 bit IDs into in (struct ospf6_route), and the resulting\n  type-pun strict-alias breakage warnings this causes.  Need to use 2\n  different fields to fix that warning?\n\ngeneral:\n\n* remove unused variables, other than a few cases where they serve a\n  sufficiently useful documentary purpose (e.g.  for code that needs\n  fixing), or they\u0027re required dummies.  In those cases, try mark them as\n  unused.\n* Remove dead code that can\u0027t be reached.\n* Quite a few \u0027no ...\u0027 forms of vty commands take arguments, but do not\n  check the argument matches the command being negated.  E.g., should\n  \u0027distance X \u003cprefix\u003e\u0027 succeed if previously \u0027distance Y \u003cprefix\u003e\u0027 was set?\n  Or should it be required that the distance match the previously configured\n  distance for the prefix?\n  Ultimately, probably better to be strict about this.  However, changing\n  from slack to strict might expose problems in command aliases and tools.\n* Fix uninitialised use of variables.\n* Fix sign/unsigned comparison warnings by making signedness of types consistent.\n* Mark functions as static where their use is restricted to the same compilation\n  unit.\n* Add required headers\n* Move constants defined in headers into code.\n* remove dead, unused functions that have no debug purpose.\n"
    },
    {
      "commit": "0b74a0a5db7bcf65bf68c44b547b02b1310b5cdb",
      "tree": "d767a50f61d6dddaf145e8273e859fb29d74687f",
      "parents": [
        "b397cf4f0fc484c5ebfc8a680090055c8e6cbe32"
      ],
      "author": {
        "name": "Lu Feng",
        "email": "lu.feng@6wind.com",
        "time": "Fri Jul 18 06:13:19 2014 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Mon Sep 15 18:37:08 2014 +0200"
      },
      "message": "ripd: allow to enable/disable the ECMP feature\n\nIntroduce a new command \"[no] allow-ecmp\" to enable/disable the\nECMP feature in RIP. By default, ECMP is not allowed.\n\nOnce ECMP is disabled, only one route entry can exist in the list.\n\n* rip_zebra.c: adjust a debugging information, which shows the number\n               of nexthops according to whether ECMP is enabled.\n* ripd.c: rip_ecmp_add() will reject the new route if ECMP is not\n          allowed and some entry already exists.\n          A new configurable command \"allow-ecmp\" is added to control\n          whether ECMP is allowed.\n          When ECMP is disabled, rip_ecmp_disable() is called to\n          remove the multiple nexthops.\n* ripd.h: Add a new member \"ecmp\" to \"struct rip\", indicating whether\n          ECMP is allowed or not.\n\nSigned-off-by: Feng Lu \u003clu.feng@6wind.com\u003e\nReviewed-by: Alain Ritoux \u003calain.ritoux@6wind.com\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "b397cf4f0fc484c5ebfc8a680090055c8e6cbe32",
      "tree": "b1fe14811932e92ac87f7ddcad8660061b15cd51",
      "parents": [
        "1520e4748129c4eb97ac3090bcc97149a1900611"
      ],
      "author": {
        "name": "Lu Feng",
        "email": "lu.feng@6wind.com",
        "time": "Fri Jul 18 06:13:18 2014 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Mon Sep 15 18:36:54 2014 +0200"
      },
      "message": "ripd: 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  rip_rte_process(), rip_redistribute_add() and rip_timeout() are\n  significantly simplified.\n\n* rip_zebra_ipv4_add() and rip_zebra_ipv4_delete() now can share\n  the common code. The common part is moved to rip_zebra_ipv4_send().\n\nSigned-off-by: Feng Lu \u003clu.feng@6wind.com\u003e\nReviewed-by: Alain Ritoux \u003calain.ritoux@6wind.com\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "342a31bfda21616209366679ac522471e5772a2f",
      "tree": "359be93388f4efe5283b291f322c78c9e2389f0f",
      "parents": [
        "052573ee2319b21657a79e1b76a5c801701fa38c"
      ],
      "author": {
        "name": "Lu Feng",
        "email": "lu.feng@6wind.com",
        "time": "Wed Jun 25 07:43:15 2014 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed Jul 02 19:30:20 2014 +0200"
      },
      "message": "ripd: use only one constant for derivation\n\nRIP_MAX_RTE is defined in ripd.h as 25 but is in fact the\nresult of a formula. More over it is not used in the code:\nthe code itself includes the fomula. This makes it un-clear\nfor maintenance.\n\nSigned-off-by: Feng Lu \u003clu.feng@6wind.com\u003e\nReviewed-by: Alain Ritoux \u003calain.ritoux@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": "7b3b98ae3ecdad20cf5cebd2a6532aee17184d95",
      "tree": "e95cee3c81dec96641e6c7497f69faa3134a5085",
      "parents": [
        "224e7e515747b74dd6d3610570a64b9726a27722"
      ],
      "author": {
        "name": "Lu Feng",
        "email": "lu.feng@6wind.com",
        "time": "Mon Apr 14 08:09:29 2014 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Jun 03 15:32:11 2014 +0200"
      },
      "message": "ripd \u0026 ripngd: avoid the zero interface metric\n\nThe interface metric is initialized to 0 in the commit db19c85:\nzebra: set metric for directly connected routes via netlink to 0\n\nRipd and ripngd must be aware of it and avoid increase the\nroute metric by 0.\n\nSigned-off-by: Feng Lu \u003clu.feng@6wind.com\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "cd40b329a2e4da882bcad0431c048c876bbeafbd",
      "tree": "cfbdec5a7559c6d3e56766797896a18809aa1746",
      "parents": [
        "e712d0e3667ffad8109ef8bce3ce01927ee95bb7"
      ],
      "author": {
        "name": "Christian Franke",
        "email": "chris@opensourcerouting.org",
        "time": "Mon Sep 30 12:27:51 2013 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Apr 01 20:21:41 2014 +0200"
      },
      "message": "lib/command.c: rewrite command matching/parsing\n\nAdd support for keyword commands.\n\nIncludes new documentation for DEFUN() in lib/command.h, for preexisting\nfeatures as well as new keyword specification.\n\nSigned-off-by: Christian Franke \u003cchris@opensourcerouting.org\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "b68da446e977f8069fb72bce73402e2234ffc1d9",
      "tree": "6c310ad8fdccf588fcc2ad8b6f03a4602d1b2a13",
      "parents": [
        "8df55970b64984e5071afd510caad5e778569bc1"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu Feb 28 22:17:00 2013 +0100"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Apr 09 22:33:19 2013 +0200"
      },
      "message": "ripd: correctly redistribute ifindex routes (BZ#664)\n\nripd had a check to restrict metric 0 to only directly connected routes.\nThis check was implemented by checking against Connected as route type.\nThis is, however, incorrect -- all routes that directly use an interface\nwithout a nexthop should be treated as directly connected and passed off\nwith metric 0.\n\nripngd does not posess such a check and was not touched.\n\nReported-by: Sean Fulton \u003csean@gcnpublishing.com\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "837d16ccbe0fca413f8927da6a34b1e97ccada8a",
      "tree": "7aed5a517b619c03d11bf567f6a14cda6f8f5efe",
      "parents": [
        "655071f44aab42e89bcece3a93da456fdd0d913a"
      ],
      "author": {
        "name": "Balaji.G",
        "email": "balajig81@gmail.com",
        "time": "Wed Sep 26 14:09:10 2012 +0530"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Thu Oct 25 10:15:59 2012 -0700"
      },
      "message": "*: use array_size() helper macro\n\nUse the array_size() helper macro.  Replaces several instances of local\nmacros with the same definition.\n\nReviewed-by: Scott Feldman \u003csfeldma@cumulusnetworks.com\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "bb2315f2878da685fae094aece13409667d21f97",
      "tree": "b8625a91196bc54e4f4f253711c611bd9212e638",
      "parents": [
        "1b54f798d3cc359bec036db83c1c9bfab75d1244"
      ],
      "author": {
        "name": "Nick Hilliard",
        "email": "nick@inex.ie",
        "time": "Sat Aug 18 15:10:57 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Sep 25 06:03:46 2012 +0200"
      },
      "message": "ripd: clear sockaddr_in before using\n\nripd_create_socket() failed in bind() on Mac OS X 10.7 since there was garbage\nin unused fields of struct sockaddr_in.\n\n* ripd/ripd.c: zero out struct sockaddr_sin from before filling.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "8046ba6ec4d6e87bf8da6563c0f3e5e66c4652b3",
      "tree": "1b38b2eae4e1cee042f96a42217b14647159bf0f",
      "parents": [
        "0ff4b9c96793898429052de576d8da368e48997e"
      ],
      "author": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Thu May 31 13:30:28 2012 +0200"
      },
      "committer": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Mon Jun 25 19:03:23 2012 +0200"
      },
      "message": "snmp: let handlers accept OID from a lesser prefix\n\nMost table handlers do not expect to be given an OID whose prefix is\noutside what they can handle. This is not a problem with the SMUX\nimplementation since it always correct the OID such that the prefix\nmatches. However, this is not the case for the AgentX\nimplementation. A new function, smux_header_table() is used to do this\nnormalization.\n"
    },
    {
      "commit": "08d7f6533ecc0f935a76918c462982004534864d",
      "tree": "0e67590a8a2aba551439c46bfa8b33d7fba4feb7",
      "parents": [
        "6b1e37f8537fa2a4560de32e83ca5089763e2d39"
      ],
      "author": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Tue May 22 22:29:17 2012 +0200"
      },
      "committer": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Mon Jun 25 19:03:23 2012 +0200"
      },
      "message": "build: use net-snmp-config to configure NetSNMP\n\nThe correct method to link to NetSNMP is to use net-snmp-config (which\nis like pkg-config). Explicit link to libcrypto is also dropped\n(NetSNMP libs are linked to libcrypto, no need to link Quagga to\nit). Moreover, @SNMP_INCLUDES@ is dropped because useless. Due to a\nbug in configure.ac, it was properly populated.\n"
    },
    {
      "commit": "6b1e37f8537fa2a4560de32e83ca5089763e2d39",
      "tree": "941dfbfbe62981ec214ac1e5a3f607368f4bf1d4",
      "parents": [
        "9e7a548ce421660b0d22bfeb90c2b2b53742aac7"
      ],
      "author": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Tue May 22 22:15:20 2012 +0200"
      },
      "committer": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Mon Jun 25 19:03:23 2012 +0200"
      },
      "message": "build: only define HAVE_SNMP\n\nNetSNMP is the only SNMP implementation for Quagga. We don\u0027t need two\ndifferent symbols.\n"
    },
    {
      "commit": "9e7a548ce421660b0d22bfeb90c2b2b53742aac7",
      "tree": "4c962403808f98806781fb4ad15594152bc1effa",
      "parents": [
        "a47c5838e9f445ab887ad927706b11ccbb181364"
      ],
      "author": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Tue May 22 14:32:22 2012 +0200"
      },
      "committer": {
        "name": "Vincent Bernat",
        "email": "bernat@luffy.cx",
        "time": "Mon Jun 25 19:03:23 2012 +0200"
      },
      "message": "build: allow configure and build in a separate directory\n\nSome .h files in lib/ are autogenerated. The search path should\ninclude the build directory and the source directory. They usually\nmatch but sometimes, they may be different. For example:\n\n $ mkdir build\n $ cd build\n $ ../configure\n $ make\n"
    },
    {
      "commit": "9c58fbd7d7658055c2b3074489c6d338448d88e9",
      "tree": "a085d8bc6ca9e5f5bc4ed9c186f89a207c59e3f8",
      "parents": [
        "93079db65cbb678d7fb67f7dd871e24c12b86f09"
      ],
      "author": {
        "name": "Matthieu Boutier",
        "email": "boutier@pps.jussieu.fr",
        "time": "Thu Feb 09 21:51:17 2012 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sun Mar 25 17:06:54 2012 +0100"
      },
      "message": "ripd: add babel for redistribution.\n"
    },
    {
      "commit": "b4e45f67057be22133b6bec88cdf285d5c8214db",
      "tree": "80f775047efb255ef573b2e9d3affb1a7caeb6d1",
      "parents": [
        "6eac79a6fed4842e00607c00c445213b51bba377"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Mon Dec 05 16:35:14 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Mon Jan 23 14:31:42 2012 +0400"
      },
      "message": "fix zebra protocol after MP-BGP changes\n\nThe previous commits modified both zebra and bgpd for additional\nSAFI field, but not any other routing daemon, which led to zebra\ndaemon crashing with failed assertion.\n"
    },
    {
      "commit": "05e54ee3df973194f2a00e3ea0b1da7bebc71fd6",
      "tree": "c07e2bbad0c55fe03eb2975b98f121de6ae55707",
      "parents": [
        "ad8d4802a3078de694539fa9bae12322fc82042f"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Sat Dec 03 17:45:17 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Tue Dec 13 14:27:01 2011 +0400"
      },
      "message": "build: delete .cvsignore files\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": "69bf3a39931ce61a92fb04d8888b4655fd5620a2",
      "tree": "e49dae20b1dbc0d1ee37121cd45c75d94290bdd1",
      "parents": [
        "ea4021984f9eec3f2a85551ae0822e1dff0ed2bc"
      ],
      "author": {
        "name": "Dmitrij Tejblum",
        "email": "tejblum@yandex-team.ru",
        "time": "Thu Aug 18 20:22:17 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Tue Sep 27 21:37:35 2011 +0400"
      },
      "message": "lib: simplify interface of setsockopt_multicast_ipv4().\n\n* sockopt.[ch] (setsockopt_ipv4_multicast): ifindex is now mandatory (all\n  non-ancient OSes can use it anyway), and if_addr parameter (the address\n  of the interface) is now gone. (setsockopt_ipv4_multicast_if):\n  IP_MULTICAST_IF processing moved to this new function\n\n* ospf_network.c (ospf_if_add_allspfrouters, ospf_if_drop_allspfrouters,\n  ospf_if_add_alldrouters, ospf_if_drop_alldrouters, ospf_if_ipmulticast),\n  rip_interface.c (ipv4_multicast_join, ipv4_multicast_leave,\n  rip_interface_new): adapt to the new interface\n"
    },
    {
      "commit": "0fa0335316ce14a79ea4bbb0c40e1322c9941dd3",
      "tree": "10c01d97fd76b037fc8f8d321eb70d62ff6e29b5",
      "parents": [
        "6e22b9017e1ae2ce61c383b1b2b63973207704ac"
      ],
      "author": {
        "name": "Andrew J. Schorr",
        "email": "ajschorr@alumni.princeton.edu",
        "time": "Thu Feb 24 13:52:14 2011 +0300"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Thu Feb 24 13:52:14 2011 +0300"
      },
      "message": "ripd: resolve debug statements issue (bug 442)\n\n...A nasty bug, if you forgot to disable debugging, stored the config\nand reboot your machine - if you really depend on ripd, then the machine\nwill not fully come back on the network, because ripd fails.\n"
    },
    {
      "commit": "2c2397059d4d4177ed4636c08aa476a138425dc8",
      "tree": "c32e11332baa9b1ff9efed4f8b363f9118bdc964",
      "parents": [
        "e580216e1ba2db506d1942e382852d07973a5fad"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "shemminger@vyatta.com",
        "time": "Thu Dec 10 19:16:05 2009 +0300"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Thu Dec 10 19:16:05 2009 +0300"
      },
      "message": "ripd: fix compiler warnings\n\n* ripd/rip_interface.c\n  * rip_request_neighbor(): comment out, unused\n  * rip_request_neighbor_all(): idem\n  * rip_interface_up(): Cast flags otherwise compiler complains\n    about %lld not matching uint64_t on 64 bit x86. Print in hex\n    since flags are bit field.\n  * rip_interface_add(): idem\n  * rip_interface_delete(): idem\n* ripd/rip_zebra.c\n  * rip_redistribute_set(): comment out, unused\n* ripd/ripd.h\n  * rip_redistribute_check(): move prototype here so compiler\n    can check function against prototype\n* ripd/ripd.c\n  * rip_update_default_metric(): comment out, unused\n"
    },
    {
      "commit": "065de90380c88d9fcc116627f714bed9984c2723",
      "tree": "79061a2699e0dc3e87c218b3b57c2f0577d5a69a",
      "parents": [
        "5bd5881838c22e075c3d0c245a8952a55e9dca38"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "shemminger@vyatta.com",
        "time": "Fri Aug 07 11:13:49 2009 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Thu Aug 13 10:21:13 2009 +0100"
      },
      "message": "all: check return value from daemon() call\n\n* */*main.c: (main) Current versions of Gcc warn if the return value for\n  daemon() is not checked.  So add a simple test and exit on failure.\n\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": "78b31d5cf511c400d7f09158a3d8863f1bf63c2a",
      "tree": "b47a513278c23f7034c5ffa885facc1963d3a52a",
      "parents": [
        "9a1a331d63ae9db1912a1edb48c5c176454562f8"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "shemminger@vyatta.com",
        "time": "Tue Jul 21 16:27:26 2009 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jul 27 12:37:26 2009 +0100"
      },
      "message": "ripd: set IP TOS for control socket\n\n* ripd.c: (rip_create_socket) RIP packets should go out with Type Of Service\n  (DSCP) set to Internet control (like OSPF and BGP).\n"
    },
    {
      "commit": "82f5ee1ead0aa83f83f918abfc3f5071741a56e5",
      "tree": "bea94b32379b8f1b3f69db6d0c3404ccb115c7fa",
      "parents": [
        "94fc1dd41cd0267acb9c67dd3dcf1e64ef8713af"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "shemminger@vyatta.com",
        "time": "Tue Apr 07 15:00:46 2009 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Thu Jun 18 20:18:27 2009 +0100"
      },
      "message": "[ripd] Ignore non-running interfaces in rip status\n\nVyatta Bug 3999\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": "393deb9bd663361e6b110d579a8b1d4c22667068",
      "tree": "e93ebf2f57bf92ff7a9cd045764b3cdbb99a07e5",
      "parents": [
        "3453a7122c1d585ad789ed0f63deb90cc5e89fae"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "stephen.hemminger@vyatta.com",
        "time": "Mon Aug 18 14:13:29 2008 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Jun 12 17:07:49 2009 +0100"
      },
      "message": "[cleanup] Convert XMALLOC/memset to XCALLOC\n\nSimple conversion of XMALLOC/memset to XCALLOC\n"
    },
    {
      "commit": "0be8dfb2a95f41f100982085595b7c7505127018",
      "tree": "add7218b0c518ac0cd276c74fe700b5ed1f26762",
      "parents": [
        "42176e6b01c9ca2b2725952684b2d7792468e861"
      ],
      "author": {
        "name": "Chris Caputo",
        "email": "ccaputo@alt.net",
        "time": "Tue Jun 02 18:40:07 2009 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue Jun 02 18:45:10 2009 +0100"
      },
      "message": "[snmp] Compiler warning fixes for when \"--enable-snmp\" is configured.\n\nCompiled on 32-bit and 64-bit linux gcc 4.1.2 platforms.\nNo run-time testing on 32-bit and limited run-time testing on 64-bit.\n"
    },
    {
      "commit": "c5a89ff4e68c49b8841baf3c76290dd78ba383ec",
      "tree": "bd48c628314d40d870b85f539f4408539aa7853e",
      "parents": [
        "acde4b861333d799b50d6e8a53214abc0d17ede3"
      ],
      "author": {
        "name": "Krisztian Kovacs",
        "email": "Kris.Kovacs@MorganStanley.com",
        "time": "Tue Jun 02 18:09:48 2009 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue Jun 02 18:09:48 2009 +0100"
      },
      "message": "[ripd] Fix metrix in call to rip_zebra_ipv4_delete\n\nFix a potential problem (most probably not triggering a real problem, at\nleast on Linux). When an interface goes down and ripd tries to delete the\ncorresponding route it errorneously passes the interface\u0027s index instead of\nthe metric to zebra.\n"
    },
    {
      "commit": "fb62a3cef5960885119f9e87c833520ddf2a9b49",
      "tree": "cf6c5cde38c91ad555021f44793b92fd34de8198",
      "parents": [
        "b38309a4ee831a440ef78f8a27db584f2f8e8276"
      ],
      "author": {
        "name": "Joakim Tjernlund",
        "email": "Joakim.Tjernlund@transmode.se",
        "time": "Tue May 13 20:03:32 2008 +0200"
      },
      "committer": {
        "name": "Joakim Tjernlund",
        "email": "Joakim.Tjernlund@transmode.se",
        "time": "Mon Aug 25 09:48:30 2008 +0200"
      },
      "message": "Make --enable-snmp cross compile and make libcrypto optional with --without-crypto\n\nAutoconfig work by me, the rest was done by\n\"Kirill K. Smirnov\" \u003clich@math.spbu.ru\u003e\n"
    },
    {
      "commit": "5515de330cf6c5449c0a56862072750b07d23fd7",
      "tree": "4651f48d94ba97117d84fdaa2210563676adc8df",
      "parents": [
        "d68cbf9261869e532dfdd14dbb4122b3f3feb0d4"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Wed Mar 21 12:41:22 2007 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Aug 22 20:02:08 2008 +0100"
      },
      "message": "[administrivia] Update gitignore files\n\n- Add more stuff, archive libraries, etc..\n"
    },
    {
      "commit": "d68cbf9261869e532dfdd14dbb4122b3f3feb0d4",
      "tree": "5cc873e6a38a3db9ad5fb4dfe579624ff7693c13",
      "parents": [
        "3998bfd76620a676fbd77f19c5c6ea80a4cc88d2"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Sat Oct 21 18:35:27 2006 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Aug 22 20:00:46 2008 +0100"
      },
      "message": "[administrivia] Git should ignore backup files and .loT files\n"
    },
    {
      "commit": "3998bfd76620a676fbd77f19c5c6ea80a4cc88d2",
      "tree": "66bf93340e55bb06b25544ef04afec3749269391",
      "parents": [
        "e5248434c0d287668be956a2bd52399d67b16c39"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Tue Aug 19 14:13:43 2008 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Aug 22 19:57:22 2008 +0100"
      },
      "message": "[trivia] Remove ChangeLog files, as this data is now maintained in SCM\n"
    },
    {
      "commit": "1423c809cc4ddc2e013ba6264c49a11e5719c6f2",
      "tree": "db0389e7de020bbcb9fd78d45417b0842a6adb0b",
      "parents": [
        "89d9fa301e146193093ff876f96b3612dc390bbb"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "stephen.hemminger@vyatta.com",
        "time": "Thu Aug 14 17:59:25 2008 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Aug 22 19:52:58 2008 +0100"
      },
      "message": "[lib] mes_lookup string lookup table argument should be marked const\n\n2008-08-14 Stephen Hemminger \u003cstephen.hemminger@vyatta.com\u003e\n\n\t* lib/log.{c,h}: struct message argument should point to const\n\t* */*.c: adjust to suit,\n\nSigned-off-by: Paul Jakma \u003cpaul@quagga.net\u003e\n"
    },
    {
      "commit": "46bc0e432e756fcb8fc4f703b47cd25b9fc7139c",
      "tree": "60100ca1e11c3c3600441d366b236f4a2de519ca",
      "parents": [
        "d664ae1182c29b74b409bc8594b7bd0575e91ce9"
      ],
      "author": {
        "name": "Paul P Komkoff Jr",
        "email": "i@stingr.net",
        "time": "Wed Aug 13 16:17:04 2008 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Aug 22 19:52:12 2008 +0100"
      },
      "message": "[build] Test for GNU-style PIE support in toolchain and enable\n\n2008-08-13 Paul P Komkoff Jr \u003ci@stingr.net\u003e\n\n\t* configure.ac: add a configure flag and autoconf macro, which will\n\t  determine if your toolchain supports PIE.\n\t* */Makefile.am: add corresponding CFLAGS and LDFLAGS into\n\t  appropriate places.\n\nSigned-off-by: Paul Jakma \u003cpaul@quagga.net\u003e\n"
    },
    {
      "commit": "3c5a0a4f8fe3811affff6d5e123379eedb083571",
      "tree": "79e285e0bd04c6ef0dfcde9cf0ce8fda8abecbe1",
      "parents": [
        "750e814693050bc97391eec618aad9db798ee5e8"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Sun Feb 19 17:30:10 2006 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Aug 22 19:49:33 2008 +0100"
      },
      "message": "[administrivia] Add .gitignore files, based on .cvsignores.\n"
    },
    {
      "commit": "fa93b16208c2e7ffb09bd5bf72fb1a70a1ad8f73",
      "tree": "f69eeeb8856b70d659811e7b65f33e353200577b",
      "parents": [
        "0d6b2ee249e9efba30da3236c413bf03c7b27ed9"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Thu May 29 19:03:08 2008 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Thu May 29 19:03:08 2008 +0000"
      },
      "message": "[ripd] Fix mistaken empty string test\n\n2008-05-29 Stephen Hemminger \u003cstephen.hemminger@vyatta.com\u003e\n\n\t* ripd.c: (rip_auth_md5) fix bogus empty string test\n"
    },
    {
      "commit": "0d6b2ee249e9efba30da3236c413bf03c7b27ed9",
      "tree": "4d9320f2c34f0c127b58b92f59e2c2afd2d5818f",
      "parents": [
        "768a27ea7ba25257c79689af83ab37945dc1cc3c"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Thu May 29 18:29:16 2008 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Thu May 29 18:29:16 2008 +0000"
      },
      "message": "[daemons] Sanity check port number arguments before use\n\n2008-05-29 Martin Nagy \u003cmnagy@redhat.com\u003e\n\n\t* */*main.c: Sanity check port numbers before using.\n"
    },
    {
      "commit": "ce6ab03a273beb903731621153722511910ebbe5",
      "tree": "a94b4f3f4d539fa619fb937578f13daaadce6142",
      "parents": [
        "11486b5265b2e0e2cf8b140018c47bd9a35cba93"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Thu Mar 13 03:28:13 2008 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Thu Mar 13 03:28:13 2008 +0000"
      },
      "message": "[ripd] remove unnecessary 0 entries from struct message\u0027s\n\n2008-03-13 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* ripd.c/rip_interface.c: Remove 0 entries from rip_msg\n\t  ri_version_msg struct message\u0027s, not needed with recent fixes\n\t  to mes_lookup.\n"
    },
    {
      "commit": "6f0e3f6e17687eb25b7b77c4fdc8324837d4700f",
      "tree": "8a94d9212060f0f2ee7cbd0079c2687eed7348dc",
      "parents": [
        "08d3d5b398ae81de7659509f159e814d1bbd4375"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Thu May 10 02:38:51 2007 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Thu May 10 02:38:51 2007 +0000"
      },
      "message": "[autoconf] bugs 162,303,178: Fix \u0027present but can not be compiled\u0027 warnings\n\n2007-05-09 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* configure.ac: sys/conf.h depends on sys/param.h, at least on\n\t  FBSD 6.2.\n\t  (bug #363) Should check for in_pktinfo for IRDP\n\n2006-05-27 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* configure.ac: General cleanup of header and type checks, introducing\n\t  an internal define, QUAGGA_INCLUDES, to build up a list of\n\t  stuff to include so as to avoid \u0027present but cant be compiled\u0027\n\t  warnings.\n\t  Misc additional checks of things missing according to autoscan.\n\t  Add LIBM, for bgpd\u0027s use of libm, so as to avoid burdening\n\t  LIBS, and all the binaries, with libm linkage.\n\t  Remove the bad practice of using m4 changequote(), just\n\t  quote the []\u0027s in the case statements properly.\n\t  This should fix bugs 162, 303 and 178.\n\t* */*.{c,h}: Update all HAVE_* to the standard autoconf namespaced\n\t  HAVE_* defines. I.e. HAVE_SA_LEN -\u003e HAVE_STRUCT_SOCKADDR_SA_LEN,\n\t* bgpd/Makefile.am: Add LIBM to bgpd\u0027s LDADD, for pow().\n"
    },
    {
      "commit": "33672eddf14c5b619fc38975d4c1f2888189cbc8",
      "tree": "6f3d5d1bf2cf861d573db6711ce849b27d3b8b8f",
      "parents": [
        "e8a56f02ee52a0a4f06440f4dfef86a21e6ce5c1"
      ],
      "author": {
        "name": "Andrew J. Schorr",
        "email": "ajschorr@alumni.princeton.edu",
        "time": "Fri Apr 27 18:03:11 2007 +0000"
      },
      "committer": {
        "name": "Andrew J. Schorr",
        "email": "ajschorr@alumni.princeton.edu",
        "time": "Fri Apr 27 18:03:11 2007 +0000"
      },
      "message": "[ripd, ripngd] Remove useless code in rip_vty_out_uptime function\n\n2007-04-27 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* ripd/ripd.c: (rip_vty_out_uptime) Remove unused variable timer_now.\n\t* ripngd/ripngd.c: (ripng_vty_out_uptime) Remove unused variable\n\t  timer_now.\n"
    },
    {
      "commit": "a1fdf9479637642ae3de0ee6ef5c0958d6e687d8",
      "tree": "28dfc85b9bfcbbf5064703484fc60a01c904e5e9",
      "parents": [
        "f5e004f74fecaf84b50f8c1823432077ad7e15b7"
      ],
      "author": {
        "name": "Vincent Jardin",
        "email": "vincent.jardin@6wind.com",
        "time": "Wed Apr 11 15:12:05 2007 +0000"
      },
      "committer": {
        "name": "Vincent Jardin",
        "email": "vincent.jardin@6wind.com",
        "time": "Wed Apr 11 15:12:05 2007 +0000"
      },
      "message": "Fix the display of route timeout in \"show ip rip\". (Use thread_timer_remain_second)\n"
    },
    {
      "commit": "a4c648281dfdc45687580ea2d20884b5d7dbdc8d",
      "tree": "beca0c3e413f1b9eee1266906a3035b256c8c147",
      "parents": [
        "afb88a669167358ea2be64aa0d10c8c42fa7509c"
      ],
      "author": {
        "name": "Andrew J. Schorr",
        "email": "ajschorr@alumni.princeton.edu",
        "time": "Wed Mar 21 18:57:38 2007 +0000"
      },
      "committer": {
        "name": "Andrew J. Schorr",
        "email": "ajschorr@alumni.princeton.edu",
        "time": "Wed Mar 21 18:57:38 2007 +0000"
      },
      "message": "[ripd] Fix \"show ip rip status\" display of time until next update\n\n2007-03-21 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* ripd.c: (show_ip_rip_status) Use new thread_timer_remain_second\n\t  function instead of rip_next_thread_timer to display the time until\n\t  next update properly.\n\t  (rip_next_thread_timer) Remove obsolete function.\n"
    },
    {
      "commit": "e4529636b77124285cca96a62799d0ff6a7addeb",
      "tree": "a8a50de7413833d5277ed7309248e03719e9efd3",
      "parents": [
        "43cd33a44e010f818633b7f144b5a0be352b41e7"
      ],
      "author": {
        "name": "Andrew J. Schorr",
        "email": "ajschorr@alumni.princeton.edu",
        "time": "Tue Dec 12 19:18:21 2006 +0000"
      },
      "committer": {
        "name": "Andrew J. Schorr",
        "email": "ajschorr@alumni.princeton.edu",
        "time": "Tue Dec 12 19:18:21 2006 +0000"
      },
      "message": "[PtP over ethernet] New peer flag allows much more addressing flexibility\n\n2006-12-12 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* if.h: (struct connected) Add new ZEBRA_IFA_PEER flag indicating\n\t  whether a peer address has been configured.  Comment now shows\n\t  the new interpretation of the destination addr: if ZEBRA_IFA_PEER\n\t  is set, then it must contain the destination address, otherwise\n\t  it may contain the broadcast address or be NULL.\n\t  (CONNECTED_DEST_HOST,CONNECTED_POINTOPOINT_HOST) Remove obsolete\n\t  macros that were specific to IPv4 and not fully general.\n\t  (CONNECTED_PEER) New macro to check ZEBRA_IFA_PEER flag.\n\t  (CONNECTED_PREFIX) New macro giving the prefix to insert into\n\t  the RIB: if CONNECTED_PEER, then use the destination (peer) address,\n\t  else use the address field.\n\t  (CONNECTED_ID) New macro to come up with an identifying address\n\t  for the struct connected.\n\t* if.c: (if_lookup_address, connected_lookup_address) Streamline\n\t  logic with new CONNECTED_PREFIX macro.\n\t* prefix.h: (PREFIX_COPY_IPV4, PREFIX_COPY_IPV6) New macros\n\t  for better performance than the general prefix_copy function.\n\t* zclient.c: (zebra_interface_address_read) For non-null destination\n\t  addresses, set prefixlen to equal the address prefixlen.  This\n\t  is needed to get the new CONNECTED_PREFIX macro to work properly.\n\t* connected.c: (connected_up_ipv4, connected_down_ipv4,\n\t  connected_up_ipv6, connected_down_ipv6) Simplify logic using the\n\t  new CONNECTED_PREFIX macro.\n\t  (connected_add_ipv4) Set prefixlen in destination addresses (required\n\t  by the CONNECTED_PREFIX macro).  Use CONNECTED_PEER macro instead\n\t  of testing for IFF_POINTOPOINT.  Delete invalid warning message.\n\t  Warn about cases where the ZEBRA_IFA_PEER is set but no\n\t  destination address has been supplied (and turn off the flag).\n\t  (connected_add_ipv6) Add new flags argument so callers may set\n\t  the ZEBRA_IFA_PEER flag.  If peer/broadcast address satisfies\n\t  IN6_IS_ADDR_UNSPECIFIED, then reject it with a warning.\n\t  Set prefixlen in destination address so CONNECTED_PREFIX will work.\n\t* connected.h: (connected_add_ipv6) Add new flags argument so\n\t  callers may set the ZEBRA_IFA_PEER flag.\n\t* interface.c: (connected_dump_vty) Use CONNECTED_PEER macro\n\t  to decide whether the destination address is a peer or broadcast\n\t  address (instead of checking IFF_BROADCAST and IFF_POINTOPOINT).\n\t* if_ioctl.c: (if_getaddrs) Instead of setting a peer address\n\t  only when the IFF_POINTOPOINT is set, we now accept a peer\n\t  address whenever it is available and not the same as the local\n\t  address.  Otherwise (no peer address assigned), we check\n\t  for a broadcast address (regardless of the IFF_BROADCAST flag).\n\t  And must now pass a flags value of ZEBRA_IFA_PEER to\n\t  connected_add_ipv4 when a peer address is assigned.\n\t  The same new logic is used with the IPv6 code as well (and we\n\t  pass the new flags argument to connected_add_ipv6).\n\t  (if_get_addr) Do not bother to check IFF_POINTOPOINT: just\n\t  issue the SIOCGIFDSTADDR ioctl and see if we get back\n\t  a peer address not matching the local address (and set\n\t  the ZEBRA_IFA_PEER in that case).  If there\u0027s no peer address,\n\t  try to grab SIOCGIFBRDADDR regardless of whether IFF_BROADCAST is set.\n\t* if_ioctl_solaris.c: (if_get_addr) Just try the SIOCGLIFDSTADDR ioctl\n\t  without bothering to check the IFF_POINTOPOINT flag.  And if\n\t  no peer address was found, just try the SIOCGLIFBRDADDR ioctl\n\t  without checking the IFF_BROADCAST flag.  Call connected_add_ipv4\n\t  and connected_add_ipv6 with appropriate flags.\n\t* if_proc.c: (ifaddr_proc_ipv6) Must pass new flags argument to\n\t  connected_add_ipv6.\n\t* kernel_socket.c: (ifam_read) Must pass new flags argument to\n\t  connected_add_ipv6.\n\t* rt_netlink.c: (netlink_interface_addr) Copy logic from iproute2\n\t  to determine local and possible peer address (so there\u0027s no longer\n\t  a test for IFF_POINTOPOINT).  Set ZEBRA_IFA_PEER flag appropriately.\n\t  Pass new flags argument to connected_add_ipv6.\n\t  (netlink_address) Test !CONNECTED_PEER instead of if_is_broadcast\n\t  to determine whether the connected destination address is a\n\t  broadcast address.\n\t* bgp_nexthop.c: (bgp_connected_add, bgp_connected_delete)\n\t  Simplify logic by using new CONNECTED_PREFIX macro.\n\t* ospf_interface.c: (ospf_if_is_configured, ospf_if_lookup_by_prefix,\n\t  ospf_if_lookup_recv_if) Simplify logic using new CONNECTED_PREFIX\n\t  macro.\n\t* ospf_lsa.c: (lsa_link_ptop_set) Using the new CONNECTED_PREFIX\n\t  macro, both options collapse into the same code.\n\t* ospf_snmp.c: (ospf_snmp_if_update) Simplify logic using new\n\t  CONNECTED_ID macro.\n\t  (ospf_snmp_is_if_have_addr) Simplify logic using new CONNECTED_PREFIX\n\t  macro.\n\t* ospf_vty.c: (show_ip_ospf_interface_sub) Use new CONNECTED_PEER macro\n\t  instead of testing the IFF_POINTOPOINT flag.\n\t* ospfd.c: (ospf_network_match_iface) Use new CONNECTED_PEER macro\n\t  instead of testing with if_is_pointopoint.  And add commented-out\n\t  code to implement alternative (in my opinion) more elegant behavior\n\t  that has no special-case treatment for PtP addresses.\n\t  (ospf_network_run) Use new CONNECTED_ID macro to simplify logic.\n\t* rip_interface.c: (rip_interface_multicast_set) Use new CONNECTED_ID\n\t  macro to simplify logic.\n\t  (rip_request_interface_send) Fix minor bug: ipv4_broadcast_addr does\n\t  not give a useful result if prefixlen is 32 (we require a peer\n\t  address in such cases).\n\t* ripd.c: (rip_update_interface) Fix same bug as above.\n"
    },
    {
      "commit": "876b8be0ab24721e8f94d47dde022563f76db992",
      "tree": "60afcf14974d39a081b64c71191038701e73a3f5",
      "parents": [
        "98954844ae56d142e96341d5dff959ec5518111e"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Sun Oct 15 23:35:57 2006 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Sun Oct 15 23:35:57 2006 +0000"
      },
      "message": "[daemon startup] Add --dry-run/-C argument to daemons, to check config file syntax\n\n2006-10-04 Oliver Hookins \u003cohookins@gmail.com\u003e\n\n\t* bgpd/bgp_main.c: Add configuration check option, with\n\t\u0027-C\u0027 rather than \u0027-c\u0027 for consistency between daemons.\n\t* isisd/isis_main.c: ditto\n\t* ospf6d/ospf6_main.c: ditto\n\t* ospfd/ospf_main.c: ditto\n\t* ripngd/ripng_main.c: ditto\n\t* vtysh/vtysh_main.c: ditto\n\t* ripd/rip_main.c: Change the config check option to\n\t\u0027-C\u0027 and tidy up the code.\n\t* zebra/main.c: ditto\n\n2006-10-04 Stergiakis Alexandros \u003castergiakis@antcor.com\u003e\n\n\t* ripd/rip_main.c: This trivial patch introduces a new\n\t  command-line option \u0027-c\u0027, which instructs zebra/ripd\n\t  to check its configuration file for validity,\tprint\n\t  any error message, and then exit. This is useful when\n\t  the configuration file is edited by hand or otherwise,\n\t  and you simply want to validate it without any other\n\t  effect.\n\t* zebra/main.c: ditto\n"
    },
    {
      "commit": "b25ea4d085c858137ec28b1be9d6ab6c30a97303",
      "tree": "476bf1799357a70ea42cdfccee9340e8b32172d6",
      "parents": [
        "3e557ae1ea7693d91b6df42c2529952d6a349911"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Mon Sep 11 02:14:16 2006 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Mon Sep 11 02:14:16 2006 +0000"
      },
      "message": "[ripd] bug #293: routemap set metric doesn\u0027t check for underflow correctly\n\n2006-09-11 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* rip_routemap.c: (route_set_metric) underflow check needs to\n\t  use signed, problem identified and diagnosed by Pavel\n\t  Nikiforov in bug #293.\n"
    },
    {
      "commit": "3e557ae1ea7693d91b6df42c2529952d6a349911",
      "tree": "16edc7c42b662c852158ed802fda2f9200be3308",
      "parents": [
        "1a392d46db1917dfca2ddd06d7f0021396f8ecfa"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Mon Sep 11 02:10:40 2006 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Mon Sep 11 02:10:40 2006 +0000"
      },
      "message": "[ripd] bug #278: remove gratuitous use of mid-function declaration\n\n2006-09-11 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* ripd.c: (rip_read) remove gratuitous use of mid-function\n\t  declaration of vrecv, bug #278.\n"
    },
    {
      "commit": "9a57dc69d2432b6633fc47b05d4ee475a29db361",
      "tree": "76f7ce6c0923fbe5892cf6829b42a50d80116f00",
      "parents": [
        "adf6221437073f4d427c9c973e4c95381b13fc73"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Fri Jun 30 16:58:53 2006 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Fri Jun 30 16:58:53 2006 +0000"
      },
      "message": "[ripd] update to use auto-generated redistribute route-type defs\n\n2006-06-29 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* rip_zebra: (general) convert redistribute commands to use\n\t  the auto-generated defines.\n"
    },
    {
      "commit": "15a2b089ced3f1e956659e9ca88af45d1c48272c",
      "tree": "26ae18cd6cb7021307586a6ed16c3e058a92ebc3",
      "parents": [
        "9c27ef9b9c26db0af507869c2866c4a8463f4ae7"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Thu May 04 07:36:34 2006 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Thu May 04 07:36:34 2006 +0000"
      },
      "message": "[ripd] bugs #261, #262: Fix RIPv1 info-leak and unauthenticated route updates\n\n2006-05-04 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* (general) Fixes for bugs #261 and 262. Thanks to\n\t  Konstantin V. Gavrilenko \u003ckos@arhont.com\u003e for the problem\n\t  reports, testing of a series of proposed patches and comment\n\t  on the proposed changes in behaviour.\n\t* rip_interface.c: (ip_rip_authentication_mode_cmd) Parse all\n\t  of the command before making any changes to configured state.\n\t* ripd.c: (rip_read) RIP version control should be absolute and\n          always apply, fixes bug #261 by allowing RIPv1 to be disabled.\n\t  Fix bug #262: If authentication is enabled, then\n\t  unauthenticated packets should not be accepted. We do however\n\t  make an exception for RIPv1 REQUEST packets, to which we will\n\t  reply as RIPv1 can now be disabled fully, to allow ripd to\n\t  still provide routing /information/ to simple devices.\n"
    },
    {
      "commit": "b9d92881f5d45601c4268d99baec8835068b73c2",
      "tree": "b99acacee536e07a4726b69f8d2b6397e58eadba",
      "parents": [
        "e0062775b9f9945612912bdefc2d9bcf6ab0650b"
      ],
      "author": {
        "name": "Andrew J. Schorr",
        "email": "ajschorr@alumni.princeton.edu",
        "time": "Fri Apr 28 16:22:36 2006 +0000"
      },
      "committer": {
        "name": "Andrew J. Schorr",
        "email": "ajschorr@alumni.princeton.edu",
        "time": "Fri Apr 28 16:22:36 2006 +0000"
      },
      "message": "[ripd] Fix logic to send updates on all connected addresses.\n\n2006-04-28 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* ripd.c: (rip_update_process) Try to fix the logic for sending\n\t  an updated on each connected network.  The new code will\n\t  attempt to send the update on each connected network, whereas\n\t  the previous code seemed to be attempting to avoid sending\n\t  more than one RIPv1 update on a given interface, but was coded\n\t  incorrectly.  The actual effect of the old code was to send\n\t  an update only on the first connected address in the cases\n\t  where the interface is not multicast, or RIPv2 is not being used.\n"
    },
    {
      "commit": "7a383339572b0dd1098132ba35c5f8dc34885fd1",
      "tree": "475efdb55c563aace907e0b4579eacbaf20a3bea",
      "parents": [
        "a1038a15658d2fd4ab3314a9036bbd63f8f471c1"
      ],
      "author": {
        "name": "vincent",
        "email": "vincent",
        "time": "Mon Jan 30 18:12:42 2006 +0000"
      },
      "committer": {
        "name": "vincent",
        "email": "vincent",
        "time": "Mon Jan 30 18:12:42 2006 +0000"
      },
      "message": "ripd.c: correct bug that allowed route learnt through RIP to take precedence over connected routes\n"
    },
    {
      "commit": "e8e1946edf6ba87ef53832cdceccc39d7f0c3f26",
      "tree": "fcdaf92bf4129a8a58825bd21ae841a6b3b2bda8",
      "parents": [
        "779adb0147cfff1a831b08853976342ad2110fcd"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Thu Jan 19 20:16:55 2006 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Thu Jan 19 20:16:55 2006 +0000"
      },
      "message": "[compiler] miscellaneous trivial compiler warning fixes\n\n2006-01-19 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n        * (general) various miscellaneous compiler warning fixes.\n          Remove redundant break statements from switch clauses\n          which return.\n          return from main, not exit, cause it annoys SOS.\n          Remove stray semi-colons which cause empty-statement\n          warnings.\n\t* zebra/main.c: (sighup) remove private declaration of external\n\t  function.\n"
    },
    {
      "commit": "98fd1e61212ea98154e7cc4b6deed41a07794523",
      "tree": "961f28ead9a2eb24fb7660cd52023489a7b431e2",
      "parents": [
        "6726f950ad25daa532e75dc7a6875b340ae0447d"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Tue Jan 17 17:26:25 2006 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Tue Jan 17 17:26:25 2006 +0000"
      },
      "message": "[ripd] Fix verification of received MD5 authenticated packets\n\n2006-01-17 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* ripd.c: (rip_auth_md5) remove pdigest, not needed.\n\t  Use a local buffer for the auth_str, where it can be properly\n\t  nul padded. Do so, hence fixing MD5 authentication.\n\t  Key looked up via key ring should be used in preference to\n\t  the RIPv1 simple password, not other way around.\n\t  No need to copy around digests, we can reference them\n\t  directly.\n\t  The auth_len received can\u0027t be trusted, some implementations\n\t  lie (e.g. older ripd).\n\t  (rip_auth_md5_ah_write) rename len local variable to doff\n\t  to be consistent with other functions.\n\t  (rip_auth_header_write) add the missing return.\n\t  (rip_auth_md5_set) use the proper constructs to access stream.\n"
    },
    {
      "commit": "35a60c2d3c217e3b835821a7f6ea458e2eff44cf",
      "tree": "ff6dc20fdbf2f081556efaa0edec3ed341b29e97",
      "parents": [
        "e5b308d1af147c78acd2803f4006463e6ff67444"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Sun Oct 30 23:51:32 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Sun Oct 30 23:51:32 2005 +0000"
      },
      "message": "2005-10-30 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* ripd.c: (rip_response_process) Instead of calling\n\t  rip_interface.c:if_valid_neighbor(), call the equivalent\n\t  library function if_lookup_address().\n\t* rip_interface.c: (if_valid_neighbor) Remove function, since it is\n\t  essentially equivalent to the if_lookup_address() library function.\n\t* ripd.h: (if_valid_neighbor) Remove function declaration.\n"
    },
    {
      "commit": "92779fe51dd061ab1502a9acdc0cf5241748e0c7",
      "tree": "e9bfbaca14c5e87dee26c9e98aa1cefcb3650cea",
      "parents": [
        "05865c90ab0bc95b8ca1a54c794809891666cdce"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Oct 28 10:23:09 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Oct 28 10:23:09 2005 +0000"
      },
      "message": "2005-10-28 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* Makefile.am: Add rip_interface.h, or else it doesn\u0027t get\n\t  included in dists.\n"
    },
    {
      "commit": "216565ab68148d3161422c0d73730614bfeccd7c",
      "tree": "d744175fb88d741b40a8131848b361bf8c842084",
      "parents": [
        "dc63bfd49513b7ca157c3992c8bc9da9d736fc39"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Tue Oct 25 23:35:28 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Tue Oct 25 23:35:28 2005 +0000"
      },
      "message": "2005-10-26 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* ripd.c: Update couple more functions to specify void\n\t  explicitely.\n"
    },
    {
      "commit": "dc63bfd49513b7ca157c3992c8bc9da9d736fc39",
      "tree": "d6ccb6737c0354d106c6b85013979cef2abb3353",
      "parents": [
        "e029d448587551be7543e64e278dbb566f57509a"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Tue Oct 25 23:31:05 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Tue Oct 25 23:31:05 2005 +0000"
      },
      "message": "2005-10-26 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* (general) static/extern functions and definitions.\n\t* rip_interface.h: new file, export the public functions from\n\t  rip_interface.c\n"
    },
    {
      "commit": "38d3c163cff92465c94732cb7ecb9761053d2038",
      "tree": "9ef8e7525d9d671ae833de6cd44d820812ac0898",
      "parents": [
        "5012322ddb0219138ee3583c50fd6e99c5a1d857"
      ],
      "author": {
        "name": "jardin",
        "email": "jardin",
        "time": "Wed Oct 19 19:29:59 2005 +0000"
      },
      "committer": {
        "name": "jardin",
        "email": "jardin",
        "time": "Wed Oct 19 19:29:59 2005 +0000"
      },
      "message": "2005-10-17 Vincent Jardin \u003cvincent.jardin@6wind.com\u003e\n\n        * ripd.c: rip_create_socket() for each packet, it does not bind to the\n          proper interfaces because we forget to use the from address when\n          it is specified.\n"
    },
    {
      "commit": "fac3e8410ade65e269aa2d896bcd3a0b68f10d70",
      "tree": "a9c9653baee68c5f2a63b53242815dd99329195f",
      "parents": [
        "f52d13cb2e8e7197934d5f241f88647f9b9d78b8"
      ],
      "author": {
        "name": "vincent",
        "email": "vincent",
        "time": "Thu Oct 06 07:45:43 2005 +0000"
      },
      "committer": {
        "name": "vincent",
        "email": "vincent",
        "time": "Thu Oct 06 07:45:43 2005 +0000"
      },
      "message": "2005-10-06 Alain Ritoux \u003calain.ritoux@6wind.com\u003e\n\n        * rip_interface.c: Now the command \"no ip rip split-horizon\n          poisoned-reverse\" just inhibates the poisoned-reverse effects\n          but keep spli-horizon activ.\n"
    },
    {
      "commit": "f52d13cb2e8e7197934d5f241f88647f9b9d78b8",
      "tree": "b0aa01befc07f57ed47e83ac7dfb383284c49d26",
      "parents": [
        "c05612b9a702d0f49c379c92deb6daab55372aea"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Sat Oct 01 17:38:06 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Sat Oct 01 17:38:06 2005 +0000"
      },
      "message": "2005-10-01 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* zebra.h: Declare new functions zebra_route_string() and\n\t  zebra_route_char().\n\t* log.c: (zroute_lookup,zebra_route_string,zebra_route_char) New\n\t  functions to map zebra route numbers to strings.\n\t* zebra_vty.c: (route_type_str) Remove obsolete function: use new\n\t  library function zebra_route_string() instead.  Note that there\n\t  are a few differences: for IPv6 routes, we now get \"ripng\" and\n\t  \"ospf6\" instead of the old behavior (\"rip\" and \"ospf\").\n\t  (route_type_char) Remove obsolete function: ues new library function\n\t  zebra_route_char() instead.  Note that there is one difference:\n\t  the old function returned \u0027S\u0027 for a ZEBRA_ROUTE_SYSTEM route,\n\t  whereas the new one returns \u0027X\u0027.\n\t  (vty_show_ip_route_detail,vty_show_ipv6_route_detail) Replace\n\t  route_type_str() with zebra_route_string().\n\t  (vty_show_ip_route,vty_show_ipv6_route) Replace route_type_char()\n\t  with zebra_route_char().\n\t* bgp_vty.c: (bgp_config_write_redistribute) Use new library function\n\t  zebra_route_string instead of a local hard-coded table.\n\t* ospf6_asbr.c: Remove local hard-coded tables zroute_name and\n\t  zroute_abname. Change the ZROUTE_NAME macro to use new library\n\t  function zebra_route_string().  Remove the ZROUTE_ABNAME macro.\n\t  (ospf6_asbr_external_route_show): Replace ZROUTE_ABNAME() with\n\t  a call to zebra_route_char(), and be sure to fix the format string,\n\t  since we now have a char instead of a char *.\n\t* ospf6_zebra.c: Remove local hard-coded tables zebra_route_name and\n\t  zebra_route_abname.  Note that the zebra_route_name[] table\n\t  contained mixed-case strings, whereas the zebra_route_string()\n\t  function returns lower-case strings.\n\t  (ospf6_zebra_read_ipv6): Change debug message to use new library\n\t  function zebra_route_string() instead of zebra_route_name[].\n\t  (show_zebra): Use new library function zebra_route_string() instead\n\t  of zebra_route_name[].\n\t* ospf_dump.c: Remove local hard-coded table ospf_redistributed_proto.\n\t  (ospf_redist_string) New function implemented using new library\n\t  function zebra_route_string().  Note that there are a few differences\n\t  in the output that will result: the new function returns strings\n\t  that are lower-case, whereas the old table was mixed case.  Also,\n\t  the old table mapped ZEBRA_ROUTE_OSPF6 to \"OSPFv3\", whereas the\n\t  new function returns \"ospf6\".\n\t* ospfd.h: Remove extern struct message ospf_redistributed_proto[],\n\t  and add extern const char *ospf_redist_string(u_int route_type)\n\t  instead.\n\t* ospf_asbr.c: (ospf_external_info_add) In two messages, use\n\t  ospf_redist_string instead of LOOKUP(ospf_redistributed_proto).\n\t* ospf_vty.c: Remove local hard-coded table distribute_str.\n\t  (config_write_ospf_redistribute,config_write_ospf_distribute): Use\n\t  new library function zebra_route_string() instead of distribute_str[].\n\t* ospf_zebra.c: (ospf_redistribute_set,ospf_redistribute_unset,\n\t  ospf_redistribute_default_set,ospf_redistribute_check)\n\t  In debug messages, use ospf_redist_string() instead of\n\t  LOOKUP(ospf_redistributed_proto).\n\t* rip_zebra.c: (config_write_rip_redistribute): Remove local hard-coded\n\t  table str[]. Replace str[] with calls to new library function\n\t  zebra_route_string().\n\t* ripd.c: Remove local hard-coded table route_info[].\n\t  (show_ip_rip) Replace uses of str[] with calls to new library\n\t  functions zebra_route_char and zebra_route_string.\n\t* ripng_zebra.c: (ripng_redistribute_write) Remove local hard-coded\n\t  table str[].  Replace str[i] with new library function\n\t  zebra_route_string(i).\n\t* ripngd.c: Remove local hard-coded table route_info[].\n\t  (show_ipv6_ripng) Use new library function zebra_route_char() instead\n\t  of table route_info[].\n"
    },
    {
      "commit": "ceacedba227e77156f92f7676b274c48a2817e8f",
      "tree": "f362ecc8f6f183347ebe45ab79727b54d2f527a6",
      "parents": [
        "e62178797d0ee5f326fd587b84ee965cf88833e4"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Thu Sep 29 14:39:32 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Thu Sep 29 14:39:32 2005 +0000"
      },
      "message": "2005-09-29 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* configure.ac: Add the test for Solaris least-privileges. Set\n\t  defines for whether capabilities are supported and whether of\n\t  the linux or solaris variety.\n\t  Add missing-prototypes, missing-declarations, char-subscripts\n\t  and cast-qual warnings to default cflags, cause Hasso enjoys warnings,\n\t  and we really should clean the remaining ones up. (ie isisd..).\n\t* (*/*main.c) Update the zebra_capabilities_t arrays in the various\n\t  daemons to match the changes made in lib/privs.h.\n\t* zebra.h: Solaris capabilities requires priv.h to be included.\n\t* privs.{c,h}: Add support for Solaris Least-Privileges.\n\t  privs.h: Reduce some of the abstract capabilities, which do\n\t  not have rough equivalents on both systems. Rename the net\n\t  related caps to _NET, as they should have been in first\n\t  place.\n\t  (zprivs_terminate) should take the zebra_privs_t as argument so\n\t  that it can update change pointer.\n\t  Add an additional privilege state, ZPRIVS_UNKNOWN.\n\t* privs.c: (various capability functions) Add\n\t  Solaris privileges variants.\n\t  (zprivs_state) Use privs.c specific generic types to\n          represent various capability/privilege related types, so that\n          each can be typedef\u0027d as appropriate on each platform.\n\t  (zprivs_null_state) static added, to hold the state the null\n\t  method should report (should be raised by default, and\n          LOWERED if zprivs_terminate has been called)\n          (zprivs_state_null) Report back the zprivs_null_state.\n          (cap_map) Make it able to map abstract capability to multiple\n          system capabilities.\n          (zcaps2sys) Map to abstract capabilities to multiple system\n          privileges/capabilities.\n          (zprivs_init) move capability related init to seperate\n\t  function, zprivs_caps_init.\n          (zprivs_terminate) ditto, moved to zprivs_caps_terminate.\n          Set the change_state callback to the NULL state, so the\n          user can continue to run and use the callbacks.\n"
    },
    {
      "commit": "fbf5d033041e406ecefd27c2deebf5a4953d1155",
      "tree": "e9173ab5e05fc86e95f325d2cb2a7a123eb33327",
      "parents": [
        "3fdb2dd9dd8b4ab3517896092dd1b677d191adf9"
      ],
      "author": {
        "name": "vincent",
        "email": "vincent",
        "time": "Thu Sep 29 11:25:50 2005 +0000"
      },
      "committer": {
        "name": "vincent",
        "email": "vincent",
        "time": "Thu Sep 29 11:25:50 2005 +0000"
      },
      "message": "2005-09-29 Alain Ritoux \u003calain.ritoux@6wind.com\u003e\n\n    * lib/filer.c: show protocol name in filter_show()\n    * lib/plist.c: show protocol name in vty_show_prefix_entry()\n    * routemap.c: show protocol name in vty_show_route_map_entry()\n    * lib/vty.c: in vty_command(), show protocol name if command unknown\n\n    * zebra/zserv.c: Always provide distance fo route add\n\n    * ripd/rip_snmp.c: rip2IfConfReceive() sends values in conformance\n      with RFC. Also PeerDomain is now set to a STRING type.\n    * ripd/ripd.h: rip_redistribute_add() API includes metric and distance\n    * ripd/ripd.c: rip_redistribute_add() API i.e. stores metric and distance\n      Now allows a RIP-route to overcome a redistributed route coming\n      from a protocol with worse (higher) administrative distance\n      Metrics from redistribution are shown in show ip rip\n    * ripd/rip_zebra.c: adapt to the rip_redistribute_add() API, i.e.\n      provide distance and metric\n    * ripd/rip_interface.c: adapt to the rip_redistribute_add() API\n    * ripd/rip_routemap.c: no RMAP_COMPILE_ERROR on (metric \u003e 16) usage\n      rather a CMD_WARNING, because set metric ius shared with other\n      protocols using larger values (such as OSPF)\n      The match metric action takes first external metric if present\n      (from redistribution) then RIP metric.\n"
    },
    {
      "commit": "c1a03d4774f8ecc30a21267469d48cb2276de48c",
      "tree": "1bf9309bc99e316a5633d18f7724330d8d6fa836",
      "parents": [
        "aa2e32be264710ef208516dfe1661b8148c3eede"
      ],
      "author": {
        "name": "vincent",
        "email": "vincent",
        "time": "Wed Sep 28 15:47:44 2005 +0000"
      },
      "committer": {
        "name": "vincent",
        "email": "vincent",
        "time": "Wed Sep 28 15:47:44 2005 +0000"
      },
      "message": "2005-09-28 Alain Ritoux \u003calain.ritoux@6wind.com\u003e\n\n    * lib/md5-gnu.h: removed\n    * lib/md5.h: replaces md5-gnu.h\n    * lib/Makefile.am: use correct md5.h\n    * lib/md5.c: import from WIDE\n    * ospfd/ospf_packet.c: use new md5 API\n    * ripd/ripd.c: use new md5 API\n"
    },
    {
      "commit": "2c61ae37821f4ece2b2f22d716ac8a135808e70c",
      "tree": "2ef1ae310612294f9a8ec16bb94d7858070c757b",
      "parents": [
        "60f0651c32e6ee35da5f2d227dc471427568ff45"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Tue Aug 16 15:22:14 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Tue Aug 16 15:22:14 2005 +0000"
      },
      "message": "2005-08-16 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* ripd.c: (general) Fix previous commit, broke multicast bind and\n\t  hence setting of source port, which broke communication with\n\t  non-borken ripd. Fix removes more stuff from rip_interface.c\n\t  than it adds to ripd.c ;)\n\t  (rip_create_socket) the to argument really is a from argument,\n\t  rename it. Set the source port to RIP port unconditionally, it\u0027s\n\t  required.\n\t  (rip_send_packet) Set from address correctly for multicast.\n\t  (rip_output_process) trivial: num can be BSS specified, rather\n\t  than in body.\n\t* rip_interface.c: (rip_interface_multicast_set) strip out\n\t  redundant stuff related to bind, which rip_create_socket does.\n\t  Just make it set the multicast socket option, as per the\n\t  interface concerned, no more.\n"
    },
    {
      "commit": "f69bd9da8b1f7e0f297d4ffb370552fc41af3c81",
      "tree": "02352cf7c23e0f6feca56b39de18a11c66bea84b",
      "parents": [
        "a4e987e0b0b264bd3898f567cb7efec9b155d740"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Jun 03 18:01:50 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Jun 03 18:01:50 2005 +0000"
      },
      "message": "2005-06-03 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* ripd.c: (rip_create_socket) Make it static.\n\t  Remove the getservbyname stuff, as RFC2453 3.9.2 says non-RIP\n\t  port messages should be discarded, quagga doesnt accept them,\n\t  no need to lookup port.\n\t  Take a \u0027to\u0027 argument, if socket should be bound to something else.\n\t  setsockopt_so_recvbuf might need privs, move it to the raised\n\t  privileges section.\n\t  dont forget to close the socket if bind fails.\n\t  (rip_send_packet) use strncpy, just in case (address is under\n\t  our control anyway, but still).\n\t  dont duplicate rip_create_socket - just use it.\n\t  (rip_create) rip_create_socket takes an argument now, modify.\n"
    },
    {
      "commit": "a4e987e0b0b264bd3898f567cb7efec9b155d740",
      "tree": "42ec82321bcabe0829090710206556155dd89db9",
      "parents": [
        "a6570ee42f9d3a597c33b73931da5294b43b71ba"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Jun 03 17:46:49 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Jun 03 17:46:49 2005 +0000"
      },
      "message": "2005-06-03 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* ripd.c: (rip_create_socket) move it up so rip_send_packet\n\t  can use it too.\n"
    },
    {
      "commit": "7755a8c28388f7583c184fc1dcdd6225d75553bf",
      "tree": "522039e13af4a901525438e007130f3583f6a214",
      "parents": [
        "7e440869b51dde1da44f6ffc26643838a1e2b36d"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Thu Jun 02 08:20:53 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Thu Jun 02 08:20:53 2005 +0000"
      },
      "message": "2005-06-01 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* rip_interface.c: Fix authentication, no-auth impossible to specify\n\t  (rip_interface_new) default to RIP_NO_AUTH\n\t  (rip_interface_reset) ditto\n\t  (rip_interface_config_write) write out config for simple\n"
    },
    {
      "commit": "0cb8a01c38284a5a3f4ee4b017b69cd5f3e39f9a",
      "tree": "c3630492d44c8a9f45eed668e960d644f322f595",
      "parents": [
        "033e861222f07d68697aa883d9391a30c3e011c6"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Sun May 29 11:27:24 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Sun May 29 11:27:24 2005 +0000"
      },
      "message": "2005-05-29 Paul Jakma \u003cpaul@dishone.st\u003e\n\n\t* ripd.c: (rip_output_process) fix error which crept in my\n\t  previous rip auth untanglement commit - it had become impossible\n\t  to not have authentication (even for v1).\n"
    },
    {
      "commit": "033e861222f07d68697aa883d9391a30c3e011c6",
      "tree": "e21f614e529e61e4de6ed8c3d64cae12ed20c9c2",
      "parents": [
        "70601e0691e178ca23f14fdc666a97efce26897f"
      ],
      "author": {
        "name": "hasso",
        "email": "hasso",
        "time": "Sat May 28 04:50:54 2005 +0000"
      },
      "committer": {
        "name": "hasso",
        "email": "hasso",
        "time": "Sat May 28 04:50:54 2005 +0000"
      },
      "message": "Sync bgpd and ripd set_metric_addsub_cmd commands. Fixes bugzilla #192.\n[backport candidate]\n"
    },
    {
      "commit": "dc625e86063125f8ecaaa1502c3cf53f44d76eff",
      "tree": "243a52620109d888335b26cf8fdf98052b62e801",
      "parents": [
        "cf96db1cef3e039f3a87c0bc36206b882e804949"
      ],
      "author": {
        "name": "hasso",
        "email": "hasso",
        "time": "Thu May 26 06:26:40 2005 +0000"
      },
      "committer": {
        "name": "hasso",
        "email": "hasso",
        "time": "Thu May 26 06:26:40 2005 +0000"
      },
      "message": "\t* rip_routemap.c: In case of \u00270.0.0.0\u0027 used as \u0027nexthop\u0027, use sender\n\t  address as nexthop in routemap.\n\n\tFixes bugzilla #186. [backport candidate]\n"
    },
    {
      "commit": "cf96db1cef3e039f3a87c0bc36206b882e804949",
      "tree": "10c9cb9bae5772bdfb340ae263b59a3d4deb3ce4",
      "parents": [
        "b5f29603399070041289729e175fbec085e8e904"
      ],
      "author": {
        "name": "hasso",
        "email": "hasso",
        "time": "Wed May 25 21:15:32 2005 +0000"
      },
      "committer": {
        "name": "hasso",
        "email": "hasso",
        "time": "Wed May 25 21:15:32 2005 +0000"
      },
      "message": "\t* rip_routemap.c: Make \"match interface\" routemap command match both -\n\t  in and out interfaces.\n\n\tFixes bugzilla #185. [backport candidate]\n"
    },
    {
      "commit": "d4e47287efd60f77b473f8d5677e4dac08c192b0",
      "tree": "06dfe25619e4cee9601a92b07b7a61625c0f6c4a",
      "parents": [
        "42c981994adcf7fb2e1c2bea170cc5f196d5a1d7"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Wed May 11 15:56:21 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Wed May 11 15:56:21 2005 +0000"
      },
      "message": "2005-05-11 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* rip_interface.c (rip_interface_add): Need to call\n\t  rip_passive_interface_apply (was already calling it in\n\t  rip_interface_up).\n\n\t[backport candidate]\n"
    }
  ],
  "next": "634f9ea20fce82c94407cb677b5487b65bde1973"
}
