xref: /aosp_15_r20/external/openscreen/osp/go/mdns.go (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
1*3f982cf4SFabien Sanglard// Copyright 2018 The Chromium Authors. All rights reserved.
2*3f982cf4SFabien Sanglard// Use of this source code is governed by a BSD-style license that can be
3*3f982cf4SFabien Sanglard// found in the LICENSE file.
4*3f982cf4SFabien Sanglard
5*3f982cf4SFabien Sanglardpackage osp
6*3f982cf4SFabien Sanglard
7*3f982cf4SFabien Sanglard// TODO(jophba):
8*3f982cf4SFabien Sanglard// - Make our own abstraction that has
9*3f982cf4SFabien Sanglard//   .InstanceName, .HostName, .MetadataVersion, .FingerPrint
10*3f982cf4SFabien Sanglard//   rather than using mdns.ServiceEntry
11*3f982cf4SFabien Sanglard// - Advertise TXT (text below) with "fp" and "mv"
12*3f982cf4SFabien Sanglard
13*3f982cf4SFabien Sanglardimport (
14*3f982cf4SFabien Sanglard	"context"
15*3f982cf4SFabien Sanglard
16*3f982cf4SFabien Sanglard	mdns "github.com/grandcat/zeroconf"
17*3f982cf4SFabien Sanglard)
18*3f982cf4SFabien Sanglard
19*3f982cf4SFabien Sanglardconst (
20*3f982cf4SFabien Sanglard	MdnsServiceType = "_openscreen._udp"
21*3f982cf4SFabien Sanglard	MdnsDomain      = "local"
22*3f982cf4SFabien Sanglard)
23*3f982cf4SFabien Sanglard
24*3f982cf4SFabien Sanglard// Returns a channel of mDNS entries.  The critical parts are
25*3f982cf4SFabien Sanglard// entry.Target (service name) entry.HostName, entry.AddrIPv4, and
26*3f982cf4SFabien Sanglard// entry.AddrIPv6.
27*3f982cf4SFabien Sanglardfunc BrowseMdns(ctx context.Context) (<-chan *mdns.ServiceEntry, error) {
28*3f982cf4SFabien Sanglard	entries := make(chan *mdns.ServiceEntry)
29*3f982cf4SFabien Sanglard
30*3f982cf4SFabien Sanglard	resolver, err := mdns.NewResolver(nil)
31*3f982cf4SFabien Sanglard	if err != nil {
32*3f982cf4SFabien Sanglard		return entries, err
33*3f982cf4SFabien Sanglard	}
34*3f982cf4SFabien Sanglard
35*3f982cf4SFabien Sanglard	err = resolver.Browse(ctx, MdnsServiceType, MdnsDomain, entries)
36*3f982cf4SFabien Sanglard	return entries, err
37*3f982cf4SFabien Sanglard}
38*3f982cf4SFabien Sanglard
39*3f982cf4SFabien Sanglard// Returns a channel of mDNS entries. The critical parts are,
40*3f982cf4SFabien Sanglard// entry.HostName, entry.AddrIPv4, and entry.AddrIPv6.
41*3f982cf4SFabien Sanglardfunc LookupMdns(ctx context.Context, target string) (<-chan *mdns.ServiceEntry, error) {
42*3f982cf4SFabien Sanglard	entries := make(chan *mdns.ServiceEntry)
43*3f982cf4SFabien Sanglard
44*3f982cf4SFabien Sanglard	resolver, err := mdns.NewResolver(nil)
45*3f982cf4SFabien Sanglard	if err != nil {
46*3f982cf4SFabien Sanglard		return entries, err
47*3f982cf4SFabien Sanglard	}
48*3f982cf4SFabien Sanglard
49*3f982cf4SFabien Sanglard	err = resolver.Lookup(ctx, target, MdnsServiceType, MdnsDomain, entries)
50*3f982cf4SFabien Sanglard	return entries, err
51*3f982cf4SFabien Sanglard}
52*3f982cf4SFabien Sanglard
53*3f982cf4SFabien Sanglardfunc RunMdnsServer(ctx context.Context, instance string, port int) error {
54*3f982cf4SFabien Sanglard	var text []string
55*3f982cf4SFabien Sanglard	server, err := mdns.Register(instance, MdnsServiceType, MdnsDomain, port, text, nil /* ifaces */)
56*3f982cf4SFabien Sanglard	if err != nil {
57*3f982cf4SFabien Sanglard		return err
58*3f982cf4SFabien Sanglard	}
59*3f982cf4SFabien Sanglard	waitUntilDone(ctx)
60*3f982cf4SFabien Sanglard	server.Shutdown()
61*3f982cf4SFabien Sanglard	return nil
62*3f982cf4SFabien Sanglard}
63