From mboxrd@z Thu Jan 1 00:00:00 1970 From: Evgeniy Polyakov Subject: [1/2] CARP implementation. HA master's failover. Date: Thu, 15 Jul 2004 17:36:35 +0400 Sender: netdev-bounce@oss.sgi.com Message-ID: <1089898595.6114.866.camel@uganda> References: <1089898303.6114.859.camel@uganda> Reply-To: johnpol@2ka.mipt.ru Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="=-aENk32xTOCLiPN2oivF9" Cc: netfilter-failover@lists.netfilter.org Return-path: To: netdev@oss.sgi.com In-Reply-To: <1089898303.6114.859.camel@uganda> Errors-to: netdev-bounce@oss.sgi.com List-Id: netdev.vger.kernel.org --=-aENk32xTOCLiPN2oivF9 Content-Type: multipart/mixed; boundary="=-zMMMLADPc6OCZZ3l3ocw" --=-zMMMLADPc6OCZZ3l3ocw Content-Type: text/plain Content-Transfer-Encoding: quoted-printable On Thu, 2004-07-15 at 17:31, Evgeniy Polyakov wrote:=20 > Hello, network developers. >=20 > I'm glad to introduce CARP failover mechanism implementation. > It is based on OpenBSD's CARP protocol but is not compatible with it > since OpenBSD's implementation does not contain protection against > repeated message sending. >=20 > The main goal of the project is to implement CARP + firewall sync, but > second part already implemented by Harald Welte an= d=20 > KOVACS Krisztian in ct_sync. >=20 > By design each node has it's own advertisement base and skew, node with > the least timeval constructed from them became a master. > It begins to advertise it's base and skew until shutdown or other node > lower it's base+skew pair. > CARP uses currently only IPv4 multicast, but can be easily changed to > use IPv6.=20 > Each CARP packet contains unique 64bit counter with it's SHA1 hmac > digest with 20byte secret key. By design this counter is incremented in > both master and backup before sending and while receiving accordingly. > If master and backup counters do not coincide with each other while > receiving backup node drops this packet and thus preventing repeated > sending attack. > When after predefined interval master didn't send any packet or it's > base+skew is bigger than that in the remote node those node becomes a > master and begins to advertise. >=20 > CARP has 2 work queues for "became_master" and "became_backup" events. > Such events may be easily registered in runtime by external modules. > One of such event handlers may send netlink message to ct_sync and/or > userspace daemon which will flush iptables rules, up/down interfaces and > so on... >=20 > Please review and comment. >=20 > Code against 2.6 attached=20 > in next 2 e-mails since netfilter-failover@lists.netfilter.org doesn't ac= cept > e-mail greater than 40kb. >=20 > Code also is available at > http://www.2ka.mipt.ru/~johnpol/carp_latest.tar.gz --=20 Evgeniy Polaykov ( s0mbre ) Crash is better than data corruption. -- Art Grabowski --=-zMMMLADPc6OCZZ3l3ocw Content-Disposition: attachment; filename=carp.c Content-Type: text/x-csrc; name=carp.c; charset=koi8-r Content-Transfer-Encoding: base64 LyoNCiAqIAljYXJwLmMNCiAqIA0KICogMjAwNCBDb3B5cmlnaHQgKGMpIEV2Z2VuaXkgUG9seWFr b3YgPGpvaG5wb2xAMmthLm1pcHQucnU+DQogKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KICogDQog KiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQg YW5kL29yIG1vZGlmeQ0KICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQ dWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k YXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yDQogKiAoYXQgeW91ciBv cHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KICoNCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmli dXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KICogYnV0IFdJVEhPVVQg QU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiAqIE1F UkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0 aGUNCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQogKg0K ICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UNCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRv IHRoZSBGcmVlIFNvZnR3YXJlDQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2Us IFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBDQogKg0KICovDQoNCiNpbmNs dWRlIDxsaW51eC9jb25maWcuaD4NCiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4NCiNpbmNsdWRl IDxsaW51eC90eXBlcy5oPg0KI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+DQojaW5jbHVkZSA8bGlu dXgva2VybmVsLmg+DQojaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4NCiNpbmNsdWRlIDxsaW51eC9z a2J1ZmYuaD4NCiNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4NCiNpbmNsdWRlIDxsaW51eC9p bi5oPg0KI2luY2x1ZGUgPGxpbnV4L3RjcC5oPg0KI2luY2x1ZGUgPGxpbnV4L3VkcC5oPg0KI2lu Y2x1ZGUgPGxpbnV4L2lmX2FycC5oPg0KI2luY2x1ZGUgPGxpbnV4L21yb3V0ZS5oPg0KI2luY2x1 ZGUgPGxpbnV4L2luaXQuaD4NCiNpbmNsdWRlIDxsaW51eC9pbjYuaD4NCiNpbmNsdWRlIDxsaW51 eC9pbmV0ZGV2aWNlLmg+DQojaW5jbHVkZSA8bGludXgvaWdtcC5oPg0KI2luY2x1ZGUgPGxpbnV4 L25ldGZpbHRlcl9pcHY0Lmg+DQojaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+DQojaW5jbHVkZSA8 bGludXgvcmFuZG9tLmg+DQoNCiNpbmNsdWRlIDxuZXQvc29jay5oPg0KI2luY2x1ZGUgPG5ldC9p cC5oPg0KI2luY2x1ZGUgPG5ldC9pY21wLmg+DQojaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+DQoj aW5jbHVkZSA8bmV0L2FycC5oPg0KI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPg0KI2luY2x1ZGUg PG5ldC9pbmV0X2Vjbi5oPg0KDQojaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+DQoNCiNpZmRl ZiBDT05GSUdfSVBWNg0KI2luY2x1ZGUgPG5ldC9pcHY2Lmg+DQojaW5jbHVkZSA8bmV0L2lwNl9m aWIuaD4NCiNpbmNsdWRlIDxuZXQvaXA2X3JvdXRlLmg+DQojZW5kaWYNCg0KI2luY2x1ZGUgImNh cnAuaCINCiNpbmNsdWRlICJjYXJwX2xvZy5oIg0KI2luY2x1ZGUgImNhcnBfcXVldWUuaCINCiNp bmNsdWRlICJjYXJwX2lvY3RsLmgiDQoNCiNkZWZpbmUgdGltZXZhbF9iZWZvcmUoYmVmb3JlLCBh ZnRlcikJCQlcDQoJKCgoYmVmb3JlKS0+dHZfc2VjID09IChhZnRlciktPnR2X3NlYykgPyAoKGJl Zm9yZSktPnR2X3VzZWMgPCAoYWZ0ZXIpLT50dl91c2VjKSA6ICgoYmVmb3JlKS0+dHZfc2VjIDwg KGFmdGVyKS0+dHZfc2VjKSkNCg0KDQpzdGF0aWMgaW50IGNhcnBfaW5pdChzdHJ1Y3QgbmV0X2Rl dmljZSAqKTsNCnN0YXRpYyB2b2lkIGNhcnBfdW5pbml0KHN0cnVjdCBuZXRfZGV2aWNlICopOw0K c3RhdGljIHZvaWQgY2FycF9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqKTsNCnN0YXRpYyBpbnQg Y2FycF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqKTsNCnN0YXRpYyBpbnQgY2FycF9vcGVuKHN0 cnVjdCBuZXRfZGV2aWNlICopOw0Kc3RhdGljIGludCBjYXJwX2lvY3RsIChzdHJ1Y3QgbmV0X2Rl dmljZSAqLCBzdHJ1Y3QgaWZyZXEgKiwgaW50KTsNCnN0YXRpYyBpbnQgY2FycF9jaGVja19wYXJh bXMoc3RydWN0IGNhcnBfaW9jdGxfcGFyYW1zKTsNCg0Kc3RhdGljIHZvaWQgY2FycF9lcnIoc3Ry dWN0IHNrX2J1ZmYgKiwgdTMyKTsNCnN0YXRpYyBpbnQgY2FycF9yY3Yoc3RydWN0IHNrX2J1ZmYg Kik7DQpzdGF0aWMgaW50IGNhcnBfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgbmV0X2Rl dmljZSAqKTsNCg0Kc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpjYXJwX2dldF9zdGF0 cyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsNCg0Kc3RhdGljIHZvaWQgY2FycF9obWFjX3NpZ24oc3Ry dWN0IGNhcnBfcHJpdiAqLCBzdHJ1Y3QgY2FycF9oZWFkZXIgKik7DQpzdGF0aWMgaW50IGNhcnBf aG1hY192ZXJpZnkoc3RydWN0IGNhcnBfcHJpdiAqLCBzdHJ1Y3QgY2FycF9oZWFkZXIgKik7DQpz dGF0aWMgdTMyIGlubGluZSBhZGRyMnZhbCh1OCwgdTgsIHU4LCB1OCk7DQoNCnN0YXRpYyB2b2lk IGNhcnBfc2V0X3N0YXRlKHN0cnVjdCBjYXJwX3ByaXYgKiwgZW51bSBjYXJwX3N0YXRlKTsNCnN0 YXRpYyB2b2lkIGNhcnBfbWFzdGVyX2Rvd24odW5zaWduZWQgbG9uZyk7DQpzdGF0aWMgdm9pZCBj YXJwX2FkdmVydGlzZSh1bnNpZ25lZCBsb25nKTsNCg0Kc3RhdGljIGludCBfX2luaXQgZGV2aWNl X2NhcnBfaW5pdCh2b2lkKTsNCnZvaWQgX19leGl0IGRldmljZV9jYXJwX2Zpbmkodm9pZCk7DQoN CnN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqY2FycF9kZXY7DQoNCnN0YXRpYyB2b2lkIGNhcnBf dW5pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpDQp7DQoJc3RydWN0IGNhcnBfcHJpdiAqY3Ag PSBkZXYtPnByaXY7DQoJDQoJaWYgKHRpbWVyX3BlbmRpbmcoJmNwLT5tZF90aW1lcikpDQoJCWRl bF90aW1lcl9zeW5jKCZjcC0+bWRfdGltZXIpOw0KCWlmICh0aW1lcl9wZW5kaW5nKCZjcC0+YWR2 X3RpbWVyKSkNCgkJZGVsX3RpbWVyX3N5bmMoJmNwLT5hZHZfdGltZXIpOw0KCQkNCglsb2coIiVz XG4iLCBfX2Z1bmNfXyk7DQoJZGV2X3B1dChjcC0+b2Rldik7DQoJZGV2X3B1dChkZXYpOw0KfQ0K DQpzdGF0aWMgdm9pZCBjYXJwX2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgaW5mbykNCnsN Cglsb2coIiVzXG4iLCBfX2Z1bmNfXyk7DQoJa2ZyZWVfc2tiKHNrYik7DQp9DQoNCnN0YXRpYyB2 b2lkIGNhcnBfaG1hY19zaWduKHN0cnVjdCBjYXJwX3ByaXYgKmNwLCBzdHJ1Y3QgY2FycF9oZWFk ZXIgKmNoKQ0Kew0KCXVuc2lnbmVkIGludCBrZXlsZW4gPSBzaXplb2YoY3AtPmNhcnBfa2V5KTsN CglzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7DQoNCglzZy5wYWdlID0gdmlydF90b19wYWdlKGNoLT5j YXJwX2NvdW50ZXIpOw0KCXNnLm9mZnNldCA9ICgodW5zaWduZWQgbG9uZykoY2gtPmNhcnBfY291 bnRlcikpICUgUEFHRV9TSVpFOw0KCXNnLmxlbmd0aCA9IHNpemVvZihjaC0+Y2FycF9jb3VudGVy KTsNCg0KCWNyeXB0b19obWFjKGNwLT50Zm0sIGNwLT5jYXJwX2tleSwgJmtleWxlbiwgJnNnLCAx LCBjaC0+Y2FycF9tZCk7DQp9DQoNCnN0YXRpYyBpbnQgY2FycF9obWFjX3ZlcmlmeShzdHJ1Y3Qg Y2FycF9wcml2ICpjcCwgc3RydWN0IGNhcnBfaGVhZGVyICpjaCkNCnsNCgl1OCB0bXBfbWRbQ0FS UF9TSUdfTEVOXTsNCgl1bnNpZ25lZCBpbnQga2V5bGVuID0gc2l6ZW9mKGNwLT5jYXJwX2tleSk7 DQoJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOw0KDQoJc2cucGFnZSA9IHZpcnRfdG9fcGFnZShjaC0+ Y2FycF9jb3VudGVyKTsNCglzZy5vZmZzZXQgPSAoKHVuc2lnbmVkIGxvbmcpKGNoLT5jYXJwX2Nv dW50ZXIpKSAlIFBBR0VfU0laRTsNCglzZy5sZW5ndGggPSBzaXplb2YoY2gtPmNhcnBfY291bnRl cik7DQoNCgljcnlwdG9faG1hYyhjcC0+dGZtLCBjcC0+Y2FycF9rZXksICZrZXlsZW4sICZzZywg MSwgdG1wX21kKTsNCiNpZiAwDQoJew0KCQlpbnQgaTsNCgkJcHJpbnRrKCJjYWxjdWxhdGVkOiAg Iik7DQoJCWZvciAoaT0wOyBpPENBUlBfU0lHX0xFTjsgKytpKQ0KCQkJcHJpbnRrKCIlMDJ4ICIs IHRtcF9tZFtpXSk7DQoJCXByaW50aygiXG4iKTsNCgkJcHJpbnRrKCJmcm9tIGhlYWRlcjogIik7 DQoJCWZvciAoaT0wOyBpPENBUlBfU0lHX0xFTjsgKytpKQ0KCQkJcHJpbnRrKCIlMDJ4ICIsIGNo LT5jYXJwX21kW2ldKTsNCgkJcHJpbnRrKCJcbiIpOw0KCX0NCiNlbmRpZg0KCXJldHVybiBtZW1j bXAodG1wX21kLCBjaC0+Y2FycF9tZCwgQ0FSUF9TSUdfTEVOKTsNCn0NCg0Kc3RhdGljIGludCBj YXJwX2NoZWNrX3BhcmFtcyhzdHJ1Y3QgY2FycF9pb2N0bF9wYXJhbXMgcCkNCnsNCglpZiAocC5z dGF0ZSAhPSBJTklUICYmIHAuc3RhdGUgIT0gQkFDS1VQICYmIHAuc3RhdGUgIT0gTUFTVEVSKQ0K CXsNCgkJbG9nKCJXcm9uZyBzdGF0ZSAlZC5cbiIsIHAuc3RhdGUpOw0KCQlyZXR1cm4gLTE7DQoJ fQ0KDQoJaWYgKCFfX2Rldl9nZXRfYnlfbmFtZShwLmRldm5hbWUpKQ0KCXsNCgkJbG9nKCJObyBz dWNoIGRldmljZSAlcy5cbiIsIHAuZGV2bmFtZSk7DQoJCXJldHVybiAtMjsNCgl9DQoNCglpZiAo cC5tZF90aW1lb3V0ID4gTUFYX01EX1RJTUVPVVQgfHwgcC5hZHZfdGltZW91dCA+IE1BWF9BRFZf VElNRU9VVCB8fA0KCSAgICAhcC5tZF90aW1lb3V0IHx8ICFwLmFkdl90aW1lb3V0KQ0KCQlyZXR1 cm4gLTM7DQoNCglyZXR1cm4gMDsNCn0NCg0Kc3RhdGljIHZvaWQgY2FycF9zZXRfc3RhdGUoc3Ry dWN0IGNhcnBfcHJpdiAqY3AsIGVudW0gY2FycF9zdGF0ZSBzdGF0ZSkNCnsNCglsb2coIiVzOiBT ZXR0aW5nIENBUlAgc3RhdGUgZnJvbSAlZCB0byAlZC5cbiIsIF9fZnVuY19fLCBjcC0+c3RhdGUs IHN0YXRlKTsNCgljcC0+c3RhdGUgPSBzdGF0ZTsNCg0KCXN3aXRjaCAoc3RhdGUpDQoJew0KCQlj YXNlIE1BU1RFUjoNCgkJCWNhcnBfY2FsbF9xdWV1ZShNQVNURVJfUVVFVUUpOw0KCQkJaWYgKCF0 aW1lcl9wZW5kaW5nKCZjcC0+YWR2X3RpbWVyKSkNCgkJCQltb2RfdGltZXIoJmNwLT5hZHZfdGlt ZXIsIGppZmZpZXMgKyBjcC0+YWR2X3RpbWVvdXQqSFopOw0KCQkJYnJlYWs7DQoJCWNhc2UgQkFD S1VQOg0KCQkJY2FycF9jYWxsX3F1ZXVlKEJBQ0tVUF9RVUVVRSk7DQoJCQlpZiAoIXRpbWVyX3Bl bmRpbmcoJmNwLT5tZF90aW1lcikpDQoJCQkJbW9kX3RpbWVyKCZjcC0+bWRfdGltZXIsIGppZmZp ZXMgKyBjcC0+bWRfdGltZW91dCpIWik7DQoJCQlicmVhazsNCgkJY2FzZSBJTklUOg0KCQkJaWYg KCF0aW1lcl9wZW5kaW5nKCZjcC0+bWRfdGltZXIpKQ0KCQkJCW1vZF90aW1lcigmY3AtPm1kX3Rp bWVyLCBqaWZmaWVzICsgY3AtPm1kX3RpbWVvdXQqSFopOw0KCQkJYnJlYWs7DQoJfQ0KfQ0KDQpz dGF0aWMgdm9pZCBjYXJwX21hc3Rlcl9kb3duKHVuc2lnbmVkIGxvbmcgZGF0YSkNCnsNCglzdHJ1 Y3QgY2FycF9wcml2ICpjcCA9IChzdHJ1Y3QgY2FycF9wcml2ICopZGF0YTsNCg0KCS8vbG9nKCIl czogc3RhdGU9JWQuXG4iLCBfX2Z1bmNfXywgY3AtPnN0YXRlKTsNCg0KCWlmIChjcC0+c3RhdGUg IT0gTUFTVEVSKQ0KCXsNCgkJaWYgKHRlc3RfYml0KENBUlBfREFUQV9BVkFJTCwgKGxvbmcgKikm Y3AtPmZsYWdzKSkNCgkJew0KCQkJaWYgKCF0aW1lcl9wZW5kaW5nKCZjcC0+bWRfdGltZXIpKQ0K CQkJCW1vZF90aW1lcigmY3AtPm1kX3RpbWVyLCBqaWZmaWVzICsgY3AtPm1kX3RpbWVvdXQqSFop Ow0KCQl9DQoJCWVsc2UNCgkJCWNhcnBfc2V0X3N0YXRlKGNwLCBNQVNURVIpOw0KCX0NCgkJCQ0K CWNsZWFyX2JpdChDQVJQX0RBVEFfQVZBSUwsIChsb25nICopJmNwLT5mbGFncyk7DQp9DQoNCnN0 YXRpYyBpbnQgY2FycF9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYikNCnsNCglzdHJ1Y3QgaXBoZHIg KmlwaDsNCglzdHJ1Y3QgY2FycF9wcml2ICpjcCA9IGNhcnBfZGV2LT5wcml2Ow0KCXN0cnVjdCBj YXJwX2hlYWRlciAqY2g7DQoJaW50IGVyciA9IDA7DQoJdTY0IHRtcF9jb3VudGVyOw0KCXN0cnVj dCB0aW1ldmFsIGNwdHYsIGNodHY7DQoNCgkvL2xvZygiJXM6IHN0YXRlPSVkXG4iLCBfX2Z1bmNf XywgY3AtPnN0YXRlKTsNCgkNCglzcGluX2xvY2soJmNwLT5sb2NrKTsNCg0KCWlwaCA9IHNrYi0+ bmguaXBoOw0KCWNoID0gKHN0cnVjdCBjYXJwX2hlYWRlciAqKXNrYi0+ZGF0YTsNCg0KCS8vZHVt cF9jYXJwX2hlYWRlcihjaCk7DQoJDQoJaWYgKGNoLT5jYXJwX3ZlcnNpb24gIT0gY3AtPmhkci5j YXJwX3ZlcnNpb24pDQoJew0KCQlsb2coIkNBUlAgdmVyc2lvbiBtaXNtYXRjaDogcmVtb3RlPSVk LCBsb2NhbD0lZC5cbiIsDQoJCQljaC0+Y2FycF92ZXJzaW9uLCBjcC0+aGRyLmNhcnBfdmVyc2lv bik7DQoJCWNwLT5jc3RhdC52ZXJfZXJyb3JzKys7DQoJCWdvdG8gZXJyX291dF9za2JfZHJvcDsN Cgl9DQoJDQoJaWYgKGNoLT5jYXJwX3ZoaWQgIT0gY3AtPmhkci5jYXJwX3ZoaWQpDQoJew0KCQls b2coIkNBUlAgdmlydHVhbCBob3N0IGlkIG1pc21hdGNoOiByZW1vdGU9JWQsIGxvY2FsPSVkLlxu IiwNCgkJCWNoLT5jYXJwX3ZoaWQsIGNwLT5oZHIuY2FycF92aGlkKTsNCgkJY3AtPmNzdGF0LnZo aWRfZXJyb3JzKys7DQoJCWdvdG8gZXJyX291dF9za2JfZHJvcDsNCgl9DQoNCglpZiAoY2FycF9o bWFjX3ZlcmlmeShjcCwgY2gpKQ0KCXsNCgkJbG9nKCJITUFDIG1pc21hdGNoLlxuIik7DQoJCWNw LT5jc3RhdC5obWFjX2Vycm9ycysrOw0KCQlnb3RvIGVycl9vdXRfc2tiX2Ryb3A7DQoJfQ0KDQoJ dG1wX2NvdW50ZXIgPSBudG9obChjaC0+Y2FycF9jb3VudGVyWzBdKTsNCgl0bXBfY291bnRlciA9 IHRtcF9jb3VudGVyPDwzMjsNCgl0bXBfY291bnRlciArPSBudG9obChjaC0+Y2FycF9jb3VudGVy WzFdKTsNCgkNCglpZiAoY3AtPnN0YXRlID09IEJBQ0tVUCAmJiArK2NwLT5jYXJwX2Fkdl9jb3Vu dGVyICE9IHRtcF9jb3VudGVyKQ0KCXsNCgkJbG9nKCJDb3VudGVyIG1pc21hdGNoOiByZW1vdGU9 JWxsdSwgbG9jYWw9JWxsdS5cbiIsIHRtcF9jb3VudGVyLCBjcC0+Y2FycF9hZHZfY291bnRlcik7 DQoJCWNwLT5jc3RhdC5jb3VudGVyX2Vycm9ycysrOw0KCQlnb3RvIGVycl9vdXRfc2tiX2Ryb3A7 DQoJfQ0KDQoJY3B0di50dl9zZWMgPSBjcC0+aGRyLmNhcnBfYWR2YmFzZTsNCglpZiAoY3AtPmhk ci5jYXJwX2FkdmJhc2UgPCAgMjQwKQ0KCQljcHR2LnR2X3VzZWMgPSAyNDAgKiAxMDAwMDAwIC8g MjU2Ow0KCWVsc2UNCgkJY3B0di50dl91c2VjID0gY3AtPmhkci5jYXJwX2FkdnNrZXcgKiAxMDAw MDAwIC8gMjU2Ow0KCQ0KCWNodHYudHZfc2VjID0gY2gtPmNhcnBfYWR2YmFzZTsNCgljaHR2LnR2 X3VzZWMgPSBjaC0+Y2FycF9hZHZza2V3ICogMTAwMDAwMCAvIDI1NjsNCg0KCS8qbG9nKCJsb2Nh bD0lbHUuJWx1LCByZW1vdGU9JWx1LiVsdSwgbGNvdW50ZXI9JWxsdSwgcmVtY291bnRlcj0lbGx1 LCBzdGF0ZT0lZFxuIiwgDQoJCQljcHR2LnR2X3NlYywgY3B0di50dl91c2VjLA0KCQkJY2h0di50 dl9zZWMsIGNodHYudHZfdXNlYywNCgkJCWNwLT5jYXJwX2Fkdl9jb3VudGVyLCB0bXBfY291bnRl ciwNCgkJCWNwLT5zdGF0ZSk7DQoJKi8JDQoJc2V0X2JpdChDQVJQX0RBVEFfQVZBSUwsIChsb25n ICopJmNwLT5mbGFncyk7DQoNCglzd2l0Y2ggKGNwLT5zdGF0ZSkNCgl7DQoJCWNhc2UgSU5JVDoN CgkJCWlmICh0aW1ldmFsX2JlZm9yZSgmY2h0diwgJmNwdHYpKQ0KCQkJew0KCQkJCWNwLT5jYXJw X2Fkdl9jb3VudGVyID0gdG1wX2NvdW50ZXI7DQoJCQkJY2FycF9zZXRfc3RhdGUoY3AsIEJBQ0tV UCk7DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJY2FycF9zZXRfc3RhdGUoY3AsIE1BU1RFUik7 DQoJCQl9DQoJCQlicmVhazsNCgkJY2FzZSBNQVNURVI6DQoJCQlpZiAodGltZXZhbF9iZWZvcmUo JmNodHYsICZjcHR2KSkNCgkJCXsNCgkJCQljcC0+Y2FycF9hZHZfY291bnRlciA9IHRtcF9jb3Vu dGVyOw0KCQkJCWNhcnBfc2V0X3N0YXRlKGNwLCBCQUNLVVApOw0KCQkJfQ0KCQkJYnJlYWs7DQoJ CWNhc2UgQkFDS1VQOg0KCQkJaWYgKHRpbWV2YWxfYmVmb3JlKCZjcHR2LCAmY2h0dikpDQoJCQl7 DQoJCQkJY2FycF9zZXRfc3RhdGUoY3AsIE1BU1RFUik7DQoJCQl9DQoJCQlicmVhazsNCgl9DQoN CmVycl9vdXRfc2tiX2Ryb3A6DQoJa2ZyZWVfc2tiKHNrYik7DQoJc3Bpbl91bmxvY2soJmNwLT5s b2NrKTsNCg0KCXJldHVybiBlcnI7DQp9DQoNCnN0YXRpYyBpbnQgY2FycF94bWl0KHN0cnVjdCBz a19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpDQp7DQojaWYgMA0KCXN0cnVjdCBj YXJwX3ByaXYgKmNwID0gKHN0cnVjdCBjYXJwX3ByaXYgKilkZXYtPnByaXY7DQoJc3RydWN0IG5l dF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJmNwLT5zdGF0Ow0KCXN0cnVjdCBpcGhkciAgKmlwaCA9 IHNrYi0+bmguaXBoOw0KCXU4ICAgICB0b3M7DQoJdTE2ICAgIGRmOw0KCXN0cnVjdCBydGFibGUg KnJ0Ow0KCXN0cnVjdCBuZXRfZGV2aWNlICp0ZGV2Ow0KCXUzMiAgICBkc3Q7DQoJaW50ICAgIG10 dTsNCglpbnQgZXJyOwkJCQkJCQkNCglpbnQgcGt0X2xlbiA9IHNrYi0+bGVuOwkNCglsb2coIiVz XG4iLCBfX2Z1bmNfXyk7DQoNCglza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7DQoJc2ti LT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQKTsNCg0KCWlwX3NlbGVjdF9pZGVudChpcGgsICZy dC0+dS5kc3QsIE5VTEwpOw0KCWlwX3NlbmRfY2hlY2soaXBoKTsNCgllcnIgPSBORl9IT09LKFBG X0lORVQsIE5GX0lQX0xPQ0FMX09VVCwgc2tiLCBOVUxMLCBydC0+dS5kc3QuZGV2LCBkc3Rfb3V0 cHV0KTsNCglpZiAoZXJyID09IE5FVF9YTUlUX1NVQ0NFU1MgfHwgZXJyID09IE5FVF9YTUlUX0NO KSB7DQoJCXN0YXRzLT50eF9ieXRlcyArPSBwa3RfbGVuOw0KCQlzdGF0cy0+dHhfcGFja2V0cysr Ow0KCX0gZWxzZSB7DQoJCXN0YXRzLT50eF9lcnJvcnMrKzsNCgkJc3RhdHMtPnR4X2Fib3J0ZWRf ZXJyb3JzKys7DQoJfQ0KI2VuZGlmDQoJcmV0dXJuIDA7DQp9DQoNCnN0YXRpYyBpbnQgY2FycF9p b2N0bCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQp DQp7DQoJaW50IGVyciA9IDA7DQoJc3RydWN0IGNhcnBfcHJpdiAqY3AgPSAoc3RydWN0IGNhcnBf cHJpdiAqKWRldi0+cHJpdjsNCglzdHJ1Y3QgbmV0X2RldmljZSAqdGRldiA9IE5VTEw7DQoJc3Ry dWN0IGNhcnBfaW9jdGxfcGFyYW1zIHA7DQoNCglsb2coIiVzXG4iLCBfX2Z1bmNfXyk7DQoNCglt ZW1zZXQoJnAsIDAsIHNpemVvZihwKSk7DQoJDQoJZXJyID0gLUVQRVJNOw0KCWlmICghY2FwYWJs ZShDQVBfTkVUX0FETUlOKSkNCgkJZ290byBlcnJfb3V0Ow0KDQoJc3dpdGNoIChjbWQpDQoJew0K I2lmIDANCgkJY2FzZSBTSU9DX1NFVElQSERSOg0KDQoJCQlsb2coIlNldHRpbmcgbmV3IGhlYWRl ci5cbiIpOw0KCQkJDQoJCQllcnIgPSAtRUZBVUxUOw0KCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZp cGgsIGlmci0+aWZyX2lmcnUuaWZydV9kYXRhLCBzaXplb2YoaXBoKSkpDQoJCQkJZ290byBlcnJf b3V0Ow0KDQoJCQllcnIgPSAtRUlOVkFMOw0KCQkJaWYgKGlwaC52ZXJzaW9uICE9IDQgfHwgaXBo LnByb3RvY29sICE9IElQUFJPVE9fQ0FSUCB8fCBpcGguaWhsICE9IDUgfHwgIU1VTFRJQ0FTVChp cGguZGFkZHIpKQ0KCQkJCWdvdG8gZXJyX291dDsNCg0KCQkJc3Bpbl9sb2NrKCZjcC0+bG9jayk7 DQoJCQljYXJwX2Nsb3NlKGNwLT5kZXYpOw0KCQkJDQoJCQltZW1jcHkoJmNwLT5pcGgsICZpcGgs IHNpemVvZihpcGgpKTsNCgkJCQ0KCQkJY2FycF9vcGVuKGNwLT5kZXYpOw0KCQkJc3Bpbl91bmxv Y2soJmNwLT5sb2NrKTsNCgkJCWJyZWFrOw0KI2VuZGlmDQoJCWNhc2UgU0lPQ19TRVRDQVJQUEFS QU1TOg0KCQkJZXJyID0gLUVGQVVMVDsNCgkJCWlmIChjb3B5X2Zyb21fdXNlcigmcCwgaWZyLT5p ZnJfaWZydS5pZnJ1X2RhdGEsIHNpemVvZihwKSkpDQoJCQkJZ290byBlcnJfb3V0Ow0KDQoJCQll cnIgPSAtRUlOVkFMOw0KCQkJaWYgKGNhcnBfY2hlY2tfcGFyYW1zKHApKQ0KCQkJCWdvdG8gZXJy X291dDsNCg0KCQkJbG9nKCJTZXR0aW5nIG5ldyBDQVJQIHBhcmFtZXRlcnMuXG4iKTsNCg0KCQkJ aWYgKG1lbWNtcChwLmRldm5hbWUsIGNwLT5vZGV2LT5uYW1lLCBJRk5BTVNJWikgJiYgKHRkZXYg PSBkZXZfZ2V0X2J5X25hbWUocC5kZXZuYW1lKSkgIT0gTlVMTCkNCgkJCQljYXJwX2Nsb3NlKGNw LT5kZXYpOw0KDQoJCQlzcGluX2xvY2soJmNwLT5sb2NrKTsNCg0KCQkJaWYgKHRkZXYpDQoJCQl7 DQoJCQkJY3AtPm9kZXYtPmZsYWdzID0gY3AtPm9mbGFnczsNCgkJCQlkZXZfcHV0KGNwLT5vZGV2 KTsNCgkJCQkNCgkJCQljcC0+b2RldiAJPSB0ZGV2Ow0KCQkJCWNwLT5saW5rIAk9IGNwLT5vZGV2 LT5pZmluZGV4Ow0KCQkJCWNwLT5vZmxhZ3MgCT0gY3AtPm9kZXYtPmZsYWdzOw0KCQkJCWNwLT5v ZGV2LT5mbGFncyB8PSBJRkZfQlJPQURDQVNUIHwgSUZGX0FMTE1VTFRJOw0KCQkJfQ0KCQkJDQoJ CQljcC0+bWRfdGltZW91dCA9IHAubWRfdGltZW91dDsNCgkJCWNwLT5hZHZfdGltZW91dCA9IHAu YWR2X3RpbWVvdXQ7DQoJCQkNCgkJCWNhcnBfc2V0X3N0YXRlKGNwLCBwLnN0YXRlKTsNCgkJCW1l bWNweShjcC0+Y2FycF9wYWQsIHAuY2FycF9wYWQsIHNpemVvZihjcC0+Y2FycF9wYWQpKTsNCgkJ CW1lbWNweShjcC0+Y2FycF9rZXksIHAuY2FycF9rZXksIHNpemVvZihjcC0+Y2FycF9rZXkpKTsN CgkJCWNwLT5oZHIuY2FycF92aGlkID0gcC5jYXJwX3ZoaWQ7DQoJCQljcC0+aGRyLmNhcnBfYWR2 YmFzZSA9IHAuY2FycF9hZHZiYXNlOw0KCQkJY3AtPmhkci5jYXJwX2FkdnNrZXcgPSBwLmNhcnBf YWR2c2tldzsNCg0KCQkJc3Bpbl91bmxvY2soJmNwLT5sb2NrKTsNCgkJCWlmICh0ZGV2KQ0KCQkJ CWNhcnBfb3BlbihjcC0+ZGV2KTsNCgkJCWJyZWFrOw0KCQljYXNlIFNJT0NfR0VUQ0FSUFBBUkFN UzoNCg0KCQkJbG9nKCJEdW1waW5nIENBUlAgcGFyYW1ldGVycy5cbiIpOw0KDQoJCQlzcGluX2xv Y2soJmNwLT5sb2NrKTsNCgkJCXAuc3RhdGUgPSBjcC0+c3RhdGU7DQoJCQltZW1jcHkocC5jYXJw X3BhZCwgY3AtPmNhcnBfcGFkLCBzaXplb2YoY3AtPmNhcnBfcGFkKSk7DQoJCQltZW1jcHkocC5j YXJwX2tleSwgY3AtPmNhcnBfa2V5LCBzaXplb2YoY3AtPmNhcnBfa2V5KSk7DQoJCQlwLmNhcnBf dmhpZCA9IGNwLT5oZHIuY2FycF92aGlkOw0KCQkJcC5jYXJwX2FkdmJhc2UgPSBjcC0+aGRyLmNh cnBfYWR2YmFzZTsNCgkJCXAuY2FycF9hZHZza2V3ID0gY3AtPmhkci5jYXJwX2FkdnNrZXc7DQoJ CQlwLm1kX3RpbWVvdXQgPSBjcC0+bWRfdGltZW91dDsNCgkJCXAuYWR2X3RpbWVvdXQgPSBjcC0+ YWR2X3RpbWVvdXQ7DQoJCQltZW1jcHkocC5kZXZuYW1lLCBjcC0+b2Rldi0+bmFtZSwgc2l6ZW9m KHAuZGV2bmFtZSkpOw0KCQkJcC5kZXZuYW1lW3NpemVvZihwLmRldm5hbWUpIC0gMV0gPSAnXDAn Ow0KCQkJc3Bpbl91bmxvY2soJmNwLT5sb2NrKTsNCg0KCQkJZXJyID0gLUVGQVVMVDsNCgkJCWlm IChjb3B5X3RvX3VzZXIoaWZyLT5pZnJfaWZydS5pZnJ1X2RhdGEsICZwLCBzaXplb2YocCkpKQ0K CQkJCWdvdG8gZXJyX291dDsNCgkJCWJyZWFrOw0KCQlkZWZhdWx0Og0KCQkJZXJyID0gLUVJTlZB TDsNCgkJCWJyZWFrOw0KDQoJfQ0KCWVyciA9IDA7DQoJCQkNCmVycl9vdXQ6DQoJcmV0dXJuIGVy cjsNCn0NCg0Kc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpjYXJwX2dldF9zdGF0cyhz dHJ1Y3QgbmV0X2RldmljZSAqZGV2KQ0Kew0KCXN0cnVjdCBjYXJwX3ByaXYgKmNwID0gKHN0cnVj dCBjYXJwX3ByaXYgKilkZXYtPnByaXY7DQoJc3RydWN0IGNhcnBfc3RhdCAqY3MgPSAmY3AtPmNz dGF0Ow0KCQ0KCWxvZygiJXM6IGNyYz0lOGQsIHZlcj0lOGQsIG1lbT0lOGQsIHhtaXQ9JThkIHwg Ynl0ZXNfc2VudD0lOGRcbiIsIA0KCQkJX19mdW5jX18sIA0KCQkJY3MtPmNyY19lcnJvcnMsIGNz LT52ZXJfZXJyb3JzLCBjcy0+bWVtX2Vycm9ycywgY3MtPnhtaXRfZXJyb3JzLA0KCQkJY3MtPmJ5 dGVzX3NlbnQpOw0KCXJldHVybiAmKCgoc3RydWN0IGNhcnBfcHJpdiAqKWRldi0+cHJpdiktPnN0 YXQpOw0KfQ0KDQpzdGF0aWMgaW50IGNhcnBfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAq ZGV2LCBpbnQgbmV3X210dSkNCnsNCglsb2coIiVzXG4iLCBfX2Z1bmNfXyk7DQoJZGV2LT5tdHUg PSBuZXdfbXR1Ow0KCXJldHVybiAwOw0KfQ0KDQpzdGF0aWMgdm9pZCBjYXJwX3NldHVwKHN0cnVj dCBuZXRfZGV2aWNlICpkZXYpDQp7DQoJbG9nKCIlc1xuIiwgX19mdW5jX18pOw0KCVNFVF9NT0RV TEVfT1dORVIoZGV2KTsNCglkZXYtPnVuaW5pdAkJPSBjYXJwX3VuaW5pdDsNCglkZXYtPmRlc3Ry dWN0b3IgCT0gZnJlZV9uZXRkZXY7DQoJZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSBjYXJwX3htaXQ7 DQoJZGV2LT5nZXRfc3RhdHMJCT0gY2FycF9nZXRfc3RhdHM7DQoJZGV2LT5kb19pb2N0bAkJPSBj YXJwX2lvY3RsOw0KCWRldi0+Y2hhbmdlX210dQkJPSBjYXJwX2NoYW5nZV9tdHU7DQoNCglkZXYt PnR5cGUJCT0gQVJQSFJEX0VUSEVSOw0KCWRldi0+aGFyZF9oZWFkZXJfbGVuIAk9IExMX01BWF9I RUFERVI7DQoJZGV2LT5tdHUJCT0gMTUwMDsNCglkZXYtPmZsYWdzCQk9IElGRl9OT0FSUDsNCglk ZXYtPmlmbGluawkJPSAwOw0KCWRldi0+YWRkcl9sZW4JCT0gNDsNCn0NCg0Kc3RhdGljIGludCBj YXJwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikNCnsNCglzdHJ1Y3QgY2FycF9wcml2ICpj cCA9IChzdHJ1Y3QgY2FycF9wcml2ICopZGV2LT5wcml2Ow0KCXN0cnVjdCBmbG93aSBmbCA9IHsg Lm9pZiA9IGNwLT5saW5rLA0KCQkJICAgIC5ubF91ID0geyAuaXA0X3UgPQ0KCQkJCSAgICAgIHsg LmRhZGRyID0gY3AtPmlwaC5kYWRkciwNCgkJCQkJLnNhZGRyID0gY3AtPmlwaC5zYWRkciwNCgkJ CQkJLnRvcyA9IFJUX1RPUyhjcC0+aXBoLnRvcykgfSB9LA0KCQkJICAgIC5wcm90byA9IElQUFJP VE9fQ0FSUCB9Ow0KCXN0cnVjdCBydGFibGUgKnJ0Ow0KCQ0KCWlmIChpcF9yb3V0ZV9vdXRwdXRf a2V5KCZydCwgJmZsKSkNCgkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOw0KCWRldiA9IHJ0LT51LmRz dC5kZXY7DQoJaXBfcnRfcHV0KHJ0KTsNCglpZiAoX19pbl9kZXZfZ2V0KGRldikgPT0gTlVMTCkN CgkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOw0KCWNwLT5tbGluayA9IGRldi0+aWZpbmRleDsNCglp cF9tY19pbmNfZ3JvdXAoX19pbl9kZXZfZ2V0KGRldiksIGNwLT5pcGguZGFkZHIpOw0KDQoJcmV0 dXJuIDA7DQp9DQoNCnN0YXRpYyBpbnQgY2FycF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2 KQ0Kew0KCXN0cnVjdCBjYXJwX3ByaXYgKmNwID0gKHN0cnVjdCBjYXJwX3ByaXYgKilkZXYtPnBy aXY7DQoJc3RydWN0IGluX2RldmljZSAqaW5fZGV2ID0gaW5ldGRldl9ieV9pbmRleChjcC0+bWxp bmspOw0KCQ0KCWlmIChpbl9kZXYpIHsNCgkJaXBfbWNfZGVjX2dyb3VwKGluX2RldiwgY3AtPmlw aC5kYWRkcik7DQoJCWluX2Rldl9wdXQoaW5fZGV2KTsNCgl9DQoJcmV0dXJuIDA7DQp9DQoNCnN0 YXRpYyBpbnQgY2FycF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpDQp7DQoJc3RydWN0IG5l dF9kZXZpY2UgKnRkZXYgPSBOVUxMOw0KCXN0cnVjdCBjYXJwX3ByaXYgKmNwOw0KCXN0cnVjdCBp cGhkciAqaXBoOw0KCWludCBobGVuID0gTExfTUFYX0hFQURFUjsNCglpbnQgbXR1ID0gMTUwMDsN Cg0KCWxvZygiJXMgLSAlc1xuIiwgX19mdW5jX18sIGRldi0+bmFtZSk7DQoJY3AgPSAoc3RydWN0 IGNhcnBfcHJpdiAqKWRldi0+cHJpdjsNCglpcGggPSAmY3AtPmlwaDsNCg0KCWlmICghaXBoLT5k YWRkciB8fCAhTVVMVElDQVNUKGlwaC0+ZGFkZHIpIHx8ICFpcGgtPnNhZGRyKQ0KCQlyZXR1cm4g LUVJTlZBTDsNCgkNCglkZXZfaG9sZChkZXYpOw0KDQoJY3AtPmRldiA9IGRldjsNCglzdHJuY3B5 KGNwLT5uYW1lLCBkZXYtPm5hbWUsIElGTkFNU0laKTsNCg0KCWlwX2V0aF9tY19tYXAoY3AtPmlw aC5kYWRkciwgZGV2LT5kZXZfYWRkcik7DQoJbWVtY3B5KGRldi0+YnJvYWRjYXN0LCAmaXBoLT5k YWRkciwgNCk7DQoNCgl7DQoJCXN0cnVjdCBmbG93aSBmbCA9IHsgLm9pZiA9IGNwLT5saW5rLA0K CQkJCSAgICAubmxfdSA9IHsgLmlwNF91ID0NCgkJCQkJICAgICAgeyAuZGFkZHIgPSBpcGgtPmRh ZGRyLA0KCQkJCQkJLnNhZGRyID0gaXBoLT5zYWRkciwNCgkJCQkJCS50b3MgPSBSVF9UT1MoaXBo LT50b3MpIH0gfSwNCgkJCQkgICAgLnByb3RvID0gSVBQUk9UT19DQVJQIH07DQoJCXN0cnVjdCBy dGFibGUgKnJ0Ow0KCQlpZiAoIWlwX3JvdXRlX291dHB1dF9rZXkoJnJ0LCAmZmwpKSB7DQoJCQl0 ZGV2ID0gcnQtPnUuZHN0LmRldjsNCgkJCWlwX3J0X3B1dChydCk7DQoJCX0NCgl9DQoNCgljcC0+ b2ZsYWdzIAkJPSBjcC0+b2Rldi0+ZmxhZ3M7DQoJZGV2LT5mbGFncyAJCXw9IElGRl9CUk9BRENB U1QgfCBJRkZfQUxMTVVMVEk7DQoJY3AtPm9kZXYtPmZsYWdzIAl8PSBJRkZfQlJPQURDQVNUIHwg SUZGX0FMTE1VTFRJOw0KDQoJZGV2LT5vcGVuCQk9IGNhcnBfb3BlbjsNCglkZXYtPnN0b3AJCT0g Y2FycF9jbG9zZTsNCg0KCWlmICghdGRldiAmJiBjcC0+bGluaykNCgkJdGRldiA9IF9fZGV2X2dl dF9ieV9pbmRleChjcC0+bGluayk7DQoNCglpZiAodGRldikgew0KCQlobGVuID0gdGRldi0+aGFy ZF9oZWFkZXJfbGVuOw0KCQltdHUgPSB0ZGV2LT5tdHU7DQoJfQ0KCWRldi0+aWZsaW5rID0gY3At Pmxpbms7DQoNCglkZXYtPmhhcmRfaGVhZGVyX2xlbiA9IGhsZW47DQoJZGV2LT5tdHUgPSBtdHU7 DQoNCglyZXR1cm4gMDsNCn0NCg0Kc3RhdGljIHN0cnVjdCBpbmV0X3Byb3RvY29sIGNhcnBfcHJv dG9jb2wgPSB7DQoJLmhhbmRsZXIJPQljYXJwX3JjdiwNCgkuZXJyX2hhbmRsZXIJPQljYXJwX2Vy ciwNCn07DQoNCnN0YXRpYyB1MzIgaW5saW5lIGFkZHIydmFsKHU4IGExLCB1OCBhMiwgdTggYTMs IHU4IGE0KQ0Kew0KCXUzMiByZXQ7DQoNCglyZXQgPSAoKGExIDw8IDI0KSB8IChhMiA8PCAxNikg fCAoYTMgPDwgOCkgfCAoYTQgPDwgMCkpOw0KCQ0KCXJldHVybiBodG9ubChyZXQpOw0KfQ0KDQpz dGF0aWMgdm9pZCBjYXJwX2FkdmVydGlzZSh1bnNpZ25lZCBsb25nIGRhdGEpDQp7DQoJc3RydWN0 IGNhcnBfcHJpdiAqY3AgPSAoc3RydWN0IGNhcnBfcHJpdiAqKWRhdGE7DQoJc3RydWN0IGNhcnBf aGVhZGVyICpjaCA9ICZjcC0+aGRyOw0KCXN0cnVjdCBjYXJwX3N0YXQgKmNzID0gJmNwLT5jc3Rh dDsNCglzdHJ1Y3Qgc2tfYnVmZiAqc2tiOw0KCWludCBsZW47DQoJc3RydWN0IGV0aGhkciAqZXRo Ow0KCXN0cnVjdCBpcGhkciAqaXA7DQoJc3RydWN0IGNhcnBfaGVhZGVyICpjOw0KDQoJaWYgKGNw LT5zdGF0ZSA9PSBCQUNLVVAgfHwgIWNwLT5vZGV2KQ0KCQlyZXR1cm47DQoNCglsZW4gPSBzaXpl b2Yoc3RydWN0IGlwaGRyKSArIHNpemVvZihzdHJ1Y3QgY2FycF9oZWFkZXIpICsgc2l6ZW9mKHN0 cnVjdCBldGhoZHIpOw0KCQ0KCXNrYiA9IGFsbG9jX3NrYihsZW4gKyAyLCBHRlBfQVRPTUlDKTsN CglpZiAoIXNrYikNCgl7DQoJCWxvZygiRmFpbGVkIHRvIGFsbG9jYXRlIG5ldyBjYXJwIGZyYW1l LlxuIik7DQoJCWNzLT5tZW1fZXJyb3JzKys7DQoJCWdvdG8gb3V0Ow0KCX0NCgkNCglza2JfcmVz ZXJ2ZShza2IsIDE2KTsNCglldGggPSAoc3RydWN0IGV0aGhkciAqKSBza2JfcHVzaChza2IsIDE0 KTsNCglpcCA9IChzdHJ1Y3QgaXBoZHIgKilza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhk cikpOw0KCWMgPSAoc3RydWN0IGNhcnBfaGVhZGVyICopc2tiX3B1dChza2IsIHNpemVvZihzdHJ1 Y3QgY2FycF9oZWFkZXIpKTsNCgkNCgltZW1zZXQoJihJUENCKHNrYiktPm9wdCksIDAsIHNpemVv ZihJUENCKHNrYiktPm9wdCkpOw0KCQ0KCWlwX2V0aF9tY19tYXAoY3AtPmlwaC5kYWRkciwgZXRo LT5oX2Rlc3QpOw0KCW1lbWNweShldGgtPmhfc291cmNlLCBjcC0+b2Rldi0+ZGV2X2FkZHIsIEVU SF9BTEVOKTsNCglldGgtPmhfcHJvdG8gCT0gaHRvbnMoRVRIX1BfSVApOw0KDQoJaXAtPmlobCAJ PSA1Ow0KCWlwLT52ZXJzaW9uIAk9IDQ7DQoJaXAtPnRvcwkJPSAwOw0KCWlwLT50b3RfbGVuCT0g aHRvbnMobGVuIC0gc2l6ZW9mKHN0cnVjdCBldGhoZHIpKTsNCglpcC0+ZnJhZ19vZmYJPSAwOw0K CWlwLT50dGwJCT0gQ0FSUF9UVEw7DQoJaXAtPnByb3RvY29sCT0gSVBQUk9UT19DQVJQOw0KCWlw LT5jaGVjawk9IDA7DQoJaXAtPnNhZGRyCT0gY3AtPmlwaC5zYWRkcjsNCglpcC0+ZGFkZHIJPSBj cC0+aXBoLmRhZGRyOw0KCWdldF9yYW5kb21fYnl0ZXMoJmlwLT5pZCwgMik7DQoJaXBfc2VuZF9j aGVjayhpcCk7DQoNCgltZW1jcHkoYywgY2gsIHNpemVvZihzdHJ1Y3QgY2FycF9oZWFkZXIpKTsN CgkNCglzcGluX2xvY2soJmNwLT5sb2NrKTsNCgljcC0+Y2FycF9hZHZfY291bnRlcisrOw0KCXNw aW5fdW5sb2NrKCZjcC0+bG9jayk7DQoNCgljaC0+Y2FycF9jb3VudGVyWzFdID0gaHRvbmwoY3At PmNhcnBfYWR2X2NvdW50ZXIgJiAweGZmZmZmZmZmKTsNCgljaC0+Y2FycF9jb3VudGVyWzBdID0g aHRvbmwoKGNwLT5jYXJwX2Fkdl9jb3VudGVyID4+IDMyKSAmIDB4ZmZmZmZmZmYpOw0KCWNhcnBf aG1hY19zaWduKGNwLCBjaCk7DQoJDQoJc2tiLT5wcm90b2NvbCAJPSBfX2NvbnN0YW50X2h0b25z KEVUSF9QX0lQKTsNCglza2ItPm1hYy5yYXcgCT0gKCh1OCAqKWlwKSAtIDE0Ow0KCXNrYi0+ZGV2 IAk9IGNwLT5vZGV2Ow0KCXNrYi0+cGt0X3R5cGUgCT0gUEFDS0VUX01VTFRJQ0FTVDsNCgkJDQoJ c3Bpbl9sb2NrX2JoKCZjcC0+b2Rldi0+eG1pdF9sb2NrKTsNCglpZiAoIW5ldGlmX3F1ZXVlX3N0 b3BwZWQoY3AtPm9kZXYpKSANCgl7DQoJCWF0b21pY19pbmMoJnNrYi0+dXNlcnMpOw0KDQoJCWlm IChjcC0+b2Rldi0+aGFyZF9zdGFydF94bWl0KHNrYiwgY3AtPm9kZXYpKSANCgkJew0KCQkJYXRv bWljX2RlYygmc2tiLT51c2Vycyk7DQoJCQljcy0+eG1pdF9lcnJvcnMrKzsNCgkJCWxvZygiSGFy ZCB4bWl0IGVycm9yLlxuIik7DQoJCX0NCgkJY3MtPmJ5dGVzX3NlbnQgKz0gbGVuOw0KCX0NCglz cGluX3VubG9ja19iaCgmY3AtPm9kZXYtPnhtaXRfbG9jayk7DQoNCgltb2RfdGltZXIoJmNwLT5h ZHZfdGltZXIsIGppZmZpZXMgKyBjcC0+YWR2X3RpbWVvdXQqSFopOw0KDQoJa2ZyZWVfc2tiKHNr Yik7DQpvdXQ6DQoJcmV0dXJuOw0KfQ0KDQpzdGF0aWMgaW50IF9faW5pdCBkZXZpY2VfY2FycF9p bml0KHZvaWQpDQp7DQoJaW50IGVycjsNCglzdHJ1Y3QgY2FycF9wcml2ICpjcDsNCg0KCXByaW50 ayhLRVJOX0lORk8gIkNBUlAgZHJpdmVyLlxuIik7DQoNCgljYXJwX2RldiA9IGFsbG9jX25ldGRl dihzaXplb2Yoc3RydWN0IGNhcnBfcHJpdiksICJjYXJwMCIsICBjYXJwX3NldHVwKTsNCglpZiAo IWNhcnBfZGV2KSANCgl7DQoJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIGFsbG9jYXRlIENB UlAgbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlLlxuIik7DQoJCXJldHVybiAtRU5PTUVNOw0KCX0N Cg0KCWlmIChpbmV0X2FkZF9wcm90b2NvbCgmY2FycF9wcm90b2NvbCwgSVBQUk9UT19DQVJQKSA8 IDApIA0KCXsNCgkJcHJpbnRrKEtFUk5fSU5GTyAiRmFpbGVkIHRvIGFkZCBDQVJQIHByb3RvY29s LlxuIik7DQoJCWVyciA9IC1FQUdBSU47DQoJCWdvdG8gZXJyX291dF9tZW1fZnJlZTsNCgl9DQoN CgljcCA9IGNhcnBfZGV2LT5wcml2Ow0KCQ0KCWNwLT5pcGguc2FkZHIgCT0gYWRkcjJ2YWwoMTAs IDAsIDAsIDMpOw0KCWNwLT5pcGguZGFkZHIgCT0gYWRkcjJ2YWwoMjI0LCAwLCAxLCAxMCk7DQoJ Y3AtPmlwaC50b3MJPSAwOw0KCWNwLT5tZF90aW1lb3V0CT0gMzsNCgljcC0+YWR2X3RpbWVvdXQJ PSAxOw0KCWNwLT5zdGF0ZQk9IElOSVQ7DQoJc3Bpbl9sb2NrX2luaXQoJmNwLT5sb2NrKTsNCg0K CWNwLT5vZGV2CT0gZGV2X2dldF9ieV9uYW1lKCJldGgwIik7DQoJaWYgKGNwLT5vZGV2KQ0KCXsN CgkJY3AtPmxpbmsJPSBjcC0+b2Rldi0+aWZpbmRleDsNCgkJY3AtPmlwaC5zYWRkcgk9IChfX2lu X2Rldl9nZXQoY3AtPm9kZXYpKS0+aWZhX2xpc3RbMF0uaWZhX2FkZHJlc3M7DQoJfQ0KDQoJbWVt c2V0KGNwLT5jYXJwX2tleSwgMSwgc2l6ZW9mKGNwLT5jYXJwX2tleSkpOw0KCWdldF9yYW5kb21f Ynl0ZXMoJmNwLT5jYXJwX2Fkdl9jb3VudGVyLCA4KTsNCgkNCglnZXRfcmFuZG9tX2J5dGVzKCZj cC0+aGRyLmNhcnBfYWR2c2tldywgMSk7DQoJZ2V0X3JhbmRvbV9ieXRlcygmY3AtPmhkci5jYXJw X2FkdmJhc2UsIDEpOw0KDQoJZHVtcF9hZGRyX2luZm8oY3ApOw0KDQoJaW5pdF90aW1lcigmY3At Pm1kX3RpbWVyKTsNCgljcC0+bWRfdGltZXIuZXhwaXJlcwk9IGppZmZpZXMgKyBjcC0+bWRfdGlt ZW91dCpIWjsNCgljcC0+bWRfdGltZXIuZGF0YQk9ICh1bnNpZ25lZCBsb25nKWNwOw0KCWNwLT5t ZF90aW1lci5mdW5jdGlvbgk9IGNhcnBfbWFzdGVyX2Rvd247DQoNCglpbml0X3RpbWVyKCZjcC0+ YWR2X3RpbWVyKTsNCgljcC0+YWR2X3RpbWVyLmV4cGlyZXMJPSBqaWZmaWVzICsgY3AtPmFkdl90 aW1lb3V0KkhaOw0KCWNwLT5hZHZfdGltZXIuZGF0YQk9ICh1bnNpZ25lZCBsb25nKWNwOw0KCWNw LT5hZHZfdGltZXIuZnVuY3Rpb24JPSBjYXJwX2FkdmVydGlzZTsNCg0KCWNhcnBfZGV2LT5pbml0 ID0gY2FycF9pbml0Ow0KDQoJY3AtPnRmbSA9IGNyeXB0b19hbGxvY190Zm0oInNoYTEiLCAwKTsN CglpZiAoIWNwLT50Zm0pDQoJew0KCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBhbGxvY2F0 ZSBTSEExIHRmbS5cbiIpOw0KCQllcnIgPSAtRUlOVkFMOw0KCQlnb3RvIGVycl9vdXRfZGVsX3By b3RvY29sOw0KCX0NCg0KCWR1bXBfaG1hY19wYXJhbXMoY3ApOw0KDQoJZXJyID0gY2FycF9pbml0 X3F1ZXVlcygpOw0KCWlmIChlcnIpDQoJCWdvdG8gZXJyX291dF9jcnlwdG9fZnJlZTsNCg0KCWlm ICgoZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGNhcnBfZGV2KSkpDQoJCWdvdG8gZXJyX291dF9maW5p X2NhcnBfcXVldWVzOw0KDQoJYWRkX3RpbWVyKCZjcC0+bWRfdGltZXIpOw0KDQoJcmV0dXJuIGVy cjsNCg0KZXJyX291dF9maW5pX2NhcnBfcXVldWVzOg0KCWNhcnBfZmluaV9xdWV1ZXMoKTsNCmVy cl9vdXRfY3J5cHRvX2ZyZWU6DQoJY3J5cHRvX2ZyZWVfdGZtKGNwLT50Zm0pOw0KZXJyX291dF9k ZWxfcHJvdG9jb2w6DQoJaW5ldF9kZWxfcHJvdG9jb2woJmNhcnBfcHJvdG9jb2wsIElQUFJPVE9f Q0FSUCk7DQplcnJfb3V0X21lbV9mcmVlOg0KCWZyZWVfbmV0ZGV2KGNhcnBfZGV2KTsNCg0KCXJl dHVybiBlcnI7DQp9DQoNCnZvaWQgZGV2aWNlX2NhcnBfZmluaSh2b2lkKQ0Kew0KCXN0cnVjdCBj YXJwX3ByaXYgKmNwID0gY2FycF9kZXYtPnByaXY7DQoNCgljYXJwX2ZpbmlfcXVldWVzKCk7DQoN CglpZiAoaW5ldF9kZWxfcHJvdG9jb2woJmNhcnBfcHJvdG9jb2wsIElQUFJPVE9fQ0FSUCkgPCAw KQ0KCQlwcmludGsoS0VSTl9JTkZPICJGYWlsZWQgdG8gcmVtb3ZlIENBUlAgcHJvdG9jb2wgaGFu ZGxlci5cbiIpOw0KCQ0KCWNyeXB0b19mcmVlX3RmbShjcC0+dGZtKTsNCg0KCXVucmVnaXN0ZXJf bmV0ZGV2KGNhcnBfZGV2KTsNCn0NCg0KbW9kdWxlX2luaXQoZGV2aWNlX2NhcnBfaW5pdCk7DQpt b2R1bGVfZXhpdChkZXZpY2VfY2FycF9maW5pKTsNCk1PRFVMRV9MSUNFTlNFKCJHUEwiKTsNCk== --=-zMMMLADPc6OCZZ3l3ocw Content-Disposition: attachment; filename=carp.h Content-Type: text/x-chdr; name=carp.h; charset=koi8-r Content-Transfer-Encoding: base64 LyoNCiAqIAljYXJwLmgNCiAqIA0KICogMjAwNCBDb3B5cmlnaHQgKGMpIEV2Z2VuaXkgUG9seWFr b3YgPGpvaG5wb2xAMmthLm1pcHQucnU+DQogKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KICogDQog KiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQg YW5kL29yIG1vZGlmeQ0KICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQ dWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k YXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yDQogKiAoYXQgeW91ciBv cHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KICoNCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmli dXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KICogYnV0IFdJVEhPVVQg QU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiAqIE1F UkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0 aGUNCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQogKg0K ICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UNCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRv IHRoZSBGcmVlIFNvZnR3YXJlDQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2Us IFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBDQogKg0KICovDQoNCiNpZm5k ZWYgX19DQVJQX0gNCiNkZWZpbmUgX19DQVJQX0gNCg0KI2luY2x1ZGUgPGxpbnV4L25ldGRldmlj ZS5oPg0KI2luY2x1ZGUgPGxpbnV4L2lmLmg+DQojaW5jbHVkZSA8bGludXgvaXAuaD4NCg0KI2lu Y2x1ZGUgImNhcnBfaW9jdGwuaCINCg0KI2RlZmluZSBJUFBST1RPX0NBUlAgCQkxMTINCiNkZWZp bmUJQ0FSUF9WRVJTSU9OCQkyDQojZGVmaW5lIENBUlBfVFRMCQkyNTUNCiNkZWZpbmUJQ0FSUF9T SUdfTEVOCQkyMA0KDQovKg0KICogY2FycF9wcml2LT5mbGFncyBkZWZpbml0aW9ucy4NCiAqLw0K I2RlZmluZSBDQVJQX0RBVEFfQVZBSUwJCSgxPDwwKQ0KDQpzdHJ1Y3QgY2FycF9oZWFkZXIgDQp7 DQojaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpDQoJdTgJY2FycF90eXBlOjQs DQoJCWNhcnBfdmVyc2lvbjo0Ow0KI2VsaWYgZGVmaW5lZCAoX19CSUdfRU5ESUFOX0JJVEZJRUxE KQ0KCXU4CWNhcnBfdmVyc2lvbjo0LA0KCQljYXJwX3R5cGU6NDsNCiNlbHNlDQojZXJyb3IJIlBs ZWFzZSBmaXggPGFzbS9ieXRlb3JkZXIuaD4iDQojZW5kaWYNCgl1OAljYXJwX3ZoaWQ7DQoJdTgJ Y2FycF9hZHZza2V3Ow0KCXU4CWNhcnBfYXV0aGxlbjsNCgl1OAljYXJwX3BhZDE7DQoJdTgJY2Fy cF9hZHZiYXNlOwkNCgl1MTYJY2FycF9ja3N1bTsNCgl1MzIJY2FycF9jb3VudGVyWzJdOw0KCXU4 CWNhcnBfbWRbQ0FSUF9TSUdfTEVOXTsNCn07DQoNCnN0cnVjdCBjYXJwX3N0YXQNCnsNCgl1MzIJ Y3JjX2Vycm9yczsNCgl1MzIJdmVyX2Vycm9yczsNCgl1MzIJdmhpZF9lcnJvcnM7DQoJdTMyCWht YWNfZXJyb3JzOw0KCXUzMgljb3VudGVyX2Vycm9yczsNCg0KCXUzMgltZW1fZXJyb3JzOw0KCXUz Mgl4bWl0X2Vycm9yczsNCg0KCXUzMglieXRlc19zZW50Ow0KfTsNCg0Kc3RydWN0IGNhcnBfcHJp dg0Kew0KCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCXN0YXQ7DQoJc3RydWN0IG5ldF9kZXZpY2UJ KmRldiwgKm9kZXY7DQoJY2hhciAJCQluYW1lW0lGTkFNU0laXTsNCg0KCWludAkJCWxpbmssIG1s aW5rOw0KCXN0cnVjdCBpcGhkcgkJaXBoOw0KDQoJdTMyCQkJbWRfdGltZW91dCwgYWR2X3RpbWVv dXQ7DQoJc3RydWN0IHRpbWVyX2xpc3QJbWRfdGltZXIsIGFkdl90aW1lcjsNCg0KCWVudW0gY2Fy cF9zdGF0ZQkJc3RhdGU7DQoJc3RydWN0IGNhcnBfaGVhZGVyIAloZHI7DQoJc3RydWN0IGNhcnBf c3RhdAljc3RhdDsNCg0KCXU4CQkJY2FycF9rZXlbQ0FSUF9LRVlfTEVOXTsNCgl1OAkJCWNhcnBf cGFkW0NBUlBfSE1BQ19QQURfTEVOXTsNCglzdHJ1Y3QgY3J5cHRvX3RmbSAJKnRmbTsNCg0KCXU2 NAkJCWNhcnBfYWR2X2NvdW50ZXI7DQoNCglzcGlubG9ja190CQlsb2NrOw0KDQoJdTMyCQkJZmxh Z3M7DQoJdW5zaWduZWQgc2hvcnQJCW9mbGFnczsNCn07DQoNCiNlbmRpZiAvKiBfX0NBUlBfSCAq Lw0K --=-zMMMLADPc6OCZZ3l3ocw Content-Disposition: attachment; filename=carp_ioctl.h Content-Type: text/x-chdr; name=carp_ioctl.h; charset=koi8-r Content-Transfer-Encoding: base64 LyoNCiAqIAljYXJwX2lvY3RsLmgNCiAqIA0KICogMjAwNCBDb3B5cmlnaHQgKGMpIEV2Z2VuaXkg UG9seWFrb3YgPGpvaG5wb2xAMmthLm1pcHQucnU+DQogKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0K ICogDQogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1 dGUgaXQgYW5kL29yIG1vZGlmeQ0KICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2Vu ZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCiAqIHRoZSBGcmVlIFNvZnR3YXJl IEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yDQogKiAoYXQg eW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KICoNCiAqIFRoaXMgcHJvZ3JhbSBpcyBk aXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KICogYnV0IFdJ VEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YN CiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g IFNlZSB0aGUNCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMu DQogKg0KICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVy YWwgUHVibGljIExpY2Vuc2UNCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdy aXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUg UGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBDQogKg0KICovDQoN CiNpZm5kZWYgX19DQVJQX0lPQ1RMX0gNCiNkZWZpbmUgX19DQVJQX0lPQ1RMX0gNCg0KI2luY2x1 ZGUgPGxpbnV4L3NvY2tpb3MuaD4NCg0KI2RlZmluZQlDQVJQX0tFWV9MRU4JCTIwDQojZGVmaW5l CUNBUlBfSE1BQ19QQURfTEVOCTY0DQoNCiNkZWZpbmUgTUFYX01EX1RJTUVPVVQJCTUNCiNkZWZp bmUgTUFYX0FEVl9USU1FT1VUCQk1DQoNCmVudW0gY2FycF9zdGF0ZSB7SU5JVCA9IDAsIE1BU1RF UiwgQkFDS1VQfTsNCg0KZW51bSBjYXJwX2lvY3RscyANCnsNCglTSU9DX1NFVENBUlBQQVJBTVMg PSBTSU9DREVWUFJJVkFURSwNCglTSU9DX0dFVENBUlBQQVJBTVMsDQp9Ow0KDQpzdHJ1Y3QgY2Fy cF9pb2N0bF9wYXJhbXMNCnsNCglfX3U4CQljYXJwX2FkdnNrZXc7DQoJX191OAkJY2FycF9hZHZi YXNlOw0KCV9fdTgJCWNhcnBfdmhpZDsNCglfX3U4IAkJY2FycF9rZXlbQ0FSUF9LRVlfTEVOXTsN CglfX3U4IAkJY2FycF9wYWRbQ0FSUF9ITUFDX1BBRF9MRU5dOw0KCWVudW0gY2FycF9zdGF0ZQlz dGF0ZTsNCgljaGFyIAkJZGV2bmFtZVtJRk5BTVNJWl07DQoJX191MzIJCW1kX3RpbWVvdXQ7DQoJ X191MzIJCWFkdl90aW1lb3V0Ow0KCQ0KfTsNCg0KI2VuZGlmIC8qIF9fQ0FSUF9JT0NUTF9IICov DQo= --=-zMMMLADPc6OCZZ3l3ocw-- --=-aENk32xTOCLiPN2oivF9 Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQBA9ohjIKTPhE+8wY0RAqmCAJ4ipYTj3GiAqvn5Wj/pfJ9e0vSvCgCdGh6Q g5OjGinV7NyeHolfgV7lVmY= =jZay -----END PGP SIGNATURE----- --=-aENk32xTOCLiPN2oivF9--