[PATCH] 2.2.10: 2-dir masquerading for single-interface port forwarding

Rolf Braun (masq@ns1.helixsystems.com)
Tue, 29 Jun 1999 12:52:01 -0400 (EDT)


This message is in MIME format. The first part should be readable text,
while the remaining parts are likely unreadable without MIME-aware tools.
Send mail to mime@docserver.cac.washington.edu for more info.

--215503375-172410501-930675121=:30216
Content-Type: TEXT/PLAIN; charset=US-ASCII

This patch adds a 2-dir (bidirectional) masquerading feature to the kernel
so that connections can be set up directly through the kernel in which
neither side sees the real IP of the other side. The intention of this
patch is to provide a way to cleanly forward connections over a single
interface using the accompanying masq_mbfw module, which is mfw modified
to use the new code.

This code can be extremely useful in situations where an internal network
must access a port-forwarded server on the same network using the same IP
as the external network, which for us keeps things uniform for testing
purposes and avoids nasty DNS hacks. The 'redir' program can be used to do
the same thing in userland, but it is more difficult to set up (inetd
does not support port ranges, for one thing) than mfw/mbfw, and it may be
technically slower.

The mbfw module is NOT intended for use from the external network in such
circumstances, because that, like redir, defeats the purpose of IP logging
on the server to which the connection is redirected. In addition, it is
strongly recommended that users turn on logging of SYN packets for any
forwarded connection. (-y -l)

In our extensive testing, the addition of this patch does _NOT_ affect the
operation of the kernel or the masquerading code in any other way. The new
code is not invoked unless a forwarding module that uses it is invoked.

There is no portbfw (like mbfw) because we consider portfw to be obsolete,
and it does not support port ranges like mfw (through ipchains marking),
so it is more difficult to set up in such situations than mfw.

The following files are modified:
net/ipv4/ip_masq.c for the core support
net/ipv4/ip_masq_mbfw.c [new file]
include/net/ip_masq.h for additions to the structure
include/linux/ip_masq.h for userland support
net/ipv4/ip_input.c workaround for routing code thinking
modified packets are spoofed (doesn't
affect anything else)

In addition, an mbfw.c module for ipmasqadm is included. Because there is
now a new "local port" field in the masq entries list, a new version of
ipchains is really needed, and I will send patches for that along shortly.

This patch is provided courtesy of Helix Computer Systems
<http://www.helixsystems.com>, which does *NOT* claim copyright to it.
This code is donated to the appropriate kernel maintainers with the
request (but not requirement) that the blatant plugs in the headers be
left intact. :-) If there are any legal questions, we would be
happy to provide a formal copyright transfer. E-mail
rmann@helixsystems.com with any legal questions please - I'm just the
Linux hacker.

I would like to hear comments from users and kernel maintainers about
this patch. I will be happy to assist in integration of this patch into
the main kernel (with any necessary modifications), which will make our
job as IT company easier when we have
to use this stuff (kernels out of the box are easier to install than ones
with custom patches). We'd prefer that it be placed into the 2.2.x series;
I personally consider it quite stable and not likely at all to cause any
problems. IMHO it's not experimental enough for 2.3.x, and we don't run
2.3.x here since it's too unstable for production use.

Thanks for your time...

- Rolf Braun

BTW: please cc any important replies to rbraun@helixsystems.com - the masq
account
is mainly there to receive and quickly process high volume mailing list
traffic

--215503375-172410501-930675121=:30216
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="mbfw.patch"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.4.10.9906291252010.30216@ns1.helixsystems.com>
Content-Description:
Content-Disposition: attachment; filename="mbfw.patch"

