diff --git a/internal/clientinfo/merlin.go b/internal/clientinfo/merlin.go index 8a39398f..8cd679d4 100644 --- a/internal/clientinfo/merlin.go +++ b/internal/clientinfo/merlin.go @@ -60,7 +60,10 @@ func (m *merlinDiscover) parseMerlinCustomClientList(data string) { if len(parts) < 2 || len(parts[0]) == 0 || len(parts[1]) == 0 { continue } - hostname := normalizeHostname(parts[0]) + // custom_clientlist stores user-defined display names, not DNS hostnames. + // Preserve them verbatim so dots in friendly names (for example, + // "Device 2.5Gbps") are not mistaken for DNS suffix separators. + hostname := parts[0] mac := strings.ToLower(parts[1]) m.hostname.Store(mac, hostname) } diff --git a/internal/clientinfo/merlin_test.go b/internal/clientinfo/merlin_test.go index 0437035a..6f9674a1 100644 --- a/internal/clientinfo/merlin_test.go +++ b/internal/clientinfo/merlin_test.go @@ -26,6 +26,13 @@ func TestParseMerlinCustomClientList(t *testing.T) { []string{"client1", "client2"}, nil, }, + { + "dotted friendly name", + "00:11:22:33:44:55>0>4>>", + []string{"00:11:22:33:44:55"}, + []string{"Device 2.5Gbps"}, + nil, + }, { "empty hostname", "00:00:00:00:00:01>0>4>><>00:00:00:00:00:02>0>24>>",