Invoke-VmkPing.ps1

#requires -Version 1.0
#requires -Module VMware.VimAutomation.Core

<#PSScriptInfo
 
        .VERSION 0.2.1
 
        .GUID 58a4280b-fcf2-43bc-9dc9-b1da178da404
 
        .AUTHOR Chris Masters
 
        .COMPANYNAME Chris Masters
 
        .COPYRIGHT (c) 2018 Chris Masters. All rights reserved.
 
        .TAGS network vmware vsphere ping vmkping virtual vm
 
        .LICENSEURI
 
        .PROJECTURI https://www.powershellgallery.com/profiles/masters274/
 
        .ICONURI
 
        .EXTERNALMODULEDEPENDENCIES VMware.VimAutomation.Core
 
        .REQUIREDSCRIPTS
 
        .EXTERNALSCRIPTDEPENDENCIES
 
        .RELEASENOTES
        12/22/2018:
                0.1 - Day one release.
        11/01/2022:
                0.2 - Added ability to connect thru vCenter
 
        .PRIVATEDATA
        N/A
#>
 

<#
        .SYNOPSIS
        VMK Ping from PowerCli
 
        .DESCRIPTION
        This script allows you to test the connectivity of your virtual nics in vSphere. You no longer need to
        enable SSH to perform these tests. This script works great in an automated deployment strategy.
 
        .EXAMPLE
        Invoke-VmkPing -VMHost myHost.domain.local -Credential root -IPAddress 192.168.200.10
        This will perform a VMK ping to 192.168.200.10 from host myHost.domain.local, results will look similar to
        the following.
 
        Duplicated : 0
        HostAddr : 192.168.200.10
        PacketLost : 0
        Recieved : 3
        RoundtripAvgMS : 192
        RoundtripMaxMS : 221
        RoundtripMinMS : 168
        Transmitted : 3
 
        .EXAMPLE
        Invoke-VmkPing -VMHost myHost.domain.local -Credential root -IPAddress 192.168.200.10 -DFBit -Size 8972
        This will perform a VMK ping to 192.168.200.10 from host myHost.domain.local with the DF (don't fragment)
        bit set, and test that jumbo frames are configured properly, end to end. Don't forget about packet headers.
        We set the size to 8972, to test that our jumbo configuration of 9000 is working propery. Don't forget the
        -DFBit setting, otherwise it will always work no matter the size if connectivity is true.
 
        .NOTES
        Requires that you have VMware.VimAutomation.Core PSSnapin loaded.
 
        .LINK
        https://github.com/masters274/
        https://www.powershellgallery.com/profiles/masters274/
 
        .INPUTS
        Accepts a string value for API key and a string or array of strings for the ServiceTag parameter
 
        .OUTPUTS
        Provides PSObject with network stats, based on the results
         
        Duplicated : 0
        HostAddr : 192.168.200.10
        PacketLost : 0
        Recieved : 3
        RoundtripAvgMS : 192
        RoundtripMaxMS : 221
        RoundtripMinMS : 168
        Transmitted : 3
#>



Param
(
    [Parameter(Mandatory=$true, HelpMessage = 'VMHost you want to ping from')]
    [String] $VMHost, 

    [Parameter(Mandatory=$false, HelpMessage = 'Connect to vCenter instead of direct to host')]
    [String] $VCenterServer, 
        
    [Parameter(Mandatory=$true, HelpMessage='Credentials for administering VMHost')]
    [System.Management.Automation.Credential()]
    [PSCredential] $Credential,
        
    [int] $Count = 3,
        
    [Switch] $DFBit, # set this when testing jumbo frames, or > 1500 packet size
        
    [Parameter(Mandatory = $true, HelpMessage = 'IP you want to ping for testing')]
    [IPAddress] $IPAddress,
        
    [ValidatePattern('^vmk*')]
    [String] $Interface = $null, # $null will pick the nic based on routing table, or interface subnet
        
    [int] $Size = 1500, # set to 8972 to test jumbo frames
        
    [Long] $TTL = $null
)
    
Begin
{
    
}
    
Process
{
    # Variables
    $strStopAction = 'Stop'
    
    # Connect to the VMHost
    Try
    {
        if ($VCenterServer) {
            $Server = $VCenterServer
        }
        else { 
            $Server = $VMHost
        }
        Connect-VIServer -Server $Server -Credential $Credential -WarningAction SilentlyContinue -ErrorAction $strStopAction | Out-Null
        $cmdESXcli = Get-EsxCli -VMHost $VMHost -ErrorAction $strStopAction
    }
    Catch
    {
        Write-Error -Message ('Failed to connect to VMHost {0}' -f $VMHost)
        return
    }
        
    #ping(long count, boolean debug, boolean df, string host, string interface, string interval, boolean ipv4, boolean ipv6, string netstack, string nexthop, long size, long ttl, string wait
    [Bool] $isIPv4 = $false
    [Bool] $isIPv6 = $false
     
    If ($IPAddress.AddressFamily -eq 'InterNetworkV6')
    {
        $isIPv6 = $true
    }
    Else
    {
        $isIPv4 = $true
    }
        
    $ret = $cmdESXcli.network.diag.ping(
        $Count,
        $false, # debugging
        $(If (!$DFBit) {$null} Else {$DFBit}), # Don't fragment bit
        $IPAddress,
        $null,
        $null, # String Interval
        $isIPv4,
        $isIPv6,
        $null, # [string] netstack
        $null, # [string] nexthop
        $Size, # Set to 8972 to test jumbo frames, also need DF bit set
        $(If (!$TTL) {$null} Else {$TTL}),
        $null # [String] wait
    )
        
    If ($ret.summary.PacketLost -gt 0)
    {
        Write-Warning -Message ('IP {0} not reachable, or missing packets!' -f $IPAddress)
    }
    
    $ret.summary
}
    
End
{
    Disconnect-VIServer -Server $Server -Force -Confirm:$false | Out-Null
}