Skip to content

Commit

Permalink
optimize: run once ipv6 multicast per nic
Browse files Browse the repository at this point in the history
  • Loading branch information
mehrdadrad committed Nov 18, 2016
1 parent 8a96ef5 commit edc94c3
Showing 1 changed file with 32 additions and 31 deletions.
63 changes: 32 additions & 31 deletions disc/disc.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ func WalkIP(cidr string) chan string {
// PingLan tries to send a tiny UDP packet to all LAN hosts
func (a *disc) PingLan() {
var (
isV4 bool
isV6 bool
b [16]byte
)

Expand All @@ -99,12 +99,8 @@ func (a *disc) PingLan() {
// ip network(s) that assigned to interface(s)
for _, addr := range addrs {
if strings.IndexAny(addr.String(), "::") != -1 {
isV4 = false
isV6 = true
} else {
isV4 = true
}

if isV4 {
fd, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_RAW, syscall.IPPROTO_ICMP)
if err != nil {
println(err.Error())
Expand All @@ -125,36 +121,41 @@ func (a *disc) PingLan() {
},
}).Marshal(nil)
if err := syscall.Sendto(fd, m, 0, &addr); err != nil {
println(err.Error())
if b[3] != 0 && b[3] != 255 {
println(err.Error())
}
}
}
syscall.Close(fd)
} else {
fd, err := syscall.Socket(syscall.AF_INET6, syscall.SOCK_RAW, syscall.IPPROTO_ICMPV6)
if err != nil {
println(err.Error())
return
}
syscall.SetsockoptInt(fd, syscall.IPPROTO_IPV6, syscall.IPV6_UNICAST_HOPS, 1)
copy(b[:], net.ParseIP(fmt.Sprintf("ff02::1")).To16())
addr := syscall.SockaddrInet6{
Port: 33434,
ZoneId: uint32(i.Index),
Addr: b,
}
m, _ := (&icmp.Message{
Type: ipv6.ICMPTypeEchoRequest, Code: 0,
Body: &icmp.Echo{
ID: 2016, Seq: 1,
Data: make([]byte, 52-48),
},
}).Marshal(nil)
if err := syscall.Sendto(fd, m, 0, &addr); err != nil {
println(err.Error())
}
syscall.Close(fd)
}
}
// sending a solicited-node multicast/icmp if there is IPv6 address
if isV6 {
fd, err := syscall.Socket(syscall.AF_INET6, syscall.SOCK_RAW, syscall.IPPROTO_ICMPV6)
if err != nil {
println(err.Error())
return
}
syscall.SetsockoptInt(fd, syscall.IPPROTO_IPV6, syscall.IPV6_UNICAST_HOPS, 1)
copy(b[:], net.ParseIP(fmt.Sprintf("ff02::1")).To16())
addr := syscall.SockaddrInet6{
Port: 33434,
ZoneId: uint32(i.Index),
Addr: b,
}
m, _ := (&icmp.Message{
Type: ipv6.ICMPTypeEchoRequest, Code: 0,
Body: &icmp.Echo{
ID: 2016, Seq: 1,
Data: make([]byte, 52-48),
},
}).Marshal(nil)
if err := syscall.Sendto(fd, m, 0, &addr); err != nil {
println(err.Error())
}
isV6 = false
syscall.Close(fd)
}
}
}
func nextIP(ip net.IP) {
Expand Down

0 comments on commit edc94c3

Please sign in to comment.