From owner-freebsd-wireless@FreeBSD.ORG Tue Feb 14 22:14:58 2012 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 682341065679; Tue, 14 Feb 2012 22:14:58 +0000 (UTC) (envelope-from monthadar@gmail.com) Received: from mail-iy0-f182.google.com (mail-iy0-f182.google.com [209.85.210.182]) by mx1.freebsd.org (Postfix) with ESMTP id 194E98FC14; Tue, 14 Feb 2012 22:14:57 +0000 (UTC) Received: by iaeo4 with SMTP id o4so626472iae.13 for ; Tue, 14 Feb 2012 14:14:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:cc:content-type; bh=/JRZ5BWixvzeaSqk9vCOebrnHQnepS8uf555KSdOeoc=; b=NA+1Gpi8XbysMssV3HVvZgawhS9B0UcN+ZCgcF3Jr8cYECzyW3Rbxka/aoi/TQ5y9x n8sVGMvoSvoejp8ww/ZhC9gwqmE2NVRhCqfX7IBU8zODS5II9dYTE4SzXVYChVj4xSZ3 pVBx9KsTDkbpXreHZaw/0iPnxmsn/KnQXQ6Z4= MIME-Version: 1.0 Received: by 10.42.80.3 with SMTP id t3mr30727684ick.49.1329257697585; Tue, 14 Feb 2012 14:14:57 -0800 (PST) Received: by 10.50.213.74 with HTTP; Tue, 14 Feb 2012 14:14:57 -0800 (PST) Date: Tue, 14 Feb 2012 23:14:57 +0100 Message-ID: From: Monthadar Al Jaberi To: freebsd-wireless@freebsd.org Content-Type: multipart/mixed; boundary=20cf3011da15e12aee04b8f3ec09 Cc: Rui Paulo , Bernhard Schmidt Subject: Fragment and 11s inconsistency 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: Tue, 14 Feb 2012 22:14:58 -0000 --20cf3011da15e12aee04b8f3ec09 Content-Type: text/plain; charset=ISO-8859-1 Hi, I cant verify this yet, but isn't there something wrong in current FreeBSD? lets say an 11s data frame need to be fragmented in ieee80211_encap: if (addqos) hdrsize = sizeof(struct ieee80211_qosframe); else hdrsize = sizeof(struct ieee80211_frame); ... if (vap->iv_opmode == IEEE80211_M_MBSS) { ... if (!IEEE80211_IS_MULTICAST(eh.ether_dhost)) hdrsize += IEEE80211_ADDR_LEN; /* unicast are 4-addr */ meshhdrsize = sizeof(struct ieee80211_meshcntl); } ... if (__predict_true((m->m_flags & M_FF) == 0)) { /* * Normal frame. */ m = ieee80211_mbuf_adjust(vap, hdrspace + meshhdrsize, key, m); } M_PREPEND(m, hdrspace + meshhdrsize, M_DONTWAIT); if (txfrag && !ieee80211_fragment(vap, m, hdrsize, key != NULL ? key->wk_cipher->ic_header : 0, vap->iv_fragthreshold)) goto bad; This means we send meshcontrol only in first segment, because we never add meshhdrsize to hdrsize... but in mesh_input switch (type) { case IEEE80211_FC0_TYPE_DATA: ... meshdrlen = sizeof(struct ieee80211_meshcntl) + (mc->mc_flags & 3) * IEEE80211_ADDR_LEN; hdrspace += meshdrlen; ... /* * Potentially forward packet. See table s36 (p140) * for the rules. XXX tap fwd'd packets not for us? */ if (dir == IEEE80211_FC1_DIR_FROMDS || !mesh_isucastforme(vap, wh, mc)) { mesh_forward(vap, m, mc); ... if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) { m = ieee80211_defrag(ni, m, hdrspace); if (m == NULL) { This seems wrong to me, how can we potentially forward before defragin the frame? this will fail cause sub-frag have no mesh control as code shows above. shouldnt the defrag code be moved above? I am attaching a patch that both moves the defrag, validates that mesh control is present and makes 11s data frames QoS and set Mesh control bit present to 1 as the amendment specifies. br, -- Monthadar Al Jaberi --20cf3011da15e12aee04b8f3ec09 Content-Type: text/x-patch; charset=US-ASCII; name="0001-Make-mesh-data-frames-to-be-quality-of-service-QoS.patch" Content-Disposition: attachment; filename="0001-Make-mesh-data-frames-to-be-quality-of-service-QoS.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gynhniow0 RnJvbSA4MmFhNTg2OWNlMTQwNTg4Mjc0YzgwMjFhNWQ0MDQyMDI1ZDFmMWFhIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNb250aGFkYXIgQWwgSmFiZXJpIDxtb250aGFkYXJAZ21haWwu Y29tPgpEYXRlOiBUdWUsIDE0IEZlYiAyMDEyIDE2OjQ3OjQzICswMTAwClN1YmplY3Q6IFtQQVRD SF0gTWFrZSBtZXNoIGRhdGEgZnJhbWVzIHRvIGJlIHF1YWxpdHkgb2Ygc2VydmljZSAoUW9TKS4K CiogSW50cm9kdWNlIG5ldyBmbGFnIGZvciBRb1MgY29udHJvbCBmaWVsZDsKKiBDaGFuZ2UgaW4g bWVzaF9pbnB1dCB0byB2YWxpZGF0ZSB0aGF0IFFvUyBpcyBzZXQgYW5kIE1lc2ggQ29udHJvbCBm aWVsZAppcyBwcmVzZW50LCBhbHNvIGJvdGggYnl0ZXMgb2YgdGhlIFFvUyBhcmUgcmVhZDsKKiBN b3ZlZCBkZWZyYWdtZW50YXRpb24gaW4gbWVzaF9pbnB1dCBiZWZvcmUgd2UgdHJ5IHRvIGZvcndh cmQgcGFja2V0IGFzCmluZmVycmVkIGZyb20gYW1lbmRtZW50IHNwZWMsIGJlY2F1c2UgTWVzaCBD b250cm9sIGZpZWxkIG9ubHkgcHJlc2VudCBpbiBmaXJzdApmcmFnbWVudDsKKiBDaGFuZ2VkIGlu IGllZWU4MDIxMV9lbmNhcCB0byBzZXQgUW9TIHN1YnR5cGUgYW5kIE1lc2ggQ29udHJvbCBmaWVs ZCBwcmVzZW50OwotLS0KIHN5cy9uZXQ4MDIxMS9pZWVlODAyMTEuaCAgICAgICAgfCAgICA3ICsr Kwogc3lzL25ldDgwMjExL2llZWU4MDIxMV9tZXNoLmMgICB8ICAgODMgKysrKysrKysrKysrKysr KysrKysrKysrKysrLS0tLS0tLS0tLS0tCiBzeXMvbmV0ODAyMTEvaWVlZTgwMjExX291dHB1dC5j IHwgICAxMyArKysrKy0KIDMgZmlsZXMgY2hhbmdlZCwgNzUgaW5zZXJ0aW9ucygrKSwgMjggZGVs ZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3lzL25ldDgwMjExL2llZWU4MDIxMS5oIGIvc3lzL25l dDgwMjExL2llZWU4MDIxMS5oCmluZGV4IDAyOGFmZWMuLjI5YmZhM2MgMTAwNjQ0Ci0tLSBhL3N5 cy9uZXQ4MDIxMS9pZWVlODAyMTEuaAorKysgYi9zeXMvbmV0ODAyMTEvaWVlZTgwMjExLmgKQEAg LTE5OSw2ICsxOTksMTMgQEAgc3RydWN0IGllZWU4MDIxMV9xb3NmcmFtZV9hZGRyNCB7CiAjZGVm aW5lCUlFRUU4MDIxMV9RT1NfRU9TUAkJCTB4MTAJLyogRW5kT2ZTZXJ2aWNlIFBlcmlvZCovCiAj ZGVmaW5lCUlFRUU4MDIxMV9RT1NfRU9TUF9TCQkJNAogI2RlZmluZQlJRUVFODAyMTFfUU9TX1RJ RAkJCTB4MGYKKy8qIHFvc1sxXSBieXRlIHVzZWQgZm9yIGFsbCBmcmFtZXMgc2VudCBieSBtZXNo IFNUQXMgaW4gYSBtZXNoIEJTUyAqLworI2RlZmluZSBJRUVFODAyMTFfUU9TX01DCQkJMHgxMAkv KiBNZXNoIGNvbnRyb2wgKi8KKy8qIE1lc2ggcG93ZXIgc2F2ZSBsZXZlbCovCisjZGVmaW5lIElF RUU4MDIxMV9RT1NfTUVTSF9QU0wJCQkweDIwCisvKiBNZXNoIFJlY2VpdmVyIFNlcnZpY2UgUGVy aW9kIEluaXRpYXRlZCAqLworI2RlZmluZSBJRUVFODAyMTFfUU9TX1JTUEkJCQkweDQwCisvKiBi aXRzIDExIHRvIDE1IHJlc2VydmVkICovCiAKIC8qIGRvZXMgZnJhbWUgaGF2ZSBRb1Mgc2VxdWVu Y2UgY29udHJvbCBkYXRhICovCiAjZGVmaW5lCUlFRUU4MDIxMV9RT1NfSEFTX1NFUSh3aCkgXApk aWZmIC0tZ2l0IGEvc3lzL25ldDgwMjExL2llZWU4MDIxMV9tZXNoLmMgYi9zeXMvbmV0ODAyMTEv aWVlZTgwMjExX21lc2guYwppbmRleCBiOTJmNjk1Li5hMjAzNjA0IDEwMDY0NAotLS0gYS9zeXMv bmV0ODAyMTEvaWVlZTgwMjExX21lc2guYworKysgYi9zeXMvbmV0ODAyMTEvaWVlZTgwMjExX21l c2guYwpAQCAtMTA0Nyw5ICsxMDQ3LDkgQEAgbWVzaF9pbnB1dChzdHJ1Y3QgaWVlZTgwMjExX25v ZGUgKm5pLCBzdHJ1Y3QgbWJ1ZiAqbSwgaW50IHJzc2ksIGludCBuZikKIAlzdHJ1Y3QgaWVlZTgw MjExX2ZyYW1lICp3aDsKIAljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX21lc2hjbnRsICptYzsKIAlp bnQgaGRyc3BhY2UsIG1lc2hkcmxlbiwgbmVlZF90YXA7Ci0JdWludDhfdCBkaXIsIHR5cGUsIHN1 YnR5cGUsIHFvczsKKwl1aW50OF90IGRpciwgdHlwZSwgc3VidHlwZTsKIAl1aW50MzJfdCBzZXE7 Ci0JdWludDhfdCAqYWRkcjsKKwl1aW50OF90ICphZGRyLCBxb3NbMl07CiAJaWVlZTgwMjExX3Nl cSByeHNlcTsKIAogCUtBU1NFUlQobmkgIT0gTlVMTCwgKCJudWxsIG5vZGUiKSk7CkBAIC0xMTQ2 LDggKzExNDYsNjIgQEAgbWVzaF9pbnB1dChzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pLCBzdHJ1 Y3QgbWJ1ZiAqbSwgaW50IHJzc2ksIGludCBuZikKIAkJCXZhcC0+aXZfc3RhdHMuaXNfcnhfd3Jv bmdkaXIrKzsKIAkJCWdvdG8gZXJyOwogCQl9Ci0JCS8qIHB1bGwgdXAgZW5vdWdoIHRvIGdldCB0 byB0aGUgbWVzaCBjb250cm9sICovCisKKwkJLyogQWxsIE1lc2ggZGF0YSBmcmFtZXMgYXJlIFFv UyBzdWJ0eXBlICovCisJCWlmICghSEFTX1NFUSh0eXBlKSkgeworCQkJSUVFRTgwMjExX0RJU0NB UkQodmFwLCBJRUVFODAyMTFfTVNHX0lOUFVULAorCQkJICAgIHdoLCAiZGF0YSIsICJpbmNvcnJl Y3Qgc3VidHlwZSAweCV4Iiwgc3VidHlwZSk7CisJCQl2YXAtPml2X3N0YXRzLmlzX3J4X2JhZHN1 YnR5cGUrKzsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJLyoKKwkJICogTmV4dCB1cCwgYW55IGZy YWdtZW50YXRpb24uCisJCSAqIFhYWDogd2UgZGVmcmFnIGJlZm9yZSB3ZSBldmVuIHRyeSB0byBm b3J3YXJkLAorCQkgKiBNZXNoIENvbnRyb2wgZmllbGQgaXMgbm90IHByZXNlbnQgaW4gc3ViLXNl cXVlbnQKKwkJICogZnJhZ21lbnRlZCBmcmFtZXMuIFRoaXMgaXMgaW4gY29uc3RyYXN0IHRvIERy YWYgNC4wLgorCQkgKi8KIAkJaGRyc3BhY2UgPSBpZWVlODAyMTFfaGRyc3BhY2UoaWMsIHdoKTsK KwkJaWYgKCFJRUVFODAyMTFfSVNfTVVMVElDQVNUKHdoLT5pX2FkZHIxKSkgeworCQkJbSA9IGll ZWU4MDIxMV9kZWZyYWcobmksIG0sIGhkcnNwYWNlKTsKKwkJCWlmIChtID09IE5VTEwpIHsKKwkJ CQkvKiBGcmFnbWVudCBkcm9wcGVkIG9yIGZyYW1lIG5vdCBjb21wbGV0ZSB5ZXQgKi8KKwkJCQln b3RvIG91dDsKKwkJCX0KKwkJfQorCQl3aCA9IG10b2QobSwgc3RydWN0IGllZWU4MDIxMV9mcmFt ZSAqKTsgLyogTkI6IGFmdGVyIGRlZnJhZyAqLworCisJCS8qCisJCSAqIE5vdyB3ZSBoYXZlIGEg Y29tcGxldGUgTWVzaCBEYXRhIGZyYW1lLgorCQkgKi8KKworCQkvKgorCQkgKiBPbmx5IGdyb3Vw IGFkZHJlc3NlZCBNZXNoIGRhdGEgZnJhbWVzIGFyZSAzIGFkZHJlc3MKKwkJICogcW9zIGZyYW1l cyBhbW9uZyB0aGUgZGlmZmVyZW50IE1lc2ggRGF0YSBmcmFtZXMgYXMKKwkJICogc3BlY2lmaWVk IGluIGFtZW5kbWVudC4KKwkJICovCisJCSoodWludDE2X3QgKilxb3MgPSAqKHVpbnQxNl90ICop CisJCSAgICAoKChJRUVFODAyMTFfSVNfTVVMVElDQVNUKHdoLT5pX2FkZHIxKSAmJgorCQkgICAg ZGlyID09IElFRUU4MDIxMV9GQzFfRElSX0ZST01EUykpID8KKwkJICAgICgoc3RydWN0IGllZWU4 MDIxMV9xb3NmcmFtZSAqKXdoKS0+aV9xb3MgOgorCQkgICAgKChzdHJ1Y3QgaWVlZTgwMjExX3Fv c2ZyYW1lX2FkZHI0ICopd2gpLT5pX3Fvcyk7CisKKwkJLyoKKwkJICogTkI6IFRoZSBtZXNoIFNU QSBzZXRzIHRoZSBNZXNoIENvbnRyb2wgUHJlc2VudAorCQkgKiBzdWJmaWVsZCB0byAxIGluIHRo ZSBNZXNoIERhdGEgZnJhbWUgY29udGFpbmluZworCQkgKiBhbiB1bmZyYWdtZW50ZWQgTVNEVSwg YW4gQS1NU0RVLCBvciB0aGUgZmlyc3QKKwkJICogZnJhZ21lbnQgb2YgYW4gTVNEVS4KKwkJICog QWZ0ZXIgZGVmcmFnIGl0IHNob3VsZCBhbHdheXMgYmUgcHJlc2VudC4KKwkJICovCisJCWlmICgh KHFvc1sxXSAmIElFRUU4MDIxMV9RT1NfTUMpKSB7CisJCQlJRUVFODAyMTFfRElTQ0FSRF9NQUMo dmFwLCBJRUVFODAyMTFfTVNHX01FU0gsCisJCQkgICAgbmktPm5pX21hY2FkZHIsIE5VTEwsCisJ CQkgICAgIiVzIiwgIk1lc2ggY29udHJvbCBmaWVsZCBub3QgcHJlc2VudCIpOworCQkJdmFwLT5p dl9zdGF0cy5pc19yeF9lbGVtX21pc3NpbmcrKzsgLyogWFhYOiBraW5kYSAqLworCQkJZ290byBl cnI7CisJCX0KKworCQkvKiBwdWxsIHVwIGVub3VnaCB0byBnZXQgdG8gdGhlIG1lc2ggY29udHJv bCAqLwogCQlpZiAobS0+bV9sZW4gPCBoZHJzcGFjZSArIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjEx X21lc2hjbnRsKSAmJgogCQkgICAgKG0gPSBtX3B1bGx1cChtLCBoZHJzcGFjZSArCiAJCSAgICAg ICAgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfbWVzaGNudGwpKSkgPT0gTlVMTCkgewpAQCAtMTE5 NSwyNyArMTI0OSw2IEBAIG1lc2hfaW5wdXQoc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSwgc3Ry dWN0IG1idWYgKm0sIGludCByc3NpLCBpbnQgbmYpCiAJCQkvKiBOQjogZmFsbCB0aHJ1IHRvIGRl bGl2ZXIgbWNhc3QgZnJhbWVzIGxvY2FsbHkgKi8KIAkJfQogCi0JCS8qCi0JCSAqIFNhdmUgUW9T IGJpdHMgZm9yIHVzZSBiZWxvdy0tYmVmb3JlIHdlIHN0cmlwIHRoZSBoZWFkZXIuCi0JCSAqLwot CQlpZiAoc3VidHlwZSA9PSBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUU9TKSB7Ci0JCQlxb3MgPSAo ZGlyID09IElFRUU4MDIxMV9GQzFfRElSX0RTVE9EUykgPwotCQkJICAgICgoc3RydWN0IGllZWU4 MDIxMV9xb3NmcmFtZV9hZGRyNCAqKXdoKS0+aV9xb3NbMF0gOgotCQkJICAgICgoc3RydWN0IGll ZWU4MDIxMV9xb3NmcmFtZSAqKXdoKS0+aV9xb3NbMF07Ci0JCX0gZWxzZQotCQkJcW9zID0gMDsK LQkJLyoKLQkJICogTmV4dCB1cCwgYW55IGZyYWdtZW50YXRpb24uCi0JCSAqLwotCQlpZiAoIUlF RUU4MDIxMV9JU19NVUxUSUNBU1Qod2gtPmlfYWRkcjEpKSB7Ci0JCQltID0gaWVlZTgwMjExX2Rl ZnJhZyhuaSwgbSwgaGRyc3BhY2UpOwotCQkJaWYgKG0gPT0gTlVMTCkgewotCQkJCS8qIEZyYWdt ZW50IGRyb3BwZWQgb3IgZnJhbWUgbm90IGNvbXBsZXRlIHlldCAqLwotCQkJCWdvdG8gb3V0Owot CQkJfQotCQl9Ci0JCXdoID0gTlVMTDsJCS8qIG5vIGxvbmdlciB2YWxpZCwgY2F0Y2ggYW55IHVz ZXMgKi8KLQogCQlpZiAoaWVlZTgwMjExX3JhZGlvdGFwX2FjdGl2ZV92YXAodmFwKSkKIAkJCWll ZWU4MDIxMV9yYWRpb3RhcF9yeCh2YXAsIG0pOwogCQluZWVkX3RhcCA9IDA7CkBAIC0xMjM2LDcg KzEyNjksNyBAQCBtZXNoX2lucHV0KHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmksIHN0cnVjdCBt YnVmICptLCBpbnQgcnNzaSwgaW50IG5mKQogCQkJSUVFRTgwMjExX05PREVfU1RBVChuaSwgcnhf ZGVjYXApOwogCQkJZ290byBlcnI7CiAJCX0KLQkJaWYgKHFvcyAmIElFRUU4MDIxMV9RT1NfQU1T RFUpIHsKKwkJaWYgKHFvc1swXSAmIElFRUU4MDIxMV9RT1NfQU1TRFUpIHsKIAkJCW0gPSBpZWVl ODAyMTFfZGVjYXBfYW1zZHUobmksIG0pOwogCQkJaWYgKG0gPT0gTlVMTCkKIAkJCQlyZXR1cm4g SUVFRTgwMjExX0ZDMF9UWVBFX0RBVEE7CmRpZmYgLS1naXQgYS9zeXMvbmV0ODAyMTEvaWVlZTgw MjExX291dHB1dC5jIGIvc3lzL25ldDgwMjExL2llZWU4MDIxMV9vdXRwdXQuYwppbmRleCBmNjE3 N2Q5Li44YjJiNTAxIDEwMDY0NAotLS0gYS9zeXMvbmV0ODAyMTEvaWVlZTgwMjExX291dHB1dC5j CisrKyBiL3N5cy9uZXQ4MDIxMS9pZWVlODAyMTFfb3V0cHV0LmMKQEAgLTEwNjksOSArMTA2OSwx MSBAQCBpZWVlODAyMTFfZW5jYXAoc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwLCBzdHJ1Y3QgaWVl ZTgwMjExX25vZGUgKm5pLAogCSAqIGFwJ3MgcmVxdWlyZSBhbGwgZGF0YSBmcmFtZXMgdG8gYmUg UW9TLWVuY2Fwc3VsYXRlZAogCSAqIG9uY2UgbmVnb3RpYXRlZCBpbiB3aGljaCBjYXNlIHdlJ2xs IG5lZWQgdG8gbWFrZSB0aGlzCiAJICogY29uZmlndXJhYmxlLgorCSAqIE5COiBtZXNoIGRhdGEg ZnJhbWVzIGFyZSBRb1MuCiAJICovCi0JYWRkcW9zID0gKG5pLT5uaV9mbGFncyAmIChJRUVFODAy MTFfTk9ERV9RT1N8SUVFRTgwMjExX05PREVfSFQpKSAmJgotCQkgKG0tPm1fZmxhZ3MgJiBNX0VB UE9MKSA9PSAwOworCWFkZHFvcyA9ICgobmktPm5pX2ZsYWdzICYgKElFRUU4MDIxMV9OT0RFX1FP U3xJRUVFODAyMTFfTk9ERV9IVCkpIHx8CisJICAgICh2YXAtPml2X29wbW9kZSA9PSBJRUVFODAy MTFfTV9NQlNTKSkgJiYKKwkgICAgKG0tPm1fZmxhZ3MgJiBNX0VBUE9MKSA9PSAwOwogCWlmIChh ZGRxb3MpCiAJCWhkcnNpemUgPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9xb3NmcmFtZSk7CiAJ ZWxzZQpAQCAtMTI3Nyw3ICsxMjc5LDEyIEBAIGllZWU4MDIxMV9lbmNhcChzdHJ1Y3QgaWVlZTgw MjExdmFwICp2YXAsIHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmksCiAJCXFvc1swXSA9IHRpZCAm IElFRUU4MDIxMV9RT1NfVElEOwogCQlpZiAoaWMtPmljX3dtZS53bWVfd21lQ2hhblBhcmFtcy5j YXBfd21lUGFyYW1zW2FjXS53bWVwX25vYWNrUG9saWN5KQogCQkJcW9zWzBdIHw9IElFRUU4MDIx MV9RT1NfQUNLUE9MSUNZX05PQUNLOwotCQlxb3NbMV0gPSAwOworI2lmZGVmIElFRUU4MDIxMV9T VVBQT1JUX01FU0gKKwkJaWYgKHZhcC0+aXZfb3Btb2RlID09IElFRUU4MDIxMV9NX01CU1MpIHsK KwkJCXFvc1sxXSB8PSBJRUVFODAyMTFfUU9TX01DOworCQl9IGVsc2UKKyNlbmRpZgorCQkJcW9z WzFdID0gMDsKIAkJd2gtPmlfZmNbMF0gfD0gSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1FPUzsKIAog CQlpZiAoKG0tPm1fZmxhZ3MgJiBNX0FNUERVX01QRFUpID09IDApIHsKLS0gCjEuNy40LjEKCg== --20cf3011da15e12aee04b8f3ec09--