DSCResources/MSFT_xNetAdapterLso/MSFT_xNetAdapterLso.psm1

$script:ResourceRootPath = Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent)

# Import the xNetworking Resource Module (to import the common modules)
Import-Module -Name (Join-Path -Path $script:ResourceRootPath -ChildPath 'xNetworking.psd1')

# Import Localization Strings
$localizedData = Get-LocalizedData `
    -ResourceName 'MSFT_xNetAdapterLso' `
    -ResourcePath (Split-Path -Parent $Script:MyInvocation.MyCommand.Path)

<#
.SYNOPSIS
    Gets the current state of NetAdapterLso for a adapter.
 
.PARAMETER Name
    Specifies the name of the network adapter to check.
 
.PARAMETER Protocol
    Specifies which protocol to target.
 
.PARAMETER State
    Specifies the LSO state for the protocol.
#>

function Get-TargetResource
{
    [CmdletBinding()]
    [OutputType([Hashtable])]
    param
    (
        [parameter(Mandatory = $true)]
        [String]
        $Name,

        [parameter(Mandatory = $true)]
        [ValidateSet("V1IPv4","IPv4","IPv6")]
        [String]
        $Protocol,

        [parameter(Mandatory = $true)]
        [Boolean]
        $State
    )

    try 
    {
        Write-Verbose -Message ( @(
            "$($MyInvocation.MyCommand): "
            $localizedData.CheckingNetAdapterMessage
        ) -join '')

        $netAdapter = Get-NetAdapterLso -Name $Name -ErrorAction Stop

        if ($netAdapter)
        {
            Write-Verbose -Message ( @(
                "$($MyInvocation.MyCommand): "
                $($LocalizedData.NetAdapterTestingStateMessage -f $Name, $Protocol)
            ) -join '')

            $result = @{ 
                Name = $Name
                Protocol = $Protocol
            }
            switch ($Protocol) {
                "V1IPv4" { $result.add('State', $netAdapter.V1IPv4Enabled) }
                "IPv4"   { $result.add('State', $netAdapter.IPv4Enabled) }
                "IPv6"   { $result.add('State', $netAdapter.IPv6Enabled) }
                Default {"Should not be called."}
            }
            return $result
        }
    }
    catch 
    {
        throw $localizedData.NetAdapterNotFoundMessage
    }

}

<#
.SYNOPSIS
    Sets the NetAdapterLso resource state.
 
.PARAMETER Name
    Specifies the name of the network adapter to check.
 
.PARAMETER Protocol
    Specifies which protocol to target.
 
.PARAMETER State
    Specifies the LSO state for the protocol.
#>

function Set-TargetResource
{
    [CmdletBinding()]
    param
    (
        [parameter(Mandatory = $true)]
        [String]
        $Name,

        [parameter(Mandatory = $true)]
        [ValidateSet("V1IPv4","IPv4","IPv6")]
        [String]
        $Protocol,

        [parameter(Mandatory = $true)]
        [Boolean]
        $State
    )

    try 
    {
        Write-Verbose -Message ( @(
            "$($MyInvocation.MyCommand): "
            $localizedData.CheckingNetAdapterMessage
        ) -join '')

        $netAdapter = Get-NetAdapterLso -Name $Name -ErrorAction Stop

        if ($netAdapter)
        {
            Write-Verbose -Message ( @(
                "$($MyInvocation.MyCommand): "
                $($LocalizedData.NetAdapterTestingStateMessage -f $Name, $Protocol)
            ) -join '')

            if ($Protocol -eq "V1IPv4" -and $State -ne $netAdapter.V1IPv4Enabled) 
            {
                Write-Verbose -Message ( @(
                    "$($MyInvocation.MyCommand): "
                    $($LocalizedData.NetAdapterApplyingChangesMessage -f `
                    $Name, $Protocol, $($netAdapter.V1IPv4Enabled.ToString()), $($State.ToString()) )
            )    -join '')
                
                Set-NetAdapterLso -Name $Name -V1IPv4Enabled $State
            }
            elseif ($Protocol -eq "IPv4" -and $State -ne $netAdapter.IPv4Enabled) 
            {
                Write-Verbose -Message ( @(
                    "$($MyInvocation.MyCommand): "
                    $($LocalizedData.NetAdapterApplyingChangesMessage -f `
                    $Name, $Protocol, $($netAdapter.IPv4Enabled.ToString()), $($State.ToString()) )
                ) -join '')

                Set-NetAdapterLso -Name $Name -IPv4Enabled $State
            }
            elseif ($Protocol -eq "IPv6" -and $State -ne $netAdapter.IPv6Enabled) 
            {
                Write-Verbose -Message ( @(
                    "$($MyInvocation.MyCommand): "
                    $($LocalizedData.NetAdapterApplyingChangesMessage -f `
                    $Name, $Protocol, $($netAdapter.IPv6Enabled.ToString()), $($State.ToString()) )
                ) -join '')

                Set-NetAdapterLso -Name $Name -IPv6Enabled $State
            }
        }
    }
    catch 
    {
        throw $LocalizedData.NetAdapterNotFoundMessage
    }

}

<#
.SYNOPSIS
    Tests if the NetAdapterLso resource state is desired state.
 
.PARAMETER Name
    Specifies the name of the network adapter to check.
 
.PARAMETER Protocol
    Specifies which protocol to target.
 
.PARAMETER State
    Specifies the LSO state for the protocol.
#>

function Test-TargetResource
{
    [CmdletBinding()]
    [OutputType([System.Boolean])]
    param
    (
        [parameter(Mandatory = $true)]
        [String]
        $Name,

        [parameter(Mandatory = $true)]
        [ValidateSet("V1IPv4","IPv4","IPv6")]
        [String]
        $Protocol,

        [parameter(Mandatory = $true)]
        [Boolean]
        $State
    )

    try 
    {
        Write-Verbose -Message ( @(
            "$($MyInvocation.MyCommand): "
            $localizedData.CheckingNetAdapterMessage
        ) -join '')

        $netAdapter = Get-NetAdapterLso -Name $Name -ErrorAction Stop

        if ($netAdapter) 
        {
            Write-Verbose -Message ( @(
                "$($MyInvocation.MyCommand): "
                $localizedData.NetAdapterTestingStateMessage -f `
                $Name, $Protocol
            ) -join '')

            switch ($Protocol) {
                "V1IPv4" { return ($State -eq $netAdapter.V1IPv4Enabled) }
                "IPv4"   { return ($State -eq $netAdapter.IPv4Enabled) }
                "IPv6"   { return ($State -eq $netAdapter.IPv6Enabled) }
                Default {"Should not be called."}
            }
        }
    }
    catch 
    {
        throw $LocalizedData.NetAdapterNotFoundMessage
    }

}