func ExamplePrefix_subnettingAndSupernetting() { _, n, err := net.ParseCIDR("203.0.113.0/24") if err != nil { log.Fatal(err) } p := ipaddr.NewPrefix(n) fmt.Println(p.IP, p.Last(), p.Len(), p.Mask, p.Hostmask()) fmt.Println() ps := p.Subnets(3) for _, p := range ps { fmt.Println(p) } fmt.Println() fmt.Println(ipaddr.Supernet(ps)) fmt.Println(ipaddr.Supernet(ps[1:7])) fmt.Println(ipaddr.Supernet(ps[:4])) fmt.Println(ipaddr.Supernet(ps[4:8])) // Output: // 203.0.113.0 203.0.113.255 24 ffffff00 000000ff // // 203.0.113.0/27 // 203.0.113.32/27 // 203.0.113.64/27 // 203.0.113.96/27 // 203.0.113.128/27 // 203.0.113.160/27 // 203.0.113.192/27 // 203.0.113.224/27 // // 203.0.113.0/24 // 203.0.113.0/24 // 203.0.113.0/25 // 203.0.113.128/25 }
func TestSupernet(t *testing.T) { for i, tt := range supernetTests { in, orig := toPrefixes(tt.in), toPrefixes(tt.in) want := toPrefix(tt.want) out := ipaddr.Supernet(in) if !reflect.DeepEqual(out, want) { t.Errorf("#%d: got %v; want %v", i, out, want) } if !reflect.DeepEqual(in, orig) { t.Errorf("#%d: %v is corrupted; want %v", i, in, orig) } } ipaddr.Supernet(nil) }
func BenchmarkSupernetIPv6(b *testing.B) { in := toPrefixes([]string{"2001:db8::/64", "2001:db8:0:1::/64", "2001:db8:0:2::/64", "2001:db8:0:3::/64", "2001:db8:0:4::/64", "2001:db8::/64", "2001:db8::1/64"}) for i := 0; i < b.N; i++ { ipaddr.Supernet(in) } }
func BenchmarkSupernetIPv4(b *testing.B) { in := toPrefixes([]string{"192.168.0.0/24", "192.168.1.0/24", "192.168.2.0/24", "192.168.3.0/24", "192.168.4.0/25", "192.168.101.0/26", "192.168.102.1/27"}) for i := 0; i < b.N; i++ { ipaddr.Supernet(in) } }
func TestPrefixOverlaps(t *testing.T) { for i, tt := range prefixOverlapsTests { p1 := toPrefix(tt.in) others := toPrefixes(tt.others) p2 := ipaddr.Supernet(others) if out := p1.Overlaps(p2); out != tt.want { t.Errorf("#%d: got %v; want %v", i, out, tt.want) } if out := p2.Overlaps(p1); out != tt.want { t.Errorf("#%d: got %v; want %v", i, out, tt.want) } } }
func TestPrefixSubnets(t *testing.T) { for i, tt := range prefixSubnetsTests { p := toPrefix(tt.in) ps := p.Subnets(tt.n) if len(ps) != 1<<uint(tt.n) { t.Errorf("#%d: got %v; want %v", i, len(ps), 1<<uint(tt.n)) } for _, p := range ps { if p.Len() != tt.l+tt.n { t.Errorf("#%d: got %v; want %v", i, p.Len(), tt.l+tt.n) } } if super := ipaddr.Supernet(ps); super == nil { for _, p := range ps { t.Logf("subnet: %v", p) } t.Errorf("#%d: got %v; want %v", i, super, p) } } }
func ExamplePrefix_subnettingAndSupernetting() { _, n, err := net.ParseCIDR("172.16.0.0/16") if err != nil { log.Fatal(err) } p := ipaddr.NewPrefix(n) fmt.Println(p.IP, p.Last(), p.Len(), p.Mask, p.Hostmask()) ps := p.Subnets(3) for _, p := range ps { fmt.Println(p) } fmt.Println(ipaddr.Supernet(ps[4:6])) // Output: // 172.16.0.0 172.16.255.255 16 ffff0000 0000ffff // 172.16.0.0/19 // 172.16.32.0/19 // 172.16.64.0/19 // 172.16.96.0/19 // 172.16.128.0/19 // 172.16.160.0/19 // 172.16.192.0/19 // 172.16.224.0/19 // 172.16.128.0/18 }
func BenchmarkSupernetIPv6(b *testing.B) { for i := 0; i < b.N; i++ { ipaddr.Supernet(aggregatablePrefixesIPv6) } }