From owner-freebsd-net@FreeBSD.ORG Tue Oct 23 18:26:00 2012 Return-Path: Delivered-To: freebsd-net@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 9A6E6A05 for ; Tue, 23 Oct 2012 18:26:00 +0000 (UTC) (envelope-from seb@lineratesystems.com) Received: from mail-pa0-f54.google.com (mail-pa0-f54.google.com [209.85.220.54]) by mx1.freebsd.org (Postfix) with ESMTP id 5D34C8FC14 for ; Tue, 23 Oct 2012 18:26:00 +0000 (UTC) Received: by mail-pa0-f54.google.com with SMTP id bi1so3094907pad.13 for ; Tue, 23 Oct 2012 11:25:59 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type :x-gm-message-state; bh=tF6y2yvqSBIx4m6oKAtuZl3jC5GeNGi4iYpIK+3eZOM=; b=OAvUNY2DSZH81Lcfqxyw0aK5f64d8zbaYS24l1gwUCPT1OOxMAPtfN9V1ifL2E0OoH 0nh5KYIpVtB7JXVms3Znb4HSHSy0mZulfC1Iu+UzWavNWZSSXAcLhVYVrMYwMzESrSSs ppCjHhVxFOtw81RDbsOwWs+MrYMoPBbawAT/xuiRGsnqQEu5d+mJ2q1ZV3MeE4nqZ5fk IfVI0+zEtLmZ5w/6Y8B9ioNGGC33njTBrcYnNBWn0hPobl525jpfUkPV/6z66GE+QLtr dhzCcTEGtI9ieWNOvCxm+JKn8VTaD5JsvpMChag6Knx6JQUXB9PuRBAr0jtO0EgeuzDm MffA== MIME-Version: 1.0 Received: by 10.69.0.10 with SMTP id au10mr43023031pbd.18.1351016759882; Tue, 23 Oct 2012 11:25:59 -0700 (PDT) Received: by 10.68.85.137 with HTTP; Tue, 23 Oct 2012 11:25:59 -0700 (PDT) Date: Tue, 23 Oct 2012 12:25:59 -0600 Message-ID: Subject: fragmentation problem in FreeBSD 7 From: Sebastian Kuzminsky To: freebsd-net@freebsd.org Content-Type: multipart/mixed; boundary=047d7b1605050ef51d04ccbe1a2c X-Gm-Message-State: ALoCoQks9Dvq3W0Sw6FRRixUE+sMiqtL5XMl5Sl64QN9XHN3vWbDWArwUGNbbMggyX6nzWtoUhd9 X-Content-Filtered-By: Mailman/MimeDel 2.1.14 X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 23 Oct 2012 18:26:00 -0000 --047d7b1605050ef51d04ccbe1a2c Content-Type: text/plain; charset=ISO-8859-1 Hi folks, this is my first post to freebsd-net, and my first bug-fix submission... I hope this is the right mailing list for this issue, and the right format for sending in patches.... I'm working on a derivative of FreeBSD 7. I've run into a problem with IP header checksums when fragmenting to an e1000 (em) interface, and I've narrowed it down to a very simple test. The test setup is like this: [computer A]---(network 1)---[computer B]---(network 2)---[computer C] That gorgeous drawing shows computer A connected to computer B via network 1, and computer B connected to computer C via network 2. Computer B is set up to forward packets between networks 1 and 2. A can see B but not C. C can see B but not A. B forwards between A and C. Pretty simple. One of B's NICs is a Broadcom, handled by the bce driver; this one works fine in all my testing. B's other NIC is an Intel PRO/1000 handled by the em driver. This is the one giving me trouble. The test disables PMTUD on all three hosts. It then sets the MTU of the bce and em interfaces to the unrealistically low value of 72 bytes, and tries to pass TCP packets back and forth using nc on computers A and C (with computer B acting as a gateway). This is to force the B gateway to fragment the TCP frames it forwards. Receiving on the em and sending on the bce works just fine (as noted above). Small TCP frames that fit in the MTU, big TCP frames that get fragmented, no problems. Receiving on the bce and sending on the em interface works fine for small TCP frames that don't need fragmentation, but when B has to fragment the IP packets before sending them out the em, the IP header checksums in the IP packets that appear on the em's wires are wrong. I came to this conclusion by packet capture and by watching the 'bad header checksums' counter of 'netstat -s -p ip', both running on the computer receiving the fragments. Ok, those are all my observations, next comes thoughts about the cause & a proposed fix. The root of the problem is two-fold: 1. ip_output.c:ip_fragment() does not clear the CSUM_IP flag in the mbuf when it does software IP checksum computation, so the mbuf still looks like it needs IP checksumming. 2. The em driver does not advertise IP checksum offloading, but still checks the CSUM_IP flag in the mbuf and modifies the packet when that flag is set (this is in em_transmit_checksum_setup(), called by em_xmit()). Unfortunately the em driver gets the checksum wrong in this case, i guess that's why it doesn't advertise this capability in its if_hwassist! So the fragments that ip_fastfwd.c:ip_fastforward() gets from ip_output.c:ip_fragment() have ip->ip_sum set correctly, but the mbuf->m_pkthdr.csum_flags incorrectly has CSUM_IP still set, and this causes the em driver to emit incorrect packets. There are some other callers of ip_fragment(), notably ip_output(). ip_output() clears CSUM_IP in the mbuf csum_flags itself if it's not in if_hwassist, so avoids this problem. So, the fix is simple: clear the mbuf's CSUM_IP when computing ip->ip_sum in ip_fragment(). The first attached patch (against gitorious/svn_stable_7) does this. In looking at this issue, I noticed that ip_output()'s use of sw_csum is inconsistent. ip_output() splits the mbuf's csum_flags into two parts: the stuff that hardware will assist with (these flags get left in the mbuf) and the stuff that software needs to do (these get moved to sw_csum). But later ip_output() calls functions that don't get sw_csum, or that don't know to look in it and look in the mbuf instead. My second patch fixes these kinds of issues and (IMO) simplifies the code by leaving all the packet's checksumming needs in the mbuf, getting rid of sw_csum entirely. -- Sebastian Kuzminsky Linerate Systems --047d7b1605050ef51d04ccbe1a2c Content-Type: application/octet-stream; name="0001-Update-the-mbuf-csum_flags-of-IP-fragments-when-comp.patch" Content-Disposition: attachment; filename="0001-Update-the-mbuf-csum_flags-of-IP-fragments-when-comp.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_h8nbm4sn0 RnJvbSBjMDRhN2E5NTg5MGVmNWQwMzJlNjk5ODY3NTQ5NmJiNDM4YzNhMTRiIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBTZWJhc3RpYW4gS3V6bWluc2t5IDxzZWJAbGluZXJhdGVzeXN0 ZW1zLmNvbT4KRGF0ZTogTW9uLCAyMiBPY3QgMjAxMiAyMTowODo0MCAtMDYwMApTdWJqZWN0OiBb UEFUQ0ggMS8yXSBVcGRhdGUgdGhlIG1idWYgY3N1bV9mbGFncyBvZiBJUCBmcmFnbWVudHMgd2hl bgogY29tcHV0aW5nIHRoZWlyIElQIGNoZWNrc3VtCgpCZWZvcmUgdGhpcyBjb21taXQsIHRoZSBp cF9mcmFnbWVudCgpIGZ1bmN0aW9uIGRvZXMgbm90IGNsZWFyIHRoZQptYnVmIENTVU1fSVAgZmxh ZyAoInRoaXMgbWJ1ZiBuZWVkcyBhbiBJUCBoZWFkZXIgY2hlY2tzdW0iKSwgZXZlbgp3aGVuIGl0 IGNvbXB1dGVzIHRoZSBJUCBoZWFkZXIgY2hlY2tzdW0gaXRzZWxmLiAgVGhpcyBiZWhhdmlvciBp cwphY2NlcHRhYmxlIHdoZW4gaXBfZnJhZ21lbnQoKSBpcyBjYWxsZWQgZnJvbSBpcF9vdXRwdXQo KSwgYmVjYXVzZQppcF9vdXRwdXQoKSBjbGVhcnMgdGhlIG1idWYncyBmbGFnLiAgQnV0IGl0IGlz IG5vdCBhY2NlcHRhYmxlIHdoZW4KaXBfZnJhZ21lbnQoKSBpcyBjYWxsZWQgZnJvbSBpcF9mYXN0 Zm9yd2FyZCgpLCBiZWNhdXNlIGlwX2Zhc3Rmb3J3YXJkKCkKZG9lcyBub3QgY2xlYXIgdGhlIG1i dWYncyBmbGFnLgoKVGhlIHJlc3VsdCBpcyB0aGF0LCB3aGVuIGZvcndhcmRpbmcgYSBwYWNrZXQg dGhhdCBuZWVkcyBmcmFnbWVudGF0aW9uLAphbmQgdGhlIGZyYWdtZW50cyBhcmUgc2VudCBieSBh IE5JQyB0aGF0IGRvZXMgbm90IGFkdmVydGlzZSBoYXJkd2FyZQpJUCBjaGVja3N1bSBvZmZsb2Fk aW5nLCBhbmQgdGhhdCBOSUMgKmRvZXMqIGNoZWNrIGZvciBmb3IgdGhlIENTVU1fSVAKZmxhZyBh bnl3YXkgYW5kIHRoZW4gZ2V0cyB0aGUgSVAgY2hlY2tzdW0gd3JvbmcsICp0aGVuKiB0aGUgZnJh Z21lbnRzCmdvaW5nIG91dCBvbiB0aGUgd2lyZSB3b3VsZCBoYXZlIHRoZSB3cm9uZyBjaGVja3N1 bS4KClRoZSBlbSBkcml2ZXIgZG9lcyBub3QgYWR2ZXJ0aXNlIElQIGhlYWRlciBjaGVja3N1bSBv ZmZsb2FkaW5nLCBidXQKZG9lcyB0cnkgdG8gc2V0IHVwIElQIGhlYWRlciBjaGVja3N1bSBvZmZs b2FkaW5nIGFueXdheSB3aGVuIHRoZQptYnVmIGlzIG1hcmtlZCBDU1VNX0lQLCBhbmQgaXQgZ2V0 cyB0aGUgSVAgY2hlY2tzdW0gd3JvbmcuCgpUaGUgZml4IGlzIHRvIGNsZWFyIHRoZSBDU1VNX0lQ IGZsYWcgaW4gdGhlIG1idWYgaW4gaXBfZnJhZ21lbnQoKQp3aGVuIHRoZSBJUCBjaGVja3N1bSBp cyBjb21wdXRlZCwgdG8gbGV0IHRoZSBsb3dlciBsYXllcnMga25vdyB0aGF0CnRoZXkgZG9uJ3Qg bmVlZCB0byBkbyBpdC4KLS0tCiBzeXMvbmV0aW5ldC9pcF9mYXN0ZndkLmMgfCAgICA5ICsrKysr KysrLQogc3lzL25ldGluZXQvaXBfb3V0cHV0LmMgIHwgICAzMCArKysrKysrKysrKysrKysrKysr KysrKysrKysrLS0KIDIgZmlsZXMgY2hhbmdlZCwgMzYgaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlv bnMoLSkKCmRpZmYgLS1naXQgYS9zeXMvbmV0aW5ldC9pcF9mYXN0ZndkLmMgYi9zeXMvbmV0aW5l dC9pcF9mYXN0ZndkLmMKaW5kZXggZTg0Njk1ZS4uYWU2NWJmZSAxMDA2NDQKLS0tIGEvc3lzL25l dGluZXQvaXBfZmFzdGZ3ZC5jCisrKyBiL3N5cy9uZXRpbmV0L2lwX2Zhc3Rmd2QuYwpAQCAtNTU4 LDEyICs1NTgsMTkgQEAgcGFzc291dDoKIAkJCWdvdG8gY29uc3VtZWQ7CiAJCX0gZWxzZSB7CiAJ CQkvKgotCQkJICogV2UgaGF2ZSB0byBmcmFnbWVudCB0aGUgcGFja2V0CisJCQkgKiBXZSBoYXZl IHRvIGZyYWdtZW50IHRoaXMgcGFja2V0LCBhbmQgdGhlIGZyYWdtZW50cworCQkJICogd2lsbCBu ZWVkIGFsbC1uZXcgSVAgY2hlY2tzdW1zLiAgKFRoZSBwYXlsb2FkCisJCQkgKiBjaGVja3N1bXMs IGlmIGFueSwgZG9uJ3QgbmVlZCB0byBiZSBtb2RpZmllZAorCQkJICogYmVjYXVzZSB0aGUgcGF5 bG9hZCB3aWxsIGJlIHJlYXNzZW1ibGVkIGJlZm9yZQorCQkJICogZGVsaXZlcnkuKQogCQkJICov CiAJCQltLT5tX3BrdGhkci5jc3VtX2ZsYWdzIHw9IENTVU1fSVA7CiAJCQkvKgogCQkJICogaXBf ZnJhZ21lbnQgZXhwZWN0cyBpcF9sZW4gYW5kIGlwX29mZiBpbiBob3N0IGJ5dGUKIAkJCSAqIG9y ZGVyIGJ1dCByZXR1cm5zIGFsbCBwYWNrZXRzIGluIG5ldHdvcmsgYnl0ZSBvcmRlcgorCQkJICog SWYgaWZfaHdhc3Npc3QgZG9lc24ndCBhZHZlcnRpc2UgSVAgY2hlY2tzdW0KKwkJCSAqIG9mZmxv YWRpbmcsIGFzayBpcF9mcmFnbWVudCB0byBkbyBpdCBmb3IgdXMgaW4KKwkJCSAqIHNvZnR3YXJl IG5vdy4KIAkJCSAqLwogCQkJaWYgKGlwX2ZyYWdtZW50KGlwLCAmbSwgbXR1LCBpZnAtPmlmX2h3 YXNzaXN0LAogCQkJCQkofmlmcC0+aWZfaHdhc3Npc3QgJiBDU1VNX0RFTEFZX0lQKSkpIHsKZGlm ZiAtLWdpdCBhL3N5cy9uZXRpbmV0L2lwX291dHB1dC5jIGIvc3lzL25ldGluZXQvaXBfb3V0cHV0 LmMKaW5kZXggYWRiYjA3NC4uMDhjNDE4NSAxMDA2NDQKLS0tIGEvc3lzL25ldGluZXQvaXBfb3V0 cHV0LmMKKysrIGIvc3lzL25ldGluZXQvaXBfb3V0cHV0LmMKQEAgLTUwNiwxMiArNTA2LDMwIEBA IHBhc3NvdXQ6CiAJCX0KIAl9CiAKKwkvKiBBbm5vdGF0ZSB0aGUgb3V0Z29pbmcgcGFja2V0OiBp dCBuZWVkcyBpdHMgSVAgaGVhZGVyIGNoZWNrc3VtbWVkLiAqLwogCW0tPm1fcGt0aGRyLmNzdW1f ZmxhZ3MgfD0gQ1NVTV9JUDsKKworCS8qIHN3X2NzdW0gaXMgZXZlcnl0aGluZyB0aGUgcGFja2V0 IG5lZWRzIHRoYXQgKndvbid0KiBiZSBkb25lIGluCisJICogaGFyZHdhcmUuCisJICovCiAJc3df Y3N1bSA9IG0tPm1fcGt0aGRyLmNzdW1fZmxhZ3MgJiB+aWZwLT5pZl9od2Fzc2lzdDsKKworCS8q IERvIHBheWxvYWQgY2hlY2tzdW1taW5nIGluIHNvZnR3YXJlLCBub3csIGlmIG5lZWRlZCAmIHdh bnRlZC4gKi8KIAlpZiAoc3dfY3N1bSAmIENTVU1fREVMQVlfREFUQSkgewogCQlpbl9kZWxheWVk X2Nrc3VtKG0pOwogCQlzd19jc3VtICY9IH5DU1VNX0RFTEFZX0RBVEE7CiAJfQorCisJLyogQ2xl YXIgYWxsIHRoZSBwYWNrZXQncyBuZWVkcyB0aGF0J2xsIGJlIGRvbmUgYnkgc29mdHdhcmUuCisJ ICogQXQgdGhpcyBwb2ludCB0aGUgcGFja2V0J3MgbmVlZHMgYXJlIChtX3BrdGhkci5jc3VtX2Zs YWdzIHwgc3dfY3N1bSksCisJICogYW5kIHNvZnR3YXJlIHNob3VsZCBkbyB0aGUgc3R1ZmYgaW4g c3dfY3N1bS4KKwkgKgorCSAqIEZJWE1FOiBUaGlzIGlzIGEgYnVnLCBzdHVmZiBpbiB0aGUgY29k ZSBwYXRocyBhZnRlciB0aGlzCisJICogKGZvciBleGFtcGxlIGlwX2ZyYWdtZW50KSBleHBlY3Qg bV9wa3RoZHItPmNzdW1fZmxhZ3MgdG8gYmUgdGhlCisJICogbGlzdCBvZiBzdHVmZiB0aGUgcGFj a2V0IG5lZWRzLiAgaW5fZGVsYXllZF9ja3N1bSgpIGFib3ZlIGFsc28KKwkgKiBoYXMgdGhpcyBl eHBlY3RhdGlvbiwgd2hpY2ggaXMgd2h5IHRoaXMgY29kZSBpcyBjb252b2x1dGVkIHRvCisJICog Y2FsbCBpdCBiZWZvcmUgY2xlYXJpbmcgbSdzIGNzdW1fZmxhZ3MuCisJICovCiAJbS0+bV9wa3Ro ZHIuY3N1bV9mbGFncyAmPSBpZnAtPmlmX2h3YXNzaXN0OwogCiAJLyoKQEAgLTUyNiw2ICs1NDQs MTAgQEAgcGFzc291dDoKIAkJaXAtPmlwX3N1bSA9IDA7CiAJCWlmIChzd19jc3VtICYgQ1NVTV9E RUxBWV9JUCkKIAkJCWlwLT5pcF9zdW0gPSBpbl9ja3N1bShtLCBobGVuKTsKKwkJCS8qIE5vcm1h bGx5IHdlJ2QgY2xlYXIgQ1NVTV9ERUxBWV9JUCBvdXQgb2Ygc3dfY3N1bQorCQkJICogaGVyZSwg YnV0IHRoYXQgdmFyaWFibGUgaXMgbm90IHVzZWQgYWdhaW4gYmVmb3JlCisJCQkgKiBpdCBwYXNz ZXMgb3V0IG9mIHNjb3BlLgorCQkJICovCiAKIAkJLyoKIAkJICogUmVjb3JkIHN0YXRpc3RpY3Mg Zm9yIHRoaXMgaW50ZXJmYWNlIGFkZHJlc3MuCkBAIC03NDMsOCArNzY1LDEwIEBAIHNtYXJ0X2Zy YWdfZmFpbHVyZToKIAkJbS0+bV9wa3RoZHIuY3N1bV9mbGFncyA9IG0wLT5tX3BrdGhkci5jc3Vt X2ZsYWdzOwogCQltaGlwLT5pcF9vZmYgPSBodG9ucyhtaGlwLT5pcF9vZmYpOwogCQltaGlwLT5p cF9zdW0gPSAwOwotCQlpZiAoc3dfY3N1bSAmIENTVU1fREVMQVlfSVApCisJCWlmIChzd19jc3Vt ICYgQ1NVTV9ERUxBWV9JUCkgewogCQkJbWhpcC0+aXBfc3VtID0gaW5fY2tzdW0obSwgbWhsZW4p OworCQkJbS0+bV9wa3RoZHIuY3N1bV9mbGFncyAmPSB+Q1NVTV9ERUxBWV9JUDsKKwkJfQogCQkq bW5leHQgPSBtOwogCQltbmV4dCA9ICZtLT5tX25leHRwa3Q7CiAJfQpAQCAtNzY0LDggKzc4OCwx MCBAQCBzbWFydF9mcmFnX2ZhaWx1cmU6CiAJaXAtPmlwX29mZiB8PSBJUF9NRjsKIAlpcC0+aXBf b2ZmID0gaHRvbnMoaXAtPmlwX29mZik7CiAJaXAtPmlwX3N1bSA9IDA7Ci0JaWYgKHN3X2NzdW0g JiBDU1VNX0RFTEFZX0lQKQorCWlmIChzd19jc3VtICYgQ1NVTV9ERUxBWV9JUCkgewogCQlpcC0+ aXBfc3VtID0gaW5fY2tzdW0obTAsIGhsZW4pOworCQltMC0+bV9wa3RoZHIuY3N1bV9mbGFncyAm PSB+Q1NVTV9ERUxBWV9JUDsKKwl9CiAKIGRvbmU6CiAJKm1fZnJhZyA9IG0wOwotLSAKMS43Ljgu MwoK --047d7b1605050ef51d04ccbe1a2c Content-Type: application/octet-stream; name="0002-Simplify-the-tracking-of-mbuf-checksumming-needs.patch" Content-Disposition: attachment; filename="0002-Simplify-the-tracking-of-mbuf-checksumming-needs.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_h8nbm4ss1 RnJvbSBlYmJiZDdhZDY0YTFjYWZkOWE0YjExODJlZGUxODJmYmMzNzNiNTI5IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBTZWJhc3RpYW4gS3V6bWluc2t5IDxzZWJAbGluZXJhdGVzeXN0 ZW1zLmNvbT4KRGF0ZTogVHVlLCAyMyBPY3QgMjAxMiAxMDo1OToyMCAtMDYwMApTdWJqZWN0OiBb UEFUQ0ggMi8yXSBTaW1wbGlmeSB0aGUgdHJhY2tpbmcgb2YgbWJ1ZiBjaGVja3N1bW1pbmcgbmVl ZHMKClRoZSBJUCBjb2RlIHRyYWNrcyBvdXRnb2luZyBwYWNrZXRzJyBjaGVja3N1bW1pbmcgbmVl ZHMgaW5jb25zaXN0ZW50bHkuClRoZSBzd19jc3VtIHZhcmlhYmxlIGNvbXBsaWNhdGVzIGJ1dCBk b2VzIG5vdCBhZGQgdmFsdWUuCgpUaGUgc3dfY3N1bSB2YXJpYWJsZSBpcyBub3QgbmVlZGVkLiAg VGhpcyBjb21taXQgcmVtb3ZlcyBpdC4gIFRoZQptYnVmJ3MgbV9wa3RoZHItPmNzdW1fZmxhZ3Mg YXJlIG5vdyB0aGUgb25lIHJlY29yZCBvZiB3aGF0IHRoZQpwYWNrZXQgbmVlZHMuCi0tLQogc3lz L2NvbnRyaWIvcGYvbmV0L3BmLmMgIHwgICAxNCArKysrKy0tLS0tLS0tLQogc3lzL25ldC9pZl9i cmlkZ2UuYyAgICAgIHwgICAgOCArKysrKystLQogc3lzL25ldGluZXQvaXBfZmFzdGZ3ZC5jIHwg ICAgMyArLS0KIHN5cy9uZXRpbmV0L2lwX21yb3V0ZS5jICB8ICAgIDMgKystCiBzeXMvbmV0aW5l dC9pcF9vdXRwdXQuYyAgfCAgIDQwICsrKysrKysrKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KIHN5cy9uZXRpbmV0L2lwX3Zhci5oICAgICB8ICAgIDIgKy0KIDYgZmlsZXMgY2hhbmdl ZCwgMjUgaW5zZXJ0aW9ucygrKSwgNDUgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3lzL2Nv bnRyaWIvcGYvbmV0L3BmLmMgYi9zeXMvY29udHJpYi9wZi9uZXQvcGYuYwppbmRleCAyMGU5MjVi Li4wY2RkMjE3IDEwMDY0NAotLS0gYS9zeXMvY29udHJpYi9wZi9uZXQvcGYuYworKysgYi9zeXMv Y29udHJpYi9wZi9uZXQvcGYuYwpAQCAtNjI1Myw5ICs2MjUzLDYgQEAgcGZfcm91dGUoc3RydWN0 IG1idWYgKiptLCBzdHJ1Y3QgcGZfcnVsZSAqciwgaW50IGRpciwgc3RydWN0IGlmbmV0ICpvaWZw LAogCXN0cnVjdCBwZl9hZGRyCQkgbmFkZHI7CiAJc3RydWN0IHBmX3NyY19ub2RlCSpzbiA9IE5V TEw7CiAJaW50CQkJIGVycm9yID0gMDsKLSNpZmRlZiBfX0ZyZWVCU0RfXwotCWludCBzd19jc3Vt OwotI2VuZGlmCiAjaWZkZWYgSVBTRUMKIAlzdHJ1Y3QgbV90YWcJCSptdGFnOwogI2VuZGlmIC8q IElQU0VDICovCkBAIC02MzYxLDggKzYzNTgsNyBAQCBwZl9yb3V0ZShzdHJ1Y3QgbWJ1ZiAqKm0s IHN0cnVjdCBwZl9ydWxlICpyLCBpbnQgZGlyLCBzdHJ1Y3QgaWZuZXQgKm9pZnAsCiAjaWZkZWYg X19GcmVlQlNEX18KIAkvKiBDb3BpZWQgZnJvbSBGcmVlQlNEIDUuMS1DVVJSRU5UIGlwX291dHB1 dC4gKi8KIAltMC0+bV9wa3RoZHIuY3N1bV9mbGFncyB8PSBDU1VNX0lQOwotCXN3X2NzdW0gPSBt MC0+bV9wa3RoZHIuY3N1bV9mbGFncyAmIH5pZnAtPmlmX2h3YXNzaXN0OwotCWlmIChzd19jc3Vt ICYgQ1NVTV9ERUxBWV9EQVRBKSB7CisJaWYgKG0wLT5tX3BrdGhkci5jc3VtX2ZsYWdzICYgQ1NV TV9ERUxBWV9EQVRBICYgfmlmcC0+aWZfaHdhc3Npc3QpIHsKIAkJLyoKIAkJICogWFhYOiBpbl9k ZWxheWVkX2Nrc3VtIGFzc3VtZXMgSEJPIGZvciBpcC0+aXBfbGVuIChhdCBsZWFzdCkKIAkJICov CkBAIC02MzcxLDkgKzYzNjcsOCBAQCBwZl9yb3V0ZShzdHJ1Y3QgbWJ1ZiAqKm0sIHN0cnVjdCBw Zl9ydWxlICpyLCBpbnQgZGlyLCBzdHJ1Y3QgaWZuZXQgKm9pZnAsCiAJCWluX2RlbGF5ZWRfY2tz dW0obTApOwogCQlIVE9OUyhpcC0+aXBfbGVuKTsKIAkJSFRPTlMoaXAtPmlwX29mZik7Ci0JCXN3 X2NzdW0gJj0gfkNTVU1fREVMQVlfREFUQTsKKwkJbTAtPm1fcGt0aGRyLmNzdW1fZmxhZ3MgJj0g fkNTVU1fREVMQVlfREFUQTsKIAl9Ci0JbTAtPm1fcGt0aGRyLmNzdW1fZmxhZ3MgJj0gaWZwLT5p Zl9od2Fzc2lzdDsKIAogCWlmIChudG9ocyhpcC0+aXBfbGVuKSA8PSBpZnAtPmlmX210dSB8fAog CSAgICAobTAtPm1fcGt0aGRyLmNzdW1fZmxhZ3MgJiBpZnAtPmlmX2h3YXNzaXN0ICYgQ1NVTV9U U08pICE9IDAgfHwKQEAgLTYzODQsNyArNjM3OSw3IEBAIHBmX3JvdXRlKHN0cnVjdCBtYnVmICoq bSwgc3RydWN0IHBmX3J1bGUgKnIsIGludCBkaXIsIHN0cnVjdCBpZm5ldCAqb2lmcCwKIAkJICog aXAtPmlwX29mZiA9IGh0b25zKGlwLT5pcF9vZmYpOwogCQkgKi8KIAkJaXAtPmlwX3N1bSA9IDA7 Ci0JCWlmIChzd19jc3VtICYgQ1NVTV9ERUxBWV9JUCkgeworCQlpZiAobTAtPm1fcGt0aGRyLmNz dW1fZmxhZ3MgJiBDU1VNX0RFTEFZX0lQICYgfmlmcC0+aWZfaHdhc3Npc3QpIHsKIAkJCS8qIEZy b20gS0FNRSAqLwogCQkJaWYgKGlwLT5pcF92ID09IElQVkVSU0lPTiAmJgogCQkJICAgIChpcC0+ aXBfaGwgPDwgMikgPT0gc2l6ZW9mKCppcCkpIHsKQEAgLTYzOTIsNiArNjM4Nyw3IEBAIHBmX3Jv dXRlKHN0cnVjdCBtYnVmICoqbSwgc3RydWN0IHBmX3J1bGUgKnIsIGludCBkaXIsIHN0cnVjdCBp Zm5ldCAqb2lmcCwKIAkJCX0gZWxzZSB7CiAJCQkJaXAtPmlwX3N1bSA9IGluX2Nrc3VtKG0wLCBp cC0+aXBfaGwgPDwgMik7CiAJCQl9CisJCQltMC0+bV9wa3RoZHIuY3N1bV9mbGFncyAmPSB+Q1NV TV9ERUxBWV9JUDsKIAkJfQogCQlQRl9VTkxPQ0soKTsKIAkJZXJyb3IgPSAoKmlmcC0+aWZfb3V0 cHV0KShpZnAsIG0wLCBzaW50b3NhKGRzdCksIHJvLT5yb19ydCk7CkBAIC02NDc4LDcgKzY0NzQs NyBAQCBwZl9yb3V0ZShzdHJ1Y3QgbWJ1ZiAqKm0sIHN0cnVjdCBwZl9ydWxlICpyLCBpbnQgZGly LCBzdHJ1Y3QgaWZuZXQgKm9pZnAsCiAJICovCiAJTlRPSFMoaXAtPmlwX2xlbik7CiAJTlRPSFMo aXAtPmlwX29mZik7Ci0JZXJyb3IgPSBpcF9mcmFnbWVudChpcCwgJm0wLCBpZnAtPmlmX210dSwg aWZwLT5pZl9od2Fzc2lzdCwgc3dfY3N1bSk7CisJZXJyb3IgPSBpcF9mcmFnbWVudChpcCwgJm0w LCBpZnAtPmlmX210dSwgaWZwLT5pZl9od2Fzc2lzdCk7CiAjZWxzZQogCWVycm9yID0gaXBfZnJh Z21lbnQobTAsIGlmcCwgaWZwLT5pZl9tdHUpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9zeXMvbmV0 L2lmX2JyaWRnZS5jIGIvc3lzL25ldC9pZl9icmlkZ2UuYwppbmRleCA0ZDFiOWRhLi5hMmEyYjBk IDEwMDY0NAotLS0gYS9zeXMvbmV0L2lmX2JyaWRnZS5jCisrKyBiL3N5cy9uZXQvaWZfYnJpZGdl LmMKQEAgLTMzNDcsOCArMzM0NywxMiBAQCBicmlkZ2VfZnJhZ21lbnQoc3RydWN0IGlmbmV0ICpp ZnAsIHN0cnVjdCBtYnVmICptLCBzdHJ1Y3QgZXRoZXJfaGVhZGVyICplaCwKIAkJZ290byBvdXQ7 CiAJaXAgPSBtdG9kKG0sIHN0cnVjdCBpcCAqKTsKIAotCWVycm9yID0gaXBfZnJhZ21lbnQoaXAs ICZtLCBpZnAtPmlmX210dSwgaWZwLT5pZl9od2Fzc2lzdCwKLQkJICAgIENTVU1fREVMQVlfSVAp OworCS8qIFdlJ3JlIGdvaW5nIHRvIGZyYWdtZW50IHRoZSBJUCBwYWNrZXQsIHRoZSBmcmFnbWVu dHMgd2lsbCBuZWVkCisJICogbmV3IElQIGNoZWNrc3Vtcy4KKwkgKi8KKwltLT5tX3BrdGhkci5j c3VtX2ZsYWdzIHw9IENTVU1fREVMQVlfSVA7CisKKwllcnJvciA9IGlwX2ZyYWdtZW50KGlwLCAm bSwgaWZwLT5pZl9tdHUsIGlmcC0+aWZfaHdhc3Npc3QpOwogCWlmIChlcnJvcikKIAkJZ290byBv dXQ7CiAKZGlmZiAtLWdpdCBhL3N5cy9uZXRpbmV0L2lwX2Zhc3Rmd2QuYyBiL3N5cy9uZXRpbmV0 L2lwX2Zhc3Rmd2QuYwppbmRleCBhZTY1YmZlLi44NTJlYThlIDEwMDY0NAotLS0gYS9zeXMvbmV0 aW5ldC9pcF9mYXN0ZndkLmMKKysrIGIvc3lzL25ldGluZXQvaXBfZmFzdGZ3ZC5jCkBAIC01NzIs OCArNTcyLDcgQEAgcGFzc291dDoKIAkJCSAqIG9mZmxvYWRpbmcsIGFzayBpcF9mcmFnbWVudCB0 byBkbyBpdCBmb3IgdXMgaW4KIAkJCSAqIHNvZnR3YXJlIG5vdy4KIAkJCSAqLwotCQkJaWYgKGlw X2ZyYWdtZW50KGlwLCAmbSwgbXR1LCBpZnAtPmlmX2h3YXNzaXN0LAotCQkJCQkofmlmcC0+aWZf aHdhc3Npc3QgJiBDU1VNX0RFTEFZX0lQKSkpIHsKKwkJCWlmIChpcF9mcmFnbWVudChpcCwgJm0s IG10dSwgaWZwLT5pZl9od2Fzc2lzdCkpIHsKIAkJCQlnb3RvIGRyb3A7CiAJCQl9CiAJCQlLQVNT RVJUKG0gIT0gTlVMTCwgKCJudWxsIG1idWYgYW5kIG5vIGVycm9yIikpOwpkaWZmIC0tZ2l0IGEv c3lzL25ldGluZXQvaXBfbXJvdXRlLmMgYi9zeXMvbmV0aW5ldC9pcF9tcm91dGUuYwppbmRleCBk NjBlOGJkLi5kYzViMGFmIDEwMDY0NAotLS0gYS9zeXMvbmV0aW5ldC9pcF9tcm91dGUuYworKysg Yi9zeXMvbmV0aW5ldC9pcF9tcm91dGUuYwpAQCAtMjYzMCw3ICsyNjMwLDggQEAgcGltX3JlZ2lz dGVyX3ByZXBhcmUoc3RydWN0IGlwICppcCwgc3RydWN0IG1idWYgKm0pCiAJaXAtPmlwX3N1bSA9 IGluX2Nrc3VtKG1iX2NvcHksIGlwLT5pcF9obCA8PCAyKTsKICAgICB9IGVsc2UgewogCS8qIEZy YWdtZW50IHRoZSBwYWNrZXQgKi8KLQlpZiAoaXBfZnJhZ21lbnQoaXAsICZtYl9jb3B5LCBtdHUs IDAsIENTVU1fREVMQVlfSVApICE9IDApIHsKKwltYl9jb3B5LT5tX3BrdGhkci5jc3VtX2ZsYWdz IHw9IENTVU1fREVMQVlfSVA7CisJaWYgKGlwX2ZyYWdtZW50KGlwLCAmbWJfY29weSwgbXR1LCAw KSAhPSAwKSB7CiAJICAgIG1fZnJlZW0obWJfY29weSk7CiAJICAgIHJldHVybiBOVUxMOwogCX0K ZGlmZiAtLWdpdCBhL3N5cy9uZXRpbmV0L2lwX291dHB1dC5jIGIvc3lzL25ldGluZXQvaXBfb3V0 cHV0LmMKaW5kZXggMDhjNDE4NS4uYzZmMmQyZCAxMDA2NDQKLS0tIGEvc3lzL25ldGluZXQvaXBf b3V0cHV0LmMKKysrIGIvc3lzL25ldGluZXQvaXBfb3V0cHV0LmMKQEAgLTExMiw3ICsxMTIsNyBA QCBpcF9vdXRwdXQoc3RydWN0IG1idWYgKm0sIHN0cnVjdCBtYnVmICpvcHQsIHN0cnVjdCByb3V0 ZSAqcm8sIGludCBmbGFncywKIAlpbnQgbGVuLCBlcnJvciA9IDA7CiAJc3RydWN0IHNvY2thZGRy X2luICpkc3QgPSBOVUxMOwkvKiBrZWVwIGNvbXBpbGVyIGhhcHB5ICovCiAJc3RydWN0IGluX2lm YWRkciAqaWEgPSBOVUxMOwotCWludCBpc2Jyb2FkY2FzdCwgc3dfY3N1bTsKKwlpbnQgaXNicm9h ZGNhc3Q7CiAJc3RydWN0IHJvdXRlIGlwcm91dGU7CiAJc3RydWN0IGluX2FkZHIgb2RzdDsKICNp ZmRlZiBJUEZJUkVXQUxMX0ZPUldBUkQKQEAgLTUwOSwyOSArNTA5LDEyIEBAIHBhc3NvdXQ6CiAJ LyogQW5ub3RhdGUgdGhlIG91dGdvaW5nIHBhY2tldDogaXQgbmVlZHMgaXRzIElQIGhlYWRlciBj aGVja3N1bW1lZC4gKi8KIAltLT5tX3BrdGhkci5jc3VtX2ZsYWdzIHw9IENTVU1fSVA7CiAKLQkv KiBzd19jc3VtIGlzIGV2ZXJ5dGhpbmcgdGhlIHBhY2tldCBuZWVkcyB0aGF0ICp3b24ndCogYmUg ZG9uZSBpbgotCSAqIGhhcmR3YXJlLgotCSAqLwotCXN3X2NzdW0gPSBtLT5tX3BrdGhkci5jc3Vt X2ZsYWdzICYgfmlmcC0+aWZfaHdhc3Npc3Q7Ci0KIAkvKiBEbyBwYXlsb2FkIGNoZWNrc3VtbWlu ZyBpbiBzb2Z0d2FyZSwgbm93LCBpZiBuZWVkZWQgJiB3YW50ZWQuICovCi0JaWYgKHN3X2NzdW0g JiBDU1VNX0RFTEFZX0RBVEEpIHsKKwlpZiAobS0+bV9wa3RoZHIuY3N1bV9mbGFncyAmIENTVU1f REVMQVlfREFUQSAmIH5pZnAtPmlmX2h3YXNzaXN0KSB7CiAJCWluX2RlbGF5ZWRfY2tzdW0obSk7 Ci0JCXN3X2NzdW0gJj0gfkNTVU1fREVMQVlfREFUQTsKKwkJbS0+bV9wa3RoZHIuY3N1bV9mbGFn cyAmPSB+Q1NVTV9ERUxBWV9EQVRBOwogCX0KIAotCS8qIENsZWFyIGFsbCB0aGUgcGFja2V0J3Mg bmVlZHMgdGhhdCdsbCBiZSBkb25lIGJ5IHNvZnR3YXJlLgotCSAqIEF0IHRoaXMgcG9pbnQgdGhl IHBhY2tldCdzIG5lZWRzIGFyZSAobV9wa3RoZHIuY3N1bV9mbGFncyB8IHN3X2NzdW0pLAotCSAq IGFuZCBzb2Z0d2FyZSBzaG91bGQgZG8gdGhlIHN0dWZmIGluIHN3X2NzdW0uCi0JICoKLQkgKiBG SVhNRTogVGhpcyBpcyBhIGJ1Zywgc3R1ZmYgaW4gdGhlIGNvZGUgcGF0aHMgYWZ0ZXIgdGhpcwot CSAqIChmb3IgZXhhbXBsZSBpcF9mcmFnbWVudCkgZXhwZWN0IG1fcGt0aGRyLT5jc3VtX2ZsYWdz IHRvIGJlIHRoZQotCSAqIGxpc3Qgb2Ygc3R1ZmYgdGhlIHBhY2tldCBuZWVkcy4gIGluX2RlbGF5 ZWRfY2tzdW0oKSBhYm92ZSBhbHNvCi0JICogaGFzIHRoaXMgZXhwZWN0YXRpb24sIHdoaWNoIGlz IHdoeSB0aGlzIGNvZGUgaXMgY29udm9sdXRlZCB0bwotCSAqIGNhbGwgaXQgYmVmb3JlIGNsZWFy aW5nIG0ncyBjc3VtX2ZsYWdzLgotCSAqLwotCW0tPm1fcGt0aGRyLmNzdW1fZmxhZ3MgJj0gaWZw LT5pZl9od2Fzc2lzdDsKLQogCS8qCiAJICogSWYgc21hbGwgZW5vdWdoIGZvciBpbnRlcmZhY2Us IG9yIHRoZSBpbnRlcmZhY2Ugd2lsbCB0YWtlCiAJICogY2FyZSBvZiB0aGUgZnJhZ21lbnRhdGlv biBmb3IgdXMsIHdlIGNhbiBqdXN0IHNlbmQgZGlyZWN0bHkuCkBAIC01NDIsMTIgKzUyNSwxMCBA QCBwYXNzb3V0OgogCQlpcC0+aXBfbGVuID0gaHRvbnMoaXAtPmlwX2xlbik7CiAJCWlwLT5pcF9v ZmYgPSBodG9ucyhpcC0+aXBfb2ZmKTsKIAkJaXAtPmlwX3N1bSA9IDA7Ci0JCWlmIChzd19jc3Vt ICYgQ1NVTV9ERUxBWV9JUCkKKwkJaWYgKChtLT5tX3BrdGhkci5jc3VtX2ZsYWdzICYgQ1NVTV9E RUxBWV9JUCkgJiB+aWZwLT5pZl9od2Fzc2lzdCkgewogCQkJaXAtPmlwX3N1bSA9IGluX2Nrc3Vt KG0sIGhsZW4pOwotCQkJLyogTm9ybWFsbHkgd2UnZCBjbGVhciBDU1VNX0RFTEFZX0lQIG91dCBv ZiBzd19jc3VtCi0JCQkgKiBoZXJlLCBidXQgdGhhdCB2YXJpYWJsZSBpcyBub3QgdXNlZCBhZ2Fp biBiZWZvcmUKLQkJCSAqIGl0IHBhc3NlcyBvdXQgb2Ygc2NvcGUuCi0JCQkgKi8KKwkJCW0tPm1f cGt0aGRyLmNzdW1fZmxhZ3MgJj0gfkNTVU1fREVMQVlfSVA7CisJCX0KIAogCQkvKgogCQkgKiBS ZWNvcmQgc3RhdGlzdGljcyBmb3IgdGhpcyBpbnRlcmZhY2UgYWRkcmVzcy4KQEAgLTU4OSw3ICs1 NzAsNyBAQCBwYXNzb3V0OgogCSAqIFRvbyBsYXJnZSBmb3IgaW50ZXJmYWNlOyBmcmFnbWVudCBp ZiBwb3NzaWJsZS4gSWYgc3VjY2Vzc2Z1bCwKIAkgKiBvbiByZXR1cm4sIG0gd2lsbCBwb2ludCB0 byBhIGxpc3Qgb2YgcGFja2V0cyB0byBiZSBzZW50LgogCSAqLwotCWVycm9yID0gaXBfZnJhZ21l bnQoaXAsICZtLCBtdHUsIGlmcC0+aWZfaHdhc3Npc3QsIHN3X2NzdW0pOworCWVycm9yID0gaXBf ZnJhZ21lbnQoaXAsICZtLCBtdHUsIGlmcC0+aWZfaHdhc3Npc3QpOwogCWlmIChlcnJvcikKIAkJ Z290byBiYWQ7CiAJZm9yICg7IG07IG0gPSBtMCkgewpAQCAtNjMzLDExICs2MTQsMTAgQEAgYmFk OgogICogY2hhaW4gb2YgZnJhZ21lbnRzIHRoYXQgc2hvdWxkIGJlIGZyZWVkIGJ5IHRoZSBjYWxs ZXIuCiAgKgogICogaWZfaHdhc3Npc3RfZmxhZ3MgaXMgdGhlIGh3IG9mZmxvYWQgY2FwYWJpbGl0 aWVzIChzZWUgaWZfZGF0YS5pZmlfaHdhc3Npc3QpCi0gKiBzd19jc3VtIGNvbnRhaW5zIHRoZSBk ZWxheWVkIGNoZWNrc3VtcyBmbGFncyAoZS5nLiwgQ1NVTV9ERUxBWV9JUCkuCiAgKi8KIGludAog aXBfZnJhZ21lbnQoc3RydWN0IGlwICppcCwgc3RydWN0IG1idWYgKiptX2ZyYWcsIGludCBtdHUs Ci0gICAgdV9sb25nIGlmX2h3YXNzaXN0X2ZsYWdzLCBpbnQgc3dfY3N1bSkKKyAgICB1X2xvbmcg aWZfaHdhc3Npc3RfZmxhZ3MpCiB7CiAJaW50IGVycm9yID0gMDsKIAlpbnQgaGxlbiA9IGlwLT5p cF9obCA8PCAyOwpAQCAtNzY1LDcgKzc0NSw3IEBAIHNtYXJ0X2ZyYWdfZmFpbHVyZToKIAkJbS0+ bV9wa3RoZHIuY3N1bV9mbGFncyA9IG0wLT5tX3BrdGhkci5jc3VtX2ZsYWdzOwogCQltaGlwLT5p cF9vZmYgPSBodG9ucyhtaGlwLT5pcF9vZmYpOwogCQltaGlwLT5pcF9zdW0gPSAwOwotCQlpZiAo c3dfY3N1bSAmIENTVU1fREVMQVlfSVApIHsKKwkJaWYgKG0tPm1fcGt0aGRyLmNzdW1fZmxhZ3Mg JiBDU1VNX0RFTEFZX0lQICYgfmlmX2h3YXNzaXN0X2ZsYWdzKSB7CiAJCQltaGlwLT5pcF9zdW0g PSBpbl9ja3N1bShtLCBtaGxlbik7CiAJCQltLT5tX3BrdGhkci5jc3VtX2ZsYWdzICY9IH5DU1VN X0RFTEFZX0lQOwogCQl9CkBAIC03ODgsNyArNzY4LDcgQEAgc21hcnRfZnJhZ19mYWlsdXJlOgog CWlwLT5pcF9vZmYgfD0gSVBfTUY7CiAJaXAtPmlwX29mZiA9IGh0b25zKGlwLT5pcF9vZmYpOwog CWlwLT5pcF9zdW0gPSAwOwotCWlmIChzd19jc3VtICYgQ1NVTV9ERUxBWV9JUCkgeworCWlmICht MC0+bV9wa3RoZHIuY3N1bV9mbGFncyAmIENTVU1fREVMQVlfSVAgJiB+aWZfaHdhc3Npc3RfZmxh Z3MpIHsKIAkJaXAtPmlwX3N1bSA9IGluX2Nrc3VtKG0wLCBobGVuKTsKIAkJbTAtPm1fcGt0aGRy LmNzdW1fZmxhZ3MgJj0gfkNTVU1fREVMQVlfSVA7CiAJfQpkaWZmIC0tZ2l0IGEvc3lzL25ldGlu ZXQvaXBfdmFyLmggYi9zeXMvbmV0aW5ldC9pcF92YXIuaAppbmRleCAxOWU5YjdlLi44Y2JjNzRk IDEwMDY0NAotLS0gYS9zeXMvbmV0aW5ldC9pcF92YXIuaAorKysgYi9zeXMvbmV0aW5ldC9pcF92 YXIuaApAQCAtMTk1LDcgKzE5NSw3IEBAIGludAlpcF9jdGxvdXRwdXQoc3RydWN0IHNvY2tldCAq LCBzdHJ1Y3Qgc29ja29wdCAqc29wdCk7CiB2b2lkCWlwX2RyYWluKHZvaWQpOwogdm9pZAlpcF9m aW5pKHZvaWQgKnh0cCk7CiBpbnQJaXBfZnJhZ21lbnQoc3RydWN0IGlwICppcCwgc3RydWN0IG1i dWYgKiptX2ZyYWcsIGludCBtdHUsCi0JICAgIHVfbG9uZyBpZl9od2Fzc2lzdF9mbGFncywgaW50 IHN3X2NzdW0pOworCSAgICB1X2xvbmcgaWZfaHdhc3Npc3RfZmxhZ3MpOwogdm9pZAlpcF9mb3J3 YXJkKHN0cnVjdCBtYnVmICptLCBpbnQgc3JjcnQpOwogdm9pZAlpcF9pbml0KHZvaWQpOwogZXh0 ZXJuIGludAotLSAKMS43LjguMwoK --047d7b1605050ef51d04ccbe1a2c--