From: Narcisa Vasile <navasile@microsoft.com> The NetUIO driver for Windows allows the usermode application to directly access the hardware and allocates the memory that gets mapped in usermode. Anand Rawat (1): Updated Source and Project files to use Clang toolset Harini Ramakrishnan (10): Windows DPDK libraries and applications have now been updated to the latest public release v18.08, of the main DPDK source. doc: remove embedded buffer from Windows UIO ioctl Windows DPDK libraries and applications have now been updated to the latest public release v18.08, of the main DPDK source. doc: change the Windows UIO driver's default security descriptor to admin only doc: remove lower bound on mapped address from Windows UIO driver doc: remove embedded buffer from Windows UIO ioctl uio: move SDDL string to INF on Windows uio: Fix 64 bit BARs mapping license: update headers with BSD 3-clause license: doc: updating REAME for NetUIO driver Jason Messer (2): Initial commit of UIO driver for Windows Added new core libraries for Windows Narcisa Vasile (8): Update .gitignore and create .gitattributes uio: Use local time when verifying INF DriverVer uio: Remove co-installers section from inf uio: Wrap call into try/except block uio: Use request handler that guarantees execution in correct context uio: Change the device setup class to a custom one Enable DMA remapping through INF directive Move all files under windows folder Thomas Monjalon (1): init DPDK repository -- 2.23.0.vfs.1.1.63.g5a5ad7f
From: Thomas Monjalon <thomas.monjalon@6wind.com> --- .gitignore | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..e69de29bb -- 2.23.0.vfs.1.1.63.g5a5ad7f
From: Jason Messer <jmesser@microsoft.com> --- mk/exec-env/windows/netuio/netuio.sln | 24 ++++ mk/exec-env/windows/netuio/netuio.vcxproj | 108 ++++++++++++++++++ .../windows/netuio/netuio.vcxproj.filters | 59 ++++++++++ .../windows/netuio/netuio.vcxproj.user | 11 ++ 4 files changed, 202 insertions(+) create mode 100644 mk/exec-env/windows/netuio/netuio.sln create mode 100644 mk/exec-env/windows/netuio/netuio.vcxproj create mode 100644 mk/exec-env/windows/netuio/netuio.vcxproj.filters create mode 100644 mk/exec-env/windows/netuio/netuio.vcxproj.user diff --git a/mk/exec-env/windows/netuio/netuio.sln b/mk/exec-env/windows/netuio/netuio.sln new file mode 100644 index 000000000..15c26e6b9 --- /dev/null +++ b/mk/exec-env/windows/netuio/netuio.sln @@ -0,0 +1,24 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "netuio", "netuio.vcxproj", "{66EC91EF-AC5B-4D1E-8314-9B3E2855CCF6}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {66EC91EF-AC5B-4D1E-8314-9B3E2855CCF6}.Debug|x64.ActiveCfg = Debug|x64 + {66EC91EF-AC5B-4D1E-8314-9B3E2855CCF6}.Debug|x64.Build.0 = Debug|x64 + {66EC91EF-AC5B-4D1E-8314-9B3E2855CCF6}.Debug|x64.Deploy.0 = Debug|x64 + {66EC91EF-AC5B-4D1E-8314-9B3E2855CCF6}.Release|x64.ActiveCfg = Release|x64 + {66EC91EF-AC5B-4D1E-8314-9B3E2855CCF6}.Release|x64.Build.0 = Release|x64 + {66EC91EF-AC5B-4D1E-8314-9B3E2855CCF6}.Release|x64.Deploy.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/mk/exec-env/windows/netuio/netuio.vcxproj b/mk/exec-env/windows/netuio/netuio.vcxproj new file mode 100644 index 000000000..251b8eb95 --- /dev/null +++ b/mk/exec-env/windows/netuio/netuio.vcxproj @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{66EC91EF-AC5B-4D1E-8314-9B3E2855CCF6}</ProjectGuid> + <TemplateGuid>{497e31cb-056b-4f31-abb8-447fd55ee5a5}</TemplateGuid> + <TargetFrameworkVersion>v4.5</TargetFrameworkVersion> + <MinimumVisualStudioVersion>12.0</MinimumVisualStudioVersion> + <Configuration>Debug</Configuration> + <Platform Condition="'$(Platform)' == ''">Win32</Platform> + <RootNamespace>netuio</RootNamespace> + <WindowsTargetPlatformVersion>$(LatestTargetPlatformVersion)</WindowsTargetPlatformVersion> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <TargetVersion> + </TargetVersion> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset> + <ConfigurationType>Driver</ConfigurationType> + <DriverType>KMDF</DriverType> + <DriverTargetPlatform>Desktop</DriverTargetPlatform> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <TargetVersion> + </TargetVersion> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset> + <ConfigurationType>Driver</ConfigurationType> + <DriverType>KMDF</DriverType> + <DriverTargetPlatform>Desktop</DriverTargetPlatform> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> + <OutDir>$(SolutionDir)..\..\..\..\$(Platform)\$(ConfigurationName)\$(MSBuildProjectName)\</OutDir> + <IntDir>$(SolutionDir)..\$(Platform)\$(ConfigurationName)\$(MSBuildProjectName)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> + <OutDir>$(SolutionDir)..\..\..\..\$(Platform)\$(ConfigurationName)\$(MSBuildProjectName)\</OutDir> + <IntDir>$(SolutionDir)..\$(Platform)\$(ConfigurationName)\$(MSBuildProjectName)\</IntDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <WppEnabled>false</WppEnabled> + <WppRecorderEnabled>true</WppRecorderEnabled> + <WppScanConfigurationData Condition="'%(ClCompile.ScanConfigurationData)' == ''">trace.h</WppScanConfigurationData> + <WppKernelMode>true</WppKernelMode> + <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> + </ClCompile> + <Inf> + <TimeStamp>0.6.0.2</TimeStamp> + </Inf> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <WppEnabled>false</WppEnabled> + <WppRecorderEnabled>true</WppRecorderEnabled> + <WppScanConfigurationData Condition="'%(ClCompile.ScanConfigurationData)' == ''">trace.h</WppScanConfigurationData> + <WppKernelMode>true</WppKernelMode> + <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> + </ClCompile> + <Inf> + <TimeStamp>0.6.0.2</TimeStamp> + </Inf> + </ItemDefinitionGroup> + <ItemGroup> + <FilesToPackage Include="$(TargetPath)" /> + </ItemGroup> + <ItemGroup> + <Inf Include="..\..\..\..\lib\librte_eal\windows\netuio\netuio.inf" /> + </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\..\..\..\lib\librte_eal\windows\netuio\netuio.rc" /> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\..\..\..\lib\librte_eal\windows\netuio\netuio_dev.h" /> + <ClInclude Include="..\..\..\..\lib\librte_eal\windows\netuio\netuio_drv.h" /> + <ClInclude Include="..\..\..\..\lib\librte_eal\windows\netuio\netuio_interface.h" /> + <ClInclude Include="..\..\..\..\lib\librte_eal\windows\netuio\netuio_queue.h" /> + <ClInclude Include="..\..\..\..\lib\librte_eal\windows\netuio\resource.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\..\..\..\lib\librte_eal\windows\netuio\netuio_dev.c" /> + <ClCompile Include="..\..\..\..\lib\librte_eal\windows\netuio\netuio_drv.c" /> + <ClCompile Include="..\..\..\..\lib\librte_eal\windows\netuio\netuio_queue.c" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> \ No newline at end of file diff --git a/mk/exec-env/windows/netuio/netuio.vcxproj.filters b/mk/exec-env/windows/netuio/netuio.vcxproj.filters new file mode 100644 index 000000000..72a397d7c --- /dev/null +++ b/mk/exec-env/windows/netuio/netuio.vcxproj.filters @@ -0,0 +1,59 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="Source Files"> + <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> + <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> + </Filter> + <Filter Include="Header Files"> + <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier> + <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> + </Filter> + <Filter Include="Resource Files"> + <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier> + <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions> + </Filter> + <Filter Include="Driver Files"> + <UniqueIdentifier>{8E41214B-6785-4CFE-B992-037D68949A14}</UniqueIdentifier> + <Extensions>inf;inv;inx;mof;mc;</Extensions> + </Filter> + </ItemGroup> + <ItemGroup> + <Inf Include="..\..\..\..\lib\librte_eal\windows\netuio\netuio.inf"> + <Filter>Driver Files</Filter> + </Inf> + </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\..\..\..\lib\librte_eal\windows\netuio\netuio.rc"> + <Filter>Resource Files</Filter> + </ResourceCompile> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\..\..\..\lib\librte_eal\windows\netuio\netuio_interface.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\..\..\..\lib\librte_eal\windows\netuio\netuio_dev.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\..\..\..\lib\librte_eal\windows\netuio\netuio_drv.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\..\..\..\lib\librte_eal\windows\netuio\netuio_queue.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\..\..\..\lib\librte_eal\windows\netuio\resource.h"> + <Filter>Header Files</Filter> + </ClInclude> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\..\..\..\lib\librte_eal\windows\netuio\netuio_queue.c"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\..\..\..\lib\librte_eal\windows\netuio\netuio_dev.c"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\..\..\..\lib\librte_eal\windows\netuio\netuio_drv.c"> + <Filter>Source Files</Filter> + </ClCompile> + </ItemGroup> +</Project> \ No newline at end of file diff --git a/mk/exec-env/windows/netuio/netuio.vcxproj.user b/mk/exec-env/windows/netuio/netuio.vcxproj.user new file mode 100644 index 000000000..771ce8681 --- /dev/null +++ b/mk/exec-env/windows/netuio/netuio.vcxproj.user @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <TestCertificate> + </TestCertificate> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <TestCertificate> + </TestCertificate> + </PropertyGroup> +</Project> \ No newline at end of file -- 2.23.0.vfs.1.1.63.g5a5ad7f
From: Jason Messer <jmesser@microsoft.com> --- mk/exec-env/windows/netuio/netuio.vcxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mk/exec-env/windows/netuio/netuio.vcxproj b/mk/exec-env/windows/netuio/netuio.vcxproj index 251b8eb95..9e769b5d0 100644 --- a/mk/exec-env/windows/netuio/netuio.vcxproj +++ b/mk/exec-env/windows/netuio/netuio.vcxproj @@ -66,7 +66,7 @@ <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> </ClCompile> <Inf> - <TimeStamp>0.6.0.2</TimeStamp> + <TimeStamp>0.6.0.5</TimeStamp> </Inf> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> @@ -78,7 +78,7 @@ <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> </ClCompile> <Inf> - <TimeStamp>0.6.0.2</TimeStamp> + <TimeStamp>0.6.0.5</TimeStamp> </Inf> </ItemDefinitionGroup> <ItemGroup> -- 2.23.0.vfs.1.1.63.g5a5ad7f
From: Harini Ramakrishnan <haramakr@microsoft.com> --- mk/exec-env/windows/netuio/netuio.vcxproj | 20 +++++++++---------- .../windows/netuio/netuio.vcxproj.filters | 20 +++++++++---------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/mk/exec-env/windows/netuio/netuio.vcxproj b/mk/exec-env/windows/netuio/netuio.vcxproj index 9e769b5d0..b6564e4e7 100644 --- a/mk/exec-env/windows/netuio/netuio.vcxproj +++ b/mk/exec-env/windows/netuio/netuio.vcxproj @@ -85,22 +85,22 @@ <FilesToPackage Include="$(TargetPath)" /> </ItemGroup> <ItemGroup> - <Inf Include="..\..\..\..\lib\librte_eal\windows\netuio\netuio.inf" /> + <Inf Include="..\..\..\..\kernel\windows\netuio\netuio.inf" /> </ItemGroup> <ItemGroup> - <ResourceCompile Include="..\..\..\..\lib\librte_eal\windows\netuio\netuio.rc" /> + <ResourceCompile Include="..\..\..\..\kernel\windows\netuio\netuio.rc" /> </ItemGroup> <ItemGroup> - <ClInclude Include="..\..\..\..\lib\librte_eal\windows\netuio\netuio_dev.h" /> - <ClInclude Include="..\..\..\..\lib\librte_eal\windows\netuio\netuio_drv.h" /> - <ClInclude Include="..\..\..\..\lib\librte_eal\windows\netuio\netuio_interface.h" /> - <ClInclude Include="..\..\..\..\lib\librte_eal\windows\netuio\netuio_queue.h" /> - <ClInclude Include="..\..\..\..\lib\librte_eal\windows\netuio\resource.h" /> + <ClInclude Include="..\..\..\..\kernel\windows\netuio\netuio_dev.h" /> + <ClInclude Include="..\..\..\..\kernel\windows\netuio\netuio_drv.h" /> + <ClInclude Include="..\..\..\..\kernel\windows\netuio\netuio_interface.h" /> + <ClInclude Include="..\..\..\..\kernel\windows\netuio\netuio_queue.h" /> + <ClInclude Include="..\..\..\..\kernel\windows\netuio\resource.h" /> </ItemGroup> <ItemGroup> - <ClCompile Include="..\..\..\..\lib\librte_eal\windows\netuio\netuio_dev.c" /> - <ClCompile Include="..\..\..\..\lib\librte_eal\windows\netuio\netuio_drv.c" /> - <ClCompile Include="..\..\..\..\lib\librte_eal\windows\netuio\netuio_queue.c" /> + <ClCompile Include="..\..\..\..\kernel\windows\netuio\netuio_dev.c" /> + <ClCompile Include="..\..\..\..\kernel\windows\netuio\netuio_drv.c" /> + <ClCompile Include="..\..\..\..\kernel\windows\netuio\netuio_queue.c" /> </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> diff --git a/mk/exec-env/windows/netuio/netuio.vcxproj.filters b/mk/exec-env/windows/netuio/netuio.vcxproj.filters index 72a397d7c..a21f9ad99 100644 --- a/mk/exec-env/windows/netuio/netuio.vcxproj.filters +++ b/mk/exec-env/windows/netuio/netuio.vcxproj.filters @@ -19,40 +19,40 @@ </Filter> </ItemGroup> <ItemGroup> - <Inf Include="..\..\..\..\lib\librte_eal\windows\netuio\netuio.inf"> + <Inf Include="..\..\..\..\kernel\windows\netuio\netuio.inf"> <Filter>Driver Files</Filter> </Inf> </ItemGroup> <ItemGroup> - <ResourceCompile Include="..\..\..\..\lib\librte_eal\windows\netuio\netuio.rc"> + <ResourceCompile Include="..\..\..\..\kernel\windows\netuio\netuio.rc"> <Filter>Resource Files</Filter> </ResourceCompile> </ItemGroup> <ItemGroup> - <ClInclude Include="..\..\..\..\lib\librte_eal\windows\netuio\netuio_interface.h"> + <ClInclude Include="..\..\..\..\kernel\windows\netuio\netuio_interface.h"> <Filter>Header Files</Filter> </ClInclude> - <ClInclude Include="..\..\..\..\lib\librte_eal\windows\netuio\netuio_dev.h"> + <ClInclude Include="..\..\..\..\kernel\windows\netuio\netuio_dev.h"> <Filter>Header Files</Filter> </ClInclude> - <ClInclude Include="..\..\..\..\lib\librte_eal\windows\netuio\netuio_drv.h"> + <ClInclude Include="..\..\..\..\kernel\windows\netuio\netuio_drv.h"> <Filter>Header Files</Filter> </ClInclude> - <ClInclude Include="..\..\..\..\lib\librte_eal\windows\netuio\netuio_queue.h"> + <ClInclude Include="..\..\..\..\kernel\windows\netuio\netuio_queue.h"> <Filter>Header Files</Filter> </ClInclude> - <ClInclude Include="..\..\..\..\lib\librte_eal\windows\netuio\resource.h"> + <ClInclude Include="..\..\..\..\kernel\windows\netuio\resource.h"> <Filter>Header Files</Filter> </ClInclude> </ItemGroup> <ItemGroup> - <ClCompile Include="..\..\..\..\lib\librte_eal\windows\netuio\netuio_queue.c"> + <ClCompile Include="..\..\..\..\kernel\windows\netuio\netuio_queue.c"> <Filter>Source Files</Filter> </ClCompile> - <ClCompile Include="..\..\..\..\lib\librte_eal\windows\netuio\netuio_dev.c"> + <ClCompile Include="..\..\..\..\kernel\windows\netuio\netuio_dev.c"> <Filter>Source Files</Filter> </ClCompile> - <ClCompile Include="..\..\..\..\lib\librte_eal\windows\netuio\netuio_drv.c"> + <ClCompile Include="..\..\..\..\kernel\windows\netuio\netuio_drv.c"> <Filter>Source Files</Filter> </ClCompile> </ItemGroup> -- 2.23.0.vfs.1.1.63.g5a5ad7f
From: Harini Ramakrishnan <haramakr@microsoft.com> --- mk/exec-env/windows/netuio/netuio.vcxproj | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mk/exec-env/windows/netuio/netuio.vcxproj b/mk/exec-env/windows/netuio/netuio.vcxproj index b6564e4e7..b6b11e49a 100644 --- a/mk/exec-env/windows/netuio/netuio.vcxproj +++ b/mk/exec-env/windows/netuio/netuio.vcxproj @@ -68,6 +68,9 @@ <Inf> <TimeStamp>0.6.0.5</TimeStamp> </Inf> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);$(KernelBufferOverflowLib);$(DDK_LIB_PATH)ntoskrnl.lib;$(DDK_LIB_PATH)hal.lib;$(DDK_LIB_PATH)wmilib.lib;$(KMDF_LIB_PATH)$(KMDF_VER_PATH)\WdfLdr.lib;$(KMDF_LIB_PATH)$(KMDF_VER_PATH)\WdfDriverEntry.lib;$(DDK_LIB_PATH)\wdmsec.lib</AdditionalDependencies> + </Link> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <ClCompile> @@ -80,6 +83,9 @@ <Inf> <TimeStamp>0.6.0.5</TimeStamp> </Inf> + <Link> + <AdditionalDependencies>%(AdditionalDependencies);$(KernelBufferOverflowLib);$(DDK_LIB_PATH)ntoskrnl.lib;$(DDK_LIB_PATH)hal.lib;$(DDK_LIB_PATH)wmilib.lib;$(KMDF_LIB_PATH)$(KMDF_VER_PATH)\WdfLdr.lib;$(KMDF_LIB_PATH)$(KMDF_VER_PATH)\WdfDriverEntry.lib;$(DDK_LIB_PATH)\wdmsec.lib</AdditionalDependencies> + </Link> </ItemDefinitionGroup> <ItemGroup> <FilesToPackage Include="$(TargetPath)" /> -- 2.23.0.vfs.1.1.63.g5a5ad7f
From: Harini Ramakrishnan <haramakr@microsoft.com> --- kernel/windows/netuio/netuio.inf | 118 +++++++++ kernel/windows/netuio/netuio.rc | Bin 0 -> 4772 bytes kernel/windows/netuio/netuio_dev.c | 306 +++++++++++++++++++++++ kernel/windows/netuio/netuio_dev.h | 65 +++++ kernel/windows/netuio/netuio_drv.c | 142 +++++++++++ kernel/windows/netuio/netuio_drv.h | 33 +++ kernel/windows/netuio/netuio_interface.h | 69 +++++ kernel/windows/netuio/netuio_queue.c | 271 ++++++++++++++++++++ kernel/windows/netuio/netuio_queue.h | 30 +++ kernel/windows/netuio/resource.h | 14 ++ 10 files changed, 1048 insertions(+) create mode 100644 kernel/windows/netuio/netuio.inf create mode 100644 kernel/windows/netuio/netuio.rc create mode 100644 kernel/windows/netuio/netuio_dev.c create mode 100644 kernel/windows/netuio/netuio_dev.h create mode 100644 kernel/windows/netuio/netuio_drv.c create mode 100644 kernel/windows/netuio/netuio_drv.h create mode 100644 kernel/windows/netuio/netuio_interface.h create mode 100644 kernel/windows/netuio/netuio_queue.c create mode 100644 kernel/windows/netuio/netuio_queue.h create mode 100644 kernel/windows/netuio/resource.h diff --git a/kernel/windows/netuio/netuio.inf b/kernel/windows/netuio/netuio.inf new file mode 100644 index 000000000..0453b371a --- /dev/null +++ b/kernel/windows/netuio/netuio.inf @@ -0,0 +1,118 @@ +; +; BSD LICENSE +; +; Copyright(c) 2010-2018 Intel Corporation. All rights reserved. +; All rights reserved. +; +; Redistribution and use in source and binary forms, with or without +; modification, are permitted provided that the following conditions +; are met: +; +; * Redistributions of source code must retain the above copyright +; notice, this list of conditions and the following disclaimer. +; * Redistributions in binary form must reproduce the above copyright +; notice, this list of conditions and the following disclaimer in +; the documentation and/or other materials provided with the +; distribution. +; * Neither the name of Intel Corporation nor the names of its +; contributors may be used to endorse or promote products derived +; from this software without specific prior written permission. +; +; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +; +; +; netuio.inf +; + +[Version] +Signature="$WINDOWS NT$" +Class=Net +ClassGuid={4d36e972-e325-11ce-bfc1-08002be10318} +Provider=%ManufacturerName% +CatalogFile=netuio.cat +DriverVer= + +;***************************************** +; Install Section +;***************************************** + +[Manufacturer] +%ManufacturerName%=Standard,NT$ARCH$ + +[Standard.NT$ARCH$] +%F1583.netuio.Description%=netuio_Device, PCI\VEN_8086&DEV_1583 +%F158A.netuio.Description%=netuio_Device, PCI\VEN_8086&DEV_158A ; I40E_DEV_ID_25G_B +%F158B.netuio.Description%=netuio_Device, PCI\VEN_8086&DEV_158B ; I40E_DEV_ID_25G_SFP28 +%F37D0.netuio.Description%=netuio_Device, PCI\VEN_8086&DEV_37D0 +%F153B.netuio.Description%=netuio_Device, PCI\VEN_8086&DEV_153B + +[netuio_Device.NT] +CopyFiles=Drivers_Dir + +[Drivers_Dir] +netuio.sys + +;-------------- Service installation +[netuio_Device.NT.Services] +AddService = netuio,%SPSVCINST_ASSOCSERVICE%, netuio_Service_Inst + +; -------------- netuio driver install sections +[netuio_Service_Inst] +DisplayName = %netuio.SVCDESC% +ServiceType = 1 ; SERVICE_KERNEL_DRIVER +StartType = 3 ; SERVICE_DEMAND_START +ErrorControl = 1 ; SERVICE_ERROR_NORMAL +ServiceBinary = %12%\netuio.sys + +; +;--- netuio_Device Coinstaller installation ------ +; + +[DestinationDirs] +DefaultDestDir = 12 +netuio_Device_CoInstaller_CopyFiles = 11 + +[netuio_Device.NT.CoInstallers] +AddReg=netuio_Device_CoInstaller_AddReg +CopyFiles=netuio_Device_CoInstaller_CopyFiles + +[netuio_Device_CoInstaller_AddReg] +HKR,,CoInstallers32,0x00010000, "WdfCoInstaller$KMDFCOINSTALLERVERSION$.dll,WdfCoInstaller" + +[netuio_Device_CoInstaller_CopyFiles] +WdfCoInstaller$KMDFCOINSTALLERVERSION$.dll + +[SourceDisksNames] +1 = %DiskName%,,,"" + +[SourceDisksFiles] +netuio.sys = 1,, +WdfCoInstaller$KMDFCOINSTALLERVERSION$.dll=1 ; make sure the number matches with SourceDisksNames + +[netuio_Device.NT.Wdf] +KmdfService = netuio, netuio_wdfsect +[netuio_wdfsect] +KmdfLibraryVersion = $KMDFVERSION$ + +[Strings] +SPSVCINST_ASSOCSERVICE= 0x00000002 +ManufacturerName="Intel" +ClassName = "Intel(R) DPDK netUIO Driver" +DiskName = "DPDK netUIO Installation Disk" +F1583.netuio.Description = "DPDK netUIO for Intel(R) Ethernet Converged Network Adapter XL710-Q2" +F158A.netuio.Description = "DPDK netUIO for Intel(R) Ethernet Network Adapter XXV710 for 25GbE backplane" +F158B.netuio.Description = "DPDK netUIO for Intel(R) Ethernet Network Adapter XXV710-DA1" +F37D0.netuio.Description = "DPDK netUIO for Intel(R) Ethernet Connection X722" +F153B.netuio.Description = "DPDK netUIO for Intel(R) Ethernet Connection I217-V" +netuio.DeviceDesc = "netuio Device" +netuio.SVCDESC = "netuio Service" diff --git a/kernel/windows/netuio/netuio.rc b/kernel/windows/netuio/netuio.rc new file mode 100644 index 0000000000000000000000000000000000000000..4b0b176e6284fcfa65662f7ea6b3b1b36fb85a6d GIT binary patch literal 4772 zcmdUy+iuf95QgU(iFYvR4G7dGEg-mTlQdMM2Q_H`sZs<aEtNuC#R&(AX9vE2H(T4W zQ<TC*kY%rTJu^G=&tb>Ees0;8MRsUc_R%I5Tf%)|Q`UN{B{sA7Heyz{$6S$J+R(<_ z6V|7U1J)*t;+ygIk@tw1q+QuHG@Ewc?y<|38#h=T^K}IEz|mF;{G0a4Dvny58;<V6 z@k#csomj`Zc4iGbuw(1nsWn+`@P1@%d&f$L=b`Pf(&jzvFCEtJ3fhG+vKF{3VtfHg zv3<t=Dd-4?E>^$gd4Sb*>=YhN*0;GAJ@RKCe0BJGzC8Zxhgi_aN5>4T6iFA@eYe;M z$OpOWH3sb>ygMfUMtCYA1|oZi&&SL{9(H*1S((_Qk|;<rId$dmdXUSl0TOp@pQ!RV z)ggb*$gVm&_ld4Hm*oE7ik5PAk#R~4_u)E%|B>6Z&FT@WXN)Zur(wm@wUB*4uD-G- z$nHS5$BO4!r0Db2XSI(2*|IzWlpj4TdCjhk|E?C4XL*PTjk;@KR!$kY?|azZa+N~V z(flf}yysS(S6}(hBPK4@mAmXwR`DxVtTz=qr*54S(Z2SlS}xOQ=Z+e!y3dBI#{)7= zHO6165oPtJ7;V8v>s3{<+DJpq!>F@gCwzj%G5!ea!IB=?*N3J_o_E|Ce8gOq?~`ZZ z&VC8&;*Ov=Ag`MXG!ZfP#GZ3&eCBqHIOk81*C5;LL|$HMM9h0?aa89VLHfR{9WAsw zq=t0JeeLkgcJN@^(JCs_s-f!Eq~e^BC3!tlNnS$jhJQ#UPQdAQ`f7$==ahEMa~z|e zm;DqSbv>Q)q-b^NXHL-2({0;_0)?-bdAhK7dG@Qm9)ql~si4CYkE=Jk#79@yHpEk7 zw2c??v0Pfni@a3XQni=PrVl*xnVs^KRj2SZj6FQ5E=MR-&|BTmHRs*fz7u)xnGIRj z=}~c->s0ieYm8;r(EFa%$8@<S<$DD@8c57`wn38Lvw?>i4o&rLQ#4g~s&i7feqn9G zOn7Q+LZLoxg8rgbhpk+b7h?1l{>s3+=$X&nfJv23{5iMAXDi8790*P6s=t9nw7ms0 ztc;PJ;E&bxZX^5BNfrjz@C&g^@R{CtwD?8+Pu=w++t^gI7tZ%V*X5qy1nXUga729x z`y{NMqK7hi;=DD$mQ~O{o@=cf5=tRzG|R^3-=cNGJ~2@><1cDj@I`~&)CH<~ju^FD zL|hJ?O(Tb|w2?<6qE+2v8kKLDt4hV3&#U<`uT^;j*5=Wt2wYYR(w-yaVsRy3V|rLQ zxj|e0U$tiCD@zw?!Yy(5O+iF?>9a^@h_7hM`5HZu>b0-uUf)#P^iAKF_YnW4tIwY2 z>-8?{v$sEaZ~JE}_E76(QC1sSrg<3u_U~Oi?d^Z>0n4lw>-8=Tm&f~<d{WIR{;L=L HE=j)u5l}&X literal 0 HcmV?d00001 diff --git a/kernel/windows/netuio/netuio_dev.c b/kernel/windows/netuio/netuio_dev.c new file mode 100644 index 000000000..10ff5f903 --- /dev/null +++ b/kernel/windows/netuio/netuio_dev.c @@ -0,0 +1,306 @@ +/*- +* +* Copyright(c) 2017 Intel Corporation. All rights reserved. +* +*/ + + +#include <stdio.h> +#include "netuio_drv.h" + +#include <wdmguid.h> + +#ifdef ALLOC_PRAGMA +#pragma alloc_text (PAGE, netuio_create_device) +#pragma alloc_text (PAGE, netuio_evt_device_context_cleanup) +#pragma alloc_text (PAGE, netuio_map_hw_resources) +#pragma alloc_text (PAGE, netuio_free_hw_resources) +#endif + +/* +Routine Description: + Worker routine called to create a device and its software resources. + +Return Value: + NTSTATUS + */ +NTSTATUS +netuio_create_device(_Inout_ PWDFDEVICE_INIT DeviceInit) +{ + WDF_OBJECT_ATTRIBUTES deviceAttributes; + WDFDEVICE device; + NTSTATUS status; + + PAGED_CODE(); + WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&deviceAttributes, NETUIO_CONTEXT_DATA); + + // Set the device context cleanup callback. + // This function will be called when the WDF Device Object associated to the current device is destroyed + deviceAttributes.EvtCleanupCallback = netuio_evt_device_context_cleanup; + + status = WdfDeviceCreate(&DeviceInit, &deviceAttributes, &device); + + if (NT_SUCCESS(status)) { + // Create a device interface so that applications can find and talk to us. + status = WdfDeviceCreateDeviceInterface(device, &GUID_DEVINTERFACE_netUIO, NULL); + + if (NT_SUCCESS(status)) { + // Retrieve and store PCI information + status = get_pci_device_info(device); + } + + if (NT_SUCCESS(status)) { + // Create a symbolic link name for user-space access + status = create_device_specific_symbolic_link(device); + } + + if (NT_SUCCESS(status)) { + // Initialize the I/O Package and any Queues + status = netuio_queue_initialize(device); + } + + if (NT_SUCCESS(status)) { + // Allocate physically contiguous memory for user process use. We'll map it later + status = allocate_usermemory_segment(device); + } + } + + return status; +} + +/* +Routine Description: + Free all the resources allocated in AdfEvtDeviceAdd. + +Return Value: + None + */ +VOID +netuio_evt_device_context_cleanup(_In_ WDFOBJECT Device) +{ + free_usermemory_segment(Device); + return; +} + +NTSTATUS +netuio_map_hw_resources(_In_ WDFDEVICE Device, _In_ WDFCMRESLIST Resources, _In_ WDFCMRESLIST ResourcesTranslated) +{ + UNREFERENCED_PARAMETER(Resources); + + NTSTATUS status = STATUS_SUCCESS; + + PNETUIO_CONTEXT_DATA netuio_contextdata; + netuio_contextdata = netuio_get_context_data(Device); + + if (!netuio_contextdata) + return STATUS_UNSUCCESSFUL; + + PCM_PARTIAL_RESOURCE_DESCRIPTOR descriptor; + UINT8 bar_index = 0; + + // Collect device BAR resources from the ResourcesTranslated object + for (ULONG idx = 0; idx < WdfCmResourceListGetCount(ResourcesTranslated); idx++) { + descriptor = WdfCmResourceListGetDescriptor(ResourcesTranslated, idx); + if (!descriptor) { + status = STATUS_DEVICE_CONFIGURATION_ERROR; + goto end; + } + + switch (descriptor->Type) { + case CmResourceTypeMemory: + // Retrieve and map the BARs + netuio_contextdata->bar[bar_index].base_addr.QuadPart = descriptor->u.Memory.Start.QuadPart; + netuio_contextdata->bar[bar_index].size = descriptor->u.Memory.Length; + netuio_contextdata->bar[bar_index].virt_addr = + MmMapIoSpace(descriptor->u.Memory.Start, descriptor->u.Memory.Length, MmNonCached); + + if (netuio_contextdata->bar[bar_index].virt_addr == NULL) { + status = STATUS_UNSUCCESSFUL; + goto end; + } + + bar_index++; + break; + + // Don't handle any other resource type + // This could be device-private type added by the PCI bus driver. + case CmResourceTypeInterrupt: + default: + break; + } + } + + // Allocate an MDL for the device BAR, so that we can map it to the user's process context later... + if (status == STATUS_SUCCESS) { + // Bar 0 is typically the HW BAR + if (netuio_contextdata->bar[0].virt_addr) { + netuio_contextdata->dpdk_hw.mdl = IoAllocateMdl(netuio_contextdata->bar[0].virt_addr, (ULONG)netuio_contextdata->bar[0].size, FALSE, FALSE, NULL); + if (!netuio_contextdata->dpdk_hw.mdl) { + status = STATUS_INSUFFICIENT_RESOURCES; + goto end; + } + netuio_contextdata->dpdk_hw.mem.size = netuio_contextdata->bar[0].size; + } + } + +end: + return status; +} + +VOID +netuio_free_hw_resources(_In_ WDFDEVICE Device) +{ + PNETUIO_CONTEXT_DATA netuio_contextdata; + netuio_contextdata = netuio_get_context_data(Device); + + if (netuio_contextdata) { + // Free the allocated MDL + if (netuio_contextdata->dpdk_hw.mdl) + IoFreeMdl(netuio_contextdata->dpdk_hw.mdl); + + // Unmap all the BAR regions previously mapped + for (UINT8 bar_index = 0; bar_index < PCI_MAX_BAR; bar_index++) { + if (netuio_contextdata->bar[bar_index].virt_addr) + MmUnmapIoSpace(netuio_contextdata->bar[bar_index].virt_addr, netuio_contextdata->bar[bar_index].size); + } + } +} + + +static NTSTATUS +get_pci_device_info(_In_ WDFOBJECT device) +{ + NTSTATUS status = STATUS_UNSUCCESSFUL; + + PNETUIO_CONTEXT_DATA netuio_contextdata; + netuio_contextdata = netuio_get_context_data(device); + + if (!netuio_contextdata) + return status; + + netuio_contextdata->wdf_device = device; // Store for later use + + // Obtain the BUS_INTERFACE_STANDARD interface from the Bus Driver + status = WdfFdoQueryForInterface(device, &GUID_BUS_INTERFACE_STANDARD, + (PINTERFACE)&netuio_contextdata->bus_interface, + sizeof(BUS_INTERFACE_STANDARD), 1, NULL); + if (!NT_SUCCESS(status)) + return status; + + // Retrieve the B:D:F details of our device + PDEVICE_OBJECT pdo = NULL; + pdo = WdfDeviceWdmGetPhysicalDevice(device); + if (pdo) { + ULONG prop = 0, length = 0; + status = IoGetDeviceProperty(pdo, DevicePropertyBusNumber, sizeof(ULONG), (PVOID)&netuio_contextdata->addr.bus_num, &length); + status = IoGetDeviceProperty(pdo, DevicePropertyAddress, sizeof(ULONG), (PVOID)&prop, &length); + + if (NT_SUCCESS(status)) { + netuio_contextdata->addr.func_num = prop & 0x0000FFFF; + netuio_contextdata->addr.dev_num = ((prop >> 16) & 0x0000FFFF); + } + // Also, retrieve the NUMA node of the device + USHORT numaNode; + status = IoGetDeviceNumaNode(pdo, &numaNode); + if (NT_SUCCESS(status)) { + netuio_contextdata->dev_numa_node = numaNode; + } + } + + return status; +} + +static NTSTATUS +create_device_specific_symbolic_link(_In_ WDFOBJECT device) +{ + NTSTATUS status = STATUS_UNSUCCESSFUL; + UNICODE_STRING netuio_symbolic_link; + + PNETUIO_CONTEXT_DATA netuio_contextdata; + netuio_contextdata = netuio_get_context_data(device); + + if (!netuio_contextdata) + return status; + + // Build symbolic link name as <netuio_symbolic_link>_BDF (bus/device/func) + CHAR symbolic_link[64] = { 0 }; + sprintf_s(symbolic_link, sizeof(symbolic_link), "%s_%04d%02d%02d", + NETUIO_DEVICE_SYMBOLIC_LINK_ANSI, netuio_contextdata->addr.bus_num, + netuio_contextdata->addr.dev_num, netuio_contextdata->addr.func_num); + + ANSI_STRING ansi_symbolic_link; + RtlInitAnsiString(&ansi_symbolic_link, symbolic_link); + + status = RtlAnsiStringToUnicodeString(&netuio_symbolic_link, &ansi_symbolic_link, TRUE); + if (!NT_SUCCESS(status)) + return status; + + status = WdfDeviceCreateSymbolicLink(device, &netuio_symbolic_link); + + RtlFreeUnicodeString(&netuio_symbolic_link); + + return status; +} + +static NTSTATUS +allocate_usermemory_segment(_In_ WDFOBJECT device) +{ + NTSTATUS status = STATUS_SUCCESS; + + PNETUIO_CONTEXT_DATA netuio_contextdata; + netuio_contextdata = netuio_get_context_data(device); + + if (!netuio_contextdata) + return STATUS_UNSUCCESSFUL; + + PHYSICAL_ADDRESS lowest_acceptable_address; + PHYSICAL_ADDRESS highest_acceptable_address; + PHYSICAL_ADDRESS boundary_address_multiple; + + lowest_acceptable_address.QuadPart = 0x0000000000800000; + highest_acceptable_address.QuadPart = 0xFFFFFFFFFFFFFFFF; + boundary_address_multiple.QuadPart = 0; + + // Allocate physically contiguous memory for user process use + netuio_contextdata->dpdk_seg.mem.virt_addr = + MmAllocateContiguousMemorySpecifyCache(USER_MEMORY_SEGMENT_SIZE, + lowest_acceptable_address, + highest_acceptable_address, + boundary_address_multiple, + MmCached); + + if (!netuio_contextdata->dpdk_seg.mem.virt_addr) { + status = STATUS_NO_MEMORY; + goto end; + } + + netuio_contextdata->dpdk_seg.mem.size = USER_MEMORY_SEGMENT_SIZE; + + // Allocate an MDL for this memory region - so that we can map it into the user's process context later + netuio_contextdata->dpdk_seg.mdl = IoAllocateMdl((PVOID)netuio_contextdata->dpdk_seg.mem.virt_addr, USER_MEMORY_SEGMENT_SIZE, FALSE, FALSE, NULL); + if (netuio_contextdata->dpdk_seg.mdl == NULL) { + status = STATUS_NO_MEMORY; + goto end; + } + + // Store the region's physical address + netuio_contextdata->dpdk_seg.mem.phys_addr = MmGetPhysicalAddress(netuio_contextdata->dpdk_seg.mem.virt_addr); + +end: + return status; +} + +static VOID +free_usermemory_segment(_In_ WDFOBJECT device) +{ + PNETUIO_CONTEXT_DATA netuio_contextdata; + netuio_contextdata = netuio_get_context_data(device); + + if (netuio_contextdata) { + if (netuio_contextdata->dpdk_seg.mdl) + IoFreeMdl(netuio_contextdata->dpdk_seg.mdl); + + if (netuio_contextdata->dpdk_seg.mem.virt_addr) + MmFreeContiguousMemory(netuio_contextdata->dpdk_seg.mem.virt_addr); + } +} diff --git a/kernel/windows/netuio/netuio_dev.h b/kernel/windows/netuio/netuio_dev.h new file mode 100644 index 000000000..a19a4fb42 --- /dev/null +++ b/kernel/windows/netuio/netuio_dev.h @@ -0,0 +1,65 @@ +/*- +* +* Copyright(c) 2017 Intel Corporation. All rights reserved. +* +*/ + +#ifndef NETUIO_DEV_H +#define NETUIO_DEV_H + +EXTERN_C_START + +#include "netuio_interface.h" + +// Constants +#define PCI_MAX_BAR 3 +#define USER_MEMORY_SEGMENT_SIZE (256ULL * 1024ULL * 1024ULL) // 256MB + +struct pci_bar { + PHYSICAL_ADDRESS base_addr; + PVOID virt_addr; + UINT64 size; +}; + +struct mem_map_region { + PMDL mdl; // MDL describing the memory region + struct mem_region mem; // Memory region details +}; + +// The device context performs the same job as a WDM device extension in the driver frameworks +typedef struct _NETUIO_CONTEXT_DATA +{ + WDFDEVICE wdf_device; // WDF device handle to the FDO + BUS_INTERFACE_STANDARD bus_interface; // Bus interface for config space access + struct pci_bar bar[PCI_MAX_BAR]; // device BARs + struct dev_addr addr; // B:D:F details of device + USHORT dev_numa_node; // The NUMA node of the device + struct mem_map_region dpdk_hw; // mapped region for the device's register space + struct mem_map_region dpdk_seg; // mapped region allocated for DPDK process use +} NETUIO_CONTEXT_DATA, *PNETUIO_CONTEXT_DATA; + + +// This macro will generate an inline function called DeviceGetContext +// which will be used to get a pointer to the device context memory in a type safe manner. +WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(NETUIO_CONTEXT_DATA, netuio_get_context_data) + + +// Function to initialize the device and its callbacks +NTSTATUS netuio_create_device(_Inout_ PWDFDEVICE_INIT DeviceInit); +NTSTATUS netuio_map_hw_resources(_In_ WDFDEVICE Device, _In_ WDFCMRESLIST Resources, _In_ WDFCMRESLIST ResourcesTranslated); +VOID netuio_free_hw_resources(_In_ WDFDEVICE Device); + + +// Function called for cleanup when device object is being destroyed +VOID netuio_evt_device_context_cleanup(_In_ WDFOBJECT Device); + +// Local function protoyypes +static NTSTATUS get_pci_device_info(_In_ WDFOBJECT device); +static NTSTATUS create_device_specific_symbolic_link(_In_ WDFOBJECT device); +static NTSTATUS allocate_usermemory_segment(_In_ WDFOBJECT device); +static VOID free_usermemory_segment(_In_ WDFOBJECT device); + + +EXTERN_C_END + +#endif // NETUIO_DEV_H diff --git a/kernel/windows/netuio/netuio_drv.c b/kernel/windows/netuio/netuio_drv.c new file mode 100644 index 000000000..d45a9ec4f --- /dev/null +++ b/kernel/windows/netuio/netuio_drv.c @@ -0,0 +1,142 @@ +/*- +* +* Copyright(c) 2017 Intel Corporation. All rights reserved. +* +*/ + + +#include "netuio_drv.h" + +#ifdef ALLOC_PRAGMA +#pragma alloc_text (INIT, DriverEntry) +#pragma alloc_text (PAGE, netuio_evt_device_add) +#pragma alloc_text (PAGE, netuio_evt_driver_context_cleanup) +#endif + + +/* +Routine Description: + DriverEntry initializes the driver and is the first routine called by the + system after the driver is loaded. DriverEntry specifies the other entry + points in the function driver, such as EvtDevice and DriverUnload. + +Return Value: + STATUS_SUCCESS if successful, + STATUS_UNSUCCESSFUL otherwise. + */ +NTSTATUS +DriverEntry(_In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath) +{ + WDF_DRIVER_CONFIG config; + NTSTATUS status; + WDF_OBJECT_ATTRIBUTES attributes; + + // Register a cleanup callback so that we can call WPP_CLEANUP when + // the framework driver object is deleted during driver unload. + WDF_OBJECT_ATTRIBUTES_INIT(&attributes); + attributes.EvtCleanupCallback = netuio_evt_driver_context_cleanup; + + WDF_DRIVER_CONFIG_INIT(&config, netuio_evt_device_add); + + status = WdfDriverCreate(DriverObject, RegistryPath, + &attributes, &config, + WDF_NO_HANDLE); + + if (!NT_SUCCESS(status)) { + return status; + } + + return status; +} + + +/* +Routine Description: + netuio_evt_device_add is called by the framework in response to AddDevice + call from the PnP manager. We create and initialize a device object to + represent a new instance of the device. + +Return Value: + NTSTATUS + */ +NTSTATUS +netuio_evt_device_add(_In_ WDFDRIVER Driver, _Inout_ PWDFDEVICE_INIT DeviceInit) +{ + NTSTATUS status; + WDF_PNPPOWER_EVENT_CALLBACKS pnpPowerCallbacks; + + UNREFERENCED_PARAMETER(Driver); + + PAGED_CODE(); + + // Zero out the PnpPowerCallbacks structure + WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpPowerCallbacks); + + // Register Plug-aNd-Play and power management callbacks + pnpPowerCallbacks.EvtDevicePrepareHardware = netuio_evt_prepare_hw; + pnpPowerCallbacks.EvtDeviceReleaseHardware = netuio_evt_release_hw; + + WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit, &pnpPowerCallbacks); + + status = netuio_create_device(DeviceInit); + + return status; +} + +/* +Routine Description : + Maps HW resources and retrieves the PCI BAR address(es) of the device + +Return Value : + STATUS_SUCCESS is successful. + STATUS_<ERROR> otherwise +-*/ +NTSTATUS +netuio_evt_prepare_hw(_In_ WDFDEVICE Device, _In_ WDFCMRESLIST Resources, _In_ WDFCMRESLIST ResourcesTranslated) +{ + NTSTATUS status; + + status = netuio_map_hw_resources(Device, Resources, ResourcesTranslated); + + if (NT_SUCCESS(status)) { + PNETUIO_CONTEXT_DATA netuio_contextdata; + netuio_contextdata = netuio_get_context_data(Device); + if (netuio_contextdata) { + DbgPrintEx(DPFLTR_IHVNETWORK_ID, DPFLTR_NETUIO_INFO_LEVEL, "netUIO Driver loaded...on device (B:D:F) %04d:%02d:%02d\n", + netuio_contextdata->addr.bus_num, netuio_contextdata->addr.dev_num, netuio_contextdata->addr.func_num); + } + } + return status; +} + +/* +Routine Description : + Releases the resource mapped by netuio_evt_prepare_hw + +Return Value : + STATUS_SUCCESS always. +-*/ +NTSTATUS +netuio_evt_release_hw(_In_ WDFDEVICE Device, _In_ WDFCMRESLIST ResourcesTranslated) +{ + UNREFERENCED_PARAMETER(ResourcesTranslated); + + netuio_free_hw_resources(Device); + + return STATUS_SUCCESS; +} + +/* +Routine Description: + Free all the resources allocated in DriverEntry. + +Return Value: + None +-*/ +VOID +netuio_evt_driver_context_cleanup(_In_ WDFOBJECT DriverObject) +{ + UNREFERENCED_PARAMETER(DriverObject); + DbgPrintEx(DPFLTR_IHVNETWORK_ID, DPFLTR_NETUIO_INFO_LEVEL, "netUIO Driver unloaded.\n"); + PAGED_CODE(); +} diff --git a/kernel/windows/netuio/netuio_drv.h b/kernel/windows/netuio/netuio_drv.h new file mode 100644 index 000000000..39d7f301e --- /dev/null +++ b/kernel/windows/netuio/netuio_drv.h @@ -0,0 +1,33 @@ +/*- +* +* Copyright(c) 2017 Intel Corporation. All rights reserved. +* +*/ + + +#ifndef NETUIO_DRV_H +#define NETUIO_DRV_H + +#define INITGUID + +#include <ntddk.h> +#include <wdf.h> + +#include "netuio_dev.h" +#include "netuio_queue.h" + +EXTERN_C_START + +// Print output constants +#define DPFLTR_NETUIO_INFO_LEVEL 35 + +// WDFDRIVER Events +DRIVER_INITIALIZE DriverEntry; +EVT_WDF_DRIVER_DEVICE_ADD netuio_evt_device_add; +EVT_WDF_OBJECT_CONTEXT_CLEANUP netuio_evt_driver_context_cleanup; +EVT_WDF_DEVICE_PREPARE_HARDWARE netuio_evt_prepare_hw; +EVT_WDF_DEVICE_RELEASE_HARDWARE netuio_evt_release_hw; + +EXTERN_C_END + +#endif // NETUIO_DRV_H diff --git a/kernel/windows/netuio/netuio_interface.h b/kernel/windows/netuio/netuio_interface.h new file mode 100644 index 000000000..b86bf5d3f --- /dev/null +++ b/kernel/windows/netuio/netuio_interface.h @@ -0,0 +1,69 @@ +/*- +* +* Copyright(c) 2017 Intel Corporation. All rights reserved. +* +*/ + + +#ifndef NETUIO_INTERFACE_H +#define NETUIO_INTERFACE_H + +// All structures in this file are packed on an 8B boundary. +#pragma pack(push) +#pragma pack(8) + +// Define an Interface Guid so that any app can find the device and talk to it. +DEFINE_GUID (GUID_DEVINTERFACE_netUIO, 0x08336f60,0x0679,0x4c6c,0x85,0xd2,0xae,0x7c,0xed,0x65,0xff,0xf7); // {08336f60-0679-4c6c-85d2-ae7ced65fff7} + +// Device name definitions +#define NETUIO_DEVICE_SYMBOLIC_LINK_ANSI "\\DosDevices\\netuio" + +// netUIO driver symbolic name (prefix) +#define NETUIO_DRIVER_NAME _T("netuio") + +// IOCTL code definitions +#define IOCTL_NETUIO_GET_HW_DATA CTL_CODE(FILE_DEVICE_NETWORK, 51, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_NETUIO_PCI_CONFIG_IO CTL_CODE(FILE_DEVICE_NETWORK, 52, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +struct mem_region { + UINT64 size; // memory region size + PHYSICAL_ADDRESS phys_addr; // physical address of the memory region + PVOID virt_addr; // virtual address of the memory region + PVOID user_mapped_virt_addr; // virtual address of the region mapped into user process context +}; + +struct dev_addr { + ULONG bus_num; + USHORT dev_num; + USHORT func_num; +}; + +enum pci_io { + PCI_IO_READ = 0, + PCI_IO_WRITE = 1 +}; + +struct dpdk_private_info +{ + struct mem_region hw; + struct mem_region ms; + struct dev_addr dev_addr; + struct mem_region bar1; +// struct mem_region bar2; + UINT16 dev_id; + UINT16 sub_dev_id; + USHORT dev_numa_node; + USHORT reserved; +}; + +struct dpdk_pci_config_io +{ + struct dev_addr dev_addr; + PVOID buf; + UINT32 offset; + enum pci_io op; +}; + +#pragma pack(pop) + +#endif // NETUIO_INTERFACE_H diff --git a/kernel/windows/netuio/netuio_queue.c b/kernel/windows/netuio/netuio_queue.c new file mode 100644 index 000000000..312d4b682 --- /dev/null +++ b/kernel/windows/netuio/netuio_queue.c @@ -0,0 +1,271 @@ +/*- +* +* Copyright(c) 2017 Intel Corporation. All rights reserved. +* +*/ + + +#include "netuio_drv.h" + +#ifdef ALLOC_PRAGMA +#pragma alloc_text (PAGE, netuio_queue_initialize) +#endif + +VOID netuio_read_PCI_config(PNETUIO_CONTEXT_DATA netuio_contextdata, ULONG offset, PVOID buffer) +{ + netuio_contextdata->bus_interface.GetBusData(netuio_contextdata->bus_interface.Context, + PCI_WHICHSPACE_CONFIG, + buffer, + offset, + sizeof(UINT32)); +} + +VOID netuio_write_PCI_config(PNETUIO_CONTEXT_DATA netuio_contextdata, ULONG offset, PVOID buffer) +{ + netuio_contextdata->bus_interface.SetBusData(netuio_contextdata->bus_interface.Context, + PCI_WHICHSPACE_CONFIG, + buffer, + offset, + sizeof(UINT32)); +} + +static NTSTATUS +netuio_handle_get_hw_data_request(_In_ WDFREQUEST Request, _In_ PNETUIO_CONTEXT_DATA netuio_contextdata, + _In_ PVOID outputBuf, _In_ size_t outputBufSize) +{ + NTSTATUS status = STATUS_SUCCESS; + + WDF_REQUEST_PARAMETERS params; + WDF_REQUEST_PARAMETERS_INIT(¶ms); + WdfRequestGetParameters(Request, ¶ms); + + if (!netuio_contextdata || (outputBufSize != sizeof(struct dpdk_private_info))) { + status = STATUS_INVALID_PARAMETER; + goto end; + } + + struct dpdk_private_info *dpdk_pvt_info = (struct dpdk_private_info *)outputBuf; + RtlZeroMemory(dpdk_pvt_info, outputBufSize); + + dpdk_pvt_info->hw.phys_addr.QuadPart = netuio_contextdata->bar[0].base_addr.QuadPart; + dpdk_pvt_info->hw.user_mapped_virt_addr = netuio_contextdata->dpdk_hw.mem.user_mapped_virt_addr; + dpdk_pvt_info->hw.size = netuio_contextdata->bar[0].size; + + dpdk_pvt_info->ms.phys_addr.QuadPart = netuio_contextdata->dpdk_seg.mem.phys_addr.QuadPart; + dpdk_pvt_info->ms.user_mapped_virt_addr = netuio_contextdata->dpdk_seg.mem.user_mapped_virt_addr; + dpdk_pvt_info->ms.size = netuio_contextdata->dpdk_seg.mem.size; +end: + return status; +} + +/* +Routine Description: + The I/O dispatch callbacks for the frameworks device object are configured here. + A single default I/O Queue is configured for parallel request processing, and a + driver context memory allocation is created to hold our structure QUEUE_CONTEXT. + +Return Value: + None + */ +NTSTATUS +netuio_queue_initialize(_In_ WDFDEVICE Device) +{ + WDFQUEUE queue; + NTSTATUS status; + WDF_IO_QUEUE_CONFIG queueConfig; + + PAGED_CODE(); + + // Configure a default queue so that requests that are not + // configure-fowarded using WdfDeviceConfigureRequestDispatching to goto + // other queues get dispatched here. + WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(&queueConfig, WdfIoQueueDispatchParallel); + + queueConfig.EvtIoDeviceControl = netuio_evt_IO_device_control; + queueConfig.EvtIoStop = netuio_evt_IO_stop; + + status = WdfIoQueueCreate(Device, + &queueConfig, + WDF_NO_OBJECT_ATTRIBUTES, + &queue); + + if( !NT_SUCCESS(status) ) { + return status; + } + + return status; +} + +/* +Routine Description: + This event is invoked when the framework receives IRP_MJ_DEVICE_CONTROL request. + +Return Value: + None + */ +VOID +netuio_evt_IO_device_control(_In_ WDFQUEUE Queue, _In_ WDFREQUEST Request, + _In_ size_t OutputBufferLength, _In_ size_t InputBufferLength, + _In_ ULONG IoControlCode) +{ + UNREFERENCED_PARAMETER(OutputBufferLength); + UNREFERENCED_PARAMETER(InputBufferLength); + + NTSTATUS status = STATUS_SUCCESS; + PVOID input_buf = NULL, output_buf = NULL; + size_t input_buf_size, output_buf_size; + size_t bytes_returned = 0; + + WDFDEVICE device = WdfIoQueueGetDevice(Queue); + + PNETUIO_CONTEXT_DATA netuio_contextdata; + netuio_contextdata = netuio_get_context_data(device); + + switch (IoControlCode) { + case IOCTL_NETUIO_GET_HW_DATA: + // First retrieve the input buffer and see if it matches our device + status = WdfRequestRetrieveInputBuffer(Request, sizeof(struct dpdk_private_info), &input_buf, &input_buf_size); + if (!NT_SUCCESS(status)) { + status = STATUS_INVALID_BUFFER_SIZE; + break; + } + + struct dpdk_private_info *dpdk_pvt_info = (struct dpdk_private_info *)input_buf; + // Ensure that the B:D:F match - otherwise, fail the IOCTL + if ((netuio_contextdata->addr.bus_num != dpdk_pvt_info->dev_addr.bus_num) || + (netuio_contextdata->addr.dev_num != dpdk_pvt_info->dev_addr.dev_num) || + (netuio_contextdata->addr.func_num != dpdk_pvt_info->dev_addr.func_num)) { + status = STATUS_NOT_SAME_DEVICE; + break; + } + + // Map the previously allocated/defined memory regions to the user's process context + MmBuildMdlForNonPagedPool(netuio_contextdata->dpdk_hw.mdl); + netuio_contextdata->dpdk_hw.mem.user_mapped_virt_addr = + MmMapLockedPagesSpecifyCache(netuio_contextdata->dpdk_hw.mdl, UserMode, MmCached, + NULL, FALSE, (NormalPagePriority | MdlMappingNoExecute)); + + MmBuildMdlForNonPagedPool(netuio_contextdata->dpdk_seg.mdl); + netuio_contextdata->dpdk_seg.mem.user_mapped_virt_addr = + MmMapLockedPagesSpecifyCache(netuio_contextdata->dpdk_seg.mdl, UserMode, MmCached, + NULL, FALSE, (NormalPagePriority | MdlMappingNoExecute)); + + if (!netuio_contextdata->dpdk_hw.mem.user_mapped_virt_addr && !netuio_contextdata->dpdk_seg.mem.user_mapped_virt_addr) { + status = STATUS_INSUFFICIENT_RESOURCES; + break; + } + + // Zero out the physically contiguous block + RtlZeroMemory(netuio_contextdata->dpdk_seg.mem.virt_addr, netuio_contextdata->dpdk_seg.mem.size); + + // Return relevant data to the caller + status = WdfRequestRetrieveOutputBuffer(Request, sizeof(struct dpdk_private_info), &output_buf, &output_buf_size); + if (!NT_SUCCESS(status)) { + status = STATUS_INVALID_BUFFER_SIZE; + break; + } + ASSERT(output_buf_size == OutputBufferLength); + status = netuio_handle_get_hw_data_request(Request, netuio_contextdata, output_buf, output_buf_size); + if (NT_SUCCESS(status)) + bytes_returned = output_buf_size; + + break; + + case IOCTL_NETUIO_PCI_CONFIG_IO: + // First retrieve the input buffer and see if it matches our device + status = WdfRequestRetrieveInputBuffer(Request, sizeof(struct dpdk_pci_config_io), &input_buf, &input_buf_size); + if (!NT_SUCCESS(status)) { + status = STATUS_INVALID_BUFFER_SIZE; + break; + } + + struct dpdk_pci_config_io *dpdk_pci_io_input = (struct dpdk_pci_config_io *)input_buf; + // Ensure that the B:D:F match - otherwise, fail the IOCTL + if ((netuio_contextdata->addr.bus_num != dpdk_pci_io_input->dev_addr.bus_num) || + (netuio_contextdata->addr.dev_num != dpdk_pci_io_input->dev_addr.dev_num) || + (netuio_contextdata->addr.func_num != dpdk_pci_io_input->dev_addr.func_num)) { + status = STATUS_NOT_SAME_DEVICE; + break; + } + // Retrieve output buffer + status = WdfRequestRetrieveOutputBuffer(Request, sizeof(UINT32), &output_buf, &output_buf_size); + if (!NT_SUCCESS(status)) { + status = STATUS_INVALID_BUFFER_SIZE; + break; + } + ASSERT(output_buf_size == OutputBufferLength); + + if (dpdk_pci_io_input->op == PCI_IO_READ) { + netuio_read_PCI_config(netuio_contextdata, dpdk_pci_io_input->offset, output_buf); + bytes_returned = output_buf_size; + } + else { + netuio_write_PCI_config(netuio_contextdata, dpdk_pci_io_input->offset, dpdk_pci_io_input->buf); + bytes_returned = 0; + } + + break; + + default: + break; + } + + WdfRequestCompleteWithInformation(Request, status, bytes_returned); + + return; +} + +/* +Routine Description: + This event is invoked for a power-managed queue before the device leaves the working state (D0). + +Return Value: + None + */ +VOID +netuio_evt_IO_stop(_In_ WDFQUEUE Queue, _In_ WDFREQUEST Request,_In_ ULONG ActionFlags) +{ + // + // In most cases, the EvtIoStop callback function completes, cancels, or postpones + // further processing of the I/O request. + // + // Typically, the driver uses the following rules: + // + // - If the driver owns the I/O request, it calls WdfRequestUnmarkCancelable + // (if the request is cancelable) and either calls WdfRequestStopAcknowledge + // with a Requeue value of TRUE, or it calls WdfRequestComplete with a + // completion status value of STATUS_SUCCESS or STATUS_CANCELLED. + // + // Before it can call these methods safely, the driver must make sure that + // its implementation of EvtIoStop has exclusive access to the request. + // + // In order to do that, the driver must synchronize access to the request + // to prevent other threads from manipulating the request concurrently. + // The synchronization method you choose will depend on your driver's design. + // + // For example, if the request is held in a shared context, the EvtIoStop callback + // might acquire an internal driver lock, take the request from the shared context, + // and then release the lock. At this point, the EvtIoStop callback owns the request + // and can safely complete or requeue the request. + // + // - If the driver has forwarded the I/O request to an I/O target, it either calls + // WdfRequestCancelSentRequest to attempt to cancel the request, or it postpones + // further processing of the request and calls WdfRequestStopAcknowledge with + // a Requeue value of FALSE. + // + // A driver might choose to take no action in EvtIoStop for requests that are + // guaranteed to complete in a small amount of time. + // + // In this case, the framework waits until the specified request is complete + // before moving the device (or system) to a lower power state or removing the device. + // Potentially, this inaction can prevent a system from entering its hibernation state + // or another low system power state. In extreme cases, it can cause the system + // to crash with bugcheck code 9F. + // + UNREFERENCED_PARAMETER(Queue); + UNREFERENCED_PARAMETER(Request); + UNREFERENCED_PARAMETER(ActionFlags); + + return; +} + diff --git a/kernel/windows/netuio/netuio_queue.h b/kernel/windows/netuio/netuio_queue.h new file mode 100644 index 000000000..6a0306516 --- /dev/null +++ b/kernel/windows/netuio/netuio_queue.h @@ -0,0 +1,30 @@ +/*- +* +* Copyright(c) 2017 Intel Corporation. All rights reserved. +* +*/ + + +#ifndef NETUIO_QUEUE_H +#define NETUIO_QUEUE_H + +EXTERN_C_START + +// This is the context that can be placed per queue and would contain per queue information. +typedef struct _QUEUE_CONTEXT { + ULONG PrivateDeviceData; // just a placeholder +} QUEUE_CONTEXT, *PQUEUE_CONTEXT; + +WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(QUEUE_CONTEXT, QueueGetContext) + + +NTSTATUS +netuio_queue_initialize(_In_ WDFDEVICE hDevice); + +// Events from the IoQueue object +EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL netuio_evt_IO_device_control; +EVT_WDF_IO_QUEUE_IO_STOP netuio_evt_IO_stop; + +EXTERN_C_END + +#endif // NETUIO_QUEUE_H diff --git a/kernel/windows/netuio/resource.h b/kernel/windows/netuio/resource.h new file mode 100644 index 000000000..9789ffdf3 --- /dev/null +++ b/kernel/windows/netuio/resource.h @@ -0,0 +1,14 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by netuio.rc + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 101 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif -- 2.23.0.vfs.1.1.63.g5a5ad7f
From: Harini Ramakrishnan <haramakr@microsoft.com> --- kernel/windows/netuio/netuio_dev.c | 54 +++++++++++++++++------------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/kernel/windows/netuio/netuio_dev.c b/kernel/windows/netuio/netuio_dev.c index 10ff5f903..4d8b9430d 100644 --- a/kernel/windows/netuio/netuio_dev.c +++ b/kernel/windows/netuio/netuio_dev.c @@ -32,37 +32,43 @@ netuio_create_device(_Inout_ PWDFDEVICE_INIT DeviceInit) NTSTATUS status; PAGED_CODE(); - WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&deviceAttributes, NETUIO_CONTEXT_DATA); - // Set the device context cleanup callback. - // This function will be called when the WDF Device Object associated to the current device is destroyed - deviceAttributes.EvtCleanupCallback = netuio_evt_device_context_cleanup; + // Ensure that only administrators can access our device object. + status = WdfDeviceInitAssignSDDLString(DeviceInit, &SDDL_DEVOBJ_SYS_ALL_ADM_ALL); - status = WdfDeviceCreate(&DeviceInit, &deviceAttributes, &device); + if (NT_SUCCESS(status)) { + WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&deviceAttributes, NETUIO_CONTEXT_DATA); - if (NT_SUCCESS(status)) { - // Create a device interface so that applications can find and talk to us. - status = WdfDeviceCreateDeviceInterface(device, &GUID_DEVINTERFACE_netUIO, NULL); + // Set the device context cleanup callback. + // This function will be called when the WDF Device Object associated to the current device is destroyed + deviceAttributes.EvtCleanupCallback = netuio_evt_device_context_cleanup; - if (NT_SUCCESS(status)) { - // Retrieve and store PCI information - status = get_pci_device_info(device); - } + status = WdfDeviceCreate(&DeviceInit, &deviceAttributes, &device); + } - if (NT_SUCCESS(status)) { - // Create a symbolic link name for user-space access - status = create_device_specific_symbolic_link(device); - } + if (NT_SUCCESS(status)) { + // Create a device interface so that applications can find and talk to us. + status = WdfDeviceCreateDeviceInterface(device, &GUID_DEVINTERFACE_netUIO, NULL); + } - if (NT_SUCCESS(status)) { - // Initialize the I/O Package and any Queues - status = netuio_queue_initialize(device); - } + if (NT_SUCCESS(status)) { + // Retrieve and store PCI information + status = get_pci_device_info(device); + } - if (NT_SUCCESS(status)) { - // Allocate physically contiguous memory for user process use. We'll map it later - status = allocate_usermemory_segment(device); - } + if (NT_SUCCESS(status)) { + // Create a symbolic link name for user-space access + status = create_device_specific_symbolic_link(device); + } + + if (NT_SUCCESS(status)) { + // Initialize the I/O Package and any Queues + status = netuio_queue_initialize(device); + } + + if (NT_SUCCESS(status)) { + // Allocate physically contiguous memory for user process use. We'll map it later + status = allocate_usermemory_segment(device); } return status; -- 2.23.0.vfs.1.1.63.g5a5ad7f
From: Harini Ramakrishnan <haramakr@microsoft.com> --- kernel/windows/netuio/netuio_dev.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/kernel/windows/netuio/netuio_dev.c b/kernel/windows/netuio/netuio_dev.c index 4d8b9430d..f5d41cb65 100644 --- a/kernel/windows/netuio/netuio_dev.c +++ b/kernel/windows/netuio/netuio_dev.c @@ -28,23 +28,23 @@ NTSTATUS netuio_create_device(_Inout_ PWDFDEVICE_INIT DeviceInit) { WDF_OBJECT_ATTRIBUTES deviceAttributes; - WDFDEVICE device; + WDFDEVICE device = NULL; NTSTATUS status; PAGED_CODE(); - // Ensure that only administrators can access our device object. - status = WdfDeviceInitAssignSDDLString(DeviceInit, &SDDL_DEVOBJ_SYS_ALL_ADM_ALL); + // Ensure that only administrators can access our device object. + status = WdfDeviceInitAssignSDDLString(DeviceInit, &SDDL_DEVOBJ_SYS_ALL_ADM_ALL); - if (NT_SUCCESS(status)) { - WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&deviceAttributes, NETUIO_CONTEXT_DATA); + if (NT_SUCCESS(status)) { + WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&deviceAttributes, NETUIO_CONTEXT_DATA); - // Set the device context cleanup callback. - // This function will be called when the WDF Device Object associated to the current device is destroyed - deviceAttributes.EvtCleanupCallback = netuio_evt_device_context_cleanup; + // Set the device context cleanup callback. + // This function will be called when the WDF Device Object associated to the current device is destroyed + deviceAttributes.EvtCleanupCallback = netuio_evt_device_context_cleanup; - status = WdfDeviceCreate(&DeviceInit, &deviceAttributes, &device); - } + status = WdfDeviceCreate(&DeviceInit, &deviceAttributes, &device); + } if (NT_SUCCESS(status)) { // Create a device interface so that applications can find and talk to us. @@ -263,7 +263,7 @@ allocate_usermemory_segment(_In_ WDFOBJECT device) PHYSICAL_ADDRESS highest_acceptable_address; PHYSICAL_ADDRESS boundary_address_multiple; - lowest_acceptable_address.QuadPart = 0x0000000000800000; + lowest_acceptable_address.QuadPart = 0x0000000000000000; highest_acceptable_address.QuadPart = 0xFFFFFFFFFFFFFFFF; boundary_address_multiple.QuadPart = 0; -- 2.23.0.vfs.1.1.63.g5a5ad7f
From: Harini Ramakrishnan <haramakr@microsoft.com> --- kernel/windows/netuio/netuio_interface.h | 9 ++++- kernel/windows/netuio/netuio_queue.c | 43 ++++++++++++++++++------ 2 files changed, 40 insertions(+), 12 deletions(-) diff --git a/kernel/windows/netuio/netuio_interface.h b/kernel/windows/netuio/netuio_interface.h index b86bf5d3f..f84ee895c 100644 --- a/kernel/windows/netuio/netuio_interface.h +++ b/kernel/windows/netuio/netuio_interface.h @@ -59,9 +59,16 @@ struct dpdk_private_info struct dpdk_pci_config_io { struct dev_addr dev_addr; - PVOID buf; UINT32 offset; enum pci_io op; + UINT32 access_size; // 1, 2, 4, or 8 bytes + + union dpdk_pci_config_io_data { + UINT8 u8; + UINT16 u16; + UINT32 u32; + UINT64 u64; + } data; }; #pragma pack(pop) diff --git a/kernel/windows/netuio/netuio_queue.c b/kernel/windows/netuio/netuio_queue.c index 312d4b682..929192880 100644 --- a/kernel/windows/netuio/netuio_queue.c +++ b/kernel/windows/netuio/netuio_queue.c @@ -11,22 +11,23 @@ #pragma alloc_text (PAGE, netuio_queue_initialize) #endif -VOID netuio_read_PCI_config(PNETUIO_CONTEXT_DATA netuio_contextdata, ULONG offset, PVOID buffer) +VOID netuio_read_PCI_config(PNETUIO_CONTEXT_DATA netuio_contextdata, ULONG offset, UINT32 access_size, _Out_ UINT64 *output) { + *output = 0; netuio_contextdata->bus_interface.GetBusData(netuio_contextdata->bus_interface.Context, PCI_WHICHSPACE_CONFIG, - buffer, + output, offset, - sizeof(UINT32)); + access_size); } -VOID netuio_write_PCI_config(PNETUIO_CONTEXT_DATA netuio_contextdata, ULONG offset, PVOID buffer) +VOID netuio_write_PCI_config(PNETUIO_CONTEXT_DATA netuio_contextdata, ULONG offset, UINT32 access_size, union dpdk_pci_config_io_data const *input) { netuio_contextdata->bus_interface.SetBusData(netuio_contextdata->bus_interface.Context, PCI_WHICHSPACE_CONFIG, - buffer, + (PVOID)input, offset, - sizeof(UINT32)); + access_size); } static NTSTATUS @@ -180,6 +181,15 @@ netuio_evt_IO_device_control(_In_ WDFQUEUE Queue, _In_ WDFREQUEST Request, } struct dpdk_pci_config_io *dpdk_pci_io_input = (struct dpdk_pci_config_io *)input_buf; + + if (dpdk_pci_io_input->access_size != 1 && + dpdk_pci_io_input->access_size != 2 && + dpdk_pci_io_input->access_size != 4 && + dpdk_pci_io_input->access_size != 8) { + status = STATUS_INVALID_PARAMETER; + break; + } + // Ensure that the B:D:F match - otherwise, fail the IOCTL if ((netuio_contextdata->addr.bus_num != dpdk_pci_io_input->dev_addr.bus_num) || (netuio_contextdata->addr.dev_num != dpdk_pci_io_input->dev_addr.dev_num) || @@ -188,7 +198,7 @@ netuio_evt_IO_device_control(_In_ WDFQUEUE Queue, _In_ WDFREQUEST Request, break; } // Retrieve output buffer - status = WdfRequestRetrieveOutputBuffer(Request, sizeof(UINT32), &output_buf, &output_buf_size); + status = WdfRequestRetrieveOutputBuffer(Request, sizeof(UINT64), &output_buf, &output_buf_size); if (!NT_SUCCESS(status)) { status = STATUS_INVALID_BUFFER_SIZE; break; @@ -196,13 +206,24 @@ netuio_evt_IO_device_control(_In_ WDFQUEUE Queue, _In_ WDFREQUEST Request, ASSERT(output_buf_size == OutputBufferLength); if (dpdk_pci_io_input->op == PCI_IO_READ) { - netuio_read_PCI_config(netuio_contextdata, dpdk_pci_io_input->offset, output_buf); - bytes_returned = output_buf_size; + netuio_read_PCI_config(netuio_contextdata, + dpdk_pci_io_input->offset, + dpdk_pci_io_input->access_size, + (UINT64*)output_buf); + + bytes_returned = sizeof(UINT64); } - else { - netuio_write_PCI_config(netuio_contextdata, dpdk_pci_io_input->offset, dpdk_pci_io_input->buf); + else if (dpdk_pci_io_input->op == PCI_IO_WRITE) { + netuio_write_PCI_config(netuio_contextdata, + dpdk_pci_io_input->offset, + dpdk_pci_io_input->access_size, + &dpdk_pci_io_input->data); bytes_returned = 0; } + else { + status = STATUS_INVALID_PARAMETER; + break; + } break; -- 2.23.0.vfs.1.1.63.g5a5ad7f
From: Harini Ramakrishnan <haramakr@microsoft.com> --- kernel/windows/netuio/netuio.inf | 7 +++++++ kernel/windows/netuio/netuio_dev.c | 15 +++++---------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/kernel/windows/netuio/netuio.inf b/kernel/windows/netuio/netuio.inf index 0453b371a..b1696cc50 100644 --- a/kernel/windows/netuio/netuio.inf +++ b/kernel/windows/netuio/netuio.inf @@ -62,6 +62,13 @@ CopyFiles=Drivers_Dir [Drivers_Dir] netuio.sys +[netuio_Device.NT.HW] +AddReg=Device.HW.Registry + +[Device.HW.Registry] +; Ensure that only administrators can access our device object. +HKR,,Security,,"D:P(A;;GA;;;SY)(A;;GA;;;BA)" + ;-------------- Service installation [netuio_Device.NT.Services] AddService = netuio,%SPSVCINST_ASSOCSERVICE%, netuio_Service_Inst diff --git a/kernel/windows/netuio/netuio_dev.c b/kernel/windows/netuio/netuio_dev.c index f5d41cb65..a1fe447f7 100644 --- a/kernel/windows/netuio/netuio_dev.c +++ b/kernel/windows/netuio/netuio_dev.c @@ -33,18 +33,13 @@ netuio_create_device(_Inout_ PWDFDEVICE_INIT DeviceInit) PAGED_CODE(); - // Ensure that only administrators can access our device object. - status = WdfDeviceInitAssignSDDLString(DeviceInit, &SDDL_DEVOBJ_SYS_ALL_ADM_ALL); + WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&deviceAttributes, NETUIO_CONTEXT_DATA); - if (NT_SUCCESS(status)) { - WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&deviceAttributes, NETUIO_CONTEXT_DATA); - - // Set the device context cleanup callback. - // This function will be called when the WDF Device Object associated to the current device is destroyed - deviceAttributes.EvtCleanupCallback = netuio_evt_device_context_cleanup; + // Set the device context cleanup callback. + // This function will be called when the WDF Device Object associated to the current device is destroyed + deviceAttributes.EvtCleanupCallback = netuio_evt_device_context_cleanup; - status = WdfDeviceCreate(&DeviceInit, &deviceAttributes, &device); - } + status = WdfDeviceCreate(&DeviceInit, &deviceAttributes, &device); if (NT_SUCCESS(status)) { // Create a device interface so that applications can find and talk to us. -- 2.23.0.vfs.1.1.63.g5a5ad7f
From: Anand Rawat <anand.rawat@intel.com> Updated the code for using LLVM toolset. The code still uses msbuild and VS2017. Some header files and windows specific utility functions are removed due to conflicts with Clang intrinsic functions. Project files have been updated to use LLVM and additional project settings for Clang. Change-Id: I274de21379287c664e072f58e94271c654afe603 Signed-off-by: Anand Rawat <anand.rawat@intel.com> --- kernel/windows/netuio/netuio_queue.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kernel/windows/netuio/netuio_queue.c b/kernel/windows/netuio/netuio_queue.c index 929192880..760b4a7e5 100644 --- a/kernel/windows/netuio/netuio_queue.c +++ b/kernel/windows/netuio/netuio_queue.c @@ -156,8 +156,8 @@ netuio_evt_IO_device_control(_In_ WDFQUEUE Queue, _In_ WDFREQUEST Request, break; } - // Zero out the physically contiguous block - RtlZeroMemory(netuio_contextdata->dpdk_seg.mem.virt_addr, netuio_contextdata->dpdk_seg.mem.size); + // Zero out the physically contiguous block + RtlZeroMemory(netuio_contextdata->dpdk_seg.mem.virt_addr, netuio_contextdata->dpdk_seg.mem.size); // Return relevant data to the caller status = WdfRequestRetrieveOutputBuffer(Request, sizeof(struct dpdk_private_info), &output_buf, &output_buf_size); -- 2.23.0.vfs.1.1.63.g5a5ad7f
From: Harini Ramakrishnan <haramakr@microsoft.com> --- kernel/windows/netuio/netuio.inf | 12 +- kernel/windows/netuio/netuio_dev.c | 181 +++++++++++++++++------ kernel/windows/netuio/netuio_dev.h | 15 +- kernel/windows/netuio/netuio_drv.c | 43 +++--- kernel/windows/netuio/netuio_drv.h | 1 + kernel/windows/netuio/netuio_interface.h | 10 +- kernel/windows/netuio/netuio_queue.c | 176 ++++++++++++++-------- kernel/windows/netuio/netuio_queue.h | 2 + 8 files changed, 297 insertions(+), 143 deletions(-) diff --git a/kernel/windows/netuio/netuio.inf b/kernel/windows/netuio/netuio.inf index b1696cc50..4c4d5e047 100644 --- a/kernel/windows/netuio/netuio.inf +++ b/kernel/windows/netuio/netuio.inf @@ -38,7 +38,7 @@ Signature="$WINDOWS NT$" Class=Net ClassGuid={4d36e972-e325-11ce-bfc1-08002be10318} -Provider=%ManufacturerName% +Provider=%Intel% CatalogFile=netuio.cat DriverVer= @@ -47,7 +47,8 @@ DriverVer= ;***************************************** [Manufacturer] -%ManufacturerName%=Standard,NT$ARCH$ +%Intel%=Standard,NT$ARCH$ +%Broadcom%=Broadcom,NT$ARCH$ [Standard.NT$ARCH$] %F1583.netuio.Description%=netuio_Device, PCI\VEN_8086&DEV_1583 @@ -56,6 +57,9 @@ DriverVer= %F37D0.netuio.Description%=netuio_Device, PCI\VEN_8086&DEV_37D0 %F153B.netuio.Description%=netuio_Device, PCI\VEN_8086&DEV_153B +[Broadcom.NT$ARCH$] +%F16D7.netuio.Description%=netuio_Device, PCI\VEN_14E4&DEV_16D7 + [netuio_Device.NT] CopyFiles=Drivers_Dir @@ -113,7 +117,8 @@ KmdfLibraryVersion = $KMDFVERSION$ [Strings] SPSVCINST_ASSOCSERVICE= 0x00000002 -ManufacturerName="Intel" +Intel = "Intel" +Broadcom = "Broadcom Corporation" ClassName = "Intel(R) DPDK netUIO Driver" DiskName = "DPDK netUIO Installation Disk" F1583.netuio.Description = "DPDK netUIO for Intel(R) Ethernet Converged Network Adapter XL710-Q2" @@ -121,5 +126,6 @@ F158A.netuio.Description = "DPDK netUIO for Intel(R) Ethernet Network Adapter XX F158B.netuio.Description = "DPDK netUIO for Intel(R) Ethernet Network Adapter XXV710-DA1" F37D0.netuio.Description = "DPDK netUIO for Intel(R) Ethernet Connection X722" F153B.netuio.Description = "DPDK netUIO for Intel(R) Ethernet Connection I217-V" +F16D7.netuio.Description = "DPDK netUIO for Broadcom P225p NetXtreme-E Dual-port 10Gb/25Gb Ethernet PCIe Adapter" netuio.DeviceDesc = "netuio Device" netuio.SVCDESC = "netuio Service" diff --git a/kernel/windows/netuio/netuio_dev.c b/kernel/windows/netuio/netuio_dev.c index a1fe447f7..3b5c95e84 100644 --- a/kernel/windows/netuio/netuio_dev.c +++ b/kernel/windows/netuio/netuio_dev.c @@ -27,16 +27,28 @@ Return Value: NTSTATUS netuio_create_device(_Inout_ PWDFDEVICE_INIT DeviceInit) { - WDF_OBJECT_ATTRIBUTES deviceAttributes; - WDFDEVICE device = NULL; NTSTATUS status; + WDFDEVICE device = NULL; + + WDF_OBJECT_ATTRIBUTES deviceAttributes; + WDF_PNPPOWER_EVENT_CALLBACKS pnpPowerCallbacks; + WDF_FILEOBJECT_CONFIG fileConfig; PAGED_CODE(); - WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&deviceAttributes, NETUIO_CONTEXT_DATA); + // Register PnP power management callbacks + WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpPowerCallbacks); + pnpPowerCallbacks.EvtDevicePrepareHardware = netuio_evt_prepare_hw; + pnpPowerCallbacks.EvtDeviceReleaseHardware = netuio_evt_release_hw; + WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit, &pnpPowerCallbacks); + + // Register callbacks for when a HANDLE is opened or closed. + WDF_FILEOBJECT_CONFIG_INIT(&fileConfig, WDF_NO_EVENT_CALLBACK, WDF_NO_EVENT_CALLBACK, netuio_evt_file_cleanup); + WdfDeviceInitSetFileObjectConfig(DeviceInit, &fileConfig, WDF_NO_OBJECT_ATTRIBUTES); // Set the device context cleanup callback. // This function will be called when the WDF Device Object associated to the current device is destroyed + WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&deviceAttributes, NETUIO_CONTEXT_DATA); deviceAttributes.EvtCleanupCallback = netuio_evt_device_context_cleanup; status = WdfDeviceCreate(&DeviceInit, &deviceAttributes, &device); @@ -88,63 +100,112 @@ netuio_map_hw_resources(_In_ WDFDEVICE Device, _In_ WDFCMRESLIST Resources, _In_ { UNREFERENCED_PARAMETER(Resources); - NTSTATUS status = STATUS_SUCCESS; + NTSTATUS status; PNETUIO_CONTEXT_DATA netuio_contextdata; netuio_contextdata = netuio_get_context_data(Device); - if (!netuio_contextdata) + if (!netuio_contextdata) { return STATUS_UNSUCCESSFUL; + } - PCM_PARTIAL_RESOURCE_DESCRIPTOR descriptor; - UINT8 bar_index = 0; + PCI_COMMON_HEADER pci_config = {0}; + ULONG bytes_returned; - // Collect device BAR resources from the ResourcesTranslated object - for (ULONG idx = 0; idx < WdfCmResourceListGetCount(ResourcesTranslated); idx++) { - descriptor = WdfCmResourceListGetDescriptor(ResourcesTranslated, idx); - if (!descriptor) { - status = STATUS_DEVICE_CONFIGURATION_ERROR; - goto end; + // Read PCI configuration space + bytes_returned = netuio_contextdata->bus_interface.GetBusData( + netuio_contextdata->bus_interface.Context, + PCI_WHICHSPACE_CONFIG, + &pci_config, + 0, + sizeof(pci_config)); + + if (bytes_returned != sizeof(pci_config)) { + status = STATUS_NOT_SUPPORTED; + goto end; + } + + // Device type is implictly enforced by .inf + ASSERT(PCI_CONFIGURATION_TYPE(&pci_config) == PCI_DEVICE_TYPE); + + PCM_PARTIAL_RESOURCE_DESCRIPTOR descriptor; + ULONG next_descriptor = 0; + ULONGLONG bar_addr = 0; + ULONG curr_bar = 0; + ULONG prev_bar = 0; + + for (INT bar_index = 0; bar_index < PCI_MAX_BAR; bar_index++) { + prev_bar = curr_bar; + curr_bar = pci_config.u.type0.BaseAddresses[bar_index]; + if (curr_bar == 0 || (prev_bar & PCI_TYPE_64BIT)) { + // Skip this bar + netuio_contextdata->bar[bar_index].base_addr.QuadPart = 0; + netuio_contextdata->bar[bar_index].size = 0; + netuio_contextdata->bar[bar_index].virt_addr = 0; + + netuio_contextdata->dpdk_hw[bar_index].mdl = NULL; + netuio_contextdata->dpdk_hw[bar_index].mem.size = 0; + + continue; } - switch (descriptor->Type) { - case CmResourceTypeMemory: - // Retrieve and map the BARs - netuio_contextdata->bar[bar_index].base_addr.QuadPart = descriptor->u.Memory.Start.QuadPart; - netuio_contextdata->bar[bar_index].size = descriptor->u.Memory.Length; - netuio_contextdata->bar[bar_index].virt_addr = - MmMapIoSpace(descriptor->u.Memory.Start, descriptor->u.Memory.Length, MmNonCached); + // Find next CmResourceTypeMemory + do { + descriptor = WdfCmResourceListGetDescriptor(ResourcesTranslated, next_descriptor); + next_descriptor++; - if (netuio_contextdata->bar[bar_index].virt_addr == NULL) { - status = STATUS_UNSUCCESSFUL; + if (descriptor == NULL) { + status = STATUS_DEVICE_CONFIGURATION_ERROR; goto end; } + } while (descriptor->Type != CmResourceTypeMemory); - bar_index++; - break; + // Assert that we have the correct descriptor + ASSERT((descriptor->Flags & CM_RESOURCE_MEMORY_BAR) != 0); - // Don't handle any other resource type - // This could be device-private type added by the PCI bus driver. - case CmResourceTypeInterrupt: - default: - break; + if (curr_bar & PCI_TYPE_64BIT) { + ASSERT(bar_index != PCI_TYPE0_ADDRESSES - 1); + bar_addr = ((ULONGLONG)pci_config.u.type0.BaseAddresses[bar_index + 1] << 32) | (curr_bar & PCI_ADDRESS_MEMORY_ADDRESS_MASK); + } + else + { + bar_addr = curr_bar & PCI_ADDRESS_MEMORY_ADDRESS_MASK; } - } - // Allocate an MDL for the device BAR, so that we can map it to the user's process context later... - if (status == STATUS_SUCCESS) { - // Bar 0 is typically the HW BAR - if (netuio_contextdata->bar[0].virt_addr) { - netuio_contextdata->dpdk_hw.mdl = IoAllocateMdl(netuio_contextdata->bar[0].virt_addr, (ULONG)netuio_contextdata->bar[0].size, FALSE, FALSE, NULL); - if (!netuio_contextdata->dpdk_hw.mdl) { - status = STATUS_INSUFFICIENT_RESOURCES; - goto end; - } - netuio_contextdata->dpdk_hw.mem.size = netuio_contextdata->bar[0].size; + ASSERT((ULONGLONG)descriptor->u.Memory.Start.QuadPart == bar_addr); + + // Retrieve and map the BARs + netuio_contextdata->bar[bar_index].base_addr.QuadPart = descriptor->u.Memory.Start.QuadPart; + netuio_contextdata->bar[bar_index].size = descriptor->u.Memory.Length; + netuio_contextdata->bar[bar_index].virt_addr = MmMapIoSpace(descriptor->u.Memory.Start, + descriptor->u.Memory.Length, + MmNonCached); + if (netuio_contextdata->bar[bar_index].virt_addr == NULL) { + status = STATUS_INSUFFICIENT_RESOURCES; + goto end; } - } + + // Allocate an MDL for the device BAR, so we can map it to the user's process context later. + netuio_contextdata->dpdk_hw[bar_index].mdl = IoAllocateMdl(netuio_contextdata->bar[bar_index].virt_addr, + (ULONG)netuio_contextdata->bar[bar_index].size, + FALSE, + FALSE, + NULL); + if (!netuio_contextdata->dpdk_hw[bar_index].mdl) { + status = STATUS_INSUFFICIENT_RESOURCES; + goto end; + } + + netuio_contextdata->dpdk_hw[bar_index].mem.size = netuio_contextdata->bar[bar_index].size; + } // for bar_index + + status = STATUS_SUCCESS; end: + if (status != STATUS_SUCCESS) { + netuio_free_hw_resources(Device); + } + return status; } @@ -155,15 +216,21 @@ netuio_free_hw_resources(_In_ WDFDEVICE Device) netuio_contextdata = netuio_get_context_data(Device); if (netuio_contextdata) { - // Free the allocated MDL - if (netuio_contextdata->dpdk_hw.mdl) - IoFreeMdl(netuio_contextdata->dpdk_hw.mdl); - - // Unmap all the BAR regions previously mapped for (UINT8 bar_index = 0; bar_index < PCI_MAX_BAR; bar_index++) { - if (netuio_contextdata->bar[bar_index].virt_addr) + + // Free the allocated MDLs + if (netuio_contextdata->dpdk_hw[bar_index].mdl) { + IoFreeMdl(netuio_contextdata->dpdk_hw[bar_index].mdl); + } + + // Unmap all the BAR regions previously mapped + if (netuio_contextdata->bar[bar_index].virt_addr) { MmUnmapIoSpace(netuio_contextdata->bar[bar_index].virt_addr, netuio_contextdata->bar[bar_index].size); + } } + + RtlZeroMemory(netuio_contextdata->dpdk_hw, sizeof(netuio_contextdata->dpdk_hw)); + RtlZeroMemory(netuio_contextdata->bar, sizeof(netuio_contextdata->bar)); } } @@ -246,13 +313,16 @@ create_device_specific_symbolic_link(_In_ WDFOBJECT device) static NTSTATUS allocate_usermemory_segment(_In_ WDFOBJECT device) { - NTSTATUS status = STATUS_SUCCESS; + NTSTATUS status; PNETUIO_CONTEXT_DATA netuio_contextdata; netuio_contextdata = netuio_get_context_data(device); if (!netuio_contextdata) - return STATUS_UNSUCCESSFUL; + { + status = STATUS_INVALID_DEVICE_STATE; + goto end; + } PHYSICAL_ADDRESS lowest_acceptable_address; PHYSICAL_ADDRESS highest_acceptable_address; @@ -287,7 +357,14 @@ allocate_usermemory_segment(_In_ WDFOBJECT device) // Store the region's physical address netuio_contextdata->dpdk_seg.mem.phys_addr = MmGetPhysicalAddress(netuio_contextdata->dpdk_seg.mem.virt_addr); + status = STATUS_SUCCESS; + end: + if (status != STATUS_SUCCESS) + { + free_usermemory_segment(device); + } + return status; } @@ -299,9 +376,15 @@ free_usermemory_segment(_In_ WDFOBJECT device) if (netuio_contextdata) { if (netuio_contextdata->dpdk_seg.mdl) + { IoFreeMdl(netuio_contextdata->dpdk_seg.mdl); + netuio_contextdata->dpdk_seg.mdl = NULL; + } if (netuio_contextdata->dpdk_seg.mem.virt_addr) + { MmFreeContiguousMemory(netuio_contextdata->dpdk_seg.mem.virt_addr); + netuio_contextdata->dpdk_seg.mem.virt_addr = NULL; + } } } diff --git a/kernel/windows/netuio/netuio_dev.h b/kernel/windows/netuio/netuio_dev.h index a19a4fb42..59956720e 100644 --- a/kernel/windows/netuio/netuio_dev.h +++ b/kernel/windows/netuio/netuio_dev.h @@ -12,7 +12,6 @@ EXTERN_C_START #include "netuio_interface.h" // Constants -#define PCI_MAX_BAR 3 #define USER_MEMORY_SEGMENT_SIZE (256ULL * 1024ULL * 1024ULL) // 256MB struct pci_bar { @@ -29,13 +28,13 @@ struct mem_map_region { // The device context performs the same job as a WDM device extension in the driver frameworks typedef struct _NETUIO_CONTEXT_DATA { - WDFDEVICE wdf_device; // WDF device handle to the FDO - BUS_INTERFACE_STANDARD bus_interface; // Bus interface for config space access - struct pci_bar bar[PCI_MAX_BAR]; // device BARs - struct dev_addr addr; // B:D:F details of device - USHORT dev_numa_node; // The NUMA node of the device - struct mem_map_region dpdk_hw; // mapped region for the device's register space - struct mem_map_region dpdk_seg; // mapped region allocated for DPDK process use + WDFDEVICE wdf_device; // WDF device handle to the FDO + BUS_INTERFACE_STANDARD bus_interface; // Bus interface for config space access + struct pci_bar bar[PCI_MAX_BAR]; // device BARs + struct dev_addr addr; // B:D:F details of device + USHORT dev_numa_node; // The NUMA node of the device + struct mem_map_region dpdk_hw[PCI_MAX_BAR]; // mapped region for the device's register space + struct mem_map_region dpdk_seg; // mapped region allocated for DPDK process use } NETUIO_CONTEXT_DATA, *PNETUIO_CONTEXT_DATA; diff --git a/kernel/windows/netuio/netuio_drv.c b/kernel/windows/netuio/netuio_drv.c index d45a9ec4f..554629c98 100644 --- a/kernel/windows/netuio/netuio_drv.c +++ b/kernel/windows/netuio/netuio_drv.c @@ -62,25 +62,8 @@ Return Value: NTSTATUS netuio_evt_device_add(_In_ WDFDRIVER Driver, _Inout_ PWDFDEVICE_INIT DeviceInit) { - NTSTATUS status; - WDF_PNPPOWER_EVENT_CALLBACKS pnpPowerCallbacks; - UNREFERENCED_PARAMETER(Driver); - - PAGED_CODE(); - - // Zero out the PnpPowerCallbacks structure - WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpPowerCallbacks); - - // Register Plug-aNd-Play and power management callbacks - pnpPowerCallbacks.EvtDevicePrepareHardware = netuio_evt_prepare_hw; - pnpPowerCallbacks.EvtDeviceReleaseHardware = netuio_evt_release_hw; - - WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit, &pnpPowerCallbacks); - - status = netuio_create_device(DeviceInit); - - return status; + return netuio_create_device(DeviceInit); } /* @@ -140,3 +123,27 @@ netuio_evt_driver_context_cleanup(_In_ WDFOBJECT DriverObject) DbgPrintEx(DPFLTR_IHVNETWORK_ID, DPFLTR_NETUIO_INFO_LEVEL, "netUIO Driver unloaded.\n"); PAGED_CODE(); } + +/* +Routine Description : + EVT_WDF_FILE_CLEANUP callback, called when user process handle is closed. + + Undoes IOCTL_NETUIO_MAP_HW_INTO_USERMODE. + +Return value : + None +-*/ +VOID +netuio_evt_file_cleanup(_In_ WDFFILEOBJECT FileObject) +{ + WDFDEVICE device; + PNETUIO_CONTEXT_DATA netuio_contextdata; + + device = WdfFileObjectGetDevice(FileObject); + netuio_contextdata = netuio_get_context_data(device); + + if (netuio_contextdata) + { + netuio_unmap_address_from_user_process(netuio_contextdata); + } +} diff --git a/kernel/windows/netuio/netuio_drv.h b/kernel/windows/netuio/netuio_drv.h index 39d7f301e..5dc778625 100644 --- a/kernel/windows/netuio/netuio_drv.h +++ b/kernel/windows/netuio/netuio_drv.h @@ -27,6 +27,7 @@ EVT_WDF_DRIVER_DEVICE_ADD netuio_evt_device_add; EVT_WDF_OBJECT_CONTEXT_CLEANUP netuio_evt_driver_context_cleanup; EVT_WDF_DEVICE_PREPARE_HARDWARE netuio_evt_prepare_hw; EVT_WDF_DEVICE_RELEASE_HARDWARE netuio_evt_release_hw; +EVT_WDF_FILE_CLOSE netuio_evt_file_cleanup; EXTERN_C_END diff --git a/kernel/windows/netuio/netuio_interface.h b/kernel/windows/netuio/netuio_interface.h index f84ee895c..82fb1cb50 100644 --- a/kernel/windows/netuio/netuio_interface.h +++ b/kernel/windows/netuio/netuio_interface.h @@ -22,8 +22,8 @@ DEFINE_GUID (GUID_DEVINTERFACE_netUIO, 0x08336f60,0x0679,0x4c6c,0x85,0xd2,0xae,0 #define NETUIO_DRIVER_NAME _T("netuio") // IOCTL code definitions -#define IOCTL_NETUIO_GET_HW_DATA CTL_CODE(FILE_DEVICE_NETWORK, 51, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) -#define IOCTL_NETUIO_PCI_CONFIG_IO CTL_CODE(FILE_DEVICE_NETWORK, 52, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_NETUIO_MAP_HW_INTO_USERMODE CTL_CODE(FILE_DEVICE_NETWORK, 51, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_NETUIO_PCI_CONFIG_IO CTL_CODE(FILE_DEVICE_NETWORK, 52, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) struct mem_region { UINT64 size; // memory region size @@ -43,13 +43,13 @@ enum pci_io { PCI_IO_WRITE = 1 }; +#define PCI_MAX_BAR 6 + struct dpdk_private_info { - struct mem_region hw; + struct mem_region hw[PCI_MAX_BAR]; struct mem_region ms; struct dev_addr dev_addr; - struct mem_region bar1; -// struct mem_region bar2; UINT16 dev_id; UINT16 sub_dev_id; USHORT dev_numa_node; diff --git a/kernel/windows/netuio/netuio_queue.c b/kernel/windows/netuio/netuio_queue.c index 760b4a7e5..9c7ff7d06 100644 --- a/kernel/windows/netuio/netuio_queue.c +++ b/kernel/windows/netuio/netuio_queue.c @@ -11,54 +11,113 @@ #pragma alloc_text (PAGE, netuio_queue_initialize) #endif -VOID netuio_read_PCI_config(PNETUIO_CONTEXT_DATA netuio_contextdata, ULONG offset, UINT32 access_size, _Out_ UINT64 *output) -{ - *output = 0; - netuio_contextdata->bus_interface.GetBusData(netuio_contextdata->bus_interface.Context, - PCI_WHICHSPACE_CONFIG, - output, - offset, - access_size); -} - -VOID netuio_write_PCI_config(PNETUIO_CONTEXT_DATA netuio_contextdata, ULONG offset, UINT32 access_size, union dpdk_pci_config_io_data const *input) -{ - netuio_contextdata->bus_interface.SetBusData(netuio_contextdata->bus_interface.Context, - PCI_WHICHSPACE_CONFIG, - (PVOID)input, - offset, - access_size); -} - -static NTSTATUS +static void netuio_handle_get_hw_data_request(_In_ WDFREQUEST Request, _In_ PNETUIO_CONTEXT_DATA netuio_contextdata, _In_ PVOID outputBuf, _In_ size_t outputBufSize) { - NTSTATUS status = STATUS_SUCCESS; - WDF_REQUEST_PARAMETERS params; WDF_REQUEST_PARAMETERS_INIT(¶ms); WdfRequestGetParameters(Request, ¶ms); - if (!netuio_contextdata || (outputBufSize != sizeof(struct dpdk_private_info))) { - status = STATUS_INVALID_PARAMETER; - goto end; - } + ASSERT(outputBufSize == sizeof(struct dpdk_private_info)); struct dpdk_private_info *dpdk_pvt_info = (struct dpdk_private_info *)outputBuf; RtlZeroMemory(dpdk_pvt_info, outputBufSize); - dpdk_pvt_info->hw.phys_addr.QuadPart = netuio_contextdata->bar[0].base_addr.QuadPart; - dpdk_pvt_info->hw.user_mapped_virt_addr = netuio_contextdata->dpdk_hw.mem.user_mapped_virt_addr; - dpdk_pvt_info->hw.size = netuio_contextdata->bar[0].size; + for (ULONG idx = 0; idx < PCI_MAX_BAR; idx++) { + dpdk_pvt_info->hw[idx].phys_addr.QuadPart = netuio_contextdata->bar[idx].base_addr.QuadPart; + dpdk_pvt_info->hw[idx].user_mapped_virt_addr = netuio_contextdata->dpdk_hw[idx].mem.user_mapped_virt_addr; + dpdk_pvt_info->hw[idx].size = netuio_contextdata->bar[idx].size; + } dpdk_pvt_info->ms.phys_addr.QuadPart = netuio_contextdata->dpdk_seg.mem.phys_addr.QuadPart; dpdk_pvt_info->ms.user_mapped_virt_addr = netuio_contextdata->dpdk_seg.mem.user_mapped_virt_addr; dpdk_pvt_info->ms.size = netuio_contextdata->dpdk_seg.mem.size; +} + +/* +Routine Description: + Maps address ranges into the usermode process's address space. The following + ranges are mapped: + + * Any PCI BARs that our device was assigned + * The scratch buffer of contiguous pages + +Return Value: + NTSTATUS +*/ +static NTSTATUS +netuio_map_address_into_user_process(_In_ PNETUIO_CONTEXT_DATA netuio_contextdata) +{ + NTSTATUS status = STATUS_SUCCESS; + + // Map the scratch memory regions to the user's process context + MmBuildMdlForNonPagedPool(netuio_contextdata->dpdk_seg.mdl); + netuio_contextdata->dpdk_seg.mem.user_mapped_virt_addr = + MmMapLockedPagesSpecifyCache( + netuio_contextdata->dpdk_seg.mdl, UserMode, MmCached, + NULL, FALSE, (NormalPagePriority | MdlMappingNoExecute)); + + if (netuio_contextdata->dpdk_seg.mem.user_mapped_virt_addr == NULL) { + status = STATUS_INSUFFICIENT_RESOURCES; + goto end; + } + + // Map any device BAR(s) to the user's process context + for (INT idx = 0; idx < PCI_MAX_BAR; idx++) { + if (netuio_contextdata->dpdk_hw[idx].mdl == NULL) { + continue; + } + + MmBuildMdlForNonPagedPool(netuio_contextdata->dpdk_hw[idx].mdl); + netuio_contextdata->dpdk_hw[idx].mem.user_mapped_virt_addr = + MmMapLockedPagesSpecifyCache( + netuio_contextdata->dpdk_hw[idx].mdl, UserMode, MmCached, + NULL, FALSE, (NormalPagePriority | MdlMappingNoExecute)); + + if (netuio_contextdata->dpdk_hw[idx].mem.user_mapped_virt_addr == NULL) { + status = STATUS_INSUFFICIENT_RESOURCES; + goto end; + } + } + end: + if (status != STATUS_SUCCESS) { + netuio_unmap_address_from_user_process(netuio_contextdata); + } + return status; } +/* +Routine Description: + Unmaps all address ranges from the usermode process address space. + MUST be called in the context of the same process which created + the mapping. + +Return Value: + None + */ +VOID +netuio_unmap_address_from_user_process(_In_ PNETUIO_CONTEXT_DATA netuio_contextdata) +{ + if (netuio_contextdata->dpdk_seg.mem.user_mapped_virt_addr != NULL) { + MmUnmapLockedPages( + netuio_contextdata->dpdk_seg.mem.user_mapped_virt_addr, + netuio_contextdata->dpdk_seg.mdl); + netuio_contextdata->dpdk_seg.mem.user_mapped_virt_addr = NULL; + } + + for (INT idx = 0; idx < PCI_MAX_BAR; idx++) { + if (netuio_contextdata->dpdk_hw[idx].mem.user_mapped_virt_addr != NULL) { + MmUnmapLockedPages( + netuio_contextdata->dpdk_hw[idx].mem.user_mapped_virt_addr, + netuio_contextdata->dpdk_hw[idx].mdl); + netuio_contextdata->dpdk_hw[idx].mem.user_mapped_virt_addr = NULL; + } + } +} + /* Routine Description: The I/O dispatch callbacks for the frameworks device object are configured here. @@ -123,7 +182,7 @@ netuio_evt_IO_device_control(_In_ WDFQUEUE Queue, _In_ WDFREQUEST Request, netuio_contextdata = netuio_get_context_data(device); switch (IoControlCode) { - case IOCTL_NETUIO_GET_HW_DATA: + case IOCTL_NETUIO_MAP_HW_INTO_USERMODE: // First retrieve the input buffer and see if it matches our device status = WdfRequestRetrieveInputBuffer(Request, sizeof(struct dpdk_private_info), &input_buf, &input_buf_size); if (!NT_SUCCESS(status)) { @@ -140,35 +199,29 @@ netuio_evt_IO_device_control(_In_ WDFQUEUE Queue, _In_ WDFREQUEST Request, break; } - // Map the previously allocated/defined memory regions to the user's process context - MmBuildMdlForNonPagedPool(netuio_contextdata->dpdk_hw.mdl); - netuio_contextdata->dpdk_hw.mem.user_mapped_virt_addr = - MmMapLockedPagesSpecifyCache(netuio_contextdata->dpdk_hw.mdl, UserMode, MmCached, - NULL, FALSE, (NormalPagePriority | MdlMappingNoExecute)); - - MmBuildMdlForNonPagedPool(netuio_contextdata->dpdk_seg.mdl); - netuio_contextdata->dpdk_seg.mem.user_mapped_virt_addr = - MmMapLockedPagesSpecifyCache(netuio_contextdata->dpdk_seg.mdl, UserMode, MmCached, - NULL, FALSE, (NormalPagePriority | MdlMappingNoExecute)); - - if (!netuio_contextdata->dpdk_hw.mem.user_mapped_virt_addr && !netuio_contextdata->dpdk_seg.mem.user_mapped_virt_addr) { - status = STATUS_INSUFFICIENT_RESOURCES; + if (netuio_contextdata->dpdk_seg.mem.user_mapped_virt_addr != NULL) { + status = STATUS_ALREADY_COMMITTED; break; } - // Zero out the physically contiguous block - RtlZeroMemory(netuio_contextdata->dpdk_seg.mem.virt_addr, netuio_contextdata->dpdk_seg.mem.size); - // Return relevant data to the caller status = WdfRequestRetrieveOutputBuffer(Request, sizeof(struct dpdk_private_info), &output_buf, &output_buf_size); if (!NT_SUCCESS(status)) { status = STATUS_INVALID_BUFFER_SIZE; break; } + + // Zero out the physically contiguous block + RtlZeroMemory(netuio_contextdata->dpdk_seg.mem.virt_addr, netuio_contextdata->dpdk_seg.mem.size); + + status = netuio_map_address_into_user_process(netuio_contextdata); + if (status != STATUS_SUCCESS) { + break; + } + ASSERT(output_buf_size == OutputBufferLength); - status = netuio_handle_get_hw_data_request(Request, netuio_contextdata, output_buf, output_buf_size); - if (NT_SUCCESS(status)) - bytes_returned = output_buf_size; + netuio_handle_get_hw_data_request(Request, netuio_contextdata, output_buf, output_buf_size); + bytes_returned = output_buf_size; break; @@ -206,19 +259,22 @@ netuio_evt_IO_device_control(_In_ WDFQUEUE Queue, _In_ WDFREQUEST Request, ASSERT(output_buf_size == OutputBufferLength); if (dpdk_pci_io_input->op == PCI_IO_READ) { - netuio_read_PCI_config(netuio_contextdata, - dpdk_pci_io_input->offset, - dpdk_pci_io_input->access_size, - (UINT64*)output_buf); - - bytes_returned = sizeof(UINT64); + *(UINT64 *)output_buf = 0; + bytes_returned = netuio_contextdata->bus_interface.GetBusData( + netuio_contextdata->bus_interface.Context, + PCI_WHICHSPACE_CONFIG, + output_buf, + dpdk_pci_io_input->offset, + dpdk_pci_io_input->access_size); } else if (dpdk_pci_io_input->op == PCI_IO_WRITE) { - netuio_write_PCI_config(netuio_contextdata, - dpdk_pci_io_input->offset, - dpdk_pci_io_input->access_size, - &dpdk_pci_io_input->data); - bytes_returned = 0; + // returns bytes written + bytes_returned = netuio_contextdata->bus_interface.SetBusData( + netuio_contextdata->bus_interface.Context, + PCI_WHICHSPACE_CONFIG, + (PVOID)&dpdk_pci_io_input->data, + dpdk_pci_io_input->offset, + dpdk_pci_io_input->access_size); } else { status = STATUS_INVALID_PARAMETER; diff --git a/kernel/windows/netuio/netuio_queue.h b/kernel/windows/netuio/netuio_queue.h index 6a0306516..90fdb4008 100644 --- a/kernel/windows/netuio/netuio_queue.h +++ b/kernel/windows/netuio/netuio_queue.h @@ -17,6 +17,8 @@ typedef struct _QUEUE_CONTEXT { WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(QUEUE_CONTEXT, QueueGetContext) +VOID +netuio_unmap_address_from_user_process(_In_ PNETUIO_CONTEXT_DATA netuio_contextdata); NTSTATUS netuio_queue_initialize(_In_ WDFDEVICE hDevice); -- 2.23.0.vfs.1.1.63.g5a5ad7f
From: Narcisa Vasile <navasile@microsoft.com> Add build folders and .vs/ to .gitignore. Create .gitattributes to handle line endings correctly. Signed-off-by: Narcisa Vasile <navasile@microsoft.com> Reported-by: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com> --- .gitattributes | 4 ++++ .gitignore | 2 ++ 2 files changed, 6 insertions(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..13482db3d --- /dev/null +++ b/.gitattributes @@ -0,0 +1,4 @@ +* text=auto + +*.sln text eol=crlf +*.vcxproj text eol=crlf diff --git a/.gitignore b/.gitignore index e69de29bb..543281e8f 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1,2 @@ +x64/ +.vs/ -- 2.23.0.vfs.1.1.63.g5a5ad7f
From: Narcisa Vasile <navasile@microsoft.com> Signed-off-by: Narcisa Vasile <navasile@microsoft.com> Reported-by: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com> --- mk/exec-env/windows/netuio/netuio.vcxproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mk/exec-env/windows/netuio/netuio.vcxproj b/mk/exec-env/windows/netuio/netuio.vcxproj index b6b11e49a..60058fcd6 100644 --- a/mk/exec-env/windows/netuio/netuio.vcxproj +++ b/mk/exec-env/windows/netuio/netuio.vcxproj @@ -51,11 +51,13 @@ <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> <OutDir>$(SolutionDir)..\..\..\..\$(Platform)\$(ConfigurationName)\$(MSBuildProjectName)\</OutDir> <IntDir>$(SolutionDir)..\$(Platform)\$(ConfigurationName)\$(MSBuildProjectName)\</IntDir> + <Inf2CatUseLocalTime>true</Inf2CatUseLocalTime> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> <OutDir>$(SolutionDir)..\..\..\..\$(Platform)\$(ConfigurationName)\$(MSBuildProjectName)\</OutDir> <IntDir>$(SolutionDir)..\$(Platform)\$(ConfigurationName)\$(MSBuildProjectName)\</IntDir> + <Inf2CatUseLocalTime>true</Inf2CatUseLocalTime> </PropertyGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <ClCompile> -- 2.23.0.vfs.1.1.63.g5a5ad7f
From: Narcisa Vasile <navasile@microsoft.com> Co-installers are no longer needed. Signed-off-by: Narcisa Vasile <navasile@microsoft.com> Reported-by: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com> --- kernel/windows/netuio/netuio.inf | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/kernel/windows/netuio/netuio.inf b/kernel/windows/netuio/netuio.inf index 4c4d5e047..35fe7c85c 100644 --- a/kernel/windows/netuio/netuio.inf +++ b/kernel/windows/netuio/netuio.inf @@ -85,30 +85,14 @@ StartType = 3 ; SERVICE_DEMAND_START ErrorControl = 1 ; SERVICE_ERROR_NORMAL ServiceBinary = %12%\netuio.sys -; -;--- netuio_Device Coinstaller installation ------ -; - [DestinationDirs] DefaultDestDir = 12 -netuio_Device_CoInstaller_CopyFiles = 11 - -[netuio_Device.NT.CoInstallers] -AddReg=netuio_Device_CoInstaller_AddReg -CopyFiles=netuio_Device_CoInstaller_CopyFiles - -[netuio_Device_CoInstaller_AddReg] -HKR,,CoInstallers32,0x00010000, "WdfCoInstaller$KMDFCOINSTALLERVERSION$.dll,WdfCoInstaller" - -[netuio_Device_CoInstaller_CopyFiles] -WdfCoInstaller$KMDFCOINSTALLERVERSION$.dll [SourceDisksNames] 1 = %DiskName%,,,"" [SourceDisksFiles] netuio.sys = 1,, -WdfCoInstaller$KMDFCOINSTALLERVERSION$.dll=1 ; make sure the number matches with SourceDisksNames [netuio_Device.NT.Wdf] KmdfService = netuio, netuio_wdfsect -- 2.23.0.vfs.1.1.63.g5a5ad7f
From: Narcisa Vasile <navasile@microsoft.com> MmMapLockedPagesSpecifyCache can raise an exception when it cannot map the specified pages. Signed-off-by: Narcisa Vasile <navasile@microsoft.com> Reported-by: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com> --- kernel/windows/netuio/netuio_queue.c | 36 ++++++++++++++++++---------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/kernel/windows/netuio/netuio_queue.c b/kernel/windows/netuio/netuio_queue.c index 9c7ff7d06..c2bc998dc 100644 --- a/kernel/windows/netuio/netuio_queue.c +++ b/kernel/windows/netuio/netuio_queue.c @@ -53,13 +53,18 @@ netuio_map_address_into_user_process(_In_ PNETUIO_CONTEXT_DATA netuio_contextdat // Map the scratch memory regions to the user's process context MmBuildMdlForNonPagedPool(netuio_contextdata->dpdk_seg.mdl); - netuio_contextdata->dpdk_seg.mem.user_mapped_virt_addr = - MmMapLockedPagesSpecifyCache( - netuio_contextdata->dpdk_seg.mdl, UserMode, MmCached, - NULL, FALSE, (NormalPagePriority | MdlMappingNoExecute)); + __try { + netuio_contextdata->dpdk_seg.mem.user_mapped_virt_addr = + MmMapLockedPagesSpecifyCache(netuio_contextdata->dpdk_seg.mdl, UserMode, + MmCached, NULL, FALSE, NormalPagePriority); - if (netuio_contextdata->dpdk_seg.mem.user_mapped_virt_addr == NULL) { - status = STATUS_INSUFFICIENT_RESOURCES; + if (netuio_contextdata->dpdk_seg.mem.user_mapped_virt_addr == NULL) { + status = STATUS_INSUFFICIENT_RESOURCES; + goto end; + } + } + __except (EXCEPTION_EXECUTE_HANDLER) { + status = GetExceptionCode(); goto end; } @@ -70,13 +75,18 @@ netuio_map_address_into_user_process(_In_ PNETUIO_CONTEXT_DATA netuio_contextdat } MmBuildMdlForNonPagedPool(netuio_contextdata->dpdk_hw[idx].mdl); - netuio_contextdata->dpdk_hw[idx].mem.user_mapped_virt_addr = - MmMapLockedPagesSpecifyCache( - netuio_contextdata->dpdk_hw[idx].mdl, UserMode, MmCached, - NULL, FALSE, (NormalPagePriority | MdlMappingNoExecute)); - - if (netuio_contextdata->dpdk_hw[idx].mem.user_mapped_virt_addr == NULL) { - status = STATUS_INSUFFICIENT_RESOURCES; + __try { + netuio_contextdata->dpdk_hw[idx].mem.user_mapped_virt_addr = + MmMapLockedPagesSpecifyCache(netuio_contextdata->dpdk_hw[idx].mdl, UserMode, + MmCached, NULL, FALSE, NormalPagePriority); + + if (netuio_contextdata->dpdk_hw[idx].mem.user_mapped_virt_addr == NULL) { + status = STATUS_INSUFFICIENT_RESOURCES; + goto end; + } + } + __except (EXCEPTION_EXECUTE_HANDLER) { + status = GetExceptionCode(); goto end; } } -- 2.23.0.vfs.1.1.63.g5a5ad7f
From: Narcisa Vasile <navasile@microsoft.com> Use EvtIoInCallerContext to assure the requests are handled in the right user thread context. If the request does not need to be handled in a specific context, send it back to framework. Signed-off-by: Narcisa Vasile <navasile@microsoft.com> Reported-by: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com> --- kernel/windows/netuio/netuio_dev.c | 1 + kernel/windows/netuio/netuio_dev.h | 1 - kernel/windows/netuio/netuio_queue.c | 242 ++++++++++++++++----------- kernel/windows/netuio/netuio_queue.h | 2 + 4 files changed, 145 insertions(+), 101 deletions(-) diff --git a/kernel/windows/netuio/netuio_dev.c b/kernel/windows/netuio/netuio_dev.c index 3b5c95e84..e4e4570bc 100644 --- a/kernel/windows/netuio/netuio_dev.c +++ b/kernel/windows/netuio/netuio_dev.c @@ -50,6 +50,7 @@ netuio_create_device(_Inout_ PWDFDEVICE_INIT DeviceInit) // This function will be called when the WDF Device Object associated to the current device is destroyed WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&deviceAttributes, NETUIO_CONTEXT_DATA); deviceAttributes.EvtCleanupCallback = netuio_evt_device_context_cleanup; + WdfDeviceInitSetIoInCallerContextCallback(DeviceInit, netuio_evt_IO_in_caller_context); status = WdfDeviceCreate(&DeviceInit, &deviceAttributes, &device); diff --git a/kernel/windows/netuio/netuio_dev.h b/kernel/windows/netuio/netuio_dev.h index 59956720e..6a9b1ff82 100644 --- a/kernel/windows/netuio/netuio_dev.h +++ b/kernel/windows/netuio/netuio_dev.h @@ -58,7 +58,6 @@ static NTSTATUS create_device_specific_symbolic_link(_In_ WDFOBJECT device); static NTSTATUS allocate_usermemory_segment(_In_ WDFOBJECT device); static VOID free_usermemory_segment(_In_ WDFOBJECT device); - EXTERN_C_END #endif // NETUIO_DEV_H diff --git a/kernel/windows/netuio/netuio_queue.c b/kernel/windows/netuio/netuio_queue.c index c2bc998dc..7714a4d3a 100644 --- a/kernel/windows/netuio/netuio_queue.c +++ b/kernel/windows/netuio/netuio_queue.c @@ -168,135 +168,177 @@ netuio_queue_initialize(_In_ WDFDEVICE Device) /* Routine Description: - This event is invoked when the framework receives IRP_MJ_DEVICE_CONTROL request. + This routine is invoked to preprocess an I/O request before being placed into a queue. + It is guaranteed that it executes in the context of the process that generated the request. Return Value: None */ +_Use_decl_annotations_ VOID -netuio_evt_IO_device_control(_In_ WDFQUEUE Queue, _In_ WDFREQUEST Request, - _In_ size_t OutputBufferLength, _In_ size_t InputBufferLength, - _In_ ULONG IoControlCode) +netuio_evt_IO_in_caller_context( + IN WDFDEVICE Device, + IN WDFREQUEST Request +) { - UNREFERENCED_PARAMETER(OutputBufferLength); - UNREFERENCED_PARAMETER(InputBufferLength); - + WDF_REQUEST_PARAMETERS params = { 0 }; NTSTATUS status = STATUS_SUCCESS; PVOID input_buf = NULL, output_buf = NULL; size_t input_buf_size, output_buf_size; size_t bytes_returned = 0; + PNETUIO_CONTEXT_DATA netuio_contextdata = NULL; - WDFDEVICE device = WdfIoQueueGetDevice(Queue); + netuio_contextdata = netuio_get_context_data(Device); - PNETUIO_CONTEXT_DATA netuio_contextdata; - netuio_contextdata = netuio_get_context_data(device); + WDF_REQUEST_PARAMETERS_INIT(¶ms); + WdfRequestGetParameters(Request, ¶ms); - switch (IoControlCode) { - case IOCTL_NETUIO_MAP_HW_INTO_USERMODE: - // First retrieve the input buffer and see if it matches our device - status = WdfRequestRetrieveInputBuffer(Request, sizeof(struct dpdk_private_info), &input_buf, &input_buf_size); - if (!NT_SUCCESS(status)) { - status = STATUS_INVALID_BUFFER_SIZE; - break; - } + // We only need to be in the context of the process that initiated the request + //when we need to map memory to userspace. Otherwise, send the request back to framework. + if (!((params.Type == WdfRequestTypeDeviceControl) && + (params.Parameters.DeviceIoControl.IoControlCode == IOCTL_NETUIO_MAP_HW_INTO_USERMODE))) + { + status = WdfDeviceEnqueueRequest(Device, Request); - struct dpdk_private_info *dpdk_pvt_info = (struct dpdk_private_info *)input_buf; - // Ensure that the B:D:F match - otherwise, fail the IOCTL - if ((netuio_contextdata->addr.bus_num != dpdk_pvt_info->dev_addr.bus_num) || - (netuio_contextdata->addr.dev_num != dpdk_pvt_info->dev_addr.dev_num) || - (netuio_contextdata->addr.func_num != dpdk_pvt_info->dev_addr.func_num)) { - status = STATUS_NOT_SAME_DEVICE; - break; + if (!NT_SUCCESS(status)) + { + WdfRequestCompleteWithInformation(Request, status, bytes_returned); } + return; + } - if (netuio_contextdata->dpdk_seg.mem.user_mapped_virt_addr != NULL) { - status = STATUS_ALREADY_COMMITTED; - break; - } + // First retrieve the input buffer and see if it matches our device + status = WdfRequestRetrieveInputBuffer(Request, sizeof(struct dpdk_private_info), &input_buf, &input_buf_size); + if (!NT_SUCCESS(status)) { + status = STATUS_INVALID_BUFFER_SIZE; + goto end; + } - // Return relevant data to the caller - status = WdfRequestRetrieveOutputBuffer(Request, sizeof(struct dpdk_private_info), &output_buf, &output_buf_size); - if (!NT_SUCCESS(status)) { - status = STATUS_INVALID_BUFFER_SIZE; - break; - } + struct dpdk_private_info* dpdk_pvt_info = (struct dpdk_private_info*)input_buf; + // Ensure that the B:D:F match - otherwise, fail the IOCTL + if ((netuio_contextdata->addr.bus_num != dpdk_pvt_info->dev_addr.bus_num) || + (netuio_contextdata->addr.dev_num != dpdk_pvt_info->dev_addr.dev_num) || + (netuio_contextdata->addr.func_num != dpdk_pvt_info->dev_addr.func_num)) { + status = STATUS_NOT_SAME_DEVICE; + goto end; + } - // Zero out the physically contiguous block - RtlZeroMemory(netuio_contextdata->dpdk_seg.mem.virt_addr, netuio_contextdata->dpdk_seg.mem.size); + if (netuio_contextdata->dpdk_seg.mem.user_mapped_virt_addr != NULL) { + status = STATUS_ALREADY_COMMITTED; + goto end; + } - status = netuio_map_address_into_user_process(netuio_contextdata); - if (status != STATUS_SUCCESS) { - break; - } + // Return relevant data to the caller + status = WdfRequestRetrieveOutputBuffer(Request, sizeof(struct dpdk_private_info), &output_buf, &output_buf_size); + if (!NT_SUCCESS(status)) { + status = STATUS_INVALID_BUFFER_SIZE; + goto end; + } - ASSERT(output_buf_size == OutputBufferLength); - netuio_handle_get_hw_data_request(Request, netuio_contextdata, output_buf, output_buf_size); - bytes_returned = output_buf_size; + // Zero out the physically contiguous block + RtlZeroMemory(netuio_contextdata->dpdk_seg.mem.virt_addr, netuio_contextdata->dpdk_seg.mem.size); - break; + status = netuio_map_address_into_user_process(netuio_contextdata); + if (status != STATUS_SUCCESS) { + goto end; + } - case IOCTL_NETUIO_PCI_CONFIG_IO: - // First retrieve the input buffer and see if it matches our device - status = WdfRequestRetrieveInputBuffer(Request, sizeof(struct dpdk_pci_config_io), &input_buf, &input_buf_size); - if (!NT_SUCCESS(status)) { - status = STATUS_INVALID_BUFFER_SIZE; - break; - } + netuio_handle_get_hw_data_request(Request, netuio_contextdata, output_buf, output_buf_size); + bytes_returned = output_buf_size; - struct dpdk_pci_config_io *dpdk_pci_io_input = (struct dpdk_pci_config_io *)input_buf; +end: + WdfRequestCompleteWithInformation(Request, status, bytes_returned); - if (dpdk_pci_io_input->access_size != 1 && - dpdk_pci_io_input->access_size != 2 && - dpdk_pci_io_input->access_size != 4 && - dpdk_pci_io_input->access_size != 8) { - status = STATUS_INVALID_PARAMETER; - break; - } + return; +} - // Ensure that the B:D:F match - otherwise, fail the IOCTL - if ((netuio_contextdata->addr.bus_num != dpdk_pci_io_input->dev_addr.bus_num) || - (netuio_contextdata->addr.dev_num != dpdk_pci_io_input->dev_addr.dev_num) || - (netuio_contextdata->addr.func_num != dpdk_pci_io_input->dev_addr.func_num)) { - status = STATUS_NOT_SAME_DEVICE; - break; - } - // Retrieve output buffer - status = WdfRequestRetrieveOutputBuffer(Request, sizeof(UINT64), &output_buf, &output_buf_size); - if (!NT_SUCCESS(status)) { - status = STATUS_INVALID_BUFFER_SIZE; - break; - } - ASSERT(output_buf_size == OutputBufferLength); - - if (dpdk_pci_io_input->op == PCI_IO_READ) { - *(UINT64 *)output_buf = 0; - bytes_returned = netuio_contextdata->bus_interface.GetBusData( - netuio_contextdata->bus_interface.Context, - PCI_WHICHSPACE_CONFIG, - output_buf, - dpdk_pci_io_input->offset, - dpdk_pci_io_input->access_size); - } - else if (dpdk_pci_io_input->op == PCI_IO_WRITE) { - // returns bytes written - bytes_returned = netuio_contextdata->bus_interface.SetBusData( - netuio_contextdata->bus_interface.Context, - PCI_WHICHSPACE_CONFIG, - (PVOID)&dpdk_pci_io_input->data, - dpdk_pci_io_input->offset, - dpdk_pci_io_input->access_size); - } - else { - status = STATUS_INVALID_PARAMETER; - break; - } +/* +Routine Description: + This event is invoked when the framework receives IRP_MJ_DEVICE_CONTROL request. + +Return Value: + None + */ +VOID +netuio_evt_IO_device_control(_In_ WDFQUEUE Queue, _In_ WDFREQUEST Request, + _In_ size_t OutputBufferLength, _In_ size_t InputBufferLength, + _In_ ULONG IoControlCode) +{ + UNREFERENCED_PARAMETER(OutputBufferLength); + UNREFERENCED_PARAMETER(InputBufferLength); + + NTSTATUS status = STATUS_SUCCESS; + PVOID input_buf = NULL, output_buf = NULL; + size_t input_buf_size, output_buf_size; + size_t bytes_returned = 0; + + WDFDEVICE device = WdfIoQueueGetDevice(Queue); - break; + PNETUIO_CONTEXT_DATA netuio_contextdata; + netuio_contextdata = netuio_get_context_data(device); + + if (IoControlCode != IOCTL_NETUIO_PCI_CONFIG_IO) + { + status = STATUS_INVALID_DEVICE_REQUEST; + goto end; + } + + // First retrieve the input buffer and see if it matches our device + status = WdfRequestRetrieveInputBuffer(Request, sizeof(struct dpdk_pci_config_io), &input_buf, &input_buf_size); + if (!NT_SUCCESS(status)) { + status = STATUS_INVALID_BUFFER_SIZE; + goto end; + } + + struct dpdk_pci_config_io *dpdk_pci_io_input = (struct dpdk_pci_config_io *)input_buf; + + if (dpdk_pci_io_input->access_size != 1 && + dpdk_pci_io_input->access_size != 2 && + dpdk_pci_io_input->access_size != 4 && + dpdk_pci_io_input->access_size != 8) { + status = STATUS_INVALID_PARAMETER; + goto end; + } - default: - break; + // Ensure that the B:D:F match - otherwise, fail the IOCTL + if ((netuio_contextdata->addr.bus_num != dpdk_pci_io_input->dev_addr.bus_num) || + (netuio_contextdata->addr.dev_num != dpdk_pci_io_input->dev_addr.dev_num) || + (netuio_contextdata->addr.func_num != dpdk_pci_io_input->dev_addr.func_num)) { + status = STATUS_NOT_SAME_DEVICE; + goto end; + } + // Retrieve output buffer + status = WdfRequestRetrieveOutputBuffer(Request, sizeof(UINT64), &output_buf, &output_buf_size); + if (!NT_SUCCESS(status)) { + status = STATUS_INVALID_BUFFER_SIZE; + goto end; + } + ASSERT(output_buf_size == OutputBufferLength); + + if (dpdk_pci_io_input->op == PCI_IO_READ) { + *(UINT64 *)output_buf = 0; + bytes_returned = netuio_contextdata->bus_interface.GetBusData( + netuio_contextdata->bus_interface.Context, + PCI_WHICHSPACE_CONFIG, + output_buf, + dpdk_pci_io_input->offset, + dpdk_pci_io_input->access_size); + } + else if (dpdk_pci_io_input->op == PCI_IO_WRITE) { + // returns bytes written + bytes_returned = netuio_contextdata->bus_interface.SetBusData( + netuio_contextdata->bus_interface.Context, + PCI_WHICHSPACE_CONFIG, + (PVOID)&dpdk_pci_io_input->data, + dpdk_pci_io_input->offset, + dpdk_pci_io_input->access_size); + } + else { + status = STATUS_INVALID_PARAMETER; + goto end; } +end: WdfRequestCompleteWithInformation(Request, status, bytes_returned); return; diff --git a/kernel/windows/netuio/netuio_queue.h b/kernel/windows/netuio/netuio_queue.h index 90fdb4008..68fdaa296 100644 --- a/kernel/windows/netuio/netuio_queue.h +++ b/kernel/windows/netuio/netuio_queue.h @@ -27,6 +27,8 @@ netuio_queue_initialize(_In_ WDFDEVICE hDevice); EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL netuio_evt_IO_device_control; EVT_WDF_IO_QUEUE_IO_STOP netuio_evt_IO_stop; +EVT_WDF_IO_IN_CALLER_CONTEXT netuio_evt_IO_in_caller_context; + EXTERN_C_END #endif // NETUIO_QUEUE_H -- 2.23.0.vfs.1.1.63.g5a5ad7f
From: Narcisa Vasile <navasile@microsoft.com> The netuio driver doesn't meet the necessary criteria to be in the Net class. Update Class to a custom defined value. Signed-off-by: Narcisa Vasile <navasile@microsoft.com> Reported-by: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com> --- kernel/windows/netuio/netuio.inf | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/kernel/windows/netuio/netuio.inf b/kernel/windows/netuio/netuio.inf index 35fe7c85c..4f0dae114 100644 --- a/kernel/windows/netuio/netuio.inf +++ b/kernel/windows/netuio/netuio.inf @@ -36,12 +36,19 @@ [Version] Signature="$WINDOWS NT$" -Class=Net -ClassGuid={4d36e972-e325-11ce-bfc1-08002be10318} +Class=%ClassName% +ClassGuid={78912BC1-CB8E-4B28-A329-F322EBADBE0F} Provider=%Intel% CatalogFile=netuio.cat DriverVer= +[ClassInstall32] +Addreg=netuioClassReg + +[netuioClassReg] +HKR,,,0,%ClassName% +HKR,,Icon,,-5 + ;***************************************** ; Install Section ;***************************************** @@ -103,7 +110,7 @@ KmdfLibraryVersion = $KMDFVERSION$ SPSVCINST_ASSOCSERVICE= 0x00000002 Intel = "Intel" Broadcom = "Broadcom Corporation" -ClassName = "Intel(R) DPDK netUIO Driver" +ClassName = "Windows UIO" DiskName = "DPDK netUIO Installation Disk" F1583.netuio.Description = "DPDK netUIO for Intel(R) Ethernet Converged Network Adapter XL710-Q2" F158A.netuio.Description = "DPDK netUIO for Intel(R) Ethernet Network Adapter XXV710 for 25GbE backplane" -- 2.23.0.vfs.1.1.63.g5a5ad7f
From: Narcisa Vasile <navasile@microsoft.com> --- kernel/windows/netuio/netuio.inf | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/kernel/windows/netuio/netuio.inf b/kernel/windows/netuio/netuio.inf index 4f0dae114..419da53d3 100644 --- a/kernel/windows/netuio/netuio.inf +++ b/kernel/windows/netuio/netuio.inf @@ -91,6 +91,7 @@ ServiceType = 1 ; SERVICE_KERNEL_DRIVER StartType = 3 ; SERVICE_DEMAND_START ErrorControl = 1 ; SERVICE_ERROR_NORMAL ServiceBinary = %12%\netuio.sys +AddReg = DMAr.reg [DestinationDirs] DefaultDestDir = 12 @@ -120,3 +121,6 @@ F153B.netuio.Description = "DPDK netUIO for Intel(R) Ethernet Connection I217-V" F16D7.netuio.Description = "DPDK netUIO for Broadcom P225p NetXtreme-E Dual-port 10Gb/25Gb Ethernet PCIe Adapter" netuio.DeviceDesc = "netuio Device" netuio.SVCDESC = "netuio Service" + +[DMAr.reg] +HKR,Parameters,DmaRemappingCompatible,0x00010001,1 -- 2.23.0.vfs.1.1.63.g5a5ad7f
From: Harini Ramakrishnan <haramakr@microsoft.com> Signed-off-by: Harini Ramakrishnan <haramakr@microsoft.com> --- kernel/windows/netuio/netuio.inf | 3 +- kernel/windows/netuio/netuio.rc | Bin 4772 -> 8098 bytes kernel/windows/netuio/netuio_dev.c | 32 +++++++++++++++++++-- kernel/windows/netuio/netuio_dev.h | 32 +++++++++++++++++++-- kernel/windows/netuio/netuio_drv.c | 34 ++++++++++++++++++++--- kernel/windows/netuio/netuio_drv.h | 32 +++++++++++++++++++-- kernel/windows/netuio/netuio_interface.h | 34 ++++++++++++++++++++--- kernel/windows/netuio/netuio_queue.c | 34 ++++++++++++++++++++--- kernel/windows/netuio/netuio_queue.h | 34 ++++++++++++++++++++--- 9 files changed, 208 insertions(+), 27 deletions(-) diff --git a/kernel/windows/netuio/netuio.inf b/kernel/windows/netuio/netuio.inf index 419da53d3..9ccc59f8c 100644 --- a/kernel/windows/netuio/netuio.inf +++ b/kernel/windows/netuio/netuio.inf @@ -1,8 +1,7 @@ ; ; BSD LICENSE ; -; Copyright(c) 2010-2018 Intel Corporation. All rights reserved. -; All rights reserved. +; Copyright (c) Microsoft Corporation. All rights reserved ; ; Redistribution and use in source and binary forms, with or without ; modification, are permitted provided that the following conditions diff --git a/kernel/windows/netuio/netuio.rc b/kernel/windows/netuio/netuio.rc index 4b0b176e6284fcfa65662f7ea6b3b1b36fb85a6d..63908e5bf29bb3de0cf1e768049b1ad501639363 100644 GIT binary patch literal 8098 zcmdU!TW{M&5QX=-K>q`)yd-JhOK#}pNtR^CsBF2q*a;B8h;OL@TQVfMZh-#ww&$DC zn50Anv6BZE1VwVWJA3BLWrwSO|5;5>)A#AS^lQrO*hsz9)LlDmr$%a}T|KvEJ&OGr zX_T(gr!-FI>0|mMO*Q6mI!;e?-BH`I-i*>j=b62u|5zjV{h*d}-3`-<de_s1j;tVQ zVo#?UeX7<!^?Oo*plj{t>NT~oN9p=jZl*bg8kMOHDVgRQ>K8oM>V0f&(dWqCeo*@- z^*J+)m+JdWPd9oum42DE=FiBPmYBO#j}!Gi(|KIb5h=(9#g%@?>C$9Qbq~TTwTz_Y zxt_d*`QRwCnHdKrSQ;6gp%~9J2MjV}usJE=i8(JNb((&uU=WKx)%iIlu?04q=Z@LI zn@Jlu1}!>Hh1|JD3*LW7N9v0e9dp@hiazBYm`SUV>4cSF4@uZL69aDVz*NOSZu>w` z#U8v(#NmbEg`=^&aURW=u;bcR`_Mc)ZtD{<<{lUb|34ggB+c`L<wBPeS?^dH!s*cb zA^bBev#K6rjljzI2=|xf@!X&5?!v6S7#Vpq`p7CAZrR10P;K2^&F>NJI6{k|P@qA0 z+P3L(DrA}RVpT44zeSgM8F>sbQ#ne*=iQTwsF{P2FhgECGBlpg$Qx6k$kav-@V<@~ z1kM~8i7XS(?sp)_EOz0#m|X*lU(YoENV6B?FY@_~FnLA`i+DaHOOWG^CE4?!&rP-m z*NuMR0954TJReRpGS&pQYSFg+^hWDZPa}G%lQvU79cbO?YGul1?R$Faq<uX#)yfLC zk>2T-k@RZl?Veh?>anG^zS`cXt!@3gCcCcHj*;};RS)`Zq=D`_y6=^;LrwF82UIm( zV=PzZZKb!G4}?AIhXi`>sFk(VF}fCA8{N0oo@KmkNolCxKzO*{vR22E>A53JMShUD zqq9Gg3t}>7X#XYiW*W1pF*}mc)$DI(sOsWi+c5V{v(R+Y=G(p1aMM^SqN+>Uo}_ez zgKA<RDLm0S&~;BEs4ig7ZHcx$)4Z-bkTk7EfCJYXX7_bsAG`sSZ5_F;i<T~8>d14z z3<|f&GHc^OV1rvYXxo!(>GsCXAO?Fwcwii)Rc#Hu!85@P;%6oM^~41-n2C4pKdqU! zz|K2sEh2`w-^HWL^pW7HYgAnxgXd9`eJfw`2*Zl#i*4Kn?lnENQ#)emzV7kFOei`! znuf%&gSu;RN_E+@y0dM509uzdP<v~RA@qVdxN%92$Gy<ycso(jGp!@`U;sQ_9Ro29 zMk1VAl^k%OclZ=O(a;<|KbatWo!(*dqBnVbF)zO0=)+&~m;v*FW@>3>emxT)G55Xt ztp~v&nFo)`y{|0IHTAqy&IDEVCURP`1<3FVatqdRDdZAIb)fe!4=?x}PjI)TXRg5j z+SF$nW9iU5vW@ds<jI-gJu(-wxO=?EHFJ@N>hc@%If$@DE(7eIJHS`YPTmV|B!iXX z!7G5LY1Lv6e5*RDzgPCP8ckHiP>W!vA9ZA^yIHrW6sXU=T4x<Be^*dfvd&$pkI%_G z%=bvGL%qF_WUroU>RBGYqME37i|~>4V=ZM~SlJUJL>O77lMZF4mT`rTwq=z=y?>|p z+|b*$?n6&7JiH^&#g&|~$Z@$Afd}IGt$vHy4ZnD<bCJ=I&b7)0R58QZxHA6_kFh}H zx?Br4p2Qd0{d^<13AqpJ8t7ON`R?^EK)%NxD+Y$LTf|{ccOI1!%V6_f;B|L+0DS#W zimek#tSj@poy8QDCTktJ@=(!6l|g3wTZh-r5tYS}tWjP0@S#TSYWx$6Kk6Rx=s;I8 zFnQfuyr1W0su?n&ucga+97>8ub*{^D4<J7FrO9uawfVox1=Ud=KEai9U7S_-%<MgN z+?HhuddF8zb>@Aa)@Iok`#EEbBCp(Mj;d@^o9*JbhkCxLrT5A|@8!{+`*W1b5WTo3 zqPx!X$nvr8Yy~QEL{+|7^tQ0k!^$c}G$7<Tu9@P66+XU4qdhd)SM(ju>P6}g*4;z% zF1`&IO@$Y4V1#x?XS$<~i)u6aWb(OZ>9tO-uV#I{zHKVnsRYYXGx@ytX2jZ@^i9hy zTf)GXKu@vH41c8;S|!@n7q2|KT{p;XE!7JHMM)WFF3BaV-;QS|gq_vT_g^dY_r1!q zxe<H;y6l(2$nkPECTEN9PQH)4-*fGRxE6U2&zR+YF?V(J^F7xQvv5-r2H$yMh1nE0 z7t)L!A9fDQ@mMV_;-V}SUDndirqhvr%aZajRoN-t#&utoWIq5FYQoLV%$3%=q4tJ$ zb!D%rCSTw!$XOM=a;@5{szy>hSMbr4#A0RZyEQRqQx<9(o7AaOAtf?cCu5gstS8@F zXDyGNKkrS2&2BbU@SSdt!294VM{nR;QziadC)Za?EK#k0usIe!z6R#mb`7rOH6zKM z$R3kB$#09Vk0u!o%Ddx%e(??UPs8ew=hA6C{baTetjjIGA}ho{E?r^v|86E~?V5ez z-S-4n?xaP>?EFy@ou%*^o{GNtwQTK~hr~|iye*oVjVh4uLw5F=jc>qH(~192t_%&H zmdRVG9&@ieF!b!E-rUiKWmMH3xIXhfJaAbq$ZL-9#l@C#j@g%%<FCqD<;>ETG<cgB zf3b7#e#jc)8I3%%u9}E^?JI!e&C%v}ykA~Je4DDixSl_(d$cc}zVd$Vn{Ba%dRQ72 m(V!X6asAq_cWT=C@3!&|N^n_3@v!bexZL0Uzs)bNo&N*n%Pq$M delta 11 ScmZ2vzeJVk|G!PVi-Z6lrUe}U diff --git a/kernel/windows/netuio/netuio_dev.c b/kernel/windows/netuio/netuio_dev.c index e4e4570bc..dc2b2cd34 100644 --- a/kernel/windows/netuio/netuio_dev.c +++ b/kernel/windows/netuio/netuio_dev.c @@ -1,7 +1,33 @@ /*- -* -* Copyright(c) 2017 Intel Corporation. All rights reserved. -* +; BSD LICENSE +; +; Copyright (c) Microsoft Corporation. All rights reserved +; +; Redistribution and use in source and binary forms, with or without +; modification, are permitted provided that the following conditions +; are met: +; +; * Redistributions of source code must retain the above copyright +; notice, this list of conditions and the following disclaimer. +; * Redistributions in binary form must reproduce the above copyright +; notice, this list of conditions and the following disclaimer in +; the documentation and/or other materials provided with the +; distribution. +; * Neither the name of Intel Corporation nor the names of its +; contributors may be used to endorse or promote products derived +; from this software without specific prior written permission. +; +; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ diff --git a/kernel/windows/netuio/netuio_dev.h b/kernel/windows/netuio/netuio_dev.h index 6a9b1ff82..8da0e471e 100644 --- a/kernel/windows/netuio/netuio_dev.h +++ b/kernel/windows/netuio/netuio_dev.h @@ -1,7 +1,33 @@ /*- -* -* Copyright(c) 2017 Intel Corporation. All rights reserved. -* +; BSD LICENSE +; +; Copyright (c) Microsoft Corporation. All rights reserved +; +; Redistribution and use in source and binary forms, with or without +; modification, are permitted provided that the following conditions +; are met: +; +; * Redistributions of source code must retain the above copyright +; notice, this list of conditions and the following disclaimer. +; * Redistributions in binary form must reproduce the above copyright +; notice, this list of conditions and the following disclaimer in +; the documentation and/or other materials provided with the +; distribution. +; * Neither the name of Intel Corporation nor the names of its +; contributors may be used to endorse or promote products derived +; from this software without specific prior written permission. +; +; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef NETUIO_DEV_H diff --git a/kernel/windows/netuio/netuio_drv.c b/kernel/windows/netuio/netuio_drv.c index 554629c98..5b5dd0959 100644 --- a/kernel/windows/netuio/netuio_drv.c +++ b/kernel/windows/netuio/netuio_drv.c @@ -1,7 +1,33 @@ -/*- -* -* Copyright(c) 2017 Intel Corporation. All rights reserved. -* +/* +; BSD LICENSE +; +; Copyright (c) Microsoft Corporation. All rights reserved +; +; Redistribution and use in source and binary forms, with or without +; modification, are permitted provided that the following conditions +; are met: +; +; * Redistributions of source code must retain the above copyright +; notice, this list of conditions and the following disclaimer. +; * Redistributions in binary form must reproduce the above copyright +; notice, this list of conditions and the following disclaimer in +; the documentation and/or other materials provided with the +; distribution. +; * Neither the name of Intel Corporation nor the names of its +; contributors may be used to endorse or promote products derived +; from this software without specific prior written permission. +; +; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ diff --git a/kernel/windows/netuio/netuio_drv.h b/kernel/windows/netuio/netuio_drv.h index 5dc778625..65c46b619 100644 --- a/kernel/windows/netuio/netuio_drv.h +++ b/kernel/windows/netuio/netuio_drv.h @@ -1,7 +1,33 @@ /*- -* -* Copyright(c) 2017 Intel Corporation. All rights reserved. -* +; BSD LICENSE +; +; Copyright (c) Microsoft Corporation. All rights reserved +; +; Redistribution and use in source and binary forms, with or without +; modification, are permitted provided that the following conditions +; are met: +; +; * Redistributions of source code must retain the above copyright +; notice, this list of conditions and the following disclaimer. +; * Redistributions in binary form must reproduce the above copyright +; notice, this list of conditions and the following disclaimer in +; the documentation and/or other materials provided with the +; distribution. +; * Neither the name of Intel Corporation nor the names of its +; contributors may be used to endorse or promote products derived +; from this software without specific prior written permission. +; +; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ diff --git a/kernel/windows/netuio/netuio_interface.h b/kernel/windows/netuio/netuio_interface.h index 82fb1cb50..f8a81b4ee 100644 --- a/kernel/windows/netuio/netuio_interface.h +++ b/kernel/windows/netuio/netuio_interface.h @@ -1,7 +1,33 @@ -/*- -* -* Copyright(c) 2017 Intel Corporation. All rights reserved. -* +/* +; BSD LICENSE +; +; Copyright (c) Microsoft Corporation. All rights reserved +; +; Redistribution and use in source and binary forms, with or without +; modification, are permitted provided that the following conditions +; are met: +; +; * Redistributions of source code must retain the above copyright +; notice, this list of conditions and the following disclaimer. +; * Redistributions in binary form must reproduce the above copyright +; notice, this list of conditions and the following disclaimer in +; the documentation and/or other materials provided with the +; distribution. +; * Neither the name of Intel Corporation nor the names of its +; contributors may be used to endorse or promote products derived +; from this software without specific prior written permission. +; +; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ diff --git a/kernel/windows/netuio/netuio_queue.c b/kernel/windows/netuio/netuio_queue.c index 7714a4d3a..6aaa7c96a 100644 --- a/kernel/windows/netuio/netuio_queue.c +++ b/kernel/windows/netuio/netuio_queue.c @@ -1,7 +1,33 @@ -/*- -* -* Copyright(c) 2017 Intel Corporation. All rights reserved. -* +/* +; BSD LICENSE +; +; Copyright (c) Microsoft Corporation. All rights reserved +; +; Redistribution and use in source and binary forms, with or without +; modification, are permitted provided that the following conditions +; are met: +; +; * Redistributions of source code must retain the above copyright +; notice, this list of conditions and the following disclaimer. +; * Redistributions in binary form must reproduce the above copyright +; notice, this list of conditions and the following disclaimer in +; the documentation and/or other materials provided with the +; distribution. +; * Neither the name of Intel Corporation nor the names of its +; contributors may be used to endorse or promote products derived +; from this software without specific prior written permission. +; +; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ diff --git a/kernel/windows/netuio/netuio_queue.h b/kernel/windows/netuio/netuio_queue.h index 68fdaa296..850ba1696 100644 --- a/kernel/windows/netuio/netuio_queue.h +++ b/kernel/windows/netuio/netuio_queue.h @@ -1,7 +1,33 @@ -/*- -* -* Copyright(c) 2017 Intel Corporation. All rights reserved. -* +/* +; BSD LICENSE +; +; Copyright (c) Microsoft Corporation. All rights reserved +; +; Redistribution and use in source and binary forms, with or without +; modification, are permitted provided that the following conditions +; are met: +; +; * Redistributions of source code must retain the above copyright +; notice, this list of conditions and the following disclaimer. +; * Redistributions in binary form must reproduce the above copyright +; notice, this list of conditions and the following disclaimer in +; the documentation and/or other materials provided with the +; distribution. +; * Neither the name of Intel Corporation nor the names of its +; contributors may be used to endorse or promote products derived +; from this software without specific prior written permission. +; +; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -- 2.23.0.vfs.1.1.63.g5a5ad7f
From: Harini Ramakrishnan <haramakr@microsoft.com> Signed-off-by: Harini Ramakrishnan <haramakr@microsoft.com> --- kernel/README_NetUIO.rst | 63 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 kernel/README_NetUIO.rst diff --git a/kernel/README_NetUIO.rst b/kernel/README_NetUIO.rst new file mode 100644 index 000000000..9b21a4a8b --- /dev/null +++ b/kernel/README_NetUIO.rst @@ -0,0 +1,63 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2020 Microsoft Corporation. + +Compiling the NetUIO Driver from Source +======================================= + +Operating System +~~~~~~~~~~~~~~~~ + +The NetUIO source has been validated against the following operating systems: + +* Windows Server 2016 +* Windows Server 2019 + +Hardware Requirements +~~~~~~~~~~~~~~~~~~~~~ +The NetUIO driver has been validated using the following network adapters on the Windows platform: + +* +* + +Software Requirements +~~~~~~~~~~~~~~~~~~~~~ + +* Install Microsoft Visual Studio 2017 or Visual Stuido Studio 2019 Enterprise from https://visualstudio.microsoft.com/downloads/ + * During installation ensure following components are selected: + Windows 10 SDK (10.0.15063.0) + Windows 10 SDK (10.0.17763.0) + Windows Drivers Kit + +* Install WDK for Windows 10 (10.0.17763.1) from https://docs.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk + +Building the NetUIO Driver +-------------------------- +Follow the steps below to build the NetUIO driver and install the driver for the network adapter. + +* Clone the dpdk-kmods repository: git clone git://dpdk.org/dpdk-kmods +* Navigate to \dpdk-kmods\windows\netuio\mk\exec-env\windows\netuio +* Load netuio.sln in Microsoft Visual Studio 2017 or 2019 +* Choose Release as the configuration mode and Build the solution +* The resultant output files can be found in \dpdk-kmods\windows\netuio\x64\Release\netuio + +Installing netuio.sys Driver for development +-------------------------------------------- +NOTE: In a development environment, NetUIO driver can be loaded by enabling test-signing. +Please implement adequate precautionary measures before installing a test-signed driver, replacing a signed-driver. + +To ensure test-signed kernel-mode drivers can load on Windows, enable test-signing, using the following BCDEdit command. + +C:\windows\system32>Bcdedit.exe -set TESTSIGNING ON + +Windows displays the text “Test Mode” to remind users the system has test-signing enabled. +Refer to the MSDN documentation on how to Test-Sign a Driver Package. + +To procure a WHQL signed NetUIO driver for Windows, please reach out to dpdkwin@microsoft.com + +* Go to Device Manager -> Network Adapters. +* Right Click on target network adapter -> Select Update Driver. +* Select “Browse my computer for driver software”. +* In the resultant Window, select “Let me pick from a list of available drivers on my computer”. +* Select “DPDK netUIO for Network Adapter” from the list of drivers. +* The NetUIO.sys driver is successfully installed. + \ No newline at end of file -- 2.23.0.vfs.1.1.63.g5a5ad7f
From: Narcisa Vasile <navasile@microsoft.com> --- {kernel => windows/netuio/kernel}/README_NetUIO.rst | 0 .../netuio/kernel}/windows/netuio/netuio.inf | 0 .../netuio/kernel}/windows/netuio/netuio.rc | Bin .../netuio/kernel}/windows/netuio/netuio_dev.c | 0 .../netuio/kernel}/windows/netuio/netuio_dev.h | 0 .../netuio/kernel}/windows/netuio/netuio_drv.c | 0 .../netuio/kernel}/windows/netuio/netuio_drv.h | 0 .../kernel}/windows/netuio/netuio_interface.h | 0 .../netuio/kernel}/windows/netuio/netuio_queue.c | 0 .../netuio/kernel}/windows/netuio/netuio_queue.h | 0 .../netuio/kernel}/windows/netuio/resource.h | 0 .../netuio/mk}/exec-env/windows/netuio/netuio.sln | 0 .../mk}/exec-env/windows/netuio/netuio.vcxproj | 0 .../exec-env/windows/netuio/netuio.vcxproj.filters | 0 .../mk}/exec-env/windows/netuio/netuio.vcxproj.user | 0 15 files changed, 0 insertions(+), 0 deletions(-) rename {kernel => windows/netuio/kernel}/README_NetUIO.rst (100%) rename {kernel => windows/netuio/kernel}/windows/netuio/netuio.inf (100%) rename {kernel => windows/netuio/kernel}/windows/netuio/netuio.rc (100%) rename {kernel => windows/netuio/kernel}/windows/netuio/netuio_dev.c (100%) rename {kernel => windows/netuio/kernel}/windows/netuio/netuio_dev.h (100%) rename {kernel => windows/netuio/kernel}/windows/netuio/netuio_drv.c (100%) rename {kernel => windows/netuio/kernel}/windows/netuio/netuio_drv.h (100%) rename {kernel => windows/netuio/kernel}/windows/netuio/netuio_interface.h (100%) rename {kernel => windows/netuio/kernel}/windows/netuio/netuio_queue.c (100%) rename {kernel => windows/netuio/kernel}/windows/netuio/netuio_queue.h (100%) rename {kernel => windows/netuio/kernel}/windows/netuio/resource.h (100%) rename {mk => windows/netuio/mk}/exec-env/windows/netuio/netuio.sln (100%) rename {mk => windows/netuio/mk}/exec-env/windows/netuio/netuio.vcxproj (100%) rename {mk => windows/netuio/mk}/exec-env/windows/netuio/netuio.vcxproj.filters (100%) rename {mk => windows/netuio/mk}/exec-env/windows/netuio/netuio.vcxproj.user (100%) diff --git a/kernel/README_NetUIO.rst b/windows/netuio/kernel/README_NetUIO.rst similarity index 100% rename from kernel/README_NetUIO.rst rename to windows/netuio/kernel/README_NetUIO.rst diff --git a/kernel/windows/netuio/netuio.inf b/windows/netuio/kernel/windows/netuio/netuio.inf similarity index 100% rename from kernel/windows/netuio/netuio.inf rename to windows/netuio/kernel/windows/netuio/netuio.inf diff --git a/kernel/windows/netuio/netuio.rc b/windows/netuio/kernel/windows/netuio/netuio.rc similarity index 100% rename from kernel/windows/netuio/netuio.rc rename to windows/netuio/kernel/windows/netuio/netuio.rc diff --git a/kernel/windows/netuio/netuio_dev.c b/windows/netuio/kernel/windows/netuio/netuio_dev.c similarity index 100% rename from kernel/windows/netuio/netuio_dev.c rename to windows/netuio/kernel/windows/netuio/netuio_dev.c diff --git a/kernel/windows/netuio/netuio_dev.h b/windows/netuio/kernel/windows/netuio/netuio_dev.h similarity index 100% rename from kernel/windows/netuio/netuio_dev.h rename to windows/netuio/kernel/windows/netuio/netuio_dev.h diff --git a/kernel/windows/netuio/netuio_drv.c b/windows/netuio/kernel/windows/netuio/netuio_drv.c similarity index 100% rename from kernel/windows/netuio/netuio_drv.c rename to windows/netuio/kernel/windows/netuio/netuio_drv.c diff --git a/kernel/windows/netuio/netuio_drv.h b/windows/netuio/kernel/windows/netuio/netuio_drv.h similarity index 100% rename from kernel/windows/netuio/netuio_drv.h rename to windows/netuio/kernel/windows/netuio/netuio_drv.h diff --git a/kernel/windows/netuio/netuio_interface.h b/windows/netuio/kernel/windows/netuio/netuio_interface.h similarity index 100% rename from kernel/windows/netuio/netuio_interface.h rename to windows/netuio/kernel/windows/netuio/netuio_interface.h diff --git a/kernel/windows/netuio/netuio_queue.c b/windows/netuio/kernel/windows/netuio/netuio_queue.c similarity index 100% rename from kernel/windows/netuio/netuio_queue.c rename to windows/netuio/kernel/windows/netuio/netuio_queue.c diff --git a/kernel/windows/netuio/netuio_queue.h b/windows/netuio/kernel/windows/netuio/netuio_queue.h similarity index 100% rename from kernel/windows/netuio/netuio_queue.h rename to windows/netuio/kernel/windows/netuio/netuio_queue.h diff --git a/kernel/windows/netuio/resource.h b/windows/netuio/kernel/windows/netuio/resource.h similarity index 100% rename from kernel/windows/netuio/resource.h rename to windows/netuio/kernel/windows/netuio/resource.h diff --git a/mk/exec-env/windows/netuio/netuio.sln b/windows/netuio/mk/exec-env/windows/netuio/netuio.sln similarity index 100% rename from mk/exec-env/windows/netuio/netuio.sln rename to windows/netuio/mk/exec-env/windows/netuio/netuio.sln diff --git a/mk/exec-env/windows/netuio/netuio.vcxproj b/windows/netuio/mk/exec-env/windows/netuio/netuio.vcxproj similarity index 100% rename from mk/exec-env/windows/netuio/netuio.vcxproj rename to windows/netuio/mk/exec-env/windows/netuio/netuio.vcxproj diff --git a/mk/exec-env/windows/netuio/netuio.vcxproj.filters b/windows/netuio/mk/exec-env/windows/netuio/netuio.vcxproj.filters similarity index 100% rename from mk/exec-env/windows/netuio/netuio.vcxproj.filters rename to windows/netuio/mk/exec-env/windows/netuio/netuio.vcxproj.filters diff --git a/mk/exec-env/windows/netuio/netuio.vcxproj.user b/windows/netuio/mk/exec-env/windows/netuio/netuio.vcxproj.user similarity index 100% rename from mk/exec-env/windows/netuio/netuio.vcxproj.user rename to windows/netuio/mk/exec-env/windows/netuio/netuio.vcxproj.user -- 2.23.0.vfs.1.1.63.g5a5ad7f
On Thu, Aug 13, 2020 at 04:21:23PM -0700, Narcisa Ana Maria Vasile wrote:
> From: Narcisa Vasile <navasile@microsoft.com>
>
> The NetUIO driver for Windows allows the usermode application
> to directly access the hardware and allocates the memory that gets mapped in
> usermode.
>
> Anand Rawat (1):
> Updated Source and Project files to use Clang toolset
>
> Harini Ramakrishnan (10):
> Windows DPDK libraries and applications have now been updated to the
> latest public release v18.08, of the main DPDK source.
> doc: remove embedded buffer from Windows UIO ioctl
> Windows DPDK libraries and applications have now been updated to the
> latest public release v18.08, of the main DPDK source.
> doc: change the Windows UIO driver's default security descriptor to
> admin only
> doc: remove lower bound on mapped address from Windows UIO driver
> doc: remove embedded buffer from Windows UIO ioctl
> uio: move SDDL string to INF on Windows
> uio: Fix 64 bit BARs mapping
> license: update headers with BSD 3-clause license:
> doc: updating REAME for NetUIO driver
>
> Jason Messer (2):
> Initial commit of UIO driver for Windows
> Added new core libraries for Windows
>
> Narcisa Vasile (8):
> Update .gitignore and create .gitattributes
> uio: Use local time when verifying INF DriverVer
> uio: Remove co-installers section from inf
> uio: Wrap call into try/except block
> uio: Use request handler that guarantees execution in correct context
> uio: Change the device setup class to a custom one
> Enable DMA remapping through INF directive
> Move all files under windows folder
>
> Thomas Monjalon (1):
> init DPDK repository
>
> --
> 2.23.0.vfs.1.1.63.g5a5ad7f
Acked-by: Harini Ramakrishnan <haramakr@linux.microsoft.com>
On Thu, 13 Aug 2020 16:21:23 -0700, Narcisa Ana Maria Vasile wrote: > From: Narcisa Vasile <navasile@microsoft.com> > > The NetUIO driver for Windows allows the usermode application > to directly access the hardware > and allocates the memory that gets mapped in usermode. It doesn't allocate the buffer anymore, does it? As far as I understand, you're importing history from dpdk-draft-repo and then changing file layout. Not sure how this is beneficial, especially since there are bugfixes along the way. Or are there legal reasons? Please follow the guidelines on commit formatting, in particular: * Subject must have a topic ("windows/netuio"?), its length is limited. * Description is mandatory and should explain the changes.
On Thu, 13 Aug 2020 16:21:43 -0700, Narcisa Ana Maria Vasile wrote:
> From: Harini Ramakrishnan <haramakr@microsoft.com>
>
> Signed-off-by: Harini Ramakrishnan <haramakr@microsoft.com>
> ---
> kernel/windows/netuio/netuio.inf | 3 +-
> kernel/windows/netuio/netuio.rc | Bin 4772 -> 8098 bytes
> kernel/windows/netuio/netuio_dev.c | 32 +++++++++++++++++++--
> kernel/windows/netuio/netuio_dev.h | 32 +++++++++++++++++++--
> kernel/windows/netuio/netuio_drv.c | 34 ++++++++++++++++++++---
> kernel/windows/netuio/netuio_drv.h | 32 +++++++++++++++++++--
> kernel/windows/netuio/netuio_interface.h | 34 ++++++++++++++++++++---
> kernel/windows/netuio/netuio_queue.c | 34 ++++++++++++++++++++---
> kernel/windows/netuio/netuio_queue.h | 34 ++++++++++++++++++++---
> 9 files changed, 208 insertions(+), 27 deletions(-)
Why not use proper license from the commit each file is introduced? I'm not
even sure it is allowed to add files under unapproved license.
Please use "SPDX-License-Identifier: BSD-3-Clause" line to indicate licensing.
In fact, there was a cleanup of license boilerplate in DPDK some time ago.
Lastly, commit topic should be "windows/netuio" and there's an colon in the
end (a typo?).
On Thu, 13 Aug 2020 16:21:24 -0700, Narcisa Ana Maria Vasile wrote:
> From: Thomas Monjalon <thomas.monjalon@6wind.com>
>
> ---
> .gitignore | 0
> 1 file changed, 0 insertions(+), 0 deletions(-)
> create mode 100644 .gitignore
>
> diff --git a/.gitignore b/.gitignore
> new file mode 100644
> index 000000000..e69de29bb
This commit is not needed.
On Thu, 13 Aug 2020 16:21:26 -0700, Narcisa Ana Maria Vasile wrote:
> From: Jason Messer <jmesser@microsoft.com>
>
> ---
> mk/exec-env/windows/netuio/netuio.vcxproj | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/mk/exec-env/windows/netuio/netuio.vcxproj b/mk/exec-env/windows/netuio/netuio.vcxproj
> index 251b8eb95..9e769b5d0 100644
> --- a/mk/exec-env/windows/netuio/netuio.vcxproj
> +++ b/mk/exec-env/windows/netuio/netuio.vcxproj
> @@ -66,7 +66,7 @@
> <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking>
> </ClCompile>
> <Inf>
> - <TimeStamp>0.6.0.2</TimeStamp>
> + <TimeStamp>0.6.0.5</TimeStamp>
> </Inf>
> </ItemDefinitionGroup>
> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
> @@ -78,7 +78,7 @@
> <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking>
> </ClCompile>
> <Inf>
> - <TimeStamp>0.6.0.2</TimeStamp>
> + <TimeStamp>0.6.0.5</TimeStamp>
> </Inf>
> </ItemDefinitionGroup>
> <ItemGroup>
Commit subject does not match content. Is this commit even needed?
On Thu, 13 Aug 2020 16:21:28 -0700, Narcisa Ana Maria Vasile wrote:
> From: Harini Ramakrishnan <haramakr@microsoft.com>
>
> ---
> mk/exec-env/windows/netuio/netuio.vcxproj | 6 ++++++
> 1 file changed, 6 insertions(+)
>
> diff --git a/mk/exec-env/windows/netuio/netuio.vcxproj b/mk/exec-env/windows/netuio/netuio.vcxproj
> index b6564e4e7..b6b11e49a 100644
> --- a/mk/exec-env/windows/netuio/netuio.vcxproj
> +++ b/mk/exec-env/windows/netuio/netuio.vcxproj
> @@ -68,6 +68,9 @@
> <Inf>
> <TimeStamp>0.6.0.5</TimeStamp>
> </Inf>
> + <Link>
> + <AdditionalDependencies>%(AdditionalDependencies);$(KernelBufferOverflowLib);$(DDK_LIB_PATH)ntoskrnl.lib;$(DDK_LIB_PATH)hal.lib;$(DDK_LIB_PATH)wmilib.lib;$(KMDF_LIB_PATH)$(KMDF_VER_PATH)\WdfLdr.lib;$(KMDF_LIB_PATH)$(KMDF_VER_PATH)\WdfDriverEntry.lib;$(DDK_LIB_PATH)\wdmsec.lib</AdditionalDependencies>
> + </Link>
> </ItemDefinitionGroup>
> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
> <ClCompile>
> @@ -80,6 +83,9 @@
> <Inf>
> <TimeStamp>0.6.0.5</TimeStamp>
> </Inf>
> + <Link>
> + <AdditionalDependencies>%(AdditionalDependencies);$(KernelBufferOverflowLib);$(DDK_LIB_PATH)ntoskrnl.lib;$(DDK_LIB_PATH)hal.lib;$(DDK_LIB_PATH)wmilib.lib;$(KMDF_LIB_PATH)$(KMDF_VER_PATH)\WdfLdr.lib;$(KMDF_LIB_PATH)$(KMDF_VER_PATH)\WdfDriverEntry.lib;$(DDK_LIB_PATH)\wdmsec.lib</AdditionalDependencies>
> + </Link>
> </ItemDefinitionGroup>
> <ItemGroup>
> <FilesToPackage Include="$(TargetPath)" />
Commit subject doesn't match content. It this commit needed as standalone?
On Thu, 13 Aug 2020 16:21:34 -0700, Narcisa Ana Maria Vasile wrote: > From: Anand Rawat <anand.rawat@intel.com> > > Updated the code for using LLVM toolset. The code still uses > msbuild and VS2017. Some header files and windows specific > utility functions are removed due to conflicts with Clang > intrinsic functions. Project files have been updated to use > LLVM and additional project settings for Clang. > > Change-Id: I274de21379287c664e072f58e94271c654afe603 Not sure what this means for DPDK. > Signed-off-by: Anand Rawat <anand.rawat@intel.com> > --- > kernel/windows/netuio/netuio_queue.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/kernel/windows/netuio/netuio_queue.c b/kernel/windows/netuio/netuio_queue.c > index 929192880..760b4a7e5 100644 > --- a/kernel/windows/netuio/netuio_queue.c > +++ b/kernel/windows/netuio/netuio_queue.c > @@ -156,8 +156,8 @@ netuio_evt_IO_device_control(_In_ WDFQUEUE Queue, _In_ WDFREQUEST Request, > break; > } > > - // Zero out the physically contiguous block > - RtlZeroMemory(netuio_contextdata->dpdk_seg.mem.virt_addr, netuio_contextdata->dpdk_seg.mem.size); > + // Zero out the physically contiguous block > + RtlZeroMemory(netuio_contextdata->dpdk_seg.mem.virt_addr, netuio_contextdata->dpdk_seg.mem.size); > > // Return relevant data to the caller > status = WdfRequestRetrieveOutputBuffer(Request, sizeof(struct dpdk_private_info), &output_buf, &output_buf_size); Subject does not match content. Is this commit needed as standalone?
On Thu, 13 Aug 2020 16:21:44 -0700, Narcisa Ana Maria Vasile wrote: > From: Harini Ramakrishnan <haramakr@microsoft.com> > > Signed-off-by: Harini Ramakrishnan <haramakr@microsoft.com> > --- > kernel/README_NetUIO.rst | 63 ++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 63 insertions(+) > create mode 100644 kernel/README_NetUIO.rst > > diff --git a/kernel/README_NetUIO.rst b/kernel/README_NetUIO.rst > new file mode 100644 > index 000000000..9b21a4a8b > --- /dev/null > +++ b/kernel/README_NetUIO.rst > @@ -0,0 +1,63 @@ > +.. SPDX-License-Identifier: BSD-3-Clause > + Copyright(c) 2020 Microsoft Corporation. > + > +Compiling the NetUIO Driver from Source > +======================================= > + > +Operating System > +~~~~~~~~~~~~~~~~ > + > +The NetUIO source has been validated against the following operating systems: > + > +* Windows Server 2016 > +* Windows Server 2019 > + > +Hardware Requirements > +~~~~~~~~~~~~~~~~~~~~~ > +The NetUIO driver has been validated using the following network adapters on the Windows platform: > + > +* > +* NICs missing. > + > +Software Requirements > +~~~~~~~~~~~~~~~~~~~~~ > + > +* Install Microsoft Visual Studio 2017 or Visual Stuido Studio 2019 Enterprise from https://visualstudio.microsoft.com/downloads/ AFAIK, Visual Studio 2019 Community Edition is sufficient. > + * During installation ensure following components are selected: > + Windows 10 SDK (10.0.15063.0) > + Windows 10 SDK (10.0.17763.0) > + Windows Drivers Kit > + > +* Install WDK for Windows 10 (10.0.17763.1) from https://docs.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk > + > +Building the NetUIO Driver > +-------------------------- > +Follow the steps below to build the NetUIO driver and install the driver for the network adapter. > + > +* Clone the dpdk-kmods repository: git clone git://dpdk.org/dpdk-kmods > +* Navigate to \dpdk-kmods\windows\netuio\mk\exec-env\windows\netuio > +* Load netuio.sln in Microsoft Visual Studio 2017 or 2019 > +* Choose Release as the configuration mode and Build the solution > +* The resultant output files can be found in \dpdk-kmods\windows\netuio\x64\Release\netuio > + > +Installing netuio.sys Driver for development > +-------------------------------------------- > +NOTE: In a development environment, NetUIO driver can be loaded by enabling test-signing. > +Please implement adequate precautionary measures before installing a test-signed driver, replacing a signed-driver. reStructured Text syntax for banners (note, warning) is as follows: .. note:: Banner text. > + > +To ensure test-signed kernel-mode drivers can load on Windows, enable test-signing, using the following BCDEdit command. > + > +C:\windows\system32>Bcdedit.exe -set TESTSIGNING ON > + > +Windows displays the text “Test Mode” to remind users the system has test-signing enabled. > +Refer to the MSDN documentation on how to Test-Sign a Driver Package. There are similar instructions in windows/README.rst. You might choose to point there, but this is not a strong opinion. > + > +To procure a WHQL signed NetUIO driver for Windows, please reach out to dpdkwin@microsoft.com > + > +* Go to Device Manager -> Network Adapters. > +* Right Click on target network adapter -> Select Update Driver. > +* Select “Browse my computer for driver software”. > +* In the resultant Window, select “Let me pick from a list of available drivers on my computer”. s/Window/window/ > +* Select “DPDK netUIO for Network Adapter” from the list of drivers. > +* The NetUIO.sys driver is successfully installed. > + > \ No newline at end of file No newline at end of file.
On Fri, Aug 14, 2020 at 11:01:39PM +0300, Dmitry Kozlyuk wrote: > On Thu, 13 Aug 2020 16:21:23 -0700, Narcisa Ana Maria Vasile wrote: > > From: Narcisa Vasile <navasile@microsoft.com> > > > > The NetUIO driver for Windows allows the usermode application > > to directly access the hardware > > > and allocates the memory that gets mapped in usermode. > > It doesn't allocate the buffer anymore, does it? > > As far as I understand, you're importing history from dpdk-draft-repo and > then changing file layout. Not sure how this is beneficial, especially > since there are bugfixes along the way. Or are there legal reasons? > Harini, Omar, please advise if we need to preserve history. If not, I think it's better to just squash all commits and send the netuio code as one patch. In this way, I can easily make sure that this one patch has the right signoff, description, subject formatting etc. Dmitry, would pushing the netuio code as one patch be ok? > Please follow the guidelines on commit formatting, in particular: > > * Subject must have a topic ("windows/netuio"?), its length is limited. > * Description is mandatory and should explain the changes.
Hi Naty, IMHO this is small and sufficiently scoped where history (individual buildable patches) are not necessary. We'd prefer to avoid that overhead here. DmitryK, Please let us know if otherwise. -----Original Message----- From: Narcisa Ana Maria Vasile <navasile@linux.microsoft.com> Sent: Friday, August 14, 2020 1:26 PM To: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com> Cc: dev@dpdk.org; thomas@monjalon.net; haramakr@linux.microsoft.com; Omar Cardona <ocardona@microsoft.com>; pallavi.kadam@intel.com; ranjit.menon@intel.com; Dmitry Malloy (MESHCHANINOV) <dmitrym@microsoft.com>; Narcisa Ana Maria Vasile <Narcisa.Vasile@microsoft.com> Subject: Re: [PATCH 00/22] windows/netuio: add netuio driver for Windows On Fri, Aug 14, 2020 at 11:01:39PM +0300, Dmitry Kozlyuk wrote: > On Thu, 13 Aug 2020 16:21:23 -0700, Narcisa Ana Maria Vasile wrote: > > From: Narcisa Vasile <navasile@microsoft.com> > > > > The NetUIO driver for Windows allows the usermode application to > > directly access the hardware > > > and allocates the memory that gets mapped in usermode. > > It doesn't allocate the buffer anymore, does it? > > As far as I understand, you're importing history from dpdk-draft-repo > and then changing file layout. Not sure how this is beneficial, > especially since there are bugfixes along the way. Or are there legal reasons? > Harini, Omar, please advise if we need to preserve history. If not, I think it's better to just squash all commits and send the netuio code as one patch. In this way, I can easily make sure that this one patch has the right signoff, description, subject formatting etc. Dmitry, would pushing the netuio code as one patch be ok? > Please follow the guidelines on commit formatting, in particular: > > * Subject must have a topic ("windows/netuio"?), its length is limited. > * Description is mandatory and should explain the changes.
On Fri, 14 Aug 2020 13:26:11 -0700, Narcisa Ana Maria Vasile wrote: > On Fri, Aug 14, 2020 at 11:01:39PM +0300, Dmitry Kozlyuk wrote: > > On Thu, 13 Aug 2020 16:21:23 -0700, Narcisa Ana Maria Vasile wrote: [...] > > As far as I understand, you're importing history from dpdk-draft-repo and > > then changing file layout. Not sure how this is beneficial, especially > > since there are bugfixes along the way. Or are there legal reasons? > > > Harini, Omar, please advise if we need to preserve history. If not, > I think it's better to just squash all commits and send the netuio code > as one patch. In this way, I can easily make sure that this one patch > has the right signoff, description, subject formatting etc. > > Dmitry, would pushing the netuio code as one patch be ok? Yes, I think so.
On 8/14/2020 1:57 PM, Dmitry Kozlyuk wrote:
> On Fri, 14 Aug 2020 13:26:11 -0700, Narcisa Ana Maria Vasile wrote:
>> On Fri, Aug 14, 2020 at 11:01:39PM +0300, Dmitry Kozlyuk wrote:
>>> On Thu, 13 Aug 2020 16:21:23 -0700, Narcisa Ana Maria Vasile wrote:
> [...]
>>> As far as I understand, you're importing history from dpdk-draft-repo and
>>> then changing file layout. Not sure how this is beneficial, especially
>>> since there are bugfixes along the way. Or are there legal reasons?
>>>
>> Harini, Omar, please advise if we need to preserve history. If not,
>> I think it's better to just squash all commits and send the netuio code
>> as one patch. In this way, I can easily make sure that this one patch
>> has the right signoff, description, subject formatting etc.
>>
>> Dmitry, would pushing the netuio code as one patch be ok?
> Yes, I think so.
I agree too. This code is going to be committed into a new repo (kmods),
so there is no real benefit in maintaining prior history.
ranjit m.