From owner-freebsd-wireless@FreeBSD.ORG Mon Oct 1 05:39:37 2012 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 01EDD10661FF for ; Mon, 1 Oct 2012 05:39:37 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: from mail-ob0-f182.google.com (mail-ob0-f182.google.com [209.85.214.182]) by mx1.freebsd.org (Postfix) with ESMTP id B1F628FC1B for ; Mon, 1 Oct 2012 05:39:36 +0000 (UTC) Received: by obbwc20 with SMTP id wc20so4740269obb.13 for ; Sun, 30 Sep 2012 22:39:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:date:x-google-sender-auth:message-id:subject :from:to:content-type; bh=i0g7qziDATGRU9Mjob0wCuS91wTAgirjXntxkBDBPnk=; b=UmsNJhKY567FZzddwSn5Kuvu+Y/s8AoDY3SAYRrUj24rthpkLr2d/4o73imR0XnFaz MPN8xfbyRGPtxiXAtWhY7GgOpE+/EpKzSRhjdkzMoB16M8gp3QkyE+3E4ii1xNOCkx4U 4Rpq1YcaT+UJnIh32+W8z3/PtfMleYeXy8/WqpDTrzre5995oW+aDIYfiC82S/jpTDwc gOivivPsQV+4HRcPdaZgLXwGPLZS9aA1oK0blBEEbFDYEgYGQgHYBcHThu1lZsd3cOMt SX3lhsl3VQXLcmpIWxOI8NUsaEQlCEw3tJpLvVD4pSq4ozKkI8IkOZ/KjxKbJ9dW2be8 q46g== MIME-Version: 1.0 Received: by 10.182.177.99 with SMTP id cp3mr10656190obc.92.1349069976025; Sun, 30 Sep 2012 22:39:36 -0700 (PDT) Sender: adrian.chadd@gmail.com Received: by 10.76.8.98 with HTTP; Sun, 30 Sep 2012 22:39:35 -0700 (PDT) Date: Sun, 30 Sep 2012 22:39:35 -0700 X-Google-Sender-Auth: -l1e-DMPJKV_C8MICWYKHVgGniI Message-ID: From: Adrian Chadd To: freebsd-wireless@freebsd.org Content-Type: multipart/mixed; boundary=e89a8f838d9db2bb2a04caf8d49e Subject: [RFC] Methodize the net8021 power save hooks 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, 01 Oct 2012 05:39:37 -0000 --e89a8f838d9db2bb2a04caf8d49e Content-Type: text/plain; charset=ISO-8859-1 Hi, I'm about to start tinkering with ath(4) power save support and I'd like to introduce some net80211 changes to support this. * Methodize the STA and node power save functions, so the driver can stop/start the software queues as needed; * Push PS-POLL frame leaking into a method, so the driver can override this if something is in a local queue. Since the driver may have some software queued frames for it, the driver needs to be able to leak these frames out correctly before the power-save queue frames are transmitted. My initial change to ath(4) will be to pause and unpause the node when the net80211 stack calls iv_node_ps() so the driver doesn't bother transmitting to a node that's asleep. There's a bunch of other needed changes that I'll then do in some follow-up work: * The TIM/ATIM doesn't know about what's in the software queue, so I'm going to have to introduce some further methods to allow the driver to update the TIM/ATIM as needed; * There's a M_PWR_SAV mbuf flag that means "this came from the power save queue". I need to see what/how drivers should treat this; * When a frame is sent via the PS-POLL method whilst a STA is asleep, the TIDs may be paused and as such the node won't transmit. In this case, frames pushed from the power save queue to the driver should immediately be transmitted, rather than punted to the software queue. * I also need to verify that the CABQ traffic is being set correctly- ie, the CABQ traffic all has the MORE bit appropriately set or cleared. * For nodes that are being sent PS-POLL (and later, uAPSD) delivered frames, they should be put "next" on the TX queue, ahead of any other TIDs that are being scheduled. That way their frame goes out next (or has a good chance to), versus being behind all the other currently transmitting (but not in power save) nodes. This should allow the device to quickly receive the frame and go back to sleep. I'm going to leave the next set of changes until I've done the first bit of work and verified it's working. I'll likely make that behaviour configurable because I'm worried that the incomplete PS-POLL upgrades will break mobile devices that try to stay in PS-POLL and "leak" frames (versus things like my MBP that just go in/out of power save and don't use PS-POLL at all.) adrian --e89a8f838d9db2bb2a04caf8d49e Content-Type: application/octet-stream; name="2012-09-30-powersave.diff" Content-Disposition: attachment; filename="2012-09-30-powersave.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_h7r5fkn20 SW5kZXg6IFVQREFUSU5HCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFVQREFUSU5HCShyZXZpc2lvbiAyNDEwODEp CisrKyBVUERBVElORwkod29ya2luZyBjb3B5KQpAQCAtMjQsNiArMjQsMTEgQEAKIAlkaXNhYmxl IHRoZSBtb3N0IGV4cGVuc2l2ZSBkZWJ1Z2dpbmcgZnVuY3Rpb25hbGl0eSBydW4KIAkibG4gLXMg J2Fib3J0OmZhbHNlLGp1bms6ZmFsc2UnIC9ldGMvbWFsbG9jLmNvbmYiLikKIAorMjAxMjEwMDE6 CisJVGhlIG5ldDgwMjExKDQpIEFCSSBoYXMgYmVlbiBjaGFuZ2VkIHRvIGFsbG93IGZvciBpbXBy b3ZlZCBkcml2ZXIKKwlQUy1QT0xMIGFuZCBwb3dlci1zYXZlIHN1cHBvcnQuICBBbGwgd2lyZWxl c3MgZHJpdmVycyBuZWVkIHRvIGJlCisJcmVjb21waWxlZCB0byB3b3JrIHdpdGggdGhlIG5ldyBr ZXJuZWwuCisKIDIwMTIwOTA4OgogCVRoZSBwZig0KSBwYWNrZXQgZmlsdGVyIEFCSSBoYXMgYmVl biBjaGFuZ2VkLiBwZmN0bCg4KSBhbmQKIAlzbm1wX3BmIG1vZHVsZSBuZWVkIHRvIGJlIHJlY29t cGlsZWQgdG8gd29yayB3aXRoIG5ldyBrZXJuZWwuCkluZGV4OiBzeXMvbmV0ODAyMTEvaWVlZTgw MjExX3N0YS5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT0KLS0tIHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFfc3RhLmMJKHJl dmlzaW9uIDI0MDk2OCkKKysrIHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFfc3RhLmMJKHdvcmtpbmcg Y29weSkKQEAgLTQwMiw3ICs0MDIsNyBAQAogCQkJICAgIGFyZyA9PSBJRUVFODAyMTFfRkMwX1NV QlRZUEVfQVNTT0NfUkVTUCk7CiAJCQlicmVhazsKIAkJY2FzZSBJRUVFODAyMTFfU19TTEVFUDoK LQkJCWllZWU4MDIxMV9zdGFfcHdyc2F2ZSh2YXAsIDApOworCQkJdmFwLT5pdl9zdGFfcHModmFw LCAwKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJZ290byBpbnZhbGlkOwpAQCAtNDM4LDcg KzQzOCw3IEBACiAJCQlnb3RvIGludmFsaWQ7CiAJCWJyZWFrOwogCWNhc2UgSUVFRTgwMjExX1Nf U0xFRVA6Ci0JCWllZWU4MDIxMV9zdGFfcHdyc2F2ZSh2YXAsIDEpOworCQl2YXAtPml2X3N0YV9w cyh2YXAsIDEpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCWludmFsaWQ6CkBAIC0xMzk2LDcgKzEz OTYsNyBAQAogCQkJCQkgKiB3ZSBhcmUgZXhwZWN0aW5nIGRhdGEuCiAJCQkJCSAqLwogCQkJCQlp Yy0+aWNfbGFzdGRhdGEgPSB0aWNrczsKLQkJCQkJaWVlZTgwMjExX3N0YV9wd3JzYXZlKHZhcCwg MCk7CisJCQkJCXZhcC0+aXZfc3RhX3BzKHZhcCwgMCk7CiAJCQkJfQogI2VuZGlmCiAJCQkJbmkt Pm5pX2R0aW1fY291bnQgPSB0aW0tPnRpbV9jb3VudDsKSW5kZXg6IHN5cy9uZXQ4MDIxMS9pZWVl ODAyMTFfcG93ZXIuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvbmV0ODAyMTEvaWVlZTgwMjExX3Bvd2Vy LmMJKHJldmlzaW9uIDI0MDk2OCkKKysrIHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFfcG93ZXIuYwko d29ya2luZyBjb3B5KQpAQCAtNjksNiArNjksOCBAQAogCQl2YXAtPml2X3VwZGF0ZV9wcyA9IGll ZWU4MDIxMV91cGRhdGVfcHM7CiAJCXZhcC0+aXZfc2V0X3RpbSA9IGllZWU4MDIxMV9zZXRfdGlt OwogCX0KKwl2YXAtPml2X25vZGVfcHMgPSBpZWVlODAyMTFfbm9kZV9wd3JzYXZlOworCXZhcC0+ aXZfc3RhX3BzID0gaWVlZTgwMjExX3N0YV9wd3JzYXZlOwogfQogCiB2b2lkCkluZGV4OiBzeXMv bmV0ODAyMTEvaWVlZTgwMjExX3Zhci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHN5cy9uZXQ4MDIxMS9pZWVl ODAyMTFfdmFyLmgJKHJldmlzaW9uIDI0MDk2OCkKKysrIHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFf dmFyLmgJKHdvcmtpbmcgY29weSkKQEAgLTQ4Niw2ICs0ODYsMTEgQEAKIAkvKiBwb3dlciBzYXZl IGhhbmRsaW5nICovCiAJdm9pZAkJCSgqaXZfdXBkYXRlX3BzKShzdHJ1Y3QgaWVlZTgwMjExdmFw ICosIGludCk7CiAJaW50CQkJKCppdl9zZXRfdGltKShzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKiwg aW50KTsKKwl2b2lkCQkJKCppdl9ub2RlX3BzKShzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKiwgaW50 KTsKKwl2b2lkCQkJKCppdl9zdGFfcHMpKHN0cnVjdCBpZWVlODAyMTF2YXAgKiwgaW50KTsKKwl2 b2lkCQkJKCppdl9yZWN2X3BzcG9sbCkoc3RydWN0IGllZWU4MDIxMV9ub2RlICosCisJCQkJICAg IHN0cnVjdCBtYnVmICopOworCiAJLyogc3RhdGUgbWFjaGluZSBwcm9jZXNzaW5nICovCiAJaW50 CQkJKCppdl9uZXdzdGF0ZSkoc3RydWN0IGllZWU4MDIxMXZhcCAqLAogCQkJCSAgICBlbnVtIGll ZWU4MDIxMV9zdGF0ZSwgaW50KTsKSW5kZXg6IHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFfaG9zdGFw LmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PQotLS0gc3lzL25ldDgwMjExL2llZWU4MDIxMV9ob3N0YXAuYwkocmV2aXNp b24gMjQwOTY4KQorKysgc3lzL25ldDgwMjExL2llZWU4MDIxMV9ob3N0YXAuYwkod29ya2luZyBj b3B5KQpAQCAtNzMsNyArNzMsNiBAQAogc3RhdGljIHZvaWQgaG9zdGFwX3JlY3ZfbWdtdChzdHJ1 Y3QgaWVlZTgwMjExX25vZGUgKiwgc3RydWN0IG1idWYgKiwKIAkgICAgaW50IHN1YnR5cGUsIGlu dCByc3NpLCBpbnQgbmYpOwogc3RhdGljIHZvaWQgaG9zdGFwX3JlY3ZfY3RsKHN0cnVjdCBpZWVl ODAyMTFfbm9kZSAqLCBzdHJ1Y3QgbWJ1ZiAqLCBpbnQpOwotc3RhdGljIHZvaWQgaG9zdGFwX3Jl Y3ZfcHNwb2xsKHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqLCBzdHJ1Y3QgbWJ1ZiAqKTsKIAogdm9p ZAogaWVlZTgwMjExX2hvc3RhcF9hdHRhY2goc3RydWN0IGllZWU4MDIxMWNvbSAqaWMpCkBAIC0x MDAsNiArOTksNyBAQAogCXZhcC0+aXZfcmVjdl9jdGwgPSBob3N0YXBfcmVjdl9jdGw7CiAJdmFw LT5pdl9vcGRldGFjaCA9IGhvc3RhcF92ZGV0YWNoOwogCXZhcC0+aXZfZGVsaXZlcl9kYXRhID0g aG9zdGFwX2RlbGl2ZXJfZGF0YTsKKwl2YXAtPml2X3JlY3ZfcHNwb2xsID0gaWVlZTgwMjExX3Jl Y3ZfcHNwb2xsOwogfQogCiBzdGF0aWMgdm9pZApAQCAtNjQ1LDcgKzY0NSw3IEBACiAJCSAqLwog CQlpZiAoKCh3aC0+aV9mY1sxXSAmIElFRUU4MDIxMV9GQzFfUFdSX01HVCkgXgogCQkgICAgKG5p LT5uaV9mbGFncyAmIElFRUU4MDIxMV9OT0RFX1BXUl9NR1QpKSkKLQkJCWllZWU4MDIxMV9ub2Rl X3B3cnNhdmUobmksCisJCQl2YXAtPml2X25vZGVfcHMobmksCiAJCQkJd2gtPmlfZmNbMV0gJiBJ RUVFODAyMTFfRkMxX1BXUl9NR1QpOwogCQkvKgogCQkgKiBGb3IgNC1hZGRyZXNzIHBhY2tldHMg aGFuZGxlIFdEUyBkaXNjb3ZlcnkKQEAgLTIyNDAsNyArMjI0MCw3IEBACiB7CiAJc3dpdGNoIChz dWJ0eXBlKSB7CiAJY2FzZSBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUFNfUE9MTDoKLQkJaG9zdGFw X3JlY3ZfcHNwb2xsKG5pLCBtKTsKKwkJbmktPm5pX3ZhcC0+aXZfcmVjdl9wc3BvbGwobmksIG0p OwogCQlicmVhazsKIAljYXNlIElFRUU4MDIxMV9GQzBfU1VCVFlQRV9CQVI6CiAJCWllZWU4MDIx MV9yZWN2X2JhcihuaSwgbSk7CkBAIC0yMjUxLDggKzIyNTEsOCBAQAogLyoKICAqIFByb2Nlc3Mg YSByZWNlaXZlZCBwcy1wb2xsIGZyYW1lLgogICovCi1zdGF0aWMgdm9pZAotaG9zdGFwX3JlY3Zf cHNwb2xsKHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmksIHN0cnVjdCBtYnVmICptMCkKK3ZvaWQK K2llZWU4MDIxMV9yZWN2X3BzcG9sbChzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pLCBzdHJ1Y3Qg bWJ1ZiAqbTApCiB7CiAJc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwID0gbmktPm5pX3ZhcDsKIAlz dHJ1Y3QgaWVlZTgwMjExX2ZyYW1lX21pbiAqd2g7CkluZGV4OiBzeXMvbmV0ODAyMTEvaWVlZTgw MjExX3Bvd2VyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL25ldDgwMjExL2llZWU4MDIxMV9wb3dlci5o CShyZXZpc2lvbiAyNDA5NjgpCisrKyBzeXMvbmV0ODAyMTEvaWVlZTgwMjExX3Bvd2VyLmgJKHdv cmtpbmcgY29weSkKQEAgLTcxLDYgKzcxLDExIEBACiBzdHJ1Y3QgbWJ1ZiAqaWVlZTgwMjExX25v ZGVfcHNxX2RlcXVldWUoc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSwgaW50ICpxbGVuKTsKIGlu dAlpZWVlODAyMTFfbm9kZV9wc3FfZHJhaW4oc3RydWN0IGllZWU4MDIxMV9ub2RlICopOwogaW50 CWllZWU4MDIxMV9ub2RlX3BzcV9hZ2Uoc3RydWN0IGllZWU4MDIxMV9ub2RlICopOworCisvKgor ICogRG9uJ3QgY2FsbCB0aGVzZSBkaXJlY3RseSBmcm9tIHRoZSBzdGFjazsgdGhleSBhcmUgdmFw IG1ldGhvZHMKKyAqIHRoYXQgc2hvdWxkIGJlIG92ZXJyaWRkZW4uCisgKi8KIGludAlpZWVlODAy MTFfcHdyc2F2ZShzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKiwgc3RydWN0IG1idWYgKik7CiB2b2lk CWllZWU4MDIxMV9ub2RlX3B3cnNhdmUoc3RydWN0IGllZWU4MDIxMV9ub2RlICosIGludCBlbmFi bGUpOwogdm9pZAlpZWVlODAyMTFfc3RhX3B3cnNhdmUoc3RydWN0IGllZWU4MDIxMXZhcCAqLCBp bnQgZW5hYmxlKTsKSW5kZXg6IHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFfaG9zdGFwLmgKPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PQotLS0gc3lzL25ldDgwMjExL2llZWU4MDIxMV9ob3N0YXAuaAkocmV2aXNpb24gMjQwOTY4 KQorKysgc3lzL25ldDgwMjExL2llZWU4MDIxMV9ob3N0YXAuaAkod29ya2luZyBjb3B5KQpAQCAt MzIsNCArMzIsMTAgQEAKICAqLwogdm9pZAlpZWVlODAyMTFfaG9zdGFwX2F0dGFjaChzdHJ1Y3Qg aWVlZTgwMjExY29tICopOwogdm9pZAlpZWVlODAyMTFfaG9zdGFwX2RldGFjaChzdHJ1Y3QgaWVl ZTgwMjExY29tICopOworCisvKgorICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4KKyAq Lwordm9pZCBpZWVlODAyMTFfcmVjdl9wc3BvbGwoc3RydWN0IGllZWU4MDIxMV9ub2RlICosIHN0 cnVjdCBtYnVmICopOworCiAjZW5kaWYgLyogIV9ORVQ4MDIxMV9JRUVFODAyMTFfSE9TVEFQX0hf ICovCkluZGV4OiBzeXMvbmV0ODAyMTEvaWVlZTgwMjExX3NjYW4uYwo9PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBz eXMvbmV0ODAyMTEvaWVlZTgwMjExX3NjYW4uYwkocmV2aXNpb24gMjQwOTY4KQorKysgc3lzL25l dDgwMjExL2llZWU4MDIxMV9zY2FuLmMJKHdvcmtpbmcgY29weSkKQEAgLTg2Niw3ICs4NjYsNyBA QAogCSAgICB2YXAtPml2X3N0YXRlID09IElFRUU4MDIxMV9TX1JVTikgewogCQlpZiAoKHZhcC0+ aXZfYnNzLT5uaV9mbGFncyAmIElFRUU4MDIxMV9OT0RFX1BXUl9NR1QpID09IDApIHsKIAkJCS8q IEVuYWJsZSBzdGF0aW9uIHBvd2VyIHNhdmUgbW9kZSAqLwotCQkJaWVlZTgwMjExX3N0YV9wd3Jz YXZlKHZhcCwgMSk7CisJCQl2YXAtPml2X3N0YV9wcyh2YXAsIDEpOwogCQkJLyoKIAkJCSAqIFVz ZSBhbiAxbXMgZGVsYXkgc28gdGhlIG51bGwgZGF0YSBmcmFtZSBoYXMgYSBjaGFuY2UKIAkJCSAq IHRvIGdvIG91dC4KQEAgLTEwNDcsNyArMTA0Nyw3IEBACiAJICogd2FpdGluZyBmb3IgdXMuCiAJ ICovCiAJaWYgKHNjYW5kb25lKSB7Ci0JCWllZWU4MDIxMV9zdGFfcHdyc2F2ZSh2YXAsIDApOwor CQl2YXAtPml2X3N0YV9wcyh2YXAsIDApOwogCQlpZiAoc3MtPnNzX25leHQgPj0gc3MtPnNzX2xh c3QpIHsKIAkJCWllZWU4MDIxMV9ub3RpZnlfc2Nhbl9kb25lKHZhcCk7CiAJCQlpYy0+aWNfZmxh Z3NfZXh0ICY9IH5JRUVFODAyMTFfRkVYVF9CR1NDQU47CkluZGV4OiBzeXMvbmV0ODAyMTEvaWVl ZTgwMjExX2FkaG9jLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL25ldDgwMjExL2llZWU4MDIxMV9hZGhv Yy5jCShyZXZpc2lvbiAyNDA5NjgpCisrKyBzeXMvbmV0ODAyMTEvaWVlZTgwMjExX2FkaG9jLmMJ KHdvcmtpbmcgY29weSkKQEAgLTI0Miw3ICsyNDIsNyBAQAogCQkJaWMtPmljX25ld2Fzc29jKG5p LCBvc3RhdGUgIT0gSUVFRTgwMjExX1NfUlVOKTsKIAkJYnJlYWs7CiAJY2FzZSBJRUVFODAyMTFf U19TTEVFUDoKLQkJaWVlZTgwMjExX3N0YV9wd3JzYXZlKHZhcCwgMCk7CisJCXZhcC0+aXZfc3Rh X3BzKHZhcCwgMCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJaW52YWxpZDoK --e89a8f838d9db2bb2a04caf8d49e--