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
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
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