From owner-freebsd-wireless@FreeBSD.ORG Mon May 2 09:01:12 2011 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 8E772106566C for ; Mon, 2 May 2011 09:01:12 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: from mail-vw0-f54.google.com (mail-vw0-f54.google.com [209.85.212.54]) by mx1.freebsd.org (Postfix) with ESMTP id 427458FC12 for ; Mon, 2 May 2011 09:01:11 +0000 (UTC) Received: by vws18 with SMTP id 18so5410720vws.13 for ; Mon, 02 May 2011 02:01:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:sender:in-reply-to:references:date :x-google-sender-auth:message-id:subject:from:to:content-type; bh=QUm4nnprC5MSrIzpc4SOG6Fyg9E23WBJdUBncCeTJy4=; b=BuxXtCNVm4Pta1eLMkUR8hWRIJGtDoYtehJUFIpE2cdTf7F6CaLD0DhXuNyN2Vk3HQ duNaTcSqcYkfzbylK2b68RPSzpmTcUt/n0Nc8L0ju7Af+EUmGc1zgr+uTm3x91o0sQ6s VEVz74IIgB8j3l4yQSQqz8JncziGQuPi87Qzs= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:sender:in-reply-to:references:date :x-google-sender-auth:message-id:subject:from:to:content-type; b=CrjE1zyu8/2AIxtyFLqmtBmIPh+gXurG0zoSQMfIZjvJ6w5Iob9Zdkmpg8dtSb502q zzJjVDCVwXlgMdZFDgBXmWk8f1/0kouMqJ0L6KwrSkexlsAPkh4gphu24d7ESGj0oN6Y uFctQbG0uQ5ugP/JxO2QSs/JUWHgKMWnjaGMk= MIME-Version: 1.0 Received: by 10.52.96.8 with SMTP id do8mr4440580vdb.142.1304326871336; Mon, 02 May 2011 02:01:11 -0700 (PDT) Sender: adrian.chadd@gmail.com Received: by 10.52.157.202 with HTTP; Mon, 2 May 2011 02:01:11 -0700 (PDT) In-Reply-To: References: Date: Mon, 2 May 2011 17:01:11 +0800 X-Google-Sender-Auth: teTy8Kph_vkBRqWMznx-0v60iF8 Message-ID: From: Adrian Chadd To: freebsd-wireless@freebsd.org Content-Type: multipart/mixed; boundary=20cf307d064cd6489e04a247433f Subject: Re: [net80211] patch: properly handle sequence checking for HT non-aggregation; refactor out shared code X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Discussions of 802.11 stack, tools device driver development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 02 May 2011 09:01:12 -0000 --20cf307d064cd6489e04a247433f Content-Type: text/plain; charset=ISO-8859-1 Hi, Here's an updated diff. I noticed that with this diff, the number of TCP out of order complaints dropped dramatically but I was seeing them when the following occured: wlan0: [00:23:6c:bf:38:3e] discard duplicate frame, seqno <0,4095> fragno <0,0> tid 0 This is likely also occuring with non-HT (11a/11bg) QoS operation chips in -HEAD and -8. Whenever I saw that above being logged (among lots of other logged duplicate discards, so I know it wasn't just "serial IO" related) I saw a burst of out-of-order packets/bytes in the receiving side TCP stack and a drop in throughput. The current patch adds the following checks: * if the last seen seqnum is 4095, then retransmissions of the last seen fragment is eliminated (like the normal codepath intended to do but didn't); * else if the last seen seqnum is 4095, allow any subsequent packet. This may be wrong for fragments (and I may add a check for rxseq != 4095)) but any subsequent sequence will have a seqnum of < 4095 because of the 12 bit seqnum wrap. * else (ie, the last seen seqnum isn't 4095), eliminate retransmits for seq+frag <= last seen. This almost entirely eliminates the speed drops I've seen in 11n non-aggregation mode and almost entirely eliminates the burst of out-of-order packets/bytes. The only time I'm seeing them now is when the baseband hangs and the interface is reset. Adrian --20cf307d064cd6489e04a247433f Content-Type: application/octet-stream; name="net80211-rxseq-ht-2.diff" Content-Disposition: attachment; filename="net80211-rxseq-ht-2.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gn76j6jz1 SW5kZXg6IHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFfc3RhLmMKPT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL25l dDgwMjExL2llZWU4MDIxMV9zdGEuYwkocmV2aXNpb24gMjIwOTExKQorKysgc3lzL25ldDgwMjEx L2llZWU4MDIxMV9zdGEuYwkod29ya2luZyBjb3B5KQpAQCAtNTEyLDcgKzUxMiw2IEBACiBzdGF0 aWMgaW50CiBzdGFfaW5wdXQoc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSwgc3RydWN0IG1idWYg Km0sIGludCByc3NpLCBpbnQgbmYpCiB7Ci0jZGVmaW5lCVNFUV9MRVEoYSxiKQkoKGludCkoKGEp LShiKSkgPD0gMCkKICNkZWZpbmUJSEFTX1NFUSh0eXBlKQkoKHR5cGUgJiAweDQpID09IDApCiAJ c3RydWN0IGllZWU4MDIxMXZhcCAqdmFwID0gbmktPm5pX3ZhcDsKIAlzdHJ1Y3QgaWVlZTgwMjEx Y29tICppYyA9IG5pLT5uaV9pYzsKQEAgLTU5MSw5ICs1OTAsNyBAQAogCQkJICAgIFRJRF9UT19X TUVfQUModGlkKSA+PSBXTUVfQUNfVkkpCiAJCQkJaWMtPmljX3dtZS53bWVfaGlwcmlfdHJhZmZp YysrOwogCQkJcnhzZXEgPSBsZTE2dG9oKCoodWludDE2X3QgKil3aC0+aV9zZXEpOwotCQkJaWYg KChuaS0+bmlfZmxhZ3MgJiBJRUVFODAyMTFfTk9ERV9IVCkgPT0gMCAmJgotCQkJICAgICh3aC0+ aV9mY1sxXSAmIElFRUU4MDIxMV9GQzFfUkVUUlkpICYmCi0JCQkgICAgU0VRX0xFUShyeHNlcSwg bmktPm5pX3J4c2Vxc1t0aWRdKSkgeworCQkJaWYgKCEgaWVlZTgwMjExX2NoZWNrX3J4c2VxKG5p LCB3aCkpIHsKIAkJCQkvKiBkdXBsaWNhdGUsIGRpc2NhcmQgKi8KIAkJCQlJRUVFODAyMTFfRElT Q0FSRF9NQUModmFwLCBJRUVFODAyMTFfTVNHX0lOUFVULAogCQkJCSAgICBic3NpZCwgImR1cGxp Y2F0ZSIsCkBAIC05MTAsNyArOTA3LDYgQEAKIAkJbV9mcmVlbShtKTsKIAl9CiAJcmV0dXJuIHR5 cGU7Ci0jdW5kZWYgU0VRX0xFUQogfQogCiBzdGF0aWMgdm9pZApJbmRleDogc3lzL25ldDgwMjEx L2llZWU4MDIxMV93ZHMuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvbmV0ODAyMTEvaWVlZTgwMjExX3dk cy5jCShyZXZpc2lvbiAyMjA5MTEpCisrKyBzeXMvbmV0ODAyMTEvaWVlZTgwMjExX3dkcy5jCSh3 b3JraW5nIGNvcHkpCkBAIC00MDYsNyArNDA2LDYgQEAKIHN0YXRpYyBpbnQKIHdkc19pbnB1dChz dHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pLCBzdHJ1Y3QgbWJ1ZiAqbSwgaW50IHJzc2ksIGludCBu ZikKIHsKLSNkZWZpbmUJU0VRX0xFUShhLGIpCSgoaW50KSgoYSktKGIpKSA8PSAwKQogI2RlZmlu ZQlIQVNfU0VRKHR5cGUpCSgodHlwZSAmIDB4NCkgPT0gMCkKIAlzdHJ1Y3QgaWVlZTgwMjExdmFw ICp2YXAgPSBuaS0+bmlfdmFwOwogCXN0cnVjdCBpZWVlODAyMTFjb20gKmljID0gbmktPm5pX2lj OwpAQCAtNDk1LDkgKzQ5NCw3IEBACiAJCSAgICBUSURfVE9fV01FX0FDKHRpZCkgPj0gV01FX0FD X1ZJKQogCQkJaWMtPmljX3dtZS53bWVfaGlwcmlfdHJhZmZpYysrOwogCQlyeHNlcSA9IGxlMTZ0 b2goKih1aW50MTZfdCAqKXdoLT5pX3NlcSk7Ci0JCWlmICgobmktPm5pX2ZsYWdzICYgSUVFRTgw MjExX05PREVfSFQpID09IDAgJiYKLQkJICAgICh3aC0+aV9mY1sxXSAmIElFRUU4MDIxMV9GQzFf UkVUUlkpICYmCi0JCSAgICBTRVFfTEVRKHJ4c2VxLCBuaS0+bmlfcnhzZXFzW3RpZF0pKSB7CisJ CWlmICghIGllZWU4MDIxMV9jaGVja19yeHNlcShuaSwgd2gpKSB7CiAJCQkvKiBkdXBsaWNhdGUs IGRpc2NhcmQgKi8KIAkJCUlFRUU4MDIxMV9ESVNDQVJEX01BQyh2YXAsIElFRUU4MDIxMV9NU0df SU5QVVQsCiAJCQkgICAgd2gtPmlfYWRkcjEsICJkdXBsaWNhdGUiLApAQCAtNzQxLDcgKzczOCw2 IEBACiAJCW1fZnJlZW0obSk7CiAJfQogCXJldHVybiB0eXBlOwotI3VuZGVmIFNFUV9MRVEKIH0K IAogc3RhdGljIHZvaWQKSW5kZXg6IHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFfaG9zdGFwLmMKPT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PQotLS0gc3lzL25ldDgwMjExL2llZWU4MDIxMV9ob3N0YXAuYwkocmV2aXNpb24gMjIw OTExKQorKysgc3lzL25ldDgwMjExL2llZWU4MDIxMV9ob3N0YXAuYwkod29ya2luZyBjb3B5KQpA QCAtNDcyLDcgKzQ3Miw2IEBACiBzdGF0aWMgaW50CiBob3N0YXBfaW5wdXQoc3RydWN0IGllZWU4 MDIxMV9ub2RlICpuaSwgc3RydWN0IG1idWYgKm0sIGludCByc3NpLCBpbnQgbmYpCiB7Ci0jZGVm aW5lCVNFUV9MRVEoYSxiKQkoKGludCkoKGEpLShiKSkgPD0gMCkKICNkZWZpbmUJSEFTX1NFUSh0 eXBlKQkoKHR5cGUgJiAweDQpID09IDApCiAJc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwID0gbmkt Pm5pX3ZhcDsKIAlzdHJ1Y3QgaWVlZTgwMjExY29tICppYyA9IG5pLT5uaV9pYzsKQEAgLTU3Miw5 ICs1NzEsNyBAQAogCQkJICAgIFRJRF9UT19XTUVfQUModGlkKSA+PSBXTUVfQUNfVkkpCiAJCQkJ aWMtPmljX3dtZS53bWVfaGlwcmlfdHJhZmZpYysrOwogCQkJcnhzZXEgPSBsZTE2dG9oKCoodWlu dDE2X3QgKil3aC0+aV9zZXEpOwotCQkJaWYgKChuaS0+bmlfZmxhZ3MgJiBJRUVFODAyMTFfTk9E RV9IVCkgPT0gMCAmJgotCQkJICAgICh3aC0+aV9mY1sxXSAmIElFRUU4MDIxMV9GQzFfUkVUUlkp ICYmCi0JCQkgICAgU0VRX0xFUShyeHNlcSwgbmktPm5pX3J4c2Vxc1t0aWRdKSkgeworCQkJaWYg KCEgaWVlZTgwMjExX2NoZWNrX3J4c2VxKG5pLCB3aCkpIHsKIAkJCQkvKiBkdXBsaWNhdGUsIGRp c2NhcmQgKi8KIAkJCQlJRUVFODAyMTFfRElTQ0FSRF9NQUModmFwLCBJRUVFODAyMTFfTVNHX0lO UFVULAogCQkJCSAgICBic3NpZCwgImR1cGxpY2F0ZSIsCkBAIC05MTQsNyArOTExLDYgQEAKIAkJ bV9mcmVlbShtKTsKIAl9CiAJcmV0dXJuIHR5cGU7Ci0jdW5kZWYgU0VRX0xFUQogfQogCiBzdGF0 aWMgdm9pZApJbmRleDogc3lzL25ldDgwMjExL2llZWU4MDIxMV9tZXNoLmMKPT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot LS0gc3lzL25ldDgwMjExL2llZWU4MDIxMV9tZXNoLmMJKHJldmlzaW9uIDIyMDkxMSkKKysrIHN5 cy9uZXQ4MDIxMS9pZWVlODAyMTFfbWVzaC5jCSh3b3JraW5nIGNvcHkpCkBAIC0xMDQwLDcgKzEw NDAsNiBAQAogc3RhdGljIGludAogbWVzaF9pbnB1dChzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5p LCBzdHJ1Y3QgbWJ1ZiAqbSwgaW50IHJzc2ksIGludCBuZikKIHsKLSNkZWZpbmUJU0VRX0xFUShh LGIpCSgoaW50KSgoYSktKGIpKSA8PSAwKQogI2RlZmluZQlIQVNfU0VRKHR5cGUpCSgodHlwZSAm IDB4NCkgPT0gMCkKIAlzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAgPSBuaS0+bmlfdmFwOwogCXN0 cnVjdCBpZWVlODAyMTFjb20gKmljID0gbmktPm5pX2ljOwpAQCAtMTA5NCw5ICsxMDkzLDcgQEAK IAkJCSAgICBUSURfVE9fV01FX0FDKHRpZCkgPj0gV01FX0FDX1ZJKQogCQkJCWljLT5pY193bWUu d21lX2hpcHJpX3RyYWZmaWMrKzsKIAkJCXJ4c2VxID0gbGUxNnRvaCgqKHVpbnQxNl90ICopd2gt Pmlfc2VxKTsKLQkJCWlmICgobmktPm5pX2ZsYWdzICYgSUVFRTgwMjExX05PREVfSFQpID09IDAg JiYKLQkJCSAgICAod2gtPmlfZmNbMV0gJiBJRUVFODAyMTFfRkMxX1JFVFJZKSAmJgotCQkJICAg IFNFUV9MRVEocnhzZXEsIG5pLT5uaV9yeHNlcXNbdGlkXSkpIHsKKwkJCWlmICghIGllZWU4MDIx MV9jaGVja19yeHNlcShuaSwgd2gpKSB7CiAJCQkJLyogZHVwbGljYXRlLCBkaXNjYXJkICovCiAJ CQkJSUVFRTgwMjExX0RJU0NBUkRfTUFDKHZhcCwgSUVFRTgwMjExX01TR19JTlBVVCwKIAkJCQkg ICAgd2gtPmlfYWRkcjEsICJkdXBsaWNhdGUiLApJbmRleDogc3lzL25ldDgwMjExL2llZWU4MDIx MV9pbnB1dC5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT0KLS0tIHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFfaW5wdXQuYwko cmV2aXNpb24gMjIwOTExKQorKysgc3lzL25ldDgwMjExL2llZWU4MDIxMV9pbnB1dC5jCSh3b3Jr aW5nIGNvcHkpCkBAIC03NjAsNiArNzYwLDkwIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBD aGVjayB0aGUgY3VycmVudCBmcmFtZSBzZXF1ZW5jZSBudW1iZXIgYWdhaW5zdCB0aGUgY3VycmVu dCBUSUQKKyAqIHN0YXRlIGFuZCByZXR1cm4gd2hldGhlciBpdCdzIGluIHNlcXVlbmNlIG9yIHNo b3VsZCBiZSBkcm9wcGVkLgorICovCitpbnQKK2llZWU4MDIxMV9jaGVja19yeHNlcShzdHJ1Y3Qg aWVlZTgwMjExX25vZGUgKm5pLCBzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICp3aCkKK3sKKyNkZWZp bmUJU0VRX0xFUShhLGIpCSgoaW50KSgoYSktKGIpKSA8PSAwKQorI2RlZmluZQlTRVFfRVEoYSxi KQkoKGludCkoKGEpLShiKSkgPT0gMCkKKyNkZWZpbmUJSEFTX1NFUSh0eXBlKQkoKHR5cGUgJiAw eDQpID09IDApCisjZGVmaW5lCVNFUU5PKGEpCSgoYSkgPj4gSUVFRTgwMjExX1NFUV9TRVFfU0hJ RlQpCisjZGVmaW5lCUZSQUdOTyhhKQkoKGEpICYgSUVFRTgwMjExX1NFUV9GUkFHX01BU0spCisJ dWludDE2X3QgcnhzZXE7CisJdWludDhfdCB0eXBlOworCXVpbnQ4X3QgdGlkOworCXN0cnVjdCBp ZWVlODAyMTFfcnhfYW1wZHUgKnJhcDsKKworCXJ4c2VxID0gbGUxNnRvaCgqKHVpbnQxNl90ICop d2gtPmlfc2VxKTsKKwl0eXBlID0gd2gtPmlfZmNbMF0gJiBJRUVFODAyMTFfRkMwX1RZUEVfTUFT SzsKKworCS8qIFR5cGVzIHdpdGggbm8gc2VxdWVuY2UgbnVtYmVyIGFyZSBhbHdheXMgdHJlYXRl ZCB2YWxpZCAqLworCWlmICghIEhBU19TRVEodHlwZSkpCisJCXJldHVybiAxOworCisJdGlkID0g aWVlZTgwMjExX2dldHRpZCh3aCk7CisKKwkvKgorCSAqIE9ubHkgZG8gdGhlIEhUIEFNUERVIGNo ZWNrIGZvciBXTUUgc3RhdGlvbnM7IG5vbi1XTUUgSFQgc3RhdGlvbnMKKwkgKiBzaG91bGRuJ3Qg ZXhpc3Qgb3V0c2lkZSBvZiBkZWJ1Z2dpbmcuIFdlIHNob3VsZCBhdCBsZWFzdAorCSAqIGhhbmRs ZSB0aGF0LgorCSAqLworCWlmICh0aWQgPCBXTUVfTlVNX1RJRCkgeworCQlyYXAgPSAmbmktPm5p X3J4X2FtcGR1W3RpZF07CisJCS8qIEhUIG5vZGVzIGN1cnJlbnRseSBkb2luZyBSWCBBTVBEVSBh cmUgYWx3YXlzIHZhbGlkICovCisJCWlmICgobmktPm5pX2ZsYWdzICYgSUVFRTgwMjExX05PREVf SFQpICYmCisJCSAgICAocmFwLT5yeGFfZmxhZ3MgJiBJRUVFODAyMTFfQUdHUl9SVU5OSU5HKSkK KwkJCXJldHVybiAxOworCX0KKworCS8qCQorCSAqIE90aGVyd2lzZSwgcmV0cmllcyBmb3IgcGFj a2V0cyBiZWxvdyBvciBlcXVhbCB0byB0aGUgbGFzdAorCSAqIHNlZW4gc2VxdWVuY2UgbnVtYmVy IHNob3VsZCBiZSBkcm9wcGVkLgorCSAqCisJICogWFhYIFRoaXMgc2hvdWxkIGJlIHJldmlzaXRl ZCB0byB0cnVlbHkgaWRlbnRpZnkvbG9nIHZlcnkKKwkgKiBYWFggb3V0IG9mIG9yZGVyIHBhY2tl dHMgKGR1ZSB0byB2ZW5kb3IgYnVncyksIHJhdGhlciB0aGFuCisJICogWFhYIHNpbXBseSByZXRy YW5zbWl0cy4KKwkgKi8KKworCS8qIEZvciBub3csIHRyZWF0IGZyYW1lIHNlcW51bSA0MDk1IGFz IHNwZWNpYWwuICovCisKKwkvKgorCSAqIERyb3AgcmV0cmFuc21pdHMgb24gc2VxbnVtIDQwOTUg Zm9yIGl0c2VsZi4KKwkgKi8KKwlpZiAoKFNFUU5PKG5pLT5uaV9yeHNlcXNbdGlkXSkgPT0gNDA5 NSkgJiYKKwkgICAgU0VRX0VRKHJ4c2VxLCBuaS0+bmlfcnhzZXFzW3RpZF0pICYmCisJICAgICh3 aC0+aV9mY1sxXSAmIElFRUU4MDIxMV9GQzFfUkVUUlkpKQorCQlyZXR1cm4gMDsKKworCS8qCisJ ICogVHJlYXQgYW55IHN1YnNlcXVlbnQgZnJhbWUgYXMgZmluZSBpZiB0aGUgbGFzdCBzZWVuIGZy YW1lCisJICogaXMgNDA5NSBhbmQgaXQncyBub3QgYSByZXRyYW5zbWl0IGZvciB0aGUgc2FtZSBz ZXF1ZW5jZQorCSAqIG51bWJlci4KKwkgKi8KKwlpZiAoU0VRTk8obmktPm5pX3J4c2Vxc1t0aWRd KSA9PSA0MDk1KQorCQlyZXR1cm4gMTsKKworCS8qCisJICogQXQgdGhpcyBwb2ludCB3ZSBhc3N1 bWUgdGhhdCBzZXFudW1zIGJlbG93CisJICogdGhlIGN1cnJlbnQgYXJlIHJldHJhbnNtaXRzL291 dCBvZiBvcmRlciBwYWNrZXRzLgorCSAqIEVsaW1pbmF0ZSByZXRyYW5zbWl0cyBmb3IgdGhvc2Uu CisJICovCisJaWYgKCh3aC0+aV9mY1sxXSAmIElFRUU4MDIxMV9GQzFfUkVUUlkpICYmCisJICAg IFNFUV9MRVEocnhzZXEsIG5pLT5uaV9yeHNlcXNbdGlkXSkpCisJCXJldHVybiAwOworCisJcmV0 dXJuIDE7CisjdW5kZWYJU0VRX0xFUQorI3VuZGVmCVNFUV9FUQorI3VuZGVmCUhBU19TRVEKKyN1 bmRlZglTRVFOTworI3VuZGVmCUZSQUdOTworCit9CisKICNpZmRlZiBJRUVFODAyMTFfREVCVUcK IC8qCiAgKiBEZWJ1Z2dpbmcgc3VwcG9ydC4KSW5kZXg6IHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFf aW5wdXQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvbmV0ODAyMTEvaWVlZTgwMjExX2lucHV0LmgJKHJl dmlzaW9uIDIyMDkxMSkKKysrIHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFfaW5wdXQuaAkod29ya2lu ZyBjb3B5KQpAQCAtMTU3LDQgKzE1Nyw2IEBACiBpbnQJaWVlZTgwMjExX3BhcnNlX2JlYWNvbihz dHJ1Y3QgaWVlZTgwMjExX25vZGUgKiwgc3RydWN0IG1idWYgKiwKIAkJc3RydWN0IGllZWU4MDIx MV9zY2FucGFyYW1zICopOwogaW50CWllZWU4MDIxMV9wYXJzZV9hY3Rpb24oc3RydWN0IGllZWU4 MDIxMV9ub2RlICosIHN0cnVjdCBtYnVmICopOworaW50CWllZWU4MDIxMV9jaGVja19yeHNlcShz dHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pLAorCQlzdHJ1Y3QgaWVlZTgwMjExX2ZyYW1lICp3aCk7 CiAjZW5kaWYgLyogX05FVDgwMjExX0lFRUU4MDIxMV9JTlBVVF9IXyAqLwpJbmRleDogc3lzL25l dDgwMjExL2llZWU4MDIxMV9hZGhvYy5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHN5cy9uZXQ4MDIxMS9pZWVl ODAyMTFfYWRob2MuYwkocmV2aXNpb24gMjIwOTExKQorKysgc3lzL25ldDgwMjExL2llZWU4MDIx MV9hZGhvYy5jCSh3b3JraW5nIGNvcHkpCkBAIC0yODUsNyArMjg1LDYgQEAKIHN0YXRpYyBpbnQK IGFkaG9jX2lucHV0KHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmksIHN0cnVjdCBtYnVmICptLCBp bnQgcnNzaSwgaW50IG5mKQogewotI2RlZmluZQlTRVFfTEVRKGEsYikJKChpbnQpKChhKS0oYikp IDw9IDApCiAjZGVmaW5lCUhBU19TRVEodHlwZSkJKCh0eXBlICYgMHg0KSA9PSAwKQogCXN0cnVj dCBpZWVlODAyMTF2YXAgKnZhcCA9IG5pLT5uaV92YXA7CiAJc3RydWN0IGllZWU4MDIxMWNvbSAq aWMgPSBuaS0+bmlfaWM7CkBAIC00MTIsOSArNDExLDcgQEAKIAkJCSAgICBUSURfVE9fV01FX0FD KHRpZCkgPj0gV01FX0FDX1ZJKQogCQkJCWljLT5pY193bWUud21lX2hpcHJpX3RyYWZmaWMrKzsK IAkJCXJ4c2VxID0gbGUxNnRvaCgqKHVpbnQxNl90ICopd2gtPmlfc2VxKTsKLQkJCWlmICgobmkt Pm5pX2ZsYWdzICYgSUVFRTgwMjExX05PREVfSFQpID09IDAgJiYKLQkJCSAgICAod2gtPmlfZmNb MV0gJiBJRUVFODAyMTFfRkMxX1JFVFJZKSAmJgotCQkJICAgIFNFUV9MRVEocnhzZXEsIG5pLT5u aV9yeHNlcXNbdGlkXSkpIHsKKwkJCWlmICghIGllZWU4MDIxMV9jaGVja19yeHNlcShuaSwgd2gp KSB7CiAJCQkJLyogZHVwbGljYXRlLCBkaXNjYXJkICovCiAJCQkJSUVFRTgwMjExX0RJU0NBUkRf TUFDKHZhcCwgSUVFRTgwMjExX01TR19JTlBVVCwKIAkJCQkgICAgYnNzaWQsICJkdXBsaWNhdGUi LApAQCAtNjYwLDcgKzY1Nyw2IEBACiAJCW1fZnJlZW0obSk7CiAJfQogCXJldHVybiB0eXBlOwot I3VuZGVmIFNFUV9MRVEKIH0KIAogc3RhdGljIGludAo= --20cf307d064cd6489e04a247433f--