FNE Setup & Configuration
What is the role of the FNE?
- A network "core", this provides a central server for
dvmhost
instances to connect to and be networked with, allowing relay of traffic and other data betweendvmhost
instances and otherdvmfne
instances. See configuration to configure.
Prerequisites
- A workstation, server, or virtual machine running Linux to act as the FNE.
- This guide will showcase a remote VPS running Debian 12 (Bookworm).
- An open port for the hotspot devices to connect to
- This guide is using the default port: 62031
- A site-to-site VPN could also be established from the hotspot to the VPS negating the need for an exposed port; this guide will not be covering that topology at this time.
- The
dvmfne
binary from the latestdvmhost
release for your CPU architecture.- At the time of writing, R04H31 2025-05-25 was the latest release.
Connect to the VPS & Download The dvmhost
Release For Your CPU Architecture
- Download the archive from the DVMProject GitHub
ssh user@remotevps
cd /opt/
sudo wget https://github.com/DVMProject/dvmhost/releases/download/2025-05-25/dvmhost-2025-05-25-amd64.tar.gz
- Extract & remove the archive
sudo tar zxvf dvmhost-2025-05-25-amd64.tar.gz
# Optional step
sudo rm /opt/dvmhost-2025-05-25-amd64.tar.gz
Organize the /opt/dvm
working directory
cd /opt/dvm/
sudo mkdir /opt/dvm/examples/
sudo mv /opt/dvm/*.example.* /opt/dvm/examples/
Copy the base configuration file to the /opt/dvm
working directory.
sudo cp /opt/dvm/examples/fne-config.example.yml /opt/dvm/fne-config.yml
Define the settings for P25 communication in fne-config.yml
sudo nano /opt/dvm/fne-config.yml
These dotted paths below represent nodes within the YAML syntax of fne-config.yml
- log.filePath: /opt/dvm/log
- log.activityFilePath: /opt/dvm/log
- master.peerId: 1234567
- master.password: 00AABBCCDDEEFF112233445566778899
- master.allowDMRTraffic: false
- master.allowP25Traffic: true
- master.allowNXDNTraffic: false
- master.parrotGrantDemand: true
- parrotOnlyToOrginiatingPeer: true This typo is present in the live config
- master.talkgroup_rules.file: /opt/dvm/rules/talkgroup_rules.yml
- system.radio_id.file: /opt/dvm/rules/rid_acl.dat
Copy the following example configurations as live versions.
sudo mkdir /opt/dvm/rules/
sudo cp /opt/dvm/examples/rid_acl.example.dat /opt/dvm/rules/rid_acl.dat
sudo cp /opt/dvm/examples/talkgroup_rules.example.yml /opt/dvm/rules/talkgroup_rules.yml
sudo cp /opt/dvm/examples/peer_list.example.dat /opt/dvm/rules/peer_list.dat
Populate radio_acl.dat
sudo nano /opt/dvm/rules/radio_acl.dat
#
# This file sets the valid Radio IDs allowed on a repeater.
#
# Entry Format: "RID,Enabled (1 = Enabled / 0 = Disabled),Optional Alias,Optional IP Address,<newline>"
#
#1234,1,RID Alias,IP Address,
5432,1,Name-Of-User-1,
9999,1,Name-Of-User-2,
4321,1,Name-Of-User-3,
[ensure-to-leave-a-new-line-at-the-end]
Populate peer_list.dat
sudo nano /opt/dvm/rules/peer_list.dat
#
# This file sets the valid peer IDs allowed on a FNE.
#
# Entry Format: "Peer ID,Peer Password,Peer Link (1 = Enabled / 0 = Disabled),Peer Alias (optional),Can Request Keys (1 = Enabled / 0 = Disabled),<newline>"
1234567,99887766554433221100FFEEDDCCBBAA,1,NAME-1,1,
7654321,99887766554433221100FFEEDDCCBBAA,1,NAME-2,1,
[ensure-to-leave-a-new-line-at-the-end]
#1234,,0,,1,
#5678,MYSECUREPASSWORD,0,,0,
#9876,MYSECUREPASSWORD,1,,0,
#5432,MYSECUREPASSWORD,,Peer Alias 1,0,
#1012,MYSECUREPASSWORD,1,Peer Alias 2,1,
Populate talkgroup_rules.yml
sudo nano /opt/dvm/rules/talkgroup_rules.yml
These dotted paths below represent nodes within the YAML syntax of talkgroup_rules.yml
- Primary Channel
- groupVoice.name: MYTGNAME
- groupVoice.alias: MYTGNAME
- groupVoice.config.active: true
- groupVoice.source.tgid: 12345
- Parrot Channel
- groupVoice.name: MYPARROTTG
- groupVoice.alias: MYPARROTTG
- groupVoice.config.active: true
- groupVoice.config.parrot: true
- groupVoice.source.tgid: 54321
Start the FNE daemon
sudo /opt/dvm/start-dvm-fne.sh fne-config.yml
Log Entry Examples
Peer Connecting
I: (NET) PEER 1234567 started login from, 192.168.100.100:32960
I: (NET) PEER 1234567 RPTL ACK, challenge response sent for login
I: (NET) PEER 1234567 RPTK ACK, completed the login exchange
I: (NET) PEER 1234567 RPTC ACK, completed the configuration exchange
I: (NET) PEER 1234567 reports identity [IDENTITY]
I: (NET) PEER 1234567 reports software DVM_R04H31
I: (NET) PEER 1234567 (IDENTITY) sending ACL list updates
U: 001234567 ( IDENTITY) M: 2025-06-06 01:16:05.775 (NET) PEER 1234567 RPTC ACK, master commanded alternate port for diagnostics and activity logging, remotePeerId = 9039148
U: 001234567 ( IDENTITY) I: 2025-06-06 01:16:10.717 (HOST) Host is running on a hotspot modem! Fixed mode is forced.
U: 001234567 ( IDENTITY) M: 2025-06-06 01:16:10.717 (HOST) [ OK ] host:rpc
U: 001234567 ( IDENTITY) M: 2025-06-06 01:16:10.718 (HOST) [ OK ] host:watchdog
U: 001234567 ( IDENTITY) M: 2025-06-06 01:16:10.718 (HOST) [ OK ] host:modem
U: 001234567 ( IDENTITY) M: 2025-06-06 01:16:10.719 (HOST) [ OK ] p25d:frame-r
U: 001234567 ( IDENTITY) M: 2025-06-06 01:16:10.719 (HOST) [ OK ] p25d:frame-w
U: 001234567 ( IDENTITY) I: 2025-06-06 01:16:10.720 (HOST) [ OK ] Host is up and running on Linux 6.12.25+rpt-rpi-v7 armv7l
U: 001234567 ( IDENTITY) M: 2025-06-06 01:16:10.720 (HOST) [ OK ] host:site-data
I: (NET) PEER 1234567 (IDENTITY) ping, pingsReceived = 1, lastPing = 1135288524, now = 1135298546
U: 001234567 ( IDENTITY) W: 2025-06-06 01:16:15.799 (NET) PEER 1234567 pong, time delay greater than 360ms, now = 1749186975799, server = 1749186988018, dt = 12219
Peer Disconnecting
I: (NET) PEER 1234567 (IDENTITY) disconnected
Parrot Communication
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:26:39.149 (RF) P25, HDU (Header Data Unit), dstId = 38002, algo = $80, kid = $0000
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:26:39.150 (RF) P25, LDU1 (Logical Link Data Unit 1), audio, mfId = $00 srcId = 3820, dstId = 38002, group = 1, emerg = 0, encrypt = 0, prio = 4, errs = 2/1233 (0.2%)
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:26:39.329 (RF) P25, LDU2 (Logical Link Data Unit 2), audio, algo = $80, kid = $0000, errs = 1/1233 (0.1%)
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:26:39.508 (RF) P25, LDU1 (Logical Link Data Unit 1), audio, mfId = $00 srcId = 3820, dstId = 38002, group = 1, emerg = 0, encrypt = 0, prio = 4, errs = 2/1233 (0.2%)
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:26:39.687 (RF) P25, LDU2 (Logical Link Data Unit 2), audio, algo = $80, kid = $0000, errs = 1/1233 (0.1%)
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:26:39.872 (RF) P25, LDU1 (Logical Link Data Unit 1), audio, mfId = $00 srcId = 3820, dstId = 38002, group = 1, emerg = 0, encrypt = 0, prio = 4, errs = 6/1233 (0.5%)
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:26:40.051 (RF) P25, LDU2 (Logical Link Data Unit 2), audio, algo = $80, kid = $0000, errs = 7/1233 (0.6%)
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:26:40.230 (RF) P25, LDU1 (Logical Link Data Unit 1), audio, mfId = $00 srcId = 3820, dstId = 38002, group = 1, emerg = 0, encrypt = 0, prio = 4, errs = 0/1233 (0.0%)
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:26:40.409 (RF) P25, LDU2 (Logical Link Data Unit 2), audio, algo = $80, kid = $0000, errs = 0/1233 (0.0%)
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:26:40.588 (RF) P25, LDU1 (Logical Link Data Unit 1), audio, mfId = $00 srcId = 3820, dstId = 38002, group = 1, emerg = 0, encrypt = 0, prio = 4, errs = 2/1233 (0.2%)
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:26:40.772 (RF) P25, LDU2 (Logical Link Data Unit 2), audio, algo = $80, kid = $0000, errs = 1/1233 (0.1%)
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:26:40.951 (RF) P25, LDU1 (Logical Link Data Unit 1), audio, mfId = $00 srcId = 3820, dstId = 38002, group = 1, emerg = 0, encrypt = 0, prio = 4, errs = 1/1233 (0.1%)
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:26:41.130 (RF) P25, LDU2 (Logical Link Data Unit 2), audio, algo = $80, kid = $0000, errs = 2/1233 (0.2%)
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:26:41.309 (RF) P25, LDU1 (Logical Link Data Unit 1), audio, mfId = $00 srcId = 3820, dstId = 38002, group = 1, emerg = 0, encrypt = 0, prio = 4, errs = 0/1233 (0.0%)
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:26:41.488 (RF) P25, LDU2 (Logical Link Data Unit 2), audio, algo = $80, kid = $0000, errs = 5/1233 (0.4%)
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:26:41.668 (RF) P25, LDU1 (Logical Link Data Unit 1), audio, mfId = $00 srcId = 3820, dstId = 38002, group = 1, emerg = 0, encrypt = 0, prio = 4, errs = 1/1233 (0.1%)
M: (NET) P25, Parrot Playback will Start, peer = 9039148, srcId = 3820
M: (NET) P25, Call End, peer = 9039148, srcId = 3820, dstId = 38002, duration = 2, streamId = 3063698845, external = 0
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:26:41.673 (RF) P25, TDU (Simple Terminator Data Unit), total frames: 15, bits: 18496, undecodable LC: 0, errors: 31, BER: 0.1676%
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:26:41.707 (RF) P25, TDULC (Terminator Data Unit with Link Control), CALL_TERM (Call Termination), srcId = 3820, dstId = 38002
I: (NET) PEER 9039148 (IDENTITY) ping, pingsReceived = 2860, lastPing = 1200712208, now = 1200713943
M: (NET) P25, Parrot Grant Demand, peer = 9039148, srcId = 3820, dstId = 38002
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:26:43.883 (NET) P25, HDU (Header Data Unit), dstId = 38002, algo = $80, kid = $0000
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:26:43.884 (NET) P25, LDU1 (Logical Link Data Unit 1) audio, mfId = $00, srcId = 3820, dstId = 38002, group = 1, emerg = 0, encrypt = 0, prio = 4, sysId = $001, netId = $BB800
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:26:43.884 (NET) P25, LDU2 (Logical Link Data Unit 2) audio, algo = $80, kid = $0000
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:26:44.058 (NET) P25, LDU1 (Logical Link Data Unit 1) audio, mfId = $00, srcId = 3820, dstId = 38002, group = 1, emerg = 0, encrypt = 0, prio = 4, sysId = $001, netId = $BB800
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:26:44.242 (NET) P25, LDU2 (Logical Link Data Unit 2) audio, algo = $80, kid = $0000
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:26:44.467 (NET) P25, LDU1 (Logical Link Data Unit 1) audio, mfId = $00, srcId = 3820, dstId = 38002, group = 1, emerg = 0, encrypt = 0, prio = 4, sysId = $001, netId = $BB800
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:26:44.595 (NET) P25, LDU2 (Logical Link Data Unit 2) audio, algo = $80, kid = $0000
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:26:44.774 (NET) P25, LDU1 (Logical Link Data Unit 1) audio, mfId = $00, srcId = 3820, dstId = 38002, group = 1, emerg = 0, encrypt = 0, prio = 4, sysId = $001, netId = $BB800
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:26:44.959 (NET) P25, LDU2 (Logical Link Data Unit 2) audio, algo = $80, kid = $0000
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:26:45.143 (NET) P25, LDU1 (Logical Link Data Unit 1) audio, mfId = $00, srcId = 3820, dstId = 38002, group = 1, emerg = 0, encrypt = 0, prio = 4, sysId = $001, netId = $BB800
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:26:45.317 (NET) P25, LDU2 (Logical Link Data Unit 2) audio, algo = $80, kid = $0000
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:26:45.501 (NET) P25, LDU1 (Logical Link Data Unit 1) audio, mfId = $00, srcId = 3820, dstId = 38002, group = 1, emerg = 0, encrypt = 0, prio = 4, sysId = $001, netId = $BB800
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:26:45.680 (NET) P25, LDU2 (Logical Link Data Unit 2) audio, algo = $80, kid = $0000
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:26:45.879 (NET) P25, LDU1 (Logical Link Data Unit 1) audio, mfId = $00, srcId = 3820, dstId = 38002, group = 1, emerg = 0, encrypt = 0, prio = 4, sysId = $001, netId = $BB800
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:26:46.037 (NET) P25, LDU2 (Logical Link Data Unit 2) audio, algo = $80, kid = $0000
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:26:46.409 (NET) P25, LDU1 (Logical Link Data Unit 1) audio, mfId = $00, srcId = 3820, dstId = 38002, group = 1, emerg = 0, encrypt = 0, prio = 4, sysId = $001, netId = $BB800
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:26:46.415 (NET) P25, TDU (Simple Terminator Data Unit), srcId = 3820
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:26:46.547 (RF) P25, TDULC (Terminator Data Unit with Link Control), CALL_TERM (Call Termination), srcId = 3820, dstId = 38002
E: (NET) PEER 9000990, retrying master login, remotePeerId = 0
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:26:48.406 (NET) talkgroup hang has expired, lastDstId = 38002
Talkgroup Communication
[COMING SOON]
Talkgroup Communication (Encrypted)
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:28:13.439 (RF) P25, HDU (Header Data Unit), dstId = 38001, algo = $84, kid = $0003
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:28:13.440 (RF) P25, LDU1 (Logical Link Data Unit 1), audio, mfId = $00 srcId = 3820, dstId = 38001, group = 1, emerg = 0, encrypt = 1, prio = 4, errs = 0/1233 (0.0%)
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:28:13.618 (RF) P25, LDU2 (Logical Link Data Unit 2), audio, algo = $84, kid = $0003, errs = 1/1233 (0.1%)
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:28:13.619 (RF) P25, LDU2 (Logical Link Data Unit 2), Enc Sync, MI = C1 7C 1E 45 F0 F6 94 44 00
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:28:13.798 (RF) P25, LDU1 (Logical Link Data Unit 1), audio, mfId = $00 srcId = 3820, dstId = 38001, group = 1, emerg = 0, encrypt = 1, prio = 4, errs = 0/1233 (0.0%)
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:28:13.977 (RF) P25, LDU2 (Logical Link Data Unit 2), audio, algo = $84, kid = $0003, errs = 3/1233 (0.2%)
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:28:13.978 (RF) P25, LDU2 (Logical Link Data Unit 2), Enc Sync, MI = 9C 03 CE 4D 6C AD AA 96 00
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:28:14.157 (RF) P25, LDU1 (Logical Link Data Unit 1), audio, mfId = $00 srcId = 3820, dstId = 38001, group = 1, emerg = 0, encrypt = 1, prio = 4, errs = 2/1233 (0.2%)
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:28:14.341 (RF) P25, LDU2 (Logical Link Data Unit 2), Enc Sync, MI = 20 12 E1 85 ED 94 20 96 00
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:28:14.341 (RF) P25, LDU2 (Logical Link Data Unit 2), audio, algo = $84, kid = $0003, errs = 8/1233 (0.6%)
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:28:14.520 (RF) P25, LDU1 (Logical Link Data Unit 1), audio, mfId = $00 srcId = 3820, dstId = 38001, group = 1, emerg = 0, encrypt = 1, prio = 4, errs = 2/1233 (0.2%)
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:28:14.699 (RF) P25, LDU2 (Logical Link Data Unit 2), audio, algo = $84, kid = $0003, errs = 3/1233 (0.2%)
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:28:14.700 (RF) P25, LDU2 (Logical Link Data Unit 2), Enc Sync, MI = C2 51 17 3A E6 C1 C5 0A 00
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:28:14.878 (RF) P25, LDU1 (Logical Link Data Unit 1), audio, mfId = $00 srcId = 3820, dstId = 38001, group = 1, emerg = 0, encrypt = 1, prio = 4, errs = 4/1233 (0.3%)
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:28:15.057 (RF) P25, LDU2 (Logical Link Data Unit 2), audio, algo = $84, kid = $0003, errs = 2/1233 (0.2%)
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:28:15.058 (RF) P25, LDU2 (Logical Link Data Unit 2), Enc Sync, MI = 2E 49 2A 15 DC 59 B6 A6 00
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:28:15.236 (RF) P25, LDU1 (Logical Link Data Unit 1), audio, mfId = $00 srcId = 3820, dstId = 38001, group = 1, emerg = 0, encrypt = 1, prio = 4, errs = 3/1233 (0.2%)
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:28:15.420 (RF) P25, LDU2 (Logical Link Data Unit 2), audio, algo = $84, kid = $0003, errs = 1/1233 (0.1%)
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:28:15.421 (RF) P25, LDU2 (Logical Link Data Unit 2), Enc Sync, MI = 8E 30 5D 4F 91 09 1E 68 00
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:28:15.600 (RF) P25, LDU1 (Logical Link Data Unit 1), audio, mfId = $00 srcId = 3820, dstId = 38001, group = 1, emerg = 0, encrypt = 1, prio = 4, errs = 3/1233 (0.2%)
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:28:15.779 (RF) P25, LDU2 (Logical Link Data Unit 2), audio, algo = $84, kid = $0003, errs = 4/1233 (0.3%)
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:28:15.779 (RF) P25, LDU2 (Logical Link Data Unit 2), Enc Sync, MI = E0 79 45 C2 8B A2 AC 2D 00
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:28:15.958 (RF) P25, LDU1 (Logical Link Data Unit 1), audio, mfId = $00 srcId = 3820, dstId = 38001, group = 1, emerg = 0, encrypt = 1, prio = 4, errs = 5/1233 (0.4%)
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:28:16.137 (RF) P25, LDU2 (Logical Link Data Unit 2), audio, algo = $84, kid = $0003, errs = 8/1233 (0.6%)
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:28:16.138 (RF) P25, LDU2 (Logical Link Data Unit 2), Enc Sync, MI = 50 B7 D2 37 12 4B E3 7A 00
M: (NET) P25, Call End, peer = 9039148, srcId = 3820, dstId = 38001, duration = 2, streamId = 746414736, external = 0
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:28:16.143 (RF) P25, TDU (Simple Terminator Data Unit), total frames: 16, bits: 19729, undecodable LC: 0, errors: 49, BER: 0.2484%
U: PEER-ID ( IDENTITY) M: 2025-06-06 19:28:16.151 (RF) P25, TDULC (Terminator Data Unit with Link Control), CALL_TERM (Call Termination), srcId = 3820, dstId = 38001