)]}'
{
  "log": [
    {
      "commit": "fac3c2453a06bce773a3f4ae6834f5f9a317b88c",
      "tree": "00b1e95d9fc2d148d1731967ccd104af3f7615c6",
      "parents": [
        "27f689793a25a66cf62561ac1d1302e01983a805"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@diac24.net",
        "time": "Sat Apr 28 22:37:20 2012 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@diac24.net",
        "time": "Sat Apr 28 22:37:20 2012 +0200"
      },
      "message": "bgpd: fix up multipath merge breakage\n\nthe BGP multipath code was developed against a pre-f6f434b Quagga where\nbgp_attr_unintern and ecommunity_free took single-star pointers.  They\nnow take double-star pointers.\n\n  * bgpd/bgp_mpath.c: fix up bgp_attr_unintern \u0026 ecommunity_free calls.\n\nSigned-off-by: David Lamparter \u003cequinox@diac24.net\u003e\n"
    },
    {
      "commit": "fa4094ac49b4cc23589f5c5b7e608c4b4ee6ca04",
      "tree": "6ee1470a3db1d3e09e455a34a41b6b5db4296847",
      "parents": [
        "7939e016b3d4ecd2f5b8ad708b69607e05a084a6"
      ],
      "author": {
        "name": "Jorge Boncompte [DTI2]",
        "email": "jorge@dti2.net",
        "time": "Fri Apr 13 13:46:09 2012 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@diac24.net",
        "time": "Mon Apr 16 18:37:17 2012 +0200"
      },
      "message": "bgpd: Fix crash when disabling dampening (BZ#687)\n\n    Vladimir Podobaev reported that the following commands crashed the\ndaemon.\n\nrouter bgp 123\n bgp dampening\n no bgp dampening 1 2 3 4\n no bgp dampening\n\n    The problem was that bgp_damp_info_clean() tried to dereference the\nalready freed reuse_list array in the second call to \"no bgp dampening\".\n\n    Fixed by checking in bgp_damp_disable() that the dampening it\u0027s\nenabled before doing the cleanup.\n\nSigned-off-by: Jorge Boncompte [DTI2] \u003cjorge@dti2.net\u003e\n"
    },
    {
      "commit": "6e493a44836d3b034ed3421e866878de3fbfcc5b",
      "tree": "4edabbbca2126db9aa29b9901ada950c635c17e2",
      "parents": [
        "9bb5870e26a4089f599b24adf822c4d1a9870a44",
        "3b381c32fc2c325cc4ffb9f9f30a7e96e9bd87c6"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@diac24.net",
        "time": "Mon Apr 16 16:46:13 2012 +0200"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@diac24.net",
        "time": "Mon Apr 16 16:46:17 2012 +0200"
      },
      "message": "bgpd: merge osr/quagga-osr-patches (BZ#700)\n\nthis merges a bgp capability negotiation fix where bgpd would fail if no\nmultiprotocol capability was present, but other capabilities were.\n"
    },
    {
      "commit": "3cf6c2b4e43f44a977d218c96c26250654ae333e",
      "tree": "e017cde2015fbf3ef6c250327428d7c6152aa8f7",
      "parents": [
        "01d7ff0a2166a422c56bd26f04fc22832a9e690b",
        "e96b312150d8e376c1ef463793d1929eca3618d5"
      ],
      "author": {
        "name": "Avneesh Sachdev",
        "email": "avneesh@opensourcerouting.org",
        "time": "Mon Apr 09 00:25:15 2012 -0700"
      },
      "committer": {
        "name": "Avneesh Sachdev",
        "email": "avneesh@opensourcerouting.org",
        "time": "Mon Apr 09 00:25:15 2012 -0700"
      },
      "message": "Merge branch \u0027quagga\u0027 into google-bgp-multipath\n\nConflicts:\n\tbgpd/bgp_route.c\n"
    },
    {
      "commit": "3b381c32fc2c325cc4ffb9f9f30a7e96e9bd87c6",
      "tree": "b4eb46f5fe28b4734723c9ff4227a94a5bd32b4e",
      "parents": [
        "e96b312150d8e376c1ef463793d1929eca3618d5"
      ],
      "author": {
        "name": "Avneesh Sachdev",
        "email": "avneesh@opensourcerouting.org",
        "time": "Sun Feb 19 10:19:52 2012 -0800"
      },
      "committer": {
        "name": "Avneesh Sachdev",
        "email": "avneesh@opensourcerouting.org",
        "time": "Sun Apr 08 13:46:29 2012 -0700"
      },
      "message": "bgpd: fix issue in capability negotiation (BZ#700)\n\nAddress problem where bgpd would reject a session if a peer sent some\ncapabilities in its Open message, but did not include a Multiprotocol\nextensions capability. Note that the session would come up if there\nwere no capabilities at all in the Open message.\n\n  * Add the \u0027mp_capability\u0027 out parameter to\n    bgp_capability_parse(). Set it to \u00271\u0027 if a Multiprotocol\n    extensions capability is encountered.\n\n  * Switch on \u0027mp_capability\u0027 instead of \u0027capability\u0027 in the calling\n    functions to determine if the peer indicated the set of AFI/SAFIs\n    it supports.\n\n    The net result is that when a peer does not send an MP capability,\n    it is assumed to support the AFI/SAFIs configured for it locally.\n"
    },
    {
      "commit": "fa5831e85ae9ba7008fb4b4e2d4c7561ae5cb697",
      "tree": "5653d8127ad212e6d251fb078afef50fc262353b",
      "parents": [
        "fa61e16ddebe10a71d98bcd2eba0f630071ea4a7"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue Mar 27 11:54:04 2012 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue Mar 27 11:54:04 2012 +0100"
      },
      "message": "bgpd: bgp_attr_flags_diagnose shouldn\u0027t assert\n\n* bgpd/bgp_attr.c: (bgp_attr_flags_diagnose) debug code for error-handling\n  paths probably shouldn\u0027t assert, instead it should just log that there\n  was no problem.\n"
    },
    {
      "commit": "fa61e16ddebe10a71d98bcd2eba0f630071ea4a7",
      "tree": "bc301257fdb4dbac4aedf1e17ffa3e6c00a77612",
      "parents": [
        "683f2b86d89fa356d3d1f7a54b0c269baa38b836"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sun Mar 25 21:31:47 2012 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue Mar 27 11:48:38 2012 +0100"
      },
      "message": "bgpd: attr_parse call to attr_malformed should deal with PROCEED error case\n\n* bgpd/bgp_attr.c: (bgp_attr_parse) the invalid flag check call to\n  bgp_attr_malformed is pretty useless if it doesn\u0027t actually allow\n  for the PROCEED non-error case.\n"
    },
    {
      "commit": "683f2b86d89fa356d3d1f7a54b0c269baa38b836",
      "tree": "0788f6ea3f9079d3c1d775c49cd4cd881e44d204",
      "parents": [
        "bd471fea4ec965c71d6c2201745995092fbc36f6"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Mar 23 14:58:45 2012 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue Mar 27 11:48:35 2012 +0100"
      },
      "message": "bgpd: Fix silly mistake in bgp_attr_flag_invalid\n\n* bgp_attr.c: (bgp_attr_flag_invalid) flags is meant to be masked\n  off with the mask variable...\n"
    },
    {
      "commit": "bd471fea4ec965c71d6c2201745995092fbc36f6",
      "tree": "1d07d21b35101724d98107d47f4cd214800b4489",
      "parents": [
        "81c3e5006e5d29e305cbc0ab482617d7e570e8c0"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Thu Mar 15 11:30:00 2012 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sun Mar 25 21:33:51 2012 +0100"
      },
      "message": "bgpd: malformed attribute error that can still proceed should fixup getp\n\n* bgp_attr.c: (bgp_attr_malformed) When a malformed attribute error can be\n  ignored, and BGP message processing may still proceed, the stream getp\n  should be adjusted to the end of the attribute - the caller may not have\n  consumed all the attribute. Problem noted by Martin Winter in bug 678.\n\n  Also, rename the \u0027startp\u0027 local to \u0027notify_datap\u0027, for clarity.\n"
    },
    {
      "commit": "9fc75742397cf942ca9d684815ce63058b2576ff",
      "tree": "3655b28f06ac2bdf9639b86e2df7c3abc525cd73",
      "parents": [
        "543fb49c316df9af2d25f08ba7e0da0305c36b5e",
        "5861739f8c38bc36ea9955e5cb2be2bf2f482d70"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Mar 05 11:55:53 2012 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Mar 05 11:55:53 2012 +0000"
      },
      "message": "Merge remote-tracking branch \u0027quagga-gnu.org/master\u0027\n"
    },
    {
      "commit": "5861739f8c38bc36ea9955e5cb2be2bf2f482d70",
      "tree": "9675845a0b3be97362f3426430c6c2e499e8525c",
      "parents": [
        "50e7a3885da44f8f6c5c639e111109deb055cdf3"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 09 20:59:26 2012 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sun Mar 04 23:55:02 2012 +0000"
      },
      "message": "bgpd: Open option parse errors don\u0027t NOTIFY, resulting in abort \u0026 DoS\n\n* bgp_packet.c: (bgp_open_receive) Errors from bgp_open_option_parse are\n  detected, and the code will stop processing the OPEN and return.  However\n  it does so without calling bgp_notify_send to send a NOTIFY - which means\n  the peer FSM doesn\u0027t get stopped, and bgp_read will be called again later.\n  Because it returns, it doesn\u0027t go through the code near the end of the\n  function that removes the current message from the peer input streaam.\n  Thus the next call to bgp_read will try to parse a half-parsed stream as\n  if it were a new BGP message, leading to an assert later in the code when\n  it tries to read stuff that isn\u0027t there. Add the required call to\n  bgp_notify_send before returning.\n* bgp_open.c: (bgp_capability_as4) Be a bit stricter, check the length field\n  corresponds to the only value it can be, which is the amount we\u0027re going to\n  read off the stream. And make sure the capability flag gets set, so\n  callers can know this capability was read, regardless.\n  (peek_for_as4_capability) Let bgp_capability_as4 do the length check.\n"
    },
    {
      "commit": "835315bfb49bff2b2fb354f2075c6d6693c2a151",
      "tree": "b9cc49ef796bcb1e3836ff670da930765815acfa",
      "parents": [
        "3ecab4c8549574d09f8d8366098939a8ad3da6c4"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jan 18 12:28:30 2012 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue Feb 28 18:35:45 2012 +0000"
      },
      "message": "bgpd: Move up flag-check calls, parcel up attr-parser args, and other cleanups\n\n* bgp_attr.h: (struct bgp_attr_parser_args) Attribute parsing context,\n  containing common arguments.\n* bgp_attr.c: (general) Move the bgp_attr_flag_invalid flag-check calls up,\n  out of each individual attr parser function, to be done once in attr_parse.\n\n  Similarly move the calculation of the \u0027total\u0027 attribute length field up\n  to attr_parse.\n\n  Bundle together common arguments to attr-parsing functions and helpers\n  into (struct bgp_attr_parser_args), so it can be passed by reference down\n  the stack \u0026 also de-clutter the argument lists \u0026 make it easier to\n  add/modify the context for attr-parsing - add local const aliases to avoid\n  modifying body of code too much. This also should help avoid cut \u0026 paste\n  errors, where calls to helpers with hard-coded attribute types are pasted\n  to other functions but the code isn\u0027t changed.\n\n  (bgp_attr_flags_diagnose) as above.\n  (bgp_attr_flag_invalid) as above.\n  (bgp_attr_{origin,aspath,as4_path,nexthop,med,local_pref,atomic}) as above.\n  (bgp_attr_{aggregator,as4_aggregator,community,originator_id}) as above\n  (bgp_attr_{cluster_list,ext_communities},bgp_mp_{un,}reach_parse) as above\n  (bgp_attr_unknown) as above.\n\n  (bgp_attr_malformed) as above. Also, startp and length have to be\n  special-cased, because whether or not to send attribute data depends\n  on the particular error - a separate length argument, distinct from\n  args-\u003elength, indicates whether or not the attribute data should be sent\n  in the NOTIFY.\n  (bgp_attr_aspath_check) Call to bgp_attr_malformed is wrong here, there is\n  no attribute parsing context - e.g. the \u0027flag\u0027 argument is unlikely to be\n  right, remove it. Explicitly handle the error instead.\n  (bgp_attr_munge_as4_attrs) Flag argument is pointless.\n\n  As the comment notes, the check here is pointless as AS_PATH presence\n  already checked elsewhere.\n\n  (bgp_attr_parse) Do bgp_attr_flag_invalid call here.\n  Use (struct bgp_attr_parser_args) for args to attr parser functions.\n  Remove out-of-context \u0027flag\u0027 argument to as4 checking functions.\n"
    },
    {
      "commit": "3ecab4c8549574d09f8d8366098939a8ad3da6c4",
      "tree": "7b8281980887ef0c57485be0ca6f382c054762cd",
      "parents": [
        "b5043aabb03567b46a16463d88a8afce2acda35e"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue Jan 17 13:31:33 2012 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue Feb 28 18:35:45 2012 +0000"
      },
      "message": "bgpd: consolidate attribute flag checks\n\n* bgpd/bgp_attr.c: (attr_flags_values []) array of required flags for\n  attributes, EXTLEN \u0026 PARTIAL masked off as \"dont care\" as appropriate.\n  (bgp_attr_flag_invalid) check if flags may be invalid, according to\n  the above table \u0026 RFC rules.\n  (bgp_attr_*) Use bgp_attr_flag_invalid.\n  (bgp_attr_as4_aggregator) ditto, also take startp argument for the\n  NOTIFY data.\n  (bgp_attr_parse) pass startp to bgp_attr_as4_aggregator\n"
    },
    {
      "commit": "73bfe0bd9adb8e4dfcee7239e56a425c6d58f4e9",
      "tree": "e2f5dd3fc170a28d9aff622a8c5af77f3ebf7e45",
      "parents": [
        "f768f367bcd1f37a53c563495176a5a134caf234"
      ],
      "author": {
        "name": "G.Balaji",
        "email": "balajig81@gmail.com",
        "time": "Fri Sep 23 22:36:20 2011 +0530"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Mon Jan 23 14:31:05 2012 +0400"
      },
      "message": "bgpd: Addition of ipv6 network command in Multicast address family mode.\n\n      The patch adds the ipv6 network command in the BGP multicast address\n      family mode.\n"
    },
    {
      "commit": "c7ec179a95c1ed4fcd3d3be3f981c8c20dce534a",
      "tree": "add6824e168ab26a28390a1d1b9a2c7be1484435",
      "parents": [
        "cddf391bf6839e9f093cef15508669c1f3f92122"
      ],
      "author": {
        "name": "G.Balaji",
        "email": "balajig81@gmail.com",
        "time": "Sat Nov 26 22:04:05 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Mon Jan 23 14:30:50 2012 +0400"
      },
      "message": "bgpd: IPv6 MP-BGP Routes addition and deletion\n\nThis patch contains the following:\n1. Addition of IPv6 SAFI_MULTICAST BGP routes into the BGP Multicast RIB.\n2. Deletion of IPv6 SAFI_MULTICAST BGP routes from the BGP Multicast RIB.\n"
    },
    {
      "commit": "5a616c08ce089e25dc0e8da920727af4d11279bf",
      "tree": "4b5650d6602d06d0188102469e3b402abe81f16a",
      "parents": [
        "6ae93c058725991df5a9ae35cefec368919b5fea"
      ],
      "author": {
        "name": "G.Balaji",
        "email": "balajig81@gmail.com",
        "time": "Sat Nov 26 21:58:42 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Mon Jan 23 14:30:33 2012 +0400"
      },
      "message": "bgpd: IPv4 MP-BGP Routes addition and deletion\n\nThis patch contains the following:\n1. Addition of IPv4 SAFI_MULTICAST BGP routes into the BGP Multicast RIB.\n2. Deletion of IPv4 SAFI_MULTICAST BGP routes from the BGP Multicast RIB.\n"
    },
    {
      "commit": "fc98d16ea77372f4ab4231e8904f8467e8d1ef71",
      "tree": "ad69423081bd300c5a60262f947760ac7189744f",
      "parents": [
        "dc00d2bb56aa6a84dd2328133f69db3c3e6d9dc7"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 09 11:36:23 2012 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 09 11:36:23 2012 +0000"
      },
      "message": "bgpd: reinstate zlookup checks, required for BGP without zebra\n\n* bgp_nexthop.c: The nexthop lookup cache has to return success for queried\n  nexthops if bgpd isn\u0027t connected to zebra, or else BGP without zebra doesn\u0027t\n  work.\n"
    },
    {
      "commit": "f31d6927b2df4340bf9ff1cc9f20d52e168a3766",
      "tree": "638f95d929b07067f5cac70f21d40a4b94e1f8f9",
      "parents": [
        "83a9a2213a73aeb9796b69327c87e89e2d3327ed"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sun Jan 08 14:17:42 2012 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sun Jan 08 14:21:55 2012 +0000"
      },
      "message": "bgpd: Fix incorrect attribute type code in call to bgp_attr_malformed\n"
    },
    {
      "commit": "83a9a2213a73aeb9796b69327c87e89e2d3327ed",
      "tree": "ed0ef43739f593a3163309a128b179d66ceec4d8",
      "parents": [
        "9ed79b53eb89b8a663eb368ef5f7d47701f231df"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sun Jan 08 14:15:03 2012 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sun Jan 08 14:15:03 2012 +0000"
      },
      "message": "bgpd: Improve flag error messages in bgp_attr_aspath\n\n* bgpd/bgp_attr.c: (bgp_attr_aspath) error message could be misleading,\n  clearly log what flag was incorrect.\n\n  (Problem noted in \"bgpd: fix error message in bgp_attr_aspath()\" in\n   Quagga-RE)\n"
    },
    {
      "commit": "afcb767922509c4d998f1c567e350b9809c148ab",
      "tree": "ce9f742f0471377337e36235dee73a39e17cb7b0",
      "parents": [
        "d8bcd9e9c6a1801b52b166fa3873eb468ac3c5cb"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Sun Oct 23 22:32:44 2011 +0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sun Jan 08 12:57:35 2012 +0000"
      },
      "message": "bgpd: rewrite attr flag error logging\n\n* bgp_attr.c\n  * attr_flag_str: new message list\n  * bgp_attr_flags_diagnose(): new function, implements previously added\n    error logging in a generic way\n  * bgp_attr_origin(): use bgp_attr_flags_diagnose()\n  * bgp_attr_nexthop(): ditto\n  * bgp_attr_med(): ditto\n  * bgp_attr_local_pref(): ditto\n  * bgp_attr_atomic(): ditto\n  * bgp_attr_originator_id(): ditto\n  * bgp_attr_cluster_list(): ditto\n  * bgp_mp_reach_parse(): ditto\n  * bgp_mp_unreach_parse(): ditto\n"
    },
    {
      "commit": "0e8032d69961ae196c11ba6ead856084c7acf7c2",
      "tree": "f9adf1934b0b34fd3e4db4896bc83c05e471d234",
      "parents": [
        "b64bfc1c4a552fc0b4dd024d5f77171ec848a5df"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Tue Aug 09 14:42:58 2011 +0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sun Jan 08 11:31:50 2012 +0000"
      },
      "message": "bgpd: improve \"show ip bgp scan detail\"\n\n* bgp_nexthop.c (show_ip_bgp_scan_tables): access proper structure field\n  in AF_INET6 case, handle ifindex NH type properly\n"
    },
    {
      "commit": "b64bfc1c4a552fc0b4dd024d5f77171ec848a5df",
      "tree": "f03661d27a79ae5810c861c643d85d810e885b87",
      "parents": [
        "318f0d8a7f5e8e87086bbf2a9e7c4b35638951ac"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Mon Aug 08 19:36:44 2011 +0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sun Jan 08 11:31:35 2012 +0000"
      },
      "message": "bgpd: dismiss some zlookup checks\n\nbgp_nexthop_onlink(): zlookup is not used here at all\nbgp_nexthop_lookup_ipv6(): rely on the detection performed by \"query\"\n  function (this also changes the fallback value to 0), reorder if-block\nbgp_nexthop_lookup(): idem\n"
    },
    {
      "commit": "318f0d8a7f5e8e87086bbf2a9e7c4b35638951ac",
      "tree": "deab95315df2b315ba5b03162c43b61cb6c9ff2b",
      "parents": [
        "8e80bdf20f493a71bcf74262ed3aa3a2437f4df6"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Fri Aug 05 21:47:08 2011 +0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sun Jan 08 11:31:17 2012 +0000"
      },
      "message": "bgpd: add \"show ip bgp scan detail\" command\n\n* bgp_nexthop.c: (show_ip_bgp_scan) transform into\n  show_ip_bgp_scan_tables(), which uses inet_ntop() and can dump\n  nexthops on request; (show_ip_bgp_scan_detail_cmd) new function\n"
    },
    {
      "commit": "8e80bdf20f493a71bcf74262ed3aa3a2437f4df6",
      "tree": "b1ebddbda4b8f12a28c3ce6299ebe931105a25b6",
      "parents": [
        "23be94ea00fadace0007b6ffa6c9107124249e91"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Fri Aug 05 18:52:52 2011 +0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sun Jan 08 11:30:55 2012 +0000"
      },
      "message": "bgpd: touch nexthop handling code\n\nbgp_nexthop_lookup_ipv6(): declare variables where they are actually\nused, drop no-op initialization (the field is already 0)\nbgp_nexthop_lookup(): ditto\nbgp_nexthop_check_ebgp(): rename to bgp_nexthop_onlink()\nbgp_nexthop_cache_changed(): rename to bgp_nexthop_cache_different()\n"
    },
    {
      "commit": "f63f06da2e7be6b17c72dd6110aae179f42f3700",
      "tree": "a36b625a9ea06d0720a240276ed1b8af33193ed7",
      "parents": [
        "651e70d7f419ee7af75113f80e688c0100e9cff5"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Apr 08 12:44:43 2011 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Jan 06 16:18:18 2012 +0000"
      },
      "message": "general: remove inline qualifiers and move in-header functions to objects\n\n* (general) Move functions in headers into files, to be compiled into\n  shared object files. Remove inline qualifier from functions. Let the\n  compiler do the work.\n"
    },
    {
      "commit": "664711c1f4cc218073783ff6ce362093debd7b53",
      "tree": "5566b0c8b9d22de55772717ad6c701ea85b6241e",
      "parents": [
        "6fd16207fee6d4d09f29ed7ecf26303a7220e473"
      ],
      "author": {
        "name": "Ulrich Weber",
        "email": "ulrich.weber@sophos.com",
        "time": "Wed Dec 21 02:24:11 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Mon Jan 02 19:13:28 2012 +0400"
      },
      "message": "lib: fix some strtoul() use cases\n\n...otherwise 4294967295 is not a valid value on 32bit systems\n"
    },
    {
      "commit": "733cd9e5792648de50da3c00805aacb51cb27048",
      "tree": "606ec20aa51f16b7a49fd9f5ede27893bee9ace9",
      "parents": [
        "de5ccb96023181765c9904ab40e645c397f536d6"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Sat Dec 17 19:39:30 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Mon Jan 02 18:37:42 2012 +0400"
      },
      "message": "bgpd: justify checks for IPv4 class D/E\n\n* lib/prefix.h\n  * IPV4_CLASS_DE(): make consistent with counterpart macros\n* bgp_packet.c\n  * bgp_open_receive(): test using macro instead of \"\u003e\u003d\"\n* bgp_route.c\n  * bgp_update_rsclient(): idem\n  * bgp_update_main(): idem\n"
    },
    {
      "commit": "9206f9ecd5526778bf449bbb12f056d681d3b040",
      "tree": "cd11853fe47a30bb2a28838f6ad8f8d49300b4fa",
      "parents": [
        "b48cebbba0dc01ad7d1fbd7cbcc39a11e1ae972d"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "shemminger@vyatta.com",
        "time": "Sun Dec 18 19:43:40 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Sun Dec 18 20:21:21 2011 +0400"
      },
      "message": "fix set never used warnings\n\n(This patch was modified to leave calls to stream_getl() in place, they\nare necessary for the stream\u0027s internal pointer to advance to the\ncorrect position. -- Denis)\n\nSigned-off-by: Denis Ovsienko \u003cinfrastation@yandex.ru\u003e\n\nFix gcc warnings about varables that are set but never used.\n\n* bgpd/bgp_attr.c\n  * cluster_unintern(): ret\n  * transit_unintern(): ret\n  * bgp_attr_default_intern(): attre\n  * bgp_mp_reach_parse(): rd_high, rd_low\n* bgpd/bgp_route.c\n  * bgp_announce_check_rsclient(): bgp\n* bgpd/bgp_zebra.c\n  * zebra_read_ipv4(): ifindex\n  * zebra_read_ipv6(): ifindex\n* bgpd/bgpd.c\n  * bgp_config_write_peer(): filter\n* lib/distribute.c\n  * distribute_list_all(): dist\n  * distribute_list(): dist\n  * distribute_list_prefix_all(): dist\n  * distribute_list_prefix(): dist\n* lib/if_rmap.c\n  * if_rmap(): if_rmap\n* lib/vty.c\n  * vty_accept(): vty\n* lib/zclient.c\n  * zclient_read(): ret\n* zebra/irdp_interface.c\n  * if_group(): zi\n* zebra/rt_netlink.c\n  * kernel_read(): ret, sock\n"
    },
    {
      "commit": "bb915f5fa60de1a5b7e6089fcfc680281a590463",
      "tree": "e5ee800f9a18c1b8ebbe390e1762ad93fc778d9e",
      "parents": [
        "32ca97392057d279eeddd1aef36c1836880e8b89"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Tue Dec 13 21:11:39 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Tue Dec 13 21:11:39 2011 +0400"
      },
      "message": "bgpd: fix regression in ORF procesing (BZ#688)\n\nThis issue has been pointed out by Lou Berger and Tim Browski.\n\n* bgp_packet.c\n  * bgp_route_refresh_receive(): restore if() condition, which was\n    broken by commit fdbc8e77c88f751924299d0bc752371d5cc31116\n"
    },
    {
      "commit": "ca0512692156d5bbb902523d2f123fc89dbec1ab",
      "tree": "6dd0206cb175c3e790023f9e5d5d755b57181b0d",
      "parents": [
        "e0ca5fde7be5b5ce90dae78c2477e8245aecb8e9"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@diac24.net",
        "time": "Sun Oct 04 16:21:49 2009 +0200"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Tue Dec 13 19:23:38 2011 +0400"
      },
      "message": "lib: add sockopt helper for setting IPV6_V6ONLY and use it\n\ngetaddrinfo returns a list of socket parameters for listening. it\nwill contain both IPv4 and IPv6 listening sockets. unless we use\nIPV6_V6ONLY on the IPv6 ones, only the socket listed first will\nwork. if the IPv4 one came first, the IPv6 one would get an\n\"Address in use\" error.\n\nthis functionality was already present for bgpd and its listening\nsockets. as it is needed for vtys as well, make it a common helper.\n\nConflicts:\n\n\tlib/sockunion.c\n"
    },
    {
      "commit": "e0ca5fde7be5b5ce90dae78c2477e8245aecb8e9",
      "tree": "0e0b32ddbed4a84a3b2de9dd7217165cb81f52fa",
      "parents": [
        "ebf08631cad8a420fc6bfb7c45af5496dc11023e"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@diac24.net",
        "time": "Wed Sep 16 01:52:42 2009 +0200"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Tue Dec 13 19:13:17 2011 +0400"
      },
      "message": "lib: put route_types.txt to real use\n\nthis replaces most occurences of routing protocol lists by preprocessor\ndefines from route_types.h. the latter is autogenerated from\nroute_types.txt by a perl script (previously awk). adding a routing\nprotocol now is mostly a matter of changing route_types.txt and log.c.\n\nConflicts:\n\n\tlib/route_types.awk\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": "1add115a9cfd3a2ee33a61731008b6ece90ec61d",
      "tree": "934e618a134821e75266fef036153498c8017c9e",
      "parents": [
        "9a9446eabb8f153251d6d93d225a68ca44b436ac"
      ],
      "author": {
        "name": "Vyacheslav Trushkin",
        "email": "me@dogonthesun.net",
        "time": "Tue Nov 22 20:15:10 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Tue Dec 13 14:25:54 2011 +0400"
      },
      "message": "bgpd: implement \u0027match probability\u0027 in route-maps\n\nNew clause \u0027match probability \u003cpercentage value\u003e\u0027\nwas added in route-maps (bgpd/bgp_routemap.c modified).\n"
    },
    {
      "commit": "bde12e3fd5e498a266e813a5751c1b2d21e46ca5",
      "tree": "3a3a77cc2321925f3d00d192b994a4440da129a0",
      "parents": [
        "42a7debf3c76b8001ce820e104a29d2f693c7cb7"
      ],
      "author": {
        "name": "Ulrich Weber",
        "email": "ulrich.weber@sophos.com",
        "time": "Wed Nov 16 19:32:12 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Tue Dec 13 14:25:25 2011 +0400"
      },
      "message": "bgp: use VTY_GET_INTEGER_RANGE() in bgp_clear()\n\nSecond patch replaces \"VTY_GET_LONG (\"AS\", as_ul, arg);\"\nby \"VTY_GET_INTEGER_RANGE (\"AS\", as, arg, 1, BGP_AS4_MAX);\"\nas done in all other code, which parses AS numbers.\n"
    },
    {
      "commit": "04d5e24d7425a52f13abcb6d2a30aa6246d837e7",
      "tree": "a90bcdbe8f51f30c94dc5f10f4b5749e6dd6094e",
      "parents": [
        "46901400a3401a4a6caa40435241b4546bb2a5c5"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "shemminger@vyatta.com",
        "time": "Wed Dec 07 00:04:46 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Wed Dec 07 01:23:58 2011 +0400"
      },
      "message": "bgpd: cleanup privs on termination\n\nWhen doing valgrind testing, the privledges from zprivs_init() need\nto be cleaned up on exit.\n"
    },
    {
      "commit": "f04a80a5d209dbb54f6fec5d0149b7c0e489d29e",
      "tree": "aaf8378930b524b1bfc9c5326d738a172c255b4b",
      "parents": [
        "fb01f87f4f50744206222343a780721af19fe56c"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "shemminger@vyatta.com",
        "time": "Tue Dec 06 14:51:10 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Tue Dec 06 15:03:00 2011 +0400"
      },
      "message": "bgpd: store nexthop info for redistributed IPV6 routes\n\nBGP was ignoring nexthop info for static and other redistributed\nroutes for IPv6.  Build extra attribute info to store the nexthop.\nSee also:\n  https://bugzilla.vyatta.com/show_bug.cgi?id\u003d6073\n"
    },
    {
      "commit": "ce0af6ff5a4f200035ed4134da72a67f49a21dd6",
      "tree": "1f085a210596f3f5875030c92ba3252933102149",
      "parents": [
        "1ffe5e794c3cd4a2ef84cac937d377de89b721f8"
      ],
      "author": {
        "name": "Oleg A. Arkhangelsky",
        "email": "sysoleg@yandex.ru",
        "time": "Sat Dec 03 15:18:19 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Sat Dec 03 15:18:19 2011 +0400"
      },
      "message": "bgpd: fix memory leak for extra attributes\n\nthis fixes commit b881c7074bb698aeb1b099175b325734fc6e44d2\n"
    },
    {
      "commit": "2fbd6f5a62f654c59aec5e1707c859d6ed79c6b0",
      "tree": "cc70afc89da575cdb739d7e1723632e7b75b654c",
      "parents": [
        "1727d2e2b939c8670d0f0e0d1a0e5eb0a8be2135"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@diac24.net",
        "time": "Tue Feb 02 20:20:35 2010 +0100"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Mon Nov 21 19:42:05 2011 +0400"
      },
      "message": "bgpd: remove unused function bgp_bind_address\n\nbgp_bind_address is replaced with sockunion_bind.\n"
    },
    {
      "commit": "1727d2e2b939c8670d0f0e0d1a0e5eb0a8be2135",
      "tree": "3bdfda661f96113d61eae25059608d468a8ea4cc",
      "parents": [
        "17e52061bacec93e84324b23382e5ec61e1f16d0"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@diac24.net",
        "time": "Tue Feb 02 20:18:23 2010 +0100"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Mon Nov 21 19:41:59 2011 +0400"
      },
      "message": "bgpd: fix update-source for IPv6 (BZ#548)\n\nif update-source was given as interface name, bgpd was unconditionally\ntrying to bind to an IPv4 address from that interface.\n\nchange function to find the best-matching (number of address bits)\nsame-family address on the interface.\n"
    },
    {
      "commit": "3cf1288bfd855e339fe2283c79a3ef3746e61737",
      "tree": "bbc6600328c20861512c4e26928ffce4cf9c5878",
      "parents": [
        "5c88f19d5b166c6afa8a9b8501badb785afa553b"
      ],
      "author": {
        "name": "Dylan Hall",
        "email": "dylan@deedums.com",
        "time": "Thu Oct 27 15:28:17 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Tue Nov 15 21:35:11 2011 +0400"
      },
      "message": "bgpd: fix \"nexthop-local unchanged\" (BZ#350)\n"
    },
    {
      "commit": "5c88f19d5b166c6afa8a9b8501badb785afa553b",
      "tree": "98261a13d284bb6b3fe0028a3d17e50c763fc324",
      "parents": [
        "4de148e5d6f6f7885b2c0952a236a3bc3ec36250"
      ],
      "author": {
        "name": "Chris Luke",
        "email": "chrisy@flirble.org",
        "time": "Tue Oct 18 17:26:51 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Tue Nov 15 20:57:02 2011 +0400"
      },
      "message": "bgpd: justify capabilities for TOS setting\n\nTo set the TOS bits on TCP connections, platforms that restrict\ncapabilities need the priv level to be raised before the sockopt\nis set, and this requires the ZCAP_NET_ADMIN priv.\n\n* bgp_main.c: update _caps_p to include ZCAP_NET_ADMIN\n* bgp_network.c\n  * bgp_connect(): request ZPRIVS_RAISE/ZPRIVS_LOWER\n  * bgp_listener(): request ZPRIVS_RAISE earlier\n"
    },
    {
      "commit": "1758dbaa3b69bd6e95fb501c40f044f751557e76",
      "tree": "7021223a0aea1c052e831f1bc044bc3c49ad09ab",
      "parents": [
        "267551879e57a5c590f9e12b3a7d6985b28b3dac"
      ],
      "author": {
        "name": "Sergey Y. Afonin",
        "email": "asy@altlinux.ru",
        "time": "Thu Oct 27 17:01:11 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Tue Nov 15 20:45:17 2011 +0400"
      },
      "message": "bgpd: revised fix to --dryrun (BZ#622)\n"
    },
    {
      "commit": "267551879e57a5c590f9e12b3a7d6985b28b3dac",
      "tree": "aeb0f826f3ea541de99d0988794f1454ab3b9e35",
      "parents": [
        "b4cd2421518be7e18046e974e25b9bf4cf769bd2"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Wed Oct 26 19:34:30 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Wed Oct 26 19:38:49 2011 +0400"
      },
      "message": "bgpd: fix 2 more cases of length error reporting\n\n* bgp_attr.c (bgp_attr_originator_id, bgp_attr_cluster_list): provide\n  required arguments to bgp_attr_malformed()\n"
    },
    {
      "commit": "b4cd2421518be7e18046e974e25b9bf4cf769bd2",
      "tree": "43a94afcebc8b878040f771de5f0e542bb6bc440",
      "parents": [
        "bbb04bf3bb03be27fbf17b6b3ee903b168201cf0"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Sat Oct 22 22:32:26 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Sat Oct 22 22:32:26 2011 +0400"
      },
      "message": "bgpd: check AGGREGATOR attr flags (BZ#678)\n\n* bgp_attr.c\n  * bgp_attr_aggregator(): check Optional/Transitive flag bits\n"
    },
    {
      "commit": "bbb04bf3bb03be27fbf17b6b3ee903b168201cf0",
      "tree": "8db00c5a6db16254146e064bfb350f536cc90e02",
      "parents": [
        "abc384f85b622471ef5ba6c86acc540856da05cf"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Tue Oct 18 14:20:04 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Wed Oct 19 17:28:01 2011 +0400"
      },
      "message": "bgpd: fix more regressions in attr flag checks\n\nCommit 05a4936b713b9882171d0f7fb20b8439df23939e fixed some of the\nattributes involved, but not all. This commit should do it.\n\n* bgp_attr.c\n  * bgp_attr_originator_id()\n  * bgp_attr_cluster_list()\n  * bgp_mp_reach_parse()\n  * bgp_mp_unreach_parse()\n"
    },
    {
      "commit": "abc384f85b622471ef5ba6c86acc540856da05cf",
      "tree": "5bb225c251c3667b12e7b5cb08dd1455dde5b072",
      "parents": [
        "565b828dc00cafd477dd69ce15f0f551ece67710"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Tue Oct 18 13:55:07 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Tue Oct 18 13:55:07 2011 +0400"
      },
      "message": "bgpd: use bgp_attr_malformed()\n\nSome of the recent attribute flags/length checks copied from QRE use\nbgp_notify_send_with_data() directly, but master branch assumes\nusing bgp_attr_malformed().\n\n* bgp_attr.c\n  * bgp_attr_med()\n  * bgp_attr_local_pref()\n  * bgp_attr_atomic()\n  * bgp_attr_originator_id()\n  * bgp_attr_cluster_list()\n  * bgp_mp_reach_parse()\n  * bgp_mp_unreach_parse()\n"
    },
    {
      "commit": "565b828dc00cafd477dd69ce15f0f551ece67710",
      "tree": "e1d5c6c38f89b6d022339df14c9b5224de7c0ca9",
      "parents": [
        "f8627ff1ef7642c8ee4758b1f046ef0d166dfbec"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Mon Oct 10 21:08:33 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Mon Oct 17 19:07:02 2011 +0400"
      },
      "message": "bgpd: add flag checks for MP_(UN)REACH_NLRI\n\n* bgp_attr.[ch]\n  * bgp_mp_reach_parse(): add extra arguments and a uniform flag\n    check block\n  * bgp_mp_unreach_parse(): idem\n  * bgp_attr_parse(): provide extra arguments\n* bgp_mp_attr_test.c\n  * parse_test(): justify respective calls\n"
    },
    {
      "commit": "f8627ff1ef7642c8ee4758b1f046ef0d166dfbec",
      "tree": "60fa75de6532991858f718aebfcabc19a745f081",
      "parents": [
        "0b83044b91d7ea50824cfd803d77213b9ff38ed9"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Mon Oct 10 16:52:20 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Mon Oct 17 19:03:56 2011 +0400"
      },
      "message": "bgpd: fix spelling of CLUSTER_LIST\n"
    },
    {
      "commit": "0b83044b91d7ea50824cfd803d77213b9ff38ed9",
      "tree": "a18f7841fa039c1236ef5ea4770c0f0a5b81d3b1",
      "parents": [
        "d595b566bca1de8b026c469a31ae50f2aee11781"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Fri Sep 30 15:12:17 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Mon Oct 17 19:03:31 2011 +0400"
      },
      "message": "bgpd: check CLUSTER_LIST attribute flags\n\n* bgp_attr.c\n  * bgp_attr_cluster_list(): accept extra argument, add checks for\n    \"optional\", \"transitive\" and \"partial\" bits, log each error\n    condition independently\n  * bgp_attr_parse(): provide extra arguments\n"
    },
    {
      "commit": "d595b566bca1de8b026c469a31ae50f2aee11781",
      "tree": "1572e36687c8666c8f0c8519addc94f9d2c886af",
      "parents": [
        "566b36ebf903fd873c974ba34c19097d8fb48ce4"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Fri Sep 30 15:08:54 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Mon Oct 17 19:02:55 2011 +0400"
      },
      "message": "bgpd: check ORIGINATOR_ID attribute flags\n\n* bgp_attr.c\n  * bgp_attr_originator_id(): accept extra argument, add checks for\n    \"optional\", \"transitive\" and \"partial\" bits, log each error\n    condition independently\n  * bgp_attr_parse(): provide extra arguments\n"
    },
    {
      "commit": "6d0732c8abad7ace509d033a41814ea03a3a1b16",
      "tree": "d20c537d0e16cb5245047d8ecd9990201a4fb3b6",
      "parents": [
        "a5b228b3792937c93b589938a2545b9311b7938e"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "shemminger@vyatta.com",
        "time": "Wed Sep 28 14:23:35 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Mon Oct 17 18:59:19 2011 +0400"
      },
      "message": "IPv6 transport class suppport\n\nIPv6 supports the same concept of differentiated service for routing\nprotocols as IPv4, but like too many things, the standards committee\ndecided that having two names for the same thing wasn\u0027t good enough and\nintroduced a third more generic term transport class.\n\nThe socket option to set transport class works the same as IPv4, but the\narguments are different.\n\n* lib/sockopt.[ch]\n  * setsockopt_ipv6_tclass(): new function\n* bgpd/bgp_network.c\n  * bgp_connect(): set socket option\n  * bgp_listener(): set socket option\n* ospf6d/ospf6_network.c\n  * ospf6_set_transport_class(): new function\n  * ospf6_serv_sock(): set socket option\n* ripngd/ripngd.c\n  * ripng_make_socket(): set socket option\n"
    },
    {
      "commit": "a5b228b3792937c93b589938a2545b9311b7938e",
      "tree": "59c22c60531b0fe2a4ceeb0d8cc1070af1312a9d",
      "parents": [
        "21cc76941abc60b5b5ece0a71ace0b69d6f4572c"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Wed Oct 12 13:54:21 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Wed Oct 12 13:59:09 2011 +0400"
      },
      "message": "bgpd: fix regression in improved attr flag checks\n\nCommit 2febf323411c1aed9d7694898f852ce2ef36a7e5 assumed every flag\nbit except optional/transitive/partial unset, which at times could\nnot be true for \"extended length\" bit.\n\n* bgp_attr.c\n  * bgp_attr_origin(): exclude BGP_ATTR_FLAG_EXTLEN from comparison\n  * bgp_attr_nexthop(): idem\n  * bgp_attr_med(): idem\n  * bgp_attr_local_pref(): idem\n  * bgp_attr_atomic(): idem\n"
    },
    {
      "commit": "21cc76941abc60b5b5ece0a71ace0b69d6f4572c",
      "tree": "a81b361e0771c7a3bcddebad35158edad00f219f",
      "parents": [
        "a624cae2b210a0e81c80c473f86b73e2be169962"
      ],
      "author": {
        "name": "Peter Pentchev",
        "email": "roam@ringlet.net",
        "time": "Mon Sep 12 16:30:31 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Sat Oct 08 20:17:21 2011 +0400"
      },
      "message": "bgpd: fix parsing of graceful restart cap. (#663)\n\n\"While setting up a testbed, I ran across a little problem in the\nparsing of the \"graceful restart\" BGP capability that resulted in\nQuagga not actually activating it for the peer in question - when\nthe peer sent a single AFI/SAFI block.\"\n\n* bgp_open.c\n  * bgp_capability_restart(): actually process the last AFI/SAFI block\n"
    },
    {
      "commit": "a624cae2b210a0e81c80c473f86b73e2be169962",
      "tree": "b229e5943b651405d5b2277ecb5fbcdc1a747354",
      "parents": [
        "b84b62dfb6ee9daf46c9e4c2c372b179f33be44c"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Sat Oct 08 13:54:48 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Sat Oct 08 14:18:00 2011 +0400"
      },
      "message": "bgpd: improve attr length error handling (BZ#679)\n\n* bgp_attr.c\n  * bgp_attr_parse(): provide extra argument to bgp_attr_aggregator()\n  * bgp_attr_local_pref(): use bgp_notify_send_with_data()\n  * bgp_attr_atomic(): idem\n  * bgp_attr_aggregator(): idem\n\nConflicts:\n\n\tbgpd/bgp_attr.c\n"
    },
    {
      "commit": "b84b62dfb6ee9daf46c9e4c2c372b179f33be44c",
      "tree": "052307acd804e98d224bc4d3246f16c9d02fbad9",
      "parents": [
        "2d42e68aa032ed2f11471aee444935918d35c8bb"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Tue Sep 27 15:47:25 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Fri Sep 30 14:11:13 2011 +0400"
      },
      "message": "bgpd: improve attr flags checks\n\nDo not check each of the Optional/Transitive/Partial attribute\nflag bits, when their only valid combination is known in advance,\nbut still perform bit-deep error message logging. This change\nassumes unused (low-order) 4 bits of the flag octet cleared.\n\n* bgp_attr.c\n  * bgp_attr_origin(): rewrite check\n  * bgp_attr_nexthop(): idem\n  * bgp_attr_med(): idem\n  * bgp_attr_local_pref(): idem\n  * bgp_attr_atomic(): idem\n\nConflicts:\n\n\tbgpd/bgp_attr.c\n"
    },
    {
      "commit": "2d42e68aa032ed2f11471aee444935918d35c8bb",
      "tree": "a58e0b96bdb43fb6ed66a94afc0d44b737ca4c89",
      "parents": [
        "214bcaa13e092d9fff8f233e62ba28ca7eefbc43"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Tue Sep 27 15:35:39 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Fri Sep 30 10:32:02 2011 +0400"
      },
      "message": "bgpd: ignore 4 bits of attribute flags byte\n"
    },
    {
      "commit": "214bcaa13e092d9fff8f233e62ba28ca7eefbc43",
      "tree": "eb429544fd7d6727f35cd3fc24b6426a6d577eb3",
      "parents": [
        "bc3443ebf032b5fcc9e0ccb94641e4e899cd17d8"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Sat Sep 24 13:20:43 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Fri Sep 30 10:30:36 2011 +0400"
      },
      "message": "bgpd: add missing \"partial\" flag checks (BZ#676)\n\nORIGIN handling function used to have \"partial\" bit check and recent\ncommits added it for NEXT_HOP, MULTI_EXIT_DISC and ATOMIC_AGGREGATE\ncases. This commit adds \"partial\" check for AS_PATH and LOCAL_PREF\ncases, which should leave attributes 1 through 6 inclusive completely\ncovered with attribute flags checks.\n\n* bgp_attr.c\n  * bgp_attr_origin(): use bit-by-bit checks for better diagnostics\n  * bgp_attr_aspath(): add flag check\n  * bgp_attr_local_pref(): idem\n\nConflicts:\n\n\tbgpd/bgp_attr.c\n"
    },
    {
      "commit": "bc3443ebf032b5fcc9e0ccb94641e4e899cd17d8",
      "tree": "06d6c8b912958c989ba59e45349e17a3f8d973ac",
      "parents": [
        "0a28130d35bbba47faf47bf9451ba0eb195fcbb7"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Thu Sep 22 12:48:14 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Fri Sep 30 01:24:35 2011 +0400"
      },
      "message": "bgpd: improve NEXT_HOP attribute checks (BZ#680)\n\n* lib/prefix.h\n  * IPV4_CLASS_DE(): new helper macro\n* bgp_attr.c\n  * bgp_attr_nexthop(): add check for \"partial\" bit, refresh flag error\n    reporting, explain meaning of RFC4271 section 6.3 and implement it\n\nConflicts:\n\n\tbgpd/bgp_attr.c\n"
    },
    {
      "commit": "0a28130d35bbba47faf47bf9451ba0eb195fcbb7",
      "tree": "94bcda95ba12a50a81aa7ea893d809ba237b2262",
      "parents": [
        "42e6d745d105018a9469dabad65bd4cf942dcf3c"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Sun Jul 17 19:33:21 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Thu Sep 29 22:19:08 2011 +0400"
      },
      "message": "bgpd: rename SAFI 3 according to RFC4760\n\n- SAFI value 3 is reserved.  It was assigned by RFC 2858 for a use\n  that was never fully implemented, so it is deprecated by this\n  document.\n\n* zebra.h: rename macro\n* bgp_fsm.c: (bgp_graceful_restart_timer_expire,\n  bgp_graceful_stale_timer_expire, bgp_stop, bgp_establish): update\n* bgpd.c: (peer_nsf_stop): update\n* bgp_open.c: (bgp_capability_vty_out): SAFI 3 isn\u0027t a recognized case\n  any more\n"
    },
    {
      "commit": "42e6d745d105018a9469dabad65bd4cf942dcf3c",
      "tree": "9e653fe2e44d2e3f8510fcb8451931e3b6153ebc",
      "parents": [
        "beb1ca03bfe707d6d1fcad21fcbaa63af49c82f8"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Thu Jul 14 12:36:19 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Thu Sep 29 22:14:11 2011 +0400"
      },
      "message": "bgpd: more SAFI fixes\n\n(with resolved conflict in bgpd/bgp_packet.c)\n\nTwo macros resolving to the same integer constant broke a case block and\na more thorough merge of BGP_SAFI_VPNV4 and BGP_SAFI_VPNV6 was\nperformed.\n\n* bgpd.h: MPLS-labeled VPN SAFI is AFI-independent, switch to single\n* macro\n* bgp_capability_test.c: update test data\n* bgp_mp_attr_test.c: idem\n* bgp_route.c: (bgp_maximum_prefix_overflow, bgp_table_stats_vty) update\n  macro and check conditions (where appropriate)\n* bgp_packet.c: (bgp_route_refresh_send, bgp_capability_send,\n  bgp_update_receive, bgp_route_refresh_receive): idem\n* bgp_open.c: (bgp_capability_vty_out, bgp_afi_safi_valid_indices,\n  bgp_open_capability_orf, bgp_open_capability): idem\n* bgp_attr.c: (bgp_mp_reach_parse, bgp_packet_attribute,\n  bgp_packet_withdraw): idem\n"
    },
    {
      "commit": "beb1ca03bfe707d6d1fcad21fcbaa63af49c82f8",
      "tree": "78ffcd5ec7e9bb80e92c108f5ca0268ec6cff262",
      "parents": [
        "48f99b0c2bfed8d3880732d188e1d5964f575ee4"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Wed Jul 13 16:53:13 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Thu Sep 29 22:07:54 2011 +0400"
      },
      "message": "bgpd: fix SAFI for for MPLS labeled VPN-IPv6\n\n* bgpd.h: change value of BGP_SAFI_VPNV6 to 128 (RFC4659, BZ#659)\n* bgp_route.c: (bgp_table_stats_vty) fix length argument to strncmp()\n"
    },
    {
      "commit": "4b4e07d2d83bdbe46ccf4b4a2fd2aa3842370098",
      "tree": "dde2abd7124f6d89e7d4695482f1abb8f4a0a447",
      "parents": [
        "51abba509a0997f05427a8acbe74dd07d8d6026e"
      ],
      "author": {
        "name": "Dmitrij Tejblum",
        "email": "tejblum@yandex-team.ru",
        "time": "Wed Sep 21 23:13:22 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Tue Sep 27 21:46:04 2011 +0400"
      },
      "message": "bgpd: don\u0027t be confused by \"unspecific\" subcode in the NOTIFY message.\n\n* bgp_debug.c (bgp_notify_open_msg, bgp_notify_update_msg,\n  bgp_notify_cease_msg, bgp_notify_capability_msg): add messages for\n  \"unspecific\" subcode.\n"
    },
    {
      "commit": "e6ec1c3648cf3304c1a36341487659aadb9dce95",
      "tree": "de881144ddce2cdf272a36b0c8e94030b4379b90",
      "parents": [
        "7ccf5e59c13773097dd551b8a7384b99b7f46927"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Sat Sep 10 21:50:53 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Tue Sep 27 21:43:15 2011 +0400"
      },
      "message": "bgpd: spelling\n"
    },
    {
      "commit": "7ccf5e59c13773097dd551b8a7384b99b7f46927",
      "tree": "205ee10231ebf765cf3097c5578c78c0d302a268",
      "parents": [
        "171c9a996dd75a8b9aa596288c974f9ac0fbc5d6"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Sat Sep 10 16:53:30 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Tue Sep 27 21:43:03 2011 +0400"
      },
      "message": "bgpd: spelling\n"
    },
    {
      "commit": "9eba2ada189597fcb39c806bbbed414fecf20623",
      "tree": "59a59ae323a245579c24880d90332070538304aa",
      "parents": [
        "2cfadf09a810e3b660a47a1eb898d0d7c8813c08"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Tue Sep 20 14:43:50 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Tue Sep 27 21:21:27 2011 +0400"
      },
      "message": "bgpd: check ATOMIC_AGGREGATE attr flags (BZ#678)\n\n* bgp_attr.c\n  * bgp_attr_atomic(): accept extra argument, add checks for\n    \"optional\", \"transitive\" and \"partial\" bits, log each error\n    condition independently\n  * bgp_attr_parse(): provide extra argument\n"
    },
    {
      "commit": "2cfadf09a810e3b660a47a1eb898d0d7c8813c08",
      "tree": "135d9df7af95fed3ffaaa380a22c4a93897f5263",
      "parents": [
        "0ea968d21f194b3960a73aa47a5b06f160632907"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Tue Sep 20 10:54:25 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Tue Sep 27 21:19:44 2011 +0400"
      },
      "message": "bgpd: check MULTI_EXIT_DISC attr flags (BZ#677)\n\n* bgp_attr.c\n  * bgp_attr_med(): add checks for \"optional\", \"transitive\" and\n    \"partial\" bits, log each error condition independently\n"
    },
    {
      "commit": "0ea968d21f194b3960a73aa47a5b06f160632907",
      "tree": "61f7a046e2a1124f55d8ce9134984371cfd64ab1",
      "parents": [
        "1212dc1961e81d5ef6e576b854e979ea29284f51"
      ],
      "author": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Mon Sep 19 16:30:47 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Tue Sep 27 21:15:56 2011 +0400"
      },
      "message": "bgpd: check LOCAL_PREF attribute flags (BZ#674)\n\n* bgp_attr.c\n  * bgp_attr_local_pref(): accept extra argument, add checks for\n    \"optional\" and \"transitive\" bits, log each error condition\n    independently\n  * bgp_attr_parse(): provide extra argument\n"
    },
    {
      "commit": "1212dc1961e81d5ef6e576b854e979ea29284f51",
      "tree": "bc27c64ae0463c1787d641f2946b3e64f24126d3",
      "parents": [
        "d68ab1009f42c5ed62f7c6b0b5700f5f0469a35b"
      ],
      "author": {
        "name": "heasley",
        "email": "heas@shrubbery.net",
        "time": "Mon Sep 12 13:27:52 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Tue Sep 27 21:07:07 2011 +0400"
      },
      "message": "bgpd: add useful notification logs (BZ#616)\n\n* bgp_packet.c\n  * bgp_notify_send_with_data(): add calls to zlog_info()\n"
    },
    {
      "commit": "d68ab1009f42c5ed62f7c6b0b5700f5f0469a35b",
      "tree": "155fac87e799841406a0785115a0e0fa4c5a0709",
      "parents": [
        "5fdaa04e635fdef7deca9bdfe1be4b60ec90add6"
      ],
      "author": {
        "name": "heasley",
        "email": "heas@shrubbery.net",
        "time": "Tue Jul 12 20:09:18 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Tue Sep 27 21:05:30 2011 +0400"
      },
      "message": "bgpd: consistent log msg format (BZ#565)\n"
    },
    {
      "commit": "94431dbc753171b48b5c6806af97fd690813b00a",
      "tree": "463b917f9f80236be01e4502863b34ae2d52b53d",
      "parents": [
        "a0bf59bcac8b40c3f83e7f2e7f65087ece6acfc7"
      ],
      "author": {
        "name": "CROSS",
        "email": "info@codenomicon.com",
        "time": "Mon Sep 26 13:17:05 2011 +0400"
      },
      "committer": {
        "name": "Denis Ovsienko",
        "email": "infrastation@yandex.ru",
        "time": "Mon Sep 26 18:46:16 2011 +0400"
      },
      "message": "bgpd: CVE-2011-3327 (ext. comm. buffer overflow)\n\nThis vulnerability (CERT-FI #513254) was reported by CROSS project.\nThey have also suggested a fix to the problem, which was found\nacceptable.\n\nThe problem occurs when bgpd receives an UPDATE message containing\n255 unknown AS_PATH attributes in Path Attribute Extended Communities.\nThis causes a buffer overlow in bgpd.\n\n* bgp_ecommunity.c\n  * ecommunity_ecom2str(): perform size check earlier\n"
    },
    {
      "commit": "036a6e6cf63a1046ab260d090719b305069288eb",
      "tree": "638b920464ce82b188e32013f768d6f5d7b1a6dd",
      "parents": [
        "8dd1a8daae0b15065d54c46f82d44d21aa7a2320",
        "b881c7074bb698aeb1b099175b325734fc6e44d2"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Jul 29 18:16:25 2011 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Jul 29 18:16:25 2011 +0100"
      },
      "message": "Merge branch \u0027attr-errors\u0027\n\nContains BGP fixes:\n\n- set extcommunity crash: tihs patch tries to make the refcounting more robust\n  but does not fully solve the problem, sadly.\n- BGP attribute error handling: Little testing.\n"
    },
    {
      "commit": "01d7ff0a2166a422c56bd26f04fc22832a9e690b",
      "tree": "5fed07bab4751e28e50dd7ff7145b06a565c4f5a",
      "parents": [
        "78d92e1721538ec41feb2b1c34712675b830087b"
      ],
      "author": {
        "name": "Josh Bailey",
        "email": "joshb@google.com",
        "time": "Wed Jul 20 20:52:06 2011 -0700"
      },
      "committer": {
        "name": "Josh Bailey",
        "email": "joshb@google.com",
        "time": "Wed Jul 20 20:52:06 2011 -0700"
      },
      "message": "bgpd: We try to skip out of updating the multipath aggregate if there are no\nchanges in the multipath set or attributes, but failed to check for\njust a bestpath change. The result is there is no attribute on the new\nbestpath and we hit the assert. Added the bestpath check and\nrearranged the code to only check attributes when there is no bestpath\nor multipath change, so we only scan the for attribute changes when\nnecessary.\n\n* bgpd/bgp_mpath.c\n  * bgp_info_mpath_aggregate_update(): Added check for bestpath\n    change before skipping the aggregate generation. Skip the attribute\n    check if either the multipath set or bestpath has changed.\n"
    },
    {
      "commit": "78d92e1721538ec41feb2b1c34712675b830087b",
      "tree": "b05abed8b5fa33567676bcf0c32b7f56d2660709",
      "parents": [
        "0b597ef00ec7c7eebd836e2b1d5a266efcd60005"
      ],
      "author": {
        "name": "Josh Bailey",
        "email": "joshb@google.com",
        "time": "Wed Jul 20 20:51:07 2011 -0700"
      },
      "committer": {
        "name": "Josh Bailey",
        "email": "joshb@google.com",
        "time": "Wed Jul 20 20:51:07 2011 -0700"
      },
      "message": "bgpd: Fix a crash caused by mistakenly dequeueing the bestpath on the\nmultipath list. This causes the multipath list to get truncated\nbut the multipath count still reflects what it was before truncation.\nWhen we install the route to zebra we fail to fill the nexthop\narray with the number of nexthop pointers indicated by the\nmultipath count and this leads to a NULL pointer crash in\nstream_put_in_addr().\n\nChanges:\n\n* bgpd/bgp_mpath.c\n  * bgp_info_mpath_update(): If new_mpath is the bestpath we should\n    just move to the next mp_list node. Move dequeue of new_mpath and\n    the code that updates next_mpath to inside the check that\n    new_mpath is not the bestpath.\n"
    },
    {
      "commit": "0b597ef00ec7c7eebd836e2b1d5a266efcd60005",
      "tree": "818852fc775358cadb0178c15226af63cfb06759",
      "parents": [
        "6918e74b97fd40f947ebd2eded9ab24b8569d3b8"
      ],
      "author": {
        "name": "Josh Bailey",
        "email": "joshb@google.com",
        "time": "Wed Jul 20 20:49:11 2011 -0700"
      },
      "committer": {
        "name": "Josh Bailey",
        "email": "joshb@google.com",
        "time": "Wed Jul 20 20:49:11 2011 -0700"
      },
      "message": "bgpd: When advertising a multipath route, the attribute set to be\nadvertised is based on the bestpath attribute set, but the\nfollowing attributes are aggregated from the attribute sets\nof the multipath constituents:\n- AS_PATH\n- ORIGIN\n- COMMUNITIES\n- EXTENDED COMMUNITIES\n\nIn addition the route is advertised with the NEXT_HOP set\nto the router\u0027s interface IP address, instead of the NEXT_HOP\nof the best path. This is to ensure that traffic will go to this\nrouter so it can be fanned out via the multipath route.\n\n* bgpd/ecommunity.c\n  * ecommunity_uniq_sort(): Make this function externally accessible\n* bgpd/ecommunity.h\n  * Add external declaration for ecommunity_uniq_sort()\n* bgpd/bgp_mpath.c\n  * bgp_info_nexthop_cmp(): Replace calls to bgp_attr_extra_get()\n    to avoid unwanted memory allocation\n  * bgp_info_mpath_free(): Free aggregate attribute for multipath\n  * bgp_info_mpath_attr(): Lookup aggregate attribute of a multipath route\n  * bgp_info_mpath_attr_set(): Set aggregate attribute of a multipath route\n  * bgp_info_mpath_aggregate_update(): Update the aggregate attribute\n    of a multipath route\n* bgpd/bgp_mpath.h\n  * bgp_info_mpath: Add pointer to hold aggregate attribute of a multipath\n  * Add external declarations for new functions\n* bgpd/bgp_route.c\n  * bgp_announce_check(): Use aggregate attribute when announcing multipath\n    route\n  * bgp_announce_check_rsclient(): Use aggregate attribute when announcing\n    multipath route\n  * bgp_best_selection(): After updating multipath set, update the\n    multipath aggregate attribute\n"
    },
    {
      "commit": "6918e74b97fd40f947ebd2eded9ab24b8569d3b8",
      "tree": "e7d5e43b25eaf963065016d3998a78e5e5568111",
      "parents": [
        "8196f13d2ab7f3b09150c00328228f90391acb7c"
      ],
      "author": {
        "name": "Josh Bailey",
        "email": "joshb@google.com",
        "time": "Wed Jul 20 20:48:20 2011 -0700"
      },
      "committer": {
        "name": "Josh Bailey",
        "email": "joshb@google.com",
        "time": "Wed Jul 20 20:48:20 2011 -0700"
      },
      "message": "bgpd: For deterministic MED build a multipath set for each peer AS as the\nfirst stage of the best path calculation. The second stage then\nselects a winner from each peer AS\u0027s best path. In the second stage we\nclear multipath set of the non-selected best paths via\nbgp_mp_dmed_deselect(). Since the multipath set is already marked up\nfor the winning path, we don\u0027t call bgp_info_mpath_update() after the\nsecond stage calculation.\n\n* bgpd/bgp_mpath.c\n  * bgp_mp_dmed_deselect(): New function to cleanup the multipath\n    markup if a DMED selected path loses in stage 2 of the best path\n    calculation\n* bgpd/bgp_mpath.h\n  * Add external declaration of bgp_mp_dmed_deselect()\n* bgpd/bgp_route.c\n  * bgp_best_selection(): If multipath is enabled, build up the mp_list\n    for the current peer AS, and do the RIB markup the best path from\n    that AS. In the second stage, clear the RIB markup for the DMED\n    selected path if it is not selected as best. Only call\n    bgp_info_mpath_update() in the second stage when not doing\n    deterministic MED.\n"
    },
    {
      "commit": "8196f13d2ab7f3b09150c00328228f90391acb7c",
      "tree": "18c0dcfac4f07cc4cf532cd134a41cfd1d03bc55",
      "parents": [
        "de8d5dff1523bb9fe47d54f31c9e5322bd805b44"
      ],
      "author": {
        "name": "Josh Bailey",
        "email": "joshb@google.com",
        "time": "Wed Jul 20 20:47:07 2011 -0700"
      },
      "committer": {
        "name": "Josh Bailey",
        "email": "joshb@google.com",
        "time": "Wed Jul 20 20:47:07 2011 -0700"
      },
      "message": "bgpd: Modify the BGP to zebra route announcement to support multipath\nroutes. Use a growable buffer (bgp_nexthop_buf) to collect nexthops\nthat are included in the announcement. Use the BGP_INFO_MULTIPATH_CHG\nflag to trigger zebra announcement so zebra will be updated if the\nmultipath set changes. Display all multipath nexthops in\n\u0027debug bgp zebra\u0027 output.\n\n* bgpd/bgp_main.c\n  * bgp_exit(): Free bgp_nexthop_buf when exiting\n* bgpd/bgp_route.c\n  * bgp_process_rsclient(): Clear BGP_INFO_MULTIPATH_CHG after processing\n  * bgp_process_main(): Check BGP_INFO_MULTIPATH_CHG to trigger zebra\n    announcement and clear aftr processing\n* bgpd/bgp_zebra.c\n  * bgp_nexthop_buf: Growable buffer used to collect nexthops for zebra\n    announcement\n  * bgp_zebra_announce(): Grow bgp_nexthop_buf if needed. Include\n    multipath count in zebra announcement and add all nexthops to\n    bgp_nexthop_buf. Pass bgp_nexthop_buf data to zebra announcement.\n    Added nexthops to debug output.\n  * bgp_zebra_init(): Initialize bgp_nexthop_buf at startup\n* bgpd/bgp_zebra.h\n  * BGP_NEXTHOP_BUF_SIZE: Default initial bgp_nexthop_buf size has room\n    for 8 nexthops\n"
    },
    {
      "commit": "de8d5dff1523bb9fe47d54f31c9e5322bd805b44",
      "tree": "95d71dffb32d9e67a2f892ac5689a884117dcbcd",
      "parents": [
        "96450faf3385a6ed9f4dd5c2c58776c4a664a8da"
      ],
      "author": {
        "name": "Josh Bailey",
        "email": "joshb@google.com",
        "time": "Wed Jul 20 20:46:01 2011 -0700"
      },
      "committer": {
        "name": "Josh Bailey",
        "email": "joshb@google.com",
        "time": "Wed Jul 20 20:46:01 2011 -0700"
      },
      "message": "bgpd: Adds support to mark up the BGP rib table entry with multipath\ninformation based on the multipath list (mp_list) generated during\nthe best path calculation. Display \"multipath\" for paths that are\nmultipath and also on bestpath if the route is multipath. Flag a\nbest path with the BGP_INFO_MULTIPATH_CHG if the multipath\nset has changed since the last update. This can be used to trigger\nupdates to zebra and peers.\n\nThe multipath markup is a lazily allocated bgp_info_mpath structure\nthat is added to the best path and any multipaths. The mpath structures\nare linked together with the best path element at the head and the\nother elements ordered by nexthop and then by peer address. This\nmarkup scheme is updated by calling bgp_info_mpath_update() and passing\nin a new mp_list the the current multipath set. There are additional\nAPI\u0027s for walking the multipath set, querying the count of multipaths,\nand for cleaning up the multipath markup information when freeing path\ninformation.\n\n* bgpd/bgp_mpath.c\n  * bgp_info_mpath_new(): Allocation of new mpath element\n  * bgp_info_mpath_free(): Release memory for mpath element\n  * bgp_info_mpath_get(): Access mpath element of path. Allocate memory\n    on-demand\n  * bgp_info_mpath_enqueue(): Enqueue a path onto the multipath list\n  * bgp_info_mpath_dequeue(): Remove a path from the multipath list\n  * bgp_info_mpath_first(): Return first path on the multipath list\n  * bgp_info_mpath_next(): Return next path on the multipath list\n  * bgp_info_mpath_count(): Return the number of paths on the multipath list\n  * bgp_info_mpath_count_set(): Set the number of paths on the multipath list\n  * bgp_info_mpath_update(): Update multipath markup on bgp route table entry\n    and flag any changes. Emit \u0027debug bgp event\u0027 output on any multipath\n    change.\n* bgpd/bgp_mpath.h\n  * struct bgp_info_mpath: Information added to a bgp_info path to record\n    multipath information\n  * External declarations for new functions in bgp_mpath.c\n* bgpd/bgp_route.c\n  * bgp_info_free(): Free mpath memory when freeing path information\n  * bgp_info_reap(): Dequeue path from multipath queue before deleting it\n  * bgp_best_selection(): Calls bgp_info_mpath_update() with latest\n    mp_list to mark-up rib table entry\n  * bgp_vty_out_detail(): Add display of multipath flag for a path. Also\n    display \u0027multipath\u0027 for bestpath if it is a multipath route\n* bgpd/bgp_route.h\n  * struct bgp_info: Add pointer to bgp_info_mpath information\n  * Add flags to mark a path as multipath (BGP_INFO_MULTIPATH) and\n    to mark bestpath if multipath information has changed\n    (BGP_INFO_MULTIPATH_CHG)\n* lib/memtypes.c\n  * Add MTYPE_BGP_MPATH_INFO for allocating memory for bgp_info_mpath\n* tests/bgp_mpath_test.c\n  * Add test case for bgp_info_mpath_update() and supporting functions\n"
    },
    {
      "commit": "96450faf3385a6ed9f4dd5c2c58776c4a664a8da",
      "tree": "26c56a71548686a7d6797b79377ccc5e25730186",
      "parents": [
        "42ea68512fc4d04b500def45e8f899321f4081e7"
      ],
      "author": {
        "name": "Josh Bailey",
        "email": "joshb@google.com",
        "time": "Wed Jul 20 20:45:12 2011 -0700"
      },
      "committer": {
        "name": "Josh Bailey",
        "email": "joshb@google.com",
        "time": "Wed Jul 20 20:45:12 2011 -0700"
      },
      "message": "bgpd: Adds equal-paths check to path comparison. Paths that are\nequal to the best path are accumulated onto an ordered list (mp_list)\nif maximum-paths is configured. A future commit will add the\nmultipath markup to the BGP rib table based on the mp_list. Add\nunit test for the added mp_list functions.\n\nDeterministic MED is not supported in this commit, it will be\nadded later.\n\n* bgpd/bgp_aspath.c\n  * Make aspath_cmp() an external symbol so it can be used in\n    equivalent paths check\n* bgpd/bgp_aspath.h\n  * Add extern declaration of aspath_cmp()\n* bgpd/bgp_mpath.c\n  * bgp_info_nexthop_cmp(): Compares nexthops of two paths\n  * bgp_info_mpath_cmp(): Compare function to order multipaths by\n    nexthop and then by peer address\n  * bgp_mp_list_init(): Initialize a list with the multipath order function\n  * bgp_mp_list_clear(): Clear out the mp_list\n  * bgp_mp_list_add(): Add a multipath to mp_list\n* bgpd/bgp_mpath.h\n  * External declarations for above added functions in bgp_mpath.c\n* bgpd/bgp_route.c\n  * bgp_info_cmp(): Add equivalent paths result (paths_eq). If eBGP\n    paths are equal down to IGP metric check, flag as equal if peer AS\n    matches. Similarly for iBGP paths but compare full AS_PATH.\n  * bgp_best_selection(): If multipath is enabled, accumulate equivalent paths\n    in mp_list. Add debug bgp event output to see result (will be filtered\n    later to display only when change occurs)\n  * bgp_process_rsclient(): Pass multipath config to bgp_best_selection()\n  * bgp_process_main(): Pass multipath config to bgp_best_selection()\n* tests/bgp_mpath_test.c\n  * Add unit test case for bgp_mp_list functions\n"
    },
    {
      "commit": "165b5fff9dde5536d9cb1f850b36c17bf5654f0f",
      "tree": "b02e2b71e2142348bce920f5c4a7ef5bd4708f3e",
      "parents": [
        "8ced4e82e6f417b13f4bfc09018fc51fd31058e2"
      ],
      "author": {
        "name": "Josh Bailey",
        "email": "joshb@google.com",
        "time": "Wed Jul 20 20:43:22 2011 -0700"
      },
      "committer": {
        "name": "Josh Bailey",
        "email": "joshb@google.com",
        "time": "Wed Jul 20 20:43:22 2011 -0700"
      },
      "message": "bgpd: Add new configuration cli for eBGP and iBGP multipath.\nThere is support to configure this for each (AFI,SAFI), but\ncurrently this configuration is only present for IPv4 unicast:\n\n maximum-paths [ibgp] \u003c1-255\u003e\n no maximum-paths [ibgp] [\u003c1-255\u003e]\n\n* bgpd/Makefile.am\n  * Add bgp_mpath.h and bgp_mpath.c to build\n* bgpd/bgp_mpath.h\n  * New file for bgp multipath declarations\n  * define BGP_DEFAULT_MAXPATHS\n* bgpd/bgp_mpath.c\n  * bgp_maximum_paths_set(): Configure maximum paths for the given\n    afi, safi and bgp instance\n  * bgp_maximum_paths_unset(): Return maximum paths configuration to\n    the default setting for the given afi, safi and bgp instance\n* bgpd/bgp_vty.c\n  * Define command strings for above CLI\n  * bgp_config_write_maxpaths(): Outputs configuration for the given\n    afi, safi and bgp instance\n  * Install command elements for IPv4 unicast\n* bgpd/bgp_zebra.h\n  * bgp_config_write_maxpaths(): External declaration\n* bgpd/bgpd.c\n  * bgp_create(): Initialize bgp instance to default maximum paths setting\n  * bgp_config_write_family(): Output maximum paths configuration\n    for the given address family\n  * bgp_config_write(): Output maximum paths configuration for\n    IPv4 unicast address family\n* bgpd/bgpd.h\n  * struct bgp: Add storage for maximum paths configuration for\n    each afi, safi\n"
    },
    {
      "commit": "fdbc8e77c88f751924299d0bc752371d5cc31116",
      "tree": "8f8a5b59c222552b14f3fb79efeb52ff83d1c8b1",
      "parents": [
        "072990e22e66ed9a15261b70658dc4a8801975b5"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Apr 11 16:31:43 2011 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Apr 13 15:13:33 2011 +0100"
      },
      "message": "bgpd: trivial format / warning fixes\n\n* bgp_aspath.c: (assegments_parse) just bail early if length doesn\u0027t match\n  and fix the formatting.\n* bgp_network.c: add include needed for set_nonblocking\n* bgp_packet.c: formatting\n"
    },
    {
      "commit": "604a9b43dd68a087ca5a4ac2cae19eb17591ba5f",
      "tree": "060a9bc1987cb04cc530c91923367ab5498dd914",
      "parents": [
        "4a2035fd71990848017237838fe11bc1aeb41641"
      ],
      "author": {
        "name": "Michael Lambert",
        "email": "lambert@psc.edu",
        "time": "Mon Sep 13 11:48:11 2010 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Apr 01 15:58:39 2011 +0100"
      },
      "message": "bgpd: fix memory leak when deleting a community\n\n* bgp_routemap.c: (route_set_community_delete) When deleting a\n  community in a route-map the old community was being orphaned.  Like\n  the description of the same code in route_set_community, this is a\n  hack, not a true fix.\n"
    },
    {
      "commit": "4a2035fd71990848017237838fe11bc1aeb41641",
      "tree": "6cc2abfc5b6e3dd51e71a42cae122c9b935a2f4f",
      "parents": [
        "7015b8a24965ce144296a791be816dc9bbeb477a"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Apr 01 15:58:27 2011 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Fri Apr 01 15:58:27 2011 +0100"
      },
      "message": "Revert \"bgpd: \"Intern\" communities in route maps\"\n\nThis reverts commit 2c9fd7e07283b8904ef20030c9dadb032e999b12.\n"
    },
    {
      "commit": "31d0f1b3c64903d56a47caebf887067d222c7cd6",
      "tree": "7a7d90f0517bc2816fc0279f79b5d7a9ab195095",
      "parents": [
        "f5a4827db60545309d0ee378b85acac56cf7837a"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue Mar 29 14:18:49 2011 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue Mar 29 14:18:49 2011 +0100"
      },
      "message": "bgpd: Fix merge error in jhash commit\n\n* bgp_attr.c: (attrhash_key_make) 98e30f should have changed jhash2 to jhash.\n\n  These kinds of merge errors would be reduced and life would be easier if\n  people would submit fully-formed fixes that could be chucked directly into\n  git-am.\n"
    },
    {
      "commit": "f5a4827db60545309d0ee378b85acac56cf7837a",
      "tree": "a28de765a209f772d1b95b78a357ddf17318844a",
      "parents": [
        "d876bdf4a84f40ac3f9bec8d5040858b3725db3e"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "shemminger@vyatta.com",
        "time": "Thu Mar 24 17:30:21 2011 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Mar 28 11:27:41 2011 +0100"
      },
      "message": "bgpd: refine the setting up of GTSM\n\n* bgpd.h: Add error code for setting GTSM on iBGP\n* bgpd.c: (peer_ttl_security_hops_set) use previous error code and signal\n  incompatibility of GTSM+iBGP to vty.\n  Consider the session state when setting GTSM, and reset Open/Active peers\n  to let them pick up new TTL from start.\n"
    },
    {
      "commit": "89b6d1f8e2759cc38bc768067abe3a296d93f454",
      "tree": "ebf4d27f1d93558bba8d0bf6f1022182f7066404",
      "parents": [
        "fa411a212b55bba650d68fd0456686f3e47b7395"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "shemminger@vyatta.com",
        "time": "Thu Mar 24 10:51:59 2011 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Thu Mar 24 10:51:59 2011 +0000"
      },
      "message": "bgpd: Cleanups \u0026 fixes for minttl / GTSM\n\n* bgp_vty.c: (peer_ebgp_multihop_{un,}set_vty) tail-call cleanup.\n  ({no_,}neighbor_ttl_security) ditto.\n* bgpd.c: (peer_ttl_security_hops_set) Peer group checks and TTL set only\n  need to be done on transition.\n* sockunion.c: (sockopt_minttl) remove always-on debug and improve readability.\n"
    },
    {
      "commit": "fa411a212b55bba650d68fd0456686f3e47b7395",
      "tree": "4d7ef846c2cbc154631a5901747b3384854d497c",
      "parents": [
        "db07ad7358cb5e26358326332629ffb658f5747a"
      ],
      "author": {
        "name": "Nick Hilliard",
        "email": "nick@inex.ie",
        "time": "Wed Mar 23 15:33:17 2011 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Mar 23 15:33:17 2011 +0000"
      },
      "message": "bgpd: RFC 5082 Generalized TTL Security Mechanism support\n\n* bgpd: Add support for RFC 5082 GTSM, which allows the TTL field to be used\n  to verify that incoming packets have been sent from neighbours no more\n  than X IP hops away. In other words, this allows packets that were sent from\n  further away (i.e. not by the neighbour with known distance, and so possibly\n  a miscreant) to be filtered out.\n* lib/sockunion.{c,h}: (sockopt_minttl) new function, to set a minimum TTL\n  using the IP_MINTTL socket opt.\n* bgpd.h: (BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK) define for command\n  error for minttl.\n  (struct peer) add a config variable, to store the configured minttl.\n  (peer_ttl_security_hops_{set,unset}) configuration handlers\n* bgpd.c: (peer_group_get) init gtsm_hops\n  (peer_ebgp_multihop_{un,}set) check for conflicts with GTSM. Multihop and\n  GTSM can\u0027t both be active for a peer at the same time.\n  (peer_ttl_security_hops_set) set minttl, taking care to avoid conflicts with\n  ebgp_multihop.\n  (bgp_config_write_peer) write out minttl as \"neighbor .. ttl-security hops X\".\n* bgp_vty.c: (bgp_vty_return) message for\n  BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK\n  (peer_ebgp_multihop_{un,}set_vty)\n* bgp_network.c: (bgp_accept) set minttl on accepted sockets if appropriate.\n  (bgp_connect) ditto for outbound.\n"
    },
    {
      "commit": "3bde17f1af635c9ca19df0b3516cb8ad0376e6d3",
      "tree": "a963755de10136b6d8670bee5d577a49c0f0f984",
      "parents": [
        "98e30f5db6dea65a5d6a176065cd0b60eb7bb001"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Mar 23 10:30:30 2011 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Mar 23 10:30:30 2011 +0000"
      },
      "message": "bgpd: Fix compile failure if IPv6 build was disabled.\n\n* bgp_route.c: ({no_,}ipv6_bgp_network_ttl_cmd) depends on ipv6_bgp_network\n  which is HAVE_IPV6, so these should be too.\n  (bgp_route_init) and the installs should be similarly ifdefed\n"
    },
    {
      "commit": "98e30f5db6dea65a5d6a176065cd0b60eb7bb001",
      "tree": "3ce8f796dd5f6607a77f1971fd540fcbf2193e3c",
      "parents": [
        "d71ea65270408a45e4bec036671ec73b24b994b4"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "shemminger@vyatta.com",
        "time": "Tue Mar 22 16:14:57 2011 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue Mar 22 16:18:44 2011 +0000"
      },
      "message": "bgpd: attribute jhash call should use a standard interface to in6_addr data\n\n* bgp_attr.c; (attrhash_key_make) s6_addr is only member of in6_addr\n  guaranteed to be available - s6_addr32 isn\u0027t. Fix to be more portable, and\n  thus allow compilation on BSD again.\n"
    },
    {
      "commit": "eac5702d06ee574e9e155c4e60c251e525dc4149",
      "tree": "0b2fc1b7ff7432d21df8e0346736f6bf2f25287a",
      "parents": [
        "58192df7746231fbc82e248b5ddfc7cab95ab1e7"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "shemminger@vyatta.com",
        "time": "Thu Aug 05 10:26:25 2010 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Mar 21 17:30:52 2011 +0000"
      },
      "message": "bgpd: enable TCP corking\n\n* bgp_packet.c: (bgp_write) On BGP write, use TCP_CORK to provide hints to\n  kernel about TCP buffering.  This will cause BGP packets to occur in\n  bigger chunks (full size MTU), improving performance and getting rid of\n  one of the problems reported in the UNH BGP conformance test.\n"
    },
    {
      "commit": "35398589cf1293956dfefb5096aa5284c72a696f",
      "tree": "a0d844e42273fd0ee217652a6fd33552661f8b6f",
      "parents": [
        "2c9fd7e07283b8904ef20030c9dadb032e999b12"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "shemminger@vyatta.com",
        "time": "Thu Aug 05 10:26:23 2010 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Mar 21 17:30:52 2011 +0000"
      },
      "message": "bgpd: leave peer socket in non-blocking mode (mostly)\n\n* bgpd: Rather than toggling socket in/out of non-block mode, just leave it\n  in nonblocking mode.\n\n  One exception is in bgp_notify which only happens just before close.\n"
    },
    {
      "commit": "2c9fd7e07283b8904ef20030c9dadb032e999b12",
      "tree": "e134706cdc5c91daf0002ef3e2d22d12b09cb758",
      "parents": [
        "95cbbd2ace2f88019a7a54e67b4b12aaeda177f7"
      ],
      "author": {
        "name": "Michael Lambert",
        "email": "lambert@psc.edu",
        "time": "Sat Jul 24 12:44:07 2010 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Mar 21 17:30:52 2011 +0000"
      },
      "message": "bgpd: \"Intern\" communities in route maps\n\n* bgp_community.[ch]: (community_lookup) New helper function to look\n  up a community list in the hash table.\n\n* bgp_routemap.c: A new community structure was being allocated for\n  every BGP update which matched a route map which set a community.\n  This behavior led to rapid growth in the memory consumed by bgpd.\n  Adding the communities to the hash table addresses the memory\n  growth, but may introduce a problem in modifying or deleting the\n  \u0027set community\u0027 statement in the route map.\n"
    },
    {
      "commit": "95cbbd2ace2f88019a7a54e67b4b12aaeda177f7",
      "tree": "b3a43ef5d9da20802df0dba9c72814354eb84267",
      "parents": [
        "d8509631b47aba867c59eb463bb346d7ae5b91c7"
      ],
      "author": {
        "name": "Michael Lambert",
        "email": "lambert@psc.edu",
        "time": "Fri Jul 23 14:43:04 2010 -0400"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Mar 21 17:30:52 2011 +0000"
      },
      "message": "bgpd: New show commands for improved view and address family support\n\nMany show commands do not have support for multiple views and do not\ntreat different address families uniformly.  The following changes add\na number of commands with support for views and rationalized treatment\nof IPv4 v IPv6 and unicast v multicast (such as in JUNOS, IOS XR and\nmore recent versions of IOS).\n\n* bgp_route.c: (bgp_show_community) Inserted a new second argument (the\n  name of the view) and the code to look up that name in the BGP structure.\n  The NULL argument in the call to bgp_show (indicating the default view)\n  was replaced by the specified view.  The existing calls to\n  bgp_show_community had a NULL second argument inserted to make clear\n  that they refer to the default view.\n\n  (top level) Added new functions via the DEFUN and/or ALIAS macros (and\n  the associated command table entries) to add the commands\n\n    show bgp ipv4 (unicast|multicast)\n    show bgp ipv4 (unicast|multicast) A.B.C.D\n    show bgp ipv4 (unicast|multicast) A.B.C.D/M\n    show bgp ipv6 (unicast|multicast)\n    show bgp ipv6 (unicast|multicast) X:X::X:X\n    show bgp ipv6 (unicast|multicast) X:X::X:X/M\n\n      These show either the full BGP table or the specified route or\n      prefix for the given address family.\n\n    show bgp view WORD (ipv4|ipv6) (unicast|multicast) community\n    show bgp view WORD (ipv4|ipv6) (unicast|multicast) community \\\n            (AA:NN|local-AS|no-advertise|no-export){1,4}\n\n      For the specified view and address family, these show entries\n      matching any community or the specified communit(y)(ies).\n\n    show bgp view WORD (ipv4|ipv6) (unicast|multicast) neighbors \\\n            (A.B.C.D|X:X::X:X) (advertised-routes|received-routes)\n\n      For the specified view and address family, show the routes\n      advertised to or received from the given BGP neighbor.\n\n    show bgp [view WORD] ipv4 (unicast|multicast) \\\n            rsclient (A.B.C.D|X:X::X:X)\n    show bgp [view WORD] ipv4 (unicast|multicast) \\\n            rsclient (A.B.C.D|X:X::X:X) A.B.C.D\n    show bgp [view WORD] ipv4 (unicast|multicast) \\\n            rsclient (A.B.C.D|X:X::X:X) A.B.C.D/M\n    show bgp [view WORD] ipv6 (unicast|multicast) \\\n            rsclient (A.B.C.D|X:X::X:X)\n    show bgp [view WORD] ipv6 (unicast|multicast) \\\n            rsclient (A.B.C.D|X:X::X:X) X:X::X:X\n    show bgp [view WORD] ipv6 (unicast|multicast) \\\n            rsclient (A.B.C.D|X:X::X:X) X:X::X:X/M\n\n      For the specifed (optional) view and address family, show either\n      the full BGP table or the specified route or prefix for the given\n      route server client peer.\n\n* bgp_vty.c: (top level) Added new functions via the DEFUN and/or ALIAS\n  macros (and the associated command table entries) to add the commands\n\n    show bgp [view WORD] (ipv4|ipv6) (unicast|multicast) summary\n    show bgp [view WORD] (ipv4|ipv6) (unicast|multicast) rsclient summary\n\n      For the specified (optional) view and address family, display\n      either the normal summary table for BGP peers, or the route server\n      client table showing the import and export policies.\n"
    },
    {
      "commit": "b881c7074bb698aeb1b099175b325734fc6e44d2",
      "tree": "70b4816a083166bbf00c1f85f19a67df0c0a5948",
      "parents": [
        "c112af27ed8f158ecece0d73ce2016c166076c00"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue Nov 23 16:35:42 2010 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Mar 21 13:51:14 2011 +0000"
      },
      "message": "bgpd: Implement revised error handling for partial optional/trans. attributes\n\n* BGP error handling generally boils down to \"reset session\". This was fine\n  when all BGP speakers pretty much understood all BGP messages. However\n  the increasing deployment of new attribute types has shown this approach\n  to cause problems, in particular where a new attribute type is \"tunneled\"\n  over some speakers which do not understand it, and then arrives at a speaker\n  which does but considers it malformed (e.g. corruption along the way, or\n  because of early implementation bugs/interop issues).\n\n  To mitigate this drafts before the IDR (likely to be adopted) propose to\n  treat errors in partial (i.e.  not understood by neighbour), optional\n  transitive attributes, when received from eBGP peers, as withdrawing only\n  the NLRIs in the affected UPDATE, rather than causing the entire session\n  to be reset.  See:\n\n   http://tools.ietf.org/html/draft-scudder-idr-optional-transitive\n\n* bgp_aspath.c: (assegments_parse) Replace the \"NULL means valid, 0-length\n  OR an error\" return value with an error code - instead taking\n  pointer to result structure as arg.\n  (aspath_parse) adjust to suit previous change, but here NULL really\n  does mean error in the external interface.\n* bgp_attr.h (bgp_attr_parse) use an explictly typed and enumerated\n  value to indicate return result.\n  (bgp_attr_unintern_sub) cleans up just the members of an attr, but not the\n  attr itself, for benefit of those who use a stack-local attr.\n* bgp_attr.c: (bgp_attr_unintern_sub) split out from bgp_attr_unintern\n  (bgp_attr_unintern) as previous.\n  (bgp_attr_malformed) helper function to centralise decisions on how to\n  handle errors in attributes.\n  (bgp_attr_{aspathlimit,origin,etc..}) Use bgp_attr_malformed.\n  (bgp_attr_aspathlimit) Subcode for error specifc to this attr should be\n  BGP_NOTIFY_UPDATE_OPT_ATTR_ERR.\n  (bgp_attr_as4_path) be more rigorous about checks, ala bgp_attr_as_path.\n  (bgp_attr_parse) Adjust to deal with the additional error level that\n  bgp_attr_ parsers can raise, and also similarly return appropriate\n  error back up to (bgp_update_receive). Try to avoid leaking as4_path.\n* bgp_packet.c: (bgp_update_receive) Adjust to deal with BGP_ATTR_PARSE_WITHDRAW\n  error level from bgp_attr_parse, which should lead to a withdraw, by\n  making the attribute parameter in call to (bgp_nlri_parse) conditional\n  on the error, so the update case morphs also into a withdraw.\n  Use bgp_attr_unintern_sub from above, instead of doing this itself.\n  Fix error case returns which were not calling bgp_attr_unintern_sub\n  and probably leaking memory.\n* tests/aspath_test.c: Fix to work for null return with bad segments\n"
    },
    {
      "commit": "c8f3fe3063cb9ff193b13011cfbda3e605395340",
      "tree": "42713ac0369f0ef372c657ded091b00dbe6a019b",
      "parents": [
        "0c46638122f10019a12ae9668aec91691cf2e017"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sun Dec 05 20:28:02 2010 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Mar 21 13:51:14 2011 +0000"
      },
      "message": "bgpd: Remove AS Path limit/TTL functionality\n\n* draft-ietf-idr-as-pathlimit doesn\u0027t seem to have gone anywhere, and its\n  author does not think it will make progress in IDR. Remove all support\n  introduced for it, but leave stubs for the commands to avoid breaking\n  any configurations.\n\n  Basically reverts cecab5e9725792e60a5e4b473e238a14cd85815d.\n"
    },
    {
      "commit": "f6f434b2822c453f898552537180a812538bd19e",
      "tree": "81f5de3c1eeb6679635e7363396c08b807b04ad9",
      "parents": [
        "50ef565e4e689ba653b9709be4d28a01f6cca885"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue Nov 23 21:28:03 2010 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Mar 21 13:51:14 2011 +0000"
      },
      "message": "bgpd: Try fix extcommunity resource allocation probs, particularly with \u0027set extcom..\u0027\n\n* Extended communities has some kind of resource allocation problem which\n  causes a double-free if the \u0027set extcommunity ...\u0027 command is used.\n  Try fix by properly interning extcommunities.\n\n  Also, more generally, make unintern functions take a double pointer\n  so they can NULL out callers references - a usefully defensive programming\n  pattern for functions which make refs invalid.\n\n  Sadly, this patch doesn\u0027t fix the problem entirely - crashes still\n  occur on session clear.\n\n* bgp_ecommunity.h: (ecommunity_{free,unintern}) take double pointer\n  args.\n* bgp_community.h: (community_unintern) ditto\n* bgp_attr.h: (bgp_attr_intern) ditto\n* bgp_aspath.h: (bgp_aspath.h) ditto\n* (general) update all callers of above\n* bgp_routemap.c: (route_set_ecommunity_{rt,soo}) intern the new extcom added\n  to the attr, and unintern any old one.\n  (route_set_ecommunity_{rt,soo}_compile) intern the extcom to be used\n  for the route-map set.\n  (route_set_ecommunity_*_free) unintern to match, instead of free\n  (route_set_ecommunity_soo) Do as _rt does and don\u0027t just leak\n  any pre-existing community, add to it (is additive right though?)\n"
    },
    {
      "commit": "ab005298526f4b14126cae1a6461ad3d700af29c",
      "tree": "8b27b97dc351ae1c89c943750e8ad53d4781de44",
      "parents": [
        "c8f3fe3063cb9ff193b13011cfbda3e605395340"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sat Nov 27 22:48:34 2010 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Mar 21 13:51:14 2011 +0000"
      },
      "message": "bgpd: Rollback some of the changes made for invalid AS_PATH segment fix\n\nSome of the changes made in commit cddb8112b80fa9867156c637d63e6e79eeac67bb\ndon\u0027t work particularly well for other changes that need to be made to\naddress BGP attribute error handling problems. In particular, returning\na pointer from complex attribute data parsing functions will not suffice\nto express the require range of return status conditions.\n\n* bgp_aspath.c: (assegments_parse) Rollback to a more minimal set of\n  changes to fix the original problem.\n  (aspath_parse) Slightly needless pushing around of code, and taking\n  2 parameters to say whether ot use 2 or 4 byte encoding seems unnecessary.\n* bgp_attr.c: (bgp_attr_as{,4}path) Rollback, in preparation for BGP\n  attribute error handling update.\n"
    },
    {
      "commit": "0c46638122f10019a12ae9668aec91691cf2e017",
      "tree": "1302073e844ff46061ebb938bcd218ed9fbb96bf",
      "parents": [
        "8f228de7b3f9d6f641c75b27ac7ac6e5862cf804"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sun Dec 05 17:17:26 2010 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Mar 21 13:50:56 2011 +0000"
      },
      "message": "bgpd/security: CVE-2010-1674 Fix crash due to extended-community parser error\n\n* bgp_attr.c: (bgp_attr_ext_communities) Certain extended-community attrs\n  can leave attr-\u003eflag indicating ext-community is present, even though no\n  extended-community object has been attached to the attr structure.  Thus a\n  null-pointer dereference can occur later.\n  (bgp_attr_community) No bug fixed here, but tidy up flow so it has same\n  form as previous.\n\n  Problem and fix thanks to anonymous reporter.\n"
    },
    {
      "commit": "c8e7b8959051bf525183bdbff605e54b4b532e2c",
      "tree": "af9af45c64164f7e7ee9aec5575837624e23df65",
      "parents": [
        "6392aa83c4f895ebbd23817c68d9b0da0de2e0f8"
      ],
      "author": {
        "name": "Stephen Hemminger",
        "email": "shemminger@vyatta.com",
        "time": "Fri Aug 27 14:12:54 2010 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Mar 21 13:30:54 2011 +0000"
      },
      "message": "bgpd: use Jenkins hash for BGP transit, cluster and attr hashes\n\n* bgp_attr.c: I observed while doing some debugging that even for simple\n  tests there was a lot of hash collisions for BGP attributes.  Switch to\n  using Jhash rather than additive hashing.  Probably overkill, but the\n  function is fast and available.\n\n  ({attrhash,cluster,transit}_hask_key_make) convert to Jenkins hash,\n  instead of additive hash.\n"
    },
    {
      "commit": "25ff1e88bb5f1b0a16a364d7206db3ebdc5ecf52",
      "tree": "cdb0c95588899c39ad676ef167c87b5c2a4d3a51",
      "parents": [
        "c099baf6f0a6509d70fb62a8d6341432abb50d91"
      ],
      "author": {
        "name": "Barry Friedman",
        "email": "barryf@google.com",
        "time": "Thu Feb 03 14:02:53 2011 -0800"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Mar 21 13:15:32 2011 +0000"
      },
      "message": "bgpd: Remove extra lock on interior table node\n\nIf the radix tree creates an extra interior node in bgp_node_get(),\nit locks the interior node even though this node is not returned to\nthe caller, so it may never be unlocked. The lock prevents this node\nfrom being deleted.\n\n* bgpd/bgp_table.c: (bgp_node_get) Remove lock on interior node which\n  prevents proper node deletion\n"
    }
  ],
  "next": "c099baf6f0a6509d70fb62a8d6341432abb50d91"
}
