code: def _spanning_tree_algorithm(self):
          
          port_roles = {}
  
          root_port = self._select_root_port()
  
          if root_port is None:
              # My bridge is a root bridge.
              self.logger.info('Root bridge.', extra=self.dpid_str)
              root_priority = self.root_priority
              root_times = self.root_times
  
              for port_no in self.ports:
                  if self.ports[port_no].state is not PORT_STATE_DISABLE:
                      port_roles[port_no] = DESIGNATED_PORT
          else:
              # Other bridge is a root bridge.
              self.logger.info('Non root bridge.', extra=self.dpid_str)
              root_priority = root_port.designated_priority
              root_times = root_port.designated_times
  
              port_roles[root_port.ofport.port_no] = ROOT_PORT
  
              d_ports = self._select_designated_port(root_port)
              for port_no in d_ports:
                  port_roles[port_no] = DESIGNATED_PORT
  
              for port in self.ports.values():
                  if port.state is not PORT_STATE_DISABLE:
                      port_roles.setdefault(port.ofport.port_no,
                                            NON_DESIGNATED_PORT)
  
          return port_roles, root_priority, root_times
docs: Update tree roles.
               - Root bridge:
                  all port is DESIGNATED_PORT.
               - Non root bridge:
                  select one ROOT_PORT and some DESIGNATED_PORT,
                  and the other port is set to NON_DESIGNATED_PORT.