From patchwork Mon May 22 13:08:27 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Jurgens X-Patchwork-Id: 9740265 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 97EDF601C2 for ; Mon, 22 May 2017 13:11:22 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 887A328382 for ; Mon, 22 May 2017 13:11:22 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7D4EF28671; Mon, 22 May 2017 13:11:22 +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]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E1E4428382 for ; Mon, 22 May 2017 13:11:20 +0000 (UTC) X-IronPort-AV: E=Sophos;i="5.38,377,1491264000"; d="scan'208";a="7297825" IronPort-PHdr: =?us-ascii?q?9a23=3AHN6KCRx/VgCKdvPXCy+O+j09IxM/srCxBDY+r6Qd?= =?us-ascii?q?1eseKfad9pjvdHbS+e9qxAeQG96KtLQe1KGI6ejJYi8p2d65qncMcZhBBVcuqP?= =?us-ascii?q?49uEgeOvODElDxN/XwbiY3T4xoXV5h+GynYwAOQJ6tL1LdrWev4jEMBx7xKRR6?= =?us-ascii?q?JvjvGo7Vks+7y/2+94fdbghMhjexe61+IRe5oQjQqMUdnJdvJLs2xhbVuHVDZv?= =?us-ascii?q?5YxXlvJVKdnhb84tm/8Zt++ClOuPwv6tBNX7zic6s3UbJXAjImM3so5MLwrhnM?= =?us-ascii?q?URGP5noHXWoIlBdDHhXI4wv7Xpf1tSv6q/Z91SyHNsD4Ubw4RTKv5LplRx/yjC?= =?us-ascii?q?cMKiA3/mfZhMdtiK5XuQ+tqwB6z4PSfYqbNudxfrnFcN0aW2RPQ8hfWS9GDIy+?= =?us-ascii?q?YYsPF+gMMftWoobjvFsDtgeyCRW2Ce/z0DJEmmP60Ksn2OohCwHG2wkgEsoAvn?= =?us-ascii?q?vOqtX+KaMcUf2vzKnH0zrDaehW0ir65YfVaB8hp/CMUqx0ccrT0kQvEh3KjlGU?= =?us-ascii?q?qYP/OTOV0esMv3KH4OpnUOKikmgqoBx/rDiow8cjkIjJhoQNx1DF7ip23oA1Ks?= =?us-ascii?q?CgSE58e96kDIFcuDyEOItoWs8iRntnuD4gxr0Hv562ejUBxpc/xxPHdvCKfIeF?= =?us-ascii?q?7gjjWeqMOzt0mn1odKylixqv6USs1+nxW8eu3FtFrCdJiMTAu3EN2hDJ98SLVP?= =?us-ascii?q?9w80G80jiVzQ/T8PtLIUUsmKreLJ4u36A/m4IIsUTGAi/2gEL2jLKKdkk8+uin?= =?us-ascii?q?9eDnYrL+q5+ALYB0kAD+Mrk1msClHeQ5MhQBX2ic+eim0r3s4Vb5T6lQgv0zk6?= =?us-ascii?q?nZtIjWJcUdpqGnHw9Yypsv5hmwAju80NkUgGMLIExKdR6ZlYTlJknCIPXiAve+?= =?us-ascii?q?h1Ssni1rx/fDPrD5GZXCMHzDkLbnfbZg5E9Q0RE8zddC55JSFr4OPunzV1TttN?= =?us-ascii?q?3YEhA5Mwu0z/zhCNVmzIwSQ22PAqiHMK/Kq1+H+vovI/WQZI8SoDv9Kf8l5/j0?= =?us-ascii?q?gn8lmV8SZ6+p0IAVaHC/GPRmJl+WYWHwgtgfC2cKpRAyTOvwiF2NSTRTfWq9X7?= =?us-ascii?q?og5jEnD4KrFYXDRoK3j7Od3ye7BZpWZmZHClCSCnroeYGEW+oDaS2JP89hlCAE?= =?us-ascii?q?VaW7R48mzxGuuxfwy6B7IerM5i0YqZXj2cBt5+LNjh496zp0D8WB02GKVGx0n3?= =?us-ascii?q?0HSCEo06xlpkx90FiD27Big/NEDdxT++9JUgAiOJHByOx6DdbyVR/fcdeNSVar?= =?us-ascii?q?Wc+pDi8rTtI22dMOZFx9G9q6hBDZwyWqG6MVl6CMBJEs763cw2L+J9xmxnna06?= =?us-ascii?q?khikUpTdFUNW26nKJ/8RbcB5LRmUWDi6mqbbgc3DLK9GqbzGqOul1YXxB0Uarb?= =?us-ascii?q?WHAQeFfWrc75507ZSL+uEaooMg1EycGYK6tKbsbmjVJJRfv5P9TeeW2xkX+qBR?= =?us-ascii?q?mU3rOMcJbqe2IF0STdCUkElAYT8G2DNQg6HyuhomTeACZoFV31eUPs8uh+qG2l?= =?us-ascii?q?QUMuyQGFcVFh3aKv+hEJnfycV+8T3rUctSg6sDp4G1K939PNC9qcvAptZr5cbs?= =?us-ascii?q?0h71tdzmLWqQh9Pp2mL6B/iV8TaBh4vkP01xVqEYVMi8Yro2k2zAppLqKY1klN?= =?us-ascii?q?dzSC3ZD/IrfXMHX9/Aiza67K3VHTyMiZ+r8V5/QiqlXjpxqkFlI4/HV90tlVyG?= =?us-ascii?q?Oc5pHQAwUOT539SEE39wJ1p7vCeCky+5vU1WFwMamzqjLD1dMpBO8gyhm+ZddS?= =?us-ascii?q?K62EGxHvHM0dHcihMvQqm0KubhIGIu9d6LI0M9mhd/uc166hJPxgky6+jWRb/I?= =?us-ascii?q?B91VqB9yRmSuHS2ZYK3/CY3hCcWjf5lFehs9n7mZtKZDEJBGa/zjLkBIFJbK1o?= =?us-ascii?q?YYkLEXuuI9GwxthmhJ7iQX1Y9Fm+B14d28+mYxmSb1vg3QFK0kQXu3OnkzOizz?= =?us-ascii?q?NoizEpsraf3CvWzuv4aRUHIG9LS3d4jVr3O4e7k9UaUFKvbwgzmxuv/Vz6yLRD?= =?us-ascii?q?pKRjM2nTRl9FcDTsIGFmTKSwraaCYs5I6J4zqiVYTOW8bk6cSr7hohsVyTnvH2?= =?us-ascii?q?1AyzAnbzuqoIn2nwRmiGKBK3Z+tGHZec9qxRfY/9zcWeVc3iEARCl/hzjXA0Kz?= =?us-ascii?q?P9+z8dWSiZjDrvi0V3i9WZ1LbSnr0YSAuTO15GJwBR2/g+68msf8EQUhzy/0yc?= =?us-ascii?q?NqWj7VrBb5eIXr0L66Me1/dElyGFD889Z6Gp15koYomJEfxGUVhpSP8noDimr8?= =?us-ascii?q?LdJb2afiY3UXXj4L38TZ4A77101/NniJ3Z72Vm2Bwst9YNm3en0W2iMh4MBWD6?= =?us-ascii?q?eU9qZIkjd1olq/qwLRbuNwnjMcyfso8nEameYJtBAqziWHDbAYBVNYMjD0lxSU?= =?us-ascii?q?89C+q71aZGKucbiryEpyhMuhA6+GogFdXnb5Z5gjEDRr7sVnMVLM1nzz5Z3/eN?= =?us-ascii?q?XKa9IcqAGUmQ/aj+dJMJIxiuYKhS1/NGLnun0lz+o7ggJ03Z6mu4iGJX5g/Lmk?= =?us-ascii?q?AhFELT35fcQT+ivijaxGhMaZw5ivHol9GjUMRJboVeinEC8Wtfj9LQmCCiYzqn?= =?us-ascii?q?CfGbrDGg+f7lxrr3fTH5CtMHGYOGMVzdN8SxmBPEZfmhwbXC0mnp4lEQCn3M/h?= =?us-ascii?q?f1l/5jAK/VP4qQVDyuRzNxn5TGjfuB2kajAuSJiQNBBW9B1N51/JMcyC6eJ+Bz?= =?us-ascii?q?lY8Ye8rAyJNGObfx5HDWcVWkOaHVDuJaSu5cLe/OiCHeqyNeDOYbKTqexES/iH?= =?us-ascii?q?25yv0ox8/zaDKMqDJH9iAOMn2kBbR3B2B9zZmykTSywQjy/Nccibqwqn9y1pqM?= =?us-ascii?q?Cw7fTrVBjp5YSRF7tYKc9v9AyugaefK+6Qgz50KS5C2ZMRwX/F06QQ3F8OiyBu?= =?us-ascii?q?bjWtH64PtSjXQKLXgK9XAAYRazlvO8tQ86I8wg5NNNbYitL10r53kOU4C1JCVV?= =?us-ascii?q?zvlMGme9AKI329NFPAAUaEKq6KJTvVzMHream8U6FfjP1Itx2svjaWC0HjMS6F?= =?us-ascii?q?lzn1UBCvNPpBjC+FMxNDv4G9aAxiCXD5TNLhaB20LsN4jSEszb0znHPKOnYWMS?= =?us-ascii?q?JgfENVsr2Q8SRYj+1lG2Nc83VoNuaEmyOW7uXCLJYZr+drCDxul+1G+HQ616dV?= =?us-ascii?q?7CZcSfxvgifToMRio1S8nemLzTpmUAFDpSxXi4KOp0liPr/Z9pZYU3be4B0N9X?= =?us-ascii?q?mQCwgNp9Z9BN3vob5fxcXUlK3pLjdC79XU/dAHCsfONM2HNWAtMR3zGD7bFAEF?= =?us-ascii?q?VyKkNXnDh0xBl/Gf7nuVroIgpZj0gJoDUbFbVF0vFvMBFkRlEt0CIJFtUTMijb?= =?us-ascii?q?GbjdQH5X6koBnWXsVasYjNVuiODvX3NDaZkb5EagMVzrPjM4scLIL721Z4ZVlk?= =?us-ascii?q?h4nKAFDfXdNQoi17dAA4ukFN8GV4TmIpwULpcx+t4HgQFf+0mR46kA1+bvox9D?= =?us-ascii?q?30+Vc4OkLKpDcskEk2gdjlhzGRcDr1LKiuRoFbEDD7uFYrMpP8WQp1aheynUN8?= =?us-ascii?q?PjfeW71Rl6dgdXxsiALEopRPGPFcTapCYBIL2P6Yee4n0VVGpSWh30NH4vHFCZ?= =?us-ascii?q?R6ngswbZGst25A2x5kbNMtP6PQK7BGzkZOia+VuS+ozv4+wAkbJ0kX8WOSfDUH?= =?us-ascii?q?uEsHN7U8ICqo5ONs4xSYmzRfYGgMS+YqovVy+0MhPOSAyjjs06REKkGwKeOfKb?= =?us-ascii?q?iWu3LHlcGWQVM9zV8Hl05A/bdqy8gjaFaUW1opzLSPCxQDLdDCJh1Nb8pO6HjT?= =?us-ascii?q?ej6DsePTzp1vO4WwDePoTeiVtKYImE2kGh0pH4cN7sgbGJmjzl3YJ9/9LLEZ0R?= =?us-ascii?q?Ut+BjrJFKdAfRTZh2LiykIrNulzJBr3YlQPSoSAWRnMSqq4bbXqBcqgOCdU9Y2?= =?us-ascii?q?eHsaWJULNm4uUs2ghyFZp2hADCWw0u8B1QeN9SH8piXNAznndNdsfu2UZQlrCN?= =?us-ascii?q?C44jUw7bS5iUPN8pXfO2H7Nc5uutnR5uMGv5yHEe9bTaFhs0fAnIlVX3iqU2nV?= =?us-ascii?q?EdGrIZjxao4sYMf7Cna8T1yzkTU1T93+PNy1NKiHnRnoRZpIsImcxD0jLtGyFj?= =?us-ascii?q?UfGxd2uuEC67lxahEEY5o+fRHnrR8+N7ClLAeezNquX36nKSFKQPlH0eW6e7tX?= =?us-ascii?q?wjIxYeCmzXsgSZc6z/Wq/UMWWpEFkAvexfeiZolZVyj/AHpddBvTpSAhjWhuKv?= =?us-ascii?q?4ywvsjwBPPqVQcMCqLdexzZ2xCo9E8BUifIXpxCmogW1CQl4zD7RCw37oK5StS?= =?us-ascii?q?g85U0fFZsHj5ppLffDOsWKmsqZXJsyohbcMrrLBwMY3jOMSJr4nSnjrBQ5nMqg?= =?us-ascii?q?eFSjK1F+JGmthMJyJVWPZImXs/NswApYpM8ksxVsAwJrxJFKkspq6laTtiDS4O?= =?us-ascii?q?0yAZTZmM3Docjeegw7HajAufcIw+MBwYt5VPmsESUyp3YiwCuqCsT4DWlm+CSm?= =?us-ascii?q?gMJgcc9x9B6xkBloBqeODp+YTITIJWxz5Qvf10TjPBFoN0+FvjVmGWnV/4Re26?= =?us-ascii?q?nOO32wJf1+jj3cQFWBFhE0hd3PxZllEoKb1tLKkQpIHKuCeSdUzmpGLt1PemJF?= =?us-ascii?q?5JxM3OcV34DZbKtWr7Ui0Y4n0aXZZBxmzFG5kOlAR0c7okpFJJII+6YEn+/CAk?= =?us-ascii?q?y55vH7amScCh30wlomoeRye2D9pBDPlrv07VWDJ/f5+ms4nqO5JWQm9U+Z2StU?= =?us-ascii?q?1ZkFlzPCGlyZpQMcZN4iQDXDJXuzWSoMOySNFf2c9xF5IMOM1wu236GKxfI5WR?= =?us-ascii?q?v2c2tabxynDH/zA8sVG6xDq3G6+5QOJZ/3EeGgszKGSEr0kjFe0s/XnO8lrVqF?= =?us-ascii?q?B74/9bBqSTjUV2uDt8EIpCCSpJ1XCkKlRzTWNJs+ZBJaTUbcNTXec9aQWoOxwk?= =?us-ascii?q?Gv4sx1aJ8l1snXflfyxysRNX+zjaXwkwTyYVmLnsmToaqsGpIjIaTpVIbTI6by?= =?us-ascii?q?jbNw2bgydXvA1Ea0FrXZAZDcxJ+7YB3Ytb5sDCU1qjKTkZXBx+MQI1yeBQlVRe?= =?us-ascii?q?sEWeYyzdDhGldffOsh12Yceet9SlLPLn8wdbkonnqvw3970fR326ng2gWczer4?= =?us-ascii?q?j5ttCRqkuCaKL4PPambX/HUjfMkQi6ha04AJnS4yjTLA1bJoF6yXU+e5juE2rL?= =?us-ascii?q?MgldKq0GOUVbTbh6ZstCou9Efc9oYqEJ+bViBhifXBPgBJSvrOVaLlbUXTneLS?= =?us-ascii?q?KB/fKkrI3O87PdUvbvZtaQx3nZXq17JJF65ifnG73yy49R5lL22utx9kN9UVXJ?= =?us-ascii?q?KC6Bo8j9Kg4J+cWveFDvsYEuHTPTHJh/imHtxl1ae8oRXSKq7IwSyIlF53boVe?= =?us-ascii?q?J4zk/zvfVI97Z69IY346pmyduvKKfWLvRar1FoDgaICQVt65oiHnJzR2ZPbe8N?= =?us-ascii?q?MP3RZ7gWjdjyq+DrEKwa8AWV+/dFadTdOk7BhtKyCiqbSRxZhgcOtSAVLg2A1/?= =?us-ascii?q?6fgaB0Tdyppe/j2kIi+1K+NAIJzKhx5YeY/aqFvPPXbwHPwrcaR6fnXd7zrrAw?= =?us-ascii?q?u0OI//Ikir8OemtxYwK5DOgRTMkdxn3vzaoy1yIjD9vDH678+P5ET385myjvm5?= =?us-ascii?q?R5H1oIBvMUAaCE8p5Fk2c+hePZKsYWfbxYlWaXCxGoCLkCxmC36yGPOmlqngnO?= =?us-ascii?q?0w3sQWO09FL2rzV3QTHLz9f4lkpaTKe3CFxXXyq0PU94rDKPMxbptNXtv6Q191?= =?us-ascii?q?s6Mmv+tNKCjGGhIq9YH9XjJNyAJik5vFAXg4c3Rtyhw4AbHseyL8kK/XFidPTe?= =?us-ascii?q?7Xirkyhbr6dBmYXe/tmf+u/LEnm4k62at7KNyShXynglvFE/7tSgOe/L59CRXv?= =?us-ascii?q?unyX0eTyZltAvHRRK1rabbr18MM0yRzEjLgJAKPs1e3XQg0EHm4PMuQNM19AVb?= =?us-ascii?q?DIrAZvUCpT7pODTu2laff8g3VjSC3DtLA1L1C0d3FLI72GLqs8LDjW3Q9EEwRo?= =?us-ascii?q?lsa0znggR6D4A/KUIr9FgXzTQMHBMIaRCaFr6oA1rqLZcKVEgEcxSH36O6dr0x?= =?us-ascii?q?3UJt3rOl/PXTYvBkB6oRKvZdiRaDnFxAGpITsaATW7x8dEFA+67QvAjtEZDnX+?= =?us-ascii?q?LhlXoyK/K6Xtxa/doet3s47Qa1XwCg5otb77YHlJCIcbZJYYPWs8Bi9Uhn6iAA?= =?us-ascii?q?djdWjRhklRy5T/oTpO/97djAqpao7PihVLo1TeUN6xc0H3h+j4f3gF07o9HX1u?= =?us-ascii?q?JcR5bQiYvh8AFCPWSKuIfc0xlzM+YOLZykfKp4/XUdOyceP24OPcaRa/Qk4i9s?= =?us-ascii?q?MS/c6EZeDc4XftMXItbNlh5IhUHzX7FT7MXbEEeCC4hvb8Ao83b3yDct/JQnU+?= =?us-ascii?q?bg8zG3Kord71FMI/NDlD9jlM/GpOUO3fXSDzUY7meDZBho2COCzIONBOzq8eWL?= =?us-ascii?q?0tHUWEsMHjQqXIdFODqC5QunS/KtlJrzTgOb9s/zgZw5dEKKRXy9hb8FvbhIEe?= =?us-ascii?q?5BjCX7wzdfG5vth/2Pr9qj9GtXt1NAEIZp7h3JAqZfMYthORT+iMarQlJwBizl?= =?us-ascii?q?eMHbbhAuovaZxv8Q4+ViMEvzfZMbIggaxLL+83VVSBVhRaXrsVaYUuIRZcdmR+?= =?us-ascii?q?nfrn9P84JgNrUDPF6Dq5z2tj1Iskw5ABc1aL8sqTxXbkbOkxdPW6nqpL4AihAR?= =?us-ascii?q?Udp4uU9QB22wOHgx5yfcVahPiqmeFuAV+C2JTqMSS0VoLj9+QxSt1ZVhZbSpm+?= =?us-ascii?q?xHsmRBni96u/glzThmRBq6uS3xqKMAwjYg96+itDQBo3NJVOOenDnUCV9b1vQF?= =?us-ascii?q?kb8cC2r+6Vy7eHQDaory76VgJcTk74Yh+G4zYRQkfy0BRuSgEDr9j6aHD42Aqt?= =?us-ascii?q?5cgwSNuMrWZ7+pMScSLqg9yQ7kR3Vl3QjRgA1o8HASTju949EqIoS9OcA4xiun?= =?us-ascii?q?AmXbe1MM7blPsMTvr1ILS/E2aVx5ymV5zseHXjENRNDIG2stjAgkbmVEcJRZ5R?= =?us-ascii?q?AGF6kohiuIsbRH/wEVZjfUCYel+ojLkMfW2Hk9U81lxmbLqa2EnJ8q1mNqm89s?= =?us-ascii?q?5C6UpHsSb/DYU9NrAnXr14df1/bxZ/O2v+ADVYtp1bWhUPgZMsW5/mu2wppqUF?= =?us-ascii?q?e/xrsCB1q5LPMDxrDDXienV2KYV+qLc2yXkjc3KEHy4wenLkEtZMdMsUA9LvPI?= =?us-ascii?q?hoRAmA35TbN0WiKQqEfUzGwnNuMbeRw5uIOjewERV+4RYO6cJekyz/EkDlsDcW?= =?us-ascii?q?PJFzNsC+CqqV6tgJR7O3J47EX4YeTs8hjmMNyWGhkFDY7VsIV8+fm7RmKdI39v?= =?us-ascii?q?0gd+PE5u9+fQD14xrPNTc46NndjMgNR2yfIFd/ZoMSAmpt4Tm55s6YqK38eOax?= =?us-ascii?q?3RyIj9Jc3NqPiCH/Lf11gqen1dUrcBZAP15oY6Pt0+W7DIH7tWpxccBa88QJM/?= =?us-ascii?q?MWf97qd0Ix1vcgTJfrS7ntHqpv6XZptTv3LZ9Uw/LCHAuxAY0fy0SQt7b4y2h3?= =?us-ascii?q?XsPp8/WyhNr9p3ChtpBIFPAd8PrxK7A56In6G2k9Gx9F1+u+8Lqar/FOvH1dW4?= =?us-ascii?q?34V0WphV+1aLPDLPC6VxhURllOuyiO/a0pbtEcPiZc8EVO9jT2/Lcr/GBIS/JS?= =?us-ascii?q?6QNc/nfk5G8qKc0KhnXRmLYyD5RaWGvjW+NPp4+UU71pB4fO3LwTwq67HUxsD/?= =?us-ascii?q?Z3lfpii5tn6JKJpf40DWBezEQR1bV+CJ8GB7Eq0LdYH07vsBMcQ+wNiA5Al+9D?= =?us-ascii?q?BC0MqDI6i8oU7Aw0Z7dZPALEv1wCY0QogKLw65MUsrm2PZrW7dAXtEJMi+NcZt?= =?us-ascii?q?mMqVDgDq50RpgmEieGpBGmvuRdeMNmkX3M2wZBGK9A1VFdYMgfa3dlQju62xV+?= =?us-ascii?q?ZoIJNFlvuutLocjNZpJDvDRM9APyHfNLV2JCZeDv3TpFg0ZR4Jq701VZ0papiO?= =?us-ascii?q?IUMHNkCAxDjszQvD1037adis1KePICYL/XRL1bXF0SJDpwOho/aWntXjUKzFbJ?= =?us-ascii?q?HxRPPSMjAqVjKdRTspCkup5FGku+YEvPqfPGcfrVAUYj6IBA4VuK9vscDaDnXP?= =?us-ascii?q?lu17YJ0KmPeaVjj/SCJij6UyHCdLul6IQ/cYCwnWa2XugHFduAy/PPNM+2zqb6?= =?us-ascii?q?GAzKpPR+MWGpdMcuGeQ9bAe/BeIjAoli8DOOa9ZN3RtLA53UjNTWQHEqnE7lqe?= =?us-ascii?q?TFSZQvaE3TLkQZ0Vv5Qouiov4t/QhSF3E6HUMLuepDOj6ZC4gziCue3fV2gtZE?= =?us-ascii?q?o1jPgEAGaf3BkTYF0DXsoYvEDrX76oe1dH1HVvj/lnnRALZlddSHprh1Ffmr6f?= =?us-ascii?q?B9dWRFgPxDeiSfsHYVR1JDY9+UuD5AriJ9cHvJaAFCdl6rIQRN9Ff7ET447NNf?= =?us-ascii?q?5Vma4k?= X-IPAS-Result: =?us-ascii?q?A2G2PgC+4iJZ/wHyM5BcGwEBAQMBAQEJAQEBFgEBAQMBAQE?= =?us-ascii?q?JAQEBgwEpYoEMjnqQfYIMAZEQhFovA4F3ihxXAQEBAQEBAQECAQJoKIIzJCxUA?= =?us-ascii?q?QEBAQEBAQEBIioxPAYBAiRVAwkBARcIKQgDAVMZBYhPgVAEsWY6JgKLGYg9jXA?= =?us-ascii?q?FkCiBAYxthx2MBIJYiEOGU4tkiGRYgQpPIhWEeQFDHIFmc4ZvK4IQAQEB?= Received: from unknown (HELO tarius.tycho.ncsc.mil) ([144.51.242.1]) by emsm-gh1-uea10.nsa.gov with ESMTP; 22 May 2017 13:11:06 +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 v4MDB5kc013319; Mon, 22 May 2017 09:11: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 v4MD8u2F141680 for ; Mon, 22 May 2017 09:08:56 -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 v4MD8oLd011891 for ; Mon, 22 May 2017 09:08:56 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A1B1AgAX4iJZf4GlL8FcHAEBBAEBCgEBgyyBC4EMjnqQfZgFJIYAAoZoAQIBAQEBAQITAQEhXYUZAwMnUhAYCDFXGYhUgVSxYjqLDwExiD2NcAWQKIEBjG2HHYwEgliPFotkiGRWgQtPIhWFPRyBZj02hm8rghABAQE X-IPAS-Result: A1B1AgAX4iJZf4GlL8FcHAEBBAEBCgEBgyyBC4EMjnqQfZgFJIYAAoZoAQIBAQEBAQITAQEhXYUZAwMnUhAYCDFXGYhUgVSxYjqLDwExiD2NcAWQKIEBjG2HHYwEgliPFotkiGRWgQtPIhWFPRyBZj02hm8rghABAQE X-IronPort-AV: E=Sophos;i="5.38,377,1491278400"; d="scan'208";a="6061035" Received: from emsm-gh1-uea10.corp.nsa.gov (HELO emsm-gh1-uea10.nsa.gov) ([10.208.41.36]) by goalie.tycho.ncsc.mil with ESMTP; 22 May 2017 09:08:55 -0400 IronPort-PHdr: =?us-ascii?q?9a23=3AL/djuRyjhkTGeYDXCy+O+j09IxM/srCxBDY+r6Qd?= =?us-ascii?q?1OIUIJqq85mqBkHD//Il1AaPBtSEragbwLeH+4nbGkU4qa6bt34DdJEeHzQksu?= =?us-ascii?q?4x2zIaPcieFEfgJ+TrZSFpVO5LVVti4m3peRMNQJW2aFLduGC94iAPERvjKwV1?= =?us-ascii?q?Ov71GonPhMiryuy+4ZPebgFKiTanf79/Lhq6oAXVu8ILnYZsN6E9xwfTrHBVYe?= =?us-ascii?q?pW32RoJVySnxb4+Mi9+YNo/jpTtfw86cNOSL32cKskQ7NWCjQmKH0169bwtRbf?= =?us-ascii?q?VwuP52ATXXsQnxFVHgXK9hD6XpP2sivnqupw3TSRMMPqQbwoXzmp8rxmQwH0hi?= =?us-ascii?q?gZKzE58XnXis1ug6JdvBKhvAF0z4rNbI2IKPZyYqbRcNUHTmRDQ8lRTTRMDIOi?= =?us-ascii?q?YYUSAeQPPuFWoIvzp1YVsReyGROhCP/1xzNUmnP727Ax3eQ7EQHB2QwtB9wAv2?= =?us-ascii?q?7SrN7oMKkSTPq1zKbWwjXFdPNdxDDw55XSfRAnoPGDQ7ZwccjKxEkqCQzFilGQ?= =?us-ascii?q?ppbjPzOS2eUBqXSU7+1lVe+2jWMstg9/oj+qxsg2i4nJgJoYylHf+ipnxoY6OM?= =?us-ascii?q?W4SElhYd64Cpdfqj+VN5VuTsMnWW5ooDw2yrwAuZO9YSMEy4wnygbCZ/GDfYWE?= =?us-ascii?q?+B3uWeSLLTtlhX9oeKiziwus/UWkzOD3S9O630xQriVfl9nBrnAN2ALX6siAUv?= =?us-ascii?q?Z9+1mu2TKL1w/J7OFEJk81mbDHJJ4m2LIwl54TvVzCHi/whkr2kLebelgg9+Wm?= =?us-ascii?q?8ejqbbfrqoWBO4J1igzyKLkiltK7DOggNwgBRWmb+eCy1L35+k35Ra1HgeAsna?= =?us-ascii?q?nfsZDVO8AbpqyiDg9QzIkj7xK/AC2g0NQfkngLNk5KeBWCj4TxIVHBPOj4Deuj?= =?us-ascii?q?g1SriDpr3O7JPrngApXLM3jCn6zsfap96kFAyAozyspT55RPCr4bOv7zVUjxtM?= =?us-ascii?q?KLRiM+Zhe5x+fhFcVVypIVWWXJBLSQdqzVrwym/OUqdsWFYsc3pSzyJv4+r6ri?= =?us-ascii?q?hHk4lFsfVayk2Z8ebneoWP9hJhPKMjLXnt4dHDJS7UIFR+vwhQjHCGYLag=3D?= =?us-ascii?q?=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0GlMgCO4SJZf4GlL8FcHAEBBAEBCgEBF?= =?us-ascii?q?wEBBAEBCgEBgwGBC4EMjnqQfYINkRCEaCSBd4QJAoZoAQEBAQEBAQECAQIQAQE?= =?us-ascii?q?hXYIzJAErVAEBAQEBAQEBASIqMTwDAydSEBgIMVcZiFSBVLFgOosPATGIPY1wB?= =?us-ascii?q?ZAogQGMbYcdjASCWI8Wi2SIZFaBDE8iFYU9HIFmPTaGbyuCEAEBAQ?= X-IPAS-Result: =?us-ascii?q?A0GlMgCO4SJZf4GlL8FcHAEBBAEBCgEBFwEBBAEBCgEBgwG?= =?us-ascii?q?BC4EMjnqQfYINkRCEaCSBd4QJAoZoAQEBAQEBAQECAQIQAQEhXYIzJAErVAEBA?= =?us-ascii?q?QEBAQEBASIqMTwDAydSEBgIMVcZiFSBVLFgOosPATGIPY1wBZAogQGMbYcdjAS?= =?us-ascii?q?CWI8Wi2SIZFaBDE8iFYU9HIFmPTaGbyuCEAEBAQ?= X-IronPort-AV: E=Sophos;i="5.38,377,1491264000"; d="scan'208";a="7297680" 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-uea10.nsa.gov with ESMTP; 22 May 2017 13:08:54 +0000 Received: from Internal Mail-Server by MTLPINE1 (envelope-from danielj@mellanox.com) with ESMTPS (AES256-SHA encrypted); 22 May 2017 16:08:50 +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 v4MD8f0r017562; Mon, 22 May 2017 16:08:49 +0300 From: Dan Jurgens To: selinux@tycho.nsa.gov Subject: [PATCH v3 5/9] libsepol: Add ibendport ocontext handling Date: Mon, 22 May 2017 16:08:27 +0300 Message-Id: <1495458511-46724-6-git-send-email-danielj@mellanox.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1495458511-46724-1-git-send-email-danielj@mellanox.com> References: <1495458511-46724-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;