From owner-freebsd-net@FreeBSD.ORG Thu Jan 24 18:24:34 2008 Return-Path: Delivered-To: freebsd-net@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D49AC16A421 for ; Thu, 24 Jan 2008 18:24:34 +0000 (UTC) (envelope-from fjo-lists@ogris.de) Received: from ns1.ogris.net (ns1.ogris.net [212.62.68.23]) by mx1.freebsd.org (Postfix) with ESMTP id CDA9B13C461 for ; Thu, 24 Jan 2008 18:24:33 +0000 (UTC) (envelope-from fjo-lists@ogris.de) Received: from [81.89.251.75] (fjo-pb.dts.de [81.89.251.75]) by ns1.ogris.net (Postfix) with ESMTP id 020E9B2461 for ; Thu, 24 Jan 2008 19:08:28 +0100 (CET) User-Agent: Microsoft-Entourage/11.3.6.070618 Date: Thu, 24 Jan 2008 19:08:25 +0100 From: "Felix J. Ogris" To: Message-ID: Thread-Topic: carp(4) ip loadbalancing (patch included) Thread-Index: AchetBzHWyezVsqnEdyWVQARJHjFOg== Mime-version: 1.0 Content-type: multipart/mixed; boundary="B_3284046509_3507725" Subject: carp(4) ip loadbalancing (patch included) X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 24 Jan 2008 18:24:34 -0000 > This message is in MIME format. Since your mail reader does not understand this format, some or all of this message may not be legible. --B_3284046509_3507725 Content-type: text/plain; charset="US-ASCII" Content-transfer-encoding: 7bit Hi, I have extended ip_carp.c to provide loadbalancing on an ip basis, eg. to setup an active/active cluster. The algorithm is quite simple. Each cluster consists of N nodes. If an IPv4/IPv6 packet reaches node X, then it evaluates X == N mod source_address_of_IP_packet. If this is true, then the node will process that packet (carp_forus() returns 1). I had to introduce a new carp type (#define CARP_HELO 0x00) which by default is multicasted every 3 seconds (advertising base). Each node maintains a list of its IPv4 and IPv6 neighbours. Neighbours are timed out after 3 * advbase seconds. Network layer protocols other than IPv4/IPv6 are handled by the carp master. TCP packets, which have their ACK flag set or their SYN flag not set, are checked for an entry in the syncache or in tcbinfo. If an entry is found, then that TCP packet will not be handled by the current node (carp_forus() returns 0). This guarantees that an established TCP connection will stick to a host, even if a dead node reenters the cluster. I have put my patch (against 6.3-RELEASE) under the same license as the FreeBSD kernel itself. So feel free to apply it to the official tree - or to punish me for my lousy work :-) Regards, Felix --B_3284046509_3507725 Content-type: application/octet-stream; name="carp_aa.patch" Content-disposition: attachment; filename="carp_aa.patch" Content-transfer-encoding: base64 ZGlmZiAtZHJ1IHN5czAvbmV0L2lmX2JyaWRnZS5jIHN5cy9uZXQvaWZfYnJpZGdlLmMKLS0t IHN5czAvbmV0L2lmX2JyaWRnZS5jCTIwMDctMTItMjEgMDU6MzA6NDcuMDAwMDAwMDAwICsw MDAwCisrKyBzeXMvbmV0L2lmX2JyaWRnZS5jCTIwMDgtMDEtMjMgMjM6Mjk6MDIuMDAwMDAw MDAwICswMDAwCkBAIC0yMTc2LDEwICsyMTc2LDEwIEBACiAjaWZkZWYgREVWX0NBUlAKICMg ICBkZWZpbmUgT1JfQ0FSUF9DSEVDS19XRV9BUkVfRFNUKGlmYWNlKSBcCiAJfHwgKChpZmFj ZSktPmlmX2NhcnAgXAotCSAgICAmJiBjYXJwX2ZvcnVzKChpZmFjZSktPmlmX2NhcnAsIGVo LT5ldGhlcl9kaG9zdCkpCisJICAgICYmIGNhcnBfZm9ydXMoKGlmYWNlKS0+aWZfY2FycCwg ZWgtPmV0aGVyX2Rob3N0LCBtKSkKICMgICBkZWZpbmUgT1JfQ0FSUF9DSEVDS19XRV9BUkVf U1JDKGlmYWNlKSBcCiAJfHwgKChpZmFjZSktPmlmX2NhcnAgXAotCSAgICAmJiBjYXJwX2Zv cnVzKChpZmFjZSktPmlmX2NhcnAsIGVoLT5ldGhlcl9zaG9zdCkpCisJICAgICYmIGNhcnBf Zm9ydXMoKGlmYWNlKS0+aWZfY2FycCwgZWgtPmV0aGVyX3Nob3N0LCBtKSkKICNlbHNlCiAj ICAgZGVmaW5lIE9SX0NBUlBfQ0hFQ0tfV0VfQVJFX0RTVChpZmFjZSkKICMgICBkZWZpbmUg T1JfQ0FSUF9DSEVDS19XRV9BUkVfU1JDKGlmYWNlKQpkaWZmIC1kcnUgc3lzMC9uZXQvaWZf ZXRoZXJzdWJyLmMgc3lzL25ldC9pZl9ldGhlcnN1YnIuYwotLS0gc3lzMC9uZXQvaWZfZXRo ZXJzdWJyLmMJMjAwNy0wOS0xNyAxNzo1MDo0OS4wMDAwMDAwMDAgKzAwMDAKKysrIHN5cy9u ZXQvaWZfZXRoZXJzdWJyLmMJMjAwOC0wMS0yMyAyMzoyOToyOS4wMDAwMDAwMDAgKzAwMDAK QEAgLTY2Miw3ICs2NjIsNyBAQAogCQkgKiBldmFsdWF0aW9uLCB0byBzZWUgaWYgdGhlIGNh cnAgZXRoZXJfZGhvc3QgdmFsdWVzIGJyZWFrIGFueQogCQkgKiBvZiB0aGVzZSBjaGVja3Mh CiAJCSAqLwotCQlpZiAoaWZwLT5pZl9jYXJwICYmIGNhcnBfZm9ydXMoaWZwLT5pZl9jYXJw LCBlaC0+ZXRoZXJfZGhvc3QpKQorCQlpZiAoaWZwLT5pZl9jYXJwICYmIGNhcnBfZm9ydXMo aWZwLT5pZl9jYXJwLCBlaC0+ZXRoZXJfZGhvc3QsIG0pKQogCQkJZ290byBwcmVfc3RhdHM7 CiAjZW5kaWYKIAkJLyoKZGlmZiAtZHJ1IHN5czAvbmV0aW5ldC9pcF9jYXJwLmMgc3lzL25l dGluZXQvaXBfY2FycC5jCi0tLSBzeXMwL25ldGluZXQvaXBfY2FycC5jCTIwMDctMDYtMDYg MTY6MjA6NTAuMDAwMDAwMDAwICswMDAwCisrKyBzeXMvbmV0aW5ldC9pcF9jYXJwLmMJMjAw OC0wMS0yMyAyMzoyMjoxMi4wMDAwMDAwMDAgKzAwMDAKQEAgLTMsNiArMyw3IEBACiAvKgog ICogQ29weXJpZ2h0IChjKSAyMDAyIE1pY2hhZWwgU2hhbGF5ZWZmLiBBbGwgcmlnaHRzIHJl c2VydmVkLgogICogQ29weXJpZ2h0IChjKSAyMDAzIFJ5YW4gTWNCcmlkZS4gQWxsIHJpZ2h0 cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOCBGZWxpeCBKLiBPZ3Jpcy4gQWxs IHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlv biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u cwpAQCAtODgsNiArODksMzIgQEAKIHN0YXRpYyBNQUxMT0NfREVGSU5FKE1fQ0FSUCwgIkNB UlAiLCAiQ0FSUCBpbnRlcmZhY2VzIik7CiBTWVNDVExfREVDTChfbmV0X2luZXRfY2FycCk7 CiAKKy8qIGlwbGIgKi8KKyNpbmNsdWRlIDxuZXRpbmV0L2luX3BjYi5oPgorI2lmZGVmIElO RVQ2CisjaW5jbHVkZSA8bmV0aW5ldDYvaW42X3BjYi5oPgorI2VuZGlmCisjaW5jbHVkZSA8 bmV0aW5ldC90Y3BfdmFyLmg+CisjZGVmaW5lIENBUlBfSEVMTyAweDAwCitzdHJ1Y3QgY2Fy cF9wZWVyIHsKKwlzdHJ1Y3QgeworCQlzYV9mYW1pbHlfdCBzYV9mYW1pbHk7CisJCWNoYXIg c2FfZGF0YVsxNl07CisJfSBjcF9zYTsKKwlzdHJ1Y3QgdGltZXZhbCBjcF90djsKKwlUQUlM UV9FTlRSWShjYXJwX3BlZXIpIGNwX2xpc3Q7Cit9OworVEFJTFFfSEVBRChjYXJwX3BlZXJf bGlzdCwgY2FycF9wZWVyKTsKK3N0YXRpYyB2b2lkIGNhcnBfaXBsYl9jbGVhbnVwKHZvaWQq KTsKK3N0YXRpYyBpbnQgY2FycF9pcGxiX2VuYWJsZSA9IDA7CitzdGF0aWMgaW50IGNhcnBf aXBsYl9tYXNrID0gMzI7CitTWVNDVExfSU5UKF9uZXRfaW5ldF9jYXJwLCBPSURfQVVUTywg aXBfYmFsYW5jZSwgQ1RMRkxBR19SVywKKyAgICAmY2FycF9pcGxiX2VuYWJsZSwgMCwgImJh bGFuY2UgSVAgcmVzcG9uc2VzIik7CitTWVNDVExfSU5UKF9uZXRfaW5ldF9jYXJwLCBPSURf QVVUTywgaXBfYmFsYW5jZV9tYXNrLCBDVExGTEFHX1JXLAorICAgICZjYXJwX2lwbGJfbWFz aywgMCwgIklQIHN0aWNreW5lc3MgbWFzayIpOworZXh0ZXJuIHN0cnVjdCBzeW5jYWNoZSAq c3luY2FjaGVfbG9va3VwKHN0cnVjdCBpbl9jb25uaW5mbyosIHN0cnVjdCBzeW5jYWNoZV9o ZWFkKiopOworLyogaXBsYiAqLworCiBzdHJ1Y3QgY2FycF9zb2Z0YyB7CiAJc3RydWN0IGlm bmV0CSAJKnNjX2lmcDsJLyogSW50ZXJmYWNlIGNsdWUgKi8KIAlzdHJ1Y3QgaWZuZXQJCSpz Y19jYXJwZGV2OwkvKiBQb2ludGVyIHRvIHBhcmVudCBpbnRlcmZhY2UgKi8KQEAgLTEyOCw2 ICsxNTUsMjAgQEAKIAlzdHJ1Y3QgY2FsbG91dCAJCSBzY19tZDZfdG1vOwkvKiBtYXN0ZXIg ZG93biB0aW1lb3V0ICovCiAJCiAJTElTVF9FTlRSWShjYXJwX3NvZnRjKQkgc2NfbmV4dDsJ LyogSW50ZXJmYWNlIGNsdWUgKi8KKworCS8qIGlwbGIgKi8KKwlzdHJ1Y3QgY2FsbG91dCAJ CSBzY19wZWVyc190bW87CS8qIGhlbG8gdGltZW91dCAqLworCXN0cnVjdCBjYXJwX3BlZXJf bGlzdCAgICBzY19wZWVyczsJLyogSVB2NCBwZWVycyAqLworCXN0cnVjdCBjYXJwX3BlZXJf bGlzdCAgICBzY19wZWVyczYJLyogSVB2NiBwZWVycyAqLzsKKwlpbnQgc2NfaG9zdHM7CQkJ CS8qIElQdjQgaG9zdHMgaW4gdGhpcyBjbHVzdGVyICovCisJaW50IHNjX2hvc3Q7CQkJCS8q IG15IElQdjQgcG9zaXRpb24gKi8KKwlpbnQgc2NfaG9zdHM2OwkJCQkvKiBJUHY2IGhvc3Rz IGluIHRoaXMgY2x1c3RlciAqLworCWludCBzY19ob3N0NjsJCQkJLyogbXkgSVB2NiBwb3Np dGlvbiAqLworCXN0cnVjdCBtdHggc2NfcGVlcnNfbXR4OwkJLyogbXV0ZXggZm9yIHNjX3Bl ZXJzICovCisJc3RydWN0IG10eCBzY19wZWVyczZfbXR4OwkJLyogbXV0ZXggZm9yIHNjX3Bl ZXJzNiAqLworCWNoYXIgc2NfcGVlcnNfbXR4X25hbWVbNjRdOwkJLyogbmFtZSBvZiBzY19w ZWVyc19tdHggKi8KKwljaGFyIHNjX3BlZXJzNl9tdHhfbmFtZVs2NF07CQkvKiBuYW1lIG9m IHNjX3BlZXJzNl9tdHggKi8KKwkvKiBpcGxiICovCiB9OwogI2RlZmluZQlTQzJJRlAoc2Mp CSgoc2MpLT5zY19pZnApCiAKQEAgLTM1NCw3ICszOTUsNyBAQAogc3RhdGljIGludAogY2Fy cF9jbG9uZV9jcmVhdGUoc3RydWN0IGlmX2Nsb25lICppZmMsIGludCB1bml0KQogewotCisJ c3RydWN0IHRpbWV2YWwgdHY7CiAJc3RydWN0IGNhcnBfc29mdGMgKnNjOwogCXN0cnVjdCBp Zm5ldCAqaWZwOwogCkBAIC0zOTYsNiArNDM3LDI1IEBACiAJbXR4X2xvY2soJmNhcnBfbXR4 KTsKIAlMSVNUX0lOU0VSVF9IRUFEKCZjYXJwaWZfbGlzdCwgc2MsIHNjX25leHQpOwogCW10 eF91bmxvY2soJmNhcnBfbXR4KTsKKworCS8qIGlwbGIgKi8KKwlzdHJjcHkoc2MtPnNjX3Bl ZXJzX210eF9uYW1lLCBTQzJJRlAoc2MpLT5pZl94bmFtZSk7CisJc3RyY2F0KHNjLT5zY19w ZWVyc19tdHhfbmFtZSwgIl9wZWVyc19tdHgiKTsKKwltdHhfaW5pdCgmc2MtPnNjX3BlZXJz X210eCwgc2MtPnNjX3BlZXJzX210eF9uYW1lLCBOVUxMLCBNVFhfREVGKTsKKwlzdHJjcHko c2MtPnNjX3BlZXJzNl9tdHhfbmFtZSwgU0MySUZQKHNjKS0+aWZfeG5hbWUpOworCXN0cmNh dChzYy0+c2NfcGVlcnM2X210eF9uYW1lLCAiX3BlZXJzNl9tdHgiKTsKKwltdHhfaW5pdCgm c2MtPnNjX3BlZXJzNl9tdHgsIHNjLT5zY19wZWVyczZfbXR4X25hbWUsIE5VTEwsIE1UWF9E RUYpOworCVRBSUxRX0lOSVQoJnNjLT5zY19wZWVycyk7CisJVEFJTFFfSU5JVCgmc2MtPnNj X3BlZXJzNik7CisJc2MtPnNjX2hvc3RzID0gMDsKKwlzYy0+c2NfaG9zdCA9IC0xOworCXNj LT5zY19ob3N0czYgPSAwOworCXNjLT5zY19ob3N0NiA9IC0xOworCXR2LnR2X3NlYyA9IENB UlBfREZMVElOVFY7CisJdHYudHZfdXNlYyA9IDA7CisJY2FsbG91dF9pbml0KCZzYy0+c2Nf cGVlcnNfdG1vLCBORVRfQ0FMTE9VVF9NUFNBRkUpOworCWNhbGxvdXRfcmVzZXQoJnNjLT5z Y19wZWVyc190bW8sIHR2dG9oeigmdHYpLCBjYXJwX2lwbGJfY2xlYW51cCwgc2MpOworCiAJ cmV0dXJuICgwKTsKIH0KIApAQCAtNDAzLDExICs0NjMsMjcgQEAKIGNhcnBfY2xvbmVfZGVz dHJveShzdHJ1Y3QgaWZuZXQgKmlmcCkKIHsKIAlzdHJ1Y3QgY2FycF9zb2Z0YyAqc2MgPSBp ZnAtPmlmX3NvZnRjOworCXN0cnVjdCBjYXJwX3BlZXIgKmNwLCAqY3BfdGVtcDsKIAogCWlm IChzYy0+c2NfY2FycGRldikKIAkJQ0FSUF9TQ0xPQ0soc2MpOwogCWNhcnBkZXRhY2goc2Ms IDEpOwkvKiBSZXR1cm5zIHVubG9ja2VkLiAqLwogCisJLyogaXBsYiAqLworCWNhbGxvdXRf c3RvcCgmc2MtPnNjX3BlZXJzX3Rtbyk7CisJbXR4X2Rlc3Ryb3koJnNjLT5zY19wZWVyc19t dHgpOworCW10eF9kZXN0cm95KCZzYy0+c2NfcGVlcnM2X210eCk7CisJc2MtPnNjX2hvc3Qg PSAtMTsKKwlzYy0+c2NfaG9zdHMgPSAwOworCXNjLT5zY19ob3N0NiA9IC0xOworCXNjLT5z Y19ob3N0czYgPSAwOworCVRBSUxRX0ZPUkVBQ0hfU0FGRShjcCwgJnNjLT5zY19wZWVycywg Y3BfbGlzdCwgY3BfdGVtcCkgeworCQlUQUlMUV9SRU1PVkUoJnNjLT5zY19wZWVycywgY3As IGNwX2xpc3QpOworCX0KKwlUQUlMUV9GT1JFQUNIX1NBRkUoY3AsICZzYy0+c2NfcGVlcnM2 LCBjcF9saXN0LCBjcF90ZW1wKSB7CisJCVRBSUxRX1JFTU9WRSgmc2MtPnNjX3BlZXJzNiwg Y3AsIGNwX2xpc3QpOworCX0KKwogCW10eF9sb2NrKCZjYXJwX210eCk7CiAJTElTVF9SRU1P VkUoc2MsIHNjX25leHQpOwogCW10eF91bmxvY2soJmNhcnBfbXR4KTsKQEAgLTQ3NCw2ICs1 NTAsNDY2IEBACiAJfQogfQogCisvKiBpcGxiICovCitzdGF0aWMgdm9pZAorY2FycF9pcGxi X2xvZ3BlZXIoc3RydWN0IGNhcnBfc29mdGMgKnNjLCBzdHJ1Y3QgY2FycF9wZWVyICpjcCwg Y2hhciAqZXZlbnQpCit7CisJc3dpdGNoIChjcC0+Y3Bfc2Euc2FfZmFtaWx5KSB7CisjaWZk ZWYgSU5FVDYKKwkgICAgY2FzZSBBRl9JTkVUNjoKKwkJQ0FSUF9MT0coIiVzOiAlczogJWho eCVoaHg6JWhoeCVoaHg6JWhoeCVoaHg6JWhoeCVoaHg6IgorCQkJICIlaGh4JWhoeDolaGh4 JWhoeDolaGh4JWhoeDolaGh4JWhoeFxuIiwKKwkJCSBTQzJJRlAoc2MpLT5pZl94bmFtZSwg ZXZlbnQsCisJCQkgY3AtPmNwX3NhLnNhX2RhdGFbMF0sIGNwLT5jcF9zYS5zYV9kYXRhWzFd LAorCQkJIGNwLT5jcF9zYS5zYV9kYXRhWzJdLCBjcC0+Y3Bfc2Euc2FfZGF0YVszXSwKKwkJ CSBjcC0+Y3Bfc2Euc2FfZGF0YVs0XSwgY3AtPmNwX3NhLnNhX2RhdGFbNV0sCisJCQkgY3At PmNwX3NhLnNhX2RhdGFbNl0sIGNwLT5jcF9zYS5zYV9kYXRhWzddLAorCQkJIGNwLT5jcF9z YS5zYV9kYXRhWzhdLCBjcC0+Y3Bfc2Euc2FfZGF0YVs5XSwKKwkJCSBjcC0+Y3Bfc2Euc2Ff ZGF0YVsxMF0sIGNwLT5jcF9zYS5zYV9kYXRhWzExXSwKKwkJCSBjcC0+Y3Bfc2Euc2FfZGF0 YVsxMl0sIGNwLT5jcF9zYS5zYV9kYXRhWzEzXSwKKwkJCSBjcC0+Y3Bfc2Euc2FfZGF0YVsx NF0sIGNwLT5jcF9zYS5zYV9kYXRhWzE1XSk7CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYg SU5FVAorCSAgICBjYXNlIEFGX0lORVQ6CisJCUNBUlBfTE9HKCIlczogJXM6ICVoaHUuJWho dS4laGh1LiVoaHVcbiIsCisJCQkgU0MySUZQKHNjKS0+aWZfeG5hbWUsIGV2ZW50LAorCQkJ IGNwLT5jcF9zYS5zYV9kYXRhWzBdLCBjcC0+Y3Bfc2Euc2FfZGF0YVsxXSwKKwkJCSBjcC0+ Y3Bfc2Euc2FfZGF0YVsyXSwgY3AtPmNwX3NhLnNhX2RhdGFbM10pOworCQlicmVhazsKKyNl bmRpZgorCSAgICBkZWZhdWx0OgorCQlDQVJQX0RFQlVHKCIlczogY2FycF9pcGxiX2xvZ3Bl ZXI6IHVua25vd24gYWRkcmVzcyBmYW1pbHkgJWlcbiIsCisJCQkgICBTQzJJRlAoc2MpLT5p Zl94bmFtZSwgY3AtPmNwX3NhLnNhX2ZhbWlseSk7CisJCXJldHVybjsKKwl9Cit9CisKK3N0 YXRpYyBpbnQKK2NhcnBfaXBsYl9tZW1jbXAgKHVuc2lnbmVkIGNoYXIgKmEsIHVuc2lnbmVk IGNoYXIgKmIsIGludCBsZW4pCit7CisJd2hpbGUgKGxlbikgeworCQlpZiAoKmEgPiAqYikg cmV0dXJuIDE7CisJCWlmICgqYSA8ICpiKSByZXR1cm4gLTE7CisJCSsrYTsKKwkJKytiOwor CQktLWxlbjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitjYXJwX2lwbGJf YWRkcGVlcihzdHJ1Y3QgY2FycF9zb2Z0YyAqc2MsIGludCBhZiwgdm9pZCAqYWRkcmVzcykK K3sKKwlzdHJ1Y3QgY2FycF9wZWVyX2xpc3QgKnBlZXJzOworCXN0cnVjdCBjYXJwX3BlZXIg KmNwLCAqY3BfdGVtcDsKKwlpbnQgaWFfbGVuLCBub3Rmb3VuZCA9IDE7CisJc3RydWN0IG10 eCAqbXV0ZXg7CisKKwlpZiAoIWNhcnBfaXBsYl9lbmFibGUpCisJCXJldHVybjsKKworCXN3 aXRjaCAoYWYpIHsKKyNpZmRlZiBJTkVUNgorCSAgICBjYXNlIEFGX0lORVQ2OgorCQlpYV9s ZW4gPSAxNjsKKwkJcGVlcnMgPSAmc2MtPnNjX3BlZXJzNjsKKwkJbXV0ZXggPSAmc2MtPnNj X3BlZXJzNl9tdHg7CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgSU5FVAorCSAgICBjYXNl IEFGX0lORVQ6CisJCWlhX2xlbiA9IDQ7CisJCXBlZXJzID0gJnNjLT5zY19wZWVyczsKKwkJ bXV0ZXggPSAmc2MtPnNjX3BlZXJzX210eDsKKwkJYnJlYWs7CisjZW5kaWYKKwkgICAgZGVm YXVsdDoKKwkJQ0FSUF9ERUJVRygiJXM6IGNhcnBfaXBsYl9hZGRwZWVyOiB1bmtub3duIGFk ZHJlc3MgZmFtaWx5ICVpXG4iLAorCQkJICAgU0MySUZQKHNjKS0+aWZfeG5hbWUsIGFmKTsK KwkJcmV0dXJuOworCX0KKworCW10eF9sb2NrKG11dGV4KTsKKwlUQUlMUV9GT1JFQUNIKGNw X3RlbXAsIHBlZXJzLCBjcF9saXN0KSB7CisJCWlmIChjcF90ZW1wLT5jcF9zYS5zYV9mYW1p bHkgIT0gYWYpCisJCQljb250aW51ZTsKKwkJLyogWFhYOiBtZW1jbXAvYmNtcCBkb2Vzbid0 IHdvcmsgKi8KKwkJbm90Zm91bmQgPSBjYXJwX2lwbGJfbWVtY21wKGNwX3RlbXAtPmNwX3Nh LnNhX2RhdGEsIGFkZHJlc3MsIGlhX2xlbik7CisJCWlmIChub3Rmb3VuZCA+PSAwKQorCQkJ YnJlYWs7CisJfQorCisJaWYgKG5vdGZvdW5kKSB7CisJCU1BTExPQyhjcCwgc3RydWN0IGNh cnBfcGVlciAqLCBzaXplb2YoKmNwKSwKKwkJICAgICAgIE1fQ0FSUCwgTV9XQUlUT0t8TV9a RVJPKTsKKwkJaWYgKCFjcCkgeworCQkJQ0FSUF9MT0coIiVzOiBjYXJwX2lwbGJfYWRkcGVl cjogb3V0IG9mIG1lbW9yeSEiLAorCQkJCSBTQzJJRlAoc2MpLT5pZl94bmFtZSk7CisJCQly ZXR1cm47CisJCX0KKwkJbWVtY3B5KCZjcC0+Y3Bfc2Euc2FfZGF0YSwgYWRkcmVzcywgaWFf bGVuKTsKKwkJY3AtPmNwX3NhLnNhX2ZhbWlseSA9IGFmOworCQlnZXRtaWNyb3RpbWUoJmNw LT5jcF90dik7CisKKwkJY2FycF9pcGxiX2xvZ3BlZXIoc2MsIGNwLCAibmV3IHBlZXIiKTsK KworCQlpZiAoY3BfdGVtcCkKKwkJCVRBSUxRX0lOU0VSVF9CRUZPUkUoY3BfdGVtcCwgY3As IGNwX2xpc3QpOworCQllbHNlCisJCQlUQUlMUV9JTlNFUlRfVEFJTChwZWVycywgY3AsIGNw X2xpc3QpOworCX0KKwllbHNlCisJCWdldG1pY3JvdGltZSgmY3BfdGVtcC0+Y3BfdHYpOwor CisJbXR4X3VubG9jayhtdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkCitjYXJwX2lwbGJfc2Vu ZF9oZWxvKHN0cnVjdCBjYXJwX3NvZnRjICpzYykKK3sKKwlzdHJ1Y3QgY2FycF9oZWFkZXIg Y2g7CisJc3RydWN0IGNhcnBfaGVhZGVyICpjaF9wdHI7CisJc3RydWN0IG1idWYgKm07CisJ c3RydWN0IG1fdGFnICptdGFnOworCXN0cnVjdCBpZm5ldCAqaWZwID0gU0MySUZQKHNjKTsK KwlpbnQgbGVuOworCisJaWYgKCFjYXJwX2lwbGJfZW5hYmxlKQorCQlyZXR1cm47CisKKwlj aC5jYXJwX3ZlcnNpb24gPSBDQVJQX1ZFUlNJT047CisJY2guY2FycF90eXBlID0gQ0FSUF9I RUxPOworCWNoLmNhcnBfdmhpZCA9IHNjLT5zY192aGlkOworCWNoLmNhcnBfYWR2YmFzZSA9 IDA7CisJY2guY2FycF9hZHZza2V3ID0gMDsKKwljaC5jYXJwX2F1dGhsZW4gPSA3OwkvKiBY WFggREVGSU5FICovCisJY2guY2FycF9wYWQxID0gMDsJLyogbXVzdCBiZSB6ZXJvICovCisJ Y2guY2FycF9ja3N1bSA9IDA7CisJY2guY2FycF9jb3VudGVyWzBdID0gMDsKKwljaC5jYXJw X2NvdW50ZXJbMV0gPSAwOworCisJY2FycF9obWFjX2dlbmVyYXRlKHNjLCBjaC5jYXJwX2Nv dW50ZXIsIGNoLmNhcnBfbWQpOworCisjaWZkZWYgSU5FVAorCWlmIChzYy0+c2NfaWEpIHsK KwkJc3RydWN0IGlwICppcDsKKworCQlNR0VUSERSKG0sIE1fRE9OVFdBSVQsIE1UX0hFQURF Uik7CisJCWlmIChtID09IE5VTEwpCisJCQlyZXR1cm47CisJCWxlbiA9IHNpemVvZigqaXAp ICsgc2l6ZW9mKGNoKTsKKwkJbS0+bV9wa3RoZHIubGVuID0gbGVuOworCQltLT5tX3BrdGhk ci5yY3ZpZiA9IE5VTEw7CisJCW0tPm1fbGVuID0gbGVuOworCQlNSF9BTElHTihtLCBtLT5t X2xlbik7CisJCW0tPm1fZmxhZ3MgfD0gTV9NQ0FTVDsKKwkJaXAgPSBtdG9kKG0sIHN0cnVj dCBpcCAqKTsKKwkJaXAtPmlwX3YgPSBJUFZFUlNJT047CisJCWlwLT5pcF9obCA9IHNpemVv ZigqaXApID4+IDI7CisJCWlwLT5pcF90b3MgPSBJUFRPU19MT1dERUxBWTsKKwkJaXAtPmlw X2xlbiA9IGxlbjsKKwkJaXAtPmlwX2lkID0gaXBfbmV3aWQoKTsKKwkJaXAtPmlwX29mZiA9 IElQX0RGOworCQlpcC0+aXBfdHRsID0gQ0FSUF9ERkxUVEw7CisJCWlwLT5pcF9wID0gSVBQ Uk9UT19DQVJQOworCQlpcC0+aXBfc3VtID0gMDsKKwkJaXAtPmlwX3NyYy5zX2FkZHIgPSBz Yy0+c2NfaWEtPmlhX2FkZHIuc2luX2FkZHIuc19hZGRyOworCQlpcC0+aXBfZHN0LnNfYWRk ciA9IGh0b25sKElOQUREUl9DQVJQX0dST1VQKTsKKworCQljaF9wdHIgPSAoc3RydWN0IGNh cnBfaGVhZGVyICopKCZpcFsxXSk7CisJCWJjb3B5KCZjaCwgY2hfcHRyLCBzaXplb2YoY2gp KTsKKworCQkvKiBUYWcgcGFja2V0IGZvciBjYXJwX291dHB1dCAqLworCQltdGFnID0gbV90 YWdfZ2V0KFBBQ0tFVF9UQUdfQ0FSUCwgc2l6ZW9mKHN0cnVjdCBpZm5ldCAqKSwgTV9OT1dB SVQpOworCQlpZiAobXRhZyA9PSBOVUxMKSB7CisJCQlDQVJQX0xPRygiJXM6IGNhcnBfaXBs Yl9zZW5kX2hlbG86IG1fdGFnX2dldCBmYWlsZWRcbiIsCisJCQkJIFNDMklGUChzYyktPmlm X3huYW1lKTsKKwkJCW1fZnJlZW0obSk7CisJCQlyZXR1cm47CisJCX0KKwkJYmNvcHkoJmlm cCwgKGNhZGRyX3QpKG10YWcgKyAxKSwgc2l6ZW9mKHN0cnVjdCBpZm5ldCAqKSk7CisJCW1f dGFnX3ByZXBlbmQobSwgbXRhZyk7CisKKwkJbS0+bV9kYXRhICs9IHNpemVvZigqaXApOwor CQljaF9wdHItPmNhcnBfY2tzdW0gPSBjYXJwX2Nrc3VtKG0sIGxlbiAtIHNpemVvZigqaXAp KTsKKwkJbS0+bV9kYXRhIC09IHNpemVvZigqaXApOworCisjaWYgMAorCQlnZXRtaWNyb3Rp bWUoJlNDMklGUChzYyktPmlmX2xhc3RjaGFuZ2UpOworCQlTQzJJRlAoc2MpLT5pZl9vcGFj a2V0cysrOworCQlTQzJJRlAoc2MpLT5pZl9vYnl0ZXMgKz0gbGVuOworCQljYXJwc3RhdHMu Y2FycHNfb3BhY2tldHMrKzsKKyNlbmRpZgorCisJCWlmIChpcF9vdXRwdXQobSwgTlVMTCwg TlVMTCwgSVBfUkFXT1VUUFVULCAmc2MtPnNjX2ltbywgTlVMTCkpCisJCQlDQVJQX0xPRygi JXM6IGNhcnBfaXBsYl9zZW5kX2hlbG86IGlwX291dHB1dCBmYWlsZWRcbiIsCisJCQkJIFND MklGUChzYyktPmlmX3huYW1lKTsKKwl9CisjZW5kaWYgLyogSU5FVCAqLworI2lmZGVmIElO RVQ2CisJaWYgKHNjLT5zY19pYTYpIHsKKwkJc3RydWN0IGlwNl9oZHIgKmlwNjsKKworCQlN R0VUSERSKG0sIE1fRE9OVFdBSVQsIE1UX0hFQURFUik7CisJCWlmIChtID09IE5VTEwpCisJ CQlyZXR1cm47CisJCWxlbiA9IHNpemVvZigqaXA2KSArIHNpemVvZihjaCk7CisJCW0tPm1f cGt0aGRyLmxlbiA9IGxlbjsKKwkJbS0+bV9wa3RoZHIucmN2aWYgPSBOVUxMOworCQltLT5t X2xlbiA9IGxlbjsKKwkJTUhfQUxJR04obSwgbS0+bV9sZW4pOworCQltLT5tX2ZsYWdzIHw9 IE1fTUNBU1Q7CisJCWlwNiA9IG10b2QobSwgc3RydWN0IGlwNl9oZHIgKik7CisJCWJ6ZXJv KGlwNiwgc2l6ZW9mKCppcDYpKTsKKwkJaXA2LT5pcDZfdmZjIHw9IElQVjZfVkVSU0lPTjsK KwkJaXA2LT5pcDZfaGxpbSA9IENBUlBfREZMVFRMOworCQlpcDYtPmlwNl9ueHQgPSBJUFBS T1RPX0NBUlA7CisJCWJjb3B5KCZzYy0+c2NfaWE2LT5pYV9hZGRyLnNpbjZfYWRkciwgJmlw Ni0+aXA2X3NyYywKKwkJICAgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKwkJLyogc2V0 IHRoZSBtdWx0aWNhc3QgZGVzdGluYXRpb24gKi8KKworCQlpcDYtPmlwNl9kc3QuczZfYWRk cjE2WzBdID0gaHRvbnMoMHhmZjAyKTsKKwkJaXA2LT5pcDZfZHN0LnM2X2FkZHI4WzE1XSA9 IDB4MTI7CisJCWlmIChpbjZfc2V0c2NvcGUoJmlwNi0+aXA2X2RzdCwgc2MtPnNjX2NhcnBk ZXYsIE5VTEwpICE9IDApIHsKKwkJCVNDMklGUChzYyktPmlmX29lcnJvcnMrKzsKKwkJCW1f ZnJlZW0obSk7CisJCQlDQVJQX0xPRygiJXM6IGluNl9zZXRzY29wZSBmYWlsZWRcbiIsIF9f ZnVuY19fKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWNoX3B0ciA9IChzdHJ1Y3QgY2FycF9o ZWFkZXIgKikoJmlwNlsxXSk7CisJCWJjb3B5KCZjaCwgY2hfcHRyLCBzaXplb2YoY2gpKTsK KworCQkvKiBUYWcgcGFja2V0IGZvciBjYXJwX291dHB1dCAqLworCQltdGFnID0gbV90YWdf Z2V0KFBBQ0tFVF9UQUdfQ0FSUCwgc2l6ZW9mKHN0cnVjdCBpZm5ldCAqKSwgTV9OT1dBSVQp OworCQlpZiAobXRhZyA9PSBOVUxMKSB7CisJCQlDQVJQX0xPRygiJXM6IGNhcnBfaXBsYl9z ZW5kX2hlbG86IG1fdGFnX2dldCBmYWlsZWRcbiIsCisJCQkJIFNDMklGUChzYyktPmlmX3hu YW1lKTsKKwkJCW1fZnJlZW0obSk7CisJCQlyZXR1cm47CisJCX0KKwkJYmNvcHkoJmlmcCwg KGNhZGRyX3QpKG10YWcgKyAxKSwgc2l6ZW9mKHN0cnVjdCBpZm5ldCAqKSk7CisJCW1fdGFn X3ByZXBlbmQobSwgbXRhZyk7CisKKwkJbS0+bV9kYXRhICs9IHNpemVvZigqaXA2KTsKKwkJ Y2hfcHRyLT5jYXJwX2Nrc3VtID0gY2FycF9ja3N1bShtLCBsZW4gLSBzaXplb2YoKmlwNikp OworCQltLT5tX2RhdGEgLT0gc2l6ZW9mKCppcDYpOworCisjaWYgMAorCQlnZXRtaWNyb3Rp bWUoJlNDMklGUChzYyktPmlmX2xhc3RjaGFuZ2UpOworCQlTQzJJRlAoc2MpLT5pZl9vcGFj a2V0cysrOworCQlTQzJJRlAoc2MpLT5pZl9vYnl0ZXMgKz0gbGVuOworCQljYXJwc3RhdHMu Y2FycHNfb3BhY2tldHM2Kys7CisjZW5kaWYKKworCQlpZiAoaXA2X291dHB1dChtLCBOVUxM LCBOVUxMLCAwLCAmc2MtPnNjX2ltNm8sIE5VTEwsIE5VTEwpKQorCQkJQ0FSUF9MT0coIiVz OiBjYXJwX2lwbGJfc2VuZF9oZWxvOiBpcDZfb3V0cHV0IGZhaWxlZFxuIiwKKwkJCQkgU0My SUZQKHNjKS0+aWZfeG5hbWUpOworCX0KKyNlbmRpZiAvKiBJTkVUNiAqLworfQorCitzdGF0 aWMgaW50CitjYXJwX2lwbGJfZm9ydXMgKHN0cnVjdCBtYnVmICptX2luLCBzdHJ1Y3QgY2Fy cF9zb2Z0YyAqc2MpCit7CisJc3RydWN0IG1idWYgKm07CisJc3RydWN0IGV0aGVyX2hlYWRl ciAqZWg7CisJaW50IGhvc3RzLCBob3N0OworCWludCBtYXRjaCA9IChzYy0+c2Nfc3RhdGUg PT0gTUFTVEVSKTsKKwl1aW50MzJfdCBhZGRyOworCXN0cnVjdCB0Y3BoZHIgKnRjcDsKKwlz dHJ1Y3QgaW5fY29ubmluZm8gaW5jOworCXN0cnVjdCBzeW5jYWNoZV9oZWFkICpzY2g7Cisj aWZkZWYgSU5FVAorCXN0cnVjdCBpcCAqaXA7CisjZW5kaWYKKyNpZmRlZiBJTkVUNgorCXN0 cnVjdCBpcDZfaGRyICppcDY7CisjZW5kaWYKKworCWlmICghY2FycF9pcGxiX2VuYWJsZSkK KwkJcmV0dXJuIG1hdGNoOworCisJaWYgKG1faW4gPT0gTlVMTCkgeworCQlDQVJQX0xPRygi JXM6IGNhcnBfaXBsYl9mb3J1czogbV9pbiBpcyBudWxsXG4iLAorCQkJIFNDMklGUChzYykt PmlmX3huYW1lKTsKKwkJcmV0dXJuIG1hdGNoOworCX0KKworCWlmICgobSA9IG1fZHVwKG1f aW4sIE1fVFJZV0FJVCkpID09IE5VTEwpIHsKKwkJQ0FSUF9MT0coIiVzOiBjYXJwX2lwbGJf Zm9ydXM6IGR1cCBmYWlsZWRcbiIsCisJCQkgU0MySUZQKHNjKS0+aWZfeG5hbWUpOworCQly ZXR1cm4gbWF0Y2g7CisJfQorCisJaWYgKChtID0gbV9wdWxsdXAobSwgRVRIRVJfSERSX0xF TikpID09IE5VTEwpCisJCWdvdG8gUFVMTFVQX0ZBSUxFRDsKKworCWlmICgoZWggPSBtdG9k KG0sIHN0cnVjdCBldGhlcl9oZWFkZXIgKikpID09IE5VTEwpIHsKKwkJQ0FSUF9MT0coIiVz OiBjYXJwX2lwbGJfZm9ydXM6IG10b2QgZmFpbGVkXG4iLAorCQkJIFNDMklGUChzYyktPmlm X3huYW1lKTsKKwkJZ290byBSRVRVUk47CisJfQorCisJc3dpdGNoIChudG9ocyhlaC0+ZXRo ZXJfdHlwZSkpIHsKKyNpZmRlZiBJTkVUCisJICAgIGNhc2UgRVRIRVJUWVBFX0lQOgorCQlt ID0gbV9wdWxsdXAobSwgRVRIRVJfSERSX0xFTiArIHNpemVvZihzdHJ1Y3QgaXApKTsKKwkJ aWYgKG0gPT0gTlVMTCkKKwkJCWdvdG8gUFVMTFVQX0ZBSUxFRDsKKwkJaXAgPSAoc3RydWN0 IGlwICopKGVoICsgMSk7CisJCWFkZHIgPSBudG9obChpcC0+aXBfc3JjLnNfYWRkcik7CisJ CWhvc3RzID0gc2MtPnNjX2hvc3RzOworCQlob3N0ID0gc2MtPnNjX2hvc3Q7CisJCWlmIChp cC0+aXBfcCAhPSBJUFBST1RPX1RDUCkKKwkJCWJyZWFrOworCQltID0gbV9wdWxsdXAobSwg RVRIRVJfSERSX0xFTiArIChpcC0+aXBfaGwgPDwgMikgKyBzaXplb2Yoc3RydWN0IHRjcGhk cikpOworCQlpZiAobSA9PSBOVUxMKQorCQkJZ290byBQVUxMVVBfRkFJTEVEOworCisJCXRj cCA9IChzdHJ1Y3QgdGNwaGRyICopKChpbnQ4X3QqKSBpcCArIChpcC0+aXBfaGwgPDwgMikp OworCQlpZiAoKHRjcC0+dGhfZmxhZ3MgJiAoVEhfU1lOfFRIX0FDSykpID09IFRIX1NZTikK KwkJCWJyZWFrOworCisJCWluYy5pbmNfaXNpcHY2ID0gMDsKKwkJaW5jLmluY19mcG9ydCA9 IHRjcC0+dGhfc3BvcnQ7CisJCWluYy5pbmNfbHBvcnQgPSB0Y3AtPnRoX2Rwb3J0OworCQlp bmMuaW5jX2ZhZGRyID0gaXAtPmlwX3NyYzsKKwkJaW5jLmluY19sYWRkciA9IGlwLT5pcF9k c3Q7CisJCW1hdGNoID0gKHN5bmNhY2hlX2xvb2t1cCgmaW5jLCAmc2NoKSAhPSBOVUxMKSB8 fAorCQkJKGluX3BjYmxvb2t1cF9oYXNoKCZ0Y2JpbmZvLAorCQkJCQkgICBpcC0+aXBfc3Jj LCB0Y3AtPnRoX3Nwb3J0LAorCQkJCQkgICBpcC0+aXBfZHN0LCB0Y3AtPnRoX2Rwb3J0LAor CQkJCQkgICAwLCBtLT5tX3BrdGhkci5yY3ZpZikpOworCQlnb3RvIFJFVFVSTjsKKyNlbmRp ZgorI2lmZGVmIElORVQ2CisJICAgIGNhc2UgRVRIRVJUWVBFX0lQVjY6CisJCW0gPSBtX3B1 bGx1cChtLCBFVEhFUl9IRFJfTEVOICsgc2l6ZW9mKHN0cnVjdCBpcDZfaGRyKSk7CisJCWlm IChtID09IE5VTEwpCisJCQlnb3RvIFBVTExVUF9GQUlMRUQ7CisJCWlwNiA9IChzdHJ1Y3Qg aXA2X2hkciAqKShlaCArIDEpOworCQlhZGRyID0gbnRvaGwoaXA2LT5pcDZfc3JjLnM2X2Fk ZHIzMlszXSk7CisJCWhvc3RzID0gc2MtPnNjX2hvc3RzNjsKKwkJaG9zdCA9IHNjLT5zY19o b3N0NjsKKwkJaWYgKGlwNi0+aXA2X254dCAhPSBJUFBST1RPX1RDUCkKKwkJCWJyZWFrOwor CQltID0gbV9wdWxsdXAobSwgRVRIRVJfSERSX0xFTiArIHNpemVvZihzdHJ1Y3QgaXA2X2hk cikgKworCQkJICAgICBzaXplb2Yoc3RydWN0IHRjcGhkcikpOworCQlpZiAobSA9PSBOVUxM KQorCQkJZ290byBQVUxMVVBfRkFJTEVEOworCisJCXRjcCA9IChzdHJ1Y3QgdGNwaGRyICop KChpbnQ4X3QqKSBpcDYgKyBzaXplb2Yoc3RydWN0IGlwNl9oZHIpKTsKKwkJaWYgKCh0Y3At PnRoX2ZsYWdzICYgKFRIX1NZTnxUSF9BQ0spKSA9PSBUSF9TWU4pCisJCQlicmVhazsKKwor CQlpbmMuaW5jX2lzaXB2NiA9IDE7CisJCWluYy5pbmNfZnBvcnQgPSB0Y3AtPnRoX3Nwb3J0 OworCQlpbmMuaW5jX2xwb3J0ID0gdGNwLT50aF9kcG9ydDsKKwkJaW5jLmluYzZfZmFkZHIg PSBpcDYtPmlwNl9zcmM7CisJCWluYy5pbmM2X2xhZGRyID0gaXA2LT5pcDZfZHN0OworCQlt YXRjaCA9IChzeW5jYWNoZV9sb29rdXAoJmluYywgJnNjaCkgIT0gTlVMTCkgfHwKKwkJCShp bjZfcGNibG9va3VwX2hhc2goJnRjYmluZm8sCisJCQkJCSAgICAmaXA2LT5pcDZfc3JjLCB0 Y3AtPnRoX3Nwb3J0LAorCQkJCQkgICAgJmlwNi0+aXA2X2RzdCwgdGNwLT50aF9kcG9ydCwK KwkJCQkJICAgIDAsIG0tPm1fcGt0aGRyLnJjdmlmKSk7CisJCWdvdG8gUkVUVVJOOworI2Vu ZGlmCisJICAgIGRlZmF1bHQ6CisJCWdvdG8gUkVUVVJOOworCX0KKworCWlmICgoaG9zdHMg PD0gMCkgfHwKKwkgICAgKGhvc3QgPCAwKSB8fAorCSAgICAoaG9zdCA+PSBob3N0cykpCisJ CWdvdG8gUkVUVVJOOworCisJaWYgKChjYXJwX2lwbGJfbWFzayA8IDApIHx8IChjYXJwX2lw bGJfbWFzayA+IDMyKSkgeworCQlDQVJQX0xPRygiJXM6IGFkanVzdGluZyBpcF9iYWxhbmNl X21hc2sgJWkgLT4gMzJcbiIsCisJCQkgU0MySUZQKHNjKS0+aWZfeG5hbWUsIGNhcnBfaXBs Yl9tYXNrKTsKKwkJY2FycF9pcGxiX21hc2sgPSAzMjsKKwl9CisKKwlhZGRyID4+PSAzMiAt IGNhcnBfaXBsYl9tYXNrOworCWFkZHIgJT0gaG9zdHM7CisJbWF0Y2ggPSAoYWRkciA9PSBo b3N0KTsKKworCWdvdG8gUkVUVVJOOworCitQVUxMVVBfRkFJTEVEOgorCUNBUlBfTE9HKCIl czogY2FycF9pcGxiX2ZvcnVzOiBwdWxsdXAgZmFpbGVkXG4iLCBTQzJJRlAoc2MpLT5pZl94 bmFtZSk7CitSRVRVUk46CisJbV9mcmVlbShtKTsKKwlyZXR1cm4gbWF0Y2g7Cit9CisKK3N0 YXRpYyB2b2lkCitjYXJwX2lwbGJfY2xlYW51cDIoc3RydWN0IGNhcnBfc29mdGMgKnNjLCBz dHJ1Y3QgY2FycF9wZWVyX2xpc3QgKnBlZXJzLAorCQkgICB2b2lkICphZGRyZXNzLCBpbnQg KnNjX2hvc3RzLCBpbnQgKnNjX2hvc3QsCisJCSAgIGludCBpYV9sZW4sIGludCBpcF92ZXIs IHN0cnVjdCBtdHggKm11dGV4KQoreworCXN0cnVjdCBjYXJwX3BlZXIgKmNwLCAqY3BfdGVt cDsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlpbnQgaG9zdHMgPSAwLCBob3N0ID0gLTE7CisK KwlnZXRtaWNyb3RpbWUoJnR2KTsKKworCW10eF9sb2NrKG11dGV4KTsKKwlUQUlMUV9GT1JF QUNIX1NBRkUoY3AsIHBlZXJzLCBjcF9saXN0LCBjcF90ZW1wKSB7CisJCWlmIChjcC0+Y3Bf dHYudHZfc2VjICsgc2MtPnNjX2FkdmJhc2UgKiAzIDwgdHYudHZfc2VjKSB7CisJCQljYXJw X2lwbGJfbG9ncGVlcihzYywgY3AsICJ2YW5pc2hlZCBwZWVyIik7CisJCQlUQUlMUV9SRU1P VkUocGVlcnMsIGNwLCBjcF9saXN0KTsKKwkJfQorCQllbHNlIHsKKwkJCWlmICghYmNtcChh ZGRyZXNzLCBjcC0+Y3Bfc2Euc2FfZGF0YSwgaWFfbGVuKSkKKwkJCQlob3N0ID0gaG9zdHM7 CisJCQkrK2hvc3RzOworCQl9CisJfQorCWlmIChob3N0cyAhPSAqc2NfaG9zdHMpIHsKKwkJ Q0FSUF9MT0coIiVzOiBJUHYlaSBob3N0cyAlaSAtPiAlaVxuIiwKKwkJCSAgIFNDMklGUChz YyktPmlmX3huYW1lLCBpcF92ZXIsICpzY19ob3N0cywgaG9zdHMpOworCQkqc2NfaG9zdHMg PSBob3N0czsKKwl9CisJaWYgKGhvc3QgIT0gKnNjX2hvc3QpIHsKKwkJQ0FSUF9MT0coIiVz OiBJUHYlaSBob3N0ICVpIC0+ICVpXG4iLAorCQkJICAgU0MySUZQKHNjKS0+aWZfeG5hbWUs IGlwX3ZlciwgKnNjX2hvc3QsIGhvc3QpOworCQkgKnNjX2hvc3QgPSBob3N0OworCX0KKwlt dHhfdW5sb2NrKG11dGV4KTsKK30KKworc3RhdGljIHZvaWQKK2NhcnBfaXBsYl9jbGVhbnVw KHZvaWQgKnYpCit7CisJc3RydWN0IGNhcnBfc29mdGMgKnNjID0gKHN0cnVjdCBjYXJwX3Nv ZnRjKikgdjsKKwl2b2lkICphZGRyZXNzOworCXN0cnVjdCB0aW1ldmFsIHR2OworCisjaWZk ZWYgSU5FVAorCWlmIChzYy0+c2NfaWEpIHsKKwkJYWRkcmVzcyA9ICZzYy0+c2NfaWEtPmlh X2FkZHIuc2luX2FkZHI7CisJCWNhcnBfaXBsYl9hZGRwZWVyKHNjLCBBRl9JTkVULCBhZGRy ZXNzKTsKKwkJY2FycF9pcGxiX2NsZWFudXAyKHNjLCAmc2MtPnNjX3BlZXJzLCBhZGRyZXNz LCAmc2MtPnNjX2hvc3RzLAorCQkJCSAgICZzYy0+c2NfaG9zdCwgNCwgNCwgJnNjLT5zY19w ZWVyc19tdHgpOworCX0KKyNlbmRpZgorI2lmZGVmIElORVQ2CisJaWYgKHNjLT5zY19pYTYp IHsKKwkJYWRkcmVzcyA9ICZzYy0+c2NfaWE2LT5pYV9hZGRyLnNpbjZfYWRkcjsKKwkJY2Fy cF9pcGxiX2FkZHBlZXIoc2MsIEFGX0lORVQ2LCBhZGRyZXNzKTsKKwkJY2FycF9pcGxiX2Ns ZWFudXAyKHNjLCAmc2MtPnNjX3BlZXJzNiwgYWRkcmVzcywgJnNjLT5zY19ob3N0czYsCisJ CQkJICAgJnNjLT5zY19ob3N0NiwgNiwgMTYsICZzYy0+c2NfcGVlcnM2X210eCk7CisJfQor I2VuZGlmCisKKwl0di50dl9zZWMgPSBzYy0+c2NfYWR2YmFzZTsKKwl0di50dl91c2VjID0g MDsKKwljYWxsb3V0X3Jlc2V0KCZzYy0+c2NfcGVlcnNfdG1vLCB0dnRvaHooJnR2KSwgY2Fy cF9pcGxiX2NsZWFudXAsIHNjKTsKK30KKy8qIGlwbGIgKi8KKwogLyoKICAqIHByb2Nlc3Mg aW5wdXQgcGFja2V0LgogICogd2UgaGF2ZSByZWFycmFuZ2VkIGNoZWNrcyBvcmRlciBjb21w YXJlZCB0byB0aGUgcmZjLApAQCAtNjg5LDYgKzEyMjUsMzQgQEAKIAkJcmV0dXJuOwogCX0K IAorCS8qIGlwbGI6IGNoZWNrIGhlbG8gKi8KKwlpZiAoY2gtPmNhcnBfdHlwZSA9PSBDQVJQ X0hFTE8pIHsKKwkJdm9pZCAqdjsKKwkJc3dpdGNoIChhZikgeworI2lmZGVmIElORVQ2CisJ CSAgICBjYXNlIEFGX0lORVQ2OgorCQkJdiA9IG10b2QobSwgc3RydWN0IGlwNl9oZHIgKik7 CisJCQljYXJwX2lwbGJfYWRkcGVlcihzYywgYWYsCisJCQkJCSAgJigoc3RydWN0IGlwNl9o ZHIqKSB2KS0+aXA2X3NyYyk7CisJCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIElORVQKKwkJ ICAgIGNhc2UgQUZfSU5FVDoKKwkJCXYgPSBtdG9kKG0sIHN0cnVjdCBpcCAqKTsKKwkJCWNh cnBfaXBsYl9hZGRwZWVyKHNjLCBhZiwgJigoc3RydWN0IGlwKikgdiktPmlwX3NyYyk7CisJ CQlicmVhazsKKyNlbmRpZgorCQkgICAgZGVmYXVsdDoKKwkJCUNBUlBfTE9HKCIlcywgY2Fy cF9pbnB1dF9jOiB1bmtub3duIGFkZHJlc3MgZmFtaWx5ICVpXG4iLAorCQkJCSBTQzJJRlAo c2MpLT5pZl94bmFtZSwgYWYpOworCQkJYnJlYWs7CisJCX0KKworCQlDQVJQX1VOTE9DSyhp ZnAtPmlmX2NhcnApOworCQltX2ZyZWVtKG0pOworCQlyZXR1cm47CisJfQorCiAJdG1wX2Nv dW50ZXIgPSBudG9obChjaC0+Y2FycF9jb3VudGVyWzBdKTsKIAl0bXBfY291bnRlciA9IHRt cF9jb3VudGVyPDwzMjsKIAl0bXBfY291bnRlciArPSBudG9obChjaC0+Y2FycF9jb3VudGVy WzFdKTsKQEAgLTgzOSw2ICsxNDAzLDggQEAKIAogCUNBUlBfU0NMT0NLX0FTU0VSVChzYyk7 CiAKKwljYXJwX2lwbGJfc2VuZF9oZWxvKHNjKTsKKwogCS8qIGJvdyBvdXQgaWYgd2UndmUg bG9zdCBvdXIgVVBuZXNzIG9yIFJVTk5JTkd1aW5lc3MgKi8KIAlpZiAoISgoU0MySUZQKHNj KS0+aWZfZmxhZ3MgJiBJRkZfVVApICYmCiAJICAgIChTQzJJRlAoc2MpLT5pZl9kcnZfZmxh Z3MgJiBJRkZfRFJWX1JVTk5JTkcpKSkgewpAQCAtMTIyNCw3ICsxNzkwLDcgQEAKICNlbmRp ZgogCiBzdHJ1Y3QgaWZuZXQgKgotY2FycF9mb3J1cyh2b2lkICp2LCB2b2lkICpkaG9zdCkK K2NhcnBfZm9ydXModm9pZCAqdiwgdm9pZCAqZGhvc3QsIHN0cnVjdCBtYnVmICptKQogewog CXN0cnVjdCBjYXJwX2lmICpjaWYgPSB2OwogCXN0cnVjdCBjYXJwX3NvZnRjICp2aDsKQEAg LTEyMzcsNyArMTgwMyw4IEBACiAJVEFJTFFfRk9SRUFDSCh2aCwgJmNpZi0+dmhpZl92cnMs IHNjX2xpc3QpCiAJCWlmICgoU0MySUZQKHZoKS0+aWZfZmxhZ3MgJiBJRkZfVVApICYmCiAJ CSAgICAoU0MySUZQKHZoKS0+aWZfZHJ2X2ZsYWdzICYgSUZGX0RSVl9SVU5OSU5HKSAmJgot CQkgICAgdmgtPnNjX3N0YXRlID09IE1BU1RFUiAmJgorCQkgICAgLy8gKHZoLT5zY19zdGF0 ZSA9PSBNQVNURVIpICYmCisJCSAgICBjYXJwX2lwbGJfZm9ydXMobSwgdmgpICYmCiAJCSAg ICAhYmNtcChkaG9zdCwgSUZQMkVOQUREUih2aC0+c2NfaWZwKSwgRVRIRVJfQUREUl9MRU4p KSB7CiAJCSAgICAJQ0FSUF9VTkxPQ0soY2lmKTsKIAkJCXJldHVybiAoU0MySUZQKHZoKSk7 CkBAIC0xMzUzLDYgKzE5MjAsOSBAQAogCQkJCSAgICBjYXJwX21hc3Rlcl9kb3duLCBzYyk7 CiAJCQlicmVhazsKIAkJfQorCisJCWNhcnBfaXBsYl9zZW5kX2hlbG8oc2MpOworCiAJCWJy ZWFrOwogCWNhc2UgTUFTVEVSOgogCQl0di50dl9zZWMgPSBzYy0+c2NfYWR2YmFzZTsKZGlm ZiAtZHJ1IHN5czAvbmV0aW5ldC9pcF9jYXJwLmggc3lzL25ldGluZXQvaXBfY2FycC5oCi0t LSBzeXMwL25ldGluZXQvaXBfY2FycC5oCTIwMDYtMDgtMTAgMTA6MTA6MTIuMDAwMDAwMDAw ICswMDAwCisrKyBzeXMvbmV0aW5ldC9pcF9jYXJwLmgJMjAwOC0wMS0yMyAyMzoyODowMi4w MDAwMDAwMDAgKzAwMDAKQEAgLTE1Nyw2ICsxNTcsNiBAQAogCQkgICAgIHVfaW50OF90ICoq KTsKIHN0cnVjdCBpZmFkZHIJKmNhcnBfaWFtYXRjaDYodm9pZCAqLCBzdHJ1Y3QgaW42X2Fk ZHIgKik7CiB2b2lkCQkqY2FycF9tYWNtYXRjaDYodm9pZCAqLCBzdHJ1Y3QgbWJ1ZiAqLCBj b25zdCBzdHJ1Y3QgaW42X2FkZHIgKik7Ci1zdHJ1Y3QJaWZuZXQJKmNhcnBfZm9ydXMgKHZv aWQgKiwgdm9pZCAqKTsKK3N0cnVjdAlpZm5ldAkqY2FycF9mb3J1cyAodm9pZCAqLCB2b2lk ICosIHN0cnVjdCBtYnVmICopOwogI2VuZGlmCiAjZW5kaWYgLyogX0lQX0NBUlBfSCAqLwo= --B_3284046509_3507725--