mdns.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package ice
  2. import (
  3. "net"
  4. "github.com/google/uuid"
  5. "github.com/pion/logging"
  6. "github.com/pion/mdns"
  7. "golang.org/x/net/ipv4"
  8. )
  9. // MulticastDNSMode represents the different Multicast modes ICE can run in
  10. type MulticastDNSMode byte
  11. // MulticastDNSMode enum
  12. const (
  13. // MulticastDNSModeDisabled means remote mDNS candidates will be discarded, and local host candidates will use IPs
  14. MulticastDNSModeDisabled MulticastDNSMode = iota + 1
  15. // MulticastDNSModeQueryOnly means remote mDNS candidates will be accepted, and local host candidates will use IPs
  16. MulticastDNSModeQueryOnly
  17. // MulticastDNSModeQueryAndGather means remote mDNS candidates will be accepted, and local host candidates will use mDNS
  18. MulticastDNSModeQueryAndGather
  19. )
  20. func generateMulticastDNSName() (string, error) {
  21. // https://tools.ietf.org/id/draft-ietf-rtcweb-mdns-ice-candidates-02.html#gathering
  22. // The unique name MUST consist of a version 4 UUID as defined in [RFC4122], followed by “.local”.
  23. u, err := uuid.NewRandom()
  24. return u.String() + ".local", err
  25. }
  26. func createMulticastDNS(mDNSMode MulticastDNSMode, mDNSName string, log logging.LeveledLogger) (*mdns.Conn, MulticastDNSMode, error) {
  27. if mDNSMode == MulticastDNSModeDisabled {
  28. return nil, mDNSMode, nil
  29. }
  30. addr, mdnsErr := net.ResolveUDPAddr("udp4", mdns.DefaultAddress)
  31. if mdnsErr != nil {
  32. return nil, mDNSMode, mdnsErr
  33. }
  34. l, mdnsErr := net.ListenUDP("udp4", addr)
  35. if mdnsErr != nil {
  36. // If ICE fails to start MulticastDNS server just warn the user and continue
  37. log.Errorf("Failed to enable mDNS, continuing in mDNS disabled mode: (%s)", mdnsErr)
  38. return nil, MulticastDNSModeDisabled, nil
  39. }
  40. switch mDNSMode {
  41. case MulticastDNSModeQueryOnly:
  42. conn, err := mdns.Server(ipv4.NewPacketConn(l), &mdns.Config{})
  43. return conn, mDNSMode, err
  44. case MulticastDNSModeQueryAndGather:
  45. conn, err := mdns.Server(ipv4.NewPacketConn(l), &mdns.Config{
  46. LocalNames: []string{mDNSName},
  47. })
  48. return conn, mDNSMode, err
  49. default:
  50. return nil, mDNSMode, nil
  51. }
  52. }