From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from smtp.codeaurora.org ([198.145.29.96]:58414 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750820AbeEDGuj (ORCPT ); Fri, 4 May 2018 02:50:39 -0400 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Date: Fri, 04 May 2018 12:20:38 +0530 From: Manikanta Pubbisetty To: johannes@sipsolutions.net Cc: Kalle Valo , ath10k@lists.infradead.org, linux-wireless@vger.kernel.org, Sebastian Gottschall Subject: Re: [PATCH] ath10k: add dynamic vlan support In-Reply-To: References: <1524232653-22573-1-git-send-email-mpubbise@codeaurora.org> <87r2n5auvq.fsf@kamboji.qca.qualcomm.com> Message-ID: (sfid-20180504_085043_843334_F7E01383) Sender: linux-wireless-owner@vger.kernel.org List-ID: Johannes, It seems like commit db3bdcb9c3ff ("mac80211: allow AP_VLAN operation on crypto controlled devices") has broken 4-addr operation on crypto controlled devices as reported by sebastian. The commit was mainly focused in addressing the problem in supporting VLANs on crypto controlled devices but since 4-addr mode is also dependent on AP_VLAN interface, this commit breaks the 4-addr AP mode. I have couple of ideas on how to address the problem, 1) Add a new hw_flag and based on the hardware flag, allow/disallow the creation of AP_VLAN interface. diff --git a/include/net/mac80211.h b/include/net/mac80211.h index d2279b2..301d9c38 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h @@ -2084,6 +2084,11 @@ struct ieee80211_txq { * @IEEE80211_HW_DOESNT_SUPPORT_QOS_NDP: The driver (or firmware) doesn't * support QoS NDP for AP probing - that's most likely a driver bug. * + * @IEEE80211_HW_SUPPORTS_SW_ENCRYPT: Device is capable of transmitting + * frames encrypted in software, only valid when SW_CRYPTO_CONTROL + * is enabled. Based on this flag, mac80211 can allow/disallow VLAN + * operations in the BSS. + * * @NUM_IEEE80211_HW_FLAGS: number of hardware flags, used for sizing arrays */ enum ieee80211_hw_flags { @@ -2129,6 +2134,7 @@ enum ieee80211_hw_flags { IEEE80211_HW_SUPPORTS_TDLS_BUFFER_STA, IEEE80211_HW_DEAUTH_NEED_MGD_TX_PREP, IEEE80211_HW_DOESNT_SUPPORT_QOS_NDP, + IEEE80211_HW_SUPPORTS_SW_ENCRYPT, /* keep last, obviously */ NUM_IEEE80211_HW_FLAGS diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c index 555e389..c825d27 100644 --- a/net/mac80211/iface.c +++ b/net/mac80211/iface.c @@ -1736,6 +1736,11 @@ int ieee80211_if_add(struct ieee80211_local *local, const char *name, ASSERT_RTNL(); + if ((type == NL80211_IFTYPE_AP_VLAN) && !params->use_4addr && + ieee80211_hw_check(local->hw, SW_CRYPTO_CONTROL) && + !ieee80211_hw_check(local->hw, SUPPORTS_SW_ENCRYPT)) + return -EOPNOTSUPP; + if (type == NL80211_IFTYPE_P2P_DEVICE || type == NL80211_IFTYPE_NAN) { struct wireless_dev *wdev; 2) Allow mac80211 to call set_key for GTKs on AP_VLAN interfaces for crypto controlled devices, let the driver decide whether to return '1' or some error code based on their support for transmitting sw encrypted frames. I am little skeptical with this approach as drivers are totally unaware of AP_VLAN interfaces. diff --git a/net/mac80211/key.c b/net/mac80211/key.c index ee0d0cc..0ff5597 100644 --- a/net/mac80211/key.c +++ b/net/mac80211/key.c @@ -167,7 +167,8 @@ static int ieee80211_key_enable_hw_accel(struct ieee80211_key *key) * The driver doesn't know anything about VLAN interfaces. * Hence, don't send GTKs for VLAN interfaces to the driver. */ - if (!(key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE)) + if ((!(key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE) && + !ieee80211_hw_check(&key->local->hw, SW_CRYPTO_CONTROL))) goto out_unsupported; } Please let me know which is the better way to deal the problem. Thanks, Manikanta On 2018-04-24 14:39, Sebastian Gottschall wrote: > consider my comment regarding vlan_ap. > this patch will break wds ap / wds sta support with latest mac80211 > (see also my post on the wireless mailing list about the breaking > patch in mac80211) > so AP_VLAN must be masked always for all chipsets. otherwise wds > breaks and this is not just a guess. i tested it yesterday using this > patch and found > the cause of the issue > > the following lines > >   +    if (test_bit(WMI_SERVICE_PER_PACKET_SW_ENCRYPT, > ar->wmi.svc_map)) { > +        ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_AP_VLAN); > +        ar->hw->wiphy->software_iftypes |= > BIT(NL80211_IFTYPE_AP_VLAN); > +    } > > > must be just > > +        ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_AP_VLAN); > +        ar->hw->wiphy->software_iftypes |= > BIT(NL80211_IFTYPE_AP_VLAN); > > everthing else will cause a regression > > Am 24.04.2018 um 10:09 schrieb Kalle Valo: >> Manikanta Pubbisetty writes: >> >>> Mutlicast/broadcast traffic destined for a particular vlan group will >>> always be encrypted in software. To enable dynamic VLANs, it requires >>> driver support for sending software encrypted packets. >>> >>> In ath10k, sending sw encrypted frames is allowed only when we insmod >>> the driver with cryptmode param set to 1, this configuration disables >>> hardware crypto and enables RAW mode implicitly. Since, enabling raw >>> mode has performance impact, this cannot be considered as an ideal >>> solution for supporting VLANs in the driver. >>> >>> As an alternative take, in this approach, cryptographic keys for >>> unicast traffic(per peer PTKs) and keys for non-vlan group traffic >>> will be configured in hardware, allowing hardware encryption for >>> unicast >>> and non-vlan group traffic. Only vlan group traffic will be encrypted >>> in >>> software and pushed to the target with encap mode set to RAW in the >>> TX >>> descriptors. >>> >>> Not all firmwares can support this type of key configuration(having >>> few >>> keys installed in hardware and few only in software); for this >>> purpose a >>> new WMI service flag "WMI_SERVICE_PER_PACKET_SW_ENCRYPT" is >>> introduced to >>> advertise this support. >>> >>> Also, adding the logic required to send sw encrypted frames in raw >>> mode. >>> >>> Tested this change on QCA9984(firmware version 10.4-3.5.3-00057). >>> >>> Signed-off-by: Manikanta Pubbisetty >> Your name in patchwork is wrong and hence my script uses the wrong >> name. Please fix it by registering to patchwork[1] where it's possible >> to change your name during registration, but only one time. If that >> doesn't work then send a request to helpdesk@kernel.org and the admins >> can fix it. >> >> [1] https://patchwork.kernel.org/register/ >> From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from smtp.codeaurora.org ([198.145.29.96]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1fEUYL-0000xJ-U3 for ath10k@lists.infradead.org; Fri, 04 May 2018 06:50:51 +0000 MIME-Version: 1.0 Date: Fri, 04 May 2018 12:20:38 +0530 From: Manikanta Pubbisetty Subject: Re: [PATCH] ath10k: add dynamic vlan support In-Reply-To: References: <1524232653-22573-1-git-send-email-mpubbise@codeaurora.org> <87r2n5auvq.fsf@kamboji.qca.qualcomm.com> Message-ID: List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "ath10k" Errors-To: ath10k-bounces+kvalo=adurom.com@lists.infradead.org To: johannes@sipsolutions.net Cc: Sebastian Gottschall , linux-wireless@vger.kernel.org, ath10k@lists.infradead.org, Kalle Valo Sm9oYW5uZXMsCgpJdCBzZWVtcyBsaWtlIGNvbW1pdCBkYjNiZGNiOWMzZmYgKCJtYWM4MDIxMTog YWxsb3cgQVBfVkxBTiBvcGVyYXRpb24gb24gCmNyeXB0byBjb250cm9sbGVkIGRldmljZXMiKSBo YXMgYnJva2VuIDQtYWRkciBvcGVyYXRpb24gb24gY3J5cHRvIApjb250cm9sbGVkIGRldmljZXMg YXMgcmVwb3J0ZWQgYnkgc2ViYXN0aWFuLgpUaGUgY29tbWl0IHdhcyBtYWlubHkgZm9jdXNlZCBp biBhZGRyZXNzaW5nIHRoZSBwcm9ibGVtIGluIHN1cHBvcnRpbmcgClZMQU5zIG9uIGNyeXB0byBj b250cm9sbGVkIGRldmljZXMgYnV0IHNpbmNlIDQtYWRkciBtb2RlIGlzIGFsc28gCmRlcGVuZGVu dCBvbiBBUF9WTEFOIGludGVyZmFjZSwgdGhpcyBjb21taXQgYnJlYWtzIHRoZSA0LWFkZHIgQVAg bW9kZS4KCkkgaGF2ZSBjb3VwbGUgb2YgaWRlYXMgb24gaG93IHRvIGFkZHJlc3MgdGhlIHByb2Js ZW0sCgoxKSBBZGQgYSBuZXcgaHdfZmxhZyBhbmQgYmFzZWQgb24gdGhlIGhhcmR3YXJlIGZsYWcs IGFsbG93L2Rpc2FsbG93IHRoZSAKY3JlYXRpb24gb2YgQVBfVkxBTiBpbnRlcmZhY2UuCgpkaWZm IC0tZ2l0IGEvaW5jbHVkZS9uZXQvbWFjODAyMTEuaCBiL2luY2x1ZGUvbmV0L21hYzgwMjExLmgK aW5kZXggZDIyNzliMi4uMzAxZDljMzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L21hYzgwMjEx LmgKKysrIGIvaW5jbHVkZS9uZXQvbWFjODAyMTEuaApAQCAtMjA4NCw2ICsyMDg0LDExIEBAIHN0 cnVjdCBpZWVlODAyMTFfdHhxIHsKICAgKiBASUVFRTgwMjExX0hXX0RPRVNOVF9TVVBQT1JUX1FP U19ORFA6IFRoZSBkcml2ZXIgKG9yIGZpcm13YXJlKSAKZG9lc24ndAogICAqICAgICBzdXBwb3J0 IFFvUyBORFAgZm9yIEFQIHByb2JpbmcgLSB0aGF0J3MgbW9zdCBsaWtlbHkgYSBkcml2ZXIgCmJ1 Zy4KICAgKgorICogQElFRUU4MDIxMV9IV19TVVBQT1JUU19TV19FTkNSWVBUOiBEZXZpY2UgaXMg Y2FwYWJsZSBvZiB0cmFuc21pdHRpbmcKKyAqICAgICBmcmFtZXMgZW5jcnlwdGVkIGluIHNvZnR3 YXJlLCBvbmx5IHZhbGlkIHdoZW4gU1dfQ1JZUFRPX0NPTlRST0wKKyAqICAgICBpcyBlbmFibGVk LiBCYXNlZCBvbiB0aGlzIGZsYWcsIG1hYzgwMjExIGNhbiBhbGxvdy9kaXNhbGxvdyBWTEFOCisg KiAgICAgb3BlcmF0aW9ucyBpbiB0aGUgQlNTLgorICoKICAgKiBATlVNX0lFRUU4MDIxMV9IV19G TEFHUzogbnVtYmVyIG9mIGhhcmR3YXJlIGZsYWdzLCB1c2VkIGZvciBzaXppbmcgCmFycmF5cwog ICAqLwogIGVudW0gaWVlZTgwMjExX2h3X2ZsYWdzIHsKQEAgLTIxMjksNiArMjEzNCw3IEBAIGVu dW0gaWVlZTgwMjExX2h3X2ZsYWdzIHsKICAgICAgICAgSUVFRTgwMjExX0hXX1NVUFBPUlRTX1RE TFNfQlVGRkVSX1NUQSwKICAgICAgICAgSUVFRTgwMjExX0hXX0RFQVVUSF9ORUVEX01HRF9UWF9Q UkVQLAogICAgICAgICBJRUVFODAyMTFfSFdfRE9FU05UX1NVUFBPUlRfUU9TX05EUCwKKyAgICAg ICBJRUVFODAyMTFfSFdfU1VQUE9SVFNfU1dfRU5DUllQVCwKCiAgICAgICAgIC8qIGtlZXAgbGFz dCwgb2J2aW91c2x5ICovCiAgICAgICAgIE5VTV9JRUVFODAyMTFfSFdfRkxBR1MKZGlmZiAtLWdp dCBhL25ldC9tYWM4MDIxMS9pZmFjZS5jIGIvbmV0L21hYzgwMjExL2lmYWNlLmMKaW5kZXggNTU1 ZTM4OS4uYzgyNWQyNyAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2lmYWNlLmMKKysrIGIvbmV0 L21hYzgwMjExL2lmYWNlLmMKQEAgLTE3MzYsNiArMTczNiwxMSBAQCBpbnQgaWVlZTgwMjExX2lm X2FkZChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsIAoqbG9jYWwsIGNvbnN0IGNoYXIgKm5hbWUsCgog ICAgICAgICBBU1NFUlRfUlROTCgpOwoKKyAgICAgICBpZiAoKHR5cGUgPT0gTkw4MDIxMV9JRlRZ UEVfQVBfVkxBTikgJiYgIXBhcmFtcy0+dXNlXzRhZGRyICYmCisgICAgICAgICAgIGllZWU4MDIx MV9od19jaGVjayhsb2NhbC0+aHcsIFNXX0NSWVBUT19DT05UUk9MKSAmJgorICAgICAgICAgICAh aWVlZTgwMjExX2h3X2NoZWNrKGxvY2FsLT5odywgU1VQUE9SVFNfU1dfRU5DUllQVCkpCisgICAg ICAgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKwogICAgICAgICBpZiAodHlwZSA9PSBOTDgw MjExX0lGVFlQRV9QMlBfREVWSUNFIHx8IHR5cGUgPT0gCk5MODAyMTFfSUZUWVBFX05BTikgewog ICAgICAgICAgICAgICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXY7CgoyKSBBbGxvdyBtYWM4 MDIxMSB0byBjYWxsIHNldF9rZXkgZm9yIEdUS3Mgb24gQVBfVkxBTiBpbnRlcmZhY2VzIGZvciAK Y3J5cHRvIGNvbnRyb2xsZWQgZGV2aWNlcywgbGV0IHRoZSBkcml2ZXIgZGVjaWRlIHdoZXRoZXIg dG8gcmV0dXJuICcxJyAKb3Igc29tZSBlcnJvciBjb2RlIGJhc2VkIG9uIHRoZWlyIHN1cHBvcnQg Zm9yIHRyYW5zbWl0dGluZyBzdyBlbmNyeXB0ZWQgCmZyYW1lcy4gSSBhbSBsaXR0bGUgc2tlcHRp Y2FsIHdpdGggdGhpcyBhcHByb2FjaCBhcyBkcml2ZXJzIGFyZSB0b3RhbGx5IAp1bmF3YXJlIG9m IEFQX1ZMQU4gaW50ZXJmYWNlcy4KCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEva2V5LmMgYi9u ZXQvbWFjODAyMTEva2V5LmMKaW5kZXggZWUwZDBjYy4uMGZmNTU5NyAxMDA2NDQKLS0tIGEvbmV0 L21hYzgwMjExL2tleS5jCisrKyBiL25ldC9tYWM4MDIxMS9rZXkuYwpAQCAtMTY3LDcgKzE2Nyw4 IEBAIHN0YXRpYyBpbnQgaWVlZTgwMjExX2tleV9lbmFibGVfaHdfYWNjZWwoc3RydWN0IAppZWVl ODAyMTFfa2V5ICprZXkpCiAgICAgICAgICAgICAgICAgICogVGhlIGRyaXZlciBkb2Vzbid0IGtu b3cgYW55dGhpbmcgYWJvdXQgVkxBTiAKaW50ZXJmYWNlcy4KICAgICAgICAgICAgICAgICAgKiBI ZW5jZSwgZG9uJ3Qgc2VuZCBHVEtzIGZvciBWTEFOIGludGVyZmFjZXMgdG8gdGhlIApkcml2ZXIu CiAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICBpZiAoIShrZXktPmNvbmYuZmxh Z3MgJiBJRUVFODAyMTFfS0VZX0ZMQUdfUEFJUldJU0UpKQorICAgICAgICAgICAgICAgaWYgKCgh KGtleS0+Y29uZi5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19QQUlSV0lTRSkgJiYKKyAgICAg ICAgICAgICAgICAgICAhaWVlZTgwMjExX2h3X2NoZWNrKCZrZXktPmxvY2FsLT5odywgClNXX0NS WVBUT19DT05UUk9MKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG91dF91bnN1cHBv cnRlZDsKICAgICAgICAgfQoKUGxlYXNlIGxldCBtZSBrbm93IHdoaWNoIGlzIHRoZSBiZXR0ZXIg d2F5IHRvIGRlYWwgdGhlIHByb2JsZW0uCgpUaGFua3MsCk1hbmlrYW50YQoKCk9uIDIwMTgtMDQt MjQgMTQ6MzksIFNlYmFzdGlhbiBHb3R0c2NoYWxsIHdyb3RlOgo+IGNvbnNpZGVyIG15IGNvbW1l bnQgcmVnYXJkaW5nIHZsYW5fYXAuCj4gdGhpcyBwYXRjaCB3aWxsIGJyZWFrIHdkcyBhcCAvIHdk cyBzdGEgc3VwcG9ydCB3aXRoIGxhdGVzdCBtYWM4MDIxMQo+IChzZWUgYWxzbyBteSBwb3N0IG9u IHRoZSB3aXJlbGVzcyBtYWlsaW5nIGxpc3QgYWJvdXQgdGhlIGJyZWFraW5nCj4gcGF0Y2ggaW4g bWFjODAyMTEpCj4gc28gQVBfVkxBTiBtdXN0IGJlIG1hc2tlZCBhbHdheXMgZm9yIGFsbCBjaGlw c2V0cy4gb3RoZXJ3aXNlIHdkcwo+IGJyZWFrcyBhbmQgdGhpcyBpcyBub3QganVzdCBhIGd1ZXNz LiBpIHRlc3RlZCBpdCB5ZXN0ZXJkYXkgdXNpbmcgdGhpcwo+IHBhdGNoIGFuZCBmb3VuZAo+IHRo ZSBjYXVzZSBvZiB0aGUgaXNzdWUKPiAKPiB0aGUgZm9sbG93aW5nIGxpbmVzCj4gCj4gwqAgK8Kg wqDCoCBpZiAodGVzdF9iaXQoV01JX1NFUlZJQ0VfUEVSX1BBQ0tFVF9TV19FTkNSWVBULCAKPiBh ci0+d21pLnN2Y19tYXApKSB7Cj4gK8KgwqDCoMKgwqDCoMKgIGFyLT5ody0+d2lwaHktPmludGVy ZmFjZV9tb2RlcyB8PSBCSVQoTkw4MDIxMV9JRlRZUEVfQVBfVkxBTik7Cj4gK8KgwqDCoMKgwqDC oMKgIGFyLT5ody0+d2lwaHktPnNvZnR3YXJlX2lmdHlwZXMgfD0gCj4gQklUKE5MODAyMTFfSUZU WVBFX0FQX1ZMQU4pOwo+ICvCoMKgwqAgfQo+IAo+IAo+IG11c3QgYmUganVzdAo+IAo+ICvCoMKg wqDCoMKgwqDCoCBhci0+aHctPndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgfD0gQklUKE5MODAyMTFf SUZUWVBFX0FQX1ZMQU4pOwo+ICvCoMKgwqDCoMKgwqDCoCBhci0+aHctPndpcGh5LT5zb2Z0d2Fy ZV9pZnR5cGVzIHw9IAo+IEJJVChOTDgwMjExX0lGVFlQRV9BUF9WTEFOKTsKPiAKPiBldmVydGhp bmcgZWxzZSB3aWxsIGNhdXNlIGEgcmVncmVzc2lvbgo+IAo+IEFtIDI0LjA0LjIwMTggdW0gMTA6 MDkgc2NocmllYiBLYWxsZSBWYWxvOgo+PiBNYW5pa2FudGEgUHViYmlzZXR0eSA8bXB1YmJpc2VA Y29kZWF1cm9yYS5vcmc+IHdyaXRlczoKPj4gCj4+PiBNdXRsaWNhc3QvYnJvYWRjYXN0IHRyYWZm aWMgZGVzdGluZWQgZm9yIGEgcGFydGljdWxhciB2bGFuIGdyb3VwIHdpbGwKPj4+IGFsd2F5cyBi ZSBlbmNyeXB0ZWQgaW4gc29mdHdhcmUuIFRvIGVuYWJsZSBkeW5hbWljIFZMQU5zLCBpdCByZXF1 aXJlcwo+Pj4gZHJpdmVyIHN1cHBvcnQgZm9yIHNlbmRpbmcgc29mdHdhcmUgZW5jcnlwdGVkIHBh Y2tldHMuCj4+PiAKPj4+IEluIGF0aDEwaywgc2VuZGluZyBzdyBlbmNyeXB0ZWQgZnJhbWVzIGlz IGFsbG93ZWQgb25seSB3aGVuIHdlIGluc21vZAo+Pj4gdGhlIGRyaXZlciB3aXRoIGNyeXB0bW9k ZSBwYXJhbSBzZXQgdG8gMSwgdGhpcyBjb25maWd1cmF0aW9uIGRpc2FibGVzCj4+PiBoYXJkd2Fy ZSBjcnlwdG8gYW5kIGVuYWJsZXMgUkFXIG1vZGUgaW1wbGljaXRseS4gU2luY2UsIGVuYWJsaW5n IHJhdwo+Pj4gbW9kZSBoYXMgcGVyZm9ybWFuY2UgaW1wYWN0LCB0aGlzIGNhbm5vdCBiZSBjb25z aWRlcmVkIGFzIGFuIGlkZWFsCj4+PiBzb2x1dGlvbiBmb3Igc3VwcG9ydGluZyBWTEFOcyBpbiB0 aGUgZHJpdmVyLgo+Pj4gCj4+PiBBcyBhbiBhbHRlcm5hdGl2ZSB0YWtlLCBpbiB0aGlzIGFwcHJv YWNoLCBjcnlwdG9ncmFwaGljIGtleXMgZm9yCj4+PiB1bmljYXN0IHRyYWZmaWMocGVyIHBlZXIg UFRLcykgYW5kIGtleXMgZm9yIG5vbi12bGFuIGdyb3VwIHRyYWZmaWMKPj4+IHdpbGwgYmUgY29u ZmlndXJlZCBpbiBoYXJkd2FyZSwgYWxsb3dpbmcgaGFyZHdhcmUgZW5jcnlwdGlvbiBmb3IgCj4+ PiB1bmljYXN0Cj4+PiBhbmQgbm9uLXZsYW4gZ3JvdXAgdHJhZmZpYy4gT25seSB2bGFuIGdyb3Vw IHRyYWZmaWMgd2lsbCBiZSBlbmNyeXB0ZWQgCj4+PiBpbgo+Pj4gc29mdHdhcmUgYW5kIHB1c2hl ZCB0byB0aGUgdGFyZ2V0IHdpdGggZW5jYXAgbW9kZSBzZXQgdG8gUkFXIGluIHRoZSAKPj4+IFRY Cj4+PiBkZXNjcmlwdG9ycy4KPj4+IAo+Pj4gTm90IGFsbCBmaXJtd2FyZXMgY2FuIHN1cHBvcnQg dGhpcyB0eXBlIG9mIGtleSBjb25maWd1cmF0aW9uKGhhdmluZyAKPj4+IGZldwo+Pj4ga2V5cyBp bnN0YWxsZWQgaW4gaGFyZHdhcmUgYW5kIGZldyBvbmx5IGluIHNvZnR3YXJlKTsgZm9yIHRoaXMg Cj4+PiBwdXJwb3NlIGEKPj4+IG5ldyBXTUkgc2VydmljZSBmbGFnICJXTUlfU0VSVklDRV9QRVJf UEFDS0VUX1NXX0VOQ1JZUFQiIGlzIAo+Pj4gaW50cm9kdWNlZCB0bwo+Pj4gYWR2ZXJ0aXNlIHRo aXMgc3VwcG9ydC4KPj4+IAo+Pj4gQWxzbywgYWRkaW5nIHRoZSBsb2dpYyByZXF1aXJlZCB0byBz ZW5kIHN3IGVuY3J5cHRlZCBmcmFtZXMgaW4gcmF3IAo+Pj4gbW9kZS4KPj4+IAo+Pj4gVGVzdGVk IHRoaXMgY2hhbmdlIG9uIFFDQTk5ODQoZmlybXdhcmUgdmVyc2lvbiAxMC40LTMuNS4zLTAwMDU3 KS4KPj4+IAo+Pj4gU2lnbmVkLW9mZi1ieTogTWFuaWthbnRhIFB1YmJpc2V0dHkgPG1wdWJiaXNl QGNvZGVhdXJvcmEub3JnPgo+PiBZb3VyIG5hbWUgaW4gcGF0Y2h3b3JrIGlzIHdyb25nIGFuZCBo ZW5jZSBteSBzY3JpcHQgdXNlcyB0aGUgd3JvbmcKPj4gbmFtZS4gUGxlYXNlIGZpeCBpdCBieSBy ZWdpc3RlcmluZyB0byBwYXRjaHdvcmtbMV0gd2hlcmUgaXQncyBwb3NzaWJsZQo+PiB0byBjaGFu Z2UgeW91ciBuYW1lIGR1cmluZyByZWdpc3RyYXRpb24sIGJ1dCBvbmx5IG9uZSB0aW1lLiBJZiB0 aGF0Cj4+IGRvZXNuJ3Qgd29yayB0aGVuIHNlbmQgYSByZXF1ZXN0IHRvIGhlbHBkZXNrQGtlcm5l bC5vcmcgYW5kIHRoZSBhZG1pbnMKPj4gY2FuIGZpeCBpdC4KPj4gCj4+IFsxXSBodHRwczovL3Bh dGNod29yay5rZXJuZWwub3JnL3JlZ2lzdGVyLwo+PiAKCl9fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fCmF0aDEwayBtYWlsaW5nIGxpc3QKYXRoMTBrQGxpc3Rz LmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5m by9hdGgxMGsK