Skip to content

Commit

Permalink
Added support for UDP (#14)
Browse files Browse the repository at this point in the history
  • Loading branch information
lowleveldesign committed Mar 2, 2021
1 parent fadf0fd commit e23100a
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 3 deletions.
65 changes: 65 additions & 0 deletions wtrace.cmd/Events/UdpIp.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
module LowLevelDesign.WTrace.Events.UdpIp

open System
open Microsoft.Diagnostics.Tracing
open Microsoft.Diagnostics.Tracing.Parsers.Kernel
open LowLevelDesign.WTrace
open LowLevelDesign.WTrace.Events
open LowLevelDesign.WTrace.Events.HandlerCommons

type private UdpIpHandlerState = {
Broadcast : EventBroadcast
}

[<AutoOpen>]
module private H =

let noFields = Array.empty<TraceEventField>

let handleUdpIpFail id state (ev : UdpIpFailTraceData) =
let ev = toEvent ev id "" "" "" ev.FailureCode
state.Broadcast.publishTraceEvent (TraceEventWithFields (ev, noFields))

let handleUdpIpData id state (ev : UdpIpTraceData) =
let fields = [|
struct (nameof ev.size, FI32 ev.size) |]

let details = sprintf "size: %d" ev.size
let path = sprintf "%s:%d -> %s:%d" (ev.saddr.ToString()) ev.sport (ev.daddr.ToString()) ev.dport
let ev = toEvent ev id "" path details WinApi.eventStatusUndefined
state.Broadcast.publishTraceEvent (TraceEventWithFields (ev, fields |> Array.map (toEventField id)))

let handleUdpIp6Data id state (ev : UpdIpV6TraceData) =
let fields = [|
struct (nameof ev.size, FI32 ev.size) |]

let details = sprintf "size: %d" ev.size
let path = sprintf "%s:%d -> %s:%d" (ev.saddr.ToString()) ev.sport (ev.daddr.ToString()) ev.dport
let activityId = sprintf "conn#%d" ev.connid
let ev = toEvent ev id activityId path details WinApi.eventStatusUndefined
state.Broadcast.publishTraceEvent (TraceEventWithFields (ev, fields |> Array.map (toEventField id)))

let subscribe (source : TraceEventSource, isRundown, idgen, state : obj) =
let state = state :?> UdpIpHandlerState
let handleEvent h = Action<_>(handleEvent idgen state h)
if not isRundown then
source.Kernel.add_UdpIpFail(handleEvent handleUdpIpFail)
source.Kernel.add_UdpIpRecv(handleEvent handleUdpIpData)
source.Kernel.add_UdpIpRecvIPV6(handleEvent handleUdpIp6Data)
source.Kernel.add_UdpIpSend(handleEvent handleUdpIpData)
source.Kernel.add_UdpIpSendIPV6(handleEvent handleUdpIp6Data)


let createEtwHandler () =
{
KernelFlags = NtKeywords.NetworkTCPIP
KernelStackFlags = NtKeywords.NetworkTCPIP
KernelRundownFlags = NtKeywords.None
Providers = Array.empty<EtwEventProvider>
Initialize =
fun (broadcast) -> ({
Broadcast = broadcast
} :> obj)
Subscribe = subscribe
}

4 changes: 3 additions & 1 deletion wtrace.cmd/Program.fs
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ Options:
registry - to receive Registry events (voluminous, disabled by default)
rpc - to receive RPC events
tcp - to receive TCP/IP events
udp - to receive UDP events
Example: --handlers 'tcp,file,registry'
Expand Down Expand Up @@ -79,6 +80,7 @@ let parseHandlers args =
elif name >=< "registry" then Registry.createEtwHandler ()
elif name >=< "rpc" then Rpc.createEtwHandler ()
elif name >=< "tcp" then TcpIp.createEtwHandler ()
elif name >=< "udp" then UdpIp.createEtwHandler ()
else failwith (sprintf "Invalid handler name: '%s'" name)

try
Expand All @@ -96,7 +98,7 @@ let parseHandlers args =
| Failure msg -> Error msg

match args |> Map.tryFind "handlers" with
| None -> createHandlers "process,file,rpc,tcp"
| None -> createHandlers "process,file,rpc,tcp,udp"
| Some [ handler ] ->
if isSystemTrace args then
Error ("Handlers are not allowed in the system trace.")
Expand Down
1 change: 1 addition & 0 deletions wtrace.cmd/wtrace.cmd.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
<Compile Include="Events\IsrDpc.fs" />
<Compile Include="Events\Rpc.fs" />
<Compile Include="Events\TcpIp.fs" />
<Compile Include="Events\UdpIp.fs" />
<Compile Include="Tracing\Commons.fs" />
<Compile Include="Tracing\EtwTraceSession.fs" />
<Compile Include="Tracing\EventFilter.fs" />
Expand Down
4 changes: 2 additions & 2 deletions wtrace/wtrace.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
<RootNamespace>LowLevelDesign.WTrace</RootNamespace>
<Authors>Sebastian Solnica</Authors>
<Company>Sebastian Solnica (lowleveldesign.org)</Company>
<AssemblyVersion>3.0.0.0</AssemblyVersion>
<FileVersion>3.0.0.0</FileVersion>
<AssemblyVersion>3.1.0.0</AssemblyVersion>
<FileVersion>3.1.0.0</FileVersion>
<SatelliteResourceLanguages>en</SatelliteResourceLanguages>
<OutputPath>..\bin\wtrace</OutputPath>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
Expand Down

0 comments on commit e23100a

Please sign in to comment.