@@ -391,9 +391,10 @@ public void detectRulesConflict(FirewallRule newRule) throws NetworkRuleConflict
391391 ((rule .getPurpose () == Purpose .Firewall || newRule .getPurpose () == Purpose .Firewall ) && ((newRule .getPurpose () != rule .getPurpose ()) || (!newRule .getProtocol ()
392392 .equalsIgnoreCase (rule .getProtocol ()))));
393393
394- // if both rules are firewall and their cidrs are different, we can skip port ranges verification
395- boolean bothRulesFirewall = (rule .getPurpose () == newRule .getPurpose () && rule .getPurpose () == Purpose .Firewall );
394+ // if both rules are firewall/port forwarding and their cidrs are different, we can skip port ranges verification
396395 boolean duplicatedCidrs = false ;
396+
397+ boolean bothRulesFirewall = (rule .getPurpose () == newRule .getPurpose () && rule .getPurpose () == Purpose .Firewall );
397398 if (bothRulesFirewall ) {
398399 _firewallDao .loadSourceCidrs (rule );
399400 _firewallDao .loadSourceCidrs ((FirewallRuleVO )newRule );
@@ -407,6 +408,18 @@ public void detectRulesConflict(FirewallRule newRule) throws NetworkRuleConflict
407408 duplicatedCidrs = (detectConflictingCidrs (rule .getSourceCidrList (), newRule .getSourceCidrList ()) && detectConflictingCidrs (rule .getDestinationCidrList (), newRule .getDestinationCidrList ()));
408409 }
409410
411+ boolean bothRulesPortForwarding = rule .getPurpose () == newRule .getPurpose () && rule .getPurpose () == Purpose .PortForwarding ;
412+ if (bothRulesPortForwarding ) {
413+ _firewallDao .loadSourceCidrs (rule );
414+ _firewallDao .loadSourceCidrs ((FirewallRuleVO ) newRule );
415+
416+ if (rule .getSourceCidrList () == null || newRule .getSourceCidrList () == null ) {
417+ continue ;
418+ }
419+
420+ duplicatedCidrs = detectConflictingCidrs (rule .getSourceCidrList (), newRule .getSourceCidrList ());
421+ }
422+
410423 if (!oneOfRulesIsFirewall ) {
411424 if (rule .getPurpose () == Purpose .StaticNat && newRule .getPurpose () != Purpose .StaticNat ) {
412425 throw new NetworkRuleConflictException ("There is 1 to 1 Nat rule specified for the ip address id=" + newRule .getSourceIpAddressId ());
@@ -441,7 +454,7 @@ public void detectRulesConflict(FirewallRule newRule) throws NetworkRuleConflict
441454 if (!notNullPorts ) {
442455 continue ;
443456 } else if (!oneOfRulesIsFirewall &&
444- !(bothRulesFirewall && !duplicatedCidrs ) &&
457+ !(( bothRulesFirewall || bothRulesPortForwarding ) && !duplicatedCidrs ) &&
445458 ((rule .getSourcePortStart ().intValue () <= newRule .getSourcePortStart ().intValue () &&
446459 rule .getSourcePortEnd ().intValue () >= newRule .getSourcePortStart ().intValue ()) ||
447460 (rule .getSourcePortStart ().intValue () <= newRule .getSourcePortEnd ().intValue () &&
0 commit comments