|
|
@@ -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) {
|