ZGlmZiAtYXVyIGxpbnV4L2luY2x1ZGUvbGludXgvaXBfbWFzcS5oIGxpbnV4
LTIuMi4xMGhlbGl4MS9pbmNsdWRlL2xpbnV4L2lwX21hc3EuaA0KLS0tIGxp
bnV4L2luY2x1ZGUvbGludXgvaXBfbWFzcS5oCU1vbiBKYW4gIDQgMTg6MzE6
MzUgMTk5OQ0KKysrIGxpbnV4LTIuMi4xMGhlbGl4MS9pbmNsdWRlL2xpbnV4
L2lwX21hc3EuaAlNb24gSnVuIDIxIDEyOjQzOjAwIDE5OTkNCkBAIC0xMDEs
NiArMTAxLDE2IEBADQogCXVuc2lnbmVkIAlmbGFnczsJCS8qIG1pc2MgZmxh
Z3MgKi8NCiB9Ow0KIA0KK3N0cnVjdCBpcF9tYmZ3X3VzZXIgew0KKyAgICAg
ICAgdV9pbnQzMl90ICAgICAgICAgICBmd21hcms7ICAgICAvKiBGaXJld2Fs
bGluZyBtYXJrICovDQorICAgICAgICB1X2ludDMyX3QgICAgICAgICAgIHJh
ZGRyOyAgICAgIC8qIHJlbW90ZSBwb3J0ICovDQorICAgICAgICB1X2ludDE2
X3QgICAgICAgICAgIHJwb3J0OyAgICAgIC8qIHJlbW90ZSBwb3J0ICovDQor
ICAgICAgICB1X2ludDE2X3QgICAgICAgICAgIGR1bW15OyAgICAgICAgICAv
KiBNYWtlIHVwIHRvIG11bHRpcGxlIG9mIDQgKi8NCisJdV9pbnQzMl90ICAg
ICAgICAgICBsbWFkZHI7ICAgICAvKiBsb2NhbCBtYXNxIGFkZHIgKHRlbXBv
cmFyeSBtZWFzdXJlKSAqLw0KKyAgICAgICAgaW50ICAgICAgICAgICAgIHBy
ZWY7ICAgICAgICAgICAvKiBQcmVmZXJlbmNlIHZhbHVlICovDQorICAgICAg
ICB1bnNpZ25lZCAgICAgICAgZmxhZ3M7ICAgICAgICAgIC8qIG1pc2MgZmxh
Z3MgKi8NCit9Ow0KKw0KICNkZWZpbmUgSVBfTUFTUV9NRldfU0NIRUQJMHgw
MQ0KIA0KICNkZWZpbmUgSVBfRldfTUFTUUNUTF9NQVggMjU2DQpAQCAtMTE0
LDYgKzEyNCw3IEBADQogCQlzdHJ1Y3QgaXBfcG9ydGZ3X3VzZXIgcG9ydGZ3
X3VzZXI7DQogCQlzdHJ1Y3QgaXBfYXV0b2Z3X3VzZXIgYXV0b2Z3X3VzZXI7
DQogCQlzdHJ1Y3QgaXBfbWZ3X3VzZXIgbWZ3X3VzZXI7DQorCQlzdHJ1Y3Qg
aXBfbWJmd191c2VyIG1iZndfdXNlcjsNCiAJCXN0cnVjdCBpcF9tYXNxX3Vz
ZXIgdXNlcjsNCiAJCXVuc2lnbmVkIGNoYXIgbV9yYXdbSVBfRldfTUFTUUNU
TF9NQVhdOw0KIAl9IHU7DQpkaWZmIC1hdXIgbGludXgvaW5jbHVkZS9uZXQv
aXBfbWFzcS5oIGxpbnV4LTIuMi4xMGhlbGl4MS9pbmNsdWRlL25ldC9pcF9t
YXNxLmgNCi0tLSBsaW51eC9pbmNsdWRlL25ldC9pcF9tYXNxLmgJVHVlIE1h
eSAxMSAxMzozNjo0OSAxOTk5DQorKysgbGludXgtMi4yLjEwaGVsaXgxL2lu
Y2x1ZGUvbmV0L2lwX21hc3EuaAlNb24gSnVuIDIxIDEzOjA4OjQyIDE5OTkN
CkBAIC01Nyw2ICs2MSw3IEBADQogDQogI2RlZmluZSBJUF9NQVNRX0ZfTVBP
UlQJCSAgICAgIDB4MTAwMCAJLyogb3duIG1wb3J0IHNwZWNpZmllZCAqLw0K
ICNkZWZpbmUgSVBfTUFTUV9GX1VTRVIJCSAgICAgIDB4MjAwMAkvKiBmcm9t
IHVzcGFjZSAqLw0KKyNkZWZpbmUgSVBfTUFTUV9GX0JJRElSCQkgICAgICAw
eDQwMDAgICAgLyogbWFzcXVlcmFkZSBpbiBCT1RIIGRpcmVjdGlvbnMgKi8N
CiANCiAvKg0KICAqCURlbHRhIHNlcS4gaW5mbyBzdHJ1Y3R1cmUNCkBAIC03
Nyw4ICs4MiwxMiBAQA0KIAlhdG9taWNfdCByZWZjbnQ7CQkvKiByZWZlcmVu
Y2UgY291bnQgKi8NCiAJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CS8qIEV4
cGlyYXRpb24gdGltZXIgKi8NCiAJX191MTYgCQlwcm90b2NvbDsJLyogV2hp
Y2ggcHJvdG9jb2wgYXJlIHdlIHRhbGtpbmc/ICovDQotCV9fdTE2CQlzcG9y
dCwgZHBvcnQsIG1wb3J0OwkvKiBzcmMsIGRzdCAmIG1hc3EgcG9ydHMgKi8N
Ci0JX191MzIgCQlzYWRkciwgZGFkZHIsIG1hZGRyOwkvKiBzcmMsIGRzdCAm
IG1hc3EgYWRkcmVzc2VzICovDQorLyogUkFCIDIuMi41IDEzMDY5OSAtIHRo
aXMgbG1wb3J0L2xtYWRkciBzdHVmZiBpcyB0aGUgbWFzcSBzZXJ2ZXIgcG9y
dCBhbmQgYWRkcmVzcw0KKyAgIHBlcmNlaXZlZCBieSB0aGUgbG9jYWwvJ3Nv
dXJjZScgYm94IGZvciB0aGUgY29ubmVjdGlvbiBmb3IgYmlkaXJlY3Rpb25h
bGx5DQorICAgbWFzcXVlcmFkZWQgY29ubmVjdGlvbnMgKHdoaWNoIHNob3Vs
ZCB1c3VhbGx5IGJlIGxvY2FsLCBzaW5jZSBpdCBkb2VzIGRlZmVhdCB0aGUN
CisgICBwdXJwb3NlIG9mIHNlcnZlciBsb2dzKS4gVGhpcyBpcyBmb3IgdGhl
IG5ldyBwb3J0IGZvcndhcmRpbmcgbW9kdWxlcy4uLiAqLw0KKwlfX3UxNgkJ
c3BvcnQsIGRwb3J0LCBtcG9ydCwgbG1wb3J0OwkvKiBzcmMsIGRzdCAmIG1h
c3EgcG9ydHMgKi8NCisJX191MzIgCQlzYWRkciwgZGFkZHIsIG1hZGRyLCBs
bWFkZHI7CS8qIHNyYywgZHN0ICYgbWFzcSBhZGRyZXNzZXMgKi8NCiAgICAg
ICAgIHN0cnVjdCBpcF9tYXNxX3NlcSBvdXRfc2VxLCBpbl9zZXE7DQogCXN0
cnVjdCBpcF9tYXNxX2FwcCAqYXBwOwkvKiBib3VuZCBpcF9tYXNxX2FwcCBv
YmplY3QgKi8NCiAJdm9pZAkJKmFwcF9kYXRhOwkvKiBBcHBsaWNhdGlvbiBw
cml2YXRlIGRhdGEgKi8NCkBAIC0xMjUsNiArMTM0LDcgQEANCiAgKglmdW5j
dGlvbnMgY2FsbGVkIGZyb20gaXAgbGF5ZXINCiAgKi8NCiBleHRlcm4gaW50
IGlwX2Z3X21hc3F1ZXJhZGUoc3RydWN0IHNrX2J1ZmYgKiosIF9fdTMyIG1h
ZGRyKTsNCitleHRlcm4gaW50IGlwX2Z3X21hc3F1ZXJhZGUyKHN0cnVjdCBz
a19idWZmICoqLCBfX3UzMiBtYWRkciwgc3RydWN0IGlwX21hc3EgKm1zdCk7
DQogZXh0ZXJuIGludCBpcF9md19tYXNxX2ljbXAoc3RydWN0IHNrX2J1ZmYg
KiosIF9fdTMyIG1hZGRyKTsNCiBleHRlcm4gaW50IGlwX2Z3X3VubWFzcV9p
Y21wKHN0cnVjdCBza19idWZmICopOw0KIGV4dGVybiBpbnQgaXBfZndfZGVt
YXNxdWVyYWRlKHN0cnVjdCBza19idWZmICoqKTsNCkBAIC0xMzQsNiArMTQ0
LDkgQEANCiAgKi8NCiBleHRlcm4gc3RydWN0IGlwX21hc3EgKmlwX21hc3Ff
bmV3KGludCBwcm90bywgX191MzIgbWFkZHIsIF9fdTE2IG1wb3J0LCBfX3Uz
MiBzYWRkciwgX191MTYgc3BvcnQsIF9fdTMyIGRhZGRyLCBfX3UxNiBkcG9y
dCwgdW5zaWduZWQgZmxhZ3MpOw0KIA0KKy8qIFJBQiAyLjIuNSAxNDA2OTkg
LSBuZXcgMi1kaXIgbWFzcSBjb2RlIG5lZWRzIGEgbmV3IG1hc3EgZnVuY3Rp
b24gKi8NCitleHRlcm4gc3RydWN0IGlwX21hc3EgKmlwX21hc3FfbmV3Mihp
bnQgcHJvdG8sIF9fdTMyIG1hZGRyLCBfX3UxNiBtcG9ydCwgX191MzIgc2Fk
ZHIsIF9fdTE2IHNwb3J0LCBfX3UzMiBkYWRkciwgX191MTYgZHBvcnQsIHVu
c2lnbmVkIGZsYWdzLCBfX3UzMiBsbWFkZHIpOw0KKw0KIGV4dGVybiB2b2lk
IGlwX21hc3FfY29udHJvbF9hZGQoc3RydWN0IGlwX21hc3EgKm1zLCBzdHJ1
Y3QgaXBfbWFzcSogY3RsX21zKTsNCiBleHRlcm4gdm9pZCBpcF9tYXNxX2Nv
bnRyb2xfZGVsKHN0cnVjdCBpcF9tYXNxICptcyk7DQogZXh0ZXJuIHN0cnVj
dCBpcF9tYXNxICogaXBfbWFzcV9jb250cm9sX2dldChzdHJ1Y3QgaXBfbWFz
cSAqbXMpOw0KQEAgLTIwNyw2ICsyMjAsNyBAQA0KIA0KIGV4dGVybiBzdHJ1
Y3QgaXBfbWFzcSAqIGlwX21hc3Ffb3V0X2dldChpbnQgcHJvdG9jb2wsIF9f
dTMyIHNfYWRkciwgX191MTYgc19wb3J0LCBfX3UzMiBkX2FkZHIsIF9fdTE2
IGRfcG9ydCk7DQogZXh0ZXJuIHN0cnVjdCBpcF9tYXNxICogaXBfbWFzcV9p
bl9nZXQoaW50IHByb3RvY29sLCBfX3UzMiBzX2FkZHIsIF9fdTE2IHNfcG9y
dCwgX191MzIgZF9hZGRyLCBfX3UxNiBkX3BvcnQpOw0KK2V4dGVybiBzdHJ1
Y3QgaXBfbWFzcSAqIGlwX21hc3FfbG1fZ2V0KGludCBwcm90b2NvbCwgX191
MzIgc19hZGRyLCBfX3UxNiBzX3BvcnQsIF9fdTMyIGRfYWRkciwgX191MTYg
ZF9wb3J0KTsNCiANCiBleHRlcm4gaW50IGlwX21hc3FfbGlzdGVuKHN0cnVj
dCBpcF9tYXNxICopOw0KIA0KQEAgLTIyNiw2ICsyNDAsMTQgQEANCiAJCQkJ
aXBoLT5kYWRkciwgcG9ydHBbMV0pOw0KIH0NCiANCitzdGF0aWMgX19pbmxp
bmVfXyBzdHJ1Y3QgaXBfbWFzcSAqIGlwX21hc3FfbG1fZ2V0X2lwaChjb25z
dCBzdHJ1Y3QgaXBoZHIgKmlwaCkNCit7DQorCWNvbnN0IF9fdTE2ICpwb3J0
cCA9IChfX3UxNiAqKSYoKChjaGFyICopaXBoKVtpcGgtPmlobCo0XSk7DQor
ICAgICAgICByZXR1cm4gaXBfbWFzcV9sbV9nZXQoaXBoLT5wcm90b2NvbCwg
DQorCQkJCWlwaC0+c2FkZHIsIHBvcnRwWzBdLCANCisJCQkJaXBoLT5kYWRk
ciwgcG9ydHBbMV0pOw0KK30NCisNCiBleHRlcm4gdm9pZCBpcF9tYXNxX3B1
dChzdHJ1Y3QgaXBfbWFzcSAqbXMpOw0KIA0KIA0KQEAgLTI1OSw3ICsyODEs
NyBAQA0KICNpZmRlZiBDT05GSUdfSVBfTUFTUV9ERUJVRw0KICNkZWZpbmUg
SVBfTUFTUV9ERUJVRyhsZXZlbCwgbXNnLi4uKSBkbyB7IFwNCiAJaWYgKGxl
dmVsIDw9IGlwX21hc3FfZ2V0X2RlYnVnX2xldmVsKCkpIFwNCi0JCXByaW50
ayhLRVJOX0RFQlVHICJJUF9NQVNROiIgIyMgbXNnKTsgXA0KKwkJcHJpbnRr
KEtFUk5fRVJSICJJUF9NQVNROiIgIyMgbXNnKTsgXA0KIAl9IHdoaWxlICgw
KQ0KICNlbHNlCS8qIE5PIERFQlVHR0lORyBhdCBBTEwgKi8NCiAjZGVmaW5l
IElQX01BU1FfREVCVUcobGV2ZWwsIG1zZy4uLikgZG8geyB9IHdoaWxlICgw
KQ0KZGlmZiAtYXVyIGxpbnV4L25ldC9pcHY0L0NvbmZpZy5pbiBsaW51eC0y
LjIuMTBoZWxpeDEvbmV0L2lwdjQvQ29uZmlnLmluDQotLS0gbGludXgvbmV0
L2lwdjQvQ29uZmlnLmluCVN1biBNYXIgMjEgMTA6MjI6MDAgMTk5OQ0KKysr
IGxpbnV4LTIuMi4xMGhlbGl4MS9uZXQvaXB2NC9Db25maWcuaW4JTW9uIEp1
biAyMSAxMjo0MzowMCAxOTk5DQpAQCAtNDksNiArNDksNyBAQA0KICAgICAg
ICAgYm9vbCAnSVA6IG1hc3F1ZXJhZGluZyBzcGVjaWFsIG1vZHVsZXMgc3Vw
cG9ydCcgQ09ORklHX0lQX01BU1FVRVJBREVfTU9EIA0KICAgICAgICAgaWYg
WyAiJENPTkZJR19JUF9NQVNRVUVSQURFX01PRCIgPSAieSIgXTsgdGhlbg0K
ICAgICAgICAgICB0cmlzdGF0ZSAnSVA6IGlwYXV0b2Z3IG1hc3Egc3VwcG9y
dCAoRVhQRVJJTUVOVEFMKScgQ09ORklHX0lQX01BU1FVRVJBREVfSVBBVVRP
RlcNCisgICAgICAgICB0cmlzdGF0ZSAnSVA6IGlwIGZ3bWFyayBiaWRpcmVj
dGlvbmFsIG1hc3EtZm9yd2FyZGluZyBzdXBwb3J0IChWRVJZIEVYUEVSSU1F
TlRBTCknIENPTkZJR19JUF9NQVNRVUVSQURFX01CRlcNCiAgICAgICAgICAg
dHJpc3RhdGUgJ0lQOiBpcHBvcnRmdyBtYXNxIHN1cHBvcnQgKEVYUEVSSU1F
TlRBTCknIENPTkZJR19JUF9NQVNRVUVSQURFX0lQUE9SVEZXDQogICAgICAg
ICAgIHRyaXN0YXRlICdJUDogaXAgZndtYXJrIG1hc3EtZm9yd2FyZGluZyBz
dXBwb3J0IChFWFBFUklNRU5UQUwpJyBDT05GSUdfSVBfTUFTUVVFUkFERV9N
RlcNCiAJZmkNCmRpZmYgLWF1ciBsaW51eC9uZXQvaXB2NC9NYWtlZmlsZSBs
aW51eC0yLjIuMTBoZWxpeDEvbmV0L2lwdjQvTWFrZWZpbGUNCi0tLSBsaW51
eC9uZXQvaXB2NC9NYWtlZmlsZQlNb24gSmFuICA0IDE4OjMxOjM1IDE5OTkN
CisrKyBsaW51eC0yLjIuMTBoZWxpeDEvbmV0L2lwdjQvTWFrZWZpbGUJTW9u
IEp1biAyMSAxMjo0MzowMCAxOTk5DQpAQCAtODksNiArODksMTQgQEANCiAg
ICAgZW5kaWYNCiAgIGVuZGlmDQogDQorICBpZmVxICgkKENPTkZJR19JUF9N
QVNRVUVSQURFX01CRlcpLHkpDQorICBJUFY0X09CSlMgKz0gaXBfbWFzcV9t
YmZ3Lm8NCisgIGVsc2UNCisgICAgaWZlcSAoJChDT05GSUdfSVBfTUFTUVVF
UkFERV9NQkZXKSxtKQ0KKyAgICBNX09CSlMgKz0gaXBfbWFzcV9tYmZ3Lm8N
CisgICAgZW5kaWYNCisgIGVuZGlmDQorDQogZW5kaWYNCiANCiBNX09CSlMg
Kz0gaXBfbWFzcV91c2VyLm8NCmRpZmYgLWF1ciBsaW51eC9uZXQvaXB2NC9p
cF9pbnB1dC5jIGxpbnV4LTIuMi4xMGhlbGl4MS9uZXQvaXB2NC9pcF9pbnB1
dC5jDQotLS0gbGludXgvbmV0L2lwdjQvaXBfaW5wdXQuYwlUaHUgQXByIDIy
IDIyOjQ1OjE5IDE5OTkNCisrKyBsaW51eC0yLjIuMTBoZWxpeDEvbmV0L2lw
djQvaXBfaW5wdXQuYwlNb24gSnVuIDIxIDEyOjQzOjAwIDE5OTkNCkBAIC0y
MzQsNiArMjM0LDcgQEANCiAJc3RydWN0IHNvY2sgKnJhd19zaz1OVUxMOw0K
IAl1bnNpZ25lZCBjaGFyIGhhc2g7DQogCWludCBmbGFnID0gMDsNCisJX191
MzIgdG1wYWRkcjsNCiANCiAjaWZuZGVmIENPTkZJR19JUF9BTFdBWVNfREVG
UkFHDQogCS8qDQpAQCAtMjUyLDYgKzI1Myw3IEBADQogCS8qDQogCSAqIERv
IHdlIG5lZWQgdG8gZGUtbWFzcXVlcmFkZSB0aGlzIHBhY2tldD8NCiAJICov
DQorCXRtcGFkZHIgPSBpcGgtPnNhZGRyOyAvKiBnZXQgYXJvdW5kIHNvdXJj
ZSBjaGVjayBpbiByb3V0aW5nICovDQogICAgICAgICB7DQogCQlpbnQgcmV0
Ow0KIAkJLyoNCkBAIC0yNzYsNyArMjc4LDcgQEANCiAJCQlJUENCKHNrYikt
PmZsYWdzIHw9IElQU0tCX01BU1FVRVJBREVEOw0KIAkJCWRzdF9yZWxlYXNl
KHNrYi0+ZHN0KTsNCiAJCQlza2ItPmRzdCA9IE5VTEw7DQotCQkJaWYgKGlw
X3JvdXRlX2lucHV0KHNrYiwgaXBoLT5kYWRkciwgaXBoLT5zYWRkciwgaXBo
LT50b3MsIHNrYi0+ZGV2KSkgew0KKwkJCWlmIChpcF9yb3V0ZV9pbnB1dChz
a2IsIGlwaC0+ZGFkZHIsIHRtcGFkZHIsIGlwaC0+dG9zLCBza2ItPmRldikp
IHsNCiAJCQkJa2ZyZWVfc2tiKHNrYik7DQogCQkJCXJldHVybiAwOw0KIAkJ
CX0NCmRpZmYgLWF1ciBsaW51eC9uZXQvaXB2NC9pcF9tYXNxLmMgbGludXgt
Mi4yLjEwaGVsaXgxL25ldC9pcHY0L2lwX21hc3EuYw0KLS0tIGxpbnV4L25l
dC9pcHY0L2lwX21hc3EuYwlXZWQgTWFyIDE3IDAwOjUyOjA1IDE5OTkNCisr
KyBsaW51eC0yLjIuMTBoZWxpeDEvbmV0L2lwdjQvaXBfbWFzcS5jCU1vbiBK
dW4gMjEgMTI6NDM6MDAgMTk5OQ0KQEAgLTQ2LDYgKzQ2LDExIEBADQogICoJ
SnVhbiBKb3NlIENpYXJsYW50ZQk6IAltYWtlIG1hc3FfcHJvdG9fZG9mZigp
IHJvYnVzdCBhZ2FpbnN0IGZha2Ugc2l6ZWQvY29ycnVwdGVkIHBhY2tldHMN
CiAgKglLYWkgQmFua2V0dAkJOglkbyBub3QgdG9zcyBvdGhlciBJUCBwcm90
b3MgaW4gcHJvdG9fZG9mZigpDQogICoJRGFuIEtlZ2VsCQk6CXBvaW50ZWQg
Y29ycmVjdCBOQVQgYmVoYXZpb3IgZm9yIFVEUCBzdHJlYW1zDQorICoJUm9s
ZiBCcmF1bgkJOglhZGRlZCBzdXBwb3J0IGZvciAyLWRpciBtYXNxdWVyYWRp
bmcNCisgKgkJCQkJZm9yIHNpbmdsZS1pbnRlcmZhY2UgZm9yd2FyZGluZw0K
KyAqCQkJCQkoYmxhdGFudCBwbHVnOiBIZWxpeCBDb21wdXRlcg0KKyAqCQkJ
CQlTeXN0ZW1zIDxodHRwOi8vd3d3LmhlbGl4c3lzdGVtcy5jb20+DQorICoJ
CQkJCXN1cHBvcnRlZCB0aGlzIGhhY2spDQogICoJDQogICovDQogDQpAQCAt
MzU3LDYgKzM2Miw3IEBADQogDQogRVhQT1JUX1NZTUJPTChpcF9tYXNxX2dl
dF9kZWJ1Z19sZXZlbCk7DQogRVhQT1JUX1NZTUJPTChpcF9tYXNxX25ldyk7
DQorRVhQT1JUX1NZTUJPTChpcF9tYXNxX25ldzIpOw0KIEVYUE9SVF9TWU1C
T0woaXBfbWFzcV9saXN0ZW4pOw0KIEVYUE9SVF9TWU1CT0woaXBfbWFzcV9m
cmVlX3BvcnRzKTsNCiBFWFBPUlRfU1lNQk9MKGlwX21hc3Ffb3V0X2dldCk7
DQpAQCAtNjQzLDYgKzY0OSw0OSBAQA0KICAgICAgICAgcmV0dXJuIG1zOw0K
IH0NCiANCisvKiBSQUIgMi4yLjUgMTcwNjk5IC0gdGhpcyBmdW5jdGlvbiBs
b29rcyB1cCB0aGUgbG9jYWwgbWFzcSBhZGRyIGFzIHRoZQ0KKyAgIGRlc3Rp
bmF0aW9uIHNvIHRoYXQgd2UgY2FuICJtYXNxdWVyYWRlIiBvdXRnb2luZyBj
b25uZWN0aW9ucyBpbiB0aGUNCisgICBkZW1hc3EgZnVuY3Rpb24gKG9vZywg
bWVzc3ksIHl1Y2spICovDQorc3RhdGljIHN0cnVjdCBpcF9tYXNxICogX19p
cF9tYXNxX2xtX2dldChpbnQgcHJvdG9jb2wsIF9fdTMyIHNfYWRkciwgX191
MTYgc19wb3J0LCBfX3UzMiBkX2FkZHIsIF9fdTE2IGRfcG9ydCkNCit7DQor
ICAgICAgICB1bnNpZ25lZCBoYXNoOw0KKyAgICAgICAgc3RydWN0IGlwX21h
c3EgKm1zID0gTlVMTDsNCisNCisJLyoJDQorCSAqCUNoZWNrIGZvciAiZnVs
bCIgYWRkcmVzc2VkIGVudHJpZXMNCisJICovDQorICAgICAgICBoYXNoID0g
aXBfbWFzcV9oYXNoX2tleShwcm90b2NvbCwgc19hZGRyLCBzX3BvcnQpOw0K
KwkNCisgICAgICAgIGZvcihtcyA9IGlwX21hc3Ffc190YWJbaGFzaF07IG1z
IDsgbXMgPSBtcy0+c19saW5rKSB7DQorCQlpZiAocHJvdG9jb2wgPT0gbXMt
PnByb3RvY29sICYmDQorCQkgICAgc19hZGRyID09IG1zLT5zYWRkciAmJiBz
X3BvcnQgPT0gbXMtPnNwb3J0ICYmIG1zLT5sbXBvcnQgJiYNCisJCSAgICBk
X2FkZHI9PW1zLT5sbWFkZHIgJiYNCisJCSAgICBkX3BvcnQ9PW1zLT5sbXBv
cnQNCisgICAgICAgICAgICAgICAgICAgKSB7DQorCQkJSVBfTUFTUV9ERUJV
RygyLCAibGsvb3V0bG0xICVkICUwOFg6JTA0aFgtPiUwOFg6JTA0aFggT0tc
biIsDQorCQkJICAgICAgIHByb3RvY29sLA0KKwkJCSAgICAgICBzX2FkZHIs
DQorCQkJICAgICAgIHNfcG9ydCwNCisJCQkgICAgICAgZF9hZGRyLA0KKwkJ
CSAgICAgICBkX3BvcnQpOw0KKw0KKwkJCWF0b21pY19pbmMoJm1zLT5yZWZj
bnQpOw0KKwkJCWdvdG8gb3V0Ow0KKwkJfQ0KKw0KKyAgICAgICAgfQ0KKw0K
KwlJUF9NQVNRX0RFQlVHKDIsICJsay9vdXRsbTEgJWQgJTA4WDolMDRoWC0+
JTA4WDolMDRoWCBmYWlsXG4iLA0KKwkgICAgICAgcHJvdG9jb2wsDQorCSAg
ICAgICBzX2FkZHIsDQorCSAgICAgICBzX3BvcnQsDQorCSAgICAgICBkX2Fk
ZHIsDQorCSAgICAgICBkX3BvcnQpOw0KKw0KK291dDoNCisgICAgICAgIHJl
dHVybiBtczsNCit9DQorDQogI2lmZGVmIENPTkZJR19JUF9NQVNRX05SRVVT
RQ0KIC8qDQogICoJUmV0dXJucyBpcF9tYXNxIGZvciBnaXZlbiBwcm90byxt
X2FkZHIsbV9wb3J0Lg0KQEAgLTY5Nyw2ICs3NDYsMTkgQEANCiAJcmV0dXJu
IG1zOw0KIH0NCiANCitzdHJ1Y3QgaXBfbWFzcSAqIGlwX21hc3FfbG1fZ2V0
KGludCBwcm90b2NvbCwgX191MzIgc19hZGRyLCBfX3UxNiBzX3BvcnQsIF9f
dTMyIGRfYWRkciwgX191MTYgZF9wb3J0KQ0KK3sNCisJc3RydWN0IGlwX21h
c3EgKm1zOw0KKw0KKwlyZWFkX2xvY2soJl9faXBfbWFzcV9sb2NrKTsNCisJ
bXMgPSAgX19pcF9tYXNxX2xtX2dldChwcm90b2NvbCwgc19hZGRyLCBzX3Bv
cnQsIGRfYWRkciwgZF9wb3J0KTsNCisJcmVhZF91bmxvY2soJl9faXBfbWFz
cV9sb2NrKTsNCisNCisJaWYgKG1zKQ0KKwkJX19pcF9tYXNxX3NldF9leHBp
cmUobXMsIDApOw0KKwlyZXR1cm4gbXM7DQorfQ0KKw0KIHN0YXRpYyBfX2lu
bGluZV9fIHZvaWQgX19pcF9tYXNxX3B1dChzdHJ1Y3QgaXBfbWFzcSAqbXMp
IA0KIHsNCiAJYXRvbWljX2RlYygmbXMtPnJlZmNudCk7DQpAQCAtNzYwLDcg
KzgyMiwxMCBAQA0KIAkJaXBfbWFzcV9jb250cm9sX2RlbChtcyk7DQogDQog
ICAgICAgICBpZiAoaXBfbWFzcV91bmhhc2gobXMpKSB7DQotCQlpZiAobXMt
PmZsYWdzJklQX01BU1FfRl9NUE9SVCkgew0KKwkJaWYgKG1zLT5mbGFncyZJ
UF9NQVNRX0ZfQklESVIpIHsNCisJCQlhdG9taWNfZGVjKCZtcG9ydF9jb3Vu
dCk7DQorCQkJYXRvbWljX2luYyhpcF9tYXNxX2ZyZWVfcG9ydHMgKyBtYXNx
X3Byb3RvX251bShtcy0+cHJvdG9jb2wpKTsNCisJCX0gZWxzZSBpZiAobXMt
PmZsYWdzJklQX01BU1FfRl9NUE9SVCkgew0KIAkJCWF0b21pY19kZWMoJm1w
b3J0X2NvdW50KTsNCiAJCX0gZWxzZSB7DQogCQkJYXRvbWljX2luYyhpcF9t
YXNxX2ZyZWVfcG9ydHMgKyBtYXNxX3Byb3RvX251bShtcy0+cHJvdG9jb2wp
KTsNCkBAIC04MTYsMTcgKzg4MSwyNCBAQA0KIA0KIHN0cnVjdCBpcF9tYXNx
ICogaXBfbWFzcV9uZXcoaW50IHByb3RvLCBfX3UzMiBtYWRkciwgX191MTYg
bXBvcnQsIF9fdTMyIHNhZGRyLCBfX3UxNiBzcG9ydCwgX191MzIgZGFkZHIs
IF9fdTE2IGRwb3J0LCB1bnNpZ25lZCBtZmxhZ3MpDQogew0KKwlyZXR1cm4g
aXBfbWFzcV9uZXcyKHByb3RvLCBtYWRkciwgbXBvcnQsIHNhZGRyLCBzcG9y
dCwgZGFkZHIsIGRwb3J0LCBtZmxhZ3MgJiB+SVBfTUFTUV9GX0JJRElSLCAw
KTsNCit9DQorDQorDQorDQorc3RydWN0IGlwX21hc3EgKiBpcF9tYXNxX25l
dzIoaW50IHByb3RvLCBfX3UzMiBtYWRkciwgX191MTYgbXBvcnQsIF9fdTMy
IHNhZGRyLCBfX3UxNiBzcG9ydCwgX191MzIgZGFkZHIsIF9fdTE2IGRwb3J0
LCB1bnNpZ25lZCBtZmxhZ3MsIF9fdTMyIGxtYWRkcikNCit7DQorCV9fdTE2
IHRtcHBvcnQ7DQogICAgICAgICBzdHJ1Y3QgaXBfbWFzcSAqbXMsICptc3Q7
DQogICAgICAgICBpbnQgcG9ydHNfdHJpZWQ7DQogCWF0b21pY190ICpmcmVl
X3BvcnRzX3AgPSBOVUxMOw0KICAgICAgICAgc3RhdGljIGludCBuX2ZhaWxz
ID0gMDsNCiAJaW50IHByaW87DQogDQotDQotCWlmIChtYXNxX3Byb3RvX251
bShwcm90bykhPS0xICYmIG1wb3J0ID09IDApIHsNCisJaWYgKG1hc3FfcHJv
dG9fbnVtKHByb3RvKSE9LTEgJiYgKG1wb3J0ID09IDAgfHwgbWZsYWdzICYg
SVBfTUFTUV9GX0JJRElSKSkgew0KIAkJZnJlZV9wb3J0c19wID0gaXBfbWFz
cV9mcmVlX3BvcnRzICsgbWFzcV9wcm90b19udW0ocHJvdG8pOw0KIA0KLQkJ
aWYgKGF0b21pY19yZWFkKGZyZWVfcG9ydHNfcCkgPT0gMCkgew0KKwkJaWYg
KGF0b21pY19yZWFkKGZyZWVfcG9ydHNfcCkgPT0gMSkgew0KIAkJCWlmICgr
K25fZmFpbHMgPCA1KQ0KIAkJCQlJUF9NQVNRX0VSUiggImlwX21hc3FfbmV3
KHByb3RvPSVzKTogbm8gZnJlZSBwb3J0cy5cbiIsDQogCQkJCSAgICAgICBt
YXNxX3Byb3RvX25hbWUocHJvdG8pKTsNCkBAIC04NzUsMTIgKzk0NywyNCBA
QA0KICAgICAgICAgLyogZ2V0IG1hc3EgYWRkcmVzcyBmcm9tIHJpZiAqLw0K
ICAgICAgICAgbXMtPm1hZGRyCSAgID0gbWFkZHI7DQogDQorCW1zLT5sbXBv
cnQgPSAwOw0KKwlpZiAobWZsYWdzICYgSVBfTUFTUV9GX0JJRElSKSAvKiBS
QUIgMi4yLjUgMTQwNjk5ICovDQorCQltcy0+bG1hZGRyID0gbG1hZGRyOw0K
Kw0KICAgICAgICAgLyoNCiAgICAgICAgICAqCVRoaXMgZmxhZyB3aWxsIGFs
bG93IG1hc3EuIGFkZHIgKG1zLT5tYWRkcikNCiAgICAgICAgICAqCXRvIGZv
bGxvdyBmb3J3YXJkaW5nIGludGVyZmFjZSBhZGRyZXNzLg0KICAgICAgICAg
ICovDQogICAgICAgICBtcy0+ZmxhZ3MgICAgICAgICB8PSBJUF9NQVNRX0Zf
Tk9fUkVQTFk7DQotICANCisgDQorLyogUkFCIDIuMi41IDE0MDY5OSAtIE5C
LCBwbGVhc2UgcmVhZCBob3cgdGhpcyB3b3JrcyENCisgICB0aGUgYmlkaXJl
Y3Rpb25hbGx5IG1hc3F1ZXJhZGVkIGNvbm5lY3Rpb25zIGhhdmUgb25seSBP
TkUgcG9ydCBwYXNzZWQNCisgICBmb3IgdGhlIGNsaWVudCBlbmQgdG8gdXNl
OyB0aGUgcm91dGVyIHdpbGwgYWx3YXlzIGFsbG9jYXRlIGEgbmV3IG1hc3Eg
cG9ydCAobG1wb3J0KQ0KKyAgIGZvciB0aGUgc2VydmVyIChhY3R1YWxseSBz
b3VyY2Ugc2luY2UgdGhpcyBpcyByZXZlcnNlLW1hc3EpIGVuZCBvZiB0aGUg
bWFzcSB0dW5uZWwgKi8NCisNCisvKiB3ZSBuZWVkIG5vdCBjaGVjayB0aGUg
bG1wb3J0IGxpc3Qgd2hlbiBsb29raW5nIGZvciBhbiBtcG9ydCAoYW5kIHZp
Y2UgdmVyc2EpIGJlY2F1c2UNCisgICB0aG9zZSA1LXVwbGVzIGFyZSBleHRy
ZW1lbHkgdW5saWtlbHkgdG8gYmUgdGhlIHNhbWUgaWYgZm9yd2FyZGluZyB0
byBhIHNlcnZlciAqLw0KKw0KICAgCS8qDQogCSAqIAlXZSB3YW50IGEgc3Bl
Y2lmaWMgbXBvcnQuIEJlIGNhcmVmdWwuDQogCSAqLw0KQEAgLTg5OCwzNyAr
OTgyLDQ1IEBADQogICAgICAgICAgICAgICAgIG1zdCA9IF9faXBfbWFzcV9p
bl9nZXQocHJvdG8sIGRhZGRyLCBkcG9ydCwgbWFkZHIsIG1wb3J0KTsNCiAJ
CWlmIChtc3Q9PU5VTEwpIHsNCiAJCQltcy0+ZmxhZ3MgfD0gSVBfTUFTUV9G
X01QT1JUOw0KLQ0KIAkJCWF0b21pY19pbmMoJm1wb3J0X2NvdW50KTsNCi0g
ICAgICAgICAgICAgICAgICAgICAgICBpcF9tYXNxX2hhc2gobXMpOw0KKwkJ
CWlmICghKG1mbGFncyAmIElQX01BU1FfRl9CSURJUikpIHsNCisJCQkJaXBf
bWFzcV9oYXNoKG1zKTsNCiANCi0JCQlpZiAobWZsYWdzICYgSVBfTUFTUV9G
X1VTRVIpIAkNCi0JCQkJd3JpdGVfdW5sb2NrX2JoKCZfX2lwX21hc3FfbG9j
ayk7DQotCQkJZWxzZSANCi0JCQkJd3JpdGVfdW5sb2NrKCZfX2lwX21hc3Ff
bG9jayk7DQorCQkJCWlmIChtZmxhZ3MgJiBJUF9NQVNRX0ZfVVNFUikgCQ0K
KwkJCQkJd3JpdGVfdW5sb2NrX2JoKCZfX2lwX21hc3FfbG9jayk7DQorCQkJ
CWVsc2UgDQorCQkJCQl3cml0ZV91bmxvY2soJl9faXBfbWFzcV9sb2NrKTsN
CiANCi0JCQlpcF9tYXNxX2JpbmRfYXBwKG1zKTsNCi0JCQlhdG9taWNfaW5j
KCZtcy0+cmVmY250KTsNCi0JCQltYXNxX3NldF9zdGF0ZV90aW1lb3V0KG1z
LCBJUF9NQVNRX1NfTk9ORSk7DQotCQkJcmV0dXJuIG1zOw0KKwkJCQlpcF9t
YXNxX2JpbmRfYXBwKG1zKTsNCisJCQkJYXRvbWljX2luYygmbXMtPnJlZmNu
dCk7DQorCQkJCW1hc3Ffc2V0X3N0YXRlX3RpbWVvdXQobXMsIElQX01BU1Ff
U19OT05FKTsNCisJCQkJcmV0dXJuIG1zOw0KKwkJCX0NCiAJCX0NCiAJCWlm
IChtZmxhZ3MgJiBJUF9NQVNRX0ZfVVNFUikgCQ0KIAkJCXdyaXRlX3VubG9j
a19iaCgmX19pcF9tYXNxX2xvY2spOw0KIAkJZWxzZSANCiAJCQl3cml0ZV91
bmxvY2soJl9faXBfbWFzcV9sb2NrKTsNCiANCi0JCV9faXBfbWFzcV9wdXQo
bXN0KTsNCi0NCi0JCUlQX01BU1FfRVJSKCAiQWxyZWFkeSB1c2VkIGNvbm5l
Y3Rpb246ICVzLCAlZC4lZC4lZC4lZDolZCA9PiAlZC4lZC4lZC4lZDolZCwg
Y2FsbGVkIGZyb20gJXBcbiIsDQotCQkJbWFzcV9wcm90b19uYW1lKHByb3Rv
KSwNCi0JCQlOSVBRVUFEKG1hZGRyKSwgbnRvaHMobXBvcnQpLA0KLQkJCU5J
UFFVQUQoZGFkZHIpLCBudG9ocyhkcG9ydCksDQotCQkJX19idWlsdGluX3Jl
dHVybl9hZGRyZXNzKDApKTsNCisJCWlmKG1zdCE9TlVMTCkgew0KKwkJCV9f
aXBfbWFzcV9wdXQobXN0KTsNCisJCQlJUF9NQVNRX0VSUiggIkFscmVhZHkg
dXNlZCBjb25uZWN0aW9uOiAlcywgJWQuJWQuJWQuJWQ6JWQgPT4gJWQuJWQu
JWQuJWQ6JWQsIGNhbGxlZCBmcm9tICVwXG4iLA0KKwkJCQltYXNxX3Byb3Rv
X25hbWUocHJvdG8pLA0KKwkJCQlOSVBRVUFEKG1hZGRyKSwgbnRvaHMobXBv
cnQpLA0KKwkJCQlOSVBRVUFEKGRhZGRyKSwgbnRvaHMoZHBvcnQpLA0KKwkJ
CQlfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOw0KIA0KIA0KLQkJZ290
byBtcG9ydF9ub25vOw0KKwkJCWdvdG8gbXBvcnRfbm9ubzsNCisJCX0NCiAJ
fQ0KIAkNCisvKiBSQUIgMi4yLjUgMTQwNjk5IC0gT0ssIGhlcmUgd2UgZG8g
c29tZSB3ZWlyZG5lc3MuIElmIHRoaXMgaXMgMi1kaXIgbWFzcXVlcmFkZWQs
DQorICAgd2UgbmVlZCB0byBhbGxvY2F0ZSBhIG5ldyBsbXBvcnQsIGJ1dCBJ
IGRpZG4ndCBmZWVsIGxpa2Ugc3BlY2lhbC1jYXNpbmcgbXBvcnQvbG1wb3J0
DQorICAgYWxsIG92ZXIgdGhlIHBsYWNlLiAqLw0KKw0KKwlpZiAobWZsYWdz
ICYgSVBfTUFTUV9GX0JJRElSKQ0KKwkJdG1wcG9ydCA9IG1zLT5tcG9ydDsg
LyogYW5kIHJlbWVtYmVyIHRvIHN3aXRjaCAnZW0gbGF0ZXIuLi4gKi8NCiAN
CiAgICAgICAgIGZvciAocG9ydHNfdHJpZWQgPSAwOyANCiAJICAgICAoYXRv
bWljX3JlYWQoZnJlZV9wb3J0c19wKSAmJiAocG9ydHNfdHJpZWQgPD0gKFBP
UlRfTUFTUV9FTkQgLSBQT1JUX01BU1FfQkVHSU4pKSk7DQpAQCAtOTQ0LDEz
ICsxMDM2LDI2IEBADQogCQllbHNlDQogCQkJd3JpdGVfbG9jaygmX19pcF9t
YXNxX2xvY2spOw0KIA0KKy8qIFJBQiAyLjIuNSAxNDA2OTkgLSBJUF9NQVNR
X05SRVVTRSBhbmQgYmlkaXJlY3Rpb25hbCBtYXNxdWVyYWRpbmcgYXJlbid0
IGd1YXJhbnRlZWQgdG8gZ2V0DQorICAgYWxvbmcgYXMgb2YgeWV0LCBzbyBw
bGVhc2UgZG9uJ3QgdXNlIHRoZW0gYXQgdGhlIHNhbWUgdGltZS4gKi8NCiAj
aWZkZWYgQ09ORklHX0lQX01BU1FfTlJFVVNFDQogCQltc3QgPSBfX2lwX21h
c3FfZ2V0YnltKHByb3RvLCBtYWRkciwgbXBvcnQpOw0KICNlbHNlDQotCQlt
c3QgPSBfX2lwX21hc3FfaW5fZ2V0KHByb3RvLCBkYWRkciwgZHBvcnQsIG1h
ZGRyLCBtcG9ydCk7DQorLyogZm9yIGJpZGlyZWN0aW9uYWwgZndkOiAqLw0K
Ky8qIFRoaXMgaXMgcG90ZW50aWFsbHkgVkVSWSBpbmVmZmljaWVudCBpZiB3
ZSBoaXQgYSB3aG9sZSBibG9jayBvZiB1c2VkIGFkZHJlc3NlcyEgSXQncw0K
KyAgIGp1c3QgYW5vdGhlciByZWFzb24gb2YgY291cnNlIHRoYXQgd2UgbmVl
ZCB0byBoYXNoIGJ5IGRlc3QvbG1hc3EgZXZlbnR1YWxseSAqLw0KKwkJaWYg
KG1mbGFncyAmIElQX01BU1FfRl9CSURJUikNCisJCQltc3QgPSBfX2lwX21h
c3Ffb3V0X2dldChwcm90bywgc2FkZHIsIHNwb3J0LCBsbWFkZHIsIG1wb3J0
KTsNCisJCQllbHNlIG1zdCA9IF9faXBfbWFzcV9pbl9nZXQocHJvdG8sIGRh
ZGRyLCBkcG9ydCwgbWFkZHIsIG1wb3J0KTsNCiAjZW5kaWYNCiAJCWlmICht
c3QgPT0gTlVMTCkgew0KIA0KKwkJCS8qIG9oIHllYWgsIHdlIGRvIHN3aXRj
aCB0aGVtIGJhY2sgKi8NCisJCQlpZiAobWZsYWdzICYgSVBfTUFTUV9GX0JJ
RElSKSB7IA0KKwkJCQltcy0+bG1wb3J0ID0gbXMtPm1wb3J0Ow0KKwkJCQlt
cy0+bXBvcnQgPSB0bXBwb3J0Ow0KKwkJCX0NCisNCiAJCQlpZiAoYXRvbWlj
X3JlYWQoZnJlZV9wb3J0c19wKSA9PSAwKSB7DQogCQkJCWlmIChtZmxhZ3Mg
JiBJUF9NQVNRX0ZfVVNFUikgDQogCQkJCQl3cml0ZV91bmxvY2tfYmgoJl9f
aXBfbWFzcV9sb2NrKTsNCkBAIC0xMDM2LDYgKzExNDEsMTEgQEANCiANCiBp
bnQgaXBfZndfbWFzcXVlcmFkZShzdHJ1Y3Qgc2tfYnVmZiAqKnNrYl9wLCBf
X3UzMiBtYWRkcikNCiB7DQorCXJldHVybiBpcF9md19tYXNxdWVyYWRlMihz
a2JfcCwgbWFkZHIsIDApOw0KK30NCisNCitpbnQgaXBfZndfbWFzcXVlcmFk
ZTIoc3RydWN0IHNrX2J1ZmYgKipza2JfcCwgX191MzIgbWFkZHIsIHN0cnVj
dCBpcF9tYXNxICptc3QpDQorew0KIAlzdHJ1Y3Qgc2tfYnVmZiAgKnNrYiA9
ICpza2JfcDsNCiAJc3RydWN0IGlwaGRyCSppcGggPSBza2ItPm5oLmlwaDsN
CiAJdW5pb24gaXBfbWFzcV90cGhkciBoOw0KQEAgLTExMjYsNyArMTIzNiw4
IEBADQogICAJCW50b2hsKGlwaC0+c2FkZHIpLCBudG9ocyhoLnBvcnRwWzBd
KSwNCiAgIAkJbnRvaGwoaXBoLT5kYWRkciksIG50b2hzKGgucG9ydHBbMV0p
KTsNCiANCi0gICAgICAgIG1zID0gaXBfbWFzcV9vdXRfZ2V0X2lwaChpcGgp
Ow0KKyAgICAgICAgaWYgKCFtc3QpIG1zID0gaXBfbWFzcV9vdXRfZ2V0X2lw
aChpcGgpOw0KKyAgICAgICAgZWxzZSBtcyA9IG1zdDsNCiAgICAgICAgIGlm
IChtcyE9TlVMTCkgew0KIA0KICAgICAgICAgICAgICAgICAvKg0KQEAgLTEy
MTQsNiArMTMyNSwxMSBAQA0KICAJaXBoLT5zYWRkciA9IG1zLT5tYWRkcjsN
CiAgCWgucG9ydHBbMF0gPSBtcy0+bXBvcnQ7DQogDQorCWlmIChtcy0+bG1w
b3J0KSB7IC8qIFJBQiAyLjIuNSAxMzA2OTkgLSBpZiB0aGlzIGlzIGJpZGly
ZWN0aW9uYWwsIHdlIGhhdmUgdG8gZm9vbCB3aXRoIHRoZSBkZXN0aW5hdGlv
biB0b28gKi8NCisJCWlwaC0+ZGFkZHIgPSBtcy0+ZGFkZHI7DQorCQloLnBv
cnRwWzFdID0gbXMtPmRwb3J0Ow0KKwl9DQorDQogCS8qDQogCSAqCUludmFs
aWRhdGUgY3N1bSBzYXZpbmcgaWYgdHVubmVsIGhhcyBtYXNxIGhlbHBlcg0K
IAkgKi8NCkBAIC0xOTc1LDYgKzIwOTEsMTIgQEANCiAgICAgICAgICAqLw0K
IA0KICAgICAgICAgbXMgPSBpcF9tYXNxX2luX2dldF9pcGgoaXBoKTsNCisJ
aWYgKCFtcykgew0KKy8qIFJBQiAyLjIuNSAxODA2OTkgLSBjaGVjayBmb3Ig
cHN1ZWRvLW91dGdvaW5nIGNvbm5lY3Rpb25zIGFzIHdlbGwgKi8NCisJCW1z
ID0gaXBfbWFzcV9sbV9nZXRfaXBoKGlwaCk7DQorCQlpZiAobXMpDQorCQkJ
cmV0dXJuIGlwX2Z3X21hc3F1ZXJhZGUyKHNrYl9wLCBtcy0+bWFkZHIsIG1z
KT09MD8xOjAgOw0KKwl9DQogDQogCS8qDQogIAkgKiAJR2l2ZSBhZGRpdGlv
bmFsIG1vZHVsZXMgYSBjaGFuY2UgdG8gY3JlYXRlIGFuIGVudHJ5DQpAQCAt
MjAzNCw2ICsyMTU2LDEzIEBADQogICAgICAgICAgICAgICAgIGlwaC0+ZGFk
ZHIgPSBtcy0+c2FkZHI7DQogICAgICAgICAgICAgICAgIGgucG9ydHBbMV0g
PSBtcy0+c3BvcnQ7DQogDQorCQkvKiBSQUIgMi4yLjUgMTMwNjk5IC0gd2Ug
aGF2ZSB0byBtYXNxdWVyYWRlIHRoZSBwYWNrZXQgZm9yIHRoZSBsb2NhbCBz
ZXJ2ZXINCisJCSAgIGFzIHdlbGwgaW4gc29tZSBjYXNlcy4uLiBzbyBjaGVj
ayB0byBzZWUgaWYgd2UgbmVlZCB0byAqLw0KKwkJaWYgKG1zLT5sbXBvcnQp
IHsNCisJCQlpcGgtPnNhZGRyID0gbXMtPmxtYWRkcjsNCisJCQloLnBvcnRw
WzBdID0gbXMtPmxtcG9ydDsNCisJCX0NCisNCiAJCS8qDQogCQkgKglJbnZh
bGlkYXRlIGNzdW0gc2F2aW5nIGlmIHR1bm5lbCBoYXMgbWFzcSBoZWxwZXIN
CiAJCSAqLw0KQEAgLTIwOTMsNiArMjIyMiw3IEBADQogICAgICAgICAgICAg
ICAgIGlwX3NlbmRfY2hlY2soaXBoKTsNCiANCiAgICAgICAgICAgICAgICAg
SVBfTUFTUV9ERUJVRygyLCAiSS1yb3V0ZWQgdG8gJTA4bFg6JTA0WFxuIixu
dG9obChpcGgtPmRhZGRyKSxudG9ocyhoLnBvcnRwWzFdKSk7DQorCQlJUF9N
QVNRX0RFQlVHKDIsICJJLXJvdXRlZCBmcm9tICUwOGxYOiUwNFhcbiIsbnRv
aGwoaXBoLT5zYWRkciksbnRvaHMoaC5wb3J0cFswXSkpOw0KIA0KIAkJbWFz
cV9zZXRfc3RhdGUgKG1zLCAwLCBpcGgsIGgucG9ydHApOw0KIAkJaXBfbWFz
cV9wdXQobXMpOw0KQEAgLTIxNjcsNyArMjI5Nyw3IEBADQogCWlmIChvZmZz
ZXQgPCAxMjgpDQogCXsNCiAJCXNwcmludGYodGVtcCwNCi0JCQkiUHJjIEZy
b21JUCAgIEZQcnQgVG9JUCAgICAgVFBydCBNYXNxIEluaXQtc2VxICBEZWx0
YSBQRGVsdGEgRXhwaXJlcyAoZnJlZT0lZCwlZCwlZCkiLA0KKwkJCSJQcmMg
RnJvbUlQICAgRlBydCBUb0lQICAgICBUUHJ0IE1hc3EgTE1zcSBJbml0LXNl
cSAgRGVsdGEgUERlbHRhIEV4cGlyZXMgKGZyZWU9JWQsJWQsJWQpIiwNCiAJ
CQlhdG9taWNfcmVhZChpcF9tYXNxX2ZyZWVfcG9ydHMpLCANCiAJCQlhdG9t
aWNfcmVhZChpcF9tYXNxX2ZyZWVfcG9ydHMrMSksIA0KIAkJCWF0b21pY19y
ZWFkKGlwX21hc3FfZnJlZV9wb3J0cysyKSk7DQpAQCAtMjE5NiwxMSArMjMy
NiwxMSBAQA0KIAkJICoJbm9yIGNsaSgpICA4KQ0KIAkJICovDQogDQotCQlz
cHJpbnRmKHRlbXAsIiVzICUwOGxYOiUwNFggJTA4bFg6JTA0WCAlMDRYICUw
OFggJTZkICU2ZCAlN2x1IiwNCisJCXNwcmludGYodGVtcCwiJXMgJTA4bFg6
JTA0WCAlMDhsWDolMDRYICUwNFggJTA0WCAlMDhYICU2ZCAlNmQgJTdsdSIs
DQogCQkJbWFzcV9wcm90b19uYW1lKG1zLT5wcm90b2NvbCksDQogCQkJbnRv
aGwobXMtPnNhZGRyKSwgbnRvaHMobXMtPnNwb3J0KSwNCiAJCQludG9obCht
cy0+ZGFkZHIpLCBudG9ocyhtcy0+ZHBvcnQpLA0KLQkJCW50b2hzKG1zLT5t
cG9ydCksDQorCQkJbnRvaHMobXMtPm1wb3J0KSwgbnRvaHMobXMtPmxtcG9y
dCksDQogCQkJbXMtPm91dF9zZXEuaW5pdF9zZXEsDQogCQkJbXMtPm91dF9z
ZXEuZGVsdGEsDQogCQkJbXMtPm91dF9zZXEucHJldmlvdXNfZGVsdGEsDQpA
QCAtMjQ0OSw2ICsyNTc5LDExIEBADQogI2lmZGVmIENPTkZJR19JUF9NQVNR
VUVSQURFX01GVw0KIAlpcF9tZndfaW5pdCgpOw0KICNlbmRpZg0KKw0KKyNp
ZmRlZiBDT05GSUdfSVBfTUFTUVVFUkFERV9NQkZXDQorCWlwX21iZndfaW5p
dCgpOw0KKyNlbmRpZg0KKw0KICAgICAgICAgaXBfbWFzcV9hcHBfaW5pdCgp
Ow0KIA0KICAgICAgICAgcmV0dXJuIDA7DQo=
--215503375-172410501-930675121=:30216
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="ip_masq_mbfw.c"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.4.10.9906291252011.30216@ns1.helixsystems.com>
Content-Description:
Content-Disposition: attachment; filename="ip_masq_mbfw.c"

