mirror of
https://gitlab.com/shorewall/code.git
synced 2024-12-23 22:58:52 +01:00
Make new optional interface code work with shared providers
This commit is contained in:
parent
3483e8052a
commit
b99444ab8b
@ -46,6 +46,7 @@ use constant { LOCAL_TABLE => 255,
|
||||
our @routemarked_providers;
|
||||
our %routemarked_interfaces;
|
||||
our @routemarked_interfaces;
|
||||
our %provider_interfaces;
|
||||
|
||||
our $balancing;
|
||||
our $fallback;
|
||||
@ -56,10 +57,10 @@ our %providers;
|
||||
|
||||
our @providers;
|
||||
|
||||
our %provider_interfaces;
|
||||
|
||||
our $family;
|
||||
|
||||
use constant { ROUTEMARKED_SHARED => 1, ROUTEMARKED_UNSHARED => 2 };
|
||||
|
||||
#
|
||||
# Initialize globals -- we take this novel approach to globals initialization to allow
|
||||
# the compiler to run multiple times in the same process. The
|
||||
@ -75,7 +76,7 @@ sub initialize( $ ) {
|
||||
@routemarked_providers = ();
|
||||
%routemarked_interfaces = ();
|
||||
@routemarked_interfaces = ();
|
||||
%provider_interfaces = ();
|
||||
%provider_interfaces = ();
|
||||
$balancing = 0;
|
||||
$fallback = 0;
|
||||
$first_default_route = 1;
|
||||
@ -266,10 +267,7 @@ sub add_a_provider( ) {
|
||||
}
|
||||
|
||||
fatal_error "Unknown Interface ($interface)" unless known_interface $interface;
|
||||
fatal_error "Duplicate Provider Interface ($interface)" if $provider_interfaces{$interface};
|
||||
|
||||
$provider_interfaces{$interface} = $table;
|
||||
|
||||
my $provider = chain_base $table;
|
||||
my $base = uc chain_base $interface;
|
||||
my $gatewaycase = '';
|
||||
@ -381,10 +379,10 @@ sub add_a_provider( ) {
|
||||
fatal_error "The 'track' option requires a numeric value in the MARK column" if $mark eq '-';
|
||||
|
||||
if ( $routemarked_interfaces{$interface} ) {
|
||||
fatal_error "Interface $interface is tracked through an earlier provider" if $routemarked_interfaces{$interface} > 1;
|
||||
fatal_error "Interface $interface is tracked through an earlier provider" if $routemarked_interfaces{$interface} == ROUTEMARKED_UNSHARED;
|
||||
fatal_error "Multiple providers through the same interface must their IP address specified in the INTERFACES" unless $shared;
|
||||
} else {
|
||||
$routemarked_interfaces{$interface} = $shared ? 1 : 2;
|
||||
$routemarked_interfaces{$interface} = $shared ? ROUTEMARKED_SHARED : ROUTEMARKED_UNSHARED;
|
||||
push @routemarked_interfaces, $interface;
|
||||
}
|
||||
|
||||
@ -393,12 +391,16 @@ sub add_a_provider( ) {
|
||||
|
||||
my $realm = '';
|
||||
|
||||
start_provider( $table, $number, qq(if [ -n "\$${base}_IS_USABLE" ]; then) ) if $optional;
|
||||
if ( $optional && ! $shared ) {
|
||||
start_provider( $table, $number, qq(if [ -n "\$${base}_IS_USABLE" ]; then) );
|
||||
$provider_interfaces{$interface} = $table;
|
||||
}
|
||||
|
||||
if ( $shared ) {
|
||||
fatal_error "Interface $interface is associated with non-shared provider $provider_interfaces{$interface}" if $provider_interfaces{$table};
|
||||
my $variable = $providers{$table}{mac} = get_interface_mac( $gateway, $interface , $table );
|
||||
$realm = "realm $number";
|
||||
start_provider( $table, $number, qq(if interface_is_usable $interface && [ -n "$variable" ]; then) ) unless $optional;
|
||||
start_provider( $table, $number, qq(if interface_is_usable $interface && [ -n "$variable" ]; then) );
|
||||
} elsif ( $gatewaycase eq 'detect' ) {
|
||||
start_provider( $table, $number, qq(if interface_is_usable $interface && [ -n "$gateway" ]; then) ) unless $optional;
|
||||
} else {
|
||||
@ -790,30 +792,20 @@ sub handle_optional_interfaces() {
|
||||
my $interfaces = find_interfaces_by_option 'optional';
|
||||
|
||||
if ( @$interfaces ) {
|
||||
my $variable;
|
||||
|
||||
for my $interface ( @$interfaces ) {
|
||||
my $base = uc chain_base( $interface );
|
||||
my $provider = $provider_interfaces{$interface};
|
||||
|
||||
emit '';
|
||||
|
||||
|
||||
if ( $provider ) {
|
||||
#
|
||||
# This is a provider -- get the provider table entry
|
||||
#
|
||||
my $providerref = $providers{$provider};
|
||||
|
||||
if ( $providerref->{shared} ) {
|
||||
$variable = $providerref->{mac};
|
||||
} elsif ( $providerref->{gatewaycase} eq 'detect' ) {
|
||||
$variable = $providerref->{gateway};
|
||||
} else {
|
||||
$variable = '';
|
||||
}
|
||||
|
||||
if ( $variable ) {
|
||||
emit qq(if interface_is_usable $interface && [ -n "$variable" ]; then);
|
||||
if ( $providerref->{gatewaycase} eq 'detect' ) {
|
||||
emit qq(if interface_is_usable $interface && [ -n "$providerref->{gateway}" ]; then);
|
||||
} else {
|
||||
emit qq(if interface_is_usable $interface; then);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user