Skip to content

Telemetry Specification

Hyperion XDP exports structured telemetry via a 40-byte hyp_event struct pushed through a zero-copy lockless ring buffer.


CodeTypeDescription
0ACCEPTPacket passed all filters and was forwarded to the stack
1DROPPacket matched a signature rule and was dropped at the NIC
2SIG_MATCHPayload signature match detected (emitted before DROP)

Offset Size Field Description
+0 1B event_type 0=ACCEPT, 1=DROP, 2=SIG_MATCH
+1 3B _pad1 Padding for alignment
+4 4B src_ip Source IP (network byte order)
+8 4B dst_ip Destination IP (network byte order)
+12 2B src_port Source port (network byte order)
+14 2B dst_port Destination port (network byte order)
+16 1B protocol IP protocol (6=TCP, 17=UDP)
+17 7B _pad2 Padding for 8-byte alignment
+24 8B timestamp bpf_ktime_get_ns() — nanoseconds since boot
+32 8B signature Matched signature payload (null-padded)
+40 -- END Total: 40 bytes

BufferTypeSizeEvent StructPurpose
telemetry_ringbufBPF_MAP_TYPE_RINGBUF64KBhyp_event (40B)Primary M5 telemetry
alert_ringbufBPF_MAP_TYPE_RINGBUF16KBevent_t (24B)Legacy DROP alerts

bpf_ktime_get_ns() returns nanoseconds since boot, not Unix epoch. The Go control plane converts:

func calculateBootTimeOffset() error {
data, _ := os.ReadFile("/proc/uptime")
var uptimeSeconds float64
fmt.Sscanf(string(data), "%f", &uptimeSeconds)
bootTimeNs := int64(uptimeSeconds * 1e9)
bootTimeOffset = time.Now().UnixNano() - bootTimeNs
return nil
}

[2026-05-25 11:42:03] ACCEPT 127.0.0.1:58234 -> 127.0.0.1:8080 TCP
[2026-05-25 11:42:03] SIG_MATCH 127.0.0.1:58234 -> 127.0.0.1:8080 TCP sig="hack"
[2026-05-25 11:42:03] DROP 127.0.0.1:58234 -> 127.0.0.1:8080 TCP sig="hack"