From patchwork Wed Nov 23 14:17:25 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Jurgens X-Patchwork-Id: 9443569 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 A7ECB60235 for ; Wed, 23 Nov 2016 14:59:52 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 99DDD26CFF for ; Wed, 23 Nov 2016 14:59:52 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 8DF3A26D17; Wed, 23 Nov 2016 14:59:52 +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=unavailable version=3.3.1 Received: from emsm-gh1-uea11.nsa.gov (emsm-gh1-uea11.nsa.gov [8.44.101.9]) (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 8E02626CFF for ; Wed, 23 Nov 2016 14:59:51 +0000 (UTC) X-IronPort-AV: E=Sophos;i="5.31,538,1473120000"; d="scan'208";a="1015445" IronPort-PHdr: =?us-ascii?q?9a23=3AcQ6aQR2M/i5GW2ALsmDT+DRfVm0co7zxezQtwd8Z?= =?us-ascii?q?sewSIv/xwZ3uMQTl6Ol3ixeRBMOAuqkC0bWd7fCocFdDyK7JiGoFfp1IWk1Nou?= =?us-ascii?q?QttCtkPvS4D1bmJuXhdS0wEZcKflZk+3amLRodQ56mNBXdrXKo8DEdBAj0OxZr?= =?us-ascii?q?KeTpAI7SiNm82/yv95HJbQhFgDSwbalsIBi0ognct8obipZ+J6gszRfEvmFGcP?= =?us-ascii?q?lMy2NyIlKTkRf85sOu85Nm7i9dpfEv+dNeXKvjZ6g3QqBWAzogM2Au+c3krgLD?= =?us-ascii?q?QheV5nsdSWoZjBxFCBXY4R7gX5fxtiz6tvdh2CSfIMb7Q6w4VSik4qx2RhDoki?= =?us-ascii?q?MHPCMn/m/RhMJ7kaZXrAu8qxBjxoLZZpyeOvhjcaPHZd4URXRPUNtfWSJCBY2z?= =?us-ascii?q?bYUPD/IDMOpFoYTyqEcBoxSgCgm3H+7v1j1Fi2Xq0aAgz+gtDwfL1xEgEdIUt3?= =?us-ascii?q?TUqc34OqkIXuCz0aLGySjDb+lZ2Tjj7ojIaQ0qrPaRUr1qd8rRyFcgFwfHjliL?= =?us-ascii?q?rIzqITeV1uAXvGid6OphWvijhHIgqwF0uzWiwNonhIrRho8N11zJ+ip0zJw1KN?= =?us-ascii?q?GlUkJ3f9GpHIVKuy2HL4d6X8cvTm9ytCs1yLAKo4O3cSkKxZg92hLTdfiKfo6V?= =?us-ascii?q?6Rz5TumROy13hHd9dbK6gBa97Favx/XnVsmxzFZKti1FksTQtnwV1xzc9MyHSv?= =?us-ascii?q?xl80e9wzmPzQHT6vxfIUwuiaraK4Iuwr43lpYJt0TMAjT2l1nsgK+Td0Uk/vCk?= =?us-ascii?q?6+XhYrr4up+RL5J4hw7xP6g0msGzHP40PhYBUmSF4+iwyaXv/UjjT7VLiv02nL?= =?us-ascii?q?PZsJffJckDva62HQtV0ocl6xaiADaqyc8XnX4aLFJDZB2IkZPpNkrSIPH4Efi/?= =?us-ascii?q?g1OsnC1tx/DdJLLtGJrNLn/dkLv5Z7Zy91ZcyBYvzdBY/59VCrAAIPX1WkLqsd?= =?us-ascii?q?zYCgY1Mw2yw+r9DtVyzJkeWWGOAq+HLqzeq1mI6fwzI+OUfo8apC79K+Q55/7p?= =?us-ascii?q?lXI2gkQSca6t3ZsWc3C4Au9mL1+CYXXyntgNC3wKsRQ6TOzrjl2CTDFSam2uUK?= =?us-ascii?q?M8/DE7FZmmAZ3NR4+3nLyBxyC7HptMamBBEFCMHm/id5+YVPcUdCKSPshhnyQK?= =?us-ascii?q?VLigT48h0A+htBXhxrppMOXb5yoYtYj529ht/e3TkhMy+iJoAMSByW2NSHt0nm?= =?us-ascii?q?wQTT8swK9/uVB9ykuE0aVgjfxYD8Zc5/VVXQc7Lp7R1Ol6C8jzWg7YZdeIRk2m?= =?us-ascii?q?Ts+hATErQdI728UObFplG9W+khDD2DKnA7wPmLyIA5w077nR33vrKMZ+zHbGyb?= =?us-ascii?q?Mtj148QstALWemnLJw9xDPB47VlEWUj7ylerkG3C7M6miD13GDs1tEXw51S6nF?= =?us-ascii?q?WmofZkTOp9Tj+kzCV6OuCaggMgZZ1cGNMK9KZcPyjVVaRPbjP8/TY3mtlGexGx?= =?us-ascii?q?mIwK+MbIvwdGkH2iXSFlQEmRgJ/XmaLQg+Gjuho2XGATxuC13vZ0fs8e5lpXO/?= =?us-ascii?q?U0800waKb0h72Lav/R4Vn/OcQesJ3r0YoCchtyl0HFGl0tLNBdqAvQ1hfL5AYd?= =?us-ascii?q?4m+1dH02XZtgJ4PpO6KaBunFgefBprv0n2zRV4Fp1AkdQ2rHMt1AdzJ7iX0Fdd?= =?us-ascii?q?dzyGx5DwIabaKnfs8xC1cKHWx1Te3MyR+qcV5/Qys0/jsx2xFko+73Vn1MFY02?= =?us-ascii?q?eB6ZrXDQodS5bxX10r+Bh9orHVfjMy55jI1XF2N6m7rCPC0cozBOQ50hagY8tf?= =?us-ascii?q?MKScGQ/0Es0aA8yuJ/Ixm1WydB0LIvpS9KkuM8OhbfuG17ahPPx8kzK+kWRH/I?= =?us-ascii?q?d931qR+CVmVu7HxYgKw/+X3wacSzj8jE2ustrrmY9afzEeBGy/xjb4BIRJfK19?= =?us-ascii?q?YZ4LCXuyI82w3th+mZ/tVGJE9F6kHVMKwtOmeRqVb1z70g1dzkAXoX2hmSSi1T?= =?us-ascii?q?x0lCslrq2F3CzB2+7ibgYIOnZXRGl+ilfhOYy0j9EBXEi0dgQpjwWq5UL7x6hd?= =?us-ascii?q?uaR+IHLeQVxQfyj3KWFiU7e/tqGYb85J9pworT1dUP6gblCCVr79vxwa3jv5H2?= =?us-ascii?q?tZwDA7cy+luo/lkBx9hmOQN21zrGfFdsFr3xvf48bcRfFJ1DocWCZ4kSXXBkS7?= =?us-ascii?q?P9Sx5dWbjYrDsuSkW227TJFcai7rzYectCu8421nGhi/k+y1mt3gDQc2yyn72M?= =?us-ascii?q?d2VS/QthbzfpHr17imMeJgZkRoAVv859NkFYF4iYYwmo8f2XwehpqL53oLi2Hz?= =?us-ascii?q?PstH2ajmdnoCWSYLw8LJ4AjiwEBjLWyGx4TiVniGwctued+6YngQ2i0j88BGEq?= =?us-ascii?q?CU7KZLnSFtuFq3sRrRYeRhnjca0fYu8GQVg/wNuAUz1iWSGLYSHVVGMiz2jBmI?= =?us-ascii?q?8su+o7tNZGa0a7Swz01+nc27DL6evA5cVnH5eo0tHSBu9Ml/NkzD0GHr4IH+ZN?= =?us-ascii?q?bQdc4TtgGTkxrYkehVLo8+m+EUhSphJG39vWcpy+glghxyxZu6ppSIK31x/KKl?= =?us-ascii?q?BR5VLiX1aNkO+jHplqtRgseW35yvH5l4FDUERp3oQeivEDIIuvTtLxyOHyEkqn?= =?us-ascii?q?eHBbrfGheS6ERmrnLLDZ+mLHSXJH4XzdVsWhadOFBfgAATXDU/gJE1DAaqy9L9?= =?us-ascii?q?cE1h/DAe+kb4qgdQyuJvLxT/XH3QpAG0ajczTZiSNxRW4R9f6EfSK8yR9PpzHz?= =?us-ascii?q?tf/p2jsgOCNnCbax5PDWETVUyOH0rjMaW25dnc7+iYAfKzL/TOYbqSs+xfV++I?= =?us-ascii?q?xY6o0oZ9+TaDKNmPPmJ+APIhwkpMQ2p1G8LHlDUTUyYXjT7Cb9aHpBeg/S16tt?= =?us-ascii?q?2w8PLxVw/0+ISPDaFdPc9o+xCsjqeJL/SQizphKTZEypMMwmfFyKIC01EPkCxu?= =?us-ascii?q?eDytELsauS7LUq3QhrddDwQHZCNrKMtI86U80xFXOcLBhNL5zLt4geQxC1dCVV?= =?us-ascii?q?3sgdumatAPI22nM1PHHkmLPqycJTLX28H3fb+8SbpIgeVSrR2/oy6bE1f4MzSN?= =?us-ascii?q?ljnpTQuvMf1CjCGaOhxRooe9fQpsCWf5SNLqcBq7MMV4jTcu2707mmvKNXIAMT?= =?us-ascii?q?h7a05Cs6aQ4j1CjfVwAWxO9GRlIPKfmymD7OnYN4wWvuFxDiRwiuJa5m41y6FM?= =?us-ascii?q?4CFYQ/x1myvTrtl0r1GgjOaP1iJtUABSpTZTmIKLoUJiNL3C+ZlBVnbE+xQN4H?= =?us-ascii?q?6NBBsUvNRlC8fgu6ZKxtjIjqLzJy9I88jI8ssEG8jUNMWHPWI7PhrmAjHUEhUK?= =?us-ascii?q?QCWsNWHHmUNdlvSS+WeUrpg+sZfsn5UPRqVcVFwvGfMQEl5lE8AaIJdrQjMklq?= =?us-ascii?q?aWjNIP5Xq7thXRXsJav5HZWfKUGvrvMjGZgqdHZxYT3bz4KoETOZHh1Ex5dll2?= =?us-ascii?q?hoLKFFTMXdpVuC1uchc0oFlR8Hh5VmAz217lagOq4H8WD/G0hQU7ig5/YeQx7j?= =?us-ascii?q?fj/U07Jl3QpCs/iEMxg8nqgSiNcD7tK6e9RYdWBDTuuEg1KZ77QAF1bRaunUN+?= =?us-ascii?q?MjfEXLFRj7p6eWBtlgDcpYNFGeRAQq1cfB8Q2faXau0y0VtCsSWo21VI5fHZBp?= =?us-ascii?q?tijwYlap+sr2hd1AJkYt41PbbQK7RJz1RKgKKBoDOo3PgrwAACP0YN7H+SeCkQ?= =?us-ascii?q?tUMVLLYmOSuo8fF36QGZgTRDYnIMV/0ko/Jx6EwyJ/mAzzjh075fKkG9LeqfIL?= =?us-ascii?q?2Fu2LYj86HXksw1l8Ul0lC5bV2390jfFSJWEA01rSREQgJNc3ZKQxOdcVd6H3T?= =?us-ascii?q?cTyJseXXzpJ/J5+9GfzwTe+SqKYUhVqpHAIuH4QW8MsBGJit0EbDIMfoKr4F1A?= =?us-ascii?q?8h5APxJFWKFP5JYg6EkC8bo8Gjy596xZJdKS8ZAWV8NyW3+7nWqxQ2j/qEWdc5?= =?us-ascii?q?fm0VXpAYNn4sXs21hTJZtWxaDDaryuIZ1BSC7zjkqyvNEDb8at1jZPGIZR9xE9?= =?us-ascii?q?y25ysw87K3iV/W9ZXeIXv2NdJ8td/T8ekavYqIC+tITblhtEfRg4pYR2aqUmHV?= =?us-ascii?q?F961O5jwZpIjbdzzEna1TkazizQrQMftJNytNLSHgRn0RYZIt4mWxCwjNc64Fj?= =?us-ascii?q?EZBxdwp+EC6blhag0CY5s0ewXnux44N6OhPAeSys+uTHq1KTtKU/lfyv23Z7NN?= =?us-ascii?q?zyU2aO+61GAtTpA9z+i5904NWJEKgQ/fxfale4lRTzLzFmZbewrRuSozj3JhOf?= =?us-ascii?q?oqwucj3BPItkERPCqPdOxodGNLockzBVaSIHVwDWo4QUWTgJHY7Q6txb8S+TJR?= =?us-ascii?q?n9hJ0eFftnjxoIPfaiq2WKO3sZXVrzYgbd8+rqJqL4PjJNCLu4nDkTzBUpbQqB?= =?us-ascii?q?aFXzSgF/tagNRQJzhYQPZQk2E/JcMGoZZB6VY2VsomPbxPDqgsqayqaTpjCS4S?= =?us-ascii?q?1jcXWZqd0jIYnuqy3KDXmQuXcJQnLBMLqo5CgscHXy5wfCweuLepV5/KmG+cVm?= =?us-ascii?q?gLPAAT4BxQ6wICjIB/Yvvo75bPTJ9Izz5Woux7UjHXFpZ261T7SnuagV/iSPWu?= =?us-ascii?q?i+apxx5dzOrw0tkHXx5yEVJdyPxMlksvM756MLUQvpTQvT+Wa0z6uGPtyO2pJF?= =?us-ascii?q?lVyM3UeF34DJbLtWXmSC0c/GcYRYlRx3HDDZ4SiRZ2aL43pFVQJ4CrYkb/6CY/?= =?us-ascii?q?x4tzGrm4VMaryk0krXYaXSiqCMZOBPt8vFLRRjJlf4ihqI/5NJVKXm9Q5Jqdpk?= =?us-ascii?q?9XkUl3LyG5yZtcK8RM4jEWXzhCujSds8WsR8Jdw8N2CIUMIthnsXfnBKxEIISR?= =?us-ascii?q?o2ExurH30n/Z/DQ8v02gxDS9HK+4S+xZ8nYbGgUuIGSesVcgAPc28mfV6VDNqV?= =?us-ascii?q?F0/+FUBrSVikVxujl9FIhUBjlVzXClM0hzTH5evupAMqTVbspcT+MxZRK0Ohw+?= =?us-ascii?q?FP8m31CS8k1um3f2fTByvBNA+y/BRwk0STUVgrD1lD0CrcGnPCQXS45UYTUkdC?= =?us-ascii?q?jJMQSblj5LvBxHcUFlR4gZAspZ+7EcxYZU/tDNSVy2JiEBQRNvLR833uRHlU5b?= =?us-ascii?q?rkqYfT7SDRCyefbIqB13ct+brNS1I/Th4AdHloTnvfg496UEWXKmlxOiQcrFoo?= =?us-ascii?q?/9qNKFqFWBeL3/M+2mbn/LVCLMggyohbc4E5nK+DDeMAhcK5Zk0ncrfIbuCXXV?= =?us-ascii?q?MhRcO6IUOVdUWbp8adpYvuBQf9Vkd7oR+a9xGhKHQQviF5ehrPZaMlreRynSIi?= =?us-ascii?q?ua/+OjpoLT6KDSRvL7ZsyQ3XrHRbx4Poti4znhB7jqyZNe+lbx2vp17EN1V0XJ?= =?us-ascii?q?MyCbo9T9PQ4L4M6idlX8sZE3ATzWB4p/n2T3ykFGacUXXzWg8I4Ex5NB9HbwVe?= =?us-ascii?q?V431DrsO1J67lr85Q446xyxMevIqfSNO5avlN5DRiSGgVq7I8iAGxlS2BWeO8R?= =?us-ascii?q?J+/bfb4FgsD2t+D3C6sX5QWJ++xDd9TIOVzOl9KiCjGYVRxEhh0OqSAbLgub0/?= =?us-ascii?q?6KhbN0Rdyipejj1UIn+0K+IQIezLBx+YeE/bKFpOrNYBvVybgLRLTqRt/pobs2?= =?us-ascii?q?oE6S4+MrlKIVemNpeQKnCPYSWtQbxmj+0aAg1TgsHN/bH7L85P5DUGo0njD6lJ?= =?us-ascii?q?BnGFUWAfcUEqCV/YlFm2c4hujZNsEXcq9em2aADxikEqQYxX6s8SuXL3FvggvS?= =?us-ascii?q?3BHoXWOz8Fj2oDd6QSTWydfjnFBVVr6qCkhMRCepJVV3sDWUPArvrtb3v7o67F?= =?us-ascii?q?0uOGz+qN2NjHehOK9QH8DnK9ycPCg0pFYTjJIvQ9yiwp0UFsSmL9cQ6n5+aOHS?= =?us-ascii?q?62Sxky9Ou61HnZbR4tmJ+vXLGnmtl6uaq7GWyTBZzHg4uEsz6tGmNvHA/d2FWe?= =?us-ascii?q?+o13oLTydipwTBQwO1qqbFoFwOPkyLykjLkpQQPt5FxXk4yl3m5O87TdI28wVe?= =?us-ascii?q?EJrAZ/wcqj3oPTv0wEyQY9QpWSmC3TpXGUj1EVpjGKQm3mL/ot7Jn2/K+1I0Xo?= =?us-ascii?q?lwa1DnhRtvAoU8MkIt7VgazzENEQcTdB+bC6uoCl79LYseUkgDawqI06Smeqst?= =?us-ascii?q?2k1z2Lyv7vfJbeNgH6oNKupdjgmWkVheHpIZr6geQLVidF9Z76PXqRbtC4/8X/?= =?us-ascii?q?j+j3UwKfy1Tdpe8cAYsXsi/hiwRx6k6ZdC4LYUlpaIebJabpTWusBz8Vtn7yYV?= =?us-ascii?q?diNRmBh/kw+5UecEqeD4+NfbroCn6umwW6Y2XOgX7AI7B3pkgJv/nl8jusvb1+?= =?us-ascii?q?FCRY3JkY7/6hxCI2aWuIbG1BlxMegOK4OufLt78nUIOSgfKGwUPdqXbfk87DVh?= =?us-ascii?q?MDPN6FxeGskMf88XPNLRmQBIjU3kQLBT98vBFVCCF4h+bNso4HTryD8r7ZQwSO?= =?us-ascii?q?Hg6CW5JZrH9VFCI+tDjDlwlNLFvOUa2vvSCDMZ4HaDaRh1wz+Cy4GXBPbt+eWB?= =?us-ascii?q?083bV1QbESEoSYhdOSCC+Qu9RuWvjpnpVRmU6sDripIkaE2QXmCxnLgCsqtUCe?= =?us-ascii?q?5PkDn70SReFoH7gPKVqdms5HJMtlJZFIZz7BvFGLhQP5hgIRT3jNWrSVR8Birx?= =?us-ascii?q?f8HUbBkutPCVxugS+eV+MVXxZYsBLhID0bL65mJfThFyR77uolaZQeURacN6SP?= =?us-ascii?q?PesH9V7ZhvK6kRM1WGuZPqrzhIqFEqAAAzc78/tCZadlTUkA1TRan0pKYKihEA?= =?us-ascii?q?Xt5hpU9MBWWwNXox5zXdT6RakrWRCPwO/zWXT6wOT1tnMiNkTBOow5ViYb2pku?= =?us-ascii?q?5bsmlehCNyvOAq0yB6RBu7oSDsqLwC2TQ8+LG/szUNvmdFQfuakyfJD1VD0fsL?= =?us-ascii?q?gLwYC3n881y9YGMMYJH04LZ5OcTq7ZMh7GgnYRU/Yy0GWvytCyfxj6yUBYyPtM?= =?us-ascii?q?hThAWXtMXPar+zKjMSNq8mxBLmSHV83RLSnBFy8GsEWj+g9sMrJJ2hOcY5wSql?= =?us-ascii?q?AWfbe0oX4qNSqcf/qFEFQu03aVNn3WVi3dOKRiIIRMPVHWY6kBIoaWJecJJM8R?= =?us-ascii?q?UaDbUngi6Uvqla+QEZeDXUEoOl+onWh8vHxXk9TdN3xm3Lp6yFh5Uq0GZmm9N1?= =?us-ascii?q?9SOOpnUSd/LCXM9oH3fz151TyergaPWxquoHUpdpyKy9UP8eNcmu4Wq22ItwVU?= =?us-ascii?q?+j3bkeG0e5P/ICxrfcSCepU2qYWf6Ec2KUhTY2Llby5QW0Ll0wcMpKrVEyMuXM?= =?us-ascii?q?hp5YjADgX6l7RiOOql/H1mAjN/0Vdx4usoe9ZwMKVPIRZ/SbJeU2z/0+DFwMbn?= =?us-ascii?q?HXEityD++7qkWtnI99O3Vh/Ur2e+Lt/R76MNGKABkLDZbaroJt+fy9Xm+BO39g?= =?us-ascii?q?zR1qPElz8+ffFkgxufFHfpaUnNjQm8573vAfe/dqKy09tcYZmph/5omMzMeKbR?= =?us-ascii?q?bRw47uJdHUp/iVGOHfz0U2dWFZTLUZZRn554MkMd4lQ7fTB6dWvQwABagmR5ws?= =?us-ascii?q?L2Lx9KB3LANwdQ7cf7a0jdPppuKMYJtbuXnW4kg2LCjCpx0J0ua0QhBjb5C2m3?= =?us-ascii?q?XyJ4g9SSlfoN1rFhtrB5BPG8cHrwq7H56Uhr+0hMKr90N9oe8KvrL6CurW29Sh?= =?us-ascii?q?w4VxQ59a6FSFPDnPAKlrg1xlgfqpj/bB05nxDMbids0eVOh/XGHJcLjGHp+wKj?= =?us-ascii?q?iWIMLzZ1ZG86KA0LJ+ShiQajj5X7CHtCK4Kvpp+kA7yo1kfOrJ0jMh9bbb2MH9?= =?us-ascii?q?Z2tDvCessWaJNIdD7FzNHeHeWBZURuSe/WZ9Ga0Yd5D09PsPMdM+3Nic+Rd84y?= =?us-ascii?q?pY3MuDPaehslfG2lhnepLDMEvpxyE5VJEOIBS+N0ssnGDYpm3ZAXRdNcikNdJt?= =?us-ascii?q?jc2UDhP34UlxnnshZmlbGmrnXd2RI3QU29qiZA2W8wJGF80DkPCzeU45sK2yVO?= =?us-ascii?q?ZpNpJKl+W2tLUIj8xpJD/XRMdAJCzQL6F5PiBXDurRoFgneQMEs7cvVocyf5iO?= =?us-ascii?q?L1sNMF2cxiPq0QvCzUr0esSo1KaIOyYW7m5KzrPc0ThKvQa1o/CZjdP/ULrBdp?= =?us-ascii?q?H5QObSMDY5VjGdXTkyFFym9kuku/oFuvqYJnwSok4VYiKUFgEToqFvrd7NDm7c?= =?us-ascii?q?g+Fje4cKhP+CUSDqVCJ4jLYyBjpMtU2UQfoMDwrWb3j6j2dHpQyiIONM/XLib7?= =?us-ascii?q?2FyapVW/AWDpFKcvKHX9vSYepeKCswljUFJOa8eMXRr7kj3V3TV2sZErfH9FmF?= =?us-ascii?q?QU6IRvyT3SnrXYQIv4QuvCon5M7QlDdtE6vUJ7afuyKu8omggSaavO3eUXMtY1?= =?us-ascii?q?Y0gOIZG2SBxgNPKGQaBNEUok3tRbSAZ0lU3nIzle1uwwMMeBh0UnB2zHJWnvG9?= =?us-ascii?q?Gs1fSV4Pi2OuRuYLbF9tDDMt40+F/BfybcYGuc/NW29U7qEMRpYFLPk09InXP7?= =?us-ascii?q?MdwO0n3DJjvCM3siaQAkhDjg2b6arQHaN9xrpE5WUi+fF5QF2PSSvFcmfb0oqm?= =?us-ascii?q?F95PxSB2rHDm0MrUuORtOaBfp45nHVgKDyV2JsrB8j9fS2303hW9vwroVAiZdT?= =?us-ascii?q?kZ+jcQOgQecftuivR8tFDPbNmFoVuZqqYJsEK2DUOODb2u1dpADcStnR60cgFX?= =?us-ascii?q?YD6rENZwsf8Lm9EMJesqfYGkAkvpNgHkDxmAvykH+V7tuLvvRcZOz2kQlb8gAM?= =?us-ascii?q?vkU4kDEZ/S2zQ8i21FzZxJzWCfHsL3Z5vl5sg+DnYLctG9QH2tepXSMjPpqPcI?= =?us-ascii?q?0b8hEk+TbKMRO2cInYQxkzLGZlXg25rq8SKLNenseTW/OcwKMrythm1Ki6DGJs?= =?us-ascii?q?Xl4PkUWilPxrQ1lc6V7SOWkT+be9viOyamzw=3D=3D?= X-IPAS-Result: =?us-ascii?q?A2HVBACmrjVY/wHyM5BeHAEBBAEBCgEBFwEBBAEBCgEBgw0?= =?us-ascii?q?BAQEBAR+BWqRalnMkiCJTAQEBAQEBAQECAQJfKIIzGoIcAgEDAQIkExQgCQIDA?= =?us-ascii?q?wkBARcIIQgIAwEtFREHBwsFGASITASxBD0qAos9AQEIAQEBASOPNBEBhX0BBI5?= =?us-ascii?q?ti2KRAoochhORdlVeNh6DMRyBX3CGF4IuAQEB?= Received: from unknown (HELO tarius.tycho.ncsc.mil) ([144.51.242.1]) by emsm-gh1-uea11.nsa.gov with ESMTP; 23 Nov 2016 14:59:39 +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 uANExDHX002266; Wed, 23 Nov 2016 09:59:21 -0500 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 uANEjIR7047410 for ; Wed, 23 Nov 2016 09:45:18 -0500 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 uANEjHtE029703 for ; Wed, 23 Nov 2016 09:45:18 -0500 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A1B5BAAMqzVY/4GlL8FeHAEBBAEBCgEBgzgBAQEBAYF5pFqSZYQVhiECgm0BAgEBAQEBAmIohGkCAQMnUAIQGAgxVwcSiHGxCj2LaAEBCAIllUMFjm2LYpECkC+RdlWBFB6DMRyBXzw0iEUBAQE X-IPAS-Result: A1B5BAAMqzVY/4GlL8FeHAEBBAEBCgEBgzgBAQEBAYF5pFqSZYQVhiECgm0BAgEBAQEBAmIohGkCAQMnUAIQGAgxVwcSiHGxCj2LaAEBCAIllUMFjm2LYpECkC+RdlWBFB6DMRyBXzw0iEUBAQE X-IronPort-AV: E=Sophos;i="5.31,538,1473134400"; d="scan'208";a="5840741" 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; 23 Nov 2016 09:45:07 -0500 IronPort-PHdr: =?us-ascii?q?9a23=3AC69kyxbO1EuZn6+pQKJrvo3/LSx+4OfEezUN459i?= =?us-ascii?q?sYplN5qZr8m+bnLW6fgltlLVR4KTs6sC0LuN9fq/EjJdqb+681k6OKRWUBEEjc?= =?us-ascii?q?hE1ycBO+WiTXPBEfjxciYhF95DXlI2t1uyMExSBdqsLwaK+i764jEdAAjwOhRo?= =?us-ascii?q?LerpBIHSk9631+ev8JHPfglEnjSwbLd8IRmsswnctMYajIpiJ60s1hbHv3xEdv?= =?us-ascii?q?hMy2h1P1yThRH85smx/J5n7Stdvu8q+tBDX6vnYak2VKRUAzs6PW874s3rrgTD?= =?us-ascii?q?QhCU5nQASGUWkwFHDBbD4RrnQ5r+qCr6tu562CmHIc37SK0/VDq+46t3ThLjlT?= =?us-ascii?q?wKPCAl/m7JlsNwjbpboBO/qBx5347Ue5yeOP5ncq/AYd8WWW9NU8BMXCJDH4y8?= =?us-ascii?q?dZMCAeofM+hFoYfzpFwAohmwBQS3GO/j1iVFimPs0KEmz+gsFxzN0gw6H9IJtX?= =?us-ascii?q?TZtNv7O70UUeuoyKfI0C/Db/xI1jf784jDbxcsruyWUrJ2cMre100vFwHeg1WV?= =?us-ascii?q?t4PlOzeV2f4Ls2ic4OtsT/6gi2kiqwxopDWk28QiipHRi44Izl3J+z91zYk3KN?= =?us-ascii?q?GiVUJ2YN6pHIFNuy2EM4Z7RN4pTXtytyYg0LIGvIa2fCgUx5QjwB7Sc/mHfJaM?= =?us-ascii?q?4hLnTumRJzB4hX1/dL2jgBa+60mgyunkWsm11lZFsDZFn8HRun0J2RHf8MeKR/?= =?us-ascii?q?ln8ku82DuC1xrf5vxaLU0wjabbLoQuwr80lpodq0TDGSr2lV3rg6CMcEUk+/an?= =?us-ascii?q?6+DlYrj9o5+TKYt0igXkPaQoncy+Dv40PRQJX2ie4ei8zqHs/VXlQLVWif07ir?= =?us-ascii?q?LZv47eJcQaoK65HgBU350/6xe/Ezim0NMYkWMBLFJeYh2LlYfpO1bQIKOwMfDq?= =?us-ascii?q?iFS2kSx07+vBI6akGZLJaH/Zn/OpZb9g72ZEwRc3iNVY4IhZTLoGJba7QUPqnM?= =?us-ascii?q?DJBR8+dQqvyqDoD8s5no4GUHiOGYeBObnTqkeM7+kiZe6Wa8tdtDLwJ/Yi/fLG?= =?us-ascii?q?l3I1mVYBO6Ku2N9fc32xGLJmLkuFcFLthMsMFSEBuQ96BOzjjBuYViVeYW2uWK?= =?us-ascii?q?k/zj4+AYOiS4zEQ9ODmruEiQuyGNV0e3pJB1aXWSPkfoOFVvMOQCefJstolDsU?= =?us-ascii?q?E7OmTtlyhlmVqAbmxu8/faLv8SoCuMemjYAt6g=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0F4BAAMqzVY/4GlL8FeHAEBBAEBCgEBF?= =?us-ascii?q?wEBBAEBCgEBgw0BAQEBAYF5pFqSZYQVhiECgm0BAQEBAQEBAQIBAl8ogjMaAYI?= =?us-ascii?q?bAgEDJ1ACEBgIMVcHEohxsQo9i2gBAQgCJZVDBY5ti2KRApAvkXZVgRQegzEcg?= =?us-ascii?q?V88NIhFAQEB?= X-IPAS-Result: =?us-ascii?q?A0F4BAAMqzVY/4GlL8FeHAEBBAEBCgEBFwEBBAEBCgEBgw0?= =?us-ascii?q?BAQEBAYF5pFqSZYQVhiECgm0BAQEBAQEBAQIBAl8ogjMaAYIbAgEDJ1ACEBgIM?= =?us-ascii?q?VcHEohxsQo9i2gBAQgCJZVDBY5ti2KRApAvkXZVgRQegzEcgV88NIhFAQEB?= X-IronPort-AV: E=Sophos;i="5.31,538,1473120000"; d="scan'208";a="1014829" Received: from mail-il-dmz.mellanox.com (HELO mellanox.co.il) ([193.47.165.129]) by emsm-gh1-uea11.nsa.gov with ESMTP; 23 Nov 2016 14:45:04 +0000 Received: from Internal Mail-Server by MTLPINE1 (envelope-from danielj@mellanox.com) with ESMTPS (AES256-SHA encrypted); 23 Nov 2016 16:18:19 +0200 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 uANEHdrN021742; Wed, 23 Nov 2016 16:18:11 +0200 From: Dan Jurgens To: chrisw@sous-sol.org, paul@paul-moore.com, sds@tycho.nsa.gov, eparis@parisplace.org, dledford@redhat.com, sean.hefty@intel.com, hal.rosenstock@gmail.com Subject: [PATCH v6 3/9] selinux lsm IB/core: Implement LSM notification system Date: Wed, 23 Nov 2016 16:17:25 +0200 Message-Id: <1479910651-43246-4-git-send-email-danielj@mellanox.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1479910651-43246-1-git-send-email-danielj@mellanox.com> References: <1479910651-43246-1-git-send-email-danielj@mellanox.com> X-Mailman-Approved-At: Wed, 23 Nov 2016 09:59:12 -0500 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: Cc: linux-rdma@vger.kernel.org, linux-security-module@vger.kernel.org, selinux@tycho.nsa.gov MIME-Version: 1.0 Errors-To: selinux-bounces@tycho.nsa.gov Sender: "Selinux" X-Virus-Scanned: ClamAV using ClamSMTP From: Daniel Jurgens Add a generic notificaiton mechanism in the LSM. Interested consumers can register a callback with the LSM and security modules can produce events. Because access to Infiniband QPs are enforced in the setup phase of a connection security should be enforced again if the policy changes. Register infiniband devices for policy change notification and check all QPs on that device when the notification is received. Add a call to the notification mechanism from SELinux when the AVC cache changes or setenforce is cleared. Signed-off-by: Daniel Jurgens --- v2: - new patch that has the generic notification, replaces selinux and IB/core patches related to the ib_flush callback. Yuval Shaia and Paul Moore v3: - use notifier chains. Paul Moore v4: - Seperate avc callback for LSM notifier. Paul Moore v5: - Fix link error when CONFIG_SECURITY is not set. Build Robot --- drivers/infiniband/core/device.c | 53 ++++++++++++++++++++++++++++++++++++++++ include/linux/security.h | 23 +++++++++++++++++ security/security.c | 20 +++++++++++++++ security/selinux/hooks.c | 11 +++++++++ security/selinux/selinuxfs.c | 2 ++ 5 files changed, 109 insertions(+) diff --git a/drivers/infiniband/core/device.c b/drivers/infiniband/core/device.c index 5b42e83..7b6fd06 100644 --- a/drivers/infiniband/core/device.c +++ b/drivers/infiniband/core/device.c @@ -39,6 +39,8 @@ #include #include #include +#include +#include #include #include #include @@ -82,6 +84,14 @@ static LIST_HEAD(client_list); static DEFINE_MUTEX(device_mutex); static DECLARE_RWSEM(lists_rwsem); +static int ib_security_change(struct notifier_block *nb, unsigned long event, + void *lsm_data); +static void ib_policy_change_task(struct work_struct *work); +static DECLARE_WORK(ib_policy_change_work, ib_policy_change_task); + +static struct notifier_block ibdev_lsm_nb = { + .notifier_call = ib_security_change, +}; static int ib_device_check_mandatory(struct ib_device *device) { @@ -344,6 +354,40 @@ static int setup_port_pkey_list(struct ib_device *device) return 0; } +static void ib_policy_change_task(struct work_struct *work) +{ + struct ib_device *dev; + + down_read(&lists_rwsem); + list_for_each_entry(dev, &device_list, core_list) { + int i; + + for (i = rdma_start_port(dev); i <= rdma_end_port(dev); i++) { + u64 sp; + int ret = ib_get_cached_subnet_prefix(dev, + i, + &sp); + + WARN_ONCE(ret, + "ib_get_cached_subnet_prefix err: %d, this should never happen here\n", + ret); + ib_security_cache_change(dev, i, sp); + } + } + up_read(&lists_rwsem); +} + +static int ib_security_change(struct notifier_block *nb, unsigned long event, + void *lsm_data) +{ + if (event != LSM_POLICY_CHANGE) + return NOTIFY_DONE; + + schedule_work(&ib_policy_change_work); + + return NOTIFY_OK; +} + /** * ib_register_device - Register an IB device with IB core * @device:Device to register @@ -1075,10 +1119,18 @@ static int __init ib_core_init(void) goto err_sa; } + ret = register_lsm_notifier(&ibdev_lsm_nb); + if (ret) { + pr_warn("Couldn't register LSM notifier. ret %d\n", ret); + goto err_ibnl_clients; + } + ib_cache_setup(); return 0; +err_ibnl_clients: + ib_remove_ibnl_clients(); err_sa: ib_sa_cleanup(); err_mad: @@ -1098,6 +1150,7 @@ static int __init ib_core_init(void) static void __exit ib_core_cleanup(void) { + unregister_lsm_notifier(&ibdev_lsm_nb); ib_cache_cleanup(); ib_remove_ibnl_clients(); ib_sa_cleanup(); diff --git a/include/linux/security.h b/include/linux/security.h index 342ca4c..0a5de0c 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -69,6 +69,10 @@ struct audit_krule; struct user_namespace; struct timezone; +enum lsm_event { + LSM_POLICY_CHANGE, +}; + /* These functions are in security/commoncap.c */ extern int cap_capable(const struct cred *cred, struct user_namespace *ns, int cap, int audit); @@ -161,6 +165,10 @@ struct security_mnt_opts { int num_mnt_opts; }; +int call_lsm_notifier(enum lsm_event event, void *data); +int register_lsm_notifier(struct notifier_block *nb); +int unregister_lsm_notifier(struct notifier_block *nb); + static inline void security_init_mnt_opts(struct security_mnt_opts *opts) { opts->mnt_opts = NULL; @@ -377,6 +385,21 @@ int security_inode_getsecctx(struct inode *inode, void **ctx, u32 *ctxlen); struct security_mnt_opts { }; +static inline int call_lsm_notifier(enum lsm_event event, void *data) +{ + return 0; +} + +static inline int register_lsm_notifier(struct notifier_block *nb) +{ + return 0; +} + +static inline int unregister_lsm_notifier(struct notifier_block *nb) +{ + return 0; +} + static inline void security_init_mnt_opts(struct security_mnt_opts *opts) { } diff --git a/security/security.c b/security/security.c index 7d3bf2f..40326d4 100644 --- a/security/security.c +++ b/security/security.c @@ -33,6 +33,8 @@ /* Maximum number of letters for an LSM name string */ #define SECURITY_NAME_MAX 10 +static ATOMIC_NOTIFIER_HEAD(lsm_notifier_chain); + /* Boot-time LSM user choice */ static __initdata char chosen_lsm[SECURITY_NAME_MAX + 1] = CONFIG_DEFAULT_SECURITY; @@ -98,6 +100,24 @@ int __init security_module_enable(const char *module) return !strcmp(module, chosen_lsm); } +int call_lsm_notifier(enum lsm_event event, void *data) +{ + return atomic_notifier_call_chain(&lsm_notifier_chain, event, data); +} +EXPORT_SYMBOL(call_lsm_notifier); + +int register_lsm_notifier(struct notifier_block *nb) +{ + return atomic_notifier_chain_register(&lsm_notifier_chain, nb); +} +EXPORT_SYMBOL(register_lsm_notifier); + +int unregister_lsm_notifier(struct notifier_block *nb) +{ + return atomic_notifier_chain_unregister(&lsm_notifier_chain, nb); +} +EXPORT_SYMBOL(unregister_lsm_notifier); + /* * Hook list operation macros. * diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 09fd610..2d7a7c1 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c @@ -170,6 +170,14 @@ static int selinux_netcache_avc_callback(u32 event) return 0; } +static int selinux_lsm_notifier_avc_callback(u32 event) +{ + if (event == AVC_CALLBACK_RESET) + call_lsm_notifier(LSM_POLICY_CHANGE, NULL); + + return 0; +} + /* * initialise the security for the init task */ @@ -6325,6 +6333,9 @@ static __init int selinux_init(void) if (avc_add_callback(selinux_netcache_avc_callback, AVC_CALLBACK_RESET)) panic("SELinux: Unable to register AVC netcache callback\n"); + if (avc_add_callback(selinux_lsm_notifier_avc_callback, AVC_CALLBACK_RESET)) + panic("SELinux: Unable to register AVC LSM notifier callback\n"); + if (selinux_enforcing) printk(KERN_DEBUG "SELinux: Starting in enforcing mode\n"); else diff --git a/security/selinux/selinuxfs.c b/security/selinux/selinuxfs.c index 72c145d..d3f9192 100644 --- a/security/selinux/selinuxfs.c +++ b/security/selinux/selinuxfs.c @@ -177,6 +177,8 @@ static ssize_t sel_write_enforce(struct file *file, const char __user *buf, avc_ss_reset(0); selnl_notify_setenforce(selinux_enforcing); selinux_status_update_setenforce(selinux_enforcing); + if (!selinux_enforcing) + call_lsm_notifier(LSM_POLICY_CHANGE, NULL); } length = count; out: