rule: parse cidr once

This commit is contained in:
nadoo 2017-08-23 21:11:08 +08:00
parent 1b400d984e
commit 6055efa537

11
rule.go
View File

@ -44,11 +44,14 @@ func NewRuleDialer(rules []*RuleConf, gDialer Dialer) *RuleDialer {
rd.ipMap.Store(ip, sd) rd.ipMap.Store(ip, sd)
} }
for _, cidr := range r.CIDR { for _, s := range r.CIDR {
if _, cidr, err := net.ParseCIDR(s); err == nil {
rd.cidrMap.Store(cidr, sd) rd.cidrMap.Store(cidr, sd)
} }
} }
}
return rd return rd
} }
@ -73,14 +76,12 @@ func (p *RuleDialer) NextDialer(dstAddr string) Dialer {
var ret Dialer var ret Dialer
// check cidr // check cidr
// TODO: do not parse cidr every time
p.cidrMap.Range(func(key, value interface{}) bool { p.cidrMap.Range(func(key, value interface{}) bool {
if _, net, err := net.ParseCIDR(key.(string)); err == nil { cidr := key.(*net.IPNet)
if net.Contains(ip) { if cidr.Contains(ip) {
ret = value.(Dialer) ret = value.(Dialer)
return false return false
} }
}
return true return true
}) })