Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 24 Jan 2008 19:08:25 +0100
From:      "Felix J. Ogris" <fjo-lists@ogris.de>
To:        <freebsd-net@freebsd.org>
Subject:   carp(4) ip loadbalancing (patch included)
Message-ID:  <C3BE92AA.BF4E1%fjo-lists@ogris.de>

next in thread | raw e-mail | index | archive | help
> 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--





Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?C3BE92AA.BF4E1%fjo-lists>