5 Commits

Author SHA1 Message Date
ad8a5c5b3e minor tweaks for go-micro mdns registry
* allow to receive multicast on the same host
  via multicast loopback flag
* export SendMulticast function, needed for async
  notification on registry updates

Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
2019-06-21 23:37:13 +03:00
2304dca2ca use net.ParseIP for ipv4 multicast addr
Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
2019-06-12 19:13:19 +03:00
Milos Gajdos
9decd6b803 Multipacket Known-Answer Suppression: Ignore some answers
We are setting Truncated bit to false when mDNS has a lot of queries as
Hashicorp fork does not handle the case when Truncated bit is set.
We are happy to do this for the time being until we fix the server later
on.
2019-06-04 18:09:26 +01:00
Asim Aslam
32c17f6b3e Merge pull request #11 from nikosk686/bugfix-ipv4-or-6-unavailability
Fixes new client or server creation failure when one of ipv4 or ipv6 is unavailable
2019-05-23 08:37:24 +01:00
Nikos Kitmeridis
a56f86575d Fixes new client or server creation failure when one of ipv4 or ipv6 is unavailable 2019-05-22 22:53:26 +03:00
2 changed files with 28 additions and 12 deletions

View File

@@ -191,6 +191,13 @@ func newClient() (*client, error) {
return nil, fmt.Errorf("failed to bind to any unicast udp port")
}
if uconn4 == nil {
uconn4 = &net.UDPConn{}
}
if uconn6 == nil {
uconn6 = &net.UDPConn{}
}
mconn4, err := net.ListenUDP("udp4", mdnsWildcardAddrIPv4)
if err != nil {
log.Printf("[ERR] mdns: Failed to bind to udp4 port: %v", err)
@@ -207,6 +214,9 @@ func newClient() (*client, error) {
p1 := ipv4.NewPacketConn(mconn4)
p2 := ipv6.NewPacketConn(mconn6)
p1.SetMulticastLoopback(true)
p2.SetMulticastLoopback(true)
ifaces, err := net.Interfaces()
if err != nil {
return nil, err

View File

@@ -14,7 +14,7 @@ import (
)
var (
mdnsGroupIPv4 = net.IPv4(224, 0, 0, 251)
mdnsGroupIPv4 = net.ParseIP("224.0.0.251")
mdnsGroupIPv6 = net.ParseIP("ff02::fb")
// mDNS wildcard addresses
@@ -73,6 +73,13 @@ func NewServer(config *Config) (*Server, error) {
return nil, fmt.Errorf("[ERR] mdns: Failed to bind to any udp port!")
}
if ipv4List == nil {
ipv4List = &net.UDPConn{}
}
if ipv6List == nil {
ipv6List = &net.UDPConn{}
}
// Join multicast groups to receive announcements
p1 := ipv4.NewPacketConn(ipv4List)
p2 := ipv6.NewPacketConn(ipv6List)
@@ -112,13 +119,8 @@ func NewServer(config *Config) (*Server, error) {
shutdownCh: make(chan struct{}),
}
if ipv4List != nil {
go s.recv(s.ipv4List)
}
if ipv6List != nil {
go s.recv(s.ipv6List)
}
go s.recv(s.ipv4List)
go s.recv(s.ipv6List)
s.wg.Add(1)
go s.probe()
@@ -180,6 +182,10 @@ func (s *Server) parsePacket(packet []byte, from net.Addr) error {
log.Printf("[ERR] mdns: Failed to unpack packet: %v", err)
return err
}
// TODO: This is a bit of a hack
// We decided to ignore some mDNS answers for the time being
// See: https://tools.ietf.org/html/rfc6762#section-7.2
msg.Truncated = false
return s.handleQuery(&msg, from)
}
@@ -352,7 +358,7 @@ func (s *Server) probe() {
randomizer := rand.New(rand.NewSource(time.Now().UnixNano()))
for i := 0; i < 3; i++ {
if err := s.multicastResponse(q); err != nil {
if err := s.SendMulticast(q); err != nil {
log.Println("[ERR] mdns: failed to send probe:", err.Error())
}
time.Sleep(time.Duration(randomizer.Intn(250)) * time.Millisecond)
@@ -378,7 +384,7 @@ func (s *Server) probe() {
timeout := 1 * time.Second
timer := time.NewTimer(timeout)
for i := 0; i < 3; i++ {
if err := s.multicastResponse(resp); err != nil {
if err := s.SendMulticast(resp); err != nil {
log.Println("[ERR] mdns: failed to send announcement:", err.Error())
}
select {
@@ -393,7 +399,7 @@ func (s *Server) probe() {
}
// multicastResponse us used to send a multicast response packet
func (s *Server) multicastResponse(msg *dns.Msg) error {
func (s *Server) SendMulticast(msg *dns.Msg) error {
buf, err := msg.Pack()
if err != nil {
return err
@@ -443,5 +449,5 @@ func (s *Server) unregister() error {
resp.MsgHdr.Response = true
resp.Answer = append(resp.Answer, s.config.Zone.Records(q.Question[0])...)
return s.multicastResponse(resp)
return s.SendMulticast(resp)
}