Date: Thu, 1 Mar 2007 11:30:44 +0000 (GMT) From: Robert Watson <rwatson@FreeBSD.org> To: Lars Erik Gullerud <lerik@nolink.net> Cc: performance@FreeBSD.org Subject: Re: MFC of UDP socket enhancement for BIND? Message-ID: <20070301111957.S13593@fledge.watson.org> In-Reply-To: <20070218185837.R16107@electra.nolink.net> References: <20070216223258.S16107@electra.nolink.net> <20070216221505.D73842@fledge.watson.org> <20070218185837.R16107@electra.nolink.net>
next in thread | previous in thread | raw e-mail | index | archive | help
This message is in MIME format. The first part should be readable text,
while the remaining parts are likely unreadable without MIME-aware tools.
--0-429716139-1172748644=:13593
Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed
On Sun, 18 Feb 2007, Lars Erik Gullerud wrote:
> On Fri, 16 Feb 2007, Robert Watson wrote:
>
>> I can certainly investigate doing this -- since 6.2 is safely out the door
>> it's a good time to do so. I'll follow up by e-mail in a few days -- would
>> it be possible for you to help with testing?
>
> We would of course be most happy to test any patches you come up with, and
> run performance benchmarks on our systems.
It turns out this change comes in two parts:
(1) In the first part, the structure of the socket send routing, sosend(), is
simplified by breaking out the code that copies data from user space from
the code that transmits via the protocol.
(2) In the second part, a version of sosend() specific to datagram protocols
(where the socket send buffer isn't ever used) is added.
I'm going to attach two patches against RELENG_6 from today -- the first
performs only the first step (sosend_copyin.diff), and the second performs
both (sosend_dgram.diff) (so will have to be applied against a fresh version
of uipc_socket.c as opposed to the patched version). The first change
requires heavy stability testing, and the second requires both performance and
stability testing. Any assistance from you in helping to make this a reliable
MFC would be much appreciated.
For reference, the sosend_copyin.diff applies these changes:
src/sys/kern/uipc_socket.c:1.253, 1.254, 1.255
The sosend_dgram.diff patch incrementally also applies these changes on top of
sosend_copyin.diff:
src/sys/kern/uipc_socket.c:1.256
src/sys/netinet/udp_usrreq.c:1.188
I've CC'd the performance list as there is a relevant thread going on there
right now, and other people might also be interested in reviewing and testing
these changes. The short description is that this eliminates a large number
of socket buffer interactions in the UDP send path--one of the effects is to
avoid locking the socket buffer for an extended period, as it's largely unused
in the datagram transmit path. Per the commit comments, this idea was
suggested by Jinmei Tatsuya at ISC as a result of their performance analysis;
this change has been in 7-CURRENT since May of last year and has seen some bug
fixes but no substantial changes in that time, so has been moderately burned
in.
Robert N M Watson
Computer Laboratory
University of Cambridge
--0-429716139-1172748644=:13593
Content-Type: TEXT/plain; charset=US-ASCII; name=sosend_copyin.diff
Content-Transfer-Encoding: BASE64
Content-ID: <20070301113044.E13593@fledge.watson.org>
Content-Description:
Content-Disposition: attachment; filename=sosend_copyin.diff
SW5kZXg6IGtlcm4vdWlwY19zb2NrZXQuYw0KPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQ0KUkNTIGZpbGU6IC9ob21lL25jdnMvc3JjL3N5cy9rZXJuL3VpcGNf
c29ja2V0LmMsdg0KcmV0cmlldmluZyByZXZpc2lvbiAxLjI0Mi4yLjgNCmRp
ZmYgLXUgLXIxLjI0Mi4yLjggdWlwY19zb2NrZXQuYw0KLS0tIGtlcm4vdWlw
Y19zb2NrZXQuYwkzIEZlYiAyMDA3IDA0OjAxOjIyIC0wMDAwCTEuMjQyLjIu
OA0KKysrIGtlcm4vdWlwY19zb2NrZXQuYwkxIE1hciAyMDA3IDExOjE4OjM1
IC0wMDAwDQpAQCAtNTg0LDcgKzU4NCwxNDkgQEANCiAJcmV0dXJuIChlcnJv
cik7DQogfQ0KIA0KKyNpZmRlZiBaRVJPX0NPUFlfU09DS0VUUw0KK3N0cnVj
dCBzb196ZXJvY29weV9zdGF0c3sNCisJaW50IHNpemVfb2s7DQorCWludCBh
bGlnbl9vazsNCisJaW50IGZvdW5kX2lmcDsNCit9Ow0KK3N0cnVjdCBzb196
ZXJvY29weV9zdGF0cyBzb196ZXJvY3Bfc3RhdHMgPSB7MCwwLDB9Ow0KKyNp
bmNsdWRlIDxuZXRpbmV0L2luLmg+DQorI2luY2x1ZGUgPG5ldC9yb3V0ZS5o
Pg0KKyNpbmNsdWRlIDxuZXRpbmV0L2luX3BjYi5oPg0KKyNpbmNsdWRlIDx2
bS92bS5oPg0KKyNpbmNsdWRlIDx2bS92bV9wYWdlLmg+DQorI2luY2x1ZGUg
PHZtL3ZtX29iamVjdC5oPg0KKyNlbmRpZiAvKlpFUk9fQ09QWV9TT0NLRVRT
Ki8NCisNCisvKg0KKyAqIHNvc2VuZF9jb3B5aW4oKSBhY2NlcHRzIGEgdWlv
IGFuZCBwcmVwYXJlcyBhbiBtYnVmIGNoYWluIGhvbGRpbmcgcGFydCBvcg0K
KyAqIGFsbCBvZiB0aGUgZGF0YSByZWZlcmVuY2VkIGJ5IHRoZSB1aW8uICBJ
ZiBkZXNpcmVkLCBpdCB1c2VzIHplcm8tY29weS4NCisgKiAqc3BhY2Ugd2ls
bCBiZSB1cGRhdGVkIHRvIHJlZmxlY3QgZGF0YSBjb3BpZWQgaW4uDQorICoN
CisgKiBOQjogSWYgYXRvbWljIEkvTyBpcyByZXF1ZXN0ZWQsIHRoZSBjYWxs
ZXIgbXVzdCBhbHJlYWR5IGhhdmUgY2hlY2tlZCB0aGF0DQorICogc3BhY2Ug
Y2FuIGhvbGQgcmVzaWQgYnl0ZXMuDQorICoNCisgKiBOQjogSW4gdGhlIGV2
ZW50IG9mIGFuIGVycm9yLCB0aGUgY2FsbGVyIG1heSBuZWVkIHRvIGZyZWUg
dGhlIHBhcnRpYWwNCisgKiBjaGFpbiBwb2ludGVkIHRvIGJ5ICptcHAuICBU
aGUgY29udGVudHMgb2YgYm90aCAqdWlvIGFuZCAqc3BhY2UgbWF5IGJlDQor
ICogbW9kaWZpZWQgZXZlbiBpbiB0aGUgY2FzZSBvZiBhbiBlcnJvci4NCisg
Ki8NCitzdGF0aWMgaW50DQorc29zZW5kX2NvcHlpbihzdHJ1Y3QgdWlvICp1
aW8sIHN0cnVjdCBtYnVmICoqcmV0bXAsIGludCBhdG9taWMsIGxvbmcgKnNw
YWNlLA0KKyAgICBpbnQgZmxhZ3MpDQorew0KKwlzdHJ1Y3QgbWJ1ZiAqbSwg
KiptcCwgKnRvcDsNCisJbG9uZyBsZW4sIHJlc2lkOw0KKwlpbnQgZXJyb3I7
DQorI2lmZGVmIFpFUk9fQ09QWV9TT0NLRVRTDQorCWludCBjb3dfc2VuZDsN
CisjZW5kaWYNCisNCisJKnJldG1wID0gdG9wID0gTlVMTDsNCisJbXAgPSAm
dG9wOw0KKwlsZW4gPSAwOw0KKwlyZXNpZCA9IHVpby0+dWlvX3Jlc2lkOw0K
KwllcnJvciA9IDA7DQorCWRvIHsNCisjaWZkZWYgWkVST19DT1BZX1NPQ0tF
VFMNCisJCWNvd19zZW5kID0gMDsNCisjZW5kaWYgLyogWkVST19DT1BZX1NP
Q0tFVFMgKi8NCisJCWlmIChyZXNpZCA+PSBNSU5DTFNJWkUpIHsNCisjaWZk
ZWYgWkVST19DT1BZX1NPQ0tFVFMNCisJCQlpZiAodG9wID09IE5VTEwpIHsN
CisJCQkJTUdFVEhEUihtLCBNX1RSWVdBSVQsIE1UX0RBVEEpOw0KKwkJCQlp
ZiAobSA9PSBOVUxMKSB7DQorCQkJCQllcnJvciA9IEVOT0JVRlM7DQorCQkJ
CQlnb3RvIG91dDsNCisJCQkJfQ0KKwkJCQltLT5tX3BrdGhkci5sZW4gPSAw
Ow0KKwkJCQltLT5tX3BrdGhkci5yY3ZpZiA9IE5VTEw7IA0KKwkJCX0gZWxz
ZSB7DQorCQkJCU1HRVQobSwgTV9UUllXQUlULCBNVF9EQVRBKTsNCisJCQkJ
aWYgKG0gPT0gTlVMTCkgew0KKwkJCQkJZXJyb3IgPSBFTk9CVUZTOw0KKwkJ
CQkJZ290byBvdXQ7DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHNvX3plcm9f
Y29weV9zZW5kICYmDQorCQkJICAgIHJlc2lkPj1QQUdFX1NJWkUgJiYNCisJ
CQkgICAgKnNwYWNlPj1QQUdFX1NJWkUgJiYNCisJCQkgICAgdWlvLT51aW9f
aW92LT5pb3ZfbGVuPj1QQUdFX1NJWkUpIHsNCisJCQkJc29femVyb2NwX3N0
YXRzLnNpemVfb2srKzsNCisJCQkJc29femVyb2NwX3N0YXRzLmFsaWduX29r
Kys7DQorCQkJCWNvd19zZW5kID0gc29jb3dfc2V0dXAobSwgdWlvKTsNCisJ
CQkJbGVuID0gY293X3NlbmQ7DQorCQkJfQ0KKwkJCWlmICghY293X3NlbmQp
IHsNCisJCQkJTUNMR0VUKG0sIE1fVFJZV0FJVCk7DQorCQkJCWlmICgobS0+
bV9mbGFncyAmIE1fRVhUKSA9PSAwKSB7DQorCQkJCQltX2ZyZWUobSk7DQor
CQkJCQltID0gTlVMTDsNCisJCQkJfSBlbHNlIHsNCisJCQkJCWxlbiA9IG1p
bihtaW4oTUNMQllURVMsIHJlc2lkKSwNCisJCQkJCSAgICAqc3BhY2UpOw0K
KwkJCQl9DQorCQkJfQ0KKyNlbHNlIC8qIFpFUk9fQ09QWV9TT0NLRVRTICov
DQorCQkJaWYgKHRvcCA9PSBOVUxMKSB7DQorCQkJCW0gPSBtX2dldGNsKE1f
VFJZV0FJVCwgTVRfREFUQSwgTV9QS1RIRFIpOw0KKwkJCQltLT5tX3BrdGhk
ci5sZW4gPSAwOw0KKwkJCQltLT5tX3BrdGhkci5yY3ZpZiA9IE5VTEw7DQor
CQkJfSBlbHNlDQorCQkJCW0gPSBtX2dldGNsKE1fVFJZV0FJVCwgTVRfREFU
QSwgMCk7DQorCQkJbGVuID0gbWluKG1pbihNQ0xCWVRFUywgcmVzaWQpLCAq
c3BhY2UpOw0KKyNlbmRpZiAvKiBaRVJPX0NPUFlfU09DS0VUUyAqLw0KKwkJ
fSBlbHNlIHsNCisJCQlpZiAodG9wID09IE5VTEwpIHsNCisJCQkJbSA9IG1f
Z2V0aGRyKE1fVFJZV0FJVCwgTVRfREFUQSk7DQorCQkJCW0tPm1fcGt0aGRy
LmxlbiA9IDA7DQorCQkJCW0tPm1fcGt0aGRyLnJjdmlmID0gTlVMTDsNCisN
CisJCQkJbGVuID0gbWluKG1pbihNSExFTiwgcmVzaWQpLCAqc3BhY2UpOw0K
KwkJCQkvKg0KKwkJCQkgKiBGb3IgZGF0YWdyYW0gcHJvdG9jb2xzLCBsZWF2
ZSByb29tDQorCQkJCSAqIGZvciBwcm90b2NvbCBoZWFkZXJzIGluIGZpcnN0
IG1idWYuDQorCQkJCSAqLw0KKwkJCQlpZiAoYXRvbWljICYmIG0gJiYgbGVu
IDwgTUhMRU4pDQorCQkJCQlNSF9BTElHTihtLCBsZW4pOw0KKwkJCX0gZWxz
ZSB7DQorCQkJCW0gPSBtX2dldChNX1RSWVdBSVQsIE1UX0RBVEEpOw0KKwkJ
CQlsZW4gPSBtaW4obWluKE1MRU4sIHJlc2lkKSwgKnNwYWNlKTsNCisJCQl9
DQorCQl9DQorCQlpZiAobSA9PSBOVUxMKSB7DQorCQkJZXJyb3IgPSBFTk9C
VUZTOw0KKwkJCWdvdG8gb3V0Ow0KKwkJfQ0KKw0KKwkJKnNwYWNlIC09IGxl
bjsNCisjaWZkZWYgWkVST19DT1BZX1NPQ0tFVFMNCisJCWlmIChjb3dfc2Vu
ZCkNCisJCQllcnJvciA9IDA7DQorCQllbHNlDQorI2VuZGlmIC8qIFpFUk9f
Q09QWV9TT0NLRVRTICovDQorCQllcnJvciA9IHVpb21vdmUobXRvZChtLCB2
b2lkICopLCAoaW50KWxlbiwgdWlvKTsNCisJCXJlc2lkID0gdWlvLT51aW9f
cmVzaWQ7DQorCQltLT5tX2xlbiA9IGxlbjsNCisJCSptcCA9IG07DQorCQl0
b3AtPm1fcGt0aGRyLmxlbiArPSBsZW47DQorCQlpZiAoZXJyb3IpDQorCQkJ
Z290byBvdXQ7DQorCQltcCA9ICZtLT5tX25leHQ7DQorCQlpZiAocmVzaWQg
PD0gMCkgew0KKwkJCWlmIChmbGFncyAmIE1TR19FT1IpDQorCQkJCXRvcC0+
bV9mbGFncyB8PSBNX0VPUjsNCisJCQlicmVhazsNCisJCX0NCisJfSB3aGls
ZSAoKnNwYWNlID4gMCAmJiBhdG9taWMpOw0KK291dDoNCisJKnJldG1wID0g
dG9wOw0KKwlyZXR1cm4gKGVycm9yKTsNCit9DQorDQogI2RlZmluZQlTQkxP
Q0tXQUlUKGYpCSgoKGYpICYgTVNHX0RPTlRXQUlUKSA/IE1fTk9XQUlUIDog
TV9XQUlUT0spDQorI2RlZmluZQlzbmRlcnIoZXJybm8pCXsgZXJyb3IgPSAo
ZXJybm8pOyBnb3RvIHJlbGVhc2U7IH0NCisNCiAvKg0KICAqIFNlbmQgb24g
YSBzb2NrZXQuDQogICogSWYgc2VuZCBtdXN0IGdvIGFsbCBhdCBvbmNlIGFu
ZCBtZXNzYWdlIGlzIGxhcmdlciB0aGFuDQpAQCAtNjAzLDIxICs3NDUsNiBA
QA0KICAqIERhdGEgYW5kIGNvbnRyb2wgYnVmZmVycyBhcmUgZnJlZWQgb24g
cmV0dXJuLg0KICAqLw0KIA0KLSNpZmRlZiBaRVJPX0NPUFlfU09DS0VUUw0K
LXN0cnVjdCBzb196ZXJvY29weV9zdGF0c3sNCi0JaW50IHNpemVfb2s7DQot
CWludCBhbGlnbl9vazsNCi0JaW50IGZvdW5kX2lmcDsNCi19Ow0KLXN0cnVj
dCBzb196ZXJvY29weV9zdGF0cyBzb196ZXJvY3Bfc3RhdHMgPSB7MCwwLDB9
Ow0KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+DQotI2luY2x1ZGUgPG5ldC9y
b3V0ZS5oPg0KLSNpbmNsdWRlIDxuZXRpbmV0L2luX3BjYi5oPg0KLSNpbmNs
dWRlIDx2bS92bS5oPg0KLSNpbmNsdWRlIDx2bS92bV9wYWdlLmg+DQotI2lu
Y2x1ZGUgPHZtL3ZtX29iamVjdC5oPg0KLSNlbmRpZiAvKlpFUk9fQ09QWV9T
T0NLRVRTKi8NCi0NCiBpbnQNCiBzb3NlbmQoc28sIGFkZHIsIHVpbywgdG9w
LCBjb250cm9sLCBmbGFncywgdGQpDQogCXN0cnVjdCBzb2NrZXQgKnNvOw0K
QEAgLTYyOCwxNCArNzU1LDkgQEANCiAJaW50IGZsYWdzOw0KIAlzdHJ1Y3Qg
dGhyZWFkICp0ZDsNCiB7DQotCXN0cnVjdCBtYnVmICoqbXA7DQotCXN0cnVj
dCBtYnVmICptOw0KLQlsb25nIHNwYWNlLCBsZW4gPSAwLCByZXNpZDsNCisJ
bG9uZyBzcGFjZSwgcmVzaWQ7DQogCWludCBjbGVuID0gMCwgZXJyb3IsIGRv
bnRyb3V0ZTsNCiAJaW50IGF0b21pYyA9IHNvc2VuZGFsbGF0b25jZShzbykg
fHwgdG9wOw0KLSNpZmRlZiBaRVJPX0NPUFlfU09DS0VUUw0KLQlpbnQgY293
X3NlbmQ7DQotI2VuZGlmIC8qIFpFUk9fQ09QWV9TT0NLRVRTICovDQogDQog
CWlmICh1aW8gIT0gTlVMTCkNCiAJCXJlc2lkID0gdWlvLT51aW9fcmVzaWQ7
DQpAQCAtNjYzLDcgKzc4NSw2IEBADQogCQl0ZC0+dGRfcHJvYy0+cF9zdGF0
cy0+cF9ydS5ydV9tc2dzbmQrKzsNCiAJaWYgKGNvbnRyb2wgIT0gTlVMTCkN
CiAJCWNsZW4gPSBjb250cm9sLT5tX2xlbjsNCi0jZGVmaW5lCXNuZGVycihl
cnJubykJeyBlcnJvciA9IChlcnJubyk7IGdvdG8gcmVsZWFzZTsgfQ0KIA0K
IAlTT0NLQlVGX0xPQ0soJnNvLT5zb19zbmQpOw0KIHJlc3RhcnQ6DQpAQCAt
NzEzLDE1MyArODM0LDYxIEBADQogCQkJZ290byByZXN0YXJ0Ow0KIAkJfQ0K
IAkJU09DS0JVRl9VTkxPQ0soJnNvLT5zb19zbmQpOw0KLQkJbXAgPSAmdG9w
Ow0KIAkJc3BhY2UgLT0gY2xlbjsNCiAJCWRvIHsNCi0JCSAgICBpZiAodWlv
ID09IE5VTEwpIHsNCi0JCQkvKg0KLQkJCSAqIERhdGEgaXMgcHJlcGFja2Fn
ZWQgaW4gInRvcCIuDQotCQkJICovDQotCQkJcmVzaWQgPSAwOw0KLQkJCWlm
IChmbGFncyAmIE1TR19FT1IpDQotCQkJCXRvcC0+bV9mbGFncyB8PSBNX0VP
UjsNCi0JCSAgICB9IGVsc2UgZG8gew0KLSNpZmRlZiBaRVJPX0NPUFlfU09D
S0VUUw0KLQkJCWNvd19zZW5kID0gMDsNCi0jZW5kaWYgLyogWkVST19DT1BZ
X1NPQ0tFVFMgKi8NCi0JCQlpZiAocmVzaWQgPj0gTUlOQ0xTSVpFKSB7DQot
I2lmZGVmIFpFUk9fQ09QWV9TT0NLRVRTDQotCQkJCWlmICh0b3AgPT0gTlVM
TCkgew0KLQkJCQkJTUdFVEhEUihtLCBNX1RSWVdBSVQsIE1UX0RBVEEpOw0K
LQkJCQkJaWYgKG0gPT0gTlVMTCkgew0KLQkJCQkJCWVycm9yID0gRU5PQlVG
UzsNCi0JCQkJCQlTT0NLQlVGX0xPQ0soJnNvLT5zb19zbmQpOw0KLQkJCQkJ
CWdvdG8gcmVsZWFzZTsNCi0JCQkJCX0NCi0JCQkJCW0tPm1fcGt0aGRyLmxl
biA9IDA7DQotCQkJCQltLT5tX3BrdGhkci5yY3ZpZiA9IE5VTEw7IA0KLQkJ
CQl9IGVsc2Ugew0KLQkJCQkJTUdFVChtLCBNX1RSWVdBSVQsIE1UX0RBVEEp
Ow0KLQkJCQkJaWYgKG0gPT0gTlVMTCkgew0KLQkJCQkJCWVycm9yID0gRU5P
QlVGUzsNCi0JCQkJCQlTT0NLQlVGX0xPQ0soJnNvLT5zb19zbmQpOw0KLQkJ
CQkJCWdvdG8gcmVsZWFzZTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQlpZiAo
c29femVyb19jb3B5X3NlbmQgJiYNCi0JCQkJICAgIHJlc2lkPj1QQUdFX1NJ
WkUgJiYNCi0JCQkJICAgIHNwYWNlPj1QQUdFX1NJWkUgJiYNCi0JCQkJICAg
IHVpby0+dWlvX2lvdi0+aW92X2xlbj49UEFHRV9TSVpFKSB7DQotCQkJCQlz
b196ZXJvY3Bfc3RhdHMuc2l6ZV9vaysrOw0KLQkJCQkJc29femVyb2NwX3N0
YXRzLmFsaWduX29rKys7DQotCQkJCQljb3dfc2VuZCA9IHNvY293X3NldHVw
KG0sIHVpbyk7DQotCQkJCQlsZW4gPSBjb3dfc2VuZDsNCi0JCQkJfQ0KLQkJ
CQlpZiAoIWNvd19zZW5kKSB7DQotCQkJCQlNQ0xHRVQobSwgTV9UUllXQUlU
KTsNCi0JCQkJCWlmICgobS0+bV9mbGFncyAmIE1fRVhUKSA9PSAwKSB7DQot
CQkJCQkJbV9mcmVlKG0pOw0KLQkJCQkJCW0gPSBOVUxMOw0KLQkJCQkJfSBl
bHNlIHsNCi0JCQkJCQlsZW4gPSBtaW4obWluKE1DTEJZVEVTLCByZXNpZCks
IHNwYWNlKTsNCi0JCQkJCX0NCi0JCQkJfQ0KLSNlbHNlIC8qIFpFUk9fQ09Q
WV9TT0NLRVRTICovDQotCQkJCWlmICh0b3AgPT0gTlVMTCkgew0KLQkJCQkJ
bSA9IG1fZ2V0Y2woTV9UUllXQUlULCBNVF9EQVRBLCBNX1BLVEhEUik7DQot
CQkJCQltLT5tX3BrdGhkci5sZW4gPSAwOw0KLQkJCQkJbS0+bV9wa3RoZHIu
cmN2aWYgPSBOVUxMOw0KLQkJCQl9IGVsc2UNCi0JCQkJCW0gPSBtX2dldGNs
KE1fVFJZV0FJVCwgTVRfREFUQSwgMCk7DQotCQkJCWxlbiA9IG1pbihtaW4o
TUNMQllURVMsIHJlc2lkKSwgc3BhY2UpOw0KLSNlbmRpZiAvKiBaRVJPX0NP
UFlfU09DS0VUUyAqLw0KKwkJCWlmICh1aW8gPT0gTlVMTCkgew0KKwkJCQly
ZXNpZCA9IDA7DQorCQkJCWlmIChmbGFncyAmIE1TR19FT1IpDQorCQkJCQl0
b3AtPm1fZmxhZ3MgfD0gTV9FT1I7DQogCQkJfSBlbHNlIHsNCi0JCQkJaWYg
KHRvcCA9PSBOVUxMKSB7DQotCQkJCQltID0gbV9nZXRoZHIoTV9UUllXQUlU
LCBNVF9EQVRBKTsNCi0JCQkJCW0tPm1fcGt0aGRyLmxlbiA9IDA7DQotCQkJ
CQltLT5tX3BrdGhkci5yY3ZpZiA9IE5VTEw7DQotDQotCQkJCQlsZW4gPSBt
aW4obWluKE1ITEVOLCByZXNpZCksIHNwYWNlKTsNCi0JCQkJCS8qDQotCQkJ
CQkgKiBGb3IgZGF0YWdyYW0gcHJvdG9jb2xzLCBsZWF2ZSByb29tDQotCQkJ
CQkgKiBmb3IgcHJvdG9jb2wgaGVhZGVycyBpbiBmaXJzdCBtYnVmLg0KLQkJ
CQkJICovDQotCQkJCQlpZiAoYXRvbWljICYmIG0gJiYgbGVuIDwgTUhMRU4p
DQotCQkJCQkJTUhfQUxJR04obSwgbGVuKTsNCi0JCQkJfSBlbHNlIHsNCi0J
CQkJCW0gPSBtX2dldChNX1RSWVdBSVQsIE1UX0RBVEEpOw0KLQkJCQkJbGVu
ID0gbWluKG1pbihNTEVOLCByZXNpZCksIHNwYWNlKTsNCisJCQkJZXJyb3Ig
PSBzb3NlbmRfY29weWluKHVpbywgJnRvcCwgYXRvbWljLA0KKwkJCQkgICAg
JnNwYWNlLCBmbGFncyk7DQorCQkJCWlmIChlcnJvciAhPSAwKSB7DQorCQkJ
CQlTT0NLQlVGX0xPQ0soJnNvLT5zb19zbmQpOw0KKwkJCQkJZ290byByZWxl
YXNlOw0KIAkJCQl9DQorCQkJCXJlc2lkID0gdWlvLT51aW9fcmVzaWQ7DQog
CQkJfQ0KLQkJCWlmIChtID09IE5VTEwpIHsNCi0JCQkJZXJyb3IgPSBFTk9C
VUZTOw0KLQkJCQlTT0NLQlVGX0xPQ0soJnNvLT5zb19zbmQpOw0KLQkJCQln
b3RvIHJlbGVhc2U7DQorCQkJaWYgKGRvbnRyb3V0ZSkgew0KKwkJCQlTT0NL
X0xPQ0soc28pOw0KKwkJCQlzby0+c29fb3B0aW9ucyB8PSBTT19ET05UUk9V
VEU7DQorCQkJCVNPQ0tfVU5MT0NLKHNvKTsNCiAJCQl9DQotDQotCQkJc3Bh
Y2UgLT0gbGVuOw0KLSNpZmRlZiBaRVJPX0NPUFlfU09DS0VUUw0KLQkJCWlm
IChjb3dfc2VuZCkNCi0JCQkJZXJyb3IgPSAwOw0KLQkJCWVsc2UNCi0jZW5k
aWYgLyogWkVST19DT1BZX1NPQ0tFVFMgKi8NCi0JCQllcnJvciA9IHVpb21v
dmUobXRvZChtLCB2b2lkICopLCAoaW50KWxlbiwgdWlvKTsNCi0JCQlyZXNp
ZCA9IHVpby0+dWlvX3Jlc2lkOw0KLQkJCW0tPm1fbGVuID0gbGVuOw0KLQkJ
CSptcCA9IG07DQotCQkJdG9wLT5tX3BrdGhkci5sZW4gKz0gbGVuOw0KLQkJ
CWlmIChlcnJvcikgew0KLQkJCQlTT0NLQlVGX0xPQ0soJnNvLT5zb19zbmQp
Ow0KLQkJCQlnb3RvIHJlbGVhc2U7DQotCQkJfQ0KLQkJCW1wID0gJm0tPm1f
bmV4dDsNCi0JCQlpZiAocmVzaWQgPD0gMCkgew0KLQkJCQlpZiAoZmxhZ3Mg
JiBNU0dfRU9SKQ0KLQkJCQkJdG9wLT5tX2ZsYWdzIHw9IE1fRU9SOw0KLQkJ
CQlicmVhazsNCi0JCQl9DQotCQkgICAgfSB3aGlsZSAoc3BhY2UgPiAwICYm
IGF0b21pYyk7DQotCQkgICAgaWYgKGRvbnRyb3V0ZSkgew0KLQkJCSAgICBT
T0NLX0xPQ0soc28pOw0KLQkJCSAgICBzby0+c29fb3B0aW9ucyB8PSBTT19E
T05UUk9VVEU7DQotCQkJICAgIFNPQ0tfVU5MT0NLKHNvKTsNCi0JCSAgICB9
DQotCQkgICAgLyoNCi0JCSAgICAgKiBYWFggYWxsIHRoZSBTQlNfQ0FOVFNF
TkRNT1JFIGNoZWNrcyBwcmV2aW91c2x5DQotCQkgICAgICogZG9uZSBjb3Vs
ZCBiZSBvdXQgb2YgZGF0ZS4gIFdlIGNvdWxkIGhhdmUgcmVjaWV2ZWQNCi0J
CSAgICAgKiBhIHJlc2V0IHBhY2tldCBpbiBhbiBpbnRlcnJ1cHQgb3IgbWF5
YmUgd2Ugc2xlcHQNCi0JCSAgICAgKiB3aGlsZSBkb2luZyBwYWdlIGZhdWx0
cyBpbiB1aW9tb3ZlKCkgZXRjLiBXZSBjb3VsZA0KLQkJICAgICAqIHByb2Jh
Ymx5IHJlY2hlY2sgYWdhaW4gaW5zaWRlIHRoZSBsb2NraW5nIHByb3RlY3Rp
b24NCi0JCSAgICAgKiBoZXJlLCBidXQgdGhlcmUgYXJlIHByb2JhYmx5IG90
aGVyIHBsYWNlcyB0aGF0IHRoaXMNCi0JCSAgICAgKiBhbHNvIGhhcHBlbnMu
ICBXZSBtdXN0IHJldGhpbmsgdGhpcy4NCi0JCSAgICAgKi8NCi0JCSAgICBl
cnJvciA9ICgqc28tPnNvX3Byb3RvLT5wcl91c3JyZXFzLT5wcnVfc2VuZCko
c28sDQotCQkJKGZsYWdzICYgTVNHX09PQikgPyBQUlVTX09PQiA6DQorCQkJ
LyoNCisJCQkgKiBYWFggYWxsIHRoZSBTQlNfQ0FOVFNFTkRNT1JFIGNoZWNr
cyBwcmV2aW91c2x5DQorCQkJICogZG9uZSBjb3VsZCBiZSBvdXQgb2YgZGF0
ZS4gIFdlIGNvdWxkIGhhdmUgcmVjaWV2ZWQNCisJCQkgKiBhIHJlc2V0IHBh
Y2tldCBpbiBhbiBpbnRlcnJ1cHQgb3IgbWF5YmUgd2Ugc2xlcHQNCisJCQkg
KiB3aGlsZSBkb2luZyBwYWdlIGZhdWx0cyBpbiB1aW9tb3ZlKCkgZXRjLiBX
ZSBjb3VsZA0KKwkJCSAqIHByb2JhYmx5IHJlY2hlY2sgYWdhaW4gaW5zaWRl
IHRoZSBsb2NraW5nIHByb3RlY3Rpb24NCisJCQkgKiBoZXJlLCBidXQgdGhl
cmUgYXJlIHByb2JhYmx5IG90aGVyIHBsYWNlcyB0aGF0IHRoaXMNCisJCQkg
KiBhbHNvIGhhcHBlbnMuICBXZSBtdXN0IHJldGhpbmsgdGhpcy4NCisJCQkg
Ki8NCisJCQllcnJvciA9ICgqc28tPnNvX3Byb3RvLT5wcl91c3JyZXFzLT5w
cnVfc2VuZCkoc28sDQorCQkJICAgIChmbGFncyAmIE1TR19PT0IpID8gUFJV
U19PT0IgOg0KIAkJCS8qDQogCQkJICogSWYgdGhlIHVzZXIgc2V0IE1TR19F
T0YsIHRoZSBwcm90b2NvbA0KIAkJCSAqIHVuZGVyc3RhbmRzIHRoaXMgZmxh
ZyBhbmQgbm90aGluZyBsZWZ0IHRvDQogCQkJICogc2VuZCB0aGVuIHVzZSBQ
UlVfU0VORF9FT0YgaW5zdGVhZCBvZiBQUlVfU0VORC4NCiAJCQkgKi8NCi0J
CQkoKGZsYWdzICYgTVNHX0VPRikgJiYNCi0JCQkgKHNvLT5zb19wcm90by0+
cHJfZmxhZ3MgJiBQUl9JTVBMT1BDTCkgJiYNCi0JCQkgKHJlc2lkIDw9IDAp
KSA/DQorCQkJICAgICgoZmxhZ3MgJiBNU0dfRU9GKSAmJg0KKwkJCSAgICAg
KHNvLT5zb19wcm90by0+cHJfZmxhZ3MgJiBQUl9JTVBMT1BDTCkgJiYNCisJ
CQkgICAgIChyZXNpZCA8PSAwKSkgPw0KIAkJCQlQUlVTX0VPRiA6DQogCQkJ
LyogSWYgdGhlcmUgaXMgbW9yZSB0byBzZW5kIHNldCBQUlVTX01PUkVUT0NP
TUUgKi8NCi0JCQkocmVzaWQgPiAwICYmIHNwYWNlID4gMCkgPyBQUlVTX01P
UkVUT0NPTUUgOiAwLA0KLQkJCXRvcCwgYWRkciwgY29udHJvbCwgdGQpOw0K
LQkJICAgIGlmIChkb250cm91dGUpIHsNCi0JCQkgICAgU09DS19MT0NLKHNv
KTsNCi0JCQkgICAgc28tPnNvX29wdGlvbnMgJj0gflNPX0RPTlRST1VURTsN
Ci0JCQkgICAgU09DS19VTkxPQ0soc28pOw0KLQkJICAgIH0NCi0JCSAgICBj
bGVuID0gMDsNCi0JCSAgICBjb250cm9sID0gTlVMTDsNCi0JCSAgICB0b3Ag
PSBOVUxMOw0KLQkJICAgIG1wID0gJnRvcDsNCi0JCSAgICBpZiAoZXJyb3Ip
IHsNCi0JCQlTT0NLQlVGX0xPQ0soJnNvLT5zb19zbmQpOw0KLQkJCWdvdG8g
cmVsZWFzZTsNCi0JCSAgICB9DQorCQkJICAgIChyZXNpZCA+IDAgJiYgc3Bh
Y2UgPiAwKSA/IFBSVVNfTU9SRVRPQ09NRSA6IDAsDQorCQkJICAgIHRvcCwg
YWRkciwgY29udHJvbCwgdGQpOw0KKwkJCWlmIChkb250cm91dGUpIHsNCisJ
CQkJU09DS19MT0NLKHNvKTsNCisJCQkJc28tPnNvX29wdGlvbnMgJj0gflNP
X0RPTlRST1VURTsNCisJCQkJU09DS19VTkxPQ0soc28pOw0KKwkJCX0NCisJ
CQljbGVuID0gMDsNCisJCQljb250cm9sID0gTlVMTDsNCisJCQl0b3AgPSBO
VUxMOw0KKwkJCWlmIChlcnJvcikgew0KKwkJCQlTT0NLQlVGX0xPQ0soJnNv
LT5zb19zbmQpOw0KKwkJCQlnb3RvIHJlbGVhc2U7DQorCQkJfQ0KIAkJfSB3
aGlsZSAocmVzaWQgJiYgc3BhY2UgPiAwKTsNCiAJCVNPQ0tCVUZfTE9DSygm
c28tPnNvX3NuZCk7DQogCX0gd2hpbGUgKHJlc2lkKTsNCg==
--0-429716139-1172748644=:13593
Content-Type: TEXT/plain; charset=US-ASCII; name=sosend_dgram.diff
Content-Transfer-Encoding: BASE64
Content-ID: <20070301113044.G13593@fledge.watson.org>
Content-Description:
Content-Disposition: attachment; filename=sosend_dgram.diff
SW5kZXg6IGtlcm4vdWlwY19zb2NrZXQuYw0KPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQ0KUkNTIGZpbGU6IC9ob21lL25jdnMvc3JjL3N5cy9rZXJuL3VpcGNf
c29ja2V0LmMsdg0KcmV0cmlldmluZyByZXZpc2lvbiAxLjI0Mi4yLjgNCmRp
ZmYgLXUgLXIxLjI0Mi4yLjggdWlwY19zb2NrZXQuYw0KLS0tIGtlcm4vdWlw
Y19zb2NrZXQuYwkzIEZlYiAyMDA3IDA0OjAxOjIyIC0wMDAwCTEuMjQyLjIu
OA0KKysrIGtlcm4vdWlwY19zb2NrZXQuYwkxIE1hciAyMDA3IDExOjI3OjEx
IC0wMDAwDQpAQCAtNTg0LDcgKzU4NCwzMDEgQEANCiAJcmV0dXJuIChlcnJv
cik7DQogfQ0KIA0KKyNpZmRlZiBaRVJPX0NPUFlfU09DS0VUUw0KK3N0cnVj
dCBzb196ZXJvY29weV9zdGF0c3sNCisJaW50IHNpemVfb2s7DQorCWludCBh
bGlnbl9vazsNCisJaW50IGZvdW5kX2lmcDsNCit9Ow0KK3N0cnVjdCBzb196
ZXJvY29weV9zdGF0cyBzb196ZXJvY3Bfc3RhdHMgPSB7MCwwLDB9Ow0KKyNp
bmNsdWRlIDxuZXRpbmV0L2luLmg+DQorI2luY2x1ZGUgPG5ldC9yb3V0ZS5o
Pg0KKyNpbmNsdWRlIDxuZXRpbmV0L2luX3BjYi5oPg0KKyNpbmNsdWRlIDx2
bS92bS5oPg0KKyNpbmNsdWRlIDx2bS92bV9wYWdlLmg+DQorI2luY2x1ZGUg
PHZtL3ZtX29iamVjdC5oPg0KKyNlbmRpZiAvKlpFUk9fQ09QWV9TT0NLRVRT
Ki8NCisNCisvKg0KKyAqIHNvc2VuZF9jb3B5aW4oKSBhY2NlcHRzIGEgdWlv
IGFuZCBwcmVwYXJlcyBhbiBtYnVmIGNoYWluIGhvbGRpbmcgcGFydCBvcg0K
KyAqIGFsbCBvZiB0aGUgZGF0YSByZWZlcmVuY2VkIGJ5IHRoZSB1aW8uICBJ
ZiBkZXNpcmVkLCBpdCB1c2VzIHplcm8tY29weS4NCisgKiAqc3BhY2Ugd2ls
bCBiZSB1cGRhdGVkIHRvIHJlZmxlY3QgZGF0YSBjb3BpZWQgaW4uDQorICoN
CisgKiBOQjogSWYgYXRvbWljIEkvTyBpcyByZXF1ZXN0ZWQsIHRoZSBjYWxs
ZXIgbXVzdCBhbHJlYWR5IGhhdmUgY2hlY2tlZCB0aGF0DQorICogc3BhY2Ug
Y2FuIGhvbGQgcmVzaWQgYnl0ZXMuDQorICoNCisgKiBOQjogSW4gdGhlIGV2
ZW50IG9mIGFuIGVycm9yLCB0aGUgY2FsbGVyIG1heSBuZWVkIHRvIGZyZWUg
dGhlIHBhcnRpYWwNCisgKiBjaGFpbiBwb2ludGVkIHRvIGJ5ICptcHAuICBU
aGUgY29udGVudHMgb2YgYm90aCAqdWlvIGFuZCAqc3BhY2UgbWF5IGJlDQor
ICogbW9kaWZpZWQgZXZlbiBpbiB0aGUgY2FzZSBvZiBhbiBlcnJvci4NCisg
Ki8NCitzdGF0aWMgaW50DQorc29zZW5kX2NvcHlpbihzdHJ1Y3QgdWlvICp1
aW8sIHN0cnVjdCBtYnVmICoqcmV0bXAsIGludCBhdG9taWMsIGxvbmcgKnNw
YWNlLA0KKyAgICBpbnQgZmxhZ3MpDQorew0KKwlzdHJ1Y3QgbWJ1ZiAqbSwg
KiptcCwgKnRvcDsNCisJbG9uZyBsZW4sIHJlc2lkOw0KKwlpbnQgZXJyb3I7
DQorI2lmZGVmIFpFUk9fQ09QWV9TT0NLRVRTDQorCWludCBjb3dfc2VuZDsN
CisjZW5kaWYNCisNCisJKnJldG1wID0gdG9wID0gTlVMTDsNCisJbXAgPSAm
dG9wOw0KKwlsZW4gPSAwOw0KKwlyZXNpZCA9IHVpby0+dWlvX3Jlc2lkOw0K
KwllcnJvciA9IDA7DQorCWRvIHsNCisjaWZkZWYgWkVST19DT1BZX1NPQ0tF
VFMNCisJCWNvd19zZW5kID0gMDsNCisjZW5kaWYgLyogWkVST19DT1BZX1NP
Q0tFVFMgKi8NCisJCWlmIChyZXNpZCA+PSBNSU5DTFNJWkUpIHsNCisjaWZk
ZWYgWkVST19DT1BZX1NPQ0tFVFMNCisJCQlpZiAodG9wID09IE5VTEwpIHsN
CisJCQkJTUdFVEhEUihtLCBNX1RSWVdBSVQsIE1UX0RBVEEpOw0KKwkJCQlp
ZiAobSA9PSBOVUxMKSB7DQorCQkJCQllcnJvciA9IEVOT0JVRlM7DQorCQkJ
CQlnb3RvIG91dDsNCisJCQkJfQ0KKwkJCQltLT5tX3BrdGhkci5sZW4gPSAw
Ow0KKwkJCQltLT5tX3BrdGhkci5yY3ZpZiA9IE5VTEw7IA0KKwkJCX0gZWxz
ZSB7DQorCQkJCU1HRVQobSwgTV9UUllXQUlULCBNVF9EQVRBKTsNCisJCQkJ
aWYgKG0gPT0gTlVMTCkgew0KKwkJCQkJZXJyb3IgPSBFTk9CVUZTOw0KKwkJ
CQkJZ290byBvdXQ7DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHNvX3plcm9f
Y29weV9zZW5kICYmDQorCQkJICAgIHJlc2lkPj1QQUdFX1NJWkUgJiYNCisJ
CQkgICAgKnNwYWNlPj1QQUdFX1NJWkUgJiYNCisJCQkgICAgdWlvLT51aW9f
aW92LT5pb3ZfbGVuPj1QQUdFX1NJWkUpIHsNCisJCQkJc29femVyb2NwX3N0
YXRzLnNpemVfb2srKzsNCisJCQkJc29femVyb2NwX3N0YXRzLmFsaWduX29r
Kys7DQorCQkJCWNvd19zZW5kID0gc29jb3dfc2V0dXAobSwgdWlvKTsNCisJ
CQkJbGVuID0gY293X3NlbmQ7DQorCQkJfQ0KKwkJCWlmICghY293X3NlbmQp
IHsNCisJCQkJTUNMR0VUKG0sIE1fVFJZV0FJVCk7DQorCQkJCWlmICgobS0+
bV9mbGFncyAmIE1fRVhUKSA9PSAwKSB7DQorCQkJCQltX2ZyZWUobSk7DQor
CQkJCQltID0gTlVMTDsNCisJCQkJfSBlbHNlIHsNCisJCQkJCWxlbiA9IG1p
bihtaW4oTUNMQllURVMsIHJlc2lkKSwNCisJCQkJCSAgICAqc3BhY2UpOw0K
KwkJCQl9DQorCQkJfQ0KKyNlbHNlIC8qIFpFUk9fQ09QWV9TT0NLRVRTICov
DQorCQkJaWYgKHRvcCA9PSBOVUxMKSB7DQorCQkJCW0gPSBtX2dldGNsKE1f
VFJZV0FJVCwgTVRfREFUQSwgTV9QS1RIRFIpOw0KKwkJCQltLT5tX3BrdGhk
ci5sZW4gPSAwOw0KKwkJCQltLT5tX3BrdGhkci5yY3ZpZiA9IE5VTEw7DQor
CQkJfSBlbHNlDQorCQkJCW0gPSBtX2dldGNsKE1fVFJZV0FJVCwgTVRfREFU
QSwgMCk7DQorCQkJbGVuID0gbWluKG1pbihNQ0xCWVRFUywgcmVzaWQpLCAq
c3BhY2UpOw0KKyNlbmRpZiAvKiBaRVJPX0NPUFlfU09DS0VUUyAqLw0KKwkJ
fSBlbHNlIHsNCisJCQlpZiAodG9wID09IE5VTEwpIHsNCisJCQkJbSA9IG1f
Z2V0aGRyKE1fVFJZV0FJVCwgTVRfREFUQSk7DQorCQkJCW0tPm1fcGt0aGRy
LmxlbiA9IDA7DQorCQkJCW0tPm1fcGt0aGRyLnJjdmlmID0gTlVMTDsNCisN
CisJCQkJbGVuID0gbWluKG1pbihNSExFTiwgcmVzaWQpLCAqc3BhY2UpOw0K
KwkJCQkvKg0KKwkJCQkgKiBGb3IgZGF0YWdyYW0gcHJvdG9jb2xzLCBsZWF2
ZSByb29tDQorCQkJCSAqIGZvciBwcm90b2NvbCBoZWFkZXJzIGluIGZpcnN0
IG1idWYuDQorCQkJCSAqLw0KKwkJCQlpZiAoYXRvbWljICYmIG0gJiYgbGVu
IDwgTUhMRU4pDQorCQkJCQlNSF9BTElHTihtLCBsZW4pOw0KKwkJCX0gZWxz
ZSB7DQorCQkJCW0gPSBtX2dldChNX1RSWVdBSVQsIE1UX0RBVEEpOw0KKwkJ
CQlsZW4gPSBtaW4obWluKE1MRU4sIHJlc2lkKSwgKnNwYWNlKTsNCisJCQl9
DQorCQl9DQorCQlpZiAobSA9PSBOVUxMKSB7DQorCQkJZXJyb3IgPSBFTk9C
VUZTOw0KKwkJCWdvdG8gb3V0Ow0KKwkJfQ0KKw0KKwkJKnNwYWNlIC09IGxl
bjsNCisjaWZkZWYgWkVST19DT1BZX1NPQ0tFVFMNCisJCWlmIChjb3dfc2Vu
ZCkNCisJCQllcnJvciA9IDA7DQorCQllbHNlDQorI2VuZGlmIC8qIFpFUk9f
Q09QWV9TT0NLRVRTICovDQorCQllcnJvciA9IHVpb21vdmUobXRvZChtLCB2
b2lkICopLCAoaW50KWxlbiwgdWlvKTsNCisJCXJlc2lkID0gdWlvLT51aW9f
cmVzaWQ7DQorCQltLT5tX2xlbiA9IGxlbjsNCisJCSptcCA9IG07DQorCQl0
b3AtPm1fcGt0aGRyLmxlbiArPSBsZW47DQorCQlpZiAoZXJyb3IpDQorCQkJ
Z290byBvdXQ7DQorCQltcCA9ICZtLT5tX25leHQ7DQorCQlpZiAocmVzaWQg
PD0gMCkgew0KKwkJCWlmIChmbGFncyAmIE1TR19FT1IpDQorCQkJCXRvcC0+
bV9mbGFncyB8PSBNX0VPUjsNCisJCQlicmVhazsNCisJCX0NCisJfSB3aGls
ZSAoKnNwYWNlID4gMCAmJiBhdG9taWMpOw0KK291dDoNCisJKnJldG1wID0g
dG9wOw0KKwlyZXR1cm4gKGVycm9yKTsNCit9DQorDQogI2RlZmluZQlTQkxP
Q0tXQUlUKGYpCSgoKGYpICYgTVNHX0RPTlRXQUlUKSA/IE1fTk9XQUlUIDog
TV9XQUlUT0spDQorDQoraW50DQorc29zZW5kX2RncmFtKHNvLCBhZGRyLCB1
aW8sIHRvcCwgY29udHJvbCwgZmxhZ3MsIHRkKQ0KKwlzdHJ1Y3Qgc29ja2V0
ICpzbzsNCisJc3RydWN0IHNvY2thZGRyICphZGRyOw0KKwlzdHJ1Y3QgdWlv
ICp1aW87DQorCXN0cnVjdCBtYnVmICp0b3A7DQorCXN0cnVjdCBtYnVmICpj
b250cm9sOw0KKwlpbnQgZmxhZ3M7DQorCXN0cnVjdCB0aHJlYWQgKnRkOw0K
K3sNCisJbG9uZyBzcGFjZSwgcmVzaWQ7DQorCWludCBjbGVuID0gMCwgZXJy
b3IsIGRvbnRyb3V0ZTsNCisJaW50IGF0b21pYyA9IHNvc2VuZGFsbGF0b25j
ZShzbykgfHwgdG9wOw0KKw0KKwlLQVNTRVJUKHNvLT5zb190eXBlID09IFNP
Q0tfREdSQU0sICgic29kZ3JhbV9zZW5kOiAhU09DS19ER1JBTSIpKTsNCisJ
S0FTU0VSVChzby0+c29fcHJvdG8tPnByX2ZsYWdzICYgUFJfQVRPTUlDLA0K
KwkgICAgKCJzb2RncmFtX3NlbmQ6ICFQUl9BVE9NSUMiKSk7DQorDQorCWlm
ICh1aW8gIT0gTlVMTCkNCisJCXJlc2lkID0gdWlvLT51aW9fcmVzaWQ7DQor
CWVsc2UNCisJCXJlc2lkID0gdG9wLT5tX3BrdGhkci5sZW47DQorCS8qDQor
CSAqIEluIHRoZW9yeSByZXNpZCBzaG91bGQgYmUgdW5zaWduZWQuDQorCSAq
IEhvd2V2ZXIsIHNwYWNlIG11c3QgYmUgc2lnbmVkLCBhcyBpdCBtaWdodCBi
ZSBsZXNzIHRoYW4gMA0KKwkgKiBpZiB3ZSBvdmVyLWNvbW1pdHRlZCwgYW5k
IHdlIG11c3QgdXNlIGEgc2lnbmVkIGNvbXBhcmlzb24NCisJICogb2Ygc3Bh
Y2UgYW5kIHJlc2lkLiAgT24gdGhlIG90aGVyIGhhbmQsIGEgbmVnYXRpdmUg
cmVzaWQNCisJICogY2F1c2VzIHVzIHRvIGxvb3Agc2VuZGluZyAwLWxlbmd0
aCBzZWdtZW50cyB0byB0aGUgcHJvdG9jb2wuDQorCSAqDQorCSAqIEFsc28g
Y2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgTVNHX0VPUiBpc24ndCB1c2VkIG9u
IFNPQ0tfU1RSRUFNDQorCSAqIHR5cGUgc29ja2V0cyBzaW5jZSB0aGF0J3Mg
YW4gZXJyb3IuDQorCSAqLw0KKwlpZiAocmVzaWQgPCAwKSB7DQorCQllcnJv
ciA9IEVJTlZBTDsNCisJCWdvdG8gb3V0Ow0KKwl9DQorDQorCWRvbnRyb3V0
ZSA9DQorCSAgICAoZmxhZ3MgJiBNU0dfRE9OVFJPVVRFKSAmJiAoc28tPnNv
X29wdGlvbnMgJiBTT19ET05UUk9VVEUpID09IDA7DQorCWlmICh0ZCAhPSBO
VUxMKQ0KKwkJdGQtPnRkX3Byb2MtPnBfc3RhdHMtPnBfcnUucnVfbXNnc25k
Kys7DQorCWlmIChjb250cm9sICE9IE5VTEwpDQorCQljbGVuID0gY29udHJv
bC0+bV9sZW47DQorDQorCVNPQ0tCVUZfTE9DSygmc28tPnNvX3NuZCk7DQor
CWlmIChzby0+c29fc25kLnNiX3N0YXRlICYgU0JTX0NBTlRTRU5ETU9SRSkg
ew0KKwkJU09DS0JVRl9VTkxPQ0soJnNvLT5zb19zbmQpOw0KKwkJZXJyb3Ig
PSBFUElQRTsNCisJCWdvdG8gb3V0Ow0KKwl9DQorCWlmIChzby0+c29fZXJy
b3IpIHsNCisJCWVycm9yID0gc28tPnNvX2Vycm9yOw0KKwkJc28tPnNvX2Vy
cm9yID0gMDsNCisJCVNPQ0tCVUZfVU5MT0NLKCZzby0+c29fc25kKTsNCisJ
CWdvdG8gb3V0Ow0KKwl9DQorCWlmICgoc28tPnNvX3N0YXRlICYgU1NfSVND
T05ORUNURUQpID09IDApIHsNCisJCS8qDQorCQkgKiBgc2VuZHRvJyBhbmQg
YHNlbmRtc2cnIGlzIGFsbG93ZWQgb24gYSBjb25uZWN0aW9uLQ0KKwkJICog
YmFzZWQgc29ja2V0IGlmIGl0IHN1cHBvcnRzIGltcGxpZWQgY29ubmVjdC4N
CisJCSAqIFJldHVybiBFTk9UQ09OTiBpZiBub3QgY29ubmVjdGVkIGFuZCBu
byBhZGRyZXNzIGlzDQorCQkgKiBzdXBwbGllZC4NCisJCSAqLw0KKwkJaWYg
KChzby0+c29fcHJvdG8tPnByX2ZsYWdzICYgUFJfQ09OTlJFUVVJUkVEKSAm
Jg0KKwkJICAgIChzby0+c29fcHJvdG8tPnByX2ZsYWdzICYgUFJfSU1QTE9Q
Q0wpID09IDApIHsNCisJCQlpZiAoKHNvLT5zb19zdGF0ZSAmIFNTX0lTQ09O
RklSTUlORykgPT0gMCAmJg0KKwkJCSAgICAhKHJlc2lkID09IDAgJiYgY2xl
biAhPSAwKSkgew0KKwkJCQlTT0NLQlVGX1VOTE9DSygmc28tPnNvX3NuZCk7
DQorCQkJCWVycm9yID0gRU5PVENPTk47DQorCQkJCWdvdG8gb3V0Ow0KKwkJ
CX0NCisJCX0gZWxzZSBpZiAoYWRkciA9PSBOVUxMKSB7DQorCQkJaWYgKHNv
LT5zb19wcm90by0+cHJfZmxhZ3MgJiBQUl9DT05OUkVRVUlSRUQpDQorCQkJ
CWVycm9yID0gRU5PVENPTk47DQorCQkJZWxzZQ0KKwkJCQllcnJvciA9IEVE
RVNUQUREUlJFUTsNCisJCQlTT0NLQlVGX1VOTE9DSygmc28tPnNvX3NuZCk7
DQorCQkJZ290byBvdXQ7DQorCQl9DQorCX0NCisNCisJLyoNCisJICogRG8g
d2UgbmVlZCBNU0dfT09CIHN1cHBvcnQgaW4gU09DS19ER1JBTT8gIFNpZ25z
IGhlcmUgbWF5IGJlIGENCisJICogcHJvYmxlbSBhbmQgbmVlZCBmaXhpbmcu
DQorCSAqLw0KKwlzcGFjZSA9IHNic3BhY2UoJnNvLT5zb19zbmQpOw0KKwlp
ZiAoZmxhZ3MgJiBNU0dfT09CKQ0KKwkJc3BhY2UgKz0gMTAyNDsNCisJc3Bh
Y2UgLT0gY2xlbjsNCisJaWYgKHJlc2lkID4gc3BhY2UpIHsNCisJCWVycm9y
ID0gRU1TR1NJWkU7DQorCQlnb3RvIG91dDsNCisJfQ0KKwlTT0NLQlVGX1VO
TE9DSygmc28tPnNvX3NuZCk7DQorCWlmICh1aW8gPT0gTlVMTCkgew0KKwkJ
cmVzaWQgPSAwOw0KKwkJaWYgKGZsYWdzICYgTVNHX0VPUikNCisJCQl0b3At
Pm1fZmxhZ3MgfD0gTV9FT1I7DQorCX0gZWxzZSB7DQorCQllcnJvciA9IHNv
c2VuZF9jb3B5aW4odWlvLCAmdG9wLCBhdG9taWMsICZzcGFjZSwgZmxhZ3Mp
Ow0KKwkJaWYgKGVycm9yKQ0KKwkJCWdvdG8gb3V0Ow0KKwkJcmVzaWQgPSB1
aW8tPnVpb19yZXNpZDsNCisJfQ0KKwlLQVNTRVJUKHJlc2lkID09IDAsICgi
c29zZW5kX2RncmFtOiByZXNpZCAhPSAwIikpOw0KKwkvKg0KKwkgKiBYWFhS
VzogRnJvYmJpbmcgU09fRE9OVFJPVVRFIGhlcmUgaXMgZXZlbiB3b3JzZSB3
aXRob3V0IHNibG9jaw0KKwkgKiB0aGFuIHdpdGguDQorCSAqLw0KKwlpZiAo
ZG9udHJvdXRlKSB7DQorCQlTT0NLX0xPQ0soc28pOw0KKwkJc28tPnNvX29w
dGlvbnMgfD0gU09fRE9OVFJPVVRFOw0KKwkJU09DS19VTkxPQ0soc28pOw0K
Kwl9DQorCS8qDQorCSAqIFhYWCBhbGwgdGhlIFNCU19DQU5UU0VORE1PUkUg
Y2hlY2tzIHByZXZpb3VzbHkNCisJICogZG9uZSBjb3VsZCBiZSBvdXQgb2Yg
ZGF0ZS4gIFdlIGNvdWxkIGhhdmUgcmVjaWV2ZWQNCisJICogYSByZXNldCBw
YWNrZXQgaW4gYW4gaW50ZXJydXB0IG9yIG1heWJlIHdlIHNsZXB0DQorCSAq
IHdoaWxlIGRvaW5nIHBhZ2UgZmF1bHRzIGluIHVpb21vdmUoKSBldGMuIFdl
IGNvdWxkDQorCSAqIHByb2JhYmx5IHJlY2hlY2sgYWdhaW4gaW5zaWRlIHRo
ZSBsb2NraW5nIHByb3RlY3Rpb24NCisJICogaGVyZSwgYnV0IHRoZXJlIGFy
ZSBwcm9iYWJseSBvdGhlciBwbGFjZXMgdGhhdCB0aGlzDQorCSAqIGFsc28g
aGFwcGVucy4gIFdlIG11c3QgcmV0aGluayB0aGlzLg0KKwkgKi8NCisJZXJy
b3IgPSAoKnNvLT5zb19wcm90by0+cHJfdXNycmVxcy0+cHJ1X3NlbmQpKHNv
LA0KKwkgICAgKGZsYWdzICYgTVNHX09PQikgPyBQUlVTX09PQiA6DQorCS8q
DQorCSAqIElmIHRoZSB1c2VyIHNldCBNU0dfRU9GLCB0aGUgcHJvdG9jb2wN
CisJICogdW5kZXJzdGFuZHMgdGhpcyBmbGFnIGFuZCBub3RoaW5nIGxlZnQg
dG8NCisJICogc2VuZCB0aGVuIHVzZSBQUlVfU0VORF9FT0YgaW5zdGVhZCBv
ZiBQUlVfU0VORC4NCisJICovDQorCSAgICAoKGZsYWdzICYgTVNHX0VPRikg
JiYNCisJICAgICAoc28tPnNvX3Byb3RvLT5wcl9mbGFncyAmIFBSX0lNUExP
UENMKSAmJg0KKwkgICAgIChyZXNpZCA8PSAwKSkgPw0KKwkJUFJVU19FT0Yg
Og0KKwkJLyogSWYgdGhlcmUgaXMgbW9yZSB0byBzZW5kIHNldCBQUlVTX01P
UkVUT0NPTUUgKi8NCisJCShyZXNpZCA+IDAgJiYgc3BhY2UgPiAwKSA/IFBS
VVNfTU9SRVRPQ09NRSA6IDAsDQorCQl0b3AsIGFkZHIsIGNvbnRyb2wsIHRk
KTsNCisJaWYgKGRvbnRyb3V0ZSkgew0KKwkJU09DS19MT0NLKHNvKTsNCisJ
CXNvLT5zb19vcHRpb25zICY9IH5TT19ET05UUk9VVEU7DQorCQlTT0NLX1VO
TE9DSyhzbyk7DQorCX0NCisJY2xlbiA9IDA7DQorCWNvbnRyb2wgPSBOVUxM
Ow0KKwl0b3AgPSBOVUxMOw0KK291dDoNCisJaWYgKHRvcCAhPSBOVUxMKQ0K
KwkJbV9mcmVlbSh0b3ApOw0KKwlpZiAoY29udHJvbCAhPSBOVUxMKQ0KKwkJ
bV9mcmVlbShjb250cm9sKTsNCisJcmV0dXJuIChlcnJvcik7DQorfQ0KKw0K
IC8qDQogICogU2VuZCBvbiBhIHNvY2tldC4NCiAgKiBJZiBzZW5kIG11c3Qg
Z28gYWxsIGF0IG9uY2UgYW5kIG1lc3NhZ2UgaXMgbGFyZ2VyIHRoYW4NCkBA
IC02MDIsMjIgKzg5Niw3IEBADQogICogbXVzdCBjaGVjayBmb3Igc2hvcnQg
Y291bnRzIGlmIEVJTlRSL0VSRVNUQVJUIGFyZSByZXR1cm5lZC4NCiAgKiBE
YXRhIGFuZCBjb250cm9sIGJ1ZmZlcnMgYXJlIGZyZWVkIG9uIHJldHVybi4N
CiAgKi8NCi0NCi0jaWZkZWYgWkVST19DT1BZX1NPQ0tFVFMNCi1zdHJ1Y3Qg
c29femVyb2NvcHlfc3RhdHN7DQotCWludCBzaXplX29rOw0KLQlpbnQgYWxp
Z25fb2s7DQotCWludCBmb3VuZF9pZnA7DQotfTsNCi1zdHJ1Y3Qgc29femVy
b2NvcHlfc3RhdHMgc29femVyb2NwX3N0YXRzID0gezAsMCwwfTsNCi0jaW5j
bHVkZSA8bmV0aW5ldC9pbi5oPg0KLSNpbmNsdWRlIDxuZXQvcm91dGUuaD4N
Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbl9wY2IuaD4NCi0jaW5jbHVkZSA8dm0v
dm0uaD4NCi0jaW5jbHVkZSA8dm0vdm1fcGFnZS5oPg0KLSNpbmNsdWRlIDx2
bS92bV9vYmplY3QuaD4NCi0jZW5kaWYgLypaRVJPX0NPUFlfU09DS0VUUyov
DQotDQorI2RlZmluZQlzbmRlcnIoZXJybm8pCXsgZXJyb3IgPSAoZXJybm8p
OyBnb3RvIHJlbGVhc2U7IH0NCiBpbnQNCiBzb3NlbmQoc28sIGFkZHIsIHVp
bywgdG9wLCBjb250cm9sLCBmbGFncywgdGQpDQogCXN0cnVjdCBzb2NrZXQg
KnNvOw0KQEAgLTYyOCwxNCArOTA3LDkgQEANCiAJaW50IGZsYWdzOw0KIAlz
dHJ1Y3QgdGhyZWFkICp0ZDsNCiB7DQotCXN0cnVjdCBtYnVmICoqbXA7DQot
CXN0cnVjdCBtYnVmICptOw0KLQlsb25nIHNwYWNlLCBsZW4gPSAwLCByZXNp
ZDsNCisJbG9uZyBzcGFjZSwgcmVzaWQ7DQogCWludCBjbGVuID0gMCwgZXJy
b3IsIGRvbnRyb3V0ZTsNCiAJaW50IGF0b21pYyA9IHNvc2VuZGFsbGF0b25j
ZShzbykgfHwgdG9wOw0KLSNpZmRlZiBaRVJPX0NPUFlfU09DS0VUUw0KLQlp
bnQgY293X3NlbmQ7DQotI2VuZGlmIC8qIFpFUk9fQ09QWV9TT0NLRVRTICov
DQogDQogCWlmICh1aW8gIT0gTlVMTCkNCiAJCXJlc2lkID0gdWlvLT51aW9f
cmVzaWQ7DQpAQCAtNjYzLDcgKzkzNyw2IEBADQogCQl0ZC0+dGRfcHJvYy0+
cF9zdGF0cy0+cF9ydS5ydV9tc2dzbmQrKzsNCiAJaWYgKGNvbnRyb2wgIT0g
TlVMTCkNCiAJCWNsZW4gPSBjb250cm9sLT5tX2xlbjsNCi0jZGVmaW5lCXNu
ZGVycihlcnJubykJeyBlcnJvciA9IChlcnJubyk7IGdvdG8gcmVsZWFzZTsg
fQ0KIA0KIAlTT0NLQlVGX0xPQ0soJnNvLT5zb19zbmQpOw0KIHJlc3RhcnQ6
DQpAQCAtNzEzLDE1MyArOTg2LDYxIEBADQogCQkJZ290byByZXN0YXJ0Ow0K
IAkJfQ0KIAkJU09DS0JVRl9VTkxPQ0soJnNvLT5zb19zbmQpOw0KLQkJbXAg
PSAmdG9wOw0KIAkJc3BhY2UgLT0gY2xlbjsNCiAJCWRvIHsNCi0JCSAgICBp
ZiAodWlvID09IE5VTEwpIHsNCi0JCQkvKg0KLQkJCSAqIERhdGEgaXMgcHJl
cGFja2FnZWQgaW4gInRvcCIuDQotCQkJICovDQotCQkJcmVzaWQgPSAwOw0K
LQkJCWlmIChmbGFncyAmIE1TR19FT1IpDQotCQkJCXRvcC0+bV9mbGFncyB8
PSBNX0VPUjsNCi0JCSAgICB9IGVsc2UgZG8gew0KLSNpZmRlZiBaRVJPX0NP
UFlfU09DS0VUUw0KLQkJCWNvd19zZW5kID0gMDsNCi0jZW5kaWYgLyogWkVS
T19DT1BZX1NPQ0tFVFMgKi8NCi0JCQlpZiAocmVzaWQgPj0gTUlOQ0xTSVpF
KSB7DQotI2lmZGVmIFpFUk9fQ09QWV9TT0NLRVRTDQotCQkJCWlmICh0b3Ag
PT0gTlVMTCkgew0KLQkJCQkJTUdFVEhEUihtLCBNX1RSWVdBSVQsIE1UX0RB
VEEpOw0KLQkJCQkJaWYgKG0gPT0gTlVMTCkgew0KLQkJCQkJCWVycm9yID0g
RU5PQlVGUzsNCi0JCQkJCQlTT0NLQlVGX0xPQ0soJnNvLT5zb19zbmQpOw0K
LQkJCQkJCWdvdG8gcmVsZWFzZTsNCi0JCQkJCX0NCi0JCQkJCW0tPm1fcGt0
aGRyLmxlbiA9IDA7DQotCQkJCQltLT5tX3BrdGhkci5yY3ZpZiA9IE5VTEw7
IA0KLQkJCQl9IGVsc2Ugew0KLQkJCQkJTUdFVChtLCBNX1RSWVdBSVQsIE1U
X0RBVEEpOw0KLQkJCQkJaWYgKG0gPT0gTlVMTCkgew0KLQkJCQkJCWVycm9y
ID0gRU5PQlVGUzsNCi0JCQkJCQlTT0NLQlVGX0xPQ0soJnNvLT5zb19zbmQp
Ow0KLQkJCQkJCWdvdG8gcmVsZWFzZTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJ
CQlpZiAoc29femVyb19jb3B5X3NlbmQgJiYNCi0JCQkJICAgIHJlc2lkPj1Q
QUdFX1NJWkUgJiYNCi0JCQkJICAgIHNwYWNlPj1QQUdFX1NJWkUgJiYNCi0J
CQkJICAgIHVpby0+dWlvX2lvdi0+aW92X2xlbj49UEFHRV9TSVpFKSB7DQot
CQkJCQlzb196ZXJvY3Bfc3RhdHMuc2l6ZV9vaysrOw0KLQkJCQkJc29femVy
b2NwX3N0YXRzLmFsaWduX29rKys7DQotCQkJCQljb3dfc2VuZCA9IHNvY293
X3NldHVwKG0sIHVpbyk7DQotCQkJCQlsZW4gPSBjb3dfc2VuZDsNCi0JCQkJ
fQ0KLQkJCQlpZiAoIWNvd19zZW5kKSB7DQotCQkJCQlNQ0xHRVQobSwgTV9U
UllXQUlUKTsNCi0JCQkJCWlmICgobS0+bV9mbGFncyAmIE1fRVhUKSA9PSAw
KSB7DQotCQkJCQkJbV9mcmVlKG0pOw0KLQkJCQkJCW0gPSBOVUxMOw0KLQkJ
CQkJfSBlbHNlIHsNCi0JCQkJCQlsZW4gPSBtaW4obWluKE1DTEJZVEVTLCBy
ZXNpZCksIHNwYWNlKTsNCi0JCQkJCX0NCi0JCQkJfQ0KLSNlbHNlIC8qIFpF
Uk9fQ09QWV9TT0NLRVRTICovDQotCQkJCWlmICh0b3AgPT0gTlVMTCkgew0K
LQkJCQkJbSA9IG1fZ2V0Y2woTV9UUllXQUlULCBNVF9EQVRBLCBNX1BLVEhE
Uik7DQotCQkJCQltLT5tX3BrdGhkci5sZW4gPSAwOw0KLQkJCQkJbS0+bV9w
a3RoZHIucmN2aWYgPSBOVUxMOw0KLQkJCQl9IGVsc2UNCi0JCQkJCW0gPSBt
X2dldGNsKE1fVFJZV0FJVCwgTVRfREFUQSwgMCk7DQotCQkJCWxlbiA9IG1p
bihtaW4oTUNMQllURVMsIHJlc2lkKSwgc3BhY2UpOw0KLSNlbmRpZiAvKiBa
RVJPX0NPUFlfU09DS0VUUyAqLw0KKwkJCWlmICh1aW8gPT0gTlVMTCkgew0K
KwkJCQlyZXNpZCA9IDA7DQorCQkJCWlmIChmbGFncyAmIE1TR19FT1IpDQor
CQkJCQl0b3AtPm1fZmxhZ3MgfD0gTV9FT1I7DQogCQkJfSBlbHNlIHsNCi0J
CQkJaWYgKHRvcCA9PSBOVUxMKSB7DQotCQkJCQltID0gbV9nZXRoZHIoTV9U
UllXQUlULCBNVF9EQVRBKTsNCi0JCQkJCW0tPm1fcGt0aGRyLmxlbiA9IDA7
DQotCQkJCQltLT5tX3BrdGhkci5yY3ZpZiA9IE5VTEw7DQotDQotCQkJCQls
ZW4gPSBtaW4obWluKE1ITEVOLCByZXNpZCksIHNwYWNlKTsNCi0JCQkJCS8q
DQotCQkJCQkgKiBGb3IgZGF0YWdyYW0gcHJvdG9jb2xzLCBsZWF2ZSByb29t
DQotCQkJCQkgKiBmb3IgcHJvdG9jb2wgaGVhZGVycyBpbiBmaXJzdCBtYnVm
Lg0KLQkJCQkJICovDQotCQkJCQlpZiAoYXRvbWljICYmIG0gJiYgbGVuIDwg
TUhMRU4pDQotCQkJCQkJTUhfQUxJR04obSwgbGVuKTsNCi0JCQkJfSBlbHNl
IHsNCi0JCQkJCW0gPSBtX2dldChNX1RSWVdBSVQsIE1UX0RBVEEpOw0KLQkJ
CQkJbGVuID0gbWluKG1pbihNTEVOLCByZXNpZCksIHNwYWNlKTsNCisJCQkJ
ZXJyb3IgPSBzb3NlbmRfY29weWluKHVpbywgJnRvcCwgYXRvbWljLA0KKwkJ
CQkgICAgJnNwYWNlLCBmbGFncyk7DQorCQkJCWlmIChlcnJvciAhPSAwKSB7
DQorCQkJCQlTT0NLQlVGX0xPQ0soJnNvLT5zb19zbmQpOw0KKwkJCQkJZ290
byByZWxlYXNlOw0KIAkJCQl9DQorCQkJCXJlc2lkID0gdWlvLT51aW9fcmVz
aWQ7DQogCQkJfQ0KLQkJCWlmIChtID09IE5VTEwpIHsNCi0JCQkJZXJyb3Ig
PSBFTk9CVUZTOw0KLQkJCQlTT0NLQlVGX0xPQ0soJnNvLT5zb19zbmQpOw0K
LQkJCQlnb3RvIHJlbGVhc2U7DQotCQkJfQ0KLQ0KLQkJCXNwYWNlIC09IGxl
bjsNCi0jaWZkZWYgWkVST19DT1BZX1NPQ0tFVFMNCi0JCQlpZiAoY293X3Nl
bmQpDQotCQkJCWVycm9yID0gMDsNCi0JCQllbHNlDQotI2VuZGlmIC8qIFpF
Uk9fQ09QWV9TT0NLRVRTICovDQotCQkJZXJyb3IgPSB1aW9tb3ZlKG10b2Qo
bSwgdm9pZCAqKSwgKGludClsZW4sIHVpbyk7DQotCQkJcmVzaWQgPSB1aW8t
PnVpb19yZXNpZDsNCi0JCQltLT5tX2xlbiA9IGxlbjsNCi0JCQkqbXAgPSBt
Ow0KLQkJCXRvcC0+bV9wa3RoZHIubGVuICs9IGxlbjsNCi0JCQlpZiAoZXJy
b3IpIHsNCi0JCQkJU09DS0JVRl9MT0NLKCZzby0+c29fc25kKTsNCi0JCQkJ
Z290byByZWxlYXNlOw0KLQkJCX0NCi0JCQltcCA9ICZtLT5tX25leHQ7DQot
CQkJaWYgKHJlc2lkIDw9IDApIHsNCi0JCQkJaWYgKGZsYWdzICYgTVNHX0VP
UikNCi0JCQkJCXRvcC0+bV9mbGFncyB8PSBNX0VPUjsNCi0JCQkJYnJlYWs7
DQorCQkJaWYgKGRvbnRyb3V0ZSkgew0KKwkJCQlTT0NLX0xPQ0soc28pOw0K
KwkJCQlzby0+c29fb3B0aW9ucyB8PSBTT19ET05UUk9VVEU7DQorCQkJCVNP
Q0tfVU5MT0NLKHNvKTsNCiAJCQl9DQotCQkgICAgfSB3aGlsZSAoc3BhY2Ug
PiAwICYmIGF0b21pYyk7DQotCQkgICAgaWYgKGRvbnRyb3V0ZSkgew0KLQkJ
CSAgICBTT0NLX0xPQ0soc28pOw0KLQkJCSAgICBzby0+c29fb3B0aW9ucyB8
PSBTT19ET05UUk9VVEU7DQotCQkJICAgIFNPQ0tfVU5MT0NLKHNvKTsNCi0J
CSAgICB9DQotCQkgICAgLyoNCi0JCSAgICAgKiBYWFggYWxsIHRoZSBTQlNf
Q0FOVFNFTkRNT1JFIGNoZWNrcyBwcmV2aW91c2x5DQotCQkgICAgICogZG9u
ZSBjb3VsZCBiZSBvdXQgb2YgZGF0ZS4gIFdlIGNvdWxkIGhhdmUgcmVjaWV2
ZWQNCi0JCSAgICAgKiBhIHJlc2V0IHBhY2tldCBpbiBhbiBpbnRlcnJ1cHQg
b3IgbWF5YmUgd2Ugc2xlcHQNCi0JCSAgICAgKiB3aGlsZSBkb2luZyBwYWdl
IGZhdWx0cyBpbiB1aW9tb3ZlKCkgZXRjLiBXZSBjb3VsZA0KLQkJICAgICAq
IHByb2JhYmx5IHJlY2hlY2sgYWdhaW4gaW5zaWRlIHRoZSBsb2NraW5nIHBy
b3RlY3Rpb24NCi0JCSAgICAgKiBoZXJlLCBidXQgdGhlcmUgYXJlIHByb2Jh
Ymx5IG90aGVyIHBsYWNlcyB0aGF0IHRoaXMNCi0JCSAgICAgKiBhbHNvIGhh
cHBlbnMuICBXZSBtdXN0IHJldGhpbmsgdGhpcy4NCi0JCSAgICAgKi8NCi0J
CSAgICBlcnJvciA9ICgqc28tPnNvX3Byb3RvLT5wcl91c3JyZXFzLT5wcnVf
c2VuZCkoc28sDQotCQkJKGZsYWdzICYgTVNHX09PQikgPyBQUlVTX09PQiA6
DQorCQkJLyoNCisJCQkgKiBYWFggYWxsIHRoZSBTQlNfQ0FOVFNFTkRNT1JF
IGNoZWNrcyBwcmV2aW91c2x5DQorCQkJICogZG9uZSBjb3VsZCBiZSBvdXQg
b2YgZGF0ZS4gIFdlIGNvdWxkIGhhdmUgcmVjaWV2ZWQNCisJCQkgKiBhIHJl
c2V0IHBhY2tldCBpbiBhbiBpbnRlcnJ1cHQgb3IgbWF5YmUgd2Ugc2xlcHQN
CisJCQkgKiB3aGlsZSBkb2luZyBwYWdlIGZhdWx0cyBpbiB1aW9tb3ZlKCkg
ZXRjLiBXZSBjb3VsZA0KKwkJCSAqIHByb2JhYmx5IHJlY2hlY2sgYWdhaW4g
aW5zaWRlIHRoZSBsb2NraW5nIHByb3RlY3Rpb24NCisJCQkgKiBoZXJlLCBi
dXQgdGhlcmUgYXJlIHByb2JhYmx5IG90aGVyIHBsYWNlcyB0aGF0IHRoaXMN
CisJCQkgKiBhbHNvIGhhcHBlbnMuICBXZSBtdXN0IHJldGhpbmsgdGhpcy4N
CisJCQkgKi8NCisJCQllcnJvciA9ICgqc28tPnNvX3Byb3RvLT5wcl91c3Jy
ZXFzLT5wcnVfc2VuZCkoc28sDQorCQkJICAgIChmbGFncyAmIE1TR19PT0Ip
ID8gUFJVU19PT0IgOg0KIAkJCS8qDQogCQkJICogSWYgdGhlIHVzZXIgc2V0
IE1TR19FT0YsIHRoZSBwcm90b2NvbA0KIAkJCSAqIHVuZGVyc3RhbmRzIHRo
aXMgZmxhZyBhbmQgbm90aGluZyBsZWZ0IHRvDQogCQkJICogc2VuZCB0aGVu
IHVzZSBQUlVfU0VORF9FT0YgaW5zdGVhZCBvZiBQUlVfU0VORC4NCiAJCQkg
Ki8NCi0JCQkoKGZsYWdzICYgTVNHX0VPRikgJiYNCi0JCQkgKHNvLT5zb19w
cm90by0+cHJfZmxhZ3MgJiBQUl9JTVBMT1BDTCkgJiYNCi0JCQkgKHJlc2lk
IDw9IDApKSA/DQorCQkJICAgICgoZmxhZ3MgJiBNU0dfRU9GKSAmJg0KKwkJ
CSAgICAgKHNvLT5zb19wcm90by0+cHJfZmxhZ3MgJiBQUl9JTVBMT1BDTCkg
JiYNCisJCQkgICAgIChyZXNpZCA8PSAwKSkgPw0KIAkJCQlQUlVTX0VPRiA6
DQogCQkJLyogSWYgdGhlcmUgaXMgbW9yZSB0byBzZW5kIHNldCBQUlVTX01P
UkVUT0NPTUUgKi8NCi0JCQkocmVzaWQgPiAwICYmIHNwYWNlID4gMCkgPyBQ
UlVTX01PUkVUT0NPTUUgOiAwLA0KLQkJCXRvcCwgYWRkciwgY29udHJvbCwg
dGQpOw0KLQkJICAgIGlmIChkb250cm91dGUpIHsNCi0JCQkgICAgU09DS19M
T0NLKHNvKTsNCi0JCQkgICAgc28tPnNvX29wdGlvbnMgJj0gflNPX0RPTlRS
T1VURTsNCi0JCQkgICAgU09DS19VTkxPQ0soc28pOw0KLQkJICAgIH0NCi0J
CSAgICBjbGVuID0gMDsNCi0JCSAgICBjb250cm9sID0gTlVMTDsNCi0JCSAg
ICB0b3AgPSBOVUxMOw0KLQkJICAgIG1wID0gJnRvcDsNCi0JCSAgICBpZiAo
ZXJyb3IpIHsNCi0JCQlTT0NLQlVGX0xPQ0soJnNvLT5zb19zbmQpOw0KLQkJ
CWdvdG8gcmVsZWFzZTsNCi0JCSAgICB9DQorCQkJICAgIChyZXNpZCA+IDAg
JiYgc3BhY2UgPiAwKSA/IFBSVVNfTU9SRVRPQ09NRSA6IDAsDQorCQkJICAg
IHRvcCwgYWRkciwgY29udHJvbCwgdGQpOw0KKwkJCWlmIChkb250cm91dGUp
IHsNCisJCQkJU09DS19MT0NLKHNvKTsNCisJCQkJc28tPnNvX29wdGlvbnMg
Jj0gflNPX0RPTlRST1VURTsNCisJCQkJU09DS19VTkxPQ0soc28pOw0KKwkJ
CX0NCisJCQljbGVuID0gMDsNCisJCQljb250cm9sID0gTlVMTDsNCisJCQl0
b3AgPSBOVUxMOw0KKwkJCWlmIChlcnJvcikgew0KKwkJCQlTT0NLQlVGX0xP
Q0soJnNvLT5zb19zbmQpOw0KKwkJCQlnb3RvIHJlbGVhc2U7DQorCQkJfQ0K
IAkJfSB3aGlsZSAocmVzaWQgJiYgc3BhY2UgPiAwKTsNCiAJCVNPQ0tCVUZf
TE9DSygmc28tPnNvX3NuZCk7DQogCX0gd2hpbGUgKHJlc2lkKTsNCkBAIC04
NzcsNiArMTA1OCw3IEBADQogCQltX2ZyZWVtKGNvbnRyb2wpOw0KIAlyZXR1
cm4gKGVycm9yKTsNCiB9DQorI3VuZGVmIHNuZGVycg0KIA0KIC8qDQogICog
VGhlIHBhcnQgb2Ygc29yZWNlaXZlKCkgdGhhdCBpbXBsZW1lbnRzIHJlYWRp
bmcgbm9uLWlubGluZSBvdXQtb2YtYmFuZA0KSW5kZXg6IG5ldGluZXQvdWRw
X3VzcnJlcS5jDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpSQ1MgZmlsZTog
L2hvbWUvbmN2cy9zcmMvc3lzL25ldGluZXQvdWRwX3VzcnJlcS5jLHYNCnJl
dHJpZXZpbmcgcmV2aXNpb24gMS4xNzUuMi45DQpkaWZmIC11IC1yMS4xNzUu
Mi45IHVkcF91c3JyZXEuYw0KLS0tIG5ldGluZXQvdWRwX3VzcnJlcS5jCTI5
IERlYyAyMDA2IDE5OjI1OjQ5IC0wMDAwCTEuMTc1LjIuOQ0KKysrIG5ldGlu
ZXQvdWRwX3VzcnJlcS5jCTEgTWFyIDIwMDcgMTE6Mjc6MzQgLTAwMDANCkBA
IC0xMTUwLDYgKzExNTAsNyBAQA0KIAkucHJ1X2Rpc2Nvbm5lY3QgPQl1ZHBf
ZGlzY29ubmVjdCwNCiAJLnBydV9wZWVyYWRkciA9CQl1ZHBfcGVlcmFkZHIs
DQogCS5wcnVfc2VuZCA9CQl1ZHBfc2VuZCwNCisJLnBydV9zb3NlbmQgPQkJ
c29zZW5kX2RncmFtLA0KIAkucHJ1X3NodXRkb3duID0JCXVkcF9zaHV0ZG93
biwNCiAJLnBydV9zb2NrYWRkciA9CQl1ZHBfc29ja2FkZHIsDQogCS5wcnVf
c29zZXRsYWJlbCA9CWluX3BjYnNvc2V0bGFiZWwNCg==
--0-429716139-1172748644=:13593--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20070301111957.S13593>
