summaryrefslogtreecommitdiff
path: root/vendor/github.com/pion/ice/v2/mdns.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/pion/ice/v2/mdns.go')
-rw-r--r--vendor/github.com/pion/ice/v2/mdns.go63
1 files changed, 63 insertions, 0 deletions
diff --git a/vendor/github.com/pion/ice/v2/mdns.go b/vendor/github.com/pion/ice/v2/mdns.go
new file mode 100644
index 0000000..5a431d1
--- /dev/null
+++ b/vendor/github.com/pion/ice/v2/mdns.go
@@ -0,0 +1,63 @@
+package ice
+
+import (
+ "net"
+
+ "github.com/google/uuid"
+ "github.com/pion/logging"
+ "github.com/pion/mdns"
+ "golang.org/x/net/ipv4"
+)
+
+// MulticastDNSMode represents the different Multicast modes ICE can run in
+type MulticastDNSMode byte
+
+// MulticastDNSMode enum
+const (
+ // MulticastDNSModeDisabled means remote mDNS candidates will be discarded, and local host candidates will use IPs
+ MulticastDNSModeDisabled MulticastDNSMode = iota + 1
+
+ // MulticastDNSModeQueryOnly means remote mDNS candidates will be accepted, and local host candidates will use IPs
+ MulticastDNSModeQueryOnly
+
+ // MulticastDNSModeQueryAndGather means remote mDNS candidates will be accepted, and local host candidates will use mDNS
+ MulticastDNSModeQueryAndGather
+)
+
+func generateMulticastDNSName() (string, error) {
+ // https://tools.ietf.org/id/draft-ietf-rtcweb-mdns-ice-candidates-02.html#gathering
+ // The unique name MUST consist of a version 4 UUID as defined in [RFC4122], followed by “.local”.
+ u, err := uuid.NewRandom()
+ return u.String() + ".local", err
+}
+
+func createMulticastDNS(mDNSMode MulticastDNSMode, mDNSName string, log logging.LeveledLogger) (*mdns.Conn, MulticastDNSMode, error) {
+ if mDNSMode == MulticastDNSModeDisabled {
+ return nil, mDNSMode, nil
+ }
+
+ addr, mdnsErr := net.ResolveUDPAddr("udp4", mdns.DefaultAddress)
+ if mdnsErr != nil {
+ return nil, mDNSMode, mdnsErr
+ }
+
+ l, mdnsErr := net.ListenUDP("udp4", addr)
+ if mdnsErr != nil {
+ // If ICE fails to start MulticastDNS server just warn the user and continue
+ log.Errorf("Failed to enable mDNS, continuing in mDNS disabled mode: (%s)", mdnsErr)
+ return nil, MulticastDNSModeDisabled, nil
+ }
+
+ switch mDNSMode {
+ case MulticastDNSModeQueryOnly:
+ conn, err := mdns.Server(ipv4.NewPacketConn(l), &mdns.Config{})
+ return conn, mDNSMode, err
+ case MulticastDNSModeQueryAndGather:
+ conn, err := mdns.Server(ipv4.NewPacketConn(l), &mdns.Config{
+ LocalNames: []string{mDNSName},
+ })
+ return conn, mDNSMode, err
+ default:
+ return nil, mDNSMode, nil
+ }
+}