RDP-Shortpath greatly enhances user experience in Azure Virtual Desktop (AVD) using IGEL OS

By Fredrik Brattstig @virtualbrat

IGEL OS modern versions of the Azure Virtual Desktop (AVD) client enable the use of RDP-Shortpath for managed/private networks – this means that as long as you have your AVD hosts in direct line of sight from your IGEL OS endpoints, through Expressroute or VPN connection, you can enjoy a better user experience by using UDP transport for your AVD session. I did test this and have actually been using RDP-Shortpath for quite some time now, with great success. Using the reports of the Remote Desktop Analyzer I can see greatly improved session real-time statistics data. Take a look at the comparison picture below:

Left Side: TCP Connection traversing the AVD gateways
Right Side: UDP connection direct connection over VPN in this case

What? TCP: 10Mbps detected session bandwidth, UDP: 1035Mbps detected session bandwidth. On top of that, we also see a drastically reduced latency when using RDP-Shortpath – 26 ms in UDP compared to 68 ms in TCP. That will give benefits on session responsiveness, but also enhance the use of peripherals making the future feature of USB redirection a possibility, and it will certainly enhance Virtual Channel performance!

As said, the current implementation does only support RDP-Shortpath for managed/private networks. In quite soon future I believe we will see support for RDP-Shortpath for public networks too, and by that, support for RDP-Shortpath will be extended to Windows 365 Cloud PCs to utilize this benefit.

“-How do you configure IGEL OS AVD client to support RDP-Shortpath?”
I knew you should ask that Q, here is how it is done:

RDP-Shortpath enabled!

RDP-Shortpath is enabled in the registry of an IGEL profile (or in Local Setup). GoTo:

system->Registry->sessions->wvd(yoursessionnumber)->options->udp-short-path and enable "UDP Short Path" checkbox

Apply your AVD session to your endpoints and restart the AVD client. Remember, at the current version of implementation, you need to have direct line of sight to your AVD hosts through an Express-route or VPN connection to your Azure tenant.

Having trouble? You can check the IGEL OS AVD log for info about RDP-Shortpath. To get info about RDP-Shortpath, you need to set the RDCoreClient to log on high-level this is done by setting this parameter, and restarting your session. Pay attention to: When having the log level on max, you will have system performance impact, only enable this to either verify or troubleshoot. Make sure you revert the value for regular production.

system->Registry->sessions->wvd(yoursessionnumber)->options->rdcore-log-level and set RdCore Loglevel to "High"

Below is the info you will see in the AVD session log file after enabling RDP Shortpath and has set the log level for RDCore to High (this example is a functional session with RDP-Shortpath) I’m using cat to display the content of the log file and grep to filter out anything but Udp in the below example – using the command:
cat /var/log/user/avd6 | grep Udp
Where avd6 is the session number that I’m investigating for the log file of for the moment.

root@ITCC85B76CBBA27:~# cat /var/log/user/avd6 | grep Udp
[2023-02-09 16:06:58.892] [igelrdp3] [info] EnableUdpSideTransport = true (ShortPath)
[16:07:15.259593] <140703162152704> {ab945fac-a61a-415f-980f-03e24dec0000} RDP_WAN(INFO): MTSTack creating UdpFec stack, pushing SSL filter
[16:07:15.260704] <140703162152704> {ab945fac-a61a-415f-980f-03e24dec0000} RDP_WAN(DBG): UdpTrans::InitInst: hr=0x0
    /home/builder/rdcore-workshop/source/stack/libtermsrv/udptransport/TsUdpTransport.cpp(387): InitializeInstance()
    /home/builder/rdcore-workshop/source/stack/libtermsrv/udptransport/TsUdpTransport.cpp(503): Connect()
    /home/builder/rdcore-workshop/source/stack/libtermsrv/udptransport/TsUdpTransport.cpp(515): Connect()
[16:07:15.260864] <140703162152704> {ab945fac-a61a-415f-980f-03e24dec0000} RDP_WAN(INFO): UdpTrans::Connect - host:
    /home/builder/rdcore-workshop/source/stack/libtermsrv/udptransport/TsUdpTransport.cpp(555): Connect()
[16:07:15.261107] <140703162152704> {ab945fac-a61a-415f-980f-03e24dec0000} BASIX_INSTRUMENTATION(NORM): ObjectTracker::Alloc::(0x7ff72c0709f8)::N9Microsoft5Basix3Dct10AsioUdpDCTE::[], now 1 of this type
[16:07:15.265122] <140703162152704> {ab945fac-a61a-415f-980f-03e24dec0000} RDP_WAN(DBG): UdpTrans::Connect: EXIT hr=0x0
    /home/builder/rdcore-workshop/source/stack/libtermsrv/udptransport/TsUdpTransport.cpp(665): Connect()
    /home/builder/rdcore-workshop/source/stack/libtermsrv/udptransport/RawUdpRdpTransportFilter.cpp(475): SendInitialPacket()
    /home/builder/rdcore-workshop/source/stack/libtermsrv/udptransport/RawUdpRdpTransportFilter.cpp(236): OnDataReceived()
    /home/builder/rdcore-workshop/source/stack/libtermsrv/udptransport/RawUdpRdpTransportFilter.cpp(519): OnSynAckReceived()
    /home/builder/rdcore-workshop/source/stack/libtermsrv/udptransport/RawUdpRdpTransportFilter.cpp(543): OnSynAckReceived()
    /home/builder/rdcore-workshop/source/stack/libtermsrv/udptransport/RawUdpRdpTransportFilter.cpp(578): OnSynAckReceived()
[16:07:15.290633] <140702499456768> {ab945fac-a61a-415f-980f-03e24dec0000} RDP_WAN(DBG): UdpTrans::UdpTransportOnOpened
    /home/builder/rdcore-workshop/source/stack/libtermsrv/udptransport/TsUdpTransport.cpp(679): UdpTransportOnOpened()
[16:07:15.291466] <140702499456768> {ab945fac-a61a-415f-980f-03e24dec0000} RDP_WAN(DBG): Send (TsUdp) size: 517
    /home/builder/rdcore-workshop/source/stack/libtermsrv/udptransport/TsUdpTransport.cpp(786): SendData()
    /home/builder/rdcore-workshop/source/stack/libtermsrv/udptransport/RawUdpRdpTransportFilter.cpp(405): InternalQueueWrite()
    /home/builder/rdcore-workshop/source/stack/libtermsrv/udptransport/RawUdpRdpTransportFilter.cpp(236): OnDataReceived()
    /home/builder/rdcore-workshop/source/stack/libtermsrv/udptransport/RawUdpRdpTransportFilter.cpp(236): OnDataReceived()
    /home/builder/rdcore-workshop/source/stack/libtermsrv/udptransport/RawUdpRdpTransportFilter.cpp(405): InternalQueueWrite()
    /home/builder/rdcore-workshop/source/stack/libtermsrv/udptransport/RawUdpRdpTransportFilter.cpp(236): OnDataReceived()140703162152704
    /home/builder/rdcore-workshop/source/stack/libtermsrv/udptransport/RawUdpRdpTransportFilter.cpp(236): OnDataReceived()

One of the indicators in the log file we see that we Connect to host is no non-internet-routable address – equals to that the traffic will go through my VPN connection to my Azure Tenant, and we also see that we connect to port 3390 (instead of the default port 3389 for RDP), this is by design.

Follow this guide for enabling RDP-Shortpath for your AVD hosts:

That’s it for today! Enjoy UDP traffic going forward!