← RefCheck.Radio / Reflector Operator Guide

Why RefCheck says your reflector is down (and how to fix it)

RefCheck doesn't ping. It speaks each protocol's own management handshake, from a fixed source IP, before deciding a reflector is unreachable. This page is a per-protocol checklist for what your reflector needs to accept -- and the two or three misconfigurations that cause most false-downs.

10
protocols probed, each on its own wire format
3×5s
attempts (5s timeout, 2 retries) before a reflector is marked down
1
unreachable reflector = unpublished to every client using RefCheck-scrubbed hostfiles

Digital voice software increasingly pulls its hostfiles pre-scrubbed by RefCheck -- reflectors that fail our probe are removed before the list ever reaches an end user's radio or hotspot. That's the entire point: nobody should waste a QSO attempt on a dead reflector. It also means a reflector that's actually online but misconfigured against the probe quietly disappears from the DV community's view, which helps nobody.

Every check below is a real, protocol-native control message -- the same class of packet your own client software would send to link or query the reflector. If your reflector answers a real client, the fixes here are almost always a firewall rule, an access-control list, or a software update, not a redesign.

Before you post anywhere asking about it

A reflector's own operator is the only person who can fix why it's missing. Please don't post in WPSD, DVSwitch, or other downstream software's forums/groups asking "why isn't this reflector listed, please add it" -- that software doesn't generate its own hostfiles; it consumes RefCheck's already-scrubbed output, and its maintainers have no way to add anything back in.

Same goes for DVRef.com -- they're the upstream submission database RefCheck reads from, not the check that removes a listing. They can't control what RefCheck's probes decide.

If a reflector you use is missing, send this page to its operator. Once it passes the checks below, it reappears automatically at RefCheck's next sync -- everywhere, with no request needed.

YSF, P25, NXDN & M17: this also gates your DVRef listing

For these four modes only, DVRef.com uses the RefCheck API to validate reflectors -- both when you first register one and on its own periodic re-checks. If RefCheck reports the reflector down, or the check times out (HTTP 408), DVRef will not pass it into its registry. That means the reflector never becomes available for any downstream consumer in the first place, not just RefCheck's own scrubbed hostfiles.

The check DVRef relies on is the identical one described below for your mode, so there's nothing separate to fix -- get your reflector answering the probe and both DVRef registration and RefCheck's hostfiles clear at once.

What every protocol needs from you

Four things are shared across all ten checks. Get these right first -- most single-protocol failures trace back to one of them.

Allow our source IP

Probes originate from 74.208.60.144. Don't null-route, rate-limit, or geo-block it -- some DDoS/flood shields silently drop the first unsolicited UDP packet from an unfamiliar IP, which looks identical to "reflector down."

Whitelist our identity

Callsign RFCKRD0 (fallback W0CHP) for D-Star/YSF/M17/NXDN/P25/FCS checks; DMR ID 3226479 for DMR's subscriber ACL. XLX doesn't need whitelisting -- see the XLX note below.

Implement the control message

Each protocol below is a specific management packet, not a ping. Reflector software that only relays voice traffic and never implements the poll/link opcode will never answer -- regardless of firewalling.

Reply within 5 seconds

Each probe gets up to 3 attempts -- a 5-second timeout, then 2 retries. A reflector only needs to answer once in that window to be marked up; consistent multi-second lag across all 3 attempts is what reads as down.

YSF

System FusionAlso gates DVRef listing

No identity required -- the reflector's status beacon does the talking.

We sendYSFS
ReflectorYSFS + hostname + client count = UP
We sendYSFU (unlink, cleanup only)
Common failure

Port never reachable -- a firewall or NAT rule blocks inbound UDP on the port published in your hostfile entry, full stop.

Fix

Confirm UDP is open on that exact port from 74.208.60.144, not just from LAN/known client ranges.

NXDN

ICOM/Kenwood digitalAlso gates DVRef listing

Poll targets the same talkgroup published in the hostfile.

We sendNXDNP + RFCKRD0 + target TG
Reflector17-byte reply, same 5-byte prefix = UP
We sendNXDNU (unlink)
Common failure

Hostfile TG doesn't match what the reflector is actually configured to answer on, so the poll lands on the wrong group.

Fix

Verify the TG in your published hostfile entry matches your reflector config exactly.

P25

Project 25Also gates DVRef listing

Single-byte opcode poll, same shape as NXDN's.

We send0xF0 + RFCKRD0
Reflector11-byte reply starting 0xF0 = UP
We send0xF1 (unlink)
Common failure

Same as NXDN: reflector software that never implements the poll opcode, only voice relay.

Fix

Update to a reflector build that answers 0xF0 polls (most DVSwitch/USRP-bridge stacks do out of the box).

M17

Open-source digital voiceAlso gates DVRef listing

