diff --git a/beacon/beacon.go b/beacon/beacon.go index aea0eb5f0..6f7c8d637 100644 --- a/beacon/beacon.go +++ b/beacon/beacon.go @@ -124,7 +124,7 @@ func bcast(ip *net.IPNet) *net.IPNet { offset := len(bc.IP) - len(bc.Mask) for i := range bc.IP { - if i-offset > 0 { + if i-offset >= 0 { bc.IP[i] = ip.IP[i] | ^ip.Mask[i-offset] } } diff --git a/beacon/beacon_test.go b/beacon/beacon_test.go new file mode 100644 index 000000000..c4cbd4e07 --- /dev/null +++ b/beacon/beacon_test.go @@ -0,0 +1,30 @@ +package beacon + +import ( + "net" + "testing" +) + +var addrToBcast = []struct { + addr, bcast string +}{ + {"172.16.32.33/25", "172.16.32.127/25"}, + {"172.16.32.129/25", "172.16.32.255/25"}, + {"172.16.32.33/24", "172.16.32.255/24"}, + {"172.16.32.33/22", "172.16.35.255/22"}, + {"172.16.32.33/0", "255.255.255.255/0"}, + {"172.16.32.33/32", "172.16.32.33/32"}, +} + +func TestBroadcastAddr(t *testing.T) { + for _, tc := range addrToBcast { + _, net, err := net.ParseCIDR(tc.addr) + if err != nil { + t.Fatal(err) + } + bc := bcast(net).String() + if bc != tc.bcast { + t.Errorf("%q != %q", bc, tc.bcast) + } + } +}