Exemple #1
0
    def path_resolution(self, req, meta, new_request=True, logger=None):
        """
        Handle generic type of a path request.
        """
        if logger is None:
            logger = self.get_request_logger(req, meta)
        dst_ia = req.dst_ia()
        if new_request:
            logger.info("PATH_REQ received")
            REQS_TOTAL.labels(**self._labels).inc()
        if dst_ia == self.addr.isd_as:
            logger.warning("Dropping request: requested DST is local AS")
            return False
        up_segs = set()
        core_segs = set()
        down_segs = set()
        # dst as==0 means any core AS in the specified ISD
        if self.is_core_as(dst_ia) or dst_ia[1] == 0:
            self._resolve_core(req, up_segs, core_segs)
        else:
            self._resolve_not_core(req, up_segs, core_segs, down_segs)
        if up_segs | core_segs | down_segs:
            self._send_path_segments(req, meta, logger, up_segs, core_segs, down_segs)
            return True
        if new_request:
            self._request_paths_from_core(req, logger)
            self.pending_req[(dst_ia, req.p.flags.sibra)].append((req, meta, logger))

        return False
Exemple #2
0
 def path_resolution(self, cpld, meta, new_request=True, logger=None):
     """
     Handle generic type of a path request.
     """
     pmgt = cpld.union
     req = pmgt.union
     assert isinstance(req, PathSegmentReq), type(req)
     if logger is None:
         logger = self.get_request_logger(cpld.req_id_str(), meta)
     dst_ia = req.dst_ia()
     if new_request:
         logger.info("PATH_REQ received: %s", req)
         REQS_TOTAL.labels(**self._labels).inc()
     if dst_ia == self.addr.isd_as:
         logger.warning("Dropping request: requested DST is local AS")
         return False
     up_segs = set()
     core_segs = set()
     down_segs = set()
     # dst as==0 means any core AS in the specified ISD
     if self.is_core_as(dst_ia) or dst_ia[1] == 0:
         self._resolve_core(req, up_segs, core_segs)
     else:
         self._resolve_not_core(req, up_segs, core_segs, down_segs, logger)
     if up_segs | core_segs | down_segs:
         self._send_path_segments(req, cpld.req_id, meta, logger, up_segs,
                                  core_segs, down_segs)
         return True
     if new_request:
         with self.pen_req_lock:
             self.pending_req[(dst_ia, req.p.flags.sibra)][str(meta)] = (
                 req, cpld.req_id, meta, logger)
         self._request_paths_from_core(req, logger)
     return False
Exemple #3
0
    def path_resolution(self, req, meta, new_request=True, logger=None):
        """
        Handle generic type of a path request.
        new_request informs whether a pkt is a new request (True), or is a
        pending request (False).
        Return True when resolution succeeded, False otherwise.
        """
        if logger is None:
            logger = self.get_request_logger(req, meta)
        dst_ia = req.dst_ia()
        if new_request:
            logger.info("PATH_REQ received")
            REQS_TOTAL.labels(**self._labels).inc()
        if dst_ia == self.addr.isd_as:
            logger.warning("Dropping request: requested DST is local AS")
            return False
        # dst as==0 means any core AS in the specified ISD
        dst_is_core = self.is_core_as(dst_ia) or dst_ia[1] == 0
        if dst_is_core:
            core_segs = self._resolve_core(
                req, meta, dst_ia, new_request, req.flags(), logger)
            down_segs = set()
        else:
            core_segs, down_segs = self._resolve_not_core(
                req, meta, dst_ia, new_request, req.flags(), logger)

        if not (core_segs | down_segs):
            if new_request:
                logger.debug("Segs to %s not found." % dst_ia)
            return False

        self._send_path_segments(req, meta, logger, core=core_segs, down=down_segs)
        return True