From patchwork Thu May 18 22:25:45 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Jurgens X-Patchwork-Id: 9735337 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 367FC601A1 for ; Thu, 18 May 2017 22:27:19 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2072525EA6 for ; Thu, 18 May 2017 22:27:19 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 12AF32845E; Thu, 18 May 2017 22:27:19 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_NONE, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 Received: from emsm-gh1-uea10.nsa.gov (smtp.nsa.gov [8.44.101.8]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id C4FD5288B2 for ; Thu, 18 May 2017 22:27:17 +0000 (UTC) X-IronPort-AV: E=Sophos;i="5.38,360,1491264000"; d="scan'208";a="7229071" IronPort-PHdr: =?us-ascii?q?9a23=3AAa1T+xTBDAqSHmoFgKOK+BkmBNpsv+yvbD5Q0YIu?= =?us-ascii?q?jvd0So/mwa68ZRyEt8tkgFKBZ4jH8fUM07OQ6PG/HzZYqs/b+Fk5M7V0Hycfjs?= =?us-ascii?q?sXmwFySOWkMmbcaMDQUiohAc5ZX0Vk9XzoeWJcGcL5ekGA6ibqtW1aFRrwLxd6?= =?us-ascii?q?KfroEYDOkcu3y/qy+5rOaAlUmTaxe71/IRG0oAnLqMUanYRuJrsvxhDUvnZGZu?= =?us-ascii?q?NayH9yK1mOhRj8/MCw/JBi8yRUpf0s8tNLXLv5caolU7FWFSwqPG8p6sLlsxnD?= =?us-ascii?q?VhaP6WAHUmoKiBpIAhPK4w/8U5zsryb1rOt92C2dPc3rUbA5XCmp4ql3RBP0ji?= =?us-ascii?q?oMKjA28HvTisdtkqxVphyvrAF7z4LNfY2ZKP9yc6XAdt0YWGVBRN5cWSxfDI2h?= =?us-ascii?q?YYUBDO0PMuRWr4nlpVYCsBWzChe3BO701jNEmmX70bEg3ug9DQ3L2hErEdIUsH?= =?us-ascii?q?TTqdX4LKkcXvqzzKLVyTvDculW2Tjj54jOaRAqvPaBUq9qfsrXyEkgCQfFjleL?= =?us-ascii?q?pIzgITyV0uANvHKd7+pnWuOjkXIoqwZ0ojW2wMonl4fHhoUQyl/e9CV5xp44Jd?= =?us-ascii?q?yjR0FlZ96rDYNQtyaAN4tqWM8tXn9nuDgixr0Do5G7ZDIGyJUhxxPZdveJcJCI?= =?us-ascii?q?7wr+WOueLjp0nnJodK+lixqs/kWs1PfwWtSs3FpXqidInMPAu38P2hDJ98SKS/?= =?us-ascii?q?tw8l281TqR0w3e7PxPL1oumqrBMZEhx6Y9lp8UsUveACD7gF72jKqKdkU8/eio?= =?us-ascii?q?9vjnbq3mppCCM490jRnzMrg0lcylAOQ4LxMOU3KH+eW8yLLj/Ur5TK9MjvIqia?= =?us-ascii?q?nWrIrWJcEapq69GwNV04Aj5AijDzq+zdgVknYKIEhFdR6alYTlJV7DLO7iAfui?= =?us-ascii?q?m1islS1kx/HCPr3vGJXNKX3Dna/6fblj705cyQwzzc1Q5p5NEb4BJ+/zWkntu9?= =?us-ascii?q?PGFR80KBC0wub7B9V90YMSQ2SPArSDP6/Ivl+I4fwvL/GWZIAJoDb9N+Ql5/n2?= =?us-ascii?q?gH87nl8de7Om3YcXaH+iGPRrOEeZYX3qgtcEC2gKpRY+Q/LwiF2ZSzJTYGyyX6?= =?us-ascii?q?0k7DEhFI2mFZvDRpyqgLGZ3ie7HIdZaXxFClCXFnfocYSEW+kXZSKcJs9hjzMF?= =?us-ascii?q?WqO8S48nyRGuqRX2y719Lurb4icYr47s1MBp5+3PkhE/7SR0ANqG3G6TSWF0n3?= =?us-ascii?q?8IRzgt0aB+v0Ny1EmM3bJ/g/xCGtxZ/+lJXRsiNZ7A0+x6DMj/VR/GftePTlap?= =?us-ascii?q?X8upATUwTt8q2dABfVx9G9K4ghDExSqqDKcfl6aXC5ws7qLcw3/xKt5gxHbazq?= =?us-ascii?q?YhlUIrTddINW2jmqFw7RPTB5LTn0WfiamqabwW3DTR+2eb0WqOoEZYXRZxUaXD?= =?us-ascii?q?QXAQeE/Wosr85kzcU7+uE7QmPxBGyc6aNKRKbNjpgk9HRPfnI9veZG2wl323BR?= =?us-ascii?q?aSybOGdJDqdHkF3CXBFEgElBge/HaHNAg5ACesuGfeDDh3GVLuZUPg6+9+p2mh?= =?us-ascii?q?Tk83zgGKcVNu26Cz+hELmfyWU+kT0a4cuCc9tzV0G06w0MnNBNaHowphfb5cYc?= =?us-ascii?q?8m4FtdzmLWqRByMoa7L698gl4ecgJ3v17h1hhsFopBkdIqrG4xzAZoJ6OXyk9B?= =?us-ascii?q?dyif3ZD2ILHXLXPy/B+3Ya7Mxl7eyMqW+rsI6PkgtVrjpBumFlAj83V8yNRVy2?= =?us-ascii?q?GT5o/LDAoJSZLxVlw4+ARkqL3AZSk9/YzU32V2Maaoqj/Cx84pBOw9xxeuftdf?= =?us-ascii?q?NKaEGxHoE8ABCcihNvElm1+zbh0eJOBS7qk0P8G4ePSaxK6nJuFgnCipjW5f+o?= =?us-ascii?q?ByzlqM9zZgSu7Px5sFzeuY0RGBVzjgjVehqdv6mYVcZTETB2a/0iblBJVLaq11?= =?us-ascii?q?Z4YLBn+kI9erydVmm57tR3lY+UagB1wc28+pfgeSYkf+3QJK1kQXpmGnlTG/zz?= =?us-ascii?q?xunDEjtrCf0zDWw+T+aBoHPXZGS3N/glf2IIi7kcoaUVOyYAc1kRup/0H6x7JU?= =?us-ascii?q?pK5nNWncXV9IfzTqL2FlSqa/qqCNY8pR55MzrSVWUOO8bEuBSrHhohsVzSXjH3?= =?us-ascii?q?dfxD8hbT2qvIv2nwBigmKHMHlztGbZed13xRrH/9zcS+RR3j0dRClkkjTXHV68?= =?us-ascii?q?P96n/NWRjZjDtPqyV2S/WZ1PaSPr15+PtDOn5W12Bh2yh/6ylcfjEQgmzyD7zc?= =?us-ascii?q?JqWD7WrBnieInkzLm6Med9cklvHl/85NJwGptinYsomJEQxX8ai42J/XUajGjz?= =?us-ascii?q?MM9U2ablYXURQj4LxsLa7xL+2E1/NH6JwZz2VmmFyMt7e9a6en8W2j46781SFq?= =?us-ascii?q?eU7aBLnTdyolqitw7effh9njAbyfsh83Mah+AJuAw3wSWHBbAeB05YPTbjlx6Q?= =?us-ascii?q?9dCxsL1XZHqzcbi3zEd+mdGhDKqeog1FQ3b2ZJMiHS527sViP1PBy2bz6pnleN?= =?us-ascii?q?nWbNIcqgaUnw3Gj+dLNJI7juAKijZ/OWLhoX0lzPY2jQZp3ZG+uIiINX9t876+?= =?us-ascii?q?Ah9WLTD1fN4T9S32japEmcaWxY+vFI17GjoXRJvoUe6oEDUKuPT/LQmODTk8pm?= =?us-ascii?q?2BFrbFBgCf70Nmr27IE5CtLHyXIWUVzdNlRBaBPkBfhh4bXCkilJ4jCg+q3NDh?= =?us-ascii?q?cFt+5j0J5V73tB1MyvlzOhn8TGjfohyoajEqR5iDNhZW6RtC50jNO8yE8u1zBz?= =?us-ascii?q?1Y/oGmrAGVMmyUfRlIDWUXVUycHV/jOKWu6sfa8+WDG+q+NOXBYa+VqeBETPeI?= =?us-ascii?q?wo+v0pF68DmSOMWPOWNiD/Il1UZZW3B2BdjZkS0VSyMLjyLNc9KbpBCk9y1pqM?= =?us-ascii?q?Cw7e/mWBzp5YSSC7teK9Nv9A6qga2bLe6fmD55KSpE1pML3XLI0KIQ3EMWiyx1?= =?us-ascii?q?azatEKgAtC7UQKLegKBXCQQXayRpNMtH96g8xBVCOdbHitPp0b51lv01CldBVV?= =?us-ascii?q?P/gcypYMsKI2+zNFzZGEaLKLSGJTrOw87pe6+8T6NfjPlMvR2qpTmbC1PjPiiE?= =?us-ascii?q?lzTxWRCgK+dMjD2cPBxbo4y9fAhiBnXkTNL8cBK7KMV3jTo0wbIqmnzKKXQQMT?= =?us-ascii?q?9mc0NCtreQ9z9Xgu1jG2xd6XpoNfOElzyX7uXCL5YZq/9rAiN0lu9B+ns1175V?= =?us-ascii?q?4DtDRPxvlyvYtsRurE2+kumT1jpnVwJDqjhRhI2VoEpiIr/W9p9cWXbD5xIA9n?= =?us-ascii?q?+fBAgPp9d/Dd3voa9QwMDVlK3vMDdC787U/cwECsjSMsKIKmIhMQLyFT7aDQsF?= =?us-ascii?q?VyWrNX3Rh0xclvGd7HuVoYQ7qpf2nJoCULhbVEY6FvkCEERqAMQCIItrXjMjib?= =?us-ascii?q?OUkdUI6mSkoxneXsVVpI7HW+mJAfr1KzaZkKNEaAESzbP8MIQTMJf021Z7Zllm?= =?us-ascii?q?m4TKGErRXddXri1ncAA0vF1H8GJiQW0rx0LldgSt7WcVFf61mh42jhVxYf82+T?= =?us-ascii?q?j2/Vg3PF3KqDE3kEkrltXvmSqRfyLpLKesQYFWDDL5uFMwMpP0RAZ1axa/klF6?= =?us-ascii?q?OzjfRrJelb1geXpsiA/GtptFAeRcQrFcYB8M2fGXYO0l3k5Tqiq9209I+/DICZ?= =?us-ascii?q?x6lAQ0d56sqmhP2wNnbNEuIqzRK7BFzl9KhqKBpiWozPw+wBcCJ0YR92OfYDII?= =?us-ascii?q?uEsNNrU8PSqo+e1t5hKEmzRYYmgMUOQlovFx+0whPOSAyj7v3KRYKkCtLeCfKb?= =?us-ascii?q?2Wu3TYn86SXlwwzl8Il1VC/bVu18csbVCbV0Q0wbuSEBQJLtbCJhtTb8pJ93jT?= =?us-ascii?q?fDyCsePTzpJpJ4+9DPznTfeStKYIhUKpBBwpEJoX7ssfBJasyl3XLcf8IbEeyB?= =?us-ascii?q?Ut/hnkJFKLDPRRYhKEjjcGr9u5zJBpwYlXPisdDnllMSWr+rbXoRcnj+eZU9co?= =?us-ascii?q?Y3cVQ5AEO2ksV82ggS5ZuHpBDCKp3e0F1QiC9T78pjjQDTXmadpseuuUbwt2CN?= =?us-ascii?q?6q4TU/77S2iVnP/5XaIGH6L8ptutnO6OMdvJuHBPVUTaRnv0fbgYlYSGSgU3TT?= =?us-ascii?q?Ht6tO5jwd44sYMTvCnmkVly/ijQ1T9r+Pdu2MqeIhgToSppOv4mAwDAvL8m9GS?= =?us-ascii?q?8CGx1oveEM+Lp8ZREfY5o8eRPnqhgxN6m4IAeeztWiXn2gKSVIQPlFzOW7ZrtX?= =?us-ascii?q?zyw2Yu+81nQgUokwz/Or/k4VWJEKkhbeyO6gZ4lEUSn8AHpdexnPpScimGhhMf?= =?us-ascii?q?4yzfslzBPOr1YcLyiBdPZ1Z2xco9E8GVSSLG1qCmo5Ql+cipbD4g6s3r0J4iRd?= =?us-ascii?q?ntZV3vdev3TkuJ/Qfi6sUrSxqZrJqyogccQmo6ppPIzsOMuJrpXeniDEQZnRtQ?= =?us-ascii?q?2EXii6F+ZamtdOISJYRuVIln8/OcAcv4pO91YxXN8kJ7NTEKksuqyqaT18ACEI?= =?us-ascii?q?yS8ZVp+P0yIajee527rakBCQcJI4PxEfq5pCg8ESUyhvbiMQua+vTYPWmHGYSm?= =?us-ascii?q?ITOgcc8RxM5B4clo93Zu3q+5THTJlXxjFMvv10TDXEFoNz91ThUGGXgUL0SPK7?= =?us-ascii?q?k+ymxQhS1u7j0sEHWB5jDkhQ3/xWlk0pKL5rK6kQuYrKsiSQe03joWzj0verKl?= =?us-ascii?q?5KxMLIcF34CZbKunDnUi0A43EUQ5FAyG3HH5QIjwV5cLorpElLII2+Zkn+5SYr?= =?us-ascii?q?yJhyErakUsCrw1IlrXcYSCewD9pOFf1psFLNVD1ieZCrp43vO49OTW9I5J2dt1?= =?us-ascii?q?BZnV13MyGj05pcLNpC7yUQXDhVuzqdosW9SMlC2c9wAJ8MJtZ/u3j9GKNYNpie?= =?us-ascii?q?uWc2urn1xn/f5T88rE+wxC+vFK+gU+JZ42oeFx0nJmiEtkYvD+os8mLT8l/XsV?= =?us-ascii?q?B55OZbCaaRgkpvujp9GYpOBjlR33C/M1tzVGVGs/ldKKnNa8xcRP0yagW1Ox0w?= =?us-ascii?q?Ev4m20KJ8FpxnXf+ZCxyrRVV9DzHXwkzTikVmbbtmTsRqs29Pj8aUZ1IZy07by?= =?us-ascii?q?jZMwKbhTxXvBFHZk5wQZAZH9BF96sY3YZP/8rCSEesKT0eUxB4MAI3z+Zfn1ZZ?= =?us-ascii?q?sEqEYSDdERaodfHXvx1reseRqdWkLOjl8AdCkYzrquY4+LsfR3e+gw2iXcjer5?= =?us-ascii?q?Pgtt2NrkaOdL33M/embn/FUTfBlg2/iqk8D5nS4SfTNBRUK4NgxXoje5jhBnbB?= =?us-ascii?q?PQ5aKKIDO0pbSad6ZM1EouBdecBpY7sG9rF2Bh2ZXBPvBJKgo+RcIlbVWzveMz?= =?us-ascii?q?2L8vajroLL8bzdVe/ga9SXyHbJX617IpV35ST1FrrxzYBe/U/21et3+UNhVVjK?= =?us-ascii?q?KSaBo8r9JgkT/smtalPivoE1HTPRGJpwimTiyVxAd8UNXy2n65AYyJRH6HnuV+?= =?us-ascii?q?53zk/zv/BM+LV+74k4/axpw9+uJajOMfRarVNnAh+MCwVy7ZUtHHJwSH1NYuIK?= =?us-ascii?q?M/fRerkZjdrypO/pEawX9AeV9PZdadfdIEHBgMa/ACmGSRNYhAcBtSIaLgyE2v?= =?us-ascii?q?6Zga97V9iqqvXi10Iw51i+MgQGw6pz5YeF/aqIoPHYbwfLwbgDQKjqSdv5rq4w?= =?us-ascii?q?tEOK+f0kiLkOd3RwYwK9FOgdUtASxnv8za8w1y0hCMXDEKz8+P5YS302hCrglI?= =?us-ascii?q?5nE1UQBPwUAaKB/Z5CkWcgh+zZKtoWf7hAmmmVDx6kFaQCyXqx5CuJO2RlhwzO?= =?us-ascii?q?0xXsQWOy8FD2rDV3QS3Xz9v5lUpVTLa3D19IXyW1IU94rC+PPA3wudr1o6s16k?= =?us-ascii?q?82MnbjtN2QimSsI69XENf5JNyHJik4vlQXg4MtRta3w4AUBcK9IMsN8HF5dvbe?= =?us-ascii?q?5H6rky5Fo6dDmYXe59qY9ejJEna7jq2VsbONyCpfyngislE18sqgOe3W592WX/?= =?us-ascii?q?So0H4cTyF7uwbaXh61rLnbo0oVOUyN3kfLgpYFPspF3Xkiy0Hp+PQjQM8p9ApA?= =?us-ascii?q?DIrAYOkCpT/rMjvu3Vmfe843VjWZ0zZPG1L1Fl94GLQz2G3up8/JkHbQ9EcuRo?= =?us-ascii?q?Zua0zmixt3D587KUI28lQXxDQMERQVYxCBEL6oHVjlLZcDVUUbcxSIwaW1d7w4?= =?us-ascii?q?3U12zbKj/unTYvJgB6AVLPZSkhaOnERHGpIRqaAeRKl8e1pd+aPMqAjtFZXoX/?= =?us-ascii?q?/8lXUqLf21WMda8cIHuHQ+/gazXR2g6Y1M77wDkpCHarZEYYTQvMB790pn/iQA?= =?us-ascii?q?djJXjxhwkRy5SvsRpPv57djFqpWo5fihVL03S+UR6Rc0G3x0j4Hsj1A7vdHXy+?= =?us-ascii?q?BcR5XXiYT+9QBAOHuKt5ja0hZiM+oOKoSrfLl6+3UBOSceO2oEPcCKZPkk/y9t?= =?us-ascii?q?LDLT6kRDAsINf9wXJtbClBtPikL3RLFc6NbUFkWfC4dpeMAi93D3xywt8ZsgTu?= =?us-ascii?q?bg7ye7Kove71FWMfJMlidslNPepOgN2/XSFSwX7GKFZBhy3yyN1YOCC+vq/eWL?= =?us-ascii?q?0tHbTUkKHiksU4dSPDCC4xCoRvKplJX1VQOZ8tfzj4gidE2MRnywkqMFsrxPEe?= =?us-ascii?q?JZkSX0wDxeFoHzh/KIvNuh83NXuUdbEIlv7R3EFqJfPo94ORjilcmkWFJ8Bi3h?= =?us-ascii?q?d8HQbBYuv/CWxugU6eVkK0T+fZMbIg4Dy7/i9XpVVBVhSLrssVafQ+0cf8ZpSP?= =?us-ascii?q?LLrnBU9YJvMbQPM0KHpJz3tDtIrk45ABMxYr8qsjNablXOnBFSW6vst74PkBEc?= =?us-ascii?q?XsBluU9MAm+wPGM+5ybZWqRVlqaRFecV/i+VTqMQT0ViKjl+TA+t2JVyZ7upmu?= =?us-ascii?q?hKsmxYkSN7vPgq1DtmSBynuSLyo6IN2DQg+Ky3tTgavXxKUP+ekifSBllZyvQF?= =?us-ascii?q?k7scAW746VOgeHkDcJfy4L5/KMTm9Iku/3M/YRE5cC0dR+igCibwj6STAoyUq9?= =?us-ascii?q?9cgRGAucrUYb+0NygSOaw3yQj/SHhlzgjegBFo/XMEQjq8998kP5yxN9sqyCSu?= =?us-ascii?q?GGjbcksM46xSvcv+sF4EVu02Zk17zGVkyMiHSTUHRNbTFGYtkggkdWJEfYpB6R?= =?us-ascii?q?8dF6kohCyEsbVG/gEQfTfbD4Wk+ojWncfT2nk9TMxnxnzXpq2bnJwq1GBqm9Ju?= =?us-ascii?q?4i6IpnsSa/TSU9VwDXjryodf1ev+au2ssuAZUoRmzq+sUPsfMsa++Gu2345qVl?= =?us-ascii?q?WixrQEEFqzKPUDyavDUye5VW2YXvyGc2qSkDY3PE7y4QKlL1MtZ8dMsUA9LvHO?= =?us-ascii?q?hphCmA39Sbl0XDmfpUfHzGw/NuMXbw02uIOgew0EUuERY+ycKPM1wP05DlsMbm?= =?us-ascii?q?PGETFwC+CorV6nhJJ7NGl44UXmfeTt9RjrMNmSGhgECY7aqZpx+f2mRm2fInJg?= =?us-ascii?q?yRxyPFVu9+jBDVgxsfVcc5mJl9jKm9t7yfIFd+tqMSAlpt4Tm4dj5JKI0MeLbR?= =?us-ascii?q?7RzYj9JdXPrvieHfLf01wgentGXboBfQP1+4I6M8Y8W73SHrtZvhMcCLM4QJM7?= =?us-ascii?q?NGfx86d0Ix11cgLLYrS7nNXqrPqRZpRIv3/W8k4wLCDEthIY1PO0SxB7Youxh3?= =?us-ascii?q?X2J5AwWi5Br8NzBRR7BodPHNkArwW/CZ6OhK67k8Ox+199u+ISv6r/FPTK1NWh?= =?us-ascii?q?34pvRJVb5E2LPDPUBKZ1mERlivq9ju3H0pnrBsPoYckEW/RjQm7Zdr/GGZ2yKz?= =?us-ascii?q?yWOsLmek5J76CT3al8UhWQeCD5RbSJuDejNPV+7kUx0pZ4c/bLzDwx87Hb38P/?= =?us-ascii?q?Z2Zfpii9tnOJLJ9f40bRBezCXhJbVeaF8Hx7EqIJd4f08vkBMcA6ytiG/wZz9C?= =?us-ascii?q?hC0NeCI6W5qk/M20R7dY/ULUfw3yY5WJIKIAikMUY3gG/WsHLdAXNGIsijM8lt?= =?us-ascii?q?j86fDgbx6ElphWEtemlBF3LzRdiPPWgb2sS+ZBCF9Q5MANgDg+63dlAitqKsUe?= =?us-ascii?q?lnII5Imea0u7Udl9ZmNSXPS9NHPyHfNrN2OSBRDurXrlgyfhEEq6Q1WpsyZZWW?= =?us-ascii?q?JUMIKluPySPzzQvE1k35bMKs1KePICkI9nVHzrTF0SVDpgWjvvaZmMLjWqjDbJ?= =?us-ascii?q?7qRP7SLDYlVjaCSDQwC0mp+lCktOEfsfqFJ2cfvlAUYiWPCA4cpqBvscLcDmnN?= =?us-ascii?q?lu1/ZJcKnuyVWzjsSC1kk6o/HilLulqXTPoZFAnZcXvhjXFCuAymPPBM5nPlb6?= =?us-ascii?q?CCyqpTReMWHpNGcueFTNvAZfBeOzAomy0bOOa5eN3ctaw50lPTTWYCFanH7lie?= =?us-ascii?q?Q1CXQvCGwDLrR4oVtZAuuiU04tLQgjN3E6PQMraEqT6u95K3gSebtODFSGkifV?= =?us-ascii?q?Y1gOMDAWmGxhlMMmcEBM8JuBKlfqnVfEtI1XQ0mcpyyhQMf0J1SXQo3XpIz9in?= =?us-ascii?q?HcgMZVcSxEGzWvILaks/WD85+06H5g/aZNEEvcnVQH8Y/bwJH9lOZMI04ZXabf?= =?us-ascii?q?NDiM0i2yhr9Wlj6yg=3D?= X-IPAS-Result: =?us-ascii?q?A2FKWgCcHh5Z/wHyM5BcGwEBAQMBAQEJAQEBFgEBBAEBCgE?= =?us-ascii?q?BgwIpYoEMjniQe4IMAZEQhFovA4F3iXtXAQEBAQEBAQECAQJoKIIzJCxUAQEBA?= =?us-ascii?q?QEBAQEBIioxPAYBAiRVAwkBARcIKQgDAVMZBYhPgU8EsGs6JgKLJIg9jXAFkCe?= =?us-ascii?q?BAYxrhxyMAYJXiEKGU4tkiGJYgQpPIRWEeQFDHIFmc4V3K4IQAQEB?= Received: from unknown (HELO tarius.tycho.ncsc.mil) ([144.51.242.1]) by emsm-gh1-uea10.nsa.gov with ESMTP; 18 May 2017 22:27:16 +0000 Received: from prometheus.infosec.tycho.ncsc.mil (prometheus [192.168.25.40]) by tarius.tycho.ncsc.mil (8.14.4/8.14.4) with ESMTP id v4IMRFAU024508; Thu, 18 May 2017 18:27:16 -0400 Received: from tarius.tycho.ncsc.mil (tarius.infosec.tycho.ncsc.mil [144.51.242.1]) by prometheus.infosec.tycho.ncsc.mil (8.15.2/8.15.2) with ESMTP id v4IMQDe8076197 for ; Thu, 18 May 2017 18:26:13 -0400 Received: from goalie.tycho.ncsc.mil (goalie [144.51.242.250]) by tarius.tycho.ncsc.mil (8.14.4/8.14.4) with ESMTP id v4IMQDGw024133 for ; Thu, 18 May 2017 18:26:13 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A1CyAwDZHh5Z/4GlL8FcHAEBBAEBCgEBgyyBC4EMjniQe5gFHAiGAAKGRwECAQEBAQECayiFGQYnUhAYCDFXGYhUgVOwbjqLGgExiD2NcAWQJ4EBjGuHHIwBglePFYtkiGJXgQpPIRWFPRyBZj02hXcrghABAQE X-IPAS-Result: A1CyAwDZHh5Z/4GlL8FcHAEBBAEBCgEBgyyBC4EMjniQe5gFHAiGAAKGRwECAQEBAQECayiFGQYnUhAYCDFXGYhUgVOwbjqLGgExiD2NcAWQJ4EBjGuHHIwBglePFYtkiGJXgQpPIRWFPRyBZj02hXcrghABAQE X-IronPort-AV: E=Sophos;i="5.38,360,1491278400"; d="scan'208";a="6058447" Received: from emsm-gh1-uea11.corp.nsa.gov (HELO emsm-gh1-uea11.nsa.gov) ([10.208.41.37]) by goalie.tycho.ncsc.mil with ESMTP; 18 May 2017 18:26:12 -0400 IronPort-PHdr: =?us-ascii?q?9a23=3AJYTj5B3HEYcuNKcvsmDT+DRfVm0co7zxezQtwd8Z?= =?us-ascii?q?se0eKPad9pjvdHbS+e9qxAeQG96KtLQe06GP6ejJYi8p2d65qncMcZhBBVcuqP?= =?us-ascii?q?49uEgeOvODElDxN/XwbiY3T4xoXV5h+GynYwAOQJ6tL1LdrWev4jEMBx7xKRR6?= =?us-ascii?q?JvjvGo7Vks+7y/2+94fdbghMhjexe61+IAm5oQnMqMUdnJdvJLs2xhbVuHVDZv?= =?us-ascii?q?5YxXlvJVKdnhb84tm/8Zt++ClOuPwv6tBNX7zic6s3UbJXAjImM3so5MLwrhnM?= =?us-ascii?q?URGP5noHXWoIlBdDHhXI4wv7Xpf1tSv6q/Z91SyHNsD4Ubw4RTKv5LpwRRT2lC?= =?us-ascii?q?kIKSI28GDPisxxkq1bpg6hpwdiyILQeY2ZKeZycr/Ycd4cWGFPXNteVzZZD428?= =?us-ascii?q?cYUBEuQPM+VfoYb/qVsDtgeyCRW2Ce/z0DJEmmP60Ksn2OohCwHG2wkgEsoAvn?= =?us-ascii?q?vOqtX+KaMcUf2vzKnH0zrDaehW0ir65YfVaB8hp/CMUqx0ccrT0kQvEh3KjlGU?= =?us-ascii?q?qYP/OTOV0esMv3KH4OpnUOKikmgqoBx/rDiow8cjkIjJhoQNx1DF7ip23oA1Ks?= =?us-ascii?q?CgSE58e96kDIFcuDyEOItoWs8iRntnuD4gxr0Hv562ejUBxpc/xxPHdvCKd4aF?= =?us-ascii?q?7gjsWeuTOzt0mXNodbKlixqv70StzuvxXdSu3llQtCpKiNzMu2gN1xPN7siHTe?= =?us-ascii?q?Nw/kK/1jaL0wDc8OdEIUc7lKbBN5EhxaQ8lpsXsUjbHy/2nlv5jLOOe0k5/uWl?= =?us-ascii?q?5f7rb7rkq5OGKoN5iwHzPr4zlsChBek0Kg0OUHKa+eS42r3j50r5QLBSg/IriK?= =?us-ascii?q?bZtpHaKtofpq67GAJV15gs6xK7Dzi81tQYmnYGIEhZdxKAiojlI0vOL+zgDfej?= =?us-ascii?q?n1Ssly9mx+vYMb3lA5XNKGXDkbj6cLZh609T1AozzddF65JSEbEOOuj/WkD2tN?= =?us-ascii?q?zGXVcFNFmvzuLmDsht/p8PUmKIRKmCOeXdtkHbyPgoJrygbYldmivnJPUj/La6?= =?us-ascii?q?gXY/mFIZf4Gs0J8TYXa/DrJtJEDPMimkucsIDWpf5ll2d+ftklDXFGcLP3s=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0GnYwCcHh5Z/4GlL8FcHAEBBAEBCgEBF?= =?us-ascii?q?wEFAQsBgwKBC4EMjniQe4IMAZEQhGgcCIF3hAkChkcBAQEBAQEBAQIBAmgogjM?= =?us-ascii?q?kAStUAQEBAQEBAQEBIioxPAYnUhAYCDFXGYhUgVOwazqLGgExiD2NcAWQJ4EBj?= =?us-ascii?q?GuHHIwBglePFYtkiGJYgQpPIRWFPRyBZj02hXcrghABAQE?= X-IPAS-Result: =?us-ascii?q?A0GnYwCcHh5Z/4GlL8FcHAEBBAEBCgEBFwEFAQsBgwKBC4E?= =?us-ascii?q?MjniQe4IMAZEQhGgcCIF3hAkChkcBAQEBAQEBAQIBAmgogjMkAStUAQEBAQEBA?= =?us-ascii?q?QEBIioxPAYnUhAYCDFXGYhUgVOwazqLGgExiD2NcAWQJ4EBjGuHHIwBglePFYt?= =?us-ascii?q?kiGJYgQpPIRWFPRyBZj02hXcrghABAQE?= X-IronPort-AV: E=Sophos;i="5.38,360,1491264000"; d="scan'208";a="5923800" X-IronPort-Outbreak-Status: No, level 0, Unknown - Unknown Received: from mail-il-dmz.mellanox.com (HELO mellanox.co.il) ([193.47.165.129]) by emsm-gh1-uea11.nsa.gov with ESMTP; 18 May 2017 22:26:11 +0000 Received: from Internal Mail-Server by MTLPINE1 (envelope-from danielj@mellanox.com) with ESMTPS (AES256-SHA encrypted); 19 May 2017 01:26:05 +0300 Received: from x-vnc01.mtx.labs.mlnx. (x-vnc01.mtx.labs.mlnx [10.12.150.16]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id v4IMPsGd013313; Fri, 19 May 2017 01:26:04 +0300 From: Dan Jurgens To: selinux@tycho.nsa.gov Subject: [PATCH v2 5/9] libsepol: Add ibendport ocontext handling Date: Fri, 19 May 2017 01:25:45 +0300 Message-Id: <1495146349-75366-6-git-send-email-danielj@mellanox.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1495146349-75366-1-git-send-email-danielj@mellanox.com> References: <1495146349-75366-1-git-send-email-danielj@mellanox.com> X-BeenThere: selinux@tycho.nsa.gov X-Mailman-Version: 2.1.20 Precedence: list List-Id: "Security-Enhanced Linux \(SELinux\) mailing list" List-Post: List-Help: Errors-To: selinux-bounces@tycho.nsa.gov Sender: "Selinux" X-Virus-Scanned: ClamAV using ClamSMTP From: Daniel Jurgens Add support for reading, writing, and copying IB end port ocontext data. Also add support for querying a IB end port sid to checkpolicy. Signed-off-by: Daniel Jurgens --- v1: Stephen Smalley: - Removed unused domain and type params from sepol_ibendport_sid. - Remove ibendport initial sid from ocontext_selinux_isid_to_cil - Check the length provide for the device name in ocontext_read_selinux - Used strcmp for dev_name comparison. James Carter: - Added ibendport handling to kernel_to_cil.c and kernel_to_conf.c v2: James Carter - Sort ocontexts in kernel_to_common.c --- checkpolicy/checkpolicy.c | 20 ++++++++++++++ libsepol/include/sepol/policydb/services.h | 8 ++++++ libsepol/src/expand.c | 8 ++++++ libsepol/src/kernel_to_cil.c | 42 ++++++++++++++++++++++++++++++ libsepol/src/kernel_to_common.c | 18 +++++++++++++ libsepol/src/kernel_to_conf.c | 41 +++++++++++++++++++++++++++++ libsepol/src/libsepol.map.in | 1 + libsepol/src/module_to_cil.c | 14 ++++++++++ libsepol/src/policydb.c | 26 +++++++++++++++--- libsepol/src/services.c | 37 ++++++++++++++++++++++++++ libsepol/src/write.c | 14 ++++++++++ 11 files changed, 226 insertions(+), 3 deletions(-) diff --git a/checkpolicy/checkpolicy.c b/checkpolicy/checkpolicy.c index 8aeecc1b..b75f2afa 100644 --- a/checkpolicy/checkpolicy.c +++ b/checkpolicy/checkpolicy.c @@ -701,6 +701,7 @@ int main(int argc, char **argv) printf("i) display constraint expressions\n"); printf("j) display validatetrans expressions\n"); printf("k) Call ibpkey_sid\n"); + printf("l) Call ibendport_sid\n"); #ifdef EQUIVTYPES printf("z) Show equivalent types\n"); #endif @@ -1247,6 +1248,25 @@ int main(int argc, char **argv) printf("sid %d\n", ssid); } break; + case 'l': + printf("device name (eg. mlx4_0)? "); + FGETS(ans, sizeof(ans), stdin); + ans[strlen(ans) - 1] = 0; + + name = malloc((strlen(ans) + 1) * sizeof(char)); + if (!name) { + fprintf(stderr, "couldn't malloc string.\n"); + break; + } + strcpy(name, ans); + + printf("port? "); + FGETS(ans, sizeof(ans), stdin); + port = atoi(ans); + sepol_ibendport_sid(name, port, &ssid); + printf("sid %d\n", ssid); + free(name); + break; #ifdef EQUIVTYPES case 'z': identify_equiv_types(); diff --git a/libsepol/include/sepol/policydb/services.h b/libsepol/include/sepol/policydb/services.h index 3f3b95d1..efdf7de5 100644 --- a/libsepol/include/sepol/policydb/services.h +++ b/libsepol/include/sepol/policydb/services.h @@ -196,6 +196,14 @@ extern int sepol_ibpkey_sid(uint64_t subnet_prefix_p, sepol_security_id_t *out_sid); /* + * Return the SID of the ibendport specified by + * `dev_name', and `port'. + */ +extern int sepol_ibendport_sid(char *dev_name, + uint8_t port, + sepol_security_id_t *out_sid); + +/* * Return the SIDs to use for a network interface * with the name `name'. The `if_sid' SID is returned for * the interface and the `msg_sid' SID is returned as diff --git a/libsepol/src/expand.c b/libsepol/src/expand.c index e4cfc41e..8f7a25d8 100644 --- a/libsepol/src/expand.c +++ b/libsepol/src/expand.c @@ -2224,6 +2224,14 @@ static int ocontext_copy_selinux(expand_state_t *state) n->u.ibpkey.low_pkey = c->u.ibpkey.low_pkey; n->u.ibpkey.high_pkey = c->u.ibpkey.high_pkey; break; + case OCON_IBENDPORT: + n->u.ibendport.dev_name = strdup(c->u.ibendport.dev_name); + if (!n->u.ibendport.dev_name) { + ERR(state->handle, "Out of memory!"); + return -1; + } + n->u.ibendport.port = c->u.ibendport.port; + break; case OCON_PORT: n->u.port.protocol = c->u.port.protocol; n->u.port.low_port = c->u.port.low_port; diff --git a/libsepol/src/kernel_to_cil.c b/libsepol/src/kernel_to_cil.c index d1006186..f4ec8832 100644 --- a/libsepol/src/kernel_to_cil.c +++ b/libsepol/src/kernel_to_cil.c @@ -2841,6 +2841,43 @@ exit: return rc; } +static int write_selinux_ibendport_rules_to_cil(FILE *out, struct policydb *pdb) +{ + struct ocontext *ibendportcon; + char port_str[4]; + char *ctx; + int rc = 0; + + for (ibendportcon = pdb->ocontexts[OCON_IBENDPORT]; + ibendportcon != NULL; ibendportcon = ibendportcon->next) { + rc = snprintf(port_str, 4, "%u", ibendportcon->u.ibendport.port); + if (rc < 0 || rc >= 4) { + rc = -1; + goto exit; + } + + ctx = context_to_str(pdb, &ibendportcon->context[0]); + if (!ctx) { + rc = -1; + goto exit; + } + + sepol_printf(out, "(ibendportcon %s %s %s)\n", + ibendportcon->u.ibendport.dev_name, port_str, ctx); + + free(ctx); + } + + rc = 0; + +exit: + if (rc != 0) { + sepol_log_err("Error writing ibendportcon rules to CIL\n"); + } + + return rc; +} + static int write_xen_isid_rules_to_cil(FILE *out, struct policydb *pdb) { return write_sid_context_rules_to_cil(out, pdb, xen_sid_to_str); @@ -3242,6 +3279,11 @@ int sepol_kernel_policydb_to_cil(FILE *out, struct policydb *pdb) if (rc != 0) { goto exit; } + + rc = write_selinux_ibendport_rules_to_cil(out, pdb); + if (rc != 0) { + goto exit; + } } else if (pdb->target_platform == SEPOL_TARGET_XEN) { rc = write_xen_isid_rules_to_cil(out, pdb); if (rc != 0) { diff --git a/libsepol/src/kernel_to_common.c b/libsepol/src/kernel_to_common.c index 294f0b4e..01ffc8fc 100644 --- a/libsepol/src/kernel_to_common.c +++ b/libsepol/src/kernel_to_common.c @@ -532,6 +532,19 @@ static int ibpkey_data_cmp(const void *a, const void *b) (*bb)->u.ibpkey.low_pkey, (*bb)->u.ibpkey.high_pkey); } +static int ibendport_data_cmp(const void *a, const void *b) +{ + int rc; + struct ocontext *const *aa = a; + struct ocontext *const *bb = b; + + rc = strcmp((*aa)->u.ibendport.dev_name, (*bb)->u.ibendport.dev_name); + if (rc) + return rc; + + return (*aa)->u.ibendport.port - (*bb)->u.ibendport.port; +} + static int pirq_data_cmp(const void *a, const void *b) { struct ocontext *const *aa = a; @@ -660,6 +673,11 @@ int sort_ocontexts(struct policydb *pdb) if (rc != 0) { goto exit; } + + rc = sort_ocontext_data(&pdb->ocontexts[OCON_IBENDPORT], ibendport_data_cmp); + if (rc != 0) { + goto exit; + } } else if (pdb->target_platform == SEPOL_TARGET_XEN) { rc = sort_ocontext_data(&pdb->ocontexts[1], pirq_data_cmp); if (rc != 0) { diff --git a/libsepol/src/kernel_to_conf.c b/libsepol/src/kernel_to_conf.c index 23307ce6..a74873f0 100644 --- a/libsepol/src/kernel_to_conf.c +++ b/libsepol/src/kernel_to_conf.c @@ -2703,6 +2703,42 @@ exit: return rc; } +static int write_selinux_ibendport_rules_to_conf(FILE *out, struct policydb *pdb) +{ + struct ocontext *ibendportcon; + char port_str[4]; + char *ctx; + int rc = 0; + + for (ibendportcon = pdb->ocontexts[OCON_IBENDPORT]; + ibendportcon != NULL; ibendportcon = ibendportcon->next) { + rc = snprintf(port_str, 4, "%u", ibendportcon->u.ibendport.port); + if (rc < 0 || rc >= 4) { + rc = -1; + goto exit; + } + + ctx = context_to_str(pdb, &ibendportcon->context[0]); + if (!ctx) { + rc = -1; + goto exit; + } + + sepol_printf(out, "ibendportcon %s %s %s\n", ibendportcon->u.ibendport.dev_name, port_str, ctx); + + free(ctx); + } + + rc = 0; + +exit: + if (rc != 0) { + sepol_log_err("Error writing ibendportcon rules to policy.conf\n"); + } + + return rc; +} + static int write_xen_isid_rules_to_conf(FILE *out, struct policydb *pdb) { return write_sid_context_rules_to_conf(out, pdb, xen_sid_to_str); @@ -3108,6 +3144,11 @@ int sepol_kernel_policydb_to_conf(FILE *out, struct policydb *pdb) if (rc != 0) { goto exit; } + + rc = write_selinux_ibendport_rules_to_conf(out, pdb); + if (rc != 0) { + goto exit; + } } else if (pdb->target_platform == SEPOL_TARGET_XEN) { rc = write_xen_isid_rules_to_conf(out, pdb); if (rc != 0) { diff --git a/libsepol/src/libsepol.map.in b/libsepol/src/libsepol.map.in index 36225d1c..dd1fec21 100644 --- a/libsepol/src/libsepol.map.in +++ b/libsepol/src/libsepol.map.in @@ -7,6 +7,7 @@ LIBSEPOL_1.0 { sepol_iface_*; sepol_port_*; sepol_ibpkey_*; + sepol_ibendport_*; sepol_node_*; sepol_user_*; sepol_genusers; sepol_set_delusers; sepol_msg_*; sepol_debug; diff --git a/libsepol/src/module_to_cil.c b/libsepol/src/module_to_cil.c index 10d0700c..41f0d6ce 100644 --- a/libsepol/src/module_to_cil.c +++ b/libsepol/src/module_to_cil.c @@ -2776,6 +2776,19 @@ exit: return rc; } +static int ocontext_selinux_ibendport_to_cil(struct policydb *pdb, struct ocontext *ibendports) +{ + struct ocontext *ibendport; + + for (ibendport = ibendports; ibendport; ibendport = ibendport->next) { + cil_printf("(ibendportcon %s %u ", ibendport->u.ibendport.dev_name, ibendport->u.ibendport.port); + context_to_cil(pdb, &ibendport->context[0]); + + cil_printf(")\n"); + } + + return 0; +} static int ocontext_selinux_fsuse_to_cil(struct policydb *pdb, struct ocontext *fsuses) { @@ -2930,6 +2943,7 @@ static int ocontexts_to_cil(struct policydb *pdb) ocontext_selinux_fsuse_to_cil, ocontext_selinux_node6_to_cil, ocontext_selinux_ibpkey_to_cil, + ocontext_selinux_ibendport_to_cil, }; static int (*ocon_xen_funcs[OCON_NUM])(struct policydb *pdb, struct ocontext *ocon) = { ocontext_xen_isid_to_cil, diff --git a/libsepol/src/policydb.c b/libsepol/src/policydb.c index 09d14140..ab3b31f7 100644 --- a/libsepol/src/policydb.c +++ b/libsepol/src/policydb.c @@ -190,7 +190,7 @@ static struct policydb_compat_info policydb_compat[] = { .type = POLICY_KERN, .version = POLICYDB_VERSION_INFINIBAND, .sym_num = SYM_NUM, - .ocon_num = OCON_IBPKEY + 1, + .ocon_num = OCON_IBENDPORT + 1, .target_platform = SEPOL_TARGET_SELINUX, }, { @@ -302,7 +302,7 @@ static struct policydb_compat_info policydb_compat[] = { .type = POLICY_BASE, .version = MOD_POLICYDB_VERSION_INFINIBAND, .sym_num = SYM_NUM, - .ocon_num = OCON_IBPKEY + 1, + .ocon_num = OCON_IBENDPORT + 1, .target_platform = SEPOL_TARGET_SELINUX, }, { @@ -2804,7 +2804,7 @@ static int ocontext_read_selinux(struct policydb_compat_info *info, if (rc < 0) return -1; len = le32_to_cpu(buf[0]); - if (zero_or_saturated(len)) + if (zero_or_saturated(len) || len > 63) return -1; c->u.name = malloc(len + 1); if (!c->u.name) @@ -2835,6 +2835,26 @@ static int ocontext_read_selinux(struct policydb_compat_info *info, (&c->context[0], p, fp)) return -1; break; + case OCON_IBENDPORT: + rc = next_entry(buf, fp, sizeof(uint32_t) * 2); + if (rc < 0) + return -1; + len = le32_to_cpu(buf[0]); + if (len == 0 || len > IB_DEVICE_NAME_MAX - 1) + return -1; + + c->u.ibendport.dev_name = malloc(len + 1); + if (!c->u.ibendport.dev_name) + return -1; + rc = next_entry(c->u.ibendport.dev_name, fp, len); + if (rc < 0) + return -1; + c->u.ibendport.dev_name[len] = 0; + c->u.ibendport.port = le32_to_cpu(buf[1]); + if (context_read_and_validate + (&c->context[0], p, fp)) + return -1; + break; case OCON_PORT: rc = next_entry(buf, fp, sizeof(uint32_t) * 3); if (rc < 0) diff --git a/libsepol/src/services.c b/libsepol/src/services.c index 27e802c6..10338a65 100644 --- a/libsepol/src/services.c +++ b/libsepol/src/services.c @@ -1948,6 +1948,43 @@ out: } /* + * Return the SID of the subnet management interface specified by + * `device name', and `port'. + */ +int hidden sepol_ibendport_sid(char *dev_name, + uint8_t port, + sepol_security_id_t *out_sid) +{ + ocontext_t *c; + int rc = 0; + + c = policydb->ocontexts[OCON_IBENDPORT]; + while (c) { + if (c->u.ibendport.port == port && + !strcmp(dev_name, c->u.ibendport.dev_name)) + break; + c = c->next; + } + + if (c) { + if (!c->sid[0]) { + rc = sepol_sidtab_context_to_sid(sidtab, + &c->context[0], + &c->sid[0]); + if (rc) + goto out; + } + *out_sid = c->sid[0]; + } else { + *out_sid = SECINITSID_UNLABELED; + } + +out: + return rc; +} + + +/* * Return the SID of the port specified by * `domain', `type', `protocol', and `port'. */ diff --git a/libsepol/src/write.c b/libsepol/src/write.c index f63e7489..e486e286 100644 --- a/libsepol/src/write.c +++ b/libsepol/src/write.c @@ -1427,6 +1427,20 @@ static int ocontext_write_selinux(struct policydb_compat_info *info, if (context_write(p, &c->context[0], fp)) return POLICYDB_ERROR; break; + case OCON_IBENDPORT: + len = strlen(c->u.ibendport.dev_name); + buf[0] = cpu_to_le32(len); + buf[1] = cpu_to_le32(c->u.ibendport.port); + items = put_entry(buf, sizeof(uint32_t), 2, fp); + if (items != 2) + return POLICYDB_ERROR; + items = put_entry(c->u.ibendport.dev_name, 1, len, fp); + if (items != len) + return POLICYDB_ERROR; + + if (context_write(p, &c->context[0], fp)) + return POLICYDB_ERROR; + break; case OCON_PORT: buf[0] = c->u.port.protocol; buf[1] = c->u.port.low_port;