From owner-freebsd-wireless@FreeBSD.ORG Mon Jul 22 03:28:33 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 640D1512; Mon, 22 Jul 2013 03:28:33 +0000 (UTC) (envelope-from qinchenchong@gmail.com) Received: from mail-vb0-x229.google.com (mail-vb0-x229.google.com [IPv6:2607:f8b0:400c:c02::229]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 12E9F1FED; Mon, 22 Jul 2013 03:28:33 +0000 (UTC) Received: by mail-vb0-f41.google.com with SMTP id p13so4478071vbe.28 for ; Sun, 21 Jul 2013 20:28:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:cc:content-type; bh=RqdplzBAoEqy9Ghv/rgSNhh46OICEw1lR+iM/+01mLg=; b=0r0aa494pl/brypC897PsaZ2GoR34q6DEsqSS4E6EvJnxVAyB2xbFwniJSDNkNHv2v ZasYk4K3/DDTdvDaSexz5tNKrlA98IQx2Ksxpj7jrj1388xwG7MYtbV6SIu16bSe+slW c9+btT7oAh1y8mSvAyoOYKm+uVEec1qXU7HI+WAFVUeV/xN0Rpyf+KwrQ+8HUAUixZfa G5s/BcggmnwBYLLyezmiV0LbTDgu9DtnfqBN2tH/Lfbm0SK+uvFaSgwNi4ArRMMzYhpt uUDfhEAGfPqS9xDVxmEj+J6Spsx3/tCgYGlmxMFMHtWrko3GxlLt6ZJ0Sg0/ZgSKOaLF ufeQ== MIME-Version: 1.0 X-Received: by 10.58.223.238 with SMTP id qx14mr8558567vec.98.1374463712142; Sun, 21 Jul 2013 20:28:32 -0700 (PDT) Received: by 10.221.1.73 with HTTP; Sun, 21 Jul 2013 20:28:31 -0700 (PDT) Date: Mon, 22 Jul 2013 11:28:31 +0800 Message-ID: Subject: Chenchong's work on net80211_ratectl From: Chenchong Qin To: freebsd-wireless@freebsd.org Content-Type: multipart/mixed; boundary=089e013d06fa51aaaf04e2114524 X-Content-Filtered-By: Mailman/MimeDel 2.1.14 X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 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, 22 Jul 2013 03:28:33 -0000 --089e013d06fa51aaaf04e2114524 Content-Type: text/plain; charset=ISO-8859-1 Hi, there! Attachment is the diff that contains my work on net80211_ratectl done these days. I've done the fllowing things: 1) Add some rc options. Chip can tell some options (i.e. whether mrr and mrrprot is support, whether have more than 1 txchain, etc.) to rc code when rc is initializing. Then rc algo can calc rates with these options in mind and do the right things. 2) Support multi-rate attempt. Instead of returning just one rate, let rc return up to 4 rates. I add ieee80211_rc_series. Basically, it's just a copy of ath_rc_series but drop max4msframelen filed (it seems that max4msframelen is not used to setup the rc stuffs). And at each rate lookup, rc can get shortPreamble and frameLen info from the caller. 3) Support some 11n features. Add some 11n features (i.e. cw40, short-gi, stbc) to net80211 rc stuffs. To be frankly, I just let the rc algo decide whether to use the 11n features. But I do provide rc algo with some abilities to know whether particular feature can be used. Then, rc algo can do rate decisions based on these cap info. Besides, I use iv_htcaps other than ic_htcaps to decide the 11n features capabilities. I think iv_htcaps is more relevant to per vap rc operations and I found iv_htcaps is just a copy of ic_htcaps at first (but some caps may to be disabled by some vaps). But I'm not sure whether this can operate properly by now. Once the rc algo decides to use one 11n feature for some rate attemps, it must set corresponding rate flags. This is not the same as before. For now, the rc algo get more power and then it comes more responsibility. 4) Complete the rc flags After the rate lookup, we have an opportunity to make sure that rc code doesn't mess it up. I blank tries 1, 2, 3 if rts/cts is enabled and it's a pre-802.11n scenario. It's also the chance to fill some rate options/flags that the rc algo may not be interested by now. Looking forward to your feedbacks! Thanks! Chenchong --089e013d06fa51aaaf04e2114524 Content-Type: application/octet-stream; name="20130722-net80211-ratectl.diff" Content-Disposition: attachment; filename="20130722-net80211-ratectl.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hjf44d6x0 SW5kZXg6IG5ldDgwMjExL2llZWU4MDIxMV9yYXRlY3RsLmMKPT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gbmV0ODAy MTEvaWVlZTgwMjExX3JhdGVjdGwuYwkocmV2aXNpb24gMjU0ODI2KQorKysgbmV0ODAyMTEvaWVl ZTgwMjExX3JhdGVjdGwuYwkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDYgQEAKIC8qLQogICog Q29weXJpZ2h0IChjKSAyMDEwIFJ1aSBQYXVsbyA8cnBhdWxvQEZyZWVCU0Qub3JnPgorICogQ29w eXJpZ2h0IChjKSAyMDEzIENoZW5jaG9uZyBRaW4gPGNjcWluQEZyZWVCU0Qub3JnPgogICogQWxs IHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTY2LDEwICs2NywxMSBAQAog fQogCiB2b2lkCi1pZWVlODAyMTFfcmF0ZWN0bF9pbml0KHN0cnVjdCBpZWVlODAyMTF2YXAgKnZh cCkKK2llZWU4MDIxMV9yYXRlY3RsX2luaXQoc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwLCB1aW50 MzJfdCBvcHRpb25zKQogewogCWlmICh2YXAtPml2X3JhdGUgPT0gcmF0ZWN0bHNbSUVFRTgwMjEx X1JBVEVDVExfTk9ORV0pCiAJCWllZWU4MDIxMV9yYXRlY3RsX3NldCh2YXAsIElFRUU4MDIxMV9S QVRFQ1RMX0FNUlIpOworCXZhcC0+aXZfcmF0ZS5vcHRpb25zID0gb3B0aW9uczsKIAl2YXAtPml2 X3JhdGUtPmlyX2luaXQodmFwKTsKIH0KIApJbmRleDogbmV0ODAyMTEvaWVlZTgwMjExX3JhdGVj dGwuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09Ci0tLSBuZXQ4MDIxMS9pZWVlODAyMTFfcmF0ZWN0bC5oCShyZXZpc2lv biAyNTQ4MjYpCisrKyBuZXQ4MDIxMS9pZWVlODAyMTFfcmF0ZWN0bC5oCSh3b3JraW5nIGNvcHkp CkBAIC0xLDUgKzEsNiBAQAogLyotCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTAgUnVpIFBhdWxvIDxy cGF1bG9ARnJlZUJTRC5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgQ2hlbmNob25nIFFpbiA8 Y2NxaW5ARnJlZUJTRC5vcmc+CiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlz dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0 aG91dApAQCAtMzcsOCArMzgsNDEgQEAKICNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfVFhfU1VD Q0VTUwkxCiAjZGVmaW5lCUlFRUU4MDIxMV9SQVRFQ1RMX1RYX0ZBSUxVUkUJMAogCisjZGVmaW5l CUlFRUU4MDIxMV9SQVRFQ1RMX1RSVUUJCTEKKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfRkFM U0UJCTAKKworI2RlZmluZQlJRUVFODAyMTFfUkFURUNUTF9OVU0JCTQKKworI2RlZmluZQlJRUVF ODAyMTFfUkFURUNUTF9EU19GTEFHCQkweDAxCS8qIGR1YWwtc3RyZWFtIHJhdGUgKi8KKyNkZWZp bmUJSUVFRTgwMjExX1JBVEVDVExfQ1c0MF9GTEFHCQkweDAyCS8qIHVzZSBIVDQwICovCisjZGVm aW5lCUlFRUU4MDIxMV9SQVRFQ1RMX1NHSV9GTEFHCQkweDA0CS8qIHVzZSBzaG9ydC1HSSAqLwor I2RlZmluZQlJRUVFODAyMTFfUkFURUNUTF9IVF9GTEFHCQkweDA4CS8qIHVzZSBIVCAqLworI2Rl ZmluZQlJRUVFODAyMTFfUkFURUNUTF9SVFNDVFNfRkxBRwkweDEwCS8qIGVuYWJsZSBSVFMvQ1RT IHByb3RlY3Rpb24gKi8KKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfU1RCQ19GTEFHCQkweDIw CS8qIGVuYWJsZSBTVEJDICovCisjZGVmaW5lCUlFRUU4MDIxMV9SQVRFQ1RMX1RTX0ZMQUcJCTB4 NDAJLyogdHJpcGxlLXN0cmVhbSByYXRlICovCisKKy8qIEhhcmR3YXJlIG9wdGlvbnMgY2hpcCBv ZmZlcmVkIHRvIHJhdGUgY29udHJvbCBjb2RlICovCisjZGVmaW5lCUlFRUU4MDIxMV9SQVRFQ1RM X09QVF9NUlIJCQkweDAxCS8qIHN1cHBvcnQgTVJSICovCisjZGVmaW5lCUlFRUU4MDIxMV9SQVRF Q1RMX09QVF9NUlJQUk9UCQkweDAyCS8qIHN1cHBvcnQgTVJSICsgcHJvdGVjdCAqLworI2RlZmlu ZQlJRUVFODAyMTFfUkFURUNUTF9PUFRfTVVMVFhDSEFJTgkweDA0CS8qIGhhcyBtb3JlIHRoYW4g MSB0eGNoYWluICovCisKKyNkZWZpbmUgSVNfVkFQX0hUKHZhcCkJKCh2YXApLT5pdl9odGNhcHMg JiBJRUVFODAyMTFfSFRDX0hUKQorCisjZGVmaW5lIElTX0hUX1JBVEUoX3JhdGUpICAgKChfcmF0 ZSkgJiAweDgwKQorI2RlZmluZSBIVF9SQ18yX01DUyhfcmMpICAgICgoX3JjKSAmIDB4N2YpCisj ZGVmaW5lIEhUX1JDXzJfU1RSRUFNUyhfcmMpICAgICgoKChfcmMpICYgMHg3OCkgPj4gMykgKyAx KQorCitzdHJ1Y3QgaWVlZTgwMjExX3JjX3NlcmllcyB7CisJdWludDhfdCByaXg7CQkvKiByYXRl dGFibGUgaW5kZXgsIG5vdCByYXRlIGNvZGUgKi8KKwl1aW50OF90IHJhdGVjb2RlOwkvKiBoYXJk d2FyZSByYXRlIGNvZGUgKi8KKwl1aW50OF90IHRyaWVzOworCXVpbnQ4X3QgdHhfcG93ZXJfY2Fw OworCXVpbnQxNl90IGZsYWdzOworfTsKKwogc3RydWN0IGllZWU4MDIxMV9yYXRlY3RsIHsKIAlj b25zdCBjaGFyICppcl9uYW1lOworCXVpbnQzMl90IG9wdGlvbnM7CQkvKiBJRUVFODAyMTFfUkFU RUNUTF9PUFRzICovCiAJaW50CSgqaXJfYXR0YWNoKShjb25zdCBzdHJ1Y3QgaWVlZTgwMjExdmFw ICopOwogCXZvaWQJKCppcl9kZXRhY2gpKGNvbnN0IHN0cnVjdCBpZWVlODAyMTF2YXAgKik7CiAJ dm9pZAkoKmlyX2luaXQpKHN0cnVjdCBpZWVlODAyMTF2YXAgKik7CkBAIC00Niw2ICs4MCw3IEBA CiAJdm9pZAkoKmlyX25vZGVfaW5pdCkoc3RydWN0IGllZWU4MDIxMV9ub2RlICopOwogCXZvaWQJ KCppcl9ub2RlX2RlaW5pdCkoc3RydWN0IGllZWU4MDIxMV9ub2RlICopOwogCWludAkoKmlyX3Jh dGUpKHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqLCB2b2lkICosIHVpbnQzMl90KTsKKwl2b2lkCSgq aXJfcmF0ZXMpKHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqLCBzdHJ1Y3QgaWVlZTgwMjExX3JjX3Nl cmllcyAqLCBpbnQsIHNpemVfdCk7CiAJdm9pZAkoKmlyX3R4X2NvbXBsZXRlKShjb25zdCBzdHJ1 Y3QgaWVlZTgwMjExdmFwICosCiAJICAgIAkJCSAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2Rl ICosIGludCwKIAkgICAgCQkJICB2b2lkICosIHZvaWQgKik7CkBAIC01Nyw3ICs5Miw3IEBACiAK IHZvaWQJaWVlZTgwMjExX3JhdGVjdGxfcmVnaXN0ZXIoaW50LCBjb25zdCBzdHJ1Y3QgaWVlZTgw MjExX3JhdGVjdGwgKik7CiB2b2lkCWllZWU4MDIxMV9yYXRlY3RsX3VucmVnaXN0ZXIoaW50KTsK LXZvaWQJaWVlZTgwMjExX3JhdGVjdGxfaW5pdChzdHJ1Y3QgaWVlZTgwMjExdmFwICopOwordm9p ZAlpZWVlODAyMTFfcmF0ZWN0bF9pbml0KHN0cnVjdCBpZWVlODAyMTF2YXAgKiwgdWludDMyX3Qp Owogdm9pZAlpZWVlODAyMTFfcmF0ZWN0bF9zZXQoc3RydWN0IGllZWU4MDIxMXZhcCAqLCBpbnQp OwogCiBNQUxMT0NfREVDTEFSRShNXzgwMjExX1JBVEVDVEwpOwpAQCAtNjksMTEgKzEwNCwxMSBA QAogfQogCiBzdGF0aWMgdm9pZCBfX2lubGluZQotaWVlZTgwMjExX3JhdGVjdGxfbm9kZV9pbml0 KHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmkpCitpZWVlODAyMTFfcmF0ZWN0bF9ub2RlX2luaXQo c3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSwgdWludDMyX3Qgb3B0aW9ucykKIHsKIAljb25zdCBz dHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAgPSBuaS0+bmlfdmFwOwogCi0JdmFwLT5pdl9yYXRlLT5p cl9ub2RlX2luaXQobmkpOworCXZhcC0+aXZfcmF0ZS0+aXJfbm9kZV9pbml0KG5pLCBvcHRpb25z KTsKIH0KIAogc3RhdGljIHZvaWQgX19pbmxpbmUKQEAgLTkzLDYgKzEyOCwxNyBAQAogfQogCiBz dGF0aWMgdm9pZCBfX2lubGluZQoraWVlZTgwMjExX3JhdGVjdGxfcmF0ZXMoc3RydWN0IGllZWU4 MDIxMV9ub2RlICpuaSwgc3RydWN0IGllZWU4MDIxMV9yY19zZXJpZXMgKnJjLAorCQlpbnQgc2hv cnRQcmVhbWJsZSwgc2l6ZV90IGZyYW1lTGVuKQoreworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTF2 YXAgKnZhcCA9IG5pLT5uaV92YXA7CisKKwl2YXAtPml2X3JhdGUtPmlyX3JhdGVzKG5pLCByYywg c2hvcnRQcmVhbWJsZSwgZnJhbWVMZW4pOworCQorCWllZWU4MDIxMV9yYXRlY3RsX2NvbXBsZXRl X3JjZmxhZ3MobmksIHJjLCBzaG9ydFByZWFtYmxlKTsKK30KKworc3RhdGljIHZvaWQgX19pbmxp bmUKIGllZWU4MDIxMV9yYXRlY3RsX3R4X2NvbXBsZXRlKGNvbnN0IHN0cnVjdCBpZWVlODAyMTF2 YXAgKnZhcCwKICAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pLCBpbnQgc3RhdHVz LCB2b2lkICphcmcxLCB2b2lkICphcmcyKQogewpAQCAtMTE1LDMgKzE2MSwxMDYgQEAKIAkJcmV0 dXJuOwogCXZhcC0+aXZfcmF0ZS0+aXJfc2V0aW50ZXJ2YWwodmFwLCBtc2Vjcyk7CiB9CisKK3N0 YXRpYyBpbnQgX19pbmxpbmUKK2llZWU4MDIxMV9yYXRlY3RsX2hhc2NhcF9jdzQwKGNvbnN0IHN0 cnVjdCBpZWVlODAyMTF2YXAgKnZhcCwKKwkJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2RlICpu aSkKK3sKKwlyZXR1cm4gSVNfVkFQX0hUKHZhcCkgJiYgKG5pLT5uaV9jaHcgPT0gNDApOworfQor CitzdGF0aWMgaW50IF9faW5saW5lCitpZWVlODAyMTFfcmF0ZWN0bF9oYXNjYXBfc2hvcnRnaShj b25zdCBzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAsCisJCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFf bm9kZSAqbmkpCit7CisJaWYgKCEgSVNfVkFQX0hUKHZhcCkpCisJCXJldHVybiBJRUVFODAyMTFf UkFURUNUTF9GQUxTRTsKKworCWlmIChuaS0+bmlfY2h3ID09IDQwICYmCisJCQl2YXAtPml2X2h0 Y2FwcyAmIElFRUU4MDIxMV9IVENBUF9TSE9SVEdJNDAgJiYKKwkJCW5pLT5uaV9odGNhcCAmIElF RUU4MDIxMV9IVENBUF9TSE9SVEdJNDApCisJCXJldHVybiBJRUVFODAyMTFfUkFURUNUTF9UUlVF OworCisJaWYgKG5pLT5uaV9jaHcgPT0gMjAgJiYKKwkJCXZhcC0+aXZfaHRjYXBzICYgSUVFRTgw MjExX0hUQ0FQX1NIT1JUR0kyMCAmJgorCQkJbmktPm5pX2h0Y2FwICYgSUVFRTgwMjExX0hUQ0FQ X1NIT1JUR0kyMCkKKwkJcmV0dXJuIElFRUU4MDIxMV9SQVRFQ1RMX1RSVUU7Cit9CisKKworc3Rh dGljIGludCBfX2lubGluZQoraWVlZTgwMjExX3JhdGVjdGxfaGFzY2FwX3N0YmMoY29uc3Qgc3Ry dWN0IGllZWU4MDIxMXZhcCAqdmFwLAorCQljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5p KQoreworICAgcmV0dXJuIElTX1ZBUF9IVCh2YXApICYmICh2YXAtPml2X2h0Y2FwcyAmIElFRUU4 MDIxMV9IVENBUF9UWFNUQkMpICYmCisJCQkgICAgKG5pLT5uaV9odGNhcCAmIElFRUU4MDIxMV9I VENBUF9SWFNUQkNfMVNUUkVBTSkgJiYKKwkJCSAgICAodmFwLT5pdl9yYXRlLT5vcHRpb25zICYg SUVFRTgwMjExX1JBVEVDVExfT1BUX01VTFRYQ0hBSU4pOworfQorCitzdGF0aWMgdm9pZAoraWVl ZTgwMjExX3JhdGVjdGxfY29tcGxldGVfcmNmbGFncyhzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5p LAorCQlzdHJ1Y3QgaWVlZTgwMjExX3JjX3NlcmllcyAqcmMsIGludCBzaG9ydFByZWFtYmxlKQor eworCXN0cnVjdCBpZWVlODAyMTFjb20gKmljID0gbmktPm5pX2ljOworCWNvbnN0IHN0cnVjdCBp ZWVlODAyMTFfcmF0ZV90YWJsZSAqIHJ0ID0gaWMtPmljX3J0OworCXVpbnQ4X3QgcmF0ZTAsIHJh dGU7CisJaW50IGk7CisKKwlyYXRlMCA9IHJ0LT5pbmZvW3JjWzBdLnJpeF0ucmF0ZUNvZGU7CisJ CisJLyogTWFrZSBzdXJlIHRoYXQgcmF0ZSBjb250cm9sIGNvZGUgZG9lc24ndCBtZXNzIGl0IHVw LgorCSAqIElmIGVuYWJsZSBydHMvY3RzIGFuZCBpcyBwcmUtODAyLjExbiwgYmxhbmsgdHJpZXMg MSwgMiwgMyAKKwkgKi8KKworCWlmICghIElTX0hUX1JBVEUocmF0ZTApKQorCXsKKwkJaWYgKHJj WzBdLmZsYWdzICYgSUVFRTgwMjExX1JBVEVDVExfUlRTQ1RTX0ZMQUcpCisJCQlyY1sxXS50cmll cyA9IHJjWzJdLnRyaWVzID0gcmNbM10udHJpZXMgPSAwOworCQlyY1sxXS5mbGFncyAmPSB+SUVF RTgwMjExX1JBVEVDVExfUlRTQ1RTX0ZMQUc7IAorCQlyY1syXS5mbGFncyAmPSB+SUVFRTgwMjEx X1JBVEVDVExfUlRTQ1RTX0ZMQUc7IAorCQlyY1szXS5mbGFncyAmPSB+SUVFRTgwMjExX1JBVEVD VExfUlRTQ1RTX0ZMQUc7IAorCX0KKworCWZvciAoaSA9IDA7IGkgPCBJRUVFODAyMTFfUkFURUNU TF9OVU07IGkrKykgeworCQkKKwkJaWYgKHJjW2ldLnRyaWVzID09IDApCisJCQljb250aW51ZTsK KworCQlyYXRlID0gcnQtPmluZm9bcmNbaV0ucml4XS5yYXRlQ29kZTsKKworCQkvKgorCQkgKiBP bmx5IGVuYWJsZSBzaG9ydCBwcmVhbWJsZSBmb3IgbGVnYWN5IHJhdGVzCisJCSAqLworCQlpZiAo KCEgSVNfSFRfUkFURShyYXRlKSkgJiYgc2hvcnRQcmVhbWJsZSkKKwkJCXJhdGUgfD0gcnQtPmlu Zm9bcmNbaV0ucml4XS5zaG9ydFByZWFtYmxlOworCisJCS8qCisJCSAqIFNhdmUgdGhpcywgdXNl ZCBieSB0aGUgVFggYW5kIGNvbXBsZXRpb24gY29kZQorCQkgKi8KKwkJcmNbaV0ucmF0ZWNvZGUg PSByYXRlOworCisJCS8qIE9ubHkgZW5hYmxlIHNob3J0Z2ksIDIwNDAsIGR1YWwtc3RyZWFtIGlm IEhUIGlzIHNldCAqLworCQlpZiAoSVNfSFRfUkFURShyYXRlKSkgeworCQkJcmNbaV0uZmxhZ3Mg fD0gSUVFRTgwMjExX1JBVEVDVExfSFRfRkxBRzsKKworCQkJLyoKKwkJCSAqIFhYWCBUT0RPOiBM RFBDCisJCQkgKi8KKworCQkJLyoKKwkJCSAqIER1YWwgLyBUcmlwbGUgc3RyZWFtIHJhdGU/CisJ CQkgKi8KKwkJCWlmIChIVF9SQ18yX1NUUkVBTVMocmF0ZSkgPT0gMikKKwkJCQlyY1tpXS5mbGFn cyB8PSBJRUVFODAyMTFfUkFURUNUTF9EU19GTEFHOworCQkJZWxzZSBpZiAoSFRfUkNfMl9TVFJF QU1TKHJhdGUpID09IDMpCisJCQkJcmNbaV0uZmxhZ3MgfD0gSUVFRTgwMjExX1JBVEVDVExfVFNf RkxBRzsKKwkJfQorCisJCS8qCisJCSAqIENhbGN1bGF0ZSB0aGUgbWF4aW11bSBUWCBwb3dlciBj YXAgZm9yIHRoZSBjdXJyZW50CisJCSAqIG5vZGUuIAorCQkgKiBSYXRlIGNvbnRyb2wgYWxnbyBj YW4ndCBjb250cm9sIFRYIHBvd2VyIGJ5IG5vdy4KKwkJICovCisJCXJjW2ldLnR4X3Bvd2VyX2Nh cCA9IGllZWU4MDIxMV9nZXRfbm9kZV90eHBvd2VyKG5pKTsKKwl9Cit9Cg== --089e013d06fa51aaaf04e2114524--