LyogYmlkaXJlY3Rpb25hbC1tYXNxdWVyYWRpbmcgbWFyayBmb3J3YXJkaW5n
IChtYmZ3KQ0KICAgUkFCIDIuMi41IDE0MDY5OSAqLw0KDQovKiBUaGlzIG1v
ZHVsZSBpcyBpbnRlbmRlZCBmb3IgbG9jYWwgY29ubmVjdGlvbnMgKGZyb20g
YSBzaW5nbGUgaW50ZXJmYWNlIHRvIGl0c2VsZikNCiAgIG9ubHkhIEl0IGhh
cyB0aGUgdW53YW50ZWQgYnV0IHVuYXZvaWRhYmxlIHNpZGUgZWZmZWN0IG9m
IG9ic2N1cmluZyB0aGUgcmVhbCBJUCBpbiBzZXJ2ZXINCiAgIGxvZ3MuIFRo
ZXJlZm9yZSwgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGUgZmlyZXdhbGwg
cnVsZXMgYmUgc2V0IHVwIHRvIGxvZyBhbGwgaW5jb21pbmcNCiAgIGNvbm5l
Y3Rpb25zIGludG8gdGhpcyBtb2R1bGUgKG1ha2Ugc3VyZSB0byB1c2UgLXkg
LWwgaW5zdGVhZCBvZiBqdXN0IC1sIHRvIGF2b2lkDQogICBvdmVyc2l6ZWQg
bG9nIGZpbGVzIDotKSBhbmQgdGhhdCBmaXJld2FsbCBydWxlcyBiZSBzcGxp
dCBzbyB0aGF0IG91dHNpZGUgY29ubmVjdGlvbnMNCiAgIHVzZSB0aGUgb3Ro
ZXIgbWZ3IG1vZHVsZSAqLw0KDQovKg0KICoJCUlQX01BU1FfTUFSS0ZXIG1h
c3F1ZXJhZGluZyBtb2R1bGUNCiAqDQogKglEb2VzIChyZXZlcnNlLW1hc3Ep
IGZvcndhcmRpbmcgYmFzZWQgb24gc2tiLT5md21hcmsgdmFsdWUNCiAqDQog
KgkkSWQ6IGlwX21hc3FfbWZ3LmMsdiAxLjMgMTk5OS8wMS8yNiAwNTozMzo0
NyBkYXZlbSBFeHAgJA0KICoNCiAqIEF1dGhvcjoJSnVhbiBKb3NlIENpYXJs
YW50ZSAgIDxqamNpYXJsYUByYWl6LnVuY3UuZWR1LmFyPg0KICoJCSAgYmFz
ZWQgb24gU3RldmVuIENsYXJrZSdzIHBvcnRmdw0KICoNCiAqIEZpeGVzOgkN
CiAqICAgICAgUm9sZiBCcmF1bjogICAgICAgICAgICAgY3JlYXRlZCBtYmZ3
IG1vZHVsZXMgZnJvbSBtZncgbW9kdWxlDQogKgkJCQlibGF0YW50IHBsdWc6
IHRoaXMgaGFjayB3YXMgc3VwcG9ydGVkDQogKiAJCQkJYnkgSGVsaXggQ29t
cHV0ZXIgU3lzdGVtcw0KICoJCQkJPGh0dHA6Ly93d3cuaGVsaXhzeXN0ZW1z
LmNvbT4NCiAqCUp1YW5KbyBDaWFybGFudGU6CWFkZGVkIHUtc3BhY2Ugc2No
ZWQgc3VwcG9ydA0KICoJSnVhbkpvIENpYXJsYW50ZToJaWYgcnBvcnQ9PTAs
IHVzZSBwYWNrZXQgZGVzdCBwb3J0ICpncmluKg0KICoJSnVhbkpvIENpYXJs
YW50ZToJZml4ZWQgdGNwIHN5biYmIWFjayBjcmVhdGlvbg0KICoNCiAqDQog
Ki8NCiNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4NCiNpbmNsdWRlIDxsaW51
eC9tb2R1bGUuaD4NCiNpbmNsdWRlIDxsaW51eC90eXBlcy5oPg0KI2luY2x1
ZGUgPGxpbnV4L2tlcm5lbC5oPg0KI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+
DQojaW5jbHVkZSA8bGludXgvbGlzdC5oPg0KI2luY2x1ZGUgPG5ldC9pcC5o
Pg0KI2luY2x1ZGUgPGxpbnV4L2lwX2Z3Lmg+DQojaW5jbHVkZSA8bGludXgv
aXBfbWFzcS5oPg0KI2luY2x1ZGUgPG5ldC9pcF9tYXNxLmg+DQojaW5jbHVk
ZSA8bmV0L2lwX21hc3FfbW9kLmg+DQojaW5jbHVkZSA8bGludXgvcHJvY19m
cy5oPg0KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4NCiNpbmNsdWRlIDxhc20v
c29mdGlycS5oPg0KI2luY2x1ZGUgPGFzbS9zcGlubG9jay5oPg0KI2luY2x1
ZGUgPGFzbS9hdG9taWMuaD4NCg0Kc3RhdGljIHN0cnVjdCBpcF9tYXNxX21v
ZCAqbW1vZF9zZWxmID0gTlVMTDsNCiNpZmRlZiBDT05GSUdfSVBfTUFTUV9E
RUJVRw0Kc3RhdGljIGludCBkZWJ1Zz0wOw0KTU9EVUxFX1BBUk0oZGVidWcs
ICJpIik7DQojZW5kaWYNCg0KLyoNCiAqICBMaXN0cyBzdHJ1Y3R1cmU6DQog
KglUaGVyZSBpcyBhICJtYWluIiBsaW5rZWQgbGlzdCB3aXRoIGVudHJpZXMg
aGFzaGVkDQogKglieSBmd21hcmsgdmFsdWUgKHN0cnVjdCBpcF9tYXNxX21m
dywgdGhlICJtLWVudHJpZXMiKS4NCiAqDQogKglFYWNoIG9mIHRoaXMgbS1l
bnRyeSBob2xkcyBhIGRvdWJsZSBsaW5rZWQgbGlzdA0KICoJb2YgImZvcndh
cmQtdG8iIGhvc3RzIChzdHJ1Y3QgaXBfbWFzcV9tZndfaG9zdCwgdGhlICJt
Lmhvc3QiKSwNCiAqCXRoZSByb3VuZC1yb2JpbiBzY2hlZHVsaW5nIHRha2Vz
IHBsYWNlIGJ5IHJvdGF0aW5nIG0uaG9zdCBlbnRyaWVzDQogKgkiaW5zaWRl
IiBpdHMgbS1lbnRyeS4NCiAqLw0KDQovKg0KICoJRWFjaCBmb3J3YXJkZWQg
aG9zdCAoYWRkcjpwb3J0KSBpcyBzdG9yZWQgaGVyZQ0KICovDQpzdHJ1Y3Qg
aXBfbWFzcV9tYmZ3X2hvc3Qgew0KCXN0cnVjdCAJbGlzdF9oZWFkIGxpc3Q7
DQoJX191MzIgCWFkZHI7DQoJX191MTYJcG9ydDsNCglfX3UxNglwYWQwOw0K
CV9fdTMyCWxtYWRkcjsgLyogbG9jYWwgbWFzcXVlcmFkaW5nIGFkZHJlc3Mg
Ki8NCglfX3UzMiAJZndtYXJrOw0KCWludCAJcHJlZjsNCglhdG9taWNfdAlw
cmVmX2NudDsNCn07DQoNCiNkZWZpbmUgSVBfTUFTUV9NQkZXX0hTSVpFCTE2
DQovKg0KICoJVGhpcyBlbnRyaWVzIGFyZSBpbmRleGVkIGJ5IGZ3bWFyaywg
DQogKgl0aGV5IGhvbGQgYSBsaXN0IG9mIGZvcndhcmRlZCBhZGRyOnBvcnQN
CiAqLwkNCg0Kc3RydWN0IGlwX21hc3FfbWJmdyB7DQoJc3RydWN0IGlwX21h
c3FfbWJmdyAqbmV4dDsJLyogbGlua2VkIGxpc3QgKi8NCglfX3UzMiBmd21h
cms7CQkJLyoga2V5OiBmaXJld2FsbCBtYXJrICovDQoJc3RydWN0IGxpc3Rf
aGVhZCBob3N0czsJCS8qIGxpc3Qgb2YgZm9yd2FyZC10byBob3N0cyAqLw0K
CWF0b21pY190IG5ob3N0czsJCS8qIG51bWJlciBvZiAiIiAqLw0KI2lmZGVm
IF9fU01QX18NCglyd2xvY2tfdCBsb2NrOw0KI2VuZGlmDQp9Ow0KDQoNCnN0
YXRpYyBzdHJ1Y3Qgc2VtYXBob3JlIG1iZndfc2VtYSA9IE1VVEVYOw0KI2lm
ZGVmIF9fU01QX18NCnN0YXRpYyByd2xvY2tfdCBtYmZ3X2xvY2sgPSBSV19M
T0NLX1VOTE9DS0VEOw0KI2VuZGlmDQoNCnN0YXRpYyBzdHJ1Y3QgaXBfbWFz
cV9tYmZ3ICppcF9tYXNxX21iZndfdGFibGVbSVBfTUFTUV9NQkZXX0hTSVpF
XTsNCg0Kc3RhdGljIF9faW5saW5lX18gaW50IG1iZndfaGFzaF92YWwoaW50
IGZ3bWFyaykNCnsNCglyZXR1cm4gZndtYXJrICYgMHgwZjsNCn0NCg0KLyoN
CiAqCUdldCBtLWVudHJ5IGJ5ICJmd21hcmsiDQogKglDYWxsZXIgbXVzdCBs
b2NrIHRhYmxlcy4NCiAqLw0KDQpzdGF0aWMgc3RydWN0IGlwX21hc3FfbWJm
dyAqX19tYmZ3X2dldChpbnQgZndtYXJrKQ0Kew0KCXN0cnVjdCBpcF9tYXNx
X21iZncqIG1iZnc7DQoJaW50IGhhc2ggPSBtYmZ3X2hhc2hfdmFsKGZ3bWFy
ayk7DQoNCglmb3IgKG1iZnc9aXBfbWFzcV9tYmZ3X3RhYmxlW2hhc2hdO21i
Znc7bWJmdz1tYmZ3LT5uZXh0KSB7DQoJCWlmIChtYmZ3LT5md21hcms9PWZ3
bWFyaykgew0KCQkJZ290byBvdXQ7DQoJCX0NCgl9DQpvdXQ6DQoJcmV0dXJu
IG1iZnc7DQp9DQoNCi8qDQogKglMaW5rcyBtLWVudHJ5Lg0KICoJQ2FsbGVy
IHNob3VsZCBoYXZlIGNoZWNrZWQgaWYgYWxyZWFkeSBwcmVzZW50IGZvciBz
YW1lIGZ3bWFyaw0KICoNCiAqCUNhbGxlciBtdXN0IGxvY2sgdGFibGVzLg0K
ICovDQpzdGF0aWMgaW50IF9fbWJmd19hZGQoc3RydWN0IGlwX21hc3FfbWJm
dyAqbWJmdykNCnsNCglpbnQgZndtYXJrID0gbWJmdy0+ZndtYXJrOw0KCWlu
dCBoYXNoID0gbWJmd19oYXNoX3ZhbChmd21hcmspOw0KDQoJbWJmdy0+bmV4
dCA9IGlwX21hc3FfbWJmd190YWJsZVtoYXNoXTsNCglpcF9tYXNxX21iZndf
dGFibGVbaGFzaF0gPSBtYmZ3Ow0KCWlwX21hc3FfbW9kX2luY19uZW50KG1t
b2Rfc2VsZik7DQoNCglyZXR1cm4gMDsNCn0NCg0KLyoNCiAqCUNyZWF0ZXMg
YSBtLWVudHJ5IChkb2Vzbid0IGxpbmsgaXQpDQogKi8NCg0Kc3RhdGljIHN0
cnVjdCBpcF9tYXNxX21iZncgKiBtYmZ3X25ldyhpbnQgZndtYXJrKQ0Kew0K
CXN0cnVjdCBpcF9tYXNxX21iZncgKm1iZnc7DQoNCgltYmZ3ID0ga21hbGxv
YyhzaXplb2YoKm1iZncpLCBHRlBfS0VSTkVMKTsNCglpZiAobWJmdyA9PSBO
VUxMKSANCgkJZ290byBvdXQ7DQoNCglNT0RfSU5DX1VTRV9DT1VOVDsNCglt
ZW1zZXQobWJmdywgMCwgc2l6ZW9mKCptYmZ3KSk7DQoJbWJmdy0+ZndtYXJr
ID0gZndtYXJrOw0KI2lmZGVmIF9fU01QX18NCgltYmZ3LT5sb2NrID0gKHJ3
bG9ja190KSBSV19MT0NLX1VOTE9DS0VEOw0KI2VuZGlmDQoNCglJTklUX0xJ
U1RfSEVBRCgmbWJmdy0+aG9zdHMpOw0Kb3V0Og0KCXJldHVybiBtYmZ3Ow0K
fQ0KDQpzdGF0aWMgdm9pZCBtYmZ3X2hvc3RfdG9fdXNlcihzdHJ1Y3QgaXBf
bWFzcV9tYmZ3X2hvc3QgKmgsIHN0cnVjdCBpcF9tYmZ3X3VzZXIgKm11KQ0K
ew0KCW11LT5sbWFkZHIgPSBoLT5sbWFkZHI7DQoJbXUtPnJhZGRyID0gaC0+
YWRkcjsNCgltdS0+cnBvcnQgPSBoLT5wb3J0Ow0KCW11LT5md21hcmsgPSBo
LT5md21hcms7DQoJbXUtPnByZWYgPSBoLT5wcmVmOw0KfQ0KDQovKg0KICoJ
Q3JlYXRlcyBhIG0uaG9zdCAoZG9lc24ndCBsaW5rIGl0IGluIGEgbS1lbnRy
eSkNCiAqLw0Kc3RhdGljIHN0cnVjdCBpcF9tYXNxX21iZndfaG9zdCAqIG1i
ZndfaG9zdF9uZXcoc3RydWN0IGlwX21iZndfdXNlciAqbXUpDQp7DQoJc3Ry
dWN0IGlwX21hc3FfbWJmd19ob3N0ICogbWJmd19ob3N0Ow0KCW1iZndfaG9z
dCA9IGttYWxsb2Moc2l6ZW9mICgqbWJmd19ob3N0KSwgR0ZQX0tFUk5FTCk7
DQoJaWYgKCFtYmZ3X2hvc3QpDQoJCXJldHVybiBOVUxMOw0KDQoJTU9EX0lO
Q19VU0VfQ09VTlQ7DQoJbWVtc2V0KG1iZndfaG9zdCwgMCwgc2l6ZW9mKCpt
YmZ3X2hvc3QpKTsNCgltYmZ3X2hvc3QtPmFkZHIgPSBtdS0+cmFkZHI7DQoJ
bWJmd19ob3N0LT5wb3J0ID0gbXUtPnJwb3J0Ow0KCW1iZndfaG9zdC0+Zndt
YXJrID0gbXUtPmZ3bWFyazsNCgltYmZ3X2hvc3QtPnByZWYgPSBtdS0+cHJl
ZjsNCgltYmZ3X2hvc3QtPmxtYWRkciA9IG11LT5sbWFkZHI7DQoJYXRvbWlj
X3NldCgmbWJmd19ob3N0LT5wcmVmX2NudCwgbXUtPnByZWYpOw0KDQoJcmV0
dXJuIG1iZndfaG9zdDsNCn0NCg0KLyoNCiAqCUNyZWF0ZSBBTkQgbGluayBt
Lmhvc3QgdG8gbS1lbnRyeS4NCiAqCUl0IGxvY2tzIG0ubG9jay4NCiAqLw0K
c3RhdGljIGludCBtYmZ3X2FkZGhvc3Qoc3RydWN0IGlwX21hc3FfbWJmdyAq
bWJmdywgc3RydWN0IGlwX21iZndfdXNlciAqbXUsIGludCBhdHRhaWwpDQp7
DQoJc3RydWN0IGlwX21hc3FfbWJmd19ob3N0ICptYmZ3X2hvc3Q7DQoNCglt
YmZ3X2hvc3QgPSBtYmZ3X2hvc3RfbmV3KG11KTsNCglpZiAoIW1iZndfaG9z
dCkgDQoJCXJldHVybiAtRU5PTUVNOw0KDQoJd3JpdGVfbG9ja19iaCgmbWJm
dy0+bG9jayk7DQoJbGlzdF9hZGQoJm1iZndfaG9zdC0+bGlzdCwgYXR0YWls
PyBtYmZ3LT5ob3N0cy5wcmV2IDogJm1iZnctPmhvc3RzKTsNCglhdG9taWNf
aW5jKCZtYmZ3LT5uaG9zdHMpOw0KCXdyaXRlX3VubG9ja19iaCgmbWJmdy0+
bG9jayk7DQoNCglyZXR1cm4gMDsNCn0NCg0KLyoNCiAqCVVubGluayBBTkQg
ZGVzdHJveSBtLmhvc3QocykgZnJvbSBtLWVudHJ5Lg0KICoJV2lsZGNhcmQg
KG51bCBob3N0IG9yIGFkZHIpIG9rLg0KICoJSXQgdXNlcyBtLmxvY2suDQog
Ki8NCnN0YXRpYyBpbnQgbWJmd19kZWxob3N0KHN0cnVjdCBpcF9tYXNxX21i
ZncgKm1iZncsIHN0cnVjdCBpcF9tYmZ3X3VzZXIgKm11KQ0Kew0KDQoJc3Ry
dWN0IGxpc3RfaGVhZCAqbCwqZTsNCglzdHJ1Y3QgaXBfbWFzcV9tYmZ3X2hv
c3QgKmg7DQoJaW50IG5fZGVsID0gMDsNCglsID0gJm1iZnctPmhvc3RzOw0K
DQoJd3JpdGVfbG9ja19iaCgmbWJmdy0+bG9jayk7DQoJZm9yIChlPWwtPm5l
eHQ7IGUhPWw7IGU9ZS0+bmV4dCkNCgl7DQoJCWggPSBsaXN0X2VudHJ5KGUs
IHN0cnVjdCBpcF9tYXNxX21iZndfaG9zdCwgbGlzdCk7DQoJCWlmICgoIW11
LT5yYWRkciB8fCBoLT5hZGRyID09IG11LT5yYWRkcikgJiYgDQoJCQkoIW11
LT5ycG9ydCB8fCBoLT5wb3J0ID09IG11LT5ycG9ydCkpIHsNCgkJCS8qIEhJ
VCAqLw0KCQkJYXRvbWljX2RlYygmbWJmdy0+bmhvc3RzKTsNCgkJCWxpc3Rf
ZGVsKCZoLT5saXN0KTsNCgkJCWtmcmVlX3MoaCwgc2l6ZW9mKCpoKSk7DQoJ
CQlNT0RfREVDX1VTRV9DT1VOVDsNCgkJCW5fZGVsKys7DQoJCX0NCgkJCQkN
Cgl9DQoJd3JpdGVfdW5sb2NrX2JoKCZtYmZ3LT5sb2NrKTsNCglyZXR1cm4g
bl9kZWw/IDAgOiAtRVNSQ0g7DQp9DQoNCi8qDQogKglDaGFuZ2VzIG0uaG9z
dCBwYXJhbWV0ZXJzDQogKglXaWxkY2FyZHMgb2sNCiAqDQogKglDYWxsZXIg
bXVzdCBsb2NrIHRhYmxlcy4NCiAqLw0Kc3RhdGljIGludCBfX21iZndfZWRp
dGhvc3Qoc3RydWN0IGlwX21hc3FfbWJmdyAqbWJmdywgc3RydWN0IGlwX21i
ZndfdXNlciAqbXUpDQp7DQoNCglzdHJ1Y3QgbGlzdF9oZWFkICpsLCplOw0K
CXN0cnVjdCBpcF9tYXNxX21iZndfaG9zdCAqaDsNCglpbnQgbl9lZGl0ID0g
MDsNCglsID0gJm1iZnctPmhvc3RzOw0KDQoJZm9yIChlPWwtPm5leHQ7IGUh
PWw7IGU9ZS0+bmV4dCkNCgl7DQoJCWggPSBsaXN0X2VudHJ5KGUsIHN0cnVj
dCBpcF9tYXNxX21iZndfaG9zdCwgbGlzdCk7DQoJCWlmICgoIW11LT5yYWRk
ciB8fCBoLT5hZGRyID09IG11LT5yYWRkcikgJiYgDQoJCQkoIW11LT5ycG9y
dCB8fCBoLT5wb3J0ID09IG11LT5ycG9ydCkpIHsNCgkJCS8qIEhJVCAqLw0K
CQkJaC0+cHJlZiA9IG11LT5wcmVmOw0KCQkJYXRvbWljX3NldCgmaC0+cHJl
Zl9jbnQsIG11LT5wcmVmKTsNCgkJCW5fZWRpdCsrOw0KCQl9DQoJCQkJDQoJ
fQ0KCXJldHVybiBuX2VkaXQ/IDAgOiAtRVNSQ0g7DQp9DQoNCi8qDQogKglE
ZXN0cm95cyBtLWVudHJ5Lg0KICoJQ2FsbGVyIG11c3QgaGF2ZSBjaGVja2Vk
IHRoYXQgaXQgZG9lc24ndCBob2xkIGFueSBtLmhvc3QocykNCiAqLw0Kc3Rh
dGljIHZvaWQgbWJmd19kZXN0cm95KHN0cnVjdCBpcF9tYXNxX21iZncgKm1i
ZncpDQp7DQoJa2ZyZWVfcyhtYmZ3LCBzaXplb2YoKm1iZncpKTsNCglNT0Rf
REVDX1VTRV9DT1VOVDsNCn0NCg0KLyogDQogKglVbmxpbmsgbS1lbnRyeS4N
CiAqDQogKglDYWxsZXIgbXVzdCBsb2NrIHRhYmxlcy4NCiAqLw0Kc3RhdGlj
IGludCBfX21iZndfZGVsKHN0cnVjdCBpcF9tYXNxX21iZncgKm1iZncpDQp7
DQoJc3RydWN0IGlwX21hc3FfbWJmdyAqKm1iZndfcDsNCglpbnQgcmV0ID0g
LUVJTlZBTDsNCg0KDQoJZm9yKG1iZndfcD0maXBfbWFzcV9tYmZ3X3RhYmxl
W21iZndfaGFzaF92YWwobWJmdy0+ZndtYXJrKV07IA0KCQkJKm1iZndfcDsg
DQoJCQltYmZ3X3AgPSAmKCgqbWJmd19wKS0+bmV4dCkpIA0KCXsNCgkJaWYg
KG1iZnc9PSgqbWJmd19wKSkgew0KCQkJKm1iZndfcCA9IG1iZnctPm5leHQ7
DQoJCQlpcF9tYXNxX21vZF9kZWNfbmVudChtbW9kX3NlbGYpOw0KCQkJcmV0
ID0gMDsNCgkJCWdvdG8gb3V0Ow0KCQl9DQoJfQ0Kb3V0Og0KCXJldHVybiBy
ZXQ7DQp9DQoNCi8qDQogKglDcnVkZSBtLmhvc3Qgc2NoZWR1bGVyDQogKglU
aGlzIGludGVyZmFjZSBjb3VsZCBiZSBleHBvcnRlZCB0byBhbGxvdyBwbGF5
aW5nIHdpdGggDQogKglvdGhlciBzY2hlZCBwb2xpY2llcy4NCiAqDQogKglD
YWxsZXIgbXVzdCBsb2NrIG0tZW50cnkuDQogKi8NCnN0YXRpYyBzdHJ1Y3Qg
aXBfbWFzcV9tYmZ3X2hvc3QgKiBfX21iZndfc2NoZWQoc3RydWN0IGlwX21h
c3FfbWJmdyAqbWJmdywgaW50IGZvcmNlKQ0Kew0KCXN0cnVjdCBpcF9tYXNx
X21iZndfaG9zdCAqaCA9IE5VTEw7DQoNCglpZiAoYXRvbWljX3JlYWQoJm1i
ZnctPm5ob3N0cykgPT0gMCkNCgkJZ290byBvdXQ7DQoNCgkvKg0KCSAqCUhl
cmUgcmVzaWRlcyBhY3R1YWwgc2NoZWQgcG9saWN5OiANCgkgKglXaGVuIHBy
ZWZfY250IHRvdWNoZXMgMCwgZW50cnkgZ2V0cyBzaGlmdGVkIHRvIHRhaWwg
YW5kDQoJICoJaXRzIHByZWZfY250IHJlbG9hZGVkIGZyb20gaC0+cHJlZiAo
YWN0dWFsIHZhbHVlDQoJICoJcGFzc2VkIGZyb20gdS1zcGFjZSkuDQoJICoN
CgkgKglFeGNlcHRpb24gaXMgcHJlZj09MDogYXZvaWQgc2NoZWR1bGluZy4N
CgkgKi8NCg0KCWggPSBsaXN0X2VudHJ5KG1iZnctPmhvc3RzLm5leHQsIHN0
cnVjdCBpcF9tYXNxX21iZndfaG9zdCwgbGlzdCk7DQoNCglpZiAoYXRvbWlj
X3JlYWQoJm1iZnctPm5ob3N0cykgPD0gMSkNCgkJZ290byBvdXQ7DQoNCglp
ZiAoKGgtPnByZWYgJiYgYXRvbWljX2RlY19hbmRfdGVzdCgmaC0+cHJlZl9j
bnQpKSB8fCBmb3JjZSkgew0KCQlhdG9taWNfc2V0KCZoLT5wcmVmX2NudCwg
aC0+cHJlZik7DQoJCWxpc3RfZGVsKCZoLT5saXN0KTsNCgkJbGlzdF9hZGQo
JmgtPmxpc3QsIG1iZnctPmhvc3RzLnByZXYpOw0KCX0NCm91dDoNCglyZXR1
cm4gaDsNCn0NCg0KLyoNCiAqCU1haW4gbG9va3VwIHJvdXRpbmUuDQogKglI
SVRzIGZ3bWFyayBhbmQgc2NoZWR1bGVzIG0uaG9zdCBlbnRyaWVzIGlmIHJl
cXVpcmVkDQogKi8NCnN0YXRpYyBzdHJ1Y3QgaXBfbWFzcV9tYmZ3X2hvc3Qg
KiBtYmZ3X2xvb2t1cChpbnQgZndtYXJrKQ0Kew0KCXN0cnVjdCBpcF9tYXNx
X21iZncgKm1iZnc7DQoJc3RydWN0IGlwX21hc3FfbWJmd19ob3N0ICpoID0g
TlVMTDsNCg0KCXJlYWRfbG9jaygmbWJmd19sb2NrKTsNCgltYmZ3ID0gX19t
YmZ3X2dldChmd21hcmspOw0KDQoJaWYgKG1iZncpIHsNCgkJd3JpdGVfbG9j
aygmbWJmdy0+bG9jayk7DQoJCWggPSBfX21iZndfc2NoZWQobWJmdywgMCk7
DQoJCXdyaXRlX3VubG9jaygmbWJmdy0+bG9jayk7DQoJfQ0KDQoJcmVhZF91
bmxvY2soJm1iZndfbG9jayk7DQoJcmV0dXJuIGg7DQp9DQoNCiNpZmRlZiBD
T05GSUdfUFJPQ19GUw0Kc3RhdGljIGludCBtYmZ3X3Byb2NpbmZvKGNoYXIg
KmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsDQoJCQkgICAg
ICBpbnQgbGVuZ3RoLCBpbnQgZHVtbXkpDQp7DQoJc3RydWN0IGlwX21hc3Ff
bWJmdyAqbWJmdzsNCglzdHJ1Y3QgaXBfbWFzcV9tYmZ3X2hvc3QgKmg7DQoJ
c3RydWN0IGxpc3RfaGVhZCAqbCwqZTsNCglvZmZfdCBwb3M9MCwgYmVnaW47
DQoJY2hhciB0ZW1wWzEyOV07DQogICAgICAgIGludCBpZHggPSAwOw0KCWlu
dCBsZW49MDsNCg0KCU1PRF9JTkNfVVNFX0NPVU5UOw0KDQoJSVBfTUFTUV9E
RUJVRygxLWRlYnVnLCAiRW50ZXJlZCBtYmZ3X2luZm9cbiIpOw0KDQoJaWYg
KG9mZnNldCA8IDY0KQ0KCXsNCiAgICAgICAgICAgICAgICBzcHJpbnRmKHRl
bXAsICJGd01hcmsgPiBSQWRkciAgICBSUG9ydCBQckNudCAgUHJlZiIpOw0K
CQlsZW4gPSBzcHJpbnRmKGJ1ZmZlciwgIiUtNjNzXG4iLCB0ZW1wKTsNCgl9
DQoJcG9zID0gNjQ7DQoNCiAgICAgICAgZm9yKGlkeCA9IDA7IGlkeCA8IElQ
X01BU1FfTUJGV19IU0laRTsgaWR4KyspDQoJew0KCQlyZWFkX2xvY2soJm1i
ZndfbG9jayk7DQoJCWZvcihtYmZ3ID0gaXBfbWFzcV9tYmZ3X3RhYmxlW2lk
eF07IG1iZncgOyBtYmZ3ID0gbWJmdy0+bmV4dCkNCgkJew0KCQkJcmVhZF9s
b2NrX2JoKCZtYmZ3LT5sb2NrKTsNCgkJCWw9Jm1iZnctPmhvc3RzOw0KDQoJ
CQlmb3IoZT1sLT5uZXh0O2whPWU7ZT1lLT5uZXh0KSB7DQoJCQkJaCA9IGxp
c3RfZW50cnkoZSwgc3RydWN0IGlwX21hc3FfbWJmd19ob3N0LCBsaXN0KTsN
CgkJCQlwb3MgKz0gNjQ7DQoJCQkJaWYgKHBvcyA8PSBvZmZzZXQpIHsNCgkJ
CQkJbGVuID0gMDsNCgkJCQkJY29udGludWU7DQoJCQkJfQ0KDQoJCQkJc3By
aW50Zih0ZW1wLCIweCV4ID4gJTA4bFggJTV1ICUwOGxYICU1ZCAlNWQiLA0K
CQkJCQkJaC0+ZndtYXJrLA0KCQkJCQkJbnRvaGwoaC0+YWRkciksIG50b2hz
KGgtPnBvcnQpLA0KCQkJCQkJbnRvaGwoaC0+bG1hZGRyKSwgYXRvbWljX3Jl
YWQoJmgtPnByZWZfY250KSwgaC0+cHJlZik7DQoJCQkJbGVuICs9IHNwcmlu
dGYoYnVmZmVyK2xlbiwgIiUtNjNzXG4iLCB0ZW1wKTsNCg0KCQkJCWlmKGxl
biA+PSBsZW5ndGgpIHsNCgkJCQkJcmVhZF91bmxvY2tfYmgoJm1iZnctPmxv
Y2spOw0KCQkJCQlyZWFkX3VubG9jaygmbWJmd19sb2NrKTsNCgkJCQkJZ290
byBkb25lOw0KCQkJCX0NCgkJCX0NCgkJCXJlYWRfdW5sb2NrX2JoKCZtYmZ3
LT5sb2NrKTsNCgkJfQ0KCQlyZWFkX3VubG9jaygmbWJmd19sb2NrKTsNCgl9
DQoNCmRvbmU6DQoNCglpZiAobGVuKSB7DQoJCWJlZ2luID0gbGVuIC0gKHBv
cyAtIG9mZnNldCk7DQoJCSpzdGFydCA9IGJ1ZmZlciArIGJlZ2luOw0KCQls
ZW4gLT0gYmVnaW47DQoJfQ0KCWlmKGxlbj5sZW5ndGgpDQoJCWxlbiA9IGxl
bmd0aDsNCglNT0RfREVDX1VTRV9DT1VOVDsNCglyZXR1cm4gbGVuOw0KfQ0K
c3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSBtYmZ3X3Byb2NfZW50cnkg
PSB7DQovKiAJCTAsIDAsIE5VTEwiLCAqLw0KCQkwLCA0LCAibWJmdyIsDQoJ
CVNfSUZSRUcgfCBTX0lSVUdPLCAxLCAwLCAwLA0KCQkwLCAmcHJvY19uZXRf
aW5vZGVfb3BlcmF0aW9ucywNCgkJbWJmd19wcm9jaW5mbw0KfTsNCg0KI2Rl
ZmluZSBwcm9jX2VudCAmbWJmd19wcm9jX2VudHJ5DQojZWxzZSAvKiAhQ09O
RklHX1BST0NfRlMgKi8NCg0KI2RlZmluZSBwcm9jX2VudCBOVUxMDQojZW5k
aWYNCg0KDQpzdGF0aWMgdm9pZCBtYmZ3X2ZsdXNoKHZvaWQpDQp7DQoJc3Ry
dWN0IGlwX21hc3FfbWJmdyAqbWJmdywgKmxvY2FsX3RhYmxlW0lQX01BU1Ff
TUJGV19IU0laRV07DQoJc3RydWN0IGlwX21hc3FfbWJmd19ob3N0ICpoOw0K
CXN0cnVjdCBpcF9tYXNxX21iZncgKm1iZndfbmV4dDsNCglpbnQgaWR4Ow0K
CXN0cnVjdCBsaXN0X2hlYWQgKmwsKmU7DQoNCgl3cml0ZV9sb2NrX2JoKCZt
YmZ3X2xvY2spOw0KCW1lbWNweShsb2NhbF90YWJsZSwgaXBfbWFzcV9tYmZ3
X3RhYmxlLCBzaXplb2YgaXBfbWFzcV9tYmZ3X3RhYmxlKTsNCgltZW1zZXQo
aXBfbWFzcV9tYmZ3X3RhYmxlLCAwLCBzaXplb2YgaXBfbWFzcV9tYmZ3X3Rh
YmxlKTsNCgl3cml0ZV91bmxvY2tfYmgoJm1iZndfbG9jayk7DQoNCgkvKg0K
CSAqCUZvciBldmVyeSBoYXNoIHRhYmxlIHJvdyAuLi4NCgkgKi8NCglmb3Io
aWR4PTA7aWR4PElQX01BU1FfTUJGV19IU0laRTtpZHgrKykgew0KDQoJCS8q
DQoJCSAqCUZvciBldmVyeSBtLWVudHJ5IGluIHJvdyAuLi4NCgkJICovDQoJ
CWZvcihtYmZ3PWxvY2FsX3RhYmxlW2lkeF07bWJmdzttYmZ3PW1iZndfbmV4
dCkgew0KCQkJLyoNCgkJCSAqCUZvciBldmVyeSBtLmhvc3QgaW4gbS1lbnRy
eSAuLi4NCgkJCSAqLw0KCQkJbD0mbWJmdy0+aG9zdHM7DQoJCQl3aGlsZSgo
ZT1sLT5uZXh0KSAhPSBsKSB7DQoJCQkJaCA9IGxpc3RfZW50cnkoZSwgc3Ry
dWN0IGlwX21hc3FfbWJmd19ob3N0LCBsaXN0KTsNCgkJCQlhdG9taWNfZGVj
KCZtYmZ3LT5uaG9zdHMpOw0KCQkJCWxpc3RfZGVsKCZoLT5saXN0KTsNCgkJ
CQlrZnJlZV9zKGgsIHNpemVvZigqaCkpOw0KCQkJCU1PRF9ERUNfVVNFX0NP
VU5UOw0KCQkJfQ0KDQoJCQlpZiAoYXRvbWljX3JlYWQoJm1iZnctPm5ob3N0
cykpIHsNCgkJCQlJUF9NQVNRX0VSUigibWJmd19mbHVzaCgpOiBhZnRlciBm
bHVzaGluZyByb3cgbmhvc3RzPSVkXG4iLA0KCQkJCQkJYXRvbWljX3JlYWQo
Jm1iZnctPm5ob3N0cykpOw0KCQkJfQ0KCQkJbWJmd19uZXh0ID0gbWJmdy0+
bmV4dDsNCgkJCWtmcmVlX3MobWJmdywgc2l6ZW9mKCptYmZ3KSk7CQ0KCQkJ
TU9EX0RFQ19VU0VfQ09VTlQ7DQoJCQlpcF9tYXNxX21vZF9kZWNfbmVudCht
bW9kX3NlbGYpOw0KCQl9DQoJfQ0KfQ0KDQovKg0KICoJVXNlciBzcGFjZSBj
b250cm9sIGVudHJ5IHBvaW50DQogKi8NCnN0YXRpYyBpbnQgbWJmd19jdGwo
aW50IG9wdG5hbWUsIHN0cnVjdCBpcF9tYXNxX2N0bCAqbWN0bCwgaW50IG9w
dGxlbikNCnsNCiAgICAgICAgc3RydWN0IGlwX21iZndfdXNlciAqbXUgPSAg
Jm1jdGwtPnUubWJmd191c2VyOw0KCXN0cnVjdCBpcF9tYXNxX21iZncgKm1i
Znc7DQoJaW50IHJldCA9IEVJTlZBTDsNCglpbnQgYXJnbGVuID0gb3B0bGVu
IC0gSVBfTUFTUV9DVExfQlNJWkU7DQoJaW50IGNtZDsNCg0KDQoJSVBfTUFT
UV9ERUJVRygxLWRlYnVnLCAiaXBfbWFzcV91c2VyX2N0bChsZW49JWQvJWR8
JWQvJWQpXG4iLA0KCQlhcmdsZW4sDQoJCXNpemVvZiAoKm11KSwNCgkJb3B0
bGVuLA0KCQlzaXplb2YgKCptY3RsKSk7DQoNCgkvKg0KCSAqCWNoZWNrcyAu
Li4NCgkgKi8NCglpZiAoYXJnbGVuICE9IHNpemVvZigqbXUpICYmIG9wdGxl
biAhPSBzaXplb2YoKm1jdGwpKSANCgkJcmV0dXJuIC1FSU5WQUw7DQogDQoJ
LyogDQoJICoJRG9uJ3QgdHJ1c3QgdGhlIGx1c2VycyAtIHBsZW50eSBvZiBl
cnJvciBjaGVja2luZyEgDQoJICovDQoJY21kID0gbWN0bC0+bV9jbWQ7DQoJ
SVBfTUFTUV9ERUJVRygxLWRlYnVnLCAiaXBfbWFzcV9tYmZ3X2N0bChjbWQ9
JWQsIGZ3bWFyaz0lZClcbiIsDQoJCQljbWQsIG11LT5md21hcmspOw0KDQoN
Cglzd2l0Y2goY21kKSB7DQoJCWNhc2UgSVBfTUFTUV9DTURfTk9ORToNCgkJ
CXJldHVybiAwOw0KCQljYXNlIElQX01BU1FfQ01EX0ZMVVNIOg0KCQkJYnJl
YWs7DQoJCWNhc2UgSVBfTUFTUV9DTURfQUREOg0KCQljYXNlIElQX01BU1Ff
Q01EX0lOU0VSVDoNCgkJY2FzZSBJUF9NQVNRX0NNRF9TRVQ6DQoJCQlpZiAo
bXUtPmZ3bWFyayA9PSAwKSB7DQoJCQkJSVBfTUFTUV9ERUJVRygxLWRlYnVn
LCAiaW52YWxpZCBmd21hcms9PTBcbiIpOw0KCQkJCXJldHVybiAtRUlOVkFM
Ow0KCQkJfQ0KCQkJaWYgKG11LT5wcmVmIDwgMCkgew0KCQkJCUlQX01BU1Ff
REVCVUcoMS1kZWJ1ZywgImludmFsaWQgcHJlZj09JWRcbiIsDQoJCQkJCW11
LT5wcmVmKTsNCgkJCQlyZXR1cm4gLUVJTlZBTDsNCgkJCX0NCgkJCWJyZWFr
Ow0KCX0NCg0KDQoJcmV0ID0gLUVJTlZBTDsNCg0KCXN3aXRjaChjbWQpIHsN
CgljYXNlIElQX01BU1FfQ01EX0FERDoNCgljYXNlIElQX01BU1FfQ01EX0lO
U0VSVDoNCgkJaWYgKCFtdS0+cmFkZHIgfHwgIW11LT5sbWFkZHIpIHsNCgkJ
CUlQX01BU1FfREVCVUcoMC1kZWJ1ZywgImlwX21hc3FfbWJmd19jdGwoQURE
KTogaW52YWxpZCByZWRpcmVjdCAweCV4OiVkXG4iLA0KCQkJCQltdS0+cmFk
ZHIsIG11LT5ycG9ydCk7DQoJCQlnb3RvIG91dDsNCgkJfQ0KDQoJCS8qDQoJ
CSAqCUNhbm5vdCBqdXN0IHVzZSBtYmZ3X2xvY2sgYmVjYXVzZSBiZWxvdw0K
CQkgKglhcmUgYWxsb2NhdGlvbnMgdGhhdCBjYW4gc2xlZXA7IHNvDQoJCSAq
CXRvIGFzc3VyZSAibmV3IGVudHJ5IiBhdG9taWMgY3JlYXRpb24NCgkJICoJ
SSB1c2UgYSBzZW1hcGhvcmUuDQoJCSAqDQoJCSAqLw0KCQlkb3duKCZtYmZ3
X3NlbWEpOw0KDQoJCXJlYWRfbG9jaygmbWJmd19sb2NrKTsNCgkJbWJmdyA9
IF9fbWJmd19nZXQobXUtPmZ3bWFyayk7DQoJCXJlYWRfdW5sb2NrKCZtYmZ3
X2xvY2spOw0KCQkNCgkJLyoNCgkJICoJSWYgZmlyc3QgaG9zdCwgY3JlYXRl
IG0tZW50cnkNCgkJICovDQoJCWlmIChtYmZ3ID09IE5VTEwpIHsNCgkJCW1i
ZncgPSBtYmZ3X25ldyhtdS0+ZndtYXJrKTsNCgkJCWlmIChtYmZ3ID09IE5V
TEwpIA0KCQkJCXJldCA9IC1FTk9NRU07DQoJCX0gDQoNCgkJaWYgKG1iZncp
IHsNCgkJCS8qDQoJCQkgKglQdXQgbS5ob3N0IGluIG0tZW50cnkuDQoJCQkg
Ki8NCgkJCXJldCA9IG1iZndfYWRkaG9zdChtYmZ3LCBtdSwgY21kID09IElQ
X01BU1FfQ01EX0FERCk7DQoNCgkJCS8qDQoJCQkgKglJZiBmaXJzdCBob3N0
LCBsaW5rIG0tZW50cnkgdG8gaGFzaCB0YWJsZS4NCgkJCSAqCUFscmVhZHkg
cHJvdGVjdGVkIGJ5IGdsb2JhbCBsb2NrLg0KCQkJICovDQoJCQlpZiAocmV0
ID09IDAgJiYgYXRvbWljX3JlYWQoJm1iZnctPm5ob3N0cykgPT0gMSkgIHsN
CgkJCQl3cml0ZV9sb2NrX2JoKCZtYmZ3X2xvY2spOw0KCQkJCV9fbWJmd19h
ZGQobWJmdyk7DQoJCQkJd3JpdGVfdW5sb2NrX2JoKCZtYmZ3X2xvY2spOw0K
CQkJfSANCgkJCWlmIChhdG9taWNfcmVhZCgmbWJmdy0+bmhvc3RzKSA9PSAw
KSB7DQoJCQkJbWJmd19kZXN0cm95KG1iZncpOw0KCQkJfQ0KCQl9DQoNCgkJ
dXAoJm1iZndfc2VtYSk7DQoNCgkJYnJlYWs7DQoNCgljYXNlIElQX01BU1Ff
Q01EX0RFTDoNCgkJZG93bigmbWJmd19zZW1hKTsNCg0KCQlyZWFkX2xvY2so
Jm1iZndfbG9jayk7DQoJCW1iZncgPSBfX21iZndfZ2V0KG11LT5md21hcmsp
Ow0KCQlyZWFkX3VubG9jaygmbWJmd19sb2NrKTsNCg0KCQlpZiAobWJmdykg
ew0KCQkJcmV0ID0gbWJmd19kZWxob3N0KG1iZncsIG11KTsNCg0KCQkJLyoN
CgkJCSAqCUxhc3QgbGVhc2Ugd2lsbCBmcmVlDQoJCQkgKglYWFggY2hlY2sg
bG9naWMgWFhYDQoJCQkgKi8NCgkJCWlmIChhdG9taWNfcmVhZCgmbWJmdy0+
bmhvc3RzKSA9PSAwKSB7DQoJCQkJd3JpdGVfbG9ja19iaCgmbWJmd19sb2Nr
KTsNCgkJCQlfX21iZndfZGVsKG1iZncpOw0KCQkJCXdyaXRlX3VubG9ja19i
aCgmbWJmd19sb2NrKTsNCgkJCQltYmZ3X2Rlc3Ryb3kobWJmdyk7DQoJCQl9
DQoJCX0gZWxzZSANCgkJCXJldCA9IC1FU1JDSDsNCg0KCQl1cCgmbWJmd19z
ZW1hKTsNCgkJYnJlYWs7DQoJY2FzZSBJUF9NQVNRX0NNRF9GTFVTSDoNCg0K
CQlkb3duKCZtYmZ3X3NlbWEpOw0KCQltYmZ3X2ZsdXNoKCk7DQoJCXVwKCZt
YmZ3X3NlbWEpOw0KCQlyZXQgPSAwOw0KCQlicmVhazsNCgljYXNlIElQX01B
U1FfQ01EX1NFVDoNCgkJLyoNCgkJICoJTm8gbmVlZCB0byBzZW1hcGhvcml6
ZSBoZXJlLCBtYWluIGxpc3QgaXMgbm90IA0KCQkgKgltb2RpZmllZC4NCgkJ
ICovDQoJCXJlYWRfbG9jaygmbWJmd19sb2NrKTsNCgkJDQoJCW1iZncgPSBf
X21iZndfZ2V0KG11LT5md21hcmspOw0KCQlpZiAobWJmdykgew0KCQkJd3Jp
dGVfbG9ja19iaCgmbWJmdy0+bG9jayk7DQoJCQkNCgkJCWlmIChtdS0+Zmxh
Z3MgJiBJUF9NQVNRX01GV19TQ0hFRCkgew0KCQkJCXN0cnVjdCBpcF9tYXNx
X21iZndfaG9zdCAqaDsNCgkJCQlpZiAoKGg9X19tYmZ3X3NjaGVkKG1iZncs
IDEpKSkgew0KCQkJCQltYmZ3X2hvc3RfdG9fdXNlcihoLCBtdSk7DQoJCQkJ
CXJldCA9IDA7DQoJCQkJfSANCgkJCX0gZWxzZSB7DQoJCQkJcmV0ID0gX19t
YmZ3X2VkaXRob3N0KG1iZncsIG11KTsNCgkJCX0NCgkJCQkNCgkJCXdyaXRl
X3VubG9ja19iaCgmbWJmdy0+bG9jayk7DQoJCX0NCg0KCQlyZWFkX3VubG9j
aygmbWJmd19sb2NrKTsNCgkJYnJlYWs7DQoJfQ0Kb3V0Og0KCQ0KCXJldHVy
biByZXQ7DQp9DQoNCi8qDQogKglNb2R1bGUgc3R1YnMgY2FsbGVkIGZyb20g
aXBfbWFzcSBjb3JlIG1vZHVsZQ0KICovDQogDQovKg0KICoJSW5wdXQgcnVs
ZSBzdHViLCBjYWxsZWQgdmVyeSBlYXJseSBmb3IgZWFjaCBpbmNvbWluZyBw
YWNrZXQsIA0KICoJdG8gc2VlIGlmIHRoaXMgbW9kdWxlIGhhcyAiaW50ZXJl
c3QiIGluIHBhY2tldC4NCiAqLw0Kc3RhdGljIGludCBtYmZ3X2luX3J1bGUo
Y29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IGlwaGRy
ICppcGgpDQp7DQoJaW50IHZhbDsNCglyZWFkX2xvY2soJm1iZndfbG9jayk7
DQoJdmFsID0gKCBfX21iZndfZ2V0KHNrYi0+ZndtYXJrKSAhPSAwKTsNCgly
ZWFkX3VubG9jaygmbWJmd19sb2NrKTsNCglyZXR1cm4gdmFsOw0KfQ0KDQov
Kg0KICoJSW5wdXQtY3JlYXRlIHN0dWIsIGNhbGxlZCB0byBhbGxvdyAiY3Vz
dG9tIiBtYXNxIGNyZWF0aW9uDQogKi8NCnN0YXRpYyBzdHJ1Y3QgaXBfbWFz
cSAqIG1iZndfaW5fY3JlYXRlKGNvbnN0IHN0cnVjdCBza19idWZmICpza2Is
IGNvbnN0IHN0cnVjdCBpcGhkciAqaXBoLCBfX3UzMiBtYWRkcikNCnsNCgl1
bmlvbiBpcF9tYXNxX3RwaGRyIHRwaDsNCglzdHJ1Y3QgaXBfbWFzcSAqbXMg
PSBOVUxMOw0KCXN0cnVjdCBpcF9tYXNxX21iZndfaG9zdCAqaCA9IE5VTEw7
DQoNCgl0cGgucmF3ID0gKGNoYXIqKSBpcGggKyBpcGgtPmlobCAqIDQ7DQoN
Cglzd2l0Y2ggKGlwaC0+cHJvdG9jb2wpIHsNCgkJY2FzZSBJUFBST1RPX1RD
UDoNCgkJCS8qIAkNCgkJCSAqCU9ubHkgb3BlbiBUQ1AgdHVubmVsIGlmIFNZ
TishQUNLIHBhY2tldA0KCQkJICovDQoJCQlpZiAoIXRwaC50aC0+c3luICYm
IHRwaC50aC0+YWNrKQ0KCQkJCXJldHVybiBOVUxMOw0KCQljYXNlIElQUFJP
VE9fVURQOg0KCQkJYnJlYWs7DQoJCWRlZmF1bHQ6DQoJCQlyZXR1cm4gTlVM
TDsNCgl9DQoNCgkvKiANCgkgKglJZiBubyBlbnRyeSBleGlzdHMgaW4gdGhl
IG1hc3F1ZXJhZGluZyB0YWJsZQ0KIAkgKiAJYW5kIHRoZSBwb3J0IGlzIGlu
dm9sdmVkDQoJICogIAlpbiBwb3J0IGZvcndhcmRpbmcsIGNyZWF0ZSBhIG5l
dyBtYXNxIGVudHJ5IA0KCSAqLw0KDQoJaWYgKChoPW1iZndfbG9va3VwKHNr
Yi0+ZndtYXJrKSkpIHsNCgkJbXMgPSBpcF9tYXNxX25ldzIoaXBoLT5wcm90
b2NvbCwNCgkJCQlpcGgtPmRhZGRyLCB0cGgucG9ydHBbMV0sCQ0KCQkJCS8q
IGlmIG5vIHJlZGlyLXBvcnQsIHVzZSBwYWNrZXQgZGVzdCBwb3J0ICovDQoJ
CQkJaC0+YWRkciwgaC0+cG9ydD8gaC0+cG9ydCA6IHRwaC5wb3J0cFsxXSwN
CgkJCQlpcGgtPnNhZGRyLCB0cGgucG9ydHBbMF0sDQoJCQkJSVBfTUFTUV9G
X0JJRElSLCBoLT5sbWFkZHIpOw0KDQoJCWlmIChtcyAhPSBOVUxMKQ0KCQkJ
aXBfbWFzcV9saXN0ZW4obXMpOw0KCX0NCglyZXR1cm4gbXM7DQp9DQoNCg0K
I2RlZmluZSBtYmZ3X2luX3VwZGF0ZQlOVUxMDQojZGVmaW5lIG1iZndfb3V0
X3J1bGUJTlVMTA0KI2RlZmluZSBtYmZ3X291dF9jcmVhdGUJTlVMTA0KI2Rl
ZmluZSBtYmZ3X291dF91cGRhdGUJTlVMTA0KDQpzdGF0aWMgc3RydWN0IGlw
X21hc3FfbW9kIG1iZndfbW9kID0gew0KCU5VTEwsCQkJLyogbmV4dCAqLw0K
CU5VTEwsCQkJLyogbmV4dF9yZWcgKi8NCgkibWJmdyIsCQkvKiBuYW1lICov
DQoJQVRPTUlDX0lOSVQoMCksCQkvKiBuZW50ICovDQoJQVRPTUlDX0lOSVQo
MCksCQkvKiByZWZjbnQgKi8NCglwcm9jX2VudCwNCgltYmZ3X2N0bCwNCglO
VUxMLAkJCS8qIG1hc3FfbW9kX2luaXQgKi8NCglOVUxMLAkJCS8qIG1hc3Ff
bW9kX2RvbmUgKi8NCgltYmZ3X2luX3J1bGUsDQoJbWJmd19pbl91cGRhdGUs
DQoJbWJmd19pbl9jcmVhdGUsDQoJbWJmd19vdXRfcnVsZSwNCgltYmZ3X291
dF91cGRhdGUsDQoJbWJmd19vdXRfY3JlYXRlLA0KfTsNCg0KDQpfX2luaXRm
dW5jKGludCBpcF9tYmZ3X2luaXQodm9pZCkpDQp7DQoJcmV0dXJuIHJlZ2lz
dGVyX2lwX21hc3FfbW9kICgobW1vZF9zZWxmPSZtYmZ3X21vZCkpOw0KfQ0K
DQppbnQgaXBfbWJmd19kb25lKHZvaWQpDQp7DQoJcmV0dXJuIHVucmVnaXN0
ZXJfaXBfbWFzcV9tb2QoJm1iZndfbW9kKTsNCn0NCg0KI2lmZGVmIE1PRFVM
RQ0KRVhQT1JUX05PX1NZTUJPTFM7DQoNCmludCBpbml0X21vZHVsZSh2b2lk
KQ0Kew0KCWlmIChpcF9tYmZ3X2luaXQoKSAhPSAwKQ0KCQlyZXR1cm4gLUVJ
TzsNCglyZXR1cm4gMDsNCn0NCg0Kdm9pZCBjbGVhbnVwX21vZHVsZSh2b2lk
KQ0Kew0KCWlmIChpcF9tYmZ3X2RvbmUoKSAhPSAwKQ0KCQlwcmludGsoS0VS
Tl9JTkZPICJjYW4ndCByZW1vdmUgbW9kdWxlIik7DQp9DQoNCiNlbmRpZiAv
KiBNT0RVTEUgKi8NCg==
--215503375-172410501-930675121=:30216
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="mbfw.c"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.4.10.9906291252012.30216@ns1.helixsystems.com>
Content-Description:
Content-Disposition: attachment; filename="mbfw.c"