The one protocol where an outdated reflector build is the single most common cause of a false-down. Covers both mrefd and urfd (URF) reflectors -- both speak the same LSTN handshake.

We sendLSTN + base-40(RFCKRD0) + module A
ReflectorACKN or NACK -- either one = UP
We sendDISC (cleanup)
Common failure

LSTN is a reflector-management poll, not a voice frame -- older M17 reflector daemons built before this was standardized never reply to it, even while happily passing real traffic between connected clients.

Fix

Update to a current mrefd / urfd build. If you're not sure your version supports LSTN, that's almost certainly why you're listed down.

DMR

Homebrew protocol

A real repeater-login handshake -- and the one where "rejected" and "down" are easy to confuse.

We sendRPTL + DMR ID 3226479
ReflectorRPTACK + 4-byte salt
We sendRPTK + ID + SHA-256(salt)
ReflectorRPTACK or MSTNAK -- either = UP
We sendRPTCL (clean close)
Common failure

Being rejected isn't what marks a reflector down -- an MSTNAK, or even silence after the salt exchange, still proves the reflector is alive. The failure is step 1 getting no RPTACK at all: some DMR master builds (HBlink/FreeDMR-family ACLs especially) silently drop RPTL from an unrecognized ID instead of NAK-ing it.

Fix

Confirm ID 3226479 is present in your subscriber/ACL database, and that your ID-database refresh job is actually running. A stale local copy that predates our ID is, by far, the most common DMR false-down we see.

XLX (DMR interlink)

DMR Homebrew, XLX-side

Same RPTL/RPTK handshake as DMR above -- but on xlxd, this one isn't an ACL at all.

We sendSame RPTL → RPTACK+salt → RPTK → RPTACK/MSTNAK flow as DMR
Common failure

In xlxd's source, an incoming RPTL is only accepted once the DMR ID resolves to a callsign via the reflector's loaded ID directory (ccallsign.cpp: SetDmrid()g_DmridDir.FindCallsign()). If 3226479 isn't in that directory yet, the resulting callsign fails validation and the packet is silently dropped -- no NAK, just a timeout. There's no separate DMR whitelist file involved for this check.

Fix

Nothing to whitelist. Just keep your DMR ID directory syncing -- whether that's xlxd's built-in default source or your own daily job pulling radioid.net's export. A running sync will already carry 3226479, since it's a real registered ID reserved for, and granted to, RefCheck's operator.

D-Plus

D-Star

A two-stage handshake: a bare ping, then a full login.

We send5-byte ping
Reflector5-byte pong
We send28-byte login: RFCKRD0 + DV019999
ReflectorOK / OKRW / BUSY -- any = UP
Common failure

Reflector answers the ping (proving it's alive) but never completes the login stage -- still reads down, since the ping alone isn't enough.

Fix

Make sure both stages are handled by the running daemon; a partially-hung ircDDBGateway/DPlus process is a common cause here.

DExtra

D-Star

Single poll packet targeting the module published in the hostfile.

We sendRFCKRD0 + client module B + target module
ReflectorReply containing our callsign + ACK/NAK = UP
Common failure

Callsign-based access control silently discards the poll instead of replying with NAK.

Fix

Whitelist RFCKRD0 (or disable callsign gating for status polls specifically).

DCS

D-Star

A full LINK request, same as any D-Star client would send to join a module.

We sendLINK: RFCKRD0 + module + reflector name (519 bytes)
ReflectorACK / NAK / BB-formatted reply -- any = UP
We sendUNLINK (only if linked)
Common failure

Two reply formats exist in the wild (legacy and current DCS builds); reflector software stuck on a nonstandard third format won't be recognized.

Fix

A NAK is fine and still counts as up -- if you're seeing down, the LINK request itself is likely never reaching the daemon.

FCS

D-Star, room-based

Host and port are derived from the room ID itself -- fcs001.xreflector.net:62500, no separate lookup.

We sendPING: callsign + room ID
ReflectorBare 7- or 10-byte ACK = UP
We sendCLOSE (cleanup)
Common failure

One physical reflector hosts multiple rooms under one ID prefix -- if the reflector itself is down, every room under it goes down at once.

Fix

Confirm the base reflector process is running; room-level config rarely matters here.

The part worth repeating

A reachable-but-rejecting reflector (NAK, MSTNAK, BUSY) is treated as up by every check above. If you're seeing down, the packet almost never reached your reflector daemon at all -- look at firewalls, DDoS/flood protection, and ID/callsign ACLs before touching reflector config.

Verify it yourself, on demand

Every check above is exposed as a live API call -- the exact one RefCheck runs on its own schedule. Create a free access token -- self-service, a valid callsign is all it takes -- then query your own reflector directly, as many times as you need, until it comes back up:

# XLX example
curl -H "Authorization: Token <your-token>" \ "https://refcheck.radio/api/query/?mode=xlx&id=XLX001&dmr_id=1234567"