@@ -402,9 +402,10 @@ public void detectRulesConflict(FirewallRule newRule) throws NetworkRuleConflict
402402 ((rule .getPurpose () == Purpose .Firewall || newRule .getPurpose () == Purpose .Firewall ) && ((newRule .getPurpose () != rule .getPurpose ()) || (!newRule .getProtocol ()
403403 .equalsIgnoreCase (rule .getProtocol ()))));
404404
405- // if both rules are firewall and their cidrs are different, we can skip port ranges verification
406- boolean bothRulesFirewall = (rule .getPurpose () == newRule .getPurpose () && rule .getPurpose () == Purpose .Firewall );
405+ // if both rules are firewall/port forwarding and their cidrs are different, we can skip port ranges verification
407406 boolean duplicatedCidrs = false ;
407+
408+ boolean bothRulesFirewall = (rule .getPurpose () == newRule .getPurpose () && rule .getPurpose () == Purpose .Firewall );
408409 if (bothRulesFirewall ) {
409410 _firewallDao .loadSourceCidrs (rule );
410411 _firewallDao .loadSourceCidrs ((FirewallRuleVO )newRule );
@@ -418,6 +419,18 @@ public void detectRulesConflict(FirewallRule newRule) throws NetworkRuleConflict
418419 duplicatedCidrs = (detectConflictingCidrs (rule .getSourceCidrList (), newRule .getSourceCidrList ()) && detectConflictingCidrs (rule .getDestinationCidrList (), newRule .getDestinationCidrList ()));
419420 }
420421
422+ boolean bothRulesPortForwarding = rule .getPurpose () == newRule .getPurpose () && rule .getPurpose () == Purpose .PortForwarding ;
423+ if (bothRulesPortForwarding ) {
424+ _firewallDao .loadSourceCidrs (rule );
425+ _firewallDao .loadSourceCidrs ((FirewallRuleVO ) newRule );
426+
427+ if (rule .getSourceCidrList () == null || newRule .getSourceCidrList () == null ) {
428+ continue ;
429+ }
430+
431+ duplicatedCidrs = detectConflictingCidrs (rule .getSourceCidrList (), newRule .getSourceCidrList ());
432+ }
433+
421434 if (!oneOfRulesIsFirewall ) {
422435 if (rule .getPurpose () == Purpose .StaticNat && newRule .getPurpose () != Purpose .StaticNat ) {
423436 throw new NetworkRuleConflictException ("There is 1 to 1 Nat rule specified for the ip address id=" + newRule .getSourceIpAddressId ());
@@ -452,7 +465,7 @@ public void detectRulesConflict(FirewallRule newRule) throws NetworkRuleConflict
452465 if (!notNullPorts ) {
453466 continue ;
454467 } else if (!oneOfRulesIsFirewall &&
455- !(bothRulesFirewall && !duplicatedCidrs ) &&
468+ !(( bothRulesFirewall || bothRulesPortForwarding ) && !duplicatedCidrs ) &&
456469 ((rule .getSourcePortStart ().intValue () <= newRule .getSourcePortStart ().intValue () &&
457470 rule .getSourcePortEnd ().intValue () >= newRule .getSourcePortStart ().intValue ()) ||
458471 (rule .getSourcePortStart ().intValue () <= newRule .getSourcePortEnd ().intValue () &&
0 commit comments