@@ -470,6 +470,9 @@ def _configure_tables(self):
470
470
flood_table .match_types += ((faucet_pipeline .STACK_LOOP_PROTECT_FIELD , False ),)
471
471
vlan_table = table_configs ['vlan' ]
472
472
vlan_table .set_fields += (faucet_pipeline .STACK_LOOP_PROTECT_FIELD ,)
473
+ vlan_table .match_types += ((faucet_pipeline .STACK_LOOP_PROTECT_FIELD , False ),)
474
+ eth_dst_table = table_configs ['eth_dst' ]
475
+ eth_dst_table .set_fields = (faucet_pipeline .STACK_LOOP_PROTECT_FIELD ,)
473
476
474
477
oxm_fields = set (valve_of .MATCH_FIELDS .keys ())
475
478
@@ -807,7 +810,7 @@ def is_in_path(self, src_dp, dst_dp):
807
810
path = self .shortest_path (dst_dp .name , src_dp .name )
808
811
return self .name in path
809
812
810
- def reset_refs (self , vlans = None ):
813
+ def reset_refs (self , vlans = None , root_dp = None ):
811
814
"""Resets vlan references"""
812
815
if vlans is None :
813
816
vlans = self .vlans
@@ -816,6 +819,8 @@ def reset_refs(self, vlans=None):
816
819
vlan .reset_ports (self .ports .values ())
817
820
if vlan .get_ports () or vlan .reserved_internal_vlan :
818
821
self .vlans [vlan .vid ] = vlan
822
+ if root_dp is not None :
823
+ self .stack ['root_dp' ] = root_dp
819
824
820
825
def resolve_port (self , port_name ):
821
826
"""Resolve a port by number or name."""
@@ -833,6 +838,7 @@ def finalize_config(self, dps):
833
838
834
839
dp_by_name = {}
835
840
vlan_by_name = {}
841
+ external_ports = False
836
842
837
843
def resolve_ports (port_names ):
838
844
"""Resolve list of ports, by port by name or number."""
@@ -858,7 +864,7 @@ def resolve_stack_dps():
858
864
if self .stack_ports :
859
865
if self .stack is None :
860
866
self .stack = {}
861
- self .stack ['externals' ] = False
867
+ self .stack ['externals' ] = external_ports
862
868
port_stack_dp = {}
863
869
for port in self .stack_ports :
864
870
stack_dp = port .stack ['dp' ]
@@ -871,10 +877,6 @@ def resolve_stack_dps():
871
877
test_config_condition (stack_port is None , (
872
878
'stack port %s not defined in DP %s' % (port .stack ['port' ], dp .name )))
873
879
port .stack ['port' ] = stack_port
874
- for vlan in vlan_by_name .values ():
875
- if vlan .loop_protect_external_ports ():
876
- self .stack ['externals' ] = True
877
- break
878
880
879
881
def resolve_mirror_destinations ():
880
882
"""Resolve mirror port references and destinations."""
@@ -1075,6 +1077,11 @@ def resolve_vlan_names_in_routers():
1075
1077
test_config_condition (
1076
1078
self .global_vlan == vlan .vid , 'VLAN %u is reserved by global_vlan' % vlan .vid )
1077
1079
1080
+ for vlan in vlan_by_name .values ():
1081
+ if vlan .loop_protect_external_ports ():
1082
+ external_ports = True
1083
+ break
1084
+
1078
1085
resolve_stack_dps ()
1079
1086
resolve_mirror_destinations ()
1080
1087
resolve_override_output_ports ()
0 commit comments