Refresh selected source IP when autosense
This commit is contained in:
parent
95bf95784e
commit
1f294666f3
@ -14,7 +14,6 @@ func respond(iface string, requests chan *ndpRequest, respondType ndpType, ndpQu
|
|||||||
|
|
||||||
var ndpQuestionsList = make([]*ndpQuestion, 0, 40)
|
var ndpQuestionsList = make([]*ndpQuestion, 0, 40)
|
||||||
var _, linkLocalSpace, _ = net.ParseCIDR("fe80::/10")
|
var _, linkLocalSpace, _ = net.ParseCIDR("fe80::/10")
|
||||||
var _, ulaSpace, _ = net.ParseCIDR("fc00::/7")
|
|
||||||
|
|
||||||
fd, err := syscall.Socket(syscall.AF_INET6, syscall.SOCK_RAW, syscall.IPPROTO_RAW)
|
fd, err := syscall.Socket(syscall.AF_INET6, syscall.SOCK_RAW, syscall.IPPROTO_RAW)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -33,28 +32,7 @@ func respond(iface string, requests chan *ndpRequest, respondType ndpType, ndpQu
|
|||||||
panic(err.Error())
|
panic(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
var result = emptyIpv6
|
var result = selectSourceIP(respondIface)
|
||||||
ifaceaddrs, err := respondIface.Addrs()
|
|
||||||
|
|
||||||
for _, n := range ifaceaddrs {
|
|
||||||
tip, _, err := net.ParseCIDR(n.String())
|
|
||||||
if err != nil {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
var haveUla = false
|
|
||||||
if isIpv6(tip.String()) {
|
|
||||||
if tip.IsGlobalUnicast() {
|
|
||||||
haveUla = true
|
|
||||||
result = tip
|
|
||||||
|
|
||||||
if !ulaSpace.Contains(tip) {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
} else if tip.IsLinkLocalUnicast() && !haveUla {
|
|
||||||
result = tip
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for {
|
for {
|
||||||
var req *ndpRequest
|
var req *ndpRequest
|
||||||
@ -94,6 +72,8 @@ func respond(iface string, requests chan *ndpRequest, respondType ndpType, ndpQu
|
|||||||
|
|
||||||
// Auto-sense
|
// Auto-sense
|
||||||
if autoSense != "" {
|
if autoSense != "" {
|
||||||
|
//TODO Future work: Use another sub goroutine to monitor the interface instead of checking here
|
||||||
|
result = selectSourceIP(respondIface)
|
||||||
autoiface, err := net.InterfaceByName(autoSense)
|
autoiface, err := net.InterfaceByName(autoSense)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
@ -227,3 +207,33 @@ func cleanupQuestionList(s []*ndpQuestion) []*ndpQuestion {
|
|||||||
}
|
}
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func selectSourceIP(iface *net.Interface) []byte {
|
||||||
|
var _, ulaSpace, _ = net.ParseCIDR("fc00::/7")
|
||||||
|
var result = emptyIpv6
|
||||||
|
ifaceaddrs, err := iface.Addrs()
|
||||||
|
if err != nil {
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, n := range ifaceaddrs {
|
||||||
|
tip, _, err := net.ParseCIDR(n.String())
|
||||||
|
if err != nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
var haveUla = false
|
||||||
|
if isIpv6(tip.String()) {
|
||||||
|
if tip.IsGlobalUnicast() {
|
||||||
|
haveUla = true
|
||||||
|
result = tip
|
||||||
|
|
||||||
|
if !ulaSpace.Contains(tip) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
} else if tip.IsLinkLocalUnicast() && !haveUla {
|
||||||
|
result = tip
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user