From patchwork Mon May 15 20:42:37 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Jurgens X-Patchwork-Id: 9727959 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 456376028A for ; Mon, 15 May 2017 20:44:08 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1E7752899F for ; Mon, 15 May 2017 20:44:08 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1335E289A3; Mon, 15 May 2017 20:44:08 +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=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 Received: from emsm-gh1-uea11.nsa.gov (emsm-gh1-uea11.nsa.gov [8.44.101.9]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D64E22899F for ; Mon, 15 May 2017 20:44:06 +0000 (UTC) X-IronPort-AV: E=Sophos;i="5.38,346,1491264000"; d="scan'208";a="5797406" IronPort-PHdr: =?us-ascii?q?9a23=3AtSJzcR/GVDhm3v9uRHKM819IXTAuvvDOBiVQ1KB5?= =?us-ascii?q?0uIQIJqq85mqBkHD//Il1AaPBtSErasfwLOL6ejJYi8p2d65qncMcZhBBVcuqP?= =?us-ascii?q?49uEgeOvODElDxN/XwbiY3T4xoXV5h+GynYwAOQJ6tL1LdrWev4jEMBx7xKRR6?= =?us-ascii?q?JvjvGo7Vks+7y/2+94fdbghMhjexe65+IRu5oQnMtsQan5ZpJ7osxBfOvnZGYf?= =?us-ascii?q?ldy3lyJVKUkRb858Ow84Bm/i9Npf8v9NNOXLvjcaggQrNWEDopM2Yu5M32rhbD?= =?us-ascii?q?VheA5mEdUmoNjBVFBRXO4QzgUZfwtiv6sfd92DWfMMbrQ704RSiu4qF2QxDmki?= =?us-ascii?q?cHMyMy/n/RhMJ+kalXpAutqwFjz4LRZoyeKfhwcb7Hfd4CRWRPQNtfWSJCDI27?= =?us-ascii?q?bYQPAfIBMORFo4TzuVQOtgCzCRWwCO711jNFnGP60bE83u88EQ/GxgsgH9cWvX?= =?us-ascii?q?rattr1MroZX+SozKnSwjXMcfVW2Szg44XPbx8uu/eMXbNufsrVy0kiDAbFgUuU?= =?us-ascii?q?qYzhJTyV0OMNsmeB4+V8UuKvjncqpgdsqTahwccsj5PGhoMTyl3c9CV225g6Jd?= =?us-ascii?q?ulR05jZt6kCodQuzuHOIRoXMMuW2RotzwiyrEcuJ67ei4Hw4kkyR7Hc/GLboeF?= =?us-ascii?q?7x35WOuRPDt0nmxpdb2hixqo7ESs0vDwW8263VpQoSdIkMPAum0M2hHT8MSLV+?= =?us-ascii?q?Vx80On1D2SzQ7c8PtELloxlafDLp4hxaM/mYQLvETYGy/2hF32jKiLdkU44uSo?= =?us-ascii?q?6/roYrHhppKEK497kBv+MqUzmsykG+g4LggPUHSb+eS7zrHj+1H2QK5WgfEsl6?= =?us-ascii?q?nZsZTaKdwapq6/HQBVzp4u5wuwAjqpytgVnWQLIEhbdB+IkYTlIUzCLOj9Dfil?= =?us-ascii?q?glSslDlrx+rBPr3kGpjNNWbMkLPgfbZ79k5dxxM/wstY55JJDLEOPOz8WlTqud?= =?us-ascii?q?zEDh42Lwy0w+H9BNV7zYMRQ3iDAqCeMKPMqVOI/P4gI/GQZI8JvzbwM/ol5/no?= =?us-ascii?q?jXAjhV8dfbOm3Z0MZXC6GfRmJUCZbmD3gtcdD2gKpBE+QPbtiF2YXj5Zf2yyUL?= =?us-ascii?q?4k5jEnFIKmCp/ORoKvgLObwCi7HYZWZmdAClCND3flbIuEW/MRaCOdOcBhjzoE?= =?us-ascii?q?VaS8S4M70hGurgD6waJ9LuXI4i0YqY7j1N9t6uzdlBEy8Tl0ANqH02yWQWF7gH?= =?us-ascii?q?4HRzgs3K9luUx90FCD0apmjPNECdxf/fRJUh01NZTE1ex1F8jyWh7dfteOUFup?= =?us-ascii?q?X8mpATQ2TtI3398Cfl1wG8u8gRDZ3iqrArgVl7qRCJwy7K3cw2D7J9xhxHbeyK?= =?us-ascii?q?khk14mT9NSOm26nKF/7RPeCJLOk0Wci6mlb78c3DLX+GeF02WOoFlSUBRsXqXd?= =?us-ascii?q?QXAfekzWoMz550LDSL+uD68qMg5FycKbK6tKbMfljVNcS/f5O9TeYnyxlHmqCR?= =?us-ascii?q?aO2LyMcJLge38B0yXFFEgEjwcT8G6YOggmHCihuWPeDCd1GFL3eUzs6+h+qGij?= =?us-ascii?q?Tk8w1Q6Fc1Nu26Cy+h4PivyWU+kT0a4cuCc9tzV0G06w39zMC9WaoQpuYKRcYc?= =?us-ascii?q?gm7VdCzWLZthVxPoeuLqB5nFIedB53v0z23RVtFopAidQqrG8tzAdqKqKXylBB?= =?us-ascii?q?dzSF3Z3rOb3YMGry/Beya6LM3VHeytmW8L8V6Psks1XjoB2pFk06/np9ztZVyX?= =?us-ascii?q?qc6YvQDAcJS53+TkM3+wJ9p7HAbSk3/5nU2mF0Mamorj/C3MokBPAryha6eNdf?= =?us-ascii?q?K7+EGRTpE80cAMivJukqlEKvbh4eOuBd6rI0Ndu8d/SawK6rIPpgnDW+gGVJ+o?= =?us-ascii?q?991l6M+DRmSu7TxJsF3e+X3hGcWDfhiVetqMf3mZpLZTsKBGqw1TDkBJJNZq11?= =?us-ascii?q?ZYsLFXqhLNC2xtpkg57gQGJX9FmmB1wawsCpYgaSY0b73QJOyUQduWanljegzz?= =?us-ascii?q?xojzEpqbKS3CrPw+TmcBoIJHVLSXJ4gljyO4i0iMoWXE+ybwgmjBGl/1r1x7BH?= =?us-ascii?q?pKRjKGneWVlIfynqIGF+VauwrKCObNJP6JMvtyVXX/+xYVSbSr77uRQaySTjE3?= =?us-ascii?q?FZxDAheDGgoo/5kABiiGKBMHZzq2LUecVxxRfE+NzQXOVR0SQCRCl5jznXG1e9?= =?us-ascii?q?MsKy/dWMlpfDtOG+WH66VpFJdynk05+AvjOh5WJ2GR2/g+yzmtr/HAgg1i/709?= =?us-ascii?q?1qWjvSrBngZYnq2b+3Mfl6fkZ0H1/w8c16GptxkoEonpEfxWAahomJ/XoAiWrz?= =?us-ascii?q?Kc9U2b/6bHYXXzEH2cXa4A/h2E1/KXKJwZn0VnCBzstnYNm1fnka2iQj4MBWEK?= =?us-ascii?q?2U9qBLnTNpolqkqgLceft9kSkbyfs183MagP8GuAw2ziWbHL8SAVNUPSv2lxSH?= =?us-ascii?q?99q+trlYZH6zcbis00pzhc6hDLefrQxHRnb5fIotHS9q4sV5Ll3MzGX56pv4d9?= =?us-ascii?q?nIcdITqhqUng/Yj+dPNZIxkuEHijZmOWLhvXwp0uA7ggZo3Z2gu4iHMWpt9rqj?= =?us-ascii?q?AhFELj31e98T+jb1gKZEg8mZwpuiHppkGjQERpfoS+ynEC4Kv/T9KwmOCCE8qm?= =?us-ascii?q?ucGbfHBQ+Q8lpmr3bRHJCzLX6XImUZwst4RBSGOUxfmx4bXC8hnpIjDQCqw9Hh?= =?us-ascii?q?cF1l6T8P6F74rQFMyu12OBXlVGfQuhuoYC8uSJeDNBpW8h1C50DNPMyQ9O1zGT?= =?us-ascii?q?1Y/pqkrAGWJGyUeRlHDWYTWkOeH1DjJL6u5dve/OeEGuqyNfzOYa+BqeZGTfeH?= =?us-ascii?q?2Yqv0pd6/zaLLsiPO2NtD/k/2kVdQXB5B97WlC8URiwRiS3Nc9Wbqwum9S1vsM?= =?us-ascii?q?+z6vLrVxzz5YGXEbtdLc1v+wyqgaeEL+OQnjx1KDhC2pMJ33DIzL8f3V4Jhi50?= =?us-ascii?q?azatFK4MtSnXTKLfgqVXFQIUaztvNMtU6KIxxgdNOdTFhdzozb53lPg1C0tCVV?= =?us-ascii?q?z6gcymf9AFI2SnOFPAHkaLO6yMJSfXzMHvfaO8VbpQgf1Stx2qozmbC1fjMy+N?= =?us-ascii?q?lznoTRCvKv1MjC+aPBxYoo69dApiCWn5Q9LicBG7N8V3jTIuy70umnzKLXIcMS?= =?us-ascii?q?R7c05Vtr2f8zhXjet5G2xA8nplKvKJmyeH4ObGNJkaq/xrAj57l+hC+nQ116NV?= =?us-ascii?q?7D1YRPxygCbdtcVhr1aikumO0TpnTAFOpixQhI2VoUpuI77Z+YdEWXbF+hIN8G?= =?us-ascii?q?qRBg8WqNplEN3vprtQxsLBla3pNDdC6NXU/c0GC8jTMsKHP2IrMQD1Fz7MEAsF?= =?us-ascii?q?UTmrOHnEh0NHjvGd7HKVoYYhqpX3g5oBUKFbW0Y6FvwEEURpBtoCL4lrXjk8i7?= =?us-ascii?q?6UkNYI5WairBnWXMhVpZHHVv2VAfXpMzuWkKdLaAAJwbziK4QfLIr721ZtalNi?= =?us-ascii?q?hoTFB1LQXcxRoi1mdgI7ukpN/2JgTmItwE/lbRut72EVFf6xhBE2iw9+bv8q9D?= =?us-ascii?q?bj+Vs3IUDKpCQomkkrhdrlmSyRcCL2LKqoQYFWDC/0u1IrMpP8Qgd6cwuykld+?= =?us-ascii?q?NDfDWb1RjKBtenxsiA/ZpZRAA+VcTbFebB8W2/6Xe+0i0U5ApSW/2U9H+ezFBI?= =?us-ascii?q?NhlAoqdZ6jsWlN2wdkbN47K6zfOrZJzkRQhqKJuy+nyPo9wAkAKEYR6GmSYjIH?= =?us-ascii?q?uFQUNrk6ICql5ups5hKYlDtHY2UMVP0qoul29kwnPeSA1CHg079ZJkC3KeOfM7?= =?us-ascii?q?uTu3Lcms6QXlMwykQImlFf/bdoyscsbVCbV1ozw7uRDBkGLsvCKRtIYMpV+njT?= =?us-ascii?q?ZTyOvvvNwJ5vOYWyCPzoR/eUtKkImkKkABopH4MU48scGZms1kfYItr5I74ByB?= =?us-ascii?q?Ug/x7kK0ufDPROYh6Lly0Ho86nxp9twYZdPi0dAXl6MSiv+7nYvBEqgPueU9ct?= =?us-ascii?q?eXoVRJEENmgxWMy0gC5WoWhPDCSt0uIY1AiD7yXwpiLOAzngd9BjfuubZQtwCN?= =?us-ascii?q?Gq/jUy67W5iUXJ/ZrEKGH6L85tusHU5OMBvZmHCO5UTaNnvEvGn4lYWnqqXHTV?= =?us-ascii?q?EdKsO5jwbIosbNzzCnqgVFywlS41Rd/rPNmxNqiInR3oRYFMvYmf2zAjL9GyFj?= =?us-ascii?q?cfGhd3vOwD66R8ZRAZb5o8ex7ouBw0N7ajLweAztWuX2GtJCNNT/ZByeW6ZrpX?= =?us-ascii?q?zzcjb+Kh1HQgSZQ6wPWt/k4WWJEGlBfeyui/Z4NGSyj8BmRdexnTpSo+j2VhNf?= =?us-ascii?q?wyw+clzxPOrVkcMyuGdONuaGxco94wH1WSLmtqCmAgXV+TkZLD4hKw37AV5yZd?= =?us-ascii?q?g9dU0ehCsHjivp/eYCmhV7GqqZTVqSUvdsIqo6tvPoz/OsGGro/RniTDTJnMtQ?= =?us-ascii?q?2ISDS1F/5bmtdMPi1XWPxImGEjOcwBv4pO81E8Wdw/J7NVDqkgv76qaSd+AS4U?= =?us-ascii?q?0yAZS5uK3CYejeekx7vaihCQfYw5PxMatpVPmcESXDNoYiwAvq+jTJ/Zl3WES2?= =?us-ascii?q?QRJwcT9wtM7hoaloBsZuDl/JbITJhUxj5ZvvJ0Uy/LFp12+Fv+UWyZnEb3R+6g?= =?us-ascii?q?k+Oz2wJe1vXs0sMUWBRnE0hS2/5Wllc0KLFwM6QQpIjKsj6UekP6u2LtzPCmKk?= =?us-ascii?q?FIx8PJbVP1EI3LuHHgXS0b/H0bWZVAyGrDFZgIlQp2drorrk1WII+6Ykb++yAk?= =?us-ascii?q?x4NxErmiT8+r3VElom0dSie2CdpOEf9mv0zTWD1kZZCrp5HlO5RdQm9Q5J2dpU?= =?us-ascii?q?1WkF9oMyKjz5pTNd1N6CYWXDdTuTWdoMeySMpb1M54FZMDPtd/u3b4GKNFIpeR?= =?us-ascii?q?oGY7ur3xxXDH5T8wqlC6xC+8G6WgVeJW43UeGhk1J2SZskQgFfEs8nrU8lzXsV?= =?us-ascii?q?B55OZbBrmOjUVtuzlxBJZOCShV1Xq9NVR8UGFGs/lGKKTSa8FcQv8yZQOxNBw6?= =?us-ascii?q?C/Em2lKG/V1unXb5eCFysRNa9D7bXwkxTyYVg7PtliYZqsCoIzMaTIhIbTo5ZS?= =?us-ascii?q?ffNw2bgTxXvApYa0xyVJAZGMxK+7cH3YZP/8rCTkitKScZXBxiKA040PxflVJd?= =?us-ascii?q?v0WCYyzdCxSnderXuB1tYciRtNKpLOj+/ApfloPnt+U4+r4fR3G6nA2iWsrSr4?= =?us-ascii?q?niud2WrkGObrv3M/WgYX/dSzjBlRCwiq0+D5bQ+yjcLRFWJIRkxno8eZjuF2rL?= =?us-ascii?q?MgpcJ64BIEpbT696Y81cou9Gf89kZLoJ+ah1CxKFQRPgBpeio+RYIVbIWzveNT?= =?us-ascii?q?mB/fKiro7J67zSV/TgbNSWx3nbW6J3Iot66T7jFrjx349R5lb61/Vw+k50UlXJ?= =?us-ascii?q?LyeBrNH9KQwR/8mialHuvps3EjPKGJ1wimbixllcd8oLRC2n6I4Yx41E53bwU+?= =?us-ascii?q?14zlP+sOlV97l694Y7/axmycCpKqjMM/hat1FoAgSMDAVw6potGHR/R3xWYuIJ?= =?us-ascii?q?MPfRZrgZgtrzpODrDKEX8xqV+/FDadTbOU7BnNW/CiuGRhxAhgsBriQaLgSE3f?= =?us-ascii?q?6fh6B0UdqlpfT+2k81/1i+NAAJw65w6oqf56qIoPPXbwHLwrgaW6jqQcfzoaow?= =?us-ascii?q?u0+I4v0kjrEOcHRvYwK7COgdStIdxmD4wKAo1y0sCcTDH6nk+PFZSXI0hTfgm4?= =?us-ascii?q?15H1UKG/MbAbuL8p5YnmcjgeDZMccWcq9akGaVCRGkCqMCyWKs6yaPImlqmBfO?= =?us-ascii?q?0x/qQWO08VD5szR1QTfWwNfliUpVUaO7BUFMUCq1IUV4qi+APBL0tNrrvqQ49E?= =?us-ascii?q?c2Mmj/udKMkmuhPalbH8z5JNySOyk7vkkXjIErRtyyxY8bBce9IM0P/31kafve?= =?us-ascii?q?8WyrmTdbo6hbn4re/t2V+vLPEHmmjq2Vt7KNxDRCxXgjp10/69egNvbV592RWP?= =?us-ascii?q?mo0mkcTihltwvGRR61paTRr0oINkyTzEfLhIsKM8lF0nYi0kHp+vMjQM4z9QVZ?= =?us-ascii?q?DYvAfO8NpTHtNzvy3VafYsg4WjOY0zRJAlL/CUN4F7Qk2GLsoMLJkm/d+1kzRo?= =?us-ascii?q?l1d0HqnhJ3AJslJkIq8lgY2DIDERIKaRCZEr6nGVjlIZEDVUgZZhSNxKK6dbsv?= =?us-ascii?q?3U1v3rOv4/febe59B6oILftdixCBnVhFFZIMsK0eRr18d0Vb9KHJugjoE5LnUO?= =?us-ascii?q?T+lXosKf21RdhX8cEYtnQ4+AmwWwGt6Yxd4LYHlp+HarRIYZ/WvMBz901n/yIA?= =?us-ascii?q?djRRgBhjiBO0SfsTpOH44tnVqpWo6OeuVLo1R+oN6hg0A39zgIf3gF8+v97Yzf?= =?us-ascii?q?pcSpfSiYTl6g9BOXmKuJzV0xNkM+oBN5qrfKp893UAPyUeP2gBPcaKZPk87S5t?= =?us-ascii?q?Ny/T519bDsMXe9wYOMvNmQZJikzmQ7xT7tDUGkOEBIdzecEo6HD3yDMv/Zs/TO?= =?us-ascii?q?ng8jm2Ko7b711XOPNDlipsnsrYpOcJ2frSFDQX4X6BZhhp2CON1Z2NBOz2/eqS?= =?us-ascii?q?09zbSlIGHiE3U4dBPjWC4haoRvColJnzVAOb9NPziookdE2MXnyxgLgFsqFUHO?= =?us-ascii?q?5PkCr7xCZRFpz1h/+Ot9qs6XdXuUNHEIlp8B3FA79TPpNlNhTkjsOrXFRzBjPj?= =?us-ascii?q?eMHIcRojoOWWyfkK4+ViMEv+YogXIgkaxLL+6HpVSBZuSbHts1adQ+0RfttnR+?= =?us-ascii?q?neonBT941gN7cFPEKBq5zysjdItFc2DRc1Z78ytDNValLDkxFSW6bwvL4AixUT?= =?us-ascii?q?UcRluUBSBW2wOHgy5z3dVaRalKOREuAa8i2PTqwSVEVlKiZ+QxSz2JVydLumg+?= =?us-ascii?q?tKsmZHnixnpvglzSBmRRW7uS32pKINwigs+LemuzUdoXZFVPmRkz/UCVVfy/QH?= =?us-ascii?q?lagcBGr56VyneXUNcYT87r9mJcTm6Ikg7G8yYRomfyIcW+SvFTv8j6SSAoyAqN?= =?us-ascii?q?hcngKCuN3Sbb+vKigfLrY9yRXjR3h7yATRgBZo8G8WQjq97d4kJYO9Od0mxiqp?= =?us-ascii?q?AmXbalcM4r1Tv8v1qFELTfE6aVV/z2V/ysKHXDECRNTTG2YpiQgpcWREcIxZ5h?= =?us-ascii?q?8cDKQohiuIsbRH/gETezfYCIOl+pPfnc3Qw3kyUc9qxn7Kpq2Cnp4q0mNqm916?= =?us-ascii?q?7i6Ko3kTefbXU8lyDXjvzItfz/LxZ+m1uOAdVIRm0KihUOMFMsS79mu23JJqW0?= =?us-ascii?q?G7ybQaG1q0K/QDxrDdUyekVWKUQ+KLfHaQnzwhKE79+QGoLkEraMdNt0I9MOvC?= =?us-ascii?q?h55Elw3mVbN0RzmQqkHAwWwmMOMaaxg2t5m9dwwNVu4RaPCWJfIyz/0mFFsMc3?= =?us-ascii?q?jJEDNqC++3tF6gh5R7O3R87kX5f+vt9hrqMN2MFRkYCYTatIJ++eSmRmKdPn9t?= =?us-ascii?q?1BhyPEh39+fcEFQ8re1cfIySndjXgdR0z+gFe+1rMSIjpt4Zgphj5pWM0MeWbR?= =?us-ascii?q?HRyY7/KsrLrfieH/3S1F8qemVdUroFfQP1+Zs1McMjV73UB7tZsgwWBbImT5w5?= =?us-ascii?q?K2fx6KZ0IRtrcg7WYLS7mNPqp+yMZptQqX/b9VcwLCDbux0Y1PO7URZ7b5exh3?= =?us-ascii?q?XpIZAwQD1Bo8dqCht8E4tFA9kAoBa/A56IhKG7jMe8+01ktO8OsKrwEu7F2c+4?= =?us-ascii?q?3oVwWpha4FKEPCzVBKZ1mEhlif6ygvjY2JnrFcziYc8EVPR8QmPdZL7GBp+/Kj?= =?us-ascii?q?OSNc3iYENG9r+c0K5jUhqPfiz5WLCGtCK8PvV+/Uo70pB4fPbUzDE16LHb3MX9?= =?us-ascii?q?anpDpient3GJL4df7F3WCuzCRRJbV+SK/HxjHaIJcYv+7P0OPsA6wNiA/wlz6y?= =?us-ascii?q?xP0M+EI6ins0/N1Vt3dZbaLEvyxyY5QpIHIBWlPksqhm/VsHPdAW5TLsK8M8li?= =?us-ascii?q?nM6VDgDx50l2gWwtfXBOGm7pRdeXJGga1MWyagKW9AJLEdkDhfC4eVYiuaCpSu?= =?us-ascii?q?lnJI9FmeO0u7UDitlpNi7PSNJdPyHKI798JiBRAfnXpFg0fh4EtKA4WoIvapeS?= =?us-ascii?q?IEMHMUGAySTpwAvc0E30ccKj1KKIICYQ73VGwKjJ0T9Wpwm2ofyZmNHsUKjFbJ?= =?us-ascii?q?HqW/7fKCglWSuZRTQ1Ckmk4kqku/wYvPqYJmcfv18UYiKOCAIJoKBgs8TQBHfJ?= =?us-ascii?q?meJ/ZJ0KmOyaWyfoRS13jqU9HTxLtUGSTPoHDgTWcXvhj3BHuAyjO/9A53TlYK?= =?us-ascii?q?OExqBNQewZHpNMcuGFQ9vfYf1eJTIoljIDOOamft3ctK000lTSQmscDabI9UeS?= =?us-ascii?q?TEmMQvyT3zjrR5kav5Aouio0/dLdhjR3E6rNP7mDpjOj8ZW1jDiGtu3EV2ksYk?= =?us-ascii?q?s1gOQYDGmH3hZANDJMN9ZAo0zpQ6idd25QxXkpjqRowBZKdwNtAVN01XgDsP+7?= =?us-ascii?q?Uu9EU1EZinjmFPEPalF6CDEY+EKO5gT0ZsxGssfWETwNvoAQQJYQeaF7oLLcP7?= =?us-ascii?q?EdlbNwhD8=3D?= X-IPAS-Result: =?us-ascii?q?A2EOMgCREhpZ/wHyM5BcHAEBBAEBCgEBFwEBBAEBCgEBgwE?= =?us-ascii?q?pYoEMjnaQbYIMAZEPhGQlA4F3iUFXAQEBAQEBAQECAQJoKIIzJCxUAQEBAQEBA?= =?us-ascii?q?QEBIioxPAYBAiRVAwkBARcIKQgDAVMZBYhQgU4ErlI6JgKLBIg9jXAFkCKBAYx?= =?us-ascii?q?nhxyMAYJXiECGUotiiGFYgQpPIRWEeQFDHIFmc4YxK4IQAQEB?= Received: from unknown (HELO tarius.tycho.ncsc.mil) ([144.51.242.1]) by emsm-gh1-uea11.nsa.gov with ESMTP; 15 May 2017 20:44:05 +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 v4FKi4sX021632; Mon, 15 May 2017 16:44:05 -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 v4FKhPwg276874 for ; Mon, 15 May 2017 16:43:25 -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 v4FKhKZ0021276 for ; Mon, 15 May 2017 16:43:25 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A1B1AgCREhpZf4GlL8FcHAEBBAEBCgEBgyyBC4EMjnaQbZgEJIYAAoYNAQIBAQEBAQITAQEhXYUZAwMnUhAYCDFXGYhVgVKuUjqKegExiD2NcAWQIoEBjGeHHIwBglePEotiiGFWgQtPIRWFPRyBZj02hjErghABAQE X-IPAS-Result: A1B1AgCREhpZf4GlL8FcHAEBBAEBCgEBgyyBC4EMjnaQbZgEJIYAAoYNAQIBAQEBAQITAQEhXYUZAwMnUhAYCDFXGYhVgVKuUjqKegExiD2NcAWQIoEBjGeHHIwBglePEotiiGFWgQtPIRWFPRyBZj02hjErghABAQE X-IronPort-AV: E=Sophos;i="5.38,346,1491278400"; d="scan'208";a="6053069" 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; 15 May 2017 16:43:24 -0400 IronPort-PHdr: =?us-ascii?q?9a23=3AEIDyKhAIrBLI4RvOSG1mUyQJP3N1i/DPJgcQr6Af?= =?us-ascii?q?oPdwSPvzosbcNUDSrc9gkEXOFd2CrakV1KyP6Ou5BDZIyK3CmUhKSIZLWR4BhJ?= =?us-ascii?q?detC0bK+nBN3fGKuX3ZTcxBsVIWQwt1Xi6NU9IBJS2PAWK8TW94jEIBxrwKxd+?= =?us-ascii?q?KPjrFY7OlcS30P2594HObwlSijewZbF/IA+roQjfucUanItvJrgswRbVv3VEfP?= =?us-ascii?q?hby3l1LlyJhRb84cmw/J9n8ytOvv8q6tBNX6bncakmVLJUFDspPXw7683trhnD?= =?us-ascii?q?UBCA5mAAXWUMkxpHGBbK4RfnVZrsqCT6t+592C6HPc3qSL0/RDqv47t3RBLulS?= =?us-ascii?q?wKLCAy/n3JhcNsjaJbuBOhqAJ5w47Ie4GeKf5ycrrAcd8GWWZNW8BcXDFDDIyh?= =?us-ascii?q?dYsCF+oPM/hFoYfzpFUAqhmxBQe3Ce/z1jNFnGP60Lcm3+g9FwzNwQwuH8gJsH?= =?us-ascii?q?TRtNj7Or0dUeaox6fM0DXDdfxW1in76IjTbxsspuyDUqh2ccrQ10YvEwHFg06V?= =?us-ascii?q?qYP7OzOV0v4Cs26c7+tvT+6gl2knqwRorzWp28wihI7JhocPxVDF8yV02Ic1Ks?= =?us-ascii?q?amR059fNGkCJxQtzuGN4dsX8wtXX9otD4/yrIcoZ63ZikKyJIhyhXCaPKHa5CF?= =?us-ascii?q?7g/nWeufOzt1i3BodKiiixuz8UWs0PDwWtew3VtMsyFLiMPDtmoX2BzW8sWHSu?= =?us-ascii?q?Vy/kOm2TuX0gDc9OVEIUQumqrdLJ4gzaQ8mYYUsUjZHy/2nF36jK6Qdko65uil?= =?us-ascii?q?8/nrb7Hoq5OGOIJ5iBvyPrkvl8G/G+g0LxYCUmyD9eS5zrLj/En5QLtQjv0xl6?= =?us-ascii?q?nUqI3VKt4dpq64HQBV1oQj5g26Dzi41NQYmWMILFRCeBOIlYTmJ1bOIPXgAfel?= =?us-ascii?q?n1usiCtrx+zBPrD5GZXCMHzDkLbnfbZg5E9R0xYzzNBD6JJUDbENOvTzWlTru9?= =?us-ascii?q?DCAR85NBK0kK7bD4Bm24cfX3+fKrOIO6PV91mT76QgJPffSpUSvWPRIv5txeP0?= =?us-ascii?q?gnI/ghdJcaCv3JYTali9E/BiKkOecTznhdJXQjRChRY3UOG/0A7KajVUfXvnGv?= =?us-ascii?q?tkvjw=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0HuGgBvERpZf4GlL8FcHAEBBAEBCgEBF?= =?us-ascii?q?wEBBAEBCgEBgwGBC4EMjnaQbYINkQ+EaCSBd4QJAoYNAQEBAQEBAQECAQIQAQE?= =?us-ascii?q?hXYIzJAErVAEBAQEBAQEBASIqMTwDAydSEBgIMVcZiFWBUq5YOop6ATGIPY1wB?= =?us-ascii?q?ZAigQGMZ4ccjAGCV48Si2KIYVaBDE8hFYU9HIFmPTaGMSuCEAEBAQ?= X-IPAS-Result: =?us-ascii?q?A0HuGgBvERpZf4GlL8FcHAEBBAEBCgEBFwEBBAEBCgEBgwG?= =?us-ascii?q?BC4EMjnaQbYINkQ+EaCSBd4QJAoYNAQEBAQEBAQECAQIQAQEhXYIzJAErVAEBA?= =?us-ascii?q?QEBAQEBASIqMTwDAydSEBgIMVcZiFWBUq5YOop6ATGIPY1wBZAigQGMZ4ccjAG?= =?us-ascii?q?CV48Si2KIYVaBDE8hFYU9HIFmPTaGMSuCEAEBAQ?= X-IronPort-AV: E=Sophos;i="5.38,346,1491264000"; d="scan'208";a="5797361" 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; 15 May 2017 20:43:23 +0000 Received: from Internal Mail-Server by MTLPINE1 (envelope-from danielj@mellanox.com) with ESMTPS (AES256-SHA encrypted); 15 May 2017 23:43:21 +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 v4FKglb4005032; Mon, 15 May 2017 23:43:20 +0300 From: Dan Jurgens To: selinux@tycho.nsa.gov Subject: [PATCH v1 5/9] libsepol: Add ibendport ocontext handling Date: Mon, 15 May 2017 23:42:37 +0300 Message-Id: <1494880961-73481-6-git-send-email-danielj@mellanox.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1494880961-73481-1-git-send-email-danielj@mellanox.com> References: <1494880961-73481-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 Signed-off-by: Daniel Jurgens --- 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_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 ++++++++++ 10 files changed, 208 insertions(+), 3 deletions(-) diff --git a/checkpolicy/checkpolicy.c b/checkpolicy/checkpolicy.c index d0e46ba..94bf083 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 @@ -1245,6 +1246,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 459254e..e4f2f11 100644 --- a/libsepol/include/sepol/policydb/services.h +++ b/libsepol/include/sepol/policydb/services.h @@ -196,6 +196,14 @@ extern int sepol_ibpkey_sid(void *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 c45ecbe..061945e 100644 --- a/libsepol/src/expand.c +++ b/libsepol/src/expand.c @@ -2226,6 +2226,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 fcfd0e0..6587ff4 100644 --- a/libsepol/src/kernel_to_cil.c +++ b/libsepol/src/kernel_to_cil.c @@ -2837,6 +2837,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); @@ -3238,6 +3275,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_conf.c b/libsepol/src/kernel_to_conf.c index 795cf56..ba261cf 100644 --- a/libsepol/src/kernel_to_conf.c +++ b/libsepol/src/kernel_to_conf.c @@ -2699,6 +2699,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); @@ -3104,6 +3140,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 36225d1..dd1fec2 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 c97f453..04394f0 100644 --- a/libsepol/src/module_to_cil.c +++ b/libsepol/src/module_to_cil.c @@ -2773,6 +2773,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) { @@ -2927,6 +2940,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 d6e8e6f..9a11d45 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, }, { @@ -295,7 +295,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, }, { @@ -2788,7 +2788,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) @@ -2819,6 +2819,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 4236aac..f444f10 100644 --- a/libsepol/src/services.c +++ b/libsepol/src/services.c @@ -1962,6 +1962,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 fa1b7d1..e3ff389 100644 --- a/libsepol/src/write.c +++ b/libsepol/src/write.c @@ -1426,6 +1426,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;