Don't lose DHCP range when NIC address changes

When a server or firewall changes the IP address of a network
card, any DHCP ranges associated with that old number were
zeroed out.

Invalidating the range COULD be a nice feature in case the
new IP address falls within the DHCP range - thus preventing
conflicting IP addresses. So just to be nice I did allow the
range to invalidate in that situation. However, in real life
it wouldn't be so nice, and so perhaps it would actually be
better to keep the existing rules intact even if it would
cause a problem.

Scenario: Level 2 Firewall Test
-change firewall eth0 to 192.168.1.10 and eth1 to 192.168.2.20
-click OK
-edit firewall again and look at the DHCP rules
    -notice that 192.168.1 has all zeros.
    -same thing with 192.168.2
    -after the fix, the 192.168.2 rules are retained since
   2.20 doesn't conflict with the range, but 1.10 does
   conflict, so that rule was invalidated.
This commit is contained in:
Tim Young 2019-04-13 10:05:22 -05:00
parent cecd14a901
commit 4a72518ccc
2 changed files with 23 additions and 0 deletions

View File

@ -80,6 +80,11 @@ namespace EduNetworkBuilder
} }
} }
public void SetIP(UInt32 newIP)
{
_ip = newIP;
}
public bool Equals(NB_IPAddress CompareWith) public bool Equals(NB_IPAddress CompareWith)
{ {
if (_ip != CompareWith._ip) return false; if (_ip != CompareWith._ip) return false;

View File

@ -1806,6 +1806,24 @@ namespace EduNetworkBuilder
RouteTable.AddRange(ndCopyFrom.RouteTable); RouteTable.AddRange(ndCopyFrom.RouteTable);
DHCPRanges.Clear(); DHCPRanges.Clear();
DHCPRanges.AddRange(ndCopyFrom.DHCPRanges); DHCPRanges.AddRange(ndCopyFrom.DHCPRanges);
//if the IP address has changed, also update the corresponding address in DHCP rules
foreach (NB_IPAddress dhcpIP in DHCPRanges)
{
foreach (NetworkCard nic in NICs)
{
NetworkInterface matchingIF = nic.LocalInterface(dhcpIP, null);
if (matchingIF != null && !matchingIF.myIP.Equals(dhcpIP.GetIP) && !matchingIF.myIP.Equals(0))
{
//only validate the entry if the new address doesn't conflict with the DHCP range.
UInt32 nStartingDHCP = dhcpIP.GetMask;
UInt32 nEndingDHCP = dhcpIP.GetGateway;
if (matchingIF.myIP.GetIP < nStartingDHCP || matchingIF.myIP.GetIP > nEndingDHCP)
{
dhcpIP.SetIP(matchingIF.myIP.GetIP);
}
}
}
}
DHCPLeases.Clear(); DHCPLeases.Clear();
DHCPLeases.AddRange(ndCopyFrom.DHCPLeases); DHCPLeases.AddRange(ndCopyFrom.DHCPLeases);