Project

General

Profile

« Previous | Next » 

Revision 821be56a

Added by Viktor Gurov almost 5 years ago

Load balancing when one gateway has a weight of 1 and another gateway has a weight >1. Fixes #6025

View differences:

src/etc/inc/filter.inc
938 938
						break;
939 939
					}
940 940
				}
941
				/* see "Load balancing fails when one gateway has a weight of 1 
942
				* and another gateway has a weight >1", https://redmine.pfsense.org/issues/6025 */
943
				foreach ($members as $idx => $member) {
944
					if ((int) $member['weight'] == 1) {
945
						$weight1 = true;
946
					} elseif ((int) $member['weight'] > 1) {
947
						$weightgt1 = true;
948
					}
949
				}
950
				if ($weight1 && $weightgt1) {
951
					$mult = 2;
952
				} else {
953
					$mult = 1;
954
				}
941 955
				foreach ($members as $idx => $member) {
942 956
					$int = $member['int'];
943 957
					$gatewayip = $member['gwip'];
......
953 967
						if ($g['debug']) {
954 968
							log_error(sprintf(gettext('Setting up route with %1$s on %2$s'), $gatewayip, $int));
955 969
						}
956
						if ($routetomembers + (int) $member['weight'] > 384) {
970
						if ($routetomembers + ((int) $member['weight'] * $mult) > 384) {
957 971
							// would create invalid ruleset, bail
958 972
							log_error(sprintf(gettext("Too many members in group %s, gateway group truncated in ruleset."), $member['name']));
959 973
							continue;
960 974
						}
961
						if ((int) $member['weight'] > 1) {
962
							$routeto .= str_repeat("( {$int} {$gatewayip} ) ", $member['weight']);
975
						if ((int) $member['weight'] > 0) {
976
							$routeto .= str_repeat("( {$int} {$gatewayip} ) ", $member['weight'] * $mult);
963 977
							$routetomembers += (int) $member['weight'];
964 978
						} else {
965 979
							$routeto .= "( {$int} {$gatewayip} ) ";

Also available in: Unified diff