From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38889) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WKr89-000483-UI for Qemu-devel@nongnu.org; Tue, 04 Mar 2014 10:19:48 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WKr82-00078R-S1 for Qemu-devel@nongnu.org; Tue, 04 Mar 2014 10:19:41 -0500 Received: from alln-iport-3.cisco.com ([173.37.142.90]:12397) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WKr82-00077Y-Df for Qemu-devel@nongnu.org; Tue, 04 Mar 2014 10:19:34 -0500 From: "Anton Ivanov (antivano)" Date: Tue, 4 Mar 2014 15:19:28 +0000 Message-ID: <5315EEFE.6060605@cisco.com> References: <5310489A.4060501@cisco.com> <53105EB0.3060702@redhat.com> In-Reply-To: <53105EB0.3060702@redhat.com> Content-Language: en-US Content-Type: multipart/mixed; boundary="_002_5315EEFE6060605ciscocom_" MIME-Version: 1.0 Subject: Re: [Qemu-devel] Contribution - L2TPv3 transport List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Paolo Bonzini Cc: "Qemu-devel@nongnu.org" , Stefan Hajnoczi --_002_5315EEFE6060605ciscocom_ Content-Type: text/plain; charset="iso-8859-1" Content-ID: <4E8826F67E01C643B9DE07628AF3AE64@emea.cisco.com> Content-Transfer-Encoding: quoted-printable Attached is a revised version. * I am still keeping the sendmsg instead of iov_send because I have=20 not had the time to review udp.c in the kernel and do the relevant=20 regression testing to see if they connect() still breaks bind() on=20 multihomed hosts as it did in 2.6. We can revisit that at a later date,=20 without doing the proper investigation I am not comfortable trying this. * I have killed completely parse6 and replaced that by a common=20 getaddrinfo() with a selectable address family based on the boolean=20 flags. This also allows to force a specific v4 or v6 address choice for dst= . * addresses now are specified separately from ports and ports are=20 deliberately strings so you can specify them as a protocol. * mode bitmask is gone it is all booleans now - both for option=20 invocation and internally in the code. * I have added the extra offset back in so it is feature by feature=20 compatible with linux kernel implementation. * All mallocs are now to exact size and * Indentation, style, debug, etc are all as requested now. * l2tpv3.h has become surplus to requirements and is gone now. * it now has proper cleanup. * I have tested it for a few setups (mostly v4) and it works as=20 advertised. I need to rewrite my tests scripts for the new options names=20 to give it a full test. I would not expect that to show any problems=20 though - core send/receive logic is unchanged from the original version. * I have not yet addressed the page size and page alignment of=20 buffers items - leaving that open for an RFC on how to get the max=20 performance there and how to make it expandable lately so one can=20 re-configure it for large MTU/jumbo frames. Example magic incantation to invoke it with the new options: #!/bin/sh kvm -hda kvm.img -m 1024 \ -net nic,vlan=3D0,model=3Dvirtio,macaddr=3D0a:98:fc:96:83:01 \ -net l2tpv3,vlan=3D0,udp,src=3D192.168.63.1,srcport=3D1700,dst=3D192.16= 8.63.1,dstport=3D1701,cookie64,txcookie=3D0x0123456789abcdef,rxcookie=3D0xf= edcba9876543210,rxsession=3D0xffffffff,txsession=3D0xffffffff,counter A. --_002_5315EEFE6060605ciscocom_ Content-Type: text/x-patch; name="l2tpv3.diff" Content-Description: l2tpv3.diff Content-Disposition: attachment; filename="l2tpv3.diff"; size=16637; creation-date="Tue, 04 Mar 2014 15:19:28 GMT"; modification-date="Tue, 04 Mar 2014 15:19:28 GMT" Content-ID: Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL25ldC9NYWtlZmlsZS5vYmpzIGIvbmV0L01ha2VmaWxlLm9ianMNCmluZGV4 IDQ4NTRhMTQuLjE2MDIxNGUgMTAwNjQ0DQotLS0gYS9uZXQvTWFrZWZpbGUub2Jqcw0KKysrIGIv bmV0L01ha2VmaWxlLm9ianMNCkBAIC0yLDYgKzIsNyBAQCBjb21tb24tb2JqLXkgPSBuZXQubyBx dWV1ZS5vIGNoZWNrc3VtLm8gdXRpbC5vIGh1Yi5vDQogY29tbW9uLW9iai15ICs9IHNvY2tldC5v DQogY29tbW9uLW9iai15ICs9IGR1bXAubw0KIGNvbW1vbi1vYmoteSArPSBldGgubw0KK2NvbW1v bi1vYmotJChDT05GSUdfTElOVVgpICs9IGwydHB2My5vDQogY29tbW9uLW9iai0kKENPTkZJR19Q T1NJWCkgKz0gdGFwLm8NCiBjb21tb24tb2JqLSQoQ09ORklHX0xJTlVYKSArPSB0YXAtbGludXgu bw0KIGNvbW1vbi1vYmotJChDT05GSUdfV0lOMzIpICs9IHRhcC13aW4zMi5vDQpkaWZmIC0tZ2l0 IGEvbmV0L2NsaWVudHMuaCBiL25ldC9jbGllbnRzLmgNCmluZGV4IDc3OTMyOTQuLmJiZjE3N2Mg MTAwNjQ0DQotLS0gYS9uZXQvY2xpZW50cy5oDQorKysgYi9uZXQvY2xpZW50cy5oDQpAQCAtNDcs NiArNDcsOCBAQCBpbnQgbmV0X2luaXRfdGFwKGNvbnN0IE5ldENsaWVudE9wdGlvbnMgKm9wdHMs IGNvbnN0IGNoYXIgKm5hbWUsDQogaW50IG5ldF9pbml0X2JyaWRnZShjb25zdCBOZXRDbGllbnRP cHRpb25zICpvcHRzLCBjb25zdCBjaGFyICpuYW1lLA0KICAgICAgICAgICAgICAgICAgICAgTmV0 Q2xpZW50U3RhdGUgKnBlZXIpOw0KIA0KK2ludCBuZXRfaW5pdF9sMnRwdjMoY29uc3QgTmV0Q2xp ZW50T3B0aW9ucyAqb3B0cywgY29uc3QgY2hhciAqbmFtZSwNCisgICAgICAgICAgICAgICAgICAg IE5ldENsaWVudFN0YXRlICpwZWVyKTsNCiAjaWZkZWYgQ09ORklHX1ZERQ0KIGludCBuZXRfaW5p dF92ZGUoY29uc3QgTmV0Q2xpZW50T3B0aW9ucyAqb3B0cywgY29uc3QgY2hhciAqbmFtZSwNCiAg ICAgICAgICAgICAgICAgIE5ldENsaWVudFN0YXRlICpwZWVyKTsNCmRpZmYgLS1naXQgYS9uZXQv bDJ0cHYzLmMgYi9uZXQvbDJ0cHYzLmMNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAw MDAwLi4zMDJmYzFkDQotLS0gL2Rldi9udWxsDQorKysgYi9uZXQvbDJ0cHYzLmMNCkBAIC0wLDAg KzEsNTQxIEBADQorLyoNCisgKiBRRU1VIFN5c3RlbSBFbXVsYXRvcg0KKyAqDQorICogQ29weXJp Z2h0IChjKSAyMDAzLTIwMDggRmFicmljZSBCZWxsYXJkDQorICogQ29weXJpZ2h0IChjKSAyMDEy LTIwMTQgQ2lzY28gU3lzdGVtcw0KKyAqDQorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRl ZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQ0KKyAqIG9m IHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJT b2Z0d2FyZSIpLCB0byBkZWFsDQorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rp b24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cw0KKyAqIHRvIHVzZSwg Y29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5k L29yIHNlbGwNCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNv bnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMNCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1Ympl Y3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KKyAqDQorICogVGhlIGFib3ZlIGNvcHly aWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQg aW4NCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2Fy ZS4NCisgKg0KKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdB UlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SDQorICogSU1QTElFRCwgSU5DTFVESU5HIEJV VCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksDQorICog RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4g Tk8gRVZFTlQgU0hBTEwNCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBM SUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUg0KKyAqIExJQUJJTElUWSwgV0hF VEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5H IEZST00sDQorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1Ig VEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTg0KKyAqIFRIRSBTT0ZUV0FSRS4NCisgKi8NCisN CisjaW5jbHVkZSA8bGludXgvaXAuaD4NCisjaW5jbHVkZSA8bmV0ZGIuaD4NCisjaW5jbHVkZSAi Y29uZmlnLWhvc3QuaCINCisjaW5jbHVkZSAibmV0L25ldC5oIg0KKyNpbmNsdWRlICJjbGllbnRz LmgiDQorI2luY2x1ZGUgIm1vbml0b3IvbW9uaXRvci5oIg0KKyNpbmNsdWRlICJxZW11LWNvbW1v bi5oIg0KKyNpbmNsdWRlICJxZW11L2Vycm9yLXJlcG9ydC5oIg0KKyNpbmNsdWRlICJxZW11L29w dGlvbi5oIg0KKyNpbmNsdWRlICJxZW11L3NvY2tldHMuaCINCisjaW5jbHVkZSAicWVtdS9pb3Yu aCINCisjaW5jbHVkZSAicWVtdS9tYWluLWxvb3AuaCINCisNCisNCisNCisNCisjZGVmaW5lIFBB R0VfU0laRSA0MDk2DQorI2RlZmluZSBJT1ZTSVpFIDINCisjZGVmaW5lIE1BWF9MMlRQVjNfTVNH Q05UIDMyIA0KKyNkZWZpbmUgTUFYX0wyVFBWM19JT1ZDTlQgKE1BWF9MMlRQVjNfTVNHQ05UICog SU9WU0laRSkNCisNCisjaWZuZGVmIElQUFJPVE9fTDJUUA0KKyNkZWZpbmUgSVBQUk9UT19MMlRQ IDB4NzMNCisjZW5kaWYNCisNCit0eXBlZGVmIHN0cnVjdCBOZXRMMlRQVjNTdGF0ZSB7DQorICAg IE5ldENsaWVudFN0YXRlIG5jOw0KKyAgICBpbnQgZmQ7DQorICAgIGludCBzdGF0ZTsgDQorICAg IHVuc2lnbmVkIGludCBpbmRleDsNCisgICAgdW5zaWduZWQgaW50IHBhY2tldF9sZW47DQorDQor ICAgIC8qIA0KKyAgICAgKgl0aGVzZSBhcmUgdXNlZCBmb3IgeG1pdCAtIHRoYXQgaGFwcGVucyBw YWNrZXQgYSB0aW1lDQorICAgICAqCWFuZCBmb3IgZmlyc3Qgc2lnbiBvZiBsaWZlIHBhY2tldCAo ZWFzaWVyIHRvIHBhcnNlIHRoYXQgb25jZSkNCisgICAgICovIA0KKw0KKyAgICB1aW50OF90ICog aGVhZGVyX2J1ZjsNCisgICAgc3RydWN0IGlvdmVjICogdmVjOw0KKw0KKyAgICAvKiANCisgICAg ICogdGhlc2UgYXJlIHVzZWQgZm9yIHJlY2VpdmUgLSB0cnkgdG8gImVhdCIgdXAgdG8gMzIgcGFj a2V0cyBhdCBhIHRpbWUNCisgICAgICovDQorDQorICAgIHN0cnVjdCBtbXNnaGRyICogbXNndmVj Ow0KKw0KKyAgICAvKg0KKyAgICAgKiBwZWVyIGFkZHJlc3MNCisgICAgICovDQorDQorICAgIHN0 cnVjdCBzb2NrYWRkcl9zdG9yYWdlICogZGdyYW1fZHN0OyANCisgICAgdWludDMyX3QgZHN0X3Np emU7DQorDQorICAgIC8qDQorICAgICAqIEwyVFB2MyBwYXJhbWV0ZXJzDQorICAgICAqLw0KKw0K KyAgICB1aW50NjRfdCByeF9jb29raWU7DQorICAgIHVpbnQ2NF90IHR4X2Nvb2tpZTsNCisgICAg dWludDMyX3Qgcnhfc2Vzc2lvbjsNCisgICAgdWludDMyX3QgdHhfc2Vzc2lvbjsNCisgICAgdWlu dDMyX3QgaGVhZGVyX3NpemU7DQorICAgIHVpbnQzMl90IGNvdW50ZXI7DQorDQorICAgIC8qDQor ICAgICAqIEJpdG1hc2sgbW9kZSBkZXRlcm1pbmluZyBlbmNhcHMgYmVoYXZpb3VyDQorICAgICAq Lw0KKw0KKyAgICB1aW50MzJfdCBvZmZzZXQ7ICAgDQorICAgIHVpbnQzMl90IGNvb2tpZV9vZmZz ZXQ7DQorICAgIHVpbnQzMl90IGNvdW50ZXJfb2Zmc2V0Ow0KKyAgICB1aW50MzJfdCBzZXNzaW9u X29mZnNldDsNCisNCisgICAgLyogRmxhZ3MgKi8NCisNCisgICAgYm9vbCBpcHY2Ow0KKyAgICBi b29sIHVkcDsNCisgICAgYm9vbCBub2NvdW50ZXI7DQorICAgIGJvb2wgY29va2llOw0KKyAgICBi b29sIGNvb2tpZV9pc182NDsNCisNCit9IE5ldEwyVFBWM1N0YXRlOw0KKw0KK3R5cGVkZWYgc3Ry dWN0IE5ldEwyVFBWM0xpc3RlblN0YXRlIHsNCisgICAgTmV0Q2xpZW50U3RhdGUgbmM7DQorICAg IGNoYXIgKm1vZGVsOw0KKyAgICBjaGFyICpuYW1lOw0KKyAgICBpbnQgZmQ7DQorfSBOZXRMMlRQ VjNMaXN0ZW5TdGF0ZTsNCisNCitzdGF0aWMgaW50IGwydHB2M19mb3JtX2hlYWRlcihOZXRMMlRQ VjNTdGF0ZSAqcykgew0KKyAgICB1aW50MzJfdCAqaGVhZGVyOw0KKyAgICB1aW50MzJfdCAqc2Vz c2lvbjsNCisgICAgdWludDY0X3QgKmNvb2tpZTY0Ow0KKyAgICB1aW50MzJfdCAqY29va2llMzI7 DQorICAgIHVpbnQzMl90ICpjb3VudGVyOw0KKw0KKyAgICBpZiAocy0+dWRwID09IFRSVUUpIHsN CisJaGVhZGVyID0gKHVpbnQzMl90ICopIHMtPmhlYWRlcl9idWY7DQorCXN0bF9iZV9wKGhlYWRl ciwgMHgzMDAwMCk7DQorICAgIH0NCisgICAgc2Vzc2lvbiA9ICh1aW50MzJfdCAqKSAocy0+aGVh ZGVyX2J1ZiArIHMtPnNlc3Npb25fb2Zmc2V0KTsNCisgICAgc3RsX2JlX3Aoc2Vzc2lvbiwgcy0+ dHhfc2Vzc2lvbik7DQorDQorICAgIGlmIChzLT5jb29raWUgPT0gVFJVRSApIHsNCisJaWYgKHMt PmNvb2tpZV9pc182NCA9PSBUUlVFKSB7DQorCSAgICBjb29raWU2NCA9ICh1aW50NjRfdCAqKShz LT5oZWFkZXJfYnVmICsgcy0+Y29va2llX29mZnNldCk7DQorCSAgICBzdHFfYmVfcChjb29raWU2 NCwgcy0+dHhfY29va2llKTsNCisJfSBlbHNlIHsNCisJICAgIGNvb2tpZTMyID0gKHVpbnQzMl90 ICopIChzLT5oZWFkZXJfYnVmICsgcy0+Y29va2llX29mZnNldCk7DQorCSAgICBzdGxfYmVfcChj b29raWUzMiwgcy0+dHhfY29va2llKTsNCisJfQ0KKyAgICB9DQorDQorICAgIGlmIChzLT5ub2Nv dW50ZXIgPT0gRkFMU0UpIHsNCisJY291bnRlciA9ICh1aW50MzJfdCAqKShzLT5oZWFkZXJfYnVm ICsgcy0+Y291bnRlcl9vZmZzZXQpOw0KKwlzdGxfYmVfcChjb3VudGVyLCArKyBzLT5jb3VudGVy KTsNCisgICAgfQ0KKyAgICByZXR1cm4gMDsNCit9DQorDQorc3RhdGljIHNzaXplX3QgbmV0X2wy dHB2M19yZWNlaXZlX2RncmFtX2lvdihOZXRDbGllbnRTdGF0ZSAqbmMsIGNvbnN0IHN0cnVjdCBp b3ZlYyAqaW92LCBpbnQgaW92Y250KQ0KK3sNCisgICAgTmV0TDJUUFYzU3RhdGUgKnMgPSBET19V UENBU1QoTmV0TDJUUFYzU3RhdGUsIG5jLCBuYyk7DQorDQorICAgIHN0cnVjdCBtc2doZHIgbWVz c2FnZTsNCisgICAgaW50IHJldDsNCisNCisgICAgaWYgKGlvdmNudCA+IE1BWF9MMlRQVjNfSU9W Q05UIC0gMSkgew0KKwlmcHJpbnRmKHN0ZGVyciwgImlvdmVjIHRvbyBsb25nICVkID4gJWQsIGNo YW5nZSBsMnRwdjMuaFxuIiwgaW92Y250LCBNQVhfTDJUUFYzX0lPVkNOVCk7DQorCXJldHVybiAt MTsNCisgICAgfQ0KKyAgICBsMnRwdjNfZm9ybV9oZWFkZXIocyk7DQorICAgIG1lbWNweShzLT52 ZWMgKyAxLCBpb3YsIGlvdmNudCAqIHNpemVvZihzdHJ1Y3QgaW92ZWMpKTsNCisgICAgcy0+dmVj LT5pb3ZfYmFzZSA9IHMtPmhlYWRlcl9idWY7DQorICAgIHMtPnZlYy0+aW92X2xlbiA9IHMtPm9m ZnNldDsNCisgICAgbWVzc2FnZS5tc2dfbmFtZSA9IHMtPmRncmFtX2RzdDsNCisgICAgbWVzc2Fn ZS5tc2dfbmFtZWxlbiA9IHMtPmRzdF9zaXplOw0KKyAgICBtZXNzYWdlLm1zZ19pb3YgPSAoc3Ry dWN0IGlvdmVjICopIHMtPnZlYzsNCisgICAgbWVzc2FnZS5tc2dfaW92bGVuID0gaW92Y250ICsg MTsgDQorICAgIG1lc3NhZ2UubXNnX2NvbnRyb2wgPSBOVUxMOw0KKyAgICBtZXNzYWdlLm1zZ19j b250cm9sbGVuID0gMDsNCisgICAgbWVzc2FnZS5tc2dfZmxhZ3MgPSAwOw0KKyAgICByZXQgPSBz ZW5kbXNnKHMtPmZkLCAmbWVzc2FnZSwgTVNHX0RPTlRXQUlUKSAtIHMtPm9mZnNldDsNCisgICAg aWYgKHJldCA8IDApIHsNCisJcmV0ID0gLSBlcnJubzsNCisgICAgfSBlbHNlIGlmIChyZXQgPT0g MCkgew0KKwlyZXQgPSBpb3Zfc2l6ZSAoaW92LCBpb3ZjbnQpOw0KKyAgICB9IGVsc2Ugew0KKwly ZXQgPS0gcy0+b2Zmc2V0OyANCisgICAgfQ0KKyAgICByZXR1cm4gcmV0Ow0KK30NCisNCitzdGF0 aWMgc3NpemVfdCBuZXRfbDJ0cHYzX3JlY2VpdmVfZGdyYW0oTmV0Q2xpZW50U3RhdGUgKm5jLCBj b25zdCB1aW50OF90ICpidWYsIHNpemVfdCBzaXplKQ0KK3sNCisgICAgTmV0TDJUUFYzU3RhdGUg KnMgPSBET19VUENBU1QoTmV0TDJUUFYzU3RhdGUsIG5jLCBuYyk7DQorDQorICAgIHN0cnVjdCBp b3ZlYyAqIHZlYzsNCisgICAgc3RydWN0IG1zZ2hkciBtZXNzYWdlOw0KKyAgICBzc2l6ZV90IHJl dCA9IDA7DQorDQorICAgIGwydHB2M19mb3JtX2hlYWRlcihzKTsNCisgICAgdmVjID0gcy0+dmVj Ow0KKyAgICB2ZWMtPmlvdl9iYXNlID0gcy0+aGVhZGVyX2J1ZjsNCisgICAgdmVjLT5pb3ZfbGVu ID0gcy0+b2Zmc2V0Ow0KKyAgICB2ZWMrKzsNCisgICAgdmVjLT5pb3ZfYmFzZSA9ICh2b2lkICop IGJ1ZjsNCisgICAgdmVjLT5pb3ZfbGVuID0gc2l6ZTsNCisgICAgbWVzc2FnZS5tc2dfbmFtZSA9 IHMtPmRncmFtX2RzdDsNCisgICAgbWVzc2FnZS5tc2dfbmFtZWxlbiA9IHMtPmRzdF9zaXplOw0K KyAgICBtZXNzYWdlLm1zZ19pb3YgPSAoc3RydWN0IGlvdmVjICopIHMtPnZlYzsNCisgICAgbWVz c2FnZS5tc2dfaW92bGVuID0gMjsNCisgICAgbWVzc2FnZS5tc2dfY29udHJvbCA9IE5VTEw7DQor ICAgIG1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSAwOw0KKyAgICBtZXNzYWdlLm1zZ19mbGFncyA9 IDA7DQorICAgIHJldCA9IHNlbmRtc2cocy0+ZmQsICZtZXNzYWdlLCAwKTsNCisgICAgaWYgKHJl dCA8IDApIHsNCisJcmV0ID0gLSBlcnJubzsNCisgICAgfSBlbHNlIGlmIChyZXQgPT0gMCkgew0K KwlyZXQgPSBzaXplOw0KKyAgICB9IGVsc2Ugew0KKwlyZXQgPS0gcy0+b2Zmc2V0OyANCisgICAg fQ0KKyAgICByZXR1cm4gcmV0Ow0KK30NCisNCitzdGF0aWMgaW50IGwydHB2M192ZXJpZnlfaGVh ZGVyKE5ldEwyVFBWM1N0YXRlICpzLCB1aW50OF90ICpidWYpIHsNCisNCisgICAgdWludDY0X3Qg KmNvb2tpZTY0Ow0KKyAgICB1aW50MzJfdCAqY29va2llMzI7DQorICAgIHVpbnQzMl90ICpzZXNz aW9uOw0KKw0KKyAgICBpZiAoKHMtPnVkcCA9PSBGQUxTRSkgJiYgKHMtPmlwdjYgPT0gRkFMU0Up KXsNCisJYnVmICs9IHNpemVvZihzdHJ1Y3QgaXBoZHIpIC8qIGZpeCBmb3IgaXB2NCByYXcgKi87 DQorICAgIH0gDQorICAgIGlmIChzLT5jb29raWUgPT0gVFJVRSkgew0KKwlpZiAocy0+Y29va2ll X2lzXzY0ID09IFRSVUUpIHsNCisJICAgIC8qIDY0IGJpdCBjb29raWUgKi8NCisJICAgIGNvb2tp ZTY0ID0gKHVpbnQ2NF90ICopKGJ1ZiArIHMtPmNvb2tpZV9vZmZzZXQpOw0KKwkgICAgaWYgKCBs ZHFfYmVfcChjb29raWU2NCkgIT0gcy0+cnhfY29va2llKSB7DQorCQlmcHJpbnRmKHN0ZGVyciwg InVua25vd24gY29va2llIGlkXG4iKTsNCisJCXJldHVybiAtMTsgLyogd2UgbmVlZCB0byByZXR1 cm4gMCwgb3RoZXJ3aXNlIGJhcmZ1cyAqLw0KKwkgICAgfQ0KKwl9IGVsc2Ugew0KKwkgICAgY29v a2llMzIgPSAodWludDMyX3QgKikoYnVmICsgcy0+Y29va2llX29mZnNldCk7DQorCSAgICBpZiAo bGRsX2JlX3AoY29va2llMzIpICE9ICogKHVpbnQzMl90ICopICZzLT5yeF9jb29raWUpIHsNCisJ CWZwcmludGYoc3RkZXJyLCJ1bmtub3duIGNvb2tpZSBpZFxuIik7DQorCQlyZXR1cm4gLTEgOyAv KiB3ZSBuZWVkIHRvIHJldHVybiAwLCBvdGhlcndpc2UgYmFyZnVzICovDQorCSAgICB9DQorCX0N CisgICAgfQ0KKyAgICBzZXNzaW9uID0gKHVpbnQzMl90ICopIChidWYgKyBzLT5zZXNzaW9uX29m ZnNldCk7DQorICAgIGlmIChsZGxfYmVfcChzZXNzaW9uKSAhPSBzLT5yeF9zZXNzaW9uKSB7DQor CWZwcmludGYoc3RkZXJyLCJzZXNzaW9uIG1pc21hdGNoXG4iKTsNCisJcmV0dXJuIC0xOw0KKyAg ICB9CQ0KKyAgICByZXR1cm4gMDsNCit9DQorDQorc3RhdGljIHZvaWQgbmV0X2wydHB2M19zZW5k KHZvaWQgKm9wYXF1ZSkNCit7DQorICAgIE5ldEwyVFBWM1N0YXRlICpzID0gb3BhcXVlOw0KKw0K KyAgICBpbnQgaSwgY291bnQsIG9mZnNldDsNCisgICAgc3RydWN0IG1tc2doZHIgKiBtc2d2ZWM7 DQorICAgIHN0cnVjdCBpb3ZlYyAqIHZlYzsNCisNCisgICAgbXNndmVjID0gcy0+bXNndmVjOw0K KyAgICBvZmZzZXQgPSBzLT5vZmZzZXQ7DQorICAgIGlmICgocy0+dWRwID09IEZBTFNFKSAmJiAo cy0+aXB2NiA9PSBGQUxTRSkpew0KKwlvZmZzZXQgKz0gICBzaXplb2Yoc3RydWN0IGlwaGRyKTsN CisgICAgfSAgDQorICAgIGNvdW50ID0gcmVjdm1tc2cocy0+ZmQsIG1zZ3ZlYywgTUFYX0wyVFBW M19NU0dDTlQsIE1TR19ET05UV0FJVCwgTlVMTCk7DQorICAgIGZvciAoaT0wO2k8Y291bnQ7aSsr KSB7DQorCWlmIChtc2d2ZWMtPm1zZ19sZW4gPiAwKSB7DQorCSAgICB2ZWMgPSBtc2d2ZWMtPm1z Z19oZHIubXNnX2lvdjsNCisJICAgIHZlYy0+aW92X2xlbiA9IG9mZnNldDsgLyogYmVsdCBhbmQg YnJhY2VzIC0gcmVzdG9yZSBpb3Ygc2l6ZSAqLw0KKwkgICAgaWYgKChtc2d2ZWMtPm1zZ19sZW4g PiAwKSAmJiAobDJ0cHYzX3ZlcmlmeV9oZWFkZXIocywgdmVjLT5pb3ZfYmFzZSkgPT0gMCkpIHsN CisJCXZlYysrOw0KKwkJcWVtdV9zZW5kX3BhY2tldCgmcy0+bmMsIHZlYy0+aW92X2Jhc2UsIG1z Z3ZlYy0+bXNnX2xlbiAtIG9mZnNldCk7DQorCSAgICB9IGVsc2Ugew0KKwkJZnByaW50ZihzdGRl cnIsICJsMnRwdjMgaGVhZGVyIHZlcmlmaWNhdGlvbiBmYWlsZWRcbiIpOw0KKwkJdmVjKys7IA0K KwkgICAgfQ0KKwkgICAgdmVjLT5pb3ZfbGVuID0gUEFHRV9TSVpFOyAvKiBiZWx0IGFuZCBicmFj ZXMgLSByZXN0b3JlIGlvdiBzaXplICovDQorCX0gDQorCW1zZ3ZlYysrOw0KKyAgICB9DQorfQ0K Kw0KK3N0YXRpYyB2b2lkIGRlc3Ryb3lfdmVjdG9yKHN0cnVjdCBtbXNnaGRyICogbXNndmVjLCBp bnQgY291bnQsIGludCBpb3Zjb3VudCkgew0KKyAgICBpbnQgaSwgajsNCisgICAgc3RydWN0IGlv dmVjICogaW92Ow0KKyAgICBzdHJ1Y3QgbW1zZ2hkciAqIGNsZWFudXAgPSBtc2d2ZWM7DQorICAg IGlmIChjbGVhbnVwKSB7DQorCWZvciAoaT0wO2k8Y291bnQ7aSsrKSB7DQorCSAgICBpZiAoY2xl YW51cC0+bXNnX2hkci5tc2dfaW92KSB7DQorCQlpb3YgPSBjbGVhbnVwLT5tc2dfaGRyLm1zZ19p b3Y7DQorCQlmb3IgKGo9MDtqPGlvdmNvdW50O2orKykgew0KKwkJICAgIGlmIChpb3YtPmlvdl9i YXNlKSB7DQorCQkJZ19mcmVlKGlvdi0+aW92X2Jhc2UpOw0KKwkJICAgIH0NCisJCSAgICBpb3Yr KzsNCisJCX0NCisJCWdfZnJlZShjbGVhbnVwLT5tc2dfaGRyLm1zZ19pb3YpOw0KKwkgICAgfQ0K KwkgICAgY2xlYW51cCsrOw0KKwl9DQorCWdfZnJlZShtc2d2ZWMpOw0KKyAgICB9DQorfQ0KKw0K K3N0YXRpYyBzdHJ1Y3QgbW1zZ2hkciAqIGJ1aWxkX2wydHB2M192ZWN0b3IoTmV0TDJUUFYzU3Rh dGUgKnMsIGludCBjb3VudCkgew0KKyAgICBpbnQgaTsNCisgICAgc3RydWN0IGlvdmVjICogaW92 Ow0KKyAgICBzdHJ1Y3QgbW1zZ2hkciAqIG1zZ3ZlYywgKnJlc3VsdDsNCisNCisgICAgbXNndmVj ID0gZ19tYWxsb2Moc2l6ZW9mKHN0cnVjdCBtbXNnaGRyKSAqIGNvdW50KTsNCisgICAgcmVzdWx0 ID0gbXNndmVjOw0KKyAgICBmb3IgKGk9MDtpIDwgY291bnQgO2krKykgew0KKwltc2d2ZWMtPm1z Z19oZHIubXNnX25hbWUgPSBOVUxMOw0KKwltc2d2ZWMtPm1zZ19oZHIubXNnX25hbWVsZW4gPSAw Ow0KKwlpb3YgPSAgZ19tYWxsb2Moc2l6ZW9mKHN0cnVjdCBpb3ZlYykgKiBJT1ZTSVpFKTsNCisJ bXNndmVjLT5tc2dfaGRyLm1zZ19pb3YgPSBpb3Y7DQorCWlmICgocy0+dWRwID09IEZBTFNFKSAm JiAocy0+aXB2NiA9PSBGQUxTRSkpew0KKwkgICAgaW92LT5pb3ZfYmFzZSA9IGdfbWFsbG9jKHMt Pm9mZnNldCArIHNpemVvZihzdHJ1Y3QgaXBoZHIpKTsgLyogZml4IGZvciBpcHY0IHJhdyAqLzsN CisJICAgIGlvdi0+aW92X2xlbiA9IHMtPm9mZnNldCArIHNpemVvZiAoc3RydWN0IGlwaGRyKTsN CisJfSBlbHNlIHsNCisJICAgIGlvdi0+aW92X2Jhc2UgPSBnX21hbGxvYyhzLT5vZmZzZXQpOw0K KwkgICAgaW92LT5pb3ZfbGVuID0gcy0+b2Zmc2V0Ow0KKwl9DQorCWlvdisrIDsNCisJaW92LT5p b3ZfYmFzZSA9IHFlbXVfbWVtYWxpZ24oUEFHRV9TSVpFLCBQQUdFX1NJWkUpOw0KKwlpb3YtPmlv dl9sZW4gPSBQQUdFX1NJWkU7DQorCW1zZ3ZlYy0+bXNnX2hkci5tc2dfaW92bGVuID0gMjsNCisJ bXNndmVjLT5tc2dfaGRyLm1zZ19jb250cm9sID0gTlVMTDsNCisJbXNndmVjLT5tc2dfaGRyLm1z Z19jb250cm9sbGVuID0gMDsNCisJbXNndmVjLT5tc2dfaGRyLm1zZ19mbGFncyA9IDA7DQorCW1z Z3ZlYysrOw0KKyAgICB9DQorICAgIHJldHVybiByZXN1bHQ7DQorfQ0KKw0KK3N0YXRpYyB2b2lk IG5ldF9sMnRwdjNfY2xlYW51cChOZXRDbGllbnRTdGF0ZSAqbmMpIA0KK3sNCisgICAgTmV0TDJU UFYzU3RhdGUgKnMgPSBET19VUENBU1QoTmV0TDJUUFYzU3RhdGUsIG5jLCBuYyk7DQorICAgIHFl bXVfc2V0X2ZkX2hhbmRsZXIocy0+ZmQsIE5VTEwsIE5VTEwsIE5VTEwpOw0KKyAgICBjbG9zZShz LT5mZCk7DQorICAgIGRlc3Ryb3lfdmVjdG9yKHMtPm1zZ3ZlYywgTUFYX0wyVFBWM19NU0dDTlQs IElPVlNJWkUpOw0KKyAgICBnX2ZyZWUocy0+aGVhZGVyX2J1Zik7DQorICAgIGdfZnJlZShzLT5k Z3JhbV9kc3QpOw0KK30NCisNCitzdGF0aWMgTmV0Q2xpZW50SW5mbyBuZXRfbDJ0cHYzX2luZm8g PSB7DQorICAgIC50eXBlID0gTkVUX0NMSUVOVF9PUFRJT05TX0tJTkRfTDJUUFYzLA0KKyAgICAu c2l6ZSA9IHNpemVvZihOZXRMMlRQVjNTdGF0ZSksDQorICAgIC5yZWNlaXZlID0gbmV0X2wydHB2 M19yZWNlaXZlX2RncmFtLA0KKyAgICAucmVjZWl2ZV9pb3YgPSBuZXRfbDJ0cHYzX3JlY2VpdmVf ZGdyYW1faW92LA0KKyAgICAuY2xlYW51cCA9IG5ldF9sMnRwdjNfY2xlYW51cCwNCit9Ow0KKw0K K2ludCBuZXRfaW5pdF9sMnRwdjMoY29uc3QgTmV0Q2xpZW50T3B0aW9ucyAqb3B0cywNCisgICAg ICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsDQorICAgICAgICAgICAgICAgICAgICBO ZXRDbGllbnRTdGF0ZSAqcGVlcikgew0KKw0KKw0KKyAgICBjb25zdCBOZXRkZXZMMlRQdjNPcHRp b25zICogbDJ0cHYzOw0KKyAgICBOZXRMMlRQVjNTdGF0ZSAqczsNCisgICAgTmV0Q2xpZW50U3Rh dGUgKm5jOw0KKyAgICBpbnQgZmQ7DQorICAgIHN0cnVjdCBhZGRyaW5mbyBoaW50czsNCisgICAg c3RydWN0IGFkZHJpbmZvICogcmVzdWx0ID0gTlVMTDsNCisgICAgY2hhciAqIHNyY3BvcnQsICog ZHN0cG9ydDsNCisNCisgICAgbmMgPSBxZW11X25ld19uZXRfY2xpZW50KCZuZXRfbDJ0cHYzX2lu Zm8sIHBlZXIsICJsMnRwdjMiLCBuYW1lKTsNCisNCisgICAgcyA9IERPX1VQQ0FTVChOZXRMMlRQ VjNTdGF0ZSwgbmMsIG5jKTsNCisNCisgICAgYXNzZXJ0KG9wdHMtPmtpbmQgPT0gTkVUX0NMSUVO VF9PUFRJT05TX0tJTkRfTDJUUFYzKTsNCisgICAgbDJ0cHYzID0gb3B0cy0+bDJ0cHYzOw0KKw0K KyAgICAgICAgLyogRm9ybSBtb2RlIGJpdG1hc2sgKi8NCisNCisgICAgaWYgKChsMnRwdjMtPmhh c19pcHY2KSAmJiAobDJ0cHYzLT5pcHY2ID09IFRSVUUpKSB7DQorCXMtPmlwdjYgPSBsMnRwdjMt PmlwdjY7DQorICAgIH0gZWxzZSB7DQorCXMtPmlwdjYgPSBGQUxTRTsNCisgICAgfQ0KKw0KKyAg ICBpZiAoKGwydHB2My0+aGFzX3J4Y29va2llKSB8fCAobDJ0cHYzLT5oYXNfdHhjb29raWUpKSB7 DQorCWlmICgobDJ0cHYzLT5oYXNfcnhjb29raWUpICYmIChsMnRwdjMtPmhhc190eGNvb2tpZSkp IHsNCisJICAgIHMtPmNvb2tpZSA9IFRSVUU7DQorCX0gZWxzZSB7DQorCSAgICByZXR1cm4gLTE7 DQorCX0NCisgICAgfSBlbHNlIHsNCisJcy0+Y29va2llID0gRkFMU0U7DQorICAgIH0NCisNCisg ICAgaWYgKChsMnRwdjMtPmhhc19jb29raWU2NCkgfHwgKGwydHB2My0+Y29va2llNjQgPT0gVFJV RSkpIHsNCisJcy0+Y29va2llX2lzXzY0ICA9IFRSVUU7DQorICAgIH0gZWxzZSB7DQorCXMtPmNv b2tpZV9pc182NCAgPSBGQUxTRTsNCisgICAgfQ0KKw0KKyAgICBpZiAoKGwydHB2My0+aGFzX3Vk cCkgJiYgKGwydHB2My0+dWRwID09IFRSVUUpKSB7DQorCXMtPnVkcCA9IFRSVUU7DQorCWlmICgh KGwydHB2My0+aGFzX3NyY3BvcnQgJiYgbDJ0cHYzLT5oYXNfZHN0cG9ydCkpIHsNCisJICAgIGZw cmludGYoc3RkZXJyLCAibDJ0cHYzX29wZW4gOiBuZWVkIGJvdGggc3JjIGFuZCBkc3QgcG9ydCBm b3IgdWRwXG4iKTsNCisJICAgIHJldHVybiAtMTsNCisJfSBlbHNlIHsNCisJICAgIHNyY3BvcnQg PSBsMnRwdjMtPnNyY3BvcnQ7DQorCSAgICBkc3Rwb3J0ID0gbDJ0cHYzLT5kc3Rwb3J0Ow0KKwl9 DQorICAgIH0gZWxzZSB7DQorCXMtPnVkcCA9IEZBTFNFOw0KKwlzcmNwb3J0ID0gTlVMTDsNCisJ ZHN0cG9ydCA9IE5VTEw7DQorICAgIH0NCisNCisgICAgaWYgKChsMnRwdjMtPmhhc19jb3VudGVy KSAmJiAobDJ0cHYzLT5jb3VudGVyID09IEZBTFNFKSkgew0KKwlzLT5ub2NvdW50ZXIgPSBUUlVF Ow0KKyAgICB9IGVsc2Ugew0KKwlzLT5ub2NvdW50ZXIgPSBGQUxTRTsNCisgICAgfQ0KKw0KKyAg ICBzLT5vZmZzZXQgPSA0Ow0KKyAgICBzLT5zZXNzaW9uX29mZnNldCA9IDA7DQorICAgIHMtPmNv b2tpZV9vZmZzZXQgPSA0Ow0KKyAgICBzLT5jb3VudGVyX29mZnNldCA9IDQ7DQorDQorICAgIHMt PnR4X3Nlc3Npb24gPSBsMnRwdjMtPnR4c2Vzc2lvbjsNCisgICAgaWYgKGwydHB2My0+aGFzX3J4 c2Vzc2lvbikgew0KKwlzLT5yeF9zZXNzaW9uID0gbDJ0cHYzLT5yeHNlc3Npb247DQorICAgIH0g ZWxzZSB7DQorCXMtPnJ4X3Nlc3Npb24gPSBzLT50eF9zZXNzaW9uOw0KKyAgICB9DQorDQorICAg IGlmIChzLT5jb29raWUgPT0gVFJVRSkgew0KKwlzLT5yeF9jb29raWUgPSBsMnRwdjMtPnJ4Y29v a2llOw0KKwlzLT50eF9jb29raWUgPSBsMnRwdjMtPnR4Y29va2llOw0KKwlpZiAocy0+Y29va2ll X2lzXzY0ID09IFRSVUUpIHsNCisJICAgIC8qIDY0IGJpdCBjb29raWUgKi8NCisJICAgIHMtPm9m ZnNldCArPSA4Ow0KKwkgICAgcy0+Y291bnRlcl9vZmZzZXQgKz0gODsNCisJfSBlbHNlIHsNCisJ ICAgIC8qIDMyIGJpdCBjb29raWUgKi8NCisJICAgIHMtPm9mZnNldCArPSA0Ow0KKwkgICAgcy0+ Y291bnRlcl9vZmZzZXQgKz00Ow0KKwl9DQorICAgIH0NCisNCisgICAgbWVtc2V0KCZoaW50cywg MCwgc2l6ZW9mKGhpbnRzKSk7DQorICAgIA0KKyAgICBpZiAocy0+aXB2NiA9PSBUUlVFKSB7DQor CWhpbnRzLmFpX2ZhbWlseSA9IEFGX0lORVQ2Ow0KKyAgICB9IGVsc2Ugew0KKwloaW50cy5haV9m YW1pbHkgPSBBRl9JTkVUOw0KKyAgICB9DQorICAgIGlmIChzLT51ZHAgPT0gVFJVRSkgew0KKwlo aW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfREdSQU07DQorCWhpbnRzLmFpX3Byb3RvY29sID0gMDsN CisJcy0+b2Zmc2V0ICs9IDQ7DQorCXMtPmNvdW50ZXJfb2Zmc2V0ICs9IDQ7DQorCXMtPnNlc3Np b25fb2Zmc2V0ICs9IDQ7DQorCXMtPmNvb2tpZV9vZmZzZXQgKz0gNDsNCisgICAgfSBlbHNlIHsN CisJaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX0RHUkFNOw0KKwloaW50cy5haV9wcm90b2NvbCA9 IElQUFJPVE9fTDJUUDsNCisgICAgfQ0KKw0KKyAgICBpZiAoKGdldGFkZHJpbmZvKGwydHB2My0+ c3JjLCBzcmNwb3J0LCAmaGludHMsICZyZXN1bHQpICE9MCkgfHwgKHJlc3VsdCA9PSBOVUxMKSkg ew0KKwlmZCA9IC1lcnJubzsNCisJZnByaW50ZihzdGRlcnIsICJsMnRwdjNfb3BlbiA6IGNvdWxk IG5vdCByZXNvbHZlIHNyYywgIiAiZXJybm8gPSAlZFxuIiwgZmQpOw0KKwlyZXR1cm4gLTE7DQor ICAgIH0NCisNCisNCisgICAgaWYgKChmZCA9IHNvY2tldChyZXN1bHQtPmFpX2ZhbWlseSwgcmVz dWx0LT5haV9zb2NrdHlwZSwgcmVzdWx0LT5haV9wcm90b2NvbCkpID09IC0xKSB7DQorCWZkID0g LWVycm5vOw0KKwlmcHJpbnRmKHN0ZGVyciwgImwydHB2M19vcGVuIDogc29ja2V0IGNyZWF0aW9u IGZhaWxlZCwgIiAiZXJybm8gPSAlZFxuIiwgLWZkKTsNCisJZnJlZWFkZHJpbmZvKHJlc3VsdCk7 DQorCXJldHVybiBmZDsNCisgICAgfSANCisgICAgaWYgKGJpbmQoZmQsIChzdHJ1Y3Qgc29ja2Fk ZHIgKikgcmVzdWx0LT5haV9hZGRyLCByZXN1bHQtPmFpX2FkZHJsZW4pKSB7DQorCWZwcmludGYo c3RkZXJyLCAibDJ0cHYzX29wZW4gOiAgY291bGQgbm90IGJpbmQgc29ja2V0IGVycj0laVxuIiwg ZXJybm8pOw0KKwljbG9zZShmZCk7DQorCXJldHVybiAtMTsNCisgICAgfQ0KKw0KKyAgICBmcmVl YWRkcmluZm8ocmVzdWx0KTsNCisNCisgICAgbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRz KSk7DQorICAgIA0KKyAgICBpZiAocy0+aXB2NiA9PSBUUlVFKSB7DQorCWhpbnRzLmFpX2ZhbWls eSA9IEFGX0lORVQ2Ow0KKyAgICB9IGVsc2Ugew0KKwloaW50cy5haV9mYW1pbHkgPSBBRl9JTkVU Ow0KKyAgICB9DQorICAgIGlmIChzLT51ZHAgPT0gVFJVRSkgew0KKwloaW50cy5haV9zb2NrdHlw ZSA9IFNPQ0tfREdSQU07DQorCWhpbnRzLmFpX3Byb3RvY29sID0gMDsNCisgICAgfSBlbHNlIHsN CisJaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX0RHUkFNOw0KKwloaW50cy5haV9wcm90b2NvbCA9 IElQUFJPVE9fTDJUUDsNCisgICAgfQ0KKw0KKyAgICBpZiAoKGdldGFkZHJpbmZvKGwydHB2My0+ ZHN0LCBkc3Rwb3J0LCAmaGludHMsICZyZXN1bHQpICE9MCkgfHwgKHJlc3VsdCA9PSBOVUxMKSkg ew0KKwlmcHJpbnRmKHN0ZGVyciwgImwydHB2M19vcGVuIDogY291bGQgbm90IHJlc29sdmUgZHN0 LCAiICJlcnJubyA9ICVkXG4iLCAtZmQpOw0KKwlyZXR1cm4gLTE7DQorICAgIH0NCisNCisgICAg cy0+ZGdyYW1fZHN0ID0gZ19tYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKSk7 DQorICAgIG1lbXNldChzLT5kZ3JhbV9kc3QsICdcMCcgLCBzaXplb2Yoc3RydWN0IHNvY2thZGRy X3N0b3JhZ2UpKTsNCisgICAgbWVtY3B5KHMtPmRncmFtX2RzdCwgcmVzdWx0LT5haV9hZGRyLCBy ZXN1bHQtPmFpX2FkZHJsZW4pOw0KKyAgICBzLT5kc3Rfc2l6ZSA9IHJlc3VsdC0+YWlfYWRkcmxl bjsNCisNCisgICAgZnJlZWFkZHJpbmZvKHJlc3VsdCk7DQorDQorICAgIGlmIChzLT5ub2NvdW50 ZXIgPT0gRkFMU0UpIHsNCisJcy0+b2Zmc2V0ICs9IDQ7DQorICAgIH0NCisgICAgIA0KKyAgICBp ZiAobDJ0cHYzLT5oYXNfb2Zmc2V0KSB7DQorCS8qIGV4dHJhIG9mZnNldCAqLw0KKwlzLT5vZmZz ZXQgKz0gbDJ0cHYzLT5vZmZzZXQ7DQorICAgIH0NCisNCisgICAgcy0+bXNndmVjID0gYnVpbGRf bDJ0cHYzX3ZlY3RvcihzLCBNQVhfTDJUUFYzX01TR0NOVCk7DQorICAgIHMtPnZlYyA9IGdfbWFs bG9jKHNpemVvZihzdHJ1Y3QgaW92ZWMpICogTUFYX0wyVFBWM19JT1ZDTlQpOyAgICANCisgICAg aWYgKChzLT51ZHAgPT0gRkFMU0UpICYmIChzLT5pcHY2ID09IEZBTFNFKSl7DQorCXMtPmhlYWRl cl9idWYgPSBnX21hbGxvYyhzLT5vZmZzZXQgKyBzaXplb2YgKHN0cnVjdCBpcGhkcikpOyAgICAN CisgICAgfSBlbHNlIHsNCisJcy0+aGVhZGVyX2J1ZiA9IGdfbWFsbG9jKHMtPm9mZnNldCk7ICAg IA0KKyAgICB9DQorDQorICAgIHFlbXVfc2V0X25vbmJsb2NrKGZkKTsNCisNCisgICAgaWYgKGZk IDwgMCkNCisJcmV0dXJuIC0xOw0KKw0KKyAgICBzLT5mZCA9IGZkOw0KKyAgICBzLT5jb3VudGVy ID0gMDsNCisNCisgICAgcWVtdV9zZXRfZmRfaGFuZGxlcihzLT5mZCwgbmV0X2wydHB2M19zZW5k LCBOVUxMLCBzKTsNCisNCisgICAgaWYgKCFzKSB7DQorCWZwcmludGYgKHN0ZGVyciwgImwydHB2 M19vcGVuIDogZmFpbGVkIHRvIHNldCBmZCBoYW5kbGVyXG4iKTsNCisJcmV0dXJuIC0xOw0KKyAg ICB9DQorICAgIHNucHJpbnRmKHMtPm5jLmluZm9fc3RyLCBzaXplb2Yocy0+bmMuaW5mb19zdHIp LA0KKyAgICAgICAgICAgICAibDJ0cHYzOiBjb25uZWN0ZWQiKTsNCisgICAgcmV0dXJuIDA7DQor fQ0KKw0KZGlmZiAtLWdpdCBhL25ldC9uZXQuYyBiL25ldC9uZXQuYw0KaW5kZXggMGE4OGU2OC4u ZDAzZjY0ZCAxMDA2NDQNCi0tLSBhL25ldC9uZXQuYw0KKysrIGIvbmV0L25ldC5jDQpAQCAtNzMx LDYgKzczMSw5IEBAIHN0YXRpYyBpbnQgKCogY29uc3QgbmV0X2NsaWVudF9pbml0X2Z1bltORVRf Q0xJRU5UX09QVElPTlNfS0lORF9NQVhdKSgNCiAgICAgICAgIFtORVRfQ0xJRU5UX09QVElPTlNf S0lORF9CUklER0VdICAgID0gbmV0X2luaXRfYnJpZGdlLA0KICNlbmRpZg0KICAgICAgICAgW05F VF9DTElFTlRfT1BUSU9OU19LSU5EX0hVQlBPUlRdICAgPSBuZXRfaW5pdF9odWJwb3J0LA0KKyNp ZmRlZiBDT05GSUdfTElOVVgNCisgICAgICAgIFtORVRfQ0xJRU5UX09QVElPTlNfS0lORF9MMlRQ VjNdICAgICAgID0gbmV0X2luaXRfbDJ0cHYzLA0KKyNlbmRpZg0KIH07DQogDQogDQo= --_002_5315EEFE6060605ciscocom_--