LyoNCiAqDQogKgltYmZ3IC0gRlcgTWFyayBGb3J3YXJkaW5nIFRhYmxlIEVk
aXRpbmcNCiAqDQogKiAJJElkOiBtZncuYyx2IDAuMSAxOTk4LzA3LzI5IDE3
OjUwOjMxIGpqbyBFeHAgampvICQNCiAqDQogKglBdXRob3I6IEp1YW4gSm9z
ZSBDaWFybGFudGUgPGpqY2lhcmxhQHJhaXoudW5jdS5lZHUuYXI+DQogKgkg
ICAgICAgIFN0cm9uZ2x5IGJhc2VkIG9uIFN0ZXZlIENsYXJrJ3MgcG9ydGZ3
Lg0KICoNCiAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug
Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQogKglpdCB1bmRl
ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
IGFzIHB1Ymxpc2hlZCBieQ0KICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh
dGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiAq
CShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQogKg0KICoJ
VGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQg
aXQgd2lsbCBiZSB1c2VmdWwsDQogKglidXQgV0lUSE9VVCBBTlkgV0FSUkFO
VFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KICoJ
TUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFLiAgU2VlIHRoZQ0KICoJR05VIEdlbmVyYWwgUHVibGljIExpY2Vu
c2UgZm9yIG1vcmUgZGV0YWlscy4NCiAqDQogKglZb3Ugc2hvdWxkIGhhdmUg
cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZQ0KICoJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3Jp
dGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiAqCUZvdW5kYXRpb24sIEluYy4s
IDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLg0KICoN
CiAqIEZpeGVzOg0KICogICAgICBSb2xmIEJyYXVuOiAgICAgICAgICAgICBh
ZGRlZCBtYmZ3LCBiYXNlZCBvbiBtZncNCiAqCUp1YW4gSi4gQ2lhcmxhbnRl
OglhbGxvdyBudWwgcnBvcnQgPT4gdXNlIHBhY2tldCdzIHBvcnQNCiAqLw0K
DQojaW5jbHVkZSA8c3RkaW8uaD4NCiNpbmNsdWRlIDxlcnJuby5oPg0KI2lu
Y2x1ZGUgPGxpbWl0cy5oPg0KI2luY2x1ZGUgPHN0cmluZy5oPg0KI2luY2x1
ZGUgPHN0ZGxpYi5oPg0KI2luY2x1ZGUgPHVuaXN0ZC5oPg0KI2luY2x1ZGUg
PGdldG9wdC5oPg0KDQojaW5jbHVkZSA8bmV0ZGIuaD4NCiNpbmNsdWRlIDxu
ZXRpbmV0L2luLmg+DQojaW5jbHVkZSA8YXJwYS9pbmV0Lmg+DQojaW5jbHVk
ZSA8bmV0L2lmLmg+DQojaW5jbHVkZSA8c3lzL3BhcmFtLmg+DQojaW5jbHVk
ZSA8bGludXgvaXBfbWFzcS5oPg0KDQojaW5jbHVkZSAiaXBtYXNxYWRtLmgi
DQojaW5jbHVkZSAiaXBtYXNxY3RsLmgiDQoNCiNkZWZpbmUgSVBfTUFSS0ZX
X0RFRl9QUkVGIDEwDQoNCmludCBkb19zZXRzb2Nrb3B0KGludCBjbWQsIHN0
cnVjdCBpcF9tYXNxX2N0bCAqbSwgaW50IG1sZW4pOw0Kdm9pZCBleGl0X2Vy
cm9yKGludCBzdGF0dXMsIGNoYXIgKm1zZyk7DQp2b2lkIGV4aXRfZGlzcGxh
eV9oZWxwKHZvaWQpOw0KaW50IGxpc3RfZm9yd2FyZGluZyhpbnQpOw0KDQpz
dGF0aWMgY29uc3QgY2hhciAqbW9kbmFtZTsNCg0KaW50IG1hc3Ftb2RfbWFp
bihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKQ0Kew0KCWludCBjOw0K
CWludCBjb21tYW5kID0gSVBfTUFTUV9DTURfTk9ORTsNCglzdHJ1Y3QgaXBf
bWFzcV9jdGwgbWN0bDsNCiNkZWZpbmUgbWJmdyBtY3RsLnUubWJmd191c2Vy
DQoJc3RydWN0IHNvY2thZGRyX2luIHJlZGlyX3NpbiwgbG1fc2luOw0KCWlu
dCB0bXA7DQoJaW50IG5vbmFtZXMgPSAwOw0KDQoJbWVtc2V0ICgmcmVkaXJf
c2luLCAwLCBzaXplb2YgKHJlZGlyX3NpbikpOw0KCW1lbXNldCAoJmxtX3Np
biwgMCwgc2l6ZW9mIChsbV9zaW4pKTsNCgltYmZ3LmZ3bWFyayA9IDA7DQoJ
bWJmdy5yYWRkciA9IDA7DQoJbWJmdy5ycG9ydCA9IDA7DQoJbWJmdy5mbGFn
cyA9IDA7DQoJbWJmdy5sbWFkZHIgPSAwOw0KCW1iZncucHJlZiAgPSBJUF9N
QVJLRldfREVGX1BSRUY7DQoNCgltb2RuYW1lID0gYXJndlswXTsNCg0KCXdo
aWxlICgoYyA9IGdldG9wdChhcmdjLCAoY2hhcioqKSBhcmd2LCAiQUVERlNM
bm06cjpwOmw6aCIpKSAhPSAtMSkNCgkJc3dpdGNoIChjKSB7DQoJCWNhc2Ug
J0EnOg0KCQkJaWYgKGNvbW1hbmQgIT0gSVBfTUFTUV9DTURfTk9ORSkNCgkJ
CQlleGl0X2Vycm9yKDIsICJtdWx0aXBsZSBjb21tYW5kcyBzcGVjaWZpZWQi
KTsNCgkJCWNvbW1hbmQgPSBJUF9NQVNRX0NNRF9BREQ7DQoJCQlicmVhazsN
CgkJY2FzZSAnRSc6DQoJCQlpZiAoY29tbWFuZCAhPSBJUF9NQVNRX0NNRF9O
T05FKQ0KCQkJCWV4aXRfZXJyb3IoMiwgIm11bHRpcGxlIGNvbW1hbmRzIHNw
ZWNpZmllZCIpOw0KCQkJY29tbWFuZCA9IElQX01BU1FfQ01EX1NFVDsNCgkJ
CWJyZWFrOw0KCQljYXNlICdEJzoNCgkJCWlmIChjb21tYW5kICE9IElQX01B
U1FfQ01EX05PTkUpDQoJCQkJZXhpdF9lcnJvcigyLCAibXVsdGlwbGUgY29t
bWFuZHMgc3BlY2lmaWVkIik7DQoJCQljb21tYW5kID0gSVBfTUFTUV9DTURf
REVMOw0KCQkJYnJlYWs7DQoJCWNhc2UgJ0YnOg0KCQkJaWYgKGNvbW1hbmQg
IT0gSVBfTUFTUV9DTURfTk9ORSkNCgkJCQlleGl0X2Vycm9yKDIsICJtdWx0
aXBsZSBjb21tYW5kcyBzcGVjaWZpZWQiKTsNCgkJCWNvbW1hbmQgPSBJUF9N
QVNRX0NNRF9GTFVTSDsNCgkJCWJyZWFrOw0KCQljYXNlICdTJzoNCgkJCWlm
IChjb21tYW5kICE9IElQX01BU1FfQ01EX05PTkUpDQoJCQkJZXhpdF9lcnJv
cigyLCAibXVsdGlwbGUgY29tbWFuZHMgc3BlY2lmaWVkIik7DQoJCQljb21t
YW5kID0gSVBfTUFTUV9DTURfU0VUOw0KCQkJbWJmdy5mbGFncyB8PSBJUF9N
QVNRX01GV19TQ0hFRDsNCgkJCWJyZWFrOw0KICAgICAgICAgICAgICAgIGNh
c2UgJ0wnOg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1hbmQg
IT0gSVBfTUFTUV9DTURfTk9ORSkNCgkJCQlleGl0X2Vycm9yKDIsICJtdWx0
aXBsZSBjb21tYW5kcyBzcGVjaWZpZWQiKTsNCgkJCWNvbW1hbmQgPSBJUF9N
QVNRX0NNRF9MSVNUOw0KCQkJYnJlYWs7DQoNCgkJY2FzZSAnbic6DQoJCQlu
b25hbWVzKys7DQoJCQlicmVhazsNCg0KCQljYXNlICdtJzoNCgkJCW1iZncu
ZndtYXJrID0gYXRvaShvcHRhcmcpOw0KCQkJYnJlYWs7DQoJCWNhc2UgJ3In
Og0KCQkJaWYgKHJlZGlyX3Npbi5zaW5fYWRkci5zX2FkZHJ8fHJlZGlyX3Np
bi5zaW5fcG9ydCkNCgkJCQlleGl0X2Vycm9yKDIsICJtdWx0aXBsZSBkZXN0
aW5hdGlvbnMgc3BlY2lmaWVkIik7DQoJCQl0bXAgPSBvcHRpbmQtMTsNCgkJ
CXRtcCA9IHBhcnNlX2FkZHJlc3Nwb3J0KGFyZ3YrdG1wLCBhcmdjLXRtcCwg
JnJlZGlyX3Npbiwgbm9uYW1lcyk7DQoNCgkJCWlmICh0bXAgPCAxKQ0KCQkJ
CWV4aXRfZXJyb3IoMiwgImlsbGVnYWwgZGVzdGluYXRpb24gc3BlY2lmaWVk
Iik7DQoJCQlvcHRpbmQgKz0gdG1wIC0xOw0KCQkJYnJlYWs7DQoJCWNhc2Ug
J2wnOg0KCQkJaWYgKGxtX3Npbi5zaW5fYWRkci5zX2FkZHIpDQoJCQkJZXhp
dF9lcnJvcigyLCAibXVsdGlwbGUgbG9jYWwgbWFzcSBhZGRyZXNzZXMgc3Bl
Y2lmaWVkIik7DQoJCQl0bXAgPSBvcHRpbmQtMTsNCgkJCXRtcCA9IHBhcnNl
X2FkZHJlc3Nwb3J0KGFyZ3YrdG1wLCBhcmdjLXRtcCwgJmxtX3Npbiwgbm9u
YW1lcyk7DQoJCQlpZiAodG1wIDwgMSkNCgkJCQlleGl0X2Vycm9yKDIsICJp
bGxlZ2FsIGxvY2FsIG1hc3EgYWRkcmVzcyIpOw0KCQkJb3B0aW5kICs9IHRt
cC0xOw0KCQkJYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSAncCc6DQog
ICAgICAgICAgICAgICAgICAgICAgICBtYmZ3LnByZWYgPSBhdG9pKG9wdGFy
Zyk7DQoNCgkJCS8qDQoJCQkgKglwcmVmID09IDAgbWFya3MgdGhlIGVudHJ5
IGFzIHVuLXNjaGVkdWxhYmxlDQoJCQkgKi8NCiAgICAgICAgICAgICAgICAg
ICAgICAgIGlmIChtYmZ3LnByZWYgPCAwKQ0KICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBleGl0X2Vycm9yKDIsICJpbGxlZ2FsIHByZWZlcmVu
Y2UgdmFsdWUgc3BlY2lmaWVkIik7DQogICAgICAgICAgICAgICAgICAgICAg
ICBicmVhazsNCgkJY2FzZSAnaCc6DQoJCWNhc2UgJz8nOg0KCQlkZWZhdWx0
Og0KCQkJZXhpdF9kaXNwbGF5X2hlbHAoKTsNCgkJfQ0KDQogICAgICAgIGlm
IChvcHRpbmQgPCBhcmdjKSB7DQoJCXByaW50Zigib3B0aW5kPSVkICglcykg
YXJnYz0lZFxuIiwgb3B0aW5kLCBhcmd2W29wdGluZC0xXSwgYXJnYyk7DQog
ICAgICAgICAgICAgICAgZXhpdF9lcnJvcigyLCAidW5rbm93biBhcmd1bWVu
dHMgZm91bmQgb24gY29tbWFuZGxpbmUiKTsNCgl9DQoNCgltYmZ3LnJwb3J0
ID0gcmVkaXJfc2luLnNpbl9wb3J0Ow0KCW1iZncucmFkZHIgPSByZWRpcl9z
aW4uc2luX2FkZHIuc19hZGRyOw0KCW1iZncubG1hZGRyID0gbG1fc2luLnNp
bl9hZGRyLnNfYWRkcjsNCglpZiAoY29tbWFuZCA9PSBJUF9NQVNRX0NNRF9O
T05FKQ0KCQlleGl0X2Rpc3BsYXlfaGVscCgpOw0KDQoJZWxzZSBpZiAoY29t
bWFuZCA9PSBJUF9NQVNRX0NNRF9BREQgJiYgKG1iZncuZndtYXJrID09IDAg
KSkNCiNpZiAwDQoJCSB8fCBtYmZ3LnJwb3J0ID09IDAgfHwgbWJmdy5yYWRk
ciA9PSAwIHx8IG1iZncubG1hZGRyID09IDApKQ0KI2VuZGlmDQoJCWV4aXRf
ZXJyb3IoMiwgImluc3VmZmljaWVudCBvcHRpb25zIHNwZWNpZmllZCIpOw0K
DQoJZWxzZSBpZiAoY29tbWFuZCA9PSBJUF9NQVNRX0NNRF9ERUwgJiYNCgkJ
KG1iZncuZndtYXJrID09IDApKQ0KCQlleGl0X2Vycm9yKDIsICJpbnN1ZmZp
Y2llbnQgb3B0aW9ucyBzcGVjaWZpZWQiKTsNCg0KI2lmIDANCgllbHNlIGlm
IChjb21tYW5kID09IElQX01BU1FfQ01EX0RFTCAmJg0KCQkgKG1iZncucnBv
cnQgIT0gMCB8fCBtYmZ3LnJhZGRyICE9IDApKQ0KCQlleGl0X2Vycm9yKDIs
ICJpbmNvbXBhdGlibGUgb3B0aW9ucyBzcGVjaWZpZWQiKTsNCiNlbmRpZiAg
ICAgICAgDQoNCgllbHNlIGlmICgoY29tbWFuZCA9PSBJUF9NQVNRX0NNRF9G
TFVTSCB8fCBjb21tYW5kID09IElQX01BU1FfQ01EX0xJU1QpICYmDQoJCSAo
bWJmdy5md21hcmsgIT0gMCB8fCBtYmZ3LnJwb3J0ICE9IDAgfHwgbWJmdy5y
YWRkciAhPSAwKSkNCgkJZXhpdF9lcnJvcigyLCAiaW5jb21wYXRpYmxlIG9w
dGlvbnMgc3BlY2lmaWVkIik7DQoNCiAgICAgICAgaWYgKGNvbW1hbmQgPT0g
SVBfTUFTUV9DTURfTElTVCkgew0KDQoJCS8qCUp1c3QgInBlZWsiIGZvciBr
ZXJuZWwgbW9kdWxlICAqLw0KCQlkb19zZXRzb2Nrb3B0KElQX01BU1FfQ01E
X05PTkUsICZtY3RsLCBzaXplb2YobWN0bCkpOw0KCQlyZXR1cm4gbGlzdF9m
b3J3YXJkaW5nKG5vbmFtZXMpOw0KCX0NCiAgICAgICAgICAgICAgICANCgly
ZXR1cm4oZG9fc2V0c29ja29wdChjb21tYW5kLCAmbWN0bCwgc2l6ZW9mKG1j
dGwpKSk7DQp9DQoNCmludCBkb19zZXRzb2Nrb3B0KGludCBjbWQsIHN0cnVj
dCBpcF9tYXNxX2N0bCAqbSwgaW50IG1sZW4pDQp7DQoJaW50IHNvY2tmZDsN
CglpbnQgcmV0Ow0KDQoJaWYgKChzb2NrZmQgPSBzb2NrZXQoQUZfSU5FVCwg
U09DS19SQVcsIElQUFJPVE9fUkFXKSkgPCAwKSB7DQoJCXBlcnJvcigibWJm
dzogc29ja2V0IGNyZWF0aW9uIGZhaWxlZCIpOw0KCQlleGl0KDEpOw0KCX0N
CgkNCgkvKiBUaGlzIGlzIGEgbWFzcS1tb2QgdGFyZ2V0IG9wICovDQoJbS0+
bV90YXJnZXQgPSBJUF9NQVNRX1RBUkdFVF9NT0Q7DQoJDQoJLyogVGhpcyBp
cyB0aGUgdGFyZ2V0IG1vZHVsZSBuYW1lICovDQoJc3RybmNweShtLT5tX3Ru
YW1lLCBtb2RuYW1lLCBzaXplb2YobS0+bV90bmFtZSkpOw0KDQoJLyogVGhp
cyBpcyB0aGUgY29tbWFuZCAqLw0KCW0tPm1fY21kID0gY21kOw0KDQoJLyog
SGVyZSB3ZSBnbyAuLi4gKi8NCglyZXQgPSBzZXRzb2Nrb3B0KHNvY2tmZCwg
SVBQUk9UT19JUCwgSVBfRldfTUFTUV9DVEwgLCAodm9pZCAqKSBtLCBtbGVu
KTsNCglpZiAocmV0KQ0KCQlwZXJyb3IoIm1iZnc6IHNldHNvY2tvcHQgZmFp
bGVkIik7DQoNCglyZXR1cm4gcmV0Ow0KfQ0KDQoNCnZvaWQgZXhpdF9lcnJv
cihpbnQgc3RhdHVzLCBjaGFyICptc2cpDQp7DQoJZnByaW50ZihzdGRlcnIs
ICIlczogJXNcbiIsIG1vZG5hbWUsIG1zZyk7DQoJZXhpdChzdGF0dXMpOw0K
fQ0KDQppbnQgbGlzdF9mb3J3YXJkaW5nKGludCBubSkNCnsNCiAgIGNoYXIg
YnVmZmVyWzI1Nl07DQogICBpbnQgbG51bSA9IDA7DQogICBjaGFyIHJhX25h
bWVbODBdLCByYTJfbmFtZVs4MF07DQogICBjaGFyIHJzX25hbWVbMTZdOw0K
ICAgdW5zaWduZWQgaW50IGZ3bWFyazsNCiAgIHVuc2lnbmVkIGludCBocmFk
ZHI9MCwgaHJwb3J0PTAsIGxhZGRyPTA7DQogICBpbnQgcHJlZl9jbnQsIHBy
ZWY7DQogICBGSUxFICpoYW5kbGUgPSBOVUxMOw0KICAgY29uc3QgY2hhciAq
cHJvY19uYW1lc1tdID0gew0KCSAgICIvcHJvYy9uZXQvaXBfbWFzcS9tYmZ3
IiwNCgkgICBOVUxMDQogICB9Ow0KICAgY29uc3QgY2hhciAqKnByb2NfbmFt
ZSA9IHByb2NfbmFtZXM7DQoNCiAgIGZvciAoOypwcm9jX25hbWU7cHJvY19u
YW1lKyspIHsNCgloYW5kbGUgPSBmb3BlbigqcHJvY19uYW1lLCAiciIpOw0K
CWlmIChoYW5kbGUpIA0KCQlicmVhazsNCglmcHJpbnRmKHN0ZGVyciwgIkNv
dWxkIG5vdCBvcGVuIFwiJXNcIlxuIiwgKnByb2NfbmFtZSk7DQogICB9DQoN
CiAgIGlmICghaGFuZGxlKSB7DQoJICAgZnByaW50ZihzdGRlcnIsICJDaGVj
ayBpZiB5b3UgaGF2ZSBlbmFibGVkIGZ3bWFyay1mb3J3YXJkaW5nXG4iKTsN
CgkgICByZXR1cm4gMTsNCiAgIH0NCg0KICAgLyoNCiAgICAqCUxpbmUgZm9y
bWF0Og0KICAgICoJRldNYXJrID4gUkFkZHIgICAgUlBvcnQgUHJDbnQgIFBy
ZWYgICAgICAgICAgICAgICANCiAgICAqCTEwMjAgICA+IEMwQTgwMjBCICAg
IDU2ICAgIDEwICAgIDEwICAgICAgICAgICAgICAgDQogICAgKg0KICAgICov
DQoNCiAgIHdoaWxlICghZmVvZihoYW5kbGUpKQ0KICAgICAgIGlmIChmZ2V0
cyhidWZmZXIsIHNpemVvZihidWZmZXIpLCBoYW5kbGUpKSB7DQoJICAgaWYg
KGxudW0pIHsNCgkJcHJlZl9jbnQgPSBwcmVmID0gLTE7DQoJCXNzY2FuZihi
dWZmZXIsICIleCA+ICV4ICVkICV4ICVkICVkIiwgDQoJCQkmZndtYXJrLCAN
CgkJCSZocmFkZHIsICZocnBvcnQsICZsYWRkciwNCgkJCSZwcmVmX2NudCwg
JnByZWYpOw0KDQoJCXByaW50ZigiJS04ZCAlLTIwcyAlOHMgJS0yMHMgJTVk
ICU1ZFxuIiwgDQoJCQlmd21hcmssIA0KCQkJYWRkcl90b19uYW1lKG50b2hs
KGhyYWRkciksIHJhX25hbWUsIHNpemVvZihyYV9uYW1lKSwgbm0pLA0KCQkJ
c2Vydl90b19uYW1lKG50b2hzKGhycG9ydCksIHJzX25hbWUsIHNpemVvZihy
c19uYW1lKSwgbm0pLA0KCQkJYWRkcl90b19uYW1lKG50b2hsKGxhZGRyKSwg
cmEyX25hbWUsIHNpemVvZihyYTJfbmFtZSksIG5tKSwNCgkJCXByZWZfY250
LCANCgkJCXByZWYpOw0KCSAgIH0gZWxzZSB7DQoJCXByaW50ZigiJS04cyAl
LTIwcyAlOHMgJS0yMHMgJTVzICU1c1xuIiwgDQoJCSAgIAkiZndtYXJrIiwN
CgkJCSJyZWRpcmFkZHIiLA0KCQkJInJwb3J0IiwgImxhZGRyIiwNCgkJCSJw
Y250IiwgInByZWYiKTsNCgkgICB9DQoJICAgbG51bSsrOw0KICAgICAgIH0N
CiAgIGZjbG9zZShoYW5kbGUpOw0KICAgcmV0dXJuIDA7DQoNCn0NCg0Kdm9p
ZCBleGl0X2Rpc3BsYXlfaGVscCh2b2lkKQ0Kew0KCXByaW50ZigNCiJVc2Fn
ZTogJXMgLUEgLW0gRldNQVJLIC1yIFJBRERSIFJQT1JUIC1sIExIT1NUIFst
cCBQUkVGXSBhZGQgZW50cnlcbiINCiIgICAgICAgJXMgLUQgLW0gRldNQVJL
IFstciBSQUREUiBSUE9SVF0gICAgICAgICBkZWxldGUgZW50cnlcbiINCiIg
ICAgICAgJXMgLUUgLW0gRldNQVJLIFstciBSQUREUiBSUE9SVF0gICAgICAg
ICBlZGl0IGVudHJ5XG4iDQoiICAgICAgICVzIC1TIC1tIEZXTUFSSyAgICAg
ICAgICAgICAgICAgICAgICAgICAgZm9yY2Ugc2NoZWR1bGluZ1xuIg0KIiAg
ICAgICAlcyAtRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGNsZWFyIHRhYmxlXG4iDQoiICAgICAgICVzIC1MICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgbGlzdCB0YWJsZVxuIg0KIiAgICAgICAl
cyA8YXJncz4gLW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIG5h
bWVzXG5cbiINCiJGV01BUksgaXMgdGhlIGZ3bWFyayBiZWluZyByZWRpcmVj
dGVkLlxuIg0KIlJBRERSIGlzIHRoZSByZW1vdGUgYWRkcmVzcy5cbiINCiJS
UE9SVCBpcyB0aGUgcG9ydCBiZWluZyByZWRpcmVjdGVkIHRvLlxuIg0KIlBS
RUYgIGlzIHRoZSBwcmVmZXJlbmNlIGxldmVsIChsb2FkIGJhbGFuY2luZywg
ZGVmYXVsdD0lZClcbiINCiJMSE9TVCBpcyB0aGUgbG9jYWwgaG9zdCBmcm9t
IHdoaWNoIHRoZSByZWRpcmVjdGVkIGNvbm5lY3Rpb24gd2lsbCBhcHBlYXIg
dG8gYmUgY29taW5nICh1c2UgdGhlIGNvcnJlY3QgZ2F0ZXdheSBwbGVhc2Uh
KSIsDQogICAgICAgICAgICAgICBtb2RuYW1lLCBtb2RuYW1lLCBtb2RuYW1l
LCBtb2RuYW1lLCBtb2RuYW1lLCBtb2RuYW1lLCBtb2RuYW1lLA0KICAgICAg
ICAgICAgICAgSVBfTUFSS0ZXX0RFRl9QUkVGKTsNCg0KCWV4aXQoMCk7DQp9
DQo=
--215503375-172410501-930675121=:30216--

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/