def do_state_down(self, event): self.log.debug("do_state_down") oper_state = OperStatus.UNKNOWN connect_state = ConnectStatus.UNREACHABLE # Propagating to the children # Children ports child_devices = self.adapter_agent.get_child_devices(self.device_id) for onu_device in child_devices: uni_no = platform.mk_uni_port_num( onu_device.proxy_address.channel_id, onu_device.proxy_address.onu_id) uni_name = self.port_name(uni_no, Port.ETHERNET_UNI, serial_number=onu_device.serial_number) if onu_device.adapter == 'brcm_openomci_onu': self.log.debug('using-brcm_openomci_onu, update_interface ' 'down') onu_adapter_agent = \ registry('adapter_loader').get_agent(onu_device.adapter) onu_adapter_agent.update_interface(onu_device, {'oper_state': 'down'}) self.onu_ports_down(onu_device, uni_no, uni_name, oper_state) # Children devices self.adapter_agent.update_child_devices_state( self.device_id, oper_status=oper_state, connect_status=connect_state) # Device Ports device_ports = self.adapter_agent.get_ports(self.device_id, Port.ETHERNET_NNI) logical_ports_ids = [port.label for port in device_ports] device_ports += self.adapter_agent.get_ports(self.device_id, Port.PON_OLT) for port in device_ports: port.oper_status = oper_state self.adapter_agent.add_port(self.device_id, port) # Device logical port for logical_port_id in logical_ports_ids: logical_port = self.adapter_agent.get_logical_port( self.logical_device_id, logical_port_id) logical_port.ofp_port.state = OFPPS_LINK_DOWN self.adapter_agent.update_logical_port(self.logical_device_id, logical_port) # Device device = self.adapter_agent.get_device(self.device_id) device.oper_status = oper_state device.connect_status = connect_state reactor.callLater(2, self.adapter_agent.update_device, device)
def _add_uni_port(self, entity_id): self.log.debug('function-entry') device = self.adapter_agent.get_device(self.device_id) parent_device = self.adapter_agent.get_device(device.parent_id) parent_adapter_agent = registry('adapter_loader').get_agent( parent_device.adapter) if parent_adapter_agent is None: self.log.error('openolt_adapter_agent-could-not-be-retrieved') # TODO: This knowledge is locked away in openolt. and it assumes one onu equals one uni... uni_no_start = platform.mk_uni_port_num(self._onu_indication.intf_id, self._onu_indication.onu_id) # TODO: Some or parts of this likely need to move to UniPort. especially the format stuff working_port = self._next_port_number uni_no = uni_no_start + working_port uni_name = "uni-{}".format(uni_no) mac_bridge_port_num = working_port + 1 self.log.debug('live-port-number-ready', uni_no=uni_no, uni_name=uni_name) uni_port = UniPort.create(self, uni_name, uni_no, uni_name, device.vlan, device.vlan) uni_port.entity_id = entity_id uni_port.enabled = True uni_port.mac_bridge_port_num = mac_bridge_port_num uni_port.add_logical_port(uni_port.port_number, subscriber_vlan=device.vlan) self.log.debug("created-uni-port", uni=uni_port) self.adapter_agent.add_port(device.id, uni_port.get_port()) parent_adapter_agent.add_port(device.parent_id, uni_port.get_port()) self._unis[uni_port.port_number] = uni_port # TODO: this should be in the PonPortclass pon_port = self._pon.get_port() self.adapter_agent.delete_port_reference_from_parent( self.device_id, pon_port) pon_port.peers.extend([ Port.PeerPort(device_id=device.parent_id, port_no=uni_port.port_number) ]) self._pon._port = pon_port self.adapter_agent.add_port_reference_to_parent( self.device_id, pon_port) self.adapter_agent.update_device(device)
def packet_indication(self, pkt_indication): self.log.debug("packet indication", intf_id=pkt_indication.intf_id, gemport_id=pkt_indication.gemport_id, flow_id=pkt_indication.flow_id) onu_id = platform.onu_id_from_gemport_id(pkt_indication.gemport_id) logical_port_num = platform.mk_uni_port_num(pkt_indication.intf_id, onu_id) pkt = Ether(pkt_indication.pkt) kw = dict(logical_device_id=self.logical_device_id, logical_port_no=logical_port_num) self.adapter_agent.send_packet_in(packet=str(pkt), **kw)
def do_state_down(self, event): self.log.debug("do_state_down") oper_state = OperStatus.UNKNOWN connect_state = ConnectStatus.UNREACHABLE # Propagating to the children # Children ports child_devices = self.adapter_agent.get_child_devices(self.device_id) for onu_device in child_devices: uni_no = platform.mk_uni_port_num( onu_device.proxy_address.channel_id, onu_device.proxy_address.onu_id) uni_name = self.port_name(uni_no, Port.ETHERNET_UNI, serial_number=onu_device.serial_number) self.onu_ports_down(onu_device, uni_no, uni_name, oper_state) # Children devices self.adapter_agent.update_child_devices_state( self.device_id, oper_status=oper_state, connect_status=connect_state) # Device Ports device_ports = self.adapter_agent.get_ports(self.device_id, Port.ETHERNET_NNI) logical_ports_ids = [port.label for port in device_ports] device_ports += self.adapter_agent.get_ports(self.device_id, Port.PON_OLT) for port in device_ports: port.oper_status = oper_state self.adapter_agent.add_port(self.device_id, port) # Device logical port for logical_port_id in logical_ports_ids: logical_port = self.adapter_agent.get_logical_port( self.logical_device_id, logical_port_id) logical_port.ofp_port.state = OFPPS_LINK_DOWN self.adapter_agent.update_logical_port(self.logical_device_id, logical_port) # Device device = self.adapter_agent.get_device(self.device_id) device.oper_status = oper_state device.connect_status = connect_state self.adapter_agent.update_device(device)
def packet_indication(self, pkt_indication): self.log.debug("packet indication", intf_id=pkt_indication.intf_id, gemport_id=pkt_indication.gemport_id, flow_id=pkt_indication.flow_id) onu_id = None pon_intf_gemport = (pkt_indication.intf_id, pkt_indication.gemport_id) try: onu_id = self.resource_manager.pon_intf_gemport_to_onu_id_map[ pon_intf_gemport] except KeyError: self.log.error("no-onu-reference-for-gem", gemport_id=pkt_indication.gemport_id) return logical_port_num = platform.mk_uni_port_num(pkt_indication.intf_id, onu_id) pkt = Ether(pkt_indication.pkt) kw = dict(logical_device_id=self.logical_device_id, logical_port_no=logical_port_num) self.adapter_agent.send_packet_in(packet=str(pkt), **kw)
def onu_indication(self, onu_indication): self.log.debug("onu indication", intf_id=onu_indication.intf_id, onu_id=onu_indication.onu_id, serial_number=onu_indication.serial_number, oper_state=onu_indication.oper_state, admin_state=onu_indication.admin_state) try: serial_number_str = self.stringify_serial_number( onu_indication.serial_number) except Exception as e: serial_number_str = None if serial_number_str is not None: onu_device = self.adapter_agent.get_child_device( self.device_id, serial_number=serial_number_str) else: onu_device = self.adapter_agent.get_child_device( self.device_id, parent_port_no=platform.intf_id_to_port_no( onu_indication.intf_id, Port.PON_OLT), onu_id=onu_indication.onu_id) if onu_device is None: self.log.error('onu not found', intf_id=onu_indication.intf_id, onu_id=onu_indication.onu_id) return # We will use this alloc_id and gemport_id to pass on to the onu adapter pon_intf_onu_id = (onu_indication.intf_id, onu_indication.onu_id) alloc_id = yield self.resource_manager.get_alloc_id(pon_intf_onu_id) gemport_id = yield self.resource_manager.get_gemport_id( pon_intf_onu_id) if platform.intf_id_from_pon_port_no(onu_device.parent_port_no) \ != onu_indication.intf_id: self.log.warn('ONU-is-on-a-different-intf-id-now', previous_intf_id=platform.intf_id_from_pon_port_no( onu_device.parent_port_no), current_intf_id=onu_indication.intf_id) # FIXME - handle intf_id mismatch (ONU move?) if onu_device.proxy_address.onu_id != onu_indication.onu_id: # FIXME - handle onu id mismatch self.log.warn( 'ONU-id-mismatch, can happen if both voltha and ' 'the olt rebooted', expected_onu_id=onu_device.proxy_address.onu_id, received_onu_id=onu_indication.onu_id) uni_no = platform.mk_uni_port_num(onu_indication.intf_id, onu_indication.onu_id) uni_name = self.port_name(uni_no, Port.ETHERNET_UNI, serial_number=onu_device.serial_number) self.log.debug('port-number-ready', uni_no=uni_no, uni_name=uni_name) # Admin state if onu_indication.admin_state == 'down': if onu_indication.oper_state != 'down': self.log.error('ONU-admin-state-down-and-oper-status-not-down', oper_state=onu_indication.oper_state) # Forcing the oper state change code to execute onu_indication.oper_state = 'down' # Port and logical port update is taken care of by oper state block elif onu_indication.admin_state == 'up': pass else: self.log.warn('Invalid-or-not-implemented-admin-state', received_admin_state=onu_indication.admin_state) self.log.debug('admin-state-dealt-with') onu_adapter_agent = \ registry('adapter_loader').get_agent(onu_device.adapter) if onu_adapter_agent is None: self.log.error('onu_adapter_agent-could-not-be-retrieved', onu_device=onu_device) return # Operating state if onu_indication.oper_state == 'down': if onu_device.connect_status != ConnectStatus.UNREACHABLE: onu_device.connect_status = ConnectStatus.UNREACHABLE self.adapter_agent.update_device(onu_device) # Move to discovered state self.log.debug('onu-oper-state-is-down') if onu_device.oper_status != OperStatus.DISCOVERED: onu_device.oper_status = OperStatus.DISCOVERED self.adapter_agent.update_device(onu_device) # Set port oper state to Discovered self.onu_ports_down(onu_device, uni_no, uni_name, OperStatus.DISCOVERED) if onu_device.adapter == 'brcm_openomci_onu': self.log.debug('using-brcm_openomci_onu') onu_adapter_agent.update_interface(onu_device, {'oper_state': 'down'}) elif onu_indication.oper_state == 'up': if onu_device.connect_status != ConnectStatus.REACHABLE: onu_device.connect_status = ConnectStatus.REACHABLE self.adapter_agent.update_device(onu_device) if onu_device.oper_status != OperStatus.DISCOVERED: self.log.debug("ignore onu indication", intf_id=onu_indication.intf_id, onu_id=onu_indication.onu_id, state=onu_device.oper_status, msg_oper_state=onu_indication.oper_state) return # Device was in Discovered state, setting it to active # Prepare onu configuration # If we are brcm_openomci adapter proceed if onu_device.adapter == 'brcm_openomci_onu': self.log.debug('using-brcm_openomci_onu') # tcont creation (onu) tcont = TcontsConfigData() tcont.alloc_id = alloc_id # gem port creation gem_port = GemportsConfigData() gem_port.gemport_id = gemport_id gem_port.tcont_ref = str(tcont.alloc_id) self.log.info('inject-tcont-gem-data-onu-handler', onu_indication=onu_indication, tcont=tcont, gem_port=gem_port) onu_adapter_agent.create_tcont(onu_device, tcont, traffic_descriptor_data=None) onu_adapter_agent.create_gemport(onu_device, gem_port) onu_adapter_agent.create_interface(onu_device, onu_indication) else: self.log.error('unsupported-openolt-onu-adapter', onu_adapter=onu_device.adapter) else: self.log.warn('Not-implemented-or-invalid-value-of-oper-state', oper_state=onu_indication.oper_state)
def onu_indication(self, onu_indication): self.log.debug("onu indication", intf_id=onu_indication.intf_id, onu_id=onu_indication.onu_id, serial_number=onu_indication.serial_number, oper_state=onu_indication.oper_state, admin_state=onu_indication.admin_state) try: serial_number_str = self.stringify_serial_number( onu_indication.serial_number) except Exception as e: serial_number_str = None if serial_number_str is not None: onu_device = self.adapter_agent.get_child_device( self.device_id, serial_number=serial_number_str) else: onu_device = self.adapter_agent.get_child_device( self.device_id, parent_port_no=platform.intf_id_to_port_no( onu_indication.intf_id, Port.PON_OLT), onu_id=onu_indication.onu_id) if onu_device is None: self.log.error('onu not found', intf_id=onu_indication.intf_id, onu_id=onu_indication.onu_id) return if onu_device.connect_status != ConnectStatus.REACHABLE: onu_device.connect_status = ConnectStatus.REACHABLE self.adapter_agent.update_device(onu_device) if platform.intf_id_from_pon_port_no(onu_device.parent_port_no) \ != onu_indication.intf_id: self.log.warn('ONU-is-on-a-different-intf-id-now', previous_intf_id=platform.intf_id_from_pon_port_no( onu_device.parent_port_no), current_intf_id=onu_indication.intf_id) # FIXME - handle intf_id mismatch (ONU move?) if onu_device.proxy_address.onu_id != onu_indication.onu_id: # FIXME - handle onu id mismatch self.log.warn( 'ONU-id-mismatch, can happen if both voltha and ' 'the olt rebooted', expected_onu_id=onu_device.proxy_address.onu_id, received_onu_id=onu_indication.onu_id) uni_no = platform.mk_uni_port_num(onu_indication.intf_id, onu_indication.onu_id) uni_name = self.port_name(uni_no, Port.ETHERNET_UNI, serial_number=onu_device.serial_number) self.log.debug('port-number-ready', uni_no=uni_no, uni_name=uni_name) # Admin state if onu_indication.admin_state == 'down': if onu_indication.oper_state != 'down': self.log.error('ONU-admin-state-down-and-oper-status-not-down', oper_state=onu_indication.oper_state) # Forcing the oper state change code to execute onu_indication.oper_state = 'down' if onu_device.admin_state != AdminState.DISABLED: onu_device.admin_state = AdminState.DISABLED self.adapter_agent.update(onu_device) self.log.debug('putting-onu-in-disabled-state', onu_serial_number=onu_device.serial_number) # Port and logical port update is taken care of by oper state block elif onu_indication.admin_state == 'up': if onu_device.admin_state != AdminState.ENABLED: onu_device.admin_state = AdminState.ENABLED self.adapter_agent.update(onu_device) self.log.debug('putting-onu-in-enabled-state', onu_serial_number=onu_device.serial_number) else: self.log.warn('Invalid-or-not-implemented-admin-state', received_admin_state=onu_indication.admin_state) self.log.debug('admin-state-dealt-with') onu_adapter_agent = \ registry('adapter_loader').get_agent(onu_device.adapter) if onu_adapter_agent is None: self.log.error('onu_adapter_agent-could-not-be-retrieved', onu_device=onu_device) return # Operating state if onu_indication.oper_state == 'down': # Move to discovered state self.log.debug('onu-oper-state-is-down') if onu_device.oper_status != OperStatus.DISCOVERED: onu_device.oper_status = OperStatus.DISCOVERED self.adapter_agent.update_device(onu_device) # Set port oper state to Discovered self.onu_ports_down(onu_device, uni_no, uni_name, OperStatus.DISCOVERED) if onu_device.adapter == 'brcm_openomci_onu': self.log.debug('using-brcm_openomci_onu') onu_adapter_agent.update_interface(onu_device, onu_indication) elif onu_indication.oper_state == 'up': if onu_device.oper_status != OperStatus.DISCOVERED: self.log.debug("ignore onu indication", intf_id=onu_indication.intf_id, onu_id=onu_indication.onu_id, state=onu_device.oper_status, msg_oper_state=onu_indication.oper_state) return # Device was in Discovered state, setting it to active # Prepare onu configuration # If we are using the old/current broadcom adapter otherwise # use the openomci adapter if onu_device.adapter == 'broadcom_onu': self.log.debug('using-broadcom_onu') # onu initialization, base configuration (bridge setup ...) def onu_initialization(): onu_adapter_agent.adapter.devices_handlers[onu_device.id] \ .message_exchange(cvid=DEFAULT_MGMT_VLAN) self.log.debug('broadcom-message-exchange-started') # tcont creation (onu) tcont = TcontsConfigData() tcont.alloc_id = platform.mk_alloc_id(onu_indication.onu_id) # gem port creation gem_port = GemportsConfigData() gem_port.gemport_id = platform.mk_gemport_id( onu_indication.onu_id) # ports creation/update def port_config(): # "v_enet" creation (olt) # add_port update port when it exists self.adapter_agent.add_port( self.device_id, Port(port_no=uni_no, label=uni_name, type=Port.ETHERNET_UNI, admin_state=AdminState.ENABLED, oper_status=OperStatus.ACTIVE)) # v_enet creation (onu) venet = VEnetConfig(name=uni_name) venet.interface.name = uni_name onu_adapter_agent.create_interface(onu_device, venet) # ONU device status update in the datastore def onu_update_oper_status(): onu_device.oper_status = OperStatus.ACTIVE onu_device.connect_status = ConnectStatus.REACHABLE self.adapter_agent.update_device(onu_device) # FIXME : the asynchronicity has to be taken care of properly onu_initialization() reactor.callLater(10, onu_adapter_agent.create_tcont, device=onu_device, tcont_data=tcont, traffic_descriptor_data=None) reactor.callLater(11, onu_adapter_agent.create_gemport, onu_device, gem_port) reactor.callLater(12, port_config) reactor.callLater(12, onu_update_oper_status) elif onu_device.adapter == 'brcm_openomci_onu': self.log.debug('using-brcm_openomci_onu') # tcont creation (onu) tcont = TcontsConfigData() tcont.alloc_id = platform.mk_alloc_id(onu_indication.onu_id) # gem port creation gem_port = GemportsConfigData() gem_port.gemport_id = platform.mk_gemport_id( onu_indication.onu_id) gem_port.tcont_ref = str(tcont.alloc_id) self.log.info('inject-tcont-gem-data-onu-handler', onu_indication=onu_indication, tcont=tcont, gem_port=gem_port) onu_adapter_agent.create_tcont(onu_device, tcont, traffic_descriptor_data=None) onu_adapter_agent.create_gemport(onu_device, gem_port) onu_adapter_agent.create_interface(onu_device, onu_indication) else: self.log.error('unsupported-openolt-onu-adapter') else: self.log.warn('Not-implemented-or-invalid-value-of-oper-state', oper_state=onu_indication.oper_state)
def _mib_in_sync(self): self.log.debug('function-entry') omci = self._onu_omci_device in_sync = omci.mib_db_in_sync device = self.adapter_agent.get_device(self.device_id) device.reason = 'discovery-mibsync-complete' self.adapter_agent.update_device(device) if not self._dev_info_loaded: self.log.info('loading-device-data-from-mib', in_sync=in_sync, already_loaded=self._dev_info_loaded) omci_dev = self._onu_omci_device config = omci_dev.configuration # TODO: run this sooner somehow... # In Sync, we can register logical ports now. Ideally this could occur on # the first time we received a successful (no timeout) OMCI Rx response. try: parent_device = self.adapter_agent.get_device(device.parent_id) parent_adapter_agent = registry('adapter_loader').get_agent(parent_device.adapter) if parent_adapter_agent is None: self.log.error('openolt_adapter_agent-could-not-be-retrieved') ani_g = config.ani_g_entities uni_g = config.uni_g_entities pptp = config.pptp_entities for key, value in ani_g.iteritems(): self.log.debug("discovered-ani", key=key, value=value) for key, value in uni_g.iteritems(): self.log.debug("discovered-uni", key=key, value=value) for key, value in pptp.iteritems(): self.log.debug("discovered-pptp-uni", key=key, value=value) entity_id = key # TODO: This knowledge is locked away in openolt. and it assumes one onu equals one uni... uni_no_start = platform.mk_uni_port_num(self._onu_indication.intf_id, self._onu_indication.onu_id) working_port = self._next_port_number uni_no = uni_no_start + working_port uni_name = "uni-{}".format(uni_no) mac_bridge_port_num = working_port + 1 self.log.debug('live-port-number-ready', uni_no=uni_no, uni_name=uni_name) uni_port = UniPort.create(self, uni_name, uni_no, uni_name, device.vlan, device.vlan) uni_port.entity_id = entity_id uni_port.enabled = True uni_port.mac_bridge_port_num = mac_bridge_port_num uni_port.add_logical_port(uni_port.port_number, subscriber_vlan=device.vlan) self.log.debug("created-uni-port", uni=uni_port) self.adapter_agent.add_port(device.id, uni_port.get_port()) parent_adapter_agent.add_port(device.parent_id, uni_port.get_port()) self._unis[uni_port.port_number] = uni_port # TODO: this should be in the PonPortclass pon_port = self._pon.get_port() self.adapter_agent.delete_port_reference_from_parent(self.device_id, pon_port) pon_port.peers.extend([Port.PeerPort(device_id=device.parent_id, port_no=uni_port.port_number)]) self._pon._port = pon_port self.adapter_agent.add_port_reference_to_parent(self.device_id, pon_port) # TODO: only one uni/pptp for now. flow bug in openolt break self._total_tcont_count = ani_g.get('total-tcont-count') self._qos_flexibility = config.qos_configuration_flexibility or 0 self._omcc_version = config.omcc_version or OMCCVersion.Unknown self.log.debug("set-total-tcont-count", tcont_count=self._total_tcont_count) # Save our device information self._dev_info_loaded = True self.adapter_agent.update_device(device) except Exception as e: self.log.exception('device-info-load', e=e) self._deferred = reactor.callLater(_STARTUP_RETRY_WAIT, self._mib_in_sync) else: self.log.info('device-info-already-loaded', in_sync=in_sync, already_loaded=self._dev_info_loaded) def success(_results): self.log.info('mib-download-success', _results=_results) device = self.adapter_agent.get_device(self.device_id) device.reason = 'initial-mib-downloaded' device.oper_status = OperStatus.ACTIVE device.connect_status = ConnectStatus.REACHABLE self.enable_ports(device) self.adapter_agent.update_device(device) self._mib_download_task = None def failure(_reason): self.log.info('mib-download-failure', _reason=_reason) # TODO: test this. also verify i can add this task this way self._mib_download_task = BrcmMibDownloadTask(self.omci_agent, self) self._deferred = self._onu_omci_device.task_runner.queue_task(self._mib_download_task) self.log.info('downloading-initial-mib-configuration') self._mib_download_task = BrcmMibDownloadTask(self.omci_agent, self) self._deferred = self._onu_omci_device.task_runner.queue_task(self._mib_download_task) self._deferred.addCallbacks(success, failure)