Skip to content

Commit 3ceac75

Browse files
committed
Show warning for useless subnet_of at NAT network
This fixes #31
1 parent 80fd145 commit 3ceac75

File tree

3 files changed

+70
-9
lines changed

3 files changed

+70
-9
lines changed

go/pkg/pass1/find-subnets.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -494,7 +494,7 @@ func (c *spoc) findSubnetsInNatDomain0(domains []*natDomain, networks netList) {
494494
// there's no method to specify a natted network
495495
// as value of subnet_of.
496496
if natSubnet.subnetOf == bignet {
497-
subnet.subnetOfUsed = true
497+
natSubnet.subnetOfUsed = true
498498
} else if bignet.hasSubnets &&
499499
(bignet.ipp.Bits() == 0 ||
500500
zoneEq(bignet.zone, subnet.zone) ||
@@ -629,12 +629,18 @@ func isLoopbackAtZoneBorder(sub, big *network) bool {
629629
}
630630

631631
func (c *spoc) findUselessSubnetAttr() {
632-
for _, n := range c.allNetworks {
632+
check := func(n *network) {
633633
if bignet := n.subnetOf; bignet != nil && !n.subnetOfUsed {
634-
c.warn("Useless 'subnet_of = %s' at %s", bignet, n.vxName())
634+
c.warn("Useless 'subnet_of = %s' at %s", bignet, natName(n))
635635
}
636636
if n.hasSubnets && !n.hasSubnetsUsed {
637-
c.warn("Useless 'has_subnets' at %s", n.vxName())
637+
c.warn("Useless 'has_subnets' at %s", natName(n))
638+
}
639+
}
640+
for _, n := range c.allNetworks {
641+
check(n)
642+
for _, nn := range n.nat {
643+
check(nn)
638644
}
639645
}
640646
}

go/pkg/pass1/set-zone.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1004,7 +1004,10 @@ func (c *spoc) inheritNAT0() {
10041004
return m1, from1
10051005
}
10061006
for _, n := range c.allNetworks {
1007-
inherit(n)
1007+
switch n.ipType {
1008+
case hasIP, bridgedIP:
1009+
inherit(n)
1010+
}
10081011
}
10091012
}
10101013

@@ -1021,11 +1024,12 @@ func (c *spoc) adaptNAT(n *network, tag string, nat *network) *network {
10211024
subNat.name = n.name
10221025
subNat.descr = "nat:" + tag + " of " + n.name
10231026

1024-
// Always keep attribute subnetOf of inherited NAT with dynmic NAT,
1025-
// because it would override existing subnet relation of networks.
1026-
// Otherwies take attribute subnetOf of original network if available.
1027+
// Always keep attribute subnetOf of inherited NAT with dynamic or
1028+
// hidden NAT, because it would override existing subnet relation
1029+
// of networks.
1030+
// Otherwise take attribute subnetOf of original network if available.
10271031
// Else keep attribute subnetOf of inherited NAT.
1028-
if s := n.subnetOf; s != nil && !(subNat.subnetOf != nil && subNat.dynamic) {
1032+
if s := n.subnetOf; s != nil && !subNat.dynamic {
10291033
subNat.subnetOf = s
10301034
}
10311035

go/testdata/nat.t

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4626,6 +4626,57 @@ router:r1 = {
46264626
Warning: Useless 'subnet_of = network:n2' at network:n1
46274627
=END=
46284628
4629+
############################################################
4630+
=TITLE=Useless subnet_of at NAT network
4631+
=INPUT=
4632+
network:n1 = {
4633+
ip = 10.1.1.0/24;
4634+
nat:n1 = { ip = 10.1.7.0/24; subnet_of = network:n2; }
4635+
nat:h1 = { hidden; }
4636+
nat:n2 = { identity; }
4637+
}
4638+
network:n2 = {
4639+
ip = 10.1.0.0/21;
4640+
nat:n2 = { hidden; }
4641+
}
4642+
network:n3 = {
4643+
ip = 10.1.3.0/24;
4644+
subnet_of = network:n2;
4645+
nat:n2 = { identity; }
4646+
}
4647+
router:r1 = {
4648+
interface:n1 = { nat_out = n2; }
4649+
interface:n2 = { nat_out = h1; }
4650+
interface:n3 = { nat_out = n1, n2; }
4651+
}
4652+
=WARNING=
4653+
Warning: Useless 'subnet_of = network:n2' at nat:n1 of network:n1
4654+
=END=
4655+
4656+
############################################################
4657+
=TITLE=Show useless subnet_of at network even if subnet_of at NAT is used
4658+
=INPUT=
4659+
network:n1 = {
4660+
ip = 10.1.1.0/24;
4661+
subnet_of = network:n2;
4662+
nat:n1 = { ip = 10.7.7.0/24; subnet_of = network:n3; }
4663+
nat:h1 = { hidden; }
4664+
nat:n2 = { identity; }
4665+
}
4666+
network:n2 = {
4667+
ip = 10.1.0.0/21;
4668+
nat:n2 = { hidden; }
4669+
}
4670+
network:n3 = { ip = 10.7.0.0/16; }
4671+
router:r1 = {
4672+
interface:n1 = { nat_out = n2; }
4673+
interface:n2 = { nat_out = h1; }
4674+
interface:n3 = { nat_out = n1, n2; }
4675+
}
4676+
=WARNING=
4677+
Warning: Useless 'subnet_of = network:n2' at network:n1
4678+
=END=
4679+
46294680
############################################################
46304681
=TITLE=Useless subnet_of with network 0/0 present
46314682
=INPUT=

0 commit comments

Comments
 (0)