code: def _state_machine(self):
          
          role_str = {ROOT_PORT: 'ROOT_PORT          ',
                      DESIGNATED_PORT: 'DESIGNATED_PORT    ',
                      NON_DESIGNATED_PORT: 'NON_DESIGNATED_PORT'}
          state_str = {PORT_STATE_DISABLE: 'DISABLE',
                       PORT_STATE_BLOCK: 'BLOCK',
                       PORT_STATE_LISTEN: 'LISTEN',
                       PORT_STATE_LEARN: 'LEARN',
                       PORT_STATE_FORWARD: 'FORWARD'}
  
          if self.state is PORT_STATE_DISABLE:
              self.ofctl.set_port_status(self.ofport, self.state)
  
          while True:
              self.logger.info('[port=%d] %s / %s', self.ofport.port_no,
                               role_str[self.role], state_str[self.state],
                               extra=self.dpid_str)
  
              self.state_event = hub.Event()
              timer = self._get_timer()
              if timer:
                  timeout = hub.Timeout(timer)
                  try:
                      self.state_event.wait()
                  except hub.Timeout as t:
                      if t is not timeout:
                          err_msg = 'Internal error. Not my timeout.'
                          raise RyuException(msg=err_msg)
                      new_state = self._get_next_state()
                      self._change_status(new_state, thread_switch=False)
                  finally:
                      timeout.cancel()
              else:
                  self.state_event.wait()
  
              self.state_event = None
docs: Port state machine.
               Change next status when timer is exceeded
               or _change_status() method is called.