From 8b79a9b0499ec76c0324120152f085375ebf8903 Mon Sep 17 00:00:00 2001 From: Chip Boling Date: Fri, 30 Nov 2018 13:31:46 -0600 Subject: [PATCH] ADTRAN Adapters: Bug fixes for device flows after deprecation of xPON Change-Id: I77ca3a2c0431293a3ddfb4576860b0554392c486 --- voltha/adapters/adtran_olt/adtran_olt.py | 2 +- .../adapters/adtran_olt/adtran_olt_handler.py | 3 +- voltha/adapters/adtran_olt/flow/evc.py | 6 +- voltha/adapters/adtran_olt/flow/evc_map.py | 23 ++- voltha/adapters/adtran_olt/flow/flow_entry.py | 9 +- .../adapters/adtran_olt/flow/flow_tables.py | 3 +- voltha/adapters/adtran_onu/adtran_onu.py | 2 +- .../adapters/adtran_onu/adtran_onu_handler.py | 97 ++++++----- voltha/adapters/adtran_onu/flow/flow_entry.py | 3 + .../adtran_onu/omci/adtn_install_flow.py | 159 +++++++++++++----- .../adtran_onu/omci/adtn_mib_download_task.py | 3 +- .../omci/adtn_service_download_task.py | 4 +- voltha/adapters/adtran_onu/omci/omci.py | 2 +- voltha/adapters/adtran_onu/onu_tcont.py | 2 +- 14 files changed, 206 insertions(+), 112 deletions(-) diff --git a/voltha/adapters/adtran_olt/adtran_olt.py b/voltha/adapters/adtran_olt/adtran_olt.py index ac8c4950..6b765e66 100644 --- a/voltha/adapters/adtran_olt/adtran_olt.py +++ b/voltha/adapters/adtran_olt/adtran_olt.py @@ -52,7 +52,7 @@ def __init__(self, adapter_agent, config): self.descriptor = Adapter( id=self.name, vendor='ADTRAN, Inc.', - version='1.32', + version='1.33', config=AdapterConfig(log_level=LogLevel.INFO) ) log.debug('adtran_olt.__init__', adapter_agent=adapter_agent) diff --git a/voltha/adapters/adtran_olt/adtran_olt_handler.py b/voltha/adapters/adtran_olt/adtran_olt_handler.py index acf28022..6ea7d0dc 100644 --- a/voltha/adapters/adtran_olt/adtran_olt_handler.py +++ b/voltha/adapters/adtran_olt/adtran_olt_handler.py @@ -854,8 +854,7 @@ def _create_utility_flow(self): priority=200, match_fields=[ in_port(nni_port), - vlan_vid(ofp.OFPVID_PRESENT + self.utility_vlan), - # eth_type(FlowEntry.EtherType.EAPOL) ?? TODO: is this needed + vlan_vid(ofp.OFPVID_PRESENT + self.utility_vlan) ], actions=[output(pon_port)] ) diff --git a/voltha/adapters/adtran_olt/flow/evc.py b/voltha/adapters/adtran_olt/flow/evc.py index ecc05936..2e1914c3 100644 --- a/voltha/adapters/adtran_olt/flow/evc.py +++ b/voltha/adapters/adtran_olt/flow/evc.py @@ -221,8 +221,10 @@ def evc_map_names(self): def add_evc_map(self, evc_map): if self._evc_maps is None: - self._evc_maps = {} - self._evc_maps[evc_map.name] = evc_map + self._evc_maps = dict() + + if evc_map.name not in self._evc_maps: + self._evc_maps[evc_map.name] = evc_map def remove_evc_map(self, evc_map): if self._evc_maps is not None and evc_map.name in self._evc_maps: diff --git a/voltha/adapters/adtran_olt/flow/evc_map.py b/voltha/adapters/adtran_olt/flow/evc_map.py index 33c9360f..92da9800 100644 --- a/voltha/adapters/adtran_olt/flow/evc_map.py +++ b/voltha/adapters/adtran_olt/flow/evc_map.py @@ -202,7 +202,7 @@ def _xml_trailer(): return '' def get_evcmap_name(self, onu_id, gem_id): - return'{}.{}.{}'.format(self.name, onu_id, gem_id) + return'{}.{}.{}.{}'.format(self.name, onu_id, self.pon_id, gem_id) def _common_install_xml(self): xml = '{}'.format('true' if self._enabled else 'false') @@ -258,10 +258,11 @@ def _ingress_install_xml(self, onu_s_gem_ids_and_vid, acl_list, create): xml += '{}'.format(Onu.gem_id_to_gvid(gem_id)) # GEM-IDs are a sorted list (ascending). First gemport handles downstream traffic - if first_gem_id and vid is not None: + if first_gem_id and (self._c_tag is not None or vid is not None): first_gem_id = False + vlan = vid or self._c_tag xml += '' - xml += '{}'.format(vid) # Added in August 2017 model + xml += '{}'.format(vlan) # Added in August 2017 model xml += '' if len(acl_list): @@ -319,6 +320,7 @@ def gem_ports(): work_acls = self._new_acls.copy() self._new_acls = dict() + log.debug('install-evc-map-acls', install_acls=len(work_acls)) for acl in work_acls.itervalues(): try: yield acl.install() @@ -328,6 +330,13 @@ def gem_ports(): self._new_acls.update(work_acls) raise + # Any user-data flows attached to this map ? + c_tag = None + for flow_id, flow in self._flows.items(): + c_tag = flow.inner_vid or flow.vlan_id or c_tag + + self._c_tag = c_tag + # Now EVC-MAP if not self._installed or self._needs_update: log.debug('needs-install-or-update', installed=self._installed, update=self._needs_update) @@ -493,7 +502,7 @@ def find_matching_ingress_flow(flow, upstream_flow_table): def add_flow(self, flow, evc): """ Add a new flow to an existing EVC-MAP. This can be called to add: - o an ACL flow to an existing utility/untagged EVC, or + o an ACL flow to an existing utility EVC, or o an ACL flow to an existing User Data Flow, or o a User Data Flow to an existing ACL flow (and this needs the EVC updated as well. @@ -522,6 +531,7 @@ def add_flow(self, flow, evc): self._flows[flow.flow_id] = flow self._needs_update = True + # Are there ACLs to add to any existing (or empty) ACLs if len(tmp_map._new_acls) > 0: self._new_acls.update(tmp_map._new_acls) # New ACL flow log.debug('add-acl-flows', map=str(self), new=tmp_map._new_acls) @@ -533,6 +543,7 @@ def add_flow(self, flow, evc): self._evc.remove_evc_map(self) evc.add_evc_map(self) self._evc = evc + return self @inlineCallbacks @@ -571,7 +582,7 @@ def _remove_flow(self, flow): # or Untagged EVC from a user data EVC if self._evc and not self._evc.service_evc and\ len(self._flows) > 0 and\ - all(f.is_acl_flow for f in self._flows.itervalues()): + all(f.is_acl_flow for f in self._flows.itervalues()): self._evc.remove_evc_map(self) first_flow = self._flows.itervalues().next() @@ -615,7 +626,7 @@ def decode_evc_map_name(name): # Note: When actually installed into the OLT, the .onu_id.gem_port is # appended to the name return {'ingress-port': items[1], - 'flow-id': items[2].split('.')[0]} if len(items) == 3 else dict() + 'flow-id': items[2].split('.')[0]} if len(items) > 2 else dict() def add_gem_port(self, gem_port, reflow=False): # TODO: Refactor diff --git a/voltha/adapters/adtran_olt/flow/flow_entry.py b/voltha/adapters/adtran_olt/flow/flow_entry.py index a0d67fe0..02b112ee 100644 --- a/voltha/adapters/adtran_olt/flow/flow_entry.py +++ b/voltha/adapters/adtran_olt/flow/flow_entry.py @@ -52,7 +52,7 @@ class FlowDirection(IntEnum): UPSTREAM = 0 # UNI port to NNI Port DOWNSTREAM = 1 # NNI port to UNI Port CONTROLLER_UNI = 2 # Trap packet on UNI and send to controller - NNI_PON = 3 # NNI port to PON Port (all UNIs) - perhaps multicast? + NNI_PON = 3 # NNI port to PON Port (all UNIs) - Utility VLAN & multicast # The following are not yet supported CONTROLLER_NNI = 4 # Trap packet on NNI and send to controller @@ -585,6 +585,11 @@ def _apply_downstream_mods(self): if self.vlan_id == FlowEntry.LEGACY_CONTROL_VLAN and self.eth_type is None and self.pcp == 0: return False # Do not install this flow. Utility VLAN is in charge + elif self.flow_direction == FlowEntry.FlowDirection.NNI_PON and \ + self.vlan_id == self.handler.utility_vlan: + # Utility VLAN downstream flow/EVC + self._is_acl_flow = True + elif self.vlan_id in self._handler.multicast_vlans: # multicast (ethType = IP) # TODO: May need to be an NNI_PON flow self._is_multicast = True @@ -800,7 +805,7 @@ def get_packetout_info(handler, logical_port): if len(gem_ids_with_vid) > 0: gem_ids = gem_ids_with_vid[0] ctag = gem_ids_with_vid[1] - gem_id = gem_ids[0] # TODO: always grab fist in list + gem_id = gem_ids[0] # TODO: always grab first in list return flow_entry.in_port, ctag, Onu.gem_id_to_gvid(gem_id), \ evc_map.get_evcmap_name(onu_id, gem_id) return None, None, None, None diff --git a/voltha/adapters/adtran_olt/flow/flow_tables.py b/voltha/adapters/adtran_olt/flow/flow_tables.py index e90e69b5..aa90ee3b 100644 --- a/voltha/adapters/adtran_olt/flow/flow_tables.py +++ b/voltha/adapters/adtran_olt/flow/flow_tables.py @@ -52,7 +52,8 @@ def __len__(self): def add(self, flow): assert isinstance(flow, FlowEntry) - self._flow_table[flow.flow_id] = flow + if flow.flow_id not in self._flow_table: + self._flow_table[flow.flow_id] = flow return flow def get(self, item): diff --git a/voltha/adapters/adtran_onu/adtran_onu.py b/voltha/adapters/adtran_onu/adtran_onu.py index c5288b03..2d6b8a34 100755 --- a/voltha/adapters/adtran_onu/adtran_onu.py +++ b/voltha/adapters/adtran_onu/adtran_onu.py @@ -42,7 +42,7 @@ def __init__(self, adapter_agent, config): device_handler_class=AdtranOnuHandler, name='adtran_onu', vendor='ADTRAN, Inc.', - version='1.21', + version='1.22', device_type='adtran_onu', vendor_id='ADTN', accepts_add_remove_flow_updates=False), # TODO: Support flow-mods diff --git a/voltha/adapters/adtran_onu/adtran_onu_handler.py b/voltha/adapters/adtran_onu/adtran_onu_handler.py index 045c5599..040a617f 100644 --- a/voltha/adapters/adtran_onu/adtran_onu_handler.py +++ b/voltha/adapters/adtran_onu/adtran_onu_handler.py @@ -190,11 +190,10 @@ def stop(self): #self.adapter_agent.unregister_for_inter_adapter_messages() # Heartbeat - self._heartbeat.stop() + self._heartbeat.enabled = False # OMCI Communications self._unsubscribe_to_events() - self._openomci.enabled = False # Port shutdown for port in self.uni_ports: @@ -202,6 +201,7 @@ def stop(self): if self._pon is not None: self._pon.enabled = False + self._openomci.enabled = False def receive_message(self, msg): if self.enabled: @@ -335,8 +335,8 @@ def update_flow_table(self, flows): if flow_entry.flow_id in self._flows: valid_flows.add(flow_entry.flow_id) - if flow_entry is None or flow_entry.flow_direction not in {FlowEntry.upstream_flow_types, - FlowEntry.downstream_flow_types}: + if flow_entry is None or flow_entry.flow_direction not in \ + FlowEntry.upstream_flow_types | FlowEntry.downstream_flow_types: continue is_upstream = flow_entry.flow_direction in FlowEntry.upstream_flow_types @@ -467,50 +467,50 @@ def self_test_device(self, device): def disable(self): self.log.info('disabling', device_id=self.device_id) - self.enabled = False - + try: # Get the latest device reference - device = self.adapter_agent.get_device(self.device_id) - # Disable all ports on that device - self.adapter_agent.disable_all_ports(self.device_id) + device = self.adapter_agent.get_device(self.device_id) - # Update the device operational status to UNKNOWN - device.oper_status = OperStatus.UNKNOWN - device.connect_status = ConnectStatus.UNREACHABLE - device.reason = 'Disabled' - self.adapter_agent.update_device(device) + # Disable all ports on that device + self.adapter_agent.disable_all_ports(self.device_id) + + # Update the device operational status to UNKNOWN + device.oper_status = OperStatus.UNKNOWN + device.connect_status = ConnectStatus.UNREACHABLE + device.reason = 'Disabled' + self.adapter_agent.update_device(device) - # Remove the uni logical port from the OLT, if still present - parent_device = self.adapter_agent.get_device(device.parent_id) - assert parent_device + # Remove the uni logical port from the OLT, if still present + parent_device = self.adapter_agent.get_device(device.parent_id) + assert parent_device - for uni in self.uni_ports: - # port_id = 'uni-{}'.format(uni.port_number) - port_id = uni.port_id_name() + for uni in self.uni_ports: + # port_id = 'uni-{}'.format(uni.port_number) + port_id = uni.port_id_name() + try: + logical_device_id = parent_device.parent_id + assert logical_device_id + port = self.adapter_agent.get_logical_port(logical_device_id,port_id) + self.adapter_agent.delete_logical_port(logical_device_id, port) + except KeyError: + self.log.info('logical-port-not-found', device_id=self.device_id, + portid=port_id) + + # Remove pon port from parent and disable + if self._pon is not None: + self.adapter_agent.delete_port_reference_from_parent(self.device_id, + self._pon.get_port()) + self._pon.enabled = False - try: - #TODO: there is no logical device if olt disables first - logical_device_id = parent_device.parent_id - assert logical_device_id - port = self.adapter_agent.get_logical_port(logical_device_id, - port_id) - self.adapter_agent.delete_logical_port(logical_device_id, port) - except KeyError: - self.log.info('logical-port-not-found', device_id=self.device_id, - portid=port_id) - - # Remove pon port from parent and disable - if self._pon is not None: - self.adapter_agent.delete_port_reference_from_parent(self.device_id, - self._pon.get_port()) - self._pon.enabled = False + # Unregister for proxied message + self.adapter_agent.unregister_for_proxied_messages(device.proxy_address) - # Unregister for proxied message - self.adapter_agent.unregister_for_proxied_messages(device.proxy_address) + except Exception as _e: + pass # This is expected if OLT has deleted the ONU device handler - # TODO: - # 1) Remove all flows from the device? or is it done before we are called + # And disable OMCI as well + self.enabled = False self.log.info('disabled', device_id=device.id) def reenable(self): @@ -568,15 +568,20 @@ def reenable(self): def delete(self): self.log.info('deleting', device_id=self.device_id) - for uni in self._unis.values(): - uni.stop() - uni.delete() + try: + for uni in self._unis.values(): + uni.stop() + uni.delete() + + self._pon.stop() + self._pon.delete() - self._pon.stop() - self._pon.delete() + except Exception as _e: + pass # Expected if the OLT deleted us from the device handler # OpenOMCI cleanup - self._openomci.delete() + omci, self._openomci = self._openomci, None + omci.delete() def add_uni_ports(self): """ Called after in-sync achieved and not in xPON mode""" diff --git a/voltha/adapters/adtran_onu/flow/flow_entry.py b/voltha/adapters/adtran_onu/flow/flow_entry.py index 0c37d1dd..2051ce83 100644 --- a/voltha/adapters/adtran_onu/flow/flow_entry.py +++ b/voltha/adapters/adtran_onu/flow/flow_entry.py @@ -50,6 +50,9 @@ class FlowDirection(IntEnum): (FlowDirection.ANI, FlowDirection.UNI): FlowDirection.DOWNSTREAM } + upstream_flow_types = {FlowDirection.UPSTREAM} + downstream_flow_types = {FlowDirection.DOWNSTREAM} + # Well known EtherTypes class EtherType(IntEnum): EAPOL = 0x888E diff --git a/voltha/adapters/adtran_onu/omci/adtn_install_flow.py b/voltha/adapters/adtran_onu/omci/adtn_install_flow.py index 4b920dea..04d9d1ff 100644 --- a/voltha/adapters/adtran_onu/omci/adtn_install_flow.py +++ b/voltha/adapters/adtran_onu/omci/adtn_install_flow.py @@ -14,7 +14,7 @@ # limitations under the License. # from twisted.internet import reactor -from twisted.internet.defer import inlineCallbacks, failure +from twisted.internet.defer import inlineCallbacks, failure, returnValue from voltha.extensions.omci.omci_me import * from voltha.extensions.omci.tasks.task import Task from voltha.extensions.omci.omci_defs import * @@ -57,6 +57,7 @@ def __init__(self, omci_agent, handler, flow_entry): self._onu_device = omci_agent.get_device(handler.device_id) self._local_deferred = None self._flow_entry = flow_entry + self._install_by_delete = True # TODO: Cleanup below that is not needed is_upstream = flow_entry.flow_direction in FlowEntry.upstream_flow_types @@ -71,6 +72,7 @@ def __init__(self, omci_agent, handler, flow_entry): # # TODO: Probably need to store many of these in the appropriate object (UNI, PON,...) # + self._ethernet_uni_entity_id = self._handler.uni_ports[0].entity_id self._ieee_mapper_service_profile_entity_id = self._pon.hsi_8021p_mapper_entity_id # self._hsi_mac_bridge_port_ani_entity_id = self._pon.hsi_mac_bridge_port_ani_entity_id @@ -128,16 +130,25 @@ def check_status_and_state(self, results, operation=''): elif status == RC.InstanceExists: return False + elif status == RC.UnknownInstance and operation == 'delete': + return True + raise ServiceInstallFailure('{} failed with a status of {}, error_mask: {}, failed_mask: {}, unsupported_mask: {}' .format(operation, status, error_mask, failed_mask, unsupported_mask)) @inlineCallbacks def perform_flow_install(self): """ - Send the commands to configure the flow + Send the commands to configure the flow. + + Currently this task uses the pre-installed default TCONT and GEM Port. This will + change when Technology Profiles are supported. """ self.log.info('perform-flow-install', vlan_vid=self._flow_entry.vlan_vid) + if self._flow_entry.vlan_vid == 0: + return + def resources_available(): # TODO: Rework for non-xpon mode return (len(self._handler.uni_ports) > 0 and @@ -145,33 +156,63 @@ def resources_available(): len(self._pon.gem_ports)) if self._handler.enabled and resources_available(): - omci = self._onu_device.omci_cc - try: - # TODO: make this a member of the onu gem port or the uni port - vlan_vid = self._flow_entry.vlan_vid - # # Delete bridge ani side vlan filter - # msg = VlanTaggingFilterDataFrame(self._hsi_mac_bridge_port_ani_entity_id) - # frame = msg.delete() - # - # results = yield omci.send(frame) - # self.check_status_and_state(results, 'flow-delete-vlan-tagging-filter-data') - # - # # Re-Create bridge ani side vlan filter - # msg = VlanTaggingFilterDataFrame( - # self._hsi_mac_bridge_port_ani_entity_id, # Entity ID - # vlan_tcis=[vlan_vid], # VLAN IDs - # forward_operation=0x10 - # ) - # frame = msg.create() - # - # results = yield omci.send(frame) - # self.check_status_and_state(results, 'flow-create-vlan-tagging-filter-data') + omci = self._onu_device.omci_cc + brg_id = self._mac_bridge_service_profile_entity_id + vlan_vid = self._flow_entry.vlan_vid + + if self._install_by_delete: + # Delete any existing flow before adding this new one + + msg = ExtendedVlanTaggingOperationConfigurationDataFrame(brg_id, attributes=None) + frame = msg.delete() + + try: + results = yield omci.send(frame) + self.check_status_and_state(results, operation='delete') + + attributes = dict( + association_type=2, # Assoc Type, PPTP Ethernet UNI + associated_me_pointer=self._ethernet_uni_entity_id # Assoc ME, PPTP Entity Id + ) + + frame = ExtendedVlanTaggingOperationConfigurationDataFrame( + self._mac_bridge_service_profile_entity_id, + attributes=attributes + ).create() + results = yield omci.send(frame) + self.check_status_and_state(results, 'flow-recreate-before-set') + + # TODO: Any of the following needed as well + + # # Delete bridge ani side vlan filter + # msg = VlanTaggingFilterDataFrame(self._hsi_mac_bridge_port_ani_entity_id) + # frame = msg.delete() + # + # results = yield omci.send(frame) + # self.check_status_and_state(results, 'flow-delete-vlan-tagging-filter-data') + # + # # Re-Create bridge ani side vlan filter + # msg = VlanTaggingFilterDataFrame( + # self._hsi_mac_bridge_port_ani_entity_id, # Entity ID + # vlan_tcis=[vlan_vid], # VLAN IDs + # forward_operation=0x10 + # ) + # frame = msg.create() + # + # results = yield omci.send(frame) + # self.check_status_and_state(results, 'flow-create-vlan-tagging-filter-data') + + except Exception as e: + self.log.exception('flow-delete-before-install-failure', e=e) + self.deferred.errback(failure.Failure(e)) + returnValue(None) + try: + # Now set the VLAN Tagging Operation up as we want it # Update uni side extended vlan filter # filter for untagged # probably for eapol - # TODO: magic 0x1000 / 4096? # TODO: lots of magic # attributes = dict( # # This table filters and tags upstream frames @@ -211,29 +252,55 @@ def resources_available(): # filter for vlan 0 # TODO: lots of magic + ################################################################################ + # Update Extended VLAN Tagging Operation Config Data + # + # Specifies the TPIDs in use and that operations in the downstream direction are + # inverse to the operations in the upstream direction + # TODO: Downstream mode may need to be modified once we work more on the flow rules + attributes = dict( - # This table filters and tags upstream frames - received_frame_vlan_tagging_operation_table= - VlanTaggingOperation( - filter_outer_priority=15, # This entry is not a double-tag rule - filter_outer_vid=4096, # Do not filter on the outer VID value - filter_outer_tpid_de=0, # Do not filter on the outer TPID field - - filter_inner_priority=8, # Filter on inner vlan - filter_inner_vid=0x0, # Look for vlan 0 - filter_inner_tpid_de=0, # Do not filter on inner TPID field - filter_ether_type=0, # Do not filter on EtherType - - treatment_tags_to_remove=1, # Remove 1 tags - treatment_outer_priority=15, # Do not add an outer tag - treatment_outer_vid=0, # n/a - treatment_outer_tpid_de=0, # n/a - - treatment_inner_priority=8, # Add an inner tag and insert this value as the priority - treatment_inner_vid=vlan_vid, # use this value as the VID in the inner VLAN tag - treatment_inner_tpid_de=4, # set TPID to 0x8100 - ) + input_tpid=0x8100, # input TPID + output_tpid=0x8100, # output TPID + downstream_mode=0, # inverse of upstream ) + + msg = ExtendedVlanTaggingOperationConfigurationDataFrame( + self._mac_bridge_service_profile_entity_id, # Bridge Entity ID + attributes=attributes # See above + ) + frame = msg.set() + + results = yield omci.send(frame) + self.check_status_and_state(results, 'set-extended-vlan-tagging-operation-configuration-data') + + + attributes = dict( + + + received_frame_vlan_tagging_operation_table= + VlanTaggingOperation( + filter_outer_priority=15, # This entry is not a double-tag rule + filter_outer_vid=4096, # Do not filter on the outer VID value + filter_outer_tpid_de=0, # Do not filter on the outer TPID field + + filter_inner_priority=15, # This is a no-tag rule, ignore all other VLAN tag filter fields + filter_inner_vid=0x1000, # Do not filter on the inner VID + filter_inner_tpid_de=0, # Do not filter on inner TPID field + + filter_ether_type=0, # Do not filter on EtherType + treatment_tags_to_remove=0, # Remove 0 tags + + treatment_outer_priority=15, # Do not add an outer tag + treatment_outer_vid=0, # n/a + treatment_outer_tpid_de=0, # n/a + + treatment_inner_priority=0, # Add an inner tag and insert this value as the priority + treatment_inner_vid=vlan_vid, # use this value as the VID in the inner VLAN tag + treatment_inner_tpid_de=4, # set TPID + ) + ) + msg = ExtendedVlanTaggingOperationConfigurationDataFrame( self._mac_bridge_service_profile_entity_id, # Bridge Entity ID attributes=attributes # See above @@ -242,7 +309,7 @@ def resources_available(): results = yield omci.send(frame) self.check_status_and_state(results, - 'flow-set-ext-vlan-tagging-op-config-data-zero-tagged') + 'flow-set-ext-vlan-tagging-op-config-data-untagged') self.deferred.callback('flow-install-success') except Exception as e: diff --git a/voltha/adapters/adtran_onu/omci/adtn_mib_download_task.py b/voltha/adapters/adtran_onu/omci/adtn_mib_download_task.py index 2b2853fc..0ef7d92e 100644 --- a/voltha/adapters/adtran_onu/omci/adtn_mib_download_task.py +++ b/voltha/adapters/adtran_onu/omci/adtn_mib_download_task.py @@ -210,7 +210,8 @@ def perform_initial_bridge_setup(self): # References: # - Nothing attributes = { - 'spanning_tree_ind': False + 'spanning_tree_ind': False, + 'learning_ind': True } frame = MacBridgeServiceProfileFrame( self._mac_bridge_service_profile_entity_id, diff --git a/voltha/adapters/adtran_onu/omci/adtn_service_download_task.py b/voltha/adapters/adtran_onu/omci/adtn_service_download_task.py index 209dcd80..11ce30a3 100644 --- a/voltha/adapters/adtran_onu/omci/adtn_service_download_task.py +++ b/voltha/adapters/adtran_onu/omci/adtn_service_download_task.py @@ -157,7 +157,7 @@ def perform_service_download(self): and other characteristics are done once resources (gem-ports, tconts, ...) have been defined. """ - self.log.info('perform-service-download') + self.log.debug('perform-service-download') device = self._handler.adapter_agent.get_device(self.device_id) def resources_available(): @@ -210,7 +210,7 @@ def perform_service_specific_steps(self): # - ONU created TCONT (created on ONU startup) tcont_idents = self._onu_device.query_mib(Tcont.class_id) - self.log.info('tcont-idents', tcont_idents=tcont_idents) + self.log.debug('tcont-idents', tcont_idents=tcont_idents) for tcont in self._pon.tconts.itervalues(): if tcont.entity_id is None: diff --git a/voltha/adapters/adtran_onu/omci/omci.py b/voltha/adapters/adtran_onu/omci/omci.py index 6690aba3..6e0ed82e 100644 --- a/voltha/adapters/adtran_onu/omci/omci.py +++ b/voltha/adapters/adtran_onu/omci/omci.py @@ -134,7 +134,7 @@ def delete(self): self._handler = None if agent is not None: - agent(device_id, cleanup=True) + agent.remove_device(device_id, cleanup=True) @property def enabled(self): diff --git a/voltha/adapters/adtran_onu/onu_tcont.py b/voltha/adapters/adtran_onu/onu_tcont.py index 1f24b76e..dee3fccc 100644 --- a/voltha/adapters/adtran_onu/onu_tcont.py +++ b/voltha/adapters/adtran_onu/onu_tcont.py @@ -46,7 +46,7 @@ def create(handler, tcont, td): return OnuTCont(handler, tcont['alloc-id'], td, name=tcont['name']) @inlineCallbacks - def add_to_hardware(self, omci, tcont_entity_id, prev_alloc_id=OnuTCont.free_tcont_alloc_id): + def add_to_hardware(self, omci, tcont_entity_id, prev_alloc_id=free_tcont_alloc_id): self.log.debug('add-to-hardware', tcont_entity_id=tcont_entity_id) if self._entity_id == tcont_entity_id: