diff --git a/tools/conf/router.go b/tools/conf/router.go index 71bd1b58e..b1f1b6682 100644 --- a/tools/conf/router.go +++ b/tools/conf/router.go @@ -60,25 +60,45 @@ func parseIP(s string) *router.IP { mask = s[i+1:] } ip := v2net.ParseAddress(addr) - if !ip.Family().Either(v2net.AddressFamilyIPv4, v2net.AddressFamilyIPv6) { - return nil - } - bits := uint32(32) - if len(mask) > 0 { - bits64, err := strconv.ParseUint(mask, 10, 32) - if err != nil { + switch ip.Family() { + case v2net.AddressFamilyIPv4: + bits := uint32(32) + if len(mask) > 0 { + bits64, err := strconv.ParseUint(mask, 10, 32) + if err != nil { + return nil + } + bits = uint32(bits64) + } + if bits > 32 { + log.Warning("Router: invalid network mask: ", bits) return nil } - bits = uint32(bits64) - } - if bits > 32 { - log.Warning("Router: invalid network mask: ", bits) + return &router.IP{ + Ip: []byte(ip.IP()), + UnmatchingBits: 32 - bits, + } + case v2net.AddressFamilyIPv6: + bits := uint32(128) + if len(mask) > 0 { + bits64, err := strconv.ParseUint(mask, 10, 32) + if err != nil { + return nil + } + bits = uint32(bits64) + } + if bits > 128 { + log.Warning("Router: invalid network mask: ", bits) + return nil + } + return &router.IP{ + Ip: []byte(ip.IP()), + UnmatchingBits: 128 - bits, + } + default: + log.Warning("Router: unsupported address: ", s) return nil } - return &router.IP{ - Ip: []byte(ip.IP()), - UnmatchingBits: 32 - bits, - } } func parseFieldRule(msg json.RawMessage) (*router.RoutingRule, error) {